@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 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.
@@ -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-card - root-block (huvud-container)
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-card - JS togglar, roterar __chev 180deg
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-card {
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-card[data-expanded] .collapsible__chev {
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
+ }
@@ -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. 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@klodd/ds",
3
- "version": "3.6.1",
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), `.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,9 +212,11 @@ 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`