@w6w/ui 0.2.11 → 0.2.54

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 (135) hide show
  1. package/CHANGELOG.md +139 -2
  2. package/README.md +28 -10
  3. package/dist/AppPicker.d.ts +12 -1
  4. package/dist/CanvasContextMenu.d.ts +19 -0
  5. package/dist/{CodeBlock-BqXDA35P.js → CodeBlock-C-oIIYfC.js} +1436 -555
  6. package/dist/CodeBlock-C-oIIYfC.js.map +1 -0
  7. package/dist/CodeBlock-CymlfyeA.cjs +15 -0
  8. package/dist/CodeBlock-CymlfyeA.cjs.map +1 -0
  9. package/dist/CodeEditor.d.ts +4 -1
  10. package/dist/ConditionEditor.d.ts +11 -0
  11. package/dist/JsonEditor.d.ts +12 -0
  12. package/dist/ParamCustomization.d.ts +5 -0
  13. package/dist/ParamsForm.d.ts +11 -3
  14. package/dist/RouterEditor.d.ts +5 -0
  15. package/dist/StepBuilderModal.d.ts +83 -13
  16. package/dist/StepNameEditor.d.ts +11 -0
  17. package/dist/StopEditor.d.ts +5 -0
  18. package/dist/TriggerFillForm.d.ts +14 -1
  19. package/dist/WebhookListenPanel.d.ts +28 -0
  20. package/dist/WorkflowConnections.d.ts +29 -0
  21. package/dist/WorkflowFlowEditor.d.ts +64 -8
  22. package/dist/assets/script-completion.worker-DDJKkj5M.js +8290 -0
  23. package/dist/assets/script-completion.worker-DDJKkj5M.js.map +1 -0
  24. package/dist/canvas-context-menu.d.ts +27 -0
  25. package/dist/code.cjs +1 -1
  26. package/dist/code.mjs +3 -4
  27. package/dist/code.mjs.map +1 -1
  28. package/dist/components/AnchoredFlyout.d.ts +7 -0
  29. package/dist/components/ColumnsEditor.d.ts +27 -0
  30. package/dist/components/Combobox.d.ts +12 -1
  31. package/dist/components/CsvPanel.d.ts +21 -0
  32. package/dist/components/DataEntryEditor.d.ts +38 -0
  33. package/dist/components/DataEntryList.d.ts +33 -0
  34. package/dist/components/DataStoreList.d.ts +33 -0
  35. package/dist/components/DataTableGrid.d.ts +46 -0
  36. package/dist/components/EventbriteTriggerPicker.d.ts +7 -0
  37. package/dist/components/ExecutionDetail.d.ts +17 -1
  38. package/dist/components/ExecutionList.d.ts +19 -1
  39. package/dist/components/ExecutionLogPanel.d.ts +61 -3
  40. package/dist/components/ExpressionEditorModal.d.ts +33 -10
  41. package/dist/components/ExpressionOptions.d.ts +101 -15
  42. package/dist/components/HtmlPreview.d.ts +7 -0
  43. package/dist/components/JsonTree.d.ts +32 -0
  44. package/dist/components/ResolvedParams.d.ts +6 -1
  45. package/dist/components/ResultViewer.d.ts +46 -0
  46. package/dist/components/ScriptBindingsNotice.d.ts +31 -0
  47. package/dist/components/ScriptCodeField.d.ts +13 -0
  48. package/dist/components/StepStatusPill.d.ts +7 -0
  49. package/dist/components/expression-authoring.d.ts +13 -0
  50. package/dist/components/expression-dom.d.ts +17 -2
  51. package/dist/components/expression-template.d.ts +25 -3
  52. package/dist/components/icons.d.ts +1 -1
  53. package/dist/components/json-compose.d.ts +53 -0
  54. package/dist/components/result-format.d.ts +13 -0
  55. package/dist/condition-editor.d.ts +44 -0
  56. package/dist/data-stores/data-store-view.d.ts +371 -0
  57. package/dist/eventbrite-trigger-selection.d.ts +13 -0
  58. package/dist/flow-connect.d.ts +22 -16
  59. package/dist/flow-delete.d.ts +16 -0
  60. package/dist/flow-history.d.ts +75 -0
  61. package/dist/flow-layout.d.ts +13 -0
  62. package/dist/flow-loop-colors.d.ts +39 -0
  63. package/dist/flow-loop.d.ts +98 -0
  64. package/dist/flow-node-flags.d.ts +14 -0
  65. package/dist/flow-problems.d.ts +69 -0
  66. package/dist/flow-state.d.ts +20 -0
  67. package/dist/flow-types.d.ts +137 -9
  68. package/dist/flow-utils.d.ts +27 -13
  69. package/dist/flow.cjs +4 -2
  70. package/dist/flow.cjs.map +1 -1
  71. package/dist/flow.d.ts +7 -3
  72. package/dist/flow.mjs +3563 -1557
  73. package/dist/flow.mjs.map +1 -1
  74. package/dist/index.cjs +2 -1
  75. package/dist/index.cjs.map +1 -1
  76. package/dist/index.d.ts +30 -4
  77. package/dist/index.mjs +2555 -1272
  78. package/dist/index.mjs.map +1 -1
  79. package/dist/node-samples-ChdyMBnJ.cjs +22 -0
  80. package/dist/node-samples-ChdyMBnJ.cjs.map +1 -0
  81. package/dist/node-samples-DkJL07EX.js +12302 -0
  82. package/dist/node-samples-DkJL07EX.js.map +1 -0
  83. package/dist/node-samples.d.ts +80 -0
  84. package/dist/output-shape.d.ts +30 -14
  85. package/dist/param-customization.d.ts +7 -0
  86. package/dist/provider.d.ts +119 -7
  87. package/dist/resolve-params.d.ts +45 -11
  88. package/dist/run-visuals.d.ts +14 -21
  89. package/dist/script-bindings.d.ts +63 -0
  90. package/dist/script-completion-service.d.ts +9 -0
  91. package/dist/script-completion.worker.d.ts +1 -0
  92. package/dist/script-completions.d.ts +2 -0
  93. package/dist/state-shape.d.ts +38 -0
  94. package/dist/step-preview-state.d.ts +155 -6
  95. package/dist/step-problems.d.ts +42 -12
  96. package/dist/test-inputs.d.ts +25 -0
  97. package/dist/trigger-registration.d.ts +28 -0
  98. package/dist/types.d.ts +70 -8
  99. package/dist/use-app-action-defs.d.ts +9 -1
  100. package/dist/use-test-input.d.ts +18 -0
  101. package/dist/workflow-connections.d.ts +30 -0
  102. package/package.json +16 -7
  103. package/src/code.css +60 -6
  104. package/src/styles/_canvas.scss +35 -0
  105. package/src/styles/_code-editor.scss +35 -0
  106. package/src/styles/_code.scss +6 -5
  107. package/src/styles/_copyable.scss +24 -0
  108. package/src/styles/_data-stores.scss +138 -0
  109. package/src/styles/_data-vars.scss +17 -6
  110. package/src/styles/_execution-history.scss +73 -0
  111. package/src/styles/_execution-log.scss +145 -1
  112. package/src/styles/_expression-modal.scss +106 -16
  113. package/src/styles/_fields.scss +11 -0
  114. package/src/styles/_flow.scss +160 -0
  115. package/src/styles/_fx.scss +3 -1
  116. package/src/styles/_incoming-state.scss +33 -0
  117. package/src/styles/_modal.scss +12 -0
  118. package/src/styles/_multiselect.scss +35 -0
  119. package/src/styles/_sections.scss +36 -0
  120. package/src/styles/_step-builder.scss +145 -0
  121. package/src/styles/_tester.scss +56 -0
  122. package/src/styles/_tokens.scss +27 -1
  123. package/src/styles.css +1290 -77
  124. package/src/styles.scss +2 -0
  125. package/dist/CodeBlock-BqXDA35P.js.map +0 -1
  126. package/dist/CodeBlock-CulfbnZD.cjs +0 -15
  127. package/dist/CodeBlock-CulfbnZD.cjs.map +0 -1
  128. package/dist/ConfirmModal-Ln99S9NT.js +0 -7919
  129. package/dist/ConfirmModal-Ln99S9NT.js.map +0 -1
  130. package/dist/ConfirmModal-fjHW5rN-.cjs +0 -14
  131. package/dist/ConfirmModal-fjHW5rN-.cjs.map +0 -1
  132. package/dist/Copyable-DA6eiU7w.cjs +0 -2
  133. package/dist/Copyable-DA6eiU7w.cjs.map +0 -1
  134. package/dist/Copyable-F4NTaG77.js +0 -847
  135. package/dist/Copyable-F4NTaG77.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -3,18 +3,155 @@
