@klodd/ds 1.1.0 → 1.2.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.
@@ -47,6 +47,28 @@
47
47
  }
48
48
 
49
49
 
50
+ /* ================================================================
51
+ ==== COLORS - GRAY ALPHA (Radix Mauve Dark Alpha)
52
+ Pre-kalibrerade alpha-varianter for subtila tints over komplexa
53
+ bakgrunder (gradients, bilder, semi-transparenta overlays).
54
+ Officiella Radix-varden - perceptuellt korrekt over olika ytor.
55
+ ================================================================ */
56
+ :root {
57
+ --gray-a1: #00000000;
58
+ --gray-a2: #f5f4f609;
59
+ --gray-a3: #ebeaf814;
60
+ --gray-a4: #eee5f81d;
61
+ --gray-a5: #efe6fe25;
62
+ --gray-a6: #f1e6fd30;
63
+ --gray-a7: #eee9ff40;
64
+ --gray-a8: #eee7ff5d;
65
+ --gray-a9: #eae6fd6e;
66
+ --gray-a10: #ece9fd7c;
67
+ --gray-a11: #f5f1ffb7;
68
+ --gray-a12: #fdfdffef;
69
+ }
70
+
71
+
50
72
  /* ================================================================
51
73
  ==== COLORS - BLUE (Radix Blue Dark - Jubb accent)
52
74
  Officiella Radix-varden. Step 9 = "Brand-blue" sky-tonad,
@@ -68,6 +90,26 @@
68
90
  }
69
91
 
70
92
 
93
+ /* ================================================================
94
+ ==== COLORS - BLUE ALPHA (Radix Blue Dark Alpha)
95
+ Officiella Radix-varden. Anvands av Jubbs accent-alpha-tokens.
96
+ ================================================================ */
97
+ :root {
98
+ --blue-a1: #004df211;
99
+ --blue-a2: #1166fb18;
100
+ --blue-a3: #0077ff3a;
101
+ --blue-a4: #0075ff57;
102
+ --blue-a5: #0081fd6b;
103
+ --blue-a6: #0f89fd7f;
104
+ --blue-a7: #2a91fe98;
105
+ --blue-a8: #3094feb9;
106
+ --blue-a9: #0090ff;
107
+ --blue-a10: #3b9eff;
108
+ --blue-a11: #70b8ff;
109
+ --blue-a12: #c2e6ff;
110
+ }
111
+
112
+
71
113
  /* ================================================================
72
114
  ==== COLORS - PURPLE (Radix Violet Dark)
73
115
  Officiella Radix-varden. Behalls i shared-system for framtida
@@ -110,6 +152,26 @@
110
152
  }
111
153
 
112
154
 
155
+ /* ================================================================
156
+ ==== COLORS - PLUM ALPHA (Radix Plum Dark Alpha)
157
+ Officiella Radix-varden. Anvands av Ekonoms accent-alpha-tokens.
158
+ ================================================================ */
159
+ :root {
160
+ --plum-a1: #f112f108;
161
+ --plum-a2: #f22ff211;
162
+ --plum-a3: #fd4cfd27;
163
+ --plum-a4: #f646ff3a;
164
+ --plum-a5: #f455ff48;
165
+ --plum-a6: #f66dff56;
166
+ --plum-a7: #f07cfd70;
167
+ --plum-a8: #ee84ff95;
168
+ --plum-a9: #e961feb6;
169
+ --plum-a10: #ed70ffc0;
170
+ --plum-a11: #f19cfef3;
171
+ --plum-a12: #feddfef4;
172
+ }
173
+
174
+
113
175
  /* ================================================================
114
176
  ==== COLORS - STATUS (Radix dark-skalor, step 9)
115
177
  Officiella Radix-varden. Text-on-status hardkodad i semantic.
@@ -149,10 +149,19 @@
149
149
  INTE for: text pa --accent-9-bakgrund (anvand --text-on-accent). */
150
150
  --accent-text: var(--blue-11);
151
151
 
152
- /* Alpha-varianter via color-mix() - inga hardkodade rgba. */
153
- --accent-a10: color-mix(in oklch, var(--accent-9) 10%, transparent);
154
- --accent-a20: color-mix(in oklch, var(--accent-9) 20%, transparent);
155
- --accent-a40: color-mix(in oklch, var(--accent-9) 40%, transparent);
152
+ /* Accent alpha-skalan (Radix-konvention).
153
+ Pre-kalibrerade transparent-tints over komplexa bakgrunder.
154
+ Step-mappning samma som solid-skalan: a1-2 app-bg, a3 vila,
155
+ a4-5 hover/active, a6 subtil border, a7-8 stark border, a9-10
156
+ solid (saknar mening som alpha), a11-12 text.
157
+ Genereras fran accent-fargens alpha-variant - overrides per app. */
158
+ --accent-a1: var(--blue-a1);
159
+ --accent-a2: var(--blue-a2);
160
+ --accent-a3: var(--blue-a3);
161
+ --accent-a6: var(--blue-a6);
162
+ --accent-a8: var(--blue-a8);
163
+ --accent-a10: var(--blue-a10);
164
+ --accent-a12: var(--blue-a12);
156
165
 
