diff options
| author | Danilo M. <danix@danix.xyz> | 2026-10-18 15:06:26 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-10-18 15:06:26 +0200 |
| commit | 9001b61dd3d48b7dedff40810cf258cbc3b41fee (patch) | |
| tree | a230422e5e635e9a6ad7e5ff9ad3bcbd67d28463 | |
| parent | 4be7664c5fcc9c081dca5fb40ec4b9e0a2cc7bd3 (diff) | |
| download | conky-theme-udt-9001b61dd3d48b7dedff40810cf258cbc3b41fee.tar.gz conky-theme-udt-9001b61dd3d48b7dedff40810cf258cbc3b41fee.zip | |
feat(now): the condition as a large glyph instead of words
The leftover height under the rows now holds the condition glyph,
large, as the card's variable band. weather.describe() and its table
had no other caller and go with the text.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
| -rw-r--r-- | docs/superpowers/specs/2026-10-18-mirage-weather-cards-design.md | 5 | ||||
| -rw-r--r-- | lib/weather.lua | 18 | ||||
| -rw-r--r-- | test/test_weather.lua | 6 | ||||
| -rw-r--r-- | widgets/now.lua | 18 |
4 files changed, 11 insertions, 36 deletions
diff --git a/docs/superpowers/specs/2026-10-18-mirage-weather-cards-design.md b/docs/superpowers/specs/2026-10-18-mirage-weather-cards-design.md index dc3bd16..3d8b049 100644 --- a/docs/superpowers/specs/2026-10-18-mirage-weather-cards-design.md +++ b/docs/superpowers/specs/2026-10-18-mirage-weather-cards-design.md @@ -48,7 +48,7 @@ only what DESIGN.md calls a card's variable band. | Card | Header left | Big value (top-right) | Rows | Variable band | |---|---|---|---|---| -| `now` | condition glyph | current temperature, `body` | feels like, high / low, rain chance, description in `FONT_UI` | none | +| `now` | condition glyph | current temperature, `body` | feels like, high / low, rain chance, last update | the condition glyph, large, in the leftover height | | `hourly` | glyph + "Next 24h" | next hour's temperature, `body` | none | temperature curve over 24 hours; every 3rd hour labelled with glyph and temperature; rain-chance bars under the curve in `value`, half alpha, with a minimum height so a low chance still shows | | `week` | glyph + "Week" | none (band carries the value) | one per day: day name, glyph, min, range bar, max | the range bar in each row, positioned on the week's overall min..max scale | | `details` | glyph + "Details" | none | wind (speed + compass point), humidity, UV, AQI | a small wind compass with a needle at the wind direction | @@ -126,7 +126,6 @@ Rewritten for Open-Meteo, same contract as today: pure functions on strings and numbers, nothing raises, nil on bad input. - `ICON` / `icon(code, is_day)`: WMO weather code to Nerd Font glyph. -- `describe(code)`: WMO code to a short English description. - `parse(src)`: returns `{units, current, sun, air, hours, days}` or nil when `current`, `sun` or at least one `hour` is missing. - `moon(epoch)`: returns `phase` (0..1, 0 = new) and `illumination` (0..1), @@ -166,7 +165,7 @@ board. - `test/test_weather.lua` rewritten against a fixture `test/fixtures/weather.txt` (location-free; any names use `Example City`): - - WMO code to glyph and description, day and night, unknown code fallback. + - WMO code to glyph, day and night, unknown code fallback. - `parse`: full fixture, missing `air`, missing `current` (nil), garbage input (nil), empty string (nil). - `moon`: known full and new moon dates within one day of tolerance. diff --git a/lib/weather.lua b/lib/weather.lua index 3cb7b64..28b3341 100644 --- a/lib/weather.lua +++ b/lib/weather.lua @@ -59,24 +59,6 @@ function M.icon(code, is_day) return I.unknown end -local DESCRIBE = { - [0] = 'Clear sky', [1] = 'Mainly clear', [2] = 'Partly cloudy', [3] = 'Overcast', - [45] = 'Fog', [48] = 'Rime fog', - [51] = 'Light drizzle', [53] = 'Drizzle', [55] = 'Dense drizzle', - [56] = 'Freezing drizzle', [57] = 'Freezing drizzle', - [61] = 'Light rain', [63] = 'Rain', [65] = 'Heavy rain', - [66] = 'Freezing rain', [67] = 'Freezing rain', - [71] = 'Light snow', [73] = 'Snow', [75] = 'Heavy snow', [77] = 'Snow grains', - [80] = 'Rain showers', [81] = 'Rain showers', [82] = 'Violent showers', - [85] = 'Snow showers', [86] = 'Snow showers', - [95] = 'Thunderstorm', [96] = 'Thunderstorm, hail', [99] = 'Thunderstorm, hail', -} - --- WMO code in words. Reading a nil key from a table is not an error. -function M.describe(code) - return DESCRIBE[code] or 'Unknown' -end - -- Nearest integer, or nil when v is NaN, infinite or too big for an integer: -- %d and utf8.char raise on those, and a raise is a blank dashboard. local function round(v) return math.tointeger(math.floor(v + 0.5)) end diff --git a/test/test_weather.lua b/test/test_weather.lua index 2a77b43..e845c5c 100644 --- a/test/test_weather.lua +++ b/test/test_weather.lua @@ -53,12 +53,6 @@ assert(weather.icon(0, nil) == I.clear_day, 'nil is_day draws the day face') -- draws a snow cloud in the target font is not something an assertion can -- see; the glyph sheet in Task 3 is that check. --- === Descriptions ========================================================= -assert(weather.describe(0) == 'Clear sky', 'code 0 words') -assert(weather.describe(63) == 'Rain', 'code 63 words') -assert(weather.describe(99) == 'Thunderstorm, hail', 'code 99 words') -assert(weather.describe(4) == 'Unknown', 'gap code words') -assert(weather.describe(nil) == 'Unknown', 'nil code words') -- === Formatting =========================================================== assert(weather.deg(13.2) == '13\u{00B0}', 'rounds down') diff --git a/widgets/now.lua b/widgets/now.lua index 6273ed1..f00c46e 100644 --- a/widgets/now.lua +++ b/widgets/now.lua @@ -31,15 +31,15 @@ function M.draw(cr, rect, colors) big = weather.deg(c.temp), rows = rows, share = 0.85, }) - -- The condition in words, in the prose face, in what the rows left. It sits - -- on the card's foot: the type is capped to match the other cards, so a tall - -- cell leaves height over, and that gap belongs above the line, not below. - local size = S * 0.36 - local foot = inner.y + inner.h - size * 0.25 - if y + size * 1.4 <= foot then - card.font(cr, card.FONT_UI, size, false) - card.rgba(cr, colors.body) - card.text(cr, inner.x, foot, weather.describe(c.code)) + -- The condition as a large glyph, the card's variable band: the type is + -- capped to match the other cards, so a tall cell leaves height over, and the + -- glyph takes it. Dropped when there is no room for one bigger than a row. + local size = math.min(inner.y + inner.h - y, inner.w * 0.45) + if size > S * 0.6 then + card.font(cr, card.FONT_MONO, size, false) + card.rgba(cr, colors.highlight) + card.text_centre(cr, inner.x + inner.w / 2, inner.y + inner.h - size * 0.15, + weather.icon(c.code, c.is_day)) end end |
