@klodd/ds 5.4.2 → 5.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/README.md +4 -3
- package/SKILL.md +19 -7
- package/css/00-primitives.css +1 -22
- package/css/10-semantic.css +22 -100
- package/css/components/avatar.css +6 -6
- package/css/components/badge.css +2 -2
- package/css/components/button.css +1 -2
- package/css/components/chip.css +2 -2
- package/css/components/feedback.css +4 -4
- package/css/components/hero.css +1 -1
- package/css/components/hub-card.css +2 -2
- package/css/components/inline-edit.css +2 -2
- package/css/components/list-row.css +2 -2
- package/css/components/nav.css +12 -4
- package/css/components/pwa-avatar.css +4 -4
- package/css/components/swipe-stack.css +2 -2
- package/css/components/upload-spinner.css +2 -2
- package/css/index.css +0 -9
- package/package.json +1 -1
- package/references/02-components.md +1 -1
- package/references/04-locked-decisions/0003-radix-colors-oklch.md +1 -1
- package/references/04-locked-decisions/0006-mauve-neutral.md +0 -4
- package/references/04-locked-decisions/0015-panel-title-tag-doctrine.md +2 -2
- package/references/04-locked-decisions/0016-mina-sidor-doctrine.md +0 -2
- package/references/04-locked-decisions/0020-domain-to-package-lift.md +2 -2
- package/references/04-locked-decisions/0023-progress-list-utility.md +1 -1
- package/references/04-locked-decisions/0024-tightened-component-lift-doctrine.md +135 -0
- package/references/04-locked-decisions/{0015-turbo-nav-script-init.md → 0025-turbo-nav-script-init.md} +3 -1
- package/references/04-locked-decisions/{0016-async-progress-fetch-fn.md → 0026-async-progress-fetch-fn.md} +3 -1
- package/references/05-open-decisions/0001-tx-row-to-list-row-migration-CLOSED.md +1 -1
- package/references/05-open-decisions/0008-legacy-token-migration-CLOSED.md +6 -6
- package/references/05-open-decisions/0014-ekonom-colored-row-migration-CLOSED.md +1 -2
- package/references/05-open-decisions/0017-async-progress-pipeline-gaps.md +1 -1
- package/references/05-open-decisions/0018-build-ds-prune.md +35 -0
- package/references/DESIGN-LANGUAGE.md +1 -1
- package/css/components/expandable-row.css +0 -176
- package/css/components/icon-circle.css +0 -46
- package/css/components/item-stack.css +0 -43
- package/css/components/kvp-arrow.css +0 -22
- package/css/components/matched-row.css +0 -51
- package/css/components/review-banner.css +0 -70
- package/css/components/status-icon.css +0 -32
- package/css/components/tag-inline.css +0 -21
- package/js/index.js +0 -95
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# 0020 - Domain-to-package lift: alla Ekonom-specifika block lyfts
|
|
2
2
|
|
|
3
3
|
## Status
|
|
4
|
-
|
|
4
|
+
Superseded by ADR 0024 (2026-05-20). Var ursprungligen Locked (minor version-bump 4.4.0, additiv paket-utvidgning).
|
|
5
5
|
|
|
6
6
|
## Context
|
|
7
7
|
|
|
@@ -196,7 +196,7 @@ Bagge appars `design.html` utokas med 14 nya sektioner:
|
|
|
196
196
|
**Bra:**
|
|
197
197
|
- Calle's princip uppfylld: "lyft eller drop". Paketet ar nu fullt
|
|
198
198
|
designsystem - alla komponenter Ekonom anvander finns i paketet.
|
|
199
|
-
-
|
|
199
|
+
- Alla 17 komponenter ligger i paketet, ingen behover fork:a Ekonom-domain.
|
|
200
200
|
- /design visar 100% av apparnas faktiska CSS-yta (efter utvidgning).
|
|
201
201
|
- BEM-disciplin uppratthallen: alla nya block foljer block + element +
|
|
202
202
|
modifier-struktur. Inga 3-niva-nesting (`__elem__sub`).
|
|
@@ -15,7 +15,7 @@ Tidigare bodde dessa som `.cat-bar-list` + `.cat-bar-row` i Ekonoms
|
|
|
15
15
|
separata). Lyft till paketet för att:
|
|
16
16
|
|
|
17
17
|
1. Eliminera Ekonom-domain-CSS som inte är domain-specifikt
|
|
18
|
-
2.
|
|
18
|
+
2. Göra list-mönstret tillgängligt i paketet utan kopiering
|
|
19
19
|
3. Tydliggöra att klassen wrappar `.progress` (inte är en alternativ
|
|
20
20
|
bar-stil)
|
|
21
21
|
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# 0024 - Skärpt komponent-lyft-doktrin (supersedes 0020)
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
Locked (2026-05-20). Supersedes ADR 0020.
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
ADR 0020 (2026-05-14) lyfte 17 Ekonom-domän-block till paketet på
|
|
9
|
+
principen "lyft eller drop, ingen mellanversion". 8 hamnade som egna
|
|
10
|
+
filer i `css/components/`.
|
|
11
|
+
|
|
12
|
+
Audit fas 6 + fas 11 (2026-05-20) verifierade: alla 8 hade exakt EN
|
|
13
|
+
konsument (Ekonom). Jubb använde noll i produktion. Det var
|
|
14
|
+
relokering, inte generalisering - Ekonoms domän-CSS flyttades in i
|
|
15
|
+
det delade paketet och kallades "delat" trots en enda konsument.
|
|
16
|
+
|
|
17
|
+
Rotfelet: ADR 0020 lyfte på kriteriet "kan delas" (komponenten är
|
|
18
|
+
generisk nog att en annan app SKULLE kunna använda den) i stället
|
|
19
|
+
för "delas" (en andra app använder den faktiskt). "Kan delas" är ett
|
|
20
|
+
subjektivt omdöme som nästan vad som helst passerar.
|
|
21
|
+
|
|
22
|
+
Dessutom introducerade lyftet en state-regression: `matched-row` och
|
|
23
|
+
`expandable-row__header` tappade `:active`-press-feedback som
|
|
24
|
+
originalen (`.sub-row`, `.cat-row__header`) hade via `base.css`
|
|
25
|
+
press-feedback-selektorlista (fas 2d/7a). Ingen checklist fångade det.
|
|
26
|
+
|
|
27
|
+
## Decision
|
|
28
|
+
|
|
29
|
+
ADR 0024 supersedes ADR 0020:s lyft-kriterium. Tre regler:
|
|
30
|
+
|
|
31
|
+
1. **Minst två dokumenterade konsumerande appar krävs innan lyft.**
|
|
32
|
+
@klodd/ds har exakt två konsumenter - Jubb och Ekonom (scope
|
|
33
|
+
fixerat, beslut #4, 2026-05-20). "Minst två konsumenter" betyder
|
|
34
|
+
därför i praktiken: BÅDA apparna använder komponenten, med en
|
|
35
|
+
namngiven verifierad plats (fil:rad) i var. Det betyder INTE
|
|
36
|
+
"vänta på en framtida tredje app" - det finns ingen tredje app och
|
|
37
|
+
ingen planeras. En komponent som bara en av de två apparna
|
|
38
|
+
använder hör hemma i den appens domän-CSS, inte i paketet. Ett
|
|
39
|
+
omdöp till generiskt namn skapar ingen andra konsument. Att
|
|
40
|
+
tillverka en konsument efteråt - få den andra appen att adoptera
|
|
41
|
+
komponenten enbart för att rättfärdiga lyftet - är YAGNI baklänges
|
|
42
|
+
och förbjudet.
|
|
43
|
+
|
|
44
|
+
2. **State-täckning-checklist obligatorisk vid lyft.** Före lyft:
|
|
45
|
+
räkna upp original-komponentens interaktiva states (`:hover`,
|
|
46
|
+
`:active`, `:focus-visible`, `:disabled`). Efter lyft: verifiera
|
|
47
|
+
att paket-versionen reproducerar varenda en. Inga state-
|
|
48
|
+
regressioner. Press-feedback som låg implicit i app-`base.css`-
|
|
49
|
+
selektorlistor måste flyttas explicit till paket-komponenten.
|
|
50
|
+
|
|
51
|
+
3. **Komponent-lyft-ADR-mallen ska innehålla kontrollpunkterna**
|
|
52
|
+
strukturerat (se Mall nedan), ifyllda, innan ADR:n kan låsas.
|
|
53
|
+
|
|
54
|
+
## Mall för framtida komponent-lyft-ADR
|
|
55
|
+
|
|
56
|
+
### Konsument-verifiering (regel 1)
|
|
57
|
+
- Konsument 1: [app] [fil:rad]
|
|
58
|
+
- Konsument 2: [app] [fil:rad]
|
|
59
|
+
- (Bägge apparna - Jubb och Ekonom - krävs. Bara en: komponenten
|
|
60
|
+
stannar i den appens domän-CSS.)
|
|
61
|
+
|
|
62
|
+
### State-täckning (regel 2)
|
|
63
|
+
| State | Original | Paket-version | Regression? |
|
|
64
|
+
|----------------|----------|---------------|-------------|
|
|
65
|
+
| :hover | | | |
|
|
66
|
+
| :active | | | |
|
|
67
|
+
| :focus-visible | | | |
|
|
68
|
+
| :disabled | | | |
|
|
69
|
+
|
|
70
|
+
## Backfill - ADR 0020-lyften omprövade (beslut #3, 2026-05-20)
|
|
71
|
+
|
|
72
|
+
Alla 8 single-consumer-komponenter från ADR 0020 flyttas tillbaka
|
|
73
|
+
till Ekonom. Ingen behålls i paketet. Regel 1 tillämpas strikt på
|
|
74
|
+
samtliga.
|
|
75
|
+
|
|
76
|
+
Tillbaka till Ekonom:
|
|
77
|
+
- Domän-compounds: `expandable-row`, `item-stack`, `matched-row`.
|
|
78
|
+
Kodar Ekonoms avstämnings-vokabulär; ett generiskt namn dolde det.
|
|
79
|
+
- Tidigare klassade "paket-primitiv": `icon-circle`, `status-icon`,
|
|
80
|
+
`review-banner`. Generiska till formen, men 1 konsument.
|
|
81
|
+
- Tidigare klassade "paket-utility": `kvp-arrow`, `kvp-target`,
|
|
82
|
+
`tag-inline`. För tunna för komponenter, men ändå 1 konsument.
|
|
83
|
+
|
|
84
|
+
Implementations-spec: `audits/sprint-2-checklist.md` Del B. Paketets
|
|
85
|
+
`css/components/` krymper 47 till 39 filer.
|
|
86
|
+
|
|
87
|
+
När en andra app konkret behöver någon av dem: lyft enligt regel
|
|
88
|
+
1 + 2 + 3. Verifierad konsument 1 + verifierad konsument 2 = lyft.
|
|
89
|
+
Inte tidigare.
|
|
90
|
+
|
|
91
|
+
## Why no grandfathering
|
|
92
|
+
|
|
93
|
+
Ett tidigare utkast föreslog att behålla `icon-circle`/`status-icon`/
|
|
94
|
+
`review-banner` i paketet med motiveringen "verifierat generiska,
|
|
95
|
+
flyttkostnaden överstiger bärkostnaden". Det förkastades.
|
|
96
|
+
|
|
97
|
+
Det är samma resonemang som ADR 0020 byggde på. ADR 0020 lyfte på
|
|
98
|
+
"komponenten är generisk nog att kunna delas" - och auditen (fas 12
|
|
99
|
+
slutsats #4, YAGNI) visade att just det resonemanget fyllde paketet
|
|
100
|
+
med single-consumer-kod. Ett undantag inskrivet i den nya doktrinen
|
|
101
|
+
dag ett återöppnar exakt den lucka doktrinen finns för att stänga.
|
|
102
|
+
"Verifierat generisk" är inget objektivt kriterium - det är samma
|
|
103
|
+
subjektiva omdöme som "kan delas", omformulerat.
|
|
104
|
+
|
|
105
|
+
Regeln måste vara mekanisk för att hålla: två verifierade
|
|
106
|
+
konsumenter, inga omdömen, inga undantag. En liten generisk primitiv
|
|
107
|
+
som bara en app använder kostar nästan inget att låta bo i appens
|
|
108
|
+
CSS tills den andra konsumenten finns. Den kostar betydligt mer att
|
|
109
|
+
bära i paketet som prejudikat för nästa "den här kan ju delas"-lyft.
|
|
110
|
+
|
|
111
|
+
## Konsekvenser
|
|
112
|
+
|
|
113
|
+
Bra:
|
|
114
|
+
- Paketet slutar samla single-consumer-domän-CSS. "Delad komponent"
|
|
115
|
+
betyder bevisat delad. `css/components/` krymper 47 till 39 filer.
|
|
116
|
+
- State-regressioner som `:active`-tappet fångas mekaniskt av
|
|
117
|
+
checklistan.
|
|
118
|
+
- Doktrinen har inga undantag - den kan inte urholkas av omdömen.
|
|
119
|
+
|
|
120
|
+
Trade-off:
|
|
121
|
+
- Ett genuint generiskt mönster som bara en app behöver idag måste
|
|
122
|
+
vänta i appens CSS tills den andra appen behöver det. Avsiktligt -
|
|
123
|
+
vänta-kostnaden är låg, junk-drawer-kostnaden är hög.
|
|
124
|
+
|
|
125
|
+
ADR 0020:s anda ("lyft eller drop, ingen mellanversion") kvarstår,
|
|
126
|
+
men "lyft" omdefinieras: lyft = bägge apparna är verifierade
|
|
127
|
+
konsumenter; 1 konsument = drop (stanna i appen). Mellanversionen
|
|
128
|
+
ADR 0020 i praktiken skapade (1-konsument-kod i paketet) är nu
|
|
129
|
+
explicit förbjuden, utan undantag.
|
|
130
|
+
|
|
131
|
+
## References
|
|
132
|
+
- ADR 0020 (superseded av denna)
|
|
133
|
+
- ADR 0013 (visual coherence / press-feedback-doktrin)
|
|
134
|
+
- Fas 6 (component-coverage), fas 11b, fas 12 slutsats #4 (YAGNI)
|
|
135
|
+
- Beslut #3 och #4 (2026-05-20)
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 0025 - Per-page-JS-init under turbo-nav
|
|
2
2
|
|
|
3
3
|
## Status
|
|
4
4
|
|
|
5
5
|
Locked. Upptäckt v192 (2026-05-19) under Chrome MCP-diagnos av
|
|
6
6
|
brief-progress-flödet i Jubb.
|
|
7
7
|
|
|
8
|
+
*Omnumrerad 2026-05-20: filnamnet sa 0015 (kollision med ADR 0015 panel-title-tag-doctrine) och H1 sa felaktigt 0009. Bägge korrigerade till 0025.*
|
|
9
|
+
|
|
8
10
|
## Context
|
|
9
11
|
|
|
10
12
|
`turbo-nav.js` (paketet) implementerar same-document-navigation
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 0026 - AsyncProgress fetchFn-option
|
|
2
2
|
|
|
3
3
|
## Status
|
|
4
4
|
|
|
5
5
|
Locked (2026-05-19).
|
|
6
6
|
|
|
7
|
+
*Omnumrerad 2026-05-20: filnamnet sa 0016 (kollision med ADR 0016 mina-sidor-doctrine), korrigerad till 0026.*
|
|
8
|
+
|
|
7
9
|
## Context
|
|
8
10
|
|
|
9
11
|
`KloddDS.AsyncProgress` (introducerad 5.3.0) använder intern `fetch()`
|
|
@@ -58,7 +58,7 @@ domanen). Generaliserat namn `.list-row` finns redan i paketets
|
|
|
58
58
|
`.list-row` som paritets-namn (paketets klass aktiverad globalt)
|
|
59
59
|
**Pros:**
|
|
60
60
|
- Inga template-andringar i Ekonom
|
|
61
|
-
- Paketets `.list-row` blir tillganglig for Jubb
|
|
61
|
+
- Paketets `.list-row` blir tillganglig for Jubb
|
|
62
62
|
**Cons:**
|
|
63
63
|
- Driften mellan apparna fortsatter (Ekonom anvander `.tx-*`, Jubb
|
|
64
64
|
hypotetiskt skulle anvanda `.list-row`)
|
|
@@ -18,7 +18,7 @@ Originaltexten bevarad nedan for historik.
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
20
|
## Original status (innan stangning)
|
|
21
|
-
Pending. Trigger:
|
|
21
|
+
Pending. Trigger: nar paketet behover mogna bort sin legacy-skuld.
|
|
22
22
|
|
|
23
23
|
## Context
|
|
24
24
|
`10-semantic.css` har en LEGACY ALIASES-sektion (rad 412-506) som
|
|
@@ -52,7 +52,7 @@ kostnad.
|
|
|
52
52
|
appar.
|
|
53
53
|
|
|
54
54
|
## Decision
|
|
55
|
-
Gor en fullstandig **lock-sprint**
|
|
55
|
+
Gor en fullstandig **lock-sprint** for att mogna paketet:
|
|
56
56
|
|
|
57
57
|
1. Migrera ALLA call-sites till nya semantic token-namn
|
|
58
58
|
(`--accent` -> `--accent-9` eller `--accent-text`, `--bg-base`
|
|
@@ -67,7 +67,7 @@ Gor en fullstandig **lock-sprint** innan tredje app laggs till:
|
|
|
67
67
|
## Consequences
|
|
68
68
|
- **+** Slut pa dubbla mentala modeller. En standard.
|
|
69
69
|
- **+** Spec stammer med implementationen.
|
|
70
|
-
- **+**
|
|
70
|
+
- **+** Paketet gar mot ett moget system.
|
|
71
71
|
- **+** `npx @klodd/ds verify` (3.4.0+) detekterar drift mekaniskt.
|
|
72
72
|
- **-** Stor sprint - kraver dedikerad bandbredd (uppskattning: 2-3
|
|
73
73
|
arbetsdagar plus visuell QA per app).
|
|
@@ -75,9 +75,9 @@ Gor en fullstandig **lock-sprint** innan tredje app laggs till:
|
|
|
75
75
|
styleguide-jamforelse fore/efter pa bagge appar.
|
|
76
76
|
|
|
77
77
|
## Pending decision criteria
|
|
78
|
-
- Tidpunkt:
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
- Tidpunkt: nar bandbredd finns for att mogna paketet. Att vanta
|
|
79
|
+
langre forharder skulden; att hasta forskuggar appar som redan
|
|
80
|
+
ar i prod.
|
|
81
81
|
- Vem kor sprinten: Calle ensam eller med assistent CC?
|
|
82
82
|
- Om CC: ska den ha access till bagge app-repos under sprinten?
|
|
83
83
|
|
|
@@ -8,8 +8,7 @@ Option B: minimal cleanup.
|
|
|
8
8
|
|
|
9
9
|
Ekonom uses .cat-list-row without border-left as a deliberate visual
|
|
10
10
|
choice. border-left on categorized rows is unwanted in current apps.
|
|
11
|
-
.colored-row remains in the package
|
|
12
|
-
the pattern.
|
|
11
|
+
.colored-row remains in the package as an available pattern.
|
|
13
12
|
|
|
14
13
|
Dead --row-accent bindings removed from ekonom-domain.css.
|
|
15
14
|
|
|
@@ -129,7 +129,7 @@ produktion (Jubb v202+) - gaps är arkitektur-städ, inte funktionalitet.
|
|
|
129
129
|
gaps
|
|
130
130
|
- Jubb commit `d532e7e` - brief-progress migration (ett-shot-flöde som
|
|
131
131
|
matchar AsyncProgress's default-design)
|
|
132
|
-
- ADR
|
|
132
|
+
- ADR 0026-async-progress-fetch-fn (`04-locked-decisions/`) - tidigare
|
|
133
133
|
AsyncProgress-utvidgning för demo/test-injection via fetchFn
|
|
134
134
|
- `~/dev/klodd-ds/js/async-progress.js` - paket-implementation
|
|
135
135
|
- `~/dev/Jubb/app/static/js/pipeline-progress.js` - wrapper med
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# 0018 - build:ds prune-gap
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
Pending.
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
build:ds (`npx @klodd/ds sync`) kopierar paketets filer till
|
|
10
|
+
`app/static/css/ds/` och `app/static/js/ds/` men tar inte bort filer
|
|
11
|
+
som raderats ur paketet. Upptäckt vid 5.4.2-cleanup: `hbar.css` +
|
|
12
|
+
`split-bar.css` låg kvar i båda appar efter build:ds och krävde
|
|
13
|
+
manuell borttagning.
|
|
14
|
+
|
|
15
|
+
## Decision needed
|
|
16
|
+
|
|
17
|
+
Lägg till `--prune`-flagga i sync-kommandot som tar bort filer i
|
|
18
|
+
målmappen som inte längre finns i paketet.
|
|
19
|
+
|
|
20
|
+
## Considered options
|
|
21
|
+
|
|
22
|
+
### A. Implementera --prune i sync-skriptet
|
|
23
|
+
Rensar automatiskt vid varje build:ds.
|
|
24
|
+
|
|
25
|
+
### B. Dokumentera manuellt städ-steg i SKILL.md
|
|
26
|
+
"efter paket-publish: verifiera att raderade komponenter tas bort ur
|
|
27
|
+
app build-output".
|
|
28
|
+
|
|
29
|
+
### C. Behåll nuvarande beteende
|
|
30
|
+
Risk för stale filer vid varje komponent-radering.
|
|
31
|
+
|
|
32
|
+
## Pending decision criteria
|
|
33
|
+
|
|
34
|
+
Aktiveras nästa gång en komponent raderas ur paketet. Option B är
|
|
35
|
+
interim-lösning tills A implementeras.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Klodd Design Language
|
|
2
2
|
|
|
3
|
-
Konkreta regler för **visuell koherens** över
|
|
3
|
+
Konkreta regler för **visuell koherens** över @klodd/ds (Jubb och Ekonom). Token-
|
|
4
4
|
arkitekturen (`01-tokens.md`) och komponent-API (`02-components.md`)
|
|
5
5
|
specificerar **vad** som finns; denna fil specificerar **hur** komponenter
|
|
6
6
|
ska användas tillsammans för homogen design-uttryck.
|
|
@@ -1,176 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
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); }
|