@klodd/ds 3.7.0 → 3.9.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
@@ -60,8 +60,9 @@ cd ~/dev/Ekonom && npm install @klodd/ds@latest && npm run build:ds
60
60
  En sprint — oavsett om den innehåller CSS, JS eller bara dokumentation —
61
61
  är inte klar förrän:
62
62
  1. `npm publish --access public` är kört och versionen syns på registret
63
- 2. `npm install @klodd/ds@latest && npm run build:ds` är kört i båda
64
- app-repos
63
+ 2. `npm install @klodd/ds@X.Y.Z && npm run build:ds` är kört i båda app-repos
64
+ (använd explicit versionsnummer, inte @latest — npm-cache kan ligga efter
65
+ direkt efter publish)
65
66
  3. App-commits är pushade
66
67
 
67
68
  Manuell filsync till app-repos är aldrig ett godkänt alternativ.
@@ -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);
@@ -117,6 +117,19 @@
117
117
  outline-offset: 2px;
118
118
  }
119
119
 
120
+ .chip-list__delete:active {
121
+ background: color-mix(in oklch, var(--accent-danger) 25%, transparent);
122
+ transform: scale(0.95);
123
+ transition: transform 80ms var(--ease-spring-snappy);
124
+ }
125
+
126
+ .chip-list__delete:disabled,
127
+ .chip-list__delete[aria-disabled="true"] {
128
+ opacity: 0.5;
129
+ cursor: not-allowed;
130
+ pointer-events: none;
131
+ }
132
+
120
133
  .chip-list__add {
121
134
  background: transparent;
122
135
  border-style: dashed;
@@ -141,6 +154,19 @@
141
154
  outline-offset: 2px;
142
155
  }
143
156
 
157
+ .chip-list__add:active {
158
+ background: var(--surface-active);
159
+ transform: scale(0.97);
160
+ transition: transform 80ms var(--ease-spring-snappy);
161
+ }
162
+
163
+ .chip-list__add:disabled,
164
+ .chip-list__add[aria-disabled="true"] {
165
+ opacity: 0.5;
166
+ cursor: not-allowed;
167
+ pointer-events: none;
168
+ }
169
+
144
170
 
145
171
  /* ================================================================
146
172
  ==== BRAND-PILL
@@ -271,6 +297,19 @@
271
297
  outline-offset: 2px;
272
298
  }
273
299
 
300
+ .install-chip__install:active {
301
+ background: var(--surface-active);
302
+ transform: scale(0.97);
303
+ transition: transform 80ms var(--ease-spring-snappy);
304
+ }
305
+
306
+ .install-chip__install:disabled,
307
+ .install-chip__install[aria-disabled="true"] {
308
+ opacity: 0.5;
309
+ cursor: not-allowed;
310
+ pointer-events: none;
311
+ }
312
+
274
313
  .install-chip__dismiss {
275
314
  background: transparent;
276
315
  border: none;
@@ -292,6 +331,19 @@
292
331
  outline-offset: 2px;
293
332
  }
294
333
 
334
+ .install-chip__dismiss:active {
335
+ background: var(--surface-active);
336
+ transform: scale(0.97);
337
+ transition: transform 80ms var(--ease-spring-snappy);
338
+ }
339
+
340
+ .install-chip__dismiss:disabled,
341
+ .install-chip__dismiss[aria-disabled="true"] {
342
+ opacity: 0.5;
343
+ cursor: not-allowed;
344
+ pointer-events: none;
345
+ }
346
+
295
347
  @keyframes install-chip-up {
296
348
  from { transform: translateY(calc(100% + 100px)); opacity: 0; }
297
349
  to { transform: translateY(0); opacity: 1; }
@@ -299,4 +351,8 @@
299
351
 
300
352
  @media (prefers-reduced-motion: reduce) {
301
353
  .install-chip { animation: none; }
354
+ .chip-list__delete:active,
355
+ .chip-list__add:active,
356
+ .install-chip__install:active,
357
+ .install-chip__dismiss:active { transform: none; }
302
358
  }
@@ -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
+ }
@@ -128,3 +128,19 @@
128
128
  outline: 2px solid var(--border-focus);
129
129
  outline-offset: 2px;
130
130
  }
131
+
132
+ .list-row--clickable:active {
133
+ background: var(--surface-active);
134
+ transform: scale(0.99);
135
+ transition: transform 80ms var(--ease-spring-snappy);
136
+ }
137
+
138
+ .list-row--clickable[aria-disabled="true"] {
139
+ opacity: 0.5;
140
+ cursor: not-allowed;
141
+ pointer-events: none;
142
+ }
143
+
144
+ @media (prefers-reduced-motion: reduce) {
145
+ .list-row--clickable:active { transform: none; }
146
+ }
@@ -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)
@@ -74,6 +74,18 @@
74
74
  outline-offset: 2px;
75
75
  }
76
76
 
77
+ .bottom-nav__item:active {
78
+ background: var(--surface-active);
79
+ transform: scale(0.94);
80
+ transition: transform 80ms var(--ease-spring-snappy);
81
+ }
82
+
83
+ .bottom-nav__item[aria-disabled="true"] {
84
+ opacity: 0.5;
85
+ cursor: not-allowed;
86
+ pointer-events: none;
87
+ }
88
+
77
89
  .bottom-nav__item--active {
78
90
  color: var(--accent-text);
79
91
  }
@@ -163,3 +175,14 @@
163
175
  outline: 2px solid var(--border-focus);
164
176
  outline-offset: 2px;
165
177
  }
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
+
186
+ @media (prefers-reduced-motion: reduce) {
187
+ .bottom-nav__item:active { transform: none; }
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
+ }
@@ -1,28 +1,27 @@
1
1
  /* ================================================================
2
2
  components/progress.css
3
- Linjär progress-indikator. Används för budget-burndown, upload-
4
- status, multi-step-flows.
3
+ Linjär progress-indikator. Status-modifiers for fargning.
5
4
 
6
5
  Blocks:
7
- .progress - track (wrapper, surface-raised bg)
8
- .progress-bar - fyllning (eget block, alltid DOM-child av .progress)
6
+ .progress - track (wrapper)
9
7
 
10
- HTML-relationer:
11
- .progress-bar placeras alltid som child inuti .progress i HTML.
12
- CSS-mässigt fristående block - flat-namnet behålls av historiska
13
- skäl (inte .progress__bar). Se references/03-quality-bar.md
14
- regel 11 om fil med flera root-blocks.
8
+ Element:
9
+ .progress__bar - fyllning (alltid DOM-child av .progress)
15
10
 
16
11
  Modifiers:
17
- .progress-bar --success/-warning/-danger
12
+ .progress__bar --success/-warning/-danger
18
13
 
19
14
  Bredd via CSP-safe pattern (bar-styles.js applicerar style.width
20
- från data-bar-width vid runtime):
15
+ fran data-bar-width vid runtime):
21
16
  <div class="progress">
22
- <div class="progress-bar progress-bar--warning"
17
+ <div class="progress__bar progress__bar--warning"
23
18
  data-bar-width="73%"></div>
24
19
  </div>
25
20
 
21
+ Sprint 4 (3.8.0): .progress-bar omdopt till BEM-element .progress__bar
22
+ per kvalitetsbar regel 1 (BEM-konvention). 0 produktions-templates
23
+ paverkades - .progress-bar fanns bara i design-showcase.
24
+
26
25
  Respekterar prefers-reduced-motion (transition tas bort).
27
26
  ================================================================ */
