@klodd/ds 3.8.0 → 3.9.1

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
@@ -7,7 +7,7 @@ description: Design memory for the @klodd/ds shared design system across all Klo
7
7
 
8
8
  ## Vad detta är
9
9
  Gemensamt designsystem på npm (`@klodd/ds@3.x`). Tre-lagers tokens,
10
- 34+ komponenter (sheet-content tillagd v3.5.1), konsumeras av Jubb
10
+ 37+ komponenter (sheet-content tillagd v3.5.1), konsumeras av Jubb
11
11
  och Ekonom. Fler appar planerade.
12
12
  Denna Skill fångar både reglerna ("vad") och resonemanget ("varför").
13
13
 
@@ -108,38 +108,4 @@ En källa, alla projekt ser samma skill automatiskt. Ändringar i
108
108
  `~/dev/klodd-ds/SKILL.md`, `POLICY.md` eller `references/` syns
109
109
  omedelbart i nästa CC-session - ingen synk-fas behövs.
110
110
 
111
- Updated: 2026-05-09 (matchar @klodd/ds 3.5.4 - sprint C fas 1+2: ny
112
- sheet-content.css-komponent (24 BEM-klasser för Sprint-65-pattern),
113
- foreman-typografi-utokning (.text-caption/-tiny/-num/-num--display/-positive/-warning),
114
- btn-modifiers (--block, --add), .heading (17px medium tight), och utokningar
115
- i panel/setting-row/chip.
116
- v3.5.2 rattade .panel--attention__pill (felaktig BEM) till .panel__pill +
117
- context-styling via .panel--attention .panel__pill.
118
- v3.5.3 lagger till .heading-utan-N (17px) for dialog-titlar och sheet-rubriker.
119
- v3.5.4 (Sprint D-3) introducerar --fs-16 token (16px) for iOS-anti-zoom
120
- pa inputs och applicerar pa inline-edit__input. Token ar dokumenterad
121
- som BARA for input-element - vanlig text anvander fortfarande 15 eller 17.
122
- v3.5.5 (Sprint E) konsoliderar :focus-visible over 7 komponenter (chip,
123
- list-row, tab-bar, nav, swipe-stack, inline-edit) - 11 nya selectorer
124
- fick outline 2px solid var(--border-focus) med outline-offset 2px. Plus
125
- .tab outline-offset normaliserad 1px->2px. input.css och .inline-edit__input
126
- ar dokumenterade undantag som behaller :focus (text-input-konvention).
127
- v3.5.6 (Sprint F) konsoliderar BEM over 5 komponenter (card, dropdown,
128
- hero-roll, overlay, nav) - 23 flat-hyphen element-klasser konverterade
129
- till .block__element-syntax. Inkluderar JS-koordinering pa hero-roll,
130
- sheet-drag, turbo-nav, nav-optimistic dar querySelector/classList
131
- adresserar de bytta klasserna. .bottom-nav-item.active konverterad till
132
- BEM-modifier .bottom-nav__item--active. tooltip-wrapper bevarad som
133
- compound block per references/03-quality-bar.md regel 1.
134
- v3.5.7 (Sprint G) uppdaterar hub-card.css med Ekonoms tightare design
135
- (padding 14/16, border-radius 14, hub-list gap 10, active scale 0.985)
136
- nar Ekonoms LEGACY-version raderades. Sprint G hanterade aven domain-CSS
137
- BEM-migration i app-repos (icke-paket-fil) - 4 tier: A=dead-code-radering
138
- (14 klasser), B=paket-dubblett-radering (.hub-card + .hub-list ur Ekonoms
139
- LEGACY), C=BEM-byten (9 block-grupper: amort-bar, cat-tx-stack, cat-row,
140
- cat-list-row state-modifiers, sub-row state-modifiers, job-card, hero-amount-card,
141
- source-bar, score-bar), D=compound-block-undantag (cat-bar/equity-bar/
142
- budget-bar/hbar/cat-tx). Plus base.css Sprint F-miss fixad (bottom-nav-item,
143
- sheet-handle som descendant-selektorer i touch-cleanup + press-feedback).
144
- Jubb fick paritet med Ekonom: bundles/jubb.css + jubb-domain.css scaffold.
145
- Sprint C fas 2 template-migration pagaar.)
111
+ Updated: 2026-05-10 (matchar @klodd/ds 3.9.0)
@@ -26,3 +26,10 @@
26
26
  margin: 0 0 var(--space-24);