157
166
 
158
167
  /* ================================================================
@@ -306,34 +315,83 @@
306
315
  }
307
316
 
308
317
 
318
+ /* ================================================================
319
+ ==== HIGH CONTRAST MODE (prefers-contrast: more)
320
+ Stärker borders och text-muted/-subtle for anvandare som har
321
+ high-contrast pa OS-niva. Paverkar inte farger - bara gransvarden
322
+ sa svaga subtila element blir mer urskiljbara.
323
+
324
+ Anvandning kraver inget komponentkod-arbete - alla komponenter
325
+ refererar redan dessa semantic tokens, sa overrides slar genom
326
+ automatiskt.
327
+ ================================================================ */
328
+ @media (prefers-contrast: more) {
329
+ :root {
330
+ --border-subtle: var(--gray-7);
331
+ --border-default: var(--gray-8);
332
+ --border-strong: var(--gray-9);
333
+ --text-muted: var(--gray-10);
334
+ --text-subtle: var(--gray-11);
335
+ }
336
+ }
337
+
338
+
309
339
  /* ================================================================
310
340
  ==== LIGHT MODE (data-theme="light")
311
- Overrider ytor, text och borders. Accent justeras ett steg ljusare
341
+ Overrider ytor, text och borders. Accent justeras ett steg morkare
312
342
  for batter kontrast pa ljus bakgrund. Komponenter behover inga
313
343
  andringar - alla refererar bara semantic tokens.
344
+
345
+ STATUS: forberedd, inte aktivt produktion-verifierad. Dokumenterad
346
+ som "Punkt J" i AUDIT.md. Tokens som inte overrides her arver
347
+ default-blocket (dark-values) - kanda begransningar:
348
+ - alpha-tokens (--accent-a*) anvander dark-Radix-alpha-skalor;
349
+ bor importera light-skalor for full paritet
350
+ - --shadow-float ar kalibrerad for dark-mode (synlig pa ljus bg
351
+ men kan behova mindre opacity)
352
+ - --hero-glow gradient anvander accent som ar morkare i light;
353
+ eventuellt for mattat
314
354
  ================================================================ */
315
355
  [data-theme="light"] {
356
+ /* Surfaces - Material-/Aksel-stil dar morkare = upphojt.
357
+ I dark var det tvartom (ljusare = upphojt). I light fungerar det
358
+ sa har eftersom skuggor ar mer subtila pa ljus bakgrund. */
316
359
  --surface-page: oklch(0.99 0.002 250);
317
360
  --surface-default: oklch(0.96 0.003 250);
318
- --surface-raised: oklch(0.99 0.002 250);
319
- --surface-overlay: oklch(0.93 0.004 250);
361
+ --surface-raised: oklch(1.00 0.002 250); /* nastan vit kort over light bg */
362
+ --surface-overlay: oklch(0.99 0.002 250); /* morkare i z-stack via shadow */
320
363
  --surface-hover: oklch(0.93 0.004 250);
321
364
  --surface-active: oklch(0.88 0.005 250);
322
365
  --surface-sunken: oklch(0.94 0.003 250);
323
366
 
367
+ /* Text - inverterad mauve-skala. */
324
368
  --text-default: var(--gray-1);
325
369
  --text-subtle: var(--gray-3);
326
370
  --text-muted: var(--gray-6);
327
371
  --text-disabled: var(--gray-8);
328
372
 
373
+ /* Text-on-* - i light har vi morkare accent (blue-8) men ljusare
374
+ status-bg som kan behova morkare text. Behaller vit eftersom
375
+ accent-8 + status-9 fortfarande ar tillrackligt morka. */
376
+ --text-on-accent: oklch(0.98 0 0);
377
+ --text-on-status: oklch(0.98 0 0);
378
+
379
+ /* Borders - inverterad mauve-skala. */
329
380
  --border-subtle: var(--gray-9);
330
381
  --border-default: var(--gray-8);
331
382
  --border-strong: var(--gray-7);
332
383
 
333
- /* Accent justeras ett steg for batter kontrast i light. */
334
- --accent-9: var(--blue-8);
335
- --accent-10: var(--blue-9);
336
- --accent-text: var(--blue-9);
384
+ /* Accent - ett steg morkare for batter kontrast pa ljus bg.
385
+ Plus accent-soft/moderate som ger korrekt subtil tint. */
386
+ --accent-soft: var(--blue-2);
387
+ --accent-moderate: var(--blue-3);
388
+ --accent-9: var(--blue-8);
389
+ --accent-10: var(--blue-9);
390
+ --accent-text: var(--blue-9);
391
+
392
+ /* Status solid - behaller dark-step-9 eftersom dessa farger ar
393
+ val-kalibrerade och fungerar pa bade ljus och mork bakgrund. */
394
+ /* --bg-success, --bg-warning, --bg-danger arvs fran default. */
337
395
  }
