@w6w/ui 0.2.0 → 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 (160) hide show
  1. package/CHANGELOG.md +146 -2
  2. package/README.md +28 -10
  3. package/dist/AppPicker.d.ts +58 -2
  4. package/dist/CanvasContextMenu.d.ts +19 -0
  5. package/dist/CanvasLayer.d.ts +38 -0
  6. package/dist/{CodeBlock-Dot3Pd7P.js → CodeBlock-C-oIIYfC.js} +1436 -555
  7. package/dist/CodeBlock-C-oIIYfC.js.map +1 -0
  8. package/dist/CodeBlock-CymlfyeA.cjs +15 -0
  9. package/dist/CodeBlock-CymlfyeA.cjs.map +1 -0
  10. package/dist/CodeEditor.d.ts +4 -1
  11. package/dist/ConditionEditor.d.ts +11 -0
  12. package/dist/EditConnectionModal.d.ts +6 -1
  13. package/dist/JsonEditor.d.ts +20 -0
  14. package/dist/Markdown.d.ts +25 -0
  15. package/dist/ParamCustomization.d.ts +5 -0
  16. package/dist/ParamsForm.d.ts +18 -4
  17. package/dist/RouterEditor.d.ts +5 -0
  18. package/dist/StepBuilderModal.d.ts +103 -15
  19. package/dist/StepNameEditor.d.ts +11 -0
  20. package/dist/StopEditor.d.ts +5 -0
  21. package/dist/TriggerFillForm.d.ts +14 -1
  22. package/dist/WebhookListenPanel.d.ts +28 -0
  23. package/dist/WorkflowConnections.d.ts +29 -0
  24. package/dist/WorkflowFlowEditor.d.ts +74 -7
  25. package/dist/app-pages.d.ts +2 -0
  26. package/dist/assets/script-completion.worker-DDJKkj5M.js +8290 -0
  27. package/dist/assets/script-completion.worker-DDJKkj5M.js.map +1 -0
  28. package/dist/canvas-context-menu.d.ts +27 -0
  29. package/dist/canvas-types.d.ts +36 -0
  30. package/dist/canvas-utils.d.ts +44 -0
  31. package/dist/code.cjs +1 -1
  32. package/dist/code.mjs +3 -4
  33. package/dist/code.mjs.map +1 -1
  34. package/dist/components/AnchoredFlyout.d.ts +7 -0
  35. package/dist/components/AuthFieldsForm.d.ts +11 -0
  36. package/dist/components/BudgetMeter.d.ts +15 -0
  37. package/dist/components/CallableList.d.ts +3 -2
  38. package/dist/components/ColumnsEditor.d.ts +27 -0
  39. package/dist/components/Combobox.d.ts +19 -1
  40. package/dist/components/ConnectionList.d.ts +2 -3
  41. package/dist/components/CredentialPicker.d.ts +35 -0
  42. package/dist/components/CsvPanel.d.ts +21 -0
  43. package/dist/components/DataEntryEditor.d.ts +38 -0
  44. package/dist/components/DataEntryList.d.ts +33 -0
  45. package/dist/components/DataStoreList.d.ts +33 -0
  46. package/dist/components/DataTable.d.ts +27 -0
  47. package/dist/components/DataTableGrid.d.ts +46 -0
  48. package/dist/components/EmptyState.d.ts +9 -0
  49. package/dist/components/EventbriteTriggerPicker.d.ts +7 -0
  50. package/dist/components/ExecutionDetail.d.ts +17 -1
  51. package/dist/components/ExecutionList.d.ts +19 -1
  52. package/dist/components/ExecutionLogPanel.d.ts +61 -3
  53. package/dist/components/ExpressionEditorModal.d.ts +33 -10
  54. package/dist/components/ExpressionOptions.d.ts +101 -15
  55. package/dist/components/HtmlPreview.d.ts +7 -0
  56. package/dist/components/JsonTree.d.ts +32 -0
  57. package/dist/components/ResolvedParams.d.ts +6 -1
  58. package/dist/components/ResultViewer.d.ts +46 -0
  59. package/dist/components/ScriptBindingsNotice.d.ts +31 -0
  60. package/dist/components/ScriptCodeField.d.ts +13 -0
  61. package/dist/components/StepStatusPill.d.ts +7 -0
  62. package/dist/components/expression-authoring.d.ts +13 -0
  63. package/dist/components/expression-dom.d.ts +17 -2
  64. package/dist/components/expression-template.d.ts +25 -3
  65. package/dist/components/icons.d.ts +1 -1
  66. package/dist/components/json-compose.d.ts +53 -0
  67. package/dist/components/result-format.d.ts +13 -0
  68. package/dist/condition-editor.d.ts +44 -0
  69. package/dist/data-stores/data-store-view.d.ts +371 -0
  70. package/dist/dynamic-fields.d.ts +60 -0
  71. package/dist/editor-theme.d.ts +24 -0
  72. package/dist/eventbrite-trigger-selection.d.ts +13 -0
  73. package/dist/flow-connect.d.ts +22 -16
  74. package/dist/flow-delete.d.ts +16 -0
  75. package/dist/flow-fanout.d.ts +2 -2
  76. package/dist/flow-history.d.ts +75 -0
  77. package/dist/flow-layout.d.ts +13 -0
  78. package/dist/flow-loop-colors.d.ts +39 -0
  79. package/dist/flow-loop.d.ts +98 -0
  80. package/dist/flow-node-flags.d.ts +14 -0
  81. package/dist/flow-problems.d.ts +69 -0
  82. package/dist/flow-state.d.ts +20 -0
  83. package/dist/flow-types.d.ts +155 -10
  84. package/dist/flow-utils.d.ts +33 -12
  85. package/dist/flow.cjs +4 -2
  86. package/dist/flow.cjs.map +1 -1
  87. package/dist/flow.d.ts +15 -2
  88. package/dist/flow.mjs +3737 -1350
  89. package/dist/flow.mjs.map +1 -1
  90. package/dist/index.cjs +2 -1
  91. package/dist/index.cjs.map +1 -1
  92. package/dist/index.d.ts +43 -5
  93. package/dist/index.mjs +2855 -1333
  94. package/dist/index.mjs.map +1 -1
  95. package/dist/node-samples-ChdyMBnJ.cjs +22 -0
  96. package/dist/node-samples-ChdyMBnJ.cjs.map +1 -0
  97. package/dist/node-samples-DkJL07EX.js +12302 -0
  98. package/dist/node-samples-DkJL07EX.js.map +1 -0
  99. package/dist/node-samples.d.ts +80 -0
  100. package/dist/note-markdown.d.ts +22 -0
  101. package/dist/output-shape.d.ts +30 -14
  102. package/dist/param-customization.d.ts +7 -0
  103. package/dist/provider.d.ts +174 -13
  104. package/dist/resolve-params.d.ts +50 -11
  105. package/dist/run-visuals.d.ts +18 -22
  106. package/dist/script-bindings.d.ts +63 -0
  107. package/dist/script-completion-service.d.ts +9 -0
  108. package/dist/script-completion.worker.d.ts +1 -0
  109. package/dist/script-completions.d.ts +2 -0
  110. package/dist/state-shape.d.ts +38 -0
  111. package/dist/step-preview-state.d.ts +155 -6
  112. package/dist/step-problems.d.ts +64 -0
  113. package/dist/test-inputs.d.ts +25 -0
  114. package/dist/trigger-registration.d.ts +28 -0
  115. package/dist/types.d.ts +179 -11
  116. package/dist/use-app-action-defs.d.ts +9 -1
  117. package/dist/use-dynamic-fields.d.ts +23 -0
  118. package/dist/use-test-input.d.ts +18 -0
  119. package/dist/workflow-connections.d.ts +30 -0
  120. package/package.json +18 -7
  121. package/src/code.css +60 -6
  122. package/src/styles/_budget-meter.scss +46 -0
  123. package/src/styles/_callable-list.scss +15 -6
  124. package/src/styles/_canvas.scss +353 -0
  125. package/src/styles/_code-editor.scss +35 -0
  126. package/src/styles/_code.scss +6 -5
  127. package/src/styles/_connections.scss +2 -14
  128. package/src/styles/_copyable.scss +24 -0
  129. package/src/styles/_data-stores.scss +138 -0
  130. package/src/styles/_data-table.scss +55 -0
  131. package/src/styles/_data-vars.scss +17 -6
  132. package/src/styles/_empty-state.scss +21 -0
  133. package/src/styles/_execution-history.scss +73 -0
  134. package/src/styles/_execution-log.scss +145 -1
  135. package/src/styles/_expression-modal.scss +106 -16
  136. package/src/styles/_fields.scss +11 -0
  137. package/src/styles/_flow.scss +171 -0
  138. package/src/styles/_fx.scss +26 -1
  139. package/src/styles/_incoming-state.scss +33 -0
  140. package/src/styles/_layout.scss +10 -0
  141. package/src/styles/_markdown.scss +20 -0
  142. package/src/styles/_modal.scss +12 -0
  143. package/src/styles/_multiselect.scss +35 -0
  144. package/src/styles/_sections.scss +36 -0
  145. package/src/styles/_step-builder.scss +145 -0
  146. package/src/styles/_tester.scss +57 -14
  147. package/src/styles/_tokens.scss +27 -1
  148. package/src/styles.css +1861 -115
  149. package/src/styles.scss +7 -0
  150. package/dist/CodeBlock-CZu4TFSi.cjs +0 -15
  151. package/dist/CodeBlock-CZu4TFSi.cjs.map +0 -1
  152. package/dist/CodeBlock-Dot3Pd7P.js.map +0 -1
  153. package/dist/ConfirmModal-ChoiGy2K.cjs +0 -11
  154. package/dist/ConfirmModal-ChoiGy2K.cjs.map +0 -1
  155. package/dist/ConfirmModal-Wx3i8F1n.js +0 -6359
  156. package/dist/ConfirmModal-Wx3i8F1n.js.map +0 -1
  157. package/dist/Copyable-1niV9gUa.js +0 -771
  158. package/dist/Copyable-1niV9gUa.js.map +0 -1
  159. package/dist/Copyable-CYZU1o4X.cjs +0 -2
  160. package/dist/Copyable-CYZU1o4X.cjs.map +0 -1