28
27
  .progress {
@@ -33,19 +32,19 @@
33
32
  overflow: hidden;
34
33
  }
35
34
 
36
- .progress-bar {
35
+ .progress__bar {
37
36
  height: 100%;
38
37
  background: var(--accent-9);
39
38
  border-radius: var(--radius-full);
40
39
  transition: width var(--dur-base) var(--ease-out);
41
40
  }
42
41
 
43
- .progress-bar--success { background: var(--bg-success); }
44
- .progress-bar--warning { background: var(--bg-warning); }
45
- .progress-bar--danger { background: var(--bg-danger); }
42
+ .progress__bar--success { background: var(--bg-success); }
43
+ .progress__bar--warning { background: var(--bg-warning); }
44
+ .progress__bar--danger { background: var(--bg-danger); }
46
45
 
47
46
  @media (prefers-reduced-motion: reduce) {
48
- .progress-bar {
47
+ .progress__bar {
49
48
  transition: none;
50
49
  }
51
50
  }
@@ -63,6 +63,13 @@
63
63
  outline-offset: -2px;
64
64
  }
65
65
 
66
+ .setting-row:disabled,
67
+ .setting-row[aria-disabled="true"] {
68
+ opacity: 0.5;
69
+ cursor: not-allowed;
70
+ pointer-events: none;
71
+ }
72
+
66
73
  .setting-row__text {
67
74
  display: flex;
68
75
  flex-direction: column;
@@ -183,6 +183,13 @@
183
183
  outline-offset: 2px;
184
184
  }
185
185
 
186
+ .swipe-action-btn:disabled,
187
+ .swipe-action-btn[aria-disabled="true"] {
188
+ opacity: 0.5;
189
+ cursor: not-allowed;
190
+ pointer-events: none;
191
+ }
192
+
186
193
  .swipe-action-btn--save { color: var(--positive); }
187
194
  .swipe-action-btn--dismiss { color: var(--negative); }
188
195
 
@@ -1,6 +1,25 @@
1
1
  /* ================================================================
2
2
  components/table.css
3
3
  Tabell med header + rader. Tabular-nums for nummerkolumner.
4
+
5
+ Blocks:
6
+ .table - root-block (wrapper-tabell)
7
+
8
+ Element-selectors (descendant):
9
+ .table th - kolumnrubriker (uppercase, muted)
10
+ .table td - dataceller
11
+ .table td.num,
12
+ .table th.num - nummerkolumner (tabular-nums, hoger-justerad)
13
+
14
+ States (by design):
15
+ .table tbody tr:hover - row-hover via @media (hover: hover) -
16
+ komponentens enda interaktiva state.
17
+
18
+ Tabellrader ar INTE klickbara per default. Om interaktiv tabell
19
+ behovs - introducera explicit modifier-klass (t.ex. .table--clickable
20
+ eller .tr--clickable) med :active/:focus-visible/:disabled. Native
21
+ <tr> har inga semantiska disabled/focus-states, sa modifier-klassen
22
+ maste appliceras tillsammans med tabindex pa raden.
4
23
  ================================================================ */
5
24
  .table {
6
25
  width: 100%;
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.7.0",
3
+ "version": "3.9.0",
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
@@ -94,8 +94,9 @@ För varje entry gäller:
94
94
  - **Tokens:** `--border-subtle/-default`
95
95
 
96
96
  ### progress (`progress.css`)
97
- - **Blocks:** `.progress` (track), `.progress-bar` (fyllning, alltid DOM-child av `.progress`)
98
- - **Modifiers:** `.progress-bar--success/-warning/-danger`
97
+ - **Blocks:** `.progress` (track)
98
+ - **Element:** `.progress__bar` (fyllning, alltid DOM-child av `.progress`)
99
+ - **Modifiers:** `.progress__bar--success/-warning/-danger`
99
100
  - **Anvand:** Linjar progress med data-bar-width-pattern (CSP-safe via bar-styles.js)
100
101
  - **INTE:** Progress med text-overlay (eget komposit-pattern)
101
102
  - **Tokens:** `--surface-raised`, `--accent-9`, `--bg-success/-warning/-danger`. Respekterar `prefers-reduced-motion`.
@@ -211,13 +212,16 @@ För varje entry gäller:
211
212
 
212
213
  ### table (`table.css`)
213
214
  - **Blocks:** `.table`
214
- - **Element:** `.table .num` (descendant-selector)
215
+ - **Element-selectors (descendant):** `.table th`, `.table td`, `.table td.num`, `.table th.num`
216
+ - **States:** `.table tbody tr:hover` (via `@media hover: hover`) - enda interaktiva state by design
215
217
  - **Anvand:** Tabell med tabular-nums-stod
216
218
  - **INTE:** Layout-grid (anvand CSS Grid utility)
219
+ - **Special:** Hover ar enda interaktiva state by design. Tabellrader ar INTE klickbara per default. Om interaktiv tabell behovs - introducera explicit modifier-klass (t.ex. `.table--clickable`) med `:active`/`:focus-visible`/`:disabled` plus `tabindex` pa raden.
217
220
 
218
221
  ### auth (`auth.css`)
219
222
  - **Blocks:** `.auth-container`
220
223
  - **Element:** `.auth-container__title`, `.auth-container__subtitle`
224
+ - **Modifiers:** `.auth-container--narrow` (max-width 480px, ej full-page-centrerad - for onboarding-vyer)
221
225
  - **Anvand:** Centrerad layout for inloggning + onboarding
222
226
  - **INTE:** Settings-vyer
223
227
 
@@ -268,6 +272,20 @@ För varje entry gäller:
268
272
  - **Tokens:** `--bar-accent` (sattes av app-bindning), `--accent-9` (default)
269
273
  - **Pattern:** Se "Kategori-monstret" nedan
270
274
 
275
+ ### kv-list (`kv-list.css`) - v3.9.0
276
+ - **Blocks:** `.kv-list` (`<ul>`-wrapper)
277
+ - **Element:** `.kv-list__item`, `.kv-budget-header` (compound, klickbar header), `.kv-budget-body` (compound, expanderat innehall)
278
+ - **Modifiers:** `.kv-list__item--strong/-sub/-divider/-budget`
279
+ - **Anvand:** Key-value list for metric-breakdowns, statistik-paneler, settings-summaries
280
+ - **INTE:** List av actions (anvand `.list-row` eller `.setting-row`)
281
+ - **Special:** `.kv-budget-header` + `.kv-budget-body` ar compound-blocks per regel 11 - lyftade fran Ekonoms LEGACY utan rename for att bibehalla template-kompabilitet.
282
+
283
+ ### offline (`offline.css`) - v3.9.0
284
+ - **Blocks (compound):** `.offline-wrap`, `.offline-icon`, `.offline-title`, `.offline-text`
285
+ - **Anvand:** Offline-page layout som SW visar vid natverksfel
286
+ - **INTE:** Inline empty-state i listor (anvand `.empty-state` fran feedback.css)
287
+ - **Special:** Alla 4 blocks anvands tillsammans i offline.html. Compound-block-monster per regel 11.
288
+
271
289
  ### sheet-content (`sheet-content.css`) - v3.5.1
272
290
  - **Blocks:** `.sheet` (kompletterar `.sheet` fran `overlay.css` med innehall-typografi och form-monster)
273
291
  - **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)
@@ -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