@klodd/ds 4.3.0 → 4.5.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.
@@ -438,3 +438,29 @@
438
438
  --surface-medium: color-mix(in oklch, white 8%, transparent);
439
439
  --surface-strong: color-mix(in oklch, white 12%, transparent);
440
440
  }
441
+
442
+
443
+ /* ================================================================
444
+ ==== BAR-FAMILJEN (v4.5.0, ADR 0021)
445
+ Shared tokens som alla bar-komponenter (progress, hbar, split-bar,
446
+ colored-bar, column-bar, dual-bar) lasr istallet for att duplicera
447
+ bg-/radius-/color-varden. Andra en token, andras overallt.
448
+
449
+ Komponenter som har medvetet annorlunda track-bg (column-bar,
450
+ dual-bar = sunken; progress = raised) override:ar --bar-track-color
451
+ pa block-roten. Steg 1 (no visual change). Steg 2 senare: harmonisera
452
+ till EN default om Calle vill.
453
+
454
+ Komponenter med specifika fill-tjocklekar (4/6/8/12px / vertical-flex)
455
+ behaller dessa lokalt - tjocklek ar designval per komponent-typ.
456
+ ================================================================ */
457
+ :root {
458
+ --bar-track-color: var(--surface-active);
459
+ --bar-track-radius: var(--radius-full);
460
+ --bar-fill-radius: var(--radius-full);
461
+ --bar-fill-color: var(--accent-9);
462
+ --bar-fill-color-positive: var(--positive);
463
+ --bar-fill-color-warning: var(--warning);
464
+ --bar-fill-color-negative: var(--negative);
465
+ --bar-fill-transition: width var(--dur-medium) var(--ease-spring-snappy);
466
+ }
@@ -20,9 +20,11 @@
20
20
  Se references/02-components.md "Kategori-monstret".
21
21
  ================================================================ */
22
22
  .colored-bar {
23
- background: var(--bar-accent, var(--accent-9));
23
+ /* v4.5.0 (ADR 0021): konsumerar shared --bar-fill-color istallet for
24
+ direkt --accent-9. --bar-accent-binding bevaras for app-domain-tokens. */
25
+ background: var(--bar-accent, var(--bar-fill-color));
24
26
  height: 100%;
25
- border-radius: var(--radius-full);
27
+ border-radius: var(--bar-fill-radius);
26
28
  transition: width var(--dur-base) var(--ease-out);
27
29
  }
28
30
 