@@ -35,9 +35,30 @@
35
35
  }
36
36
 
37
37
  .w6w-execution-list-rows > li {
38
+ display: flex;
39
+ align-items: center;
40
+ gap: var(--w6w-sp-1);
41
+ min-width: 0;
42
+ }
43
+
44
+ /* The row stays the full-width click target; a Re-run control, when the host
45
+ offers one, sits beside it rather than inside it (a button cannot nest in
46
+ the row's own `<button>`). */
47
+ .w6w-execution-list-rows > li > .w6w-list-item {
48
+ flex: 1 1 auto;
38
49
  min-width: 0;
39
50
  }
40
51
 
52
+ .w6w-execution-list-rerun {
53
+ flex-shrink: 0;
54
+ }
55
+
56
+ /* The row's input snippet: inline in the subtitle, so the subtitle's own
57
+ one-line ellipsis cuts it — no box of its own, just the code face. */
58
+ .w6w-execution-input-preview {
59
+ font-family: var(--w6w-font-mono);
60
+ }
61
+
41
62
  /* Both non-list branches (the loading and the empty `<p>`) hang straight off
42
63
  the root, so one direct-child rule covers them and neither needs a class the
43
64
  pinned markup doesn't have. Same dashed box `.w6w-execution-log-empty`
@@ -193,6 +214,12 @@
193
214
  min-width: 0;
194
215
  }
195
216
 
217
+ /* The Back control sits alone on its own line, flush left, so the detail
218
+ reads as a page the list was swapped for. */
219
+ .w6w-execution-detail-back {
220
+ display: flex;
221
+ }
222
+
196
223
  /* Title block left, controls right; the actions keep their width, the name
197
224
  wraps or ellipses into whatever is left. */