27
27
  font-size: var(--fs-13);
28
28
  }
29
+
30
+ .auth-container--narrow {
31
+ min-height: auto;
32
+ max-width: 480px;
33
+ margin-left: auto;
34
+ margin-right: auto;
35
+ }
@@ -7,6 +7,7 @@
7
7
  - --primary solid accent
8
8
  - --secondary surface med border
9
9
  - --ghost transparent text
10
+ - --positive transparent + positive-border (Ekonom-lyft Sprint 5)
10
11
  - --danger solid danger
11
12
 
12
13
  Standardstorlekar:
@@ -117,6 +118,17 @@
117
118
  }
118
119
  }
119
120
 
121
+ /* --positive: transparent + positive-border. Bekraftande action
122
+ (t.ex. "Gemensam"-flagga i review_queue). Lyft fran Ekonom v3.9.0. */
123
+ .btn--positive {
124
+ background: transparent;
125
+ color: var(--positive);
126
+ border-color: var(--positive-border);
127
+ }
128
+ @media (hover: hover) and (pointer: fine) {
129
+ .btn--positive:hover { background: var(--positive-dim); }
130
+ }
131
+
120
132
  /* --danger: solid danger. Destruktiv action. */
121
133
  .btn--danger {
122
134
  background: var(--bg-danger);
@@ -0,0 +1,84 @@
1
+ /* ================================================================
2
+ components/kv-list.css
3
+ Key-value list - generiskt monster for metadata-rader med
4
+ label till vanster och varde till hoger. Anvands for metric-
5
+ breakdowns, statistik-paneler, settings-summaries.
6
+
7
+ Blocks:
8
+ .kv-list - <ul>-wrapper, nollstaller list-styling
9
+
10
+ Element:
11
+ .kv-list__item - en rad (justify-content: space-between)
12
+ .kv-budget-header - rubrik-rad for budget-expandering
13
+ (compound-block per regel 11)
14
+ .kv-budget-body - expanderat innehall (compound-block)
15
+
16
+ Modifiers (pa .kv-list__item):
17
+ --strong - primary text + medium weight
18
+ --sub - secondary text + smaller font
19
+ --divider - horisontell separator-rad
20
+ --budget - block-display for burndown-rad med expanderbar header
21
+
22
+ Lyft fran Ekonoms ekonom.css LEGACY-sektion i v3.9.0 (Sprint 5,
23
+ MADR 0009). Generaliserade BEM-namn ersatter Ekonoms ursprungliga
24
+ .kv-strong/.kv-sub/.kv-divider/.kv-budget-row klasser.
25
+ ================================================================ */
26
+ .kv-list {
27
+ list-style: none;
28
+ padding: 0;
29
+ margin: 0;
30
+ }
31
+
32
+ .kv-list__item {
33
+ display: flex;
34
+ justify-content: space-between;
35
+ align-items: baseline;
36
+ padding: var(--space-8) 0;
37
+ font-size: var(--fs-13);
38
+ color: var(--text-subtle);
39
+ }
40
+
41
+ .kv-list__item--strong {
42
+ color: var(--text-default);
43
+ font-weight: var(--fw-medium);
44
+ }
45
+
46
+ .kv-list__item--sub {
47
+ font-size: var(--fs-11);
48
+ color: var(--text-subtle);
49
+ }
50
+
51
+ .kv-list__item--divider {
52
+ border-bottom: 1px solid var(--border-subtle);
53
+ padding: 0;
54
+ margin: var(--space-4) 0;
55
+ }
56
+
57
+ .kv-list__item--budget {
58
+ display: block;
59
+ padding: 0;
60
+ }
61
+
62
+ .kv-budget-header {
63
+ display: flex;
64
+ justify-content: space-between;
65
+ align-items: baseline;
66
+ padding: var(--space-8) 0;
67
+ cursor: pointer;
68
+ user-select: none;
69
+ -webkit-tap-highlight-color: transparent;
70
+ touch-action: manipulation;
71
+ }
72
+
73
+ .kv-budget-body {
74
+ padding: var(--space-4) 0 var(--space-8) 0;
75
+ }
76
+
77
+ .kv-budget-body .kv-list__item--sub {
78
+ display: flex;
79
+ justify-content: space-between;
80
+ align-items: baseline;
81
+ font-size: var(--fs-11);
82
+ color: var(--text-subtle);
83
+ padding: var(--space-4) 0;
84
+ }
@@ -9,7 +9,7 @@
9
9
 
10
10
  HTML-relationer:
11
11
  .bottom-nav > .bottom-nav__item (BEM-element)
12
- .topbar > .topbar__back/__title/__action (BEM-element)
12
+ .topbar > .topbar__back/__title/__action/__logo (BEM-element)
13
13
 
14
14
  Modifiers/States:
15
15
  .bottom-nav__item--active - aktiv pod (Sprint F BEM-konvertering)
@@ -176,6 +176,13 @@
176
176
  outline-offset: 2px;
177
177
  }
