@klodd/ds 5.16.1 → 5.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -519,6 +519,34 @@
519
519
  }
520
520
 
521
521
 
522
+ /* ================================================================
523
+ ==== KLÖDD VARM LIGHT (delat ljust standardtema)
524
+ Klödd.io-inspirerad varm neutral + indigo brand-accent. Detta är
525
+ det enda ljusa temat och delas av alla appar (ADR 0028-amendering).
526
+ Custom varma värden, inte Radix Mauve Light (se ADR 0006-not):
527
+ cream-sida med ljusare kort och mörkare input, bläck-text, taupe-ram.
528
+ ================================================================ */
529
+ :root {
530
+ --warm-overlay: #fbfaf5; /* ljusast - modaler/sheets */
531
+ --warm-card: #f6f3ec; /* kort/paneler, lyfter över sidan */
532
+ --warm-section: #efebe2; /* sektioner strax över sida */
533
+ --warm-page: #ede9df; /* sida (cream, klodd.io theme-color) */
534
+ --warm-hover: #e9e4d8; /* hover-yta */
535
+ --warm-sunken: #e4dfd2; /* input/sänkt */
536
+ --warm-active: #e0dacb; /* active-yta */
537
+
538
+ --ink: #1a1a18; /* bläck - primär text (~13:1 mot cream) */
539
+ --ink-subtle: #57534a; /* subtil text (~6:1 mot cream) */
540
+ --ink-muted: #807b6e; /* dämpad text / hint */
541
+
542
+ --taupe: #a8a498; /* stark ram / disabled (ej text - faller WCAG) */
543
+ --taupe-subtle: #ded9cc; /* subtil ram / divider */
544
+
545
+ --accent-brand: #433caf; /* indigo (klodd.io) - används mycket sparsamt */
546
+ --accent-brand-hover: #393295; /* hover/active på indigo */
547
+ }
548
+
549
+
522
550
  /* ================================================================
523
551
  ==== BLUE LIGHT (Jubb accent)
524
552
  ================================================================ */
