flexdesk 0.17.8 → 0.17.10

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 (283) hide show
  1. package/CHANGELOG.md +46 -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 +78 -56
  9. package/css/flexdesk.css +111 -89
  10. package/css/overrides.css +12 -12
  11. package/css/reset.css +0 -0
  12. package/css/tokens.css +11 -2
  13. package/dist/canvas.js +0 -0
  14. package/dist/canvas.js.map +0 -0
  15. package/dist/charts.js +7 -6
  16. package/dist/charts.js.map +2 -2
  17. package/dist/{chunk-EIYNF4BD.js → chunk-2YTM3GJE.js} +2 -2
  18. package/dist/chunk-2YTM3GJE.js.map +7 -0
  19. package/dist/chunk-3PHCPZHT.js +0 -0
  20. package/dist/chunk-3PHCPZHT.js.map +0 -0
  21. package/dist/{chunk-UURZ37SD.js → chunk-7U4IB65H.js} +27 -9
  22. package/dist/chunk-7U4IB65H.js.map +7 -0
  23. package/dist/{chunk-D3COLZZ2.js → chunk-BE2PU3LL.js} +2 -2
  24. package/dist/{chunk-D3COLZZ2.js.map → chunk-BE2PU3LL.js.map} +0 -0
  25. package/dist/chunk-CVMCZZX2.js +0 -0
  26. package/dist/chunk-CVMCZZX2.js.map +0 -0
  27. package/dist/{chunk-UWO43BZU.js → chunk-F35XSQWA.js} +16 -20
  28. package/dist/chunk-F35XSQWA.js.map +7 -0
  29. package/dist/chunk-FOOS3T5L.js +0 -0
  30. package/dist/chunk-FOOS3T5L.js.map +0 -0
  31. package/dist/chunk-GOQLR5WR.js +0 -0
  32. package/dist/chunk-GOQLR5WR.js.map +0 -0
  33. package/dist/chunk-HNU6MM2B.js +0 -0
  34. package/dist/chunk-HNU6MM2B.js.map +0 -0
  35. package/dist/chunk-JKZLNKG6.js +0 -0
  36. package/dist/chunk-JKZLNKG6.js.map +0 -0
  37. package/dist/chunk-JYWURG5T.js +0 -0
  38. package/dist/chunk-JYWURG5T.js.map +0 -0
  39. package/dist/{chunk-RKNFBX5K.js → chunk-MIW7D6WC.js} +16 -4
  40. package/dist/{chunk-RKNFBX5K.js.map → chunk-MIW7D6WC.js.map} +2 -2
  41. package/dist/chunk-N7HC3ADV.js +0 -0
  42. package/dist/chunk-N7HC3ADV.js.map +0 -0
  43. package/dist/{chunk-LWV23YVE.js → chunk-NIJEJAZ7.js} +42 -18
  44. package/dist/chunk-NIJEJAZ7.js.map +7 -0
  45. package/dist/{chunk-HYJYYEPK.js → chunk-REJ5HLIM.js} +2 -2
  46. package/dist/{chunk-HYJYYEPK.js.map → chunk-REJ5HLIM.js.map} +0 -0
  47. package/dist/{chunk-WVFGV5FT.js → chunk-WUFLGETN.js} +39 -2
  48. package/dist/{chunk-WVFGV5FT.js.map → chunk-WUFLGETN.js.map} +3 -3
  49. package/dist/core.js +0 -0
  50. package/dist/core.js.map +0 -0
  51. package/dist/editor.js +2 -2
  52. package/dist/editor.js.map +0 -0
  53. package/dist/flexdesk.css +111 -89
  54. package/dist/flow.js +3 -3
  55. package/dist/flow.js.map +0 -0
  56. package/dist/host.js +0 -0
  57. package/dist/host.js.map +0 -0
  58. package/dist/reset.css +0 -0
  59. package/dist/tile_registry-6WZPTUZV.js +0 -0
  60. package/dist/tile_registry-6WZPTUZV.js.map +0 -0
  61. package/dist/tiles.js +63 -20
  62. package/dist/tiles.js.map +2 -2
  63. package/dist/tokens.css +11 -2
  64. package/dist/widgets.js +6 -6
  65. package/dist/widgets.js.map +0 -0
  66. package/dist/wm.js +5 -5
  67. package/dist/wm.js.map +0 -0
  68. package/docs/README.md +0 -0
  69. package/docs/best-practices.md +0 -0
  70. package/docs/components/charts.md +29 -0
  71. package/docs/components/command-palette.md +0 -0
  72. package/docs/components/conversation.md +0 -0
  73. package/docs/components/data-table-grid.md +0 -0
  74. package/docs/components/data-table.md +0 -0
  75. package/docs/components/editor.md +0 -0
  76. package/docs/components/flow-canvas-editor.md +0 -0
  77. package/docs/components/flow-editors.md +0 -0
  78. package/docs/components/flow-lane-editor.md +0 -0
  79. package/docs/components/flow-outline-editor.md +0 -0
  80. package/docs/components/forms-and-dialogs.md +0 -0
  81. package/docs/components/input-fields.md +0 -0
  82. package/docs/components/keymap.md +0 -0
  83. package/docs/components/markdown-and-outline.md +0 -0
  84. package/docs/components/menus.md +41 -0
  85. package/docs/components/notifications.md +0 -0
  86. package/docs/components/panels-and-desktops.md +0 -0
  87. package/docs/components/record-list-and-fact-table.md +0 -0
  88. package/docs/components/settings-view.md +0 -0
  89. package/docs/components/shell.md +0 -0
  90. package/docs/components/slide-out-panel.md +0 -0
  91. package/docs/components/tiles.md +25 -0
  92. package/docs/components/wizard.md +0 -0
  93. package/docs/concepts/building-and-packaging.md +0 -0
  94. package/docs/concepts/domain-neutrality.md +0 -0
  95. package/docs/concepts/host-port.md +0 -0
  96. package/docs/concepts/packages-and-entry-points.md +0 -0
  97. package/docs/concepts/peer-dependencies.md +0 -0
  98. package/docs/concepts/state-guard.md +0 -0
  99. package/docs/concepts/styling.md +68 -0
  100. package/docs/quickstart.md +0 -0
  101. package/editor.js +0 -0
  102. package/flow.js +0 -0
  103. package/host.js +0 -0
  104. package/package.json +1 -1
  105. package/src/canvas/canvas_adapter.js +0 -0
  106. package/src/canvas/edge_router.js +0 -0
  107. package/src/canvas/graph/connector_router.js +0 -0
  108. package/src/canvas/graph/history_service.js +0 -0
  109. package/src/canvas/graph/node_platform.js +0 -0
  110. package/src/canvas/index.js +0 -0
  111. package/src/canvas/layered_layout.js +0 -0
  112. package/src/charts/chart_types.js +3 -2
  113. package/src/charts/data_series_plot_window.js +0 -0
  114. package/src/charts/downsample.js +0 -0
  115. package/src/charts/plot_config.js +0 -0
  116. package/src/charts/plot_config_editor.js +8 -2
  117. package/src/charts/plotly_wrapper.js +0 -0
  118. package/src/core/event_bus.js +0 -0
  119. package/src/core/logging.js +0 -0
  120. package/src/core/settings.js +0 -0
  121. package/src/core/state_guard.js +0 -0
  122. package/src/core/state_guard_config.js +0 -0
  123. package/src/core/state_machine.js +0 -0
  124. package/src/editor/editor_pane.js +0 -0
  125. package/src/editor/monaco_editor_factory.js +0 -0
  126. package/src/editor/monaco_loader.js +0 -0
  127. package/src/editor/notebook_search.js +0 -0
  128. package/src/editor/notebook_tab_bar.js +26 -7
  129. package/src/editor/notebook_undo_manager.js +0 -0
  130. package/src/editor/split_pane_container.js +0 -0
  131. package/src/flow/canvas_editor/connections.js +0 -0
  132. package/src/flow/canvas_editor/editor.js +0 -0
  133. package/src/flow/canvas_editor/index.js +0 -0
  134. package/src/flow/canvas_editor/layout.js +0 -0
  135. package/src/flow/canvas_editor/strings.js +0 -0
  136. package/src/flow/kit/always_before.js +0 -0
  137. package/src/flow/kit/catalogue.js +0 -0
  138. package/src/flow/kit/chip_input.js +0 -0
  139. package/src/flow/kit/dom.js +0 -0
  140. package/src/flow/kit/findings.js +0 -0
  141. package/src/flow/kit/history.js +0 -0
  142. package/src/flow/kit/index.js +0 -0
  143. package/src/flow/kit/keys.js +0 -0
  144. package/src/flow/kit/logic_graph.js +0 -0
  145. package/src/flow/kit/references.js +0 -0
  146. package/src/flow/kit/settings_panel.js +0 -0
  147. package/src/flow/kit/settings_schema.js +0 -0
  148. package/src/flow/kit/step_picker.js +0 -0
  149. package/src/flow/kit/strings.js +0 -0
  150. package/src/flow/kit/value_picker.js +0 -0
  151. package/src/flow/kit/widgets.js +0 -0
  152. package/src/flow/lanes/editor.js +0 -0
  153. package/src/flow/lanes/index.js +0 -0
  154. package/src/flow/lanes/layout.js +0 -0
  155. package/src/flow/lanes/pipeline.js +0 -0
  156. package/src/flow/lanes/preview.js +0 -0
  157. package/src/flow/lanes/strings.js +0 -0
  158. package/src/flow/outline/editor.js +0 -0
  159. package/src/flow/outline/index.js +0 -0
  160. package/src/flow/outline/mapping.js +0 -0
  161. package/src/flow/outline/menu.js +0 -0
  162. package/src/flow/outline/operations.js +0 -0
  163. package/src/flow/outline/recognise.js +0 -0
  164. package/src/flow/outline/strings.js +0 -0
  165. package/src/help/help_modal.js +0 -0
  166. package/src/help/help_registry.js +0 -0
  167. package/src/host/external_links.js +0 -0
  168. package/src/host/file_picker.js +0 -0
  169. package/src/host/host.js +0 -0
  170. package/src/host/photino_host.js +0 -0
  171. package/src/host/photino_host.md +0 -0
  172. package/src/host/pywebview_host.js +0 -0
  173. package/src/tiles/chart_tiles.js +0 -0
  174. package/src/tiles/config_schema.js +0 -0
  175. package/src/tiles/figure_tile.js +0 -0
  176. package/src/tiles/layout_persistence.js +0 -0
  177. package/src/tiles/list_tiles.js +0 -0
  178. package/src/tiles/scope_picker.js +0 -0
  179. package/src/tiles/tile_base.js +67 -16
  180. package/src/tiles/tile_config_form.js +0 -0
  181. package/src/tiles/tile_grid.js +0 -0
  182. package/src/tiles/tile_registry.js +0 -0
  183. package/src/tiling/bottom_panel_tabs.js +0 -0
  184. package/src/tiling/command_palette.js +0 -0
  185. package/src/tiling/content_registry.js +0 -0
  186. package/src/tiling/desktops.js +0 -0
  187. package/src/tiling/entity_sources.js +0 -0
  188. package/src/tiling/keymap.js +0 -0
  189. package/src/tiling/kind_taxonomy.js +0 -0
  190. package/src/tiling/landing_table.js +0 -0
  191. package/src/tiling/loading_overlay.js +0 -0
  192. package/src/tiling/nav_panel.js +0 -0
  193. package/src/tiling/page_factory.js +0 -0
  194. package/src/tiling/panel_availability.js +0 -0
  195. package/src/tiling/panel_keys.js +0 -0
  196. package/src/tiling/shell.js +0 -0
  197. package/src/tiling/tab_strip.js +0 -0
  198. package/src/tiling/tile_breadcrumb.js +0 -0
  199. package/src/tiling/tile_renderer.js +0 -0
  200. package/src/tiling/tile_tab_menu.js +0 -0
  201. package/src/tiling/tile_tree.js +0 -0
  202. package/src/tiling/wm.js +0 -0
  203. package/src/tiling/zoom.js +0 -0
  204. package/src/ui/base/component_base.js +0 -0
  205. package/src/ui/base/controller_base.js +0 -0
  206. package/src/ui/base/page_base.js +0 -0
  207. package/src/ui/components/about_dialog.js +0 -0
  208. package/src/ui/components/action_dropdown.js +19 -6
  209. package/src/ui/components/alert_log.js +0 -0
  210. package/src/ui/components/alerts_pane.js +0 -0
  211. package/src/ui/components/attribute_list_editor.js +0 -0
  212. package/src/ui/components/autocomplete_field.js +0 -0
  213. package/src/ui/components/cell_editor_host.js +0 -0
  214. package/src/ui/components/cell_editors.js +0 -0
  215. package/src/ui/components/cell_grid.js +0 -0
  216. package/src/ui/components/cell_paste.js +0 -0
  217. package/src/ui/components/cell_selection.js +0 -0
  218. package/src/ui/components/choice_controls.js +0 -0
  219. package/src/ui/components/color_field.js +0 -0
  220. package/src/ui/components/color_list_field.js +0 -0
  221. package/src/ui/components/column_fit.js +0 -0
  222. package/src/ui/components/column_groups.js +0 -0
  223. package/src/ui/components/column_order.js +0 -0
  224. package/src/ui/components/computing_status_window.js +0 -0
  225. package/src/ui/components/confirm_dialog.js +0 -0
  226. package/src/ui/components/context_menu.js +20 -20
  227. package/src/ui/components/conversation_view.js +0 -0
  228. package/src/ui/components/crosstab.js +0 -0
  229. package/src/ui/components/data_table.js +45 -19
  230. package/src/ui/components/detail_header.js +0 -0
  231. package/src/ui/components/document_outline.js +0 -0
  232. package/src/ui/components/drag_reorder.js +0 -0
  233. package/src/ui/components/fact_table.js +0 -0
  234. package/src/ui/components/fill_handle.js +0 -0
  235. package/src/ui/components/gallery_picker.js +0 -0
  236. package/src/ui/components/header_actions.js +0 -0
  237. package/src/ui/components/inline_renamer.js +0 -0
  238. package/src/ui/components/job_progress.js +0 -0
  239. package/src/ui/components/managed_window.js +0 -0
  240. package/src/ui/components/menu_bar.js +0 -0
  241. package/src/ui/components/modal.js +0 -0
  242. package/src/ui/components/notification_history.js +0 -0
  243. package/src/ui/components/progress.js +0 -0
  244. package/src/ui/components/record_list.js +0 -0
  245. package/src/ui/components/row_activation.js +0 -0
  246. package/src/ui/components/section_stack.js +0 -0
  247. package/src/ui/components/series.js +0 -0
  248. package/src/ui/components/settings_view.js +0 -0
  249. package/src/ui/components/slide_out_panel.js +0 -0
  250. package/src/ui/components/slider_field.js +0 -0
  251. package/src/ui/components/sortable_list.js +0 -0
  252. package/src/ui/components/staged_edits.js +0 -0
  253. package/src/ui/components/staged_history.js +0 -0
  254. package/src/ui/components/table_filter_chips.js +0 -0
  255. package/src/ui/components/table_state_store.js +0 -0
  256. package/src/ui/components/table_structure.js +0 -0
  257. package/src/ui/components/table_values.js +0 -0
  258. package/src/ui/components/tabs.js +0 -0
  259. package/src/ui/components/tag_input.js +0 -0
  260. package/src/ui/components/toast.js +0 -0
  261. package/src/ui/components/toggle_field.js +0 -0
  262. package/src/ui/components/tree_view.js +0 -0
  263. package/src/ui/components/tsv.js +0 -0
  264. package/src/ui/components/window_taskbar.js +0 -0
  265. package/src/ui/components/wizard.js +0 -0
  266. package/src/ui/controllers/window_chrome_controller.js +0 -0
  267. package/src/ui/notification_center.js +0 -0
  268. package/src/ui/utils/auto_scrollbars.js +0 -0
  269. package/src/ui/utils/markdown.js +0 -0
  270. package/src/ui/utils/menu_viewport.js +81 -0
  271. package/src/ui/utils/native_context_menu.js +0 -0
  272. package/src/ui/utils/overlay_scrollbar.js +0 -0
  273. package/src/ui/utils/raf_resize_observer.js +0 -0
  274. package/src/ui/utils/scroll_lock.js +0 -0
  275. package/src/ui/utils/strip_scroll.js +0 -0
  276. package/src/ui/utils/tooltip_service.js +0 -0
  277. package/tiles.js +0 -0
  278. package/widgets.js +0 -0
  279. package/wm.js +0 -0
  280. package/dist/chunk-EIYNF4BD.js.map +0 -7
  281. package/dist/chunk-LWV23YVE.js.map +0 -7
  282. package/dist/chunk-UURZ37SD.js.map +0 -7
  283. package/dist/chunk-UWO43BZU.js.map +0 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,51 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.17.10 (2026-10-25)
