jssm 5.149.2 → 5.150.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.
package/README.md CHANGED
@@ -18,10 +18,10 @@ Please edit the file it's derived from, instead: `./src/md/readme_base.md`
18
18
 
19
19
 
20
20
 
21
- * Generated for version 5.149.2 at 6/28/2026, 9:27:00 AM
21
+ * Generated for version 5.150.1 at 6/28/2026, 10:20:13 AM
22
22
 
23
23
  -->
24
- # jssm 5.149.2
24
+ # jssm 5.150.1
25
25
 
26
26
  [**Try the live editor**](https://stonecypher.github.io/jssm-viz-demo/graph_explorer.html) ·
27
27
  [Documentation](https://stonecypher.github.io/jssm/docs/) ·
@@ -312,7 +312,7 @@ That decision shows up everywhere downstream:
312
312
  or run `npm run benny` against your own machine.
313
313
 
314
314
  - **More thoroughly tested than any other JavaScript state-machine
315
- library.** 7,704 tests at 100.0% line coverage
315
+ library.** 7,720 tests at 100.0% line coverage
316
316
  ([report](https://coveralls.io/github/StoneCypher/jssm)), plus
317
317
  fuzz testing via `fast-check`, with parser test data across ten natural
318
318
  languages and Emoji.
@@ -445,11 +445,11 @@ If your contribution is missing here, please open an issue.
445
445
 
446
446
  <br/>
447
447
 
448
- ***7,704 tests***, run 82,350 times.
448
+ ***7,720 tests***, run 82,366 times.
449
449
 
450
- - 6,950 specs with 100.0% coverage
451
- - 754 fuzz tests with 57.5% coverage
452
- - 8,989 TypeScript lines - 0.9 tests per line, 9.2 generated tests per line
450
+ - 6,966 specs with 100.0% coverage
451
+ - 754 fuzz tests with 57.0% coverage
452
+ - 9,100 TypeScript lines - 0.8 tests per line, 9.1 generated tests per line
453
453
 
454
454
  [![Actions Status](https://github.com/StoneCypher/jssm/workflows/Node%20CI/badge.svg)](https://github.com/StoneCypher/jssm/actions)
455
455
  [![NPM version](https://img.shields.io/npm/v/jssm.svg)](https://www.npmjs.com/package/jssm)
@@ -478,7 +478,7 @@
478
478
  "declarations": [
479
479
  {
480
480
  "kind": "class",
481
- "description": "`<fsl-docs>` — the language-docs content engine: drill-in nav over the bundled\ncurriculum (Getting Started / About State Machines / Tutorials / Example\nMachines / Index / Search), a markdown page renderer, and \"load into editor\"\nfor tagged FSL examples. Content-only; slot it into `<fsl-help>`.",
481
+ "description": "`<fsl-docs>` — the language-docs content engine: drill-in nav over the bundled\r\ncurriculum (Getting Started / About State Machines / Tutorials / Example\r\nMachines / Index / Search), a markdown page renderer, and \"load into editor\"\r\nfor tagged FSL examples. Content-only; slot it into `<fsl-help>`.",
482
482
  "name": "FslDocs",
483
483
  "members": [
484
484
  {
@@ -1109,7 +1109,7 @@
1109
1109
  "declarations": [
1110
1110
  {
1111
1111
  "kind": "class",
1112
- "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.",
1112
+ "description": "`<fsl-footer>` — a status bar for a parent `<fsl-instance>`.\r\n\r\nShows the current state with both **local** counts (actions firable from\r\nhere + transitions out of here) and **global** machine counts: distinct\r\naction *names*, **action-starts** (action-bearing edges — each place an\r\naction fires from), and total transitions. Plus terminal/complete badges.\r\n\r\nLocal counts track transitions by observing the host's reflected\r\n`current-state` / `legal-actions` attributes; the global counts refresh on\r\n`fsl-machine-rebuilt`, so the footer survives a live rebuild (#1387). A\r\ndefault slot carries embedder status. Standalone (no `<fsl-instance>`\r\nancestor) it renders just the slot.",
1113
1113
  "name": "FslFooter",
1114
1114
  "cssParts": [
1115
1115
  {
@@ -1142,6 +1142,15 @@
1142
1142
  "privacy": "private",
1143
1143
  "default": "0"
1144
1144
  },
1145
+ {
1146
+ "kind": "field",
1147
+ "name": "_transitions",
1148
+ "type": {
1149
+ "text": "number"
1150
+ },
1151
+ "privacy": "private",
1152
+ "default": "0"
1153
+ },
1145
1154
  {
1146
1155
  "kind": "field",
1147
1156
  "name": "_terminal",
@@ -1160,6 +1169,33 @@
1160
1169
  "privacy": "private",
1161
1170
  "default": "false"
1162
1171
  },
1172
+ {
1173
+ "kind": "field",
1174
+ "name": "_gActions",
1175
+ "type": {
1176
+ "text": "number"
1177
+ },
1178
+ "privacy": "private",
1179
+ "default": "0"
1180
+ },
1181
+ {
1182
+ "kind": "field",
1183
+ "name": "_gStarts",
1184
+ "type": {
1185
+ "text": "number"
1186
+ },
1187
+ "privacy": "private",
1188
+ "default": "0"
1189
+ },
1190
+ {
1191
+ "kind": "field",
1192
+ "name": "_gTransitions",
1193
+ "type": {
1194
+ "text": "number"
1195
+ },
1196
+ "privacy": "private",
1197
+ "default": "0"
1198
+ },
1163
1199
  {
1164
1200
  "kind": "field",
1165
1201
  "name": "_observer",
@@ -1168,6 +1204,32 @@
1168
1204
  },
1169
1205
  "privacy": "private",
1170
1206
  "default": "null"
1207
+ },
1208
+ {
1209
+ "kind": "field",
1210
+ "name": "_host",
1211
+ "type": {
1212
+ "text": "FooterHost | null"
1213
+ },
1214
+ "privacy": "private",
1215
+ "default": "null"
1216
+ },
1217
+ {
1218
+ "kind": "field",
1219
+ "name": "_onRebuilt",
1220
+ "privacy": "private",
1221
+ "readonly": true
1222
+ },
1223
+ {
1224
+ "kind": "method",
1225
+ "name": "_syncMachine",
1226
+ "privacy": "private",
1227
+ "return": {
1228
+ "type": {
1229
+ "text": "void"
1230
+ }
1231
+ },
1232
+ "description": "Recompute the machine-derived counts: local transitions out of the current\r\nstate, and the global action / action-start / transition totals. Only\r\ncalled while a host is attached, so `_host` is non-null here."
1171
1233
  }
1172
1234
  ],
1173
1235
  "superclass": {
@@ -2117,10 +2179,42 @@
2117
2179
  },
2118
2180
  {
2119
2181
  "kind": "field",
2120
- "name": "_hiddenPanels",
2182
+ "name": "_overrides",
2121
2183
  "privacy": "private",
2122
- "default": "new Set<string>()",
2123
- "description": "Slot names of panels currently hidden (driven by `<fsl-toolbar>`)."
2184
+ "default": "new Map<string, boolean>()",
2185
+ "description": "Per-panel runtime visibility overrides set by the user via the toolbar\r\ntoggles; a slot absent here falls back to its mode-resolved base."
2186
+ },
2187
+ {
2188
+ "kind": "field",
2189
+ "name": "panelMode",
2190
+ "privacy": "public",
2191
+ "type": {
2192
+ "text": "PanelMode"
2193
+ },
2194
+ "default": "'default'",
2195
+ "description": "Control-level default PanelMode; panelModes overrides it\r\nper panel. `default` shows only the editor + renderer; every other panel\r\nstarts hidden and is opt-in.",
2196
+ "attribute": "panel-mode",
2197
+ "reflects": true
2198
+ },
2199
+ {
2200
+ "kind": "field",
2201
+ "name": "panelModes",
2202
+ "privacy": "public",
2203
+ "type": {
2204
+ "text": "Record<string, PanelMode>"
2205
+ },
2206
+ "default": "{}",
2207
+ "description": "Per-panel PanelMode overrides (slot → mode), each overriding the\r\ncontrol-level panelMode."
2208
+ },
2209
+ {
2210
+ "kind": "field",
2211
+ "name": "requestedPanels",
2212
+ "privacy": "public",
2213
+ "type": {
2214
+ "text": "string[]"
2215
+ },
2216
+ "default": "[]",
2217
+ "description": "Panels the FSL \"requests\" — the embedder-set stand-in for the\r\neditor-defaults-in-FSL mechanism (fsl#1334). `request`-mode panels listed\r\nhere are shown; others fall back to the default."
2124
2218
  },
2125
2219
  {
2126
2220
  "kind": "field",
@@ -2415,6 +2509,25 @@
2415
2509
  ],
2416
2510
  "description": "Switch the visible pane in the `tabs` layout."
2417
2511
  },
2512
+ {
2513
+ "kind": "method",
2514
+ "name": "_defaultHidden",
2515
+ "privacy": "private",
2516
+ "return": {
2517
+ "type": {
2518
+ "text": "boolean"
2519
+ }
2520
+ },
2521
+ "parameters": [
2522
+ {
2523
+ "name": "slot",
2524
+ "type": {
2525
+ "text": "string"
2526
+ }
2527
+ }
2528
+ ],
2529
+ "description": "The built-in default hidden state: only the editor + renderer (viz) show."
2530
+ },
2418
2531
  {
2419
2532
  "kind": "method",
2420
2533
  "name": "isPanelHidden",
@@ -2432,7 +2545,7 @@
2432
2545
  "description": "A panel slot name (e.g. `\"viz\"`, `\"editor\"`, `\"history\"`)."
2433
2546
  }
2434
2547
  ],
2435
- "description": "Whether the panel slotted under `slot` is currently hidden."
2548
+ "description": "Whether the panel slotted under `slot` is currently hidden, resolving its\r\nPanelMode (panelModes for the slot, else panelMode):\r\n`hide`/`show` force the state; otherwise a user toggle wins, then a\r\n`request`ed panel shows, then the built-in default."
2436
2549
  },
2437
2550
  {
2438
2551
  "kind": "method",
@@ -2458,7 +2571,7 @@
2458
2571
  "description": "`true` to hide, `false` to show."
2459
2572
  }
2460
2573
  ],
2461
- "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."
2574
+ "description": "Show or hide the panel slotted under `slot` (a runtime override). Hiding\r\n`viz` or `editor` collapses that workbench pane (the other fills); hiding\r\nan aux panel removes its section. `<fsl-toolbar>` drives this from its\r\npanel toggles."
2462
2575
  },
2463
2576
  {
2464
2577
  "kind": "method",
@@ -2477,7 +2590,7 @@
2477
2590
  "description": "A panel slot name (e.g. `\"viz\"`, `\"editor\"`, `\"history\"`)."
2478
2591
  }
2479
2592
  ],
2480
- "description": "Toggle the visibility of the panel slotted under `slot`."
2593
+ "description": "Toggle the visibility of the panel slotted under `slot`. A no-op when the\r\npanel's mode is `hide` or `show` — those lock the visibility."
2481
2594
  },
2482
2595
  {
2483
2596
  "kind": "method",
@@ -2566,6 +2679,17 @@
2566
2679
  ],
2567
2680
  "description": "Build a machine from FSL source, seeding data when it is set."
2568
2681
  },
2682
+ {
2683
+ "kind": "method",
2684
+ "name": "_applyEditorConfig",
2685
+ "privacy": "private",
2686
+ "return": {
2687
+ "type": {
2688
+ "text": "void"
2689
+ }
2690
+ },
2691
+ "description": "Adopt the FSL's `editor: {}` panel request (fsl#1334): when the machine\r\ndeclares `panels`, drive requestedPanels from it so `request` panel\r\nmode honors the source. The embedder's value persists when the FSL is\r\nsilent. Called after each (re)build, with `_machine` freshly assigned."
2692
+ },
2569
2693
  {
2570
2694
  "kind": "method",
2571
2695
  "name": "_rebuild_machine",
@@ -2654,10 +2778,10 @@
2654
2778
  "type": {
2655
2779
  "text": "boolean"
2656
2780
  },
2657
- "description": "True when actions + data-inspector are rendered as side\r\ndocks (split layouts); they are then omitted from this stack."
2781
+ "description": "True when hook-log + data-inspector are rendered as side\r\ndocks (split layouts); they are then omitted from this stack."
2658
2782
  }
2659
2783
  ],
2660
- "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."
2784
+ "description": "The stacked middle panels, shared by both layouts. The toolbar slot is\r\nrendered at the top of render. In split mode the `hook-log` (events)\r\nand `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; `actions` instead lives here as a horizontal bar. The\r\nstate-section + footer stay in render so the dynamic state-slot\r\nname binds at the top level."
2661
2785
  }
2662
2786
  ],
2663
2787
  "events": [
@@ -2727,6 +2851,15 @@
2727
2851
  "default": "undefined",
2728
2852
  "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.",
2729
2853
  "fieldName": "data"
2854
+ },
2855
+ {
2856
+ "name": "panel-mode",
2857
+ "type": {
2858
+ "text": "PanelMode"
2859
+ },
2860
+ "default": "'default'",
2861
+ "description": "Control-level default PanelMode; panelModes overrides it\r\nper panel. `default` shows only the editor + renderer; every other panel\r\nstarts hidden and is opt-in.",
2862
+ "fieldName": "panelMode"
2730
2863
  }
2731
2864
  ],
2732
2865
  "superclass": {
@@ -3107,9 +3240,45 @@
3107
3240
  "kind": "javascript-module",
3108
3241
  "path": "src/ts/wc/fsl_toolbar_wc.ts",
3109
3242
  "declarations": [
3243
+ {
3244
+ "kind": "function",
3245
+ "name": "permalink_for",
3246
+ "return": {
3247
+ "type": {
3248
+ "text": "string"
3249
+ }
3250
+ },
3251
+ "parameters": [
3252
+ {
3253
+ "name": "fsl",
3254
+ "type": {
3255
+ "text": "string"
3256
+ }
3257
+ }
3258
+ ],
3259
+ "description": "A shareable URL for the given FSL: the current page URL with the source\r\nencoded in the hash (`#fsl=...`). A page that reads the hash on load can\r\nrestore the machine. Browser-only (uses `location`), like the rest of the\r\ntoolbar."
3260
+ },
3261
+ {
3262
+ "kind": "function",
3263
+ "name": "embed_snippet_for",
3264
+ "return": {
3265
+ "type": {
3266
+ "text": "string"
3267
+ }
3268
+ },
3269
+ "parameters": [
3270
+ {
3271
+ "name": "fsl",
3272
+ "type": {
3273
+ "text": "string"
3274
+ }
3275
+ }
3276
+ ],
3277
+ "description": "A paste-able HTML snippet that renders the given FSL from the CDN builds: an\r\n`<fsl-instance>` reading its source from a `<script type=\"text/fsl\">` child,\r\nwith a slotted `<fsl-viz>` for the graph."
3278
+ },
3110
3279
  {
3111
3280
  "kind": "class",
3112
- "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.",
3281
+ "description": "`<fsl-toolbar>` — a control bar for a parent `<fsl-instance>`. Validate + Lint\r\naction buttons (fired as `fsl-validate` / `fsl-lint` events for the embedder\r\nto fulfill, each suppressible via `no-validate` / `no-lint`); an icon toggle\r\nto show/hide each panel present in the host (renderer, code, history, …); and\r\nLayout / Export / Theme pulldowns (the Layout button shows the current\r\nlayout's icon). Standalone (no host) the host-dependent controls disappear.\r\nA trailing slot carries extra buttons.",
3113
3282
  "name": "FslToolbar",
3114
3283
  "cssParts": [
3115
3284
  {
@@ -3152,6 +3321,26 @@
3152
3321
  "default": "''",
3153
3322
  "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."
3154
3323
  },
3324
+ {
3325
+ "kind": "field",
3326
+ "name": "noValidate",
3327
+ "type": {
3328
+ "text": "boolean"
3329
+ },
3330
+ "default": "false",
3331
+ "description": "Hide the Validate button (e.g. when the consumer validates inline).",
3332
+ "attribute": "no-validate"
3333
+ },
3334
+ {
3335
+ "kind": "field",
3336
+ "name": "noLint",
3337
+ "type": {
3338
+ "text": "boolean"
3339
+ },
3340
+ "default": "false",
3341
+ "description": "Hide the Lint button.",
3342
+ "attribute": "no-lint"
3343
+ },
3155
3344
  {
3156
3345
  "kind": "field",
3157
3346
  "name": "_host",
@@ -3265,6 +3454,25 @@
3265
3454
  ],
3266
3455
  "description": "Emit `fsl-export` with the chosen format's content + the active destination.\r\nThe embedder performs the actual clipboard / file save."
3267
3456
  },
3457
+ {
3458
+ "kind": "method",
3459
+ "name": "_fireAction",
3460
+ "privacy": "private",
3461
+ "return": {
3462
+ "type": {
3463
+ "text": "void"
3464
+ }
3465
+ },
3466
+ "parameters": [
3467
+ {
3468
+ "name": "type",
3469
+ "type": {
3470
+ "text": "'fsl-validate' | 'fsl-lint'"
3471
+ }
3472
+ }
3473
+ ],
3474
+ "description": "Fire a workspace-action intent (validate / lint) for the consumer to\r\nfulfill — the toolbar presents the action; the embedder runs it. The\r\ncurrent machine source rides along in the detail as a convenience. The\r\nbuttons only render with a host, so `_host` is non-null here."
3475
+ },
3268
3476
  {
3269
3477
  "kind": "method",
3270
3478
  "name": "_toggleMenu",
@@ -3290,6 +3498,32 @@
3290
3498
  "type": {
3291
3499
  "text": "CustomEvent"
3292
3500
  }
3501
+ },
3502
+ {
3503
+ "name": "type",
3504
+ "type": {
3505
+ "text": "CustomEvent"
3506
+ }
3507
+ }
3508
+ ],
3509
+ "attributes": [
3510
+ {
3511
+ "name": "no-validate",
3512
+ "type": {
3513
+ "text": "boolean"
3514
+ },
3515
+ "default": "false",
3516
+ "description": "Hide the Validate button (e.g. when the consumer validates inline).",
3517
+ "fieldName": "noValidate"
3518
+ },
3519
+ {
3520
+ "name": "no-lint",
3521
+ "type": {
3522
+ "text": "boolean"
3523
+ },
3524
+ "default": "false",
3525
+ "description": "Hide the Lint button.",
3526
+ "fieldName": "noLint"
3293
3527
  }
3294
3528
  ],
3295
3529
  "superclass": {
@@ -3301,6 +3535,22 @@
3301
3535
  }
3302
3536
  ],
3303
3537
  "exports": [
3538
+ {
3539
+ "kind": "js",
3540
+ "name": "permalink_for",
3541
+ "declaration": {
3542
+ "name": "permalink_for",
3543
+ "module": "src/ts/wc/fsl_toolbar_wc.ts"
3544
+ }
3545
+ },
3546
+ {
3547
+ "kind": "js",
3548
+ "name": "embed_snippet_for",
3549
+ "declaration": {
3550
+ "name": "embed_snippet_for",
3551
+ "module": "src/ts/wc/fsl_toolbar_wc.ts"
3552
+ }
3553
+ },
3304
3554
  {
3305
3555
  "kind": "js",
3306
3556
  "name": "FslToolbar",