338
396
 
339
397
 
@@ -366,27 +424,30 @@
366
424
  --text-tertiary: var(--text-muted);
367
425
  --text-faint: var(--text-disabled);
368
426
 
369
- /* Accent - gamla --accent (singular) mappas mot nya --accent-9. */
427
+ /* Accent - gamla --accent (singular) mappas mot nya --accent-9.
428
+ --accent-dim/-border foljde gamla 20%/40%-konventionen, mappas
429
+ nu mot Radix-skalans steg 3 (subtil) och 6 (border-emphasis). */
370
430
  --accent: var(--accent-9);
371
431
  --accent-hover: var(--accent-10);
372
432
  --accent-strong: var(--accent-9);
373
433
  --accent-secondary: var(--accent-9);
374
- --accent-dim: var(--accent-a20);
375
- --accent-border: var(--accent-a40);
434
+ --accent-dim: var(--accent-a3);
435
+ --accent-border: var(--accent-a6);
376
436
 
377
- /* Accent-link - gamla cirkelknapps-tokens. Mappas mot accent-systemet. */
437
+ /* Accent-link - gamla cirkelknapps-tokens. Mappas mot accent-systemet.
438
+ Gamla 10/20/40%-stegen mappas mot nya Radix-stegen 2/3/6. */
378
439
  --accent-link: var(--accent-text);
379
- --accent-link-bg: var(--accent-a10);
380
- --accent-link-bg-hover: var(--accent-a20);
381
- --accent-link-border: var(--accent-a20);
382
- --accent-link-border-hover: var(--accent-a40);
440
+ --accent-link-bg: var(--accent-a2);
441
+ --accent-link-bg-hover: var(--accent-a3);
442
+ --accent-link-border: var(--accent-a3);
443
+ --accent-link-border-hover: var(--accent-a6);
383
444
 
384
445
  /* Audit-aliaser fran 2026-05-07 - ofta refererade utan att vara definierade. */
385
446
  --text: var(--text-default);
386
447
  --border: var(--border-default);
387
448
  --surface-2: var(--surface-default);
388
449
  --surface-3: var(--surface-raised);
389
- --accent-rgba: var(--accent-a20);
450
+ --accent-rgba: var(--accent-a3);
390
451
 
391
452
  /* Radius - gamla t-shirt-namn mappas mot nya pixel-numeriska. */
392
453
  --radius-xs: var(--radius-2);
@@ -35,4 +35,13 @@
35
35
  /* Text - Ekonoms varma vit (lite lila-tonad) istallet for Mauve-12.
36
36
  Bevarar den karaktaren som Ekonom haft sedan tidigt. */
37
37
  --text-default: #F4F2FA;
38
+
39
+ /* Accent alpha - Radix Plum Dark Alpha. Override pa default-Blue. */
40
+ --accent-a1: var(--plum-a1);
41
+ --accent-a2: var(--plum-a2);
42
+ --accent-a3: var(--plum-a3);
43
+ --accent-a6: var(--plum-a6);
44
+ --accent-a8: var(--plum-a8);
45
+ --accent-a10: var(--plum-a10);
46
+ --accent-a12: var(--plum-a12);
38
47
  }
@@ -53,8 +53,8 @@
53
53
 
54
54
  .badge--accent {
55
55
  color: var(--accent-text);
56
- background: var(--accent-a10);
57
- border-color: var(--accent-a40);
56
+ background: var(--accent-a2);
57
+ border-color: var(--accent-a6);
58
58
  }
59
59
 
60
60
 
