@weasel-js/forge 1.5.1 → 1.6.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 (39) hide show
  1. package/README.md +72 -10
  2. package/dist/{FrameController-BPfCt4PJ.d.ts → FrameController-BspC9Zr5.d.ts} +67 -4
  3. package/dist/chunk-A4JOEGYQ.js +325 -0
  4. package/dist/chunk-A4JOEGYQ.js.map +1 -0
  5. package/dist/{chunk-2MADHLRA.js → chunk-FWPBKKYB.js} +58 -231
  6. package/dist/chunk-FWPBKKYB.js.map +1 -0
  7. package/dist/{chunk-6SRQIHJQ.js → chunk-HRGPFQBW.js} +3 -3
  8. package/dist/{chunk-6SRQIHJQ.js.map → chunk-HRGPFQBW.js.map} +1 -1
  9. package/dist/chunk-PO5JLVYT.js +318 -0
  10. package/dist/chunk-PO5JLVYT.js.map +1 -0
  11. package/dist/{chunk-TLO6UHF2.js → chunk-VEKEBILL.js} +17 -4
  12. package/dist/chunk-VEKEBILL.js.map +1 -0
  13. package/dist/{config-CrLpfSq9.d.ts → config-DU_WuORS.d.ts} +7 -1
  14. package/dist/csf/preview-api.js +1 -2
  15. package/dist/csf/preview-api.js.map +1 -1
  16. package/dist/frame/index.css +102 -0
  17. package/dist/frame/index.css.map +1 -1
  18. package/dist/frame/index.d.ts +11 -3
  19. package/dist/frame/index.js +365 -5
  20. package/dist/frame/index.js.map +1 -1
  21. package/dist/index.d.ts +4 -3
  22. package/dist/index.js.map +1 -1
  23. package/dist/shell/index.css +202 -13
  24. package/dist/shell/index.css.map +1 -1
  25. package/dist/shell/index.d.ts +76 -12
  26. package/dist/shell/index.js +1075 -187
  27. package/dist/shell/index.js.map +1 -1
  28. package/dist/test/index.d.ts +3 -3
  29. package/dist/test/index.js +67 -72
  30. package/dist/test/index.js.map +1 -1
  31. package/dist/vite/index.js +68 -11
  32. package/dist/vite/index.js.map +1 -1
  33. package/package.json +5 -4
  34. package/dist/chunk-2JDYOBWM.js +0 -118
  35. package/dist/chunk-2JDYOBWM.js.map +0 -1
  36. package/dist/chunk-2MADHLRA.js.map +0 -1
  37. package/dist/chunk-FTFR2YPM.js +0 -13
  38. package/dist/chunk-FTFR2YPM.js.map +0 -1
  39. package/dist/chunk-TLO6UHF2.js.map +0 -1
@@ -21,11 +21,63 @@
21
21
  font-family: var(--wzl-font-mono);
22
22
  font-size: var(--wzl-font-size-sm);
23
23
  }
24
+ .fg-story {
25
+ position: relative;
26
+ box-sizing: border-box;
27
+ width: 100%;
28
+ height: 100%;
29
+ overflow: auto;
30
+ contain: paint;
31
+ background: var(--wzl-surface);
32
+ color: var(--wzl-fg);
33
+ transition: opacity var(--wzl-motion-fast) var(--wzl-ease-out-cubic);
34
+ }
35
+ .fg-story[data-pending] {
36
+ visibility: hidden;
37
+ opacity: 0;
38
+ }
39
+ .fg-story[data-fg-layout=centered] {
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ }
44
+ .fg-story[data-fg-layout=padded] {
45
+ padding: 16px;
46
+ }
47
+ .fg-story[data-fg-layout=fullscreen] {
48
+ padding: 0;
49
+ }
50
+ .fg-story--loading {
51
+ visibility: visible;
52
+ opacity: 1;
53
+ }
54
+ @media (prefers-reduced-motion: reduce) {
55
+ .fg-story {
56
+ transition: none;
57
+ }
58
+ }
24
59
  .fg-frame-host {
25
60
  position: relative;
26
61
  width: 100%;
27
62
  height: 100%;
28
63
  }
