@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.
- package/css/10-semantic.css +26 -0
- package/css/components/colored-bar.css +4 -2
- package/css/components/column-bar.css +78 -0
- package/css/components/dual-bar.css +64 -0
- package/css/components/expandable-row.css +176 -0
- package/css/components/hbar.css +13 -8
- package/css/components/icon-circle.css +46 -0
- package/css/components/input.css +26 -0
- package/css/components/item-stack.css +43 -0
- package/css/components/kvp-arrow.css +22 -0
- package/css/components/matched-row.css +51 -0
- package/css/components/progress.css +10 -4
- package/css/components/review-banner.css +70 -0
- package/css/components/split-bar.css +9 -7
- package/css/components/status-icon.css +32 -0
- package/css/components/tag-inline.css +21 -0
- package/css/index.css +12 -0
- package/package.json +1 -1
- package/references/04-locked-decisions/0020-domain-to-package-lift.md +233 -0
- package/references/04-locked-decisions/0021-bar-shared-tokens.md +133 -0
package/css/10-semantic.css
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
+
}
|
package/css/components/hbar.css
CHANGED
|
@@ -43,21 +43,26 @@
|
|
|
43
43
|
.hbar__track {
|
|
44
44
|
width: 100%;
|
|
45
45
|
height: var(--space-6);
|
|
46
|
-
background: var(--
|
|
47
|
-
border-radius: var(--radius
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
+
}
|
package/css/components/input.css
CHANGED
|
@@ -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(--
|
|
31
|
-
border-radius: var(--radius
|
|
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(--
|
|
38
|
-
border-radius: var(--radius
|
|
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
|
|
13
|
+
border-radius: var(--bar-track-radius);
|
|
14
14
|
overflow: hidden;
|
|
15
|
-
background: var(--
|
|
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:
|
|
21
|
+
transition: var(--bar-fill-transition);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
.
|
|
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
|
@@ -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
|