@@ -0,0 +1,78 @@
1
+ /* ================================================================
2
+ components/column-bar.css
3
+ Vertikal historik-stapel - en per period (manad, vecka). Visar
4
+ tabular-value over baren + label under. Hojd baseras pa fill-
5
+ percent (data-bar-height).
6
+
7
+ Komplement till .hbar (horisontell). .hbar lampar single-bar med
8
+ label+value-rad bredvid; .column-bar staplar manader-kolumner i
9
+ en rad sa user kan jamfora over tid.
10
+
11
+ Lyft fran Ekonom v4.4.0 (var .amort-bar, ADR 0020).
12
+
13
+ Blocks:
14
+ .column-bar-list - flex-wrapper for flera column-bars (height 160px)
15
+ .column-bar - en kolumn (flex: 1)
16
+
17
+ Element:
18
+ .column-bar__value - tabular-amount over baren
19
+ .column-bar__track - track-container (full kolumn-height)
20
+ .column-bar__fill - faktisk faded fill (positive-color default)
21
+ .column-bar__label - micro-label under baren
22
+ ================================================================ */
23
+ .column-bar-list {
24
+ display: flex;
25
+ gap: var(--space-10);
26
+ align-items: flex-end;
27
+ height: 160px;
28
+ padding: var(--space-16) 0 0;
29
+ }
30
+
31
+ .column-bar {
32
+ flex: 1;
33
+ display: flex;
34
+ flex-direction: column;
35
+ align-items: center;
36
+ gap: var(--space-6);
37
+ height: 100%;
38
+ justify-content: flex-end;
39
+ }
40
+
41
+ .column-bar__value {
42
+ font-size: var(--fs-11);
43
+ font-weight: var(--fw-medium);
44
+ color: var(--text-subtle);
45
+ font-variant-numeric: tabular-nums;
46
+ }
47
+
48
+ .column-bar__track {
49
+ /* v4.5.0 (ADR 0021): per-komponent override av --bar-track-color
50
+ (sunken vs default-active) och --bar-track-radius (4px vs full) -
51
+ vertikal stapel skulle bli oval med radius-full. */
52
+ --bar-track-color: var(--surface-sunken);
53
+ --bar-track-radius: var(--radius-4);
54
+ width: 100%;
55
+ flex: 1;
56
+ background: var(--bar-track-color);
57
+ border-radius: var(--bar-track-radius);
58
+ overflow: hidden;
59
+ display: flex;
60
+ align-items: flex-end;
61
+ min-height: 0;
62
+ }
63
+
64
+ .column-bar__fill {
65
+ width: 100%;
66
+ background: var(--bar-fill-color-positive);
67
+ border-radius: var(--radius-4);
68
+ transition: var(--tr-height-slower);
69
+ }
70
+
71
+ .column-bar__label {
72
+ font-size: var(--fs-11);
73
+ color: var(--text-muted);
74
+ }
75
+
76
+ @media (prefers-reduced-motion: reduce) {
77
+ .column-bar__fill { transition: none; }
78
+ }
@@ -0,0 +1,64 @@
1
+ /* ================================================================
2
+ components/dual-bar.css
3
+ Horisontell stapel med tva separata fills - en for varje delvarde
4
+ (t.ex. amortering vs varde-okning). Skiljer sig fran .split-bar
5
+ som ar ETT span med segment; .dual-bar har separata rows fr varje
6
+ varde med egen meta-text.
7
+
8
+ Typisk anvandning: bolane-formogenhet (amorterat belopp vs
9
+ marknadsvarde-uppskattning), portfolio-fordelning, sparmal-progress.
10
+
11
+ Lyft fran Ekonom v4.4.0 (var .equity-bar-row + .equity-amort/
12
+ .equity-apprec, ADR 0020).
13
+
14
+ Blocks:
15
+ .dual-bar - rad med track + fill + meta-text
16
+
17
+ Element:
18
+ .dual-bar__track - track-container (height 12px)
19
+ .dual-bar__fill - faktisk fill (positive default)
20
+ .dual-bar__meta - hoger-stalld meta-text
21
+
22
+ Modifiers:
23
+ .dual-bar__fill--amort - positive-color (amortering)
24
+ .dual-bar__fill--apprec - accent-color (uppskattning)
25
+ ================================================================ */
26
+ .dual-bar {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: var(--space-12);
30
+ margin-bottom: var(--space-10);
31
+ }
32
+
33
+ .dual-bar__track {
34
+ /* v4.5.0 (ADR 0021): per-komponent override av --bar-track-color
35
+ (sunken vs default-active). */
36
+ --bar-track-color: var(--surface-sunken);
37
+ flex: 1;
38
+ height: 12px;
39
+ background: var(--bar-track-color);
40
+ border-radius: var(--bar-track-radius);
41
+ overflow: hidden;
42
+ }
43
+
44
+ .dual-bar__fill {
45
+ height: 100%;
46
+ border-radius: var(--bar-fill-radius);
47
+ background: var(--bar-fill-color-positive);
48
+ transition: var(--tr-width-slower);
49
+ }
50
+
51
+ .dual-bar__fill--amort { background: var(--bar-fill-color-positive); }
52
+ .dual-bar__fill--apprec { background: var(--bar-fill-color); }
53
+
54
+ .dual-bar__meta {
55
+ display: flex;
56
+ flex-direction: column;
57
+ align-items: flex-end;
58
+ min-width: 5.5rem;
59
+ line-height: var(--lh-relaxed);
60
+ }
61
+
62
+ @media (prefers-reduced-motion: reduce) {
63
+ .dual-bar__fill { transition: none; }
64
+ }
@@ -0,0 +1,176 @@
1
+ /* ================================================================
2
+ components/expandable-row.css
3
+ Klickbar collapsible-summary-rad. Header visar label + total-amount
4
+ + chevron. Body visas nar expanderad (via JS data-expanded + CSS
5
+ :has-style eller class-toggling).
6
+
7
+ Anvands for kategori-rollups (Mat 1234 kr expanderar till listing
8
+ av transaktioner), sektion-totaler, drill-down-aggregat.
9
+
10
+ Lyft fran Ekonom v4.4.0 (var .cat-row + .cat-list-row, ADR 0020).
11
+
12
+ Blocks:
13
+ .expandable-row - block med header + collapsible body
14
+ .expandable-list - <ul>-wrapper for flera expandable-rows
15
+ .expandable-row__item - BEM-element: nested item inom expanderad
16
+ body (anvands utan att vara child av
17
+ .expandable-row i CSS, lever via JS-
18
+ expansion)
19
+
20
+ Element:
21
+ .expandable-row__header - klickbar header-rad
22
+ .expandable-row__label - vansterstalld text
23
+ .expandable-row__amount - hoger-stalld tabular-amount
24
+ .expandable-row__chev - chevron-svg, roterar 180deg vid expanded
25
+ .expandable-row__total - footer-rad med summa nar body expanderad
26
+
27
+ Item-element:
28
+ .expandable-row__item-list - <ul>-wrapper for items inom body
29
+ .expandable-row__item-body - container for item-rad
30
+ .expandable-row__item-desc - description-text (ellipsis-truncerad)
31
+ .expandable-row__item-date - micro-date-text
32
+ .expandable-row__item-amount - tabular-amount
33
+
34
+ Item-modifiers:
35
+ .expandable-row__item--excluded - strikethrough + muted
36
+ .expandable-row__item--pending - subtle-color amount
37
+ .expandable-row__item--clickable - hover/focus-feedback
38
+ .expandable-row__item--credit - positive-fargad amount
39
+ ================================================================ */
40
+
41
+ .expandable-list {
42
+ list-style: none;
43
+ padding: 0;
44
+ margin: 0;
45
+ }
46
+
47
+ .expandable-row {
48
+ border-top: var(--border-hairline-subtle);
49
+ }
50
+
51
+ .expandable-row:first-child {
52
+ border-top: 0;
53
+ }
54
+
55
+ .expandable-row__header {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: var(--space-10);
59
+ padding: var(--space-10) 0;
60
+ cursor: pointer;
61
+ font-size: var(--fs-14);
62
+ color: var(--text-default);
63
+ }
64
+
65
+ .expandable-row__header:focus-visible {
66
+ outline: 2px solid var(--accent-9);
67
+ outline-offset: -2px;
68
+ border-radius: var(--radius-4);
69
+ }
70
+
71
+ .expandable-row[data-expanded] .expandable-row__chev {
72
+ transform: rotate(180deg);
73
+ }
74
+
75
+ .expandable-row__label { flex: 1; min-width: 0; }
76
+ .expandable-row__amount { font-variant-numeric: tabular-nums; color: var(--text-default); }
77
+
78
+ .expandable-row__chev {
79
+ color: var(--text-muted);
80
+ transition: var(--tr-transform-medium);
81
+ flex-shrink: 0;
82
+ }
83
+
84
+ .expandable-row__total {
85
+ display: flex;
86
+ gap: var(--space-10);
87
+ padding: var(--space-12) 0 var(--space-4);
88
+ font-weight: var(--fw-medium);
89
+ border-top: var(--border-hairline-default);
90
+ }
91
+
92
+ .expandable-row__total .expandable-row__amount { font-weight: var(--fw-medium); }
93
+
94
+
95
+ /* ================================================================
96
+ ==== ITEMS (inom expanderad body)
97
+ ================================================================ */
98
+
99
+ .expandable-row__item-list {
100
+ list-style: none;
101
+ padding: var(--space-4) 0 var(--space-12) var(--space-12);
102
+ margin: 0;
103
+ border-left: var(--bw-medium) solid var(--border-subtle);
104
+ }
105
+
106
+ .expandable-row__item {
107
+ display: flex;
108
+ align-items: center;
109
+ gap: var(--space-10);
110
+ padding: var(--space-6) 0;
111
+ font-size: var(--fs-13);
112
+ }
113
+
114
+ .expandable-row__item-body {
115
+ flex: 1;
116
+ min-width: 0;
117
+ display: flex;
118
+ flex-direction: column;
119
+ gap: var(--space-2);
120
+ }
121
+
122
+ .expandable-row__item-desc {
123
+ color: var(--text-subtle);
124
+ white-space: nowrap;
125
+ overflow: hidden;
126
+ text-overflow: ellipsis;
127
+ }
128
+
129
+ .expandable-row__item-date {
130
+ font-size: var(--fs-11);
131
+ color: var(--text-muted);
132
+ }
133
+
134
+ .expandable-row__item-amount {
135
+ color: var(--text-subtle);
136
+ font-variant-numeric: tabular-nums;
137
+ flex-shrink: 0;
138
+ }
139
+
140
+
141
+ /* ================================================================
142
+ ==== ITEM MODIFIERS
143
+ ================================================================ */
144
+
145
+ .expandable-row__item--clickable {
146
+ cursor: pointer;
147
+ transition: var(--tr-bg-fast);
148
+ }
149
+
150
+ @media (hover: hover) and (pointer: fine) {
151
+ .expandable-row__item--clickable:hover { background: var(--surface-subtle); }
152
+ }
153
+
154
+ .expandable-row__item--clickable:focus-visible {
155
+ outline: 2px solid var(--accent-9);
156
+ outline-offset: -2px;
157
+ border-radius: var(--radius-4);
158
+ }
159
+
160
+ .expandable-row__item--excluded .expandable-row__item-desc,
161
+ .expandable-row__item--excluded .expandable-row__item-amount {
162
+ color: var(--text-muted);
163
+ }
164
+
165
+ .expandable-row__item--excluded .expandable-row__item-amount {
166
+ text-decoration: line-through;
167
+ text-decoration-thickness: 1px;
168
+ }
169
+
170
+ .expandable-row__item--pending .expandable-row__item-amount {
171
+ color: var(--text-subtle);
172
+ }
173
+
174
+ .expandable-row__item--credit .expandable-row__item-amount {
175
+ color: var(--positive);
176
+ }
@@ -43,21 +43,26 @@
43
43
  .hbar__track {
44
44
  width: 100%;
45
45
  height: var(--space-6);
46
- background: var(--surface-active);
47
- border-radius: var(--radius-full);
46
+ background: var(--bar-track-color);
47
+ border-radius: var(--bar-track-radius);
48
48
  overflow: hidden;
49
49
  }
