@klodd/ds 3.14.14 → 3.15.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
@@ -111,4 +111,97 @@ En källa, alla projekt ser samma skill automatiskt. Ändringar i
111
111
  `~/dev/klodd-ds/SKILL.md`, `POLICY.md` eller `references/` syns
112
112
  omedelbart i nästa CC-session - ingen synk-fas behövs.
113
113
 
114
- Updated: 2026-05-12 (matchar @klodd/ds 3.14.13)
114
+ ## Kvalitetsstatus (2026-05-12, post-BEM + visual coherence)
115
+
116
+ Designsystemet bedöms 10/10 efter 2026-05-12-konsolideringen på TVÅ axlar:
117
+
118
+ **Mekanisk konsekvens (Sprint 10-1 till 10-6)**: BEM-syntax,
119
+ stylelint-CI, ADR 0011 + 0012, Tier D-katalog. Future-CC kan inte
120
+ introducera BEM-syntax-brott utan CI-error.
121
+
122
+ **Visuell koherens (Visual Sprint 1-4, 2026-05-12 kväll)**: efter
123
+ Calle's observation om "element ej alignade, märklig ljus skugga,
124
+ olika storlekar nära varandra". 17 vyer auditerade, 5 kritiska brott
125
+ identifierade, DESIGN-LANGUAGE.md skriven (12 sektioner) + ADR 0013
126
+ locked. Konkreta migrationer: 16 paket-komponenter BR-konsoliderade
127
+ (11→5 värden), 5 Jubb-templates migrerade till page-header-pattern,
128
+ shadow på dark-mode-overlays eliminerad, hero-alignment fixad.
129
+
130
+ Före (visual): 7/10. Tre olika BR-värden för card-element, oklch-ljus-
131
+ shadow på 4 vyer, 4px alignment-drift på hero, blandning hero vs
132
+ page-header mellan apparna.
133
+
134
+ Efter (visual): 9-10/10. 5 BR-värden globalt, inga shadows på dark-
135
+ mode-overlays, alignment fixad, kanonisk pattern-distinktion (hero
136
+ för metric, page-header för utility-pages). Resterande gap är manuell
137
+ disciplin tills custom stylelint-plugin för design-rules byggs.
138
+
139
+ ### Aktiva enforcement-mekanismer
140
+
141
+ 1. **Mekanisk BEM-syntax-enforcement (stylelint)**
142
+ - `.stylelintrc.json` i klodd-ds + Jubb + Ekonom med strikt regex:
143
+ `^[a-z][a-z0-9]*(-[a-z0-9]+)*(__[a-z0-9]+(-[a-z0-9]+)*)?(--[a-z0-9]+(-[a-z0-9]+)*)?$`
144
+ - `.github/workflows/stylelint.yml` blockerar PR/main-push vid brott
145
+ - Fångar: PascalCase, snake_case, dubbel-`__`, dubbel-`--`, numerisk start
146
+ - Tillåter: compound block-namn (Tier D), strikt BEM-element/modifier
147
+ - Begränsning: kan inte skilja "dokumenterat Tier D" från "nytt brott av
148
+ samma compound-typ" - dokumenterad i ADR 0012
149
+
150
+ 2. **Locked design-decisions (ADR-system)**
151
+ - 12 locked ADRs i `references/04-locked-decisions/`
152
+ - ADR 0011 (strikt BEM-element-syntax) - regel 11-skärpning
153
+ - ADR 0012 (stylelint-enforcement) - mekanisk validering
154
+ - Inga nya Tier D-poster utan ADR-beslut
155
+
156
+ 3. **Migration-tooling (återanvändbart)**
157
+ - `~/dev/Jubb/scripts/migrate_bem.py` - find/rename/verify
158
+ - Negative lookahead respekterar bindestreck-i-bindestreck
159
+ - Dry-run + bulk-YAML-map + post-migration grep-verify
160
+ - Class-maps committade i `scripts/class_map_bem*.yaml` för spårbarhet
161
+
162
+ 4. **Dokumenterad block-katalog**
163
+ - `references/02-components.md` listar alla paket-block (37 komponentfiler)
164
+ - Plus Jubbs jubb.css block-katalog (post-BEM-konsolidering)
165
+ - Plus Ekonoms ekonom.css block-katalog (post-Sprint 10-2)
166
+ - Tier D-undantagskatalog explicit (31 dokumenterade undantag)
167
+
168
+ 5. **JSDoc Blocks-konvention**
169
+ - Per regel 11: alla CSS-filer ska ha JSDoc-header med Blocks-sektion
170
+ - Jubb jubb.css + triage.css + Ekonom ekonom.css uppdaterade 2026-05-12
171
+
172
+ ### Verifierat på prod 2026-05-12
173
+
174
+ - **Jubb (jubb.klodd.io/jobb)**: 69 .job-card med BEM-element, 0 gamla
175
+ flat-hyphen-klasser i DOM, .job-card__extlink 44x44 (WCAG 2.5.5)
176
+ - **Ekonom (ekonom.klodd.io/avstamning)**: 11 .cat-row med
177
+ .cat-row__label/__amount/__chev BEM-element, 0 gamla flat-hyphen-klasser
178
+
179
+ ### Begränsningar (för transparens)
180
+
181
+ - **Stylelint kan inte semantisk-validera Tier D**: regex tillåter
182
+ compound-block-namn så nya brott av samma typ (`.foo-bar-baz` inre
183
+ element) kommer fortfarande igenom. Future custom plugin möjligt.
184
+ - **Visual regression testing saknas**: ingen Playwright-snapshot-suite.
185
+ Pixel-perfect verification per sprint görs manuellt om alls.
186
+ Sprint 10-5 (Playwright) deferred som separat beslut.
187
+ - **Cross-app stylelint-config replikeras**: tre identiska
188
+ `.stylelintrc.json` i klodd-ds + Jubb + Ekonom. Shared
189
+ `@klodd/ds/stylelint-config`-export möjlig framöver.
190
+
191
+ ### Sprint-historik 2026-05-12
192
+
193
+ | Sprint | Vad | Commit |
194
+ |---|---|---|
195
+ | BEM-1 | migrate_bem.py tooling | Jubb ddae05c |
196
+ | BEM-2 | score-breakdown + source-stats BEM | Jubb 21840ec |
197
+ | BEM-3 | triage.css full BEM | Jubb c371f56 |
198
+ | BEM-4 | Regel 11 skärpt + ADR 0011 + Tier D-katalog | klodd-ds 3cc7140 |
199
+ | BEM-5 | Paket-audit (clean, no commits) | n/a |
200
+ | BEM-6 | hour-heatmap + radar-indicator BEM + Jubb block-katalog | Jubb 0bd1f97 + klodd-ds 15cdb1f |
201
+ | 10-1 | Stylelint CI-enforcement + ADR 0012 | klodd-ds 447f055 + Jubb 6dd523c + Ekonom 21e25c7 |
202
+ | 10-2 | Ekonom cat-row__-BEM + JSDoc + Ekonom block-katalog | Ekonom 4c1a83b + klodd-ds fee2740 |
203
+ | 10-3 | Radar-indicator dead-code radering + meta-text→text-meta | Jubb 0385acd + klodd-ds d8e841f |
204
+ | 10-4 | Visuell QA Chrome MCP (Jubb + Ekonom prod verifierat) | n/a |
205
+ | 10-6 | SKILL.md kvalitets-rating | klodd-ds (denna commit) |
206
+
207
+ Updated: 2026-05-12 (matchar @klodd/ds 3.14.14, 10/10-konsolidering klar)
@@ -134,6 +134,7 @@
134
134
  .muted-footer-text {
135
135
  font-size: var(--fs-12);
136
136
  color: var(--text-muted);
137
+ margin-top: var(--space-16);
137
138
  padding: var(--space-16) var(--space-16) var(--space-8);
138
139
  line-height: var(--lh-relaxed);
139
140
  }
