flexdesk 0.17.2 → 0.17.4

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 (49) hide show
  1. package/CHANGELOG.md +100 -63
  2. package/README.md +27 -4517
  3. package/css/base.css +18 -1
  4. package/css/flexdesk.css +18 -1
  5. package/dist/{chunk-4A7SJC3T.js → chunk-RKNFBX5K.js} +15 -4
  6. package/dist/{chunk-4A7SJC3T.js.map → chunk-RKNFBX5K.js.map} +2 -2
  7. package/dist/flexdesk.css +18 -1
  8. package/dist/tiles.js +1 -1
  9. package/dist/widgets.js +59 -26
  10. package/dist/widgets.js.map +2 -2
  11. package/docs/README.md +97 -0
  12. package/docs/best-practices.md +45 -0
  13. package/docs/components/charts.md +211 -0
  14. package/docs/components/command-palette.md +102 -0
  15. package/docs/components/conversation.md +72 -0
  16. package/docs/components/data-table-grid.md +328 -0
  17. package/docs/components/data-table.md +596 -0
  18. package/docs/components/editor.md +22 -0
  19. package/docs/components/flow-canvas-editor.md +482 -0
  20. package/docs/components/flow-editors.md +176 -0
  21. package/docs/components/flow-lane-editor.md +165 -0
  22. package/docs/components/flow-outline-editor.md +176 -0
  23. package/docs/components/forms-and-dialogs.md +294 -0
  24. package/docs/components/input-fields.md +72 -0
  25. package/docs/components/keymap.md +143 -0
  26. package/docs/components/layout-widgets.md +163 -0
  27. package/docs/components/markdown-and-outline.md +106 -0
  28. package/docs/components/menus.md +86 -0
  29. package/docs/components/notifications.md +194 -0
  30. package/docs/components/panels-and-desktops.md +127 -0
  31. package/docs/components/record-list-and-fact-table.md +128 -0
  32. package/docs/components/settings-view.md +112 -0
  33. package/docs/components/shell.md +189 -0
  34. package/docs/components/slide-out-panel.md +68 -0
  35. package/docs/components/tiles.md +210 -0
  36. package/docs/components/wizard.md +54 -0
  37. package/docs/concepts/building-and-packaging.md +33 -0
  38. package/docs/concepts/domain-neutrality.md +110 -0
  39. package/docs/concepts/host-port.md +137 -0
  40. package/docs/concepts/packages-and-entry-points.md +32 -0
  41. package/docs/concepts/peer-dependencies.md +42 -0
  42. package/docs/concepts/state-guard.md +58 -0
  43. package/docs/concepts/styling.md +47 -0
  44. package/docs/quickstart.md +179 -0
  45. package/package.json +2 -1
  46. package/src/ui/components/notification_history.js +17 -24
  47. package/src/ui/components/slide_out_panel.js +14 -3
  48. package/src/ui/notification_center.js +41 -3
  49. package/src/ui/utils/auto_scrollbars.js +16 -2