3
3
  All notable changes to `@w6w/ui` are documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Releases are
6
- tagged `vX.Y.Z` and published to npm by `.github/workflows/release.yml`; changes not yet released
6
+ tagged `ui-vX.Y.Z` in Studio and published to npm by `.github/workflows/release-ui.yml`; changes not yet released
7
7
  accumulate under `[Unreleased]`. Entries below `[0.1.0]` predate the first npm release — see the
8
8
  repo's git history for exact dates and commits.
9
9
 
10
- ## [Unreleased]
10
+ ## [0.2.51]
11
11
 
12
+ - Fix GitHub Actions publication with npm 12 by explicitly identifying the tested tarball as a local file.
13
+
14
+ ## [0.2.50]
15
+
16
+ - Move UI into the Studio workspace while preserving its npm package and MIT license.
17
+ - Add JSON parameter customization, Update object, and boolean and array condition controls.
18
+ - Open webhook setup immediately and defer document JSON validation until blur.
19
+
20
+ - A trigger's payload fields reach the expression picker. **trigger.event** and the trigger's own
21
+ row (`nodes.<trigger>.output`) now list the fields of the payload the trigger last ran with: a
22
+ Test this session, else the server's remembered sample (`node_samples`), so they survive a
23
+ reload. Before, a webhook or schedule entry showed only "Entire output" while every step after it
24
+ listed its fields. An app trigger's declared event fields still annotate and top up the list; a
25
+ Manual trigger's payload is its output only, since a manual run has no event.
26
+ `ExpressionOptions.eventOutputsFrom` now also takes `fresh` and `persisted`.
27
+ - An edited sample payload on a trigger's Test tab is remembered as it is typed and when the modal
28
+ closes, not only on **Test run**, so the header Run, ▶ on the node and the Run node modal run it
29
+ straight away. New `trackTestInputSave` / `testInputSavesSettled` (from `@w6w/ui`): every
30
+ remembered-input read now waits for a save still on the wire, so a Run pressed right after
31
+ closing the modal never reads the payload from before the edit.
32
+ - A webhook trigger's **Or test with a sample payload** section opens by itself when a saved
33
+ payload is loaded into it, so reopening the Test tab shows what ▶ Run will run with. Collapsed,
34
+ a loaded payload looked like none.
35
+ - The expression picker's Previous steps no longer offer a **Stop workflow**: it ends the run, so
36
+ no step after it reads its output (its static meta stays in the Metadata section). The node
37
+ builder's picker now scopes to the new node's own path once the node is wired in, as the step
38
+ editor's already did, so a step on the other side of an If (True/False) or on another Router
39
+ route is no longer offered either. Before, only a node inside a loop body was scoped, and every
40
+ other new node was offered every node in the workflow.
41
+ - Name a node while adding it. Once the node builder has added a node, its header shows the
42
+ node's name (its step id) with the same pencil the step editor has, prefilled with the generated
43
+ id and checked the same way (unique, no dot); Done creates the node under that name. Hosts pass
44
+ the graph's ids as `StepBuilderModal`'s new `stepIds`; `BuiltStep` gains an optional `id` (the
45
+ chosen name). The step editor's rename now also refuses a taken name with a message, through the
46
+ new `stepNameError` in `flow-utils`.
47
+ - If, Stop workflow and Router conditions take several rows. **+ Add condition** adds a row, each
48
+ row gets a remove button, and a selector joins them: **All of (AND)**, **Any of (OR)** or
49
+ **Exactly one of (XOR)**, saved as JSONLogic `and`, `or` and `@w6w/expr`'s `xor`. One row still
50
+ saves as a bare comparison; a nested group opens in the code view as before. The run log's
51
+ condition table names the combinator and shows the overall result.
52
+ - The workflow canvas has a right-click menu. On empty canvas: **Add node** and **Add trigger**,
53
+ which open the node builder (Add trigger on its Triggers tab) and place the step at the click. On
54
+ a node, or with nodes selected: **Duplicate** and **Delete** too, acting on the selection; Delete
55
+ takes the Delete key's selection confirm and is one undo step. Drawn with the canvas note menu's
56
+ styles, keyboard-driven (arrows, Home/End, Enter, Esc),
57
+ closed by an outside click, scroll, pan or zoom, greyed under `readOnly`. `StepBuilderModal`'s
58
+ `initialTab` also takes `"triggers"`. New real-browser gate: `pnpm test:workflow-context-menu`.
59
+ - Code views fill their box. In `JsonEditor`, `CodeEditor` and `YamlEditor` the code area now
60
+ covers the whole bordered box, also when only `minHeight` / `maxHeight` size it (the Data page's
61
+ Document modal, the default-height Script and YAML editors, the full-view JSON body). Before, the
62
+ gutter and the horizontal scrollbar stopped under the last line and the rest of the box was empty.
63
+ Taller content still scrolls inside the editor, and an explicit `height` is kept. New real-browser
64
+ gate: `pnpm test:code-editor-fill`.
65
+ - **Write to state** says which side is which. **Pick fields** and **Append** rows carry the column
66
+ headers **From this step output** → **To state key** (or **Append to state list**), an arrow and a
67
+ hint (`Copies output.<path> into state.<key>`), and use the Set data row style: the same inputs,
68
+ a trash `DeleteButton` and **+ Add field**. The left box is a free-text `Combobox` listing the
69
+ step's output fields. **Under a key** is labelled **To state key**. The stored `state` is unchanged.
70
+ - Test forms remember the last values used, server-side: the Run node modal, the step Test tab
71
+ (incoming state) and the trigger Test tab reopen PREFILLED with what that workflow + node last ran
72
+ with, after a success, a reload, another browser or the embed, and show a muted **last used
73
+ values · Clear** note. New optional `W6WApi.loadTestInputs` / `saveTestInput`
74
+ (`GET /workflows/:id/test-inputs`, `PUT /workflows/:id/nodes/:nodeId/test-input`), wired in
75
+ `createW6WApi`; a host without them keeps the step-test fixture prefill. Never in the workflow
76
+ definition (no dirty, no version); a literal typed into a `secret` param and sealed envelopes are
77
+ never remembered — bindings are. New exports `useRememberedTestInput`, `LastUsedNote`,
78
+ `findTestInput`, `rememberableInput`, `NodeTestInput`. 0.2.46.
79
+ - `ExpressionEditorModal` json-binding mode takes `startingState` for a workflow's starting state
80
+ (`Workflow.initialState`, evaluated once at run start): no Previous steps, State or Secrets in the
81
+ rail, Documents shown, an **Insert as Reference / Value** toggle (a value copies the source's
82
+ current sample in), clicks always compose into the object, an empty draft saves `undefined`, and
83
+ `jsonProblem` refuses a draft. It also takes `title`. `addRefToDraft` takes an optional literal
84
+ value. New `database` icon. `ExpressionEditorModal` is now exported from the root entry.
85
+ - The run state tree: a step's settings get **Write to state** (Off, Merge at root, Under a key, Pick
86
+ fields, Append; `FlowStep.state`, `FlowWorkflow.initialState`). The expression picker gains a
87
+ **State** section built before any run from the writers on the paths that reach the step (the old
88
+ "Workflow state" section is now "Previous steps"), and ƒx previews resolve `state.*` (`state`,
89
+ `var` and `vars` are one tree). The run log shows each step's state writes and "State after this
90
+ step" (`ExecutionLogStep.stateWrites` / `stateAfter`), and `findStateWriteProblems` (`@w6w/ui/flow`)
91
+ flags two parallel branches writing the same path. Script ƒx insertions read `run.*`.
92
+ - Ctrl/Cmd+Z undoes workflow edits to nodes, configuration, edges, connections and canvas layout.
93
+ Ctrl/Cmd+Shift+Z or Ctrl+Y redoes them. History keeps the latest 100 edits while the workflow is
94
+ open; test runs and learned output shapes stay intact, and text fields keep their own undo.
95
+ - A node's input takes any number of incoming edges: wiring a second trigger (or a second path)
96
+ into a node that already has one adds the edge instead of replacing the existing one. Only an
97
+ exact duplicate, or an edge into a trigger, is refused.
98
+ - A run's skipped steps say why: `ExecutionLogStep.skipReason` (`SkipReason`) shows "condition
99
+ false", "run stopped" or "disabled" beside the Skipped pill. A `not_on_path` step (on another
100
+ path, never part of the run) leaves the run log for a collapsed "N steps on other paths" footer
101
+ and gets no run paint on the canvas, nor do its edges.
102
+ - Run script reads data as code: a `{{ }}` in its code is converted to `state.nodes.<id>.output…`,
103
+ `vars.…` or `consts.…` (Python indexes them) when the step opens, behind a quiet note with
104
+ **Undo**; step chips and ƒx under the code insert those reads; the hint is one line plus a
105
+ collapsed "How to read data". **Input** moved under a collapsed "Custom input (advanced)"
106
+ section (open when set). A whole-value JSON param offers "Use the output of <step>" chips, and
107
+ the Test tab shows script code verbatim. `ResolvedParams` takes `literalKeys`; `CodeEditor`
108
+ takes `onCreateEditor`; a collapsible section param takes `openWhenSet`, a code param
109
+ `scriptReads`.
110
+ - A JSON param can be composed from references: the picker shows each step's outputs with their
111
+ metadata, a click inserts the reference at the cursor (adding to the draft, never replacing it),
112
+ a bound field renders as a chip, and the editor fills its pane.
113
+ - References save as `{{ }}` template strings, with `\{{` escaping a literal marker; a JSON param
114
+ binds a reference as a quoted `"{{ ref }}"`. Variables are offered under the `var.` root
115
+ (`vars.` still resolves), and account constants appear as a read-only Constants group under
116
+ `const.`.
117
+ - `ParamConfig.valueFormat: "csv"` lets a multiselect param store its choices as one
118
+ comma-separated string.
12
119
  - `WorkflowFlowEditor` takes an optional `stepProblems` map (`StepProblems`, exported from `./flow`)