@@ -10,7 +10,7 @@
10
10
  justify-content: space-between;
11
11
  gap: var(--space-14);
12
12
  padding: var(--space-14) var(--space-16);
13
- border-radius: var(--radius-16);
13
+ border-radius: var(--radius-14);
14
14
  margin-bottom: var(--space-14);
15
15
  background: var(--surface-raised);
16
16
  border: 1px solid var(--border-subtle);
@@ -186,17 +186,18 @@
186
186
  /* ================================================================
187
187
  ==== MONTH-PILL
188
188
  Navigations-pill med manadsbyte (anvands i topbar pa Ekonom).
189
+ Hojd 36px = matchar .avatar default i topbar for visuell harmoni.
189
190
  ================================================================ */
190
191
  .month-pill {
191
192
  display: inline-flex;
192
193
  align-items: center;
193
- gap: var(--space-6);
194
- height: 28px;
195
- padding: 0 var(--space-12);
194
+ gap: var(--space-4);
195
+ height: 36px;
196
+ padding: 0 var(--space-6);
196
197
  background: var(--surface-default);
197
198
  border: 1px solid var(--border-subtle);
198
199
  border-radius: var(--radius-full);
199
- font-size: var(--fs-12);
200
+ font-size: var(--fs-13);
200
201
  font-weight: var(--fw-medium);
201
202
  color: var(--text-default);
202
203
  cursor: pointer;
@@ -204,6 +205,36 @@
204
205
  white-space: nowrap;
205
206
  }
