@klodd/ds 5.4.0 → 5.4.2

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.
@@ -93,7 +93,7 @@
93
93
  Gemensamma utgifter) dar parent ar text-align:left. Center-just
94
94
  overrode den left-align via flex. Nu foljer amount-row parent-
95
95
  justification. Gap-16 ger luft mellan summa och adjacent
96
- actions-knappar (btn-copy, btn-bank). */
96
+ actions-knappar. */
97
97
  display: flex;
98
98
  align-items: center;
99
99
  justify-content: flex-start;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@klodd/ds",
3
- "version": "5.4.0",
3
+ "version": "5.4.2",
4
4
  "description": "Klodd shared design system - tokens, components, JS",
5
5
  "main": "css/index.css",
6
6
  "bin": {
@@ -71,6 +71,57 @@ För varje entry gäller:
71
71
  - **Anvand:** Native `<dialog>` (centrerad modal) eller `<dialog class="sheet">` (bottom-attached)
72
72
  - **INTE:** Tooltip eller dropdown (egna komponenter)
73
73
  - **Tokens:** `--surface-raised/-overlay`, `--border-subtle`, `--shadow-float`, `--z-overlay`, `--safe-bottom`
74
+ - **Centrering:** `dialog.dialog:modal`-regeln (5.2.5) override:ar UA-stylesheet
75
+ med `!important` pa position/inset/margin/transform. Doumenterat undantag fran
76
+ kvalitetsbar regel 7 - UA's `dialog:modal` har implicit prioritering bortom
77
+ standard specificity-cascading.
78
+
79
+ #### Completion-dialog (async-operation done)
80
+
81
+ Vanlig instans: visa "X ar klart" + primar-action efter att en
82
+ asynkron operation (AsyncProgress) slagit `done`. Anvands av Jubb's
83
+ bolagsanalys + brevgenerering, och planerat for Ekonom bank-synk.
84
+
85
+ ```html
86
+ <dialog class="dialog" id="my-complete-dialog">
87
+ <div class="dialog__header">
88
+ <h2 class="heading-3">Operationen ar klar</h2>
89
+ </div>
90
+ <div class="dialog__body">
91
+ <p>Beskrivande text + ev. CTA-kontext.</p>
92
+ </div>
93
+ <div class="dialog__footer">
94
+ <button class="btn btn--primary" id="view-btn">Visa resultat</button>
95
+ </div>
96
+ </dialog>
97
+ ```
98
+
99
+ JS-monster:
100
+
101
+ ```javascript
102
+ const dlg = document.getElementById("my-complete-dialog");
103
+
104
+ // Oppna via showModal() - native focus-trap + ESC + ::backdrop
105
+ dlg.showModal();
106
+
107
+ // Stang via backdrop-klick (event.target == dialog-elementet)
108
+ dlg.addEventListener("click", (e) => {
109
+ if (e.target === dlg) dlg.close();
110
+ });
111
+
112
+ // Primar action - app-specifik (oftast navigation + reload)
113
+ document.getElementById("view-btn").addEventListener("click", () => {
114
+ window.location.href = "/result#anchor";
115
+ window.location.reload();
116
+ });
117
+ ```
118
+
119
+ Footer-varianter:
120
+ - En primar knapp (Visa resultat / Bekrafta) - default
121
+ - Sekundar + primar (Avbryt + Bekrafta) - destruktiva eller reversibla actions
122
+ - `.btn--danger` som primar - actions som tar bort/forstor data
123
+
124
+ Se /design-sidan "Completion Dialog"-sektionen for visuella exempel.
74
125
 
75
126
  ### icon (`icon.css`)
76
127
  - **Blocks:** `.icon`, `.icon-custom` (sibling - wrapper for handritade SVG som Lucide saknar)
@@ -188,20 +239,6 @@ För varje entry gäller:
188
239
  - **Anvand:** Panel som expanderar pa klick. JS togglar `data-expanded`
189
240
  - **INTE:** Modal-content (anvand `.dialog` eller `.sheet`)
190
241
 
191
- ### hbar (`hbar.css`)
192
- - **Blocks:** `.hbar`
193
- - **Element:** `.hbar__item`, `.hbar__track`, `.hbar__fill`, `.hbar__label`, `.hbar__value`
194
- - **Modifiers:** `.hbar__fill--positive/-warning/-negative`
195
- - **Anvand:** Generisk horisontell bar med label + value + track + fill
196
- - **INTE:** Status-progress (anvand `.progress`)
197
-
198
- ### split-bar (`split-bar.css`)
199
- - **Blocks:** `.split-bar`
200
- - **Element:** `.split-bar__segment`, `.split-bar__label`, `.split-bar__labels`
201
- - **Modifiers:** `.split-bar__segment--primary/-secondary/-positive/-negative/-warning`
202
- - **Anvand:** Flersegment-bar for cost-split, debt-vs-equity m.fl.
203
- - **INTE:** Single-bar-progress (anvand `.hbar`)
204
-
205
242
  ### hero (`hero.css`)
206
243
  - **Blocks:** `.hero`
207
244
  - **Element:** `.hero__heading`, `.hero__amount`, `.hero__amount-row`, `.hero__label`, `.hero__meta`, `.hero__actions`
@@ -550,7 +587,6 @@ Tier D-undantag (Sprint G 2026-05-09, listade i sektionen ovan):
550
587
  - `.budget-bar-*` (5 klasser)
551
588
  - `.cat-tx-*` (6 klasser, .cat-tx-stack har BEM-element)
552
589
  - `.cost-bar` / `.cost-bar-seg` (2 klasser, sibling-pair)
553
- - `.split-bar` (paketet har samma, override-styling)
554
590
 
555
591
  Notera: ekonom-domain.css (kategori-tokens + bindings) listas inte har
556
592
  - den filen ar token-definition, inte komponent-CSS. Se ADR
@@ -0,0 +1,136 @@
1
+ # 0017 - AsyncProgress: pipeline-flödes-gaps
2
+
3
+ ## Status
4
+
5
+ Pending.
6
+
7
+ ## Context
8
+
9
+ `pipeline-progress.js` i Jubb migrerades till `KloddDS.AsyncProgress`-
10
+ wrapper (Jubb v202, 2026-05-19, commit `f46ff70`). Brief-progress.js
11
+ hade redan migrerats tidigare samma dag (`d532e7e`). Under pipeline-
12
+ migrationen identifierades tre paket-gaps som krävde workarounds i
13
+ wrappern eftersom paketets default-beteende är optimerat för ett-shot-
14
+ flöden (brief-flödet) snarare än kontinuerlig polling (pipeline-flödet).
15
+
16
+ ### Gap 1 — continuousMode
17
+
18
+ **Behov:** polling fortsätter efter `done`-callback för att detektera
19
+ nya körningar automatiskt. Pipeline-progress visar status på senaste
20
+ DigestRun - när en run klar och en ny startar måste klienten plocka upp
21
+ den utan sidladdning.
22
+
23
+ **Workaround:** `onComplete → setTimeout(2s) → ny AsyncProgress-instans`
24
+ (recursive restart). Ren ny instans varje cykel för att undvika att
25
+ återanvända en stoppad poller.
26
+
27
+ **Risk:** fragil mot paket-omstrukturering av lifecycle. Om AsyncProgress
28
+ ändrar onComplete-semantik (t.ex. flyttar invokation till efter
29
+ internal cleanup) kan restart-pattern brytas. Plus memory-overhead -
30
+ varje ny instans skapar nya closures (acceptabel för once-per-N-minute
31
+ körningar).
32
+
33
+ ### Gap 2 — autoHide: false
34
+
35
+ **Behov:** komponenten ska vara hidden tills `data.active === true`.
36
+ Pipeline kan vara inaktiv vid sidladdning (vanligaste fallet eftersom
37
+ crons kör 3 ggr/dag). `progressEl` ska inte flasha tomt block.
38
+
39
+ **Workaround:** `root.hidden = true` direkt efter `start()` +
40
+ transform-managed visibility via `root.hidden = !data.active` i varje
41
+ poll-tick.
42
+
43
+ **Risk:** race om `start()` async-unhidar innan transform körs.
44
+ Nuvarande AsyncProgress.start() är synkron (`removeAttribute("hidden")`
45
+ i konstruktor-anrop), så pattern fungerar deterministiskt. Om paketet
46
+ ändras till async-init (t.ex. wait för DOM-ready) kan en kort flash
47
+ uppstå mellan start() och första transform.
48
+
49
+ ### Gap 3 — extraRenders
50
+
51
+ **Behov:** rendera side-elements utanför paketets bar/label/pct-scope.
52
+ Pipeline har `batch_progress_label` som renderas parallellt med
53
+ progress-bar (visar "Batch 3 av 7" o.s.v. under bar:en).
54
+
55
+ **Workaround:** transform-callback renderar elementet som side-effect:
56
+
57
+ ```javascript
58
+ function transformPayload(data) {
59
+ if (batchLabel) {
60
+ batchLabel.hidden = !data.batch_progress_label;
61
+ if (data.batch_progress_label) batchLabel.textContent = data.batch_progress_label;
62
+ }
63
+ // ...returnerar normal { status, stage, pct, label }
64
+ }
65
+ ```
66
+
67
+ **Risk:** side-effects i transform bryter single-responsibility-
68
+ principen. Transform är dokumenterad som ren payload-normalisering
69
+ (`(data) → { status, stage, pct, label, ... }`). DOM-skrivning i en
70
+ "pure" transform är subtilt fel arkitektur. Plus svår att testa
71
+ (transform-funktion ärver implicit DOM-state).
72
+
73
+ ## Considered options
74
+
75
+ ### A. Lägg till alla tre som opt-in options i AsyncProgress
76
+
77
+ ```javascript
78
+ new KloddDS.AsyncProgress({
79
+ progressEl: el,
80
+ pollUrl: "...",
81
+ continuousMode: true,
82
+ autoHide: false,
83
+ extraRenders: [
84
+ { el: batchLabel, valueKey: "batch_progress_label", hideWhenEmpty: true },
85
+ ],
86
+ });
87
+ ```
88
+
89
+ - Minor-bump till 5.5.0 (additive features, ingen breaking change)
90
+ - ADR krävs (locked-decision om continuous-mode-semantik:
91
+ vad menas exakt med "kontinuerligt" - polling-paus efter done?
92
+ retry-loop? backoff?)
93
+ - Cleaning workarounds i Jubb's wrapper (~10 LOC sparade per gap)
94
+
95
+ ### B. Lägg till bara continuousMode (vanligaste behovet)
96
+
97
+ - Patch-bump möjlig om semantik håller sig till "fortsätt polla
98
+ efter done" utan att rubba existing onComplete-kontrakt
99
+ - continuousMode triggar en onComplete-callback, men polling-loopen
100
+ fortsätter ostörd istället för att rensa pollTimer
101
+ - Klient kan opt-in via boolean utan ny config-struktur
102
+
103
+ ### C. Behåll workarounds tills ett tredje use-case dyker upp
104
+
105
+ - Ingen paket-ändring
106
+ - Pipeline + brief är två use-cases. Tredje (Ekonom bank-sync eller
107
+ framtida feature) skulle trigga konsolidering
108
+ - Workarounds dokumenteras i Jubb's wrapper (redan gjort i
109
+ JSDoc-header för `pipeline-progress.js`)
110
+
111
+ ## Pending decision criteria
112
+
113
+ Aktiveras när:
114
+
115
+ - Ekonom bank-synk eller annan app adopterar AsyncProgress och stöter
116
+ på samma gaps (continuous polling + lazy-show + extra-rendering).
117
+ Aktuell ETA okänd - bank-synk är planerad men inte påbörjad per
118
+ Ekonom DECISIONS.md
119
+ - Eller: workarounds visar sig instabila i prod (memory-leak från
120
+ recursive instances, race-condition på start()-hide, transform-
121
+ test-flakiness)
122
+
123
+ Inte prioriterat förrän en av ovan inträffar. Wrappern fungerar i
124
+ produktion (Jubb v202+) - gaps är arkitektur-städ, inte funktionalitet.
125
+
126
+ ## References
127
+
128
+ - Jubb commit `f46ff70` - pipeline-progress migration som upptäckte
129
+ gaps
130
+ - Jubb commit `d532e7e` - brief-progress migration (ett-shot-flöde som
131
+ matchar AsyncProgress's default-design)
132
+ - ADR 0016-async-progress-fetch-fn (`04-locked-decisions/`) - tidigare
133
+ AsyncProgress-utvidgning för demo/test-injection via fetchFn
134
+ - `~/dev/klodd-ds/js/async-progress.js` - paket-implementation
135
+ - `~/dev/Jubb/app/static/js/pipeline-progress.js` - wrapper med
136
+ workarounds (68 LOC)