@klodd/ds 3.21.4 → 3.21.6
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/package.json
CHANGED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# 0017 - Padding-skala utökad till 10 värden + per-komponent-låsning
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
Locked.
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
DESIGN-LANGUAGE.md sektion 4 (etablerad 2026-05-12 via ADR 0013)
|
|
9
|
+
specificerade en padding-skala om 6 värden: `4, 8, 12, 16, 20, 24`,
|
|
10
|
+
med 2, 6, 10, 14, 18, 22, 28, 32 listade som "förbjudna i komponent-
|
|
11
|
+
CSS" (men reserverade för layout-grid).
|
|
12
|
+
|
|
13
|
+
Audit 2026-05-14 (Ekonom UI/UX/CSS-cykel) visade att paketets egna
|
|
14
|
+
komponenter använder "förbjudna" värden brett:
|
|
15
|
+
|
|
16
|
+
| Fil | Padding-värden |
|
|
17
|
+
|---|---|
|
|
18
|
+
| `setting-row.css:32` | `var(--space-14) 0` |
|
|
19
|
+
| `list-row.css:37` | `var(--space-10) 0` |
|
|
20
|
+
| `hub-card.css:32` | `var(--space-14) var(--space-16)` |
|
|
21
|
+
| `panel.css:15` | `var(--space-16) var(--space-18)` |
|
|
22
|
+
| `panel.css:94` | `0 var(--space-10)` |
|
|
23
|
+
| `banner.css:12` | `var(--space-14) var(--space-16)` |
|
|
24
|
+
| `sheet-content.css:110` | `0 var(--space-14)` |
|
|
25
|
+
| `sheet-content.css:129` | `padding-right: var(--space-32)` |
|
|
26
|
+
| `sheet-content.css:136` | `var(--space-12) var(--space-14)` |
|
|
27
|
+
| `sheet-content.css:302` | `var(--space-6) 0` |
|
|
28
|
+
| `sheet-content.css:327` | `padding-top: var(--space-14)` |
|
|
29
|
+
|
|
30
|
+
Detta är **inte** slarv - värdena är medvetna iOS-list-row-paddings
|
|
31
|
+
som matchar Apples HIG-konventioner (44px tap-target med text-line
|
|
32
|
+
ger 50-56px höjd via padding 10-14). Att tighta paketet till 4/8/12/
|
|
33
|
+
16/20/24 skulle ge ojämn rytm där iOS-konventionen kräver mellan-
|
|
34
|
+
värden.
|
|
35
|
+
|
|
36
|
+
Per Calle 2026-05-14: "Det är ok att ändra regler och göra det bättre,
|
|
37
|
+
men då måste det implementeras brett inom designsystemet och de appar
|
|
38
|
+
som använder det."
|
|
39
|
+
|
|
40
|
+
## Decision
|
|
41
|
+
|
|
42
|
+
**Padding-skalan utökas till 10 värden + per-komponent-låsningar i
|
|
43
|
+
ADR-katalogen.**
|
|
44
|
+
|
|
45
|
+
### Tillåtna värden i komponent-CSS
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
4, 6, 8, 10, 12, 14, 16, 18, 20, 24
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Plus 28, 32, 40+ för layout-grid och stora section-breaks.
|
|
52
|
+
|
|
53
|
+
### Per-komponent-typ-låsningar
|
|
54
|
+
|
|
55
|
+
Etablerade efter audit av nuvarande paket (frusen state 2026-05-14):
|
|
56
|
+
|
|
57
|
+
| Komponent-typ | V-padding | H-padding | Källa |
|
|
58
|
+
|---|---|---|---|
|
|
59
|
+
| `.list-row` | 10 | 0 | `list-row.css:37` |
|
|
60
|
+
| `.setting-row` | 14 | 0 | `setting-row.css:32` |
|
|
61
|
+
| `.banner` | 14 | 16 | `banner.css:12` |
|
|
62
|
+
| `.card`, `.card__body`, `.card__footer` | 16 | 16 | `card.css` |
|
|
63
|
+
| `.panel` | 16 | 18 | `panel.css:15` |
|
|
64
|
+
| `.hub-card` | 14 | 16 | `hub-card.css:32` |
|
|
65
|
+
| `.btn` (default) | 12 | 16 | `button.css` |
|
|
66
|
+
| `.btn--sm` | 8 | 12 | `button.css` |
|
|
67
|
+
| `.input` | 12 | 14 | `input.css` |
|
|
68
|
+
| `.input` (compact) | 6 | 10 | `input.css` (compact) |
|
|
69
|
+
| `.sheet__field-label` | 0 14 | - | `sheet-content.css:110` |
|
|
70
|
+
| `.sheet__item` | 12 | 14 | `sheet-content.css:136/206` |
|
|
71
|
+
| `.sheet__form` | 6 | 0 | `sheet-content.css:302` |
|
|
72
|
+
| Tooltip | 8 | 12 | `tooltip.css` |
|
|
73
|
+
| `.toast` (paket) | 12 | 16 | `feedback.css` |
|
|
74
|
+
|
|
75
|
+
App-domain-komponenter följer samma per-typ-värden om de spelar samma
|
|
76
|
+
roll. Avvikelser kräver dokumentation.
|
|
77
|
+
|
|
78
|
+
### Förbjudet (oförändrat)
|
|
79
|
+
|
|
80
|
+
Värden 2, 22, 26, 30 är fortfarande "förbjudna" i komponent-CSS -
|
|
81
|
+
oanvända i paketet och brott mot rytmen. 28 + 32+ är layout-tokens,
|
|
82
|
+
inte komponent-padding.
|
|
83
|
+
|
|
84
|
+
### Komposita värden (TRBL)
|
|
85
|
+
|
|
86
|
+
Symmetric preferred: `padding: 16px`. Vertical-horizontal:
|
|
87
|
+
`padding: 14px 16px`. Asymmetric kräver kommentar med motivation
|
|
88
|
+
(hero `padding: 20px 0 24px` är dokumenterat undantag för alignment).
|
|
89
|
+
|
|
90
|
+
## Konsekvenser
|
|
91
|
+
|
|
92
|
+
**Bra:**
|
|
93
|
+
- Doktrinen matchar faktisk paket-implementation
|
|
94
|
+
- iOS-konventionen (HIG 44x44 tap-target med 10-14px padding) respekteras
|
|
95
|
+
- Ekonom + Jubb-domain kan följa samma per-typ-värden utan migration
|
|
96
|
+
- Future-CC har tabell att referera istället för regelläsning
|
|
97
|
+
- Stylelint-plugin (Sprint 5) kan validera mot 10-värdes-skala +
|
|
98
|
+
per-komponent-låsningar
|
|
99
|
+
|
|
100
|
+
**Trade-offs:**
|
|
101
|
+
- Ramverket är inte längre 6-värdes-tightat
|
|
102
|
+
- Per-komponent-låsningarna ökar ADR-underhåll: ny komponent-typ
|
|
103
|
+
kräver ADR-uppdatering eller acceptans av "free padding"
|
|
104
|
+
- App-domain-CSS som följde 4/8/12/16/20/24 strikt kan se ut som
|
|
105
|
+
underanvändning av tillgängliga värden
|
|
106
|
+
|
|
107
|
+
## Migration
|
|
108
|
+
|
|
109
|
+
**Ingen migration krävs.** Paketet är redan i låst state. App-domain-CSS
|
|
110
|
+
(Ekonoms ds/ekonom.css + Jubbs jubb.css/jubb-domain.css) följer redan
|
|
111
|
+
samma värden de facto.
|
|
112
|
+
|
|
113
|
+
Sprint C i Ekonom-auditen 2026-05-14 skippades baserat på denna analys -
|
|
114
|
+
fyndet var falskt-positivt eftersom doktrinen var aspirationell utan
|
|
115
|
+
paket-verifiering.
|
|
116
|
+
|
|
117
|
+
## Stylelint-plugin (Sprint 5, framtida)
|
|
118
|
+
|
|
119
|
+
Validera:
|
|
120
|
+
- `padding`-värden använder `var(--space-N)` där N är 4/6/8/10/12/14/
|
|
121
|
+
16/18/20/24
|
|
122
|
+
- Per-komponent-typ-låsningar via selector-pattern (t.ex. `.list-row`-
|
|
123
|
+
rules ska ha padding-y 10)
|
|
124
|
+
- Varning vid avvikelse från ADR-tabellen
|
|
125
|
+
|
|
126
|
+
## References
|
|
127
|
+
|
|
128
|
+
- DESIGN-LANGUAGE.md sektion 4 (uppdaterad 2026-05-14)
|
|
129
|
+
- ADR 0013 (visual-coherence-doctrine) - tidigare 6-värdes-regel
|
|
130
|
+
- Ekonom DECISIONS 2026-05-14 (audit-cykel skip-rationale för Sprint C)
|
|
131
|
+
- Audit-not: paketets faktiska padding-värden inventoradde 2026-05-14
|
|
132
|
+
via `grep -rE "padding[^:]*:\s*[^;]*--space-(2|6|10|14|18|22|28|32)\b"`
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# 0018 - Outline-offset: list-rows får använda -2px (anti-clipping)
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
Locked.
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
DESIGN-LANGUAGE.md sektion 9 (etablerad 2026-05-12 via ADR 0013)
|
|
9
|
+
specificerade `outline: 2px solid var(--border-focus); outline-offset: 2px`
|
|
10
|
+
som regel för alla interaktiva element.
|
|
11
|
+
|
|
12
|
+
Audit 2026-05-14 (Ekonom UI/UX/CSS-cykel) visade att paketet självt
|
|
13
|
+
använder `outline-offset: -2px` på 5 komponenter:
|
|
14
|
+
|
|
15
|
+
| Fil | Selector | Värde |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| `collapsible.css:50` | `.collapsible__header:focus-visible` | `-2px` |
|
|
18
|
+
| `setting-row.css:63` | `.setting-row:focus-visible` | `-2px` |
|
|
19
|
+
| `sheet-content.css:101` | `.sheet__item:focus-visible` | `-1px` |
|
|
20
|
+
| `sheet-content.css:150` | `.sheet__btn--save:focus-visible` | `-1px` |
|
|
21
|
+
| `dropdown.css:72` | `.dropdown__item:focus-visible` | `-2px` |
|
|
22
|
+
|
|
23
|
+
Plus i Ekonom-domain:
|
|
24
|
+
- `ekonom.css:162` `.cat-row__header:focus-visible` `-2px`
|
|
25
|
+
- `ekonom.css:229` `.cat-list-row[data-tx-id]:focus-visible` `-2px`
|
|
26
|
+
- `ekonom.css:319` `.sub-row:focus-visible` `-2px`
|
|
27
|
+
|
|
28
|
+
Detta är **inte** slarv. Negative offset placerar outline _innanför_
|
|
29
|
+
elementets borders, vilket är nödvändigt för:
|
|
30
|
+
|
|
31
|
+
1. **List-rows utan visible border**: outline +2px hänger utanför
|
|
32
|
+
elementet och clip:as av parent-list-row's border eller scroll-
|
|
33
|
+
container's `overflow: hidden`. Result: outline syns delvis eller
|
|
34
|
+
inte alls vid keyboard-fokus.
|
|
35
|
+
2. **Dropdown-items inom radius-14-clippad menu**: outline +2px på
|
|
36
|
+
sista item:t clip:as av menu-borderns BR.
|
|
37
|
+
3. **Items inom collapsible/sheet/card med BR-clipping**: samma
|
|
38
|
+
problem.
|
|
39
|
+
|
|
40
|
+
Standalone-element (knappar, inputs, links i text) har visible borders
|
|
41
|
+
eller tillräcklig spacing för outline +2px.
|
|
42
|
+
|
|
43
|
+
## Decision
|
|
44
|
+
|
|
45
|
+
**Outline-offset är context-sensitive:**
|
|
46
|
+
|
|
47
|
+
### -2px (inom-element, "inset")
|
|
48
|
+
|
|
49
|
+
Använd för items inom radius-clippade containers eller list-rader
|
|
50
|
+
utan visible border:
|
|
51
|
+
- `.list-row:focus-visible`
|
|
52
|
+
- `.setting-row:focus-visible`
|
|
53
|
+
- `.collapsible__header:focus-visible`
|
|
54
|
+
- `.sheet__item:focus-visible` (`-1px` pga tightare BR)
|
|
55
|
+
- `.sheet__btn--save:focus-visible` (`-1px`)
|
|
56
|
+
- `.dropdown__item:focus-visible`
|
|
57
|
+
- App-domain list-rows (Ekonom: `.cat-row__header`, `.cat-list-row[data-tx-id]`,
|
|
58
|
+
`.sub-row`; Jubb: motsvarande list-row-typer)
|
|
59
|
+
|
|
60
|
+
### +2px (utanför-element, "outset")
|
|
61
|
+
|
|
62
|
+
Använd för standalone-element med visible border eller tillräcklig
|
|
63
|
+
spacing:
|
|
64
|
+
- `.btn:focus-visible`
|
|
65
|
+
- `.input:focus-visible` (text-input-undantag - använder `:focus`
|
|
66
|
+
istället per ADR-konvention, men om outline används är det +2px)
|
|
67
|
+
- `.skip-link:focus`
|
|
68
|
+
- `.chip:focus-visible`
|
|
69
|
+
- `.month-pill a:focus-visible`
|
|
70
|
+
- Topbar-actions (`.btn--icon`, `.pwa-avatar`, `.avatar` med focus)
|
|
71
|
+
- Generic `:focus-visible`-default i app/base.css
|
|
72
|
+
|
|
73
|
+
### Komposita BR (för list-row med inset)
|
|
74
|
+
|
|
75
|
+
`border-radius: var(--radius-4)` på outline:n så den följer en mjuk
|
|
76
|
+
form, inte fyrkantig 0px. Per app/base.css default `:focus-visible`-rule.
|
|
77
|
+
|
|
78
|
+
### Outline-bredd
|
|
79
|
+
|
|
80
|
+
`2px solid var(--accent-9)` (paket) eller `var(--border-focus)` (ADR
|
|
81
|
+
0013-spec). Båda är acceptabla token-konsumenter.
|
|
82
|
+
|
|
83
|
+
## Konsekvenser
|
|
84
|
+
|
|
85
|
+
**Bra:**
|
|
86
|
+
- Doktrinen matchar paketets faktiska implementation
|
|
87
|
+
- Future-CC har klar regel för var att applicera vilken offset
|
|
88
|
+
- Inset-värdet är _korrekt_ för list-rows (anti-clipping är funktionell
|
|
89
|
+
design, inte slarv)
|
|
90
|
+
- Stylelint-plugin (Sprint 5) kan validera per-komponent-typ
|
|
91
|
+
|
|
92
|
+
**Trade-offs:**
|
|
93
|
+
- Två varianter av outline-offset i systemet (-2/-1 vs +2). Komplexitet
|
|
94
|
+
ökar marginellt.
|
|
95
|
+
- Visuell skillnad mellan inset och outset är märkbar för
|
|
96
|
+
keyboard-användare. Outset är mer prominent, inset är mer subtil.
|
|
97
|
+
Trade-off: subtilitet vs synlighet. Anti-clipping vinner.
|
|
98
|
+
|
|
99
|
+
## Migration
|
|
100
|
+
|
|
101
|
+
**Ingen migration krävs.** Paketet och appar är redan i låst state.
|
|
102
|
+
ADR dokumenterar bara regeln post-hoc.
|
|
103
|
+
|
|
104
|
+
Sprint F i Ekonom-auditen 2026-05-14 skippades baserat på denna analys -
|
|
105
|
+
fyndet var inte ett brott utan en medveten design-pattern som doktrinen
|
|
106
|
+
inte hade dokumenterat.
|
|
107
|
+
|
|
108
|
+
## Stylelint-plugin (Sprint 5, framtida)
|
|
109
|
+
|
|
110
|
+
Validera:
|
|
111
|
+
- `outline-offset: -1px` eller `-2px` är endast tillåtet på selectors
|
|
112
|
+
som matchar list-row-/dropdown-item-/sheet-item-pattern
|
|
113
|
+
- `outline-offset: 2px` på alla andra :focus-visible-regler
|
|
114
|
+
- Varning vid avvikelse från ADR-tabellen ovan
|
|
115
|
+
|
|
116
|
+
## References
|
|
117
|
+
|
|
118
|
+
- DESIGN-LANGUAGE.md sektion 9 (uppdaterad 2026-05-14)
|
|
119
|
+
- ADR 0013 (visual-coherence-doctrine) - tidigare regel
|
|
120
|
+
- Ekonom DECISIONS 2026-05-14 (audit-cykel skip-rationale för Sprint F)
|
|
121
|
+
- Audit-not: paketets faktiska outline-offset-värden inventoradde
|
|
122
|
+
2026-05-14 via `grep -rEn "outline-offset:\s*-" app/static/css/ds/`
|
|
@@ -147,29 +147,67 @@ container (hero, page-header).
|
|
|
147
147
|
- Hardkodad font-size för titel-element (använd `.hero__amount`
|
|
148
148
|
eller `.page-title`)
|
|
149
149
|
|
|
150
|
-
## 4. Padding-rytm (
|
|
150
|
+
## 4. Padding-rytm (tio värden + per-komponent-låsningar)
|
|
151
151
|
|
|
152
|
-
**Regel:**
|
|
152
|
+
**Regel:** padding i komponent-CSS ska vara EN av tio tillåtna tokens.
|
|
153
|
+
Per-komponent-typ är värdena låsta i ADR 0017 så samma komponent-typ
|
|
154
|
+
har samma padding över paket och appar.
|
|
153
155
|
|
|
154
|
-
|
|
156
|
+
### Tillåtna värden
|
|
157
|
+
|
|
158
|
+
| Värde | Token | Typisk användning |
|
|
155
159
|
|---|---|---|
|
|
156
|
-
| 4px | `--space-4` | Mini-gaps, badge inner
|
|
157
|
-
|
|
|
158
|
-
|
|
|
159
|
-
|
|
|
160
|
+
| 4px | `--space-4` | Mini-gaps, badge inner |
|
|
161
|
+
| 6px | `--space-6` | Compact form-spacing, sheet-form vertical |
|
|
162
|
+
| 8px | `--space-8` | Standard gap, btn--sm v-padding, icon-margin |
|
|
163
|
+
| 10px | `--space-10` | List-row v-padding, panel inner-h |
|
|
164
|
+
| 12px | `--space-12` | Btn default v-padding, input v-padding |
|
|
165
|
+
| 14px | `--space-14` | Setting-row v-padding, banner/hub-card v-padding, input h |
|
|
166
|
+
| 16px | `--space-16` | Card internal, panel inner-h, hero, banner h |
|
|
167
|
+
| 18px | `--space-18` | Panel h-padding |
|
|
160
168
|
| 20px | `--space-20` | Section gap, hero-internal vertical |
|
|
161
169
|
| 24px | `--space-24` | Major section break |
|
|
162
170
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
171
|
+
### Per-komponent-typ-låsningar (ADR 0017)
|
|
172
|
+
|
|
173
|
+
| Komponent-typ | V-padding | H-padding |
|
|
174
|
+
|---|---|---|
|
|
175
|
+
| `.list-row` | 10 | 0 |
|
|
176
|
+
| `.setting-row` | 14 | 0 |
|
|
177
|
+
| `.banner` | 14 | 16 |
|
|
178
|
+
| `.card` | 16 | 16 |
|
|
179
|
+
| `.panel` | 16 | 18 |
|
|
180
|
+
| `.hub-card` | 14 | 16 |
|
|
181
|
+
| `.btn` (default) | 12 | 16 |
|
|
182
|
+
| `.btn--sm` | 8 | 12 |
|
|
183
|
+
| `.input` | 12 | 14 |
|
|
184
|
+
| `.input` (compact) | 6 | 10 |
|
|
185
|
+
| `.sheet__item` | 12 | 14 |
|
|
186
|
+
| `.tooltip` | 8 | 12 |
|
|
187
|
+
| `.toast` (paket) | 12 | 16 |
|
|
188
|
+
|
|
189
|
+
App-domain-komponenter som spelar samma roll följer samma värden.
|
|
190
|
+
|
|
191
|
+
### Förbjudet
|
|
192
|
+
|
|
193
|
+
Värden 2, 22, 26, 30 i komponent-CSS - oanvända i paketet, bryter
|
|
194
|
+
rytmen. 28+ är layout-tokens, inte komponent-padding.
|
|
195
|
+
|
|
196
|
+
### Sammansatta padding (TRBL)
|
|
166
197
|
|
|
167
|
-
**Sammansatta padding (TRBL)**:
|
|
168
198
|
- Symmetric preferred: `padding: 16px` ✓
|
|
169
199
|
- Vertical-horizontal: `padding: 12px 16px` ✓
|
|
170
200
|
- Asymmetric only with rationale: `padding: 20px 0 24px` (hero) -
|
|
171
201
|
kommentar med motivering krävs
|
|
172
202
|
|
|
203
|
+
### Etablerad 2026-05-14
|
|
204
|
+
|
|
205
|
+
Tidigare 6-värdes-skalan (ADR 0013) var aspirationell utan paket-
|
|
206
|
+
verifiering. Per Calle: "Det är ok att ändra regler och göra det
|
|
207
|
+
bättre, men då måste det implementeras brett." Ny skala matchar
|
|
208
|
+
faktisk paket-implementation. Se ADR 0017 för rationale + tabellen
|
|
209
|
+
över per-komponent-låsningar.
|
|
210
|
+
|
|
173
211
|
## 5. Font-size-skala (åtta värden)
|
|
174
212
|
|
|
175
213
|
**Regel:** font-size i komponent-CSS ska vara EN av token-skalan:
|
|
@@ -251,6 +289,24 @@ egna `margin-bottom`. Välj en mekanism per kontext.
|
|
|
251
289
|
- List-rows: `padding: 14px 0` minimum (= 50px height med text-line).
|
|
252
290
|
- Icon-buttons: `width: 44px; height: 44px`.
|
|
253
291
|
|
|
292
|
+
### Focus-ring (outline-offset context-sensitive)
|
|
293
|
+
|
|
294
|
+
Outline-offset är **inte** alltid `+2px`. Inom radius-clippade
|
|
295
|
+
containers eller list-rader utan visible border klipps `+2px` outline
|
|
296
|
+
av parent. Använd inset (`-2px` eller `-1px`) i dessa fall för
|
|
297
|
+
synlig fokus-ring.
|
|
298
|
+
|
|
299
|
+
| Kontext | offset | Komponenter |
|
|
300
|
+
|---|---|---|
|
|
301
|
+
| Standalone-element med border eller spacing | `+2px` | `.btn`, `.chip`, `.skip-link`, `.month-pill a`, topbar-actions, generic `:focus-visible` |
|
|
302
|
+
| List-rader utan visible border | `-2px` | `.list-row`, `.setting-row`, `.collapsible__header`, `.dropdown__item` |
|
|
303
|
+
| Items inom radius-clippad menu/sheet | `-1px` | `.sheet__item`, `.sheet__btn--save` (tightare BR kräver -1) |
|
|
304
|
+
| App-domain list-rows | `-2px` | Ekonom `.cat-row__header`/`.cat-list-row[data-tx-id]`/`.sub-row`; Jubb motsvarande |
|
|
305
|
+
|
|
306
|
+
`outline: 2px solid var(--accent-9)` (eller `var(--border-focus)`) +
|
|
307
|
+
`border-radius: var(--radius-4)` på outline:n så den följer en mjuk
|
|
308
|
+
form. Se ADR 0018 för full rationale.
|
|
309
|
+
|
|
254
310
|
### Mobile-first
|
|
255
311
|
|
|
256
312
|
- Default-styles är mobile (375-430 viewport).
|