jssm 5.147.10 → 5.148.1

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.
@@ -2,6 +2,151 @@
2
2
  "schemaVersion": "1.0.0",
3
3
  "readme": "",
4
4
  "modules": [
5
+ {
6
+ "kind": "javascript-module",
7
+ "path": "src/ts/wc/fsl_actions_wc.ts",
8
+ "declarations": [
9
+ {
10
+ "kind": "class",
11
+ "description": "`<fsl-actions>` — interactive controls derived from a parent `<fsl-instance>`'s\r\nmachine. Renders a button for every currently-legal named **action** and, split\r\ninto three groups, every reachable transition target by edge kind: **main**\r\n(`=>`) first, plain **transitions** (`->`) next, and **forced** (`~>`) last.\r\nLegal targets fire with `transition`, forced-only ones with `force_transition`.\r\nRe-derives on the host's transition / rebuild events; only firable controls\r\nappear, and each group is omitted when empty, so a self-loop-only state shows\r\njust its actions and a terminal state shows `no actions available`. Standalone\r\n(no host ancestor) renders empty.",
12
+ "name": "FslActions",
13
+ "cssParts": [
14
+ {
15
+ "description": "The container.",
16
+ "name": "actions"
17
+ }
18
+ ],
19
+ "members": [
20
+ {
21
+ "kind": "field",
22
+ "name": "_actions",
23
+ "type": {
24
+ "text": "string[]"
25
+ },
26
+ "privacy": "private",
27
+ "default": "[]"
28
+ },
29
+ {
30
+ "kind": "field",
31
+ "name": "_main",
32
+ "type": {
33
+ "text": "string[]"
34
+ },
35
+ "privacy": "private",
36
+ "default": "[]"
37
+ },
38
+ {
39
+ "kind": "field",
40
+ "name": "_regular",
41
+ "type": {
42
+ "text": "string[]"
43
+ },
44
+ "privacy": "private",
45
+ "default": "[]"
46
+ },
47
+ {
48
+ "kind": "field",
49
+ "name": "_forced",
50
+ "type": {
51
+ "text": "string[]"
52
+ },
53
+ "privacy": "private",
54
+ "default": "[]"
55
+ },
56
+ {
57
+ "kind": "field",
58
+ "name": "_host",
59
+ "type": {
60
+ "text": "ActionsHost | null"
61
+ },
62
+ "privacy": "private",
63
+ "default": "null"
64
+ },
65
+ {
66
+ "kind": "field",
67
+ "name": "_unbind",
68
+ "type": {
69
+ "text": "(() => void) | null"
70
+ },
71
+ "privacy": "private",
72
+ "default": "null"
73
+ },
74
+ {
75
+ "kind": "method",
76
+ "name": "_derive",
77
+ "privacy": "private",
78
+ "return": {
79
+ "type": {
80
+ "text": "void"
81
+ }
82
+ },
83
+ "parameters": [
84
+ {
85
+ "name": "host",
86
+ "type": {
87
+ "text": "ActionsHost"
88
+ }
89
+ }
90
+ ],
91
+ "description": "Recompute the legal actions and the three transition groups from the host."
92
+ },
93
+ {
94
+ "kind": "method",
95
+ "name": "_group",
96
+ "privacy": "private",
97
+ "return": {
98
+ "type": {
99
+ "text": "TemplateResult | string"
100
+ }
101
+ },
102
+ "parameters": [
103
+ {
104
+ "name": "host",
105
+ "type": {
106
+ "text": "ActionsHost"
107
+ }
108
+ },
109
+ {
110
+ "name": "label",
111
+ "type": {
112
+ "text": "string"
113
+ }
114
+ },
115
+ {
116
+ "name": "targets",
117
+ "type": {
118
+ "text": "string[]"
119
+ }
120
+ },
121
+ {
122
+ "name": "forced",
123
+ "type": {
124
+ "text": "boolean"
125
+ }
126
+ }
127
+ ],
128
+ "description": "A transition group, or `''` when empty. Forced targets fire via force."
129
+ }
130
+ ],
131
+ "superclass": {
132
+ "name": "LitElement",
133
+ "package": "lit"
134
+ },
135
+ "tagName": "fsl-actions",
136
+ "customElement": true
137
+ }
138
+ ],
139
+ "exports": [
140
+ {
141
+ "kind": "js",
142
+ "name": "FslActions",
143
+ "declaration": {
144
+ "name": "FslActions",
145
+ "module": "src/ts/wc/fsl_actions_wc.ts"
146
+ }
147
+ }
148
+ ]
149
+ },
5
150
  {
6
151
  "kind": "javascript-module",
7
152
  "path": "src/ts/wc/fsl_bind_wc.ts",
@@ -189,350 +334,359 @@
189
334
  },
190
335
  {
191
336
  "kind": "javascript-module",
192
- "path": "src/ts/wc/fsl_effective_properties_wc.ts",
337
+ "path": "src/ts/wc/fsl_data_inspector_wc.ts",
193
338
  "declarations": [
339
+ {
340
+ "kind": "function",
341
+ "name": "tokenizeJson",
342
+ "return": {
343
+ "type": {
344
+ "text": ""
345
+ }
346
+ },
347
+ "parameters": [
348
+ {
349
+ "name": "json",
350
+ "type": {
351
+ "text": "string"
352
+ },
353
+ "description": "A JSON string (typically `JSON.stringify(value, null, 2)`)."
354
+ }
355
+ ],
356
+ "description": "Split a pretty-printed JSON string into classified tokens for syntax\r\nhighlighting. A quoted run is a `key` when the next non-space character is\r\n`:`, otherwise a `string`; `true`/`false` are `bool`, `null` is `null`,\r\nnumbers are `number`, and everything between (braces, commas, whitespace) is\r\n`plain`. Driven by the text, not a JSON parse, so it never throws."
357
+ },
194
358
  {
195
359
  "kind": "class",
196
- "description": "Read-only panel that displays the parent machine's **resolved FSL\r\nproperties** for the current state the values produced by the full\r\noverride chain (machine `property … default …` → per-state\r\n`state X: { property … }`), as returned by `machine.props()`. Refreshes on\r\nevery transition, so consumers can watch a property's effective value change\r\nas the machine moves between states.\r\n\r\nBinds to the host via closest_wc (matching both `fsl-instance` and\r\nthe deprecated `jssm-instance`). Display-only; never drives the machine.\r\n\r\nv1 shows the FSL `property` bag (`machine.props()`). The render-time visual\r\nstyle resolution (shape/color used by `<fsl-viz>`) is a separate viz-pipeline\r\nconcern and is not surfaced here.",
197
- "name": "FslEffectiveProperties",
198
- "cssProperties": [
360
+ "description": "`<fsl-data-inspector>`a syntax-highlighted view of a parent\r\n`<fsl-instance>`'s extended-state data. Re-reads `host.machine.data()` on the\r\nhost's transition / data-change / rebuild DOM events. The panel is bounded and\r\nscrolls internally (a self-contained vertical column). Renders `no data` when\r\nthe machine carries none; standalone (no host) renders empty.",
361
+ "name": "FslDataInspector",
362
+ "cssParts": [
199
363
  {
200
- "description": "Gap between rows.",
201
- "name": "--fsl-effective-properties-gap",
202
- "default": "0.25rem"
364
+ "description": "The scrollable container.",
365
+ "name": "inspector"
203
366
  }
204
367
  ],
205
368
  "members": [
206
369
  {
207
370
  "kind": "field",
208
- "name": "_host",
371
+ "name": "_data",
209
372
  "type": {
210
- "text": "JssmInstanceHost | null"
373
+ "text": "unknown"
211
374
  },
212
375
  "privacy": "private",
213
- "default": "null",
214
- "description": "Parent host reference; cleared on disconnect."
376
+ "default": "undefined"
215
377
  },
216
378
  {
217
379
  "kind": "field",
218
- "name": "_sub",
380
+ "name": "_unbind",
219
381
  "type": {
220
382
  "text": "(() => void) | null"
221
383
  },
222
384
  "privacy": "private",
223
- "default": "null",
224
- "description": "Unsubscribe callback from the host machine's `transition` subscription."
225
- },
226
- {
227
- "kind": "field",
228
- "name": "_entries",
229
- "type": {
230
- "text": "Array<[string, string]> | null"
231
- },
232
- "privacy": "private",
233
- "default": "null",
234
- "description": "Resolved property entries (`[name, stringified value]`) for the current\r\nstate, or `null` before the panel has bound to a host machine."
235
- },
236
- {
237
- "kind": "method",
238
- "name": "_refresh",
239
- "privacy": "private",
240
- "return": {
241
- "type": {
242
- "text": "void"
243
- }
244
- },
245
- "parameters": [
246
- {
247
- "name": "host",
248
- "type": {
249
- "text": "JssmInstanceHost"
250
- },
251
- "description": "The bound parent host whose machine to snapshot."
252
- }
253
- ],
254
- "description": "Read the resolved property bag (`machine.props()`) into reactive entries,\r\ntriggering a re-render."
385
+ "default": "null"
255
386
  }
256
387
  ],
257
388
  "superclass": {
258
389
  "name": "LitElement",
259
390
  "package": "lit"
260
391
  },
261
- "tagName": "fsl-effective-properties",
392
+ "tagName": "fsl-data-inspector",
262
393
  "customElement": true
263
394
  }
264
395
  ],
265
396
  "exports": [
266
397
  {
267
398
  "kind": "js",
268
- "name": "FslEffectiveProperties",
399
+ "name": "tokenizeJson",
269
400
  "declaration": {
270
- "name": "FslEffectiveProperties",
271
- "module": "src/ts/wc/fsl_effective_properties_wc.ts"
401
+ "name": "tokenizeJson",
402
+ "module": "src/ts/wc/fsl_data_inspector_wc.ts"
403
+ }
404
+ },
405
+ {
406
+ "kind": "js",
407
+ "name": "FslDataInspector",
408
+ "declaration": {
409
+ "name": "FslDataInspector",
410
+ "module": "src/ts/wc/fsl_data_inspector_wc.ts"
272
411
  }
273
412
  }
274
413
  ]
275
414
  },
276
415
  {
277
416
  "kind": "javascript-module",
278
- "path": "src/ts/wc/fsl_hook_wc.ts",
417
+ "path": "src/ts/wc/fsl_editor_wc.ts",
279
418
  "declarations": [
280
419
  {
281
- "kind": "function",
282
- "name": "make_hook_proxy",
283
- "return": {
284
- "type": {
285
- "text": ""
420
+ "kind": "class",
421
+ "description": "`<fsl-editor>` — a CodeMirror-based FSL editor web component.\r\n\r\nBatteries-included: FSL highlighting (`jssm/cm6`), linting, a semantic\r\noverlay (color chips / state & enum marks), and context-aware completion —\r\neach toggleable via a `no-*` attribute. Light/dark via the reflected `theme`\r\nattribute (which also drives the `--fsl-*` token defaults). White-labeled\r\nthrough the shared appearance contract. Emits `change` on user edits.",
422
+ "name": "FslEditor",
423
+ "cssParts": [
424
+ {
425
+ "description": "The CodeMirror editor container.",
426
+ "name": "editor"
286
427
  }
287
- },
288
- "parameters": [
428
+ ],
429
+ "members": [
289
430
  {
290
- "name": "ctx",
431
+ "kind": "field",
432
+ "name": "fsl",
291
433
  "type": {
292
- "text": "{ data?: TData; from?: string; to?: string; action?: string }"
434
+ "text": "string"
293
435
  },
294
- "description": "Raw hook context passed by jssm."
436
+ "default": "''",
437
+ "description": "FSL source text (two-way: reflects user edits, applies external writes).",
438
+ "attribute": "fsl"
295
439
  },
296
440
  {
297
- "name": "machine",
441
+ "kind": "field",
442
+ "name": "readonly",
298
443
  "type": {
299
- "text": "{ state(): unknown }"
444
+ "text": "boolean"
300
445
  },
301
- "description": "The owning machine; used for the `state()` accessor."
302
- }
303
- ],
304
- "description": "Build a JssmHookProxy that wraps an arbitrary hook context object.\r\n\r\nThe context shape varies by hook kind (`from`/`to`/`action` may be absent\r\nfor transition-kind hooks), so this normalizes the shape via optional\r\nfields and exposes mutable `data` while keeping the rest read-only.\r\n\r\nThe `machine` parameter is used only for `state()`, so unit tests can\r\nsubstitute any object with a `state(): unknown` method."
305
- },
306
- {
307
- "kind": "function",
308
- "name": "compile_inline_body",
309
- "return": {
310
- "type": {
311
- "text": ""
312
- }
313
- },
314
- "parameters": [
446
+ "default": "false",
447
+ "description": "When true, the document is read-only (selection still allowed).",
448
+ "attribute": "readonly",
449
+ "reflects": true
450
+ },
315
451
  {
316
- "name": "body",
452
+ "kind": "field",
453
+ "name": "theme",
317
454
  "type": {
318
- "text": "string"
455
+ "text": "'light' | 'dark'"
319
456
  },
320
- "description": "Trimmed textContent of the `<jssm-hook>` element."
457
+ "default": "'light'",
458
+ "description": "Color theme; reflected so it also drives the `--fsl-*` token defaults.",
459
+ "attribute": "theme",
460
+ "reflects": true
321
461
  },
322
462
  {
323
- "name": "debug_id",
463
+ "kind": "field",
464
+ "name": "noLint",
324
465
  "type": {
325
- "text": "string"
466
+ "text": "boolean"
326
467
  },
327
- "description": "Identifier appended to the synthetic sourceURL."
328
- }
329
- ],
330
- "description": "Compile a textContent body into a callable user handler.\r\n\r\nUses dynamic function construction — the same primitive browsers use\r\ninternally for `<a onclick=\"...\">` and `setTimeout(stringBody, ms)`.\r\nStrict CSP without `'unsafe-eval'` blocks this and the call will throw;\r\nconsumers should fall back to the `handler=\"name\"` form there.\r\n\r\nPrepends a `//# sourceURL=` comment so devtools surface a meaningful name\r\nin stack traces instead of `anonymous`."
331
- },
332
- {
333
- "kind": "function",
334
- "name": "resolve_named_handler",
335
- "return": {
336
- "type": {
337
- "text": ""
338
- }
339
- },
340
- "parameters": [
468
+ "default": "false",
469
+ "description": "Disable the diagnostics/lint underlines.",
470
+ "attribute": "no-lint"
471
+ },
341
472
  {
342
- "name": "name",
473
+ "kind": "field",
474
+ "name": "noOverlay",
343
475
  "type": {
344
- "text": "string"
476
+ "text": "boolean"
345
477
  },
346
- "description": "The handler name from the `handler=\"\"` attribute."
478
+ "default": "false",
479
+ "description": "Disable the semantic overlay (color chips, state/enum marks).",
480
+ "attribute": "no-overlay"
347
481
  },
348
482
  {
349
- "name": "registry",
350
- "optional": true,
483
+ "kind": "field",
484
+ "name": "noCompletion",
351
485
  "type": {
352
- "text": "FslHookRegistry"
486
+ "text": "boolean"
353
487
  },
354
- "description": "Optional in-WC registry to consult first."
355
- }
356
- ],
357
- "description": "Resolve a `handler=\"name\"` attribute to a callable by consulting first the\r\noptional in-WC registry, then `globalThis[name]`. Throws a clear error if\r\nneither resolves."
358
- },
359
- {
360
- "kind": "function",
361
- "name": "normalize_hook_kind",
362
- "return": {
363
- "type": {
364
- "text": ""
365
- }
366
- },
367
- "parameters": [
488
+ "default": "false",
489
+ "description": "Disable context-aware autocompletion.",
490
+ "attribute": "no-completion"
491
+ },
368
492
  {
369
- "name": "raw",
493
+ "kind": "field",
494
+ "name": "_view",
370
495
  "type": {
371
- "text": "string | null | undefined"
496
+ "text": "EditorView | null"
372
497
  },
373
- "description": "The raw attribute value, or null if not present."
374
- }
375
- ],
376
- "description": "Validate and normalize a `<jssm-hook kind=\"...\">` value, defaulting to\r\n`\"hook\"` when the attribute is absent. Throws on unknown kinds rather\r\nthan silently doing nothing later."
377
- },
378
- {
379
- "kind": "function",
380
- "name": "parse_hook_element",
381
- "return": {
382
- "type": {
383
- "text": ""
384
- }
385
- },
386
- "parameters": [
498
+ "privacy": "private",
499
+ "default": "null"
500
+ },
387
501
  {
388
- "name": "el",
502
+ "kind": "field",
503
+ "name": "_themeC",
504
+ "privacy": "private",
505
+ "readonly": true,
506
+ "default": "new Compartment()"
507
+ },
508
+ {
509
+ "kind": "field",
510
+ "name": "_lintC",
511
+ "privacy": "private",
512
+ "readonly": true,
513
+ "default": "new Compartment()"
514
+ },
515
+ {
516
+ "kind": "field",
517
+ "name": "_overlayC",
518
+ "privacy": "private",
519
+ "readonly": true,
520
+ "default": "new Compartment()"
521
+ },
522
+ {
523
+ "kind": "field",
524
+ "name": "_completionC",
525
+ "privacy": "private",
526
+ "readonly": true,
527
+ "default": "new Compartment()"
528
+ },
529
+ {
530
+ "kind": "field",
531
+ "name": "_readonlyC",
532
+ "privacy": "private",
533
+ "readonly": true,
534
+ "default": "new Compartment()"
535
+ },
536
+ {
537
+ "kind": "field",
538
+ "name": "_applyingProp",
389
539
  "type": {
390
- "text": "HTMLElement"
540
+ "text": "boolean"
391
541
  },
392
- "description": "The `<jssm-hook>` element to parse."
542
+ "privacy": "private",
543
+ "default": "false",
544
+ "description": "True while a programmatic doc write is in flight, to suppress the echo."
393
545
  },
394
546
  {
395
- "name": "debug_id",
547
+ "kind": "field",
548
+ "name": "_onChange",
396
549
  "type": {
397
- "text": "string"
550
+ "text": "((e: Event) => void) | null"
398
551
  },
399
- "description": "Identifier used in the inline body's sourceURL."
552
+ "privacy": "private",
553
+ "default": "null",
554
+ "description": "Write-back listener for a bound parent host, or null when standalone."
400
555
  },
401
556
  {
402
- "name": "registry",
403
- "optional": true,
557
+ "kind": "method",
558
+ "name": "_themeExt",
559
+ "privacy": "private",
560
+ "description": "The theme bundle for the current `theme` value."
561
+ },
562
+ {
563
+ "kind": "field",
564
+ "name": "view",
404
565
  "type": {
405
- "text": "FslHookRegistry"
566
+ "text": "EditorView | null"
406
567
  },
407
- "description": "Optional in-WC registry of named handlers."
568
+ "description": "The underlying CodeMirror view, or null before first render / after disconnect.",
569
+ "readonly": true
570
+ },
571
+ {
572
+ "kind": "method",
573
+ "name": "_onDocChanged",
574
+ "privacy": "private",
575
+ "return": {
576
+ "type": {
577
+ "text": "void"
578
+ }
579
+ },
580
+ "description": "Reflect a genuine user edit back to the `fsl` property + `change` event."
581
+ },
582
+ {
583
+ "kind": "method",
584
+ "name": "_syncDoc",
585
+ "privacy": "private",
586
+ "return": {
587
+ "type": {
588
+ "text": "void"
589
+ }
590
+ },
591
+ "description": "Apply an external `fsl` write to the document, guarding the echo."
408
592
  }
409
593
  ],
410
- "description": "Parse a single `<jssm-hook>` element into a JssmHookInstallSpec.\r\n\r\nValidates the mutual-exclusion rule between `handler=\"name\"` and inline\r\nbody, defaults `kind` to `\"hook\"`, resolves named handlers against the\r\noptional registry then `globalThis`, and compiles inline bodies via\r\ndynamic function construction. Conditional-required attributes (e.g.\r\n`from`/`to` for `kind=\"hook\"`) are NOT validated here — `set_hook` will\r\nthrow with its own clear errors on missing pieces, which keeps the\r\nerror surface single-sourced."
411
- },
412
- {
413
- "kind": "function",
414
- "name": "wrap_user_handler",
415
- "return": {
416
- "type": {
417
- "text": ""
594
+ "events": [
595
+ {
596
+ "name": "change",
597
+ "type": {
598
+ "text": "CustomEvent<FslEditorChangeDetail>"
599
+ },
600
+ "description": "On every user edit (not on programmatic `fsl` writes)."
418
601
  }
419
- },
420
- "parameters": [
602
+ ],
603
+ "attributes": [
421
604
  {
422
- "name": "spec",
605
+ "name": "fsl",
423
606
  "type": {
424
- "text": "FslHookInstallSpec"
607
+ "text": "string"
425
608
  },
426
- "description": "The parsed install spec carrying the user handler."
609
+ "default": "''",
610
+ "description": "FSL source text (two-way: reflects user edits, applies external writes).",
611
+ "fieldName": "fsl"
427
612
  },
428
613
  {
429
- "name": "machine",
614
+ "name": "readonly",
430
615
  "type": {
431
- "text": "{ state(): unknown }"
616
+ "text": "boolean"
432
617
  },
433
- "description": "The owning machine; used by the proxy's `state()`."
434
- }
435
- ],
436
- "description": "Wrap a JssmHookUserHandler so that jssm's native hook contract is\r\nsatisfied: the user gets a friendly proxy, the proxy's mutated `data`\r\nbecomes the `HookComplexResult.data`, and an explicit `false` return\r\ncancels the transition.\r\n\r\nAny non-`false` return — including `undefined`, `true`, or an arbitrary\r\nobject — allows the transition. This matches the contract spelled out\r\nin the issue (#641): \"return false cancels; anything else allows\"."
437
- },
438
- {
439
- "kind": "function",
440
- "name": "build_hook_descriptor",
441
- "return": {
442
- "type": {
443
- "text": ""
444
- }
445
- },
446
- "parameters": [
618
+ "default": "false",
619
+ "description": "When true, the document is read-only (selection still allowed).",
620
+ "fieldName": "readonly"
621
+ },
447
622
  {
448
- "name": "spec",
623
+ "name": "theme",
449
624
  "type": {
450
- "text": "FslHookInstallSpec"
625
+ "text": "'light' | 'dark'"
451
626
  },
452
- "description": "The parsed install spec."
627
+ "default": "'light'",
628
+ "description": "Color theme; reflected so it also drives the `--fsl-*` token defaults.",
629
+ "fieldName": "theme"
453
630
  },
454
631
  {
455
- "name": "wrapped",
632
+ "name": "no-lint",
456
633
  "type": {
457
- "text": "(ctx: RawHookContext) => unknown"
634
+ "text": "boolean"
458
635
  },
459
- "description": "The wrapped (friendly-proxy) handler from {@link wrap_user_handler}.\r\n * "
636
+ "default": "false",
637
+ "description": "Disable the diagnostics/lint underlines.",
638
+ "fieldName": "noLint"
639
+ },
640
+ {
641
+ "name": "no-overlay",
642
+ "type": {
643
+ "text": "boolean"
644
+ },
645
+ "default": "false",
646
+ "description": "Disable the semantic overlay (color chips, state/enum marks).",
647
+ "fieldName": "noOverlay"
648
+ },
649
+ {
650
+ "name": "no-completion",
651
+ "type": {
652
+ "text": "boolean"
653
+ },
654
+ "default": "false",
655
+ "description": "Disable context-aware autocompletion.",
656
+ "fieldName": "noCompletion"
460
657
  }
461
658
  ],
462
- "description": "Build the typed descriptor object passed to `machine.set_hook` (and later\r\nto `machine.remove_hook` for cleanup) from a parsed JssmHookInstallSpec\r\nand the wrapped handler.\r\n\r\nFor kinds that need `from`/`to`/`action`, the descriptor includes those.\r\nMissing required keys produce `undefined` here; jssm's `set_hook` will\r\nsurface the error with its own clear message so we don't duplicate\r\nvalidation.\r\n\r\nReturn type is `unknown` because jssm's `HookDescription` is a\r\ndiscriminated union and our runtime-discriminator value can't be tracked\r\nby TypeScript across the build. The WC casts at the `set_hook` call site."
659
+ "superclass": {
660
+ "name": "LitElement",
661
+ "package": "lit"
662
+ },
663
+ "tagName": "fsl-editor",
664
+ "customElement": true
463
665
  }
464
666
  ],
465
667
  "exports": [
466
668
  {
467
669
  "kind": "js",
468
- "name": "make_hook_proxy",
469
- "declaration": {
470
- "name": "make_hook_proxy",
471
- "module": "src/ts/wc/fsl_hook_wc.ts"
472
- }
473
- },
474
- {
475
- "kind": "js",
476
- "name": "compile_inline_body",
477
- "declaration": {
478
- "name": "compile_inline_body",
479
- "module": "src/ts/wc/fsl_hook_wc.ts"
480
- }
481
- },
482
- {
483
- "kind": "js",
484
- "name": "resolve_named_handler",
485
- "declaration": {
486
- "name": "resolve_named_handler",
487
- "module": "src/ts/wc/fsl_hook_wc.ts"
488
- }
489
- },
490
- {
491
- "kind": "js",
492
- "name": "normalize_hook_kind",
493
- "declaration": {
494
- "name": "normalize_hook_kind",
495
- "module": "src/ts/wc/fsl_hook_wc.ts"
496
- }
497
- },
498
- {
499
- "kind": "js",
500
- "name": "parse_hook_element",
501
- "declaration": {
502
- "name": "parse_hook_element",
503
- "module": "src/ts/wc/fsl_hook_wc.ts"
504
- }
505
- },
506
- {
507
- "kind": "js",
508
- "name": "wrap_user_handler",
509
- "declaration": {
510
- "name": "wrap_user_handler",
511
- "module": "src/ts/wc/fsl_hook_wc.ts"
512
- }
513
- },
514
- {
515
- "kind": "js",
516
- "name": "build_hook_descriptor",
670
+ "name": "FslEditor",
517
671
  "declaration": {
518
- "name": "build_hook_descriptor",
519
- "module": "src/ts/wc/fsl_hook_wc.ts"
672
+ "name": "FslEditor",
673
+ "module": "src/ts/wc/fsl_editor_wc.ts"
520
674
  }
521
675
  }
522
676
  ]
523
677
  },
524
678
  {
525
679
  "kind": "javascript-module",
526
- "path": "src/ts/wc/fsl_info_panel_wc.ts",
680
+ "path": "src/ts/wc/fsl_effective_properties_wc.ts",
527
681
  "declarations": [
528
682
  {
529
683
  "kind": "class",
530
- "description": "Read-only state-inspector web component for a parent `<fsl-instance>`.\r\n\r\nSlotted into the host's `info-panel` slot (or nested anywhere inside it), it\r\ndisplays the machine's current state, the most recent transition\r\n(`from to via action`), the currently-legal exit actions, and the\r\nterminal / complete flags. Every field refreshes on each `transition`\r\nevent.\r\n\r\nDisplay-only: it never drives the machine. It binds by walking up to the\r\nhost via closest_wc (which matches both the canonical `fsl-instance`\r\nand the deprecated `jssm-instance` host tags), so it works under either.",
531
- "name": "FslInfoPanel",
684
+ "description": "Read-only panel that displays the parent machine's **resolved FSL\r\nproperties** for the current state the values produced by the full\r\noverride chain (machine `property default …` per-state\r\n`state X: { property … }`), as returned by `machine.props()`. Refreshes on\r\nevery transition, so consumers can watch a property's effective value change\r\nas the machine moves between states.\r\n\r\nBinds to the host via closest_wc (matching both `fsl-instance` and\r\nthe deprecated `jssm-instance`). Display-only; never drives the machine.\r\n\r\nv1 shows the FSL `property` bag (`machine.props()`). The render-time visual\r\nstyle resolution (shape/color used by `<fsl-viz>`) is a separate viz-pipeline\r\nconcern and is not surfaced here.",
685
+ "name": "FslEffectiveProperties",
532
686
  "cssProperties": [
533
687
  {
534
- "description": "Vertical gap between rows.",
535
- "name": "--fsl-info-panel-gap",
688
+ "description": "Gap between rows.",
689
+ "name": "--fsl-effective-properties-gap",
536
690
  "default": "0.25rem"
537
691
  }
538
692
  ],
@@ -545,7 +699,7 @@
545
699
  },
546
700
  "privacy": "private",
547
701
  "default": "null",
548
- "description": "Parent host reference, set in `connectedCallback` when one is found.\r\nCleared on disconnect so a stale deferred subscription cannot fire."
702
+ "description": "Parent host reference; cleared on disconnect."
549
703
  },
550
704
  {
551
705
  "kind": "field",
@@ -559,62 +713,22 @@
559
713
  },
560
714
  {
561
715
  "kind": "field",
562
- "name": "_current",
716
+ "name": "_entries",
563
717
  "type": {
564
- "text": "string | null"
718
+ "text": "Array<[string, string]> | null"
565
719
  },
566
720
  "privacy": "private",
567
721
  "default": "null",
568
- "description": "Current state name; `null` until the panel has bound to a host machine."
722
+ "description": "Resolved property entries (`[name, stringified value]`) for the current\r\nstate, or `null` before the panel has bound to a host machine."
569
723
  },
570
724
  {
571
- "kind": "field",
572
- "name": "_actions",
573
- "type": {
574
- "text": "string"
575
- },
725
+ "kind": "method",
726
+ "name": "_refresh",
576
727
  "privacy": "private",
577
- "default": "''",
578
- "description": "Space-separated legal exit actions for the current state."
579
- },
580
- {
581
- "kind": "field",
582
- "name": "_terminal",
583
- "type": {
584
- "text": "boolean"
585
- },
586
- "privacy": "private",
587
- "default": "false",
588
- "description": "Whether the current state has no exits."
589
- },
590
- {
591
- "kind": "field",
592
- "name": "_complete",
593
- "type": {
594
- "text": "boolean"
595
- },
596
- "privacy": "private",
597
- "default": "false",
598
- "description": "Whether the current state is a `complete` state."
599
- },
600
- {
601
- "kind": "field",
602
- "name": "_last",
603
- "type": {
604
- "text": "LastTransition | null"
605
- },
606
- "privacy": "private",
607
- "default": "null",
608
- "description": "Most recent transition, or `null` before the first one."
609
- },
610
- {
611
- "kind": "method",
612
- "name": "_refresh",
613
- "privacy": "private",
614
- "return": {
615
- "type": {
616
- "text": "void"
617
- }
728
+ "return": {
729
+ "type": {
730
+ "text": "void"
731
+ }
618
732
  },
619
733
  "parameters": [
620
734
  {
@@ -625,539 +739,2302 @@
625
739
  "description": "The bound parent host whose machine to snapshot."
626
740
  }
627
741
  ],
628
- "description": "Read the current machine snapshot into the reactive fields, triggering a\r\nre-render. Called once on bind and again on every transition. The bound\r\nhost is passed in by the caller (which already holds a non-null reference),\r\nso no re-null-check is needed here."
742
+ "description": "Read the resolved property bag (`machine.props()`) into reactive entries,\r\ntriggering a re-render."
629
743
  }
630
744
  ],
631
745
  "superclass": {
632
746
  "name": "LitElement",
633
747
  "package": "lit"
634
748
  },
635
- "tagName": "fsl-info-panel",
749
+ "tagName": "fsl-effective-properties",
636
750
  "customElement": true
637
751
  }
638
752
  ],
