flexdesk 0.17.13 → 0.17.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +0 -0
  3. package/README.md +0 -0
  4. package/THIRD_PARTY_LICENSES.md +0 -0
  5. package/canvas.js +0 -0
  6. package/charts.js +0 -0
  7. package/core.js +0 -0
  8. package/css/base.css +45 -3
  9. package/css/flexdesk.css +60 -3
  10. package/css/overrides.css +15 -0
  11. package/css/reset.css +0 -0
  12. package/dist/canvas.js +0 -0
  13. package/dist/canvas.js.map +0 -0
  14. package/dist/chunk-3PHCPZHT.js +0 -0
  15. package/dist/chunk-3PHCPZHT.js.map +0 -0
  16. package/dist/chunk-FOOS3T5L.js +0 -0
  17. package/dist/chunk-FOOS3T5L.js.map +0 -0
  18. package/dist/chunk-GOQLR5WR.js +0 -0
  19. package/dist/chunk-GOQLR5WR.js.map +0 -0
  20. package/dist/chunk-HNU6MM2B.js +0 -0
  21. package/dist/chunk-HNU6MM2B.js.map +0 -0
  22. package/dist/chunk-JKZLNKG6.js +0 -0
  23. package/dist/chunk-JKZLNKG6.js.map +0 -0
  24. package/dist/chunk-JYWURG5T.js +0 -0
  25. package/dist/chunk-JYWURG5T.js.map +0 -0
  26. package/dist/chunk-N7HC3ADV.js +0 -0
  27. package/dist/chunk-N7HC3ADV.js.map +0 -0
  28. package/dist/core.js +3 -18
  29. package/dist/core.js.map +2 -2
  30. package/dist/editor.js.map +0 -0
  31. package/dist/flexdesk.css +60 -3
  32. package/dist/flow.js.map +0 -0
  33. package/dist/host.js +0 -0
  34. package/dist/host.js.map +0 -0
  35. package/dist/reset.css +0 -0
  36. package/dist/tile_registry-6WZPTUZV.js +0 -0
  37. package/dist/tile_registry-6WZPTUZV.js.map +0 -0
  38. package/dist/widgets.js +27 -18
  39. package/dist/widgets.js.map +2 -2
  40. package/dist/wm.js +195 -28
  41. package/dist/wm.js.map +3 -3
  42. package/docs/README.md +1 -1
  43. package/docs/best-practices.md +1 -1
  44. package/docs/components/command-palette.md +0 -0
  45. package/docs/components/conversation.md +0 -0
  46. package/docs/components/data-table-grid.md +0 -0
  47. package/docs/components/data-table.md +0 -0
  48. package/docs/components/editor.md +0 -0
  49. package/docs/components/flow-canvas-editor.md +0 -0
  50. package/docs/components/flow-editors.md +0 -0
  51. package/docs/components/flow-lane-editor.md +0 -0
  52. package/docs/components/flow-outline-editor.md +0 -0
  53. package/docs/components/forms-and-dialogs.md +0 -0
  54. package/docs/components/input-fields.md +0 -0
  55. package/docs/components/keymap.md +66 -3
  56. package/docs/components/layout-widgets.md +32 -0
  57. package/docs/components/markdown-and-outline.md +0 -0
  58. package/docs/components/menus.md +9 -5
  59. package/docs/components/notifications.md +0 -0
  60. package/docs/components/panels-and-desktops.md +56 -0
  61. package/docs/components/record-list-and-fact-table.md +0 -0
  62. package/docs/components/settings-view.md +0 -0
  63. package/docs/components/shell.md +0 -0
  64. package/docs/components/slide-out-panel.md +0 -0
  65. package/docs/components/wizard.md +0 -0
  66. package/docs/concepts/building-and-packaging.md +0 -0
  67. package/docs/concepts/domain-neutrality.md +0 -0
  68. package/docs/concepts/host-port.md +0 -0
  69. package/docs/concepts/packages-and-entry-points.md +0 -0
  70. package/docs/concepts/peer-dependencies.md +0 -0
  71. package/docs/concepts/state-guard.md +65 -2
  72. package/docs/concepts/styling.md +24 -6
  73. package/docs/quickstart.md +0 -0
  74. package/editor.js +0 -0
  75. package/flow.js +0 -0
  76. package/host.js +0 -0
  77. package/package.json +2 -2
  78. package/src/canvas/canvas_adapter.js +0 -0
  79. package/src/canvas/edge_router.js +0 -0
  80. package/src/canvas/graph/connector_router.js +0 -0
  81. package/src/canvas/graph/history_service.js +0 -0
  82. package/src/canvas/graph/node_platform.js +0 -0
  83. package/src/canvas/index.js +0 -0
  84. package/src/canvas/layered_layout.js +0 -0
  85. package/src/charts/data_series_plot_window.js +0 -0
  86. package/src/charts/downsample.js +0 -0
  87. package/src/charts/plot_config.js +0 -0
  88. package/src/charts/plotly_wrapper.js +0 -0
  89. package/src/core/event_bus.js +0 -0
  90. package/src/core/logging.js +0 -0
  91. package/src/core/settings.js +0 -0
  92. package/src/core/state_guard.js +0 -0
  93. package/src/core/state_guard_config.js +19 -18
  94. package/src/core/state_machine.js +0 -0
  95. package/src/editor/editor_pane.js +0 -0
  96. package/src/editor/monaco_editor_factory.js +0 -0
  97. package/src/editor/monaco_loader.js +0 -0
  98. package/src/editor/notebook_search.js +0 -0
  99. package/src/editor/notebook_undo_manager.js +0 -0
  100. package/src/editor/split_pane_container.js +0 -0
  101. package/src/flow/canvas_editor/connections.js +0 -0
  102. package/src/flow/canvas_editor/editor.js +0 -0
  103. package/src/flow/canvas_editor/index.js +0 -0
  104. package/src/flow/canvas_editor/layout.js +0 -0
  105. package/src/flow/canvas_editor/strings.js +0 -0
  106. package/src/flow/kit/always_before.js +0 -0
  107. package/src/flow/kit/catalogue.js +0 -0
  108. package/src/flow/kit/chip_input.js +0 -0
  109. package/src/flow/kit/dom.js +0 -0
  110. package/src/flow/kit/findings.js +0 -0
  111. package/src/flow/kit/history.js +0 -0
  112. package/src/flow/kit/index.js +0 -0
  113. package/src/flow/kit/keys.js +0 -0
  114. package/src/flow/kit/logic_graph.js +0 -0
  115. package/src/flow/kit/references.js +0 -0
  116. package/src/flow/kit/settings_panel.js +0 -0
  117. package/src/flow/kit/settings_schema.js +0 -0
  118. package/src/flow/kit/step_picker.js +0 -0
  119. package/src/flow/kit/strings.js +0 -0
  120. package/src/flow/kit/value_picker.js +0 -0
  121. package/src/flow/kit/widgets.js +0 -0
  122. package/src/flow/lanes/editor.js +0 -0
  123. package/src/flow/lanes/index.js +0 -0
  124. package/src/flow/lanes/layout.js +0 -0
  125. package/src/flow/lanes/pipeline.js +0 -0
  126. package/src/flow/lanes/preview.js +0 -0
  127. package/src/flow/lanes/strings.js +0 -0
  128. package/src/flow/outline/editor.js +0 -0
  129. package/src/flow/outline/index.js +0 -0
  130. package/src/flow/outline/mapping.js +0 -0
  131. package/src/flow/outline/menu.js +0 -0
  132. package/src/flow/outline/operations.js +0 -0
  133. package/src/flow/outline/recognise.js +0 -0
  134. package/src/flow/outline/strings.js +0 -0
  135. package/src/help/help_modal.js +0 -0
  136. package/src/help/help_registry.js +0 -0
  137. package/src/host/external_links.js +0 -0
  138. package/src/host/file_picker.js +0 -0
  139. package/src/host/host.js +0 -0
  140. package/src/host/photino_host.js +0 -0
  141. package/src/host/photino_host.md +0 -0
  142. package/src/host/pywebview_host.js +0 -0
  143. package/src/tiles/chart_tiles.js +0 -0
  144. package/src/tiles/config_schema.js +0 -0
  145. package/src/tiles/figure_tile.js +0 -0
  146. package/src/tiles/layout_persistence.js +0 -0
  147. package/src/tiles/list_tiles.js +0 -0
  148. package/src/tiles/scope_picker.js +0 -0
  149. package/src/tiles/tile_config_form.js +0 -0
  150. package/src/tiles/tile_grid.js +0 -0
  151. package/src/tiles/tile_registry.js +0 -0
  152. package/src/tiling/bottom_panel_tabs.js +0 -0
  153. package/src/tiling/command_palette.js +0 -0
  154. package/src/tiling/content_registry.js +0 -0
  155. package/src/tiling/desktops.js +79 -16
  156. package/src/tiling/entity_sources.js +0 -0
  157. package/src/tiling/keymap.js +70 -2
  158. package/src/tiling/kind_taxonomy.js +0 -0
  159. package/src/tiling/landing_table.js +0 -0
  160. package/src/tiling/loading_overlay.js +0 -0
  161. package/src/tiling/nav_panel.js +0 -0
  162. package/src/tiling/page_factory.js +0 -0
  163. package/src/tiling/panel_availability.js +0 -0
  164. package/src/tiling/panel_keys.js +0 -0
  165. package/src/tiling/shell.js +9 -2
  166. package/src/tiling/tab_strip.js +0 -0
  167. package/src/tiling/tile_breadcrumb.js +0 -0
  168. package/src/tiling/tile_renderer.js +0 -0
  169. package/src/tiling/tile_tab_menu.js +0 -0
  170. package/src/tiling/tile_tree.js +63 -5
  171. package/src/tiling/wm.js +59 -6
  172. package/src/tiling/zoom.js +0 -0
  173. package/src/ui/base/component_base.js +0 -0
  174. package/src/ui/base/controller_base.js +0 -0
  175. package/src/ui/base/page_base.js +0 -0
  176. package/src/ui/components/about_dialog.js +0 -0
  177. package/src/ui/components/alert_log.js +0 -0
  178. package/src/ui/components/alerts_pane.js +0 -0
  179. package/src/ui/components/attribute_list_editor.js +0 -0
  180. package/src/ui/components/autocomplete_field.js +0 -0
  181. package/src/ui/components/cell_editor_host.js +0 -0
  182. package/src/ui/components/cell_editors.js +0 -0
  183. package/src/ui/components/cell_grid.js +0 -0
  184. package/src/ui/components/cell_paste.js +0 -0
  185. package/src/ui/components/cell_selection.js +0 -0
  186. package/src/ui/components/choice_controls.js +0 -0
  187. package/src/ui/components/color_field.js +0 -0
  188. package/src/ui/components/color_list_field.js +0 -0
  189. package/src/ui/components/column_fit.js +0 -0
  190. package/src/ui/components/column_groups.js +0 -0
  191. package/src/ui/components/column_order.js +0 -0
  192. package/src/ui/components/computing_status_window.js +0 -0
  193. package/src/ui/components/confirm_dialog.js +0 -0
  194. package/src/ui/components/conversation_view.js +0 -0
  195. package/src/ui/components/crosstab.js +0 -0
  196. package/src/ui/components/detail_header.js +0 -0
  197. package/src/ui/components/document_outline.js +0 -0
  198. package/src/ui/components/drag_reorder.js +0 -0
  199. package/src/ui/components/fact_table.js +0 -0
  200. package/src/ui/components/fill_handle.js +0 -0
  201. package/src/ui/components/gallery_picker.js +0 -0
  202. package/src/ui/components/header_actions.js +0 -0
  203. package/src/ui/components/inline_renamer.js +0 -0
  204. package/src/ui/components/job_progress.js +0 -0
  205. package/src/ui/components/menu_bar.js +0 -0
  206. package/src/ui/components/modal.js +0 -0
  207. package/src/ui/components/notification_history.js +0 -0
  208. package/src/ui/components/progress.js +0 -0
  209. package/src/ui/components/record_list.js +0 -0
  210. package/src/ui/components/row_activation.js +0 -0
  211. package/src/ui/components/section_stack.js +0 -0
  212. package/src/ui/components/series.js +0 -0
  213. package/src/ui/components/settings_view.js +0 -0
  214. package/src/ui/components/slide_out_panel.js +0 -0
  215. package/src/ui/components/slider_field.js +0 -0
  216. package/src/ui/components/sortable_list.js +0 -0
  217. package/src/ui/components/staged_edits.js +0 -0
  218. package/src/ui/components/staged_history.js +0 -0
  219. package/src/ui/components/table_filter_chips.js +0 -0
  220. package/src/ui/components/table_state_store.js +0 -0
  221. package/src/ui/components/table_structure.js +0 -0
  222. package/src/ui/components/table_values.js +0 -0
  223. package/src/ui/components/tabs.js +0 -0
  224. package/src/ui/components/tag_input.js +0 -0
  225. package/src/ui/components/toast.js +0 -0
  226. package/src/ui/components/toggle_field.js +0 -0
  227. package/src/ui/components/tree_view.js +41 -18
  228. package/src/ui/components/tsv.js +0 -0
  229. package/src/ui/components/window_taskbar.js +0 -0
  230. package/src/ui/components/wizard.js +0 -0
  231. package/src/ui/controllers/window_chrome_controller.js +0 -0
  232. package/src/ui/notification_center.js +0 -0
  233. package/src/ui/utils/auto_scrollbars.js +0 -0
  234. package/src/ui/utils/markdown.js +0 -0
  235. package/src/ui/utils/native_context_menu.js +0 -0
  236. package/src/ui/utils/overlay_scrollbar.js +0 -0
  237. package/src/ui/utils/raf_resize_observer.js +0 -0
  238. package/src/ui/utils/scroll_lock.js +0 -0
  239. package/src/ui/utils/strip_scroll.js +0 -0
  240. package/src/ui/utils/tooltip_service.js +0 -0
  241. package/tiles.js +0 -0
  242. package/widgets.js +0 -0
  243. package/wm.js +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.17.14 (2026-10-26)