@@ -343,15 +343,16 @@
343
343
  [data-theme="light"] {
344
344
  color-scheme: light;
345
345
 
346
- /* SURFACES - Mauve Light, spegelvänt från dark-stegen */
347
- --surface-page: var(--gray-light-1);
348
- --surface-default: var(--gray-light-2);
349
- --surface-raised: var(--gray-light-3);
350
- --surface-elevated: var(--gray-light-4);
351
- --surface-overlay: var(--gray-light-5);
352
- --surface-hover: var(--gray-light-4);
353
- --surface-active: var(--gray-light-5);
354
- --surface-sunken: var(--gray-light-2);
346
+ /* SURFACES - varm cream-ramp (klodd.io). Sida = cream (mitten i z-stacken),
347
+ kort ljusare (lyfter), input mörkare (sänkt). Delat ljust standardtema. */
348
+ --surface-page: var(--warm-page);
349
+ --surface-default: var(--warm-section);
350
+ --surface-raised: var(--warm-card);
351
+ --surface-elevated: var(--warm-card);
352
+ --surface-overlay: var(--warm-overlay);
353
+ --surface-hover: var(--warm-hover);
354
+ --surface-active: var(--warm-active);
355
+ --surface-sunken: var(--warm-sunken);
355
356
 
356
357
  /* Surface tints - svart istället för vit (white-tint osynlig på ljus bg) */
357
358
  --surface-faint: color-mix(in oklch, black 2%, transparent);
@@ -359,30 +360,47 @@
359
360
  --surface-medium: color-mix(in oklch, black 8%, transparent);
360
361
  --surface-strong: color-mix(in oklch, black 12%, transparent);
361
362
 
362
- /* TEXT - Mauve Light, höga steg = mörk text mot ljus bakgrund */
363
- --text-default: var(--gray-light-12);
364
- --text-subtle: var(--gray-light-11);
365
- --text-muted: var(--gray-light-10);
366
- --text-disabled: var(--gray-light-8);
367
-
368
- /* BORDERS */
369
- --border-subtle: var(--gray-light-5);
370
- --border-default: var(--gray-light-7);
371
- --border-strong: var(--gray-light-8);
372
- --border-focus: var(--gray-light-9);
363
+ /* TEXT - varm bläck-ramp (taupe är för ljust för text, blir ram/disabled) */
364
+ --text-default: var(--ink);
365
+ --text-subtle: var(--ink-subtle);
366
+ --text-muted: var(--ink-muted);
367
+ --text-disabled: var(--taupe);
368
+
369
+ /* BORDERS - taupe-toningar, fokus = brand-indigo */
370
+ --border-subtle: var(--taupe-subtle);
371
+ --border-default: var(--taupe);
372
+ --border-strong: var(--ink-muted);
373
+ --border-focus: var(--accent-brand);
373
374
  --border-hairline-faint: var(--bw-hairline) solid color-mix(in oklch, black 4%, transparent);
374
375
 
375
- /* SHADOW-DOKTRIN LIGHT (ADR 0013 light-tillägg) */
376
- --shadow-card: 0 1px 3px color-mix(in oklch, var(--gray-12) 12%, transparent),
377
- 0 1px 2px color-mix(in oklch, var(--gray-12) 8%, transparent);
378
- --shadow-float: 0 4px 12px color-mix(in oklch, var(--gray-12) 16%, transparent),
379
- 0 2px 4px color-mix(in oklch, var(--gray-12) 10%, transparent);
380
-
381
- /* GLASS - --gray-light-6 vid 55% (inte --surface-raised) - följer
382
- iOS UIBlurEffect-konventionen att ge en svagt mörkare tint över
383
- ljus page-bakgrund. Se ADR 0028. */
384
- --glass-bg: color-mix(in oklch, var(--gray-light-6) 55%, transparent);
385
- --glass-bg-fallback: color-mix(in oklch, var(--gray-light-6) 90%, transparent);
376
+ /* ACCENT - delad indigo för ALLA appar i ljusläge (ADR 0028-amendering).
377
+ Mycket sparsam: länkar, nyckelknappar, selected-rader. Per-app-accenter
378
+ (Jubb blå, Ekonom plum) gäller inte i ljus - ett enda ljust tema.
379
+ OBS: app-base sätter accent i [data-app=X] (olagrat) som vinner över
380
+ detta lagrade block - därför sätter varje apps light-block också brand. */
381
+ --accent-soft: color-mix(in oklch, var(--accent-brand) 10%, transparent);
382
+ --accent-moderate: color-mix(in oklch, var(--accent-brand) 16%, transparent);
383
+ --accent-9: var(--accent-brand);
384
+ --accent-10: var(--accent-brand-hover);
385
+ --accent-text: var(--accent-brand);
386
+ --accent-a1: color-mix(in oklch, var(--accent-brand) 3%, transparent);
387
+ --accent-a2: color-mix(in oklch, var(--accent-brand) 5%, transparent);
388
+ --accent-a3: color-mix(in oklch, var(--accent-brand) 10%, transparent);
389
+ --accent-a6: color-mix(in oklch, var(--accent-brand) 20%, transparent);
390
+ --accent-a8: color-mix(in oklch, var(--accent-brand) 35%, transparent);
391
+ --accent-a10: color-mix(in oklch, var(--accent-brand) 60%, transparent);
392
+ --accent-a12: color-mix(in oklch, var(--accent-brand) 90%, transparent);
393
+
394
+ /* SHADOW-DOKTRIN LIGHT (ADR 0013 light-tillägg) - ink-baserad */
395
+ --shadow-card: 0 1px 3px color-mix(in oklch, var(--ink) 12%, transparent),
396
+ 0 1px 2px color-mix(in oklch, var(--ink) 8%, transparent);
397
+ --shadow-float: 0 4px 12px color-mix(in oklch, var(--ink) 16%, transparent),
398
+ 0 2px 4px color-mix(in oklch, var(--ink) 10%, transparent);
399
+
400
+ /* GLASS - taupe vid 55% över cream (svagt mörkare tint, iOS UIBlurEffect-
401
+ konvention för ljus bakgrund). Se ADR 0028. */
402
+ --glass-bg: color-mix(in oklch, var(--taupe) 55%, transparent);
403
+ --glass-bg-fallback: color-mix(in oklch, var(--warm-sunken) 92%, transparent);
386
404
 
387
405
  /* STATUS - Light step 11 för text, step 9 för bg */
388
406
  --positive: var(--green-light-11);
@@ -406,11 +424,9 @@
406
424
  mot amber, 5.76:1 mot green-light-9, 5.52:1 mot red-light-9. */
407
425
  --text-on-status: var(--gray-light-12);
408
426
 
409
- /* --text-on-accent: mörk i light mode.
410
- Vit oklch(0.98 0 0) ger ~3.29:1 mot blue-light-9 och ~2.8:1 mot
411
- plum-light-9 - båda under WCAG AA 4.5:1.
412
- gray-light-12 ger godkänd kontrast mot alla app-accenter. */
413
- --text-on-accent: var(--gray-light-12);
427
+ /* --text-on-accent: ljus, eftersom den delade brand-accenten är mörk
428
+ indigo (#433CAF). Varm vit ger ~8:1 mot indigon (WCAG AAA). */
429
+ --text-on-accent: var(--warm-overlay);
414
430
 
415
431
  /* Danger-action - dim/border följer via accent-danger-recursion */
416
432
  --accent-danger: var(--red-light-9);
@@ -65,49 +65,37 @@
65
65
  }
