@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
@@ -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
+ }
@@ -207,6 +207,42 @@
207
207
  background: var(--w6w-danger);
208
208
  color: white;
209
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
+ }
210
246
 
211
247
  .w6w-params-optional > summary {
212
248
  cursor: pointer;
@@ -226,3 +262,127 @@
226
262
  font-size: var(--w6w-fs-xs);
227
263
  color: var(--w6w-muted, inherit);
228
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
  }
@@ -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
+ }
@@ -123,3 +123,15 @@ dialog.w6w-modal.w6w-modal-fullscreen .w6w-modal-header {
123
123
  gap: var(--w6w-sp-1);
124
124
  flex-shrink: 0;
125
125
  }
126
+
127
+ .w6w-json-customized {
128
+ align-self: center;
129
+ border: 1px solid var(--w6w-accent);
130
+ border-radius: var(--w6w-radius-sm, 3px);
131
+ padding: 3px 7px;
132
+ background: color-mix(in srgb, var(--w6w-accent) 8%, transparent);
133
+ color: var(--w6w-accent);
134
+ font: inherit;
135
+ font-size: 11px;
136
+ cursor: pointer;
137
+ }
@@ -67,3 +67,38 @@
67
67
  background: var(--w6w-border);
68
68
  color: var(--w6w-text);
69
69
  }
70
+
71
+ // An explicit schema hint exposes all choices as checkboxes without changing the value shape.
72
+ .w6w-fx-wrap:has(> .w6w-multiselect-checks) { align-items: flex-start; }
73
+ .w6w-multiselect-checks { padding: var(--w6w-sp-1) 0; }
74
+ .w6w-multiselect-checks-toolbar {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: var(--w6w-sp-3);
78
+ margin-bottom: var(--w6w-sp-2);
79
+ }
80
+ .w6w-multiselect-checks-options {
81
+ border: 0;
82
+ padding: 0;
83
+ margin: 0;
84
+ min-width: 0;
85
+ display: grid;
86
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr));
87
+ gap: var(--w6w-sp-2) var(--w6w-sp-4);
88
+ max-height: 240px;
89
+ overflow-y: auto;
90
+ }
91
+ .w6w-field .w6w-multiselect-check {
92
+ display: flex;
93
+ align-items: center;
94
+ gap: var(--w6w-sp-2);
95
+ margin: 0;
96
+ font-size: var(--w6w-fs-sm);
97
+ cursor: pointer;
98
+ }
99
+ .w6w-field .w6w-multiselect-check input[type="checkbox"] {
100
+ width: auto;
101
+ margin: 0;
102
+ flex-shrink: 0;
103
+ accent-color: var(--w6w-accent);
104
+ }
@@ -33,4 +33,40 @@
33
33
  align-items: center;
34
34
  gap: var(--w6w-sp-2-5);
35
35
  }
36
+ /* Webhook "Listen for test event": the waiting row, its pulse, and the folded manual payload. */
37
+ .w6w-listen-waiting {
38
+ display: flex;
39
+ align-items: center;
40
+ gap: var(--w6w-sp-2-5);
41
+ min-width: 0;
42
+ code {
43
+ word-break: break-all;
44
+ }
45
+ }
46
+ .w6w-listen-pulse {
47
+ flex-shrink: 0;
48
+ width: 8px;
49
+ height: 8px;
50
+ border-radius: 50%;
51
+ background: var(--w6w-accent);
52
+ animation: w6w-listen-pulse 1.2s ease-in-out infinite;
53
+ }
54
+ @keyframes w6w-listen-pulse {
55
+ 0%,
56
+ 100% {
57
+ opacity: 1;
58
+ }
59
+ 50% {
60
+ opacity: 0.25;
61
+ }
62
+ }
63
+ @media (prefers-reduced-motion: reduce) {
64
+ .w6w-listen-pulse {
65
+ animation: none;
66
+ }
67
+ }
68
+ .w6w-listen-manual > summary {
69
+ cursor: pointer;
70
+ margin-bottom: var(--w6w-sp-2);
71
+ }
36
72
  /* A labeled test-run output block (Result vs Console). */
@@ -12,6 +12,33 @@
12
12
  }
13
13
 
14
14
  /* Step builder (sidebar + content) */
15
+ .w6w-stepbuilder-picker {
16
+ display: flex;
17
+ flex-direction: column;
18
+ gap: var(--w6w-sp-3);
19
+ height: min(70vh, 560px);
20
+ min-height: 0;
21
+ overflow: hidden;
22
+ }
23
+ .w6w-stepbuilder-picker > .w6w-stepbuilder-search {
24
+ flex-shrink: 0;
25
+ }
26
+ .w6w-stepbuilder-picker > .w6w-stepbuilder {
27
+ flex: 1;
28
+ min-height: 0;
29
+ overflow: hidden;
30
+ }
31
+ .w6w-stepbuilder-picker .w6w-stepbuilder-sidebar {
32
+ overflow-y: auto;
33
+ }
34
+ .w6w-stepbuilder-picker .w6w-stepbuilder-content {
35
+ height: auto;
36
+ }
37
+ .w6w-stepbuilder-picker .w6w-apppicker-host {
38
+ height: 100%;
39
+ min-height: 0;
40
+ flex: 1;
41
+ }
15
42
  .w6w-stepbuilder {
16
43
  display: flex;
17
44
  gap: var(--w6w-sp-4);
@@ -335,6 +362,28 @@
335
362
  color: var(--w6w-muted-text, var(--w6w-text));
336
363
  }
337
364
 