178
178
 
179
+ .topbar__logo {
180
+ font-size: var(--fs-14);
181
+ font-weight: var(--fw-medium);
182
+ letter-spacing: var(--ls-snug);
183
+ color: var(--text-default);
184
+ }
185
+
179
186
  @media (prefers-reduced-motion: reduce) {
180
187
  .bottom-nav__item:active { transform: none; }
181
188
  }
@@ -0,0 +1,53 @@
1
+ /* ================================================================
2
+ components/offline.css
3
+ Offline-page layout - visas av service worker vid natverksfel.
4
+ Generiskt PWA-monster for alla appar med offline-support.
5
+
6
+ Blocks (compound, alla anvands tillsammans):
7
+ .offline-wrap - centrerad full-page container (min-height 70vh)
8
+ .offline-icon - stor ikon-display (64x64, surface-raised)
9
+ .offline-title - primar rubrik (fs-22, medium)
10
+ .offline-text - beskrivande text (max-width 320px)
11
+
12
+ Lyft fran Ekonoms ekonom.css LEGACY-sektion i v3.9.0 (Sprint 5,
13
+ MADR 0009). Compound-block-monster per regel 11 - alla 4 blocks
14
+ anvands tillsammans pa offline.html.
15
+ ================================================================ */
16
+ .offline-wrap {
17
+ display: flex;
18
+ flex-direction: column;
19
+ align-items: center;
20
+ justify-content: center;
21
+ min-height: 70vh;
22
+ text-align: center;
23
+ padding: var(--space-32) var(--space-20);
24
+ gap: var(--space-16);
25
+ }
26
+
27
+ .offline-icon {
28
+ width: 64px;
29
+ height: 64px;
30
+ background: var(--surface-raised);
31
+ border: 1px solid var(--border-default);
32
+ border-radius: var(--radius-20);
33
+ display: flex;
34
+ align-items: center;
35
+ justify-content: center;
36
+ color: var(--text-subtle);
37
+ margin-bottom: var(--space-8);
38
+ }
39
+
40
+ .offline-title {
41
+ font-size: var(--fs-22);
42
+ font-weight: var(--fw-medium);
43
+ letter-spacing: var(--ls-tight);
44
+ color: var(--text-default);
45
+ }
46
+
47
+ .offline-text {
48
+ font-size: var(--fs-14);
49
+ color: var(--text-subtle);
50
+ max-width: 320px;
51
+ line-height: var(--lh-base);
52
+ margin-bottom: var(--space-8);
53
+ }
package/css/index.css CHANGED
@@ -65,3 +65,7 @@
65
65
 
66
66
  /* v3.5.1 - sheet-content (sprint-65 form-monster, generiska BEM-namn) */
67
67
  @import './components/sheet-content.css';