639
753
  "exports": [
640
754
  {
641
755
  "kind": "js",
642
- "name": "FslInfoPanel",
756
+ "name": "FslEffectiveProperties",
643
757
  "declaration": {
644
- "name": "FslInfoPanel",
645
- "module": "src/ts/wc/fsl_info_panel_wc.ts"
758
+ "name": "FslEffectiveProperties",
759
+ "module": "src/ts/wc/fsl_effective_properties_wc.ts"
646
760
  }
647
761
  }
648
762
  ]
649
763
  },
650
764
  {
651
765
  "kind": "javascript-module",
652
- "path": "src/ts/wc/fsl_instance_wc.ts",
766
+ "path": "src/ts/wc/fsl_export_wc.ts",
653
767
  "declarations": [
654
768
  {
655
- "kind": "variable",
656
- "name": "JSSM_ON_EVENT_NAMES",
657
- "default": "new Set<string>([ 'transition', 'rejection', 'action', 'entry', 'exit', 'terminal', 'complete', 'error', 'data-change', 'override', 'timeout', 'hook-registration', 'hook-removal' ])",
658
- "description": "Allow-list of event names accepted by `<jssm-on event=\"...\">`. Must stay\r\nin sync with the `JssmEventName` union in `jssm_types.ts` (the library's\r\n`machine.on(...)` event API, added in #638). Validating here gives the\r\ndeclarative wiring a clear \"unknown event name\" error at the WC layer\r\ninstead of relying on a downstream library throw whose message would\r\nmention `machine.on(...)` rather than the offending tag."
659
- },
660
- {
661
- "kind": "function",
662
- "name": "parse_jssm_on_element",
663
- "return": {
664
- "type": {
665
- "text": ""
666
- }
667
- },
668
- "parameters": [
669
- {
670
- "name": "el",
671
- "type": {
672
- "text": "HTMLElement"
673
- },
674
- "description": "The `<jssm-on>` element to parse."
675
- }
676
- ],
677
- "description": "Parse a `<jssm-on>` element into a validated ParsedJssmOn\r\nrecord. Centralized so the declarative-tag logic is testable without\r\nspinning up the full `<jssm-instance>` lifecycle.\r\n\r\nValidation rules (per #643):\r\n - `event` is required and must be in JSSM_ON_EVENT_NAMES.\r\n - Either a `handler=\"name\"` attribute or non-empty `textContent`\r\n must be supplied, but not both.\r\n - `state` is only meaningful for `event=\"entry\"` / `event=\"exit\"`;\r\n it's silently ignored on other events.\r\n - `from` / `to` are only meaningful for `event=\"transition\"`; they\r\n are silently ignored on other events. Both → AND (a specific\r\n edge). Neither → unfiltered.\r\n\r\n```typescript\r\nconst el = document.createElement('jssm-on');\r\nel.setAttribute('event', 'entry');\r\nel.setAttribute('state', 'paid');\r\nel.setAttribute('handler', 'onPaid');\r\nparse_jssm_on_element(el);\r\n// => { event: 'entry', handler_name: 'onPaid', inline_body: undefined,\r\n// once: false, name: undefined, filter: { state: 'paid' } }\r\n```"
678
- },
679
- {
680
- "kind": "variable",
681
- "name": "jssm_handler_registry",
682
- "type": {
683
- "text": "Map<string, (...args: unknown[]) => unknown>"
684
- },
685
- "default": "new Map()",
686
- "description": "Optional global registry that `<jssm-on>` (and, later, `<jssm-hook>`)\r\nconsult first when resolving a `handler=\"name\"` attribute. Consumers\r\nregister named handlers here in a strict-CSP environment where a stray\r\n`globalThis[name]` isn't acceptable. Falls through to `globalThis[name]`\r\nif the registry has no entry.\r\n\r\nIntentionally a `Map<string, Function>` rather than a class with methods,\r\nso consumers can use any of `.get`, `.set`, `.delete`, `.clear` directly\r\nwithout a thin wrapper API."
687
- },
688
- {
689
- "kind": "function",
690
- "name": "resolve_named_handler",
691
- "return": {
692
- "type": {
693
- "text": ""
694
- }
695
- },
696
- "parameters": [
769
+ "kind": "class",
770
+ "description": "`<fsl-export>` — export buttons for a parent `<fsl-instance>`. Each produces a\r\nstring from the host's machine and fires `fsl-export` with `{ format,\r\ncontent }`; the embedder decides what to do with it (copy, download, show).\r\nFormats: Graphviz `dot` (via `machine_to_dot`), `json` (the machine's\r\n`serialize()`), and `fsl` (the source). Standalone is inert.",
771
+ "name": "FslExport",
772
+ "cssParts": [
697
773
  {
698
- "name": "name",
699
- "type": {
700
- "text": "string"
701
- },
702
- "description": "The handler name as supplied by `handler=\"...\"`."
774
+ "description": "The button row.",
775
+ "name": "export"
703
776
  }
704
777
  ],
705
- "description": "Resolve a named handler from the registry, then from `globalThis`.\r\nThrows if neither lookup finds a function — earlier failure here is\r\nbetter than a delayed \"is not a function\" at first event delivery."
706
- },
707
- {
708
- "kind": "function",
709
- "name": "compile_inline_body",
710
- "return": {
711
- "type": {
712
- "text": ""
713
- }
714
- },
715
- "parameters": [
778
+ "members": [
716
779
  {
717
- "name": "body",
780
+ "kind": "field",
781
+ "name": "_host",
718
782
  "type": {
719
- "text": "string"
783
+ "text": "ExportHost | null"
720
784
  },
721
- "description": "The inline JS body (function body, not full function)."
785
+ "privacy": "private",
786
+ "default": "null"
722
787
  },
723
788
  {
724
- "name": "source_id",
725
- "type": {
726
- "text": "string"
789
+ "kind": "method",
790
+ "name": "_emit",
791
+ "privacy": "private",
792
+ "return": {
793
+ "type": {
794
+ "text": "void"
795
+ }
727
796
  },
728
- "description": "A short identifier for the sourceURL pragma."
797
+ "parameters": [
798
+ {
799
+ "name": "format",
800
+ "type": {
801
+ "text": "FslExportFormat"
802
+ }
803
+ }
804
+ ]
729
805
  }
730
806
  ],
731
- "description": "Compile an inline-body string into a handler function whose single\r\nparameter is `e` (the event detail object). Uses the same dynamic\r\n`Function(...)` constructor that browsers use internally for inline\r\nevent-handler attributes such as `<a onclick=\"...\">`; the input here\r\nis consumer-authored markup, never network data, so the surface is\r\nexactly that of an inline event-handler attribute and the same CSP\r\ncaveats apply (strict CSP without `'unsafe-eval'` blocks it). A\r\n`//# sourceURL=jssm-on:N` pragma is appended so devtools stack traces\r\npoint at a meaningful name."
732
- },
733
- {
734
- "kind": "function",
735
- "name": "resolve_fsl_source",
736
- "return": {
737
- "type": {
738
- "text": ""
739
- }
740
- },
741
- "parameters": [
742
- {
743
- "name": "host",
744
- "type": {
745
- "text": "HTMLElement"
746
- },
747
- "description": "The `<jssm-instance>` element being resolved."
748
- },
807
+ "events": [
749
808
  {
750
- "name": "fsl_attr",
809
+ "name": "fsl-export",
751
810
  "type": {
752
- "text": "string"
753
- },
754
- "description": "The current value of the host's `fsl` attribute (or property), or empty string."
811
+ "text": "CustomEvent<{format: FslExportFormat, content: string}>"
812
+ }
755
813
  }
756
814
  ],
757
- "description": "Resolve a `<jssm-instance>`'s FSL source from the three legal channels:\r\nthe `fsl=\"\"` attribute, a child `<script type=\"text/fsl\">`, and the\r\nelement's own text content (after stripping the script and any\r\n`<jssm-*>` companion tags). Exactly one channel may be used; using\r\nnone or more than one is an error.\r\n\r\nPulled out as a pure function so it's testable without spinning up a\r\nLit element.\r\n\r\n```typescript\r\nconst div = document.createElement('div');\r\ndiv.setAttribute('fsl', 'Off -> On;');\r\nresolve_fsl_source(div as HTMLElement, 'Off -> On;');\r\n// => { fsl: 'Off -> On;', provided_count: 1, error: undefined }\r\n```"
758
- },
815
+ "superclass": {
816
+ "name": "LitElement",
817
+ "package": "lit"
818
+ },
819
+ "tagName": "fsl-export",
820
+ "customElement": true
821
+ }
822
+ ],
823
+ "exports": [
824
+ {
825
+ "kind": "js",
826
+ "name": "FslExport",
827
+ "declaration": {
828
+ "name": "FslExport",
829
+ "module": "src/ts/wc/fsl_export_wc.ts"
830
+ }
831
+ }
832
+ ]
833
+ },
834
+ {
835
+ "kind": "javascript-module",
836
+ "path": "src/ts/wc/fsl_footer_wc.ts",
837
+ "declarations": [
759
838
  {
760
839
  "kind": "class",
761
- "description": "Web component that owns a single `Machine<unknown>` constructed from an\r\nFSL source supplied via one of three mutually exclusive channels:\r\n\r\n 1. The `fsl=\"\"` attribute,\r\n 2. A child `<script type=\"text/fsl\">`,\r\n 3. The element's own text content (companion `<jssm-*>` children and\r\n any `<script type=\"text/fsl\">` are excluded from this channel).\r\n\r\nSupplying zero or more than one channel is a thrown error.\r\n\r\nOn every transition the component reflects machine state to its own\r\nattributes (`current-state`, `legal-actions`, `terminal`, `complete`)\r\nand sets a `--current-state` CSS custom property so consumer CSS can\r\nstyle by state without subclassing.",
762
- "name": "FslInstance",
763
- "cssProperties": [
840
+ "description": "`<fsl-footer>` a status bar for a parent `<fsl-instance>`.\r\n\r\nReflects the host's current state, legal-action count, and\r\nterminal/complete status by observing the host's reflected attributes\r\n(`current-state`, `legal-actions`, `terminal`, `complete`) — so it tracks\r\ntransitions *and* survives a live machine rebuild (#1387) without a machine\r\nsubscription. A default slot carries embedder status (line/column, parse\r\nstate, …). Standalone (no `<fsl-instance>` ancestor) it renders just the slot.",
841
+ "name": "FslFooter",
842
+ "cssParts": [
764
843
  {
765
- "description": "The machine's current state name as a CSS string token.",
766
- "name": "--current-state"
844
+ "description": "The footer bar container.",
845
+ "name": "bar"
767
846
  }
768
847
  ],
769
848
  "slots": [
770
849
  {
771
- "description": "Heading area for the instance.",
772
- "name": "title"
773
- },
774
- {
775
- "description": "Visualization slot; fallback is a placeholder string.",
776
- "name": "viz"
777
- },
778
- {
779
- "description": "Editor surface slot (`<fsl-editor>`, #659).",
780
- "name": "editor"
781
- },
782
- {
783
- "description": "Slot for action buttons / UI.",
784
- "name": "actions"
785
- },
786
- {
787
- "description": "Slot for toolbar UI (`<fsl-toolbar>`, #660).",
788
- "name": "toolbar"
789
- },
790
- {
791
- "description": "Slot for an info / status panel (`<fsl-info-panel>`, #661).",
792
- "name": "info-panel"
793
- },
794
- {
795
- "description": "Slot for the visited-state timeline (`<fsl-history>`, #662).",
796
- "name": "history"
797
- },
798
- {
799
- "description": "Slot for the typed-data tree view (`<fsl-data-inspector>`, #663).",
800
- "name": "data-inspector"
801
- },
802
- {
803
- "description": "Slot for the hook-firing log (`<fsl-hook-log>`, #664).",
804
- "name": "hook-log"
805
- },
806
- {
807
- "description": "Slot for the resolved-properties panel (`<fsl-effective-properties>`, #665).",
808
- "name": "effective-properties"
809
- },
810
- {
811
- "description": "Slot for the random-walk simulation (`<fsl-simulation>`, #668).",
812
- "name": "simulation"
813
- },
814
- {
815
- "description": "Slot for the export menu (`<fsl-export>`, #667).",
816
- "name": "export"
817
- },
818
- {
819
- "description": "Footer slot.",
820
- "name": "footer"
850
+ "description": "Trailing custom status, right-aligned.",
851
+ "name": ""
821
852
  }
822
853
  ],
823
854
  "members": [
824
855
  {
825
856
  "kind": "field",
826
- "name": "fsl",
827
- "privacy": "public",
857
+ "name": "_state",
828
858
  "type": {
829
859
  "text": "string"
830
860
  },
831
- "default": "''",
832
- "description": "FSL source attribute. When non-empty, this is the sole channel\r\nsupplying the machine's source. Setting both this and a child\r\n`<script type=\"text/fsl\">` (or non-empty text content) is an error.",
833
- "attribute": "fsl"
861
+ "privacy": "private",
862
+ "default": "''"
834
863
  },
835
864
  {
836
865
  "kind": "field",
837
- "name": "_machine",
866
+ "name": "_actions",
838
867
  "type": {
839
- "text": "Machine<unknown> | undefined"
868
+ "text": "number"
840
869
  },
841
870
  "privacy": "private",
842
- "default": "undefined",
843
- "description": "The underlying machine instance, constructed at `connectedCallback`.\r\nExposed raw (not proxied) per the #639/#648 design decision so that\r\nconsumers can use the full Machine API directly.\r\n\r\nMarked optional because Lit will instantiate the element before\r\n`connectedCallback` runs; the instance is guaranteed present after\r\nconnection."
871
+ "default": "0"
844
872
  },
845
873
  {
846
874
  "kind": "field",
847
- "name": "_unsubs",
875
+ "name": "_terminal",
848
876
  "type": {
849
- "text": "FslBindUnsub[]"
877
+ "text": "boolean"
850
878
  },
851
879
  "privacy": "private",
852
- "default": "[]",
853
- "description": "Live unsubscribe callbacks for #645 `<fsl-bind>` / `data-jssm-bind`\r\nprojections. Every entry must be invoked exactly once during\r\ndisconnectedCallback."
880
+ "default": "false"
854
881
  },
855
882
  {
856
883
  "kind": "field",
857
- "name": "_on_unsubscribes",
884
+ "name": "_complete",
858
885
  "type": {
859
- "text": "Array<() => void>"
886
+ "text": "boolean"
860
887
  },
861
888
  "privacy": "private",
862
- "default": "[]",
863
- "description": "Unsubscribe callbacks for every `machine.on(...)` / `machine.once(...)`\r\nsubscription installed from a `<jssm-on>` child during\r\n`connectedCallback`. Walked in `disconnectedCallback`."
889
+ "default": "false"
864
890
  },
865
891
  {
866
892
  "kind": "field",
867
- "name": "REEMITTED_EVENTS",
893
+ "name": "_observer",
868
894
  "type": {
869
- "text": "readonly string[]"
895
+ "text": "MutationObserver | null"
870
896
  },
871
897
  "privacy": "private",
872
- "static": true,
873
- "readonly": true,
874
- "default": "[ 'transition', 'entry', 'exit', 'terminal', 'complete', 'action', 'rejection', 'override', 'data-change', 'timeout', 'error', ]",
875
- "description": "Library event names this WC re-emits as DOM `CustomEvent`s, fulfilling\r\nmechanism 4 of #639. Each library `machine.on(name, ...)` is bridged to\r\na `fsl-<name>` DOM event (`composed`, `bubbling`) so slotted content and\r\noutside consumers can observe machine activity declaratively.\r\n\r\n`fsl-` is the canonical prefix (matching the canonical `<fsl-*>` tag\r\nnames); the older `jssm-*` event prose in #639 predates that naming flip.\r\nEvents are NOT double-emitted under both prefixes — a symmetric listener\r\nwould otherwise run twice per machine event."
876
- },
898
+ "default": "null"
899
+ }
900
+ ],
901
+ "superclass": {
902
+ "name": "LitElement",
903
+ "package": "lit"
904
+ },
905
+ "tagName": "fsl-footer",
906
+ "customElement": true
907
+ }
908
+ ],
909
+ "exports": [
910
+ {
911
+ "kind": "js",
912
+ "name": "FslFooter",
913
+ "declaration": {
914
+ "name": "FslFooter",
915
+ "module": "src/ts/wc/fsl_footer_wc.ts"
916
+ }
917
+ }
918
+ ]
919
+ },
920
+ {
921
+ "kind": "javascript-module",
922
+ "path": "src/ts/wc/fsl_help_wc.ts",
923
+ "declarations": [
924
+ {
925
+ "kind": "class",
926
+ "description": "`<fsl-help>` — a documentation drawer shell: a titled, scrollable panel with\r\na close button and a default slot for content (typically foldable\r\n`<details>` sections). Presentational and self-contained — it owns no machine\r\nbinding. The reflected `open` attribute drives visibility, so embedders can\r\nanimate it (e.g. a width transition on the host) purely from CSS.",
927
+ "name": "FslHelp",
928
+ "cssParts": [
929
+ {
930
+ "description": "The drawer container.",
931
+ "name": "drawer"
932
+ },
933
+ {
934
+ "description": "The header bar.",
935
+ "name": "head"
936
+ },
937
+ {
938
+ "description": "The scrollable content area.",
939
+ "name": "body"
940
+ },
941
+ {
942
+ "description": "The close button.",
943
+ "name": "close"
944
+ }
945
+ ],
946
+ "slots": [
947
+ {
948
+ "description": "The documentation content.",
949
+ "name": ""
950
+ }
951
+ ],
952
+ "members": [
953
+ {
954
+ "kind": "field",
955
+ "name": "open",
956
+ "type": {
957
+ "text": "boolean"
958
+ },
959
+ "default": "false",
960
+ "description": "Whether the drawer is shown. Reflected so embedders can animate off it.",
961
+ "attribute": "open",
962
+ "reflects": true
963
+ },
964
+ {
965
+ "kind": "field",
966
+ "name": "heading",
967
+ "type": {
968
+ "text": "string"
969
+ },
970
+ "default": "'Documentation'",
971
+ "description": "Heading shown in the drawer's header.",
972
+ "attribute": "heading"
973
+ },
974
+ {
975
+ "kind": "field",
976
+ "name": "_onClose",
977
+ "privacy": "private",
978
+ "description": "Close the drawer and emit `close`."
979
+ }
980
+ ],
981
+ "events": [
982
+ {
983
+ "type": {
984
+ "text": "CustomEvent<void>"
985
+ },
986
+ "description": "When the close button is pressed.",
987
+ "name": "close"
988
+ }
989
+ ],
990
+ "attributes": [
991
+ {
992
+ "name": "open",
993
+ "type": {
994
+ "text": "boolean"
995
+ },
996
+ "default": "false",
997
+ "description": "Whether the drawer is shown. Reflected so embedders can animate off it.",
998
+ "fieldName": "open"
999
+ },
1000
+ {
1001
+ "name": "heading",
1002
+ "type": {
1003
+ "text": "string"
1004
+ },
1005
+ "default": "'Documentation'",
1006
+ "description": "Heading shown in the drawer's header.",
1007
+ "fieldName": "heading"
1008
+ }
1009
+ ],
1010
+ "superclass": {
1011
+ "name": "LitElement",
1012
+ "package": "lit"
1013
+ },
1014
+ "tagName": "fsl-help",
1015
+ "customElement": true
1016
+ }
1017
+ ],
1018
+ "exports": [
1019
+ {
1020
+ "kind": "js",
1021
+ "name": "FslHelp",
1022
+ "declaration": {
1023
+ "name": "FslHelp",
1024
+ "module": "src/ts/wc/fsl_help_wc.ts"
1025
+ }
1026
+ }
1027
+ ]
1028
+ },
1029
+ {
1030
+ "kind": "javascript-module",
1031
+ "path": "src/ts/wc/fsl_history_wc.ts",
1032
+ "declarations": [
1033
+ {
1034
+ "kind": "class",
1035
+ "description": "`<fsl-history>` — the visited-state timeline for a parent `<fsl-instance>`.\r\n\r\nListens to the host's `fsl-transition` DOM events (re-emitted once per\r\ntransition, #639) and records the host's reflected `current-state`, so it\r\ncaptures every transition and survives a live machine rebuild without a\r\nmachine subscription. Standalone (no host ancestor) renders empty.",
1036
+ "name": "FslHistory",
1037
+ "cssParts": [
1038
+ {
1039
+ "description": "The timeline container.",
1040
+ "name": "timeline"
1041
+ }
1042
+ ],
1043
+ "members": [
1044
+ {
1045
+ "kind": "field",
1046
+ "name": "_history",
1047
+ "type": {
1048
+ "text": "string[]"
1049
+ },
1050
+ "privacy": "private",
1051
+ "default": "[]"
1052
+ },
1053
+ {
1054
+ "kind": "field",
1055
+ "name": "_unbind",
1056
+ "type": {
1057
+ "text": "(() => void) | null"
1058
+ },
1059
+ "privacy": "private",
1060
+ "default": "null"
1061
+ }
1062
+ ],
1063
+ "superclass": {
1064
+ "name": "LitElement",
1065
+ "package": "lit"
1066
+ },
1067
+ "tagName": "fsl-history",
1068
+ "customElement": true
1069
+ }
1070
+ ],
1071
+ "exports": [
1072
+ {
1073
+ "kind": "js",
1074
+ "name": "FslHistory",
1075
+ "declaration": {
1076
+ "name": "FslHistory",
1077
+ "module": "src/ts/wc/fsl_history_wc.ts"
1078
+ }
1079
+ }
1080
+ ]
1081
+ },
1082
+ {
1083
+ "kind": "javascript-module",
1084
+ "path": "src/ts/wc/fsl_hook_log_wc.ts",
1085
+ "declarations": [
1086
+ {
1087
+ "kind": "class",
1088
+ "description": "`<fsl-hook-log>` — a running log of a parent `<fsl-instance>`'s machine\r\nevents, listening to the host's re-emitted `fsl-*` DOM events (#639). Keeps\r\nthe most recent MAX_ENTRIES. Standalone (no host ancestor) is empty.",
1089
+ "name": "FslHookLog",
1090
+ "cssParts": [
1091
+ {
1092
+ "description": "The log container.",
1093
+ "name": "log"
1094
+ }
1095
+ ],
1096
+ "members": [
1097
+ {
1098
+ "kind": "field",
1099
+ "name": "_log",
1100
+ "type": {
1101
+ "text": "string[]"
1102
+ },
1103
+ "privacy": "private",
1104
+ "default": "[]"
1105
+ },
1106
+ {
1107
+ "kind": "field",
1108
+ "name": "_unbind",
1109
+ "type": {
1110
+ "text": "(() => void) | null"
1111
+ },
1112
+ "privacy": "private",
1113
+ "default": "null"
1114
+ }
1115
+ ],
1116
+ "superclass": {
1117
+ "name": "LitElement",
1118
+ "package": "lit"
1119
+ },
1120
+ "tagName": "fsl-hook-log",
1121
+ "customElement": true
1122
+ }
1123
+ ],
1124
+ "exports": [
1125
+ {
1126
+ "kind": "js",
1127
+ "name": "FslHookLog",
1128
+ "declaration": {
1129
+ "name": "FslHookLog",
1130
+ "module": "src/ts/wc/fsl_hook_log_wc.ts"
1131
+ }
1132
+ }
1133
+ ]
1134
+ },
1135
+ {
1136
+ "kind": "javascript-module",
1137
+ "path": "src/ts/wc/fsl_hook_wc.ts",
1138
+ "declarations": [
1139
+ {
1140
+ "kind": "function",
1141
+ "name": "make_hook_proxy",
1142
+ "return": {
1143
+ "type": {
1144
+ "text": ""
1145
+ }
1146
+ },
1147
+ "parameters": [
1148
+ {
1149
+ "name": "ctx",
1150
+ "type": {
1151
+ "text": "{ data?: TData; from?: string; to?: string; action?: string }"
1152
+ },
1153
+ "description": "Raw hook context passed by jssm."
1154
+ },
1155
+ {
1156
+ "name": "machine",
1157
+ "type": {
1158
+ "text": "{ state(): unknown }"
1159
+ },
1160
+ "description": "The owning machine; used for the `state()` accessor."
1161
+ }
1162
+ ],
1163
+ "description": "Build a JssmHookProxy that wraps an arbitrary hook context object.\r\n\r\nThe context shape varies by hook kind (`from`/`to`/`action` may be absent\r\nfor transition-kind hooks), so this normalizes the shape via optional\r\nfields and exposes mutable `data` while keeping the rest read-only.\r\n\r\nThe `machine` parameter is used only for `state()`, so unit tests can\r\nsubstitute any object with a `state(): unknown` method."
1164
+ },
1165
+ {
1166
+ "kind": "function",
1167
+ "name": "compile_inline_body",
1168
+ "return": {
1169
+ "type": {
1170
+ "text": ""
1171
+ }
1172
+ },
1173
+ "parameters": [
1174
+ {
1175
+ "name": "body",
1176
+ "type": {
1177
+ "text": "string"
1178
+ },
1179
+ "description": "Trimmed textContent of the `<jssm-hook>` element."
1180
+ },
1181
+ {
1182
+ "name": "debug_id",
1183
+ "type": {
1184
+ "text": "string"
1185
+ },
1186
+ "description": "Identifier appended to the synthetic sourceURL."
1187
+ }
1188
+ ],
1189
+ "description": "Compile a textContent body into a callable user handler.\r\n\r\nUses dynamic function construction — the same primitive browsers use\r\ninternally for `<a onclick=\"...\">` and `setTimeout(stringBody, ms)`.\r\nStrict CSP without `'unsafe-eval'` blocks this and the call will throw;\r\nconsumers should fall back to the `handler=\"name\"` form there.\r\n\r\nPrepends a `//# sourceURL=` comment so devtools surface a meaningful name\r\nin stack traces instead of `anonymous`."
1190
+ },
1191
+ {
1192
+ "kind": "function",
1193
+ "name": "resolve_named_handler",
1194
+ "return": {
1195
+ "type": {
1196
+ "text": ""
1197
+ }
1198
+ },
1199
+ "parameters": [
1200
+ {
1201
+ "name": "name",
1202
+ "type": {
1203
+ "text": "string"
1204
+ },
1205
+ "description": "The handler name from the `handler=\"\"` attribute."
1206
+ },
1207
+ {
1208
+ "name": "registry",
1209
+ "optional": true,
1210
+ "type": {
1211
+ "text": "FslHookRegistry"
1212
+ },
1213
+ "description": "Optional in-WC registry to consult first."
1214
+ }
1215
+ ],
1216
+ "description": "Resolve a `handler=\"name\"` attribute to a callable by consulting first the\r\noptional in-WC registry, then `globalThis[name]`. Throws a clear error if\r\nneither resolves."
1217
+ },
1218
+ {
1219
+ "kind": "function",
1220
+ "name": "normalize_hook_kind",
1221
+ "return": {
1222
+ "type": {
1223
+ "text": ""
1224
+ }
1225
+ },
1226
+ "parameters": [
1227
+ {
1228
+ "name": "raw",
1229
+ "type": {
1230
+ "text": "string | null | undefined"
1231
+ },
1232
+ "description": "The raw attribute value, or null if not present."
1233
+ }
1234
+ ],
1235
+ "description": "Validate and normalize a `<jssm-hook kind=\"...\">` value, defaulting to\r\n`\"hook\"` when the attribute is absent. Throws on unknown kinds rather\r\nthan silently doing nothing later."
1236
+ },
1237
+ {
1238
+ "kind": "function",
1239
+ "name": "parse_hook_element",
1240
+ "return": {
1241
+ "type": {
1242
+ "text": ""
1243
+ }
1244
+ },
1245
+ "parameters": [
1246
+ {
1247
+ "name": "el",
1248
+ "type": {
1249
+ "text": "HTMLElement"
1250
+ },
1251
+ "description": "The `<jssm-hook>` element to parse."
1252
+ },
1253
+ {
1254
+ "name": "debug_id",
1255
+ "type": {
1256
+ "text": "string"
1257
+ },
1258
+ "description": "Identifier used in the inline body's sourceURL."
1259
+ },
1260
+ {
1261
+ "name": "registry",
1262
+ "optional": true,
1263
+ "type": {
1264
+ "text": "FslHookRegistry"
1265
+ },
1266
+ "description": "Optional in-WC registry of named handlers."
1267
+ }
1268
+ ],
1269
+ "description": "Parse a single `<jssm-hook>` element into a JssmHookInstallSpec.\r\n\r\nValidates the mutual-exclusion rule between `handler=\"name\"` and inline\r\nbody, defaults `kind` to `\"hook\"`, resolves named handlers against the\r\noptional registry then `globalThis`, and compiles inline bodies via\r\ndynamic function construction. Conditional-required attributes (e.g.\r\n`from`/`to` for `kind=\"hook\"`) are NOT validated here — `set_hook` will\r\nthrow with its own clear errors on missing pieces, which keeps the\r\nerror surface single-sourced."
1270
+ },
1271
+ {
1272
+ "kind": "function",
1273
+ "name": "wrap_user_handler",
1274
+ "return": {
1275
+ "type": {
1276
+ "text": ""
1277
+ }
1278
+ },
1279
+ "parameters": [
1280
+ {
1281
+ "name": "spec",
1282
+ "type": {
1283
+ "text": "FslHookInstallSpec"
1284
+ },
1285
+ "description": "The parsed install spec carrying the user handler."
1286
+ },
1287
+ {
1288
+ "name": "machine",
1289
+ "type": {
1290
+ "text": "{ state(): unknown }"
1291
+ },
1292
+ "description": "The owning machine; used by the proxy's `state()`."
1293
+ }
1294
+ ],
1295
+ "description": "Wrap a JssmHookUserHandler so that jssm's native hook contract is\r\nsatisfied: the user gets a friendly proxy, the proxy's mutated `data`\r\nbecomes the `HookComplexResult.data`, and an explicit `false` return\r\ncancels the transition.\r\n\r\nAny non-`false` return — including `undefined`, `true`, or an arbitrary\r\nobject — allows the transition. This matches the contract spelled out\r\nin the issue (#641): \"return false cancels; anything else allows\"."
1296
+ },
1297
+ {
1298
+ "kind": "function",
1299
+ "name": "build_hook_descriptor",
1300
+ "return": {
1301
+ "type": {
1302
+ "text": ""
1303
+ }
1304
+ },
1305
+ "parameters": [
1306
+ {
1307
+ "name": "spec",
1308
+ "type": {
1309
+ "text": "FslHookInstallSpec"
1310
+ },
1311
+ "description": "The parsed install spec."
1312
+ },
1313
+ {
1314
+ "name": "wrapped",
1315
+ "type": {
1316
+ "text": "(ctx: RawHookContext) => unknown"
1317
+ },
1318
+ "description": "The wrapped (friendly-proxy) handler from {@link wrap_user_handler}.\r\n * "
1319
+ }
1320
+ ],
1321
+ "description": "Build the typed descriptor object passed to `machine.set_hook` (and later\r\nto `machine.remove_hook` for cleanup) from a parsed JssmHookInstallSpec\r\nand the wrapped handler.\r\n\r\nFor kinds that need `from`/`to`/`action`, the descriptor includes those.\r\nMissing required keys produce `undefined` here; jssm's `set_hook` will\r\nsurface the error with its own clear message so we don't duplicate\r\nvalidation.\r\n\r\nReturn type is `unknown` because jssm's `HookDescription` is a\r\ndiscriminated union and our runtime-discriminator value can't be tracked\r\nby TypeScript across the build. The WC casts at the `set_hook` call site."
1322
+ }
1323
+ ],
1324
+ "exports": [
1325
+ {
1326
+ "kind": "js",
1327
+ "name": "make_hook_proxy",
1328
+ "declaration": {
1329
+ "name": "make_hook_proxy",
1330
+ "module": "src/ts/wc/fsl_hook_wc.ts"
1331
+ }
1332
+ },
1333
+ {
1334
+ "kind": "js",
1335
+ "name": "compile_inline_body",
1336
+ "declaration": {
1337
+ "name": "compile_inline_body",
1338
+ "module": "src/ts/wc/fsl_hook_wc.ts"
1339
+ }
1340
+ },
1341
+ {
1342
+ "kind": "js",
1343
+ "name": "resolve_named_handler",
1344
+ "declaration": {
1345
+ "name": "resolve_named_handler",
1346
+ "module": "src/ts/wc/fsl_hook_wc.ts"
1347
+ }
1348
+ },
1349
+ {
1350
+ "kind": "js",
1351
+ "name": "normalize_hook_kind",
1352
+ "declaration": {
1353
+ "name": "normalize_hook_kind",
1354
+ "module": "src/ts/wc/fsl_hook_wc.ts"
1355
+ }
1356
+ },
1357
+ {
1358
+ "kind": "js",
1359
+ "name": "parse_hook_element",
1360
+ "declaration": {
1361
+ "name": "parse_hook_element",
1362
+ "module": "src/ts/wc/fsl_hook_wc.ts"
1363
+ }
1364
+ },
1365
+ {
1366
+ "kind": "js",
1367
+ "name": "wrap_user_handler",
1368
+ "declaration": {
1369
+ "name": "wrap_user_handler",
1370
+ "module": "src/ts/wc/fsl_hook_wc.ts"
1371
+ }
1372
+ },
1373
+ {
1374
+ "kind": "js",
1375
+ "name": "build_hook_descriptor",
1376
+ "declaration": {
1377
+ "name": "build_hook_descriptor",
1378
+ "module": "src/ts/wc/fsl_hook_wc.ts"
1379
+ }
1380
+ }
1381
+ ]
1382
+ },
1383
+ {
1384
+ "kind": "javascript-module",
1385
+ "path": "src/ts/wc/fsl_info_panel_wc.ts",
1386
+ "declarations": [
1387
+ {
1388
+ "kind": "class",
1389
+ "description": "Read-only state-inspector web component for a parent `<fsl-instance>`.\r\n\r\nSlotted into the host's `info-panel` slot (or nested anywhere inside it), it\r\ndisplays the machine's current state, the most recent transition\r\n(`from → to via action`), the currently-legal exit actions, and the\r\nterminal / complete flags. Every field refreshes on each `transition`\r\nevent.\r\n\r\nDisplay-only: it never drives the machine. It binds by walking up to the\r\nhost via closest_wc (which matches both the canonical `fsl-instance`\r\nand the deprecated `jssm-instance` host tags), so it works under either.",
1390
+ "name": "FslInfoPanel",
1391
+ "cssProperties": [
1392
+ {
1393
+ "description": "Vertical gap between rows.",
1394
+ "name": "--fsl-info-panel-gap",
1395
+ "default": "0.25rem"
1396
+ }
1397
+ ],
1398
+ "members": [
1399
+ {
1400
+ "kind": "field",
1401
+ "name": "_host",
1402
+ "type": {
1403
+ "text": "JssmInstanceHost | null"
1404
+ },
1405
+ "privacy": "private",
1406
+ "default": "null",
1407
+ "description": "Parent host reference, set in `connectedCallback` when one is found.\r\nCleared on disconnect so a stale deferred subscription cannot fire."
1408
+ },
1409
+ {
1410
+ "kind": "field",
1411
+ "name": "_sub",
1412
+ "type": {
1413
+ "text": "(() => void) | null"
1414
+ },
1415
+ "privacy": "private",
1416
+ "default": "null",
1417
+ "description": "Unsubscribe callback from the host machine's `transition` subscription."
1418
+ },
1419
+ {
1420
+ "kind": "field",
1421
+ "name": "_current",
1422
+ "type": {
1423
+ "text": "string | null"
1424
+ },
1425
+ "privacy": "private",
1426
+ "default": "null",
1427
+ "description": "Current state name; `null` until the panel has bound to a host machine."
1428
+ },
1429
+ {
1430
+ "kind": "field",
1431
+ "name": "_actions",
1432
+ "type": {
1433
+ "text": "string"
1434
+ },
1435
+ "privacy": "private",
1436
+ "default": "''",
1437
+ "description": "Space-separated legal exit actions for the current state."
1438
+ },
1439
+ {
1440
+ "kind": "field",
1441
+ "name": "_terminal",
1442
+ "type": {
1443
+ "text": "boolean"
1444
+ },
1445
+ "privacy": "private",
1446
+ "default": "false",
1447
+ "description": "Whether the current state has no exits."
1448
+ },
1449
+ {
1450
+ "kind": "field",
1451
+ "name": "_complete",
1452
+ "type": {
1453
+ "text": "boolean"
1454
+ },
1455
+ "privacy": "private",
1456
+ "default": "false",
1457
+ "description": "Whether the current state is a `complete` state."
1458
+ },
1459
+ {
1460
+ "kind": "field",
1461
+ "name": "_last",
1462
+ "type": {
1463
+ "text": "LastTransition | null"
1464
+ },
1465
+ "privacy": "private",
1466
+ "default": "null",
1467
+ "description": "Most recent transition, or `null` before the first one."
1468
+ },
1469
+ {
1470
+ "kind": "method",
1471
+ "name": "_refresh",
1472
+ "privacy": "private",
1473
+ "return": {
1474
+ "type": {
1475
+ "text": "void"
1476
+ }
1477
+ },
1478
+ "parameters": [
1479
+ {
1480
+ "name": "host",
1481
+ "type": {
1482
+ "text": "JssmInstanceHost"
1483
+ },
1484
+ "description": "The bound parent host whose machine to snapshot."
1485
+ }
1486
+ ],
1487
+ "description": "Read the current machine snapshot into the reactive fields, triggering a\r\nre-render. Called once on bind and again on every transition. The bound\r\nhost is passed in by the caller (which already holds a non-null reference),\r\nso no re-null-check is needed here."
1488
+ }
1489
+ ],
1490
+ "superclass": {
1491
+ "name": "LitElement",
1492
+ "package": "lit"
1493
+ },
1494
+ "tagName": "fsl-info-panel",
1495
+ "customElement": true
1496
+ }
1497
+ ],
1498
+ "exports": [
1499
+ {
1500
+ "kind": "js",
1501
+ "name": "FslInfoPanel",
1502
+ "declaration": {
1503
+ "name": "FslInfoPanel",
1504
+ "module": "src/ts/wc/fsl_info_panel_wc.ts"
1505
+ }
1506
+ }
1507
+ ]
1508
+ },
1509
+ {
1510
+ "kind": "javascript-module",
1511
+ "path": "src/ts/wc/fsl_instance_wc.ts",
1512
+ "declarations": [
1513
+ {
1514
+ "kind": "variable",
1515
+ "name": "JSSM_ON_EVENT_NAMES",
1516
+ "default": "new Set<string>([ 'transition', 'rejection', 'action', 'entry', 'exit', 'terminal', 'complete', 'error', 'data-change', 'override', 'timeout', 'hook-registration', 'hook-removal' ])",
1517
+ "description": "Allow-list of event names accepted by `<jssm-on event=\"...\">`. Must stay\r\nin sync with the `JssmEventName` union in `jssm_types.ts` (the library's\r\n`machine.on(...)` event API, added in #638). Validating here gives the\r\ndeclarative wiring a clear \"unknown event name\" error at the WC layer\r\ninstead of relying on a downstream library throw whose message would\r\nmention `machine.on(...)` rather than the offending tag."
1518
+ },
1519
+ {
1520
+ "kind": "function",
1521
+ "name": "parse_jssm_on_element",
1522
+ "return": {
1523
+ "type": {
1524
+ "text": ""
1525
+ }
1526
+ },
1527
+ "parameters": [
1528
+ {
1529
+ "name": "el",
1530
+ "type": {
1531
+ "text": "HTMLElement"
1532
+ },
1533
+ "description": "The `<jssm-on>` element to parse."
1534
+ }
1535
+ ],
1536
+ "description": "Parse a `<jssm-on>` element into a validated ParsedJssmOn\r\nrecord. Centralized so the declarative-tag logic is testable without\r\nspinning up the full `<jssm-instance>` lifecycle.\r\n\r\nValidation rules (per #643):\r\n - `event` is required and must be in JSSM_ON_EVENT_NAMES.\r\n - Either a `handler=\"name\"` attribute or non-empty `textContent`\r\n must be supplied, but not both.\r\n - `state` is only meaningful for `event=\"entry\"` / `event=\"exit\"`;\r\n it's silently ignored on other events.\r\n - `from` / `to` are only meaningful for `event=\"transition\"`; they\r\n are silently ignored on other events. Both → AND (a specific\r\n edge). Neither → unfiltered.\r\n\r\n```typescript\r\nconst el = document.createElement('jssm-on');\r\nel.setAttribute('event', 'entry');\r\nel.setAttribute('state', 'paid');\r\nel.setAttribute('handler', 'onPaid');\r\nparse_jssm_on_element(el);\r\n// => { event: 'entry', handler_name: 'onPaid', inline_body: undefined,\r\n// once: false, name: undefined, filter: { state: 'paid' } }\r\n```"
1537
+ },
1538
+ {
1539
+ "kind": "variable",
1540
+ "name": "jssm_handler_registry",
1541
+ "type": {
1542
+ "text": "Map<string, (...args: unknown[]) => unknown>"
1543
+ },
1544
+ "default": "new Map()",
1545
+ "description": "Optional global registry that `<jssm-on>` (and, later, `<jssm-hook>`)\r\nconsult first when resolving a `handler=\"name\"` attribute. Consumers\r\nregister named handlers here in a strict-CSP environment where a stray\r\n`globalThis[name]` isn't acceptable. Falls through to `globalThis[name]`\r\nif the registry has no entry.\r\n\r\nIntentionally a `Map<string, Function>` rather than a class with methods,\r\nso consumers can use any of `.get`, `.set`, `.delete`, `.clear` directly\r\nwithout a thin wrapper API."
1546
+ },
1547
+ {
1548
+ "kind": "function",
1549
+ "name": "resolve_named_handler",
1550
+ "return": {
1551
+ "type": {
1552
+ "text": ""
1553
+ }
1554
+ },
1555
+ "parameters": [
1556
+ {
1557
+ "name": "name",
1558
+ "type": {
1559
+ "text": "string"
1560
+ },
1561
+ "description": "The handler name as supplied by `handler=\"...\"`."
1562
+ }
1563
+ ],
1564
+ "description": "Resolve a named handler from the registry, then from `globalThis`.\r\nThrows if neither lookup finds a function — earlier failure here is\r\nbetter than a delayed \"is not a function\" at first event delivery."
1565
+ },
1566
+ {
1567
+ "kind": "function",
1568
+ "name": "compile_inline_body",
1569
+ "return": {
1570
+ "type": {
1571
+ "text": ""
1572
+ }
1573
+ },
1574
+ "parameters": [
1575
+ {
1576
+ "name": "body",
1577
+ "type": {
1578
+ "text": "string"
1579
+ },
1580
+ "description": "The inline JS body (function body, not full function)."
1581
+ },
1582
+ {
1583
+ "name": "source_id",
1584
+ "type": {
1585
+ "text": "string"
1586
+ },
1587
+ "description": "A short identifier for the sourceURL pragma."
1588
+ }
1589
+ ],
1590
+ "description": "Compile an inline-body string into a handler function whose single\r\nparameter is `e` (the event detail object). Uses the same dynamic\r\n`Function(...)` constructor that browsers use internally for inline\r\nevent-handler attributes such as `<a onclick=\"...\">`; the input here\r\nis consumer-authored markup, never network data, so the surface is\r\nexactly that of an inline event-handler attribute and the same CSP\r\ncaveats apply (strict CSP without `'unsafe-eval'` blocks it). A\r\n`//# sourceURL=jssm-on:N` pragma is appended so devtools stack traces\r\npoint at a meaningful name."
1591
+ },
1592
+ {
1593
+ "kind": "function",
1594
+ "name": "resolve_fsl_source",
1595
+ "return": {
1596
+ "type": {
1597
+ "text": ""
1598
+ }
1599
+ },
1600
+ "parameters": [
1601
+ {
1602
+ "name": "host",
1603
+ "type": {
1604
+ "text": "HTMLElement"
1605
+ },
1606
+ "description": "The `<jssm-instance>` element being resolved."
1607
+ },
1608
+ {
1609
+ "name": "fsl_attr",
1610
+ "type": {
1611
+ "text": "string"
1612
+ },
1613
+ "description": "The current value of the host's `fsl` attribute (or property), or empty string."
1614
+ }
1615
+ ],
1616
+ "description": "Resolve a `<jssm-instance>`'s FSL source from the three legal channels:\r\nthe `fsl=\"\"` attribute, a child `<script type=\"text/fsl\">`, and the\r\nelement's own text content (after stripping the script and any\r\n`<jssm-*>` companion tags). Exactly one channel may be used; using\r\nnone or more than one is an error.\r\n\r\nPulled out as a pure function so it's testable without spinning up a\r\nLit element.\r\n\r\n```typescript\r\nconst div = document.createElement('div');\r\ndiv.setAttribute('fsl', 'Off -> On;');\r\nresolve_fsl_source(div as HTMLElement, 'Off -> On;');\r\n// => { fsl: 'Off -> On;', provided_count: 1, error: undefined }\r\n```"
1617
+ },
1618
+ {
1619
+ "kind": "function",
1620
+ "name": "auto_mode",
1621
+ "return": {
1622
+ "type": {
1623
+ "text": "'lr' | 'tb'"
1624
+ }
1625
+ },
1626
+ "parameters": [
1627
+ {
1628
+ "name": "width",
1629
+ "type": {
1630
+ "text": "number"
1631
+ }
1632
+ },
1633
+ {
1634
+ "name": "height",
1635
+ "type": {
1636
+ "text": "number"
1637
+ }
1638
+ }
1639
+ ],
1640
+ "description": "Resolve `layout=\"auto\"` to a concrete split direction from the viewport\r\nshape: side-by-side (`'lr'`) when at least as wide as tall, else stacked\r\n(`'tb'`). Pure, so it's testable without a laid-out DOM."
1641
+ },
1642
+ {
1643
+ "kind": "function",
1644
+ "name": "split_ratio",
1645
+ "return": {
1646
+ "type": {
1647
+ "text": "number"
1648
+ }
1649
+ },
1650
+ "parameters": [
1651
+ {
1652
+ "name": "coord",
1653
+ "type": {
1654
+ "text": "number"
1655
+ }
1656
+ },
1657
+ {
1658
+ "name": "start",
1659
+ "type": {
1660
+ "text": "number"
1661
+ }
1662
+ },
1663
+ {
1664
+ "name": "size",
1665
+ "type": {
1666
+ "text": "number"
1667
+ }
1668
+ }
1669
+ ],
1670
+ "description": "Clamp a gutter-drag coordinate to a split ratio (percent of the first pane).\r\nPure so it's testable without a laid-out DOM: returns a neutral `50` when the\r\ncontainer has no measured size (e.g. jsdom, where `getBoundingClientRect`\r\nyields zeros), and otherwise clamps to `[15, 85]` so neither pane collapses."
1671
+ },
1672
+ {
1673
+ "kind": "class",
1674
+ "description": "Web component that owns a single `Machine<unknown>` constructed from an\r\nFSL source supplied via one of three mutually exclusive channels:\r\n\r\n 1. The `fsl=\"\"` attribute,\r\n 2. A child `<script type=\"text/fsl\">`,\r\n 3. The element's own text content (companion `<jssm-*>` children and\r\n any `<script type=\"text/fsl\">` are excluded from this channel).\r\n\r\nSupplying zero or more than one channel is a thrown error.\r\n\r\nOn every transition the component reflects machine state to its own\r\nattributes (`current-state`, `legal-actions`, `terminal`, `complete`)\r\nand sets a `--current-state` CSS custom property so consumer CSS can\r\nstyle by state without subclassing.",
1675
+ "name": "FslInstance",
1676
+ "cssProperties": [
1677
+ {
1678
+ "description": "The machine's current state name as a CSS string token.",
1679
+ "name": "--current-state"
1680
+ }
1681
+ ],
1682
+ "slots": [
1683
+ {
1684
+ "description": "Heading area for the instance.",
1685
+ "name": "title"
1686
+ },
1687
+ {
1688
+ "description": "Visualization slot; fallback is a placeholder string.",
1689
+ "name": "viz"
1690
+ },
1691
+ {
1692
+ "description": "Editor surface slot (`<fsl-editor>`, #659).",
1693
+ "name": "editor"
1694
+ },
1695
+ {
1696
+ "description": "Slot for action buttons / UI.",
1697
+ "name": "actions"
1698
+ },
1699
+ {
1700
+ "description": "Slot for toolbar UI (`<fsl-toolbar>`, #660).",
1701
+ "name": "toolbar"
1702
+ },
1703
+ {
1704
+ "description": "Slot for an info / status panel (`<fsl-info-panel>`, #661).",
1705
+ "name": "info-panel"
1706
+ },
1707
+ {
1708
+ "description": "Slot for the visited-state timeline (`<fsl-history>`, #662).",
1709
+ "name": "history"
1710
+ },
1711
+ {
1712
+ "description": "Slot for the typed-data tree view (`<fsl-data-inspector>`, #663).",
1713
+ "name": "data-inspector"
1714
+ },
1715
+ {
1716
+ "description": "Slot for the hook-firing log (`<fsl-hook-log>`, #664).",
1717
+ "name": "hook-log"
1718
+ },
1719
+ {
1720
+ "description": "Slot for the resolved-properties panel (`<fsl-effective-properties>`, #665).",
1721
+ "name": "effective-properties"
1722
+ },
1723
+ {
1724
+ "description": "Slot for the random-walk simulation (`<fsl-simulation>`, #668).",
1725
+ "name": "simulation"
1726
+ },
1727
+ {
1728
+ "description": "Slot for the export menu (`<fsl-export>`, #667).",
1729
+ "name": "export"
1730
+ },
1731
+ {
1732
+ "description": "Footer slot.",
1733
+ "name": "footer"
1734
+ }
1735
+ ],
1736
+ "members": [
1737
+ {
1738
+ "kind": "field",
1739
+ "name": "fsl",
1740
+ "privacy": "public",
1741
+ "type": {
1742
+ "text": "string"
1743
+ },
1744
+ "default": "''",
1745
+ "description": "FSL source attribute. When non-empty, this is the sole channel\r\nsupplying the machine's source. Setting both this and a child\r\n`<script type=\"text/fsl\">` (or non-empty text content) is an error.",
1746
+ "attribute": "fsl"
1747
+ },
1748
+ {
1749
+ "kind": "field",
1750
+ "name": "layout",
1751
+ "privacy": "public",
1752
+ "type": {
1753
+ "text": "FslLayout"
1754
+ },
1755
+ "default": "''",
1756
+ "description": "Panel arrangement of the viz + editor panes (see FslLayout). `''`\r\n(default) renders the stacked sections; `'lr'`/`'rl'` lay them side-by-side\r\nwith a draggable vertical gutter (editor left / right); `'tb'`/`'bt'` stack\r\nthem with a horizontal gutter; `'editor'`/`'viewer'` show a single pane;\r\n`'tabs'` shows one pane at a time behind a tab strip; `'auto'` follows the\r\nviewport aspect. Other panels (toolbar, info-panel, …) render below.",
1757
+ "attribute": "layout",
1758
+ "reflects": true
1759
+ },
1760
+ {
1761
+ "kind": "field",
1762
+ "name": "theme",
1763
+ "privacy": "public",
1764
+ "type": {
1765
+ "text": "ThemeMode"
1766
+ },
1767
+ "default": "'light'",
1768
+ "description": "Theme **mode**, reflected to the `theme` attribute: `system` (follow the OS\r\n`prefers-color-scheme`), `light`, or `dark`. Combined with themeName\r\nit selects a palette from themes, applied as inline `--fsl-color-*`\r\nby _applyTheme. `<fsl-toolbar>` sets this from its theme pulldown.",
1769
+ "attribute": "theme",
1770
+ "reflects": true
1771
+ },
1772
+ {
1773
+ "kind": "field",
1774
+ "name": "themeName",
1775
+ "privacy": "public",
1776
+ "type": {
1777
+ "text": "string"
1778
+ },
1779
+ "default": "'Default'",
1780
+ "description": "Selected theme name, reflected to the `theme-name` attribute. A key of\r\nthemes; an unknown name falls back to the built-in `Default`.",
1781
+ "attribute": "theme-name",
1782
+ "reflects": true
1783
+ },
1784
+ {
1785
+ "kind": "field",
1786
+ "name": "themes",
1787
+ "privacy": "public",
1788
+ "type": {
1789
+ "text": "ThemeRegistry"
1790
+ },
1791
+ "default": "BUILTIN_THEMES",
1792
+ "description": "The theme registry — named light/dark palette pairs. Defaults to the\r\nbuilt-in `Default` + `Solarized`; a consumer can replace or extend it, and\r\nevery entry appears in the toolbar's theme list.",
1793
+ "attribute": "themes"
1794
+ },
1795
+ {
1796
+ "kind": "field",
1797
+ "name": "data",
1798
+ "privacy": "public",
1799
+ "type": {
1800
+ "text": "unknown"
1801
+ },
1802
+ "default": "undefined",
1803
+ "description": "Initial extended-state data seeded into the machine at build time. When set\r\n(to anything other than `undefined`), the machine is built via `from(fsl,\r\n{ data })` so `<fsl-data-inspector>` has something to show before any\r\ntransition; the default keeps the lighter `sm`-tag build path.",
1804
+ "attribute": "data"
1805
+ },
1806
+ {
1807
+ "kind": "field",
1808
+ "name": "_split",
1809
+ "type": {
1810
+ "text": "number"
1811
+ },
1812
+ "privacy": "private",
1813
+ "default": "50",
1814
+ "description": "Split ratio (percent of the first pane), updated by the gutter drag."
1815
+ },
1816
+ {
1817
+ "kind": "field",
1818
+ "name": "_tab",
1819
+ "type": {
1820
+ "text": "FslTab"
1821
+ },
1822
+ "privacy": "private",
1823
+ "default": "'viz'",
1824
+ "description": "Which pane the tabbed layout shows."
1825
+ },
1826
+ {
1827
+ "kind": "field",
1828
+ "name": "_autoMode",
1829
+ "type": {
1830
+ "text": "'lr' | 'tb'"
1831
+ },
1832
+ "privacy": "private",
1833
+ "default": "'lr'",
1834
+ "description": "Concrete direction that `layout=\"auto\"` currently resolves to."
1835
+ },
1836
+ {
1837
+ "kind": "field",
1838
+ "name": "_autoListener",
1839
+ "type": {
1840
+ "text": "(() => void) | null"
1841
+ },
1842
+ "privacy": "private",
1843
+ "default": "null",
1844
+ "description": "Window-resize listener installed while `layout=\"auto\"`, or null."
1845
+ },
1846
+ {
1847
+ "kind": "field",
1848
+ "name": "_hiddenPanels",
1849
+ "privacy": "private",
1850
+ "default": "new Set<string>()",
1851
+ "description": "Slot names of panels currently hidden (driven by `<fsl-toolbar>`)."
1852
+ },
1853
+ {
1854
+ "kind": "field",
1855
+ "name": "_machine",
1856
+ "type": {
1857
+ "text": "Machine<unknown> | undefined"
1858
+ },
1859
+ "privacy": "private",
1860
+ "default": "undefined",
1861
+ "description": "The underlying machine instance, constructed at `connectedCallback`.\r\nExposed raw (not proxied) per the #639/#648 design decision so that\r\nconsumers can use the full Machine API directly.\r\n\r\nMarked optional because Lit will instantiate the element before\r\n`connectedCallback` runs; the instance is guaranteed present after\r\nconnection."
1862
+ },
1863
+ {
1864
+ "kind": "field",
1865
+ "name": "_unsubs",
1866
+ "type": {
1867
+ "text": "FslBindUnsub[]"
1868
+ },
1869
+ "privacy": "private",
1870
+ "default": "[]",
1871
+ "description": "Live unsubscribe callbacks for #645 `<fsl-bind>` / `data-jssm-bind`\r\nprojections. Every entry must be invoked exactly once during\r\ndisconnectedCallback."
1872
+ },
1873
+ {
1874
+ "kind": "field",
1875
+ "name": "_on_unsubscribes",
1876
+ "type": {
1877
+ "text": "Array<() => void>"
1878
+ },
1879
+ "privacy": "private",
1880
+ "default": "[]",
1881
+ "description": "Unsubscribe callbacks for every `machine.on(...)` / `machine.once(...)`\r\nsubscription installed from a `<jssm-on>` child during\r\n`connectedCallback`. Walked in `disconnectedCallback`."
1882
+ },
1883
+ {
1884
+ "kind": "field",
1885
+ "name": "REEMITTED_EVENTS",
1886
+ "type": {
1887
+ "text": "readonly string[]"
1888
+ },
1889
+ "privacy": "private",
1890
+ "static": true,
1891
+ "readonly": true,
1892
+ "default": "[ 'transition', 'entry', 'exit', 'terminal', 'complete', 'action', 'rejection', 'override', 'data-change', 'timeout', 'error', ]",
1893
+ "description": "Library event names this WC re-emits as DOM `CustomEvent`s, fulfilling\r\nmechanism 4 of #639. Each library `machine.on(name, ...)` is bridged to\r\na `fsl-<name>` DOM event (`composed`, `bubbling`) so slotted content and\r\noutside consumers can observe machine activity declaratively.\r\n\r\n`fsl-` is the canonical prefix (matching the canonical `<fsl-*>` tag\r\nnames); the older `jssm-*` event prose in #639 predates that naming flip.\r\nEvents are NOT double-emitted under both prefixes — a symmetric listener\r\nwould otherwise run twice per machine event."
1894
+ },
1895
+ {
1896
+ "kind": "field",
1897
+ "name": "_reemit_unsubscribes",
1898
+ "type": {
1899
+ "text": "Array<() => void>"
1900
+ },
1901
+ "privacy": "private",
1902
+ "default": "[]",
1903
+ "description": "Unsubscribe callbacks for the host-level mechanism-4 re-emission\r\nsubscriptions installed in _install_event_reemission. Distinct\r\nfrom _on_unsubscribes (which belongs to `<jssm-on>` children)."
1904
+ },
1905
+ {
1906
+ "kind": "field",
1907
+ "name": "_pending_dom_events",
1908
+ "type": {
1909
+ "text": "Array<{ name: string; detail: unknown }>"
1910
+ },
1911
+ "privacy": "private",
1912
+ "default": "[]",
1913
+ "description": "Library events captured during the current transition, awaiting DOM\r\nre-dispatch once Lit commits the next render. Dispatching here (rather\r\nthan synchronously from the machine subscription) guarantees the #639\r\nordering: mechanism 1/3 reflection and mechanism 2 slot re-pick are all\r\nin place before a mechanism-4 listener runs."
1914
+ },
1915
+ {
1916
+ "kind": "field",
1917
+ "name": "registry",
1918
+ "type": {
1919
+ "text": "FslHookRegistry"
1920
+ },
1921
+ "readonly": true,
1922
+ "default": "new Map()",
1923
+ "description": "Per-instance registry of named hook handlers consulted before\r\n`globalThis` when resolving `<fsl-hook handler=\"name\">` /\r\n`<jssm-hook handler=\"name\">`."
1924
+ },
1925
+ {
1926
+ "kind": "field",
1927
+ "name": "_installed_hooks",
1928
+ "type": {
1929
+ "text": "unknown[]"
1930
+ },
1931
+ "privacy": "private",
1932
+ "default": "[]",
1933
+ "description": "Descriptors for hooks this WC installed at connect time."
1934
+ },
1935
+ {
1936
+ "kind": "field",
1937
+ "name": "_hook_debug_counter",
1938
+ "type": {
1939
+ "text": "number"
1940
+ },
1941
+ "privacy": "private",
1942
+ "default": "0",
1943
+ "description": "Counter for compiled inline-body hook debug ids."
1944
+ },
1945
+ {
1946
+ "kind": "field",
1947
+ "name": "_action_listeners",
1948
+ "type": {
1949
+ "text": "Array<{\r\n target : EventTarget;\r\n event : string;\r\n handler : EventListener;\r\n }>"
1950
+ },
1951
+ "privacy": "private",
1952
+ "default": "[]",
1953
+ "description": "DOM listeners installed by `<jssm-action>` / `data-jssm-action` discovery."
1954
+ },
1955
+ {
1956
+ "kind": "field",
1957
+ "name": "machine",
1958
+ "type": {
1959
+ "text": "Machine<unknown>"
1960
+ },
1961
+ "description": "Raw machine accessor. Returns the owned Machine instance.",
1962
+ "readonly": true
1963
+ },
1964
+ {
1965
+ "kind": "method",
1966
+ "name": "do",
1967
+ "return": {
1968
+ "type": {
1969
+ "text": ""
1970
+ }
1971
+ },
1972
+ "parameters": [
1973
+ {
1974
+ "name": "action",
1975
+ "type": {
1976
+ "text": "string"
1977
+ },
1978
+ "description": "The action name to dispatch."
1979
+ },
1980
+ {
1981
+ "name": "data",
1982
+ "optional": true,
1983
+ "type": {
1984
+ "text": "unknown"
1985
+ },
1986
+ "description": "Optional data payload to pass to the action."
1987
+ }
1988
+ ],
1989
+ "description": "Convenience wrapper for `machine.action(action, data)`.\r\nAfter the action, reflects updated state to host attributes and the\r\n`--current-state` CSS custom property, and requests a Lit update so\r\nthe state-specific `<slot name=\"state-...\">` can re-pick."
1990
+ },
1991
+ {
1992
+ "kind": "method",
1993
+ "name": "transition",
1994
+ "return": {
1995
+ "type": {
1996
+ "text": ""
1997
+ }
1998
+ },
1999
+ "parameters": [
2000
+ {
2001
+ "name": "state",
2002
+ "type": {
2003
+ "text": "string"
2004
+ },
2005
+ "description": "The destination state."
2006
+ },
2007
+ {
2008
+ "name": "data",
2009
+ "optional": true,
2010
+ "type": {
2011
+ "text": "unknown"
2012
+ },
2013
+ "description": "Optional data payload."
2014
+ }
2015
+ ],
2016
+ "description": "Convenience wrapper for `machine.transition(state, data)` — moves directly\r\nto a state along a legal (non-forced) edge. Reflects the new state and\r\nrequests an update, exactly as FslInstance.do does for actions."
2017
+ },
2018
+ {
2019
+ "kind": "method",
2020
+ "name": "force_transition",
2021
+ "return": {
2022
+ "type": {
2023
+ "text": ""
2024
+ }
2025
+ },
2026
+ "parameters": [
2027
+ {
2028
+ "name": "state",
2029
+ "type": {
2030
+ "text": "string"
2031
+ },
2032
+ "description": "The destination state."
2033
+ },
2034
+ {
2035
+ "name": "data",
2036
+ "optional": true,
2037
+ "type": {
2038
+ "text": "unknown"
2039
+ },
2040
+ "description": "Optional data payload."
2041
+ }
2042
+ ],
2043
+ "description": "Convenience wrapper for `machine.force_transition(state, data)` — moves to a\r\nstate along any edge, including forced-only ones. Reflects the new state and\r\nrequests an update."
2044
+ },
2045
+ {
2046
+ "kind": "method",
2047
+ "name": "state",
2048
+ "return": {
2049
+ "type": {
2050
+ "text": "string"
2051
+ }
2052
+ },
2053
+ "description": "Convenience wrapper for `machine.state()`. Returns the current\r\nstate's name."
2054
+ },
2055
+ {
2056
+ "kind": "field",
2057
+ "name": "_mql",
2058
+ "type": {
2059
+ "text": "MediaQueryList | null"
2060
+ },
2061
+ "privacy": "private",
2062
+ "default": "null",
2063
+ "description": "Tracks the OS color scheme; null when `matchMedia` is unavailable."
2064
+ },
2065
+ {
2066
+ "kind": "field",
2067
+ "name": "_on_os_theme_change",
2068
+ "privacy": "private",
2069
+ "description": "Re-apply on an OS color-scheme change — only relevant while in `system` mode."
2070
+ },
2071
+ {
2072
+ "kind": "method",
2073
+ "name": "_prefers_dark",
2074
+ "privacy": "private",
2075
+ "return": {
2076
+ "type": {
2077
+ "text": "boolean"
2078
+ }
2079
+ },
2080
+ "description": "Whether the OS currently prefers a dark color scheme."
2081
+ },
2082
+ {
2083
+ "kind": "method",
2084
+ "name": "_applyTheme",
2085
+ "privacy": "private",
2086
+ "return": {
2087
+ "type": {
2088
+ "text": "void"
2089
+ }
2090
+ },
2091
+ "description": "Resolve `theme` (mode) × `themeName` to a palette and apply it: write the\r\n`--fsl-color-*` tokens inline (overriding the CSS fallback and cascading to\r\nevery slotted widget), reflect the chosen variant to `resolved-theme`, and\r\ndrive each slotted editor's light/dark CodeMirror theme."
2092
+ },
2093
+ {
2094
+ "kind": "field",
2095
+ "name": "_onGutterDown",
2096
+ "privacy": "private",
2097
+ "description": "Gutter pointer-down: begin a drag. Move/up are attached to the document so\r\nthe drag survives the pointer leaving the thin gutter (no pointer-capture,\r\nwhich keeps the handlers testable in jsdom)."
2098
+ },
2099
+ {
2100
+ "kind": "field",
2101
+ "name": "_onGutterMove",
2102
+ "privacy": "private",
2103
+ "description": "Document pointer-move during a drag: recompute the split ratio."
2104
+ },
2105
+ {
2106
+ "kind": "method",
2107
+ "name": "_effectiveMode",
2108
+ "privacy": "private",
2109
+ "return": {
2110
+ "type": {
2111
+ "text": "FslLayout"
2112
+ }
2113
+ },
2114
+ "description": "Resolve the active layout to a concrete mode (`'auto'` → a direction)."
2115
+ },
2116
+ {
2117
+ "kind": "method",
2118
+ "name": "_renderTabbar",
2119
+ "privacy": "private",
2120
+ "return": {
2121
+ "type": {
2122
+ "text": "TemplateResult"
2123
+ }
2124
+ },
2125
+ "description": "Tab strip for the `tabs` layout."
2126
+ },
2127
+ {
2128
+ "kind": "method",
2129
+ "name": "_setTab",
2130
+ "privacy": "private",
2131
+ "return": {
2132
+ "type": {
2133
+ "text": "void"
2134
+ }
2135
+ },
2136
+ "parameters": [
2137
+ {
2138
+ "name": "tab",
2139
+ "type": {
2140
+ "text": "FslTab"
2141
+ }
2142
+ }
2143
+ ],
2144
+ "description": "Switch the visible pane in the `tabs` layout."
2145
+ },
2146
+ {
2147
+ "kind": "method",
2148
+ "name": "isPanelHidden",
2149
+ "return": {
2150
+ "type": {
2151
+ "text": ""
2152
+ }
2153
+ },
2154
+ "parameters": [
2155
+ {
2156
+ "name": "slot",
2157
+ "type": {
2158
+ "text": "string"
2159
+ },
2160
+ "description": "A panel slot name (e.g. `\"viz\"`, `\"editor\"`, `\"history\"`)."
2161
+ }
2162
+ ],
2163
+ "description": "Whether the panel slotted under `slot` is currently hidden."
2164
+ },
2165
+ {
2166
+ "kind": "method",
2167
+ "name": "setPanelHidden",
2168
+ "return": {
2169
+ "type": {
2170
+ "text": "void"
2171
+ }
2172
+ },
2173
+ "parameters": [
2174
+ {
2175
+ "name": "slot",
2176
+ "type": {
2177
+ "text": "string"
2178
+ },
2179
+ "description": "A panel slot name (e.g. `\"viz\"`, `\"editor\"`, `\"history\"`)."
2180
+ },
2181
+ {
2182
+ "name": "hidden",
2183
+ "type": {
2184
+ "text": "boolean"
2185
+ },
2186
+ "description": "`true` to hide, `false` to show."
2187
+ }
2188
+ ],
2189
+ "description": "Show or hide the panel slotted under `slot`. Hiding `viz` or `editor`\r\ncollapses that workbench pane (the other fills); hiding an aux panel\r\nremoves its section. `<fsl-toolbar>` drives this from its panel toggles."
2190
+ },
2191
+ {
2192
+ "kind": "method",
2193
+ "name": "togglePanel",
2194
+ "return": {
2195
+ "type": {
2196
+ "text": "void"
2197
+ }
2198
+ },
2199
+ "parameters": [
2200
+ {
2201
+ "name": "slot",
2202
+ "type": {
2203
+ "text": "string"
2204
+ },
2205
+ "description": "A panel slot name (e.g. `\"viz\"`, `\"editor\"`, `\"history\"`)."
2206
+ }
2207
+ ],
2208
+ "description": "Toggle the visibility of the panel slotted under `slot`."
2209
+ },
2210
+ {
2211
+ "kind": "method",
2212
+ "name": "_syncAutoListener",
2213
+ "privacy": "private",
2214
+ "return": {
2215
+ "type": {
2216
+ "text": "void"
2217
+ }
2218
+ },
2219
+ "description": "Install or remove the window-resize listener that resolves `layout=\"auto\"`\r\nto a concrete direction. Called from updated; uses the viewport\r\naspect so it needs no layout measurement (works in jsdom)."
2220
+ },
2221
+ {
2222
+ "kind": "field",
2223
+ "name": "_onGutterUp",
2224
+ "privacy": "private",
2225
+ "description": "Document pointer-up: end the drag and detach the document listeners."
2226
+ },
2227
+ {
2228
+ "kind": "field",
2229
+ "name": "_onGutterReset",
2230
+ "privacy": "private",
2231
+ "description": "Gutter double-click: reset the split to 50/50."
2232
+ },
2233
+ {
2234
+ "kind": "method",
2235
+ "name": "_install_jssm_on_children",
2236
+ "privacy": "private",
2237
+ "return": {
2238
+ "type": {
2239
+ "text": "void"
2240
+ }
2241
+ },
2242
+ "description": "Discover direct-child `<jssm-on>` elements and install their\r\nsubscriptions on the owned machine. Per #643:\r\n\r\n- Direct children only (`:scope > jssm-on`). Deeper nesting is the\r\n responsibility of a future MutationObserver-driven v2.\r\n- Each `<jssm-on>` is parsed by parse_jssm_on_element, which\r\n enforces the form / event-name / filter rules.\r\n- Handlers come from resolve_named_handler (form A) or\r\n compile_inline_body (form B), and the result is installed\r\n via `machine.on(...)` or `machine.once(...)` depending on the\r\n element's `once` attribute.\r\n- Every returned unsubscribe is tracked in _on_unsubscribes\r\n so disconnectedCallback can release them all.\r\n\r\nCalled once from `connectedCallback` after the machine has been\r\nconstructed. Any error thrown by parsing or resolution propagates\r\nout so it surfaces via jsdom's error event (matching the rest of\r\n`<jssm-instance>`'s \"fail loud at connect\" policy)."
2243
+ },
2244
+ {
2245
+ "kind": "method",
2246
+ "name": "_install_declarative_hooks",
2247
+ "privacy": "private",
2248
+ "return": {
2249
+ "type": {
2250
+ "text": "void"
2251
+ }
2252
+ },
2253
+ "description": "Discover every direct-child `<jssm-hook>` element and install each\r\nagainst the owned machine. Handlers are wrapped with the friendly-proxy\r\nadapter that lets user code write `m.data = ...` and return `false` to\r\ncancel — see make_hook_proxy and the issue (#641) doc-comment\r\nfor the full contract."
2254
+ },
2255
+ {
2256
+ "kind": "method",
2257
+ "name": "_hook_id_prefix",
2258
+ "privacy": "private",
2259
+ "return": {
2260
+ "type": {
2261
+ "text": "string"
2262
+ }
2263
+ },
2264
+ "description": "Prefix used in synthetic `//# sourceURL=jssm-hook:<prefix><n>` annotations\r\nfor inline-body hooks compiled by this element."
2265
+ },
2266
+ {
2267
+ "kind": "method",
2268
+ "name": "_install_event_reemission",
2269
+ "privacy": "private",
2270
+ "return": {
2271
+ "type": {
2272
+ "text": "void"
2273
+ }
2274
+ },
2275
+ "description": "Install the mechanism-4 (#639) re-emission subscriptions: one\r\n`machine.on(name, ...)` per entry in REEMITTED_EVENTS. Each\r\ncaptured library event is queued and re-dispatched as a `fsl-<name>` DOM\r\nevent after the next render commit (see updated).\r\n\r\nSubscribing is also what *enables* the gated observation events: the\r\nlibrary suppresses `transition` / `entry` / `exit` / etc. while no\r\nlisteners exist (#670), so this host subscription is the bridge that\r\nturns them on.\r\n\r\nThe subscription handler paints state reflection eagerly so that a host\r\ndriven directly via `host.machine.action(...)` (bypassing do)\r\nstill updates its `current-state` attribute and `--current-state`\r\nproperty."
2276
+ },
2277
+ {
2278
+ "kind": "method",
2279
+ "name": "_build_machine",
2280
+ "privacy": "private",
2281
+ "return": {
2282
+ "type": {
2283
+ "text": ""
2284
+ }
2285
+ },
2286
+ "parameters": [
2287
+ {
2288
+ "name": "fsl_source",
2289
+ "type": {
2290
+ "text": "string"
2291
+ },
2292
+ "description": "The FSL string to compile."
2293
+ }
2294
+ ],
2295
+ "description": "Build a machine from FSL source, seeding data when it is set."
2296
+ },
2297
+ {
2298
+ "kind": "method",
2299
+ "name": "_rebuild_machine",
2300
+ "privacy": "private",
2301
+ "return": {
2302
+ "type": {
2303
+ "text": "void"
2304
+ }
2305
+ }
2306
+ },
2307
+ {
2308
+ "kind": "method",
2309
+ "name": "_flush_pending_dom_events",
2310
+ "privacy": "private",
2311
+ "return": {
2312
+ "type": {
2313
+ "text": "void"
2314
+ }
2315
+ },
2316
+ "description": "Dispatch and clear the queue of pending DOM events. The queue is\r\nsnapshotted and reset *before* dispatching so that a listener which\r\nre-enters the machine (e.g. calls `host.machine.action(...)`\r\nsynchronously) enqueues into a fresh batch handled by the next update\r\ncycle, rather than mutating the array mid-iteration. This is the\r\ndocumented re-entrancy behavior: re-entrant transitions are deferred,\r\nnot dropped."
2317
+ },
2318
+ {
2319
+ "kind": "method",
2320
+ "name": "_unbind_machine_subscriptions",
2321
+ "privacy": "private",
2322
+ "return": {
2323
+ "type": {
2324
+ "text": "void"
2325
+ }
2326
+ },
2327
+ "description": "Release every machine-scoped subscription installed against the current\r\nmachine: #639 mechanism-4 re-emission, #641 `<fsl-hook>` registrations,\r\n#643 `<fsl-on>` subscriptions, and #645 `<fsl-bind>` projections. Shared by\r\ndisconnectedCallback (full teardown) and the live-rebuild path\r\n(_rebuild_machine, #1387), which re-installs against the new machine.\r\nDOM action listeners (`<fsl-action>`) are NOT touched here — they read\r\n`this.machine` live and survive a rebuild."
2328
+ },
2329
+ {
2330
+ "kind": "method",
2331
+ "name": "_discover_jssm_actions",
2332
+ "privacy": "private",
2333
+ "return": {
2334
+ "type": {
2335
+ "text": "void"
2336
+ }
2337
+ },
2338
+ "description": "Wire DOM events to machine actions, using the two declarative forms from\r\nissue #640. Both forms support optional `from-state` guards,\r\n`from-property` data extraction, and `prevent-default` /\r\n`stop-propagation` modifiers."
2339
+ },
2340
+ {
2341
+ "kind": "method",
2342
+ "name": "_install_action_listener",
2343
+ "privacy": "private",
2344
+ "return": {
2345
+ "type": {
2346
+ "text": "void"
2347
+ }
2348
+ },
2349
+ "parameters": [
2350
+ {
2351
+ "name": "config",
2352
+ "type": {
2353
+ "text": "{\r\n source : HTMLElement;\r\n event_name : string;\r\n action_name : string;\r\n from_state : string | undefined;\r\n from_property : string | undefined;\r\n prevent_default : boolean;\r\n stop_propagation : boolean;\r\n }"
2354
+ }
2355
+ }
2356
+ ],
2357
+ "description": "Attach one DOM listener that translates a DOM event into a\r\n`machine.action(...)` call, honoring the configured modifiers."
2358
+ },
2359
+ {
2360
+ "kind": "method",
2361
+ "name": "_paint_state_reflection",
2362
+ "privacy": "private",
2363
+ "return": {
2364
+ "type": {
2365
+ "text": "void"
2366
+ }
2367
+ },
2368
+ "description": "Reflect machine state onto host attributes and CSS custom properties.\r\nCalled after every transition and once during `connectedCallback`.\r\n\r\nMechanism 1 (#639): writes to host attributes.\r\nMechanism 3 (#639): writes to host inline-style custom properties."
2369
+ },
2370
+ {
2371
+ "kind": "method",
2372
+ "name": "_renderAuxPanels",
2373
+ "privacy": "private",
2374
+ "return": {
2375
+ "type": {
2376
+ "text": "TemplateResult"
2377
+ }
2378
+ },
2379
+ "parameters": [
2380
+ {
2381
+ "name": "docked",
2382
+ "type": {
2383
+ "text": "boolean"
2384
+ },
2385
+ "description": "True when actions + data-inspector are rendered as side\r\ndocks (split layouts); they are then omitted from this stack."
2386
+ }
2387
+ ],
2388
+ "description": "The stacked middle panels, shared by both layouts. The toolbar slot is\r\nrendered at the top of render. In split mode the `actions` and\r\n`data-inspector` panels are lifted out into easing side docks, so\r\n`docked` is true there and they are skipped here to avoid duplicating\r\ntheir slots. The state-section + footer stay in render so the\r\ndynamic state-slot name binds at the top level."
2389
+ }
2390
+ ],
2391
+ "events": [
2392
+ {
2393
+ "name": "fsl-machine-rebuilt",
2394
+ "type": {
2395
+ "text": "CustomEvent"
2396
+ }
2397
+ },
2398
+ {
2399
+ "type": {
2400
+ "text": "CustomEvent"
2401
+ }
2402
+ }
2403
+ ],
2404
+ "attributes": [
2405
+ {
2406
+ "name": "fsl",
2407
+ "type": {
2408
+ "text": "string"
2409
+ },
2410
+ "default": "''",
2411
+ "description": "FSL source attribute. When non-empty, this is the sole channel\r\nsupplying the machine's source. Setting both this and a child\r\n`<script type=\"text/fsl\">` (or non-empty text content) is an error.",
2412
+ "fieldName": "fsl"
2413
+ },
2414
+ {
2415
+ "name": "layout",
2416
+ "type": {
2417
+ "text": "FslLayout"
2418
+ },
2419
+ "default": "''",
2420
+ "description": "Panel arrangement of the viz + editor panes (see FslLayout). `''`\r\n(default) renders the stacked sections; `'lr'`/`'rl'` lay them side-by-side\r\nwith a draggable vertical gutter (editor left / right); `'tb'`/`'bt'` stack\r\nthem with a horizontal gutter; `'editor'`/`'viewer'` show a single pane;\r\n`'tabs'` shows one pane at a time behind a tab strip; `'auto'` follows the\r\nviewport aspect. Other panels (toolbar, info-panel, …) render below.",
2421
+ "fieldName": "layout"
2422
+ },
2423
+ {
2424
+ "name": "theme",
2425
+ "type": {
2426
+ "text": "ThemeMode"
2427
+ },
2428
+ "default": "'light'",
2429
+ "description": "Theme **mode**, reflected to the `theme` attribute: `system` (follow the OS\r\n`prefers-color-scheme`), `light`, or `dark`. Combined with themeName\r\nit selects a palette from themes, applied as inline `--fsl-color-*`\r\nby _applyTheme. `<fsl-toolbar>` sets this from its theme pulldown.",
2430
+ "fieldName": "theme"
2431
+ },
2432
+ {
2433
+ "name": "theme-name",
2434
+ "type": {
2435
+ "text": "string"
2436
+ },
2437
+ "default": "'Default'",
2438
+ "description": "Selected theme name, reflected to the `theme-name` attribute. A key of\r\nthemes; an unknown name falls back to the built-in `Default`.",
2439
+ "fieldName": "themeName"
2440
+ },
2441
+ {
2442
+ "name": "themes",
2443
+ "type": {
2444
+ "text": "ThemeRegistry"
2445
+ },
2446
+ "default": "BUILTIN_THEMES",
2447
+ "description": "The theme registry — named light/dark palette pairs. Defaults to the\r\nbuilt-in `Default` + `Solarized`; a consumer can replace or extend it, and\r\nevery entry appears in the toolbar's theme list.",
2448
+ "fieldName": "themes"
2449
+ },
2450
+ {
2451
+ "name": "data",
2452
+ "type": {
2453
+ "text": "unknown"
2454
+ },
2455
+ "default": "undefined",
2456
+ "description": "Initial extended-state data seeded into the machine at build time. When set\r\n(to anything other than `undefined`), the machine is built via `from(fsl,\r\n{ data })` so `<fsl-data-inspector>` has something to show before any\r\ntransition; the default keeps the lighter `sm`-tag build path.",
2457
+ "fieldName": "data"
2458
+ }
2459
+ ],
2460
+ "superclass": {
2461
+ "name": "LitElement",
2462
+ "package": "lit"
2463
+ },
2464
+ "tagName": "fsl-instance",
2465
+ "customElement": true
2466
+ }
2467
+ ],
2468
+ "exports": [
2469
+ {
2470
+ "kind": "js",
2471
+ "name": "JSSM_ON_EVENT_NAMES",
2472
+ "declaration": {
2473
+ "name": "JSSM_ON_EVENT_NAMES",
2474
+ "module": "src/ts/wc/fsl_instance_wc.ts"
2475
+ }
2476
+ },
2477
+ {
2478
+ "kind": "js",
2479
+ "name": "parse_jssm_on_element",
2480
+ "declaration": {
2481
+ "name": "parse_jssm_on_element",
2482
+ "module": "src/ts/wc/fsl_instance_wc.ts"
2483
+ }
2484
+ },
2485
+ {
2486
+ "kind": "js",
2487
+ "name": "jssm_handler_registry",
2488
+ "declaration": {
2489
+ "name": "jssm_handler_registry",
2490
+ "module": "src/ts/wc/fsl_instance_wc.ts"
2491
+ }
2492
+ },
2493
+ {
2494
+ "kind": "js",
2495
+ "name": "resolve_named_handler",
2496
+ "declaration": {
2497
+ "name": "resolve_named_handler",
2498
+ "module": "src/ts/wc/fsl_instance_wc.ts"
2499
+ }
2500
+ },
2501
+ {
2502
+ "kind": "js",
2503
+ "name": "compile_inline_body",
2504
+ "declaration": {
2505
+ "name": "compile_inline_body",
2506
+ "module": "src/ts/wc/fsl_instance_wc.ts"
2507
+ }
2508
+ },
2509
+ {
2510
+ "kind": "js",
2511
+ "name": "resolve_fsl_source",
2512
+ "declaration": {
2513
+ "name": "resolve_fsl_source",
2514
+ "module": "src/ts/wc/fsl_instance_wc.ts"
2515
+ }
2516
+ },
2517
+ {
2518
+ "kind": "js",
2519
+ "name": "auto_mode",
2520
+ "declaration": {
2521
+ "name": "auto_mode",
2522
+ "module": "src/ts/wc/fsl_instance_wc.ts"
2523
+ }
2524
+ },
2525
+ {
2526
+ "kind": "js",
2527
+ "name": "split_ratio",
2528
+ "declaration": {
2529
+ "name": "split_ratio",
2530
+ "module": "src/ts/wc/fsl_instance_wc.ts"
2531
+ }
2532
+ },
2533
+ {
2534
+ "kind": "js",
2535
+ "name": "FslInstance",
2536
+ "declaration": {
2537
+ "name": "FslInstance",
2538
+ "module": "src/ts/wc/fsl_instance_wc.ts"
2539
+ }
2540
+ }
2541
+ ]
2542
+ },
2543
+ {
2544
+ "kind": "javascript-module",
2545
+ "path": "src/ts/wc/fsl_simulation_wc.ts",
2546
+ "declarations": [
2547
+ {
2548
+ "kind": "class",
2549
+ "description": "`<fsl-simulation>` — a random-walk driver for a parent `<fsl-instance>`.\r\n\r\n`Step` fires one uniformly-random legal action; `Play` auto-steps every\r\nFslSimulation.interval ms and stops automatically when the machine\r\nreaches a terminal state (no legal actions). Standalone (no host ancestor)\r\nthe controls are disabled.",
2550
+ "name": "FslSimulation",
2551
+ "cssParts": [
2552
+ {
2553
+ "description": "The control row.",
2554
+ "name": "sim"
2555
+ }
2556
+ ],
2557
+ "members": [
877
2558
  {
878
2559
  "kind": "field",
879
- "name": "_reemit_unsubscribes",
2560
+ "name": "interval",
880
2561
  "type": {
881
- "text": "Array<() => void>"
2562
+ "text": "number"
2563
+ },
2564
+ "default": "600",
2565
+ "description": "Auto-step period in milliseconds.",
2566
+ "attribute": "interval"
2567
+ },
2568
+ {
2569
+ "kind": "field",
2570
+ "name": "_running",
2571
+ "type": {
2572
+ "text": "boolean"
882
2573
  },
883
2574
  "privacy": "private",
884
- "default": "[]",
885
- "description": "Unsubscribe callbacks for the host-level mechanism-4 re-emission\r\nsubscriptions installed in _install_event_reemission. Distinct\r\nfrom _on_unsubscribes (which belongs to `<jssm-on>` children)."
2575
+ "default": "false"
886
2576
  },
887
2577
  {
888
2578
  "kind": "field",
889
- "name": "_pending_dom_events",
2579
+ "name": "_steps",
890
2580
  "type": {
891
- "text": "Array<{ name: string; detail: unknown }>"
2581
+ "text": "number"
892
2582
  },
893
2583
  "privacy": "private",
894
- "default": "[]",
895
- "description": "Library events captured during the current transition, awaiting DOM\r\nre-dispatch once Lit commits the next render. Dispatching here (rather\r\nthan synchronously from the machine subscription) guarantees the #639\r\nordering: mechanism 1/3 reflection and mechanism 2 slot re-pick are all\r\nin place before a mechanism-4 listener runs."
2584
+ "default": "0"
896
2585
  },
897
2586
  {
898
2587
  "kind": "field",
899
- "name": "registry",
2588
+ "name": "_host",
900
2589
  "type": {
901
- "text": "FslHookRegistry"
2590
+ "text": "SimHost | null"
902
2591
  },
903
- "readonly": true,
904
- "default": "new Map()",
905
- "description": "Per-instance registry of named hook handlers consulted before\r\n`globalThis` when resolving `<fsl-hook handler=\"name\">` /\r\n`<jssm-hook handler=\"name\">`."
2592
+ "privacy": "private",
2593
+ "default": "null"
906
2594
  },
907
2595
  {
908
2596
  "kind": "field",
909
- "name": "_installed_hooks",
2597
+ "name": "_timer",
910
2598
  "type": {
911
- "text": "unknown[]"
2599
+ "text": "ReturnType<typeof setInterval> | null"
912
2600
  },
913
2601
  "privacy": "private",
914
- "default": "[]",
915
- "description": "Descriptors for hooks this WC installed at connect time."
2602
+ "default": "null"
916
2603
  },
917
2604
  {
918
2605
  "kind": "field",
919
- "name": "_hook_debug_counter",
2606
+ "name": "_step",
2607
+ "privacy": "private"
2608
+ },
2609
+ {
2610
+ "kind": "field",
2611
+ "name": "_toggle",
2612
+ "privacy": "private"
2613
+ },
2614
+ {
2615
+ "kind": "method",
2616
+ "name": "_start",
2617
+ "privacy": "private",
2618
+ "return": {
2619
+ "type": {
2620
+ "text": "void"
2621
+ }
2622
+ }
2623
+ },
2624
+ {
2625
+ "kind": "method",
2626
+ "name": "_stop",
2627
+ "privacy": "private",
2628
+ "return": {
2629
+ "type": {
2630
+ "text": "void"
2631
+ }
2632
+ }
2633
+ }
2634
+ ],
2635
+ "attributes": [
2636
+ {
920
2637
  "type": {
921
2638
  "text": "number"
922
2639
  },
923
- "privacy": "private",
924
- "default": "0",
925
- "description": "Counter for compiled inline-body hook debug ids."
2640
+ "description": "Auto-step period in milliseconds.",
2641
+ "name": "interval",
2642
+ "default": "600",
2643
+ "fieldName": "interval"
2644
+ }
2645
+ ],
2646
+ "superclass": {
2647
+ "name": "LitElement",
2648
+ "package": "lit"
2649
+ },
2650
+ "tagName": "fsl-simulation",
2651
+ "customElement": true
2652
+ }
2653
+ ],
2654
+ "exports": [
2655
+ {
2656
+ "kind": "js",
2657
+ "name": "FslSimulation",
2658
+ "declaration": {
2659
+ "name": "FslSimulation",
2660
+ "module": "src/ts/wc/fsl_simulation_wc.ts"
2661
+ }
2662
+ }
2663
+ ]
2664
+ },
2665
+ {
2666
+ "kind": "javascript-module",
2667
+ "path": "src/ts/wc/fsl_themes.ts",
2668
+ "declarations": [
2669
+ {
2670
+ "kind": "variable",
2671
+ "name": "BUILTIN_THEMES",
2672
+ "type": {
2673
+ "text": "ThemeRegistry"
2674
+ },
2675
+ "default": "{ Default: { light: { surface: '#ffffff', text: '#222222', accent: '#5b9dff', border: '#e5e5e5', muted: '#9aa0a6', 'json-key': '#5b3da8', 'json-string': '#2e7d32', 'json-number': '#b8860b', 'json-atom': '#c2185b', }, dark: { surface: '#1e1e22', text: '#d6d6d6', accent: '#82aaff', border: '#2a2a2e', muted: '#5a5f66', 'json-key': '#82aaff', 'json-string': '#c3e88d', 'json-number': '#f78c6c', 'json-atom': '#c792ea', }, }, Solarized: { light: { surface: '#fdf6e3', text: '#657b83', accent: '#268bd2', border: '#eee8d5', muted: '#93a1a1', 'json-key': '#6c71c4', 'json-string': '#859900', 'json-number': '#b58900', 'json-atom': '#d33682', }, dark: { surface: '#002b36', text: '#839496', accent: '#268bd2', border: '#073642', muted: '#586e75', 'json-key': '#6c71c4', 'json-string': '#859900', 'json-number': '#b58900', 'json-atom': '#d33682', }, }, }",
2676
+ "description": "The built-in themes: `Default` (the suite's house palette) and `Solarized`\r\n(Ethan Schoonover's palette). Consumers can extend the host's `themes`\r\nregistry with their own; every entry shows up in the toolbar's theme list."
2677
+ },
2678
+ {
2679
+ "kind": "function",
2680
+ "name": "resolve_palette",
2681
+ "return": {
2682
+ "type": {
2683
+ "text": ""
2684
+ }
2685
+ },
2686
+ "parameters": [
2687
+ {
2688
+ "name": "themes",
2689
+ "type": {
2690
+ "text": "ThemeRegistry"
2691
+ },
2692
+ "description": "The registry to look in."
2693
+ },
2694
+ {
2695
+ "name": "name",
2696
+ "type": {
2697
+ "text": "string"
2698
+ },
2699
+ "description": "The selected theme name."
2700
+ },
2701
+ {
2702
+ "name": "variant",
2703
+ "type": {
2704
+ "text": "'light' | 'dark'"
2705
+ },
2706
+ "description": "`light` or `dark`."
2707
+ }
2708
+ ],
2709
+ "description": "Resolve a `(registry, theme name, variant)` triple to a concrete palette,\r\nfalling back to the built-in `Default` theme when the name is unknown."
2710
+ },
2711
+ {
2712
+ "kind": "function",
2713
+ "name": "resolve_theme_mode",
2714
+ "return": {
2715
+ "type": {
2716
+ "text": ""
2717
+ }
2718
+ },
2719
+ "parameters": [
2720
+ {
2721
+ "name": "mode",
2722
+ "type": {
2723
+ "text": "ThemeMode"
2724
+ },
2725
+ "description": "The selected mode."
2726
+ },
2727
+ {
2728
+ "name": "prefers_dark",
2729
+ "type": {
2730
+ "text": "boolean"
2731
+ },
2732
+ "description": "Whether the OS prefers a dark color scheme."
2733
+ }
2734
+ ],
2735
+ "description": "Resolve a theme mode to a concrete `light`/`dark`. `system` consults the OS\r\npreference; `light`/`dark` are returned as-is."
2736
+ },
2737
+ {
2738
+ "kind": "function",
2739
+ "name": "palette_to_vars",
2740
+ "return": {
2741
+ "type": {
2742
+ "text": ""
2743
+ }
2744
+ },
2745
+ "parameters": [
2746
+ {
2747
+ "name": "palette",
2748
+ "type": {
2749
+ "text": "ThemePalette"
2750
+ },
2751
+ "description": "The resolved palette."
2752
+ }
2753
+ ],
2754
+ "description": "Map a palette to its `--fsl-color-*` custom-property entries, ready to set on\r\nan element's style."
2755
+ },
2756
+ {
2757
+ "kind": "function",
2758
+ "name": "register_palette_properties",
2759
+ "return": {
2760
+ "type": {
2761
+ "text": "void"
2762
+ }
2763
+ }
2764
+ }
2765
+ ],
2766
+ "exports": [
2767
+ {
2768
+ "kind": "js",
2769
+ "name": "BUILTIN_THEMES",
2770
+ "declaration": {
2771
+ "name": "BUILTIN_THEMES",
2772
+ "module": "src/ts/wc/fsl_themes.ts"
2773
+ }
2774
+ },
2775
+ {
2776
+ "kind": "js",
2777
+ "name": "resolve_palette",
2778
+ "declaration": {
2779
+ "name": "resolve_palette",
2780
+ "module": "src/ts/wc/fsl_themes.ts"
2781
+ }
2782
+ },
2783
+ {
2784
+ "kind": "js",
2785
+ "name": "resolve_theme_mode",
2786
+ "declaration": {
2787
+ "name": "resolve_theme_mode",
2788
+ "module": "src/ts/wc/fsl_themes.ts"
2789
+ }
2790
+ },
2791
+ {
2792
+ "kind": "js",
2793
+ "name": "palette_to_vars",
2794
+ "declaration": {
2795
+ "name": "palette_to_vars",
2796
+ "module": "src/ts/wc/fsl_themes.ts"
2797
+ }
2798
+ },
2799
+ {
2800
+ "kind": "js",
2801
+ "name": "register_palette_properties",
2802
+ "declaration": {
2803
+ "name": "register_palette_properties",
2804
+ "module": "src/ts/wc/fsl_themes.ts"
2805
+ }
2806
+ }
2807
+ ]
2808
+ },
2809
+ {
2810
+ "kind": "javascript-module",
2811
+ "path": "src/ts/wc/fsl_tokens.ts",
2812
+ "declarations": [
2813
+ {
2814
+ "kind": "variable",
2815
+ "name": "fslTokens",
2816
+ "type": {
2817
+ "text": "CSSResult"
2818
+ },
2819
+ "default": "css` :host { --_fsl-surface: var(--fsl-color-surface, #ffffff); --_fsl-text: var(--fsl-color-text, #222222); --_fsl-accent: var(--fsl-color-accent, #5b9dff); --_fsl-border: var(--fsl-color-border, #e5e5e5); --_fsl-muted: var(--fsl-color-muted, #9aa0a6); --_fsl-font: var(--fsl-font, system-ui, -apple-system, \"Segoe UI\", sans-serif); --_fsl-font-mono: var(--fsl-font-mono, ui-monospace, Consolas, monospace); --_fsl-radius: var(--fsl-radius, 6px); --_fsl-space-1: var(--fsl-space-1, 4px); --_fsl-space-2: var(--fsl-space-2, 8px); --_fsl-space-3: var(--fsl-space-3, 12px); --_fsl-space-4: var(--fsl-space-4, 16px); } :host([theme=\"dark\"]) { --_fsl-surface: var(--fsl-color-surface, #1e1e22); --_fsl-text: var(--fsl-color-text, #d6d6d6); --_fsl-accent: var(--fsl-color-accent, #82aaff); --_fsl-border: var(--fsl-color-border, #2a2a2e); --_fsl-muted: var(--fsl-color-muted, #5a5f66); } `",
2820
+ "description": "Shared FSL appearance contract — the `--fsl-*` design-token vocabulary.\r\n\r\nComponents include this in `static styles` and consume the **private**\r\n`--_fsl-*` vars, which resolve: embedder's public `--fsl-*` token →\r\n`[theme=\"dark\"]` default → built-in light fallback. White-label by setting\r\n`--fsl-*` on any ancestor (custom properties inherit through shadow DOM);\r\nflip the built-in default with the host's `theme=\"dark\"` attribute.\r\n\r\nCompanion conventions (declared per-component): expose structural elements as\r\n`::part(...)` (e.g. `part=\"toolbar\"`, `\"gutter\"`, `\"editor\"`) and forward\r\nchild parts with `exportparts`; chrome components carry brand slots\r\n(`<slot name=\"brand\">` / `\"logo\">`)."
2821
+ }
2822
+ ],
2823
+ "exports": [
2824
+ {
2825
+ "kind": "js",
2826
+ "name": "fslTokens",
2827
+ "declaration": {
2828
+ "name": "fslTokens",
2829
+ "module": "src/ts/wc/fsl_tokens.ts"
2830
+ }
2831
+ }
2832
+ ]
2833
+ },
2834
+ {
2835
+ "kind": "javascript-module",
2836
+ "path": "src/ts/wc/fsl_toolbar_wc.ts",
2837
+ "declarations": [
2838
+ {
2839
+ "kind": "class",
2840
+ "description": "`<fsl-toolbar>` — a control bar for a parent `<fsl-instance>`. A light/dark\r\ntheme toggle on the left; on the right, an icon toggle to show/hide each\r\npanel present in the host (renderer, code, history, …) plus a View menu of\r\nthe layout set (its button shows the current layout's icon). Standalone (no\r\nhost) the panel toggles disappear. A trailing slot carries extra buttons.",
2841
+ "name": "FslToolbar",
2842
+ "cssParts": [
2843
+ {
2844
+ "description": "The bar container.",
2845
+ "name": "toolbar"
2846
+ }
2847
+ ],
2848
+ "slots": [
2849
+ {
2850
+ "description": "Trailing custom controls.",
2851
+ "name": ""
2852
+ }
2853
+ ],
2854
+ "members": [
2855
+ {
2856
+ "kind": "field",
2857
+ "name": "_openMenu",
2858
+ "type": {
2859
+ "text": "OpenMenu"
2860
+ },
2861
+ "privacy": "private",
2862
+ "default": "''"
2863
+ },
2864
+ {
2865
+ "kind": "field",
2866
+ "name": "_dest",
2867
+ "type": {
2868
+ "text": "ExportDest"
2869
+ },
2870
+ "privacy": "private",
2871
+ "default": "'clipboard'",
2872
+ "description": "Active export destination; the next format click targets it."
2873
+ },
2874
+ {
2875
+ "kind": "field",
2876
+ "name": "lastDirectory",
2877
+ "type": {
2878
+ "text": "string"
2879
+ },
2880
+ "default": "''",
2881
+ "description": "The last directory an export was saved to this session (its final path\r\nsegment). When non-empty, the Export menu offers a `to <name>` destination.\r\nThe embedder sets this after fulfilling a `pick` export."
926
2882
  },
927
2883
  {
928
2884
  "kind": "field",
929
- "name": "_action_listeners",
2885
+ "name": "_host",
930
2886
  "type": {
931
- "text": "Array<{\r\n target : EventTarget;\r\n event : string;\r\n handler : EventListener;\r\n }>"
2887
+ "text": "HostTarget | null"
932
2888
  },
933
2889
  "privacy": "private",
934
- "default": "[]",
935
- "description": "DOM listeners installed by `<jssm-action>` / `data-jssm-action` discovery."
2890
+ "default": "null"
936
2891
  },
937
2892
  {
938
2893
  "kind": "field",
939
- "name": "machine",
2894
+ "name": "_present",
940
2895
  "type": {
941
- "text": "Machine<unknown>"
2896
+ "text": "ReadonlyArray<PanelDef>"
942
2897
  },
943
- "description": "Raw machine accessor. Returns the owned Machine instance.",
944
- "readonly": true
2898
+ "privacy": "private",
2899
+ "default": "[]",
2900
+ "description": "Panels actually present in the host — one toggle each."
945
2901
  },
946
2902
  {
947
2903
  "kind": "method",
948
- "name": "do",
2904
+ "name": "_setMode",
2905
+ "privacy": "private",
949
2906
  "return": {
950
2907
  "type": {
951
- "text": ""
2908
+ "text": "void"
952
2909
  }
953
2910
  },
954
2911
  "parameters": [
955
2912
  {
956
- "name": "action",
957
- "type": {
958
- "text": "string"
959
- },
960
- "description": "The action name to dispatch."
961
- },
962
- {
963
- "name": "data",
964
- "optional": true,
2913
+ "name": "mode",
965
2914
  "type": {
966
- "text": "unknown"
967
- },
968
- "description": "Optional data payload to pass to the action."
2915
+ "text": "ThemeMode"
2916
+ }
969
2917
  }
970
2918
  ],
971
- "description": "Convenience wrapper for `machine.action(action, data)`.\r\nAfter the action, reflects updated state to host attributes and the\r\n`--current-state` CSS custom property, and requests a Lit update so\r\nthe state-specific `<slot name=\"state-...\">` can re-pick."
972
- },
973
- {
974
- "kind": "method",
975
- "name": "state",
976
- "return": {
977
- "type": {
978
- "text": "string"
979
- }
980
- },
981
- "description": "Convenience wrapper for `machine.state()`. Returns the current\r\nstate's name."
982
- },
983
- {
984
- "kind": "method",
985
- "name": "_install_jssm_on_children",
986
- "privacy": "private",
987
- "return": {
988
- "type": {
989
- "text": "void"
990
- }
991
- },
992
- "description": "Discover direct-child `<jssm-on>` elements and install their\r\nsubscriptions on the owned machine. Per #643:\r\n\r\n- Direct children only (`:scope > jssm-on`). Deeper nesting is the\r\n responsibility of a future MutationObserver-driven v2.\r\n- Each `<jssm-on>` is parsed by parse_jssm_on_element, which\r\n enforces the form / event-name / filter rules.\r\n- Handlers come from resolve_named_handler (form A) or\r\n compile_inline_body (form B), and the result is installed\r\n via `machine.on(...)` or `machine.once(...)` depending on the\r\n element's `once` attribute.\r\n- Every returned unsubscribe is tracked in _on_unsubscribes\r\n so disconnectedCallback can release them all.\r\n\r\nCalled once from `connectedCallback` after the machine has been\r\nconstructed. Any error thrown by parsing or resolution propagates\r\nout so it surfaces via jsdom's error event (matching the rest of\r\n`<jssm-instance>`'s \"fail loud at connect\" policy)."
2919
+ "description": "Set the theme mode (System/Light/Dark). The host applies the palette + drives\r\nthe editor; the menu stays open so a theme can be picked in the same trip."
993
2920
  },
994
2921
  {
995
2922
  "kind": "method",
996
- "name": "_install_declarative_hooks",
2923
+ "name": "_setThemeName",
997
2924
  "privacy": "private",
998
2925
  "return": {
999
2926
  "type": {
1000
2927
  "text": "void"
1001
2928
  }
1002
2929
  },
1003
- "description": "Discover every direct-child `<jssm-hook>` element and install each\r\nagainst the owned machine. Handlers are wrapped with the friendly-proxy\r\nadapter that lets user code write `m.data = ...` and return `false` to\r\ncancel — see make_hook_proxy and the issue (#641) doc-comment\r\nfor the full contract."
1004
- },
1005
- {
1006
- "kind": "method",
1007
- "name": "_hook_id_prefix",
1008
- "privacy": "private",
1009
- "return": {
1010
- "type": {
1011
- "text": "string"
2930
+ "parameters": [
2931
+ {
2932
+ "name": "name",
2933
+ "type": {
2934
+ "text": "string"
2935
+ }
1012
2936
  }
1013
- },
1014
- "description": "Prefix used in synthetic `//# sourceURL=jssm-hook:<prefix><n>` annotations\r\nfor inline-body hooks compiled by this element."
2937
+ ],
2938
+ "description": "Select a named theme from the host's registry. The theme-name buttons only\r\nrender when a host exists, so `_host` is non-null here."
1015
2939
  },
1016
2940
  {
1017
2941
  "kind": "method",
1018
- "name": "_install_event_reemission",
2942
+ "name": "_setLayout",
1019
2943
  "privacy": "private",
1020
2944
  "return": {
1021
2945
  "type": {
1022
2946
  "text": "void"
1023
2947
  }
1024
2948
  },
1025
- "description": "Install the mechanism-4 (#639) re-emission subscriptions: one\r\n`machine.on(name, ...)` per entry in REEMITTED_EVENTS. Each\r\ncaptured library event is queued and re-dispatched as a `fsl-<name>` DOM\r\nevent after the next render commit (see updated).\r\n\r\nSubscribing is also what *enables* the gated observation events: the\r\nlibrary suppresses `transition` / `entry` / `exit` / etc. while no\r\nlisteners exist (#670), so this host subscription is the bridge that\r\nturns them on.\r\n\r\nThe subscription handler paints state reflection eagerly so that a host\r\ndriven directly via `host.machine.action(...)` (bypassing do)\r\nstill updates its `current-state` attribute and `--current-state`\r\nproperty."
1026
- },
1027
- {
1028
- "kind": "method",
1029
- "name": "_flush_pending_dom_events",
1030
- "privacy": "private",
1031
- "return": {
1032
- "type": {
1033
- "text": "void"
2949
+ "parameters": [
2950
+ {
2951
+ "name": "layout",
2952
+ "type": {
2953
+ "text": "FslLayout"
2954
+ }
1034
2955
  }
1035
- },
1036
- "description": "Dispatch and clear the queue of pending DOM events. The queue is\r\nsnapshotted and reset *before* dispatching so that a listener which\r\nre-enters the machine (e.g. calls `host.machine.action(...)`\r\nsynchronously) enqueues into a fresh batch handled by the next update\r\ncycle, rather than mutating the array mid-iteration. This is the\r\ndocumented re-entrancy behavior: re-entrant transitions are deferred,\r\nnot dropped."
2956
+ ]
1037
2957
  },
1038
2958
  {
1039
2959
  "kind": "method",
1040
- "name": "_discover_jssm_actions",
2960
+ "name": "_setDest",
1041
2961
  "privacy": "private",
1042
2962
  "return": {
1043
2963
  "type": {
1044
2964
  "text": "void"
1045
2965
  }
1046
2966
  },
1047
- "description": "Wire DOM events to machine actions, using the two declarative forms from\r\nissue #640. Both forms support optional `from-state` guards,\r\n`from-property` data extraction, and `prevent-default` /\r\n`stop-propagation` modifiers."
2967
+ "parameters": [
2968
+ {
2969
+ "name": "dest",
2970
+ "type": {
2971
+ "text": "ExportDest"
2972
+ }
2973
+ }
2974
+ ],
2975
+ "description": "Set the active export destination; the menu stays open so a format can be\r\nchosen next."
1048
2976
  },
1049
2977
  {
1050
2978
  "kind": "method",
1051
- "name": "_install_action_listener",
2979
+ "name": "_export",
1052
2980
  "privacy": "private",
1053
2981
  "return": {
1054
2982
  "type": {
1055
- "text": "void"
2983
+ "text": "Promise<void>"
1056
2984
  }
1057
2985
  },
1058
2986
  "parameters": [
1059
2987
  {
1060
- "name": "config",
2988
+ "name": "format",
1061
2989
  "type": {
1062
- "text": "{\r\n source : HTMLElement;\r\n event_name : string;\r\n action_name : string;\r\n from_state : string | undefined;\r\n from_property : string | undefined;\r\n prevent_default : boolean;\r\n stop_propagation : boolean;\r\n }"
2990
+ "text": "ExportFormat"
1063
2991
  }
1064
2992
  }
1065
2993
  ],
1066
- "description": "Attach one DOM listener that translates a DOM event into a\r\n`machine.action(...)` call, honoring the configured modifiers."
2994
+ "description": "Emit `fsl-export` with the chosen format's content + the active destination.\r\nThe embedder performs the actual clipboard / file save."
1067
2995
  },
1068
2996
  {
1069
2997
  "kind": "method",
1070
- "name": "_paint_state_reflection",
2998
+ "name": "_toggleMenu",
1071
2999
  "privacy": "private",
1072
3000
  "return": {
1073
3001
  "type": {
1074
3002
  "text": "void"
1075
3003
  }
1076
3004
  },
1077
- "description": "Reflect machine state onto host attributes and CSS custom properties.\r\nCalled after every transition and once during `connectedCallback`.\r\n\r\nMechanism 1 (#639): writes to host attributes.\r\nMechanism 3 (#639): writes to host inline-style custom properties."
3005
+ "parameters": [
3006
+ {
3007
+ "name": "which",
3008
+ "type": {
3009
+ "text": "OpenMenu"
3010
+ }
3011
+ }
3012
+ ]
1078
3013
  }
1079
3014
  ],
1080
3015
  "events": [
1081
3016
  {
3017
+ "name": "fsl-export",
1082
3018
  "type": {
1083
3019
  "text": "CustomEvent"
1084
3020
  }
1085
3021
  }
1086
3022
  ],
1087
- "attributes": [
1088
- {
1089
- "name": "fsl",
1090
- "type": {
1091
- "text": "string"
1092
- },
1093
- "default": "''",
1094
- "description": "FSL source attribute. When non-empty, this is the sole channel\r\nsupplying the machine's source. Setting both this and a child\r\n`<script type=\"text/fsl\">` (or non-empty text content) is an error.",
1095
- "fieldName": "fsl"
1096
- }
1097
- ],
1098
3023
  "superclass": {
1099
3024
  "name": "LitElement",
1100
3025
  "package": "lit"
1101
3026
  },
1102
- "tagName": "fsl-instance",
3027
+ "tagName": "fsl-toolbar",
1103
3028
  "customElement": true
1104
3029
  }
1105
3030
  ],
1106
3031
  "exports": [
1107
3032
  {
1108
3033
  "kind": "js",
1109
- "name": "JSSM_ON_EVENT_NAMES",
1110
- "declaration": {
1111
- "name": "JSSM_ON_EVENT_NAMES",
1112
- "module": "src/ts/wc/fsl_instance_wc.ts"
1113
- }
1114
- },
1115
- {
1116
- "kind": "js",
1117
- "name": "parse_jssm_on_element",
1118
- "declaration": {
1119
- "name": "parse_jssm_on_element",
1120
- "module": "src/ts/wc/fsl_instance_wc.ts"
1121
- }
1122
- },
1123
- {
1124
- "kind": "js",
1125
- "name": "jssm_handler_registry",
1126
- "declaration": {
1127
- "name": "jssm_handler_registry",
1128
- "module": "src/ts/wc/fsl_instance_wc.ts"
1129
- }
1130
- },
1131
- {
1132
- "kind": "js",
1133
- "name": "resolve_named_handler",
1134
- "declaration": {
1135
- "name": "resolve_named_handler",
1136
- "module": "src/ts/wc/fsl_instance_wc.ts"
1137
- }
1138
- },
1139
- {
1140
- "kind": "js",
1141
- "name": "compile_inline_body",
1142
- "declaration": {
1143
- "name": "compile_inline_body",
1144
- "module": "src/ts/wc/fsl_instance_wc.ts"
1145
- }
1146
- },
1147
- {
1148
- "kind": "js",
1149
- "name": "resolve_fsl_source",
1150
- "declaration": {
1151
- "name": "resolve_fsl_source",
1152
- "module": "src/ts/wc/fsl_instance_wc.ts"
1153
- }
1154
- },
1155
- {
1156
- "kind": "js",
1157
- "name": "FslInstance",
3034
+ "name": "FslToolbar",
1158
3035
  "declaration": {
1159
- "name": "FslInstance",
1160
- "module": "src/ts/wc/fsl_instance_wc.ts"
3036
+ "name": "FslToolbar",
3037
+ "module": "src/ts/wc/fsl_toolbar_wc.ts"
1161
3038
  }
1162
3039
  }
1163
3040
  ]
@@ -1246,6 +3123,16 @@
1246
3123
  "default": "null",
1247
3124
  "description": "Unsubscribe callback returned from `host.machine.on('transition', ...)`.\r\nHeld so `disconnectedCallback` can release the subscription."
1248
3125
  },
3126
+ {
3127
+ "kind": "field",
3128
+ "name": "_host_unbind",
3129
+ "type": {
3130
+ "text": "(() => void) | null"
3131
+ },
3132
+ "privacy": "private",
3133
+ "default": "null",
3134
+ "description": "Detaches the host's `fsl-machine-rebuilt` listener (which re-subscribes the\r\nviz to the host's new machine after a live rebuild, #1387). Captures the\r\nexact host the listener was attached to, so teardown is correct even if\r\n`_parent_host` was cleared or replaced. Null when standalone / before binding."
3135
+ },
1249
3136
  {
1250
3137
  "kind": "method",
1251
3138
  "name": "_rerenderFromHostMachine",
@@ -1325,6 +3212,41 @@
1325
3212
  }
1326
3213
  ]
1327
3214
  },
3215
+ {
3216
+ "kind": "javascript-module",
3217
+ "path": "src/ts/wc/svg_layers.ts",
3218
+ "declarations": [
3219
+ {
3220
+ "kind": "function",
3221
+ "name": "reorder_svg_layers",
3222
+ "return": {
3223
+ "type": {
3224
+ "text": ""
3225
+ }
3226
+ },
3227
+ "parameters": [
3228
+ {
3229
+ "name": "svg",
3230
+ "type": {
3231
+ "text": "string"
3232
+ },
3233
+ "description": "SVG markup from the viz pipeline (`machine_to_svg_string`, etc.)."
3234
+ }
3235
+ ],
3236
+ "description": "Reorder a graphviz-rendered SVG's paint stack so action labels can't be\r\npainted over by edges. Graphviz interleaves nodes and edges and keeps each\r\nedge's label `<text>` inside the edge group, so a later edge can draw over an\r\nearlier edge's label. This lifts the layers into a clean back-to-front order:\r\n\r\n background → edges → nodes → action (edge) labels\r\n\r\nEach edge's label text is hoisted out of its edge group to the very top.\r\nMarkup that isn't graphviz output (no `g.graph`) is returned untouched."
3237
+ }
3238
+ ],
3239
+ "exports": [
3240
+ {
3241
+ "kind": "js",
3242
+ "name": "reorder_svg_layers",
3243
+ "declaration": {
3244
+ "name": "reorder_svg_layers",
3245
+ "module": "src/ts/wc/svg_layers.ts"
3246
+ }
3247
+ }
3248
+ ]
3249
+ },
1328
3250
  {
1329
3251
  "kind": "javascript-module",
1330
3252
  "path": "src/ts/wc/wc_tag_helpers.ts",
@@ -1506,6 +3428,85 @@
1506
3428
  }
1507
3429
  }