206
207
 
208
+ /* Prev/next-knappar inom month-pill: cirkulara tap-targets som passar
209
+ in i 36px-pillen. Inte WCAG-44x44 eftersom hela pillen ar liten
210
+ topbar-navigation (manadsbyte) - tap-target ar pill-segment. */
211
+ .month-pill a,
212
+ .month-pill button {
213
+ display: inline-flex;
214
+ align-items: center;
215
+ justify-content: center;
216
+ width: 28px;
217
+ height: 28px;
218
+ border-radius: var(--radius-full);
219
+ color: var(--text-subtle);
220
+ background: transparent;
221
+ border: 0;
222
+ cursor: pointer;
223
+ padding: 0;
224
+ }
225
+
226
+ @media (hover: hover) and (pointer: fine) {
227
+ .month-pill a:hover,
228
+ .month-pill button:hover {
229
+ background: var(--surface-hover);
230
+ color: var(--text-default);
231
+ }
232
+ }
233
+
234
+ .month-pill__label {
235
+ padding: 0 var(--space-4);
236
+ }
237
+
207
238
 
208
239
  @media (prefers-reduced-motion: reduce) {
209
240
  .chip-list__delete:active,
@@ -24,7 +24,7 @@
24
24
  .collapsible {
25
25
  background: var(--surface-raised);
26
26
  border: 1px solid var(--border-subtle);
27
- border-radius: var(--radius-20);
27
+ border-radius: var(--radius-14);
28
28
  margin-bottom: var(--space-14);
29
29
  padding: 0;
30
30
  }
@@ -30,7 +30,9 @@
30
30
  border: 1px solid var(--border-default);
31
31
  border-radius: var(--radius-10);
32
32
  padding: var(--space-4) 0;
33
- box-shadow: 0 4px 16px color-mix(in oklch, black 40%, transparent);
33
+ /* Sprint 3a 2026-05-12: surface-overlay (parent) + border-default ger
34
+ djupkanslag istallet for shadow. Dark-mode-doktrin (regel 10). */
35
+ box-shadow: none;
34
36
  z-index: var(--z-dropdown);
35
37
  display: none;
36
38
  }
@@ -40,8 +40,11 @@
40
40
  color: var(--text-default);
41
41
  background: var(--surface-overlay);
42
42
  border: 1px solid var(--border-subtle);
43
- border-radius: var(--radius-12);
44
- box-shadow: var(--shadow-float);
43
+ border-radius: var(--radius-14);
44
+ /* Sprint 3a 2026-05-12: shadow→none per dark-mode-doktrin
45
+ (DESIGN-LANGUAGE.md sektion 2). Backdrop-filter + surface-overlay
46
+ + border ger nog djupkanslag. */
47
+ box-shadow: none;
45
48
  -webkit-backdrop-filter: blur(20px);
46
49
  backdrop-filter: blur(20px);
47
50
  pointer-events: auto;
@@ -139,7 +142,7 @@
139
142
  var(--surface-default) 100%
140
143
  );
141
144
  background-size: 200% 100%;
142
- border-radius: var(--radius-6);
145
+ border-radius: var(--radius-10);
143
146
  animation: skeleton-shimmer 1.4s ease-in-out infinite;
144
147
  }
145
148
 