68
+
69
+ /* v3.9.0 - lyft fran Ekonoms LEGACY-sektion (Sprint 5 MADR 0009) */
70
+ @import './components/kv-list.css';
71
+ @import './components/offline.css';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@klodd/ds",
3
- "version": "3.8.0",
3
+ "version": "3.9.1",
4
4
  "description": "Klodd Design System - shared tokens, typography, components and JS for Jubb, Ekonom, and future apps. v3.5.3 (2026-05-09): tillagg .heading (17px medium tight) i base/typography.css for dialog-titlar och sheet-rubriker. Tackar luckan mellan .heading-2 (18px) och .heading-3 (15px) - matchar Ekonoms gamla .heading-class.",
5
5
  "main": "css/index.css",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  # Komponentkatalog
2
2
 
3
- 35 komponent-filer i `@klodd/ds@3.x`. Alla refererar bara semantic tokens -
3
+ 37 komponent-filer i `@klodd/ds@3.x`. Alla refererar bara semantic tokens -
4
4
  inga primitives. BEM-konvention (block__element--modifier).
5
5
 
6
6
  ## Klassificeringsformat
@@ -19,7 +19,7 @@ För varje entry gäller:
19
19
 
20
20
  ### button (`button.css`)
21
21
  - **Blocks:** `.btn`
22
- - **Modifiers:** `.btn--primary/-secondary/-ghost/-danger`, `.btn--sm/-lg/-icon/-circle`, `.btn--block/-add`, `.btn--loading`
22
+ - **Modifiers:** `.btn--primary/-secondary/-ghost/-positive/-danger`, `.btn--sm/-lg/-icon/-circle`, `.btn--block/-add`, `.btn--loading`
23
23
  - **Anvand:** alla aktioner med tap-target >=44px
24
24
  - **INTE:** Cirkel-link i topbar (anvand `.btn--icon.btn--circle`)
25
25
  - **Tokens:** `--surface-default/-hover/-active`, `--text-default/-on-accent`, `--border-default/-focus`, `--accent-9/-10`, `--bg-danger`, `--touch-min`
@@ -48,8 +48,8 @@ För varje entry gäller:
48
48
  - **Tokens:** `--surface-raised/-overlay/-hover`, `--border-subtle/-default/-focus`
49
49
 
50
50
  ### nav (`nav.css`)
51
- - **Blocks:** `.bottom-nav`, `.topbar`, `.tab-bar`, `.tab` (child av tab-bar)
52
- - **Element:** `.bottom-nav__item`, `.topbar__back`, `.topbar__title`, `.topbar__action`
51
+ - **Blocks:** `.bottom-nav`, `.topbar`
52
+ - **Element:** `.bottom-nav__item`, `.topbar__back`, `.topbar__title`, `.topbar__action`, `.topbar__logo`
53
53
  - **Modifiers:** `.bottom-nav__item--active` (Sprint F BEM-konvertering)
54
54
  - **States:** `.tab.active`
55
55
  - **Anvand:** Mobile bottom-nav (fixed), in-flow topbar, segmented tabs
@@ -162,12 +162,11 @@ För varje entry gäller:
162
162
  - **INTE:** Klickbart kort med rich content (anvand `.hub-card`)
163
163
 
164
164
  ### collapsible (`collapsible.css`)
165
- - **Blocks:** `.collapsible-card`
165
+ - **Blocks:** `.collapsible`
166
166
  - **Element:** `.collapsible__header`, `.collapsible__header-text`, `.collapsible__chev`, `.collapsible__body`
167
- - **States:** `[data-expanded]` pa `.collapsible-card`
167
+ - **States:** `[data-expanded]` pa `.collapsible`
168
168
  - **Anvand:** Panel som expanderar pa klick. JS togglar `data-expanded`
169
169
  - **INTE:** Modal-content (anvand `.dialog` eller `.sheet`)
170
- - **Special:** BEM-stam-mismatch - block heter `.collapsible-card` men element heter `.collapsible__X` (utan `-card`-suffix). Oppen punkt for rename, se sprint-rapport 2026-05-09.
171
170
 
172
171
  ### hbar (`hbar.css`)
173
172
  - **Blocks:** `.hbar`
@@ -221,6 +220,7 @@ För varje entry gäller:
221
220
  ### auth (`auth.css`)
222
221
  - **Blocks:** `.auth-container`
223
222
  - **Element:** `.auth-container__title`, `.auth-container__subtitle`