@@ -0,0 +1,25 @@
1
+ /* ================================================================
2
+ components/divider.css
3
+ Horisontell eller vertikal separator. Anvands mellan sektioner,
4
+ list-grupper, eller inom sheets/cards. Tva styrkor (subtle/strong).
5
+
6
+ Default ar horisontell. Modifier --vertical for sidled. Modifier
7
+ --strong for hogre kontrast (anvand sparsamt - subtle ar default).
8
+ ================================================================ */
9
+ .divider {
10
+ border: none;
11
+ border-top: 1px solid var(--border-subtle);
12
+ margin: var(--space-16) 0;
13
+ }
14
+
15
+ .divider--vertical {
16
+ border-top: none;
17
+ border-left: 1px solid var(--border-subtle);
18
+ height: 100%;
19
+ margin: 0 var(--space-16);
20
+ align-self: stretch;
21
+ }
22
+
23
+ .divider--strong {
24
+ border-color: var(--border-default);
25
+ }
@@ -0,0 +1,88 @@
1
+ /* ================================================================
2
+ components/dropdown.css
3
+ Kontextuell meny. Wrapper med trigger + .dropdown-menu som
4
+ visas via .is-open-toggling fran JS.
5
+
6
+ Markup-pattern:
7
+ <div class="dropdown" data-dropdown>
8
+ <button class="btn btn--icon" data-dropdown-trigger>...</button>
9
+ <div class="dropdown-menu" role="menu">
10
+ <button class="dropdown-item" role="menuitem">Item 1</button>
11
+ <hr class="dropdown-divider">
12
+ <button class="dropdown-item dropdown-item--danger">Ta bort</button>
13
+ </div>
14
+ </div>
15
+
16
+ JS togglar .is-open pa .dropdown-element. Inga inline-styles
17
+ (CSP-safe). Stang via klick utanfor / Escape via JS-helper.
18
+ ================================================================ */
19
+ .dropdown {
20
+ position: relative;
21
+ display: inline-flex;
22
+ }
23
+
24
+ .dropdown-menu {
25
+ position: absolute;
26
+ top: calc(100% + var(--space-4));
27
+ left: 0;
28
+ min-width: 160px;
29
+ background: var(--surface-overlay);
30
+ border: 1px solid var(--border-default);
31
+ border-radius: var(--radius-10);
32
+ padding: var(--space-4) 0;
33
+ box-shadow: 0 4px 16px color-mix(in oklch, black 40%, transparent);
34
+ z-index: var(--z-dropdown, 100);
35
+ display: none;
36
+ }
37
+
38
+ .dropdown.is-open .dropdown-menu {
39
+ display: block;
40
+ }
41
+
42
+ .dropdown-item {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: var(--space-8);
46
+ width: 100%;
47
+ padding: var(--space-8) var(--space-12);
48
+ font-family: inherit;
49
+ font-size: var(--fs-14);
50
+ color: var(--text-default);
51
+ background: transparent;
52
+ border: 0;
53
+ text-align: left;
54
+ cursor: pointer;
55
+ transition: background var(--dur-fast) var(--ease-out);
56
+ }
57
+
58
+ @media (hover: hover) and (pointer: fine) {
59
+ .dropdown-item:hover {
60
+ background: var(--surface-hover);
61
+ }
62
+ }
63
+
64
+ .dropdown-item:active {
65
+ background: var(--surface-active);
66
+ }
67
+
68
+ .dropdown-item:focus-visible {
69
+ outline: 2px solid var(--border-focus);
70
+ outline-offset: -2px;
71
+ }
72
+
73
+ .dropdown-item[disabled],
74
+ .dropdown-item:disabled {
75
+ opacity: 0.5;
76
+ cursor: not-allowed;
77
+ pointer-events: none;
78
+ }
79
+
80
+ .dropdown-item--danger {
81
+ color: var(--bg-danger);
82
+ }
83
+
84
+ .dropdown-divider {
85
+ border: none;
86
+ border-top: 1px solid var(--border-subtle);
87
+ margin: var(--space-4) 0;
88
+ }
@@ -53,6 +53,12 @@
53
53
  100% { opacity: 1; transform: translateY(0) scale(1); }
54
54
  }
55
55
 
56
+ @media (prefers-reduced-motion: reduce) {
57
+ .toast {
58
+ animation: none;
59
+ }
60
+ }
61
+
56
62
 
