@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 +3 -2
- package/css/components/auth.css +7 -0
- package/css/components/button.css +12 -0
- package/css/components/chip.css +56 -0
- package/css/components/kv-list.css +84 -0
- package/css/components/list-row.css +16 -0
- package/css/components/nav.css +24 -1
- package/css/components/offline.css +53 -0
- package/css/components/progress.css +16 -17
- package/css/components/setting-row.css +7 -0
- package/css/components/swipe-stack.css +7 -0
- package/css/components/table.css +19 -0
- package/css/index.css +4 -0
- package/package.json +1 -1
- package/references/02-components.md +25 -7
- package/references/05-open-decisions/0003-js-duplicates-migration-CLOSED.md +4 -2
- package/references/05-open-decisions/0004-halsomentorn-legacy-css-CLOSED.md +1 -2
- package/references/05-open-decisions/{0009-ekonom-css-legacy-cleanup.md → 0009-ekonom-css-legacy-cleanup-CLOSED.md} +7 -1
- package/references/05-open-decisions/{0007-banner-body-migration.md → 0010-banner-body-migration-CLOSED.md} +2 -2
- package/references/05-open-decisions/{0008-hbar-migration-ekonom.md → 0011-hbar-migration-ekonom-CLOSED.md} +2 -2
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@
|
|
64
|
-
|
|
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.
|
package/css/components/auth.css
CHANGED
|
@@ -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);
|
package/css/components/chip.css
CHANGED
|
@@ -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
|
+
}
|
package/css/components/nav.css
CHANGED
|
@@ -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.
|
|
4
|
-
status, multi-step-flows.
|
|
3
|
+
Linjär progress-indikator. Status-modifiers for fargning.
|
|
5
4
|
|
|
6
5
|
Blocks:
|
|
7
|
-
.progress
|
|
8
|
-
.progress-bar - fyllning (eget block, alltid DOM-child av .progress)
|
|
6
|
+
.progress - track (wrapper)
|
|
9
7
|
|
|
10
|
-
|
|
11
|
-
.
|
|
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
|
-
.
|
|
12
|
+
.progress__bar --success/-warning/-danger
|
|
18
13
|
|
|
19
14
|
Bredd via CSP-safe pattern (bar-styles.js applicerar style.width
|
|
20
|
-
|
|
15
|
+
fran data-bar-width vid runtime):
|
|
21
16
|
<div class="progress">
|
|
22
|
-
<div class="
|
|
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
|
-
.
|
|
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
|
-
.
|
|
44
|
-
.
|
|
45
|
-
.
|
|
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
|
-
.
|
|
47
|
+
.progress__bar {
|
|
49
48
|
transition: none;
|
|
50
49
|
}
|
|
51
50
|
}
|
|
@@ -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
|
|
package/css/components/table.css
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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
|
|
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)
|
|
98
|
-
- **
|
|
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`
|
|
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
|
|
13
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
#
|
|
1
|
+
# 0010 - .banner-body migration i sync_result.html
|
|
2
2
|
|
|
3
3
|
## Status
|
|
4
|
-
|
|
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
|
-
#
|
|
1
|
+
# 0011 - .hbar-* dash → BEM-migration i Ekonom
|
|
2
2
|
|
|
3
3
|
## Status
|
|
4
|
-
|
|
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
|
|