@klodd/ds 1.1.0 → 3.0.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.
Files changed (43) hide show
  1. package/css/00-primitives.css +62 -0
  2. package/css/10-semantic.css +81 -20
  3. package/css/apps/ekonom.css +9 -0
  4. package/css/base/layout.css +45 -0
  5. package/css/components/auth.css +28 -0
  6. package/css/components/avatar.css +31 -0
  7. package/css/components/badge.css +2 -2
  8. package/css/components/banner.css +63 -0
  9. package/css/components/chip.css +257 -0
  10. package/css/components/collapsible.css +64 -0
  11. package/css/components/divider.css +25 -0
  12. package/css/components/dropdown.css +88 -0
  13. package/css/components/feedback.css +6 -0
  14. package/css/components/form.css +67 -0
  15. package/css/components/hbar.css +64 -0
  16. package/css/components/hero.css +85 -0
  17. package/css/components/hub-card.css +100 -0
  18. package/css/components/inline-edit.css +67 -0
  19. package/css/components/input.css +1 -1
  20. package/css/components/list-row.css +115 -0
  21. package/css/components/overlay.css +3 -0
  22. package/css/components/panel.css +95 -0
  23. package/css/components/progress.css +39 -0
  24. package/css/components/setting-row.css +186 -0
  25. package/css/components/split-bar.css +53 -0
  26. package/css/components/stat.css +55 -0
  27. package/css/components/swipe-stack.css +200 -0
  28. package/css/components/tab-bar.css +58 -0
  29. package/css/components/table.css +39 -0
  30. package/css/components/tooltip.css +50 -0
  31. package/css/components/upload-spinner.css +55 -0
  32. package/css/index.css +32 -0
  33. package/css/utilities.css +81 -0
  34. package/js/bar-styles.js +37 -0
  35. package/js/hero-roll.js +287 -0
  36. package/js/index.js +95 -0
  37. package/js/lucide-init.js +27 -0
  38. package/js/nav-optimistic.js +74 -0
  39. package/js/pull-to-refresh.js +162 -0
  40. package/js/pwa-register.js +132 -0
  41. package/js/sheet-drag.js +163 -0
  42. package/js/turbo-nav.js +353 -0
  43. package/package.json +4 -3
@@ -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
  }
