@w6w/ui 0.1.1 → 0.2.11

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 (87) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +7 -5
  3. package/dist/AppPicker.d.ts +48 -2
  4. package/dist/CanvasLayer.d.ts +38 -0
  5. package/dist/{CodeBlock-Dot3Pd7P.js → CodeBlock-BqXDA35P.js} +2 -2
  6. package/dist/{CodeBlock-Dot3Pd7P.js.map → CodeBlock-BqXDA35P.js.map} +1 -1
  7. package/dist/{CodeBlock-CZu4TFSi.cjs → CodeBlock-CulfbnZD.cjs} +2 -2
  8. package/dist/{CodeBlock-CZu4TFSi.cjs.map → CodeBlock-CulfbnZD.cjs.map} +1 -1
  9. package/dist/ConfirmModal-Ln99S9NT.js +7919 -0
  10. package/dist/ConfirmModal-Ln99S9NT.js.map +1 -0
  11. package/dist/ConfirmModal-fjHW5rN-.cjs +14 -0
  12. package/dist/ConfirmModal-fjHW5rN-.cjs.map +1 -0
  13. package/dist/ConnectionHeader.d.ts +19 -0
  14. package/dist/Copyable-DA6eiU7w.cjs +2 -0
  15. package/dist/Copyable-DA6eiU7w.cjs.map +1 -0
  16. package/dist/{Copyable-1niV9gUa.js → Copyable-F4NTaG77.js} +91 -15
  17. package/dist/Copyable-F4NTaG77.js.map +1 -0
  18. package/dist/EditConnectionModal.d.ts +26 -0
  19. package/dist/JsonEditor.d.ts +8 -0
  20. package/dist/Markdown.d.ts +25 -0
  21. package/dist/ParamsForm.d.ts +7 -1
  22. package/dist/StepBuilderModal.d.ts +23 -5
  23. package/dist/WorkflowFlowEditor.d.ts +14 -3
  24. package/dist/app-pages.d.ts +5 -0
  25. package/dist/canvas-types.d.ts +36 -0
  26. package/dist/canvas-utils.d.ts +44 -0
  27. package/dist/code.cjs +1 -1
  28. package/dist/code.mjs +2 -2
  29. package/dist/components/AuthFieldsForm.d.ts +19 -1
  30. package/dist/components/BudgetMeter.d.ts +15 -0
  31. package/dist/components/CallableList.d.ts +58 -0
  32. package/dist/components/Combobox.d.ts +8 -1
  33. package/dist/components/ConnectionList.d.ts +43 -0
  34. package/dist/components/CredentialPicker.d.ts +35 -0
  35. package/dist/components/DataTable.d.ts +27 -0
  36. package/dist/components/EmptyState.d.ts +9 -0
  37. package/dist/components/ListItem.d.ts +16 -6
  38. package/dist/components/ReliabilityChart.d.ts +10 -0
  39. package/dist/components/ReliabilityList.d.ts +47 -0
  40. package/dist/components/icons.d.ts +1 -1
  41. package/dist/connection-app-meta.d.ts +32 -0
  42. package/dist/dynamic-fields.d.ts +60 -0
  43. package/dist/editor-theme.d.ts +24 -0
  44. package/dist/flow-fanout.d.ts +2 -2
  45. package/dist/flow-types.d.ts +18 -1
  46. package/dist/flow-utils.d.ts +10 -3
  47. package/dist/flow.cjs +2 -2
  48. package/dist/flow.cjs.map +1 -1
  49. package/dist/flow.d.ts +9 -0
  50. package/dist/flow.mjs +1519 -1138
  51. package/dist/flow.mjs.map +1 -1
  52. package/dist/index.cjs +1 -1
  53. package/dist/index.cjs.map +1 -1
  54. package/dist/index.d.ts +30 -2
  55. package/dist/index.mjs +2053 -1005
  56. package/dist/index.mjs.map +1 -1
  57. package/dist/note-markdown.d.ts +22 -0
  58. package/dist/provider.d.ts +73 -5
  59. package/dist/reliability-board-layout.d.ts +121 -0
  60. package/dist/resolve-params.d.ts +5 -0
  61. package/dist/run-visuals.d.ts +4 -1
  62. package/dist/step-problems.d.ts +34 -0
  63. package/dist/types.d.ts +117 -3
  64. package/dist/use-dynamic-fields.d.ts +23 -0
  65. package/package.json +5 -3
  66. package/src/styles/_budget-meter.scss +46 -0
  67. package/src/styles/_callable-list.scss +69 -0
  68. package/src/styles/_canvas.scss +318 -0
  69. package/src/styles/_connections.scss +88 -0
  70. package/src/styles/_data-table.scss +55 -0
  71. package/src/styles/_empty-state.scss +21 -0
  72. package/src/styles/_flow.scss +11 -0
  73. package/src/styles/_fx.scss +23 -0
  74. package/src/styles/_layout.scss +10 -0
  75. package/src/styles/_lists.scss +4 -0
  76. package/src/styles/_markdown.scss +20 -0
  77. package/src/styles/_reliability.scss +339 -0
  78. package/src/styles/_tester.scss +1 -14
  79. package/src/styles.css +1142 -17
  80. package/src/styles.scss +8 -0
  81. package/dist/ConfirmModal-8avl9Nv8.cjs +0 -11
  82. package/dist/ConfirmModal-8avl9Nv8.cjs.map +0 -1
  83. package/dist/ConfirmModal-CD-P8mhN.js +0 -6335
  84. package/dist/ConfirmModal-CD-P8mhN.js.map +0 -1
  85. package/dist/Copyable-1niV9gUa.js.map +0 -1
  86. package/dist/Copyable-CYZU1o4X.cjs +0 -2
  87. package/dist/Copyable-CYZU1o4X.cjs.map +0 -1