1508
3430
  ]
3431
+ },
3432
+ {
3433
+ "kind": "javascript-module",
3434
+ "path": "src/ts/wc/widgets.ts",
3435
+ "declarations": [],
3436
+ "exports": [
3437
+ {
3438
+ "kind": "js",
3439
+ "name": "FslToolbar",
3440
+ "declaration": {
3441
+ "name": "FslToolbar",
3442
+ "module": "./fsl_toolbar_wc.js"
3443
+ }
3444
+ },
3445
+ {
3446
+ "kind": "js",
3447
+ "name": "FslActions",
3448
+ "declaration": {
3449
+ "name": "FslActions",
3450
+ "module": "./fsl_actions_wc.js"
3451
+ }
3452
+ },
3453
+ {
3454
+ "kind": "js",
3455
+ "name": "FslFooter",
3456
+ "declaration": {
3457
+ "name": "FslFooter",
3458
+ "module": "./fsl_footer_wc.js"
3459
+ }
3460
+ },
3461
+ {
3462
+ "kind": "js",
3463
+ "name": "FslHelp",
3464
+ "declaration": {
3465
+ "name": "FslHelp",
3466
+ "module": "./fsl_help_wc.js"
3467
+ }
3468
+ },
3469
+ {
3470
+ "kind": "js",
3471
+ "name": "FslHistory",
3472
+ "declaration": {
3473
+ "name": "FslHistory",
3474
+ "module": "./fsl_history_wc.js"
3475
+ }
3476
+ },
3477
+ {
3478
+ "kind": "js",
3479
+ "name": "FslDataInspector",
3480
+ "declaration": {
3481
+ "name": "FslDataInspector",
3482
+ "module": "./fsl_data_inspector_wc.js"
3483
+ }
3484
+ },
3485
+ {
3486
+ "kind": "js",
3487
+ "name": "FslHookLog",
3488
+ "declaration": {
3489
+ "name": "FslHookLog",
3490
+ "module": "./fsl_hook_log_wc.js"
3491
+ }
3492
+ },
3493
+ {
3494
+ "kind": "js",
3495
+ "name": "FslSimulation",
3496
+ "declaration": {
3497
+ "name": "FslSimulation",
3498
+ "module": "./fsl_simulation_wc.js"
3499
+ }
3500
+ },
3501
+ {
3502
+ "kind": "js",
3503
+ "name": "FslExport",
3504
+ "declaration": {
3505
+ "name": "FslExport",
3506
+ "module": "./fsl_export_wc.js"
3507
+ }
3508
+ }
3509
+ ]
1509
3510
  }
1510
3511
  ]
1511
3512
  }