198
225
  .w6w-execution-detail-head {
@@ -230,6 +257,13 @@
230
257
  flex-shrink: 0;
231
258
  }
232
259
 
260
+ /* Glyph + label on one baseline (`.w6w-btn` itself is not a flex box). */
261
+ .w6w-execution-detail-rerun {
262
+ display: inline-flex;
263
+ align-items: center;
264
+ gap: var(--w6w-sp-1);
265
+ }
266
+
233
267
  .w6w-execution-detail-id-line {
234
268
  margin: 0;
235
269
  }
@@ -280,3 +314,42 @@
280
314
  color: var(--w6w-danger);
281
315
  font-size: var(--w6w-fs-sm);
282
316
  }
317
+
318
+ /* "Re-run": marks an execution started by History's Re-run — on its list row
319
+ (after the title) and on its detail ("Re-run of <id>"). */
320
+ .w6w-execution-rerun-tag {
321
+ display: inline-block;
322
+ margin-left: var(--w6w-sp-2);
323
+ padding: 0 var(--w6w-sp-1-5);
324
+ border: 1px solid var(--w6w-accent);
325
+ border-radius: var(--w6w-radius);
326
+ color: var(--w6w-accent);
327
+ font-size: var(--w6w-fs-xs);
328
+ line-height: var(--w6w-lh-tight);
329
+ vertical-align: middle;
330
+ }
331
+
332
+ .w6w-execution-detail-rerun-of {
333
+ display: flex;
334
+ align-items: center;
335
+ gap: var(--w6w-sp-1-5);
336
+ margin: 0;
337
+ }
338
+
339
+ .w6w-execution-detail-rerun-of .w6w-execution-rerun-tag {
340
+ margin-left: 0;
341
+ }
342
+
343
+ .w6w-execution-detail-rerun-of code {
344
+ font-family: var(--w6w-font-mono);
345
+ font-size: var(--w6w-fs-sm);
346
+ }
347
+
348
+ .w6w-execution-detail-rerun-of-link {
349
+ padding: 0;
350
+ border: none;
351
+ background: none;
352
+ color: var(--w6w-accent);
353
+ cursor: pointer;
354
+ text-decoration: underline;
355
+ }
@@ -128,8 +128,40 @@
128
128
  flex-wrap: wrap;
129
129
  }
130
130
 