4
+
5
+ A patch release: everything below is additive. Every fix is documented in a
6
+ section of the docs headed "(0.17.10)"; each entry links to it.
7
+
8
+ ### Added and changed
9
+
10
+ - [Retheming the accent](docs/concepts/styling.md#retheming-the-accent-01710): the accent colours in flexdesk.css that were the literal `#007acc` (`rgb(0, 122, 204)`), its tints, and the light accent `#569cd6` / `#6eb3e9` are now derived from `--accent-bright`, so setting `--accent`, `--accent-hover` and `--accent-bright` on `:root` rethemes all of them. In tokens.css, `--state-selected` and `--shadow-glow` are now mixes of `--accent-bright` (the same colours as before), and three tokens are new: `--twm-dt-new-bg` (the colour a DataTable row or cell that has just arrived flashes from, which the stylesheet read before with an `rgba(0, 122, 204, 0.22)` fallback but nothing defined), `--accent-light` (about `#4da2db`, replacing `#569cd6`) and `--accent-lighter` (about `#73b6e3`, replacing `#6eb3e9`). The `rgba(0, 122, 204, a)` tints are now `color-mix(in srgb, var(--accent-bright) a%, transparent)`, with the same colour by default: the DataTable's selected rows and cells, the filter chip when on, the autocomplete's namespace pill and active item, `.add-widget-btn`, `.tile.resizing`, `.tile-ghost`, the focused leaf's inset shadow, the document outline's active link, the canvas marquee and the flow graph's port dots. The SliderField thumb, the SortableList drop line, add button and input focus, the DataTable filter inputs' focus border and the notebook autocomplete's border read `--accent-light`, and the active thumb `--accent-lighter`; since `#569cd6` cannot be mixed exactly from `#007acc`, these move to the nearest mix with white, a difference of about 1.5 to 1.7 ΔE (OKLab × 100). `var(--accent-bright, …)`, `var(--state-selected, …)`, `var(--ea-accent, …)` and `var(--accent, …)` no longer carry fallbacks, so no computed colour changes but flexdesk.css now needs tokens.css (or your own definitions of these tokens). Accent blues in other shades that no mix of an accent token gives exactly stay literals (BUG-0044).
11
+
12
+ ### Removed or renamed exports
13
+
14
+ None. Compared with 0.17.9, across every entry point (`core`, `widgets`, `wm`,
15
+ `host`, `canvas`, `flow`, `charts`, `tiles`, `editor`) and the package
16
+ `exports` map, no export was added, removed or renamed. Not an export but
17
+ worth knowing: tokens.css defines three new custom properties,
18
+ `--accent-light`, `--accent-lighter` and `--twm-dt-new-bg`, and derives
19
+ `--state-selected` and `--shadow-glow` from `--accent-bright`; flexdesk.css
20
+ reads the accent tokens without fallbacks, so it needs tokens.css; and the
21
+ SliderField thumb is about `#4da2db` (was `#569cd6`) and its active state
22
+ about `#73b6e3` (was `#6eb3e9`) (see above).
23
+
24
+ ## 0.17.9 (2026-10-25)
25
+
26
+ A patch release: everything below is additive. Every fix is documented in a
27
+ section of the docs headed "(0.17.9)"; each entry links to it.
28
+
29
+ ### Added and changed
30
+
31
+ - [Context menus stay inside the window](docs/components/menus.md#context-menus-stay-inside-the-window-0179): `showContextMenu(x, y, items, onAction)`, the DataTable's right-click menu and `NotebookTabBar`'s tab menu are placed the same way, however many items they hold. A menu is capped at the window's height less 8px above and below and scrolls inside when it is longer (flexdesk.css gives `.twm-context-menu` and `.nb-context-menu` `overflow-y: auto` and `box-sizing: border-box`); it opens with its top-left corner at the pointer and moves left or up only as far as it must to fit, never past the window's top or left edge. Before, a menu had no cap: the DataTable's opened above the window's top edge and `showContextMenu`'s ran off the bottom, so the items past the edge could not be reached. All three now take focus on the first enabled item, move it with Up/Down (wrapping), Home and End, scrolling the focused item into view, choose with Enter or Space, close with Escape and give focus back when they close (before, only `showContextMenu` did); scrolling the menu itself does not close it. Nothing changes in how you call them (BUG-0040).
32
+ - [The plot config editor writes no stray "null"](docs/components/charts.md#the-plot-config-editor-writes-no-stray-null-0179): `renderPlotConfigEditor` appended the sections a subplot does not have as `null`, which `Element.append()` writes as the text `null`, so every 2D subplot showed a `null` line where a 3D chart's **Z axis** goes, and an editor without `seriesTransforms` showed another where **Derived series** goes. A section the subplot does not have is now left out; nothing else about the editor changed (BUG-0041).
33
+ - [Interpolation `'auto'` is a listed choice](docs/components/charts.md#interpolation-auto-is-a-listed-choice-0179): a subplot's `interpolation` is `'linear'`, `'step'`, `'cubic'` or `'auto'`, and `'auto'` draws straight segments exactly as `'linear'` does (`buildTrace` gives both the Plotly line shape `linear`, as it always has). `renderPlotConfigEditor`'s **Interpolation** select now offers **Auto**, **Linear**, **Step** and **Cubic spline**, so a subplot saved with `'auto'` opens with Auto chosen instead of `auto (not found)` and keeps `'auto'` until another value is picked. A new subplot is still `'linear'`, and every value draws as before (BUG-0042).
34
+ - [Action dropdowns: positioning against the end edge](docs/components/menus.md#action-dropdowns-positioning-against-the-end-edge-0179): `ActionDropdown.position(trigger, menu, { align })` takes an optional third argument. `align: 'start'` (the default, and what it did before) lines the menu up with the trigger's left edge first, `'end'` with its right edge; either flips to the other edge when the menu would leave the window (BUG-0043).
35
+ - [A tile's ⋯ menu is drawn over the page](docs/components/tiles.md#the--menu-is-drawn-over-the-page-0179): a tile's **More actions** menu (`.tile-menu-dropdown`) is no longer drawn inside the tile. While it is open it is moved to `document.body` (or to the open modal's host, as `showContextMenu` does), placed with `ActionDropdown.position(button, menu, { align: 'end' })` as `position: fixed` on `--z-over-windows`, so neighbouring tiles and the managed window a grid sits in no longer clip it, and it stays 8px inside the window, opening under the button when it fits there, else above it when it fits there, else on the side with more room, scrolling inside. Choosing an entry, a press outside it or the ⋯ button again closes it and puts it back in the tile's header; `dispose()` closes an open menu first. Until 0.17.8 the menu was `position: absolute` inside the tile, so in a tile narrower than about 220px its left part and its labels were cut off (BUG-0043).
36
+
37
+ ### Removed or renamed exports
38
+
39
+ None. Compared with 0.17.8, across every entry point (`core`, `widgets`, `wm`,
40
+ `host`, `canvas`, `flow`, `charts`, `tiles`, `editor`) and the package
41
+ `exports` map, no export was added, removed or renamed. Not an export but
42
+ worth knowing: `ActionDropdown.position` takes an optional third argument,
43
+ `{ align }`; `renderPlotConfigEditor` lists `'auto'` among the interpolations;
44
+ an open tile ⋯ menu lives outside `tile.element` until it closes; and
45
+ flexdesk.css caps `.twm-context-menu` and `.nb-context-menu` at the window's
46
+ height with `overflow-y: auto`, and draws `.tile-menu-dropdown` on
47
+ `--z-over-windows` (see above).
48
+
3
49
  ## 0.17.8 (2026-10-24)
4
50
 
5
51
  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
@@ -731,7 +731,7 @@ body.twm-dt-col-resizing {
731
731
  /* `activeRow` — the row that is OPEN. A left edge, not a background: hover
732
732
  * and selection keep theirs. */
733
733
  .twm-preview-table tbody tr.twm-dt-row--active > td:first-child {
734
- box-shadow: inset 2px 0 0 0 var(--accent-bright, #007acc);
734
+ box-shadow: inset 2px 0 0 0 var(--accent-bright);
735
735
  }
736
736
  /* `rowIcon` — drawn from `data-twm-icon` so the icon's NAME is not cell
737
737
  * text (not in a copy, not in the clipped-cell tooltip). The span carries the
@@ -878,7 +878,7 @@ body.twm-dt-col-resizing {
878
878
  }
879
879
  .twm-preview-table td .twm-dt-detail-toggle:focus-visible {
880
880
  opacity: 1;
881
- outline: 1px solid var(--accent-bright, #007acc);
881
+ outline: 1px solid var(--accent-bright);
882
882
  }
883
883
  /* The detail's row: one cell across every column. It is often the body's
884
884
  * FIRST cell of its row, so the time column's rules reach it (see the note
@@ -911,7 +911,7 @@ body.twm-dt-col-resizing {
911
911
  }
912
912
  /* `follow` / `refresh()` — a row the last answer did not have, for a moment. */
913
913
  @keyframes twm-dt-row-new {
914
- from { background: var(--twm-dt-new-bg, rgba(0, 122, 204, 0.22)); }
914
+ from { background: var(--twm-dt-new-bg); }
915
915
  to { background: transparent; }
916
916
  }
917
917
  .twm-preview-table tbody tr.twm-dt-row--new > td {
@@ -955,11 +955,11 @@ body.twm-dt-col-resizing {
955
955
  background: rgba(255, 255, 255, 0.06);
956
956
  }
957
957
  .twm-dt-filter-chip:focus-visible {
958
- outline: 1px solid var(--accent-bright, #007acc);
958
+ outline: 1px solid var(--accent-bright);
959
959
  }
960
960
  .twm-dt-filter-chip.twm-dt-filter-chip--on {
961
- border-color: var(--accent-bright, #007acc);
962
- background: rgba(0, 122, 204, 0.18);
961
+ border-color: var(--accent-bright);
962
+ background: color-mix(in srgb, var(--accent-bright) 18%, transparent);
963
963
  color: #ddd;
964
964
  }
965
965
  .twm-dt-filter-chip.twm-dt-filter-chip--empty {
@@ -1029,14 +1029,14 @@ body.twm-dt-col-resizing {
1029
1029
  width: 16px;
1030
1030
  height: 16px;
1031
1031
  border-radius: 50%;
1032
- background: #569cd6;
1032
+ background: var(--accent-light);
1033
1033
  margin-top: -5px;
1034
1034
  cursor: grab;
1035
1035
  border: 2px solid var(--surface-0);
1036
1036
  }
1037
1037
  .twm-slider-field__input::-webkit-slider-thumb:active {
1038
1038
  cursor: grabbing;
1039
- background: #6eb3e9;
1039
+ background: var(--accent-lighter);
1040
1040
  }
1041
1041
  .twm-slider-field__input::-moz-range-track {
1042
1042
  height: 6px;
@@ -1048,7 +1048,7 @@ body.twm-dt-col-resizing {
1048
1048
  width: 16px;
1049
1049
  height: 16px;
1050
1050
  border-radius: 50%;
1051
- background: #569cd6;
1051
+ background: var(--accent-light);
1052
1052
  cursor: grab;
1053
1053
  border: 2px solid var(--surface-0);
1054
1054
  }
@@ -1171,7 +1171,7 @@ body.twm-dt-col-resizing {
1171
1171
  .twm-sortable-list__drop {
1172
1172
  height: 2px;
1173
1173
  margin: 1px 0;
1174
- background: #569cd6;
1174
+ background: var(--accent-light);
1175
1175
  pointer-events: none;
1176
1176
  }
1177
1177
  .twm-sortable-list__content {
@@ -1218,12 +1218,12 @@ body.twm-dt-col-resizing {
1218
1218
  margin-top: var(--space-md);
1219
1219
  }
1220
1220
  .twm-sortable-list__add:hover {
1221
- border-color: #569cd6;
1222
- color: #569cd6;
1223
- background: rgba(86, 156, 214, 0.12);
1221
+ border-color: var(--accent-light);
1222
+ color: var(--accent-light);
1223
+ background: color-mix(in srgb, var(--accent-light) 12%, transparent);
1224
1224
  }
1225
1225
  .twm-sortable-list__add:active {
1226
- background: rgba(86, 156, 214, 0.2);
1226
+ background: color-mix(in srgb, var(--accent-light) 20%, transparent);
1227
1227
  }
1228
1228
  .twm-sortable-list__empty {
1229
1229
  padding: var(--space-xl);
@@ -1248,7 +1248,7 @@ body.twm-dt-col-resizing {
1248
1248
  }
1249
1249
  .twm-sortable-list__input:focus {
1250
1250
  outline: none;
1251
- border-color: #569cd6;
1251
+ border-color: var(--accent-light);
1252
1252
  }
1253
1253
  /* Global Top Bar (fixed at top) */
1254
1254
  .twm-global-top-bar {
@@ -1698,19 +1698,19 @@ body.twm-dt-col-resizing {
1698
1698
  padding: var(--space-xxs) 8px;
1699
1699
  font-size: var(--font-size-xs);
1700
1700
  color: #c7f1ff;
1701
- background: rgba(0, 122, 204, 0.18);
1702
- border: 1px solid rgba(0, 122, 204, 0.35);
1701
+ background: color-mix(in srgb, var(--accent-bright) 18%, transparent);
1702
+ border: 1px solid color-mix(in srgb, var(--accent-bright) 35%, transparent);
1703
1703
  border-radius: var(--radius-pill);
1704
1704
  white-space: nowrap;
1705
1705
  text-transform: none;
1706
1706
  cursor: default;
1707
- box-shadow: inset 0 0 0 1px rgba(0, 122, 204, 0.15);
1707
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent-bright) 15%, transparent);
1708
1708
  }
1709
1709
  .twm-autocomplete-field__namespace--toggle {
1710
1710
  cursor: pointer;
1711
- background: linear-gradient(90deg, rgba(0, 122, 204, 0.24) 0%, rgba(0, 122, 204, 0.12) 100%);
1711
+ background: linear-gradient(90deg, color-mix(in srgb, var(--accent-bright) 24%, transparent) 0%, color-mix(in srgb, var(--accent-bright) 12%, transparent) 100%);
1712
1712
  transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
1713
- border: 1px solid rgba(0, 122, 204, 0.5);
1713
+ border: 1px solid color-mix(in srgb, var(--accent-bright) 50%, transparent);
1714
1714
  color: #e7f5ff;
1715
1715
  outline: none;
1716
1716
  }
@@ -2063,7 +2063,7 @@ body.twm-window-maximized .twm-resize-handle {
2063
2063
  box-sizing: border-box;
2064
2064
  }
2065
2065
  .twm-data-table__filter-input:focus {
2066
- border-color: #569cd6;
2066
+ border-color: var(--accent-light);
2067
2067
  background: #252525;
2068
2068
  }
2069
2069
  .twm-data-table__filter-input::placeholder {
@@ -2124,7 +2124,7 @@ body.twm-window-maximized .twm-resize-handle {
2124
2124
  }
2125
2125
  .twm-data-table__filter-dropdown-select:focus,
2126
2126
  .twm-data-table__filter-dropdown-input:focus {
2127
- border-color: #569cd6;
2127
+ border-color: var(--accent-light);
2128
2128
  }
2129
2129
  .twm-data-table__filter-dropdown-select {
2130
2130
  appearance: auto;
@@ -3223,14 +3223,14 @@ body.twm-window-maximized .twm-resize-handle {
3223
3223
  /* Add Widget is the toolbar's one primary verb, so it is the one that carries
3224
3224
  the accent. */
3225
3225
  .add-widget-btn {
3226
- background: rgba(0, 122, 204, 0.15);
3227
- border-color: rgba(0, 122, 204, 0.3);
3226
+ background: color-mix(in srgb, var(--accent-bright) 15%, transparent);
3227
+ border-color: color-mix(in srgb, var(--accent-bright) 30%, transparent);
3228
3228
  color: var(--text-bright);
3229
3229
  }
3230
3230
 
3231
3231
  .add-widget-btn:hover {
3232
- background: rgba(0, 122, 204, 0.25);
3233
- border-color: rgba(0, 122, 204, 0.5);
3232
+ background: color-mix(in srgb, var(--accent-bright) 25%, transparent);
3233
+ border-color: color-mix(in srgb, var(--accent-bright) 50%, transparent);
3234
3234
  }
3235
3235
 
3236
3236
  /* The other two are secondary — Export is an aside and Reset Layout throws the
@@ -3279,13 +3279,15 @@ body.twm-window-maximized .twm-resize-handle {
3279
3279
  .tile.resizing {
3280
3280
  z-index: var(--z-dropdown);
3281
3281
  border-color: var(--accent-bright);
3282
- box-shadow: 0 0 0 2px rgba(0, 122, 204, 0.3);
3282
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent-bright) 30%, transparent);
3283
3283
  }
3284
3284
 
3285
3285
  /* Selected — set by `_onConfigClick()` while the config dialog is open, and
3286
- cleared from every sibling by the same handler. #78b9ff is a literal
3287
- because there is no light-accent token: `--accent-bright` is #007acc, which
3288
- is a border colour on this background and not a text one. */
3286
+ cleared from every sibling by the same handler. #78b9ff is a literal:
3287
+ `--accent-bright` is #007acc, which is a border colour on this background
3288
+ and not a text one, and the derived light accents (`--accent-light`,
3289
+ `--accent-lighter`) are less blue than this, so using them would change
3290
+ the colour. */
3289
3291
  .tile.tile--selected {
3290
3292
  border-color: #78b9ff;
3291
3293
  box-shadow: 0 0 0 2px rgba(120, 185, 255, 0.3), var(--shadow-md);
@@ -3434,11 +3436,14 @@ body.twm-window-maximized .twm-resize-handle {
3434
3436
  position: relative;
3435
3437
  }
3436
3438
 
3439
+ /* While open the menu is moved to document.body and placed `position: fixed`
3440
+ by `ActionDropdown.position` (inline styles), so a narrow tile cannot clip
3441
+ it; --z-over-windows keeps it over a managed window holding the grid. */
3437
3442
  .tile-menu-dropdown {
3438
3443
  position: absolute;
3439
3444
  top: 100%;
3440
3445
  right: 0;
3441
- z-index: var(--z-dropdown);
3446
+ z-index: var(--z-over-windows);
3442
3447
  min-width: 180px;
3443
3448
  padding: var(--space-xs) 0;
3444
3449
  background: var(--surface-2);
@@ -3553,8 +3558,8 @@ body.twm-window-maximized .twm-resize-handle {
3553
3558
  /* The drop preview, positioned by `_updateGhost()` in grid coordinates. */
3554
3559
  .tile-ghost {
3555
3560
  position: absolute;
3556
- background: rgba(0, 122, 204, 0.15);
3557
- border: 2px dashed rgba(0, 122, 204, 0.5);
3561
+ background: color-mix(in srgb, var(--accent-bright) 15%, transparent);
3562
+ border: 2px dashed color-mix(in srgb, var(--accent-bright) 50%, transparent);
3558
3563
  border-radius: var(--radius-sm);
3559
3564
  pointer-events: none;
3560
3565
  z-index: 50;
@@ -4674,12 +4679,12 @@ button.twm-about-dialog__btn--close:focus {
4674
4679
  /* ─── Autocomplete field — notebook variant ──────────────── */
4675
4680
 
4676
4681
  .twm-autocomplete-field--notebook .twm-autocomplete-field__input-wrapper {
4677
- border: 1px solid #569cd6;
4682
+ border: 1px solid var(--accent-light);
4678
4683
  font-size: var(--font-size-sm);
4679
4684
  }
4680
4685
  .twm-autocomplete-field--notebook .twm-autocomplete-field__input-wrapper:focus-within {
4681
4686
  border-color: #79b8f8;
4682
- box-shadow: 0 0 3px rgba(86, 156, 214, 0.3);
4687
+ box-shadow: 0 0 3px color-mix(in srgb, var(--accent-light) 30%, transparent);
4683
4688
  }
4684
4689
  .twm-autocomplete-field--notebook .twm-autocomplete-field__input {
4685
4690
  font-family: 'Courier New', Courier, monospace;
@@ -4864,7 +4869,7 @@ button.twm-about-dialog__btn--close:focus {
4864
4869
  second keeps the readonly tables, which hover never claimed, working. */
4865
4870
  .twm-preview-table:not(.twm-preview-table--readonly) tbody tr.selected td,
4866
4871
  .twm-preview-table tbody tr.selected td {
4867
- background: var(--state-selected, rgba(0, 122, 204, 0.15));
4872
+ background: var(--state-selected);
4868
4873
  }
4869
4874
 
4870
4875
  padding: 0;
@@ -4912,8 +4917,8 @@ button.twm-about-dialog__btn--close:focus {
4912
4917
  is the keyboard's, and it is deliberately the stronger of the two so that
4913
4918
  moving the pointer across the list does not hide where the cursor is. */
4914
4919
  .twm-autocomplete-field__item.active {
4915
- background-color: var(--state-selected, rgba(0, 122, 204, 0.15));
4916
- box-shadow: inset 2px 0 0 var(--accent-bright, #007acc);
4920
+ background-color: var(--state-selected);
4921
+ box-shadow: inset 2px 0 0 var(--accent-bright);
4917
4922
  }
4918
4923
 
4919
4924
  /* A `<button role="menuitem">`, not a div — that is what makes the menu
@@ -5446,7 +5451,7 @@ button.twm-about-dialog__btn--close:focus {
5446
5451
  inset: 0 0 auto 0;
5447
5452
  height: 2px;
5448
5453
  pointer-events: none;
5449
- background: var(--accent-bright, #1683c4);
5454
+ background: var(--accent-bright);
5450
5455
  }
5451
5456
 
5452
5457
  /* A PREVIEW tab — opened by a single click and replaced by the next one.
@@ -5503,7 +5508,7 @@ button.twm-about-dialog__btn--close:focus {
5503
5508
  flex: 0 0 auto;
5504
5509
  font-size: 9px;
5505
5510
  line-height: 1;
5506
- color: var(--accent-bright, #1683c4);
5511
+ color: var(--accent-bright);
5507
5512
  }
5508
5513
 
5509
5514
  .notebook-tabs .twm-tab-close {
@@ -5545,7 +5550,7 @@ button.twm-about-dialog__btn--close:focus {
5545
5550
  flex: 0 0 auto;
5546
5551
  align-self: stretch;
5547
5552
  width: 2px;
5548
- background: var(--accent-bright, #1683c4);
5553
+ background: var(--accent-bright);
5549
5554
  pointer-events: none;
5550
5555
  }
5551
5556
 
@@ -5573,8 +5578,8 @@ button.twm-about-dialog__btn--close:focus {
5573
5578
  * stylesheet, so nothing here is in its scope at all. */
5574
5579
  .notebook-tabs--drop-target,
5575
5580
  .notebook-editor-container--drop-target {
5576
- background: color-mix(in srgb, var(--accent-bright, #1683c4) 18%, transparent);
5577
- box-shadow: inset 0 0 0 1px var(--accent-bright, #1683c4);
5581
+ background: color-mix(in srgb, var(--accent-bright) 18%, transparent);
5582
+ box-shadow: inset 0 0 0 1px var(--accent-bright);
5578
5583
  }
5579
5584
 
5580
5585
  /* ── The tab bar's own context menu ──────────────────────────────────
@@ -5604,6 +5609,23 @@ button.twm-about-dialog__btn--close:focus {
5604
5609
 
5605
5610
  .nb-context-menu.visible { opacity: 1; }
5606
5611
 
5612
+ /* ── Context menus stay inside the window (0.17.9, BUG-0040) ─────────
5613
+ * `showContextMenu`, the DataTable's right-click menu and NotebookTabBar's tab
5614
+ * menu are placed by src/ui/utils/menu_viewport.js, which sets an inline
5615
+ * max-height of the window's height less a margin top and bottom. Here: the
5616
+ * same cap for a menu placed before that runs, border-box so the cap includes
5617
+ * padding and border, and scrolling inside when the items are longer — they
5618
+ * had no max-height and no overflow, so a 100-item menu ran off the window and
5619
+ * its far items could not be reached. */
5620
+ .twm-context-menu,
5621
+ .nb-context-menu {
5622
+ box-sizing: border-box;
5623
+ max-height: calc(100vh - 2 * var(--space-md));
5624
+ overflow-x: hidden;
5625
+ overflow-y: auto;
5626
+ overscroll-behavior: contain;
5627
+ }
5628
+
5607
5629
  .nb-context-menu__item {
5608
5630
  display: flex;
5609
5631
  align-items: center;
@@ -5705,7 +5727,7 @@ button.twm-about-dialog__btn--close:focus {
5705
5727
  }
5706
5728
  .split-pane-divider:hover,
5707
5729
  .split-pane-divider--active {
5708
- background: var(--accent-bright, #1683c4);
5730
+ background: var(--accent-bright);
5709
5731
  }
5710
5732
  /* A pane is its tab bar over its body. The tab bar's own rule says
5711
5733
  * `height: 100%` (it fills a tile's strip); here it is a fixed 26px row, the
@@ -5728,7 +5750,7 @@ button.twm-about-dialog__btn--close:focus {
5728
5750
  * `setPanes()`, which is why `SplitPaneContainer` ADDS `.split-pane` to a
5729
5751
  * pane instead of replacing its classes with it. */
5730
5752
  .split-pane-container--split .editor-pane--focused > .tabs.notebook-tabs {
5731
- box-shadow: inset 0 -1px 0 var(--accent-bright, #1683c4);
5753
+ box-shadow: inset 0 -1px 0 var(--accent-bright);
5732
5754
  }
5733
5755
  /* The body is the positioning anchor; the editor container fills it
5734
5756
  * absolutely, so its height is the body's whatever its content is and the
@@ -5791,7 +5813,7 @@ button.twm-about-dialog__btn--close:focus {
5791
5813
  font: inherit;
5792
5814
  outline: none;
5793
5815
  }
5794
- .nb-search-bar__input:focus { border-color: var(--accent-bright, #1683c4); }
5816
+ .nb-search-bar__input:focus { border-color: var(--accent-bright); }
5795
5817
  .nb-search-bar__match-info {
5796
5818
  min-width: 64px;
5797
5819
  color: var(--text-muted);
@@ -5824,7 +5846,7 @@ button.twm-about-dialog__btn--close:focus {
5824
5846
  .nb-search-bar__btn--active,
5825
5847
  .nb-search-bar__btn--active:hover {
5826
5848
  background: var(--state-selected);
5827
- border-color: var(--accent-bright, #1683c4);
5849
+ border-color: var(--accent-bright);
5828
5850
  color: var(--text-bright);
5829
5851
  }
5830
5852
  /* Two classes, for the Material Symbols tie — see `.twm-leaf__icon`. */
@@ -6138,12 +6160,12 @@ button.twm-about-dialog__btn--close:focus {
6138
6160
  .twm-record--state-error { box-shadow: inset 2px 0 0 0 var(--color-danger, #c74e4e); }
6139
6161
  /* `activeKey` — the record that is OPEN: the accent on the left edge, as
6140
6162
  * DataTable's `twm-dt-row--active`. It wins over a state's edge. */
6141
- .twm-record.twm-record--active { box-shadow: inset 2px 0 0 0 var(--accent-bright, #007acc); }
6163
+ .twm-record.twm-record--active { box-shadow: inset 2px 0 0 0 var(--accent-bright); }
6142
6164
  .twm-record-list--clickable .twm-record { cursor: pointer; }
6143
6165
  .twm-record-list--clickable .twm-record:hover { background: var(--state-hover, rgba(255, 255, 255, 0.05)); }
6144
6166
  .twm-record:focus { outline: none; }
6145
6167
  .twm-record:focus-visible {
6146
- outline: 1px solid var(--accent-bright, #007acc);
6168
+ outline: 1px solid var(--accent-bright);
6147
6169
  outline-offset: -1px;
6148
6170
  }
6149
6171
  .twm-record-list__empty {
@@ -6841,7 +6863,7 @@ button.twm-about-dialog__btn--close:focus {
6841
6863
  cursor: pointer;
6842
6864
  }
6843
6865
  .twm-doc-outline__link:hover { background: var(--state-hover, rgba(255, 255, 255, 0.05)); color: var(--text-primary, #e0e0e0); }
6844
- .twm-doc-outline__link:focus-visible { outline: 1px solid var(--accent-bright, #007acc); outline-offset: -1px; }
6866
+ .twm-doc-outline__link:focus-visible { outline: 1px solid var(--accent-bright); outline-offset: -1px; }
6845
6867
  .twm-doc-outline__item--level-1 > .twm-doc-outline__link { color: var(--text-primary, #e0e0e0); }
6846
6868
  .twm-doc-outline__number {
6847
6869
  flex: 0 0 auto;
@@ -6856,8 +6878,8 @@ button.twm-about-dialog__btn--close:focus {
6856
6878
  white-space: nowrap;
6857
6879
  }
6858
6880
  .twm-doc-outline__item.twm-doc-outline__item--active > .twm-doc-outline__link {
6859
- border-left-color: var(--accent-bright, #007acc);
6860
- background: rgba(0, 122, 204, 0.15);
6881
+ border-left-color: var(--accent-bright);
6882
+ background: color-mix(in srgb, var(--accent-bright) 15%, transparent);
6861
6883
  color: var(--text-primary, #e0e0e0);
6862
6884
  }
6863
6885
  /* Listed, but nothing in the document answers to it. */
@@ -6885,7 +6907,7 @@ button.twm-about-dialog__btn--close:focus {
6885
6907
  border-radius: var(--radius-sm, 4px);
6886
6908
  cursor: text;
6887
6909
  }
6888
- .twm-tag-input:focus-within { border-color: var(--accent-bright, #007acc); }
6910
+ .twm-tag-input:focus-within { border-color: var(--accent-bright); }
6889
6911
  .twm-tag-input--readonly {
6890
6912
  background: transparent;
6891
6913
  border-color: transparent;
@@ -8000,7 +8022,7 @@ button.twm-about-dialog__btn--close:focus {
8000
8022
  position: absolute;
8001
8023
  pointer-events: none;
8002
8024
  border: 1px solid var(--accent-bright);
8003
- background: rgba(0, 122, 204, 0.12);
8025
+ background: color-mix(in srgb, var(--accent-bright) 12%, transparent);
8004
8026
  }
8005
8027
  .twm-canvas__marquee[hidden] { display: none; }
8006
8028
 
@@ -8493,7 +8515,7 @@ button.twm-about-dialog__btn--close:focus {
8493
8515
  .twm-flow-graph__port--data .twm-flow-graph__port-dot { border-color: #8a8f98; border-radius: 2px; }
8494
8516
  .twm-flow-graph--connecting .twm-flow-graph__port--in:not(:disabled) .twm-flow-graph__port-dot {
8495
8517
  background: var(--twm-flow-focus);
8496
- box-shadow: 0 0 0 3px rgba(0, 122, 204, 0.35);
8518
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-bright) 35%, transparent);
8497
8519
  }
8498
8520
  .twm-flow-graph__port--taken .twm-flow-graph__port-dot { border-color: var(--twm-flow-ok); background: var(--twm-flow-ok); }
8499
8521
  .twm-flow-graph__port--taken .twm-flow-graph__port-count { color: var(--twm-flow-ok); }
@@ -8505,7 +8527,7 @@ button.twm-about-dialog__btn--close:focus {
8505
8527
  }
8506
8528
  .twm-flow-graph__port--can-drop .twm-flow-graph__port-dot {
8507
8529
  background: var(--twm-flow-focus);
8508
- box-shadow: 0 0 0 3px rgba(0, 122, 204, 0.35);
8530
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-bright) 35%, transparent);
8509
8531
  }
8510
8532
 
8511
8533
  /* ── a line ─────────────────────────────────────────────────────────── */