50
50
 
51
51
  .hbar__fill {
52
52
  height: 100%;
53
- background: var(--accent-9);
54
- border-radius: var(--radius-full);
55
- transition: width var(--dur-medium) var(--ease-spring-snappy);
53
+ /* v4.4.0 (ADR 0020): --bar-accent-binding for app-domain-kategorier.
54
+ Default --bar-fill-color (=--accent-9) om bindning saknas. App-domain
55
+ CSS satter --bar-accent via wrapper-klass: <div class="hbar__fill cat-mat">.
56
+ v4.5.0 (ADR 0021): konsumerar shared --bar-fill-color istallet for
57
+ direkt --accent-9. */
58
+ background: var(--bar-accent, var(--bar-fill-color));
59
+ border-radius: var(--bar-fill-radius);
60
+ transition: var(--bar-fill-transition);
56
61
  }
57
62
 
58
- .hbar__fill--positive { background: var(--positive); }
59
- .hbar__fill--warning { background: var(--warning); }
60
- .hbar__fill--negative { background: var(--negative); }
63
+ .hbar__fill--positive { background: var(--bar-fill-color-positive); }
64
+ .hbar__fill--warning { background: var(--bar-fill-color-warning); }
65
+ .hbar__fill--negative { background: var(--bar-fill-color-negative); }
61
66
 
62
67
  @media (prefers-reduced-motion: reduce) {
63
68
  .hbar__fill { transition: none; }
@@ -0,0 +1,46 @@
1
+ /* ================================================================
2
+ components/icon-circle.css
3
+ Rund icon-container med tonad bakgrund. Anvands for status-
4
+ indikatorer i list-rader (bank-koppling kompletterad, level-up
5
+ uppnatt, notis-dot etc).
6
+
7
+ Storlek 28x28 default - tatare an .avatar (36x36) for in-line
8
+ placement bredvid text-rader.
9
+
10
+ Lyft fran Ekonom v4.4.0 (var .bank-row-icon, ADR 0020).
11
+
12
+ Blocks:
13
+ .icon-circle - 28x28 round icon-container
14
+
15
+ Modifiers:
16
+ .icon-circle--positive - gron tonad bg + gron icon-color (check etc)
17
+ .icon-circle--warning - warning-tonad bg + warning-color
18
+ .icon-circle--negative - danger-tonad bg + danger-color
19
+ ================================================================ */
20
+ .icon-circle {
21
+ display: inline-flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ width: var(--space-28);
25
+ height: var(--space-28);
26
+ margin-right: var(--space-12);
27
+ border-radius: 50%;
28
+ flex-shrink: 0;
29
+ background: var(--surface-default);
30
+ color: var(--text-subtle);
31
+ }
32
+
33
+ .icon-circle--positive {
34
+ background: var(--positive-dim);
35
+ color: var(--positive);
36
+ }
37
+
38
+ .icon-circle--warning {
39
+ background: var(--warning-dim);
40
+ color: var(--warning);
41
+ }
42
+
43
+ .icon-circle--negative {
44
+ background: var(--negative-dim, var(--bg-danger));
45
+ color: var(--negative, var(--accent-danger));
46
+ }
@@ -121,6 +121,32 @@
121
121
  }
122
122
 
123
123
 
