flexdesk 0.17.6 → 0.17.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/LICENSE +0 -0
- package/README.md +0 -0
- package/THIRD_PARTY_LICENSES.md +0 -0
- package/canvas.js +0 -0
- package/charts.js +0 -0
- package/core.js +0 -0
- package/css/base.css +68 -0
- package/css/flexdesk.css +77 -2
- package/css/overrides.css +0 -0
- package/css/reset.css +0 -0
- package/css/tokens.css +11 -0
- package/dist/canvas.js +0 -0
- package/dist/canvas.js.map +0 -0
- package/dist/charts.js +1 -1
- package/dist/charts.js.map +0 -0
- package/dist/chunk-3PHCPZHT.js +0 -0
- package/dist/chunk-3PHCPZHT.js.map +0 -0
- package/dist/chunk-CVMCZZX2.js +0 -0
- package/dist/chunk-CVMCZZX2.js.map +0 -0
- package/dist/chunk-D3COLZZ2.js +0 -0
- package/dist/chunk-D3COLZZ2.js.map +0 -0
- package/dist/{chunk-RMTRWWEO.js → chunk-EIYNF4BD.js} +66 -25
- package/dist/chunk-EIYNF4BD.js.map +7 -0
- package/dist/chunk-FOOS3T5L.js +0 -0
- package/dist/chunk-FOOS3T5L.js.map +0 -0
- package/dist/chunk-GOQLR5WR.js +0 -0
- package/dist/chunk-GOQLR5WR.js.map +0 -0
- package/dist/chunk-HNU6MM2B.js +0 -0
- package/dist/chunk-HNU6MM2B.js.map +0 -0
- package/dist/chunk-HYJYYEPK.js +0 -0
- package/dist/chunk-HYJYYEPK.js.map +0 -0
- package/dist/chunk-JKZLNKG6.js +0 -0
- package/dist/chunk-JKZLNKG6.js.map +0 -0
- package/dist/chunk-JYWURG5T.js +0 -0
- package/dist/chunk-JYWURG5T.js.map +0 -0
- package/dist/chunk-LWV23YVE.js +0 -0
- package/dist/chunk-LWV23YVE.js.map +0 -0
- package/dist/chunk-N7HC3ADV.js +0 -0
- package/dist/chunk-N7HC3ADV.js.map +0 -0
- package/dist/chunk-RKNFBX5K.js +0 -0
- package/dist/chunk-RKNFBX5K.js.map +0 -0
- package/dist/chunk-UURZ37SD.js +0 -0
- package/dist/chunk-UURZ37SD.js.map +0 -0
- package/dist/chunk-UWO43BZU.js +0 -0
- package/dist/chunk-UWO43BZU.js.map +0 -0
- package/dist/chunk-WVFGV5FT.js +0 -0
- package/dist/chunk-WVFGV5FT.js.map +0 -0
- package/dist/core.js +0 -0
- package/dist/core.js.map +0 -0
- package/dist/editor.js +0 -0
- package/dist/editor.js.map +0 -0
- package/dist/flexdesk.css +77 -2
- package/dist/flow.js +0 -0
- package/dist/flow.js.map +0 -0
- package/dist/host.js +0 -0
- package/dist/host.js.map +0 -0
- package/dist/reset.css +0 -0
- package/dist/tile_registry-6WZPTUZV.js +0 -0
- package/dist/tile_registry-6WZPTUZV.js.map +0 -0
- package/dist/tiles.js +1 -1
- package/dist/tiles.js.map +0 -0
- package/dist/tokens.css +11 -0
- package/dist/widgets.js +0 -0
- package/dist/widgets.js.map +0 -0
- package/dist/wm.js +0 -0
- package/dist/wm.js.map +0 -0
- package/docs/README.md +0 -0
- package/docs/best-practices.md +0 -0
- package/docs/components/charts.md +66 -0
- package/docs/components/command-palette.md +0 -0
- package/docs/components/conversation.md +0 -0
- package/docs/components/data-table-grid.md +0 -0
- package/docs/components/data-table.md +0 -0
- package/docs/components/editor.md +0 -0
- package/docs/components/flow-canvas-editor.md +0 -0
- package/docs/components/flow-editors.md +0 -0
- package/docs/components/flow-lane-editor.md +0 -0
- package/docs/components/flow-outline-editor.md +0 -0
- package/docs/components/forms-and-dialogs.md +0 -0
- package/docs/components/input-fields.md +0 -0
- package/docs/components/keymap.md +0 -0
- package/docs/components/layout-widgets.md +38 -0
- package/docs/components/markdown-and-outline.md +0 -0
- package/docs/components/menus.md +0 -0
- package/docs/components/notifications.md +0 -0
- package/docs/components/panels-and-desktops.md +0 -0
- package/docs/components/record-list-and-fact-table.md +0 -0
- package/docs/components/settings-view.md +0 -0
- package/docs/components/shell.md +0 -0
- package/docs/components/slide-out-panel.md +0 -0
- package/docs/components/tiles.md +0 -0
- package/docs/components/wizard.md +0 -0
- package/docs/concepts/building-and-packaging.md +0 -0
- package/docs/concepts/domain-neutrality.md +0 -0
- package/docs/concepts/host-port.md +0 -0
- package/docs/concepts/packages-and-entry-points.md +0 -0
- package/docs/concepts/peer-dependencies.md +0 -0
- package/docs/concepts/state-guard.md +0 -0
- package/docs/concepts/styling.md +0 -0
- package/docs/quickstart.md +0 -0
- package/editor.js +0 -0
- package/flow.js +0 -0
- package/host.js +0 -0
- package/package.json +1 -1
- package/src/canvas/canvas_adapter.js +0 -0
- package/src/canvas/edge_router.js +0 -0
- package/src/canvas/graph/connector_router.js +0 -0
- package/src/canvas/graph/history_service.js +0 -0
- package/src/canvas/graph/node_platform.js +0 -0
- package/src/canvas/index.js +0 -0
- package/src/canvas/layered_layout.js +0 -0
- package/src/charts/chart_types.js +0 -0
- package/src/charts/data_series_plot_window.js +0 -0
- package/src/charts/downsample.js +0 -0
- package/src/charts/plot_config.js +0 -0
- package/src/charts/plot_config_editor.js +0 -0
- package/src/charts/plot_grid.js +16 -4
- package/src/charts/plot_popout_window.js +2 -1
- package/src/charts/plotly_wrapper.js +0 -0
- package/src/charts/series_transforms.js +114 -20
- package/src/core/event_bus.js +0 -0
- package/src/core/logging.js +0 -0
- package/src/core/settings.js +0 -0
- package/src/core/state_guard.js +0 -0
- package/src/core/state_guard_config.js +0 -0
- package/src/core/state_machine.js +0 -0
- package/src/editor/editor_pane.js +0 -0
- package/src/editor/monaco_editor_factory.js +0 -0
- package/src/editor/monaco_loader.js +0 -0
- package/src/editor/notebook_search.js +0 -0
- package/src/editor/notebook_tab_bar.js +0 -0
- package/src/editor/notebook_undo_manager.js +0 -0
- package/src/editor/split_pane_container.js +0 -0
- package/src/flow/canvas_editor/connections.js +0 -0
- package/src/flow/canvas_editor/editor.js +0 -0
- package/src/flow/canvas_editor/index.js +0 -0
- package/src/flow/canvas_editor/layout.js +0 -0
- package/src/flow/canvas_editor/strings.js +0 -0
- package/src/flow/kit/always_before.js +0 -0
- package/src/flow/kit/catalogue.js +0 -0
- package/src/flow/kit/chip_input.js +0 -0
- package/src/flow/kit/dom.js +0 -0
- package/src/flow/kit/findings.js +0 -0
- package/src/flow/kit/history.js +0 -0
- package/src/flow/kit/index.js +0 -0
- package/src/flow/kit/keys.js +0 -0
- package/src/flow/kit/logic_graph.js +0 -0
- package/src/flow/kit/references.js +0 -0
- package/src/flow/kit/settings_panel.js +0 -0
- package/src/flow/kit/settings_schema.js +0 -0
- package/src/flow/kit/step_picker.js +0 -0
- package/src/flow/kit/strings.js +0 -0
- package/src/flow/kit/value_picker.js +0 -0
- package/src/flow/kit/widgets.js +0 -0
- package/src/flow/lanes/editor.js +0 -0
- package/src/flow/lanes/index.js +0 -0
- package/src/flow/lanes/layout.js +0 -0
- package/src/flow/lanes/pipeline.js +0 -0
- package/src/flow/lanes/preview.js +0 -0
- package/src/flow/lanes/strings.js +0 -0
- package/src/flow/outline/editor.js +0 -0
- package/src/flow/outline/index.js +0 -0
- package/src/flow/outline/mapping.js +0 -0
- package/src/flow/outline/menu.js +0 -0
- package/src/flow/outline/operations.js +0 -0
- package/src/flow/outline/recognise.js +0 -0
- package/src/flow/outline/strings.js +0 -0
- package/src/help/help_modal.js +0 -0
- package/src/help/help_registry.js +0 -0
- package/src/host/external_links.js +0 -0
- package/src/host/file_picker.js +0 -0
- package/src/host/host.js +0 -0
- package/src/host/photino_host.js +0 -0
- package/src/host/photino_host.md +0 -0
- package/src/host/pywebview_host.js +0 -0
- package/src/tiles/chart_tiles.js +0 -0
- package/src/tiles/config_schema.js +0 -0
- package/src/tiles/figure_tile.js +0 -0
- package/src/tiles/layout_persistence.js +0 -0
- package/src/tiles/list_tiles.js +0 -0
- package/src/tiles/scope_picker.js +0 -0
- package/src/tiles/tile_base.js +0 -0
- package/src/tiles/tile_config_form.js +0 -0
- package/src/tiles/tile_grid.js +0 -0
- package/src/tiles/tile_registry.js +0 -0
- package/src/tiling/bottom_panel_tabs.js +0 -0
- package/src/tiling/command_palette.js +0 -0
- package/src/tiling/content_registry.js +0 -0
- package/src/tiling/desktops.js +0 -0
- package/src/tiling/entity_sources.js +0 -0
- package/src/tiling/keymap.js +0 -0
- package/src/tiling/kind_taxonomy.js +0 -0
- package/src/tiling/landing_table.js +0 -0
- package/src/tiling/loading_overlay.js +0 -0
- package/src/tiling/nav_panel.js +0 -0
- package/src/tiling/page_factory.js +0 -0
- package/src/tiling/panel_availability.js +0 -0
- package/src/tiling/panel_keys.js +0 -0
- package/src/tiling/shell.js +0 -0
- package/src/tiling/tab_strip.js +0 -0
- package/src/tiling/tile_breadcrumb.js +0 -0
- package/src/tiling/tile_renderer.js +0 -0
- package/src/tiling/tile_tab_menu.js +0 -0
- package/src/tiling/tile_tree.js +0 -0
- package/src/tiling/wm.js +0 -0
- package/src/tiling/zoom.js +0 -0
- package/src/ui/base/component_base.js +0 -0
- package/src/ui/base/controller_base.js +0 -0
- package/src/ui/base/page_base.js +0 -0
- package/src/ui/components/about_dialog.js +0 -0
- package/src/ui/components/action_dropdown.js +0 -0
- package/src/ui/components/alert_log.js +0 -0
- package/src/ui/components/alerts_pane.js +0 -0
- package/src/ui/components/attribute_list_editor.js +0 -0
- package/src/ui/components/autocomplete_field.js +0 -0
- package/src/ui/components/cell_editor_host.js +0 -0
- package/src/ui/components/cell_editors.js +0 -0
- package/src/ui/components/cell_grid.js +0 -0
- package/src/ui/components/cell_paste.js +0 -0
- package/src/ui/components/cell_selection.js +0 -0
- package/src/ui/components/choice_controls.js +0 -0
- package/src/ui/components/color_field.js +0 -0
- package/src/ui/components/color_list_field.js +0 -0
- package/src/ui/components/column_fit.js +0 -0
- package/src/ui/components/column_groups.js +0 -0
- package/src/ui/components/column_order.js +0 -0
- package/src/ui/components/computing_status_window.js +0 -0
- package/src/ui/components/confirm_dialog.js +0 -0
- package/src/ui/components/context_menu.js +0 -0
- package/src/ui/components/conversation_view.js +0 -0
- package/src/ui/components/crosstab.js +0 -0
- package/src/ui/components/data_table.js +0 -0
- package/src/ui/components/detail_header.js +0 -0
- package/src/ui/components/document_outline.js +0 -0
- package/src/ui/components/drag_reorder.js +0 -0
- package/src/ui/components/fact_table.js +0 -0
- package/src/ui/components/fill_handle.js +0 -0
- package/src/ui/components/gallery_picker.js +0 -0
- package/src/ui/components/header_actions.js +0 -0
- package/src/ui/components/inline_renamer.js +0 -0
- package/src/ui/components/job_progress.js +0 -0
- package/src/ui/components/managed_window.js +0 -0
- package/src/ui/components/menu_bar.js +0 -0
- package/src/ui/components/modal.js +0 -0
- package/src/ui/components/notification_history.js +0 -0
- package/src/ui/components/progress.js +0 -0
- package/src/ui/components/record_list.js +0 -0
- package/src/ui/components/row_activation.js +0 -0
- package/src/ui/components/section_stack.js +0 -0
- package/src/ui/components/series.js +0 -0
- package/src/ui/components/settings_view.js +0 -0
- package/src/ui/components/slide_out_panel.js +0 -0
- package/src/ui/components/slider_field.js +0 -0
- package/src/ui/components/sortable_list.js +0 -0
- package/src/ui/components/staged_edits.js +0 -0
- package/src/ui/components/staged_history.js +0 -0
- package/src/ui/components/table_filter_chips.js +0 -0
- package/src/ui/components/table_state_store.js +0 -0
- package/src/ui/components/table_structure.js +0 -0
- package/src/ui/components/table_values.js +0 -0
- package/src/ui/components/tabs.js +0 -0
- package/src/ui/components/tag_input.js +0 -0
- package/src/ui/components/toast.js +0 -0
- package/src/ui/components/toggle_field.js +0 -0
- package/src/ui/components/tree_view.js +0 -0
- package/src/ui/components/tsv.js +0 -0
- package/src/ui/components/window_taskbar.js +0 -0
- package/src/ui/components/wizard.js +0 -0
- package/src/ui/controllers/window_chrome_controller.js +0 -0
- package/src/ui/notification_center.js +0 -0
- package/src/ui/utils/auto_scrollbars.js +0 -0
- package/src/ui/utils/markdown.js +0 -0
- package/src/ui/utils/native_context_menu.js +0 -0
- package/src/ui/utils/overlay_scrollbar.js +0 -0
- package/src/ui/utils/raf_resize_observer.js +0 -0
- package/src/ui/utils/scroll_lock.js +0 -0
- package/src/ui/utils/strip_scroll.js +0 -0
- package/src/ui/utils/tooltip_service.js +0 -0
- package/tiles.js +0 -0
- package/widgets.js +0 -0
- package/wm.js +0 -0
- package/dist/chunk-RMTRWWEO.js.map +0 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,41 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.17.8 (2026-10-24)
|
|
4
|
+
|
|
5
|
+
A patch release: everything below is additive. Every fix is documented in a
|
|
6
|
+
section of the docs headed "(0.17.8)"; each entry links to it.
|
|
7
|
+
|
|
8
|
+
### Added and changed
|
|
9
|
+
|
|
10
|
+
- [A series transform knows its series, and takes a choice parameter](docs/components/charts.md#a-series-transform-knows-its-series-and-takes-a-choice-parameter-0178): a `seriesTransforms` entry's `run` gets a third argument, `run(y, params, { series, subplot, results, resolveSeries })`: the subplot's series entry the trace was drawn from (null for any other trace, such as an overlay), the subplot config, the results the figure was drawn from and the `resolveSeries` it was drawn with, so a transform can resolve the same series from other results (a baseline scenario) the same way. `renderPlotGrid`, and so `PlotPopoutWindow`, run transforms on the same traces as in 0.17.7 and draw the same derived traces; `deriveSeriesTraces` takes the new optional `seriesOf`, `results` and `resolveSeries` options, and without them passes `series`, `results` and `resolveSeries` as null. A parameter declared `{ type: 'choice', options }` (an array of `{ value, label }`, or a function `(subplot) => options`) is drawn by `renderSeriesTransformControls` as a select (choice_controls' `selectBox`, styled by the new `.twm-series-transforms__select` rule) instead of a number field; the pick is saved under `subplot.transforms.<id>.params` and passed to `run` like a number, and without a `default` or a saved value it is the first enabled option. A transform written as `run(y, params)` with number parameters works and draws exactly as before (STORY-0111).
|
|
11
|
+
|
|
12
|
+
### Removed or renamed exports
|
|
13
|
+
|
|
14
|
+
None. Compared with 0.17.7, 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: a series transform's `run` gets a third argument and
|
|
18
|
+
`deriveSeriesTraces` takes three more options, all optional, and flexdesk.css
|
|
19
|
+
gains a `.twm-series-transforms__select` rule (see above).
|
|
20
|
+
|
|
21
|
+
## 0.17.7 (2026-10-24)
|
|
22
|
+
|
|
23
|
+
A patch release: everything below is additive. Every fix is documented in a
|
|
24
|
+
section of the docs headed "(0.17.7)"; each entry links to it.
|
|
25
|
+
|
|
26
|
+
### Added and changed
|
|
27
|
+
|
|
28
|
+
- [`installOverlayScrollbar` is styled by flexdesk.css](docs/components/layout-widgets.md#installoverlayscrollbar-is-styled-by-flexdeskcss-0177): the `.overlay-scrollbar-v` and `.overlay-scrollbar-h` bars that `installOverlayScrollbar` (and `installCollapsibleScrollbars`, `installTabsScrollbars` and `installWorkspaceScrollbars`, which build on it) appends now have rules in flexdesk.css, so they work with only FlexDesk's stylesheets loaded. The bar is `position: absolute` at the container's right or bottom edge, `--scrollbar-size` thick, on `--z-scrollbar`; it starts at `opacity: 0` and shows on hover while the container overflows; it takes no pointer events except on its thumb, which is at least 30px long. Its colours and rounding are the new tokens `--scrollbar-track`, `--scrollbar-thumb`, `--scrollbar-thumb-hover`, `--scrollbar-thumb-active` and `--scrollbar-radius` in tokens.css. Until now no FlexDesk stylesheet styled these classes, so the bar was `position: static`, fed the container's content height and grew it without limit unless the embedder brought its own CSS (BUG-0039).
|
|
29
|
+
|
|
30
|
+
### Removed or renamed exports
|
|
31
|
+
|
|
32
|
+
None. Compared with 0.17.6, across every entry point (`core`, `widgets`, `wm`,
|
|
33
|
+
`host`, `canvas`, `flow`, `charts`, `tiles`, `editor`) and the package
|
|
34
|
+
`exports` map, no export was added, removed or renamed. Not an export but
|
|
35
|
+
worth knowing: tokens.css gains the `--scrollbar-*` and `--z-scrollbar`
|
|
36
|
+
custom properties, and flexdesk.css gains rules for `.overlay-scrollbar-v`,
|
|
37
|
+
`.overlay-scrollbar-h` and their `.track` and `.thumb` (see above).
|
|
38
|
+
|
|
3
39
|
## 0.17.6 (2026-10-24)
|
|
4
40
|
|
|
5
41
|
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
|
package/THIRD_PARTY_LICENSES.md
CHANGED
|
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
|
@@ -5969,6 +5969,74 @@ button.twm-about-dialog__btn--close:focus {
|
|
|
5969
5969
|
}
|
|
5970
5970
|
|
|
5971
5971
|
|
|
5972
|
+
/* ══ OVERLAY SCROLLBARS (0.17.7) ═════════════════════════════════════
|
|
5973
|
+
*
|
|
5974
|
+
* `installOverlayScrollbar(container, { orientation })`
|
|
5975
|
+
* (src/ui/utils/overlay_scrollbar.js) appends a `.overlay-scrollbar-v` or
|
|
5976
|
+
* `.overlay-scrollbar-h` holding a `.track` and a `.thumb`, and sets their
|
|
5977
|
+
* top/left/height/width from the container's scroll position. The bar is
|
|
5978
|
+
* absolute, so it takes no layout space: a static bar is content, its height
|
|
5979
|
+
* feeds the container's scrollHeight, and the container grows without limit
|
|
5980
|
+
* (BUG-0039). The script sets `data-scrollable` on the container and drives
|
|
5981
|
+
* the bar's opacity and pointer events itself (shown on hover or focus while
|
|
5982
|
+
* the container overflows, kept while the thumb is dragged); these rules are
|
|
5983
|
+
* the hidden starting state, the geometry and the colours. The bar takes no
|
|
5984
|
+
* pointer events, so content under it stays clickable; the thumb takes them
|
|
5985
|
+
* back to be dragged. */
|
|
5986
|
+
.overlay-scrollbar-v,
|
|
5987
|
+
.overlay-scrollbar-h {
|
|
5988
|
+
position: absolute;
|
|
5989
|
+
pointer-events: none;
|
|
5990
|
+
opacity: 0;
|
|
5991
|
+
transition: opacity var(--transition-fast);
|
|
5992
|
+
z-index: var(--z-scrollbar);
|
|
5993
|
+
}
|
|
5994
|
+
.overlay-scrollbar-v {
|
|
5995
|
+
top: 0;
|
|
5996
|
+
right: 0;
|
|
5997
|
+
width: var(--scrollbar-size);
|
|
5998
|
+
}
|
|
5999
|
+
.overlay-scrollbar-h {
|
|
6000
|
+
left: 0;
|
|
6001
|
+
bottom: 0;
|
|
6002
|
+
height: var(--scrollbar-size);
|
|
6003
|
+
}
|
|
6004
|
+
.overlay-scrollbar-v .track,
|
|
6005
|
+
.overlay-scrollbar-h .track {
|
|
6006
|
+
position: absolute;
|
|
6007
|
+
inset: 0;
|
|
6008
|
+
background: var(--scrollbar-track);
|
|
6009
|
+
border-radius: var(--scrollbar-radius);
|
|
6010
|
+
}
|
|
6011
|
+
.overlay-scrollbar-v .thumb,
|
|
6012
|
+
.overlay-scrollbar-h .thumb {
|
|
6013
|
+
position: absolute;
|
|
6014
|
+
background: var(--scrollbar-thumb);
|
|
6015
|
+
border-radius: var(--scrollbar-radius);
|
|
6016
|
+
pointer-events: auto;
|
|
6017
|
+
cursor: pointer;
|
|
6018
|
+
transition: background 80ms ease;
|
|
6019
|
+
}
|
|
6020
|
+
.overlay-scrollbar-v .thumb {
|
|
6021
|
+
right: 0;
|
|
6022
|
+
width: 100%;
|
|
6023
|
+
min-height: 30px;
|
|
6024
|
+
}
|
|
6025
|
+
.overlay-scrollbar-h .thumb {
|
|
6026
|
+
bottom: 0;
|
|
6027
|
+
height: 100%;
|
|
6028
|
+
min-width: 30px;
|
|
6029
|
+
}
|
|
6030
|
+
.overlay-scrollbar-v .thumb:hover,
|
|
6031
|
+
.overlay-scrollbar-h .thumb:hover {
|
|
6032
|
+
background: var(--scrollbar-thumb-hover);
|
|
6033
|
+
}
|
|
6034
|
+
.overlay-scrollbar-v .thumb:active,
|
|
6035
|
+
.overlay-scrollbar-h .thumb:active {
|
|
6036
|
+
background: var(--scrollbar-thumb-active);
|
|
6037
|
+
}
|
|
6038
|
+
|
|
6039
|
+
|
|
5972
6040
|
/* ══ RECORD LIST & FACT SHEET (0.7.0) ══════════════════════════════════
|
|
5973
6041
|
* `createRecordList` (src/ui/components/record_list.js) and
|
|
5974
6042
|
* `createFactTable` (src/ui/components/fact_table.js). Neither has a height
|
package/css/flexdesk.css
CHANGED
|
@@ -9593,6 +9593,74 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
|
|
|
9593
9593
|
}
|
|
9594
9594
|
|
|
9595
9595
|
|
|
9596
|
+
/* ══ OVERLAY SCROLLBARS (0.17.7) ═════════════════════════════════════
|
|
9597
|
+
*
|
|
9598
|
+
* `installOverlayScrollbar(container, { orientation })`
|
|
9599
|
+
* (src/ui/utils/overlay_scrollbar.js) appends a `.overlay-scrollbar-v` or
|
|
9600
|
+
* `.overlay-scrollbar-h` holding a `.track` and a `.thumb`, and sets their
|
|
9601
|
+
* top/left/height/width from the container's scroll position. The bar is
|
|
9602
|
+
* absolute, so it takes no layout space: a static bar is content, its height
|
|
9603
|
+
* feeds the container's scrollHeight, and the container grows without limit
|
|
9604
|
+
* (BUG-0039). The script sets `data-scrollable` on the container and drives
|
|
9605
|
+
* the bar's opacity and pointer events itself (shown on hover or focus while
|
|
9606
|
+
* the container overflows, kept while the thumb is dragged); these rules are
|
|
9607
|
+
* the hidden starting state, the geometry and the colours. The bar takes no
|
|
9608
|
+
* pointer events, so content under it stays clickable; the thumb takes them
|
|
9609
|
+
* back to be dragged. */
|
|
9610
|
+
.overlay-scrollbar-v,
|
|
9611
|
+
.overlay-scrollbar-h {
|
|
9612
|
+
position: absolute;
|
|
9613
|
+
pointer-events: none;
|
|
9614
|
+
opacity: 0;
|
|
9615
|
+
transition: opacity var(--transition-fast);
|
|
9616
|
+
z-index: var(--z-scrollbar);
|
|
9617
|
+
}
|
|
9618
|
+
.overlay-scrollbar-v {
|
|
9619
|
+
top: 0;
|
|
9620
|
+
right: 0;
|
|
9621
|
+
width: var(--scrollbar-size);
|
|
9622
|
+
}
|
|
9623
|
+
.overlay-scrollbar-h {
|
|
9624
|
+
left: 0;
|
|
9625
|
+
bottom: 0;
|
|
9626
|
+
height: var(--scrollbar-size);
|
|
9627
|
+
}
|
|
9628
|
+
.overlay-scrollbar-v .track,
|
|
9629
|
+
.overlay-scrollbar-h .track {
|
|
9630
|
+
position: absolute;
|
|
9631
|
+
inset: 0;
|
|
9632
|
+
background: var(--scrollbar-track);
|
|
9633
|
+
border-radius: var(--scrollbar-radius);
|
|
9634
|
+
}
|
|
9635
|
+
.overlay-scrollbar-v .thumb,
|
|
9636
|
+
.overlay-scrollbar-h .thumb {
|
|
9637
|
+
position: absolute;
|
|
9638
|
+
background: var(--scrollbar-thumb);
|
|
9639
|
+
border-radius: var(--scrollbar-radius);
|
|
9640
|
+
pointer-events: auto;
|
|
9641
|
+
cursor: pointer;
|
|
9642
|
+
transition: background 80ms ease;
|
|
9643
|
+
}
|
|
9644
|
+
.overlay-scrollbar-v .thumb {
|
|
9645
|
+
right: 0;
|
|
9646
|
+
width: 100%;
|
|
9647
|
+
min-height: 30px;
|
|
9648
|
+
}
|
|
9649
|
+
.overlay-scrollbar-h .thumb {
|
|
9650
|
+
bottom: 0;
|
|
9651
|
+
height: 100%;
|
|
9652
|
+
min-width: 30px;
|
|
9653
|
+
}
|
|
9654
|
+
.overlay-scrollbar-v .thumb:hover,
|
|
9655
|
+
.overlay-scrollbar-h .thumb:hover {
|
|
9656
|
+
background: var(--scrollbar-thumb-hover);
|
|
9657
|
+
}
|
|
9658
|
+
.overlay-scrollbar-v .thumb:active,
|
|
9659
|
+
.overlay-scrollbar-h .thumb:active {
|
|
9660
|
+
background: var(--scrollbar-thumb-active);
|
|
9661
|
+
}
|
|
9662
|
+
|
|
9663
|
+
|
|
9596
9664
|
/* ══ RECORD LIST & FACT SHEET (0.7.0) ══════════════════════════════════
|
|
9597
9665
|
* `createRecordList` (src/ui/components/record_list.js) and
|
|
9598
9666
|
* `createFactTable` (src/ui/components/fact_table.js). Neither has a height
|
|
@@ -10740,8 +10808,8 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
|
|
|
10740
10808
|
/* ══ SERIES TRANSFORMS ═══════════════════════════════════════════════
|
|
10741
10809
|
*
|
|
10742
10810
|
* `renderSeriesTransformControls` (src/charts/series_transforms.js): per
|
|
10743
|
-
* injected transform, a group with a toggle per output and a number field
|
|
10744
|
-
* parameter, in a subplot's config. */
|
|
10811
|
+
* injected transform, a group with a toggle per output and a number field (or,
|
|
10812
|
+
* for a choice parameter, a select) per parameter, in a subplot's config. */
|
|
10745
10813
|
.twm-series-transforms {
|
|
10746
10814
|
display: flex;
|
|
10747
10815
|
flex-direction: column;
|
|
@@ -10781,6 +10849,13 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
|
|
|
10781
10849
|
.twm-series-transforms__param:disabled {
|
|
10782
10850
|
opacity: 0.5;
|
|
10783
10851
|
}
|
|
10852
|
+
/* A choice parameter's select (0.17.8): as wide as its option labels. */
|
|
10853
|
+
.twm-series-transforms__select {
|
|
10854
|
+
width: auto;
|
|
10855
|
+
min-width: 96px;
|
|
10856
|
+
max-width: 60%;
|
|
10857
|
+
cursor: pointer;
|
|
10858
|
+
}
|
|
10784
10859
|
/* ══ end SERIES TRANSFORMS ══ */
|
|
10785
10860
|
|
|
10786
10861
|
/* ══ PLOT GRID ════════════════════════════════════════════════════════
|
package/css/overrides.css
CHANGED
|
File without changes
|
package/css/reset.css
CHANGED
|
File without changes
|
package/css/tokens.css
CHANGED
|
@@ -102,6 +102,14 @@
|
|
|
102
102
|
--state-active: rgba(255, 255, 255, 0.08);
|
|
103
103
|
--state-selected: rgba(0, 122, 204, 0.15);
|
|
104
104
|
|
|
105
|
+
/* ── Overlay scrollbars (installOverlayScrollbar) ─────────── */
|
|
106
|
+
--scrollbar-size: 6px;
|
|
107
|
+
--scrollbar-radius: 3px;
|
|
108
|
+
--scrollbar-track: rgba(255, 255, 255, 0.08);
|
|
109
|
+
--scrollbar-thumb: rgba(255, 255, 255, 0.28);
|
|
110
|
+
--scrollbar-thumb-hover: rgba(255, 255, 255, 0.38);
|
|
111
|
+
--scrollbar-thumb-active: rgba(255, 255, 255, 0.48);
|
|
112
|
+
|
|
105
113
|
/* ── Shadows / elevation ──────────────────────────────────── */
|
|
106
114
|
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3);
|
|
107
115
|
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);
|
|
@@ -119,6 +127,9 @@
|
|
|
119
127
|
stack from 6000 to 6999 (managed_window.js), so a popover at
|
|
120
128
|
--z-popover would open behind the window that opened it. */
|
|
121
129
|
--z-over-windows: 7100;
|
|
130
|
+
/* An overlay scrollbar inside a scroll container: over the container's
|
|
131
|
+
content and its dropdowns, under managed windows (6000+). */
|
|
132
|
+
--z-scrollbar: 500;
|
|
122
133
|
|
|
123
134
|
/* ── Transitions ──────────────────────────────────────────── */
|
|
124
135
|
--transition-fast: 120ms ease;
|
package/dist/canvas.js
CHANGED
|
File without changes
|
package/dist/canvas.js.map
CHANGED
|
File without changes
|
package/dist/charts.js
CHANGED
package/dist/charts.js.map
CHANGED
|
File without changes
|
package/dist/chunk-3PHCPZHT.js
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/chunk-CVMCZZX2.js
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/chunk-D3COLZZ2.js
CHANGED
|
File without changes
|
|
File without changes
|
|
@@ -3,7 +3,9 @@ import {
|
|
|
3
3
|
createRafResizeObserver
|
|
4
4
|
} from "./chunk-LWV23YVE.js";
|
|
5
5
|
import {
|
|
6
|
-
ManagedWindow
|
|
6
|
+
ManagedWindow,
|
|
7
|
+
flatChoices,
|
|
8
|
+
selectBox
|
|
7
9
|
} from "./chunk-CVMCZZX2.js";
|
|
8
10
|
|
|
9
11
|
// src/charts/plotly_wrapper.js
|
|
@@ -1177,12 +1179,25 @@ function migrateSingleChart(data) {
|
|
|
1177
1179
|
}
|
|
1178
1180
|
|
|
1179
1181
|
// src/charts/series_transforms.js
|
|
1180
|
-
|
|
1182
|
+
var isChoice = (spec) => spec?.type === "choice";
|
|
1183
|
+
function choiceOptions(spec, subplot) {
|
|
1184
|
+
const options = typeof spec.options === "function" ? spec.options(subplot) : spec.options;
|
|
1185
|
+
return Array.isArray(options) ? options : [];
|
|
1186
|
+
}
|
|
1187
|
+
function firstChoice(spec, subplot) {
|
|
1188
|
+
const flat = flatChoices(choiceOptions(spec, subplot));
|
|
1189
|
+
return (flat.find((o) => !o.disabled) ?? flat[0])?.value;
|
|
1190
|
+
}
|
|
1191
|
+
function resolveParams(transform, state, subplot) {
|
|
1192
|
+
const saved = state?.params ?? {};
|
|
1181
1193
|
const params = {};
|
|
1182
1194
|
for (const [name, spec] of Object.entries(transform.params ?? {})) {
|
|
1183
1195
|
params[name] = spec?.default;
|
|
1196
|
+
if (isChoice(spec) && spec.default === void 0 && saved[name] === void 0) {
|
|
1197
|
+
params[name] = firstChoice(spec, subplot);
|
|
1198
|
+
}
|
|
1184
1199
|
}
|
|
1185
|
-
return { ...params, ...
|
|
1200
|
+
return { ...params, ...saved };
|
|
1186
1201
|
}
|
|
1187
1202
|
function enabledOutputs(transform, state) {
|
|
1188
1203
|
return Object.keys(transform.outputs ?? {}).filter((name) => state?.outputs?.[name] === true);
|
|
@@ -1191,19 +1206,20 @@ function isEligible(trace) {
|
|
|
1191
1206
|
const type = trace.type ?? "scatter";
|
|
1192
1207
|
return (type === "scatter" || type === "scattergl") && Array.isArray(trace.y);
|
|
1193
1208
|
}
|
|
1194
|
-
async function deriveSeriesTraces(traces, subplot, seriesTransforms, { onError } = {}) {
|
|
1209
|
+
async function deriveSeriesTraces(traces, subplot, seriesTransforms, { onError, seriesOf, results, resolveSeries } = {}) {
|
|
1195
1210
|
const derived = [];
|
|
1196
1211
|
if (!seriesTransforms) return derived;
|
|
1197
|
-
const sources = traces.filter(isEligible);
|
|
1212
|
+
const sources = traces.filter(isEligible).map((trace) => ({ trace, series: typeof seriesOf === "function" ? seriesOf(trace) ?? null : null }));
|
|
1198
1213
|
for (const [transformId, transform] of Object.entries(seriesTransforms)) {
|
|
1199
1214
|
const state = subplot?.transforms?.[transformId];
|
|
1200
1215
|
const outputs = enabledOutputs(transform, state);
|
|
1201
1216
|
if (!outputs.length || typeof transform?.run !== "function") continue;
|
|
1202
|
-
const params = resolveParams(transform, state);
|
|
1203
|
-
for (const source of sources) {
|
|
1217
|
+
const params = resolveParams(transform, state, subplot);
|
|
1218
|
+
for (const { trace: source, series } of sources) {
|
|
1219
|
+
const context = { series, subplot, results: results ?? null, resolveSeries: resolveSeries ?? null };
|
|
1204
1220
|
let result;
|
|
1205
1221
|
try {
|
|
1206
|
-
result = await transform.run(source.y, params);
|
|
1222
|
+
result = await transform.run(source.y, params, context);
|
|
1207
1223
|
} catch (error) {
|
|
1208
1224
|
onError?.({ transformId, traceName: source.name, error });
|
|
1209
1225
|
continue;
|
|
@@ -1284,22 +1300,43 @@ function renderSeriesTransformControls(container, subplot, seriesTransforms, { o
|
|
|
1284
1300
|
row.className = "twm-series-transforms__row";
|
|
1285
1301
|
const text = document.createElement("span");
|
|
1286
1302
|
text.textContent = spec?.label ?? name;
|
|
1303
|
+
const writeParam = (value) => {
|
|
1304
|
+
const state = stateOf(transformId);
|
|
1305
|
+
const params = { ...state.params ?? {} };
|
|
1306
|
+
if (value === void 0) delete params[name];
|
|
1307
|
+
else params[name] = value;
|
|
1308
|
+
state.params = params;
|
|
1309
|
+
onChange?.();
|
|
1310
|
+
};
|
|
1311
|
+
const saved = subplot.transforms?.[transformId]?.params?.[name];
|
|
1312
|
+
if (isChoice(spec)) {
|
|
1313
|
+
const current2 = saved ?? spec.default ?? firstChoice(spec, subplot);
|
|
1314
|
+
const choice = selectBox(choiceOptions(spec, subplot), current2, {
|
|
1315
|
+
label: spec?.label ?? name,
|
|
1316
|
+
valueAttr: "value",
|
|
1317
|
+
className: "twm-series-transforms__param twm-series-transforms__select"
|
|
1318
|
+
});
|
|
1319
|
+
choice.box.addEventListener("change", () => {
|
|
1320
|
+
const value = choice.valueOf();
|
|
1321
|
+
choice.setOptions(choiceOptions(spec, subplot), value);
|
|
1322
|
+
writeParam(value);
|
|
1323
|
+
});
|
|
1324
|
+
paramInputs.push(choice.box);
|
|
1325
|
+
row.append(text, choice.box);
|
|
1326
|
+
group.appendChild(row);
|
|
1327
|
+
continue;
|
|
1328
|
+
}
|
|
1287
1329
|
const input = document.createElement("input");
|
|
1288
1330
|
input.type = "number";
|
|
1289
1331
|
input.className = "twm-series-transforms__param";
|
|
1290
1332
|
for (const attr of ["min", "max", "step"]) {
|
|
1291
1333
|
if (spec?.[attr] != null) input[attr] = String(spec[attr]);
|
|
1292
1334
|
}
|
|
1293
|
-
const current =
|
|
1335
|
+
const current = saved ?? spec?.default;
|
|
1294
1336
|
input.value = current == null ? "" : String(current);
|
|
1295
1337
|
input.addEventListener("change", () => {
|
|
1296
1338
|
const value = parseFloat(input.value);
|
|
1297
|
-
|
|
1298
|
-
const params = { ...state.params ?? {} };
|
|
1299
|
-
if (Number.isFinite(value)) params[name] = value;
|
|
1300
|
-
else delete params[name];
|
|
1301
|
-
state.params = params;
|
|
1302
|
-
onChange?.();
|
|
1339
|
+
writeParam(Number.isFinite(value) ? value : void 0);
|
|
1303
1340
|
});
|
|
1304
1341
|
paramInputs.push(input);
|
|
1305
1342
|
row.append(text, input);
|
|
@@ -1427,6 +1464,7 @@ function renderPlotGrid(container, plotConfig, results, options = {}) {
|
|
|
1427
1464
|
const yRefByAxisId = {};
|
|
1428
1465
|
let ownCount = 0;
|
|
1429
1466
|
let hiddenCount = 0;
|
|
1467
|
+
const seriesByTrace = /* @__PURE__ */ new Map();
|
|
1430
1468
|
const useX = sp.xAxis && sp.xAxis.useTime === false && sp.xAxis.variable;
|
|
1431
1469
|
const xData = useX ? opts.resolveSeries({ variable: sp.xAxis.variable }, data, sp)?.y ?? time : time;
|
|
1432
1470
|
const yAxes = sp.yAxes ?? [];
|
|
@@ -1461,7 +1499,7 @@ function renderPlotGrid(container, plotConfig, results, options = {}) {
|
|
|
1461
1499
|
if (!resolved?.y) continue;
|
|
1462
1500
|
const x = resolved.x ?? xData;
|
|
1463
1501
|
const y = Array.isArray(resolved.y) ? applyNanHandling(resolved.y, sp.nanHandling ?? "gap", x) : resolved.y;
|
|
1464
|
-
|
|
1502
|
+
const trace = buildTrace({
|
|
1465
1503
|
chartType: sp.chartType || "line",
|
|
1466
1504
|
x,
|
|
1467
1505
|
y,
|
|
@@ -1473,7 +1511,9 @@ function renderPlotGrid(container, plotConfig, results, options = {}) {
|
|
|
1473
1511
|
yAxisId: yRef,
|
|
1474
1512
|
showMarkers: sp.showDataPoints ?? false,
|
|
1475
1513
|
stackGroup: s.stackGroup ?? null
|
|
1476
|
-
})
|
|
1514
|
+
});
|
|
1515
|
+
traces.push(trace);
|
|
1516
|
+
seriesByTrace.set(trace, s);
|
|
1477
1517
|
const overlay = s.overlay ? opts.overlays?.[s.id] : null;
|
|
1478
1518
|
if (!overlay?.years?.length) continue;
|
|
1479
1519
|
const ov = s.overlay;
|
|
@@ -1503,12 +1543,12 @@ function renderPlotGrid(container, plotConfig, results, options = {}) {
|
|
|
1503
1543
|
traces.push(ovTrace);
|
|
1504
1544
|
}
|
|
1505
1545
|
});
|
|
1506
|
-
traces.push(...await deriveSeriesTraces(
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
));
|
|
1546
|
+
traces.push(...await deriveSeriesTraces(traces, sp, opts.seriesTransforms, {
|
|
1547
|
+
onError: opts.onTransformError ?? void 0,
|
|
1548
|
+
seriesOf: (trace) => seriesByTrace.get(trace) ?? null,
|
|
1549
|
+
results: data,
|
|
1550
|
+
resolveSeries: opts.resolveSeries
|
|
1551
|
+
}));
|
|
1512
1552
|
if (opts.derivedTraces) {
|
|
1513
1553
|
const extra = await opts.derivedTraces(traces, sp, { results: data, index });
|
|
1514
1554
|
if (Array.isArray(extra)) traces.push(...extra);
|
|
@@ -1667,7 +1707,8 @@ var PlotPopoutWindow = class {
|
|
|
1667
1707
|
* renders the Config tab. What it returns is disposed (`dispose()`) when the
|
|
1668
1708
|
* window closes, so an editor drawn there (renderPlotConfigEditor) goes with it.
|
|
1669
1709
|
* @param {Object} [options.seriesTransforms] - `{ [id]: transform }` (series_transforms.js);
|
|
1670
|
-
* absent => no derived series are drawn
|
|
1710
|
+
* absent => no derived series are drawn. Each runs as
|
|
1711
|
+
* `run(y, params, { series, subplot, results, resolveSeries })` (renderPlotGrid).
|
|
1671
1712
|
* @param {string} [options.refreshEvent='data:changed'] - Bus event after which the
|
|
1672
1713
|
* window re-reads `getResults()` and redraws.
|
|
1673
1714
|
* @param {{delta?: string|null, complete?: string|null}} [options.streamEvents] - Bus
|
|
@@ -2799,4 +2840,4 @@ export {
|
|
|
2799
2840
|
openPlotPopoutWindow,
|
|
2800
2841
|
openRawTracesWindow
|
|
2801
2842
|
};
|
|
2802
|
-
//# sourceMappingURL=chunk-
|
|
2843
|
+
//# sourceMappingURL=chunk-EIYNF4BD.js.map
|