@klodd/ds 4.2.0 → 4.4.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/components/column-bar.css +73 -0
- package/css/components/dual-bar.css +61 -0
- package/css/components/expandable-row.css +176 -0
- package/css/components/hbar.css +4 -1
- 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/review-banner.css +70 -0
- package/css/components/status-icon.css +32 -0
- package/css/components/tag-inline.css +21 -0
- package/css/index.css +12 -0
- package/css/utilities.css +24 -0
- package/package.json +1 -1
- package/references/04-locked-decisions/0020-domain-to-package-lift.md +233 -0
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
width: 100%;
|
|
50
|
+
flex: 1;
|
|
51
|
+
background: var(--surface-sunken);
|
|
52
|
+
border-radius: var(--radius-4);
|
|
53
|
+
overflow: hidden;
|
|
54
|
+
display: flex;
|
|
55
|
+
align-items: flex-end;
|
|
56
|
+
min-height: 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.column-bar__fill {
|
|
60
|
+
width: 100%;
|
|
61
|
+
background: var(--positive);
|
|
62
|
+
border-radius: var(--radius-4);
|
|
63
|
+
transition: var(--tr-height-slower);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.column-bar__label {
|
|
67
|
+
font-size: var(--fs-11);
|
|
68
|
+
color: var(--text-muted);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@media (prefers-reduced-motion: reduce) {
|
|
72
|
+
.column-bar__fill { transition: none; }
|
|
73
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
flex: 1;
|
|
35
|
+
height: 12px;
|
|
36
|
+
background: var(--surface-sunken);
|
|
37
|
+
border-radius: var(--radius-full);
|
|
38
|
+
overflow: hidden;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.dual-bar__fill {
|
|
42
|
+
height: 100%;
|
|
43
|
+
border-radius: var(--radius-full);
|
|
44
|
+
background: var(--positive);
|
|
45
|
+
transition: var(--tr-width-slower);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.dual-bar__fill--amort { background: var(--positive); }
|
|
49
|
+
.dual-bar__fill--apprec { background: var(--accent-9); }
|
|
50
|
+
|
|
51
|
+
.dual-bar__meta {
|
|
52
|
+
display: flex;
|
|
53
|
+
flex-direction: column;
|
|
54
|
+
align-items: flex-end;
|
|
55
|
+
min-width: 5.5rem;
|
|
56
|
+
line-height: var(--lh-relaxed);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@media (prefers-reduced-motion: reduce) {
|
|
60
|
+
.dual-bar__fill { transition: none; }
|
|
61
|
+
}
|
|
@@ -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
|
@@ -50,7 +50,10 @@
|
|
|
50
50
|
|
|
51
51
|
.hbar__fill {
|
|
52
52
|
height: 100%;
|
|
53
|
-
|
|
53
|
+
/* v4.4.0 (ADR 0020): --bar-accent-binding for app-domain-kategorier.
|
|
54
|
+
Default --accent-9 om bindning saknas. App-domain CSS satter
|
|
55
|
+
--bar-accent via wrapper-klass: <div class="hbar__fill cat-mat">. */
|
|
56
|
+
background: var(--bar-accent, var(--accent-9));
|
|
54
57
|
border-radius: var(--radius-full);
|
|
55
58
|
transition: width var(--dur-medium) var(--ease-spring-snappy);
|
|
56
59
|
}
|
|
@@ -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); }
|
|
@@ -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
|
+
}
|
|
@@ -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/css/utilities.css
CHANGED
|
@@ -148,6 +148,30 @@
|
|
|
148
148
|
vertical-align: -2px;
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
+
/* Skip-link - a11y-pattern for keyboard-anvandare. Visas vid :focus
|
|
152
|
+
(top: var(--space-8) overrider top: -100px). HTML: lagg som forsta
|
|
153
|
+
element i body, target valfri main-content-id.
|
|
154
|
+
<a href="#main" class="skip-link">Hoppa till innehall</a>
|
|
155
|
+
Lyft fran Ekonom + Jubb v4.3.0 (identical implementation efter
|
|
156
|
+
konsekvens-cykel 2026-05-14 Sprint 5). */
|
|
157
|
+
.skip-link {
|
|
158
|
+
position: absolute;
|
|
159
|
+
top: -100px;
|
|
160
|
+
left: var(--space-8);
|
|
161
|
+
padding: var(--space-8) var(--space-16);
|
|
162
|
+
background: var(--accent-9);
|
|
163
|
+
color: var(--surface-page);
|
|
164
|
+
border-radius: var(--radius-full);
|
|
165
|
+
z-index: var(--z-spinner);
|
|
166
|
+
font-weight: var(--fw-medium);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.skip-link:focus {
|
|
170
|
+
top: var(--space-8);
|
|
171
|
+
outline: 2px solid var(--accent-9);
|
|
172
|
+
outline-offset: 2px;
|
|
173
|
+
}
|
|
174
|
+
|
|
151
175
|
/* Pre-formatted code/text. Sunken bakgrund, monospace, pre-wrap
|
|
152
176
|
for line-break-preservering med word-wrap pa lang text. */
|
|
153
177
|
.code-block {
|
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)
|