@@ -0,0 +1,318 @@
1
+ .w6w-canvas-layer {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ width: 0;
6
+ height: 0;
7
+ overflow: visible;
8
+ pointer-events: none;
9
+ }
10
+ .w6w-canvas-section,
11
+ .w6w-canvas-note {
12
+ position: absolute;
13
+ box-sizing: border-box;
14
+ border: 1px solid var(--w6w-canvas-color, var(--w6w-border));
15
+ border-radius: var(--w6w-radius, 6px);
16
+ background: color-mix(in srgb, var(--w6w-canvas-color, var(--w6w-panel)) 14%, transparent);
17
+ pointer-events: none;
18
+ }
19
+ // A note reads as a sticky: an opaque tint of its colour over the panel, so it stays legible in
20
+ // both themes and over a section or the grid.
21
+ .w6w-canvas-note {
22
+ border-color: color-mix(in srgb, var(--w6w-canvas-color, var(--w6w-border)) 55%, var(--w6w-panel));
23
+ background: color-mix(in srgb, var(--w6w-canvas-color, var(--w6w-panel)) 32%, var(--w6w-panel));
24
+ box-shadow: 0 1px 3px rgb(0 0 0 / 12%);
25
+ }
26
+ .w6w-canvas-note.selected,
27
+ .w6w-canvas-section.selected {
28
+ outline: 2px solid var(--w6w-accent);
29
+ outline-offset: 2px;
30
+ }
31
+ .w6w-canvas-note-body {
32
+ pointer-events: auto;
33
+ color: var(--w6w-text);
34
+ }
35
+ // A section's label sits above its frame's top-left corner, never inside the frame.
36
+ .w6w-canvas-section-title {
37
+ position: absolute;
38
+ max-width: 320px;
39
+ overflow: hidden;
40
+ padding: var(--w6w-sp-0-5) var(--w6w-sp-1-5);
41
+ border-radius: 6px;
42
+ color: color-mix(in srgb, var(--w6w-canvas-color, var(--w6w-text)) 55%, var(--w6w-text));
43
+ font-size: var(--w6w-fs-sm);
44
+ font-weight: var(--w6w-fw-semibold);
45
+ text-overflow: ellipsis;
46
+ white-space: nowrap;
47
+ }
48
+ .w6w-canvas-section-title.editable {
49
+ pointer-events: auto;
50
+ cursor: grab;
51
+ touch-action: none;
52
+ }
53
+ .w6w-canvas-section-title.editable:hover {
54
+ background: color-mix(in srgb, var(--w6w-canvas-color, var(--w6w-panel)) 18%, transparent);
55
+ }
56
+ .w6w-canvas-note-body {
57
+ box-sizing: border-box;
58
+ height: 100%;
59
+ overflow: auto;
60
+ padding: var(--w6w-sp-3) var(--w6w-sp-3);
61
+ font-size: var(--w6w-fs-sm);
62
+ line-height: var(--w6w-lh-normal);
63
+ overflow-wrap: anywhere;
64
+ h1,
65
+ h2,
66
+ h3,
67
+ h4,
68
+ h5,
69
+ h6,
70
+ p,
71
+ ul,
72
+ ol {
73
+ margin: 0 0 var(--w6w-sp-1);
74
+ }
75
+ h1 {
76
+ font-size: var(--w6w-fs-2xl);
77
+ line-height: var(--w6w-lh-tight);
78
+ }
79
+ h2 {
80
+ font-size: var(--w6w-fs-xl);
81
+ line-height: var(--w6w-lh-tight);
82
+ }
83
+ h3 {
84
+ font-size: var(--w6w-fs-lg);
85
+ line-height: var(--w6w-lh-tight);
86
+ }
87
+ h4,
88
+ h5,
89
+ h6 {
90
+ font-size: var(--w6w-fs-base);
91
+ }
92
+ }
93
+ // The in-place editor shares the view's box and type, so editing does not shift the text.
94
+ .w6w-canvas-note-editor {
95
+ outline: none;
96
+ cursor: text;
97
+ > div,
98
+ > h1,
99
+ > h2,
100
+ > h3,
101
+ > h4,
102
+ > h5,
103
+ > h6 {
104
+ margin: 0;
105
+ }
106
+ }
107
+ // The note's corner resize grip: two diagonal strokes, shown on hover or when selected.
108
+ .w6w-note-resize {
109
+ position: absolute;
110
+ right: var(--w6w-sp-0-5);
111
+ bottom: var(--w6w-sp-0-5);
112
+ width: 14px;
113
+ height: 14px;
114
+ cursor: nwse-resize;
115
+ pointer-events: auto;
116
+ touch-action: none;
117
+ opacity: 0;
118
+ background: linear-gradient(
119
+ 135deg,
120
+ transparent 45%,
121
+ var(--w6w-muted) 45% 52%,
122
+ transparent 52% 70%,
123
+ var(--w6w-muted) 70% 77%,
124
+ transparent 77%
125
+ );
126
+ }
127
+ .w6w-canvas-note:hover .w6w-note-resize,
128
+ .w6w-canvas-note.selected .w6w-note-resize,
129
+ .w6w-canvas-section.selected .w6w-note-resize {
130
+ opacity: 1;
131
+ }
132
+ .w6w-canvas-note-empty {
133
+ color: var(--w6w-muted);
134
+ font-style: italic;
135
+ }
136
+
137
+ // The selected note's floating toolbar.
138
+ .w6w-note-toolbar {
139
+ position: absolute;
140
+ display: flex;
141
+ align-items: center;
142
+ gap: var(--w6w-sp-0-5);
143
+ padding: var(--w6w-sp-1);
144
+ background: var(--w6w-panel);
145
+ color: var(--w6w-text);
146
+ border: 1px solid var(--w6w-border);
147
+ border-radius: 10px;
148
+ box-shadow: 0 6px 20px rgb(0 0 0 / 18%);
149
+ font-size: var(--w6w-fs-sm);
150
+ white-space: nowrap;
151
+ pointer-events: auto;
152
+ .w6w-icon-btn {
153
+ gap: var(--w6w-sp-1);
154
+ padding: var(--w6w-sp-1-5);
155
+ color: var(--w6w-text);
156
+ }
157
+ }
158
+ .w6w-note-toolbar-group {
159
+ position: relative;
160
+ display: inline-flex;
161
+ }
162
+ .w6w-note-toolbar-sep {
163
+ align-self: stretch;
164
+ width: 1px;
165
+ margin: var(--w6w-sp-0-5) var(--w6w-sp-0-5);
166
+ background: var(--w6w-border);
167
+ }
168
+ .w6w-note-grip {
169
+ cursor: grab;
170
+ touch-action: none;
171
+ }
172
+ .w6w-note-grip:active {
173
+ cursor: grabbing;
174
+ }
175
+ // The section toolbar's label field reads as the label until focused. Sized by its `size`
176
+ // attribute, so a host's global `input { width: 100% }` must not collapse it inside the flex row.
177
+ .w6w-note-toolbar .w6w-section-title-input {
178
+ flex: none;
179
+ width: auto;
180
+ margin: 0;
181
+ padding: var(--w6w-sp-1) var(--w6w-sp-1-5);
182
+ border: 1px solid transparent;
183
+ border-radius: 6px;
184
+ background: transparent;
185
+ color: inherit;
186
+ font: inherit;
187
+ font-weight: var(--w6w-fw-semibold);
188
+ }
189
+ .w6w-note-toolbar .w6w-section-title-input:hover {
190
+ border-color: var(--w6w-border);
191
+ }
192
+ .w6w-note-toolbar .w6w-section-title-input:focus {
193
+ border-color: var(--w6w-accent);
194
+ outline: none;
195
+ }
196
+ .w6w-note-size-btn {
197
+ font-weight: var(--w6w-fw-semibold);
198
+ }
199
+ .w6w-note-delete:hover {
200
+ color: var(--w6w-danger);
201
+ }
202
+ .w6w-note-swatch {
203
+ width: 16px;
204
+ height: 16px;
205
+ border-radius: 50%;
206
+ background: var(--w6w-canvas-color);
207
+ box-shadow: inset 0 0 0 1px rgb(0 0 0 / 15%);
208
+ }
209
+ .w6w-note-menu {
210
+ position: absolute;
211
+ top: calc(100% + var(--w6w-sp-2));
212
+ left: 0;
213
+ z-index: 1;
214
+ display: flex;
215
+ padding: var(--w6w-sp-1);
216
+ background: var(--w6w-panel);
217
+ border: 1px solid var(--w6w-border);
218
+ border-radius: 10px;
219
+ box-shadow: 0 6px 20px rgb(0 0 0 / 18%);
220
+ }
221
+ .w6w-note-menu-colors {
222
+ display: grid;
223
+ grid-template-columns: repeat(5, 24px);
224
+ gap: var(--w6w-sp-1-5);
225
+ padding: var(--w6w-sp-2);
226
+ }
227
+ .w6w-note-swatch-btn {
228
+ position: relative;
229
+ width: 24px;
230
+ height: 24px;
231
+ padding: 0;
232
+ border: 2px solid transparent;
233
+ border-radius: 50%;
234
+ background: var(--w6w-canvas-color);
235
+ box-shadow: inset 0 0 0 1px rgb(0 0 0 / 15%);
236
+ cursor: pointer;
237
+ }
238
+ .w6w-note-swatch-btn.active {
239
+ border-color: var(--w6w-panel);
240
+ box-shadow: 0 0 0 2px var(--w6w-accent);
241
+ }
242
+ .w6w-note-swatch-custom {
243
+ overflow: hidden;
244
+ background: conic-gradient(#f87171, #facc15, #4ade80, #60a5fa, #a78bfa, #f87171);
245
+ input {
246
+ position: absolute;
247
+ inset: 0;
248
+ width: 100%;
249
+ height: 100%;
250
+ opacity: 0;
251
+ cursor: pointer;
252
+ }
253
+ }
254
+ .w6w-note-menu-sizes {
255
+ flex-direction: column;
256
+ min-width: 150px;
257
+ }
258
+ .w6w-note-menu-item {
259
+ padding: var(--w6w-sp-1) var(--w6w-sp-2);
260
+ border: 0;
261
+ border-radius: 6px;
262
+ background: transparent;
263
+ color: inherit;
264
+ text-align: left;
265
+ font-weight: var(--w6w-fw-semibold);
266
+ cursor: pointer;
267
+ }
268
+ .w6w-note-menu-item:hover {
269
+ background: var(--w6w-panel-2);
270
+ }
271
+ .w6w-note-size-1 {
272
+ font-size: var(--w6w-fs-xl);
273
+ }
274
+ .w6w-note-size-2 {
275
+ font-size: var(--w6w-fs-lg);
276
+ }
277
+ .w6w-note-size-3 {
278
+ font-size: var(--w6w-fs-base);
279
+ }
280
+ .w6w-note-size-0 {
281
+ font-size: var(--w6w-fs-sm);
282
+ font-weight: var(--w6w-fw-regular);
283
+ }
284
+
285
+ // The editor's top-left tool strip: "+ Node", then the canvas tools as icon buttons.
286
+ .w6w-flow-tools {
287
+ display: flex;
288
+ align-items: center;
289
+ gap: var(--w6w-sp-1-5);
290
+ }
291
+ .w6w-flow-tool {
292
+ padding: var(--w6w-sp-2);
293
+ background: var(--w6w-panel);
294
+ color: var(--w6w-text);
295
+ border: 1px solid var(--w6w-border);
296
+ }
297
+ .w6w-flow-tool.active {
298
+ border-color: var(--w6w-accent);
299
+ color: var(--w6w-accent);
300
+ background: color-mix(in srgb, var(--w6w-accent) 12%, var(--w6w-panel));
301
+ }
302
+
303
+ // The draw-section surface and the frame being dragged on it.
304
+ .w6w-section-draw {
305
+ position: absolute;
306
+ inset: 0;
307
+ z-index: 4;
308
+ cursor: crosshair;
309
+ touch-action: none;
310
+ }
311
+ .w6w-section-draw-rect {
312
+ position: absolute;
313
+ box-sizing: border-box;
314
+ border: 2px dashed var(--w6w-accent);
315
+ border-radius: var(--w6w-radius, 6px);
316
+ background: color-mix(in srgb, var(--w6w-accent) 10%, transparent);
317
+ pointer-events: none;
318
+ }
@@ -0,0 +1,88 @@
1
+ /* Connections (D-12u): ConnectionList, ConnectionHeader and the state tags they share. */
2
+ .w6w-connection-list {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: var(--w6w-sp-3);
6
+ }
7
+ .w6w-connection-list-head {
8
+ display: flex;
9
+ justify-content: space-between;
10
+ align-items: flex-start;
11
+ gap: var(--w6w-sp-4);
12
+ }
13
+ .w6w-connection-list-heading {
14
+ min-width: 0;
15
+ }
16
+ .w6w-connection-list-actions {
17
+ display: flex;
18
+ gap: var(--w6w-sp-2);
19
+ flex-shrink: 0;
20
+ }
21
+ .w6w-connection-cell-name {
22
+ display: inline-flex;
23
+ align-items: center;
24
+ gap: var(--w6w-sp-2);
25
+ }
26
+ .w6w-connection-row-actions {
27
+ display: flex;
28
+ gap: var(--w6w-sp-1-5);
29
+ flex-shrink: 0;
30
+ }
31
+ .w6w-connection-name {
32
+ margin-right: var(--w6w-sp-2);
33
+ }
34
+
35
+ /* State tags (connected / needs attention / invalid). */
36
+ .w6w-connection-tag {
37
+ display: inline-block;
38
+ background: var(--w6w-panel-2);
39
+ border: 1px solid var(--w6w-border);
40
+ border-radius: 999px;
41
+ padding: var(--w6w-sp-0-5) var(--w6w-sp-2);
42
+ font-size: var(--w6w-fs-xs);
43
+ margin-right: var(--w6w-sp-1);
44
+ }
45
+ .w6w-connection-tag-warn {
46
+ color: #ffb86b;
47
+ border-color: #ffb86b;
48
+ }
49
+ .w6w-connection-tag-danger {
50
+ color: var(--w6w-danger);
51
+ border-color: var(--w6w-danger);
52
+ }
53
+
54
+ /* ConnectionHeader */
55
+ .w6w-connection-header {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: var(--w6w-sp-3);
59
+ }
60
+ .w6w-connection-header-main {
61
+ flex: 1;
62
+ min-width: 0;
63
+ }
64
+ .w6w-connection-header-title {
65
+ margin: 0;
66
+ }
67
+ .w6w-connection-header-meta {
68
+ margin: 0;
69
+ }
70
+ .w6w-connection-header-actions {
71
+ display: flex;
72
+ gap: var(--w6w-sp-1-5);
73
+ align-items: center;
74
+ }
75
+ /* The id's copy button appears on hover/focus only. */
76
+ .w6w-connection-id-copy.w6w-copyable {
77
+ display: inline-flex;
78
+ width: auto;
79
+ min-width: 0;
80
+ vertical-align: middle;
81
+ }
82
+ .w6w-connection-id-copy .w6w-copyable-btn {
83
+ opacity: 0;
84
+ }
85
+ .w6w-connection-id-copy:hover .w6w-copyable-btn,
86
+ .w6w-connection-id-copy:focus-within .w6w-copyable-btn {
87
+ opacity: 1;
88
+ }
@@ -0,0 +1,55 @@
1
+ /* The frame is the ONLY element of a DataTable that draws an outer border and a
2
+ radius (T-3). `overflow: hidden` clips the cells at the rounded corners, so
3
+ the table below never needs an outer edge of its own. */
4
+ .w6w-data-table-frame {
5
+ border: 1px solid var(--w6w-border);
6
+ border-radius: var(--w6w-radius);
7
+ background: var(--w6w-panel);
8
+ overflow: hidden;
9
+ }
10
+ /* No outer border here (T-3): the frame above already draws it. */
11
+ .w6w-data-table {
12
+ width: 100%;
13
+ border-collapse: collapse;
14
+ color: var(--w6w-text);
15
+ }
16
+ /* Inner separators only (T-3): a right border on every cell but the last column
17
+ and a bottom border on every row but the last. First column, first row, last
18
+ column and last row therefore paint nothing on the outside — one border per
19
+ outer edge, from the frame. */
20
+ .w6w-data-table th,
21
+ .w6w-data-table td {
22
+ border-right: 1px solid var(--w6w-border);
23
+ border-bottom: 1px solid var(--w6w-border);
24
+ padding: var(--w6w-sp-2) var(--w6w-sp-3);
25
+ text-align: left;
26
+ vertical-align: middle;
27
+ }
28
+ .w6w-data-table th:last-child,
29
+ .w6w-data-table td:last-child {
30
+ border-right: 0;
31
+ }
32
+ .w6w-data-table tbody tr:last-child > td {
33
+ border-bottom: 0;
34
+ }
35
+ /* Header-only table (rows=[] + loading, e.g. a list still fetching): there is no
36
+ `tbody tr:last-child` to strip, so the header's bottom border would sit right
37
+ on top of the frame's own bottom edge and paint it twice. With no body row the
38
+ header is the last row, so it paints no bottom border — the frame supplies it. */
39
+ .w6w-data-table:not(:has(tbody tr)) th {
40
+ border-bottom: 0;
41
+ }
42
+ .w6w-data-table th {
43
+ color: var(--w6w-muted);
44
+ }
45
+ .w6w-data-table-row-clickable {
46
+ cursor: pointer;
47
+ }
48
+ .w6w-data-table-row-clickable:hover {
49
+ background: var(--w6w-panel-2);
50
+ }
51
+ .w6w-data-table-link {
52
+ display: block;
53
+ color: inherit;
54
+ text-decoration: none;
55
+ }
@@ -0,0 +1,21 @@
1
+ .w6w-empty-state {
2
+ position: relative;
3
+ min-height: 10rem;
4
+ background: var(--w6w-panel);
5
+ color: var(--w6w-text);
6
+ border: 1px solid var(--w6w-border);
7
+ }
8
+ .w6w-empty-state-inner {
9
+ position: absolute;
10
+ top: 50%;
11
+ left: 50%;
12
+ transform: translate(-50%, -50%);
13
+ display: flex;
14
+ flex-direction: column;
15
+ align-items: center;
16
+ gap: var(--w6w-sp-2);
17
+ text-align: center;
18
+ }
19
+ .w6w-empty-state-body {
20
+ color: var(--w6w-muted);
21
+ }
@@ -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
@@ -156,3 +156,26 @@
156
156
  .w6w-expr-fx.is-active {
157
157
  color: var(--w6w-accent);
158
158
  }
159
+
160
+ /* The json param's ƒx rides INSIDE the editor box, top-right, as the editor's
161
+ `overlay` (same mechanism as the `copyable` button in `_step-config.scss`).
162
+ Opaque backdrop because it sits on line 1; the text keeps right padding so
163
+ it is never covered; with `copyable` on it steps left of the copy button. */
164
+ .w6w-json-editor > .w6w-expr-fx {
165
+ position: absolute;
166
+ top: var(--w6w-sp-1);
167
+ right: var(--w6w-sp-1);
168
+ z-index: 1;
169
+ border: none;
170
+ background: var(--w6w-panel);
171
+ border-radius: 6px;
172
+ }
173
+ .w6w-json-editor:has(> .w6w-expr-fx) .cm-content {
174
+ padding-right: var(--w6w-sp-10);
175
+ }
176
+ .w6w-json-editor:has(> .w6w-copyable-btn) > .w6w-expr-fx {
177
+ right: calc(var(--w6w-sp-1) * 2 + var(--w6w-sp-8));
178
+ }
179
+ .w6w-json-editor:has(> .w6w-copyable-btn):has(> .w6w-expr-fx) .cm-content {
180
+ padding-right: var(--w6w-sp-20);
181
+ }
@@ -1,4 +1,14 @@
1
1
  /* Layout helpers */
2
+
3
+ /* A vertical column whose direct children are cards/panels. ONE gap, from the
4
+ shared spacing scale — never a per-screen number and never a second gap: do
5
+ not add this class to a container whose parent already gaps its children. */
6
+ .w6w-card-stack {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: var(--w6w-sp-4);
10
+ }
11
+
2
12
  .w6w-stack {
3
13
  display: flex;
4
14
  flex-direction: column;
@@ -16,6 +16,10 @@ button.w6w-list-item {
16
16
  font: inherit;
17
17
  font-size: var(--w6w-fs-sm);
18
18
  }
19
+ a.w6w-list-item {
20
+ text-decoration: none;
21
+ color: inherit;
22
+ }
19
23
  .w6w-list-item:hover {
20
24
  background: var(--w6w-panel-2);
21
25
  }
@@ -0,0 +1,20 @@
1
+ /* Markdown: the leading YAML frontmatter, collapsed above the rendered body. The body itself
2
+ is unstyled here — the host styles it through the `className` it passes. */
3
+ .w6w-md-frontmatter {
4
+ margin-bottom: var(--w6w-sp-2);
5
+ border: 1px solid var(--w6w-border);
6
+ border-radius: 8px;
7
+ padding: var(--w6w-sp-1-5) var(--w6w-sp-2-5);
8
+ font-size: var(--w6w-fs-sm);
9
+ }
10
+ .w6w-md-frontmatter > summary {
11
+ cursor: pointer;
12
+ color: var(--w6w-muted);
13
+ }
14
+ .w6w-md-frontmatter > pre {
15
+ margin: var(--w6w-sp-2) 0 0;
16
+ overflow-x: auto;
17
+ font-family: var(--w6w-font-mono);
18
+ white-space: pre-wrap;
19
+ overflow-wrap: anywhere;
20
+ }