66
66
 
67
67
 
68
- /* Light mode-override per app - Plum Light-rampen + Plum-tonad page.
69
- Konsumeras när <html data-app="ekonom" data-theme="light">. Se ADR 0028.
70
-
71
- (0,2,0) specificity - vinner garanterat över både [data-app]-block
72
- och [data-theme]-block var för sig. Alla tokens som [data-app="ekonom"]
73
- sätter måste även sättas här för light mode - annars vinner app-base
74
- över semantic [data-theme="light"]-overriden via load-order. */
68
+ /* Light mode - delat ljust standardtema (cream + indigo). Se ADR 0028.
69
+ Ekonom har ingen egen ljus-identitet längre: detta block pekar om allt
70
+ [data-app="ekonom"] sätter i mörkt (accent, ytor, text, glas) till de
71
+ delade brand/warm-värdena. (0,2,0, olagrat) vinner över både app-base
72
+ och det lagrade [data-theme="light"]-blocket. Resten (ramar, status)
73
+ ärvs från [data-theme="light"] i 10-semantic.css. */
75
74
  [data-app="ekonom"][data-theme="light"] {
76
- /* Accent: Plum Light-rampen */
77
- --accent-soft: var(--plum-light-3);
78
- --accent-moderate: var(--plum-light-4);
79
- --accent-9: var(--plum-light-9);
80
- --accent-10: var(--plum-light-10);
81
- --accent-text: var(--plum-light-11);
82
- --accent-a1: var(--plum-light-a1);
83
- --accent-a2: var(--plum-light-a2);
84
- --accent-a3: var(--plum-light-a3);
85
- --accent-a6: var(--plum-light-a6);
86
- --accent-a8: var(--plum-light-a8);
87
- --accent-a10: var(--plum-light-a10);
88
- --accent-a12: var(--plum-light-a12);
89
-
90
- /* Surface: Plum Light-toningar för alla 8 nivåer. Måste sättas här -
91
- app-base sätter plum-N (dark-rampen) och vinner annars över
92
- [data-theme="light"]-overriden i 10-semantic.css. */
93
- --surface-page: var(--plum-light-1);
94
- --surface-default: var(--plum-light-2);
95
- --surface-raised: var(--plum-light-3);
96
- --surface-elevated: var(--plum-light-4);
97
- --surface-overlay: var(--plum-light-5);
98
- --surface-hover: var(--plum-light-4);
99
- --surface-active: var(--plum-light-5);
100
- --surface-sunken: var(--plum-light-1);
101
-
102
- /* Text-default: mörk i light. App-base sätter Ekonoms varma plum-vit
103
- #F4F2FA som vinner annars över [data-theme="light"]. */
104
- --text-default: var(--gray-light-12);
75
+ --accent-soft: color-mix(in oklch, var(--accent-brand) 10%, transparent);
76
+ --accent-moderate: color-mix(in oklch, var(--accent-brand) 16%, transparent);
77
+ --accent-9: var(--accent-brand);
78
+ --accent-10: var(--accent-brand-hover);
79
+ --accent-text: var(--accent-brand);
80
+ --accent-a1: color-mix(in oklch, var(--accent-brand) 3%, transparent);
81
+ --accent-a2: color-mix(in oklch, var(--accent-brand) 5%, transparent);
82
+ --accent-a3: color-mix(in oklch, var(--accent-brand) 10%, transparent);
83
+ --accent-a6: color-mix(in oklch, var(--accent-brand) 20%, transparent);
84
+ --accent-a8: color-mix(in oklch, var(--accent-brand) 35%, transparent);
85
+ --accent-a10: color-mix(in oklch, var(--accent-brand) 60%, transparent);
86
+ --accent-a12: color-mix(in oklch, var(--accent-brand) 90%, transparent);
105
87
 
106
- /* Glass-bg: neutral grå-tint mot ljus page (iOS UIBlurEffect-konvention).
107
- App-base sätter surface-raised 65% som vinner annars över
108
- [data-theme="light"]. */
109
- --glass-bg: color-mix(in oklch, var(--gray-light-6) 55%, transparent);
88
+ --surface-page: var(--warm-page);
89
+ --surface-default: var(--warm-section);
90
+ --surface-raised: var(--warm-card);
91
+ --surface-elevated: var(--warm-card);
92
+ --surface-overlay: var(--warm-overlay);
93
+ --surface-hover: var(--warm-hover);
94
+ --surface-active: var(--warm-active);
95
+ --surface-sunken: var(--warm-sunken);
110
96
 
111
- /* Border-focus: Plum accent */
112
- --border-focus: var(--plum-light-8);
97
+ --text-default: var(--ink);
98
+ --text-on-accent: var(--warm-overlay);
99
+ --glass-bg: color-mix(in oklch, var(--taupe) 55%, transparent);
100
+ --border-focus: var(--accent-brand);
113
101
  }
