@klodd/ds 3.6.1 → 3.8.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/chip.css +56 -0
- package/css/components/collapsible.css +30 -10
- package/css/components/list-row.css +16 -0
- package/css/components/nav.css +16 -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/package.json +1 -1
- package/references/02-components.md +6 -3
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/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
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
kategori-grupper, FAQ-rader.
|
|
5
5
|
|
|
6
6
|
Block:
|
|
7
|
-
.collapsible
|
|
7
|
+
.collapsible - root-block (huvud-container)
|
|
8
8
|
|
|
9
9
|
BEM-element av blocket:
|
|
10
10
|
.collapsible__header - klickbar header (button-element)
|
|
@@ -12,16 +12,16 @@
|
|
|
12
12
|
.collapsible__body - expanderat innehåll (hidden default)
|
|
13
13
|
.collapsible__chev - chevron som roterar 180deg
|
|
14
14
|
|
|
15
|
-
ANTECKNING (BEM-stam-mismatch, öppen punkt):
|
|
16
|
-
Blocket heter .collapsible-card men elementen heter .collapsible__X
|
|
17
|
-
(utan -card-suffix). Två lösningar finns: rename block till
|
|
18
|
-
.collapsible eller rename element till .collapsible-card__X.
|
|
19
|
-
Underlag finns i sprint-rapport 2026-05-09. Ingen rename i fas 1.
|
|
20
|
-
|
|
21
15
|
States:
|
|
22
|
-
[data-expanded] på .collapsible
|
|
16
|
+
[data-expanded] på .collapsible - JS togglar, roterar __chev 180deg
|
|
17
|
+
|
|
18
|
+
Sprint 2 (3.7.0): block .collapsible-card omdöpt till .collapsible
|
|
19
|
+
per ADR 0010 (BEM-stam-konsistens med elementen). Plus tillagda
|
|
20
|
+
:hover/:active/:disabled-states på .collapsible__header per
|
|
21
|
+
kvalitetsbar regel 8 (komplett state-täckning på interaktiva
|
|
22
|
+
komponenter).
|
|
23
23
|
================================================================ */
|
|
24
|
-
.collapsible
|
|
24
|
+
.collapsible {
|
|
25
25
|
background: var(--surface-raised);
|
|
26
26
|
border: 1px solid var(--border-subtle);
|
|
27
27
|
border-radius: var(--radius-20);
|
|
@@ -50,6 +50,25 @@
|
|
|
50
50
|
outline-offset: -2px;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
@media (hover: hover) and (pointer: fine) {
|
|
54
|
+
.collapsible__header:hover {
|
|
55
|
+
background: var(--surface-hover);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.collapsible__header:active {
|
|
60
|
+
background: var(--surface-active);
|
|
61
|
+
transform: scale(0.99);
|
|
62
|
+
transition: transform 80ms var(--ease-spring-snappy);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.collapsible__header:disabled,
|
|
66
|
+
.collapsible__header[aria-disabled="true"] {
|
|
67
|
+
opacity: 0.5;
|
|
68
|
+
cursor: not-allowed;
|
|
69
|
+
pointer-events: none;
|
|
70
|
+
}
|
|
71
|
+
|
|
53
72
|
.collapsible__header-text {
|
|
54
73
|
flex: 1;
|
|
55
74
|
min-width: 0;
|
|
@@ -62,7 +81,7 @@
|
|
|
62
81
|
transition: transform var(--dur-medium) var(--ease-default);
|
|
63
82
|
}
|
|
64
83
|
|
|
65
|
-
.collapsible
|
|
84
|
+
.collapsible[data-expanded] .collapsible__chev {
|
|
66
85
|
transform: rotate(180deg);
|
|
67
86
|
}
|
|
68
87
|
|
|
@@ -72,4 +91,5 @@
|
|
|
72
91
|
|
|
73
92
|
@media (prefers-reduced-motion: reduce) {
|
|
74
93
|
.collapsible__chev { transition: none; }
|
|
94
|
+
.collapsible__header:active { transform: none; }
|
|
75
95
|
}
|
|
@@ -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
|
@@ -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,7 @@
|
|
|
163
175
|
outline: 2px solid var(--border-focus);
|
|
164
176
|
outline-offset: 2px;
|
|
165
177
|
}
|
|
178
|
+
|
|
179
|
+
@media (prefers-reduced-motion: reduce) {
|
|
180
|
+
.bottom-nav__item:active { transform: none; }
|
|
181
|
+
}
|
|
@@ -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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@klodd/ds",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.8.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": {
|
|
@@ -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,9 +212,11 @@ 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`
|