@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.
package/css/components/hero.css
CHANGED
|
@@ -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
|
|
96
|
+
actions-knappar. */
|
|
97
97
|
display: flex;
|
|
98
98
|
align-items: center;
|
|
99
99
|
justify-content: flex-start;
|
package/package.json
CHANGED
|
@@ -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)
|