57
63
  /* ================================================================
58
64
  ==== EMPTY-STATE
@@ -65,7 +65,7 @@
65
65
  .textarea:focus,
66
66
  .select:focus {
67
67
  border-color: var(--accent-9);
68
- box-shadow: 0 0 0 3px var(--accent-a20);
68
+ box-shadow: 0 0 0 3px var(--accent-a3);
69
69
  background: var(--surface-default);
70
70
  }
71
71
 
@@ -21,6 +21,9 @@ dialog.sheet::backdrop {
21
21
  background: color-mix(in oklch, var(--surface-page) 60%, transparent);
22
22
  -webkit-backdrop-filter: blur(4px);
23
23
  backdrop-filter: blur(4px);
24
+ /* Klickbar yta - JS lyssnar pa backdrop-klick for stang-action.
25
+ Signalerar interaktivitet visuellt via cursor. */
26
+ cursor: pointer;
24
27
  }
25
28
 
26
29
 
@@ -0,0 +1,39 @@
1
+ /* ================================================================
2
+ components/progress.css
3
+ Linjar progress-indikator. Anvands for budget-burndown, upload-
4
+ status, multi-step-flows. Modifiers for status-fargning.
5
+
6
+ .progress ar wrappern (track), .progress-bar ar fyllnaden.
7
+ Sätt width via inline style eller data-attribut + JS (CSP-safe).
8
+
9
+ Brief-pattern fran Ekonom:
10
+ <div class="progress">
11
+ <div class="progress-bar progress-bar--warning"
12
+ data-bar-width="73%"></div>
13
+ </div>
14
+ bar-styles.js applicerar style.width fran data-bar-width.
15
+ ================================================================ */
16
+ .progress {
17
+ width: 100%;
18
+ height: var(--space-6);
19
+ background: var(--surface-raised);
20
+ border-radius: var(--radius-full);
21
+ overflow: hidden;
22
+ }
23
+
24
+ .progress-bar {
25
+ height: 100%;
26
+ background: var(--accent-9);
27
+ border-radius: var(--radius-full);
28
+ transition: width var(--dur-base) var(--ease-out);
29
+ }
30
+
31
+ .progress-bar--success { background: var(--bg-success); }
32
+ .progress-bar--warning { background: var(--bg-warning); }
33
+ .progress-bar--danger { background: var(--bg-danger); }
34
+
35
+ @media (prefers-reduced-motion: reduce) {
36
+ .progress-bar {
37
+ transition: none;
38
+ }
39
+ }
@@ -0,0 +1,50 @@
1
+ /* ================================================================
2
+ components/tooltip.css
3
+ Kortfattad hjalptext vid hover/focus. Pure CSS - ingen JS.
4
+
5
+ Markup-pattern:
6
+ <span class="tooltip-wrapper">
7
+ <button class="btn btn--icon">...</button>
8
+ <span class="tooltip" role="tooltip">Hjalptext har</span>
9
+ </span>
10
+
11
+ Tooltip visas vid hover OCH focus-within sa tangentbordsanvandare
12
+ far samma feedback som musanvandare. Pointer-events:none pa
13
+ tooltip-elementet sa det inte snor klick fran wrappern.
14
+
15
+ prefers-reduced-motion respekteras (opacity-fade tas bort).
16
+ ================================================================ */
17
+ .tooltip-wrapper {
18
+ position: relative;
19
+ display: inline-flex;
20
+ }
21
+
22
+ .tooltip {
23
+ position: absolute;
24
+ bottom: calc(100% + var(--space-6));
25
+ left: 50%;
26
+ transform: translateX(-50%);
27
+ background: var(--surface-overlay);
28
+ color: var(--text-default);
29
+ font-size: var(--fs-12);
30
+ line-height: var(--lh-snug);
31
+ padding: var(--space-4) var(--space-8);
32
+ border-radius: var(--radius-6);
33
+ border: 1px solid var(--border-default);
34
+ white-space: nowrap;
35
+ pointer-events: none;
36
+ opacity: 0;
37
+ transition: opacity var(--dur-fast) var(--ease-out);
38
+ z-index: var(--z-tooltip, 50);
39
+ }
40
+
41
+ .tooltip-wrapper:hover .tooltip,
42
+ .tooltip-wrapper:focus-within .tooltip {
43
+ opacity: 1;
44
+ }
45
+
46
+ @media (prefers-reduced-motion: reduce) {
47
+ .tooltip {
48
+ transition: none;
49
+ }
50
+ }
package/css/index.css CHANGED
@@ -26,3 +26,7 @@
26
26
  @import './components/overlay.css';
27
27
  @import './components/icon.css';
28
28
  @import './components/hero-roll.css';
29
+ @import './components/divider.css';
30
+ @import './components/progress.css';
31
+ @import './components/tooltip.css';
32
+ @import './components/dropdown.css';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@klodd/ds",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Klodd Design System - shared tokens, typography, and components for Jubb, Ekonom, and future apps",
5
5
  "main": "css/index.css",
6
6
  "files": [