@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.
- package/css/00-primitives.css +62 -0
- package/css/10-semantic.css +81 -20
- package/css/apps/ekonom.css +9 -0
- package/css/base/layout.css +45 -0
- package/css/components/auth.css +28 -0
- package/css/components/avatar.css +31 -0
- package/css/components/badge.css +2 -2
- package/css/components/banner.css +63 -0
- package/css/components/chip.css +257 -0
- package/css/components/collapsible.css +64 -0
- package/css/components/divider.css +25 -0
- package/css/components/dropdown.css +88 -0
- package/css/components/feedback.css +6 -0
- package/css/components/form.css +67 -0
- package/css/components/hbar.css +64 -0
- package/css/components/hero.css +85 -0
- package/css/components/hub-card.css +100 -0
- package/css/components/inline-edit.css +67 -0
- package/css/components/input.css +1 -1
- package/css/components/list-row.css +115 -0
- package/css/components/overlay.css +3 -0
- package/css/components/panel.css +95 -0
- package/css/components/progress.css +39 -0
- package/css/components/setting-row.css +186 -0
- package/css/components/split-bar.css +53 -0
- package/css/components/stat.css +55 -0
- package/css/components/swipe-stack.css +200 -0
- package/css/components/tab-bar.css +58 -0
- package/css/components/table.css +39 -0
- package/css/components/tooltip.css +50 -0
- package/css/components/upload-spinner.css +55 -0
- package/css/index.css +32 -0
- package/css/utilities.css +81 -0
- package/js/bar-styles.js +37 -0
- package/js/hero-roll.js +287 -0
- package/js/index.js +95 -0
- package/js/lucide-init.js +27 -0
- package/js/nav-optimistic.js +74 -0
- package/js/pull-to-refresh.js +162 -0
- package/js/pwa-register.js +132 -0
- package/js/sheet-drag.js +163 -0
- package/js/turbo-nav.js +353 -0
- package/package.json +4 -3
package/css/00-primitives.css
CHANGED
|
@@ -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.
|
package/css/10-semantic.css
CHANGED
|
@@ -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
|
-
/*
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
|
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(
|
|
319
|
-
--surface-overlay: oklch(0.
|
|
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
|
|
334
|
-
|
|
335
|
-
--accent-
|
|
336
|
-
--accent-
|
|
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-
|
|
375
|
-
--accent-border: var(--accent-
|
|
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-
|
|
380
|
-
--accent-link-bg-hover: var(--accent-
|
|
381
|
-
--accent-link-border: var(--accent-
|
|
382
|
-
--accent-link-border-hover: var(--accent-
|
|
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-
|
|
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);
|
package/css/apps/ekonom.css
CHANGED
|
@@ -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
|
+
}
|
package/css/components/badge.css
CHANGED
|
@@ -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
|
+
}
|