Files
Kaloyan DanchevandClaude Opus 4.6 86191ba5f3
CI / Identify a merged version PR (push) Canceled after 0s
CI / Rust checks, rendering, and native package (push) Canceled after 0s
CI / Publish release and Homebrew feed (push) Canceled after 0s
Release PR / Maintain Version Packages PR (push) Canceled after 0s
Redesign panels, add 11 card fixes, new icons and app surfaces
Panel fixes: tall card row_span, room tab styling, vacuum card
image+value, AC airflow labels, AC fan speed sections (auto 3-btn
+ manual 5-step slider), light subtitle fallback, curtain pane
dividers, dimmable light presets, LED panel brightness + reorder.

New assets: 34 ui-icons (climate modes, cover, effects, battery,
led-strip, switch states), 3 logos, 90 app surface PNGs, design
system specs (components, ux-mechanics, tokens).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-10-27 23:29:32 +02:00

102 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Luma Home — components
Layout and look of every building block. All sizes are logical px on the 1920 × 1080 canvas;
named values are in `tokens.json`. Behaviour lives in `ux-mechanics.md` — this file only says
what things look like. Each section names the screen render to compare against.
## Screen shell
Render: `screens/Main.png`, `screens/Home.png`
| Part | Spec |
|---|---|
| Background | Wallpaper photo + scrim `color.background.scrim` (8,11,18 @ 80%). |
| Clock | x 84, centred in the 72 px top bar at y 36; 20 px / 500. |
| Top nav | Centred pill, fill `nav.pill`, 6 px padding, items 10 × 28 px padding, 20 px. Active item: fill `nav.activeTab`, ink `text.tabActiveInk`, 600. |
| Settings button | 56 px circle, right edge at x 1836. |
| Room tabs | Row at y 124, height 60, gap 8. Tab padding 10 × 22, 17 px. Active: fill `nav.activeRoom`, 600. Inactive ink `nav.inactive`. |
| Grid | x 84, y 206, 1752 × 756; 3 rows of 240, gap 18; 4 columns of 424 or 3 of 572 (`grid` tokens). |
| Hint bar | x 84, 30 px from the bottom; items 40 px apart. Key cap: 2 px border white 60%, radius 6, 11 px / 700, padding 2 × 8. Label 14 px / 500, white 80%. |
## DeviceCard (1×1)
Render: `screens/Main.png`, `screens/*States.png`
- Box: fills the cell; radius 22; padding 18; border 2 px; fill/border/shadow from `color.card` (focus variants when focused).
- Glow (on): radial gradient at (42, 42) of the accent at 38% → transparent at 72%.
- **Top row** (gap 14): 48 px icon circle (24 px icon) · name 19 px / 600, single line, ellipsis · value 20 px / 700, right-aligned.
- **Middle band** (flex, margin 12 top / 10 bottom), one of:
- `spark` — 64 px tall polyline, 3 px stroke in the accent (grey `lineOff` when off), labels "24 h" / "now" 12 px below.
- `bar` — 12 px track `barTrack`, radius 6, fill = accent at the level %.
- `swatch` — 34 px strip, radius 10: solid colour or the effect gradient.
- `curtain` — 5 px rail, three window panes (2 px outline white 22%), two fabric panels each `(100 − position) / 2` % wide with a 4 px edge in the accent.
- `image` — appliance photo on the **right** (max 120 px, square, contain), facts on the left: label 12 px white 60%, value 14 px / 700 (highlight = accent, `warn` = `accent.warning`).
- none — empty band (on/off lights, switches).
- **Warning subtitle** (`subWarn`): amber `#F2B84B`, 600 — battery low, window open, dock needs attention.
- **Offline**: whole card at 50 % opacity, value "Offline".
- **Subtitle**: 14 px / 500, white 72%, single line, at the bottom.
- 3-column grid: same layout in the 572 px cell.
## WeatherCard
Render: `screens/WeatherStates.png`
- 1×1: weather icon, current temperature (large), condition, humidity, wind, high/low.
- 1×2 (498 tall): the 1×1 content on top, the **5-day forecast** below (day, icon, low–high).
## MediaCard
Render: `screens/MediaStates.png`, `screens/MediaSpec.png`
- Background: card fill + purple radial glow (128, 96, 192 @ 42%) from the top-left.
- **1×1**: 84 px artwork (radius 10) · status "Playing · Spotify" 13 px / 600 `accent.mediaLabel` with the volume readout right-aligned on the same line (15 px volume icon + "24%" 14 px / 700) · title 19 px / 700 · artist 15 px.
- **1×2**: 220 px artwork centred (radius 14) · status + volume line (20 px tall) · title 24 px · artist 17 px · elapsed / remaining 13 px under the progress bar.
- Progress: 4 px track white 22%, fill white.
- Buttons (gap 26, centred): Previous 52 px · Play/Pause 62 px filled `accent.media` with dark icon · Next 52 px; idle buttons white 10%.
- Focus: ring on the focused button (4 px, offset 4, dark gap), never on the card.
- Seeking: the held button turns white with dark icon; 16 px playhead dot with a 4 px purple halo; white bubble 14 px / 700 above it.
- Volume change: readout becomes a white pill (dark ink, padding 0 8, radius 9–10).
## VacuumCard
Render: `screens/VacuumStates.png`
DeviceCard with the `image` band: photo `assets/roborock-s7.png` (transparent cut-out, in this folder).
Cleaning facts: Mode (highlighted), Now in. Docked facts: Battery, Water · clean / dirty.
## RoomCard
Render: `screens/RoomStates.png`, `screens/Home.png`
- Box: as DeviceCard. Background: the Home Assistant area photo (fetched from HA, never bundled — `ux-mechanics.md` §B11), cover-cropped, under a gradient
`rgba(8,11,18,.78) 0% → 0 at 32% → 0 at 40% → .84 at 66% → .94 at 100%`. Lights off: photo `brightness(0.45) saturate(0.2)`.
No photo: glass fill + gold glow while any light is on.
- Top row as DeviceCard; text gets a soft shadow `0 1px 6px rgba(0,0,0,.75)` over a photo.
- Bottom line (8 px above the subtitle): three stats, gap 22, each a 20 px icon + value 18 px / 700. Colours: lights `accent.light`, curtains `accent.curtain` (white 75 % when closed), air `aqGood` / `aqFair` / `aqPoor`.
- Subtitle 14 px, white 78 %; warnings `warning` 600.
## Panel (shared)
Renders: every `*States.png` (right side)
- 620 × 1080 at the right edge, radius 28, fill `panel.fill`, shadow `shadow.panel`, padding 56 / 56 / 48.
- Header: eyebrow (room) 16 px white 72% · 56 px icon circle (accent fill, 30 px icon) · title 34 px / 700 · state line 18 px / 600 in the accent.
- Sections: label 19 px / 600, 44 px below the header, 40 px between sections, control 14 px below its label.
- Slider: 72 px tall, radius 18, track white 12%, fill accent, value 28 px / 700 inside on the left. Help line 15 px white 74% below.
- Buttons / presets: 64 px tall, radius 16, gap 12, 20 px / 600, fill white 10%. Selected: accent at 26% fill + 3 px inset accent edge (or solid accent with dark ink for the primary choice).
- Focus inside panels: 4 px white ring, offset 5, with a 5 px dark gap.
- Hint bar pinned to the bottom of the panel (same style as the screen hint bar).
### Panel contents
| Panel | Sections (top → bottom) | Render |
|---|---|---|
| Dimmable light | Brightness · Presets (Off, 25, 50, 100 %) | `LightStates.png` |
| Colour light | Brightness · Light type (White / Colour) · White temperature or Hue · Swatches | `LightColorStates.png` |
| LED / TV lights | Brightness · Light · Temperature or Hue · White or Colour presets · Effects (6 pinned + All effects) | `LedStates.png` (colour, white, all effects) |
| All effects | Pinned group (numbered, "Not on panel" tag after 6) · All effects A–Z; gold star = pinned | `LedStates.png` (right) |
| AC | Target · Mode (5 icons) · Fan speed · auto (Auto, Quiet, Turbo) · Fan speed · manual (5 steps) · Up–down airflow · Left–right airflow (Swing + 5, icon-only) | `ClimateStates.png` |
| Heating | Target dial (with room temp) · Mode (Off / Heat) · Preset · Temperature sensor (thermostat) · Settings toggles · battery / info line | `HeatingStates.png` |
| Curtain | Window drawing + position · Open / Stop / Close · Presets (Open, 60, 45, 30, Closed) | `CurtainStates.png` |
| Weather | Now · Humidity · Wind · Next hours · Next days | `WeatherStates.png` |
| Media | Now playing · Play on · Up next · Search | `MediaStates.png` |
| Room quick panel | Header (temperature · humidity · air) · Lights with All off + one switch row each · Curtains rows with Open / Stop / Close · Climate rows with switches | `RoomStates.png` |
| Vacuum | Rooms (3-column grid, check + green edge when picked) · Mode · Routines + Dock · primary "Clean N rooms" (solid green, 64 px) | `VacuumStates.png` |
## Icons
`icons/` — 58 single-colour SVGs (Uicons Regular Rounded + two custom), tinted at render time:
dark ink `#15181E` on an accent circle when on, white 80% on a grey circle when off.
See `icons/README.md` for the name map and the required attribution.