223
+ - **Modifiers:** `.auth-container--narrow` (max-width 480px, ej full-page-centrerad - for onboarding-vyer)
224
224
  - **Anvand:** Centrerad layout for inloggning + onboarding
225
225
  - **INTE:** Settings-vyer
226
226
 
@@ -271,6 +271,20 @@ För varje entry gäller:
271
271
  - **Tokens:** `--bar-accent` (sattes av app-bindning), `--accent-9` (default)
272
272
  - **Pattern:** Se "Kategori-monstret" nedan
273
273
 
274
+ ### kv-list (`kv-list.css`) - v3.9.0
275
+ - **Blocks:** `.kv-list` (`<ul>`-wrapper)
276
+ - **Element:** `.kv-list__item`, `.kv-budget-header` (compound, klickbar header), `.kv-budget-body` (compound, expanderat innehall)
277
+ - **Modifiers:** `.kv-list__item--strong/-sub/-divider/-budget`
278
+ - **Anvand:** Key-value list for metric-breakdowns, statistik-paneler, settings-summaries
279
+ - **INTE:** List av actions (anvand `.list-row` eller `.setting-row`)
280
+ - **Special:** `.kv-budget-header` + `.kv-budget-body` ar compound-blocks per regel 11 - lyftade fran Ekonoms LEGACY utan rename for att bibehalla template-kompabilitet.
281
+
282
+ ### offline (`offline.css`) - v3.9.0
283
+ - **Blocks (compound):** `.offline-wrap`, `.offline-icon`, `.offline-title`, `.offline-text`
284
+ - **Anvand:** Offline-page layout som SW visar vid natverksfel
285
+ - **INTE:** Inline empty-state i listor (anvand `.empty-state` fran feedback.css)
286
+ - **Special:** Alla 4 blocks anvands tillsammans i offline.html. Compound-block-monster per regel 11.
287
+
274
288
  ### sheet-content (`sheet-content.css`) - v3.5.1
275
289
  - **Blocks:** `.sheet` (kompletterar `.sheet` fran `overlay.css` med innehall-typografi och form-monster)
276
290
  - **Element:** `.sheet__title`, `.sheet__description`, `.sheet__form`, `.sheet__field`, `.sheet__field-label`, `.sheet__hint`, `.sheet__items`, `.sheet__item`, `.sheet__actions`, `.sheet__toggle`, `.sheet__subform`, `.sheet__save`, `.sheet__delete`, `.sheet__handle`, `.sheet__body`, `.sheet__divider` (kompletterande element)
@@ -339,4 +353,4 @@ Jubb, Ekonom, framtida appar foljer samma monster med sina egna tokens.
339
353
  - **`var(--gray-9)` i komponent-CSS.** Komponenter laser bara semantic.
340
354
  - **Egen .button-style.** Anvand `.btn` med modifier istallet.
341
355
  - **`font-weight: 700`.** Anvand `--fw-medium` (500). Display-siffror ar dokumenterat undantag.
342
- - **Anta att alla komponent-filer har ett root-block.** 17 av 35 komponent-filer har flera root-blocks - se regel 11 i `references/03-quality-bar.md`.
356
+ - **Anta att alla komponent-filer har ett root-block.** 17 av 37 komponent-filer har flera root-blocks - se regel 11 i `references/03-quality-bar.md`.
@@ -212,7 +212,7 @@ Varje interaktiv komponent SKA ha:
212
212
 
213
213
  ## 11. En fil kan innehalla flera root-blocks
214
214
 
215
- I 17 av 35 komponent-filer i paketet definieras flera root-blocks i
215
+ I 17 av 37 komponent-filer i paketet definieras flera root-blocks i
216
216
  samma fil (`form.css`, `nav.css`, `chip.css`, `swipe-stack.css`,
217
217
  `feedback.css`, `hub-card.css` m.fl.). Det ar en medveten konvention,
218
218
  inte ett undantag eller teknisk skuld.
@@ -9,8 +9,10 @@ base.html: <script src="/static/js/{bar-styles,hero-roll}.js"> bytt till
9
9
  raderade (app/static/js/bar-styles.js + app/static/js/hero-roll.js).
10
10
  Pytest 636/636.
11
11
 