package/CHANGELOG.md CHANGED
@@ -1,18 +1,55 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.17.4 (2026-10-23)
4
+
5
+ A patch release: everything below is additive. Every fix is documented in a
6
+ section of the docs headed "(0.17.4)"; each entry links to it.
7
+
8
+ ### Added and changed
9
+
10
+ - [A slide-out stays inside its host](docs/components/slide-out-panel.md#a-slide-out-stays-inside-its-host-0174): a `SlideOutPanel` is never wider than its host. While open it carries the host's width as `--twm-slide-out-host-w`, which `.twm-slide-out-panel` uses as its `max-width` and as the ceiling of its 400px `min-width`; in a host narrower than the panel's `width` it is the host's width and starts at the host's left edge, at any content zoom and again after every host resize. The header icon and the close button's icon are 18px, by rules that win over `.material-symbols-outlined`'s 24px (BUG-0035).
11
+ - [A pane at the window's edge keeps its bar](docs/components/layout-widgets.md#a-pane-at-the-windows-edge-keeps-its-bar-0174): the window's `.twm-resize-handle` strips and corners are not cover when an overlay scrollbar checks what sits over its track, so a pane flush against the right or bottom edge of a non-maximized window shows its bar again; a popover over the pane still hides it (BUG-0036).
12
+ - `installAutoScrollbars` drops the overlay bars of an element taken out of the page (a managed window closed) at once, instead of leaving them on screen through the hide delay and fade.
13
+ - The reference documentation moved from the README into `docs/` ([docs/README.md](docs/README.md): one page per component and per concept, headings unchanged); the README is a short overview, and `docs/` ships in the package.
14
+
15
+ ### Removed or renamed exports
16
+
17
+ None. Compared with 0.17.3, across every entry point (`core`, `widgets`, `wm`,
18
+ `host`, `canvas`, `flow`, `charts`, `tiles`, `editor`) and the package
19
+ `exports` map, no export was added, removed or renamed. Not an export but
20
+ worth knowing: `.twm-slide-out-panel` has a `max-width` while open, and the
21
+ slide-out's header and close icons are 18px instead of the page's icon size
22
+ (see above).
23
+
24
+ ## 0.17.3 (2026-10-22)
25
+
26
+ A patch release: everything below is additive. Every entry is documented in a
27
+ section of the docs headed "(0.17.3)"; each entry links to it.
28
+
29
+ ### Added and changed
30
+
31
+ - [One toast, one history entry, one unread](docs/components/notifications.md#one-toast-one-history-entry-one-unread-0173): `NotificationCenter.history` holds one entry per toast however it was raised (`show()`, `warn()` / `error()` / `info()` / `success()`, `toast:show`, `notification:show`, `log:entry`), and a toast that leaves marks its own entry `dismissed: true` with the `reason` instead of adding a second one. `nc.subscribe(fn)` calls `fn(entry, center)` once per entry added and answers the unsubscribe. `NotificationHistory` follows the centre through `subscribe()`, so every toast counts once on the bell, also one raised through the API (BUG-0034). It no longer watches the bus for toasts: its `notificationCenter` is a `NotificationCenter` (or anything with `history` and `subscribe`).
32
+
33
+ ### Removed or renamed exports
34
+
35
+ None. Compared with 0.17.2, across every entry point (`core`, `widgets`, `wm`,
36
+ `host`, `canvas`, `flow`, `charts`, `tiles`, `editor`) and the package
37
+ `exports` map, no export was added, removed or renamed. Not an export but worth
38
+ knowing: `NotificationCenter` gained the `subscribe(fn)` method (see above).
39
+
3
40
  ## 0.17.2 (2026-10-22)
4
41
 
5
42
  A patch release: everything below is additive. Every entry is documented in a
6
- README section headed "(0.17.2)"; each entry links to it.
43
+ section of the docs headed "(0.17.2)"; each entry links to it.
7
44
 
8
45
  ### Added and changed
9
46
 
10
- - [An open single instance takes new props: `navigate(props)`](README.md#an-open-single-instance-takes-new-props-navigateprops-0172): opening a `single` kind that is already open with new props reveals it and calls its content's `navigate(props)` hook once; the props are recorded on the tab. An open that names no props only reveals.
11
- - [A link to a kind nobody registered](README.md#a-link-to-a-kind-nobody-registered-0172): `wm.navigate` to a kind that is not registered logs one warning, changes nothing and returns `false`.
12
- - [A palette row drawn disabled, with a reason](README.md#a-palette-row-drawn-disabled-with-a-reason-0172): a command with `enabled: () => false` is listed greyed (`aria-disabled`), does nothing when picked, and shows its `disabledReason` as a tooltip.
13
- - [A catalog source only behind its prefix: `scopedOnly`](README.md#a-catalog-source-only-behind-its-prefix-scopedonly-0172): a catalog source with `scopedOnly: true` is searched only when its prefix is typed, in the flat and the grouped palette.
14
- - [The settings categories outside the page: `SettingsCategories`](README.md#the-settings-categories-outside-the-page-settingscategories-0172): `SettingsView` can leave out its own category list and filter, and `SettingsCategories` (new export from `@flexdesk/widgets`) shows them anywhere, kept in step with the view.
15
- - [Toast cards are styled and clickable](README.md#toast-cards-are-styled-and-clickable-0172): toast cards use `twm-notification` and `twm-notification--<severity>`, styled in flexdesk.css and base.css, with their entry animation defined there; cards take pointer events, so their buttons work (BUG-0033). A sheet that targeted `.notification` must target `.twm-notification`.
47
+ - [An open single instance takes new props: `navigate(props)`](docs/components/shell.md#an-open-single-instance-takes-new-props-navigateprops-0172): opening a `single` kind that is already open with new props reveals it and calls its content's `navigate(props)` hook once; the props are recorded on the tab. An open that names no props only reveals.
48
+ - [A link to a kind nobody registered](docs/components/shell.md#a-link-to-a-kind-nobody-registered-0172): `wm.navigate` to a kind that is not registered logs one warning, changes nothing and returns `false`.
49
+ - [A palette row drawn disabled, with a reason](docs/components/command-palette.md#a-palette-row-drawn-disabled-with-a-reason-0172): a command with `enabled: () => false` is listed greyed (`aria-disabled`), does nothing when picked, and shows its `disabledReason` as a tooltip.
50
+ - [A catalog source only behind its prefix: `scopedOnly`](docs/components/command-palette.md#a-catalog-source-only-behind-its-prefix-scopedonly-0172): a catalog source with `scopedOnly: true` is searched only when its prefix is typed, in the flat and the grouped palette.
51
+ - [The settings categories outside the page: `SettingsCategories`](docs/components/settings-view.md#the-settings-categories-outside-the-page-settingscategories-0172): `SettingsView` can leave out its own category list and filter, and `SettingsCategories` (new export from `@flexdesk/widgets`) shows them anywhere, kept in step with the view.
52
+ - [Toast cards are styled and clickable](docs/components/notifications.md#toast-cards-are-styled-and-clickable-0172): toast cards use `twm-notification` and `twm-notification--<severity>`, styled in flexdesk.css and base.css, with their entry animation defined there; cards take pointer events, so their buttons work (BUG-0033). A sheet that targeted `.notification` must target `.twm-notification`.
16
53
 
17
54
  ### Removed or renamed exports
18
55
 
@@ -25,15 +62,15 @@ to `twm-notification` (see above).
25
62
  ## 0.17.1 (2026-10-21)
26
63
 
27
64
  A patch release: everything below is additive. Every entry is documented in a
28
- README section headed "(0.17.1)"; each entry links to it.
65
+ section of the docs headed "(0.17.1)"; each entry links to it.
29
66
 
30
67
  ### Added and changed
31
68
 
32
- - [Built-in cell editors](README.md#built-in-cell-editors-0171): an editable DataTable column opens the editor for its type (`text`, `multitext`, `number`, `bool`, `choice`, `datetime`), each with a parse that refuses what it cannot read; `editors` replaces one per type or per column, with `editTypes`, `locale` and `editorMessages`. The editors and their parsers (`CELL_EDITORS`, `createNumberEditor`, `parseNumber`, `parseDateTime` and the rest of `cell_editors.js`) are exported from `@flexdesk/widgets`.
33
- - [Copying cells as tab-separated values](README.md#copying-cells-as-tab-separated-values-0171): in cell mode Ctrl+C copies the selected cell range as the tab-separated text Excel and Google Sheets paste into cells; `toTSV` and `tsvCell` (from `@flexdesk/widgets`) write it.
34
- - [Pasting a block from Excel](README.md#pasting-a-block-from-excel-0171): `pasteable: true` beside `staged` pastes a tab-separated block at the cursor cell, each value read by its column's editor, staged as one undo entry, with column and row overrun handling; `fromTSV` (from `@flexdesk/widgets`) reads it.
35
- - [Building a modeler](README.md#building-a-modeler-0171): the canvas editor's modeler options shown working together, with `demo/flow_modeler.html` (linked from `demo/index.html`).
36
- - [The `development` condition resolves in the installed package](README.md#the-development-condition-resolves-in-the-installed-package-0171): the nine root entry barrels are in `files`, so the `exports` map's `development` targets ship (BUG-0032). An `import` still resolves to `dist/`.
69
+ - [Built-in cell editors](docs/components/data-table-grid.md#built-in-cell-editors-0171): an editable DataTable column opens the editor for its type (`text`, `multitext`, `number`, `bool`, `choice`, `datetime`), each with a parse that refuses what it cannot read; `editors` replaces one per type or per column, with `editTypes`, `locale` and `editorMessages`. The editors and their parsers (`CELL_EDITORS`, `createNumberEditor`, `parseNumber`, `parseDateTime` and the rest of `cell_editors.js`) are exported from `@flexdesk/widgets`.
70
+ - [Copying cells as tab-separated values](docs/components/data-table-grid.md#copying-cells-as-tab-separated-values-0171): in cell mode Ctrl+C copies the selected cell range as the tab-separated text Excel and Google Sheets paste into cells; `toTSV` and `tsvCell` (from `@flexdesk/widgets`) write it.
71
+ - [Pasting a block from Excel](docs/components/data-table-grid.md#pasting-a-block-from-excel-0171): `pasteable: true` beside `staged` pastes a tab-separated block at the cursor cell, each value read by its column's editor, staged as one undo entry, with column and row overrun handling; `fromTSV` (from `@flexdesk/widgets`) reads it.
72
+ - [Building a modeler](docs/components/flow-canvas-editor.md#building-a-modeler-0171): the canvas editor's modeler options shown working together, with `demo/flow_modeler.html` (linked from `demo/index.html`).
73
+ - [The `development` condition resolves in the installed package](docs/concepts/building-and-packaging.md#the-development-condition-resolves-in-the-installed-package-0171): the nine root entry barrels are in `files`, so the `exports` map's `development` targets ship (BUG-0032). An `import` still resolves to `dist/`.
37
74
 
38
75
  ### Removed or renamed exports
39
76
 
@@ -43,55 +80,55 @@ None. Compared with 0.17.0, across every entry point (`core`, `widgets`, `wm`,
43
80
 
44
81
  ## 0.17.0 (2026-10-21)
45
82
 
46
- Every feature below is documented in a README section headed "(0.17.0)"; each
83
+ Every feature below is documented in a section of the docs headed "(0.17.0)"; each
47
84
  entry links to it.
48
85
 
49
86
  ### Added and changed
50
87
 
51
- - [A menu bar: `createMenuBar`](README.md#a-menu-bar-createmenubar-0170): File / Edit / View menus from one declarative model of items, separators, checks, radios and submenus.
52
- - [A kind that exists once: `single`](README.md#a-kind-that-exists-once-single-0170): a taxonomy kind marked `single` is mounted once; opening it again goes to the open one.
53
- - [Panels a page does not offer](README.md#panels-a-page-does-not-offer-0170): a kind declares the panels it offers (`panels: {bottom: false | {reason}}`), content overrides them with `wm.setPanelAvailability`, and withheld panels are left out of the layout.
54
- - [Panels keep the size you dragged them to](README.md#panels-keep-the-size-you-dragged-them-to-0170): each desktop remembers every panel's share of the window and saves it with the layout as `panelShares`.
55
- - [A navigation panel you drive yourself: `mountNavPanel`](README.md#a-navigation-panel-you-drive-yourself-mountnavpanel-0170): a mode strip, a shared filter and lazily mounted panes, switched from code with `select(modeId)`.
56
- - [Buttons that change with the pane: `ctx.setChromeActions`](README.md#buttons-that-change-with-the-pane-ctxsetchromeactions-0170): a pane replaces its chrome buttons at any time, with labels, pressed and disabled states and separators.
57
- - [Your keys, not the window manager's: `keymap`](README.md#your-keys-not-the-window-managers-keymap-0170): every window-manager chord can be disabled or rebound; `?` is installed by the shell, not by importing `HelpModal`.
58
- - [DataTable: columns in the order somebody puts them](README.md#datatable-columns-in-the-order-somebody-puts-them-0170): columns reorder by dragging their headers or from code, and the order is persisted.
59
- - [DataTable: a grid of cells you can edit](README.md#datatable-a-grid-of-cells-you-can-edit-0170): `selectionMode: 'cells'` with keyboard cell navigation, and `editable` cells with in-place editors.
60
- - [Staged edits, undo and redo, one commit](README.md#staged-edits-undo-and-redo-one-commit-0170): `staged: true` keeps edits in the table, with Ctrl+Z / Ctrl+Y, until `commit()` hands them over in one call.
61
- - [Fill handle](README.md#fill-handle-0170): `fillHandle: true` drags a range's values over neighbouring cells as a spreadsheet does, staged.
62
- - [DataTable: column groups and structural edits](README.md#datatable-column-groups-and-structural-edits-0170): a grouped header row and callbacks to add, rename and delete columns and rows.
63
- - [DataTable: a crosstab, with spanned header rows and pinned label columns](README.md#datatable-a-crosstab-with-spanned-header-rows-and-pinned-label-columns-0170): `crosstab` draws a matrix in one table and one scroller, with sticky header rows and label columns.
64
- - [SliderField: a number box, a readout, a default and an enable toggle](README.md#sliderfield-a-number-box-a-readout-a-default-and-an-enable-toggle-0170): opt-in companions for the range input.
65
- - [A stack of collapsible sections: `createSectionStack`](README.md#a-stack-of-collapsible-sections-createsectionstack-0170): inspector-style titled sections, each opened and closed from its header.
66
- - [Node bodies](README.md#node-bodies-0170): a catalogue type draws its own controls inside its canvas node (`render`, `update`, `size`, `accent`).
67
- - [Edited on the node](README.md#edited-on-the-node-0170): `inline` settings drawn and edited on the node, and `renameInPlace` for step titles.
68
- - [Live values and folded steps](README.md#live-values-and-folded-steps-0170): `setNodeValues` paints badges and port values in place; `collapsible` folds a step to its header. The canvas editor also gains `multiSelect`, `groups`, `notes`, `clipboard`, `zoomControls`, `minimap`, `layout: 'layered'` (with `layeredLayout` from `@flexdesk/canvas`) and viewport persistence, documented in the same chapter.
69
- - [Options: typed, unavailable, grouped, and changed while open](README.md#options-typed-unavailable-grouped-and-changed-while-open-0170): form select options keep their type, can be unavailable with a reason, grouped, and replaced while the form is open.
70
- - [Colours: `type: 'color'` and `type: 'colorList'`](README.md#colours-type-color-and-type-colorlist-0170): colour fields in forms (`ColorField`, `ColorListField`).
71
- - [Number bounds and fields side by side: `min`, `max` and `{ row }`](README.md#number-bounds-and-fields-side-by-side-min-max-and--row--0170): bounded number fields and form rows.
72
- - [A switch: `ToggleField` and `type: 'toggle'`](README.md#a-switch-togglefield-and-type-toggle-0170): an on/off switch, standalone or in a form.
73
- - [A settings page: `SettingsView`](README.md#a-settings-page-settingsview-0170): a settings store's schema drawn as a page (`getSettingsStore()` from `@flexdesk/core` for the app-global binding).
74
- - [A step wizard: `Wizard`](README.md#a-step-wizard-wizard-0170): a multi-step flow, inline or in a modal window.
75
- - [Confirms show text, not markup](README.md#confirms-show-text-not-markup-0170): `openConfirm`'s message and labels, and the delete and close confirms' item names, are set as text.
76
- - [Markdown: `renderMarkdown`](README.md#markdown-rendermarkdown-0170): a CommonMark-ish subset rendered to an HTML string, with a highlight hook.
77
- - [A document outline: `createDocumentOutline`](README.md#a-document-outline-createdocumentoutline-0170): a numbered section list that marks the section in view and scrolls to one on click.
78
- - [Action dropdowns: separators](README.md#action-dropdowns-separators-0170): `{ separator: true }` entries in `ActionDropdown` options.
79
- - [A list of tags: `createTagInput`](README.md#a-list-of-tags-createtaginput-0170): removable chips followed by a text box.
80
- - [Progress: bars, lists and phases](README.md#progress-bars-lists-and-phases-0170): `ProgressBar`, `ProgressList` and `StepProgress`, updated in place.
81
- - [Tabs: `createTabs`](README.md#tabs-createtabs-0170): one tab strip keyed by your own ids, with or without panes; `createBottomPanelTabs` is built on it.
82
- - [Progress toasts](README.md#progress-toasts-0170): a toast that tracks a job, with a progress bar, status and counts; the toast helpers emit on the mounted `NotificationCenter`'s bus (`setToastBus`, `getToastBus`).
83
- - [A conversation: `mountConversationView`](README.md#a-conversation-mountconversationview-0170): a transcript of role-tagged messages above a composer.
84
- - [Opening a file: `pickFile`](README.md#opening-a-file-pickfile-0170): one file picker over every host, from `@flexdesk/host`.
85
- - [The state guard: who wrote that attribute](README.md#the-state-guard-who-wrote-that-attribute-0170): writes are attributed to the calling file, `moduleFramePattern` is configurable, and the defaults carry no application's override.
86
- - [The defaults cover FlexDesk's own keys](README.md#the-defaults-cover-flexdesks-own-keys-0170): `DEFAULT_STATE_GUARD_CONFIG` allows every key FlexDesk writes, and camelCase and kebab-case entries are the same key.
87
- - [Auto-height editors: `maxHeight`](README.md#auto-height-editors-maxheight-0170): `createEditor({ maxHeight })` and `setMaxHeight` replace the fixed 400px cap.
88
- - [Storage keys and names are yours](README.md#storage-keys-and-names-are-yours-0170): every storage key, theme name, drag MIME, export file name and log service name is configurable, with FlexDesk's own defaults.
89
- - [Derived series: `seriesTransforms`](README.md#derived-series-seriestransforms-0170): plots draw derived series from transforms the embedder passes in.
90
- - [No application globals: the gallery picker and plot-window events](README.md#no-application-globals-the-gallery-picker-and-plot-window-events-0170): the gallery picker takes `entries` or a host `gallery` capability; `PlotPopoutWindow` listens only to the `streamEvents` it is given.
91
- - [A plot config in any container: `renderPlotGrid`](README.md#a-plot-config-in-any-container-renderplotgrid-0170): the plot window's subplot renderer, exported for any container.
92
- - [Editing a plot config: `renderPlotConfigEditor`](README.md#editing-a-plot-config-renderplotconfigeditor-0170): an in-place editor for a plot config.
93
- - [Figure tiles: one override, the draw is the base's](README.md#figure-tiles-one-override-the-draw-is-the-bases-0170): `FigureTile` is the base of every Plotly tile; a subclass overrides `figure(data)`.
94
- - [A tile's settings as a form: `mountTileConfigForm`](README.md#a-tiles-settings-as-a-form-mounttileconfigform-0170): a tile's `getConfigSchema()` drawn as a form, or opened with `openTileConfig`.
88
+ - [A menu bar: `createMenuBar`](docs/components/menus.md#a-menu-bar-createmenubar-0170): File / Edit / View menus from one declarative model of items, separators, checks, radios and submenus.
89
+ - [A kind that exists once: `single`](docs/components/shell.md#a-kind-that-exists-once-single-0170): a taxonomy kind marked `single` is mounted once; opening it again goes to the open one.
90
+ - [Panels a page does not offer](docs/components/panels-and-desktops.md#panels-a-page-does-not-offer-0170): a kind declares the panels it offers (`panels: {bottom: false | {reason}}`), content overrides them with `wm.setPanelAvailability`, and withheld panels are left out of the layout.
91
+ - [Panels keep the size you dragged them to](docs/components/panels-and-desktops.md#panels-keep-the-size-you-dragged-them-to-0170): each desktop remembers every panel's share of the window and saves it with the layout as `panelShares`.
92
+ - [A navigation panel you drive yourself: `mountNavPanel`](docs/components/panels-and-desktops.md#a-navigation-panel-you-drive-yourself-mountnavpanel-0170): a mode strip, a shared filter and lazily mounted panes, switched from code with `select(modeId)`.
93
+ - [Buttons that change with the pane: `ctx.setChromeActions`](docs/components/shell.md#buttons-that-change-with-the-pane-ctxsetchromeactions-0170): a pane replaces its chrome buttons at any time, with labels, pressed and disabled states and separators.
94
+ - [Your keys, not the window manager's: `keymap`](docs/components/keymap.md#your-keys-not-the-window-managers-keymap-0170): every window-manager chord can be disabled or rebound; `?` is installed by the shell, not by importing `HelpModal`.
95
+ - [DataTable: columns in the order somebody puts them](docs/components/data-table.md#datatable-columns-in-the-order-somebody-puts-them-0170): columns reorder by dragging their headers or from code, and the order is persisted.
96
+ - [DataTable: a grid of cells you can edit](docs/components/data-table-grid.md#datatable-a-grid-of-cells-you-can-edit-0170): `selectionMode: 'cells'` with keyboard cell navigation, and `editable` cells with in-place editors.
97
+ - [Staged edits, undo and redo, one commit](docs/components/data-table-grid.md#staged-edits-undo-and-redo-one-commit-0170): `staged: true` keeps edits in the table, with Ctrl+Z / Ctrl+Y, until `commit()` hands them over in one call.
98
+ - [Fill handle](docs/components/data-table-grid.md#fill-handle-0170): `fillHandle: true` drags a range's values over neighbouring cells as a spreadsheet does, staged.
99
+ - [DataTable: column groups and structural edits](docs/components/data-table-grid.md#datatable-column-groups-and-structural-edits-0170): a grouped header row and callbacks to add, rename and delete columns and rows.
100
+ - [DataTable: a crosstab, with spanned header rows and pinned label columns](docs/components/data-table-grid.md#datatable-a-crosstab-with-spanned-header-rows-and-pinned-label-columns-0170): `crosstab` draws a matrix in one table and one scroller, with sticky header rows and label columns.
101
+ - [SliderField: a number box, a readout, a default and an enable toggle](docs/components/input-fields.md#sliderfield-a-number-box-a-readout-a-default-and-an-enable-toggle-0170): opt-in companions for the range input.
102
+ - [A stack of collapsible sections: `createSectionStack`](docs/components/layout-widgets.md#a-stack-of-collapsible-sections-createsectionstack-0170): inspector-style titled sections, each opened and closed from its header.
103
+ - [Node bodies](docs/components/flow-canvas-editor.md#node-bodies-0170): a catalogue type draws its own controls inside its canvas node (`render`, `update`, `size`, `accent`).
104
+ - [Edited on the node](docs/components/flow-canvas-editor.md#edited-on-the-node-0170): `inline` settings drawn and edited on the node, and `renameInPlace` for step titles.
105
+ - [Live values and folded steps](docs/components/flow-canvas-editor.md#live-values-and-folded-steps-0170): `setNodeValues` paints badges and port values in place; `collapsible` folds a step to its header. The canvas editor also gains `multiSelect`, `groups`, `notes`, `clipboard`, `zoomControls`, `minimap`, `layout: 'layered'` (with `layeredLayout` from `@flexdesk/canvas`) and viewport persistence, documented in the same chapter.
106
+ - [Options: typed, unavailable, grouped, and changed while open](docs/components/forms-and-dialogs.md#options-typed-unavailable-grouped-and-changed-while-open-0170): form select options keep their type, can be unavailable with a reason, grouped, and replaced while the form is open.
107
+ - [Colours: `type: 'color'` and `type: 'colorList'`](docs/components/forms-and-dialogs.md#colours-type-color-and-type-colorlist-0170): colour fields in forms (`ColorField`, `ColorListField`).
108
+ - [Number bounds and fields side by side: `min`, `max` and `{ row }`](docs/components/forms-and-dialogs.md#number-bounds-and-fields-side-by-side-min-max-and--row--0170): bounded number fields and form rows.
109
+ - [A switch: `ToggleField` and `type: 'toggle'`](docs/components/forms-and-dialogs.md#a-switch-togglefield-and-type-toggle-0170): an on/off switch, standalone or in a form.
110
+ - [A settings page: `SettingsView`](docs/components/settings-view.md#a-settings-page-settingsview-0170): a settings store's schema drawn as a page (`getSettingsStore()` from `@flexdesk/core` for the app-global binding).
111
+ - [A step wizard: `Wizard`](docs/components/wizard.md#a-step-wizard-wizard-0170): a multi-step flow, inline or in a modal window.
112
+ - [Confirms show text, not markup](docs/components/forms-and-dialogs.md#confirms-show-text-not-markup-0170): `openConfirm`'s message and labels, and the delete and close confirms' item names, are set as text.
113
+ - [Markdown: `renderMarkdown`](docs/components/markdown-and-outline.md#markdown-rendermarkdown-0170): a CommonMark-ish subset rendered to an HTML string, with a highlight hook.
114
+ - [A document outline: `createDocumentOutline`](docs/components/markdown-and-outline.md#a-document-outline-createdocumentoutline-0170): a numbered section list that marks the section in view and scrolls to one on click.
115
+ - [Action dropdowns: separators](docs/components/menus.md#action-dropdowns-separators-0170): `{ separator: true }` entries in `ActionDropdown` options.
116
+ - [A list of tags: `createTagInput`](docs/components/input-fields.md#a-list-of-tags-createtaginput-0170): removable chips followed by a text box.
117
+ - [Progress: bars, lists and phases](docs/components/notifications.md#progress-bars-lists-and-phases-0170): `ProgressBar`, `ProgressList` and `StepProgress`, updated in place.
118
+ - [Tabs: `createTabs`](docs/components/layout-widgets.md#tabs-createtabs-0170): one tab strip keyed by your own ids, with or without panes; `createBottomPanelTabs` is built on it.
119
+ - [Progress toasts](docs/components/notifications.md#progress-toasts-0170): a toast that tracks a job, with a progress bar, status and counts; the toast helpers emit on the mounted `NotificationCenter`'s bus (`setToastBus`, `getToastBus`).
120
+ - [A conversation: `mountConversationView`](docs/components/conversation.md#a-conversation-mountconversationview-0170): a transcript of role-tagged messages above a composer.
121
+ - [Opening a file: `pickFile`](docs/concepts/host-port.md#opening-a-file-pickfile-0170): one file picker over every host, from `@flexdesk/host`.
122
+ - [The state guard: who wrote that attribute](docs/concepts/state-guard.md#the-state-guard-who-wrote-that-attribute-0170): writes are attributed to the calling file, `moduleFramePattern` is configurable, and the defaults carry no application's override.
123
+ - [The defaults cover FlexDesk's own keys](docs/concepts/state-guard.md#the-defaults-cover-flexdesks-own-keys-0170): `DEFAULT_STATE_GUARD_CONFIG` allows every key FlexDesk writes, and camelCase and kebab-case entries are the same key.
124
+ - [Auto-height editors: `maxHeight`](docs/components/editor.md#auto-height-editors-maxheight-0170): `createEditor({ maxHeight })` and `setMaxHeight` replace the fixed 400px cap.
125
+ - [Storage keys and names are yours](docs/concepts/domain-neutrality.md#storage-keys-and-names-are-yours-0170): every storage key, theme name, drag MIME, export file name and log service name is configurable, with FlexDesk's own defaults.
126
+ - [Derived series: `seriesTransforms`](docs/components/charts.md#derived-series-seriestransforms-0170): plots draw derived series from transforms the embedder passes in.
127
+ - [No application globals: the gallery picker and plot-window events](docs/concepts/domain-neutrality.md#no-application-globals-the-gallery-picker-and-plot-window-events-0170): the gallery picker takes `entries` or a host `gallery` capability; `PlotPopoutWindow` listens only to the `streamEvents` it is given.
128
+ - [A plot config in any container: `renderPlotGrid`](docs/components/charts.md#a-plot-config-in-any-container-renderplotgrid-0170): the plot window's subplot renderer, exported for any container.
129
+ - [Editing a plot config: `renderPlotConfigEditor`](docs/components/charts.md#editing-a-plot-config-renderplotconfigeditor-0170): an in-place editor for a plot config.
130
+ - [Figure tiles: one override, the draw is the base's](docs/components/tiles.md#figure-tiles-one-override-the-draw-is-the-bases-0170): `FigureTile` is the base of every Plotly tile; a subclass overrides `figure(data)`.
131
+ - [A tile's settings as a form: `mountTileConfigForm`](docs/components/tiles.md#a-tiles-settings-as-a-form-mounttileconfigform-0170): a tile's `getConfigSchema()` drawn as a form, or opened with `openTileConfig`.
95
132
 
96
133
  The package also gains the `flexdesk/css/reset` export (`dist/reset.css`).
97
134
 
@@ -102,7 +139,7 @@ Compared with 0.16.1, across every entry point (`core`, `widgets`, `wm`, `host`,
102
139
 
103
140
  | Removed from | Name | Replacement |
104
141
  |---|---|---|
105
- | `@flexdesk/widgets` | `PanelStateMachine` | None as a class. Which panels a page offers is declared on its kind (`panels` in `createTaxonomy`) and changed at runtime with `wm.setPanelAvailability`; read it with `wm.isPanelAvailable(side)` / `wm.getPanelAvailability()`, hear changes with `wm.onPanelAvailabilityChange(fn)` or the `wm:panels:availability` bus event, and open or close with `wm.togglePanel(side)`, which answers `false` while a panel is withheld. See [Panels a page does not offer](README.md#panels-a-page-does-not-offer-0170). |
142
+ | `@flexdesk/widgets` | `PanelStateMachine` | None as a class. Which panels a page offers is declared on its kind (`panels` in `createTaxonomy`) and changed at runtime with `wm.setPanelAvailability`; read it with `wm.isPanelAvailable(side)` / `wm.getPanelAvailability()`, hear changes with `wm.onPanelAvailabilityChange(fn)` or the `wm:panels:availability` bus event, and open or close with `wm.togglePanel(side)`, which answers `false` while a panel is withheld. See [Panels a page does not offer](docs/components/panels-and-desktops.md#panels-a-page-does-not-offer-0170). |
106
143
  | `@flexdesk/widgets` | `PANEL_STATES` | As for `PanelStateMachine`: a panel's state is the desktop's `panels` (open or not) plus its availability. |
107
144
  | `@flexdesk/widgets` | `PANEL_TRANSITIONS` | As for `PanelStateMachine`: `togglePanel` and `setPanelAvailability` are the only transitions. |
108
145
 
@@ -114,9 +151,9 @@ Not exports, but names an embedder may depend on:
114
151
 
115
152
  | What | 0.16.1 | 0.17.0 |
116
153
  |---|---|---|
117
- | `PlotPopoutWindow` chart cells | `div.plot-tile-chart` | `div.twm-plot-grid__cell` inside a `.twm-plot-grid` ([renderPlotGrid](README.md#a-plot-config-in-any-container-renderplotgrid-0170)) |
118
- | `PlotPopoutWindow` default `streamEvents` | `'streaming:delta'` / `'streaming:complete'` | No defaults: pass `streamEvents: { delta, complete }` ([No application globals](README.md#no-application-globals-the-gallery-picker-and-plot-window-events-0170)) |
119
- | Plot subplot keys | `showHpTrend`, `showHpCycle`, `hpLambda` (ignored now) | `subplot.transforms` with the `seriesTransforms` option ([Derived series](README.md#derived-series-seriestransforms-0170)) |
154
+ | `PlotPopoutWindow` chart cells | `div.plot-tile-chart` | `div.twm-plot-grid__cell` inside a `.twm-plot-grid` ([renderPlotGrid](docs/components/charts.md#a-plot-config-in-any-container-renderplotgrid-0170)) |
155
+ | `PlotPopoutWindow` default `streamEvents` | `'streaming:delta'` / `'streaming:complete'` | No defaults: pass `streamEvents: { delta, complete }` ([No application globals](docs/concepts/domain-neutrality.md#no-application-globals-the-gallery-picker-and-plot-window-events-0170)) |
156
+ | Plot subplot keys | `showHpTrend`, `showHpCycle`, `hpLambda` (ignored now) | `subplot.transforms` with the `seriesTransforms` option ([Derived series](docs/components/charts.md#derived-series-seriestransforms-0170)) |
120
157
  | Toast helpers' bus | a window global | the mounted `NotificationCenter`'s bus, or `setToastBus(bus)` |
121
158
  | Gallery picker entries | a pywebview bridge method | `entries`, or the host's `gallery.list(kind)` capability |
122
159
  | State guard defaults | one application's module override and debug global | `mode: 'warn'`, no overrides; configure `moduleOverrides` / `allow()` and `mode` yourself |
@@ -126,7 +163,7 @@ Not exports, but names an embedder may depend on:
126
163
  | Editor tab drag MIME | `'application/x-ecosim-tab'` | `'application/x-flexdesk-tab'`; `setTabDragMime`, `getTabDragMime()` |
127
164
  | Chart PNG export file name | `'ecosim_chart'` | `'chart'`; `setChartExportFilename` |
128
165
  | `LoggingService` service name | `'ecosim'` | `'flexdesk'`; `new LoggingService({ name })` |
129
- | Editor height cap | `data-code-max-height="true"` on a `.notebook-editor-container` ancestor (400px) | `createEditor(el, src, { maxHeight })`, `setMaxHeight(px)` ([Auto-height editors](README.md#auto-height-editors-maxheight-0170)) |
166
+ | Editor height cap | `data-code-max-height="true"` on a `.notebook-editor-container` ancestor (400px) | `createEditor(el, src, { maxHeight })`, `setMaxHeight(px)` ([Auto-height editors](docs/components/editor.md#auto-height-editors-maxheight-0170)) |
130
167
  | `?` help shortcut | installed when `HelpModal` was imported | installed by the shell; without one call `installHelpShortcut()` from `@flexdesk/widgets` |
131
168
  | `createDetailHeader` classes | `detail-header__badge`, `detail-header__btn--<variant>` | `twm-detail-header__badge`, `twm-detail-header__btn--<variant>` (plus `twm-btn`, `twm-btn--primary` / `--danger`) |
132
169
  | `openConfirm` message and labels | HTML | text; write `\n` for a line break, use `openModal` for markup |