124
+ /* ================================================================
125
+ ==== COMPACT-VARIANT (v4.4.0 lyft fran Ekonom, ADR 0020)
126
+ Mini-input for inline-rader (upload-preview, avi-edit, snabb-edit
127
+ inom listrader). Mindre min-height, tightare padding, fs-16 (anti
128
+ iOS auto-zoom kvar - bara 17 -> 16). Max-width default 160 sa de
129
+ inte tar overheight i compact-rader. Apparna overrider max-width
130
+ per kontext om relevant.
131
+
132
+ Sufficient for inline-numeriska eller short text-inputs.
133
+ Wrap-up-pattern: <input class="input input--compact" inputmode="decimal">
134
+ ================================================================ */
135
+ .input--compact,
136
+ .select.input--compact {
137
+ min-height: auto;
138
+ width: auto;
139
+ max-width: 160px;
140
+ padding: var(--space-6) var(--space-10);
141
+ font-size: var(--fs-16);
142
+ }
143
+
144
+ .select.input--compact {
145
+ padding-right: var(--space-28);
146
+ background-position: right var(--space-10) center;
147
+ }
148
+
149
+
124
150
  /* ================================================================
125
151
  ==== INPUT-GROUP (label + input + error)
126
152
  Wrapper for ett komplett input-falt med metadata.
@@ -0,0 +1,43 @@
1
+ /* ================================================================
2
+ components/item-stack.css
3
+ Grupp av identiska items som collapsible-staplade en presentation.
4
+ Header visar "X st" + summa, body expanderar till N individuella rader.
5
+
6
+ Typisk anvandning: identiska transaktioner (samma description, samma
7
+ merchant) som grupperas under en wrapper med expand-toggle - sa user
8
+ ser inte "Netflix 139 kr" sex ganger utan en stack "Netflix (6 st)"
9
+ som kan expanderas.
10
+
11
+ Lyft fran Ekonom v4.4.0 (var .cat-tx-stack, ADR 0020).
12
+
13
+ Blocks:
14
+ .item-stack - block med collapsible header + body
15
+
16
+ Element:
17
+ .item-stack__icon - file-stack-ikon till vanster (accent nar
18
+ expanded, muted default)
19
+ .item-stack__header - klickbar header-rad ("Netflix (6 st)" + summa)
20
+ .item-stack__body - <ul> med individuella items
21
+ ================================================================ */
22
+ .item-stack {
23
+ list-style: none;
24
+ }
25
+
26
+ .item-stack__icon {
27
+ color: var(--text-muted);
28
+ flex-shrink: 0;
29
+ }
30
+
31
+ .item-stack__header {
32
+ cursor: pointer;
33
+ }
34
+
35
+ .item-stack[data-expanded] .item-stack__icon {
36
+ color: var(--accent-9);
37
+ }
38
+
39
+ .item-stack__body {
40
+ list-style: none;
41
+ margin: 0;
42
+ padding: 0 0 0 var(--space-22);
43
+ }
@@ -0,0 +1,22 @@
1
+ /* ================================================================
2
+ components/kvp-arrow.css
3
+ Key-value-pair-arrow + target. Visualiserar mapping fran ett
4
+ keyword/key till en kategori/target. Typisk anvandning: rule-
5
+ editors dar man visar "ICA -> Mat" eller "STANDARD -> Premium".
6
+
7
+ Lyft fran Ekonom v4.4.0 (var .rule-arrow + .rule-cat, ADR 0020).
8
+
9
+ Blocks:
10
+ .kvp-arrow - disabled-fargad arrow-text ("->")
11
+ .kvp-target - accent-fargad target-text (vad keyword:et mappar till)
12
+ ================================================================ */
13
+ .kvp-arrow {
14
+ color: var(--text-disabled);
15
+ margin: 0 var(--space-4);
16
+ font-weight: var(--fw-regular);
17
+ }
18
+
19
+ .kvp-target {
20
+ color: var(--accent-9);
21
+ font-weight: var(--fw-medium);
22
+ }
@@ -0,0 +1,51 @@
1
+ /* ================================================================
2
+ components/matched-row.css
3
+ Rad-pattern for items som har match/pending-status. Klickbar rad
4
+ med status-icon till vanster. State-modifiers styr visual feedback.
5
+
6
+ Typisk anvandning: lista av forvantade items dar varje rad far
7
+ visual indicator om den matchats mot en faktisk handelse
8
+ (subscription-placeholders matchade mot bank-tx, kalender-events
9
+ matchade mot kalkyl etc).
10
+
11
+ Lyft fran Ekonom v4.4.0 (var .sub-row, ADR 0020). Lever ofta inom
12
+ .expandable-row__item men kan vara standalone.
13
+
14
+ Blocks:
15
+ .matched-row - klickbar rad med match-status
16
+
17
+ Element:
18
+ .matched-row__status-icon - 18px width-slot for SVG-icon till vanster
19
+
20
+ Modifiers:
21
+ .matched-row--matched - positive-state (gron icon, default-text)
22
+ .matched-row--pending - awaiting-state (gra icon, italic, 72% opacity)
23
+ ================================================================ */
24
+ .matched-row {
25
+ cursor: pointer;
26
+ transition: var(--tr-bg-fast);
27
+ padding-left: var(--space-4);
28
+ }
29
+
30
+ @media (hover: hover) and (pointer: fine) {
31
+ .matched-row:hover { background: var(--surface-subtle); }
32
+ }
33
+
34
+ .matched-row:focus-visible {
35
+ outline: 2px solid var(--accent-9);
36
+ outline-offset: -2px;
37
+ border-radius: var(--radius-4);
38
+ }
39
+
40
+ .matched-row__status-icon {
41
+ display: inline-flex;
42
+ align-items: center;
43
+ justify-content: center;
44
+ width: 18px;
45
+ flex-shrink: 0;
46
+ color: var(--text-muted);
47
+ }
48
+
49
+ .matched-row--matched .matched-row__status-icon { color: var(--positive); }
50
+ .matched-row--pending { opacity: 0.72; }
51
+ .matched-row--pending .matched-row__status-icon { color: var(--text-muted); }
@@ -25,20 +25,26 @@
25
25
  Respekterar prefers-reduced-motion (transition tas bort).
26
26
  ================================================================ */
27
27
  .progress {
28
+ /* v4.5.0 (ADR 0021): per-komponent override av --bar-track-color
29
+ for att behalla raised-bg (var-skillnad mot active default). */
30
+ --bar-track-color: var(--surface-raised);
28
31
  width: 100%;
29
32
  height: var(--space-6);
30
- background: var(--surface-raised);
31
- border-radius: var(--radius-full);
33
+ background: var(--bar-track-color);
34
+ border-radius: var(--bar-track-radius);
32
35
  overflow: hidden;
33
36
  }
34
37
 
35
38
  .progress__bar {
36
39
  height: 100%;
37
- background: var(--accent-9);
38
- border-radius: var(--radius-full);
40
+ background: var(--bar-fill-color);
41
+ border-radius: var(--bar-fill-radius);
39
42
  transition: width var(--dur-base) var(--ease-out);
40
43
  }
41
44
 
45
+ /* Progress-specifika status-modifiers behaller --bg-X (solid status-bg-
46
+ tema istallet for --positive/--warning/--negative som ar text-color-
47
+ varianter). Medvetet annorlunda fran hbar/split-bar/dual-bar. */
42
48
  .progress__bar--success { background: var(--bg-success); }
43
49
  .progress__bar--warning { background: var(--bg-warning); }
44
50
  .progress__bar--danger { background: var(--bg-danger); }
@@ -0,0 +1,70 @@
1
+ /* ================================================================
2
+ components/review-banner.css
3
+ Generic warning-CTA-banner: titel + meta + chevron i pill-form.
4
+ Anvands for "X att granska/atgarda"-rader som lankar till en
5
+ review-vy. Warning-toned bakgrund.
6
+
7
+ Lyft fran Ekonom v4.4.0 (ADR 0020). Konsumeras av alla appar som
8
+ har en granskning/atgards-flow.
9
+
10
+ Blocks:
11
+ .review-banner - klickbar warning-CTA-banner
12
+
13
+ Element:
14
+ .review-banner__title - rubrik-text (fs-14 medium)
15
+ .review-banner__meta - underrubrik (fs-12 subtle)
16
+ .review-banner__chev - chevron-svg, hoger-stalld
17
+
18
+ HTML:
19
+ <a href="/granskning" class="review-banner">
20
+ <div>
21
+ <p class="review-banner__title">X att granska</p>
22
+ <p class="review-banner__meta">Mojliga utgifter</p>
23
+ </div>
24
+ <svg class="review-banner__chev"...></svg>
25
+ </a>
26
+ ================================================================ */
27
+ .review-banner {
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: space-between;
31
+ gap: var(--space-12);
32
+ background: var(--warning-dim);
33
+ border: var(--bw-hairline) solid var(--warning-border);
34
+ border-radius: var(--radius-14);
35
+ padding: var(--space-14) var(--space-16);
36
+ margin-bottom: var(--space-14);
37
+ color: var(--text-default);
38
+ text-decoration: none;
39
+ transition: var(--tr-bg-base);
40
+ }
41
+
42
+ @media (hover: hover) and (pointer: fine) {
43
+ .review-banner:hover {
44
+ text-decoration: none;
45
+ background: var(--warning-hover, var(--warning-dim));
46
+ }
47
+ }
48
+
49
+ .review-banner:focus-visible {
50
+ outline: 2px solid var(--accent-9);
51
+ outline-offset: 2px;
52
+ }
53
+
54
+ .review-banner__title {
55
+ font-size: var(--fs-14);
56
+ font-weight: var(--fw-medium);
57
+ color: var(--text-default);
58
+ margin: 0;
59
+ }
60
+
61
+ .review-banner__meta {
62
+ font-size: var(--fs-12);
63
+ color: var(--text-subtle);
64
+ margin: var(--space-2) 0 0;
65
+ }
66
+
67
+ .review-banner__chev {
68
+ opacity: 0.7;
69
+ flex-shrink: 0;
70
+ }
@@ -10,22 +10,24 @@
10
10
  .split-bar {
11
11
  display: flex;
12
12
  height: 8px;
13
- border-radius: var(--radius-full);
13
+ border-radius: var(--bar-track-radius);
14
14
  overflow: hidden;
15
- background: var(--surface-active);
15
+ background: var(--bar-track-color);
16
16
  margin: var(--space-8) 0 var(--space-12);
17
17
  }
