@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 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.
@@ -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 */
@@ -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-bg for backdrop-blur navigationer (bottom-nav, top-nav). */
244
- --glass-bg: color-mix(in oklch, var(--surface-overlay) 85%, transparent);
245
- --glass-bg-fallback: color-mix(in oklch, var(--surface-overlay) 96%, transparent);
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.
@@ -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
+ }
@@ -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 Lucide-ikoner (via <i data-lucide="X" class="icon icon--md">)
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 Lucide saknar.
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
- /* Lucide ersatter <i data-lucide="X"> med <svg>. Tvinga svg att fylla
27
- wrappern sa size-modifiers fungerar konsekvent. */
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 Lucide saknar. Anvand som wrapper:
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 matchar Lucide-default. linecap/linejoin round
52
- ger samma mjuka look.
51
+ stroke-width 1.5 + linecap/linejoin round for mjuka, konsekventa
52
+ konturer.
53
53
  ================================================================ */
54
54
  .icon-custom svg {
55
55
  fill: none;
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@klodd/ds",
3
- "version": "5.13.0",
3
+ "version": "5.14.0",
4
4
  "description": "Klodd shared design system - tokens, components, JS",
5
5
  "main": "css/index.css",
6
6
  "bin": {
@@ -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.