@klodd/ds 3.5.3 → 3.5.5

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
@@ -97,7 +97,7 @@ En källa, alla projekt ser samma skill automatiskt. Ändringar i
97
97
  `~/dev/klodd-ds/SKILL.md`, `POLICY.md` eller `references/` syns
98
98
  omedelbart i nästa CC-session - ingen synk-fas behövs.
99
99
 
100
- Updated: 2026-05-09 (matchar @klodd/ds 3.5.3 - sprint C fas 1+2: ny
100
+ Updated: 2026-05-09 (matchar @klodd/ds 3.5.4 - sprint C fas 1+2: ny
101
101
  sheet-content.css-komponent (24 BEM-klasser för Sprint-65-pattern),
102
102
  foreman-typografi-utokning (.text-caption/-tiny/-num/-num--display/-positive/-warning),
103
103
  btn-modifiers (--block, --add), .heading (17px medium tight), och utokningar
@@ -105,4 +105,12 @@ i panel/setting-row/chip.
105
105
  v3.5.2 rattade .panel--attention__pill (felaktig BEM) till .panel__pill +
106
106
  context-styling via .panel--attention .panel__pill.
107
107
  v3.5.3 lagger till .heading-utan-N (17px) for dialog-titlar och sheet-rubriker.
108
+ v3.5.4 (Sprint D-3) introducerar --fs-16 token (16px) for iOS-anti-zoom
109
+ pa inputs och applicerar pa inline-edit__input. Token ar dokumenterad
110
+ som BARA for input-element - vanlig text anvander fortfarande 15 eller 17.
111
+ v3.5.5 (Sprint E) konsoliderar :focus-visible over 7 komponenter (chip,
112
+ list-row, tab-bar, nav, swipe-stack, inline-edit) - 11 nya selectorer
113
+ fick outline 2px solid var(--border-focus) med outline-offset 2px. Plus
114
+ .tab outline-offset normaliserad 1px->2px. input.css och .inline-edit__input
115
+ ar dokumenterade undantag som behaller :focus (text-input-konvention).
108
116
  Sprint C fas 2 template-migration pagaar.)
@@ -222,6 +222,10 @@
222
222
  --fs-13: 13px;
223
223
  --fs-14: 14px;
224
224
  --fs-15: 15px;
225
+ /* --fs-16 ar BARA for input-element (anti iOS auto-zoom). Apple HIG
226
+ hoppar over 16 i UI-text-storlekar - anvand 15 eller 17 for vanlig
227
+ text. */
228
+ --fs-16: 16px;
225
229
  --fs-17: 17px;
226
230
  --fs-18: 18px;
227
231
  --fs-20: 20px;
@@ -101,6 +101,11 @@
101
101
  }
102
102
  }
103
103
 
104
+ .chip-list__delete:focus-visible {
105
+ outline: 2px solid var(--border-focus);
106
+ outline-offset: 2px;
107
+ }
108
+
104
109
  .chip-list__add {
105
110
  background: transparent;
106
111
  border-style: dashed;
@@ -120,6 +125,11 @@
120
125
  }
121
126
  }
122
127
 
128
+ .chip-list__add:focus-visible {
129
+ outline: 2px solid var(--border-focus);
130
+ outline-offset: 2px;
131
+ }
132
+
123
133
 
