# Sst Design Tokens — v0.1.0-draft **Status:** Ter goedkeuring — nog niet gebruikt door de app Draagbare veldrecorder / cassettedeck uit de jaren 80 (Sony TC-D5, Marantz PMD, Nakamichi, Braun). Twee afwerkingen: ALUMINIUM (licht) en GRAPHITE (donker). Eén accent: het rode opnamelampje. Amber en groen alleen voor niveau-indicatoren. Bron: `Design/tokens.json`. Dit bestand en `tokens-preview.html` worden gegenereerd met `python3 Design/build_tokens.py`; pas nooit alleen deze bestanden aan. ## Kleur Verwijs ernaar als `color.`. Kolommen: ALUMINIUM (licht) en GRAPHITE (donker). | Token | Aluminium | Graphite | Gebruik | |---|---|---|---| | `color.surface.chassis` | `#CBC8C0` | `#1C1B19` | Venster-achtergrond; het 'huis' van het apparaat | | `color.surface.metalHigh` | `#E3E1DB` | `#3B3A36` | Geborsteld metaal, bovenkant van de verloop | | `color.surface.metalLow` | `#BDBAB2` | `#262522` | Geborsteld metaal, onderkant van de verloop | | `color.surface.panel` | `#E2DFD5` | `#2B2A27` | Frontplaat van mat plastic; zijbalk en bedieningspanelen | | `color.surface.well` | `#B4B1A8` | `#131211` | Verzonken vlak: invoervelden, display-vensters | | `color.surface.paper` | `#EEE9D9` | `#232220` | Cassette-label crème: lijsten met transcripties en woordenboek | | `color.surface.keyHigh` | `#E6E3DA` | `#44433F` | Toetsdop, bovenkant | | `color.surface.keyLow` | `#CBC8BF` | `#33322F` | Toetsdop, onderkant | | `color.surface.keyPressed` | `#BEBBB2` | `#2A2927` | Ingedrukte toets | | `color.surface.meterFace` | `#EFE6C8` | `#D8CEA6` | Wijzerplaat van de VU-meter (blijft crème in beide afwerkingen) | | `color.surface.selection` | `#D4CDB2` | `#3A3828` | Geselecteerde rij in een lijst | | `color.surface.display` | `#1B1A18` | `#0E0D0C` | Displayglas van de teller; donker in beide afwerkingen | | `color.display.segmentUnlit` | `#3A3320` | `#2A2415` | Gedoofd segment op het displayglas | | `color.ink.primary` | `#1E1D1B` | `#ECE8DC` | Hoofdtekst en wijzer | | `color.ink.secondary` | `#403D38` | `#C4BFB2` | Secundaire tekst | | `color.ink.tertiary` | `#4D4A44` | `#ABA79B` | Zeefdruk-labels en hulptekst | | `color.ink.disabled` | `#8F8B82` | `#6B685F` | Uitgeschakeld; nooit voor essentiële tekst | | `color.ink.inverse` | `#F4EFE3` | `#F4EFE3` | Tekst op rode of donkere vulling; crème in beide afwerkingen | | `color.ink.onMeter` | `#1E1D1B` | `#1E1D1B` | Schaal, cijfers en wijzer op de wijzerplaat; vast donker in beide afwerkingen | | `color.accent.record` | `#C8281E` | `#CC2A20` | ENIGE accent: opnamelampje, REC-toets, piek-LED. Nooit voor lopende tekst | | `color.accent.recordUnlit` | `#7A2E28` | `#4A1F1B` | Lampje uit | | `color.level.green` | `#5E9E48` | `#6DB556` | Niveau-segment, brandend | | `color.level.amber` | `#D9A023` | `#E5B032` | Niveau-segment, waarschuwing, gecorrigeerd woord | | `color.level.greenUnlit` | `#A8B79C` | `#26331F` | Groen segment, uit | | `color.level.amberUnlit` | `#CDBA8A` | `#3D3418` | Amber segment, uit | | `color.line.seamDark` | `#8C8981` | `#0A0A09` | Naad tussen panelen, donkere helft | | `color.line.seamLight` | `#F3F1EB` | `#45433F` | Naad tussen panelen, lichte helft | | `color.line.hairline` | `#A9A69D` | `#3A3834` | Fijne scheidingslijn, zeefdruk-kader | | `color.line.focus` | `#1E1D1B` | `#ECE8DC` | Toetsenbord-focus | **Regel:** `accent.record` is het enige accent en wordt nooit voor lopende tekst gebruikt. Amber en groen zijn alleen voor niveau-indicatoren en markeringen. ### Contrast (berekend) | Tekst | Op | Afwerking | Verhouding | | |---|---|---|---|---| | `ink.primary` | `surface.chassis` | light | 10.08:1 | ok | | `ink.primary` | `surface.chassis` | dark | 14.05:1 | ok | | `ink.primary` | `surface.panel` | light | 12.63:1 | ok | | `ink.primary` | `surface.panel` | dark | 11.72:1 | ok | | `ink.primary` | `surface.paper` | light | 13.87:1 | ok | | `ink.primary` | `surface.paper` | dark | 12.98:1 | ok | | `ink.primary` | `surface.well` | light | 7.86:1 | ok | | `ink.primary` | `surface.well` | dark | 15.27:1 | ok | | `ink.primary` | `surface.selection` | light | 10.57:1 | ok | | `ink.primary` | `surface.selection` | dark | 9.65:1 | ok | | `ink.onMeter` | `surface.meterFace` | light | 13.49:1 | ok | | `ink.onMeter` | `surface.meterFace` | dark | 10.67:1 | ok | | `ink.primary` | `surface.keyHigh` | light | 13.13:1 | ok | | `ink.primary` | `surface.keyHigh` | dark | 8.08:1 | ok | | `ink.primary` | `surface.keyLow` | light | 10.07:1 | ok | | `ink.primary` | `surface.keyLow` | dark | 10.47:1 | ok | | `ink.secondary` | `surface.chassis` | light | 6.47:1 | ok | | `ink.secondary` | `surface.chassis` | dark | 9.38:1 | ok | | `ink.secondary` | `surface.panel` | light | 8.11:1 | ok | | `ink.secondary` | `surface.panel` | dark | 7.82:1 | ok | | `ink.secondary` | `surface.paper` | light | 8.90:1 | ok | | `ink.secondary` | `surface.paper` | dark | 8.66:1 | ok | | `ink.tertiary` | `surface.chassis` | light | 5.28:1 | ok | | `ink.tertiary` | `surface.chassis` | dark | 7.16:1 | ok | | `ink.tertiary` | `surface.panel` | light | 6.62:1 | ok | | `ink.tertiary` | `surface.panel` | dark | 5.97:1 | ok | | `ink.tertiary` | `surface.paper` | light | 7.27:1 | ok | | `ink.tertiary` | `surface.paper` | dark | 6.61:1 | ok | | `ink.tertiary` | `surface.metalHigh` | light | 6.75:1 | ok | | `ink.tertiary` | `surface.metalHigh` | dark | 4.73:1 | ok | | `ink.tertiary` | `surface.metalLow` | light | 4.55:1 | ok | | `ink.tertiary` | `surface.metalLow` | dark | 6.37:1 | ok | | `ink.inverse` | `accent.record` | light | 4.84:1 | ok | | `ink.inverse` | `accent.record` | dark | 4.67:1 | ok | | `level.amber` | `surface.display` | light | 7.46:1 | ok | | `level.amber` | `surface.display` | dark | 9.79:1 | ok | ## Opaciteit | Token | Waarde | Gebruik | |---|---|---| | `opacity.mark` | 0.3 | Amber markering achter een gecorrigeerd woord | | `opacity.disabled` | 0.45 | Uitgeschakelde bediening | | `opacity.unlit` | 1.0 | Gedoofde lampjes gebruiken eigen 'unlit'-kleuren, geen transparantie | | `opacity.pressedRecord` | 0.85 | Ingedrukte REC-toets: het rood dooft licht | | `opacity.specularOn` | 0.6 | Lichtvlekje op een brandend lampje | | `opacity.specularOff` | 0.3 | Lichtvlekje op een gedoofd lampje | | `opacity.caption` | 0.75 | Kleine opschriften op de wijzerplaat | ## Lettertypen | Token | Familie | Terugval | Gebruik | |---|---|---|---| | `font.family.chrome` | Helvetica Neue | Helvetica, Arial | Zeefdruk, toetsen, koppen: neutrale grotesk | | `font.family.text` | SF Pro Text | system-ui | Leesbare tekst: transcripties, woordenboek | | `font.family.mono` | SF Mono | Menlo, monospace | Teller, tijden, woordenboekbestand | ## Tekststijlen | Token | Familie | Grootte | Gewicht | Spatiëring | Regelhoogte | Hoofdletters | Gebruik | |---|---|---|---|---|---|---|---| | `type.label` | chrome | 10 pt | 500 | 0.09 em | 12 pt | ja | Zeefdruk-label | | `type.labelSmall` | chrome | 9 pt | 500 | 0.1 em | 11 pt | ja | Schaalmarkeringen en eenheden | | `type.control` | chrome | 11 pt | 500 | 0.06 em | 14 pt | ja | Opschrift op toetsen | | `type.heading` | chrome | 12 pt | 500 | 0.12 em | 16 pt | ja | Paneelkop | | `type.body` | text | 13 pt | 400 | 0 em | 18 pt | nee | Standaardtekst | | `type.reading` | text | 15 pt | 400 | 0 em | 22 pt | nee | Transcript | | `type.meta` | text | 11 pt | 400 | 0 em | 14 pt | nee | Bijschriften | | `type.counter` | mono | 22 pt | 500 | 0 em | 26 pt | nee | Teller | | `type.counterSmall` | mono | 12 pt | 500 | 0 em | 16 pt | nee | Tijdstip in een rij | | `type.code` | mono | 12 pt | 400 | 0 em | 18 pt | nee | Woordenboekregels | ## Segmentcijfers (getekend, geen lettertype) | Token | Waarde | Gebruik | |---|---|---| | `segment.digitHeight` | 36 | Hoogte van een getekend segmentcijfer | | `segment.digitWidth` | 20 | Breedte van een segmentcijfer | | `segment.thickness` | 4 | Dikte van één segment | | `segment.gap` | 1 | Ruimte tussen segmenten | | `segment.slant` | 0 | Schuinte in graden; 0 = rechtop | | `segment.advance` | 26 | Afstand van cijfer tot cijfer | | `segment.colonWidth` | 10 | Breedte van een dubbele punt of punt | ## Ruimte | Token | Waarde | |---|---| | `space.0` | 0 pt | | `space.1` | 2 pt | | `space.2` | 4 pt | | `space.3` | 8 pt | | `space.4` | 12 pt | | `space.5` | 16 pt | | `space.6` | 24 pt | | `space.7` | 32 pt | | `space.8` | 48 pt | ## Indeling | Token | Waarde | Gebruik | |---|---|---| | `layout.window.minWidth` | 800 | Minimale vensterbreedte | | `layout.window.minHeight` | 560 | Minimale vensterhoogte | | `layout.window.defaultWidth` | 1080 | Standaard vensterbreedte | | `layout.window.defaultHeight` | 700 | Standaard vensterhoogte | | `layout.sidebar.width` | 232 | Breedte zijbalk | | `layout.settings.width` | 560 | Breedte instellingenvenster | | `layout.panel.padding` | 16 | Binnenmarge van een paneel (= space.5) | | `layout.panel.gap` | 12 | Afstand tussen panelen (= space.4) | ## Afmetingen | Token | Waarde | Gebruik | |---|---|---| | `size.control.height` | 28 | Standaardhoogte van toets of veld | | `size.key.minWidth` | 56 | Minimale breedte van een toets | | `size.key.recWidth` | 64 | REC-toets, breedte | | `size.key.recHeight` | 44 | REC-toets, hoogte | | `size.lamp.diameter` | 10 | Standaard lampje | | `size.lamp.large` | 14 | Opnamelampje | | `size.switch.width` | 40 | Tuimelschakelaar, breedte | | `size.switch.height` | 22 | Tuimelschakelaar, hoogte | | `size.row.height` | 40 | Rij in transcriptielijst | | `size.icon.small` | 16 | Klein pictogram | | `size.icon.medium` | 20 | Normaal pictogram | | `size.hit.min` | 24 | Minimaal klikdoel | ## Hoekradius | Token | Waarde | Gebruik | |---|---|---| | `radius.none` | 0 | Panelen en velden: scherpe randen | | `radius.sharp` | 1 | Toetsranden: bijna scherp | | `radius.sm` | 2 | Toetsen, velden | | `radius.md` | 4 | Grote panelen | | `radius.bezel` | 6 | Rand van de VU-meter | | `radius.lamp` | 999 | Lampjes: rond | ## Randen | Token | Waarde | Gebruik | |---|---|---| | `border.hairline` | 1 pt | Fijne lijn | | `border.seam` | 2 pt | Naad: 1 donkere lijn boven, 1 lichte lijn eronder, leest als gegraveerde groef | | `border.bezel` | 3 pt | Rand om de VU-meter | | `border.focus` | 2 pt | Focusring, 2 pt offset | ## Schaduw en diepte ### `shadow.key.raised` Toets in rust: lichtvang boven, donkere onderrand, valschaduw | Laag | Inset | x | y | blur | spread | kleur | alpha aluminium | alpha graphite | |---|---|---|---|---|---|---|---|---| | 1 | ja | 0 | 1 | 0 | 0 | `#FFFFFF` | 0.65 | 0.1 | | 2 | ja | 0 | -1 | 0 | 0 | `#000000` | 0.25 | 0.55 | | 3 | nee | 0 | 2 | 2 | 0 | `#000000` | 0.35 | 0.6 | ### `shadow.key.pressed` Ingedrukte toets: dop 1 pt omlaag, geen valschaduw Dop verschuift 1 pt omlaag. | Laag | Inset | x | y | blur | spread | kleur | alpha aluminium | alpha graphite | |---|---|---|---|---|---|---|---|---| | 1 | ja | 0 | 2 | 4 | 0 | `#000000` | 0.5 | 0.7 | | 2 | ja | 0 | 0 | 0 | 1 | `#000000` | 0.35 | 0.6 | ### `shadow.well` Verzonken vlak met lichtvang op de onderlip | Laag | Inset | x | y | blur | spread | kleur | alpha aluminium | alpha graphite | |---|---|---|---|---|---|---|---|---| | 1 | ja | 0 | 1 | 3 | 0 | `#000000` | 0.4 | 0.7 | | 2 | nee | 0 | 1 | 0 | 0 | `#FFFFFF` | 0.55 | 0.07 | ### `shadow.panel` Frontplaat boven het chassis | Laag | Inset | x | y | blur | spread | kleur | alpha aluminium | alpha graphite | |---|---|---|---|---|---|---|---|---| | 1 | ja | 0 | 1 | 0 | 0 | `#FFFFFF` | 0.6 | 0.08 | | 2 | nee | 0 | 3 | 8 | 0 | `#000000` | 0.22 | 0.55 | ### `shadow.lamp.on` Brandend lampje: kleine gloed, alleen voor lampjes en nooit voor tekst | Laag | Inset | x | y | blur | spread | kleur | alpha aluminium | alpha graphite | |---|---|---|---|---|---|---|---|---| | 1 | nee | 0 | 0 | 6 | 1 | `#CC2A20` | 0.45 | 0.55 | | 2 | ja | 0 | -1 | 1 | 0 | `#000000` | 0.35 | 0.45 | ## Textuur **`texture.brushed`** — Geborsteld aluminium voor chassis en zijbalk. Richting horizontaal; korrel 0.035 (aluminium) / 0.05 (graphite); surface.metalHigh naar surface.metalLow, van boven naar beneden. ## Meters | Token | Waarde | Gebruik | |---|---|---| | `meter.vu.referenceDbfs` | -20 | 0 VU = -20 dBFS (RMS) | | `meter.vu.min` | -20 | Onderkant van de schaal in VU | | `meter.vu.max` | 3 | Bovenkant van de schaal in VU; vanaf 0 VU rood | | `meter.vu.arcDegrees` | 90 | Hoek tussen minimale en maximale stand | | `meter.vu.width` | 260 | Breedte van de meter | | `meter.vu.height` | 150 | Hoogte van de meter | | `meter.vu.needleWidth` | 1.5 | Dikte van de wijzer | | `meter.vu.ticks` | -20 -10 -7 -5 -3 0 +3 | Genummerde schaalmarkeringen | | `meter.vu.pivotOffset` | 22 | Draaipunt van de wijzer, onder de onderrand van de wijzerplaat | | `meter.vu.scaleRadius` | 142 | Straal van de schaalboog vanaf het draaipunt | | `meter.vu.needleLength` | 146 | Lengte van de wijzer | | `meter.vu.tickMajor` | 11 | Lengte van een genummerde streep | | `meter.vu.tickMinor` | 6 | Lengte van een gewone streep | | `meter.vu.labelInset` | 24 | Afstand van de schaalboog tot de cijfers | | `meter.vu.redBandWidth` | 5 | Dikte van de rode band vanaf 0 VU | | `meter.led.segments` | 12 | Aantal segmenten: 8 groen, 3 amber, 1 rood | | `meter.led.segmentSize` | 6x14 | Segment in pt (breedte x hoogte) | | `meter.led.gap` | 2 | Ruimte tussen segmenten | | `meter.peak.holdMs` | 1000 | Piek-LED blijft zo lang branden | ## Beweging | Token | Waarde | Eenheid | Gebruik | |---|---|---|---| | `motion.duration.instant` | 0 | ms | Geen overgang | | `motion.duration.fast` | 60 | ms | Toets in/uit | | `motion.duration.base` | 120 | ms | Standaardovergang | | `motion.duration.slow` | 220 | ms | Paneel of venster | | `motion.easing.mechanical` | cubic-bezier(0.2, 0, 0, 1) | | Toetsen: direct, zonder veer | | `motion.easing.standard` | cubic-bezier(0.4, 0, 0.2, 1) | | Overige overgangen | | `motion.key.press` | 50 | ms | Toets indrukken | | `motion.key.release` | 90 | ms | Toets loslaten | | `motion.lamp.on` | 30 | ms | Lampje aan | | `motion.lamp.off` | 200 | ms | Lampje uit: dooft langzaam, als een gloeidraad | | `motion.needle.response` | 0.3 | s | VU-ballistiek: 300 ms om de stand te bereiken | | `motion.needle.damping` | 0.8 | ratio | Veerdemping; geeft ongeveer 1,5 % overschot | | `motion.needle.updateHz` | 60 | Hz | Verversing van de wijzer | | `motion.reducedMotion` | Overgangen 0 ms; wijzer blijft bewegen maar met demping 1.0 (geen overschot) | | Systeeminstelling 'Verminder beweging' | ## Wat bewust ontbreekt Geen neon, vaporwave, synthwave, paars-roze verlopen, gloeiende tekst, chromen letters of rasterhorizonten. Lampjes mogen een kleine gloed hebben (`shadow.lamp.on`); tekst nooit.