flexdesk 0.17.18 → 0.18.1
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 +91 -0
- package/README.md +1 -0
- package/css/flexdesk.css +7547 -5891
- package/css/reset.css +1 -1
- package/css/tokens.css +30 -1
- package/dist/charts.js +83 -13
- package/dist/charts.js.map +2 -2
- package/dist/chunk-3BLIVOFD.js +778 -0
- package/dist/chunk-3BLIVOFD.js.map +7 -0
- package/dist/{chunk-7OL6F2AM.js → chunk-4X4SY3CP.js} +7 -5
- package/dist/chunk-4X4SY3CP.js.map +7 -0
- package/dist/chunk-DNJ3N4T4.js +82 -0
- package/dist/chunk-DNJ3N4T4.js.map +7 -0
- package/dist/{chunk-PGZ4EHSE.js → chunk-HL3IIHU3.js} +501 -359
- package/dist/chunk-HL3IIHU3.js.map +7 -0
- package/dist/{chunk-REJ5HLIM.js → chunk-HYJYYEPK.js} +2 -2
- package/dist/{chunk-7U4IB65H.js → chunk-LLBJ2SJH.js} +5 -3
- package/dist/{chunk-7U4IB65H.js.map → chunk-LLBJ2SJH.js.map} +1 -1
- package/dist/{chunk-XJNADRGR.js → chunk-NFZJ6P42.js} +188 -96
- package/dist/chunk-NFZJ6P42.js.map +7 -0
- package/dist/chunk-PAI2ZUWV.js +260 -0
- package/dist/chunk-PAI2ZUWV.js.map +7 -0
- package/dist/chunk-Q7BALEPX.js +527 -0
- package/dist/chunk-Q7BALEPX.js.map +7 -0
- package/dist/{chunk-2Z2ENHR3.js → chunk-QRBOIUU3.js} +7 -8
- package/dist/chunk-QRBOIUU3.js.map +7 -0
- package/dist/chunk-QXAOTGCC.js +40 -0
- package/dist/chunk-QXAOTGCC.js.map +7 -0
- package/dist/chunk-UKP22RUG.js +219 -0
- package/dist/chunk-UKP22RUG.js.map +7 -0
- package/dist/chunk-VLOAI3HS.js +43 -0
- package/dist/chunk-VLOAI3HS.js.map +7 -0
- package/dist/{chunk-WUFLGETN.js → chunk-WVFGV5FT.js} +2 -39
- package/dist/{chunk-WUFLGETN.js.map → chunk-WVFGV5FT.js.map} +3 -3
- package/dist/editor.js +3 -2
- package/dist/editor.js.map +1 -1
- package/dist/flexdesk.css +7547 -5891
- package/dist/flow.js +29 -97
- package/dist/flow.js.map +3 -3
- package/dist/git.js +1356 -0
- package/dist/git.js.map +7 -0
- package/dist/reset.css +1 -1
- package/dist/tiles.js +20 -15
- package/dist/tiles.js.map +2 -2
- package/dist/tokens.css +30 -1
- package/dist/widgets.js +4146 -1199
- package/dist/widgets.js.map +4 -4
- package/dist/wm.js +120 -32
- package/dist/wm.js.map +2 -2
- package/docs/README.md +9 -4
- package/docs/best-practices.md +2 -2
- package/docs/components/charts.md +40 -0
- package/docs/components/chat-shell.md +204 -0
- package/docs/components/conversation.md +10 -0
- package/docs/components/filter-builder.md +292 -0
- package/docs/components/forms-and-dialogs.md +30 -0
- package/docs/components/git.md +355 -0
- package/docs/components/input-fields.md +191 -2
- package/docs/components/keymap.md +8 -0
- package/docs/components/menus.md +86 -2
- package/docs/components/panels-and-desktops.md +16 -5
- package/docs/components/shell.md +108 -1
- package/docs/components/workspace-picker.md +193 -0
- package/docs/concepts/building-and-packaging.md +2 -2
- package/docs/concepts/packages-and-entry-points.md +14 -13
- package/docs/concepts/state-guard.md +3 -3
- package/docs/quickstart.md +1 -1
- package/git.js +13 -0
- package/package.json +6 -1
- package/src/charts/plot_config_editor.js +92 -6
- package/src/charts/plot_grid.js +6 -1
- package/src/flow/kit/dom.js +28 -119
- package/src/flow/kit/step_picker.js +1 -1
- package/src/flow/kit/value_picker.js +1 -1
- package/src/flow/outline/menu.js +1 -1
- package/src/git/diff_viewer.js +212 -0
- package/src/git/diff_window.js +51 -0
- package/src/git/git_graph.js +401 -0
- package/src/git/git_ops.js +61 -0
- package/src/git/git_panel.js +755 -0
- package/src/git/index.js +9 -0
- package/src/git/line_diff.js +202 -0
- package/src/tiles/tile_base.js +5 -4
- package/src/tiling/desktops.js +10 -8
- package/src/tiling/keymap.js +6 -5
- package/src/tiling/kind_taxonomy.js +15 -2
- package/src/tiling/shell.js +124 -17
- package/src/tiling/tile_renderer.js +2 -3
- package/src/ui/components/action_dropdown.js +4 -78
- package/src/ui/components/anchored_layer.js +255 -0
- package/src/ui/components/chat_shell.js +926 -0
- package/src/ui/components/chat_state_machine.js +223 -0
- package/src/ui/components/choice_controls.js +45 -2
- package/src/ui/components/color_field.js +3 -2
- package/src/ui/components/color_list_field.js +3 -2
- package/src/ui/components/combobox.js +422 -0
- package/src/ui/components/context_menu.js +8 -2
- package/src/ui/components/conversation_view.js +17 -2
- package/src/ui/components/data_table.js +2 -2
- package/src/ui/components/filter_builder.js +791 -0
- package/src/ui/components/filter_model.js +682 -0
- package/src/ui/components/inline_renamer.js +10 -5
- package/src/ui/components/managed_window.js +24 -47
- package/src/ui/components/modal.js +104 -117
- package/src/ui/components/option_list.js +160 -0
- package/src/ui/components/popover.js +94 -0
- package/src/ui/components/recent_items.js +169 -0
- package/src/ui/components/select.js +322 -0
- package/src/ui/components/tag_input.js +77 -8
- package/src/ui/components/workspace_picker.js +1253 -0
- package/src/ui/utils/fire_event.js +17 -0
- package/src/ui/utils/focusable.js +25 -0
- package/src/ui/utils/modal_host.js +27 -0
- package/src/ui/utils/tooltip_service.js +81 -14
- package/widgets.js +12 -2
- package/css/base.css +0 -10547
- package/css/overrides.css +0 -2596
- package/dist/chunk-2Z2ENHR3.js.map +0 -7
- package/dist/chunk-7JI7HHSY.js +0 -107
- package/dist/chunk-7JI7HHSY.js.map +0 -7
- package/dist/chunk-7OL6F2AM.js.map +0 -7
- package/dist/chunk-MIW7D6WC.js +0 -526
- package/dist/chunk-MIW7D6WC.js.map +0 -7
- package/dist/chunk-PGZ4EHSE.js.map +0 -7
- package/dist/chunk-XJNADRGR.js.map +0 -7
- /package/dist/{chunk-REJ5HLIM.js.map → chunk-HYJYYEPK.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,96 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.18.1 (2026-11-06)
|
|
4
|
+
|
|
5
|
+
A patch release: what four applications asked for when they adopted 0.18.0. The
|
|
6
|
+
entries under "Changed behaviour" change what embedders see; the workspace picker's
|
|
7
|
+
keyboard is the one to read first.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- [`hide` on `renderPlotConfigEditor`](docs/components/charts.md#hiding-parts-of-the-editor-hide-0181): takes away the 3D chart types with the z axis, the stack group and the x axis section (STORY-0109).
|
|
12
|
+
- [A reference line that names a constant](docs/components/charts.md#a-reference-line-that-names-a-constant-constantsprovider-resolveconstant-0181): `constantsProvider` on `renderPlotConfigEditor`, `resolveConstant` on `renderPlotGrid` (STORY-0109).
|
|
13
|
+
- [`dismissOnBackdrop` on `openModal`](docs/components/forms-and-dialogs.md#a-click-beside-a-modal-dismissonbackdrop-0181) and [on `openFilterDialog`](docs/components/filter-builder.md#a-click-beside-the-dialog-dismissonbackdrop-0181): a click on the dimmed page beside it dismisses it, through `beforeClose`. The press takes no focus from the dialog, so when `beforeClose` refuses, the caret is where it was.
|
|
14
|
+
- [`confirm.message` as a function](docs/components/filter-builder.md#a-question-that-quotes-what-was-typed-0181) on `openFilterDialog`'s `actions`, computed when it is asked.
|
|
15
|
+
- [`groupBrackets` on `describeFilter`](docs/components/filter-builder.md#what-a-sentence-says-0181); [`model.partialRanges`](docs/components/filter-builder.md#a-range-with-one-end-filled-is-refused-0181) and [`model.moveClause`](docs/components/filter-builder.md#what-a-condition-keeps-when-its-field-changes-0181).
|
|
16
|
+
- [Tokens for the picker field's look](docs/components/workspace-picker.md#the-fields-look-tokens-0181), and [a trigger of your own on `createPickerSwitcher`](docs/components/workspace-picker.md#a-trigger-of-your-own-0181), written down and tested.
|
|
17
|
+
- `attachInlineRenamer`'s `onStart` is handed the input: [`{ value, triggerEvent, input }`](docs/components/input-fields.md#a-list-under-a-name-being-edited-attachinlinerenamer-0181).
|
|
18
|
+
|
|
19
|
+
### Changed behaviour
|
|
20
|
+
|
|
21
|
+
- **[The workspace picker's keyboard moves real focus](docs/components/workspace-picker.md#the-keyboard-0181).** It used to keep the caret in the input and walk a highlight, so the card's and the footer's buttons were never announced. The arrows now move `document.activeElement` over every stop, the input among them; the rows are one tab stop; a character typed anywhere in the panel goes to the input. **The first ArrowDown from the input lands on the first row, not the second**, so a sequence of arrows reaches one stop later than before: `ArrowDown, Enter` takes the first row. The first ArrowUp lands on the last stop, the footer's last button if there is one. After `open({ select })` the arrows go on from the row it chose, as they did. A test dispatching keys on the input keeps working, one arrow longer. An answer that moves the row with focus leaves focus on it. Load more is `aria-disabled` while something loads, not `disabled`, so it keeps focus and refuses the press itself: a test reading `.disabled` reads the attribute. Enter in the input, Esc, a press outside and Shift+Delete do as they did, and Shift+Delete also works on a focused row.
|
|
22
|
+
- **[Stop releases a turn that is waiting](docs/components/chat-shell.md#stop-releases-a-turn-that-is-waiting-0181).** A cancel promise that never settles, or a lost run-over, no longer hangs later sends: stopping the waiting turn sends the next one at once. A backend without a lock can then see two runs overlap; one that takes one run at a time should refuse the second.
|
|
23
|
+
- **[Keyboard focus shows a tooltip](docs/components/shell.md#keyboard-focus-shows-a-tooltip-0181)**: `TooltipService` listens to `focusin` and `focusout` as well as the mouse. Keyboard focus means the last press was a key, not a Ctrl, Cmd or Alt chord, so the focus a click leaves shows nothing, nor does a text field its handler then focuses. While focus holds a tooltip a scroll does not hide it, the one the focus itself caused included: it goes with its target, and waits while the target is out of sight. A pointer does not take it down: over another target the pointer's tooltip shows for as long as the pointer stays, then focus's comes back. A consumer's own wiring of the same can go.
|
|
24
|
+
- **[A press inside no longer disarms a context menu](docs/components/menus.md#a-press-inside-no-longer-disarms-a-context-menu-0181).** `showContextMenu`'s outside-press listener lasts until the menu closes.
|
|
25
|
+
- **[`attachInlineRenamer` runs `onStart` before adding its own key listeners](docs/components/input-fields.md#a-list-under-a-name-being-edited-attachinlinerenamer-0181)**, so what it attaches hears a key first and Enter on a highlighted row commits the row. Taking its field off the page no longer fires a second commit through blur after a commit or an Esc, so a consumer's guard against that can go.
|
|
26
|
+
- **[`openFilterDialog` refuses a range with one end filled](docs/components/filter-builder.md#a-range-with-one-end-filled-is-refused-0181)**, whatever `requireValid` and `prune` say. Such a filter used to leave the dialog and match nothing.
|
|
27
|
+
- **[A seed goes beside a negated root](docs/components/filter-builder.md#a-seed-beside-a-negated-root-0181)**, not inside it, where it undid the filter.
|
|
28
|
+
- **[Changing a condition's field keeps its operator and value](docs/components/filter-builder.md#what-a-condition-keeps-when-its-field-changes-0181)** when the new field offers the one and the other still fits. It used to start over, and `prune` then dropped the row.
|
|
29
|
+
- **[`validateFilter` checks every value of a `multi` operator](docs/components/filter-builder.md#what-a-condition-keeps-when-its-field-changes-0181)** as it does a single one: `one_of ['abc']` on a number field, or `one_of ['soon']` on a date field whose `operators` offer `one_of`, is an error. It used to pass, and a server's type check was the first to refuse it.
|
|
30
|
+
- **[A held condition under an operator its field does not offer shows its value read-only](docs/components/filter-builder.md#what-a-condition-keeps-when-its-field-changes-0181)**, where a box looked empty over a value the result still carried, and a custom `editor` is not asked about one. Its operator select reads as the catalogue's label on an unknown field too: `is`, not `is (unknown)`. An unknown field's whole warning is the select's tooltip.
|
|
31
|
+
- **[`describeFilter` says more](docs/components/filter-builder.md#what-a-sentence-says-0181)**: every value of a list under a single-value operator, and an unknown field's operator and value (`⚠ unknown field “gone” is x`). A consumer's test on the old sentence sees the difference.
|
|
32
|
+
- [The filter dialog's name box opens with its text selected](docs/components/filter-builder.md#the-name-box-opens-selected-0181), and a days box has `min="0"`.
|
|
33
|
+
- [`openModal` leaves focus where `onMount` put it](docs/components/forms-and-dialogs.md#focus-placed-by-onmount-stays-0181), with its selection, rather than moving it to the first field.
|
|
34
|
+
- `mountChatShell`'s model button has `aria-expanded`, so its open state is announced.
|
|
35
|
+
- `activeConversation()` [answers an id](docs/components/chat-shell.md#conversations), as it always did; the docs read as if it answered a conversation.
|
|
36
|
+
|
|
37
|
+
### Removed or renamed exports
|
|
38
|
+
|
|
39
|
+
None. New: the `hide` and `constantsProvider` options, the `resolveConstant` option, `dismissOnBackdrop`, `groupBrackets`, `model.partialRanges`, `model.moveClause`. Custom properties in `tokens.css`: `--twm-wspicker-field-icon`, `--twm-wspicker-field-focus-border`, `--twm-wspicker-field-muted-icon`, `--twm-wspicker-field-muted-style`, `--twm-wspicker-field-muted-opacity`. Classes: `.twm-filter-builder__select--unknown`, `.twm-plot-config__constant`, `.twm-plot-config__constant-value`.
|
|
40
|
+
|
|
41
|
+
## 0.18.0 (2026-11-05)
|
|
42
|
+
|
|
43
|
+
A minor release. A new entry point, `@flexdesk/git`, and six new components for
|
|
44
|
+
what the applications on FlexDesk each kept a copy of: a page rail, a workspace
|
|
45
|
+
picker, a filter builder, a rich select, combobox and popover, and an assistant
|
|
46
|
+
chat shell. The entries under "Changed behaviour" change what embedders see.
|
|
47
|
+
|
|
48
|
+
A consumer on a caret range has to raise it: `^0.17.18` does not take 0.18.0.
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- [`@flexdesk/git`, a tenth entry point](docs/concepts/packages-and-entry-points.md#ten-entry-points): [a source-control panel, `createGitPanel`](docs/components/git.md#the-panel-creategitpanel-0180), [a commit graph, `createGitGraph`](docs/components/git.md#the-commit-graph-creategitgraph-0180) and [a diff viewer, `createDiffViewer`](docs/components/git.md#the-diff-viewer-creatediffviewer-0180), with [`computeLineDiff`, the line diff without the viewer](docs/components/git.md#the-line-diff-without-the-viewer-0180) and [`openDiffWindow` and `openGitDiffWindow`](docs/components/git.md#a-diff-in-a-window-opendiffwindow-opengitdiffwindow-0180), over [a written adapter contract](docs/components/git.md#the-git-adapter-contract-0180). A consumer's import map needs `@flexdesk/git`.
|
|
53
|
+
- [The pages as a vertical rail: `chrome.rail`](docs/components/shell.md#the-pages-as-a-vertical-rail-chromerail-0180): `createShell` paints the top-nav kinds as an icon rail, `mountPageRail` does it for a shell of your own, and a kind's `railPin: 'bottom'` holds it at the bottom of the bar. [F1..F12 press the rail's buttons](docs/components/keymap.md#f1f12-and-a-page-rail-0180) as they do the top nav's. `chrome.rail` with `chrome.topNav` is refused at boot.
|
|
54
|
+
- [A workspace picker: `createWorkspacePicker`](docs/components/workspace-picker.md#a-field-and-a-switcher-createworkspacepicker-0180), from [the field, `mountPickerField`](docs/components/workspace-picker.md#the-field-mountpickerfield-0180) and [the switcher, `createPickerSwitcher`](docs/components/workspace-picker.md#the-switcher-createpickerswitcher-0180), and [a store of what was recently opened, `createRecentItems`](docs/components/workspace-picker.md#recently-opened-createrecentitems-0180).
|
|
55
|
+
- A filter builder: [the model, `createFilterModel`](docs/components/filter-builder.md#the-model-createfiltermodel-0180) with [its condition tree](docs/components/filter-builder.md#the-condition-tree-0180), [the builder, `createFilterBuilder`](docs/components/filter-builder.md#the-builder-createfilterbuilder-0180) with [custom value editors](docs/components/filter-builder.md#a-custom-value-editor-0180), and [the dialog, `openFilterDialog`](docs/components/filter-builder.md#the-dialog-openfilterdialog-0180).
|
|
56
|
+
- [A select drawn in the DOM: `createSelect`](docs/components/input-fields.md#a-select-drawn-in-the-dom-createselect-0180), [a text box that also offers a list: `createCombobox`](docs/components/input-fields.md#a-text-box-that-also-offers-a-list-createcombobox-0180) and [a rich popover: `openPopover`](docs/components/menus.md#a-rich-popover-openpopover-0180), on [one rule for an anchored layer: `positionAnchored`, `openAnchoredLayer`, `isInAnchoredLayer`](docs/components/menus.md#an-anchored-layer-positionanchored-openanchoredlayer-0180).
|
|
57
|
+
- [An assistant chat: `mountChatShell`](docs/components/chat-shell.md#an-assistant-chat-mountchatshell-0180), a domain-free chat over the conversation view with its state machine (`ChatStateMachine`) and a transport of yours.
|
|
58
|
+
- [Taking one message out of a conversation: `view.remove(id)`](docs/components/conversation.md#taking-one-message-out-remove-0180).
|
|
59
|
+
- [Tag suggestions and one spelling for tags: `suggestions`, `normalise`](docs/components/input-fields.md#suggestions-and-one-spelling-for-tags-suggestions-normalise-0180) on the tag input.
|
|
60
|
+
- [A modal that can refuse to close: `beforeClose`](docs/components/forms-and-dialogs.md#a-modal-that-can-refuse-to-close-beforeclose-0180) on `openModal`.
|
|
61
|
+
|
|
62
|
+
### Changed behaviour
|
|
63
|
+
|
|
64
|
+
- **[A saved desktop with no `tree` is an empty desktop](docs/components/panels-and-desktops.md#a-desktop-with-no-tree-is-an-empty-desktop-0180).** It loads, seeded with the root kind, and its siblings load with it. **Upgrade warning for a host that composes the layout blob:** from 0.17.14 to 0.17.18 a desktop with no `tree` key set the whole layout aside, and the next layout change overwrote the user's saved desktops for good. Go straight to 0.18.0, or write `tree: null` on those releases. A layout that is still unreadable is still set aside whole and overwritten at the next save.
|
|
65
|
+
- **Tab stays inside a popover.** [`openPopover`](docs/components/menus.md#a-rich-popover-openpopover-0180) goes round its controls, as a modal and a `CategoryPicker` do, and Escape is the way out. The flow kit's popover is now this one, so the step picker and *Insert a value* no longer close when Tab leaves them.
|
|
66
|
+
- **A modal's focus trap leaves focus in an anchored layer alone**, so a popover opened from a modal keeps its focus.
|
|
67
|
+
- **The flow kit's popover: test `handle.el`, not `handle.toggled`.** `toggled` is true only when the call closed the popover its anchor held. An anchor that is not on the page now opens nothing and answers `el: null`, `toggled: false`, so a caller asking whether anything opened tests `!handle.el`. Two kit popovers can now be open when one owns the other's anchor, and the outline menu answers `el: null` when nothing opened.
|
|
68
|
+
- **`taxonomy.topNavEntries()` entries carry `railPin`** (null unless set). A consumer's test that deep-compares an entry sees the new key. `railPin` of any other value, or on a kind that is not `isTopNav`, is a boot error.
|
|
69
|
+
- `.twm-fl-bar` and `.twm-fl-item` had rules and no code that drew them. They are now the rail's: `.twm-fl-bar` has its width, background and overflow and no `height: 100%`, and `.twm-fl-item`'s grey comes from `--twm-rail-icon` ([details](docs/components/shell.md#the-pages-as-a-vertical-rail-chromerail-0180)).
|
|
70
|
+
- [An `openForm` combobox field draws with `createCombobox`](docs/components/forms-and-dialogs.md#it-is-createcombobox-0180), not an `<input list>`: Enter with the list open closes the list and the next one submits, Escape closes the list and leaves the form open, there is no `<datalist>`, and `.twm-combobox__hint` has no `data-for`.
|
|
71
|
+
- [The tag input](docs/components/input-fields.md#suggestions-and-one-spelling-for-tags-suggestions-normalise-0180): the list it opens with, and `setValue`'s, drop a repeat unless `allowDuplicates` is set, as typing always did.
|
|
72
|
+
- `ActionDropdown` places its menu with `positionAnchored`, the one placement every floating panel uses.
|
|
73
|
+
- `shell.dispose()` empties `chrome.topNav` and takes its click listener off. The element is the embedder's and outlives the shell, and a shell rebuilt on it left each dead shell opening pages too.
|
|
74
|
+
- The DOM events FlexDesk fires (`managed-window-*`, `tile:*-request`, a select's, combobox's, colour field's and form field's `input` and `change`) are built by the target's own window. A bare constructor threw under jsdom on Node 19 or later, in the middle of a window's close, so a consumer's suite no longer needs to replace the global `CustomEvent` for them.
|
|
75
|
+
|
|
76
|
+
### Removed files
|
|
77
|
+
|
|
78
|
+
- `css/base.css` and `css/overrides.css` are gone from the package. They were the sources `css/flexdesk.css` was once generated from; the generator has left the repository, `exports` never mapped them and no consumer loaded them, and they lacked more than half of the library's rules. `flexdesk/css`, `flexdesk/css/tokens` and `flexdesk/css/reset` are unchanged. A rule that once went in both goes in `css/flexdesk.css` alone.
|
|
79
|
+
|
|
80
|
+
### Removed or renamed exports
|
|
81
|
+
|
|
82
|
+
None. Compared with 0.17.18 across every entry point. New:
|
|
83
|
+
|
|
84
|
+
- `@flexdesk/git`: `createGitPanel`, `createGitGraph`, `createDiffViewer`, `openDiffWindow`, `openGitDiffWindow`, `computeGraphLanes`, `parseGitRefs`, `computeLineDiff`, `parseUnifiedDiff`, `splitLines`, `diffStats`, `LINE_DIFF_LIMIT`.
|
|
85
|
+
- `@flexdesk/wm`: `mountPageRail`; the `chrome.rail` option, `shell.chrome.railEl` and `KindDef.railPin`.
|
|
86
|
+
- `@flexdesk/widgets`:
|
|
87
|
+
- the select, combobox and layers: `createSelect`, `createCombobox`, `attachInputOptions`, `filterOptions`, `openPopover`, `positionAnchored`, `openAnchoredLayer`, `isInAnchoredLayer`;
|
|
88
|
+
- the picker: `createWorkspacePicker`, `mountPickerField`, `createPickerSwitcher`, `createRecentItems`;
|
|
89
|
+
- the filter: `createFilterModel`, `createFilterBuilder`, `openFilterDialog`, `emptyFilter`, `cloneFilter`, `parseFilter`, `serializeFilter`, `countConditions`, `coerceFilterValue`, `toConditionTree`, `fromConditionTree`, `FILTER_OPERATORS`, `FILTER_TYPE_OPERATORS`;
|
|
90
|
+
- the chat: `mountChatShell`, `ChatStateMachine`, `CHAT_STATES`, `CHAT_TRANSITIONS`, `CHAT_BUS_EVENTS`, `CHAT_TRANSPORT_EVENTS`, `CHAT_SHELL_LABELS`.
|
|
91
|
+
- `view.remove(id)` on the conversation view; `createTagInput`'s `suggestions` and `normalise` options; `openModal`'s `beforeClose` option.
|
|
92
|
+
- Custom properties in `tokens.css`: `--twm-diff-add-bg`, `--twm-diff-add-fg`, `--twm-diff-del-bg`, `--twm-diff-del-fg`, `--twm-git-lane-0` to `--twm-git-lane-7`, `--twm-rail-width`, `--twm-rail-item-height`, `--twm-rail-icon-size`, `--twm-rail-bg`, `--twm-rail-icon`, `--twm-rail-icon-on`.
|
|
93
|
+
|
|
3
94
|
## 0.17.18 (2026-10-27)
|
|
4
95
|
|
|
5
96
|
A patch release. One additive menu bar option; one entry changes what
|
package/README.md
CHANGED
|
@@ -31,6 +31,7 @@ Import only what you use. The entries share their code, so loading several does
|
|
|
31
31
|
| `@flexdesk/editor` | A Monaco multi-file editor (Monaco is a peer dependency) |
|
|
32
32
|
| `@flexdesk/canvas` | A pannable, zoomable canvas with an edge router and a graph layer |
|
|
33
33
|
| `@flexdesk/flow` | Flow editors: canvas, outline and lanes |
|
|
34
|
+
| `@flexdesk/git` | A source-control panel, a commit graph and a diff viewer, over a written adapter contract |
|
|
34
35
|
|
|
35
36
|
With npm the entries are imported as `flexdesk/wm`, `flexdesk/widgets` and so on. The docs write them as `@flexdesk/…`, the names an import map gives them. [Packages and entry points](docs/concepts/packages-and-entry-points.md) has the sizes.
|
|
36
37
|
|