13
120
  and paints a missing-connection error ring and tooltip on each affected app step, repainting live
14
121
  when the map changes. The host owns detection; omitted, the canvas renders as before.
15
122
  - The step panel's Setup tab labels a connection that is absent from the loaded list "Missing
16
123
  connection — choose another", and a failed connections fetch "Couldn't load connections" instead
17
124
  of treating it as missing.
125
+ - `Combobox` fills the field it is dropped into and grows to the ƒx button inside a `.w6w-fx-wrap`,
126
+ so the ƒx sits at the field's right end again everywhere the component is used (Setup Action,
127
+ dynamic-option and model-route params, flow-editor step actions, the action-test picker).
128
+ - New `ResultViewer`: a read-only result display that picks the view from the value's format — a
129
+ collapsible JSON tree, xml/markdown/html source, markdown through `Markdown`, and html rendered
130
+ ONLY inside a sandboxed `<iframe srcdoc>` (`HtmlPreview`, also exported) whose `srcdoc` opens with a
131
+ `default-src 'none'` CSP meta, so a vendor payload cannot run script and cannot read or reach this
132
+ page. Accepted residual: a reader's click on a link inside the preview navigates the frame itself —
133
+ a scriptless, same-origin-less document with no cookies, nothing more. Rendered/Source toggle for
134
+ html and markdown, one hover-revealed copy button, `detectResultFormat` / `resultCopyText` /
135
+ `RESULT_RENDER_MAX_CHARS` exported alongside. Source views stop being highlighted above 64 KiB, so a
136
+ multi-megabyte result renders instantly instead of stalling the pane. No existing pane adopts it yet.
137
+ ONLY inside a sandboxed `<iframe srcdoc>` (`HtmlPreview`, also exported) with a `default-src 'none'`
138
+ CSP, so vendor HTML cannot run script, read the page or make a request. Rendered/Source toggle for
139
+ html and markdown, one hover-revealed copy button, `detectResultFormat` / `resultCopyText` /
140
+ `RESULT_RENDER_MAX_CHARS` exported alongside.
141
+ - The six existing result panes now render through `ResultViewer`, so a JSON result is a collapsible
142
+ tree instead of wall-to-wall pretty-printed text and an HTML body is previewed in the sandboxed
143
+ iframe rather than shown as source: the step builder's inline test-run result and its test-run log
144
+ (request and response bodies), the flow editor's per-step Result and Metadata, both
145
+ `ActionTestForm` result panes, `TriggerFillForm`'s filled output state, and `ApiCallsPanel`'s
146
+ captured request/response bodies (headers stay plain). Error panes, log panes and header panes are
147
+ unchanged.
148
+ ONLY inside a sandboxed `<iframe srcdoc>` (`HtmlPreview`, also exported) with a `default-src 'none'`
149
+ CSP, so vendor HTML cannot run script, read the page or make a request. Rendered/Source toggle for
150
+ html and markdown, one hover-revealed copy button, `detectResultFormat` / `resultCopyText` /
151
+ `RESULT_RENDER_MAX_CHARS` exported alongside. No existing pane adopts it yet.
152
+ - The step modal's Test tab shows the step's newest stored run (success or failure) when reopened,
153
+ labelled with its time, until a new test replaces it; its Result and Metadata panes use
154
+ `ResultViewer`. Nothing about the result is written to the workflow document.
18
155
 