18
18
 
19
19
  .split-bar__segment {
20
20
  height: 100%;
21
- transition: width var(--dur-medium) var(--ease-spring-snappy);
21
+ transition: var(--bar-fill-transition);
22
22
  }
23
23
 
24
- .split-bar__segment--primary { background: var(--accent-9); }
24
+ /* v4.5.0 (ADR 0021): segments konsumerar shared --bar-fill-color-X.
25
+ --secondary anvander --text-disabled (gray-out-look, inte stadard-color). */
26
+ .split-bar__segment--primary { background: var(--bar-fill-color); }
25
27
  .split-bar__segment--secondary { background: var(--text-disabled); flex: 1; }
26
- .split-bar__segment--positive { background: var(--positive); }
27
- .split-bar__segment--negative { background: var(--negative); }
28
- .split-bar__segment--warning { background: var(--warning); }
28
+ .split-bar__segment--positive { background: var(--bar-fill-color-positive); }
29
+ .split-bar__segment--negative { background: var(--bar-fill-color-negative); }
30
+ .split-bar__segment--warning { background: var(--bar-fill-color-warning); }
29
31
 
30
32
  .split-bar__label {
31
33
  font-size: var(--fs-13);
@@ -0,0 +1,32 @@
1
+ /* ================================================================
2
+ components/status-icon.css
3
+ Inline status-icon i text-flow (clock, alert, check). Tightare
4
+ pa baseline + flex-shrink:0 sa den inte staucher i smala containers.
5
+
6
+ Anvands typiskt efter en description-text for att signalera tillstand:
7
+ pending, stale, success, warning.
8
+
9
+ Lyft fran Ekonom v4.4.0 (var .tx-pending-icon, ADR 0020).
10
+
11
+ Blocks:
12
+ .status-icon - inline-flex SVG-wrapper for status-indicator
13
+
14
+ Modifiers:
15
+ .status-icon--pending - default muted-color (clock-icon)
16
+ .status-icon--stale - warning-color (clock som blivit gammal)
17
+ .status-icon--success - positive-color (check)
18
+ .status-icon--warning - warning-color (alert)
19
+ ================================================================ */
20
+ .status-icon {
21
+ display: inline-flex;
22
+ align-items: center;
23
+ margin-left: var(--space-6);
24
+ color: var(--text-muted);
25
+ vertical-align: -2px;
26
+ flex-shrink: 0;
27
+ }
28
+
29
+ .status-icon--pending { color: var(--text-muted); }
30
+ .status-icon--stale { color: var(--warning); }
31
+ .status-icon--success { color: var(--positive); }
32
+ .status-icon--warning { color: var(--warning); }
@@ -0,0 +1,21 @@
1
+ /* ================================================================
2
+ components/tag-inline.css
3
+ Diskret inline-tag som markerar metadata in-line med brodtext.
4
+ Mindre an .chip - har ingen pill-bakgrund. Bara avvikande font-
5
+ storlek + muted color + slight tracking.
6
+
7
+ Anvands typiskt for inline-status (estimat, beta, deprecated) som
8
+ ska synas men inte dominera surrounding text.
9
+
10
+ Lyft fran Ekonom v4.4.0 (var .estimat-tag, ADR 0020).
11
+
12
+ Blocks:
13
+ .tag-inline - inline-tag i muted text-stil
14
+ ================================================================ */
15
+ .tag-inline {
16
+ font-style: normal;
17
+ font-size: var(--fs-11);
18
+ color: var(--text-muted);
19
+ font-weight: var(--fw-regular);
20
+ letter-spacing: var(--ls-tracker, 0.02em);
21
+ }
package/css/index.css CHANGED
@@ -72,3 +72,15 @@
72
72
  /* v3.9.0 - lyft fran Ekonoms LEGACY-sektion (Sprint 5 MADR 0009) */
73
73
  @import './components/kv-list.css';
74
74
  @import './components/offline.css';
75
+
76
+ /* v4.4.0 - lyft fran Ekonom-domain (ADR 0020 - domain-to-package) */
77
+ @import './components/review-banner.css';
78
+ @import './components/matched-row.css';
79
+ @import './components/status-icon.css';
80
+ @import './components/tag-inline.css';
81
+ @import './components/kvp-arrow.css';
82
+ @import './components/icon-circle.css';
83
+ @import './components/expandable-row.css';
84
+ @import './components/item-stack.css';
85
+ @import './components/column-bar.css';
86
+ @import './components/dual-bar.css';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@klodd/ds",
3
- "version": "4.3.0",
3
+ "version": "4.5.0",
4
4
  "description": "Klodd shared design system - tokens, components, JS",
5
5
  "main": "css/index.css",
6
6
  "bin": {
@@ -0,0 +1,233 @@
1
+ # 0020 - Domain-to-package lift: alla Ekonom-specifika block lyfts
2
+
3
+ ## Status
4
+ Locked. Minor version-bump (4.4.0) - additive paket-utvidgning.
5
+
6
+ ## Context
7
+
8
+ Audit 2026-05-14 (sen kvall) jamforde Ekonoms /design-styleguide mot
9
+ faktisk template-anvandning. Avslojade att 17 Ekonom-domain-block
10
+ (i `ds/ekonom.css` och `ds/ekonom-domain.css`) inte fanns representerade
11
+ i /design och inte i paketet:
12
+
13
+ - `.review-banner` + element
14
+ - `.cat-row` + element + `.cat-list-row` + modifiers + `.cat-tx-stack` + element
15
+ - `.sub-row` + modifiers + `.sub-status-icon`
16
+ - `.amort-bar` + element
17
+ - `.tx-pending-icon` + `--stale`
18
+ - `.cat-bar-*` (Tier D, 7 klasser)
19
+ - `.equity-bar-*` + amort/apprec (Tier D, 6 klasser)
20
+ - `.budget-bar-*` (Tier D, 5 klasser)
21
+ - `.cost-bar` + `-seg`
22
+ - `.cat-tx-*` (Tier D, 6 klasser)
23
+ - `.estimat-tag`
24
+ - `.btn-copy` + `.btn-bank`
25
+ - `.bank-row-icon`
26
+ - `.rule-arrow` + `.rule-cat`
27
+ - `.compact-select` + `.compact-amount-input`
28
+
29
+ Plus 4 paket-komponenter (`.profile-panel` v3.21.0, `.kv-list` v3.9.0,
30
+ `.pill-nav` v3.16.0, `.offline-*` v3.9.0) saknades i /design - finns i
31
+ paketet men ej dokumenterat i styleguiden.
32
+
33
+ Per Calle 2026-05-14 (sen kvall): "Jag vill inkludera dessa 17 i
34
+ designsystemet och darmed pa designsidan. De ska antingen vara en del
35
+ av det globala designsystemet, eller sa ska det inte finnas. Det
36
+ globala designsystemet ska vara strukturerat och fylld av element som
37
+ kan anvandas av andra appar. Aven om de idag enbart anvands specifikt
38
+ for Ekonom for en specifik sak."
39
+
40
+ Princip: **lyft eller drop, ingen mellanversion**.
41
+
42
+ ## Decision
43
+
44
+ Alla 17 lyfts. Tre strategier per element baserat pa Calle's
45
+ beslutspunkter:
46
+
47
+ ### A. Lyft som-ar eller med smarrre rename (8 element)
48
+
49
+ | Ekonom-namn | Paket-namn | Rationale |
50
+ |---|---|---|
51
+ | `.review-banner` + element | `.review-banner` + element | Generic warning-CTA-banner. Behaller namn - andra appar kan ha review-flow. |
52
+ | `.sub-row` + `.sub-status-icon` | `.matched-row` + `__status-icon` | Generic-namn for "matchad/pending"-rad. Tidigare subscription-specifikt (sub-) - nya namnet ar app-agnostiskt. |
53
+ | `.tx-pending-icon` + `--stale` | `.status-icon` + `--pending/--stale/--success/--warning` | Generic inline status-icon. Modifiers tacker fler scenarier. |
54
+ | `.estimat-tag` | `.tag-inline` | Generic inline-metadata-tag. |
55
+ | `.rule-arrow` + `.rule-cat` | `.kvp-arrow` + `.kvp-target` | Key-value-pair-mapping (generic for rule-editors). |
56
+ | `.bank-row-icon` | `.icon-circle` + `--positive/--warning/--negative` | Generic 28x28 round-icon med tonad bg. Modifiers for status-fargning. |
57
+
58
+ ### C. Rename + lyft for komplexare strukturer (4 element-familjer)
59
+
60
+ | Ekonom-namn | Paket-namn | Rationale |
61
+ |---|---|---|
62
+ | `.cat-row` + element | `.expandable-row` + element | Generic collapsible summary-rad. Per Calle 2026-05-14. |
63
+ | `.cat-list-row` + `.cat-tx-*` | `.expandable-row__item` + `__item-list/-body/-desc/-date/-amount` + modifiers `--excluded/--pending/--clickable/--credit` | BEM-element av expandable-row. Sammanslag tva tidigare block. |
64
+ | `.cat-tx-stack` + element | `.item-stack` + `__icon/__header/__body` | Generic grupp av identiska items. |
65
+ | `.amort-bar` + element | `.column-bar` + `__value/__track/__fill/__label` + `.column-bar-list` | Vertikal historik-stapel. Komplement till `.hbar` (horisontell). |
66
+ | `.equity-bar-*` + amort/apprec | `.dual-bar` + `__track/__fill/__meta` + `__fill--amort/--apprec` | Generic dual-fill horisontell stapel. |
67
+
68
+ ### B. Migrera till befintliga paket-patterns (5 element-familjer)
69
+
70
+ | Ekonom-namn | Paket-pattern | Rationale |
71
+ |---|---|---|
72
+ | `.cat-bar-*` (Tier D) | `.hbar` + `--bar-accent`-binding | Hbar har samma struktur (item/track/fill/label/value). Utokad i v4.4.0 med `--bar-accent`-token-stod sa kategori-bindings i `ekonom-domain.css` (`.cat-mat`, `.cat-noje` etc) kan styra fill-color. |
73
+ | `.budget-bar-*` (Tier D) | `.progress` + `--bar--warning/--danger` | Paketets progress har redan dessa modifiers. |
74
+ | `.cost-bar` + `-seg` | `.split-bar` + `__segment` | Paketets split-bar har segmenterad struktur. |
75
+ | `.btn-copy`, `.btn-bank` | `.btn--icon.btn--circle` | Paketets btn har 44x44 round-modifier. Specifik color (copy=svartvit, bank=accent) blir via app-tema via `--accent-9`. Per Calle: "ska inte ha specialfarger, de ska fargas utifran appens tema". |
76
+ | `.compact-select`, `.compact-amount-input` | `.input.input--compact` (ny modifier) | Lyfta som modifier av paketets input. Max-width default 160, padding 6/10, fs-16. Apparna overrider max-width per kontext. |
77
+
78
+ ### Hbar-utvidgning (--bar-accent-binding)
79
+
80
+ `.hbar__fill` ber gick `background: var(--accent-9)`. Andrat till
81
+ `background: var(--bar-accent, var(--accent-9))`. Backwards-compat
82
+ (default-fall ar oforandrat). App-domain-CSS kan satta `--bar-accent`
83
+ via wrapper-klasser:
84
+
85
+ ```css
86
+ /* Ekonom-domain.css */
87
+ .cat-mat { --bar-accent: var(--cat-mat-icon); }
88
+ .cat-el { --bar-accent: var(--cat-el-icon); }
89
+ ...
90
+
91
+ /* Template */
92
+ <div class="hbar__fill cat-mat" data-bar-width="80%"></div>
93
+ ```
94
+
95
+ ### Saknande paket-komponenter i /design (separat)
96
+
97
+ `.profile-panel`, `.kv-list`, `.pill-nav`, `.offline-*` finns redan
98
+ i paketet men saknades i Ekonoms `/design`-styleguide. Lyfts inte i
99
+ denna ADR - paketet ar redan komplett. /design-utvidgning gor i
100
+ samma sprint.
101
+
102
+ ## Migration
103
+
104
+ ### Klodd-ds v4.4.0 (additive minor)
105
+
106
+ Nya komponentfiler i `css/components/`:
107
+ - `review-banner.css`
108
+ - `matched-row.css`
109
+ - `status-icon.css`
110
+ - `tag-inline.css`
111
+ - `kvp-arrow.css`
112
+ - `icon-circle.css`
113
+ - `expandable-row.css`
114
+ - `item-stack.css`
115
+ - `column-bar.css`
116
+ - `dual-bar.css`
117
+
118
+ Utvidgning av befintliga:
119
+ - `hbar.css`: `--bar-accent`-binding pa `__fill`
120
+ - `input.css`: `.input--compact`-modifier
121
+
122
+ `index.css` uppdaterad med 10 nya @imports.
123
+ `02-components.md` uppdaterad med nya block-entries.
124
+
125
+ ### Ekonom-migration
126
+
127
+ Templates-klassnamn-byten (mass-find-replace):
128
+
129
+ ```
130
+ cat-row -> expandable-row
131
+ cat-row__header -> expandable-row__header
132
+ cat-row__total -> expandable-row__total
133
+ cat-row__label -> expandable-row__label
134
+ cat-row__amount -> expandable-row__amount
135
+ cat-row__chev -> expandable-row__chev
136
+ cat-list -> expandable-list
137
+ cat-list-row -> expandable-row__item
138
+ cat-tx-list -> expandable-row__item-list
139
+ cat-tx-body -> expandable-row__item-body
140
+ cat-tx-desc -> expandable-row__item-desc
141
+ cat-tx-date -> expandable-row__item-date
142
+ cat-tx-amount -> expandable-row__item-amount
143
+ cat-tx-stack -> item-stack
144
+ cat-tx-stack__* -> item-stack__*
145
+ sub-row -> matched-row
146
+ sub-status-icon -> matched-row__status-icon
147
+ amort-bar -> column-bar (+ amort-bars -> column-bar-list)
148
+ equity-bar-row -> dual-bar
149
+ equity-bar-track -> dual-bar__track
150
+ equity-bar-fill -> dual-bar__fill
151
+ equity-amort -> dual-bar__fill--amort
152
+ equity-apprec -> dual-bar__fill--apprec
153
+ equity-bar-meta -> dual-bar__meta
154
+ cat-bars -> hbar (eller hbar-konsumtion i template)
155
+ cat-bar-* -> hbar__* + cat-X-binding-klass
156
+ budget-bar-* -> progress + __bar--warning/--danger
157
+ cost-bar -> split-bar
158
+ cost-bar-seg -> split-bar__segment
159
+ btn-copy -> btn btn--icon btn--circle
160
+ btn-bank -> btn btn--icon btn--circle
161
+ compact-select -> input input--compact (select-version)
162
+ compact-amount-input -> input input--compact
163
+ tx-pending-icon -> status-icon
164
+ tx-pending-icon--stale -> status-icon status-icon--stale
165
+ estimat-tag -> tag-inline
166
+ bank-row-icon -> icon-circle icon-circle--positive
167
+ rule-arrow -> kvp-arrow
168
+ rule-cat -> kvp-target
169
+ ```
170
+
171
+ Ekonoms `ds/ekonom.css` raderar nu alla lyfta block. Bara verkligen
172
+ Ekonom-domain-specifika klasser kvarstar (om nagot).
173
+
174
+ `ekonom-domain.css` behaller `.cat-mat`/`.cat-el`/etc-bindings till
175
+ `--bar-accent`/`--row-accent` - de ar app-domain-data (kategori-farger).
176
+ Bara binding-namnen `cat-bar-mat`/`cat-tx-mat` kan eventuellt byta
177
+ till bara `cat-mat` om de konsumeras universellt.
178
+
179
+ ### Jubb-migration
180
+
181
+ Ingen migration kravs - Jubb anvande inte nagra av de lyfta block:en.
182
+ Jubb far paket-bump 4.4.0 som additive (alla nya block tillgangliga
183
+ men inte aktivt anvanda). Jubbs `/design` utokas med samma nya
184
+ sektioner for paritet.
185
+
186
+ ### /design-utvidgning
187
+
188
+ Bagge appars `design.html` utokas med 14 nya sektioner:
189
+ - 10 nya block (review-banner, matched-row, status-icon, tag-inline,
190
+ kvp-arrow, icon-circle, expandable-row, item-stack, column-bar,
191
+ dual-bar)
192
+ - 4 saknande paket-block (profile-panel, kv-list, pill-nav, offline)
193
+
194
+ ## Konsekvenser
195
+
196
+ **Bra:**
197
+ - Calle's princip uppfylld: "lyft eller drop". Paketet ar nu fullt
198
+ designsystem - alla komponenter Ekonom anvander finns i paketet.
199
+ - Future-appar kan anvanda alla 17 utan att fork:a Ekonom-domain.
200
+ - /design visar 100% av apparnas faktiska CSS-yta (efter utvidgning).
201
+ - BEM-disciplin uppratthallen: alla nya block foljer block + element +
202
+ modifier-struktur. Inga 3-niva-nesting (`__elem__sub`).
203
+ - Hbar-utvidgning med `--bar-accent`-binding ar backwards-compat -
204
+ brytter inte Jubb eller andra konsumenter.
205
+
206
+ **Trade-offs:**
207
+ - 30+ template-klassnamn-byten i Ekonom. Risk for regression om nagot
208
+ missas. Mitigation: grep efter alla gamla klassnamn efter migration,
209
+ verifiera 0 traffar.
210
+ - Vissa Ekonom-specifika namn forsvinner till generic-namn
211
+ (`cat-row` -> `expandable-row`). Kraver discipline att inte
212
+ introducera nya domain-specifika namn framover.
213
+ - Paket-CSS-storlek vaxer ~5KB (additive imports). Acceptabelt for
214
+ konsekvensvinst.
215
+
216
+ **Migration-strategi:**
217
+ - v4.4.0 ar additive: nya klasser laggs till, inga raderas i paketet.
218
+ - Ekonoms gamla klasser kvarstar i `ds/ekonom.css` UNTIL templates
219
+ migrerats. Sen radera ur ekonom.css.
220
+ - Tva-stegs-deploy:
221
+ 1. Bumpa paketet + apparna med nya klasser tillgangliga (men
222
+ gamla styling kvar i Ekonom-lokal CSS - parallel-exist).
223
+ 2. Migrera Ekonom-templates till nya klasser (visual paritet via
224
+ paket-CSS, gamla klasser orphaned).
225
+ 3. Radera gamla klasser ur Ekonoms `ds/ekonom.css`.
226
+
227
+ ## References
228
+
229
+ - ADR 0009 (no-flat-components-css) - relaterade lift-doktrin
230
+ - ADR 0011 (strikt-bem-elementsyntax)
231
+ - ADR 0017 (padding-skala) + 0018 (outline-offset)
232
+ - Calle's beslut 2026-05-14 (sen kvall): "lyft eller drop"
233
+ - Audit-rapport: /design vs template-usage (2026-05-14)
@@ -0,0 +1,133 @@
1
+ # 0021 - Bar-familjen: gemensamma tokens (Steg 1)
2
+
3
+ ## Status
4
+ Locked. Minor version-bump (4.5.0) - additive, no visual change.
5
+
6
+ ## Context
7
+
8
+ Audit 2026-05-14 (sen kvall, fas 3) raknade 6 bar-komponenter i
9
+ paketet (progress, colored-bar, hbar, split-bar, column-bar,
10
+ dual-bar) plus 2 Ekonom-domain-wrappers. Calle's observation:
11
+ "manga bars - finns det dubbletter?".
12
+
13
+ Konkreta dubletter i nuvarande bar-CSS:
14
+
15
+ **Track-bg-varierar:**
16
+ | Komponent | Track-bg |
17
+ |---|---|
18
+ | progress | `--surface-raised` |
19
+ | hbar | `--surface-active` |
20
+ | split-bar | `--surface-active` |
21
+ | column-bar | `--surface-sunken` |
22
+ | dual-bar | `--surface-sunken` |
23
+
24
+ Tre olika value:r utan dokumenterad rationale. Inkonsekvens.
25
+
26
+ **Fill-color-default varierar:**
27
+ | Komponent | Fill-default |
28
+ |---|---|
29
+ | progress | `--accent-9` |
30
+ | hbar | `--bar-accent || --accent-9` |
31
+ | colored-bar | `--bar-accent || --accent-9` |
32
+ | split-bar (primary) | `--accent-9` |
33
+ | column-bar | `--positive` |
34
+ | dual-bar | `--positive` |
35
+
36
+ **Status-modifier-color varierar:**
37
+ | Komponent | Positive | Warning | Negative |
38
+ |---|---|---|---|
39
+ | progress | `--bg-success` | `--bg-warning` | `--bg-danger` |
40
+ | hbar | `--positive` | `--warning` | `--negative` |
41
+ | split-bar | `--positive` | `--warning` | `--negative` |
42
+
43
+ Tva olika status-tema (solid bg-X vs text-color-X) utan klar rationale.
44
+
45
+ Per Calle 2026-05-14 (sen kvall): "Jag hade kunnat se att man har
46
+ en stor bar-samling, dar storlek, farg etc bestams med olika tokens."
47
+
48
+ Calles intuition stamde - shared tokens ar standard i moderna design-
49
+ system. Men full one-class-many-modifiers-konsolidering ar breaking
50
+ MAJOR-bump. Steg 1 levererar SHARED TOKENS utan att andra struktur
51
+ eller visual.
52
+
53
+ ## Decision
54
+
55
+ **Steg 1 (denna ADR, v4.5.0):** Lyfta 8 shared tokens till
56
+ `:root` i `10-semantic.css`. Refaktorera alla 6 bar-komponenter att
57
+ lasa dem. Komponenter med medvetet annorlunda varden override:ar
58
+ pa block-roten (`--bar-track-color: var(--surface-sunken)` etc).
59
+
60
+ ```css
61
+ :root {
62
+ --bar-track-color: var(--surface-active);
63
+ --bar-track-radius: var(--radius-full);
64
+ --bar-fill-radius: var(--radius-full);
65
+ --bar-fill-color: var(--accent-9);
66
+ --bar-fill-color-positive: var(--positive);
67
+ --bar-fill-color-warning: var(--warning);
68
+ --bar-fill-color-negative: var(--negative);
69
+ --bar-fill-transition: width var(--dur-medium) var(--ease-spring-snappy);
70
+ }
71
+ ```
72
+
73
+ ### Per-komponent-changes
74
+
75
+ | Komponent | Track-color | Fill-default | Status-modifier |
76
+ |---|---|---|---|
77
+ | progress | OVERRIDE: `--bar-track-color: var(--surface-raised)` | `--bar-fill-color` | Behaller `--bg-success/-warning/-danger` (solid status-bg-tema, medvetet annorlunda fran text-color-tema) |
78
+ | hbar | DEFAULT (active) | `--bar-fill-color` med `--bar-accent`-binding | `--bar-fill-color-positive/-warning/-negative` |
79
+ | split-bar | DEFAULT (active) | `--bar-fill-color` (primary) | `--bar-fill-color-positive/-negative/-warning` |
80
+ | colored-bar | n/a (no track) | `--bar-fill-color` med `--bar-accent`-binding | n/a |
81
+ | column-bar | OVERRIDE: `--bar-track-color: var(--surface-sunken)` + `--bar-track-radius: var(--radius-4)` | `--bar-fill-color-positive` | n/a |
82
+ | dual-bar | OVERRIDE: `--bar-track-color: var(--surface-sunken)` | `--bar-fill-color-positive` (default + --amort), `--bar-fill-color` (--apprec) | n/a |
83
+
84
+ ### Future steps (NOT in scope for v4.5.0)
85
+
86
+ **Steg 2:** Konsolidera till 1 `.bar`-namespace med modifiers
87
+ `--vertical/-multi-segment/-with-meta/-with-label`. Breaking MAJOR-bump.
88
+ Konsumeras vid framtida sprint nar Calle vill exekvera.
89
+
90
+ **Steg 3:** Eliminera duplikat-komponenter (colored-bar = hbar__fill
91
+ standalone). Mindre breaking. Optional cleanup.
92
+
93
+ ## Konsekvenser
94
+
95
+ **Bra:**
96
+ - Endpoint-shape uppfyller Calle's intuition - tokens styr utseende.
97
+ - Konsekvens via en token-andring framover (andra
98
+ --bar-fill-color-positive pa root - andras pa hbar/split-bar/
99
+ column-bar/dual-bar samtidigt).
100
+ - Inga visuella andringar (komponenter override:ar default per behov).
101
+ - Backwards-compat - app-domain CSS som anvander direkta tokens
102
+ (Ekonoms `--bar-accent`-bindings) fortsatter funka.
103
+ - Future Steg 2/3 kan byggas pa shared-token-foundation.
104
+
105
+ **Trade-offs:**
106
+ - 6 komponenter har fortfarande egen file/namespace - inte unifierat.
107
+ - Per-komponent-override (--bar-track-color: var(--surface-X)) tilltager
108
+ CSS-storlek marginellt jamfort med hardkodad value.
109
+ - Override-pattern kraver discipline - om someone andra `.column-bar`
110
+ utan att inse override:n kan bryta sunken-bg.
111
+
112
+ ## Migration
113
+
114
+ **Klodd-ds v4.4.0 -> v4.5.0:** additive token-tillagg + per-komponent-
115
+ refaktor. Inga template-andringar i appar. Inga visual changes.
116
+
117
+ **Apparna:** bumpa till 4.5.0, build:ds, verify - ingen template-
118
+ migration.
119
+
120
+ ## Verifiering
121
+
122
+ - 0 visual changes per Calle's krav (Steg 1 = "no visual change").
123
+ - Stylelint-plugin: 0 errors (alla tokens lagliga).
124
+ - Manuell visual QA pa /design (alla 6 bar-sektioner ser identiska
125
+ ut pre/post-bump).
126
+
127
+ ## References
128
+
129
+ - ADR 0020 (domain-to-package-lift) - inforde --bar-accent-binding
130
+ - DESIGN-LANGUAGE.md sektion 4 (padding-rytm) - liknande shared-token-
131
+ approach for spacing
132
+ - Calle's beslut 2026-05-14 (sen kvall): "Det later bra" pa Steg 1-
133
+ forslag