4
+
5
+ A patch release. Everything below is additive except one changed default (see
6
+ "Changed default"). Each entry with a docs section links to it.
7
+
8
+ ### Added and changed
9
+
10
+ - [Tree items with row actions](docs/components/layout-widgets.md#tree-items-with-row-actions-01714): `createTreeItem` takes `actions` in the shape `createTreeNode` takes them (`{ id: { icon, title, onClick(id, event) } }`). The buttons (`.twm-tree-node__action-btn`) sit in one line in a `.twm-tree-item__actions` slot at the row's end, shown on hover, on focus within and on the selected item; the slot takes no height, so a row is as tall with actions as without; it is hidden by opacity, so Tab still reaches the buttons; a click on an action does not select the item and a double-click does not reach `onItemDoubleClick`. Without `actions` the markup is unchanged. `createTreeNode`'s action buttons, built by the same code, are now `type="button"`, so inside a form they no longer submit it (STORY-0121).
11
+ - [The digit chords follow the key's position](docs/components/keymap.md#the-digit-chords-follow-the-keys-position-not-its-character-01714): Alt+1..9 and Alt+Shift+1..9 match `event.code` (`Digit1`..`Digit9`), so Alt+Shift+N moves the focused tile to desktop N from a real key press on any layout (BUG-0046).
12
+ - [Spinners turn without keyframes of your own](docs/concepts/styling.md#spinners-turn-without-keyframes-of-your-own-01714): flexdesk.css defines the `@keyframes` its tile-loading, data-table, computing-status and run-progress spinners name (BUG-0047).
13
+ - [A saved layout that cannot be read](docs/components/panels-and-desktops.md#a-saved-layout-that-cannot-be-read-01714): a saved `desktops` layout that is JSON but not a layout is ignored with one warning, and the shell opens its default layout instead of throwing (BUG-0048).
14
+ - `flexdesk/css/tokens` resolves to `dist/tokens.css`, the file the docs name, like `flexdesk/css` and `flexdesk/css/reset` (BUG-0030).
15
+ - [The menu-bar row is a band of its own](docs/components/menus.md#the-menu-bar-in-its-own-row-under-the-top-bar-01713): `.twm-global-menu-bar` has background `var(--surface-0)`, darker than the top bar, and a `1px solid var(--border-strong)` border above and below (was `var(--surface-1)` with a `var(--surface-0)` bottom border), so it is set off from the top bar and the tiles. The row is 1px taller (STORY-0122).
16
+
17
+ ### Changed default
18
+
19
+ - `DEFAULT_STATE_GUARD_CONFIG.allowedDatasetKeys` no longer lists thirteen keys that one embedding application had left in it and no FlexDesk widget writes: `scenario-id`, `run-id`, `run-state`, `mirror-input`, `mirror-input-bound`, `mirror-change-bound`, `override-type`, `info-for`, `dsl-state`, `dsl-section-registered`, `dsl-scrollbars-installed`, `dsl-tabs-bound` and `dsl-controls-bound`. An app that writes one of them under a guard built on the defaults lists it on top of them; a strict guard otherwise throws on the write (BUG-0029).
20
+
21
+ ### Removed or renamed exports
22
+
23
+ None. Compared with 0.17.13, across every entry point (`core`, `widgets`, `wm`,
24
+ `host`, `canvas`, `flow`, `charts`, `tiles`, `editor`) and the package
25
+ `exports` map, no export was added, removed or renamed, and no option was
26
+ removed or renamed; `createTreeItem` has one new option, `actions`. Not an
27
+ export but worth knowing: flexdesk.css has one new class,
28
+ `.twm-tree-item__actions`, and defines no new custom property.
29
+
3
30
  ## 0.17.13 (2026-10-26)
4
31
 
5
32
  A patch release: everything below is additive. Every fix is documented in a
package/LICENSE CHANGED
File without changes
package/README.md CHANGED
File without changes
File without changes
package/canvas.js CHANGED
File without changes
package/charts.js CHANGED
File without changes
package/core.js CHANGED
File without changes
package/css/base.css CHANGED
@@ -1282,16 +1282,19 @@ body.twm-dt-col-resizing {
1282
1282
  * to the top bar does not include it. No z-index, so it is no stacking
1283
1283
  * context: the top bar's dropdowns draw over it, and the .twm-menubar inside
1284
1284
  * keeps its own styles, its menus (position: fixed, --z-over-windows) drawing
1285
- * over the page. Its height is the bar's plus the padding. */
1285
+ * over the page. It reads as a band of its own (STORY-0122, 0.17.14): darker
1286
+ * than the top bar, with a border above and below. Its height is the bar's
1287
+ * plus the padding and the two borders. */
1286
1288
  .twm-global-menu-bar {
1287
1289
  display: flex;
1288
1290
  align-items: center;
1289
1291
  width: 100%;
1290
1292
  box-sizing: border-box;
1291
1293
  padding: var(--space-xxs) var(--space-xs);
1292
- background-color: var(--surface-1);
1294
+ background-color: var(--surface-0);
1293
1295
  color: var(--text-body);
1294
- border-bottom: 1px solid var(--surface-0);
1296
+ border-top: 1px solid var(--border-strong);
1297
+ border-bottom: 1px solid var(--border-strong);
1295
1298
  overflow: visible; /* the bar's menus extend below */
1296
1299
  }
1297
1300
  .twm-bar-center {
@@ -2436,6 +2439,28 @@ body.twm-window-maximized .twm-resize-handle {
2436
2439
  color: var(--text-dim);
2437
2440
  margin-left: var(--space-xs);
2438
2441
  }
2442
+ /* Row actions (createTreeItem's `actions`, STORY-0121): one line at the row's
2443
+ * end, after label, subtitle and badge, shown on hover, on focus within and on
2444
+ * the selected item. Hidden by opacity, not display, so the buttons stay in
2445
+ * the tab order (Tab reaches them and :focus-within shows them) and the label
2446
+ * keeps its width on hover. The slot is no taller than the label line, so a
2447
+ * row is as high with actions as without. */
2448
+ .twm-tree-item__actions {
2449
+ display: flex;
2450
+ align-items: center;
2451
+ gap: var(--space-xxs);
2452
+ flex-shrink: 0;
2453
+ height: 0;
2454
+ overflow: visible;
2455
+ opacity: 0;
2456
+ pointer-events: none;
2457
+ }
2458
+ .twm-tree-item:hover > .twm-tree-item__actions,
2459
+ .twm-tree-item:focus-within > .twm-tree-item__actions,
2460
+ .twm-tree-item.selected > .twm-tree-item__actions {
2461
+ opacity: 1;
2462
+ pointer-events: auto;
2463
+ }
2439
2464
  /* ═══════════════════════════════════════════════════════════════════════════
2440
2465
  Plot Popout Window
2441
2466
  ═══════════════════════════════════════════════════════════════════════════ */
@@ -2813,6 +2838,18 @@ body.twm-window-maximized .twm-resize-handle {
2813
2838
  border-radius: 50%;
2814
2839
  animation: computing-spin 0.8s linear infinite;
2815
2840
  }
2841
+ /* The keyframes the rule above names. A spinner rule shipped with the animation
2842
+ name and without the `@keyframes` block, which CSS does not report: an
2843
+ undefined name is simply no animation, so the ring was drawn and never
2844
+ turned, and nothing threw, logged or failed a build. `@keyframes` names are
2845
+ global, so this one is not scoped (see `spin`): an embedder that defines
2846
+ its own `computing-spin` wins or loses on source order, and either way the
2847
+ ring turns. A full turn at the rule's own duration, linear and infinite, so
2848
+ the loop has no seam: the arc is back where it started. */
2849
+ @keyframes computing-spin {
2850
+ from { transform: rotate(0deg); }
2851
+ to { transform: rotate(360deg); }
2852
+ }
2816
2853
  .twm-computing-status__message {
2817
2854
  font-size: var(--font-size-md);
2818
2855
  color: #b0b0b0;
@@ -2858,6 +2895,11 @@ body.twm-window-maximized .twm-resize-handle {
2858
2895
  flex-shrink: 0;
2859
2896
  animation: etl-spin 0.8s linear infinite;
2860
2897
  }
2898
+ /* The keyframes the rule above names; see `computing-spin`. */
2899
+ @keyframes etl-spin {
2900
+ from { transform: rotate(0deg); }
2901
+ to { transform: rotate(360deg); }
2902
+ }
2861
2903
  .twm-run-progress__message {
2862
2904
  font-size: var(--font-size-md);
2863
2905
  color: var(--text-primary, #ccc);
package/css/flexdesk.css CHANGED
@@ -1702,16 +1702,19 @@ body.twm-dt-col-resizing {
1702
1702
  * to the top bar does not include it. No z-index, so it is no stacking
1703
1703
  * context: the top bar's dropdowns draw over it, and the .twm-menubar inside
1704
1704
  * keeps its own styles, its menus (position: fixed, --z-over-windows) drawing
1705
- * over the page. Its height is the bar's plus the padding. */
1705
+ * over the page. It reads as a band of its own (STORY-0122, 0.17.14): darker
1706
+ * than the top bar, with a border above and below. Its height is the bar's
1707
+ * plus the padding and the two borders. */
1706
1708
  .twm-global-menu-bar {
1707
1709
  display: flex;
1708
1710
  align-items: center;
1709
1711
  width: 100%;
1710
1712
  box-sizing: border-box;
1711
1713
  padding: var(--space-xxs) var(--space-xs);
1712
- background-color: var(--surface-1);
1714
+ background-color: var(--surface-0);
1713
1715
  color: var(--text-body);
1714
- border-bottom: 1px solid var(--surface-0);
1716
+ border-top: 1px solid var(--border-strong);
1717
+ border-bottom: 1px solid var(--border-strong);
1715
1718
  overflow: visible; /* the bar's menus extend below */
1716
1719
  }
1717
1720
  .twm-bar-center {
@@ -2961,6 +2964,28 @@ body.twm-window-maximized .twm-resize-handle {
2961
2964
  color: var(--text-dim);
2962
2965
  margin-left: var(--space-xs);
2963
2966
  }
2967
+ /* Row actions (createTreeItem's `actions`, STORY-0121): one line at the row's
2968
+ * end, after label, subtitle and badge, shown on hover, on focus within and on
2969
+ * the selected item. Hidden by opacity, not display, so the buttons stay in
2970
+ * the tab order (Tab reaches them and :focus-within shows them) and the label
2971
+ * keeps its width on hover. The slot is no taller than the label line, so a
2972
+ * row is as high with actions as without. */
2973
+ .twm-tree-item__actions {
2974
+ display: flex;
2975
+ align-items: center;
2976
+ gap: var(--space-xxs);
2977
+ flex-shrink: 0;
2978
+ height: 0;
2979
+ overflow: visible;
2980
+ opacity: 0;
2981
+ pointer-events: none;
2982
+ }
2983
+ .twm-tree-item:hover > .twm-tree-item__actions,
2984
+ .twm-tree-item:focus-within > .twm-tree-item__actions,
2985
+ .twm-tree-item.selected > .twm-tree-item__actions {
2986
+ opacity: 1;
2987
+ pointer-events: auto;
2988
+ }
2964
2989
  /* ═══════════════════════════════════════════════════════════════════════════
2965
2990
  Plot Popout Window
2966
2991
  ═══════════════════════════════════════════════════════════════════════════ */
@@ -3338,6 +3363,18 @@ body.twm-window-maximized .twm-resize-handle {
3338
3363
  border-radius: 50%;
3339
3364
  animation: computing-spin 0.8s linear infinite;
3340
3365
  }
3366
+ /* The keyframes the rule above names. A spinner rule shipped with the animation
3367
+ name and without the `@keyframes` block, which CSS does not report: an
3368
+ undefined name is simply no animation, so the ring was drawn and never
3369
+ turned, and nothing threw, logged or failed a build. `@keyframes` names are
3370
+ global, so this one is not scoped (see `spin`): an embedder that defines
3371
+ its own `computing-spin` wins or loses on source order, and either way the
3372
+ ring turns. A full turn at the rule's own duration, linear and infinite, so
3373
+ the loop has no seam: the arc is back where it started. */
3374
+ @keyframes computing-spin {
3375
+ from { transform: rotate(0deg); }
3376
+ to { transform: rotate(360deg); }
3377
+ }
3341
3378
  .twm-computing-status__message {
3342
3379
  font-size: var(--font-size-md);
3343
3380
  color: #b0b0b0;
@@ -3383,6 +3420,11 @@ body.twm-window-maximized .twm-resize-handle {
3383
3420
  flex-shrink: 0;
3384
3421
  animation: etl-spin 0.8s linear infinite;
3385
3422
  }
3423
+ /* The keyframes the rule above names; see `computing-spin`. */
3424
+ @keyframes etl-spin {
3425
+ from { transform: rotate(0deg); }
3426
+ to { transform: rotate(360deg); }
3427
+ }
3386
3428
  .twm-run-progress__message {
3387
3429
  font-size: var(--font-size-md);
3388
3430
  color: var(--text-primary, #ccc);
@@ -8868,6 +8910,16 @@ tr:hover .twm-row-action { opacity: 1; }
8868
8910
  border-radius: 50%;
8869
8911
  animation: data-table__spin 0.7s linear infinite;
8870
8912
  }
8913
+ /* The keyframes the rule above names. Without them the name is no animation
8914
+ (CSS reports nothing for it), so the ring was drawn and stood still. A full
8915
+ turn at the rule's own 0.7s linear infinite. `@keyframes` names are global
8916
+ and cannot be scoped (see `spin`); a definition of the same name in an
8917
+ embedder's sheet wins or loses on source order, and either way the ring
8918
+ turns. */
8919
+ @keyframes data-table__spin {
8920
+ from { transform: rotate(0deg); }
8921
+ to { transform: rotate(360deg); }
8922
+ }
8871
8923
  .twm-data-table-component--compact .twm-pagination-controls > span {
8872
8924
  color: var(--ea-text-dim, #aaa) !important;
8873
8925
  font-size: 9.5px !important;
@@ -9045,6 +9097,11 @@ tr:hover .twm-row-action { opacity: 1; }
9045
9097
  border-radius: 50%;
9046
9098
  animation: twm-tile-loading-spin 0.7s linear infinite;
9047
9099
  }
9100
+ /* The keyframes the rule above names; see `data-table__spin`. */
9101
+ @keyframes twm-tile-loading-spin {
9102
+ from { transform: rotate(0deg); }
9103
+ to { transform: rotate(360deg); }
9104
+ }
9048
9105
  /* Merged home page — detail header row, then the project-setup body
9049
9106
  * fills the rest of the tile. */
9050
9107
  .twm-home-page {
package/css/overrides.css CHANGED
@@ -2118,6 +2118,16 @@ tr:hover .twm-row-action { opacity: 1; }
2118
2118
  border-radius: 50%;
2119
2119
  animation: data-table__spin 0.7s linear infinite;
2120
2120
  }
2121
+ /* The keyframes the rule above names. Without them the name is no animation
2122
+ (CSS reports nothing for it), so the ring was drawn and stood still. A full
2123
+ turn at the rule's own 0.7s linear infinite. `@keyframes` names are global
2124
+ and cannot be scoped (see `spin`); a definition of the same name in an
2125
+ embedder's sheet wins or loses on source order, and either way the ring
2126
+ turns. */
2127
+ @keyframes data-table__spin {
2128
+ from { transform: rotate(0deg); }
2129
+ to { transform: rotate(360deg); }
2130
+ }
2121
2131
  .twm-data-table-component--compact .twm-pagination-controls > span {
2122
2132
  color: var(--ea-text-dim, #aaa) !important;
2123
2133
  font-size: 9.5px !important;
@@ -2295,6 +2305,11 @@ tr:hover .twm-row-action { opacity: 1; }
2295
2305
  border-radius: 50%;
2296
2306
  animation: twm-tile-loading-spin 0.7s linear infinite;
2297
2307
  }
2308
+ /* The keyframes the rule above names; see `data-table__spin`. */
2309
+ @keyframes twm-tile-loading-spin {
2310
+ from { transform: rotate(0deg); }
2311
+ to { transform: rotate(360deg); }
2312
+ }
2298
2313
  /* Merged home page — detail header row, then the project-setup body
2299
2314
  * fills the rest of the tile. */
2300
2315
  .twm-home-page {
package/css/reset.css CHANGED
File without changes
package/dist/canvas.js CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/dist/core.js CHANGED
@@ -519,11 +519,8 @@ var DEFAULT_ALLOWED_DATASET_KEYS = Object.freeze([
519
519
  "node-name",
520
520
  "lang",
521
521
  "playback-control",
522
- // Simulation/scenario state keys
522
+ // Generic state words
523
523
  "status",
524
- "scenario-id",
525
- "run-id",
526
- "run-state",
527
524
  "selected",
528
525
  "active",
529
526
  "disabled",
@@ -539,13 +536,10 @@ var DEFAULT_ALLOWED_DATASET_KEYS = Object.freeze([
539
536
  "input-index",
540
537
  "output-index",
541
538
  "port-index",
542
- // Scenario editor keys
539
+ // Identifier and binding keys
543
540
  "source",
544
541
  "series-id",
545
542
  "dataset-id",
546
- "mirror-input-bound",
547
- "mirror-change-bound",
548
- "mirror-input",
549
543
  "bound",
550
544
  "field",
551
545
  "key",
@@ -554,14 +548,11 @@ var DEFAULT_ALLOWED_DATASET_KEYS = Object.freeze([
554
548
  "tab-id",
555
549
  "param-id",
556
550
  "target-id",
557
- "override-type",
558
551
  // Tree view component keys
559
552
  "item-id",
560
553
  "category-id",
561
- // Calibration page keys
562
- "info-for",
563
- "column",
564
554
  // Data page keys
555
+ "column",
565
556
  "readonly",
566
557
  "id",
567
558
  "action",
@@ -580,12 +571,6 @@ var DEFAULT_ALLOWED_DATASET_KEYS = Object.freeze([
580
571
  "label",
581
572
  "title",
582
573
  "description",
583
- // DSL generator keys
584
- "dsl-state",
585
- "dsl-section-registered",
586
- "dsl-scrollbars-installed",
587
- "dsl-tabs-bound",
588
- "dsl-controls-bound",
589
574
  // Inline highlighter keys
590
575
  "inline-hl",
591
576
  // Overlay scrollbar keys (UI-only, not state storage)