12
- Jubb status: kvarvarande oppen - kan stangas i samma monster nar Jubb
13
- faktiskt anvander dem (icke-blockande for narvarande).
12
+ **Jubb status (verifierat 2026-05-10):** Jubb har 0 app-egen kopior i
13
+ `app/static/js/`-roten. Bara paket-syncade versioner i `app/static/js/ds/`
14
+ finns (`bar-styles.js`, `hero-roll.js`). Hela MADR 0003 ar nu LOST -
15
+ ingen drift kvar i nagon app.
14
16
 
15
17
  ## Context
16
18
  Bade Jubb och Ekonom har for tillfallet `bar-styles.js` och
@@ -1,8 +1,7 @@
1
1
  # 0004 - Halsomentorn legacy-CSS i Ekonom
2
2
 
3
3
  ## Status
4
- Closed - Halsomentorn arkiverat. `ds/halsomentorn.css` behalls i Ekonom
5
- tills Halsomentorn-projektet eventuellt ateruptas. Ingen action kravs.
4
+ Closed. halsomentorn.css raderad ur Ekonom i Sprint D-1 (2026-05-09). Projektet är arkiverat.
6
5
 
7
6
  ## Context
8
7
  Ekonoms `app/static/css/ds/halsomentorn.css` ar 1783 rader CSS som
@@ -1,7 +1,13 @@
1
1
  # 0009 - ekonom.css LEGACY-sektion cleanup
2
2
 
3
3
  ## Status
4
- Pending, medel prioritet.
4
+ Closed 2026-05-10 i Sprint 5 via @klodd/ds 3.9.0. Fem klasser/family lyfta
5
+ till paketet (`.topbar__logo` i nav.css, ny `kv-list.css` med BEM-element,
6
+ ny `offline.css` med compound-blocks, `.auth-container--narrow`-modifier
7
+ i auth.css, `.btn--positive`-variant i button.css). Fyra klasser stannar
8
+ i Ekonoms `ekonom.css` LEGACY-sektion: `.btn-copy/.btn-bank`,
9
+ `.bank-row-icon`, `.profile-panel-centered`, `.rule-arrow/.rule-cat` -
10
+ alla Ekonom-specifika utan generisk paket-anvandning.
5
11
 
6
12
  ## Context
7
13
 
@@ -1,7 +1,7 @@
1
- # 0007 - .banner-body migration i sync_result.html
1
+ # 0010 - .banner-body migration i sync_result.html
2
2
 
3
3
  ## Status
