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/css/flexdesk.css CHANGED
@@ -734,7 +734,7 @@ body.twm-dt-col-resizing {
734
734
  second keeps the readonly tables, which hover never claimed, working. */
735
735
  .twm-preview-table:not(.twm-preview-table--readonly) tbody tr.selected td,
736
736
  .twm-preview-table tbody tr.selected td {
737
- background: var(--state-selected, rgba(0, 122, 204, 0.15));
737
+ background: var(--state-selected);
738
738
  }
739
739
  /* ── 0.5.0 DataTable options. Each rule below matches only a class or an
740
740
  * attribute a 0.5.0 option sets, so a table that asks for none of them is
@@ -785,7 +785,7 @@ body.twm-dt-col-resizing {
785
785
  /* `activeRow` — the row that is OPEN. A left edge, not a background: hover
786
786
  * and selection keep theirs. */
787
787
  .twm-preview-table tbody tr.twm-dt-row--active > td:first-child {
788
- box-shadow: inset 2px 0 0 0 var(--accent-bright, #007acc);
788
+ box-shadow: inset 2px 0 0 0 var(--accent-bright);
789
789
  }
790
790
  /* STORY-0016 `selectToggle` / `selectMode` — the select column. Narrow, never
791
791
  * the time column (it is the first child, so the time rules reach it: (0,3,2)
@@ -853,17 +853,17 @@ body.twm-dt-col-resizing {
853
853
  }
854
854
  .twm-preview-table.twm-dt--select th.twm-dt-select-cell .twm-dt-select-toggle:focus-visible {
855
855
  opacity: 1;
856
- outline: 1px solid var(--accent-bright, #007acc);
856
+ outline: 1px solid var(--accent-bright);
857
857
  }
858
858
  /* STORY-0003 `selectionMode: 'cells'` — the range is a tint on its cells, the
859
859
  * cursor a ring inside its cell (inset, so it moves no column by a pixel). A
860
860
  * cell being edited gives its padding to the editor; a commit still out is
861
861
  * dimmed, and a refused one carries a red ring and its message as the title. */
862
862
  .twm-preview-table.twm-dt--cells tbody td.twm-dt-cell--selected {
863
- background: var(--state-selected, rgba(0, 122, 204, 0.15));
863
+ background: var(--state-selected);
864
864
  }
865
865
  .twm-preview-table.twm-dt--cells tbody td.twm-dt-cell--cursor {
866
- box-shadow: inset 0 0 0 2px var(--accent-bright, #007acc);
866
+ box-shadow: inset 0 0 0 2px var(--accent-bright);
867
867
  }
868
868
  .twm-preview-table.twm-dt--cells:focus {
869
869
  outline: none;
@@ -878,7 +878,7 @@ body.twm-dt-col-resizing {
878
878
  margin: 0;
879
879
  padding: 2px 6px;
880
880
  border: 0;
881
- outline: 2px solid var(--accent-bright, #007acc);
881
+ outline: 2px solid var(--accent-bright);
882
882
  outline-offset: -2px;
883
883
  background: var(--surface-well, #1e1e1e);
884
884
  color: inherit;
@@ -905,7 +905,7 @@ body.twm-dt-col-resizing {
905
905
  }
906
906
  /* STORY-0088 `staged`: a value typed and not yet committed. */
907
907
  .twm-preview-table.twm-dt--cells tbody td.twm-dt-cell--staged {
908
- background: color-mix(in srgb, var(--accent-bright, #007acc) 16%, transparent);
908
+ background: color-mix(in srgb, var(--accent-bright) 16%, transparent);
909
909
  }
910
910
  /* STORY-0089 `fillHandle`: a square on the range's corner cell, the cells a
911
911
  * drag covers dashed, and a cell the fill skipped (not editable) hatched. */
@@ -919,14 +919,14 @@ body.twm-dt-col-resizing {
919
919
  width: 7px;
920
920
  height: 7px;
921
921
  box-sizing: border-box;
922
- background: var(--accent-bright, #007acc);
922
+ background: var(--accent-bright);
923
923
  border: 1px solid var(--surface-well, #1e1e1e);
924
924
  cursor: crosshair;
925
925
  z-index: 1;
926
926
  touch-action: none;
927
927
  }
928
928
  .twm-preview-table.twm-dt--cells tbody td.twm-dt-cell--fill-preview {
929
- outline: 1px dashed var(--accent-bright, #007acc);
929
+ outline: 1px dashed var(--accent-bright);
930
930
  outline-offset: -1px;
931
931
  }
932
932
  .twm-preview-table.twm-dt--cells tbody td.twm-dt-cell--fill-skipped {
@@ -963,10 +963,10 @@ body.twm-dt-col-resizing {
963
963
  opacity: 0.5;
964
964
  }
965
965
  .twm-preview-table th.twm-dt-col--drop {
966
- box-shadow: inset 2px 0 0 0 var(--accent-bright, #007acc);
966
+ box-shadow: inset 2px 0 0 0 var(--accent-bright);
967
967
  }
968
968
  .twm-preview-table th.twm-dt-col--drop.twm-dt-col--drop-after {
969
- box-shadow: inset -2px 0 0 0 var(--accent-bright, #007acc);
969
+ box-shadow: inset -2px 0 0 0 var(--accent-bright);
970
970
  }
971
971
  /* STORY-0066 `columnGroups` — the group row is a table of its own above the
972
972
  * header table (`twm-dt-groups`), its `<col>`s copied from the header's widths;
@@ -1029,7 +1029,7 @@ body.twm-dt-col-resizing {
1029
1029
  .twm-preview-table .twm-dt-group__action:focus-visible,
1030
1030
  .twm-preview-table .twm-dt-col-action:focus-visible {
1031
1031
  opacity: 1;
1032
- outline: 1px solid var(--accent-bright, #007acc);
1032
+ outline: 1px solid var(--accent-bright);
1033
1033
  }
1034
1034
  .twm-preview-table th.twm-dt-col--placeholder,
1035
1035
  .twm-preview-table td.twm-dt-cell--placeholder {
@@ -1095,16 +1095,16 @@ body.twm-dt-col-resizing {
1095
1095
  }
1096
1096
  .twm-preview-table.twm-dt-crosstab:not(.twm-preview-table--readonly) tbody tr.selected td.twm-dt-pin,
1097
1097
  .twm-preview-table.twm-dt-crosstab tbody tr.selected td.twm-dt-pin {
1098
- --twm-dt-pin-state: linear-gradient(var(--state-selected, rgba(0, 122, 204, 0.15)), var(--state-selected, rgba(0, 122, 204, 0.15)));
1098
+ --twm-dt-pin-state: linear-gradient(var(--state-selected), var(--state-selected));
1099
1099
  }
1100
1100
  .twm-preview-table.twm-dt-crosstab.twm-dt--clickable tbody tr:not(.twm-dt-spacer):not(.data-table__empty-row):not(.selected):hover td.twm-dt-pin {
1101
1101
  --twm-dt-pin-state: linear-gradient(var(--state-hover, rgba(255, 255, 255, 0.05)), var(--state-hover, rgba(255, 255, 255, 0.05)));
1102
1102
  }
1103
1103
  .twm-preview-table.twm-dt-crosstab.twm-dt--cells tbody td.twm-dt-pin.twm-dt-cell--selected {
1104
- --twm-dt-pin-state: linear-gradient(var(--state-selected, rgba(0, 122, 204, 0.15)), var(--state-selected, rgba(0, 122, 204, 0.15)));
1104
+ --twm-dt-pin-state: linear-gradient(var(--state-selected), var(--state-selected));
1105
1105
  }
1106
1106
  .twm-preview-table.twm-dt-crosstab.twm-dt--cells tbody td.twm-dt-pin.twm-dt-cell--staged {
1107
- --twm-dt-pin-state: linear-gradient(color-mix(in srgb, var(--accent-bright, #007acc) 16%, transparent), color-mix(in srgb, var(--accent-bright, #007acc) 16%, transparent));
1107
+ --twm-dt-pin-state: linear-gradient(color-mix(in srgb, var(--accent-bright) 16%, transparent), color-mix(in srgb, var(--accent-bright) 16%, transparent));
1108
1108
  }
1109
1109
  .twm-preview-table.twm-dt-crosstab.twm-dt--cells tbody td.twm-dt-pin.twm-dt-cell--fill-skipped {
1110
1110
  --twm-dt-pin-mark: repeating-linear-gradient(45deg,
@@ -1135,7 +1135,7 @@ body.twm-dt-col-resizing {
1135
1135
  --twm-dt-pin-state: linear-gradient(rgba(255,255,255,0.04), rgba(255,255,255,0.04));
1136
1136
  }
1137
1137
  @keyframes twm-dt-pin-new {
1138
- from { --twm-dt-pin-new: var(--twm-dt-new-bg, rgba(0, 122, 204, 0.22)); }
1138
+ from { --twm-dt-pin-new: var(--twm-dt-new-bg); }
1139
1139
  to { --twm-dt-pin-new: transparent; }
1140
1140
  }
1141
1141
  .twm-preview-table.twm-dt-crosstab tbody tr.twm-dt-row--new > td.twm-dt-pin {
@@ -1151,7 +1151,7 @@ body.twm-dt-col-resizing {
1151
1151
  cursor: pointer;
1152
1152
  }
1153
1153
  .twm-preview-table.twm-dt--selecting tbody tr.twm-dt-row--cursor > td {
1154
- box-shadow: inset 0 1px 0 0 var(--accent-bright, #007acc), inset 0 -1px 0 0 var(--accent-bright, #007acc);
1154
+ box-shadow: inset 0 1px 0 0 var(--accent-bright), inset 0 -1px 0 0 var(--accent-bright);
1155
1155
  }
1156
1156
  /* `rowIcon` — drawn from `data-twm-icon` so the icon's NAME is not cell
1157
1157
  * text (not in a copy, not in the clipped-cell tooltip). The span carries the
@@ -1298,7 +1298,7 @@ body.twm-dt-col-resizing {
1298
1298
  }
1299
1299
  .twm-preview-table td .twm-dt-detail-toggle:focus-visible {
1300
1300
  opacity: 1;
1301
- outline: 1px solid var(--accent-bright, #007acc);
1301
+ outline: 1px solid var(--accent-bright);
1302
1302
  }
1303
1303
  /* The detail's row: one cell across every column. It is often the body's
1304
1304
  * FIRST cell of its row, so the time column's rules reach it (see the note
@@ -1331,7 +1331,7 @@ body.twm-dt-col-resizing {
1331
1331
  }
1332
1332
  /* `follow` / `refresh()` — a row the last answer did not have, for a moment. */
1333
1333
  @keyframes twm-dt-row-new {
1334
- from { background: var(--twm-dt-new-bg, rgba(0, 122, 204, 0.22)); }
1334
+ from { background: var(--twm-dt-new-bg); }
1335
1335
  to { background: transparent; }
1336
1336
  }
1337
1337
  .twm-preview-table tbody tr.twm-dt-row--new > td {
@@ -1375,11 +1375,11 @@ body.twm-dt-col-resizing {
1375
1375
  background: rgba(255, 255, 255, 0.06);
1376
1376
  }
1377
1377
  .twm-dt-filter-chip:focus-visible {
1378
- outline: 1px solid var(--accent-bright, #007acc);
1378
+ outline: 1px solid var(--accent-bright);
1379
1379
  }
1380
1380
  .twm-dt-filter-chip.twm-dt-filter-chip--on {
1381
- border-color: var(--accent-bright, #007acc);
1382
- background: rgba(0, 122, 204, 0.18);
1381
+ border-color: var(--accent-bright);
1382
+ background: color-mix(in srgb, var(--accent-bright) 18%, transparent);
1383
1383
  color: #ddd;
1384
1384
  }
1385
1385
  .twm-dt-filter-chip.twm-dt-filter-chip--empty {
@@ -1449,14 +1449,14 @@ body.twm-dt-col-resizing {
1449
1449
  width: 16px;
1450
1450
  height: 16px;
1451
1451
  border-radius: 50%;
1452
- background: #569cd6;
1452
+ background: var(--accent-light);
1453
1453
  margin-top: -5px;
1454
1454
  cursor: grab;
1455
1455
  border: 2px solid var(--surface-0);
1456
1456
  }
1457
1457
  .twm-slider-field__input::-webkit-slider-thumb:active {
1458
1458
  cursor: grabbing;
1459
- background: #6eb3e9;
1459
+ background: var(--accent-lighter);
1460
1460
  }
1461
1461
  .twm-slider-field__input::-moz-range-track {
1462
1462
  height: 6px;
@@ -1468,7 +1468,7 @@ body.twm-dt-col-resizing {
1468
1468
  width: 16px;
1469
1469
  height: 16px;
1470
1470
  border-radius: 50%;
1471
- background: #569cd6;
1471
+ background: var(--accent-light);
1472
1472
  cursor: grab;
1473
1473
  border: 2px solid var(--surface-0);
1474
1474
  }
@@ -1591,7 +1591,7 @@ body.twm-dt-col-resizing {
1591
1591
  .twm-sortable-list__drop {
1592
1592
  height: 2px;
1593
1593
  margin: 1px 0;
1594
- background: #569cd6;
1594
+ background: var(--accent-light);
1595
1595
  pointer-events: none;
1596
1596
  }
1597
1597
  .twm-sortable-list__content {
@@ -1638,12 +1638,12 @@ body.twm-dt-col-resizing {
1638
1638
  margin-top: var(--space-md);
1639
1639
  }
1640
1640
  .twm-sortable-list__add:hover {
1641
- border-color: #569cd6;
1642
- color: #569cd6;
1643
- background: rgba(86, 156, 214, 0.12);
1641
+ border-color: var(--accent-light);
1642
+ color: var(--accent-light);
1643
+ background: color-mix(in srgb, var(--accent-light) 12%, transparent);
1644
1644
  }
1645
1645
  .twm-sortable-list__add:active {
1646
- background: rgba(86, 156, 214, 0.2);
1646
+ background: color-mix(in srgb, var(--accent-light) 20%, transparent);
1647
1647
  }
1648
1648
  .twm-sortable-list__empty {
1649
1649
  padding: var(--space-xl);
@@ -1668,7 +1668,7 @@ body.twm-dt-col-resizing {
1668
1668
  }
1669
1669
  .twm-sortable-list__input:focus {
1670
1670
  outline: none;
1671
- border-color: #569cd6;
1671
+ border-color: var(--accent-light);
1672
1672
  }
1673
1673
  /* Global Top Bar (fixed at top) */
1674
1674
  .twm-global-top-bar {
@@ -2142,19 +2142,19 @@ body.twm-dt-col-resizing {
2142
2142
  padding: var(--space-xxs) 8px;
2143
2143
  font-size: var(--font-size-xs);
2144
2144
  color: #c7f1ff;
2145
- background: rgba(0, 122, 204, 0.18);
2146
- border: 1px solid rgba(0, 122, 204, 0.35);
2145
+ background: color-mix(in srgb, var(--accent-bright) 18%, transparent);
2146
+ border: 1px solid color-mix(in srgb, var(--accent-bright) 35%, transparent);
2147
2147
  border-radius: var(--radius-pill);
2148
2148
  white-space: nowrap;
2149
2149
  text-transform: none;
2150
2150
  cursor: default;
2151
- box-shadow: inset 0 0 0 1px rgba(0, 122, 204, 0.15);
2151
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent-bright) 15%, transparent);
2152
2152
  }
2153
2153
  .twm-autocomplete-field__namespace--toggle {
2154
2154
  cursor: pointer;
2155
- background: linear-gradient(90deg, rgba(0, 122, 204, 0.24) 0%, rgba(0, 122, 204, 0.12) 100%);
2155
+ background: linear-gradient(90deg, color-mix(in srgb, var(--accent-bright) 24%, transparent) 0%, color-mix(in srgb, var(--accent-bright) 12%, transparent) 100%);
2156
2156
  transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
2157
- border: 1px solid rgba(0, 122, 204, 0.5);
2157
+ border: 1px solid color-mix(in srgb, var(--accent-bright) 50%, transparent);
2158
2158
  color: #e7f5ff;
2159
2159
  outline: none;
2160
2160
  }
@@ -2197,8 +2197,8 @@ body.twm-dt-col-resizing {
2197
2197
  is the keyboard's, and it is deliberately the stronger of the two so that
2198
2198
  moving the pointer across the list does not hide where the cursor is. */
2199
2199
  .twm-autocomplete-field__item.active {
2200
- background-color: var(--state-selected, rgba(0, 122, 204, 0.15));
2201
- box-shadow: inset 2px 0 0 var(--accent-bright, #007acc);
2200
+ background-color: var(--state-selected);
2201
+ box-shadow: inset 2px 0 0 var(--accent-bright);
2202
2202
  }
2203
2203
  .twm-autocomplete-field__item {
2204
2204
  display: flex;
@@ -2588,7 +2588,7 @@ body.twm-window-maximized .twm-resize-handle {
2588
2588
  box-sizing: border-box;
2589
2589
  }
2590
2590
  .twm-data-table__filter-input:focus {
2591
- border-color: #569cd6;
2591
+ border-color: var(--accent-light);
2592
2592
  background: #252525;
2593
2593
  }
2594
2594
  .twm-data-table__filter-input::placeholder {
@@ -2649,7 +2649,7 @@ body.twm-window-maximized .twm-resize-handle {
2649
2649
  }
2650
2650
  .twm-data-table__filter-dropdown-select:focus,
2651
2651
  .twm-data-table__filter-dropdown-input:focus {
2652
- border-color: #569cd6;
2652
+ border-color: var(--accent-light);
2653
2653
  }
2654
2654
  .twm-data-table__filter-dropdown-select {
2655
2655
  appearance: auto;
@@ -3748,14 +3748,14 @@ body.twm-window-maximized .twm-resize-handle {
3748
3748
  /* Add Widget is the toolbar's one primary verb, so it is the one that carries
3749
3749
  the accent. */
3750
3750
  .add-widget-btn {
3751
- background: rgba(0, 122, 204, 0.15);
3752
- border-color: rgba(0, 122, 204, 0.3);
3751
+ background: color-mix(in srgb, var(--accent-bright) 15%, transparent);
3752
+ border-color: color-mix(in srgb, var(--accent-bright) 30%, transparent);
3753
3753
  color: var(--text-bright);
3754
3754
  }
3755
3755
 
3756
3756
  .add-widget-btn:hover {
3757
- background: rgba(0, 122, 204, 0.25);
3758
- border-color: rgba(0, 122, 204, 0.5);
3757
+ background: color-mix(in srgb, var(--accent-bright) 25%, transparent);
3758
+ border-color: color-mix(in srgb, var(--accent-bright) 50%, transparent);
3759
3759
  }
3760
3760
 
3761
3761
  /* The other two are secondary — Export is an aside and Reset Layout throws the
@@ -3804,13 +3804,15 @@ body.twm-window-maximized .twm-resize-handle {
3804
3804
  .tile.resizing {
3805
3805
  z-index: var(--z-dropdown);
3806
3806
  border-color: var(--accent-bright);
3807
- box-shadow: 0 0 0 2px rgba(0, 122, 204, 0.3);
3807
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent-bright) 30%, transparent);
3808
3808
  }
3809
3809
 
3810
3810
  /* Selected — set by `_onConfigClick()` while the config dialog is open, and
3811
- cleared from every sibling by the same handler. #78b9ff is a literal
3812
- because there is no light-accent token: `--accent-bright` is #007acc, which
3813
- is a border colour on this background and not a text one. */
3811
+ cleared from every sibling by the same handler. #78b9ff is a literal:
3812
+ `--accent-bright` is #007acc, which is a border colour on this background
3813
+ and not a text one, and the derived light accents (`--accent-light`,
3814
+ `--accent-lighter`) are less blue than this, so using them would change
3815
+ the colour. */
3814
3816
  .tile.tile--selected {
3815
3817
  border-color: #78b9ff;
3816
3818
  box-shadow: 0 0 0 2px rgba(120, 185, 255, 0.3), var(--shadow-md);
@@ -3959,11 +3961,14 @@ body.twm-window-maximized .twm-resize-handle {
3959
3961
  position: relative;
3960
3962
  }
3961
3963
 
3964
+ /* While open the menu is moved to document.body and placed `position: fixed`
3965
+ by `ActionDropdown.position` (inline styles), so a narrow tile cannot clip
3966
+ it; --z-over-windows keeps it over a managed window holding the grid. */
3962
3967
  .tile-menu-dropdown {
3963
3968
  position: absolute;
3964
3969
  top: 100%;
3965
3970
  right: 0;
3966
- z-index: var(--z-dropdown);
3971
+ z-index: var(--z-over-windows);
3967
3972
  min-width: 180px;
3968
3973
  padding: var(--space-xs) 0;
3969
3974
  background: var(--surface-2);
@@ -4078,8 +4083,8 @@ body.twm-window-maximized .twm-resize-handle {
4078
4083
  /* The drop preview, positioned by `_updateGhost()` in grid coordinates. */
4079
4084
  .tile-ghost {
4080
4085
  position: absolute;
4081
- background: rgba(0, 122, 204, 0.15);
4082
- border: 2px dashed rgba(0, 122, 204, 0.5);
4086
+ background: color-mix(in srgb, var(--accent-bright) 15%, transparent);
4087
+ border: 2px dashed color-mix(in srgb, var(--accent-bright) 50%, transparent);
4083
4088
  border-radius: var(--radius-sm);
4084
4089
  pointer-events: none;
4085
4090
  z-index: 50;
@@ -5588,12 +5593,12 @@ button.twm-about-dialog__btn--close:focus {
5588
5593
  /* ─── Autocomplete field — notebook variant ──────────────── */
5589
5594
 
5590
5595
  .twm-autocomplete-field--notebook .twm-autocomplete-field__input-wrapper {
5591
- border: 1px solid #569cd6;
5596
+ border: 1px solid var(--accent-light);
5592
5597
  font-size: var(--font-size-sm);
5593
5598
  }
5594
5599
  .twm-autocomplete-field--notebook .twm-autocomplete-field__input-wrapper:focus-within {
5595
5600
  border-color: #79b8f8;
5596
- box-shadow: 0 0 3px rgba(86, 156, 214, 0.3);
5601
+ box-shadow: 0 0 3px color-mix(in srgb, var(--accent-light) 30%, transparent);
5597
5602
  }
5598
5603
  .twm-autocomplete-field--notebook .twm-autocomplete-field__input {
5599
5604
  font-family: 'Courier New', Courier, monospace;
@@ -6296,7 +6301,7 @@ button.twm-about-dialog__btn--close:focus {
6296
6301
  }
6297
6302
  .twm-color-field__preset:hover,
6298
6303
  .twm-color-field__preset:focus-visible {
6299
- outline: 1px solid var(--ea-accent, #569cd6);
6304
+ outline: 1px solid var(--ea-accent);
6300
6305
  outline-offset: 1px;
6301
6306
  }
6302
6307
  /* Colour list: a SortableList whose rows are a colour field + move buttons. */
@@ -6322,7 +6327,7 @@ button.twm-about-dialog__btn--close:focus {
6322
6327
  cursor: pointer;
6323
6328
  }
6324
6329
  .twm-color-list__move:hover:not(:disabled) {
6325
- color: var(--ea-accent, #569cd6);
6330
+ color: var(--ea-accent);
6326
6331
  }
6327
6332
  .twm-color-list__move:disabled {
6328
6333
  opacity: 0.3;
@@ -6733,7 +6738,7 @@ button.twm-about-dialog__btn--close:focus {
6733
6738
  }
6734
6739
  .twm-entity-header__field select:focus {
6735
6740
  outline: none;
6736
- border-color: var(--ea-accent, #5aa3e8);
6741
+ border-color: var(--ea-accent);
6737
6742
  }
6738
6743
  .twm-entity-header__field select option { background: var(--ea-input-bg, #1e1e1e); color: var(--ea-text, #ddd); }
6739
6744
  .twm-landing__table table {
@@ -6977,7 +6982,7 @@ body.twm-dragging * { user-select: none; }
6977
6982
  }
6978
6983
  .twm-leaf--focused {
6979
6984
  border-color: var(--accent-bright);
6980
- box-shadow: 0 0 0 1px rgba(0, 122, 204, 0.25) inset;
6985
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent-bright) 25%, transparent) inset;
6981
6986
  }
6982
6987
  .twm-leaf__chrome {
6983
6988
  display: flex;
@@ -7187,15 +7192,15 @@ body.twm-dragging * { user-select: none; }
7187
7192
  * border, because a border changes the box and every tile in the row would
7188
7193
  * reflow by a pixel as the pointer crossed between them. */
7189
7194
  .twm-leaf--drop-target {
7190
- outline: 2px solid var(--accent-bright, #1683c4);
7195
+ outline: 2px solid var(--accent-bright);
7191
7196
  outline-offset: -2px;
7192
7197
  }
7193
7198
 
7194
7199
  /* A STRIP ARMED TO RECEIVE — the drop that adds the tab at the end of this
7195
7200
  * tile's list rather than into a zone of its body. */
7196
7201
  .twm-leaf__tabbar--drop-target {
7197
- background: color-mix(in srgb, var(--accent-bright, #1683c4) 18%, transparent);
7198
- box-shadow: inset 0 0 0 1px var(--accent-bright, #1683c4);
7202
+ background: color-mix(in srgb, var(--accent-bright) 18%, transparent);
7203
+ box-shadow: inset 0 0 0 1px var(--accent-bright);
7199
7204
  }
7200
7205
 
7201
7206
  /* THE TAB BEING CARRIED. `DragReorder` has put `.dragging` on the TOP strip's
@@ -7276,7 +7281,7 @@ body.twm-dragging * { user-select: none; }
7276
7281
  position: absolute;
7277
7282
  inset: 0;
7278
7283
  pointer-events: none;
7279
- border-top: 1px solid var(--accent-bright, #1683c4);
7284
+ border-top: 1px solid var(--accent-bright);
7280
7285
  clip-path: polygon(8px 0, 100% 0, calc(100% - 8px) 100%, 0 100%);
7281
7286
  }
7282
7287
  /* Lower-casing removed here too — a tab label is the same embedder-supplied
@@ -7489,7 +7494,7 @@ body.twm-dragging * { user-select: none; }
7489
7494
  inset: 0 0 auto 0;
7490
7495
  height: 2px;
7491
7496
  pointer-events: none;
7492
- background: var(--accent-bright, #1683c4);
7497
+ background: var(--accent-bright);
7493
7498
  }
7494
7499
  /* A PREVIEW tab — opened by a single click and replaced by the next one.
7495
7500
  * Italic is the convention every editor uses for "this one is not staying". */
@@ -7541,7 +7546,7 @@ body.twm-dragging * { user-select: none; }
7541
7546
  flex: 0 0 auto;
7542
7547
  font-size: 9px;
7543
7548
  line-height: 1;
7544
- color: var(--accent-bright, #1683c4);
7549
+ color: var(--accent-bright);
7545
7550
  }
7546
7551
  .notebook-tabs .twm-tab-close {
7547
7552
  flex: 0 0 auto;
@@ -7579,7 +7584,7 @@ body.twm-dragging * { user-select: none; }
7579
7584
  flex: 0 0 auto;
7580
7585
  align-self: stretch;
7581
7586
  width: 2px;
7582
- background: var(--accent-bright, #1683c4);
7587
+ background: var(--accent-bright);
7583
7588
  pointer-events: none;
7584
7589
  }
7585
7590
 
@@ -7601,8 +7606,8 @@ body.twm-dragging * { user-select: none; }
7601
7606
  * mean "let go here and this list takes it" should look like one thing. */
7602
7607
  .notebook-tabs--drop-target,
7603
7608
  .notebook-editor-container--drop-target {
7604
- background: color-mix(in srgb, var(--accent-bright, #1683c4) 18%, transparent);
7605
- box-shadow: inset 0 0 0 1px var(--accent-bright, #1683c4);
7609
+ background: color-mix(in srgb, var(--accent-bright) 18%, transparent);
7610
+ box-shadow: inset 0 0 0 1px var(--accent-bright);
7606
7611
  }
7607
7612
  /* ── The tab bar's own context menu ──────────────────────────────────
7608
7613
  * Reached only by a consumer that lets the component open it — the tile
@@ -7629,6 +7634,23 @@ body.twm-dragging * { user-select: none; }
7629
7634
  transition: opacity 90ms ease-out;
7630
7635
  }
7631
7636
  .nb-context-menu.visible { opacity: 1; }
7637
+
7638
+ /* ── Context menus stay inside the window (0.17.9, BUG-0040) ─────────
7639
+ * `showContextMenu`, the DataTable's right-click menu and NotebookTabBar's tab
7640
+ * menu are placed by src/ui/utils/menu_viewport.js, which sets an inline
7641
+ * max-height of the window's height less a margin top and bottom. Here: the
7642
+ * same cap for a menu placed before that runs, border-box so the cap includes
7643
+ * padding and border, and scrolling inside when the items are longer — they
7644
+ * had no max-height and no overflow, so a 100-item menu ran off the window and
7645
+ * its far items could not be reached. */
7646
+ .twm-context-menu,
7647
+ .nb-context-menu {
7648
+ box-sizing: border-box;
7649
+ max-height: calc(100vh - 2 * var(--space-md));
7650
+ overflow-x: hidden;
7651
+ overflow-y: auto;
7652
+ overscroll-behavior: contain;
7653
+ }
7632
7654
  .nb-context-menu__item {
7633
7655
  display: flex;
7634
7656
  align-items: center;
@@ -7723,7 +7745,7 @@ body.twm-dragging * { user-select: none; }
7723
7745
  }
7724
7746
  .split-pane-divider:hover,
7725
7747
  .split-pane-divider--active {
7726
- background: var(--accent-bright, #1683c4);
7748
+ background: var(--accent-bright);
7727
7749
  }
7728
7750
  /* A pane is its tab bar over its body. The tab bar's own rule says
7729
7751
  * `height: 100%` (it fills a tile's strip); here it is a fixed 26px row, the
@@ -7746,7 +7768,7 @@ body.twm-dragging * { user-select: none; }
7746
7768
  * `setPanes()`, which is why `SplitPaneContainer` ADDS `.split-pane` to a
7747
7769
  * pane instead of replacing its classes with it. */
7748
7770
  .split-pane-container--split .editor-pane--focused > .tabs.notebook-tabs {
7749
- box-shadow: inset 0 -1px 0 var(--accent-bright, #1683c4);
7771
+ box-shadow: inset 0 -1px 0 var(--accent-bright);
7750
7772
  }
7751
7773
  /* The body is the positioning anchor; the editor container fills it
7752
7774
  * absolutely, so its height is the body's whatever its content is and the
@@ -7809,7 +7831,7 @@ body.twm-dragging * { user-select: none; }
7809
7831
  font: inherit;
7810
7832
  outline: none;
7811
7833
  }
7812
- .nb-search-bar__input:focus { border-color: var(--accent-bright, #1683c4); }
7834
+ .nb-search-bar__input:focus { border-color: var(--accent-bright); }
7813
7835
  .nb-search-bar__match-info {
7814
7836
  min-width: 64px;
7815
7837
  color: var(--text-muted);
@@ -7842,7 +7864,7 @@ body.twm-dragging * { user-select: none; }
7842
7864
  .nb-search-bar__btn--active,
7843
7865
  .nb-search-bar__btn--active:hover {
7844
7866
  background: var(--state-selected);
7845
- border-color: var(--accent-bright, #1683c4);
7867
+ border-color: var(--accent-bright);
7846
7868
  color: var(--text-bright);
7847
7869
  }
7848
7870
  /* Two classes, for the Material Symbols tie — see `.twm-leaf__icon`. */
@@ -7982,7 +8004,7 @@ body.twm-dragging * { user-select: none; }
7982
8004
  .twm-tile-tabmenu__item--cursor {
7983
8005
  /* Keyboard cursor reads slightly heavier than hover so a
7984
8006
  * mouse-cursor-on-a-different-row state is still legible. */
7985
- outline: 1px solid var(--accent-bright, #1683c4);
8007
+ outline: 1px solid var(--accent-bright);
7986
8008
  outline-offset: -1px;
7987
8009
  }
7988
8010
  .twm-tile-tabmenu__item-hint {
@@ -8071,13 +8093,13 @@ body.twm-dragging * { user-select: none; }
8071
8093
  color: var(--text-bright);
8072
8094
  }
8073
8095
  .twm-tile-tabswitch__item--cursor {
8074
- outline: 1px solid var(--accent-bright, #1683c4);
8096
+ outline: 1px solid var(--accent-bright);
8075
8097
  outline-offset: -1px;
8076
8098
  }
8077
8099
  .twm-tile-tabswitch__item--on { color: var(--text-bright); }
8078
8100
  /* Compounded for the Material Symbols tie — see `.twm-leaf__icon`. */
8079
8101
  .twm-tile-tabswitch__check,
8080
- .twm-tile-tabswitch__check.material-symbols-outlined { font-size: 14px; color: var(--accent-bright, #1683c4); }
8102
+ .twm-tile-tabswitch__check.material-symbols-outlined { font-size: 14px; color: var(--accent-bright); }
8081
8103
  .twm-tile-tabswitch__label {
8082
8104
  overflow: hidden;
8083
8105
  text-overflow: ellipsis;
@@ -8129,8 +8151,8 @@ body.twm-dragging * { user-select: none; }
8129
8151
  align-items: center;
8130
8152
  gap: var(--space-xs);
8131
8153
  padding: 2px 4px 2px 8px;
8132
- background: var(--state-selected, rgba(17, 119, 179, 0.18));
8133
- border: 1px solid var(--accent-bright, #1683c4);
8154
+ background: var(--state-selected);
8155
+ border: 1px solid var(--accent-bright);
8134
8156
  border-radius: 2px;
8135
8157
  color: var(--text-bright, #fff);
8136
8158
  font-size: var(--font-size-xs);
@@ -8789,7 +8811,7 @@ tr:hover .twm-row-action { opacity: 1; }
8789
8811
  }
8790
8812
  .twm-data-table-component--compact .twm-pagination-controls .twm-pagination-btn:hover:not(:disabled) {
8791
8813
  color: var(--ea-text, #ddd) !important;
8792
- border-color: var(--ea-accent, #1177b3) !important;
8814
+ border-color: var(--ea-accent) !important;
8793
8815
  }
8794
8816
  /* Text labels inside the pager — the "Rows X–Y of Z" and "Page X of
8795
8817
  * Y" spans don't have classes (just inline style), so target every
@@ -8818,7 +8840,7 @@ tr:hover .twm-row-action { opacity: 1; }
8818
8840
  width: 28px;
8819
8841
  height: 28px;
8820
8842
  border: 2px solid rgba(255, 255, 255, 0.18);
8821
- border-top-color: var(--ea-accent, #1177b3);
8843
+ border-top-color: var(--ea-accent);
8822
8844
  border-radius: 50%;
8823
8845
  animation: data-table__spin 0.7s linear infinite;
8824
8846
  }
@@ -8995,7 +9017,7 @@ tr:hover .twm-row-action { opacity: 1; }
8995
9017
  width: 18px;
8996
9018
  height: 18px;
8997
9019
  border: 2px solid var(--ea-border, #333);
8998
- border-top-color: var(--accent, #4a90e2);
9020
+ border-top-color: var(--accent);
8999
9021
  border-radius: 50%;
9000
9022
  animation: twm-tile-loading-spin 0.7s linear infinite;
9001
9023
  }
@@ -9219,7 +9241,7 @@ tr:hover .twm-row-action { opacity: 1; }
9219
9241
  cursor: pointer;
9220
9242
  }
9221
9243
  .twm-tabs__tab:hover { background: var(--surface-2); color: var(--text-primary); }
9222
- .twm-tabs__tab:focus-visible { outline: 1px solid var(--accent-bright, #1683c4); outline-offset: -1px; }
9244
+ .twm-tabs__tab:focus-visible { outline: 1px solid var(--accent-bright); outline-offset: -1px; }
9223
9245
  .twm-tabs__tab--on { background: var(--surface-0); color: var(--text-bright); }
9224
9246
  .twm-tabs__tab--on::before {
9225
9247
  content: '';
@@ -9227,7 +9249,7 @@ tr:hover .twm-row-action { opacity: 1; }
9227
9249
  inset: 0 0 auto 0;
9228
9250
  height: 2px;
9229
9251
  pointer-events: none;
9230
- background: var(--accent-bright, #1683c4);
9252
+ background: var(--accent-bright);
9231
9253
  }
9232
9254
  .twm-tabs__label { overflow: hidden; text-overflow: ellipsis; }
9233
9255
  /* Two classes: Google's `.material-symbols-outlined { font-size: 24px }` loads
@@ -9762,12 +9784,12 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
9762
9784
  .twm-record--state-error { box-shadow: inset 2px 0 0 0 var(--color-danger, #c74e4e); }
9763
9785
  /* `activeKey` — the record that is OPEN: the accent on the left edge, as
9764
9786
  * DataTable's `twm-dt-row--active`. It wins over a state's edge. */
9765
- .twm-record.twm-record--active { box-shadow: inset 2px 0 0 0 var(--accent-bright, #007acc); }
9787
+ .twm-record.twm-record--active { box-shadow: inset 2px 0 0 0 var(--accent-bright); }
9766
9788
  .twm-record-list--clickable .twm-record { cursor: pointer; }
9767
9789
  .twm-record-list--clickable .twm-record:hover { background: var(--state-hover, rgba(255, 255, 255, 0.05)); }
9768
9790
  .twm-record:focus { outline: none; }
9769
9791
  .twm-record:focus-visible {
9770
- outline: 1px solid var(--accent-bright, #007acc);
9792
+ outline: 1px solid var(--accent-bright);
9771
9793
  outline-offset: -1px;
9772
9794
  }
9773
9795
  .twm-record-list__empty {
@@ -10693,7 +10715,7 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
10693
10715
  cursor: pointer;
10694
10716
  }
10695
10717
  .twm-doc-outline__link:hover { background: var(--state-hover, rgba(255, 255, 255, 0.05)); color: var(--text-primary, #e0e0e0); }
10696
- .twm-doc-outline__link:focus-visible { outline: 1px solid var(--accent-bright, #007acc); outline-offset: -1px; }
10718
+ .twm-doc-outline__link:focus-visible { outline: 1px solid var(--accent-bright); outline-offset: -1px; }
10697
10719
  .twm-doc-outline__item--level-1 > .twm-doc-outline__link { color: var(--text-primary, #e0e0e0); }
10698
10720
  .twm-doc-outline__number {
10699
10721
  flex: 0 0 auto;
@@ -10708,8 +10730,8 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
10708
10730
  white-space: nowrap;
10709
10731
  }
10710
10732
  .twm-doc-outline__item.twm-doc-outline__item--active > .twm-doc-outline__link {
10711
- border-left-color: var(--accent-bright, #007acc);
10712
- background: rgba(0, 122, 204, 0.15);
10733
+ border-left-color: var(--accent-bright);
10734
+ background: color-mix(in srgb, var(--accent-bright) 15%, transparent);
10713
10735
  color: var(--text-primary, #e0e0e0);
10714
10736
  }
10715
10737
  /* Listed, but nothing in the document answers to it. */
@@ -10737,7 +10759,7 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
10737
10759
  border-radius: var(--radius-sm, 4px);
10738
10760
  cursor: text;
10739
10761
  }
10740
- .twm-tag-input:focus-within { border-color: var(--accent-bright, #007acc); }
10762
+ .twm-tag-input:focus-within { border-color: var(--accent-bright); }
10741
10763
  .twm-tag-input--readonly {
10742
10764
  background: transparent;
10743
10765
  border-color: transparent;
@@ -12262,7 +12284,7 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
12262
12284
  position: absolute;
12263
12285
  pointer-events: none;
12264
12286
  border: 1px solid var(--accent-bright);
12265
- background: rgba(0, 122, 204, 0.12);
12287
+ background: color-mix(in srgb, var(--accent-bright) 12%, transparent);
12266
12288
  }
12267
12289
  .twm-canvas__marquee[hidden] { display: none; }
12268
12290
 
@@ -12755,7 +12777,7 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
12755
12777
  .twm-flow-graph__port--data .twm-flow-graph__port-dot { border-color: #8a8f98; border-radius: 2px; }
12756
12778
  .twm-flow-graph--connecting .twm-flow-graph__port--in:not(:disabled) .twm-flow-graph__port-dot {
12757
12779
  background: var(--twm-flow-focus);
12758
- box-shadow: 0 0 0 3px rgba(0, 122, 204, 0.35);
12780
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-bright) 35%, transparent);
12759
12781
  }
12760
12782
  .twm-flow-graph__port--taken .twm-flow-graph__port-dot { border-color: var(--twm-flow-ok); background: var(--twm-flow-ok); }
12761
12783
  .twm-flow-graph__port--taken .twm-flow-graph__port-count { color: var(--twm-flow-ok); }
@@ -12767,7 +12789,7 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
12767
12789
  }
12768
12790
  .twm-flow-graph__port--can-drop .twm-flow-graph__port-dot {
12769
12791
  background: var(--twm-flow-focus);
12770
- box-shadow: 0 0 0 3px rgba(0, 122, 204, 0.35);
12792
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-bright) 35%, transparent);
12771
12793
  }
12772
12794
 
12773
12795
  /* ── a line ─────────────────────────────────────────────────────────── */