365
+ /* Triggers tab: the "Search all apps" row under the two columns, outside the
366
+ grid so the columns keep the host's remaining height. */
367
+ .w6w-readytouse-footer {
368
+ flex: 0 0 auto;
369
+ padding-top: var(--w6w-sp-3);
370
+ }
371
+
372
+ .w6w-readytouse-empty {
373
+ margin: 0;
374
+ }
375
+
376
+ /* A button that reads as an inline link — the empty state's "Search all apps". */
377
+ .w6w-linkbtn {
378
+ padding: 0;
379
+ border: 0;
380
+ background: none;
381
+ font: inherit;
382
+ color: var(--w6w-accent);
383
+ cursor: pointer;
384
+ text-decoration: underline;
385
+ }
386
+
338
387
  /* A Function/Workflow row, distinct from an app row at a glance: an app is
339
388
  somebody else's service, a Function/Workflow is something YOU built here.
340
389
  Applied by `CallableRow`, which both the home tab and the Workflows/
@@ -358,6 +407,12 @@
358
407
  /* Horizontal breathing room so header/footer align with the padded body. */
359
408
  padding-inline: var(--w6w-sp-1);
360
409
  }
410
+ /* The add flow's title: the node kind's label, then its editable name. */
411
+ .w6w-stepbuilder-title {
412
+ display: inline-flex;
413
+ align-items: center;
414
+ gap: var(--w6w-sp-2);
415
+ }
361
416
  /* Inline step rename (pencil) shown next to the modal title. */
362
417
  .w6w-step-rename {
363
418
  display: inline-flex;
@@ -374,3 +429,93 @@
374
429
  font-size: 0.9em;
375
430
  font-family: inherit;
376
431
  }
432
+
433
+ .w6w-router-editor {
434
+ display: flex;
435
+ flex-direction: column;
436
+ gap: var(--w6w-sp-3);
437
+ }
438
+ .w6w-router-editor > p { margin: 0; }
439
+ .w6w-router-routes {
440
+ display: flex;
441
+ flex-direction: column;
442
+ gap: var(--w6w-sp-2);
443
+ }
444
+ .w6w-router-route {
445
+ min-width: 0;
446
+ }
447
+ .w6w-router-route.is-dragging { opacity: 0.45; }
448
+ .w6w-router-route.is-drop-target { box-shadow: 0 -2px var(--w6w-accent); }
449
+ .w6w-router-route-heading {
450
+ display: flex;
451
+ align-items: center;
452
+ gap: var(--w6w-sp-1);
453
+ margin-bottom: var(--w6w-sp-1);
454
+ }
455
+ .w6w-router-route-heading > :last-child { margin-left: auto; }
456
+ .w6w-router-grip { cursor: grab; }
457
+ .w6w-router-grip:active { cursor: grabbing; }
458
+ .w6w-router-route-name {
459
+ display: inline-flex;
460
+ align-items: center;
461
+ gap: var(--w6w-sp-2);
462
+ border: 0;
463
+ background: transparent;
464
+ padding: var(--w6w-sp-1) 0;
465
+ font: inherit;
466
+ font-size: var(--w6w-fs-xs);
467
+ color: var(--w6w-muted);
468
+ cursor: pointer;
469
+ }
470
+ .w6w-router-route-name:hover { color: var(--w6w-text); }
471
+ .w6w-router-route-name:disabled { cursor: default; }
472
+ .w6w-router-add { align-self: flex-start; }
473
+ .w6w-condition-editor {
474
+ position: relative;
475
+ padding-right: var(--w6w-sp-8);
476
+ }
477
+ .w6w-condition-row {
478
+ display: grid;
479
+ grid-template-columns: auto minmax(0, 1fr) minmax(100px, auto) minmax(0, 1fr);
480
+ gap: var(--w6w-sp-2);
481
+ align-items: stretch;
482
+ }
483
+ .w6w-condition-row > * { min-width: 0; }
484
+ .w6w-condition-row-removable {
485
+ grid-template-columns: auto minmax(0, 1fr) minmax(100px, auto) minmax(0, 1fr) auto;
486
+ }
487
+ .w6w-condition-row-boolean {
488
+ grid-template-columns: auto minmax(0, 1fr) minmax(100px, auto);
489
+ }
490
+ .w6w-condition-row-boolean.w6w-condition-row-removable {
491
+ grid-template-columns: auto minmax(0, 1fr) minmax(100px, auto) auto;
492
+ }
493
+ .w6w-condition-negate {
494
+ display: flex;
495
+ align-items: center;
496
+ gap: var(--w6w-sp-1);
497
+ font-size: var(--w6w-fs-xs);
498
+ }
499
+ .w6w-condition-rows {
500
+ display: flex;
501
+ flex-direction: column;
502
+ gap: var(--w6w-sp-2);
503
+ }
504
+ .w6w-condition-combinator,
505
+ .w6w-condition-add { align-self: flex-start; }
506
+ .w6w-condition-remove { align-self: center; }
507
+ .w6w-condition-comparison {
508
+ min-height: var(--w6w-sp-10);
509
+ padding: var(--w6w-sp-2);
510
+ background: var(--w6w-panel-2);
511
+ border: 1px solid var(--w6w-border);
512
+ border-radius: var(--w6w-radius);
513
+ color: var(--w6w-text);
514
+ font: inherit;
515
+ font-size: var(--w6w-fs-xs);
516
+ }
517
+ .w6w-condition-mode {
518
+ position: absolute;
519
+ right: 0;
520
+ top: var(--w6w-sp-2);
521
+ }