flexdesk 0.17.13 → 0.17.15
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 +43 -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 +58 -7
- package/css/flexdesk.css +90 -8
- package/css/overrides.css +21 -0
- package/css/reset.css +0 -0
- package/dist/canvas.js +0 -0
- package/dist/canvas.js.map +0 -0
- package/dist/chunk-3PHCPZHT.js +0 -0
- package/dist/chunk-3PHCPZHT.js.map +0 -0
- package/dist/{chunk-IG74S3ZH.js → chunk-AD7FIA3Z.js} +2 -2
- 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-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-N7HC3ADV.js +0 -0
- package/dist/chunk-N7HC3ADV.js.map +0 -0
- package/dist/{chunk-ZMH3OC7H.js → chunk-OEG6NPAN.js} +3 -1
- package/dist/chunk-OEG6NPAN.js.map +7 -0
- package/dist/core.js +3 -18
- package/dist/core.js.map +2 -2
- package/dist/editor.js.map +0 -0
- package/dist/flexdesk.css +90 -8
- package/dist/flow.js +1 -1
- 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 +2 -2
- package/dist/widgets.js +29 -20
- package/dist/widgets.js.map +2 -2
- package/dist/wm.js +205 -35
- package/dist/wm.js.map +3 -3
- package/docs/README.md +1 -1
- package/docs/best-practices.md +1 -1
- 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 +19 -2
- package/docs/components/input-fields.md +0 -0
- package/docs/components/keymap.md +66 -3
- package/docs/components/layout-widgets.md +32 -0
- package/docs/components/markdown-and-outline.md +0 -0
- package/docs/components/menus.md +9 -5
- package/docs/components/notifications.md +0 -0
- package/docs/components/panels-and-desktops.md +56 -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 +15 -0
- package/docs/components/slide-out-panel.md +15 -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 +65 -2
- package/docs/concepts/styling.md +24 -6
- package/docs/quickstart.md +0 -0
- package/editor.js +0 -0
- package/flow.js +0 -0
- package/host.js +0 -0
- package/package.json +2 -2
- 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/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/plotly_wrapper.js +0 -0
- 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 +19 -18
- 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_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_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 +79 -16
- package/src/tiling/entity_sources.js +0 -0
- package/src/tiling/keymap.js +70 -2
- 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 +9 -2
- package/src/tiling/tab_strip.js +0 -0
- package/src/tiling/tile_breadcrumb.js +12 -4
- package/src/tiling/tile_renderer.js +0 -0
- package/src/tiling/tile_tab_menu.js +0 -0
- package/src/tiling/tile_tree.js +63 -5
- package/src/tiling/wm.js +59 -6
- 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/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/conversation_view.js +0 -0
- package/src/ui/components/crosstab.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/menu_bar.js +0 -0
- package/src/ui/components/modal.js +11 -2
- 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 +41 -18
- 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-ZMH3OC7H.js.map +0 -7
- /package/dist/{chunk-IG74S3ZH.js.map → chunk-AD7FIA3Z.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.17.15 (2026-10-26)
|
|
4
|
+
|
|
5
|
+
A patch release with no API change. Its entries change what embedders see: a top-level tile loses its one-segment breadcrumb strip, every `openForm` row lays its inputs out anew, and a slide-out panel no longer crosses what lies right of its host. Each entry links to its section of the docs.
|
|
6
|
+
|
|
7
|
+
### Added and changed
|
|
8
|
+
|
|
9
|
+
- [A tile breadcrumb of one segment is not drawn](docs/components/shell.md#a-tile-breadcrumb-of-one-segment-is-not-drawn-01715): while `mountTileBreadcrumb`'s path is a single segment or none (a top-nav page with no root crumb, trail or entity; an `appGlobal` kind), the strip is `hidden` and the page shell's `.twm-page-shell__breadcrumb` slot takes no room, so a top-level page no longer shows its name twice. `refresh()` shows it again at two segments; longer paths and `renderBreadcrumb` are unchanged (STORY-0124).
|
|
10
|
+
- [The inputs of a row are equally wide](docs/components/forms-and-dialogs.md#the-inputs-of-a-row-are-equally-wide-01715): in an `openForm` `{ row }` each field's basis is its label (the first one's, the 130px label column) and the free space is shared equally, so every input of a row has the same width (up to each control's own padding); until 0.17.14 the first input was squeezed by the label column. A form whose widest row has three or more fields opens at `170 + 230 × fields` px: at least 640px, otherwise at most 90% of the window (BUG-0050).
|
|
11
|
+
- [A slide-out panel is never drawn outside its box](docs/components/slide-out-panel.md#never-drawn-outside-its-box-01715): `SlideOutPanel` no longer slides by a transform; a `clip-path` alone (200ms ease-out) reveals it from its right edge, so opening or closing it no longer crosses the dock panel right of its host (BUG-0051).
|
|
12
|
+
|
|
13
|
+
### Removed or renamed exports
|
|
14
|
+
|
|
15
|
+
None. Compared with 0.17.14, across every entry point and the package
|
|
16
|
+
`exports` map, no export or option was added, removed or renamed. flexdesk.css
|
|
17
|
+
has no new class and defines no new custom property.
|
|
18
|
+
|
|
19
|
+
## 0.17.14 (2026-10-26)
|
|
20
|
+
|
|
21
|
+
A patch release. Everything below is additive except one changed default (see
|
|
22
|
+
"Changed default"). Each entry with a docs section links to it.
|
|
23
|
+
|
|
24
|
+
### Added and changed
|
|
25
|
+
|
|
26
|
+
- [Tree items with row actions](docs/components/layout-widgets.md#tree-items-with-row-actions-01714): `createTreeItem` takes `actions` in the shape `createTreeNode` takes them (`{ id: { icon, title, onClick(id, event) } }`). The buttons (`.twm-tree-node__action-btn`) sit in one line in a `.twm-tree-item__actions` slot at the row's end, shown on hover, on focus within and on the selected item; the slot takes no height, so a row is as tall with actions as without; it is hidden by opacity, so Tab still reaches the buttons; a click on an action does not select the item and a double-click does not reach `onItemDoubleClick`. Without `actions` the markup is unchanged. `createTreeNode`'s action buttons, built by the same code, are now `type="button"`, so inside a form they no longer submit it (STORY-0121).
|
|
27
|
+
- [The digit chords follow the key's position](docs/components/keymap.md#the-digit-chords-follow-the-keys-position-not-its-character-01714): Alt+1..9 and Alt+Shift+1..9 match `event.code` (`Digit1`..`Digit9`), so Alt+Shift+N moves the focused tile to desktop N from a real key press on any layout (BUG-0046).
|
|
28
|
+
- [Spinners turn without keyframes of your own](docs/concepts/styling.md#spinners-turn-without-keyframes-of-your-own-01714): flexdesk.css defines the `@keyframes` its tile-loading, data-table, computing-status and run-progress spinners name (BUG-0047).
|
|
29
|
+
- [A saved layout that cannot be read](docs/components/panels-and-desktops.md#a-saved-layout-that-cannot-be-read-01714): a saved `desktops` layout that is JSON but not a layout is ignored with one warning, and the shell opens its default layout instead of throwing (BUG-0048).
|
|
30
|
+
- `flexdesk/css/tokens` resolves to `dist/tokens.css`, the file the docs name, like `flexdesk/css` and `flexdesk/css/reset` (BUG-0030).
|
|
31
|
+
- [The menu-bar row is a band of its own](docs/components/menus.md#the-menu-bar-in-its-own-row-under-the-top-bar-01713): `.twm-global-menu-bar` has background `var(--surface-0)`, darker than the top bar, and a `1px solid var(--border-strong)` border above and below (was `var(--surface-1)` with a `var(--surface-0)` bottom border), so it is set off from the top bar and the tiles. The row is 1px taller (STORY-0122).
|
|
32
|
+
|
|
33
|
+
### Changed default
|
|
34
|
+
|
|
35
|
+
- `DEFAULT_STATE_GUARD_CONFIG.allowedDatasetKeys` no longer lists thirteen keys that one embedding application had left in it and no FlexDesk widget writes: `scenario-id`, `run-id`, `run-state`, `mirror-input`, `mirror-input-bound`, `mirror-change-bound`, `override-type`, `info-for`, `dsl-state`, `dsl-section-registered`, `dsl-scrollbars-installed`, `dsl-tabs-bound` and `dsl-controls-bound`. An app that writes one of them under a guard built on the defaults lists it on top of them; a strict guard otherwise throws on the write (BUG-0029).
|
|
36
|
+
|
|
37
|
+
### Removed or renamed exports
|
|
38
|
+
|
|
39
|
+
None. Compared with 0.17.13, 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, and no option was
|
|
42
|
+
removed or renamed; `createTreeItem` has one new option, `actions`. Not an
|
|
43
|
+
export but worth knowing: flexdesk.css has one new class,
|
|
44
|
+
`.twm-tree-item__actions`, and defines no new custom property.
|
|
45
|
+
|
|
3
46
|
## 0.17.13 (2026-10-26)
|
|
4
47
|
|
|
5
48
|
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
|
@@ -1282,16 +1282,19 @@ body.twm-dt-col-resizing {
|
|
|
1282
1282
|
* to the top bar does not include it. No z-index, so it is no stacking
|
|
1283
1283
|
* context: the top bar's dropdowns draw over it, and the .twm-menubar inside
|
|
1284
1284
|
* keeps its own styles, its menus (position: fixed, --z-over-windows) drawing
|
|
1285
|
-
* over the page.
|
|
1285
|
+
* over the page. It reads as a band of its own (STORY-0122, 0.17.14): darker
|
|
1286
|
+
* than the top bar, with a border above and below. Its height is the bar's
|
|
1287
|
+
* plus the padding and the two borders. */
|
|
1286
1288
|
.twm-global-menu-bar {
|
|
1287
1289
|
display: flex;
|
|
1288
1290
|
align-items: center;
|
|
1289
1291
|
width: 100%;
|
|
1290
1292
|
box-sizing: border-box;
|
|
1291
1293
|
padding: var(--space-xxs) var(--space-xs);
|
|
1292
|
-
background-color: var(--surface-
|
|
1294
|
+
background-color: var(--surface-0);
|
|
1293
1295
|
color: var(--text-body);
|
|
1294
|
-
border-
|
|
1296
|
+
border-top: 1px solid var(--border-strong);
|
|
1297
|
+
border-bottom: 1px solid var(--border-strong);
|
|
1295
1298
|
overflow: visible; /* the bar's menus extend below */
|
|
1296
1299
|
}
|
|
1297
1300
|
.twm-bar-center {
|
|
@@ -2436,6 +2439,28 @@ body.twm-window-maximized .twm-resize-handle {
|
|
|
2436
2439
|
color: var(--text-dim);
|
|
2437
2440
|
margin-left: var(--space-xs);
|
|
2438
2441
|
}
|
|
2442
|
+
/* Row actions (createTreeItem's `actions`, STORY-0121): one line at the row's
|
|
2443
|
+
* end, after label, subtitle and badge, shown on hover, on focus within and on
|
|
2444
|
+
* the selected item. Hidden by opacity, not display, so the buttons stay in
|
|
2445
|
+
* the tab order (Tab reaches them and :focus-within shows them) and the label
|
|
2446
|
+
* keeps its width on hover. The slot is no taller than the label line, so a
|
|
2447
|
+
* row is as high with actions as without. */
|
|
2448
|
+
.twm-tree-item__actions {
|
|
2449
|
+
display: flex;
|
|
2450
|
+
align-items: center;
|
|
2451
|
+
gap: var(--space-xxs);
|
|
2452
|
+
flex-shrink: 0;
|
|
2453
|
+
height: 0;
|
|
2454
|
+
overflow: visible;
|
|
2455
|
+
opacity: 0;
|
|
2456
|
+
pointer-events: none;
|
|
2457
|
+
}
|
|
2458
|
+
.twm-tree-item:hover > .twm-tree-item__actions,
|
|
2459
|
+
.twm-tree-item:focus-within > .twm-tree-item__actions,
|
|
2460
|
+
.twm-tree-item.selected > .twm-tree-item__actions {
|
|
2461
|
+
opacity: 1;
|
|
2462
|
+
pointer-events: auto;
|
|
2463
|
+
}
|
|
2439
2464
|
/* ═══════════════════════════════════════════════════════════════════════════
|
|
2440
2465
|
Plot Popout Window
|
|
2441
2466
|
═══════════════════════════════════════════════════════════════════════════ */
|
|
@@ -2813,6 +2838,18 @@ body.twm-window-maximized .twm-resize-handle {
|
|
|
2813
2838
|
border-radius: 50%;
|
|
2814
2839
|
animation: computing-spin 0.8s linear infinite;
|
|
2815
2840
|
}
|
|
2841
|
+
/* The keyframes the rule above names. A spinner rule shipped with the animation
|
|
2842
|
+
name and without the `@keyframes` block, which CSS does not report: an
|
|
2843
|
+
undefined name is simply no animation, so the ring was drawn and never
|
|
2844
|
+
turned, and nothing threw, logged or failed a build. `@keyframes` names are
|
|
2845
|
+
global, so this one is not scoped (see `spin`): an embedder that defines
|
|
2846
|
+
its own `computing-spin` wins or loses on source order, and either way the
|
|
2847
|
+
ring turns. A full turn at the rule's own duration, linear and infinite, so
|
|
2848
|
+
the loop has no seam: the arc is back where it started. */
|
|
2849
|
+
@keyframes computing-spin {
|
|
2850
|
+
from { transform: rotate(0deg); }
|
|
2851
|
+
to { transform: rotate(360deg); }
|
|
2852
|
+
}
|
|
2816
2853
|
.twm-computing-status__message {
|
|
2817
2854
|
font-size: var(--font-size-md);
|
|
2818
2855
|
color: #b0b0b0;
|
|
@@ -2858,6 +2895,11 @@ body.twm-window-maximized .twm-resize-handle {
|
|
|
2858
2895
|
flex-shrink: 0;
|
|
2859
2896
|
animation: etl-spin 0.8s linear infinite;
|
|
2860
2897
|
}
|
|
2898
|
+
/* The keyframes the rule above names; see `computing-spin`. */
|
|
2899
|
+
@keyframes etl-spin {
|
|
2900
|
+
from { transform: rotate(0deg); }
|
|
2901
|
+
to { transform: rotate(360deg); }
|
|
2902
|
+
}
|
|
2861
2903
|
.twm-run-progress__message {
|
|
2862
2904
|
font-size: var(--font-size-md);
|
|
2863
2905
|
color: var(--text-primary, #ccc);
|
|
@@ -4782,14 +4824,23 @@ button.twm-about-dialog__btn--close:focus {
|
|
|
4782
4824
|
min-width: min(400px, var(--twm-slide-out-host-w, 400px));
|
|
4783
4825
|
max-width: var(--twm-slide-out-host-w, none);
|
|
4784
4826
|
|
|
4785
|
-
|
|
4786
|
-
|
|
4827
|
+
/* Never drawn outside its final box (BUG-0051). While open the panel
|
|
4828
|
+
* is `position: fixed` at its host's right edge, where the host's
|
|
4829
|
+
* `overflow: hidden` no longer clips it, and its slide from
|
|
4830
|
+
* translateX(100%) was drawn across whatever lies right of the host (a
|
|
4831
|
+
* dock panel). It does not move any more: a clip alone carries the
|
|
4832
|
+
* motion, revealing it from its right edge leftwards, so no frame can
|
|
4833
|
+
* paint outside its box (a transform and a clip animated together can
|
|
4834
|
+
* drift apart, the transform often running on the compositor). The left
|
|
4835
|
+
* inset of -16px keeps the box shadow. */
|
|
4836
|
+
clip-path: inset(0 0 0 100%);
|
|
4837
|
+
transition: clip-path 200ms ease-out, visibility 0s linear 200ms;
|
|
4787
4838
|
visibility: hidden;
|
|
4788
4839
|
}
|
|
4789
4840
|
.twm-slide-out-panel--open {
|
|
4790
|
-
|
|
4841
|
+
clip-path: inset(0 0 0 -16px);
|
|
4791
4842
|
visibility: visible;
|
|
4792
|
-
transition:
|
|
4843
|
+
transition: clip-path 200ms ease-out, visibility 0s linear 0s;
|
|
4793
4844
|
}
|
|
4794
4845
|
/* Header bar */
|
|
4795
4846
|
.twm-slide-out-panel__header {
|
package/css/flexdesk.css
CHANGED
|
@@ -1702,16 +1702,19 @@ body.twm-dt-col-resizing {
|
|
|
1702
1702
|
* to the top bar does not include it. No z-index, so it is no stacking
|
|
1703
1703
|
* context: the top bar's dropdowns draw over it, and the .twm-menubar inside
|
|
1704
1704
|
* keeps its own styles, its menus (position: fixed, --z-over-windows) drawing
|
|
1705
|
-
* over the page.
|
|
1705
|
+
* over the page. It reads as a band of its own (STORY-0122, 0.17.14): darker
|
|
1706
|
+
* than the top bar, with a border above and below. Its height is the bar's
|
|
1707
|
+
* plus the padding and the two borders. */
|
|
1706
1708
|
.twm-global-menu-bar {
|
|
1707
1709
|
display: flex;
|
|
1708
1710
|
align-items: center;
|
|
1709
1711
|
width: 100%;
|
|
1710
1712
|
box-sizing: border-box;
|
|
1711
1713
|
padding: var(--space-xxs) var(--space-xs);
|
|
1712
|
-
background-color: var(--surface-
|
|
1714
|
+
background-color: var(--surface-0);
|
|
1713
1715
|
color: var(--text-body);
|
|
1714
|
-
border-
|
|
1716
|
+
border-top: 1px solid var(--border-strong);
|
|
1717
|
+
border-bottom: 1px solid var(--border-strong);
|
|
1715
1718
|
overflow: visible; /* the bar's menus extend below */
|
|
1716
1719
|
}
|
|
1717
1720
|
.twm-bar-center {
|
|
@@ -2961,6 +2964,28 @@ body.twm-window-maximized .twm-resize-handle {
|
|
|
2961
2964
|
color: var(--text-dim);
|
|
2962
2965
|
margin-left: var(--space-xs);
|
|
2963
2966
|
}
|
|
2967
|
+
/* Row actions (createTreeItem's `actions`, STORY-0121): one line at the row's
|
|
2968
|
+
* end, after label, subtitle and badge, shown on hover, on focus within and on
|
|
2969
|
+
* the selected item. Hidden by opacity, not display, so the buttons stay in
|
|
2970
|
+
* the tab order (Tab reaches them and :focus-within shows them) and the label
|
|
2971
|
+
* keeps its width on hover. The slot is no taller than the label line, so a
|
|
2972
|
+
* row is as high with actions as without. */
|
|
2973
|
+
.twm-tree-item__actions {
|
|
2974
|
+
display: flex;
|
|
2975
|
+
align-items: center;
|
|
2976
|
+
gap: var(--space-xxs);
|
|
2977
|
+
flex-shrink: 0;
|
|
2978
|
+
height: 0;
|
|
2979
|
+
overflow: visible;
|
|
2980
|
+
opacity: 0;
|
|
2981
|
+
pointer-events: none;
|
|
2982
|
+
}
|
|
2983
|
+
.twm-tree-item:hover > .twm-tree-item__actions,
|
|
2984
|
+
.twm-tree-item:focus-within > .twm-tree-item__actions,
|
|
2985
|
+
.twm-tree-item.selected > .twm-tree-item__actions {
|
|
2986
|
+
opacity: 1;
|
|
2987
|
+
pointer-events: auto;
|
|
2988
|
+
}
|
|
2964
2989
|
/* ═══════════════════════════════════════════════════════════════════════════
|
|
2965
2990
|
Plot Popout Window
|
|
2966
2991
|
═══════════════════════════════════════════════════════════════════════════ */
|
|
@@ -3338,6 +3363,18 @@ body.twm-window-maximized .twm-resize-handle {
|
|
|
3338
3363
|
border-radius: 50%;
|
|
3339
3364
|
animation: computing-spin 0.8s linear infinite;
|
|
3340
3365
|
}
|
|
3366
|
+
/* The keyframes the rule above names. A spinner rule shipped with the animation
|
|
3367
|
+
name and without the `@keyframes` block, which CSS does not report: an
|
|
3368
|
+
undefined name is simply no animation, so the ring was drawn and never
|
|
3369
|
+
turned, and nothing threw, logged or failed a build. `@keyframes` names are
|
|
3370
|
+
global, so this one is not scoped (see `spin`): an embedder that defines
|
|
3371
|
+
its own `computing-spin` wins or loses on source order, and either way the
|
|
3372
|
+
ring turns. A full turn at the rule's own duration, linear and infinite, so
|
|
3373
|
+
the loop has no seam: the arc is back where it started. */
|
|
3374
|
+
@keyframes computing-spin {
|
|
3375
|
+
from { transform: rotate(0deg); }
|
|
3376
|
+
to { transform: rotate(360deg); }
|
|
3377
|
+
}
|
|
3341
3378
|
.twm-computing-status__message {
|
|
3342
3379
|
font-size: var(--font-size-md);
|
|
3343
3380
|
color: #b0b0b0;
|
|
@@ -3383,6 +3420,11 @@ body.twm-window-maximized .twm-resize-handle {
|
|
|
3383
3420
|
flex-shrink: 0;
|
|
3384
3421
|
animation: etl-spin 0.8s linear infinite;
|
|
3385
3422
|
}
|
|
3423
|
+
/* The keyframes the rule above names; see `computing-spin`. */
|
|
3424
|
+
@keyframes etl-spin {
|
|
3425
|
+
from { transform: rotate(0deg); }
|
|
3426
|
+
to { transform: rotate(360deg); }
|
|
3427
|
+
}
|
|
3386
3428
|
.twm-run-progress__message {
|
|
3387
3429
|
font-size: var(--font-size-md);
|
|
3388
3430
|
color: var(--text-primary, #ccc);
|
|
@@ -5706,14 +5748,23 @@ button.twm-about-dialog__btn--close:focus {
|
|
|
5706
5748
|
min-width: min(400px, var(--twm-slide-out-host-w, 400px));
|
|
5707
5749
|
max-width: var(--twm-slide-out-host-w, none);
|
|
5708
5750
|
|
|
5709
|
-
|
|
5710
|
-
|
|
5751
|
+
/* Never drawn outside its final box (BUG-0051). While open the panel
|
|
5752
|
+
* is `position: fixed` at its host's right edge, where the host's
|
|
5753
|
+
* `overflow: hidden` no longer clips it, and its slide from
|
|
5754
|
+
* translateX(100%) was drawn across whatever lies right of the host (a
|
|
5755
|
+
* dock panel). It does not move any more: a clip alone carries the
|
|
5756
|
+
* motion, revealing it from its right edge leftwards, so no frame can
|
|
5757
|
+
* paint outside its box (a transform and a clip animated together can
|
|
5758
|
+
* drift apart, the transform often running on the compositor). The left
|
|
5759
|
+
* inset of -16px keeps the box shadow. */
|
|
5760
|
+
clip-path: inset(0 0 0 100%);
|
|
5761
|
+
transition: clip-path 200ms ease-out, visibility 0s linear 200ms;
|
|
5711
5762
|
visibility: hidden;
|
|
5712
5763
|
}
|
|
5713
5764
|
.twm-slide-out-panel--open {
|
|
5714
|
-
|
|
5765
|
+
clip-path: inset(0 0 0 -16px);
|
|
5715
5766
|
visibility: visible;
|
|
5716
|
-
transition:
|
|
5767
|
+
transition: clip-path 200ms ease-out, visibility 0s linear 0s;
|
|
5717
5768
|
}
|
|
5718
5769
|
/* Header bar */
|
|
5719
5770
|
.twm-slide-out-panel__header {
|
|
@@ -6396,8 +6447,18 @@ button.twm-about-dialog__btn--close:focus {
|
|
|
6396
6447
|
align-items: flex-start;
|
|
6397
6448
|
column-gap: 10px;
|
|
6398
6449
|
}
|
|
6450
|
+
/* Each field's basis is its label alone (the first field's: the form's 130px
|
|
6451
|
+
* label column): the controls lend the row no intrinsic width
|
|
6452
|
+
* (`contain: inline-size`), so the free space is shared equally and every
|
|
6453
|
+
* input of a row is equally wide (BUG-0050). Until 0.17.14 each field was an
|
|
6454
|
+
* equal share of the row (`flex: 1 1 0`), so the first input, whose share
|
|
6455
|
+
* also held the 130px column, was the narrowest by far. */
|
|
6399
6456
|
.twm-modal__field-group > .twm-modal__row {
|
|
6400
|
-
flex: 1 1
|
|
6457
|
+
flex: 1 1 auto;
|
|
6458
|
+
min-width: 0;
|
|
6459
|
+
}
|
|
6460
|
+
.twm-modal__field-group > .twm-modal__row > :not(:first-child) {
|
|
6461
|
+
contain: inline-size;
|
|
6401
6462
|
min-width: 0;
|
|
6402
6463
|
}
|
|
6403
6464
|
.twm-managed-window--modal .twm-modal__fields > .twm-modal__field-group {
|
|
@@ -8868,6 +8929,16 @@ tr:hover .twm-row-action { opacity: 1; }
|
|
|
8868
8929
|
border-radius: 50%;
|
|
8869
8930
|
animation: data-table__spin 0.7s linear infinite;
|
|
8870
8931
|
}
|
|
8932
|
+
/* The keyframes the rule above names. Without them the name is no animation
|
|
8933
|
+
(CSS reports nothing for it), so the ring was drawn and stood still. A full
|
|
8934
|
+
turn at the rule's own 0.7s linear infinite. `@keyframes` names are global
|
|
8935
|
+
and cannot be scoped (see `spin`); a definition of the same name in an
|
|
8936
|
+
embedder's sheet wins or loses on source order, and either way the ring
|
|
8937
|
+
turns. */
|
|
8938
|
+
@keyframes data-table__spin {
|
|
8939
|
+
from { transform: rotate(0deg); }
|
|
8940
|
+
to { transform: rotate(360deg); }
|
|
8941
|
+
}
|
|
8871
8942
|
.twm-data-table-component--compact .twm-pagination-controls > span {
|
|
8872
8943
|
color: var(--ea-text-dim, #aaa) !important;
|
|
8873
8944
|
font-size: 9.5px !important;
|
|
@@ -9002,6 +9073,12 @@ tr:hover .twm-row-action { opacity: 1; }
|
|
|
9002
9073
|
padding: 2px 8px;
|
|
9003
9074
|
line-height: 22px;
|
|
9004
9075
|
}
|
|
9076
|
+
/* A path of one segment is not drawn (STORY-0124): the tile's title already
|
|
9077
|
+
* names it, so the strip and its slot take no room until a second level. */
|
|
9078
|
+
.twm-page-shell__breadcrumb .twm-tile-breadcrumb[hidden],
|
|
9079
|
+
.twm-page-shell__breadcrumb:has(> .twm-tile-breadcrumb[hidden]) {
|
|
9080
|
+
display: none;
|
|
9081
|
+
}
|
|
9005
9082
|
.twm-page-shell__content {
|
|
9006
9083
|
flex: 1 1 auto;
|
|
9007
9084
|
min-height: 0;
|
|
@@ -9045,6 +9122,11 @@ tr:hover .twm-row-action { opacity: 1; }
|
|
|
9045
9122
|
border-radius: 50%;
|
|
9046
9123
|
animation: twm-tile-loading-spin 0.7s linear infinite;
|
|
9047
9124
|
}
|
|
9125
|
+
/* The keyframes the rule above names; see `data-table__spin`. */
|
|
9126
|
+
@keyframes twm-tile-loading-spin {
|
|
9127
|
+
from { transform: rotate(0deg); }
|
|
9128
|
+
to { transform: rotate(360deg); }
|
|
9129
|
+
}
|
|
9048
9130
|
/* Merged home page — detail header row, then the project-setup body
|
|
9049
9131
|
* fills the rest of the tile. */
|
|
9050
9132
|
.twm-home-page {
|
package/css/overrides.css
CHANGED
|
@@ -2118,6 +2118,16 @@ tr:hover .twm-row-action { opacity: 1; }
|
|
|
2118
2118
|
border-radius: 50%;
|
|
2119
2119
|
animation: data-table__spin 0.7s linear infinite;
|
|
2120
2120
|
}
|
|
2121
|
+
/* The keyframes the rule above names. Without them the name is no animation
|
|
2122
|
+
(CSS reports nothing for it), so the ring was drawn and stood still. A full
|
|
2123
|
+
turn at the rule's own 0.7s linear infinite. `@keyframes` names are global
|
|
2124
|
+
and cannot be scoped (see `spin`); a definition of the same name in an
|
|
2125
|
+
embedder's sheet wins or loses on source order, and either way the ring
|
|
2126
|
+
turns. */
|
|
2127
|
+
@keyframes data-table__spin {
|
|
2128
|
+
from { transform: rotate(0deg); }
|
|
2129
|
+
to { transform: rotate(360deg); }
|
|
2130
|
+
}
|
|
2121
2131
|
.twm-data-table-component--compact .twm-pagination-controls > span {
|
|
2122
2132
|
color: var(--ea-text-dim, #aaa) !important;
|
|
2123
2133
|
font-size: 9.5px !important;
|
|
@@ -2252,6 +2262,12 @@ tr:hover .twm-row-action { opacity: 1; }
|
|
|
2252
2262
|
padding: 2px 8px;
|
|
2253
2263
|
line-height: 22px;
|
|
2254
2264
|
}
|
|
2265
|
+
/* A path of one segment is not drawn (STORY-0124): the tile's title already
|
|
2266
|
+
* names it, so the strip and its slot take no room until a second level. */
|
|
2267
|
+
.twm-page-shell__breadcrumb .twm-tile-breadcrumb[hidden],
|
|
2268
|
+
.twm-page-shell__breadcrumb:has(> .twm-tile-breadcrumb[hidden]) {
|
|
2269
|
+
display: none;
|
|
2270
|
+
}
|
|
2255
2271
|
.twm-page-shell__content {
|
|
2256
2272
|
flex: 1 1 auto;
|
|
2257
2273
|
min-height: 0;
|
|
@@ -2295,6 +2311,11 @@ tr:hover .twm-row-action { opacity: 1; }
|
|
|
2295
2311
|
border-radius: 50%;
|
|
2296
2312
|
animation: twm-tile-loading-spin 0.7s linear infinite;
|
|
2297
2313
|
}
|
|
2314
|
+
/* The keyframes the rule above names; see `data-table__spin`. */
|
|
2315
|
+
@keyframes twm-tile-loading-spin {
|
|
2316
|
+
from { transform: rotate(0deg); }
|
|
2317
|
+
to { transform: rotate(360deg); }
|
|
2318
|
+
}
|
|
2298
2319
|
/* Merged home page — detail header row, then the project-setup body
|
|
2299
2320
|
* fills the rest of the tile. */
|
|
2300
2321
|
.twm-home-page {
|
package/css/reset.css
CHANGED
|
File without changes
|
package/dist/canvas.js
CHANGED
|
File without changes
|
package/dist/canvas.js.map
CHANGED
|
File without changes
|
package/dist/chunk-3PHCPZHT.js
CHANGED
|
File without changes
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
modalHost
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-OEG6NPAN.js";
|
|
4
4
|
import {
|
|
5
5
|
focusMenuItem,
|
|
6
6
|
moveMenuFocus,
|
|
@@ -104,4 +104,4 @@ export {
|
|
|
104
104
|
showContextMenu,
|
|
105
105
|
hideContextMenu
|
|
106
106
|
};
|
|
107
|
-
//# sourceMappingURL=chunk-
|
|
107
|
+
//# sourceMappingURL=chunk-AD7FIA3Z.js.map
|
package/dist/chunk-FOOS3T5L.js
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/chunk-GOQLR5WR.js
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/chunk-HNU6MM2B.js
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/chunk-JKZLNKG6.js
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/chunk-JYWURG5T.js
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/chunk-N7HC3ADV.js
CHANGED
|
File without changes
|
|
File without changes
|
|
@@ -1001,6 +1001,8 @@ function _estimateHeight(fields) {
|
|
|
1001
1001
|
return Math.max(200, Math.min(base, max));
|
|
1002
1002
|
}
|
|
1003
1003
|
function _estimateWidth(fields) {
|
|
1004
|
+
const widest = Math.max(0, ...fields.filter((f) => Array.isArray(f?.row)).map((f) => _formFields(f.row).length));
|
|
1005
|
+
if (widest >= 3) return Math.max(640, Math.min(170 + widest * 230, Math.floor(window.innerWidth * 0.9)));
|
|
1004
1006
|
const wide = fields.some((f) => f && (f.type === "textarea" || f.type === "colorList" || f.section || Array.isArray(f.row)));
|
|
1005
1007
|
return wide ? 640 : 480;
|
|
1006
1008
|
}
|
|
@@ -1308,4 +1310,4 @@ export {
|
|
|
1308
1310
|
openConfirm,
|
|
1309
1311
|
openModal
|
|
1310
1312
|
};
|
|
1311
|
-
//# sourceMappingURL=chunk-
|
|
1313
|
+
//# sourceMappingURL=chunk-OEG6NPAN.js.map
|