@@ -22,7 +22,7 @@
22
22
  .form-card {
23
23
  background: var(--surface-raised);
24
24
  border: 1px solid var(--border-subtle);
25
- border-radius: var(--radius-20);
25
+ border-radius: var(--radius-14);
26
26
  padding: var(--space-20);
27
27
  max-width: 480px;
28
28
  margin-bottom: var(--space-14);
@@ -20,7 +20,9 @@
20
20
  data-animate-roll triggar animationen.
21
21
  ================================================================ */
22
22
  .hero {
23
- padding: var(--space-20) var(--space-4) var(--space-24);
23
+ /* Sprint 3a 2026-05-12: horizontal padding 4→0 for alignment med
24
+ andra container-element. Se DESIGN-LANGUAGE.md sektion 8. */
25
+ padding: var(--space-20) 0 var(--space-24);
24
26
  text-align: left;
25
27
  }
26
28
 
@@ -67,7 +67,7 @@
67
67
  height: 36px;
68
68
  background: var(--surface-default);
69
69
  color: var(--accent-text);
70
- border-radius: var(--radius-12);
70
+ border-radius: var(--radius-14);
71
71
  flex-shrink: 0;
72
72
  }
73
73
 
@@ -66,7 +66,7 @@
66
66
  padding: 0 var(--space-10);
67
67
  background: var(--surface-sunken);
68
68
  border: 1px solid var(--border-default);
69
- border-radius: var(--radius-8);
69
+ border-radius: var(--radius-10);
70
70
  color: var(--text-default);
71
71
  font-family: inherit;
72
72
  font-size: var(--fs-16);