19
156
  ## [0.2.0]
20
157
 
package/README.md CHANGED
@@ -38,15 +38,14 @@ npm install @w6w/ui react react-dom
38
38
  are peer dependencies. The npm tarball ships compiled `dist/` (ESM + CJS + `.d.ts`), plus the
39
39
  stylesheets; the CommonJS build needs Node 20.19+ / 22.12+ to `require()` the ESM-only `@w6w/expr`.
40
40
 
41
- Two source routes remain, for working against an unreleased commit or a sibling checkout:
41
+ For development against unreleased source:
42
42
 
43
- - **Git dependency**: `"@w6w/ui": "github:w6w-io/w6w-ui#<commit-sha>"` — the repo is public.
44
- - **Sibling checkout with `link:`**: `"@w6w/ui": "link:../w6w-ui"` — the pattern this monorepo
45
- uses (`studio` links `ui` this way).
43
+ - **Studio workspace source**: the app and embed resolve `@w6w/ui` to `packages/ui`
44
+ through the workspace override; published consumers install the npm package.
46
45
 
47
46
  In this repo `main`/`module`/`types` and `exports` point at raw `.tsx` source under `./src`
48
47
  (`publishConfig` switches them to `dist/` in the packed npm tarball, which `pnpm pack` applies), so
49
- on those two routes your bundler compiles the package like your own code. Inside this repo
48
+ the workspace bundler compiles the package like your own code. Inside this repo
50
49
  `@w6w/expr` resolves to the sibling `packages/core` checkout through the `w6w-source` export
