diff options
| author | Craig Jennings <c@cjennings.net> | 2026-07-22 15:15:02 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-07-22 15:15:02 -0500 |
| commit | f1c661f50d6af2a115fc1430ae0478f2acef2dec (patch) | |
| tree | b894ea2e14327794bb75671b962f37185cff22ea /docs/specs/2026-07-02-desktop-settings-panel-spec.org | |
| parent | f594068bed75302aba50793ccf5e6ce9cf53c7f8 (diff) | |
| download | archsetup-f1c661f50d6af2a115fc1430ae0478f2acef2dec.tar.gz archsetup-f1c661f50d6af2a115fc1430ae0478f2acef2dec.zip | |
docs(settings-panel): seal the prototype arc and open the build
Prototypes P12-P37 land, along with the night-watch and levels-compare pages plus the shared-engine updates and the kit-candidate file. The spec flips from DRAFT through READY to DOING with rewritten implementation phases and seven recorded build findings. The build tasks are filed in todo.org, and phase 1 is closed against the dotfiles commits.
Diffstat (limited to 'docs/specs/2026-07-02-desktop-settings-panel-spec.org')
| -rw-r--r-- | docs/specs/2026-07-02-desktop-settings-panel-spec.org | 884 |
1 files changed, 862 insertions, 22 deletions
diff --git a/docs/specs/2026-07-02-desktop-settings-panel-spec.org b/docs/specs/2026-07-02-desktop-settings-panel-spec.org index 3aef647..f2ac773 100644 --- a/docs/specs/2026-07-02-desktop-settings-panel-spec.org +++ b/docs/specs/2026-07-02-desktop-settings-panel-spec.org @@ -4,17 +4,26 @@ #+TODO: TODO | DONE #+TODO: DRAFT READY DOING | IMPLEMENTED SUPERSEDED CANCELLED -* DRAFT Desktop-Settings Dropdown Panel +* DOING Desktop-Settings Dropdown Panel :PROPERTIES: :ID: d6bb1e73-ec90-4327-85ee-bfa762da5bce :END: - 2026-07-04 Sat @ 12:36:56 -0500 — retrofitted by spec-sort; status set to DRAFT (evidence-based, human-confirmed) -* DRAFT Status +* DOING Status :PROPERTIES: :ID: fb7eec22-a214-4568-82c4-903612f4832f :END: -- [2026-07-19 Sun] DRAFT — folded Craig's control-set decisions (home->archsetup handoff): added night-light, DND, lock/suspend, power profile, and scenes to the controls table; recorded volume and theme as out-of-scope with reasons; pulled the format pickers into a separate display-format sibling spec (stub filed). The "few other things" scoping decision and the scenes decision are now closed. One decision stays open — the wallpaper manager's shape (row-that-opens-a-sub-view vs its own sub-spec), to resolve at spec-review. UI prototyping (ui-prototyping rule: research -> 5 directions -> iterate) is not done yet and is the gate before READY. +- [2026-07-22 Wed] DOING — spec-response: the four rewritten implementation phases decomposed into build tasks in todo.org under a :SPEC_ID:-stamped parent, with the test surface and the final flip-to-IMPLEMENTED task emitted. The build proceeds in dotfiles settings/ per the location decision; archsetup drives. +- [2026-07-22 Wed] READY — spec-review passed (rubric: Ready with caveats; see Review findings — two findings fixed in-run, two non-blocking build-time picks recorded). The prototyping gate closed at prototype 37, sealed by Craig's "Build it. Anything more would be bit fiddling." The FOCUS headphones glyph stands confirmed by the same words. Normative reference: prototype 37. +- [2026-07-22 Wed] DRAFT — UI PROTOTYPING COMPLETE. Thirty-five prototypes ended at [[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-35.html][Prototype 35, the final candidate]] (linked as the normative reference under Design sketch), sealed by Craig's "I think that's it" after his annotation batch applied clean. The design evolved far past the original controls table — programmable-presets matrix, instrument bench, wallpaper channels — with every turn recorded under Prototype iterations. The gate before READY is satisfied: research cited, ~5 directions grew to 35 with the winner iterated to final, every UI decision made against working prototypes. Next: spec-review (reconcile the Design sketch's aging architecture prose against what the prototypes actually settled), then spec-response into build phases. +- [2026-07-21 Tue] DRAFT — casting sitting complete: Craig cast every control role live against working candidates (see "Casting" under Prototype iterations). Scenes = tuner dial + presets; brightness = new detent fader with speedbump physics; keyboard = single-drum roller; power = chicken-head; toggles = rocker bank; airplane = guarded lever (throw fixed); caffeine = wind-up timer dial; chrome = warm-gold receiver plate. Three kit-candidate components accrued in dupre-kit-additions.js with a merge task filed. Next: compose prototype 12 and iterate to final. +- [2026-07-21 Tue] DRAFT — scope change (Craig): lock/suspend withdrawn from the panel (they live on the wlogout screen, Super+Shift+Q); a new open decision "Idle pipeline" proposes staged idle timeouts (dim/lock/screen-off/power action) and caffeine as a timed inhibit, replacing the bare on/off. DND semantics finding recorded in the controls table (pause dams and floods; dead-drop needs an explicit queue clear). +- [2026-07-21 Tue] DRAFT — three Dupre Kit directions (9 engine room, 10 spacecraft DSKY, 11 mixing desk) composed from the real widgets.js builders after Craig pointed the phase at the panel-widget-gallery catalogue; his two favorite level controls (drum roller, thumb-slide attenuator) each carry the levels in one direction for a working comparison. Eleven directions total; pick still pending. +- [2026-07-21 Tue] DRAFT — three more direction prototypes (6 hi-fi receiver, 7 chronograph, 8 gauge cluster) built to Craig's aesthetic brief: retro hi-fi stereo / chronograph / automobile dashboard. Craig loved the scenes-as-station-presets idea, so the tuner dial is direction 6's hero. Also retired the status lamps across all directions (the glowing dot pulled the eye) and fixed a slider-fill CSS hack that bled a huge gold disc over directions 1/2/3/5. Direction pick still pending. +- [2026-07-21 Tue] DRAFT — UI-prototyping phase: recorded the quick-settings prior-art survey (see Prior art under Design sketch) and brought the five 2026-07-19 direction prototypes up to the current controls table (weather-geo toggle added to the shared engine and every direction; caffeine restored to directions 2 and 5, which had dropped it). All five verified rendering error-free headless. Awaiting Craig's direction pick before the iterate-to-final pass. +- [2026-07-21 Tue] DRAFT — added a weather-geolocation toggle to the controls table (use_geo in the weather config: whereami WiFi fix vs pinned home coords). Both machines run use_geo=true for testing as of today; ratio may flip back by hand until the panel ships the switch. +- [2026-07-19 Sun] DRAFT — folded Craig's control-set decisions (home->archsetup handoff): added night-light, DND, lock/suspend, power profile, and scenes to the controls table; recorded volume and theme as out-of-scope with reasons; pulled the format pickers into a separate display-format sibling spec (stub filed). The "few other things" scoping decision and the scenes decision are now closed. The wallpaper-shape decision closed the same day (row-that-opens-a-sub-view — see Decisions), leaving no open decisions. UI prototyping (ui-prototyping rule: research -> 5 directions -> iterate) is not done yet and is the gate before READY. - [2026-07-04 Sat] DRAFT — all four decisions resolved by Craig (dim + airplane collapse into the panel, touchpad + caffeine stay on the bar; Super+Shift+G keybind; code in dotfiles settings/ beside net/; 5% brightness floor). The four collapse/keybind/location/floor decisions are closed; one open scoping question remains ("few other things" — see Decisions) before a spec-review can flip it READY. - [2026-07-03 Fri] DRAFT update — from the waybar/panel-family design discussion: adopt the instrument-console faceplate aesthetic net + bt @@ -26,11 +35,528 @@ dropdown panel" (2026-06-24 review), updated for the Blueprint/GTK4 pipeline the net panel stood up 2026-07-01. +** Prototype iterations + +Five direction prototypes (2026-07-19), all full working layouts over one +shared mock engine ([[file:../prototypes/desktop-settings-shared.js][desktop-settings-shared.js]] + +[[file:../prototypes/desktop-settings-shared.css][desktop-settings-shared.css]]) so the directions are genuinely comparable: +same state model, same verify-everything simulation (apply, mock readback, +green verify flash + toast), same wallpaper sub-view. + +- [[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-1.html][Direction 1 — tile grid]]: the Android/GNOME quick-settings idiom; scenes + strip, 2-column toggle tiles, sliders and power below. +- [[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-2.html][Direction 2 — sectioned rack]]: full-width console keys under engraved + section labels; closest to the net/bt panel idiom. +- [[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-3.html][Direction 3 — scenes-first]]: scenes as the hero controls, everything else + beneath. +- [[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-4.html][Direction 4 — instrument cluster]]: ring gauges for the levels, a rotary + power-profile selector, lamp rows; leans hardest into the faceplate + aesthetic. +- [[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-5.html][Direction 5 — compact expandable rows]]: one slim row per control, + progressive disclosure for power/scenes/wallpaper. + +2026-07-21: all five updated to the current controls table (weather-geo +added; caffeine restored to directions 2 and 5) and verified rendering +error-free. + +Three more directions added 2026-07-21 to Craig's aesthetic brief — retro +hi-fi stereo, chronograph, automobile dashboard — treating the panel as a +physical object rather than a software surface. Same shared engine, same +control roster: + +- [[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-6.html][Direction 6 — hi-fi receiver]]: scenes as station presets on a backlit + tuner dial (sliding needle) + preset keys; rotary knobs with VU meters + for the levels; a backlit switch bank; an input-selector knob for power. +- [[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-7.html][Direction 7 — chronograph]]: the panel is a watch. Brightness is the main + dial (drag the bezel; gold hand + digital window), chrono subdials carry + keyboard/power/scene, crowns are the momentary actions, bracelet links + are the toggles. +- [[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-8.html][Direction 8 — gauge cluster]]: a dashboard binnacle with twin needle + gauges (drag to set), a rocker-switch bank with backlit legends, + push-button drive modes for scenes, an ignition rotary for power, dash + pull-knobs for actions. + +Three further directions added 2026-07-21, composed from the real Dupre Kit +builders (widgets.js) rather than hand-rolled lookalikes — so each doubles +as a component-selection exercise for the eventual GTK port. Craig's two +favorite level controls get the same job in two different directions so +they can be compared in working form: the drum roller in direction 9, the +thumb-slide attenuator in direction 10. + +- [[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-9.html][Direction 9 — engine room]]: drum-roller levels, split-flap scene board + read from a rotary selector, breaker-panel toggles, guarded airplane + lever, engine-order telegraph for power, arm-to-fire actions. +- [[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-10.html][Direction 10 — spacecraft DSKY]]: thumb-slide levels, slide-switch bank + under a live caution board, scenes commanded by DSKY verb entry + (V01-V04, V00 off), keyed mode switch for power. +- [[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-11.html][Direction 11 — mixing desk]]: slot faders in dB with a VU bridge, + radio-preset scene bank, chip toggles with DND on a stomp pedal, rotary + power selector. + +Kit-integration notes for the port, learned building these: the kit's +CSS-built selector spans (.dupre-rotsel, .dupre-keylock) size themselves +with width/height on inline display, so consumers outside the gallery need +display:inline-block on them; breakerPanel has no set() and hardcodes its +initial states, so reflecting external state means synthesizing clicks on +its hit rects (a set() upstream would fix it); and the shared mock engine +now carries weathergeo in its state object (it was metadata-only, and +kit toggles default-on when opts.on is undefined). + +*** Casting (2026-07-21) — instrument per role, picked live + +Rather than one direction wholesale, Craig cast each control role from the +bench in a live sitting (candidates driven in working form; the scenes and +levels casting pages below were built for the head-to-heads): + +- Scenes (panel hero, top): kit slideRule tuner dial — stops + OFF/FOCUS/PRES/BATT/NIGHT, lit stop label, sliding needle — over + PRESET 1-4 keys. Beat rotary + split-flap head-to-head + ([[file:../prototypes/2026-07-02-desktop-settings-panel-scenes-compare.html][scenes casting page]]). +- Screen brightness: detentFader (NEW kit-candidate component) — full-width + horizontal fader, detents at 25/50/75 with speedbump physics (magnet + + escape hysteresis; the thumb parks until the pointer pushes through). + Craig's revision of the plain faderH pick. +- Keyboard backlight: drumRoller, single drum 0-10 (kit builder generalized + to 1..N channels + min/max — stock was hardcoded to two drums). + ([[file:../prototypes/2026-07-02-desktop-settings-panel-levels-compare.html][levels casting page]] carries both level controls.) +- Power profile: chicken-head knob, three detents. +- Toggle bank: kit rocker bank — lit engraved legends carry state (no lamp + dots; the status-lamp retirement holds). +- Airplane: guardedToggle, laptop-only, patched to a rotateX throw (the + stock 180° planar spin swept the lever sideways mid-transition). +- Caffeine / idle inhibit: kit timerDial as a wind-up timed inhibit (real + minutes at build; demo clock is min/sec). +- Chrome: direction 6's receiver faceplate in warm Dupre gold — family-kin + with net/bt/audio. (Marantz-blue slideRule skin seen and passed on.) + +The three kit-candidate components (detentFader NEW, drumRoller and +guardedToggle UPGRADEs) live in +[[file:../prototypes/dupre-kit-additions.js][dupre-kit-additions.js]] pending the +kit merge (tracked in todo.org). + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-12.html][Prototype 12 — the casting composite]] (2026-07-21, overnight on Craig's +go): every cast instrument composed on the warm-gold receiver chassis with +the current roster — tuner + presets, detent fader, single drum, +chicken-head, wind-up caffeine timer, rocker bank, guarded airplane, +wallpaper sub-view; lock/suspend absent per the wlogout amendment. All +interactions verified headless (scene tune + preset punch, fader detents, +drum drag, chicken step, timer wind → caffeine, rockers, lever, sub-view +round-trip). Composing it surfaced and fixed a latent shared-engine bug: +wallpaperSubview returned a div carrying the ds-subview class +(display:none outside .open), so the wallpaper sub-view had been opening +empty in every direction prototype. Iteration to final happens against +this file. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-13.html][Prototype 13 — P12 + Craig's first iteration]] (2026-07-22): presets moved +above the dial full-width (Preset 2 contains "Presentation" whole); screen +brightness RECAST from the detent fader to the drum — screen + keyboard now +run as the classic two-drum pair left of an enlarged caffeine timer, which +gains a HOLD/TIMED rocker so caffeine can be held always-on; compact +chicken-head in the upper-right quadrant; switch wall of six with the +guarded airplane lever in the mix; weather-geo DROPPED from the panel +entirely (controls-table row removed — the config stays hand-edited); +wallpaper row unchanged. The detentFader remains a kit-merge candidate on +its own merits. Verified: HOLD drives caffeine, drum drag drives +brightness, preset containment and tuner stop visibility checked +programmatically. Second pass same night: the drums grew to run flush with +the timer column (drum top level with the dial top, bottom with the HOLD +rocker — verified 0px deltas); drumRoller gained a height option for it (a +taller stage opens a longer paper window showing more of the scale), which +joins the kit-merge candidate's contract. Third pass: the caffeine timer +was unwindable live — crossing zero mid-drag toggled caffeine, the +re-render destroyed the dial under the pointer, and every rebuilt +timerDial leaked its countdown interval as a ghost writing stale minutes. +Fix: self-clocked instruments persist across re-renders (reparent, never +rebuild) and state sync is debounced past the drag. This is a +build-architecture rule for the GTK port too: instruments that own a +clock own their widget lifetime. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-14.html][Prototype 14 — timer refinements]] (2026-07-22): the HOLD/TIMED rocker is +replaced by a bat toggle seated at the timer's upper-right where the +winding-direction arrow was (arrow removed) — bat up TIMED, down HOLD +(always-on caffeine); the timer dial is vertically centered against the +drum column instead of top-flush. batToggle joins the kit-merge additions +with the same rotateX throw fix as guardedToggle (stock had the identical +180° planar spin). Verified: bat drives hold-caffeine both ways, center +delta 0, arrow absent. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-15.html][Prototype 15 — power slide]] (2026-07-22): the chicken-head is replaced by +a three-position slide switch under the tuner — a status lamp per +position, labeled PERFORMANCE / BALANCE / POWER SAVE, stretching to +exactly the tuner's length; the tuner itself is restored to full plate +width. Two more kit-candidates for it: slideSelector (NEW — stretchable +n-position slide with per-position lamps, pillSlide's full-size +descendant) and a slideRule width option (the printed scale spreads its +stops proportionally; custom widths take a wider edge margin so end-stop +labels stay inside). Verified: slide clicks and drags land positions and +drive the profile, exactly one lamp lit, scenes move the slide (Focus +sets BALANCE), tuner tunes at full width with end labels contained. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-16.html][Prototype 16 — rebalanced]] (2026-07-22): built from a design critique +Craig requested ("it still feels off") whose diagnosis was inverted +salience — the least-used control (the caffeine timer, largest object, +only big red) shouted loudest while the heroes (scenes, brightness) +whispered. Changes, same instruments throughout: three uniform plates on +one grid (Scenes·Power / Levels·Caffeine / Switches); the drum pair +replaced by the thumb-slide attenuator pair at Craig's call (the cream +paper drums were the panel's bright blob and out of family with the +slide/fader chrome); the timer de-throned — steel stop knob, amber +index/OFF, single engraving, bat docked on its stage; rockers carry their +function name on the lit half with a new `quiet` option killing the +warning-red off state (a fourth kit-candidate UPGRADE — red-off stays +stock default for switches where off is the notable state); the airplane +lever sits on the rocker baseline with trimmed AIR/SAFE labels. Red now +appears exactly twice, both semantically: the tuner needle (vintage +heritage) and the airplane danger disc. Salience rule recorded for the +GTK build: visual loudness follows frequency × importance — scenes and +brightness loudest, switches calm, caffeine polite. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-17.html][Prototype 17 — switches under their presets]] (2026-07-22): plate order +rearranged for causality — the presets program the switches, so the wall +now sits directly beneath the scenes plate ("strange to have the preset +buttons on top controlling switches on the bottom" — Craig), with the +power slide just under the wall in a shared Switches · Power plate; +Levels · Caffeine follows. The power slide's knob goes dark (a knob +option — chrome default / machined-dark — added to the slideSelector +kit candidate). Verified: plate order wall → slide → levels, dark knob +class active, and the adjacency in action — the Night preset lights the +rockers directly beneath it and slides power to POWER SAVE. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-18.html][Prototype 18 — the program chart]] (2026-07-22): Craig asked what analog +component the missing "one selector recalls a configuration" pattern maps +to. Answer: two — the behavioral half is the organ combination action / +flying-fader scene recall (controls physically move on recall, which the +panel already does), and the legible half is the washing-machine faceplate +program chart, which was the missing piece. New kit-candidate +DUPRE.programChart: one row per program, one column per contact — filled +dot closes it, ring opens it, dash leaves it alone, letters carry enums — +active row lit, display-only, derived straight from the scene definitions +(which makes visible that scenes never touch TPAD/MOUSE). Also this pass: +airplane removed from the panel (network panel owns it — table row and +wall slot dropped); the dial's OFF stop relabeled CUSTOM (no scene = a +hand-set configuration, not "off"); a real-proportion pass — thumb slides +up toward hand size, timer down toward kitchen-timer size. Verified: +chart rows follow scene changes, CUSTOM releases the scene while the +switches hold state, airplane absent. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-19.html][Prototype 19 — the chart becomes a punch card]] (2026-07-22): the program +chart turns editable and white — its lights indicate FUTURE state (what +the preset will set on recall), so they sit deliberately outside the +amber live family; clicking a cell reprograms the preset (dots cycle +closes → opens → untouched, the power letter cycles P/B/S/–), with edits +written back to the scene definitions and honored on the next recall +(verified: adding DND to Battery's program, then recalling Battery, +engaged DND for real). Switches engage GREEN (a rocker accent option — +run/engaged semantics) and shrink to true rocker size; slides grow. +Three-register color semantics recorded for the build: amber = scene +family and live selection, green = engaged switches, white = programmed +future state. Craig's observation logged with it: the panel is converging +on a master-preset architecture — the presets program everything below +except the wound timer minutes; the chart is that programming surface. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-20.html][Prototype 20 — the switch matrix]] (2026-07-22): the master-preset +architecture made literal. The panel's axis IS the switches: preset row, +punch chart, and switch wall fuse into one matrix — each row a live +switch (rocker / caffeine lamp / a mini three-detent power slide), the +four preset buttons running across the top as column heads (names only, +no PRESET N), white punch lights under each program column, every cell +editable. The slide-rule tuner is retired (preset buttons + CUSTOM-by- +touching carry scene selection); TPAD and MOUSE — which no scene touches +— drop to their own Pointing strip; SCREEN, KBD, and power go horizontal +via a new kit-candidate, thumbSlideH (the thumb slide turned on its side: +continuous 0-100 or detented positions, stretchable). Build note: the +matrix itself is page-level composition for now — if it survives +iteration it should become a kit switchMatrix component; and component- +scoped CSS bit again (the chart's dot classes are scoped to .dupre-pchart, +so the matrix carries its own copy). Verified: preset buttons recall and +light the rockers, punch edits write back and hold, horizontal slides +drive both levels, the matrix power slide sets the profile, tuner absent. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-21.html][Prototype 21 — the pin routing matrix]] (2026-07-22): P20's accidental +switch-relocation told Craig what the interface actually is — a pin +routing matrix (EMS-Synthi patch idiom, already in the kit). The kit +pinMatrix got the upgrade treatment (kit-candidate #9: configurable +geometry, per-column pin colors, clickable button column-heads with an +active state, row-group dividers, set(); stock 5×6 defaults preserved) +and became the whole interface: switch names label the rows (the physical +rockers are gone — "remove all the switches, which now become labels"), +program buttons head the columns, a green live NOW column carries current +state (click to toggle; the live power pin can't be pulled, only moved), +white pins program the four scene columns, and the power rows are a radio +group per column. Program semantics simplified to complete definitions: +recall makes the column's pin pattern the truth (pin on, absent off). +CAFF is an ordinary switch row; the caffeine timer job is retired and the +dial is repurposed as a SLEEP TIMER (wind minutes until suspend — the +receiver classic; pairs with CAFF as the two directions of the idle +fight), bat toggle retired with it. The drums return for SCREEN/KBD at +Craig's call ("I love the drum"). Verified end to end: NOW pins toggle +live state, program pins write back, power radio enforces one pin per +column, column-head recall applies the full pattern (including a +just-seated CAFF pin), sleep timer winds/runs down/fires the mock +suspend, button heads contained after a geometry margin fix. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-22.html][Prototype 22 — the programmable matrix]] (2026-07-22): Craig named the +component the design was building toward, and it exists now — +DUPRE.programMatrix (kit-candidate #10): programs as caps column-head key +plates (FOCUS · PRESENT · BATTERY · NIGHT — "Presentation" shortened), +settings as spelled-out engraved rows (AUTO-DIM, NIGHT LIGHT, DO NOT +DISTURB, CAFFEINE; engraved-and-infilled relief after the pure kit +engrave idiom proved illegible at 6px), radio row groups, and the core +semantic: NO live column — pressing a head activates the program and its +column's pins turn white → green, because active-is-live: the recalled +pattern IS the machine's state. Editing the green column edits the +present (live state and stored program move together, and the column +STAYS active); editing a white column edits a future. Build finding for +the GTK port: the mock engine cleared the active scene on any member +write, which silently dropped active-is-live — the real PanelModel must +let program-membership writes survive without deactivating the program. +Verified: activation floods the column green and applies the pattern, +active-column DND pull changed live + program while staying in NIGHT, +radio PERF move followed suit, inactive-column CAFFEINE seat edited the +program without touching live state. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-23.html][Prototype 23 — the pushwheel CPU row]] (2026-07-22): CPU power collapses +from three radio rows to ONE letter row. Craig asked for the analog +referent — triangle up/down steppers beside a lettered tape-counter +window — which is the industrial push-button thumbwheel (BCD pushwheel) +switch; no kit component existed (chromeMinMax checked: it's a dome +gauge), so programMatrix grew letter rows: program cells carry one of +the row's values (P/B/S here, click cycles; ↑/~/↓ noted as an alternate +glyph set), and stepper: true appends the pushwheel at the row's right — +window showing the LIVE letter, triangles stepping it (up toward P, +clamped). Active-is-live holds: stepping while a program is active +writes the program's letter too and stays active. Row labels now +right-align to the column buttons' left edge (Craig). Verified: stepper +walks B→S and back up to P, inactive letter cycles edit programs only, +NIGHT activation floods letters green, active stepping moves live + +program together; a margin fix cleared the fourth column's letter from +the pushwheel window. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-24.html][Prototype 24 — tape wheel + jewel verdicts]] (2026-07-22): the triangle +steppers retire after one prototype — the tape-counter wheel IS the +button now (click cycles the live CPU letter, wrapping), rendered as a +proper wheel cell: cream paper, cylinder shading, 13px printed letter, +after the kit tapeCounter's look. And the active column gains verdict +lamps per Craig's read that they're jewel pilot lamps "just not so large +and flashy": every switch row in the live column shows a definite state — +a domed green jewel for seated, a smaller red jewel for a socket the +program holds off; inactive seated pins wear a frost-white jewel dome. +Verified: wheel cycles B→S→P→B, NIGHT activation shows three green +verdicts + one red (CAFFEINE held off) + the green S letter, program +edits and active-is-live unchanged. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-25.html][Prototype 25 — wheels in every column]] (2026-07-22): Craig caught the +side wheel as another NOW-column vestige — under active-is-live the +active column's value IS the live value, so the tape wheel belongs in +every program column, not off to the side. Each CPU POWER cell is now +its own bezeled tape wheel (click cycles that program's letter); the +active column's wheel wears a green bezel and is the machine's live CPU +state. Jewel pilot lamps sized up (5.6 / 4.8) with taller rows (dy 21) +to match. Verified: inactive wheels edit programs only, the active wheel +cycles live + program together and stays active, activation applies the +program's letter. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-26.html][Prototype 26 — physical keys, arrow wheels]] (2026-07-22): the program +heads become real keys — raised bevel over a static shadow at rest, +visibly DEPRESSED onto it when active, with green lighting only the +engraved legend (a backlit key, not a bordered chip); the active wheel's +green bezel is dropped (paper doesn't glow — the depressed key and the +jewel verdicts carry live indication); row labels engraved larger and +brighter-infilled for faceplate presence; the CPU wheels print ↑ – ↓ +(performance / balanced / saver) instead of letters; and the whole panel +widens to 434px (matrix 382) to give it all room. Verified: NIGHT's key +depresses with a green legend while the others sit proud, wheels carry +the arrow glyphs, the active wheel still cycles live + program together +without dropping the program. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-27.html][Prototype 27 — console keys, six slots, one bench]] (2026-07-22): the +head keys become the kit's own console-key primitive (.dupre-key, +lighting full green when active — the component now composes DOM keys +over the SVG pin field); TWO blank program slots grow the matrix +rightward (programs are {id, label} so blank labels keep unique pin +keys; the slots recall as honest all-off programs — verified: Slot5 +lights four red verdicts and a dash); the panel window widens to 560. +The lower level becomes one bench: drums · machined groove · TPAD over +MOUSE · groove · sleep dial, and the separate Pointing plate dissolves. +Maintenance note: a string-surgery patch had earlier fused pinMatrix and +programMatrix (shared anchor text matched the wrong builder — the +assignment silently vanished); both were rebuilt clean, which the kit +merge should treat as the canonical text. Keys blur after click so only +meaningful light remains. Next design conversation, per Craig: how the +sleep dial associates with the action it fires at zero. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-28.html][Prototype 28 — the idle tripper rail]] (2026-07-22): the dial-association +conversation resolved the dial out of existence. Craig's question — "in X +minutes from now, or when idle for X minutes?" — was answered B, with the +principle stated: THIS PANEL PROGRAMS FUTURES, not immediate actions. A +wound countdown lies for intent B (an idle threshold re-arms on input), +so the sleep dial retired and the idle pipeline surfaced as its honest +analog: the tripper rail (kit-candidate #12, DUPRE.tripRail — the +mechanical time-switch tripper translated from clock time to idle time). +A sqrt-spaced idle-minutes scale with clamp tabs — DIM 5 · LOCK 7 · +WATCH 8 · SCREEN OFF 10 · SUSPEND 30 — dragged to retune (stages clamp +between neighbors, keeping pipeline order), a dashed OFF siding parks a +stage disabled, flags re-alternate among active tabs so labels never +collide, and engaged CAFFEINE renders the whole rail dimmed with a +BYPASSED · CAFFEINE stamp — the pin's meaning made visible. This +supersedes the idle-pipeline decision's "delays live in hypridle.conf" +placement: the rail IS the panel-native programming surface for those +same values (the build writes hypridle.conf and reloads). Verified: +dragging SUSPEND 30→45 commits, LOCK clamps below its neighbor, WATCH +parks to off, the bypass dims and stamps. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-29.html][Prototype 29 — the idle tripper dial]] (2026-07-22): the rail was my +translation; Craig's actual mental image was the ROUND form — the +Intermatic segment-timer dial with four COLORED tripper tabs clamped on +the rim (kit-candidate #13, DUPRE.tripDial; the rail stays a candidate in +its own right). A 300° sqrt-spaced idle scale with a bottom OFF notch: +drag a tab around the rim to retune its stage, drop it through the notch +to disable; a side legend maps color → stage → minutes (DIM amber · +LOCK slate · SCREEN OFF steel · SUSPEND terracotta). Two design +resolutions rode in with it: WATCH IS THE LOCK SCREEN — the night watch +becomes the face the lock stage shows, not a pipeline stage of its own +(the idle-decision's separate eye-candy stage folds into LOCK; the +night-watch build gains "runs as/over hyprlock" as its integration +target); and the dial returns to the bench, restoring drums · groove · +pointing · groove · dial. Verified: rim drag commits (SUSPEND 30→45), +order clamping holds (LOCK stopped at DIM+0.5), the notch parks a stage, +CAFFEINE dims the face under the BYPASSED stamp. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-30.html][Prototype 30 — family chrome]] (2026-07-22): Craig flagged the panel as +noticeably off-family from maint/net/bt; diagnosis: the prototypes had +been wearing the widget gallery's amber (#e2a038) since P9, while the +family runs THEME gold (#dab53d / #ffd75f) — plus flat brushed plates +where the family uses raised gradient faceplates. Aligned: theme-gold +token family, maint-style body glow and panel background, the maint +header (raised face, cream wide-tracked title), raised-gradient plates +with inset highlights, and a darker matrix field inset into a lighter +plate (the requested contrast — empty sockets now read as visible +punch-card rings). Also this pass: slots labeled 1 · 2 as SLIM keys +(programMatrix gains weighted column widths; window compacts to 540); +factory presets programmed (FOCUS 1011↑ · PRESENT 0011– · BATTERY 1000↓ +· NIGHT 1101↓, slots all-off, all programs persist edits); the section +renamed PROGRAMMABLE PRESETS; the caffeine/CPU divider removed; drums +and dial enlarged with lighter cream dial numerals. Open question +parked: where TPAD/MOUSE live (Craig floated right-of-the-presets; +recommendation recorded in session notes to keep them off the +programming faceplate). + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-31.html][Prototype 31 — encircled groups]] (2026-07-22): the TPAD/MOUSE question +resolved — Craig accepted keeping them off the programming faceplate but +wanted them smaller: the rockers retire and the pair become console keys +(same primitive as the preset heads, lighting green when engaged), +horizontal, seated above the dial. The bench reorganizes into three +ENCIRCLED instrument groups — bordered boxes with their labels set into +the border break, the classic faceplate group idiom: BRIGHTNESS (the +drum pair, grown to 204 to match proportion), POINTERS (the two keys), +IDLE (the tripper dial, size unchanged). Grooves retired with the +rockers. Verified: keys toggle live state and light green, groups render +with break labels, no bench overflow. With this pass Craig declared the +settings panel's cosmetics done; next surface: the wallpaper sub-view. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-32.html][Prototype 32 — the wallpaper channels]] (2026-07-22): built from Craig's +mode-table reframe (see "Wallpaper sub-view — the mode table" under +Design sketch): the units of choice are MODES, not framed pictures, so +the sub-view is a CHANNEL BANK — seven mode cards, each wearing its own +face per the table: WATCH (mini radar face), SUN PAIR (diagonal slashed +thumbnail of the selected pair), SINGLE (the chosen thumb), RANDOM (a +fanned deck — the answer to the table's open representation question), +VIDEO (play-badged frame), CLOCK (drawn face), WORLD (mini-clock +matrix). The active channel rings green; the config surface below +switches per channel — library grid for single, the PAIR PRESS for +sun pair (fill the day frame, the night frame auto-arms, MINT PAIR +strikes the slashed chip into a persistent tray of selectable pair +objects, exactly the mint semantics Craig specified), the interval wheel +(tape-wheel idiom, 5/10/15/30/60) for random, a video picker, and +honest no-options plates for the generators. The wallpaper row's state +text reads the tuned channel. Verified: channel switching, single +selection, the full mint flow (day pick auto-arms night, minted pair +joins tray selected), interval cycling. Mechanisms like the carousel +remain available for the eventual real-image library picker, demoted to +the one layer where units are uniform. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-33.html][Prototype 33 — sources + pair scrap]] (2026-07-22): two missing +capabilities land. SOURCES: a directory list at the sub-view's foot (all +channels draw from it) — folder rows with remove (guarded: the last +source can't be removed) and an ADD DIRECTORY key (mock candidates; the +real build opens a directory picker). PAIR SCRAP: hovering a minted chip +reveals ✕; the first strike arms it red ("strike again to scrap"), the +second deletes — arm-to-fire friction for a destructive act, consistent +with the panel's danger idiom; selection index self-heals including the +empty-tray case. Verified: add/remove sources with the last-source +guard, scrap flow arms then deletes, empty tray renders honestly. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-34.html][Prototype 34 — annotation batch one]] (2026-07-22): Craig's new iteration +method in action — he annotated via org-capture into the roam inbox +(ten archsetup notes), I claimed and applied the batch. Settings side: +SETTINGS header amber-caps (verified against the net/bt prototype, whose +header word is gold — the P30 family pass had wrongly copied maint's +cream); preset keys become GLYPHS (crescent moon for NIGHT, half battery +F007E for BATTERY, projector screen for PRESENT, and — answering Craig's +"focus = ? help with this" — the crosshairs reticle F0210, aim-and- +attend, over eyeglasses which read as "reading"); the narrower keys buy +FOUR numbered slots; CPU balanced glyph – → =; TOUCHPAD spelled out; the +drums' redundant LEVELS ×10 title removed (per Craig's screenshot) and +the drums grown into the space; the toast's idle "waiting…" hidden. +Wallpaper side (his sun-pair architecture + the extend-everywhere +directive): every mode gets a DESCRIPTION panel (helpful operating text, +never "no options"); galleries are side-scrolling strips (7-10 thumbs); +the section order for sun pair runs modes → minted pairs → pair press → +pictures → sources; the minted-pair gallery sorts alpha/recency via two +small keys, shows labels under chips (nothing when unlabeled), and each +chip carries ~ (edit: reopens day/night/label in the press and leaves +the gallery, re-mint to return) and − (delete; recreate to recover); +the press gains its label field; the picture gallery feeds the armed +frame and notes the extension filtering; PREVIEW sections show watch +(Craig's real night-watch screenshot, trimmed to +prototypes/2026-07-22-watch-preview.png), clock, world, single, and +video; SOURCES appears only for the directory-drawing modes (single, +pair, random, video) and hides for the generators. All flows verified +headless including the edit-remint round trip and sort toggles. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-36.html][Prototype 36 — annotation batch two]] (2026-07-22): eight more roam +captures applied. Settings: all matrix keys uniform (43px — glyph keys +slimmed to the numbered keys' size, glyphs bumped to 15px for +recognizability); the bench rearranged — POINTERS above BRIGHTNESS on +the left, the IDLE dial alone on the right, enlarged to 184 with its +legend moved BENEATH the dial (a legendPos option on the tripDial +kit-candidate); drums centered in their frame. Wallpaper: a NEW SOLID +COLOR channel (eighth card) in the sun-pair format — minted labeled +colors above, color picker + label + MINT below, no sources; RANDOM +gains minted SETS — labeled, count-badged chips (first picture + count), +sortable, with ~/− edit/delete, built in a set press by clicking +pictures in and out, minimum two, interval wheel retained; sort keys now +stack vertically LEFT of every sortable gallery; all side-scroll +galleries wear custom themed scrollbars inside evenly-padded wells; +SOURCES scrolls vertically past four entries; and the pair tray is +seeded with a dozen pairs so the scroller's position shows. Verified: +uniform key row, bench order and dial legend, pair tray overflow, solid +mint, set press round trip (mint "blues" of three), card count badge. +P35 remains the linked final for the matrix/bench; the wallpaper +sub-view's normative reference advances to this file. + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-37.html][Prototype 37 — annotation batch three]] (2026-07-22): nine more captures. +Channel faces go ICONIC — the sun-pair card is a fixed yellow/navy +diagonal with a dark sun glyph on the gold and a cream crescent on the +navy (per Craig's spec), SOLID wears dupre blue, and the world card's +mini clocks are redrawn as honest clocks (cream faces, hour + minute +hands at six different times; the world preview matches). Numbered slots +register as scenes named 1-4 so activation announces "▶ 1" instead of a +slot codename. The idle dial's center reads the EXACT minutes (halves +included) live while a tab drags, reverting to a now-visible IDLE (9px +cream) on release; the legend shows exact values too. The video +channel's preview shrinks to 55% so sources fit; the sub-view title +capitalizes to WALLPAPER. FOCUS tries the headphones glyph (F02CB) as +the deep-work icon — awaiting Craig's confirmation, crosshairs retired. +All seventeen applied annotations (batches two + three) swept from the +roam inbox after application; seven foreign items remain for their +projects. + * Metadata | Field | Value | |--------+----------------------------------------------| -| Status | draft | +| Status | doing | |--------+----------------------------------------------| | Owner | Craig Jennings | |--------+----------------------------------------------| @@ -65,6 +591,68 @@ gathers them. * Design sketch +** Prior art — how the major desktops solve the quick-settings UX + +Surveyed 2026-07-21 for the prototyping phase (ui-prototyping rule: research +before picking a direction). + +- *GNOME Shell 43+ Quick Settings* — replaced the decade-old system menu + with a grid of pill-shaped toggle tiles. Each pill is dual-function: click + the body to toggle, click a small arrow to expand a submenu that draws + over the grid rather than opening a new surface. Sliders span two grid + columns; on/off state is carried by the pill's fill colour. Component + anatomy: QuickToggle, QuickMenuToggle (toggle + popup submenu), + QuickSlider, in a column-based grid. + Sources: [[https://www.debugpoint.com/gnome-43-quick-settings/][debugpoint on the GNOME 43 redesign]], + [[https://gjs.guide/extensions/topics/quick-settings.html][gjs.guide Quick Settings anatomy]]. +- *macOS Control Center* — a menu-bar hub of modules. Controls are + dual-function here too: clicking a module's icon toggles it, clicking its + name or arrow opens a deeper sub-view expanded in place (Wi-Fi, Bluetooth, + Display, Sound). Modules can be dragged out to the menu bar for permanent + glanceable placement — the same two-layer bar/panel split this spec + commits to (touchpad + caffeine stay on the bar; the rest collapses in). + Sources: [[https://support.apple.com/guide/mac-help/quickly-change-settings-mchl50f94f8f/mac][Apple Support — Use Control Center on Mac]], + [[https://macmost.com/customizing-and-using-control-center-on-your-mac.html][macmost Control Center walkthrough]]. +- *Windows 11 Quick Settings* — a taskbar flyout: customizable button grid + with sliders below it. The trend line is consolidation: 26H2 adds a + light/dark toggle to the flyout so the Settings app isn't needed, and the + hardware volume/brightness flyouts are being restyled and made + repositionable. + Sources: [[https://pureinfotech.com/windows-11-26h2-quick-settings-dark-mode-toggle/][pureinfotech on the 26H2 flyout]], + [[https://pureinfotech.com/change-quick-settings-buttons-windows-11/][pureinfotech on button customization]]. +- *KDE Plasma 6* — the counter-example: no single consolidated panel; + per-applet popups hang off individual system-tray icons (6.4 raised + control contrast and added tray-entry hiding). This is the + scattered-toggles status quo the spec exists to fix. + Source: [[https://www.omgubuntu.co.uk/2025/06/kde-plasma-6-4-review-new-features-linux-desktop][OMG! Ubuntu Plasma 6.4 review]]. +- *iOS / macOS Focus modes* — the prior art for scenes: named modes that + flip several settings in one action, surfaced as first-class controls in + Control Center. The shared prototype engine's SCENES model mirrors this. + +Convergent conventions the directions are judged against: a two-layer model +(glanceable bar + consolidated panel); dual-function controls (toggle on the +control itself, expand for depth); compact toggle grid with full-width +sliders; sub-views drawn inside the panel rather than as new windows +(matches the wallpaper-sub-view decision); scenes as first-class controls. + +** Final prototype (normative reference) + +[[file:../prototypes/2026-07-02-desktop-settings-panel-prototype-37.html][Prototype 37 — the sealed final]] (2026-07-22, Craig's "Build it"), +superseding P35 as the single normative reference after annotation +batches two and three: +the consolidated machine every build phase points at. Structure: the +PROGRAMMABLE PRESETS matrix (glyph program keys + four numbered slots, +white punch pins with jewel verdicts, arrow/equals CPU tape wheels, +active-is-live semantics); the instrument bench of three encircled +groups (BRIGHTNESS drum pair, POINTERS console keys, IDLE tripper dial +with color-tabbed stages and caffeine bypass); and the WALLPAPER +channel sub-view (seven mode cards, per-mode descriptions, side-scroll +galleries, previews, the labeled pair press with mint/edit/delete, and +per-mode sources). Verified by a 17-point end-to-end suite, all +passing. The full design history lives under Prototype iterations in +the Status section; the kit-candidate components accumulated along the +way live in prototypes/dupre-kit-additions.js pending the kit merge. + ** Architecture — clone the net panel's proven stack - GTK4 + gtk4-layer-shell, Blueprint .blp sources compiled to committed .ui @@ -90,14 +678,25 @@ gathers them. |--------------------+----------+----------------------------------------------| | Auto-dim toggle | toggle | hyprctl decoration:dim_inactive (dim-toggle) | |--------------------+----------+----------------------------------------------| -| Idle / caffeine | toggle | hypridle start/stop (caffeine-toggle) | +| Idle / caffeine | toggle | hypridle start/stop (caffeine-toggle). | +| | | Back to a plain toggle as of P21 — the timed | +| | | wind-up moved to the sleep timer below. | +|--------------------+----------+----------------------------------------------| +| Idle program rail | tripper | the hypridle pipeline as a time-switch | +| | rail | tripper rail: drag DIM / LOCK / WATCH / | +| | | SCREEN OFF / SUSPEND tabs along an | +| | | idle-minutes scale (writes hypridle.conf + | +| | | reload); a tab in the OFF siding disables | +| | | its stage; engaged caffeine renders the | +| | | whole rail bypassed. Replaced the P21 sleep | +| | | timer at P28 — Craig ratified intent B | +| | | ("when idle for X", not "in X from now"): | +| | | this panel programs futures. | |--------------------+----------+----------------------------------------------| | Touchpad toggle | toggle | toggle-touchpad + touchpad-state file | |--------------------+----------+----------------------------------------------| | Mouse toggle | toggle | same mechanism, mouse-state file | |--------------------+----------+----------------------------------------------| -| Airplane mode | toggle | airplane-mode script (laptop-only row) | -|--------------------+----------+----------------------------------------------| | Screen brightness | slider | brightnessctl (backlight class), slider + % | |--------------------+----------+----------------------------------------------| | Keyboard backlight | slider | brightnessctl (kbd_backlight class), slider | @@ -105,14 +704,21 @@ gathers them. | Night light / | toggle | color-temperature shift (candidate: | | color temperature | | hyprsunset; confirm the tool at build) | |--------------------+----------+----------------------------------------------| -| Do Not Disturb | toggle | dunstctl set-paused (pause notifications) | +| Do Not Disturb | toggle | dunstctl set-paused (pause notifications). | +| | | Verified 2026-07-21: pause queues, then | +| | | floods everything on unpause — never drops. | +| | | DECIDED (Craig, 2026-07-21): class-split. | +| | | Ordinary notifications DROP at unpause; | +| | | alarms (urgency critical + rules promoting | +| | | known alarm sources) SURVIVE DND and show. | +| | | Build detail: dunst pause levels with | +| | | override_pause_level lets alarms punch | +| | | through live vs held-to-unpause — pick at | +| | | build. History keeps everything either way. | |--------------------+----------+----------------------------------------------| | Power profile | selector | powerprofilesctl (performance / balanced / | | | | power-saver, three-way) | |--------------------+----------+----------------------------------------------| -| Lock / suspend | actions | hyprlock / systemctl suspend (momentary | -| | | buttons, not stateful toggles) | -|--------------------+----------+----------------------------------------------| | Scenes / profiles | composite| one control that flips several toggles at | | | | once: Focus, Presentation, Battery-saver, | | | | Night (see the Scenes decision below) | @@ -124,10 +730,50 @@ gathers them. Slider changes apply live (throttled) and read back the actual level after apply — verify-everything. Toggles re-read their source of truth after firing, same as the bar indicators do, and the bar modules get their refresh -signals so both surfaces agree. The lock/suspend buttons are momentary -actions with no persistent state to reflect. A scene reads back each toggle it +signals so both surfaces agree. A scene reads back each toggle it sets and reports the composite as applied only when every member verified. +** Wallpaper sub-view — the mode table (Craig, 2026-07-22) + +Craig's reframe, thinking out loud: every mechanism proposal (carousel, +light table, film strip) assumed uniform framed objects, but the real +units of choice are MODES — heterogeneous programs for what the screen +shows. His inventory: + +| Mode | Representation | Options | +|-------------------+--------------------------------+--------------------------| +| Night watch | to be designed | none | +|-------------------+--------------------------------+--------------------------| +| Sunup/sundown | slashed thumbnail — the thumb | choose + save pic PAIRS | +| | split vertically or diagonally | | +| | (top-right to bottom-left), | | +| | day pic one side, night the | | +| | other | | +|-------------------+--------------------------------+--------------------------| +| Single | thumbnail | none | +|-------------------+--------------------------------+--------------------------| +| Randomize | open (deck/fan candidate) | interval spinner (mins | +| | | before next random item) | +|-------------------+--------------------------------+--------------------------| +| Video (Apple-TV | video thumbnail | none | +| aerial style) | | | +|-------------------+--------------------------------+--------------------------| +| Custom clock | picture of the clock | none | +|-------------------+--------------------------------+--------------------------| +| World clock | matrix of mini-clocks | none | +|-------------------+--------------------------------+--------------------------| + +Clock-channel backings (Craig, 2026-07-22): neither clock is a new +design. CUSTOM CLOCK renders the clock that already appears when the +waybar time module is clicked; WORLD CLOCK renders a matrix of miniature +clocks with their timezones and cities — the same data the time module's +hover tooltip shows. One owner per clock design; the wallpaper channels +are projections of those existing surfaces onto the desktop. + +Pair semantics (Craig): pairs are SAVED OBJECTS — build one by choosing a +day pic and a night pic, alter either, confirm; the pair is minted and +remains selectable as a unit thereafter. The pair library persists. + ** Open/close behavior Gear glyph module on the bar right cluster; click toggles the panel @@ -140,6 +786,8 @@ Close button, matching the net panel. Keybind: Super+Shift+G (decision B). CLOSED: [2026-07-04 Sat] Resolved (Craig, 2026-07-04): touchpad and caffeine stay on the bar (glanceable state); auto-dim and airplane move into the panel (panel-only, freeing bar width). The airplane Super+Shift+A toggle keybind stays as the quick lane — only its bar indicator collapses in. +Amended 2026-07-22 (Craig, during the first live drive of the panel): caffeine's bar indicator collapses into the panel too. The bar keeps only the touchpad indicator; dim and caffeine are panel-owned (their Super+Shift+D / Super+I keybinds stay as quick lanes). Applied live same day — modules and their state CSS removed from the waybar config. + ** DONE Keybind for the panel? CLOSED: [2026-07-04 Sat] Resolved (Craig, 2026-07-04): Super+Shift+G (gear), for parity with the other panels' fast path. @@ -165,6 +813,18 @@ OUT of this panel, with reasons: volume / master-mute stays with the audio panel (this panel does not mirror it — one owner per control); theme light/dark goes to the separate theme-studio task, not here. +Amended 2026-07-22 (Craig): airplane mode is withdrawn from the panel too — +it's about the network, and the network panel carries it as its main +on/off. Same one-owner-per-control reasoning; keeping a copy here +overcomplicated the switch wall. (The Super+Shift+A keybind and the +network panel's master switch are the two lanes.) + +Amended 2026-07-21 (Craig): lock and suspend are withdrawn from the panel. +Session-exit actions live on the wlogout screen (Super+Shift+Q: +lock/reboot/shutdown/logout/suspend/hibernate) — same one-owner-per-control +reasoning as volume. The direction prototypes still show lock/suspend +buttons; the iterate-to-final pass drops them. + Format pickers (time/date/weather display format) are pulled out entirely into their own future sibling spec. The real problem there is a single source of truth — many programs store their own format, so the design question is where @@ -179,6 +839,71 @@ Confirmed the panel gathers the mouse/trackpad toggle, a no-sleep (idle-inhibit) - switch between two pictures at sunup / sundown (a day/night pair). That last one implies a sun-time source (a lat/long or a sunrise/sunset lookup). +** DONE Idle pipeline — staged timeouts and an idle power action +CLOSED: [2026-07-21 Tue] +Resolved (Craig, 2026-07-21), the lean package with one revision: dim +5 min/10% and lock 7 min stay; add screen-off (DPMS) at 10 min; idle +suspend-then-hibernate at 30 min — default ON for velox, and PRESENT on +ratio too (not hidden by battery detection) but default OFF with an +armed-trigger confirmation before enabling, since an idle-suspended desktop +drops tailscale sessions and hourly backups. Hyprlock grace 5 s. The panel +surfaces only the situational control (the caffeine timer dial); stage +delays live in hypridle.conf. Original analysis below. + +Amended same evening (Craig, 2026-07-21): the eye-candy stage is IN after +all — as the Dupre Instrument Night Watch, a fullscreen board of the kit's +own instruments on watch (split-flap + movement + seven-seg carrying real +time, radar sweeping, scope tracing, drift chart, spectrum, VU programme, +blinkenlights core, elapsed tape counter, systems lamps, voice loops, VFD +wire, engine-order telegraph that rings a new order every couple of +minutes). Prototype: +[[file:../prototypes/2026-07-21-night-watch-screensaver-prototype-1.html][night-watch prototype 1]]. +It runs between lock and screen-off as a hypridle stage (fullscreen +browser/webview launched on-timeout, killed on-resume); the power cost is +accepted for the stage's duration since DPMS still follows at its delay. +Kit note for the merge task: span-built instruments (scope, stripChart, +vfdMarquee, analogClock, rotsel, keylock) need a blockifying host outside +the gallery's card grid — the night-watch page carries the one-rule fix. +Opened 2026-07-21 from Craig's question: "shutdown/reboot/suspend/hibernate +when idle for X minutes?" Yes — hypridle listeners run arbitrary on-timeout +commands, so any systemctl action can be a stage. Today's pipeline is only +dim-to-10% at 5 min → lock at 7 min; there is no screen-off (DPMS) stage and +no power action, so an idle machine glows at 10% forever. + +Proposed idle group for the panel, replacing the bare caffeine on/off: +- Dim delay + dim level (currently hardcoded 300 s / 10%). +- Lock delay (currently 420 s). +- Screen-off (DPMS) stage after N minutes — new. +- Idle power action after X minutes — one of none / suspend / hibernate / + suspend-then-hibernate / shutdown. Ordering guarantee: lock always fires + before the power action so the machine wakes locked. +- Caffeine becomes a timed inhibit (wind-up timer, e.g. the kit timerDial: + 30/60/120 min or until-off) instead of killing the whole daemon. + +Added 2026-07-21 (Craig approved recording these alongside the stages): +- Hyprlock grace period (currently grace = 0): N seconds after lock where + any input wakes without a password — softens an aggressive lock delay. +- Optional eye-candy stage: an animated "screensaver" (mpvpaper loop, + terminal art, shader) launched by a hypridle stage and killed on resume. + Sits before the DPMS stage if offered at all; it holds GPU + display + awake, so it trades power for style. +- Lock-face notes for the build: path = screenshot shows a blurred image + of the work session (privacy consideration; wallpaper/solid is the + alternative), and hyprlock labels can run shell commands on an interval + (cmd[update:N]) — the lock face can carry weather/now-playing/battery. + +Build notes: Wayland's idle-inhibit protocol already keeps the pipeline at +bay during media playback (video players and browsers inhibit idle, and +hypridle honors it), so caffeine's real audience is passive non-media use — +long reads, watching a build, screen-share without input. systemd +suspend-then-hibernate is the likely default for velox +(suspends now, hibernates when the battery drains); shutdown-on-idle is the +risky option (kills the session and anything unsaved) and wants a long delay +if offered at all; AC-vs-battery differentiation is possible by making the +on-timeout a script that checks the power source. Decisions needed from +Craig: which stages to expose, the default delays, and whether the power +action appears on both machines or only the laptop. + ** DONE Scenes / profiles — one control that flips several toggles at once CLOSED: [2026-07-19 Sun] Resolved (Craig, 2026-07-19): the panel offers named scenes that set several @@ -199,12 +924,127 @@ build detail for the sub-view. * Implementation phases -1. settings.py backings (brightness get/set, kbd backlight, toggle - state readers) — pure engine, TDD with fake brightnessctl/hyprctl. -2. PanelModel presenter (rows, conditional visibility, verify-after-apply - semantics) — unit-tested, no GTK. -3. Blueprint UI + gear bar module + open/close wiring; palette css factored - to a shared asset; AT-SPI smoke. -4. Bar-module consolidation per decision A: drop the dim and airplane bar - modules (now panel-only), keep touchpad and caffeine on the bar, wire the - refresh signals so bar and panel agree, and bind Super+Shift+G. +All phases live in dotfiles =settings/= (archsetup drives the lifecycle). +The normative reference for every UI decision is prototype 37; the design +history is the Prototype iterations subsection. + +1. *Backings engine* — pure Python, TDD with fake binaries. Brightness + + keyboard backlight (brightnessctl, 5% floor, ×10 drum mapping); toggle + backings (hyprctl dim_inactive, touchpad/mouse state scripts, hypridle + caffeine inhibit); DND via dunst pause levels implementing the + class-split semantic (ordinary notifications drop, alarms survive — + punch-through vs held decided here); powerprofilesctl three-way; the + hypridle.conf writer + reload for the idle pipeline (four stages, per- + stage enable/disable, hyprlock grace); the wallpaper engine — persisted + mode store (channel, single, minted pairs/sets/colors with labels, + video, interval, sources), setter adapters (images via the chosen + setter, solid colors, video via mpvpaper, clock/world/watch as + projected surfaces), sunrise/sundown calculation from lat/long, the + random-draw timer, and extension filtering for the galleries. +2. *Presenters* — GTK-free models, unit-tested to 100% like the net + PanelModel. The program-matrix model (programs as complete + definitions; active-is-live with program-membership writes surviving + activation; pin, letter, and radio row kinds; slots 1-4 as first-class + programs); the bench model (drum mapping, pointers, idle stages with + order clamping, parking, and caffeine bypass); the wallpaper channels + model (mint/edit/delete and alpha/recency sort for pairs, sets, and + colors; per-mode sources visibility; previews). +3. *GTK4/Blueprint UI* — port the instruments prototype 37 actually uses + to GTK widgets in the Dupre family chrome: console keys, the + programmable matrix (glyph + numbered heads, jewel verdicts, tape + wheels), drum roller, tripper dial (bottom legend, exact-minutes drag + counter, bypass stamp), encircled bench groups, iconic channel cards, + side-scroll gallery wells with themed scrollbars, the pair/set/color + presses. Architecture rule from the prototypes: instruments that own a + clock own their widget lifetime (never rebuilt on state refresh). + Layer-shell chassis under the bar, wallpaper sub-view navigation, + AT-SPI smoke per the family pattern. +4. *Integration and bar* — gear module + Super+Shift+G; bar consolidation + per decision A as amended (dim and caffeine modules dropped 2026-07-22; + airplane's bar indicator is gone with the control — the network panel + owns it; only touchpad keeps a bar indicator; wire refresh signals + both ways); the + watch/clock/world renderers as projected surfaces (the night watch as + the hyprlock face per the WATCH-is-the-lock-screen resolution); live + hypridle rewrite-and-reload; dunst pause-level configuration; end-to- + end verify-everything against the real machine. + +Test surface: fake-binary suites for every backing; presenter suites +covering program recall/edit semantics (including the active-scene- +survives-member-writes invariant), idle-stage clamping/parking/bypass, +and mint/edit/delete/sort round trips for all three minted stores; one +AT-SPI smoke; a scripted end-to-end pass mirroring prototype 37's +17-point suite. + +* Review findings [7/7] + +Reviewed 2026-07-22 (in-session, both roles — the annotation-batch method +kept author and reviewer in one loop; Craig's "Build it" sealed the +design). Rubric: *Ready with caveats* — the caveats are build-time picks, +not design gaps. + +** DONE Implementation phases reflected the pre-casting roster +CLOSED: [2026-07-22 Wed] +The four phases still described the original controls table (lock/ +suspend, per-toggle rows). Rewritten this pass to the settled design — +matrix, bench, wallpaper channels, projected surfaces — with the test +surface enumerated. +** DONE Stale architecture prose vs settled design +CLOSED: [2026-07-22 Wed] +The Design sketch accumulated its corrections through the iteration +entries (controls table amended in place; wallpaper mode table and +clock-channel backings recorded; Final prototype section added). The +iterations subsection is the authoritative design log. +** DONE Wallpaper setter tool selection :build: +CLOSED: [2026-07-22 Wed] +DECIDED (phase 1, 2026-07-22): awww 0.12.1 — the swww fork already +running as the wallpaper daemon (=swww= on PATH is a symlink to it; +=set-wallpaper= already drives it). Images and slashed pairs go through +awww =img=; solid colors through awww =clear <color>=; video via +mpvpaper (not yet installed — install lands in phase 4 integration); +clock/world/watch are projected layer-shell surfaces, not setter jobs. +The engine's setter adapter takes the binary from env so the fake-binary +suite and a future setter swap both stay one seam. +** DONE Speedrun pre-flight picks (Craig, 2026-07-22) :build: +CLOSED: [2026-07-22 Wed] +Batched before the phases 2-4 autonomous run: +- Alarm sources for DND: wtimer only — its notifications get the + CRITICAL promotion in the phase-4 dunstrc rules; everything else + drops at unpause. +- Night-watch host: google-chrome-stable in kiosk mode, launched by the + hypridle watch stage, killed on resume. +- Sun-pair location: live whereami lookup at each transition (the + machine's own location is the right datum for its screen), with the + last good reading cached in state.json as the offline fallback. +- Factory scenes (Focus / Presentation / Battery-saver / Night): drafted + against the controls table during phase 2, corrected by Craig in the + panel afterward. +** DONE DND unpause variant — held, not punch-through :build: +CLOSED: [2026-07-22 Wed] +DECIDED (Craig, 2026-07-22, first live drive): the held-to-unpause +variant. While DND is on nothing shows, alarms included (pause level +100 holds everything). At release, ordinary notifications are dropped +(history keeps them) and the alarms that arrived during DND surface: +close-all → read history → unpause → history-pop each CRITICAL entry +newer than the engage stamp, oldest first. The engine records the +engage instant as CLOCK_MONOTONIC microseconds (dunst's history +timestamp base) in $XDG_RUNTIME_DIR. The controls-table note offering +punch-through-live is superseded by this finding. +** DONE Night-light tool selection :build: +CLOSED: [2026-07-22 Wed] +DECIDED (phase 1, 2026-07-22): gammastep (installed; hyprsunset is not). +On Wayland the gamma ramp only holds while a client owns the +wlr-gamma-control protocol, so gammastep stays resident while night +light is on and the backing mirrors caffeine's daemon model: engage = +spawn detached (=gammastep -O <temp>=, default 4500K), release = pkill, +pgrep as the one source of truth. Swapping to hyprsunset later is one +adapter change behind the same seam. +** DONE Persisted store location and format :build: +CLOSED: [2026-07-22 Wed] +DECIDED (phase 1, 2026-07-22): one JSON document at +=~/.config/desktop-settings/state.json= (root overridable via +=DESKTOP_SETTINGS_CONFIG_DIR= for tests) carrying programs (slots 1-4), +idle stages, and the wallpaper store (channel, pairs, sets, colors, +sources, interval). Factory presets ship as defaults in code; the store +writes atomically (temp file + rename) and tolerates a missing or +corrupt file by falling back to defaults. |