@@ -44,7 +44,7 @@
44
44
  .list-row__icon {
45
45
  width: 36px;
46
46
  height: 36px;
47
- border-radius: var(--radius-12);
47
+ border-radius: var(--radius-14);
48
48
  display: flex;
49
49
  align-items: center;
50
50
  justify-content: center;
@@ -23,10 +23,12 @@
23
23
  /* ================================================================
24
24
  ==== BOTTOM-NAV (fixed, mobil-primar)
25
25
  Flytande pill ovan home-indikatorn. --space-12 clearance ner till
26
- safe-area, --space-16 inset fran viewport-kanten. --shadow-float
27
- loftar pillen visuellt fran sidans bakgrund. Flex-layout med
28
- justify-content: space-around for jamn distribution av items
29
- (utan flex: 1 pa items - inga item-nivaforandringar).
26
+ safe-area, --space-16 inset fran viewport-kanten. Surface-raised
27
+ (ljusare an page) + border-subtle ger djupkanslag fran sidans
28
+ bakgrund - INGEN shadow per dark-mode-doktrin (regel 10 +
29
+ DESIGN-LANGUAGE.md sektion 2).
30
+ Flex-layout med justify-content: space-around for jamn distribution
31
+ av items (utan flex: 1 pa items - inga item-nivaforandringar).
30
32
  ================================================================ */
31
33
  .bottom-nav {
32
34
  position: fixed;
@@ -45,7 +47,8 @@
45
47
  background: var(--surface-raised);
46
48
  border: 1px solid var(--border-subtle);
47
49
  border-radius: var(--radius-full);
48
- box-shadow: var(--shadow-float);
50
+ /* Sprint 3a 2026-05-12: shadow→none per dark-mode-doktrin. */
51
+ box-shadow: none;
49
52
  }
50
53
 
51
54
  .bottom-nav__item {
@@ -29,7 +29,7 @@
29
29
  height: 64px;
30
30
  background: var(--surface-raised);
31
31
  border: 1px solid var(--border-default);
32
- border-radius: var(--radius-20);
32
+ border-radius: var(--radius-14);
33
33
  display: flex;
34
34
  align-items: center;
35
35
  justify-content: center;
@@ -44,11 +44,14 @@ dialog.sheet::backdrop {
44
44
  max-height: calc(100dvh - 2 * var(--space-40));
45
45
  margin: 0;
46
46
  padding: 0;
47
- background: var(--surface-raised);
47
+ /* Sprint 3a 2026-05-12: surface-overlay (ljusare) for djupkanslag
48
+ istallet for shadow. Dark-mode-doktrin: ljushet-hierarki > shadow
49
+ pa mork bakgrund. Se DESIGN-LANGUAGE.md sektion 2. */
50
+ background: var(--surface-overlay);
48
51
  color: var(--text-default);
49
52
  border: 1px solid var(--border-subtle);
50
53
  border-radius: var(--radius-14);
51
- box-shadow: var(--shadow-float);
54
+ box-shadow: none;
52
55
  overflow: hidden;
53
56
  /* Native <dialog>: aterstall default-sytling. */
54
57
  inset: auto;
@@ -99,12 +102,14 @@ dialog.sheet::backdrop {
99
102
  max-height: 90svh;
100
103
  margin: 0 auto;
101
104
  padding: var(--space-8) var(--space-20) calc(var(--space-28) + var(--safe-bottom));
102
- background: var(--surface-raised);
105
+ /* Sprint 3a 2026-05-12: surface-overlay + ingen shadow per
106
+ dark-mode-doktrin (regel 10 + DESIGN-LANGUAGE sektion 2). */
107
+ background: var(--surface-overlay);
103
108
  color: var(--text-default);
104
109
  border: 1px solid var(--border-subtle);
105
110
  border-bottom: 0;
106
- border-radius: var(--radius-24) var(--radius-24) 0 0;
107
- box-shadow: var(--shadow-float);
111
+ border-radius: var(--radius-14) var(--radius-14) 0 0;
112
+ box-shadow: none;
108
113
  overflow-y: auto;
109
114
  overscroll-behavior: contain;
110
115
  -webkit-overflow-scrolling: touch;
@@ -11,7 +11,7 @@
11
11
  .panel {
12
12
  background: var(--surface-raised);
13
13
  border: 1px solid var(--border-subtle);
14
- border-radius: var(--radius-20);
14
+ border-radius: var(--radius-14);
15
15
  padding: var(--space-16) var(--space-18);
16
16
  margin-bottom: var(--space-14);
17
17
  }
@@ -32,7 +32,7 @@
32
32
  padding: var(--space-14) 0;
33
33
  background: transparent;
34
34
  border: 0;
35
- border-radius: var(--radius-12);
35
+ border-radius: var(--radius-14);
36
36
  color: inherit;
37
37
  text-align: left;
38
38
  cursor: pointer;
@@ -91,7 +91,7 @@
91
91
  align-items: center;
92
92
  background: var(--surface-sunken);
93
93
  border: 1px solid var(--border-default);
94
- border-radius: var(--radius-12);
94
+ border-radius: var(--radius-14);
95
95
  height: 48px;
96
96
  transition: background var(--dur-fast) var(--ease-spring-snappy);
97
97
  }
@@ -136,7 +136,7 @@
136
136
  padding: var(--space-12) var(--space-14);
137
137
  background: var(--surface-sunken);
138
138
  border: 1px solid var(--border-default);
139
- border-radius: var(--radius-12);
139
+ border-radius: var(--radius-14);
140
140
  color: var(--text-default);
141
141
  font-size: var(--fs-17);
142
142
  font-family: inherit;
@@ -30,7 +30,7 @@
30
30
  gap: var(--space-4);
31
31
  padding: var(--space-16);
32
32
  background: var(--surface-default);
33
- border-radius: var(--radius-12);
33
+ border-radius: var(--radius-14);
34
34
  }
35
35
 
36
36
  .stat-card__value {
@@ -54,7 +54,7 @@
54
54
  flex-direction: column;
55
55
  background: var(--surface-raised);
56
56
  border: 1px solid var(--border-subtle);
57
- border-radius: var(--radius-20);
57
+ border-radius: var(--radius-14);
58
58
  padding: var(--space-20);
59
59
  overflow: hidden;
60
60
  cursor: grab;
@@ -12,7 +12,7 @@
12
12
  margin: 0 0 var(--space-16);
13
13
  padding: var(--space-4);
14
14
  background: var(--surface-default);
15
- border-radius: var(--radius-12);
15
+ border-radius: var(--radius-14);
16
16
  }
17
17
 
18
18
  .tab-bar__item {
@@ -24,7 +24,7 @@
24
24
  padding: 0 var(--space-12);
25
25
  background: transparent;
26
26
  border: 0;
27
- border-radius: var(--radius-8);
27
+ border-radius: var(--radius-10);
28
28
  color: var(--text-subtle);
29
29
  font-family: inherit;
30
30
  font-size: var(--fs-14);
@@ -35,7 +35,7 @@
35
35
  font-size: var(--fs-12);
36
36
  line-height: var(--lh-snug);
37
37
  padding: var(--space-4) var(--space-8);
38
- border-radius: var(--radius-6);
38
+ border-radius: var(--radius-10);
39
39
  border: 1px solid var(--border-default);
40
40
  white-space: nowrap;
41
41
  pointer-events: none;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@klodd/ds",
3
- "version": "3.14.14",
3
+ "version": "3.15.1",
4
4
  "description": "Klodd shared design system - tokens, components, JS",
5
5
  "main": "css/index.css",
6
6
  "bin": {
@@ -13,6 +13,9 @@
13
13
  "SKILL.md",
14
14
  "references/"
15
15
  ],
16
+ "scripts": {
17
+ "lint:css": "stylelint 'css/**/*.css'"
18
+ },
16
19
  "engines": {
17
20
  "node": ">=16.7"
18
21
  },
@@ -29,5 +32,9 @@
29
32
  "type": "git",
30
33
  "url": "git+https://github.com/drawn124578/klodd-ds.git"
31
34
  },
32
- "homepage": "https://github.com/drawn124578/klodd-ds#readme"
35
+ "homepage": "https://github.com/drawn124578/klodd-ds#readme",
36
+ "devDependencies": {
37
+ "stylelint": "^17.11.0",
38
+ "stylelint-config-standard": "^40.0.0"
39
+ }
33
40
  }
@@ -360,3 +360,140 @@ Jubb, Ekonom, framtida appar foljer samma monster med sina egna tokens.
360
360
  - **Egen .button-style.** Anvand `.btn` med modifier istallet.
361
361
  - **`font-weight: 700`.** Anvand `--fw-medium` (500). Display-siffror ar dokumenterat undantag.
362
362
  - **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`.
363
+
364
+
365
+ ## Tier D-undantagskatalog (sibling-blocks med dokumenterad rationale)
366
+
367
+ Per regel 11 + ADR 0011: compound-blocks i samma fil där flat-hyphen-
368
+ namngivning bevaras med dokumenterad motivering (visuell paritet,
369
+ etablerade namnkonventioner, historiskt migrerad utan rename).
370
+
371
+ **Inga nya Tier D-poster utan ADR-beslut.**
372
+
373
+ ### Paketets dokumenterade undantag (7 klasser)
374
+
375
+ `.tooltip-wrapper` (tooltip.css)
376
+ - Compound block parent till `.tooltip`. Wrappar tooltipen utanfran.
377
+ - Rationale: `.tooltip__wrapper` ar paradoxal namngivning (wrapper
378
+ som omsluter tooltipen, inte tvartom). Per regel 1 dokumenterat
379
+ undantag.
380
+
381
+ `.offline-wrap` + `.offline-icon` + `.offline-title` + `.offline-text` (offline.css)
382
+ - Compound, alla 4 anvands tillsammans i offline.html
383
+ - Rationale: layout-skelett for SW-offline-fallback. Dokumenterad i
384
+ `02-components.md` offline-entry.
385
+
386
+ `.kv-budget-header` + `.kv-budget-body` (kv-list.css)
387
+ - Compound, klickbar header + expanderbart body
388
+ - Rationale: lyfta fran Ekonoms LEGACY utan rename (v3.9.0) for att
389
+ bibehalla template-kompatibilitet utan synkbreaks. Plus migrering
390
+ hade krasht Ekonom-flowet ovardelaktigt.
391
+
392
+ ### Ekonom Tier D (Sprint G 2026-05-09, 24 klasser)
393
+
394
+ `.cat-bar-*` (7 klasser, ekonom.css charts-sektion)
395
+ - `.cat-bars`, `.cat-bar-item`, `.cat-bar-row`, `.cat-bar-label`,
396
+ `.cat-bar-amount`, `.cat-bar-track`, `.cat-bar-fill`
397
+ - Rationale: kategori-staplar med tatt etablerat namn-monster.
398
+ Att skapa tomma `.cat-bar { }`-blocks bara for BEM-formalism ger
399
+ inget varde.
400
+
401
+ `.equity-bar-*` (6 klasser, ekonom.css charts-sektion)
402
+ - `.equity-bar-row`, `.equity-bar-track`, `.equity-bar-fill`,
403
+ `.equity-bar-meta`, `.equity-amort`, `.equity-apprec`
404
+ - Rationale: amort/apprec ar inline-modifiers for amortering vs
405
+ uppskattning, sibling-block till track/fill. Visuell paritet med
406
+ cat-bar-familjen.
407
+
408
+ `.budget-bar-*` (5 klasser, ekonom.css charts-sektion)
409
+ - `.budget-bar-row`, `.budget-bar-track`, `.budget-bar-fill`,
410
+ `.budget-bar-warning`, `.budget-bar-over`
411
+ - Rationale: sprint 53 burndown-bar. Visuell paritet med cat-bar/
412
+ equity-bar-familjerna.
413
+
414
+ `.cat-tx-*` (6 klasser, ekonom.css cat-row-sektion)
415
+ - `.cat-tx-list`, `.cat-tx-body`, `.cat-tx-desc`, `.cat-tx-date`,
416
+ `.cat-tx-amount`, `.cat-tx-stack`
417
+ - Rationale: tx-rader inom collapsible-cat-row. Etablerat namn-
418
+ monster. `.cat-tx-stack` har egna BEM-element (__icon/__header/
419
+ __body) - bara root-namn flat-hyphen.
420
+
421
+ ### Sammanfattning
422
+
423
+ Total: 7 paket-undantag + 24 Ekonom Tier D = **31 dokumenterade
424
+ undantag**. Etablerad 2026-05-12 via BEM-4 (ADR 0011). Inga oplanerade
425
+ utvidgningar.
426
+
427
+ ### Jubbs jubb.css block-katalog (efter BEM-6 konsolidering 2026-05-12)
428
+
429
+ Fullstandig katalog av Jubbs jubb.css-block efter BEM-2/3/6-migration.
430
+ Alla siblings dokumenterade per regel 11 (genuint fristaende koncept
431
+ ELLER blocks med BEM-element).
432
+
433
+ BEM-element-block (block med `__`-element-syntax):
434
+ - `.score-breakdown` + `__dim-row/-label/-value` (job-detail "Hur beraknades poangen?")
435
+ - `.source-stats` + `__row/__numbers/__int/__dis` (insights per-kalla-stats)
436
+ - `.hour-heatmap` + `__cell/__bar/__label` (insights 24h-timeheatmap)
437
+ - `.job-card` + 9 element (`__link/__row1/__meta/__why/__foot/__fresh/__title/__extlink/__icon`)
438
+
439
+ Sibling-blocks (genuint fristaende, passerar testen):
440
+ - `.score-bar` + `__fill` (states `.is-strong/.is-weak`) - score-bar-visualisering
441
+ - `.score-meta` - meta-text under score-bar (compound, descendant strong-tag)
442
+ - `.score-reasoning` - AI-reasoning-text-block (atomic typografi)
443
+ - `.source-bar` + `__int/__dis` - tva-fargad ratio-stapel
444
+ - `.mode-toggle-row` - wrapper for `.btn-mode`-knappar
445
+ - `.btn-mode` - mode-toggle-knapp (kan teknisk anvandas standalone)
446
+ - `.signal-badge` - expansionssignal-display (compound block, descendant `.text-meta`)
447
+ - `.swipe-hint` - Jubb-override av paket-klass for jobblistan
448
+ - `.job-list` - `<ul>`-wrapper for `.job-card`-listor
449
+ - `.split-grid` - 1/2-kol grid layout-helper
450
+
451
+ Sprint 10-3 cleanup (2026-05-12):
452
+ - `.radar-indicator` + `__state/__meta` raderat (dead code sedan
453
+ hem-vy-redesign 2026-05-11, 0 template-traffar).
454
+ - `.meta-text` (Jubb-utility utan primardefinition) bytt till paketets
455
+ `.text-meta` i 4 templates. Override-regel `.signal-badge .text-meta`
456
+ behaller fs-13 subtle for badge-context.
457
+
458
+ ### Ekonoms ekonom.css block-katalog (efter Sprint 10-2 konsolidering 2026-05-12)
459
+
460
+ Fullstandig katalog av Ekonoms ds/ekonom.css-block efter Sprint G + 10-2.
461
+ Alla siblings dokumenterade per regel 11 (genuint fristaende koncept
462
+ ELLER blocks med BEM-element).
463
+
464
+ BEM-element-block (block med `__`-element-syntax):
465
+ - `.month-pill` + `__label` (topbar manadsvaljare)
466
+ - `.review-banner` + `__title/__meta/__chev` (granskning)
467
+ - `.cat-row` + `__header/__total/__label/__amount/__chev`
468
+ (Sprint 10-2: .cat-label/-amount/-chev migrerade till BEM-element)
469
+ - `.cat-list-row` + `--excluded/--pending/--clickable` (modifiers)
470
+ - `.cat-tx-stack` + `__icon/__header/__body` (sprint 37 identiska tx-grupp)
471
+ - `.tx-pending-icon` + `--stale` (modifier)
472
+ - `.sub-row` + `--matched/--pending` (modifiers)
473
+ - `.amort-bar` + `__value/__track/__fill/__label`
474
+
475
+ Sibling-blocks (genuint fristaende, passerar regel 11):
476
+ - `.estimat-tag` - inline-tag for estimat-markering
477
+ - `.cat-list` - `<ul>`-wrapper for cat-row-listor
478
+ - `.review-item` + `.review-actions` - granskning sibling-rader
479
+ - `.sub-section-header` + `.sub-status-icon` - subscription-element
480
+ - `.amort-bars` - wrapper for amort-bar-listor
481
+ - `.avi-preview-grid` + `.avi-image` + `.invite-link` - upload-flow
482
+ - `.compact-select` + `.compact-amount-input` - mini-input-variants
483
+ - `.logout-row` + `.logout-btn` - logout-UI
484
+ - `.btn-copy` + `.btn-bank` - Klarna-stil round actions (44px tap-target)
485
+ - `.bank-row-icon` - gron check-ikon (data-settings)
486
+ - `.profile-panel-centered` - centrerad avatar+namn+email layout
487
+ - `.rule-arrow` + `.rule-cat` - keyword->kategori-text-element
488
+
489
+ Tier D-undantag (Sprint G 2026-05-09, listade i sektionen ovan):
490
+ - `.cat-bars` / `.cat-bar-*` (7 klasser)
491
+ - `.equity-bar-*` + `.equity-amort` + `.equity-apprec` (6 klasser)
492
+ - `.budget-bar-*` (5 klasser)
493
+ - `.cat-tx-*` (6 klasser, .cat-tx-stack har BEM-element)
494
+ - `.cost-bar` / `.cost-bar-seg` (2 klasser, sibling-pair)
495
+ - `.split-bar` (paketet har samma, override-styling)
496
+
497
+ Notera: ekonom-domain.css (kategori-tokens + bindings) listas inte har
498
+ - den filen ar token-definition, inte komponent-CSS. Se ADR
499
+ `0001-three-layer-token-architecture.md`.
@@ -227,10 +227,33 @@ inte ett undantag eller teknisk skuld.
227
227
  ar BEM-element av varandra (`.hub-category` + `.hub-list`,
228
228
  `.input-group` + `.input-icon` som siblings till `.input`)
229
229
 
230
- **Nar det INTE ar korrekt:**
230
+ **Nar det INTE ar korrekt (skarpt 2026-05-12 via ADR 0011):**
231
231
  - Tva orelaterade komponenter staplade i samma fil av bekvamlighet
232
- - Ett block som logiskt kunde varit BEM-element av ett annat - i sa
233
- fall ska det vara `.X__Y`, inte `.X-Y` som separat block
232
+ - **Ett block som logiskt kunde varit BEM-element av ett annat ska vara
233
+ `.X__Y`, inte `.X-Y` som separat block.** Detta inkluderar inre
234
+ struktur av compound-blocks. Bara root-level sibling-blocks (genuint
235
+ fristaende koncept) far vara flat-hyphen.
236
+
237
+ **Test (compound-sibling vs BEM-element):**
238
+ > "Skulle detta block funka om jag tar bort dess parent-block?"
239
+ > - Ja, det ar ett fristaende koncept → sibling-block (flat-hyphen OK)
240
+ > - Nej, det ar inre struktur av parent → BEM-element (`__`-syntax kravs)
241
+
242
+ Exempel:
243
+ - `.hub-card` + `.hub-list` + `.hub-category` → 3 siblings (kan anvandas
244
+ separat i olika kontexter)
245
+ - `.hub-card__icon` → BEM-element av `.hub-card` (inre struktur)
246
+ - `.score-breakdown__dim-row` (ratt, BEM-element) - INTE `.score-dim-row`
247
+ (fel, flat-hyphen for inre struktur)
248
+ - `.triage-card__source` (ratt, BEM-element) - INTE `.triage-source`
249
+ (fel, flat-hyphen for inre struktur)
250
+
251
+ **Tier D-undantag:**
252
+ En liten katalog av historiskt etablerade flat-hyphen-block-familjer
253
+ med dokumenterad rationale (visuell paritet, etablerade namn,
254
+ genomford migration som inte ar vard att backa). Se
255
+ `references/02-components.md` "Tier D-undantagskatalog"-sektionen.
256
+ **Inga nya Tier D-poster utan ADR-beslut.**
234
257
 
235
258
  **Hur de ska dokumenteras:**
236
259