@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.
Files changed (44) hide show
  1. package/README.md +4 -3
  2. package/SKILL.md +19 -7
  3. package/css/00-primitives.css +1 -22
  4. package/css/10-semantic.css +22 -100
  5. package/css/components/avatar.css +6 -6
  6. package/css/components/badge.css +2 -2
  7. package/css/components/button.css +1 -2
  8. package/css/components/chip.css +2 -2
  9. package/css/components/feedback.css +4 -4
  10. package/css/components/hero.css +1 -1
  11. package/css/components/hub-card.css +2 -2
  12. package/css/components/inline-edit.css +2 -2
  13. package/css/components/list-row.css +2 -2
  14. package/css/components/nav.css +12 -4
  15. package/css/components/pwa-avatar.css +4 -4
  16. package/css/components/swipe-stack.css +2 -2
  17. package/css/components/upload-spinner.css +2 -2
  18. package/css/index.css +0 -9
  19. package/package.json +1 -1
  20. package/references/02-components.md +1 -1
  21. package/references/04-locked-decisions/0003-radix-colors-oklch.md +1 -1
  22. package/references/04-locked-decisions/0006-mauve-neutral.md +0 -4
  23. package/references/04-locked-decisions/0015-panel-title-tag-doctrine.md +2 -2
  24. package/references/04-locked-decisions/0016-mina-sidor-doctrine.md +0 -2
  25. package/references/04-locked-decisions/0020-domain-to-package-lift.md +2 -2
  26. package/references/04-locked-decisions/0023-progress-list-utility.md +1 -1
  27. package/references/04-locked-decisions/0024-tightened-component-lift-doctrine.md +135 -0
  28. package/references/04-locked-decisions/{0015-turbo-nav-script-init.md → 0025-turbo-nav-script-init.md} +3 -1
  29. package/references/04-locked-decisions/{0016-async-progress-fetch-fn.md → 0026-async-progress-fetch-fn.md} +3 -1
  30. package/references/05-open-decisions/0001-tx-row-to-list-row-migration-CLOSED.md +1 -1
  31. package/references/05-open-decisions/0008-legacy-token-migration-CLOSED.md +6 -6
  32. package/references/05-open-decisions/0014-ekonom-colored-row-migration-CLOSED.md +1 -2
  33. package/references/05-open-decisions/0017-async-progress-pipeline-gaps.md +1 -1
  34. package/references/05-open-decisions/0018-build-ds-prune.md +35 -0
  35. package/references/DESIGN-LANGUAGE.md +1 -1
  36. package/css/components/expandable-row.css +0 -176
  37. package/css/components/icon-circle.css +0 -46
  38. package/css/components/item-stack.css +0 -43
  39. package/css/components/kvp-arrow.css +0 -22
  40. package/css/components/matched-row.css +0 -51
  41. package/css/components/review-banner.css +0 -70
  42. package/css/components/status-icon.css +0 -32
  43. package/css/components/tag-inline.css +0 -21
  44. 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
- Locked. Minor version-bump (4.4.0) - additive paket-utvidgning.
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
- - Future-appar kan anvanda alla 17 utan att fork:a Ekonom-domain.
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. Ge framtida appar samma list-pattern utan kopiering
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
- # 0009 - Per-page-JS-init under turbo-nav
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
- # 0016 - AsyncProgress fetchFn-option
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 och framtida apps
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: innan tredje app borjar anvanda `@klodd/ds`.
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** innan tredje app laggs till:
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
- - **+** Tredje app:s onboarding gar mot ett moget system.
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: omedelbart innan tredje app (Margevo eller annan)
79
- borjar anvanda paketet. Att vanta langre forharder skulden;
80
- att hasta forskuggar appar som redan ar i prod.
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 for future apps that may want
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 0016-async-progress-fetch-fn (`04-locked-decisions/`) - tidigare
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 Klodd-ekosystemet. Token-
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); }