#+TITLE: Panel & Waybar Design Prototypes #+AUTHOR: Craig Jennings Self-contained HTML/CSS design prototypes for the instrument-console panel family and the waybar redesign. Each opens standalone in a browser (no external assets). These are the normative visual references the specs in [[file:../specs/][docs/specs/]] point at. * Prototypes - [[file:2026-07-03-instrument-console-panels-prototype.html][2026-07-03-instrument-console-panels-prototype.html]] — the net + bluetooth pair; the approved faceplate design that shipped. Normative reference for [[file:../specs/2026-07-03-instrument-console-panels-spec.org][the instrument-console spec]]. - [[file:2026-07-03-net-panel-rescan-prototype.html][2026-07-03-net-panel-rescan-prototype.html]] — the manual rescan/scan ⟳ affordance for the NETWORKS/NEARBY headers (busy-style throbber + list fade). - [[file:2026-07-03-sound-panel-prototype.html][2026-07-03-sound-panel-prototype.html]] — the audio/pulsemixer console; layout reference for [[file:../specs/2026-07-03-audio-panel-spec.org][the audio-panel spec]]. - [[file:panel-widget-gallery.html][panel-widget-gallery.html]] — the shared instrument-console widget kit (lamps, engraved sections, console keys, needle gauges). The living catalogue: every widget here is the visual + behavioral spec for its reusable-component ports. All widgets build from [[file:widgets.js][widgets.js]] (below); the gallery page is the reference consumer. - [[file:2026-07-03-waybar-redesign-prototype.html][2026-07-03-waybar-redesign-prototype.html]] — three directions for sprucing up waybar in the dupre instrument-console aesthetic (future work). * Widget library ([[file:widgets.js][widgets.js]]) The whole kit lives in =widgets.js= — a classic script (no modules, no build step) exposing the =GW= namespace with one builder per gallery card. Load it with == and call builders directly. ** Builder contract =GW.name(host, opts)= → handle ={el, get, set, ...}=. =host= is an empty element the widget renders into. =opts.onChange(value, text)= fires on every state change, including the initial paint; =text= is the widget's canonical readout string. (Exception: live meters whose original init was silent — they paint on the first =set=/=push=.) ** Styling Widget-internal CSS ships inside =widgets.js= (the =GW_CSS= block, injected once as =