51
50
  condition (set in `tsconfig.json`, `vite.config.ts`, `.storybook/vite.config.ts`, the `test` script
52
51
  and the `test/` rigs). Vite needs nothing extra; a few setups do — see the
@@ -54,11 +53,8 @@ and the `test/` rigs). Vite needs nothing extra; a few setups do — see the
54
53
 
55
54
  - **Vite with a `link:` checkout**: studio sets `optimizeDeps.exclude: ["@w6w/ui"]` so edits are
56
55
  picked up live.
57
- - **SSR builds**: the package must be bundled, not externalized — the frontend site's Astro build
58
- sets `ssr.noExternal` for `@w6w/ui` and `prism-react-renderer` (a React-rendering dependency of a
59
- source package needs its own entry). Next.js needs the equivalent, `transpilePackages`.
60
- - **A linked checkout**: dedupe React (`resolve.dedupe: ["react", "react-dom"]`), or two copies
61
- break hooks.
56
+ - **SSR builds consuming workspace source**: bundle the package rather than externalizing
57
+ raw TSX. Next.js supports this through `transpilePackages`.
62
58
 
63
59
  ## Usage
64
60
 
@@ -215,6 +211,10 @@ not pulled in automatically.
215
211
  `ServerResourcesBadge`.
216
212
  - **Connections**: `ConnectionList`, `ConnectionHeader`, `EditConnectionModal` (provider; needs
217
213
  the optional `updateConnection` on the API client).