131
- .w6w-execution-log-row-label {
131
+ /* Label over "App · Action": takes the row's free width, so the timing stays right-aligned. */
132
+ .w6w-execution-log-row-title {
133
+ display: flex;
134
+ flex-direction: column;
132
135
  flex: 1 1 auto;
136
+ min-width: 0;
137
+ gap: var(--w6w-sp-0-5);
138
+ }
139
+
140
+ .w6w-execution-log-row-uses {
141
+ color: var(--w6w-muted);
142
+ font-size: var(--w6w-fs-xs);
143
+ overflow: hidden;
144
+ text-overflow: ellipsis;
145
+ white-space: nowrap;
146
+ }
147
+
148
+ /* "Trigger" / "Node": a small outlined tag before the label; a trigger takes the accent. */
149
+ .w6w-execution-log-kind {
150
+ flex: 0 0 auto;
151
+ padding: 0 var(--w6w-sp-1-5);
152
+ border: 1px solid var(--w6w-border);
153
+ border-radius: var(--w6w-radius);
154
+ color: var(--w6w-muted);
155
+ font-size: var(--w6w-fs-xs);
156
+ line-height: var(--w6w-lh-tight);
157
+ }
158
+
159
+ .w6w-execution-log-kind-trigger {
160
+ border-color: var(--w6w-accent);
161
+ color: var(--w6w-accent);
162
+ }
163
+
164
+ .w6w-execution-log-row-label {
133
165
  min-width: 0;
134
166
  font-weight: var(--w6w-fw-medium);
135
167
  overflow: hidden;
@@ -141,6 +173,26 @@
141
173
  "<ts> → <ts> (elapsed)" text inside the row's box. With `flex-shrink: 0` it
142
174
  kept its max-content width, wrapped onto its own flex line, and ran past the
143
175
  row's border. */
176
+ .w6w-execution-log-skip-reason {
177
+ flex: 0 0 auto;
178
+ color: var(--w6w-muted);
179
+ font-size: var(--w6w-fs-xs);
180
+ }
181
+
182
+ /* Steps on other paths (not part of this run): one muted, collapsed line after the list. */
183
+ .w6w-execution-log-off-path {
184
+ margin-top: var(--w6w-sp-2);
185
+
186
+ summary {
187
+ cursor: pointer;
188
+ }
189
+
190
+ ul {
191
+ margin: var(--w6w-sp-1) 0 0;
192
+ padding-left: var(--w6w-sp-4);
193
+ }
194
+ }
195
+
144
196
  .w6w-execution-log-timing {
145
197
  flex: 0 1 auto;
146
198
  min-width: 0;
@@ -150,6 +202,14 @@
150
202
 
151
203
  .w6w-execution-log-json {
152
204
  min-width: 0;
205
+
206
+ > summary {
207
+ cursor: pointer;
208
+ }
209
+
210
+ > .w6w-result-viewer {
211
+ margin-top: var(--w6w-sp-2);
212
+ }
153
213
  }
154
214
 
155
215
  /* Error blocks (step `error`, run `runError`/`stepErrors`). The box itself is
@@ -176,3 +236,87 @@
176
236
  display: block;
177
237
  margin-bottom: var(--w6w-sp-1);
178
238
  }
239
+
240
+ /* --- For each iterations (T1.5.1) ----------------------------------------
241
+ Chips carry the status as TEXT as well as colour; failed/running also differ
242
+ in border style, so colour is never the only signal. */
243
+ .w6w-execution-log-foreach {
244
+ margin-top: var(--w6w-sp-2);
245
+ padding-left: var(--w6w-sp-3);
246
+ border-left: 2px solid var(--w6w-border);
247
+ }
248
+ .w6w-execution-log-iteration-chips {
249
+ display: flex;
250
+ flex-wrap: wrap;
251
+ gap: var(--w6w-sp-1);
252
+ }
253
+ .w6w-execution-log-iteration-chip {
254
+ padding: var(--w6w-sp-0-5) var(--w6w-sp-2);
255
+ border: 1px solid var(--w6w-border);
256
+ border-radius: 999px;
257
+ font-size: var(--w6w-fs-xs);
258
+ white-space: nowrap;
259
+ }
260
+ .w6w-execution-log-iteration-chip-succeeded {
261
+ border-color: var(--w6w-success);
262
+ }
263
+ .w6w-execution-log-iteration-chip-failed {
264
+ border-color: var(--w6w-danger);
265
+ border-width: 2px;
266
+ }
267
+ .w6w-execution-log-iteration-chip-running {
268
+ border-color: var(--w6w-accent);
269
+ border-style: dashed;
270
+ }
271
+ .w6w-execution-log-subrows {
272
+ display: flex;
273
+ flex-direction: column;
274
+ gap: var(--w6w-sp-2);
275
+ margin: 0;
276
+ padding: 0;
277
+ list-style: none;
278
+ }
279
+ .w6w-execution-log-subrow-head {
280
+ display: flex;
281
+ align-items: center;
282
+ justify-content: space-between;
283
+ gap: var(--w6w-sp-2);
284
+ }
285
+ /* An If / Stop / Router row's resolved comparisons. Operands are arbitrary
286
+ resolved values (long URLs), so they wrap rather than widen the panel. */
287
+ .w6w-execution-log-conditions {
288
+ font-size: var(--w6w-fs-xs);
289
+ table-layout: auto;
290
+ }
291
+ .w6w-execution-log-conditions code {
292
+ word-break: break-all;
293
+ }
294
+ .w6w-execution-log-condition-true {
295
+ color: var(--w6w-success);
296
+ }
297
+ .w6w-execution-log-condition-false {
298
+ color: var(--w6w-danger);
299
+ }
300
+
301
+ /* A step's State block: its state writes in recorded order (`state.<path>: old → new`),
302
+ warnings marked, then the run's state after this step. Values are arbitrary JSON,
303
+ so rows wrap rather than widen the panel. */
304
+ .w6w-execution-log-state {
305
+ min-width: 0;
306
+ }
307
+ .w6w-execution-log-state-writes {
308
+ display: flex;
309
+ flex-direction: column;
310
+ gap: var(--w6w-sp-0-5);
311
+ margin: 0;
312
+ padding: 0;
313
+ list-style: none;
314
+ font-family: var(--w6w-font-mono);
315
+ word-break: break-all;
316
+ }
317
+ .w6w-execution-log-state-warning {
318
+ padding-left: var(--w6w-sp-1-5);
319
+ border-left: 2px solid var(--w6w-danger);
320
+ color: var(--w6w-danger);
321
+ font-family: inherit;
322
+ }
@@ -13,11 +13,86 @@
13
13
  padding: var(--w6w-sp-2-5);
14
14
  display: flex;
15
15
  flex-direction: column;
16
- gap: 14px;
16
+ gap: var(--w6w-sp-1);
17
+ }
18
+ /* The seed-mode "Insert as" toggle is a <fieldset> for its group semantics; drop the
19
+ browser's fieldset chrome so it lays out like the plain row it replaced. */
20
+ .w6w-exprmodal-insert-as {
21
+ border: 0;
22
+ padding: 0;
23
+ margin: 0;
24
+ min-inline-size: 0;
17
25
  }
26
+ /* A rail section is an accordion item: its header always shows, its body animates open
27
+ (grid-template-rows 0fr -> 1fr) and only one section is open at a time. */
18
28
  .w6w-exprmodal-group {
19
29
  display: flex;
20
30
  flex-direction: column;
31
+ }
32
+ .w6w-exprmodal-group-head {
33
+ display: flex;
34
+ align-items: center;
35
+ gap: var(--w6w-sp-1);
36
+ }
37
+ .w6w-exprmodal-group-toggle {
38
+ flex: 1;
39
+ min-width: 0;
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: space-between;
43
+ gap: var(--w6w-sp-1);
44
+ background: transparent;
45
+ border: 0;
46
+ border-radius: 4px;
47
+ padding: var(--w6w-sp-1) var(--w6w-sp-0-5);
48
+ font: inherit;
49
+ text-align: left;
50
+ cursor: pointer;
51
+ }
52
+ .w6w-exprmodal-group-toggle:focus-visible {
53
+ outline: 2px solid var(--w6w-accent);
54
+ outline-offset: 1px;
55
+ }
56
+ .w6w-exprmodal-group-toggle:hover .w6w-exprmodal-group-label,
57
+ .w6w-exprmodal-group.is-open .w6w-exprmodal-group-label {
58
+ color: var(--w6w-text);
59
+ }
60
+ .w6w-exprmodal-group-caret {
61
+ color: var(--w6w-muted);
62
+ line-height: 1;
63
+ transition: transform 200ms ease;
64
+ }
65
+ .w6w-exprmodal-group.is-open .w6w-exprmodal-group-caret {
66
+ transform: rotate(90deg);
67
+ }
68
+ .w6w-exprmodal-group-body {
69
+ display: grid;
70
+ grid-template-rows: 0fr;
71
+ transition: grid-template-rows 200ms ease;
72
+ }
73
+ .w6w-exprmodal-group.is-open .w6w-exprmodal-group-body {
74
+ grid-template-rows: 1fr;
75
+ }
76
+ .w6w-exprmodal-group-inner {
77
+ min-height: 0;
78
+ overflow: hidden;
79
+ display: flex;
80
+ flex-direction: column;
81
+ gap: 3px;
82
+ }
83
+ .w6w-exprmodal-group.is-open .w6w-exprmodal-group-inner {
84
+ padding-bottom: var(--w6w-sp-1-5);
85
+ }
86
+ @media (prefers-reduced-motion: reduce) {
87
+ .w6w-exprmodal-group-caret,
88
+ .w6w-exprmodal-group-body {
89
+ transition: none;
90
+ }
91
+ }
92
+ /* A labelled block inside a section (Previous steps' Loop). */
93
+ .w6w-exprmodal-subgroup {
94
+ display: flex;
95
+ flex-direction: column;
21
96
  gap: 3px;
22
97
  }
23
98
  .w6w-exprmodal-group-label {
@@ -26,7 +101,6 @@
26
101
  letter-spacing: 0.04em;
27
102
  text-transform: uppercase;
28
103
  color: var(--w6w-muted);
29
- margin-bottom: var(--w6w-sp-0-5);
30
104
  }
31
105
  .w6w-exprmodal-source {
32
106
  display: flex;
@@ -49,6 +123,16 @@
49
123
  .w6w-exprmodal-source.w6w-expr-chip-var {
50
124
  color: var(--w6w-accent);
51
125
  }
126
+ /* A step's output field: a plain tree row (just the field's own name), not a
127
+ chip, so a step with many fields reads as a list rather than a wall of boxes. */
128
+ .w6w-exprmodal-source.w6w-exprmodal-field {
129
+ padding: var(--w6w-sp-0-5) var(--w6w-sp-1-5);
130
+ font-family: var(--w6w-font-mono);
131
+ font-size: var(--w6w-fs-xs);
132
+ }
133
+ .w6w-exprmodal-source.w6w-exprmodal-field:hover {
134
+ color: var(--w6w-accent);
135
+ }
52
136
  .w6w-exprmodal-source.w6w-expr-chip-secret {
53
137
  color: var(--w6w-danger);
54
138
  }
@@ -135,20 +219,6 @@
135
219
  .w6w-exprmodal-caret-btn:hover {
136
220
  background: var(--w6w-panel);
137
221
  }
138
- /* The "N fields" toggle with the Metadata toggle stacked under it, so both
139
- disclosures share one left edge on a step row. */
140
- .w6w-exprmodal-toggle-stack {
141
- display: flex;
142
- flex: none;
143
- flex-direction: column;
144
- align-items: flex-start;
145
- gap: 3px; /* lint-tokens-allow: 3px sits between no two steps of the spacing scale; tight stack of the fields and Metadata toggles */
146
- }
147
- /* A step with no fields: its Metadata toggle sits at the leaf indentation of
148
- `.w6w-exprmodal-subsources` (margin 9px + 1px border + sp-2 padding). */
149
- .w6w-exprmodal-meta-row {
150
- margin-left: calc(10px + var(--w6w-sp-2)); /* lint-tokens-allow: 9px margin + 1px border of .w6w-exprmodal-subsources */
151
- }
152
222
  /* Same 20px-high chrome as `.w6w-exprmodal-render-btn` above — the sizing
153
223
  precedent for a dense rail control — but a separate class: this toggles
154
224
  the `.w6w-exprmodal-subsources` block below it, the render-btn inserts a
@@ -290,3 +360,23 @@
290
360
  align-items: center;
291
361
  gap: var(--w6w-sp-2);
292
362
  }
363
+
364
+ /* The JSON compose pane (json-binding mode) fills the editor pane like the chips editor does,
365
+ instead of sitting at its content height over empty space. */
366
+ .w6w-exprmodal-json {
367
+ display: flex;
368
+ flex-direction: column;
369
+ flex: 1 1 auto;
370
+ min-height: 180px;
371
+ }
372
+ .w6w-exprmodal-json > .w6w-json-editor {
373
+ display: flex;
374
+ flex-direction: column;
375
+ flex: 1 1 auto;
376
+ min-height: 0;
377
+ }
378
+ /* CodeMirror's own root (the react-codemirror wrapper) — its `.cm-editor` is `height: 100%`. */
379
+ .w6w-exprmodal-json > .w6w-json-editor > :first-child {
380
+ flex: 1 1 auto;
381
+ min-height: 0;
382
+ }
@@ -159,3 +159,14 @@ select optgroup {
159
159
  .w6w-array-add {
160
160
  margin-top: var(--w6w-sp-0-5);
161
161
  }
162
+
163
+ /* Combobox (`components/Combobox.tsx`): its <input> sits inside the component's
164
+ own positioned root, so it is not a direct flex child of `.w6w-field` and would
165
+ keep its intrinsic width. The root and the input fill the field instead. */
166
+ .w6w-combobox {
167
+ width: 100%;
168
+ }
169
+ .w6w-combobox > input[type="text"] {
170
+ width: 100%;
171
+ box-sizing: border-box;
172
+ }
@@ -99,6 +99,17 @@
99
99
  white-space: nowrap;
100
100
  }
101
101
 
102
+ /* A trigger node's card (ControlNodeCard, `isTrigger`) — a half-pill: fully
103
+ rounded entry (left) edge, the ordinary 4px corner on the exit (right) edge,
104
+ so a run's start reads apart from the steps it feeds. No radius token
105
+ exists beyond --w6w-radius (10px), hence the literals. Wider left inset
106
+ clears the curve. */
107
+ .w6w-flow .w6w-node-trigger {
108
+ border-radius: 999px 4px 4px 999px;
109
+ /* lint-tokens-allow: 14px right inset matches the non-trigger card's inline padding */
110
+ padding: var(--w6w-sp-1-5) 14px var(--w6w-sp-1-5) var(--w6w-sp-4);
111
+ }
112
+
102
113
  /* The ordinary (success) ports — bumped from the library's own 6px default
103
114
  (2026-08-30: "ports must have consistent size") to match the error port
104
115
  below exactly. `:not(.w6w-handle-multi)`: the multi-input handle is its
@@ -196,6 +207,42 @@
196
207
  background: var(--w6w-danger);
197
208
  color: white;
198
209
  }
210
+ /* A toggle (pause / disable) shows its on state; the divider splits the run controls
211
+ (run, pause, disable) from the edit controls (edit, copy, delete). */
212
+ .w6w-node-toolbar-btn[aria-pressed="true"] {
213
+ background: var(--w6w-panel-2);
214
+ color: var(--w6w-accent);
215
+ }
216
+ .w6w-node-toolbar-divider {
217
+ align-self: stretch;
218
+ width: 1px;
219
+ margin: 2px var(--w6w-sp-0-5);
220
+ background: var(--w6w-border);
221
+ }
222
+
223
+ /* Persistent node flags under the card: ⏸ paused (test runs stop before it), ⃠ disabled
224
+ (skipped in every run). The glyph and the text carry the state, not colour. */
225
+ .w6w-flow .w6w-node-flag {
226
+ display: inline-flex;
227
+ align-items: center;
228
+ gap: 3px;
229
+ margin-top: var(--w6w-sp-0-5);
230
+ margin-right: var(--w6w-sp-1);
231
+ padding: 0 var(--w6w-sp-1);
232
+ border: 1px solid var(--w6w-border);
233
+ border-radius: var(--w6w-radius-sm, 3px);
234
+ font-size: var(--w6w-fs-xs);
235
+ background: var(--w6w-panel);
236
+ color: var(--w6w-text);
237
+ }
238
+ .w6w-flow .w6w-node-flag-paused {
239
+ border-color: var(--w6w-accent);
240
+ color: var(--w6w-accent);
241
+ }
242
+ /* The card's opacity is inline (it is also the run-status visual), so only the grey is here. */
243
+ .w6w-flow .w6w-node-disabled > [data-run-status] {
244
+ filter: grayscale(1);
245
+ }
199
246
 
200
247
  .w6w-params-optional > summary {
201
248
  cursor: pointer;
@@ -215,3 +262,127 @@
215
262
  font-size: var(--w6w-fs-xs);
216
263
  color: var(--w6w-muted, inherit);
217
264
  }
265
+
266
+ /* For each loops (T2.3.1). The Each item edge — a loop-body link, never
267
+ serialized — reads as a solid line in its loop's colour (`--w6w-loop-color`,
268
+ set per edge by `paintLoopEdges`), distinct from the error dash. */
269
+ .w6w-flow .react-flow__edge.w6w-edge-each .react-flow__edge-path {
270
+ stroke: var(--w6w-loop-color, var(--w6w-accent));
271
+ }
272
+ .w6w-flow .react-flow__edge.w6w-edge-each .react-flow__edge-text {
273
+ fill: var(--w6w-accent);
274
+ }
275
+ .w6w-flow .react-flow__edge.w6w-edge-each .react-flow__edge-textbg {
276
+ fill: var(--w6w-panel);
277
+ }
278
+
279
+ /* The Each item handle: in its loop's colour, on the right beside the Done handle. */
280
+ .w6w-flow .react-flow__handle.w6w-handle-each {
281
+ background: var(--w6w-loop-color, var(--w6w-accent));
282
+ border-color: var(--w6w-loop-color, var(--w6w-accent));
283
+ }
284
+ .w6w-flow .w6w-node-foreach .react-flow__handle-right {
285
+ top: 72%;
286
+ }
287
+ .w6w-flow .w6w-node-foreach .react-flow__handle-right.w6w-handle-each {
288
+ top: 28%;
289
+ }
290
+ .w6w-flow .w6w-foreach-ports {
291
+ display: flex;
292
+ flex-direction: column;
293
+ justify-content: space-between;
294
+ align-self: stretch;
295
+ text-align: right;
296
+ color: var(--w6w-muted);
297
+ }
298
+
299
+ /* A loop-body step looks like any other step; one dot per enclosing For each, just
300
+ above its top-right corner (named on hover), is all that marks it. */
301
+ .w6w-flow .w6w-loop-dots {
302
+ position: absolute;
303
+ top: -11px; /* lint-tokens-allow: dot sits just above the card edge */
304
+ right: var(--w6w-sp-1);
305
+ display: flex;
306
+ gap: var(--w6w-sp-0-5);
307
+ }
308
+ .w6w-flow .w6w-loop-dot {
309
+ width: 8px;
310
+ height: 8px;
311
+ border-radius: 50%;
312
+ box-shadow: 0 0 0 1.5px var(--w6w-panel);
313
+ cursor: help;
314
+ }
315
+ .w6w-flow .w6w-loop-legacy-note {
316
+ max-width: 220px;
317
+ margin-top: var(--w6w-sp-1);
318
+ color: var(--w6w-muted);
319
+ }
320
+
321
+ /* The connect-time loop refusal, anchored to its source node. */
322
+ .w6w-flow .w6w-loop-notice {
323
+ max-width: 260px;
324
+ padding: var(--w6w-sp-1) var(--w6w-sp-2);
325
+ background: var(--w6w-panel);
326
+ border: 1px solid var(--w6w-danger);
327
+ border-radius: 8px;
328
+ color: var(--w6w-danger);
329
+ }
330
+
331
+ // Router ports sit on the card's own edges (routerPortLayout, flow-types.ts):
332
+ // condition routes on the right, the fallback on the bottom. The right-edge labels
333
+ // are one grid row per port spanning the card's padding box (the negative margin
334
+ // cancels the card's 6px vertical padding), so each row centres on its handle.
335
+ .w6w-flow .w6w-router-ports {
336
+ align-self: stretch;
337
+ display: grid;
338
+ align-items: center;
339
+ margin: -6px 0;
340
+ max-width: 120px;
341
+ text-align: right;
342
+ color: var(--w6w-muted);
343
+ pointer-events: none;
344
+ }
345
+ .w6w-flow .w6w-router-ports > span {
346
+ overflow: hidden;
347
+ text-overflow: ellipsis;
348
+ white-space: nowrap;
349
+ line-height: 1.2;
350
+ }
351
+ // The fallback label sits just under the card, right of its bottom handle, so an
352
+ // edge leaving that handle downward never crosses it.
353
+ .w6w-flow .w6w-router-fallback-label {
354
+ position: absolute;
355
+ top: calc(100% + 2px);
356
+ left: calc(50% + 8px);
357
+ white-space: nowrap;
358
+ pointer-events: none;
359
+ color: var(--w6w-muted);
360
+ }
361
+
362
+ /* "Write to state" (step settings): the `validateStateConfig` messages for the current config. */
363
+ .w6w-state-write-issues {
364
+ color: var(--w6w-danger);
365
+ }
366
+
367
+ /* "Write to state" mapping rows (Pick fields, Append): the shared `.w6w-datavar-row`
368
+ input style, laid out as output path → state key → remove. The header row uses the
369
+ same columns so each label sits over its input. Doubled on the row so it beats
370
+ `.w6w-datavar-row`'s own columns whatever the partial order. */
371
+ .w6w-state-map-row,
372
+ .w6w-datavar-row.w6w-state-map-row {
373
+ display: grid;
374
+ grid-template-columns: minmax(0, 1fr) 1rem minmax(0, 1fr) 2rem;
375
+ gap: var(--w6w-sp-1-5);
376
+ align-items: center;
377
+ }
378
+ .w6w-state-map-head {
379
+ color: var(--w6w-muted);
380
+ font-size: 12px;
381
+ }
382
+ .w6w-state-map-arrow {
383
+ color: var(--w6w-muted);
384
+ text-align: center;
385
+ }
386
+ .w6w-state-map-add {
387
+ align-self: flex-start;
388
+ }
@@ -24,7 +24,9 @@
24
24
  .w6w-fx-wrap > select,
25
25
  .w6w-fx-wrap > textarea,
26
26
  .w6w-fx-wrap > .w6w-multiselect,
27
- .w6w-fx-wrap > .w6w-expr {
27
+ .w6w-fx-wrap > .w6w-expr,
28
+ .w6w-fx-wrap > .w6w-combobox,
29
+ .w6w-fx-wrap > .w6w-fx-grow {
28
30
  flex: 1 1 auto;
29
31
  min-width: 0;
30
32
  }
@@ -156,3 +158,26 @@
156
158
  .w6w-expr-fx.is-active {
157
159
  color: var(--w6w-accent);
158
160
  }
161
+
162
+ /* The json param's ƒx rides INSIDE the editor box, top-right, as the editor's
163
+ `overlay` (same mechanism as the `copyable` button in `_step-config.scss`).
164
+ Opaque backdrop because it sits on line 1; the text keeps right padding so
165
+ it is never covered; with `copyable` on it steps left of the copy button. */
166
+ .w6w-json-editor > .w6w-expr-fx {
167
+ position: absolute;
168
+ top: var(--w6w-sp-1);
169
+ right: var(--w6w-sp-1);
170
+ z-index: 1;
171
+ border: none;
172
+ background: var(--w6w-panel);
173
+ border-radius: 6px;
174
+ }
175
+ .w6w-json-editor:has(> .w6w-expr-fx) .cm-content {
176
+ padding-right: var(--w6w-sp-10);
177
+ }
178
+ .w6w-json-editor:has(> .w6w-copyable-btn) > .w6w-expr-fx {
179
+ right: calc(var(--w6w-sp-1) * 2 + var(--w6w-sp-8));
180
+ }
181
+ .w6w-json-editor:has(> .w6w-copyable-btn):has(> .w6w-expr-fx) .cm-content {
182
+ padding-right: var(--w6w-sp-20);
183
+ }
@@ -34,6 +34,10 @@
34
34
  flex-wrap: wrap;
35
35
  gap: var(--w6w-sp-1-5);
36
36
  }
37
+ /* A whole-value JSON field's "Use the output of <step>" row (ParamsForm). */
38
+ .w6w-json-quickbind {
39
+ align-items: center;
40
+ }
37
41
  .w6w-seed-chip {
38
42
  cursor: pointer;
39
43
  }
@@ -44,3 +48,32 @@
44
48
  cursor: default;
45
49
  opacity: 0.6;
46
50
  }
51
+ /* Run script (ParamsForm `ScriptCodeField`, WorkflowFlowEditor `ScriptBindingsNotice`): the
52
+ insert row under the code, the collapsed "How to read data", and the quiet conversion note. */
53
+ .w6w-script-insert {
54
+ align-items: center;
55
+ }
56
+ .w6w-script-help > summary {
57
+ cursor: pointer;
58
+ width: fit-content;
59
+ }
60
+ .w6w-script-help-examples {
61
+ margin: var(--w6w-sp-1-5) 0;
62
+ padding: var(--w6w-sp-1-5) var(--w6w-sp-2);
63
+ border-radius: 6px;
64
+ background: var(--w6w-bg);
65
+ font-size: 0.85em;
66
+ overflow-x: auto;
67
+ }
68
+ .w6w-script-converted {
69
+ display: block;
70
+ }
71
+ .w6w-script-converted-undo {
72
+ border: 0;
73
+ padding: 0;
74
+ background: none;
75
+ font: inherit;
76
+ color: var(--w6w-accent);
77
+ cursor: pointer;
78
+ text-decoration: underline;
79
+ }