aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
AgeCommit message (Collapse)AuthorFilesLines
2026-09-18feat: add a title icon to every labelled cardDanilo M.1-0/+3
Add card.ICON and a card.title helper that draws the glyph in the highlight colour before the label, at the label's own size. The eight labelled cards use it, in both the fit_unit width measurement and the draw, so the icon cannot overrun a narrow cell. Clock (no label) and weather (condition glyph already) are unchanged, and the no-data notice titles stay text-only. Codepoints were chosen against a rendered contact sheet, not fontconfig alone, since a wrong codepoint draws a plausible neighbour.
2026-09-18refactor: unify card no-data face and fluid sizingDanilo M.1-2/+4
Extract card.notice so every cached card's no-data state is one fluid, theme-consistent face instead of a copy per widget, and delete the fixed-size card.label it replaces. Derive weather's arc geometry from its band (pad, curve room, sun dot, time labels) instead of fixed pixels, and cap the arc at a proportion of the card's width rather than 240px. Derive disks' bar-fallback height and its address type from the card's own label scale. Standardise the big-value factor to 1.0 across the fit_unit cards and document the big-value colour rule and the disks headline exception.
2026-09-18feat: date the calendar rows and pin a colour legendDanilo M.1-3/+12
Three changes to the calendar card: The month grid drops further below the header. The weekday initials sat close enough to read as part of the header rather than as the top of the grid. Event rows carry the date before the time, day/month with no year: the window is a week and the grid above already names the month, so a year would spend three characters on the one field that cannot vary. A legend of the calendar colours is pinned along the card's bottom, and the event rows now end above it rather than at the card's inner edge. It lists every calendar khal declared a colour for, in name order so it does not reshuffle between frames, since pairs() walks a hash. The row budget also counted one row more than the drawing loop would draw, which suppressed the '+N more' line exactly when it was needed: the loop cut the row the count had already spent. Both now test the same condition. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18feat: add a calendar card reading khalDanilo M.1-2/+44
The month grid with the week's appointments below it, colour-coded by calendar. Events come from a cache file rather than a live call: khal costs about 200ms of Python startup, which is two orders of magnitude over the 2-second draw budget, so bin/calendar-sample.sh writes the cache on a 5-minute execi and the widget only parses. Calendar colours are read out of khal's own config by the sampler and mapped onto the board's palette roles, so the card follows a scheme change instead of pinning three literal hues. khal will not emit an ISO date: {start-date} uses the user's dateformat, which carries no year here, and a strftime spec inside the field raises. The sampler asks for {start-date-long} and data.calendar_date recovers the numbers by position, resolving day/month by magnitude and reading a genuinely ambiguous pair day-first. A 2-digit year is refused rather than guessed at. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17docs: document the network and slackware cardsDanilo M.1-15/+69
Notes the two things a reader would otherwise get wrong: br0 is a bridge, so local VM traffic shows up in the chart, and the disks card reads df's available column rather than computing size minus used, which would overstate free space by the root-reserved blocks. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17docs: record the visual identity in DESIGN.mdDanilo M.1-0/+2
DESIGN.md states the two rules that carry the board's identity (big value at the card's top-right, rows label-left/value-right), plus the type, colour and glyph conventions, with AGENTS.md pointing at it for anyone adding a widget.
2026-09-17feat: put every card's big number in the same placeDanilo M.1-3/+3
Mirror the weather header so the glyph sits large on the left and the temperature, city and condition run against the right edge, and move the system card's CPU percentage onto its header line, right-aligned. All big values now render at the card's right edge.
2026-09-17feat: fluid type for the gpu and cache cardsDanilo M.1-8/+16
The big value moves to the right of the heading, on the same baseline, so the card's width carries it instead of leaving the right half empty. Type now scales to fill the cell: card.fit_unit measures the rows and returns the largest size that fits the width, and the widget takes the smaller of that and its height budget, shrinking only where a row would collide.
2026-09-17docs: correct the system-widget comments and defer the age markerDanilo M.1-1/+1
Fix the conky.conf.in comment to name all three samplers and the README to say the cache sampler runs every 15 minutes. Rewrite the disks layout comment to match per_row = n (no wrapping), drop the stale "seventeenth bar" note, and record in the spec that the cache age marker is deliberately deferred with the epoch-line upgrade path.
2026-09-17docs: document the system widgetsDanilo M.1-0/+94
2026-09-17feat: give the clock its own fontDanilo M.1-1/+11
Installs Oswald (OFL-1.1, from googlefonts/OswaldFont) under ~/.fonts/o/Oswald with its license, and points the clock numerals at it for the squared look the rounded Noto Sans Black did not have. Per-widget fonts needed no new machinery: card.font() already takes any family string, so FONT_* are shared defaults rather than a restriction. FONT_CLOCK joins them, and the weather card keeps FONT_HEAVY, so the two no longer have to agree. Cairo still cannot ask for a weight above bold, so a heavier cut is selected by family name as FONT_HEAVY already did. Worth knowing that fontconfig substitutes a default for a family it does not recognise, which is indistinguishable from the font not applying; fc-match tells you which happened. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17feat: add restart.shDanilo M.1-4/+12
Editing the layout table or a widget needs a conky restart and nothing else, since the Lua is symlinked and conky never rereads its config. That was three commands to remember, one of them the hyprctl dispatch form that keeps the dashboard from popping open over the screen. The script syntax-checks before killing anything and refuses to restart on a Lua error, naming the file and line. Without that the first sign of a typo is a blank workspace with no message on any stream, which is the single most confusing failure mode this project has. Falls back to a plain exec where Hyprland is not running, and says what to run by hand if conky fails to come up. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17feat: make the clock fill whatever cell it is givenDanilo M.1-0/+27
The numerals scaled off the cell but the date block sat at a fixed drop below them, so a tall cell left a dead band under the date and a short one would have collided. Now the date pins to the bottom edge, the numerals take everything above it, and both type sizes derive from the width, so the slack of a tall cell falls in the middle of the card where it belongs. Type scales off width for the same reason the weather card does: height is what changes when a row is added to the grid, and a widget that shrinks its text whenever its cell gets shorter reads as broken next to its neighbours. Checked at 1x3, 1x6, 2x2, 2x4 and 3x3 on an 8x6 grid before restarting conky. The 1x6 case stays width-bound and leaves room below the numerals, which is correct for a cell far taller than it is wide. The README now states the convention, since it applies to every widget added later: derive offsets from the rect, scale off width, decide where the slack goes, and drop an element that would otherwise overlap. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17docs: document the weather widget and fix the screenshot recipeDanilo M.1-9/+92
Adds a Weather section covering the API key, where it lives and why, the 401-while-activating behaviour a new key shows, the execi refresh, and the by-hand fetch check. Adds five gotchas: execi firing under empty text, the atomic cache write, what OWM actually returns for a bad key and city, the no-raise invariant in lib/weather.lua, and type scaling off width. Also corrects three things that had gone stale: the symlink list omitted bin/, the layout example still showed a single full-height clock, and the test line omitted test_weather.lua. The screenshot recipe was wrong in two ways, both of which bit during this work. It slept a fixed second and raced the compositor, which is how a capture came back showing a terminal instead of the dashboard; it now polls for the workspace switch. And it fed the window's geometry to grim -g, but a window on a hidden special workspace reports a negative Y, so that grabs the wrong region; it now captures the output. Every command in the file was run as written before committing this. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16docs: add READMEDanilo M.1-0/+132
Install, how to edit the layout table, how to run the checks, and the five gotchas that cost real time: conky_surface() on Wayland, a Lua error presenting as a blank screen, own_window_type needing to be normal, the palette being unreadable through conky_parse, and Cairo having no Black font weight. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>