package/css/apps/jubb.css CHANGED
@@ -53,49 +53,36 @@
53
53
  }
54
54
 
55
55
 
56
- /* Light mode-override per app - Blue Light-rampen + Blue-tonad page.
57
- Konsumeras när <html data-app="jubb" data-theme="light">. Se ADR 0028.
58
-
59
- (0,2,0) specificity - vinner garanterat över både [data-app]-block
60
- och [data-theme]-block var för sig. Alla tokens som [data-app="jubb"]
61
- sätter måste även sättas här för light mode - annars vinner app-base
62
- över semantic [data-theme="light"]-overriden via load-order. */
56
+ /* Light mode - delat ljust standardtema (cream + indigo). Se ADR 0028.
57
+ Jubb har ingen egen ljus-identitet längre: detta block pekar om allt
58
+ [data-app="jubb"] sätter i mörkt (accent, ytor, text, glas) till de
59
+ delade brand/warm-värdena. (0,2,0, olagrat) vinner. Resten ärvs från
60
+ [data-theme="light"] i 10-semantic.css. */
63
61
  [data-app="jubb"][data-theme="light"] {
64
- /* Accent: Blue Light-rampen */
65
- --accent-soft: var(--blue-light-3);
66
- --accent-moderate: var(--blue-light-4);
67
- --accent-9: var(--blue-light-9);
68
- --accent-10: var(--blue-light-10);
69
- --accent-text: var(--blue-light-11);
70
- --accent-a1: var(--blue-light-a1);
71
- --accent-a2: var(--blue-light-a2);
72
- --accent-a3: var(--blue-light-a3);
73
- --accent-a6: var(--blue-light-a6);
74
- --accent-a8: var(--blue-light-a8);
75
- --accent-a10: var(--blue-light-a10);
76
- --accent-a12: var(--blue-light-a12);
77
-
78
- /* Surface: Blue Light-toningar för alla 8 nivåer. Måste sättas här -
79
- app-base sätter blue-N (dark-rampen) och vinner annars över
80
- [data-theme="light"]-overriden i 10-semantic.css. */
81
- --surface-page: var(--blue-light-1);
82
- --surface-default: var(--blue-light-2);
83
- --surface-raised: var(--blue-light-3);
84
- --surface-elevated: var(--blue-light-4);
85
- --surface-overlay: var(--blue-light-5);
86
- --surface-hover: var(--blue-light-4);
87
- --surface-active: var(--blue-light-5);
88
- --surface-sunken: var(--blue-light-1);
89
-
90
- /* Text-default: mörk i light. App-base sätter Jubbs varma vit
91
- #EEF4FF som vinner annars över [data-theme="light"]. */
92
- --text-default: var(--gray-light-12);
62
+ --accent-soft: color-mix(in oklch, var(--accent-brand) 10%, transparent);
63
+ --accent-moderate: color-mix(in oklch, var(--accent-brand) 16%, transparent);
64
+ --accent-9: var(--accent-brand);
65
+ --accent-10: var(--accent-brand-hover);
66
+ --accent-text: var(--accent-brand);
67
+ --accent-a1: color-mix(in oklch, var(--accent-brand) 3%, transparent);
68
+ --accent-a2: color-mix(in oklch, var(--accent-brand) 5%, transparent);
69
+ --accent-a3: color-mix(in oklch, var(--accent-brand) 10%, transparent);
70
+ --accent-a6: color-mix(in oklch, var(--accent-brand) 20%, transparent);
71
+ --accent-a8: color-mix(in oklch, var(--accent-brand) 35%, transparent);
72
+ --accent-a10: color-mix(in oklch, var(--accent-brand) 60%, transparent);
73
+ --accent-a12: color-mix(in oklch, var(--accent-brand) 90%, transparent);
93
74
 
94
- /* Glass-bg: neutral grå-tint mot ljus page (iOS UIBlurEffect-konvention).
95
- App-base sätter surface-raised 65% som vinner annars över
96
- [data-theme="light"]. */
97
- --glass-bg: color-mix(in oklch, var(--gray-light-6) 55%, transparent);
75
+ --surface-page: var(--warm-page);
76
+ --surface-default: var(--warm-section);
77
+ --surface-raised: var(--warm-card);
78
+ --surface-elevated: var(--warm-card);
79
+ --surface-overlay: var(--warm-overlay);
80
+ --surface-hover: var(--warm-hover);
81
+ --surface-active: var(--warm-active);
82
+ --surface-sunken: var(--warm-sunken);
98
83
 
99
- /* Border-focus: Blue accent */
100
- --border-focus: var(--blue-light-8);
84
+ --text-default: var(--ink);
85
+ --text-on-accent: var(--warm-overlay);
86
+ --glass-bg: color-mix(in oklch, var(--taupe) 55%, transparent);
87
+ --border-focus: var(--accent-brand);
101
88
  }