214
+ - **Data stores**: `DataStoreList`, `ColumnsEditor`, `CsvPanel` (all props-only), plus the pure
215
+ data-store helpers (cell parsing, row drafts, error placement) the same entrypoint exports.
216
+ - **Data store entries**: `DataEntryList`, `DataEntryEditor`, `DataTableGrid` (props-only; the host
217
+ owns drafts, queries, versions and delete confirmation).
218
218
 
219
219
  Everything is exported from `@w6w/ui` except `WorkflowFlowEditor`, which is only in `@w6w/ui/flow`
220
220
  (alongside a re-export of `ExpressionOptionsProvider`). `@w6w/ui/code` re-exports `CodeBlock` and
@@ -276,3 +276,21 @@ FSL.)
276
276
 
277
277
  `@w6w/expr`, which this package depends on, is MIT too, as is `@w6w/types`, the shared model these
278
278
  components' wire types mirror (`@w6w/ui` keeps its own local copy rather than depending on it).
279
+
280
+ ## Workspace and releases
281
+
282
+ Source lives in `w6w-studio/packages/ui`, beside `packages/embed` and `packages/studio`.
283
+ Install from the Studio repository root with `pnpm install`; all three packages share its
284
+ lockfile. From that root, use `pnpm -C packages/ui build`, `test`, or `storybook`.
285
+ The published npm package remains `@w6w/ui` with the same exports and MIT license.
286
+
287
+ Publish through `.github/workflows/release-ui.yml` in **w6w-io/w6w-studio**: bump
288
+ `packages/ui/package.json`, commit, then tag `ui-vX.Y.Z`. A manual workflow dispatch
289
+ runs verification, tarball checks and consumer builds without publishing.
290
+ The workflow publishes the exact tested pnpm tarball using npm trusted publishing.
291
+ Before the first release from Studio, update @w6w/ui's npm trusted publisher to
292
+ repository `w6w-studio`, workflow `release-ui.yml` (the former `w6w-ui/release.yml`
293
+ identity no longer matches). No stored npm token is needed.
294
+
295
+ UI changes deploy with Studio through the repository's existing `studio-dispatch.yml`.
296
+ The old standalone UI checkout and its deploy workflow are no longer used.
@@ -26,6 +26,9 @@ export interface AppPickerProps {
26
26
  emptyMessage?: string;
27
27
  /** Render the search input. Defaults to `true`; the connected-apps list opts out. */
28
28
  search?: boolean;
29
+ /** Controlled query for a shared search field outside the picker. */
30
+ searchValue?: string;
31
+ onSearchChange?: (value: string) => void;
29
32
  /** Rendered beneath `emptyMessage` in the empty state (e.g. a "Browse all apps" button). */
30
33
  emptyAction?: ReactNode;
31
34
  /**
@@ -79,6 +82,14 @@ export interface AppPickerProps {
79
82
  * Ignored when `apps` is supplied or the host has no `listAppsPage`.
80
83
  */
81
84
  category?: string;
85
+ /**
86
+ * Server-side "declares at least one trigger" filter for the bounded paged
87
+ * fetch (`GET /apps?hasTriggers=true`), forwarded to `listAppsPage` exactly
88
+ * like {@link category}: the page `total` is the FILTERED total, so the footer
89
+ * reads the server's `N of M`. Part of the query identity — changing it
90
+ * restarts the fetch. Ignored when `apps` is supplied or via a custom `loadPage`.
91
+ */
92
+ hasTriggers?: boolean;
82
93
  /**
83
94
  * Server-side id allow-list (`GET /apps?ids=a,b&paged=true`) for the bounded
84
95
  * paged fetch: the page `total` is the FILTERED total, so the footer reads
@@ -126,4 +137,4 @@ export interface AppPickerProps {
126
137
  * with neither `listAppsPage` nor `listApps` settles into this same
127
138
  * mode's existing empty state — no request, no throw.
128
139
  */
129
- export declare function AppPicker({ onSelectApp, theme, filter, searchPlaceholder, emptyMessage, search, emptyAction, apps: providedApps, categoryFilter, providerFilter, bridgeSupport, category, ids, pageLimit, loadPage, }: AppPickerProps): import("react").JSX.Element;
140
+ export declare function AppPicker({ onSelectApp, theme, filter, searchPlaceholder, emptyMessage, search, searchValue, onSearchChange, emptyAction, apps: providedApps, categoryFilter, providerFilter, bridgeSupport, category, hasTriggers, ids, pageLimit, loadPage, }: AppPickerProps): import("react").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import { CanvasMenuAction, CanvasMenuItem } from './canvas-context-menu.ts';
2
+ /**
3
+ * The workflow canvas's right-click menu. Positioned in the editor's own box (`x`/`y` are
4
+ * relative to it) so it inherits the editor's theme tokens, and drawn with the canvas
5
+ * note menu's classes rather than a look of its own.
6
+ *
7
+ * Keyboard: focus lands on the first item; ↑/↓ (and Home/End) move, Enter or Space runs
8
+ * the focused item, Esc or Tab closes. A greyed item stays focusable (`aria-disabled`, the
9
+ * menu pattern's rule) but does nothing. It closes on any pointer-down outside it and on
10
+ * a scroll anywhere; the editor closes it on a pan or zoom.
11
+ */
12
+ export declare function CanvasContextMenu({ x, y, items, onAction, onClose, }: {
13
+ x: number;
14
+ y: number;
15
+ items: CanvasMenuItem[];
16
+ onAction: (action: CanvasMenuAction) => void;
17
+ /** `restoreFocus` is true when the menu closed from the keyboard (Esc / Tab). */
18
+ onClose: (restoreFocus: boolean) => void;
19
+ }): import("react").JSX.Element;