124
134
  /* ================================================================
125
135
  ==== BRAND-PILL
@@ -245,6 +255,11 @@
245
255
  .install-chip__install:hover { background: var(--accent-10); }
246
256
  }
247
257
 
258
+ .install-chip__install:focus-visible {
259
+ outline: 2px solid var(--border-focus);
260
+ outline-offset: 2px;
261
+ }
262
+
248
263
  .install-chip__dismiss {
249
264
  background: transparent;
250
265
  border: none;
@@ -261,6 +276,11 @@
261
276
  .install-chip__dismiss:hover { color: var(--text-default); }
262
277
  }
263
278
 
279
+ .install-chip__dismiss:focus-visible {
280
+ outline: 2px solid var(--border-focus);
281
+ outline-offset: 2px;
282
+ }
283
+
264
284
  @keyframes install-chip-up {
265
285
  from { transform: translateY(calc(100% + 100px)); opacity: 0; }
266
286
  to { transform: translateY(0); opacity: 1; }
@@ -41,6 +41,11 @@
41
41
  }
42
42
  }
43
43
 
44
+ .inline-edit__btn:focus-visible {
45
+ outline: 2px solid var(--border-focus);
46
+ outline-offset: 2px;
47
+ }
48
+
44
49
  .inline-edit__form {
45
50
  display: inline-flex;
46
51
  align-items: center;
@@ -64,10 +69,14 @@
64
69
  border-radius: var(--radius-8);
65
70
  color: var(--text-default);
66
71
  font-family: inherit;
67
- font-size: 16px;
72
+ font-size: var(--fs-16);
68
73
  outline: none;
69
74
  }
70
75
 
76
+ /* :focus (INTE :focus-visible) - text-input-undantag analogt med
77
+ input.css. Anvandare klickar/touchar inputen och forvantar sig
78
+ visuell feedback oavsett input-method. Border + box-shadow ar
79
+ integrerad i input-utseendet. */
71
80
  .inline-edit__input:focus {
72
81
  border-color: var(--accent-9);
73
82
  box-shadow: 0 0 0 3px var(--accent-a3);
@@ -61,6 +61,18 @@
61
61
  /* ================================================================
62
62
  ==== STATES
63
63
  ================================================================ */
64
+
65
+ /* Inputs anvander :focus (INTE :focus-visible) som dokumenterat
66
+ undantag fran paketets generella focus-visible-monster.
67
+
68
+ Skal: text-inputs ar specialfall - anvandare klickar/touchar dem
69
+ och forvantar sig visuell feedback oavsett input-method (mus eller
70
+ tangentbord). Att gomma fokus-ring vid mus-klick (vilket
71
+ :focus-visible skulle gora) kan forvirra anvandare om vilket falt
72
+ som ar aktivt. Konvention foljer Radix UI, MUI, shadcn etc.
73
+
74
+ Fokus-feedback ar border-color + box-shadow ring (inte outline) -
75
+ integrerad i input-utseendet snarare an "added on top". */
64
76
  .input:focus,
65
77
  .textarea:focus,
66
78
  .select:focus {
@@ -113,3 +113,8 @@
113
113
  @media (hover: hover) and (pointer: fine) {
114
114
  .list-row--clickable:hover { background: var(--surface-hover); }
115
115
  }
116
+
117
+ .list-row--clickable:focus-visible {
118
+ outline: 2px solid var(--border-focus);
119
+ outline-offset: 2px;
120
+ }
@@ -56,6 +56,11 @@
56
56
  }
57
57
  }
58
58
 
59
+ .bottom-nav-item:focus-visible {
60
+ outline: 2px solid var(--border-focus);
61
+ outline-offset: 2px;
62
+ }
63
+
59
64
  .bottom-nav-item.active {
60
65
  color: var(--accent-text);
61
66
  }
@@ -141,6 +146,11 @@
141
146
  }
142
147
  }
143
148
 
149
+ .topbar-action:focus-visible {
150
+ outline: 2px solid var(--border-focus);
151
+ outline-offset: 2px;
152
+ }
153
+
144
154
 