@@ -0,0 +1,45 @@
1
+ /* ================================================================
2
+ base/layout.css
3
+ App-niva-layout: main-content, page-header, page-title.
4
+ Anvands som default-skelett pa varje vy.
5
+ ================================================================ */
6
+ .main-content {
7
+ max-width: var(--content-max-default, 600px);
8
+ margin: 0 auto;
9
+ padding: calc(var(--safe-top) + var(--space-16)) var(--space-14) var(--bottom-nav-clearance);
10
+ position: relative;
11
+ min-height: calc(100dvh - var(--bottom-nav-clearance));
12
+ }
13
+
14
+ .main-content--narrow { max-width: var(--content-max-narrow, 480px); }
15
+ .main-content--wide { max-width: var(--content-max-wide, 800px); }
16
+
17
+ .page-header {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: space-between;
21
+ gap: var(--space-12);
22
+ margin-bottom: var(--space-16);
23
+ flex-wrap: wrap;
24
+ }
25
+
26
+ .page-title {
27
+ font-size: var(--fs-22);
28
+ font-weight: var(--fw-medium);
29
+ letter-spacing: var(--ls-tight);
30
+ color: var(--text-default);
31
+ margin: 0;
32
+ }
33
+
34
+ .page-subtitle {
35
+ font-size: var(--fs-13);
36
+ color: var(--text-subtle);
37
+ margin-top: var(--space-2);
38
+ }
39
+
40
+ .split-grid {
41
+ display: grid;
42
+ grid-template-columns: 1fr;
43
+ gap: var(--space-12);
44
+ margin-bottom: var(--space-14);
45
+ }
@@ -0,0 +1,28 @@
1
+ /* ================================================================
2
+ components/auth.css
3
+ Centrerad layout for inloggning + onboarding.
4
+ ================================================================ */
5
+ .auth-container {
6
+ display: flex;
7
+ flex-direction: column;
8
+ align-items: center;
9
+ justify-content: center;
10
+ min-height: 70vh;
11
+ gap: var(--space-8);
12
+ padding: var(--space-20);
13
+ text-align: center;
14
+ }
15
+
16
+ .auth-container__title {
17
+ font-size: var(--fs-22);
18
+ font-weight: var(--fw-medium);
19
+ letter-spacing: var(--ls-tight);
20
+ color: var(--text-default);
21
+ margin: 0;
22
+ }
23
+
24
+ .auth-container__subtitle {
25
+ color: var(--text-subtle);
26
+ margin: 0 0 var(--space-24);
27
+ font-size: var(--fs-13);
28
+ }
@@ -0,0 +1,31 @@
1
+ /* ================================================================
2
+ components/avatar.css
3
+ Cirkular initial-avatar. Modifier --lg pa profil-vyer.
4
+ ================================================================ */
5
+ .avatar {
6
+ width: 36px;
7
+ height: 36px;
8
+ border-radius: var(--radius-full);
9
+ background: linear-gradient(135deg, var(--accent-9) 0%, var(--accent-10) 100%);
10
+ display: inline-flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ flex-shrink: 0;
14
+ color: var(--text-on-accent);
15
+ font-size: var(--fs-15);
16
+ font-weight: var(--fw-medium);
17
+ text-transform: uppercase;
18
+ line-height: var(--lh-tight);
19
+ }
20
+
21
+ .avatar--sm {
22
+ width: 28px;
23
+ height: 28px;
24
+ font-size: var(--fs-12);
25
+ }
26
+
27
+ .avatar--lg {
28
+ width: 56px;
29
+ height: 56px;
30
+ font-size: var(--fs-24);
31
+ }
@@ -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,63 @@
1
+ /* ================================================================
2
+ components/banner.css
3
+ .banner ar bred informations-rad med titel + sub + content.
4
+ Modifiers: --hero, --accent, --positive, --negative, --warning.
5
+ BEM: .banner__title, .banner__sub, .banner__content.
6
+ ================================================================ */
7
+ .banner {
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: space-between;
11
+ gap: var(--space-14);
12
+ padding: var(--space-14) var(--space-16);
13
+ border-radius: var(--radius-16);
14
+ margin-bottom: var(--space-14);
15
+ background: var(--surface-raised);
16
+ border: 1px solid var(--border-subtle);
17
+ }
18
+
19
+ .banner__content {
20
+ display: flex;
21
+ flex-direction: column;
22
+ gap: var(--space-2);
23
+ min-width: 0;
24
+ }
25
+
26
+ .banner__title {
27
+ font-size: var(--fs-14);
28
+ font-weight: var(--fw-medium);
29
+ color: var(--text-default);
30
+ margin: 0;
31
+ }
32
+
33
+ .banner__sub {
34
+ font-size: var(--fs-12);
35
+ color: var(--text-subtle);
36
+ }
37
+
38
+ .banner--accent {
39
+ background: var(--accent-a3);
40
+ border-color: var(--accent-a6);
41
+ }
42
+
43
+ .banner--positive {
44
+ background: var(--positive-dim);
45
+ border-color: var(--positive-border);
46
+ }
47
+
48
+ .banner--negative {
49
+ background: var(--negative-dim);
50
+ border-color: var(--negative-border);
51
+ }
52
+
53
+ .banner--warning {
54
+ background: var(--warning-dim);
55
+ border-color: var(--warning-border);
56
+ border-left-width: 3px;
57
+ }
58
+
59
+ .banner--hero {
60
+ flex-direction: column;
61
+ align-items: flex-start;
62
+ padding: var(--space-20);
63
+ }
@@ -0,0 +1,257 @@
1
+ /* ================================================================
2
+ components/chip.css
3
+ Sma status-pills. .chip ar bas. Modifiers: --accent, --positive,
4
+ --negative, --warning, --faint.
5
+
6
+ Plus relaterade pill-mont:
7
+ - .brand-pill: liten pill med projekt-namn
8
+ - .month-pill: navigations-pill for manads-byte
9
+ - .install-chip: PWA install-prompt floating-pill
10
+ - .score-pill: ratings-pill (variants --strong/--medium/--low)
11
+
12
+ .chip-list ar wrapper for flera chips i rad (form-edit-flode).
13
+ ================================================================ */
14
+ .chip {
15
+ display: inline-flex;
16
+ align-items: center;
17
+ gap: var(--space-6);
18
+ font-size: var(--fs-11);
19
+ font-weight: var(--fw-medium);
20
+ padding: var(--space-4) var(--space-10);
21
+ border-radius: var(--radius-full);
22
+ background: var(--surface-default);
23
+ color: var(--text-subtle);
24
+ border: 1px solid var(--border-subtle);
25
+ white-space: nowrap;
26
+ }
27
+
28
+ .chip::before {
29
+ content: '';
30
+ width: 6px;
31
+ height: 6px;
32
+ border-radius: var(--radius-full);
33
+ background: currentColor;
34
+ display: inline-block;
35
+ opacity: 0.75;
36
+ }
37
+
38
+ .chip--accent { color: var(--accent-text); background: var(--accent-a3); border-color: var(--accent-a6); }
39
+ .chip--positive { color: var(--positive); background: var(--positive-dim); border-color: var(--positive-border); }
40
+ .chip--negative { color: var(--negative); background: var(--negative-dim); border-color: var(--negative-border); }
41
+ .chip--warning { color: var(--warning); background: var(--warning-dim); border-color: var(--warning-border); }
42
+ .chip--faint { color: var(--text-muted); background: transparent; border-color: var(--border-subtle); }
43
+
44
+ .chip-list {
45
+ display: flex;
46
+ flex-wrap: wrap;
47
+ gap: var(--space-8);
48
+ margin: 0;
49
+ padding: 0;
50
+ list-style: none;
51
+ }
52
+
53
+ .chip-list__item {
54
+ display: inline-flex;
55
+ align-items: center;
56
+ gap: var(--space-6);
57
+ height: 32px;
58
+ padding: 0 var(--space-12);
59
+ background: var(--surface-default);
60
+ border: 1px solid var(--border-subtle);
61
+ border-radius: var(--radius-full);
62
+ color: var(--text-default);
63
+ font-size: var(--fs-13);
64
+ font-family: inherit;
65
+ white-space: nowrap;
66
+ }
67
+
68
+ .chip-list__delete {
69
+ display: inline-flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ width: 18px;
73
+ height: 18px;
74
+ padding: 0;
75
+ background: transparent;
76
+ border: 0;
77
+ color: var(--text-muted);
78
+ cursor: pointer;
79
+ border-radius: 50%;
80
+ transition: background var(--dur-fast) var(--ease-default);
81
+ }
82
+
83
+ @media (hover: hover) and (pointer: fine) {
84
+ .chip-list__delete:hover {
85
+ background: color-mix(in oklch, var(--accent-danger) 15%, transparent);
86
+ color: var(--accent-danger);
87
+ }
88
+ }
89
+
90
+ .chip-list__add {
91
+ background: transparent;
92
+ border-style: dashed;
93
+ color: var(--text-subtle);
94
+ cursor: pointer;
95
+ font-weight: var(--fw-medium);
96
+ -webkit-tap-highlight-color: transparent;
97
+ touch-action: manipulation;
98
+ transition: background var(--dur-fast) var(--ease-default);
99
+ }
100
+
101
+ @media (hover: hover) and (pointer: fine) {
102
+ .chip-list__add:hover {
103
+ background: var(--surface-hover);
104
+ color: var(--text-default);
105
+ border-color: var(--text-muted);
106
+ }
107
+ }
108
+
109
+
110
+ /* ================================================================
111
+ ==== BRAND-PILL
112
+ Liten pill med projekt-namn i topbar.
113
+ ================================================================ */
114
+ .brand-pill {
115
+ display: inline-flex;
116
+ align-items: center;
117
+ padding: var(--space-4) var(--space-12);
118
+ background: var(--surface-default);
119
+ border: 1px solid var(--border-subtle);
120
+ border-radius: var(--radius-full);
121
+ font-size: var(--fs-13);
122
+ font-weight: var(--fw-medium);
123
+ letter-spacing: var(--ls-snug);
124
+ color: var(--text-default);
125
+ }
126
+
127
+
128
+ /* ================================================================
129
+ ==== MONTH-PILL
130
+ Navigations-pill med manadsbyte (anvands i topbar pa Ekonom).
131
+ ================================================================ */
132
+ .month-pill {
133
+ display: inline-flex;
134
+ align-items: center;
135
+ gap: var(--space-6);
136
+ height: 28px;
137
+ padding: 0 var(--space-12);
138
+ background: var(--surface-default);
139
+ border: 1px solid var(--border-subtle);
140
+ border-radius: var(--radius-full);
141
+ font-size: var(--fs-12);
142
+ font-weight: var(--fw-medium);
143
+ color: var(--text-default);
144
+ cursor: pointer;
145
+ text-decoration: none;
146
+ white-space: nowrap;
147
+ }
148
+
149
+
150
+ /* ================================================================
151
+ ==== SCORE-PILL
152
+ Tabular-nums for sifferjustering. Modifiers: --strong/--medium/--low.
153
+ ================================================================ */
154
+ .score-pill {
155
+ flex-shrink: 0;
156
+ display: inline-flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ font-size: var(--fs-11);
160
+ font-weight: var(--fw-medium);
161
+ font-variant-numeric: tabular-nums;
162
+ letter-spacing: var(--ls-wide, 0.01em);
163
+ padding: var(--space-2) var(--space-8);
164
+ border-radius: var(--radius-full);
165
+ border: 1px solid transparent;
166
+ white-space: nowrap;
167
+ line-height: 1.4;
168
+ }
169
+
170
+ .score-pill--strong {
171
+ color: var(--positive);
172
+ background: var(--positive-dim);
173
+ border-color: var(--positive-border);
174
+ }
175
+
176
+ .score-pill--medium {
177
+ color: var(--warning);
178
+ background: var(--warning-dim);
179
+ border-color: var(--warning-border);
180
+ }
181
+
182
+ .score-pill--low {
183
+ color: var(--text-muted);
184
+ background: var(--surface-default);
185
+ border-color: var(--border-subtle);
186
+ }
187
+
188
+
189
+ /* ================================================================
190
+ ==== INSTALL-CHIP
191
+ PWA install-prompt som flyter ovan bottom-nav.
192
+ ================================================================ */
193
+ .install-chip {
194
+ position: fixed;
195
+ bottom: calc(84px + var(--safe-bottom));
196
+ left: var(--space-12);
197
+ right: var(--space-12);
198
+ max-width: 480px;
199
+ margin: 0 auto;
200
+ background: var(--surface-raised);
201
+ border: 1px solid var(--border-subtle);
202
+ border-radius: var(--radius-full);
203
+ padding: var(--space-10) var(--space-10) var(--space-10) var(--space-18);
204
+ display: flex;
205
+ align-items: center;
206
+ gap: var(--space-10);
207
+ font-size: var(--fs-13);
208
+ color: var(--text-default);
209
+ z-index: var(--z-overlay, 60);
210
+ animation: install-chip-up 0.28s var(--ease-out);
211
+ box-shadow: var(--shadow-float);
212
+ }
213
+
214
+ .install-chip__text { flex: 1; min-width: 0; }
215
+
216
+ .install-chip__install {
217
+ background: var(--accent-9);
218
+ color: var(--text-on-accent);
219
+ border: none;
220
+ padding: var(--space-8) var(--space-14);
221
+ border-radius: var(--radius-full);
222
+ font-size: var(--fs-12);
223
+ font-weight: var(--fw-medium);
224
+ font-family: inherit;
225
+ cursor: pointer;
226
+ white-space: nowrap;
227
+ transition: background var(--dur-fast) var(--ease-default);
228
+ }
229
+
230
+ @media (hover: hover) and (pointer: fine) {
231
+ .install-chip__install:hover { background: var(--accent-10); }
232
+ }
233
+
234
+ .install-chip__dismiss {
235
+ background: transparent;
236
+ border: none;
237
+ color: var(--text-subtle);
238
+ font-size: var(--fs-18);
239
+ line-height: 1;
240
+ padding: var(--space-6) var(--space-10);
241
+ cursor: pointer;
242
+ min-width: 36px;
243
+ transition: color var(--dur-fast) var(--ease-default);
244
+ }
245
+
246
+ @media (hover: hover) and (pointer: fine) {
247
+ .install-chip__dismiss:hover { color: var(--text-default); }
248
+ }
249
+
250
+ @keyframes install-chip-up {
251
+ from { transform: translateY(calc(100% + 100px)); opacity: 0; }
252
+ to { transform: translateY(0); opacity: 1; }
253
+ }
254
+
255
+ @media (prefers-reduced-motion: reduce) {
256
+ .install-chip { animation: none; }
257
+ }