4
- Pending, låg prioritet.
4
+ Closed 2026-05-10 via mekanisk substitution. Ekonom-commit [5d5b273](https://github.com/drawn124578/ekonom/commit/5d5b273).
5
5
 
6
6
  ## Context
7
7
 
@@ -1,7 +1,7 @@
1
- # 0008 - .hbar-* dash → BEM-migration i Ekonom
1
+ # 0011 - .hbar-* dash → BEM-migration i Ekonom
2
2
 
3
3
  ## Status
4
- Pending, låg prioritet.
4
+ Closed 2026-05-10 via mekanisk substitution + radering av dash-form-definitioner i ekonom.css CHARTS-sektion (37 rader). Ekonom-commit [5d5b273](https://github.com/drawn124578/ekonom/commit/5d5b273).
5
5
 
6
6
  ## Context
7
7
 
@@ -0,0 +1,19 @@
1
+ # 0012 - Maskable PWA-ikoner
2
+
3
+ ## Status
4
+ Pending.
5
+
6
+ ## Context
7
+ Jubb och Ekonom har PWA-ikoner men saknar maskable-varianter med
8
+ safe-zone-padding. Utan maskable-ikoner riskerar ikonen att klippas
9
+ på Android-enheter med adaptiva ikoner.
10
+
11
+ SVG-källfiler är klara. Bakgrundsfärg ska vara steg 3 av respektive
12
+ apps accent-ramp (--accent-3: Blue-3 för Jubb, Plum-3 för Ekonom).
13
+
14
+ ## Återstår
15
+ - PNG-export med safe-zone-padding (72px ikon i 108px canvas)
16
+ - purpose="maskable" i web manifest för båda appar
17
+
18
+ ## Beroenden
19
+ Kräver designer-export. Inte en CC-uppgift förrän PNG-filer levereras.
@@ -0,0 +1,84 @@
1
+ # 0013 - Jubb kv-list template-migration
2
+
3
+ ## Status
4
+ Pending.
5
+
6
+ ## Context
7
+ Sprint 5 (3.9.0, MADR 0009) lyfte kv-list till @klodd/ds som BEM-
8
+ komponent (.kv-list, .kv-list__item, .kv-list__item--strong/-sub/
9
+ -divider/-budget). Ekonom-templates migrerades samtidigt.
10
+
11
+ Jubb fick inte motsvarande migration. Jubbs jubb.css behåller en
12
+ flat-namnskonvention (.kv-row, .kv-key, .kv-value) som 5 templates
13
+ beror på via 10 separata `<ul class="kv-list">`-instanser med ~40
14
+ individuella .kv-row/.kv-key/.kv-value-träffar:
15
+ - runs.html (2 listor)
16
+ - job_detail.html (1 lista)
17
+ - dashboard.html (1 lista)
18
+ - insights.html (4 listor)
19
+ - jobs_list.html (2 listor)
20
+
21
+ ## API-mismatch
22
+
23
+ Templates använder:
24
+
25
+ ```html
26
+ <ul class="kv-list">
27
+ <li class="kv-row">
28
+ <span class="kv-key">label</span>
29
+ <span class="kv-value">value</span>
30
+ </li>
31
+ </ul>
32
+ ```
33
+
34
+ Paketets API (kv-list.css 3.9.0):
35
+
36
+ ```html
37
+ <ul class="kv-list">
38
+ <li class="kv-list__item">
39
+ label
40
+ value
41
+ </li>
42
+ </ul>
43
+ ```
44
+
45
+ Paketets .kv-list__item har display: flex + justify-content:
46
+ space-between direkt på li-en. Två children placeras på vänster
47
+ och höger utan wrapper-spans. Jubbs nuvarande .kv-value bidrar
48
+ med color: var(--text-default), font-variant-numeric: tabular-nums
49
+ och inline-flex med gap som behöver återskapas i ny layout (möjliga
50
+ vägar: ny .kv-list__item--num-modifier i paketet, eller behåll en
51
+ lättviktig .kv-value-utility i Jubb).
52
+
53
+ ## Återstår
54
+
55
+ - HTML-migration i 5 templates: `<li class="kv-row">` blir
56
+ `<li class="kv-list__item">`
57
+ - Bedömning per template: droppa .kv-key/.kv-value-spans, eller
58
+ behåll dem för tabular-nums/color
59
+ - Visuell verifiering per vy efter migration (runs, job_detail,
60
+ dashboard, insights, jobs_list)
61
+ - Tester: kontrollera om pytest-asserts refererar kv-row/-key/-value
62
+ - Slutsteg: radera Jubbs lokala .kv-list, .kv-list li, .kv-row,
63
+ .kv-key, .kv-value ur jubb.css
64
+
65
+ ## Beroenden
66
+
67
+ - Visuell verifiering per vy via Chrome MCP eller dev-server
68
+ - Tester kan kräva uppdatering om kv-* selectors finns i pytest-asserts
69
+
70
+ ## Avvisade alternativ
71
+
72
+ Option C (lyft .kv-row/.kv-key/.kv-value till paketet som alias för
73
+ flat-konvention): avvisad per ADR 0009 (no-flat-components-css).
74
+ Sprint 5 MADR 0009 etablerade att Ekonoms ursprungliga flat-namn
75
+ ersätts med generaliserade BEM-namn (.kv-list__item) i paketet. Att
76
+ åter-introducera flat-namn skulle åter-öppna ADR 0009 utan ny
77
+ arkitektonisk motivering.
78
+
79
+ ## Sprint 6-leverabel
80
+
81
+ Sprint 6 fas 4 raderar dead kv-delar (.kv-list li.kv-strong/-sub/
82
+ -divider/-budget-row, .kv-budget-header, .kv-budget-body - 0
83
+ template-träffar) men behåller .kv-list, .kv-list li, .kv-row,
84
+ .kv-key, .kv-value tills denna MADR genomförs.