145
155
  /* ================================================================
146
156
  ==== TAB-BAR (inline tabs i panel)
@@ -188,5 +198,5 @@
188
198
 
189
199
  .tab:focus-visible {
190
200
  outline: 2px solid var(--border-focus);
191
- outline-offset: 1px;
201
+ outline-offset: 2px;
192
202
  }
@@ -47,6 +47,11 @@
47
47
 
48
48
  .swipe-card:active { cursor: grabbing; }
49
49
 
50
+ .swipe-card:focus-visible {
51
+ outline: 2px solid var(--border-focus);
52
+ outline-offset: 2px;
53
+ }
54
+
50
55
  .swipe-card--back {
51
56
  transform: scale(0.96);
52
57
  opacity: 0.85;
@@ -154,6 +159,11 @@
154
159
  transition: transform var(--press-in-duration) var(--press-in-easing);
155
160
  }
156
161
 
162
+ .swipe-action-btn:focus-visible {
163
+ outline: 2px solid var(--border-focus);
164
+ outline-offset: 2px;
165
+ }
166
+
157
167
  .swipe-action-btn--save { color: var(--positive); }
158
168
  .swipe-action-btn--dismiss { color: var(--negative); }
159
169
 
@@ -56,3 +56,8 @@
56
56
  transform: scale(0.985);
57
57
  transition: transform 80ms var(--ease-spring-snappy);
58
58
  }
59
+
60
+ .tab-bar__item:focus-visible {
61
+ outline: 2px solid var(--border-focus);
62
+ outline-offset: 2px;
63
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@klodd/ds",
3
- "version": "3.5.3",
3
+ "version": "3.5.5",
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": {
@@ -62,6 +62,13 @@ Lista over absoluta krav som inte ska brytas. Varje krav har konkret
62
62
  - ALDRIG `rgba(0, 0, 0, 0.4)` - anvand `color-mix(in oklch, ...)` eller
63
63
  semantic alpha-token
64
64
 
65
+ **Scope:**
66
+ Galler komponenter i `components/*.css` och per-app domain-filer
67
+ (`X-domain.css`, `X.css`). Galler INTE `apps/X.css` - den filen ar
68
+ per definition det lager som haller app-specifika ravarden och
69
+ far referera primitives eller explicita hex-varden for app-karaktar
70
+ som saknar Radix-ekvivalent.
71
+
65
72
  **Varfor:**
66
73
  - Single source of truth: andring i 00-primitives.css landar omedelbart
67
74
  i alla komponenter
@@ -51,6 +51,34 @@ element) lever i en tydligt namngiven domain-fil:
51
51
  - Ny komponent kräver `@import` i alla konsumerande appars `main.css`.
52
52
  Acceptabelt - paketet listar komponenter i README.
53
53
 
54
+ ## Skärpning (2026-05-09)
55
+
56
+ `ekonom-domain.css` (och motsvarande per-app domain-filer) håller
57
+ bara data: kategoritokens, färgvärden, app-specifika värden. Aldrig
58
+ strukturella mönster. All struktur som kan återanvändas av en annan
59
+ app går in i paketet med generiska namn. Detta beslutades och
60
+ genomfördes i Sprint C 2026-05-09 (358 dash→BEM-substitueringar,
61
+ @klodd/ds 3.5.1-3.5.3).
62
+
63
+ Ekonom-flödet i Sprint C:
64
+
65
+ 1. **Fas 1 paket-utvidgning** (3.5.1-3.5.3): 37 nya generiska klasser
66
+ till paketet - hela `sheet-content.css` (24 BEM-klasser för
67
+ bottom-sheet-form-pattern), `.text-caption/-tiny/-num/-num--display/
68
+ -positive/-warning` foreman-typografi, `.btn--block/--add` modifiers,
69
+ utökningar i panel/setting-row/chip, och `.heading` (17px) för
70
+ dialog-titlar.
71
+ 2. **Fas 2 template-migration**: 21 templates fick dash → BEM-
72
+ substitueringar. _sheet_macros.html-makron migrerade samtidigt så
73
+ alla konsumenter (5 templates) fick BEM-rendering.
74
+ 3. **Cleanup**: components.css (2089 rader) raderad helt. Återstående
75
+ 18 aktivt använda klasser utan paket-equivalent (kv-list-family,
76
+ btn-copy/-bank, bank-row-icon, profile-panel-centered, rule-arrow/
77
+ -cat, offline-*, onboarding-container, btn--positive, topbar-logo)
78
+ lyfta till `ekonom.css` LEGACY-sektion. Dessa är kandidater för
79
+ framtida paket-inkludering om de visar sig generaliserbara - se
80
+ öppet beslut 0009 i `references/05-open-decisions/`.
81
+
54
82
  ## Migration (genomförd 2026-05-08)
55
83
 
56
84
  Båda repos genomgick **selector-för-selector-radering**, inte big-bang:
@@ -0,0 +1,47 @@
1
+ # 0007 - .banner-body migration i sync_result.html
2
+
3
+ ## Status
4
+ Pending, låg prioritet.
5
+
6
+ ## Context
7
+
8
+ `app/templates/sync_result.html` använder `.banner-body` på två rader
9
+ (line 29, 36) som child-element i banner-strukturen:
10
+
11
+ ```html
12
+ <div class="banner banner--positive">
13
+ <div class="banner__content">
14
+ <div class="banner__title">Synk klar</div>
15
+ <div class="banner-body">{{ map_stats.new }} nya transaktioner...</div>
16
+ </div>
17
+ </div>
18
+ ```
19
+
20
+ `.banner-body` är **odefinierad** i både `@klodd/ds`-paketet och
21
+ Ekonoms ekonom.css/ekonom-domain.css. Klassen har ingen styling -
22
+ elementet ärver bara från `.banner__content`-parent.
23
+
24
+ Paketets `banner.css` har redan `.banner__sub` som är den BEM-korrekta
25
+ formen för secondary banner-text (12px text-subtle).
26
+
27
+ ## Beslut behövs
28
+
29
+ `.banner-body` → `.banner__sub` mekanisk substitution. Visuellt
30
+ innebär det att texten får 12px text-subtle-styling istället för
31
+ default body-styling (subtil förändring, knappast märkbar i banner-
32
+ context där text redan är komprimerat).
33
+
34
+ Inkluderades inte i Sprint C 2026-05-08 rename-map. Två förekomster
35
+ i en enda template, lågprio.
36
+
37
+ ## Trigger
38
+
39
+ Migrera nästa gång sync_result.html ändras ändå (sprint som rör
40
+ sync-flödet eller banner-utseendet generellt). Mekanisk perl-
41
+ substitution `s/\bbanner-body\b/banner__sub/g`.
42
+
43
+ ## References
44
+
45
+ - Sprint C fas 2 batch 2.5 commit `1dc3aec` - notering om dödklassen
46
+ - Ekonom `app/templates/sync_result.html:29,36`
47
+ - `@klodd/ds/css/components/banner.css` - `.banner__sub`-definition
@@ -0,0 +1,61 @@
1
+ # 0008 - .hbar-* dash → BEM-migration i Ekonom
2
+
3
+ ## Status
4
+ Pending, låg prioritet.
5
+
6
+ ## Context
7
+
8
+ `app/templates/upload_preview.html` använder dash-form `.hbar-*`-
9
+ klasser för horisontell bar-chart i CSV-import-flödet:
10
+
11
+ ```html
12
+ <div class="hbar-item">
13
+ <div class="hbar-label">{{ g.label }}</div>
14
+ <div class="hbar-track">
15
+ <div class="hbar-fill" data-bar-width="..."></div>
16
+ </div>
17
+ <div class="hbar-value">{{ g.sum | sek_cost }} ({{ g.count }})</div>
18
+ </div>
19
+ ```
20
+
21
+ Paketets `@klodd/ds/css/components/hbar.css` har BEM-formen redan:
22
+ `.hbar`, `.hbar__item`, `.hbar__track`, `.hbar__fill`, `.hbar__label`,
23
+ `.hbar__value`, `.hbar__fill--positive/-warning/-negative`.
24
+
25
+ Dash-formen är definierad i `ekonom.css` ("CHARTS"-sektionen) som
26
+ parallell-styling till paketets BEM. Detta är **dubbel-styling** som
27
+ ADR 0009 förbjuder för komponent-CSS.
28
+
29
+ Inkluderades inte i Sprint C 2026-05-08 rename-map (sektion A
30
+ listade inte hbar-mappningar). Endast 1 template (upload_preview.html)
31
+ använder dash-formen.
32
+
33
+ ## Beslut behövs
34
+
35
+ Mekanisk substitution:
36
+
37
+ ```
38
+ .hbar-item → .hbar__item
39
+ .hbar-label → .hbar__label
40
+ .hbar-track → .hbar__track
41
+ .hbar-fill → .hbar__fill
42
+ .hbar-value → .hbar__value
43
+ ```
44
+
45
+ Plus radera dash-form-definitionerna ur `ekonom.css` CHARTS-sektionen
46
+ för att eliminera dubbel-styling och uppfylla ADR 0009 fullt ut.
47
+
48
+ ## Trigger
49
+
50
+ Migrera nästa gång upload_preview.html ändras ändå (sprint som rör
51
+ CSV-import-flödet). Eller som del av nästa minor-version cleanup-
52
+ sprint.
53
+
54
+ ## References
55
+
56
+ - Sprint C fas 2 batch 2.2 commit `b81f1e0` - notering om hbar-
57
+ klasser ej i scope
58
+ - Ekonom `app/templates/upload_preview.html:43-51`
59
+ - Ekonom `app/static/css/ds/ekonom.css` CHARTS-sektion
60
+ - `@klodd/ds/css/components/hbar.css` - BEM-definition
61
+ - ADR 0009 - locked decision om inga dubbel-stylings
@@ -0,0 +1,63 @@
1
+ # 0009 - ekonom.css LEGACY-sektion cleanup
2
+
3
+ ## Status
4
+ Pending, medel prioritet.
5
+
6
+ ## Context
7
+
8
+ `app/static/css/ds/ekonom.css` har en LEGACY-sektion (~200 rader,
9
+ 18 klasser) som lyftes från `components.css` i Sprint C cleanup
10
+ (2026-05-09, commit `5bbe44e`). Klasserna är aktivt använda i
11
+ templates men saknade paket-ekvivalent vid Sprint C-tidpunkten.
12
+
13
+ Klasser i LEGACY-sektionen:
14
+
15
+ | Klass | Användning | Generaliserbar? |
16
+ |---|---|---|
17
+ | `.topbar-logo` | 11 templates - app-namn i topbar | Ja, paketet har redan `.topbar-back/-title/-action` men inte `-logo` |
18
+ | `.kv-list` family (.kv-list, .kv-strong, .kv-sub, .kv-divider) | 6 förekomster /avstamning + bolan | Ja, generic key-value-list-pattern |
19
+ | `.kv-budget-row, .kv-budget-header, .kv-budget-body` | 3 förekomster /avstamning | Möjligen - collapsible-row med metric-burndown |
20
+ | `.btn-copy, .btn-bank` | 2 unika /avstamning + bolan | Tveksamt - Klarna-stil specifik. Kan ev. lyftas som `.btn--icon-circle` med modifier |
21
+ | `.btn--positive` | 1 review_queue.html | Ja, paketet har `.btn--primary/-secondary/-ghost/-danger` men inte `-positive` (skulle komplettera variant-set) |
22
+ | `.bank-row-icon` | 1 /installningar/data | Möjligen - generic "status-icon-leading-element" pattern |
23
+ | `.profile-panel-centered` | 1 /jag | Tveksamt - Ekonom-specifik panel-layout |
24
+ | `.rule-arrow, .rule-cat` | 1 /installningar/auto-kategorisering | Tveksamt - regel-rad-styling (keyword → kategori) |
25
+ | `.offline-wrap, .offline-icon, .offline-title, .offline-text` | 1 offline.html | Ja, generic offline-page-pattern (fits paketets hub-card-style empty-state) |
26
+ | `.onboarding-container` | 2 onboarding-templates | Ja, generic max-width-form-container pattern |
27
+
28
+ Sektionen är tydligt markerad som "LEGACY (Sprint C cleanup,
29
+ 2026-05-09)" i `ekonom.css` och kommer rivas successivt när
30
+ respektive klass:
31
+ - (a) lyfts till paketet med generiska namn (struktur)
32
+ - (b) eller raderas tillsammans med template-redesign
33
+
34
+ ## Beslut behövs
35
+
36
+ Granska varje klass i tabellen ovan vid nästa paket-minor-version och
37
+ fatta beslut: lyft till paketet eller stanna i ekonom.css.
38
+
39
+ **Prioritering vid lyft:**
40
+
41
+ 1. **Hög** (generic + multi-template): `.topbar-logo`, `.kv-list`-
42
+ family, `.offline-*`, `.onboarding-container`
43
+ 2. **Medel** (generic + low-impact): `.btn--positive`,
44
+ `.bank-row-icon`
45
+ 3. **Låg** (tveksam generaliserbarhet): `.btn-copy/.btn-bank`,
46
+ `.profile-panel-centered`, `.rule-arrow/.rule-cat`,
47
+ `.kv-budget-*`
48
+
49
+ ## Trigger
50
+
51
+ Nästa paket-minor-version (3.6.0). Vid det tillfället - granska
52
+ LEGACY-sektionen och lyft de generaliserbara klasserna med generiska
53
+ namn.
54
+
55
+ ## References
56
+
57
+ - Sprint C cleanup-commit `5bbe44e` (Ekonom) - components.css raderad,
58
+ LEGACY-sektion etablerad i ekonom.css
59
+ - ADR 0009 (locked) "Skärpning 2026-05-09" - stadgar att struktur
60
+ går till paketet, ekonom-domain håller bara data
61
+ - `~/dev/Ekonom/app/static/css/ds/ekonom.css` - LEGACY-sektionen
62
+ börjar efter logout-row-blocket
63
+ - @klodd/ds 3.5.3 (current) - inte uppdaterad med dessa klasser