@@ -35,3 +35,27 @@
35
35
  --accent-a10: var(--indigo-a10);
36
36
  --accent-a12: var(--indigo-a12);
37
37
  }
38
+
39
+
40
+ /* Light mode - delat ljust standardtema (cream + indigo). Klödd är
41
+ referensappen. Re-deklarerar allt [data-app="klodd"] sätter ovan med
42
+ brand-värden (0,2,0 vinner, olagrat -> slår token-lagret). Ytor/text/
43
+ ramar ärvs från [data-theme="light"] i 10-semantic.css. Se ADR 0028. */
44
+ [data-app="klodd"][data-theme="light"] {
45
+ --accent-soft: color-mix(in oklch, var(--accent-brand) 10%, transparent);
46
+ --accent-moderate: color-mix(in oklch, var(--accent-brand) 16%, transparent);
47
+ --accent-9: var(--accent-brand);
48
+ --accent-10: var(--accent-brand-hover);
49
+ --accent-text: var(--accent-brand);
50
+ --accent-a1: color-mix(in oklch, var(--accent-brand) 3%, transparent);
51
+ --accent-a2: color-mix(in oklch, var(--accent-brand) 5%, transparent);
52
+ --accent-a3: color-mix(in oklch, var(--accent-brand) 10%, transparent);
53
+ --accent-a6: color-mix(in oklch, var(--accent-brand) 20%, transparent);
54
+ --accent-a8: color-mix(in oklch, var(--accent-brand) 35%, transparent);
55
+ --accent-a10: color-mix(in oklch, var(--accent-brand) 60%, transparent);
56
+ --accent-a12: color-mix(in oklch, var(--accent-brand) 90%, transparent);
57
+
58
+ --surface-raised: var(--warm-card);
59
+ --text-on-accent: var(--warm-overlay);
60
+ --border-focus: var(--accent-brand);
61
+ }
package/js/turbo-nav.js CHANGED
@@ -66,6 +66,15 @@
66
66
  let currentController = null;
67
67
  let inFlightSwap = null; // Promise som resolvar nar pagaende VT/swap ar klar.
68
68
 
69
+ /*--------------------------------------------------------------
70
+ Track senaste pathname+search sa popstate-handlern kan skilja
71
+ mellan riktig back/forward-nav (path/search andras) och hash-
72
+ only-nav (browser default scroll-to-anchor + hashchange). Vid
73
+ hash-only ska turbo INTE fetch+swap - det skulle overrida
74
+ browser-default-scrollen med scrollTo(0, cachedScroll=0).
75
+ --------------------------------------------------------------*/
76
+ let lastPathSearch = window.location.pathname + window.location.search;
77
+
69
78
  /*--------------------------------------------------------------
70
79
  Lank-eligibility: ska denna <a> hanteras av Turbo eller browsern?
71
80
  --------------------------------------------------------------*/
@@ -316,6 +325,13 @@
316
325
  history.pushState( mergeState( { scrollY: 0 } ), '', finalUrl );
317
326
  }
318
327
 
