@w6w/ui 0.2.11 → 0.2.55
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 +139 -2
- package/README.md +28 -10
- package/dist/AppPicker.d.ts +12 -1
- package/dist/CanvasContextMenu.d.ts +19 -0
- package/dist/{CodeBlock-BqXDA35P.js → CodeBlock-C-oIIYfC.js} +1436 -555
- package/dist/CodeBlock-C-oIIYfC.js.map +1 -0
- package/dist/CodeBlock-CymlfyeA.cjs +15 -0
- package/dist/CodeBlock-CymlfyeA.cjs.map +1 -0
- package/dist/CodeEditor.d.ts +4 -1
- package/dist/ConditionEditor.d.ts +11 -0
- package/dist/JsonEditor.d.ts +12 -0
- package/dist/ParamCustomization.d.ts +5 -0
- package/dist/ParamsForm.d.ts +11 -3
- package/dist/RouterEditor.d.ts +5 -0
- package/dist/StepBuilderModal.d.ts +83 -13
- package/dist/StepNameEditor.d.ts +11 -0
- package/dist/StopEditor.d.ts +5 -0
- package/dist/TriggerFillForm.d.ts +14 -1
- package/dist/WebhookListenPanel.d.ts +28 -0
- package/dist/WorkflowConnections.d.ts +29 -0
- package/dist/WorkflowConnectionsPanel.d.ts +5 -0
- package/dist/WorkflowFlowEditor.d.ts +67 -8
- package/dist/assets/script-completion.worker-DDJKkj5M.js +8290 -0
- package/dist/assets/script-completion.worker-DDJKkj5M.js.map +1 -0
- package/dist/canvas-context-menu.d.ts +27 -0
- package/dist/code.cjs +1 -1
- package/dist/code.mjs +3 -4
- package/dist/code.mjs.map +1 -1
- package/dist/components/AnchoredFlyout.d.ts +7 -0
- package/dist/components/ColumnsEditor.d.ts +27 -0
- package/dist/components/Combobox.d.ts +12 -1
- package/dist/components/ConfirmModal.d.ts +3 -1
- package/dist/components/CsvPanel.d.ts +21 -0
- package/dist/components/DataEntryEditor.d.ts +38 -0
- package/dist/components/DataEntryList.d.ts +33 -0
- package/dist/components/DataStoreList.d.ts +33 -0
- package/dist/components/DataTableGrid.d.ts +46 -0
- package/dist/components/EventbriteTriggerPicker.d.ts +7 -0
- package/dist/components/ExecutionDetail.d.ts +17 -1
- package/dist/components/ExecutionList.d.ts +19 -1
- package/dist/components/ExecutionLogPanel.d.ts +61 -3
- package/dist/components/ExpressionEditorModal.d.ts +33 -10
- package/dist/components/ExpressionOptions.d.ts +101 -15
- package/dist/components/HtmlPreview.d.ts +7 -0
- package/dist/components/JsonTree.d.ts +32 -0
- package/dist/components/ResolvedParams.d.ts +6 -1
- package/dist/components/ResultViewer.d.ts +46 -0
- package/dist/components/ScriptBindingsNotice.d.ts +31 -0
- package/dist/components/ScriptCodeField.d.ts +13 -0
- package/dist/components/StepStatusPill.d.ts +7 -0
- package/dist/components/expression-authoring.d.ts +13 -0
- package/dist/components/expression-dom.d.ts +17 -2
- package/dist/components/expression-template.d.ts +25 -3
- package/dist/components/icons.d.ts +1 -1
- package/dist/components/json-compose.d.ts +53 -0
- package/dist/components/result-format.d.ts +13 -0
- package/dist/condition-editor.d.ts +44 -0
- package/dist/connection-app-meta-BEXlKBgV.cjs +22 -0
- package/dist/connection-app-meta-BEXlKBgV.cjs.map +1 -0
- package/dist/connection-app-meta-ZCPakGjD.js +12422 -0
- package/dist/connection-app-meta-ZCPakGjD.js.map +1 -0
- package/dist/data-stores/data-store-view.d.ts +371 -0
- package/dist/eventbrite-trigger-selection.d.ts +13 -0
- package/dist/flow-connect.d.ts +22 -16
- package/dist/flow-delete.d.ts +16 -0
- package/dist/flow-history.d.ts +75 -0
- package/dist/flow-layout.d.ts +13 -0
- package/dist/flow-loop-colors.d.ts +39 -0
- package/dist/flow-loop.d.ts +98 -0
- package/dist/flow-node-flags.d.ts +14 -0
- package/dist/flow-problems.d.ts +69 -0
- package/dist/flow-state.d.ts +20 -0
- package/dist/flow-types.d.ts +137 -9
- package/dist/flow-utils.d.ts +27 -13
- package/dist/flow.cjs +4 -2
- package/dist/flow.cjs.map +1 -1
- package/dist/flow.d.ts +9 -3
- package/dist/flow.mjs +4028 -1585
- package/dist/flow.mjs.map +1 -1
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +30 -4
- package/dist/index.mjs +2559 -1287
- package/dist/index.mjs.map +1 -1
- package/dist/node-samples.d.ts +80 -0
- package/dist/output-shape.d.ts +30 -14
- package/dist/param-customization.d.ts +7 -0
- package/dist/provider.d.ts +119 -7
- package/dist/resolve-params.d.ts +45 -11
- package/dist/run-visuals.d.ts +14 -21
- package/dist/script-bindings.d.ts +63 -0
- package/dist/script-completion-service.d.ts +9 -0
- package/dist/script-completion.worker.d.ts +1 -0
- package/dist/script-completions.d.ts +2 -0
- package/dist/state-shape.d.ts +38 -0
- package/dist/step-preview-state.d.ts +155 -6
- package/dist/step-problems.d.ts +42 -12
- package/dist/test-inputs.d.ts +25 -0
- package/dist/trigger-registration.d.ts +28 -0
- package/dist/types.d.ts +70 -8
- package/dist/use-app-action-defs.d.ts +9 -1
- package/dist/use-test-input.d.ts +18 -0
- package/dist/workflow-connections.d.ts +78 -0
- package/package.json +16 -7
- package/src/code.css +60 -6
- package/src/styles/_canvas.scss +35 -0
- package/src/styles/_code-editor.scss +35 -0
- package/src/styles/_code.scss +6 -5
- package/src/styles/_connections.scss +64 -0
- package/src/styles/_copyable.scss +24 -0
- package/src/styles/_data-stores.scss +138 -0
- package/src/styles/_data-vars.scss +17 -6
- package/src/styles/_execution-history.scss +73 -0
- package/src/styles/_execution-log.scss +145 -1
- package/src/styles/_expression-modal.scss +106 -16
- package/src/styles/_fields.scss +11 -0
- package/src/styles/_flow.scss +166 -0
- package/src/styles/_fx.scss +3 -1
- package/src/styles/_incoming-state.scss +33 -0
- package/src/styles/_modal.scss +12 -0
- package/src/styles/_multiselect.scss +35 -0
- package/src/styles/_sections.scss +36 -0
- package/src/styles/_step-builder.scss +145 -0
- package/src/styles/_tester.scss +56 -0
- package/src/styles/_tokens.scss +27 -1
- package/src/styles.css +1347 -41
- package/src/styles.scss +2 -0
- package/dist/CodeBlock-BqXDA35P.js.map +0 -1
- package/dist/CodeBlock-CulfbnZD.cjs +0 -15
- package/dist/CodeBlock-CulfbnZD.cjs.map +0 -1
- package/dist/ConfirmModal-Ln99S9NT.js +0 -7919
- package/dist/ConfirmModal-Ln99S9NT.js.map +0 -1
- package/dist/ConfirmModal-fjHW5rN-.cjs +0 -14
- package/dist/ConfirmModal-fjHW5rN-.cjs.map +0 -1
- package/dist/Copyable-DA6eiU7w.cjs +0 -2
- package/dist/Copyable-DA6eiU7w.cjs.map +0 -1
- package/dist/Copyable-F4NTaG77.js +0 -847
- package/dist/Copyable-F4NTaG77.js.map +0 -1
|
@@ -128,8 +128,40 @@
|
|
|
128
128
|
flex-wrap: wrap;
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
-
|
|
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:
|
|
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
|
+
}
|
package/src/styles/_fields.scss
CHANGED
|
@@ -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
|
+
}
|
package/src/styles/_flow.scss
CHANGED
|
@@ -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,133 @@
|
|
|
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
|
+
}
|
|
389
|
+
|
|
390
|
+
/* Hover/focus in the connections rail: ephemeral emphasis, separate from selection/run status. */
|
|
391
|
+
.w6w-flow .react-flow__node.w6w-connection-highlight [data-run-status] {
|
|
392
|
+
outline: 3px solid var(--w6w-accent);
|
|
393
|
+
outline-offset: 4px;
|
|
394
|
+
}
|
package/src/styles/_fx.scss
CHANGED
|
@@ -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
|
+
}
|
package/src/styles/_modal.scss
CHANGED
|
@@ -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). */
|