64
+ .fg-frame-slot {
65
+ display: contents;
66
+ }
67
+ .fg-frame-pool {
68
+ position: fixed;
69
+ top: 0;
70
+ left: -10000px;
71
+ width: 1024px;
72
+ height: 768px;
73
+ visibility: hidden;
74
+ pointer-events: none;
75
+ }
76
+ .fg-frame-pool > iframe {
77
+ width: 100%;
78
+ height: 100%;
79
+ border: 0;
80
+ }
29
81
  .fg-frame-view {
30
82
  display: block;
31
83
  width: 100%;
@@ -130,28 +182,49 @@
130
182
  .fg-tree__item:hover {
131
183
  background: var(--wzl-surface-hover);
132
184
  }
185
+ .fg-tree__item > .fg-tree__tag {
186
+ flex: none;
187
+ margin-inline-start: auto;
188
+ }
189
+ .fg-tree__tag {
190
+ --badge-font-size: var(--wzl-font-size-2xs);
191
+ }
192
+ .fg-tree__libraries {
193
+ display: flex;
194
+ flex-wrap: wrap;
195
+ gap: var(--wzl-space-xs);
196
+ margin: 0;
197
+ padding: 0;
198
+ border: 0;
199
+ }
200
+ .fg-tree__libraries-legend {
201
+ padding: 0;
202
+ color: var(--wzl-fg-muted);
203
+ font-size: var(--wzl-font-size-sm);
204
+ }
133
205
  .fg-tree__story:focus-visible,
134
206
  .fg-tree__node:focus-visible > .fg-tree__folder {
135
207
  outline: var(--wzl-line-width) solid var(--wzl-accent);
136
208
  outline-offset: calc(-1 * var(--wzl-line-width));
137
209
  }
138
- .fg-tree__item[aria-current=true] {
139
- color: var(--wzl-accent);
210
+ .fg-tree__item[aria-current=true],
211
+ .fg-tree__node[aria-current=true] > .fg-tree__folder {
212
+ color: var(--wzl-secondary-fg);
140
213
  }
141
- .fg-tree__folder::before {
142
- content: "";
214
+ .fg-tree__fold {
143
215
  flex: none;
144
- width: 0.35em;
145
- height: 0.35em;
146
- border: solid currentColor;
147
- border-width: 0 1.5px 1.5px 0;
148
- transform: rotate(-45deg);
216
+ display: flex;
217
+ align-items: center;
218
+ justify-content: center;
219
+ margin: calc(-1 * var(--wzl-space-xs));
220
+ padding: var(--wzl-space-xs);
149
221
  }
150
- .fg-tree__node[aria-expanded=true] > .fg-tree__folder::before {
151
- transform: rotate(45deg);
222
+ .fg-tree__folder {
223
+ font-weight: calc(var(--wzl-font-weight-normal) + 100);
152
224
  }
153
225
  .fg-tree__story {
154
- padding-inline-start: calc(var(--wzl-space-xs) * 2 + 0.35em);
226
+ font-weight: 100;
227
+ padding-inline-start: calc(var(--wzl-space-xs) * 2 + 13px);
155
228
  }
156
229
  .lk-trial.fg-flash {
157
230
  outline: var(--wzl-line-width) solid var(--wzl-accent);
@@ -200,16 +273,42 @@
200
273
  padding-block-end: var(--wzl-space-xs);
201
274
  background: var(--wzl-surface);
202
275
  }
276
+ .fg-css-vars__save {
277
+ display: flex;
278
+ flex-direction: column;
279
+ align-items: flex-start;
280
+ gap: var(--wzl-space-xs);
281
+ }
282
+ .fg-css-vars__notice {
283
+ margin: 0;
284
+ font-size: var(--wzl-font-size-sm);
285
+ }
286
+ .fg-css-vars__notice--saved {
287
+ color: var(--wzl-fg-muted);
288
+ }
289
+ .fg-css-vars__notice--error {
290
+ color: var(--wzl-danger);
291
+ }
203
292
  .fg-css-vars__empty {
204
293
  margin: 0;
205
294
  color: var(--wzl-fg-muted);
206
295
  font-size: var(--wzl-font-size-sm);
207
296
  }
208
- .fg-globals {
297
+ .fg-globals,
298
+ .fg-globals__item {
209
299
  display: flex;
210
300
  align-items: center;
211
301
  gap: var(--wzl-space-xs);
212
302
  }
303
+ .fg-globals__item {
304
+ gap: 0;
305
+ }
306
+ .fg-globals__popover {
307
+ display: flex;
308
+ flex-direction: column;
309
+ gap: var(--wzl-space-sm);
310
+ min-width: 14rem;
311
+ }
213
312
  .fg-a11y,
214
313
  .fg-a11y-focus {
215
314
  display: flex;
@@ -280,4 +379,94 @@
280
379
  font-size: var(--wzl-font-size-xs);
281
380
  word-break: break-all;
282
381
  }
382
+ .fg-info-dialog {
383
+ inline-size: min(52rem, 90vw);
384
+ }
385
+ .fg-info {
386
+ display: flex;
387
+ flex-direction: column;
388
+ gap: var(--wzl-space-md);
389
+ }
390
+ .fg-info__section {
391
+ display: flex;
392
+ flex-direction: column;
393
+ gap: var(--wzl-space-xs);
394
+ }
395
+ .fg-info__heading {
396
+ margin: 0;
397
+ color: var(--wzl-fg-muted);
398
+ font-size: var(--wzl-font-size-xs);
399
+ font-weight: var(--wzl-font-weight-medium);
400
+ text-transform: uppercase;
401
+ letter-spacing: 0.04em;
402
+ }
403
+ .fg-info__doc {
404
+ margin: 0;
405
+ white-space: pre-line;
406
+ }
407
+ .fg-info__doc--component {
408
+ color: var(--wzl-fg-muted);
409
+ font-size: var(--wzl-font-size-sm);
410
+ }
411
+ .fg-info__rows {
412
+ display: grid;
413
+ grid-template-columns: max-content 1fr;
414
+ gap: var(--wzl-space-xs) var(--wzl-space-sm);
415
+ margin: 0;
416
+ font-size: var(--wzl-font-size-sm);
417
+ }
418
+ .fg-info__row {
419
+ display: contents;
420
+ }
421
+ .fg-info__key {
422
+ color: var(--wzl-fg-muted);
423
+ text-align: end;
424
+ }
425
+ .fg-info__value {
426
+ margin: 0;
427
+ min-inline-size: 0;
428
+ overflow-wrap: anywhere;
429
+ }
430
+ .fg-info__path {
431
+ font-size: var(--wzl-font-size-xs);
432
+ }
433
+ .fg-info__args {
434
+ inline-size: 100%;
435
+ border-collapse: collapse;
436
+ font-size: var(--wzl-font-size-sm);
437
+ font-variant-numeric: tabular-nums;
438
+ text-align: start;
439
+ }
440
+ .fg-info__args th,
441
+ .fg-info__args td {
442
+ padding: var(--wzl-space-xs) var(--wzl-space-xs);
443
+ border-block-end: 1px solid var(--wzl-border);
444
+ vertical-align: baseline;
445
+ text-align: start;
446
+ font-weight: var(--wzl-font-weight-normal);
447
+ }
448
+ .fg-info__args thead th {
449
+ color: var(--wzl-fg-muted);
450
+ font-size: var(--wzl-font-size-xs);
451
+ text-transform: uppercase;
452
+ }
453
+ .fg-info__arg-name {
454
+ display: block;
455
+ }
456
+ .fg-info__arg-doc {
457
+ display: block;
458
+ color: var(--wzl-fg-muted);
459
+ font-size: var(--wzl-font-size-xs);
460
+ }
461
+ .fg-info__arg-kind {
462
+ color: var(--wzl-fg-muted);
463
+ }
464
+ .fg-info__value-cell {
465
+ overflow-wrap: anywhere;
466
+ }
467
+ .fg-info__empty {
468
+ margin: 0;
469
+ color: var(--wzl-fg-muted);
470
+ font-size: var(--wzl-font-size-sm);
471
+ }
283
472
  /*# sourceMappingURL=index.css.map */
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shell/shell.css"],"sourcesContent":[".fg-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--wzl-space-xs);\n min-height: 100vh;\n padding-inline: var(--wzl-space-md);\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg);\n}\n\n.fg-empty__title {\n margin: 0;\n font-weight: var(--wzl-font-weight-bold);\n}\n\n.fg-empty__globs {\n margin: 0;\n padding: 0;\n list-style: none;\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-frame-host {\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n.fg-frame-view {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n transition: opacity var(--wzl-motion-fast) var(--wzl-ease-out-cubic);\n}\n\n.fg-frame-view[data-pending] {\n visibility: hidden;\n opacity: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fg-frame-view {\n transition: none;\n }\n}\n\n.fg-fault {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding: var(--wzl-space-md);\n overflow: auto;\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg);\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-fault__phase {\n color: var(--wzl-danger);\n font-weight: var(--wzl-font-weight-bold);\n text-transform: uppercase;\n}\n\n.fg-fault__message {\n margin: 0;\n white-space: pre-wrap;\n}\n\n.fg-tree {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding: 0 var(--wzl-space-xs) var(--wzl-space-xs);\n border-bottom: var(--wzl-border-w) solid var(--wzl-line-subtle);\n color: var(--wzl-fg);\n}\n\n.fg-tree__heading {\n margin: 0;\n padding-block: var(--wzl-space-xs);\n color: var(--wzl-fg-muted);\n font-family: var(--wzl-font-display);\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-font-weight-normal);\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n.fg-route-miss {\n margin: 0;\n color: var(--wzl-danger);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-tree__filter {\n box-sizing: border-box;\n width: 100%;\n font-size: var(--wzl-font-size);\n}\n\n.fg-tree__items,\n.fg-tree__group {\n display: flex;\n flex-direction: column;\n}\n\n.fg-tree__items {\n font-size: var(--wzl-font-size);\n}\n\n.fg-tree__group {\n padding-inline-start: var(--wzl-space-sm);\n}\n\n.fg-tree__node {\n display: flex;\n flex-direction: column;\n min-width: 0;\n outline: none;\n}\n\n.fg-tree__item {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-xs);\n padding: calc(var(--wzl-space-xs) / 2) var(--wzl-space-xs);\n border-radius: var(--wzl-radius-sm);\n overflow: hidden;\n color: inherit;\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n}\n\n/* text-overflow does not reach a flex container's anonymous text box, so the label clips itself. */\n.fg-tree__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fg-tree__item:hover {\n background: var(--wzl-surface-hover);\n}\n\n/* A folder item holds its group, so its ring goes on its own row rather than around the subtree. */\n.fg-tree__story:focus-visible,\n.fg-tree__node:focus-visible > .fg-tree__folder {\n outline: var(--wzl-line-width) solid var(--wzl-accent);\n outline-offset: calc(-1 * var(--wzl-line-width));\n}\n\n.fg-tree__item[aria-current='true'] {\n color: var(--wzl-accent);\n}\n\n/* Drawn with borders rather than a glyph, which would join the item's accessible name. */\n.fg-tree__folder::before {\n content: '';\n flex: none;\n width: 0.35em;\n height: 0.35em;\n border: solid currentColor;\n border-width: 0 1.5px 1.5px 0;\n transform: rotate(-45deg);\n}\n\n.fg-tree__node[aria-expanded='true'] > .fg-tree__folder::before {\n transform: rotate(45deg);\n}\n\n.fg-tree__story {\n padding-inline-start: calc(var(--wzl-space-xs) * 2 + 0.35em);\n}\n\n.lk-trial.fg-flash {\n outline: var(--wzl-line-width) solid var(--wzl-accent);\n outline-offset: calc(-1 * var(--wzl-line-width));\n animation: fg-flash 600ms ease-out forwards;\n}\n\n@keyframes fg-flash {\n from {\n outline-color: var(--wzl-accent);\n }\n to {\n outline-color: transparent;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .lk-trial.fg-flash {\n animation: none;\n }\n}\n\n.fg-css-vars {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-css-vars-focus {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n min-width: 0;\n}\n\n.fg-css-vars__trial {\n margin: 0;\n overflow: hidden;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Held at the top while the list scrolls the aside under it. */\n.fg-css-vars__controls {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding-block-end: var(--wzl-space-xs);\n background: var(--wzl-surface);\n}\n\n.fg-css-vars__empty {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-globals {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-xs);\n}\n\n\n.fg-a11y,\n.fg-a11y-focus {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n min-width: 0;\n}\n\n.fg-a11y__trial {\n margin: 0;\n overflow: hidden;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fg-a11y__controls {\n display: flex;\n gap: var(--wzl-space-xs);\n}\n\n.fg-a11y__note,\n.fg-a11y__tally {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n font-variant-numeric: tabular-nums;\n}\n\n.fg-a11y__group {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-a11y__group-title {\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n font-variant-numeric: tabular-nums;\n}\n\n.fg-a11y__findings,\n.fg-a11y__nodes {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.fg-a11y__finding {\n border-inline-start: 2px solid var(--wzl-border);\n padding-inline-start: var(--wzl-space-xs);\n}\n\n.fg-a11y__help {\n display: flex;\n align-items: baseline;\n gap: var(--wzl-space-xs);\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-a11y__impact {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n text-transform: uppercase;\n}\n\n.fg-a11y__impact[data-impact='serious'],\n.fg-a11y__impact[data-impact='critical'] {\n color: var(--wzl-danger);\n}\n\n.fg-a11y__nodes {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n word-break: break-all;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/shell/shell.css"],"sourcesContent":[".fg-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--wzl-space-xs);\n min-height: 100vh;\n padding-inline: var(--wzl-space-md);\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg);\n}\n\n.fg-empty__title {\n margin: 0;\n font-weight: var(--wzl-font-weight-bold);\n}\n\n.fg-empty__globs {\n margin: 0;\n padding: 0;\n list-style: none;\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n}\n\n/* One story's box in the workshop document; the theme attributes land on it from applyGlobals. `contain: paint`,\n exactly that value, makes it the containing block for fixed-position descendants, so a Dialog stays inside its\n trial, and it is the one containment React Aria's positioning recognizes: `layout paint` also contains, but the\n popover math then still assumes the viewport and lands a list a whole host offset too high. */\n.fg-story {\n position: relative;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n overflow: auto;\n contain: paint;\n background: var(--wzl-surface);\n color: var(--wzl-fg);\n transition: opacity var(--wzl-motion-fast) var(--wzl-ease-out-cubic);\n}\n\n.fg-story[data-pending] {\n visibility: hidden;\n opacity: 0;\n}\n\n.fg-story[data-fg-layout='centered'] {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.fg-story[data-fg-layout='padded'] {\n padding: 16px;\n}\n\n.fg-story[data-fg-layout='fullscreen'] {\n padding: 0;\n}\n\n.fg-story--loading {\n visibility: visible;\n opacity: 1;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fg-story {\n transition: none;\n }\n}\n\n.fg-frame-host {\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n.fg-frame-slot {\n display: contents;\n}\n\n/* Warm frames lay out at a trial's usual size, so moving one into place is not its first layout. */\n.fg-frame-pool {\n position: fixed;\n top: 0;\n left: -10000px;\n width: 1024px;\n height: 768px;\n visibility: hidden;\n pointer-events: none;\n}\n\n.fg-frame-pool > iframe {\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.fg-frame-view {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n transition: opacity var(--wzl-motion-fast) var(--wzl-ease-out-cubic);\n}\n\n.fg-frame-view[data-pending] {\n visibility: hidden;\n opacity: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fg-frame-view {\n transition: none;\n }\n}\n\n.fg-fault {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding: var(--wzl-space-md);\n overflow: auto;\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg);\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-fault__phase {\n color: var(--wzl-danger);\n font-weight: var(--wzl-font-weight-bold);\n text-transform: uppercase;\n}\n\n.fg-fault__message {\n margin: 0;\n white-space: pre-wrap;\n}\n\n.fg-tree {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding: 0 var(--wzl-space-xs) var(--wzl-space-xs);\n border-bottom: var(--wzl-border-w) solid var(--wzl-line-subtle);\n color: var(--wzl-fg);\n}\n\n.fg-tree__heading {\n margin: 0;\n padding-block: var(--wzl-space-xs);\n color: var(--wzl-fg-muted);\n font-family: var(--wzl-font-display);\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-font-weight-normal);\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n.fg-route-miss {\n margin: 0;\n color: var(--wzl-danger);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-tree__filter {\n box-sizing: border-box;\n width: 100%;\n font-size: var(--wzl-font-size);\n}\n\n.fg-tree__items,\n.fg-tree__group {\n display: flex;\n flex-direction: column;\n}\n\n.fg-tree__items {\n font-size: var(--wzl-font-size);\n}\n\n.fg-tree__group {\n padding-inline-start: var(--wzl-space-sm);\n}\n\n.fg-tree__node {\n display: flex;\n flex-direction: column;\n min-width: 0;\n outline: none;\n}\n\n.fg-tree__item {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-xs);\n padding: calc(var(--wzl-space-xs) / 2) var(--wzl-space-xs);\n border-radius: var(--wzl-radius-sm);\n overflow: hidden;\n color: inherit;\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n}\n\n/* text-overflow does not reach a flex container's anonymous text box, so the label clips itself. */\n.fg-tree__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fg-tree__item:hover {\n background: var(--wzl-surface-hover);\n}\n\n/* Sits after the label, which is the element that shrinks, so the tag keeps\n its width and the rows' tags line up down the column. */\n.fg-tree__item > .fg-tree__tag {\n flex: none;\n margin-inline-start: auto;\n}\n\n.fg-tree__tag {\n --badge-font-size: var(--wzl-font-size-2xs);\n}\n\n.fg-tree__libraries {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wzl-space-xs);\n margin: 0;\n padding: 0;\n border: 0;\n}\n\n.fg-tree__libraries-legend {\n padding: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n/* A folder item holds its group, so its ring goes on its own row rather than around the subtree. */\n.fg-tree__story:focus-visible,\n.fg-tree__node:focus-visible > .fg-tree__folder {\n outline: var(--wzl-line-width) solid var(--wzl-accent);\n outline-offset: calc(-1 * var(--wzl-line-width));\n}\n\n.fg-tree__item[aria-current='true'],\n.fg-tree__node[aria-current='true'] > .fg-tree__folder {\n color: var(--wzl-secondary-fg);\n}\n\n/* Padded out to a hit target and pulled back by the same amount, so the row's layout is unchanged. */\n.fg-tree__fold {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: calc(-1 * var(--wzl-space-xs));\n padding: var(--wzl-space-xs);\n}\n\n\n.fg-tree__folder {\n font-weight: calc(var(--wzl-font-weight-normal) + 100);\n}\n\n.fg-tree__story {\n /* The CSS floor, which the browser rounds up to the lightest weight the face has. */\n font-weight: 100;\n /* Clears the folder rows' 13px fold mark, so a story's label lines up with its folder's. */\n padding-inline-start: calc(var(--wzl-space-xs) * 2 + 13px);\n}\n\n.lk-trial.fg-flash {\n outline: var(--wzl-line-width) solid var(--wzl-accent);\n outline-offset: calc(-1 * var(--wzl-line-width));\n animation: fg-flash 600ms ease-out forwards;\n}\n\n@keyframes fg-flash {\n from {\n outline-color: var(--wzl-accent);\n }\n to {\n outline-color: transparent;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .lk-trial.fg-flash {\n animation: none;\n }\n}\n\n.fg-css-vars {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-css-vars-focus {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n min-width: 0;\n}\n\n.fg-css-vars__trial {\n margin: 0;\n overflow: hidden;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Held at the top while the list scrolls the aside under it. */\n.fg-css-vars__controls {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding-block-end: var(--wzl-space-xs);\n background: var(--wzl-surface);\n}\n\n.fg-css-vars__save {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--wzl-space-xs);\n}\n\n.fg-css-vars__notice {\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-css-vars__notice--saved {\n color: var(--wzl-fg-muted);\n}\n\n.fg-css-vars__notice--error {\n color: var(--wzl-danger);\n}\n\n.fg-css-vars__empty {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-globals,\n.fg-globals__item {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-xs);\n}\n\n.fg-globals__item {\n gap: 0;\n}\n\n.fg-globals__popover {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-sm);\n min-width: 14rem;\n}\n\n\n.fg-a11y,\n.fg-a11y-focus {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n min-width: 0;\n}\n\n.fg-a11y__trial {\n margin: 0;\n overflow: hidden;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fg-a11y__controls {\n display: flex;\n gap: var(--wzl-space-xs);\n}\n\n.fg-a11y__note,\n.fg-a11y__tally {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n font-variant-numeric: tabular-nums;\n}\n\n.fg-a11y__group {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-a11y__group-title {\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n font-variant-numeric: tabular-nums;\n}\n\n.fg-a11y__findings,\n.fg-a11y__nodes {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.fg-a11y__finding {\n border-inline-start: 2px solid var(--wzl-border);\n padding-inline-start: var(--wzl-space-xs);\n}\n\n.fg-a11y__help {\n display: flex;\n align-items: baseline;\n gap: var(--wzl-space-xs);\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-a11y__impact {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n text-transform: uppercase;\n}\n\n.fg-a11y__impact[data-impact='serious'],\n.fg-a11y__impact[data-impact='critical'] {\n color: var(--wzl-danger);\n}\n\n.fg-a11y__nodes {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n word-break: break-all;\n}\n\n/* Get Info */\n\n.fg-info-dialog {\n /* Wide enough for the longest row a dossier carries — an absolute story file\n path — to sit on one line. */\n inline-size: min(52rem, 90vw);\n}\n\n.fg-info {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-md);\n}\n\n.fg-info__section {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-info__heading {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n font-weight: var(--wzl-font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.fg-info__doc {\n margin: 0;\n white-space: pre-line;\n}\n\n.fg-info__doc--component {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-info__rows {\n display: grid;\n grid-template-columns: max-content 1fr;\n gap: var(--wzl-space-xs) var(--wzl-space-sm);\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-info__row {\n display: contents;\n}\n\n.fg-info__key {\n color: var(--wzl-fg-muted);\n text-align: end;\n}\n\n.fg-info__value {\n margin: 0;\n min-inline-size: 0;\n overflow-wrap: anywhere;\n}\n\n.fg-info__path {\n font-size: var(--wzl-font-size-xs);\n}\n\n.fg-info__args {\n inline-size: 100%;\n border-collapse: collapse;\n font-size: var(--wzl-font-size-sm);\n font-variant-numeric: tabular-nums;\n text-align: start;\n}\n\n.fg-info__args th,\n.fg-info__args td {\n padding: var(--wzl-space-xs) var(--wzl-space-xs);\n border-block-end: 1px solid var(--wzl-border);\n vertical-align: baseline;\n text-align: start;\n font-weight: var(--wzl-font-weight-normal);\n}\n\n.fg-info__args thead th {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n text-transform: uppercase;\n}\n\n.fg-info__arg-name {\n display: block;\n}\n\n.fg-info__arg-doc {\n display: block;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n}\n\n.fg-info__arg-kind {\n color: var(--wzl-fg-muted);\n}\n\n.fg-info__value-cell {\n overflow-wrap: anywhere;\n}\n\n.fg-info__empty {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n"],"mappings":"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","names":[]}
@@ -1,25 +1,40 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { LabContribution, StorageAdapter, InstrumentList } from '@weasel-js/labkit';
3
- import { I as IndexEntry, e as FromFrame, b as A11yReport, T as ToFrame, C as CssVarReport, f as CapturedPicture, V as Viewport } from '../FrameController-BPfCt4PJ.js';
4
- import { S as ShellConfig, a as GlobalDeclarations } from '../config-CrLpfSq9.js';
2
+ import { LabContribution, StorageAdapter, RenderContext, InstrumentList } from '@weasel-js/labkit';
3
+ import { FrameImporters } from '../frame/index.js';
4
+ import { g as IndexEntry, F as FrameSetup, L as LoadedStory, h as Layout, G as Globals, i as FromFrame, b as A11yReport, T as ToFrame, C as CssVarReport, j as CapturedPicture, V as Viewport } from '../FrameController-BspC9Zr5.js';
5
+ import { S as ShellConfig, a as GlobalDeclarations } from '../config-DU_WuORS.js';
5
6
  import * as react from 'react';
6
- import { RefObject } from 'react';
7
+ import { RefObject, ReactNode } from 'react';
7
8
  import '@weasel-js/labkit/config';
9
+ import '@weasel-js/theme';
8
10
 
9
11
  /** What axe found in the story of the trial this is rendered inside, re-run on demand. */
10
12
  declare function A11yPanel(): react_jsx_runtime.JSX.Element;
11
13
  declare const A11Y_SECTION: LabContribution;
12
14
 
15
+ /** Story files edited while the workshop runs, for the registry to load again. */
16
+ interface StoryChanges {
17
+ subscribe(listener: (file: string) => void): () => void;
18
+ emit(file: string): void;
19
+ }
20
+
13
21
  interface WorkshopProps {
14
22
  index: readonly IndexEntry[];
23
+ /** The frame document, for the stories `isolate` keeps in one. */
15
24
  frameUrl: string;
25
+ /** Story modules by file. Given, stories render in the workshop document; absent, every story renders in a frame. */
26
+ importers?: FrameImporters;
27
+ /** The frame config, applied to each story rendered in the document. */
28
+ setup?: FrameSetup;
29
+ /** Story files edited while the workshop runs; each is loaded again for the stories that had it. */
30
+ changes?: StoryChanges;
16
31
  config?: ShellConfig;
17
32
  /** The story globs the index was built from, named when it is empty. */
18
33
  stories?: readonly string[];
19
34
  storageKey?: string;
20
35
  storage?: StorageAdapter;
21
36
  }
22
- declare function Workshop({ index, frameUrl, config, stories, storageKey, storage }: WorkshopProps): react_jsx_runtime.JSX.Element;
37
+ declare function Workshop({ index, frameUrl, importers, setup, changes, config, stories, storageKey, storage }: WorkshopProps): react_jsx_runtime.JSX.Element;
23
38
 
24
39
  interface MountWorkshopOptions extends WorkshopProps {
25
40
  /** Default: the document's `#root`. */
@@ -28,6 +43,10 @@ interface MountWorkshopOptions extends WorkshopProps {
28
43
  interface MountedWorkshop {
29
44
  /** Swaps in a re-indexed story list, as the vite plugin's `forge:index` event carries. */
30
45
  setIndex(index: readonly IndexEntry[]): void;
46
+ /** Swaps in importers whose URLs fetch the modules as they are now, after an edit. */
47
+ setImporters(importers: FrameImporters): void;
48
+ /** Loads `file` again for every story that had it, through the current importers. */
49
+ reloadStory(file: string): void;
31
50
  unmount(): void;
32
51
  }
33
52
  declare function mountWorkshop({ container, ...props }: MountWorkshopOptions): MountedWorkshop;
@@ -35,6 +54,38 @@ declare function mountWorkshop({ container, ...props }: MountWorkshopOptions): M
35
54
  /** The lab's global values, which a trial's pins override. A change reaches open frames without replacing instruments. */
36
55
  declare const StoryGlobalsContext: react.Context<Readonly<Record<string, unknown>>>;
37
56
 
57
+ interface StoryTrialProps {
58
+ story: LoadedStory;
59
+ setup: FrameSetup;
60
+ /** The trial's config and state; the story reads and writes them through its `StoryContext`. */
61
+ ctx: Pick<RenderContext<unknown, unknown>, 'config' | 'state' | 'setConfig' | 'setState'>;
62
+ hostRef?: RefObject<HTMLElement | null>;
63
+ onRendered?: () => void;
64
+ /** A render throw, after the boundary has shown it. */
65
+ onError?: (error: unknown) => void;
66
+ }
67
+ /** A story rendered in the workshop document, inside a `TrialHost`, from the trial's own config and state. */
68
+ declare function StoryTrial({ story, setup, ctx, hostRef, onRendered, onError }: StoryTrialProps): react_jsx_runtime.JSX.Element;
69
+
70
+ interface TrialHostProps {
71
+ layout: Layout;
72
+ setup: FrameSetup;
73
+ /** The trial's config, read for its `$globals` pins. */
74
+ config: unknown;
75
+ /** Rendered once the host element exists, with the globals in force on it. */
76
+ children: (globals: Globals) => ReactNode;
77
+ /** Receives the host element, for a caller with no trial to reach it through. */
78
+ hostRef?: RefObject<HTMLElement | null>;
79
+ /** Called once the children's first commit has painted. */
80
+ onRendered?: () => void;
81
+ }
82
+ /**
83
+ * One story's box in the workshop document: what a frame document was, as an element. It applies the globals to
84
+ * itself, keeps its CSS variable overrides on itself, contains fixed-position descendants and portals, reports its
85
+ * vars, size and audits to the trial's frame registry, and unmounts its content while out of view.
86
+ */
87
+ declare function TrialHost({ layout, setup, config, children, hostRef, onRendered }: TrialHostProps): react_jsx_runtime.JSX.Element;
88
+
38
89
  type Ready = Extract<FromFrame, {
39
90
  type: 'ready';
40
91
  }>;
@@ -89,17 +140,30 @@ declare function useTrialFrame(trialId: string): TrialFrame;
89
140
 
90
141
  interface StoryRegistry {
91
142
  instruments: InstrumentList;
143
+ /** Whether a story's schema is known: its module has loaded, or its frame has reported. An instrument is built
144
+ * either way, and before that its schema is empty — which reads as "no args" to anything that cannot tell the
145
+ * two apart. */
146
+ isReady: (id: string) => boolean;
92
147
  /** Called by FrameView. Replaces the story's instrument only when `ready.schema`, layout or viewport differ from what it holds. */
93
148
  onReady: (entry: IndexEntry, ready: Ready) => void;
149
+ /** Drops what was loaded from `file` and loads it again for every entry that had it, as after an edit. */
150
+ reload: (file: string) => void;
94
151
  }
95
- /**
96
- * One instrument per story in `index`, each schema holding a `$globals` group for `globals`. The lab's global values
97
- * reach the frames through `StoryGlobalsContext`, not through here.
98
- */
99
- declare function useStoryRegistry(index: readonly IndexEntry[], options: {
152
+ interface StoryRegistryOptions {
100
153
  frameUrl: string;
101
154
  globals?: GlobalDeclarations;
102
155
  frames?: TrialFrames;
103
- }): StoryRegistry;
156
+ /** Story modules by file. Given, every entry without `isolate` renders in the workshop document; absent, every
157
+ * entry renders in a frame. */
158
+ importers?: FrameImporters;
159
+ /** The frame config, applied to each story host in the document. */
160
+ setup?: FrameSetup;
161
+ load?: (mod: Record<string, unknown>, autoTitle: string, parameters?: Record<string, unknown>) => LoadedStory[];
162
+ }
163
+ /**
164
+ * One instrument per story in `index`, each schema holding a `$globals` group for `globals`. The lab's global values
165
+ * reach the stories through `StoryGlobalsContext`, not through here.
166
+ */
167
+ declare function useStoryRegistry(index: readonly IndexEntry[], options: StoryRegistryOptions): StoryRegistry;
104
168
 
105
- export { A11Y_SECTION, type A11yOutcome, A11yPanel, type MountWorkshopOptions, type MountedWorkshop, StoryGlobalsContext, type StoryRegistry, type TrialFrame, type TrialFrames, TrialFramesContext, Workshop, type WorkshopProps, mountWorkshop, useStoryRegistry, useTrialFrame };
169
+ export { A11Y_SECTION, type A11yOutcome, A11yPanel, type MountWorkshopOptions, type MountedWorkshop, StoryGlobalsContext, type StoryRegistry, StoryTrial, type StoryTrialProps, type TrialFrame, type TrialFrames, TrialFramesContext, TrialHost, type TrialHostProps, Workshop, type WorkshopProps, mountWorkshop, useStoryRegistry, useTrialFrame };