328
+ // Spara nya path+search sa popstate-handlern kan upptacka
329
+ // hash-only-navigations (path/search aterstaller, bara hash byter).
330
+ try {
331
+ const parsed = new URL( finalUrl );
332
+ lastPathSearch = parsed.pathname + parsed.search;
333
+ } catch ( _ ) { /* ignore */ }
334
+
319
335
  // Notify subscribers (nav-optimistic.js, hero-roll.js, future modules).
320
336
  document.dispatchEvent( new CustomEvent( 'turbo:navigated', {
321
337
  detail: { url: finalUrl, fromUrl: fromUrl, popstate: !! options.popstate },
@@ -357,8 +373,26 @@
357
373
  turbo: true via mergeState sa popstate-handling vet att vi ar
358
374
  i turbo-modell hela vagen. Browser-internals (scroll-cache,
359
375
  etc.) bevaras eftersom vi merge:ar istallet for replace:ar.
376
+
377
+ Chrome firar popstate aven for hash-only-navs pa samma
378
+ dokument (a href="#x"-klick laggs som history-entry + ev.
379
+ popstate beroende pa browser-version). Vi vill INTE turbo-
380
+ fetch+swap i de fallen - browser default-scroll till anchor
381
+ + hashchange-event hanterar det helt natively. Att fetch+swap
382
+ trots det leder till scrollTo(0, 0) i swap-callbacken (state
383
+ null fran browser-skapad entry), vilket overrider anchor-
384
+ scrollen och blir "scrollade tillbaka till toppen"-bugg.
385
+
386
+ Detektion: jamfor nuvarande pathname+search mot lastPathSearch
387
+ (updateras vid varje lyckad navigateTo). Identiska = hash-only.
360
388
  --------------------------------------------------------------*/
361
389
  window.addEventListener( 'popstate', function () {
390
+ const currentPathSearch = window.location.pathname + window.location.search;
391
+ if ( currentPathSearch === lastPathSearch ) {
392
+ // Hash-only-nav pa samma dokument - browser default + hashchange
393
+ // gor jobbet. Inget att swappa.
394
+ return;
395
+ }
362
396
  navigateTo( window.location.href, { popstate: true } );
363
397
  } );
364
398
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@klodd/ds",
3
- "version": "5.16.1",
3
+ "version": "5.17.0",
4
4
  "description": "Klodd shared design system - tokens, components, JS",
5
5
  "main": "css/index.css",
6
6
  "bin": {
@@ -35,3 +35,26 @@ Primitives-grund: 78 Radix Light-variabler i 00-primitives.css
35
35
  - Fas 3 (toggle-JS + visuell QA per app) genomförs separat per app
36
36
  - Token-systemet löser komponent-korrekthet automatiskt - inga
37
37
  komponent-CSS-edits krävs i light mode
38
+
39
+ ## Amendering 2026-07-01 - ett delat ljust standardtema
40
+
41
+ Ljusläget är inte längre per-app. Det finns ETT ljust tema, delat av alla
42
+ appar: ett klodd.io-inspirerat varmt cream-tema med indigo brand-accent
43
+ (#433CAF) använd mycket sparsamt. Ingen sekundärfärg.
44
+
45
+ - Neutralerna är custom varma värden (`--warm-*`, `--ink*`, `--taupe*` i
46
+ 00-primitives.css), INTE Radix Mauve Light - avsteg från ADR 0006/0003
47
+ enbart i ljusläge. Dark mode behåller Mauve/Radix oförändrat.
48
+ - Accenten är delad indigo (`--accent-brand`) för alla appar i ljus.
49
+ Per-app-accenterna (Jubb blå, Ekonom plum) gäller bara i dark.
50
+ - Cascade: app-base `[data-app=X]` (olagrat i konsument-appen) vinner över
51
+ det lagrade `[data-theme="light"]`-blocket, så varje apps
52
+ `[data-app=X][data-theme="light"]` pekar om sina dark-overrides (accent,
53
+ ytor, text, glas) till de delade warm/brand-värdena. Tre block, identiska
54
+ värden -> ett tema. Det shared `[data-theme="light"]`-blocket bär ramar,
55
+ status, shadow och är fallback.
56
+ - `text-on-accent` är ljus (varm vit) eftersom brand-accenten är mörk indigo,
57
+ till skillnad från de tidigare ljusa per-app-accenterna.
58
+
59
+ Status: live i Kommers (`data-app="klodd" data-theme="light"`) från
60
+ 2026-07-01. Jubb/Ekonom ärver temat vid nästa build:ds (ljus ej aktivt där).