@klodd/ds 5.13.0 → 5.14.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/SKILL.md +14 -0
- package/css/00-primitives.css +0 -5
- package/css/10-semantic.css +5 -3
- package/css/apps/ekonom.css +7 -0
- package/css/apps/jubb.css +6 -0
- package/css/components/icon.css +8 -8
- package/css/components/nav.css +19 -1
- package/package.json +1 -1
- package/references/04-locked-decisions/0027-glass-effect-bottom-nav.md +39 -0
- package/references/05-open-decisions/0025-content-max-token-konsolidering-CLOSED.md +44 -0
- package/references/05-open-decisions/0026-klodd-split-view-yagni-CLOSED.md +33 -0
- package/references/05-open-decisions/0025-content-max-token-konsolidering.md +0 -43
package/SKILL.md
CHANGED
|
@@ -49,6 +49,20 @@ dessa två.
|
|
|
49
49
|
samma yta som default-sektioner men distinkt mot page-bakgrunden
|
|
50
50
|
(color-1).
|
|
51
51
|
|
|
52
|
+
## Responsiv layout: container queries
|
|
53
|
+
|
|
54
|
+
`.main-content` är en namngiven query-container (`container-type:
|
|
55
|
+
inline-size; container-name: layout`, satt i `base/layout.css`).
|
|
56
|
+
Komponenter kan därmed adaptera efter content-bredden istället för
|
|
57
|
+
viewporten via `@container layout (...)`.
|
|
58
|
+
|
|
59
|
+
Första användningen: `.stat-grid` går från 2 till 4 kolumner vid
|
|
60
|
+
`@container layout (min-width: 700px)` (`components/stat.css`).
|
|
61
|
+
Beteendet blir per-app eftersom varje apps `.main-content`
|
|
62
|
+
max-width-override avgör vad queryn ser: Jubb (bred desktop-main,
|
|
63
|
+
`--max-w-desktop`) får 4 kolumner, Ekonom (600px main) står kvar
|
|
64
|
+
på 2. Lägg nya komponent-adaptioner under samma `layout`-container.
|
|
65
|
+
|
|
52
66
|
## Besluts-records
|
|
53
67
|
- `references/04-locked-decisions/` — låsta beslut. Förklara, ändra inte.
|
|
54
68
|
- `references/05-open-decisions/` — öppna punkter. Presentera alternativen.
|
package/css/00-primitives.css
CHANGED
|
@@ -418,14 +418,9 @@
|
|
|
418
418
|
--bp-medium: 1024px; /* mellanbredd → desktop */
|
|
419
419
|
--bp-expanded: 1440px; /* desktop → wide */
|
|
420
420
|
|
|
421
|
-
--max-w-mobile: 600px;
|
|
422
421
|
--max-w-tablet: 680px;
|
|
423
422
|
--max-w-desktop: 1280px;
|
|
424
|
-
--max-w-form: 560px;
|
|
425
|
-
--max-w-bottom-nav: 572px;
|
|
426
|
-
--max-w-nav-desktop: 720px;
|
|
427
423
|
|
|
428
|
-
--content-max-width: 640px;
|
|
429
424
|
--content-max-narrow: 480px; /* .main-content--narrow */
|
|
430
425
|
--content-max-default: 600px; /* .main-content (default) */
|
|
431
426
|
--content-max-wide: 800px; /* .main-content--wide */
|
package/css/10-semantic.css
CHANGED
|
@@ -240,9 +240,11 @@
|
|
|
240
240
|
/* Spinner-backdrop bakom upload-spinner-overlay. */
|
|
241
241
|
--backdrop-spinner: color-mix(in srgb, var(--surface-page) 88%, transparent);
|
|
242
242
|
|
|
243
|
-
/* Glass-
|
|
244
|
-
|
|
245
|
-
|
|
243
|
+
/* Glass-tokens: semi-transparenta ytor för backdrop-blur-navigation.
|
|
244
|
+
Konsumeras av .bottom-nav. Kalibrerade mot Blue-1 (Jubb) och Plum-1 (Ekonom).
|
|
245
|
+
--glass-bg-fallback används av @supports-grenen (browsers utan backdrop-filter). */
|
|
246
|
+
--glass-bg: color-mix(in oklch, var(--surface-raised) 65%, transparent);
|
|
247
|
+
--glass-bg-fallback: color-mix(in oklch, var(--surface-raised) 96%, transparent);
|
|
246
248
|
|
|
247
249
|
/* Grafpalett - for diagram och visualiseringar.
|
|
248
250
|
Fem distinkta farger med god kontrast mot dark-bakgrund.
|
package/css/apps/ekonom.css
CHANGED
|
@@ -56,3 +56,10 @@
|
|
|
56
56
|
--accent-a10: var(--plum-a10);
|
|
57
57
|
--accent-a12: var(--plum-a12);
|
|
58
58
|
}
|
|
59
|
+
|
|
60
|
+
/* Glass-kalibrering per app - override av 10-semantic.css default (65%).
|
|
61
|
+
Plum-1 (#181118) är något ljusare än Blue-1 (#0d1520) - kan kräva
|
|
62
|
+
högre opacitet (67-70%) efter visuell verifiering i Ekonom. */
|
|
63
|
+
[data-app="ekonom"] {
|
|
64
|
+
--glass-bg: color-mix(in oklch, var(--surface-raised) 65%, transparent);
|
|
65
|
+
}
|
package/css/apps/jubb.css
CHANGED
|
@@ -45,3 +45,9 @@
|
|
|
45
45
|
/* Text - varm vit med latt bla ton (paritet med Ekonoms #F4F2FA Plum-vit) */
|
|
46
46
|
--text-default: #EEF4FF;
|
|
47
47
|
}
|
|
48
|
+
|
|
49
|
+
/* Glass-kalibrering per app - override av 10-semantic.css default (65%).
|
|
50
|
+
Justeras visuellt mot Blue-1-bakgrund vid build:ds-driftsättning. */
|
|
51
|
+
[data-app="jubb"] {
|
|
52
|
+
--glass-bg: color-mix(in oklch, var(--surface-raised) 65%, transparent);
|
|
53
|
+
}
|
package/css/components/icon.css
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/* ================================================================
|
|
2
2
|
components/icon.css
|
|
3
3
|
.icon - generisk ikon-wrapper med fem size-modifiers.
|
|
4
|
-
Anvands for bade
|
|
5
|
-
och custom inline-SVG (<svg class="icon icon--md">).
|
|
4
|
+
Anvands for bade sprite-ikoner (via <svg class="icon"><use
|
|
5
|
+
href="...#icon-X">) och custom inline-SVG (<svg class="icon icon--md">).
|
|
6
6
|
|
|
7
7
|
color: currentColor sa parent-elementet styr fargen via color-property.
|
|
8
8
|
|
|
9
9
|
Custom SVG-monster (.icon-custom svg) ger standardiserade
|
|
10
|
-
stroke-attribut for handritade ikoner som
|
|
10
|
+
stroke-attribut for handritade ikoner som spriten saknar.
|
|
11
11
|
================================================================ */
|
|
12
12
|
|
|
13
13
|
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
vertical-align: middle;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
/*
|
|
27
|
-
|
|
26
|
+
/* Tvinga svg-barnet (sprite-<use> eller inline) att fylla wrappern
|
|
27
|
+
sa size-modifiers fungerar konsekvent. */
|
|
28
28
|
.icon > svg {
|
|
29
29
|
width: 100%;
|
|
30
30
|
height: 100%;
|
|
@@ -44,12 +44,12 @@
|
|
|
44
44
|
|
|
45
45
|
/* ================================================================
|
|
46
46
|
==== CUSTOM SVG-MONSTER
|
|
47
|
-
App-specifika ikoner som
|
|
47
|
+
App-specifika ikoner som spriten saknar. Anvand som wrapper:
|
|
48
48
|
<span class="icon icon--md icon-custom">
|
|
49
49
|
<svg viewBox="0 0 24 24">...</svg>
|
|
50
50
|
</span>
|
|
51
|
-
stroke-width 1.5
|
|
52
|
-
|
|
51
|
+
stroke-width 1.5 + linecap/linejoin round for mjuka, konsekventa
|
|
52
|
+
konturer.
|
|
53
53
|
================================================================ */
|
|
54
54
|
.icon-custom svg {
|
|
55
55
|
fill: none;
|
package/css/components/nav.css
CHANGED
|
@@ -44,13 +44,29 @@
|
|
|
44
44
|
padding-inline: var(--space-8);
|
|
45
45
|
margin: 0;
|
|
46
46
|
max-width: none;
|
|
47
|
-
background: var(--surface-raised);
|
|
48
47
|
border: 1px solid var(--border-subtle);
|
|
49
48
|
border-radius: var(--radius-full);
|
|
50
49
|
/* Sprint 3a 2026-05-12: shadow→none per dark-mode-doktrin. */
|
|
51
50
|
box-shadow: none;
|
|
52
51
|
}
|
|
53
52
|
|
|
53
|
+
@supports (backdrop-filter: blur(1px)) {
|
|
54
|
+
.bottom-nav {
|
|
55
|
+
/* Safari iOS: position:fixed + backdrop-filter skapar ny stacking context.
|
|
56
|
+
z-index: var(--z-nav) bibehålls korrekt men rubber-band-scroll behöver
|
|
57
|
+
verifieras på fysisk enhet. */
|
|
58
|
+
background: var(--glass-bg);
|
|
59
|
+
backdrop-filter: blur(12px);
|
|
60
|
+
-webkit-backdrop-filter: blur(12px);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@supports not (backdrop-filter: blur(1px)) {
|
|
65
|
+
.bottom-nav {
|
|
66
|
+
background: var(--glass-bg-fallback);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
54
70
|
.bottom-nav__item {
|
|
55
71
|
flex: 1;
|
|
56
72
|
min-width: 0;
|
|
@@ -135,6 +151,7 @@
|
|
|
135
151
|
border-right: 1px solid var(--border-subtle);
|
|
136
152
|
border-bottom: none;
|
|
137
153
|
box-shadow: none;
|
|
154
|
+
background: var(--surface-raised); /* Glass är bar-mode only — rail/drawer är sidebars, inte floating pills. */
|
|
138
155
|
}
|
|
139
156
|
|
|
140
157
|
.bottom-nav__item {
|
|
@@ -186,6 +203,7 @@
|
|
|
186
203
|
border-right: 1px solid var(--border-subtle);
|
|
187
204
|
border-bottom: none;
|
|
188
205
|
box-shadow: none;
|
|
206
|
+
background: var(--surface-raised); /* Glass är bar-mode only — rail/drawer är sidebars, inte floating pills. */
|
|
189
207
|
}
|
|
190
208
|
|
|
191
209
|
.bottom-nav__item {
|
package/package.json
CHANGED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# 0027 - Glaseffekt på bottom-nav
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
Locked.
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
bottom-nav är en position:fixed pill som flytande ovanpå scroll-innehåll.
|
|
8
|
+
iOS-native glaseffekt (UIBlurEffect) är etablerat designspråk för just
|
|
9
|
+
detta mönster. Klodd DS dark-mode-doktrin säger "ljushet-hierarki > shadow" —
|
|
10
|
+
glaseffekt via luminans-baserad blur + tint följer doktrinen.
|
|
11
|
+
|
|
12
|
+
--glass-bg och --glass-bg-fallback definierades i 10-semantic.css utan konsumenter.
|
|
13
|
+
Detta ADR aktiverar dem.
|
|
14
|
+
|
|
15
|
+
## Decision
|
|
16
|
+
.bottom-nav använder backdrop-filter: blur(16px) + --glass-bg (72% solid av
|
|
17
|
+
--surface-raised) via @supports-grening.
|
|
18
|
+
|
|
19
|
+
@supports not-grenen faller tillbaka till --glass-bg-fallback (96% solid) —
|
|
20
|
+
visuellt nästintill identiskt med tidigare solida yta.
|
|
21
|
+
|
|
22
|
+
Surface-tokens förblir solida. Glaseffekt är en per-komponent opt-in,
|
|
23
|
+
inte en global token-mutation.
|
|
24
|
+
|
|
25
|
+
## Consequences
|
|
26
|
+
- + iOS-native visuell metafor för flytande navigation
|
|
27
|
+
- + @supports garanterar att browsers utan stöd ser 96% solid fallback
|
|
28
|
+
- + --glass-bg är app-agnostisk — korrekt tint följer automatiskt vid
|
|
29
|
+
Blue → Plum app-byte via surface-raised-kedjan
|
|
30
|
+
- − Safari iOS: position:fixed + backdrop-filter skapar stacking context,
|
|
31
|
+
rubber-band-scroll måste verifieras på fysisk enhet
|
|
32
|
+
- − Kontinuerlig GPU-compositing vid scroll (~5-15% extra GPU-tid på
|
|
33
|
+
äldre iPhoner). Accepterat givet bottoms navs lilla yta (2-3% av viewport)
|
|
34
|
+
|
|
35
|
+
## Kalibreringsstatus
|
|
36
|
+
65% är kalibrerat startvärde mot test-HTML med Blue-1-bakgrund (Jubb).
|
|
37
|
+
Per-app-override i apps/jubb.css och apps/ekonom.css tillåter
|
|
38
|
+
oberoende finjustering utan paketreleaser. Ekonom otestad mot
|
|
39
|
+
Plum-1 - verifiera vid Ekonom-driftsättning.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 0025 - content-max token-konsolidering
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
Closed 2026-05-22 (@klodd/ds 5.13.1).
|
|
6
|
+
|
|
7
|
+
## Beslut
|
|
8
|
+
|
|
9
|
+
Konsument-ytan kartlades i båda app-repona (CSS + templates). Av tio
|
|
10
|
+
page-width-tokens var fem orphans utan en enda användning - de
|
|
11
|
+
raderades ur 00-primitives.css:
|
|
12
|
+
|
|
13
|
+
- `--max-w-mobile` (600px)
|
|
14
|
+
- `--max-w-form` (560px)
|
|
15
|
+
- `--max-w-bottom-nav` (572px)
|
|
16
|
+
- `--max-w-nav-desktop` (720px)
|
|
17
|
+
- `--content-max-width` (640px, avvikande namn)
|
|
18
|
+
|
|
19
|
+
Fem tokens behölls i sina befintliga familjer:
|
|
20
|
+
|
|
21
|
+
- `--content-max-narrow/-default/-wide` (480/600/800px) - paketet,
|
|
22
|
+
`.main-content`-varianterna i base/layout.css.
|
|
23
|
+
- `--max-w-tablet/-desktop` (680/1280px) - Jubb app-override i
|
|
24
|
+
jubb.css.
|
|
25
|
+
|
|
26
|
+
Ingen omdöpning. De två kvarvarande familjerna ligger i olika lager
|
|
27
|
+
med olika roll (paket-default vs app-override) och blandas inte - att
|
|
28
|
+
tvinga in dem i en familj hade dolt distinktionen. Patch-version: de
|
|
29
|
+
raderade tokensen hade noll konsumenter, ingen breaking change.
|
|
30
|
+
|
|
31
|
+
## Context
|
|
32
|
+
|
|
33
|
+
Tre överlappande page-width-tokenfamiljer fanns i paketet efter
|
|
34
|
+
width/height-arbetet (5.8.0):
|
|
35
|
+
|
|
36
|
+
1. `--content-max-*` (`-narrow` 480px, `-default` 600px, `-wide`
|
|
37
|
+
800px) - definierade i 00-primitives.css, konsumeras av
|
|
38
|
+
base/layout.css (`.main-content`-varianterna).
|
|
39
|
+
2. `--content-max-width: 640px` - orphan i 00-primitives.css, noll
|
|
40
|
+
användning i paketet eller apparna.
|
|
41
|
+
3. `--max-w-*` (sex tokens: `-mobile` 600, `-tablet` 680, `-desktop`
|
|
42
|
+
1280, `-form` 560, `-bottom-nav` 572, `-nav-desktop` 720) i
|
|
43
|
+
00-primitives.css. `--max-w-mobile: 600px` överlappade exakt
|
|
44
|
+
`--content-max-default: 600px`.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# 0026 - klodd-split-view: bordlagd (YAGNI)
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
Closed 2026-05-22. Bordlagd, ingen implementation.
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
En split-view-komponent (lista + detalj sida-vid-sida på desktop) har
|
|
10
|
+
funnits som backlog-idé. Konsument-ytan kartlades 2026-05-22:
|
|
11
|
+
|
|
12
|
+
- Ekonom har ingen lista med separat detaljsida. Detalj-interaktioner
|
|
13
|
+
är sheets/modaler och inline-collapsibles - inget split-view-format.
|
|
14
|
+
Den smala 600px `.main-content` motverkar dessutom mönstret.
|
|
15
|
+
- Jubb har en genuin master-detalj: `/jobb` (lista) + `/jobb/{id}`
|
|
16
|
+
(detalj, job_detail.html). En hypotetisk framtida split-view-
|
|
17
|
+
kandidat på desktop.
|
|
18
|
+
|
|
19
|
+
## Beslut
|
|
20
|
+
|
|
21
|
+
Bygg inte klodd-split-view. Per ADR 0024 kräver en paketkomponent två
|
|
22
|
+
verifierade konsumerande appar; split-view har noll i dag och som mest
|
|
23
|
+
en hypotetisk (Jubb /jobb). Att tillverka en andra konsument enbart
|
|
24
|
+
för att rättfärdiga komponenten är uttryckligen förbjudet i ADR 0024.
|
|
25
|
+
|
|
26
|
+
Om Jubb senare gör `/jobb` -> `/jobb/{id}` till en desktop-master-
|
|
27
|
+
detalj byggs det som Jubb domän-CSS, inte paket. Det graduerar till
|
|
28
|
+
paketet bara om Ekonom också får ett split-view-format - vilket dess
|
|
29
|
+
arkitektur (sheet-baserad detalj, smal main) inte pekar mot.
|
|
30
|
+
|
|
31
|
+
## References
|
|
32
|
+
|
|
33
|
+
- ADR 0024 (skärpt komponent-lyft-doktrin)
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# 0025 - content-max token-konsolidering
|
|
2
|
-
|
|
3
|
-
## Status
|
|
4
|
-
|
|
5
|
-
Pending.
|
|
6
|
-
|
|
7
|
-
## Context
|
|
8
|
-
|
|
9
|
-
Tre överlappande page-width-tokenfamiljer finns i paketet efter
|
|
10
|
-
width/height-arbetet (5.8.0):
|
|
11
|
-
|
|
12
|
-
1. `--content-max-*` (`-narrow` 480px, `-default` 600px, `-wide`
|
|
13
|
-
800px) - definierade i 00-primitives.css, konsumeras av
|
|
14
|
-
base/layout.css (`.main-content`-varianterna).
|
|
15
|
-
2. `--content-max-width: 640px` - orphan i 00-primitives.css, noll
|
|
16
|
-
användning i paketet eller apparna.
|
|
17
|
-
3. `--max-w-*` (sex tokens: `-mobile` 600, `-tablet` 680, `-desktop`
|
|
18
|
-
1280, `-form` 560, `-bottom-nav` 572, `-nav-desktop` 720) i
|
|
19
|
-
00-primitives.css. `--max-w-mobile: 600px` överlappar exakt
|
|
20
|
-
`--content-max-default: 600px`.
|
|
21
|
-
|
|
22
|
-
## Decision needed
|
|
23
|
-
|
|
24
|
-
Konsolidera till en page-width-tokenfamilj: behåll sannolikt
|
|
25
|
-
`--content-max-*`, radera orphan `--content-max-width`, mappa eller
|
|
26
|
-
radera `--max-w-*`-familjen.
|
|
27
|
-
|
|
28
|
-
## Considered options
|
|
29
|
-
|
|
30
|
-
### A. Konsolidera nu
|
|
31
|
-
Risk: `--max-w-*` och `--content-max-width` har okänd konsument-yta.
|
|
32
|
-
Apparnas domain-CSS och templates greppades inte. Att radera eller
|
|
33
|
-
mappa dem kan ge visuell drift på okänt antal vyer.
|
|
34
|
-
|
|
35
|
-
### B. Skjut till separat sprint (vald interim)
|
|
36
|
-
Lämna alla tre familjer orörda i 5.8.0. Konsolidera när
|
|
37
|
-
konsument-ytan kartlagts.
|
|
38
|
-
|
|
39
|
-
## Pending decision criteria
|
|
40
|
-
|
|
41
|
-
Kräver en survey av `--max-w-*`- och `--content-max-width`-användning
|
|
42
|
-
i båda app-repona (CSS + templates) innan konsolidering. Tas i egen
|
|
43
|
-
sprint.
|