@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.
Files changed (138) 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/WorkflowConnectionsPanel.d.ts +5 -0
  22. package/dist/WorkflowFlowEditor.d.ts +67 -8
  23. package/dist/assets/script-completion.worker-DDJKkj5M.js +8290 -0
  24. package/dist/assets/script-completion.worker-DDJKkj5M.js.map +1 -0
  25. package/dist/canvas-context-menu.d.ts +27 -0
  26. package/dist/code.cjs +1 -1
  27. package/dist/code.mjs +3 -4
  28. package/dist/code.mjs.map +1 -1
  29. package/dist/components/AnchoredFlyout.d.ts +7 -0
  30. package/dist/components/ColumnsEditor.d.ts +27 -0
  31. package/dist/components/Combobox.d.ts +12 -1
  32. package/dist/components/ConfirmModal.d.ts +3 -1
  33. package/dist/components/CsvPanel.d.ts +21 -0
  34. package/dist/components/DataEntryEditor.d.ts +38 -0
  35. package/dist/components/DataEntryList.d.ts +33 -0
  36. package/dist/components/DataStoreList.d.ts +33 -0
  37. package/dist/components/DataTableGrid.d.ts +46 -0
  38. package/dist/components/EventbriteTriggerPicker.d.ts +7 -0
  39. package/dist/components/ExecutionDetail.d.ts +17 -1
  40. package/dist/components/ExecutionList.d.ts +19 -1
  41. package/dist/components/ExecutionLogPanel.d.ts +61 -3
  42. package/dist/components/ExpressionEditorModal.d.ts +33 -10
  43. package/dist/components/ExpressionOptions.d.ts +101 -15
  44. package/dist/components/HtmlPreview.d.ts +7 -0
  45. package/dist/components/JsonTree.d.ts +32 -0
  46. package/dist/components/ResolvedParams.d.ts +6 -1
  47. package/dist/components/ResultViewer.d.ts +46 -0
  48. package/dist/components/ScriptBindingsNotice.d.ts +31 -0
  49. package/dist/components/ScriptCodeField.d.ts +13 -0
  50. package/dist/components/StepStatusPill.d.ts +7 -0
  51. package/dist/components/expression-authoring.d.ts +13 -0
  52. package/dist/components/expression-dom.d.ts +17 -2
  53. package/dist/components/expression-template.d.ts +25 -3
  54. package/dist/components/icons.d.ts +1 -1
  55. package/dist/components/json-compose.d.ts +53 -0
  56. package/dist/components/result-format.d.ts +13 -0
  57. package/dist/condition-editor.d.ts +44 -0
  58. package/dist/connection-app-meta-BEXlKBgV.cjs +22 -0
  59. package/dist/connection-app-meta-BEXlKBgV.cjs.map +1 -0
  60. package/dist/connection-app-meta-ZCPakGjD.js +12422 -0
  61. package/dist/connection-app-meta-ZCPakGjD.js.map +1 -0
  62. package/dist/data-stores/data-store-view.d.ts +371 -0
  63. package/dist/eventbrite-trigger-selection.d.ts +13 -0
  64. package/dist/flow-connect.d.ts +22 -16
  65. package/dist/flow-delete.d.ts +16 -0
  66. package/dist/flow-history.d.ts +75 -0
  67. package/dist/flow-layout.d.ts +13 -0
  68. package/dist/flow-loop-colors.d.ts +39 -0
  69. package/dist/flow-loop.d.ts +98 -0
  70. package/dist/flow-node-flags.d.ts +14 -0
  71. package/dist/flow-problems.d.ts +69 -0
  72. package/dist/flow-state.d.ts +20 -0
  73. package/dist/flow-types.d.ts +137 -9
  74. package/dist/flow-utils.d.ts +27 -13
  75. package/dist/flow.cjs +4 -2
  76. package/dist/flow.cjs.map +1 -1
  77. package/dist/flow.d.ts +9 -3
  78. package/dist/flow.mjs +4028 -1585
  79. package/dist/flow.mjs.map +1 -1
  80. package/dist/index.cjs +2 -1
  81. package/dist/index.cjs.map +1 -1
  82. package/dist/index.d.ts +30 -4
  83. package/dist/index.mjs +2559 -1287
  84. package/dist/index.mjs.map +1 -1
  85. package/dist/node-samples.d.ts +80 -0
  86. package/dist/output-shape.d.ts +30 -14
  87. package/dist/param-customization.d.ts +7 -0
  88. package/dist/provider.d.ts +119 -7
  89. package/dist/resolve-params.d.ts +45 -11
  90. package/dist/run-visuals.d.ts +14 -21
  91. package/dist/script-bindings.d.ts +63 -0
  92. package/dist/script-completion-service.d.ts +9 -0
  93. package/dist/script-completion.worker.d.ts +1 -0
  94. package/dist/script-completions.d.ts +2 -0
  95. package/dist/state-shape.d.ts +38 -0
  96. package/dist/step-preview-state.d.ts +155 -6
  97. package/dist/step-problems.d.ts +42 -12
  98. package/dist/test-inputs.d.ts +25 -0
  99. package/dist/trigger-registration.d.ts +28 -0
  100. package/dist/types.d.ts +70 -8
  101. package/dist/use-app-action-defs.d.ts +9 -1
  102. package/dist/use-test-input.d.ts +18 -0
  103. package/dist/workflow-connections.d.ts +78 -0
  104. package/package.json +16 -7
  105. package/src/code.css +60 -6
  106. package/src/styles/_canvas.scss +35 -0
  107. package/src/styles/_code-editor.scss +35 -0
  108. package/src/styles/_code.scss +6 -5
  109. package/src/styles/_connections.scss +64 -0
  110. package/src/styles/_copyable.scss +24 -0
  111. package/src/styles/_data-stores.scss +138 -0
  112. package/src/styles/_data-vars.scss +17 -6
  113. package/src/styles/_execution-history.scss +73 -0
  114. package/src/styles/_execution-log.scss +145 -1
  115. package/src/styles/_expression-modal.scss +106 -16
  116. package/src/styles/_fields.scss +11 -0
  117. package/src/styles/_flow.scss +166 -0
  118. package/src/styles/_fx.scss +3 -1
  119. package/src/styles/_incoming-state.scss +33 -0
  120. package/src/styles/_modal.scss +12 -0
  121. package/src/styles/_multiselect.scss +35 -0
  122. package/src/styles/_sections.scss +36 -0
  123. package/src/styles/_step-builder.scss +145 -0
  124. package/src/styles/_tester.scss +56 -0
  125. package/src/styles/_tokens.scss +27 -1
  126. package/src/styles.css +1347 -41
  127. package/src/styles.scss +2 -0
  128. package/dist/CodeBlock-BqXDA35P.js.map +0 -1
  129. package/dist/CodeBlock-CulfbnZD.cjs +0 -15
  130. package/dist/CodeBlock-CulfbnZD.cjs.map +0 -1
  131. package/dist/ConfirmModal-Ln99S9NT.js +0 -7919
  132. package/dist/ConfirmModal-Ln99S9NT.js.map +0 -1
  133. package/dist/ConfirmModal-fjHW5rN-.cjs +0 -14
  134. package/dist/ConfirmModal-fjHW5rN-.cjs.map +0 -1
  135. package/dist/Copyable-DA6eiU7w.cjs +0 -2
  136. package/dist/Copyable-DA6eiU7w.cjs.map +0 -1
  137. package/dist/Copyable-F4NTaG77.js +0 -847
  138. package/dist/Copyable-F4NTaG77.js.map +0 -1
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@w6w/ui",
3
- "version": "0.2.11",
3
+ "version": "0.2.55",
4
4
  "description": "React components for w6w — central API management. Build plugins, apps and integrations on them.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://w6w.io",
7
7
  "author": "W6W (https://w6w.io)",
8
- "bugs": "https://github.com/w6w-io/w6w-ui/issues",
8
+ "bugs": "https://github.com/w6w-io/w6w-studio/issues",
9
9
  "keywords": [
10
10
  "w6w",
11
11
  "react",
@@ -14,7 +14,8 @@
14
14
  ],
15
15
  "repository": {
16
16
  "type": "git",
17
- "url": "https://github.com/w6w-io/w6w-ui.git"
17
+ "url": "https://github.com/w6w-io/w6w-studio.git",
18
+ "directory": "packages/ui"
18
19
  },
19
20
  "type": "module",
20
21
  "main": "./dist/index.cjs",
@@ -71,10 +72,12 @@
71
72
  "@codemirror/state": "^6.5.0",
72
73
  "@codemirror/view": "^6.35.0",
73
74
  "@uiw/react-codemirror": "^4.23.7",
74
- "@w6w/expr": "^0.1.0",
75
+ "@w6w/expr": "^0.1.2",
75
76
  "@xyflow/react": "^12.3.6",
76
77
  "prism-react-renderer": "^2.4.1",
77
- "react-markdown": "^10.1.0"
78
+ "react-markdown": "^10.1.0",
79
+ "typescript": "^5.7.2",
80
+ "@codemirror/autocomplete": "^6.18.0"
78
81
  },
79
82
  "devDependencies": {
80
83
  "@biomejs/biome": "^1.9.4",
@@ -90,7 +93,6 @@
90
93
  "react-dom": "^18.3.1",
91
94
  "sass": "^1.102.0",
92
95
  "storybook": "^10.5.8",
93
- "typescript": "^5.7.2",
94
96
  "vite": "^6.0.5",
95
97
  "vite-plugin-dts": "^4.3.0"
96
98
  },
@@ -102,16 +104,23 @@
102
104
  "test": "node --max-old-space-size=2048 --conditions=w6w-source --import ./src/test-jsx-loader.mjs --test --test-concurrency=4 --test-timeout=120000 src/__tests__/*.test.ts src/components/__tests__/*.test.ts",
103
105
  "test:picker-layout": "bash test/picker-layout/run.sh",
104
106
  "test:canvas-layer": "bash test/canvas-layer/run.sh",
107
+ "test:foreach-loop": "bash test/foreach-loop/run.sh",
105
108
  "test:expr-template": "bash test/expr-template/run.sh",
109
+ "test:friendly-expressions": "node test/friendly-expressions/run.mjs",
106
110
  "test:action-test-form": "bash test/action-test-form/run.sh",
107
111
  "test:host-isolation": "bash test/host-isolation/run.sh",
108
112
  "test:copyable": "bash test/copyable/run.sh",
113
+ "test:code-editor-fill": "bash test/code-editor-fill/run.sh",
109
114
  "test:pack-smoke": "bash test/pack-smoke/run.sh",
110
115
  "storybook": "storybook dev -p 6006 --no-open",
111
116
  "build-storybook": "storybook build",
112
117
  "lint": "biome check .",
113
118
  "lint:tokens": "node scripts/lint-tokens.mjs",
114
119
  "coverage:stories": "node scripts/coverage-stories.mjs",
115
- "format": "biome format --write ."
120
+ "format": "biome format --write .",
121
+ "test:workflow-connections": "node test/workflow-connections/run.mjs",
122
+ "test:workflow-undo": "node test/workflow-connections/undo.mjs",
123
+ "test:workflow-context-menu": "node test/workflow-connections/context-menu.mjs",
124
+ "test:script-completion": "node test/script-completion/run.mjs"
116
125
  }
117
126
  }
package/src/code.css CHANGED
@@ -32,7 +32,9 @@
32
32
  * host rule — even a plain `:root { ... }` — wins without !important. Tokens are
33
33
  * defined on :root so every `.w6w-*` component inherits them out of the box.
34
34
  */
35
- /* Light — the base defaults. */
35
+ /* Light — the base defaults.
36
+ `--w6w-loop-N` is the For each palette (flow-loop-colors.ts, LOOP_TONES): no red,
37
+ black or green, so a loop never reads as an error port or a success edge. */
36
38
  :where(:root) {
37
39
  --w6w-bg: #f7f8fa;
38
40
  --w6w-panel: #ffffff;
@@ -48,6 +50,12 @@
48
50
  --w6w-health-down: var(--w6w-danger);
49
51
  --w6w-health-unknown: #5f6875;
50
52
  --w6w-icon-swatch: #f0f2f6;
53
+ --w6w-loop-1: #2f6fdf;
54
+ --w6w-loop-2: #7c4ddb;
55
+ --w6w-loop-3: #b7791f;
56
+ --w6w-loop-4: #0e8fa8;
57
+ --w6w-loop-5: #b0399f;
58
+ --w6w-loop-6: #4f4fc7;
51
59
  --w6w-code-comment: #6b7280;
52
60
  --w6w-code-keyword: #8250df;
53
61
  --w6w-code-string: #0a7b34;
@@ -77,6 +85,12 @@
77
85
  --w6w-health-down: var(--w6w-danger);
78
86
  --w6w-health-unknown: #9aa3b2;
79
87
  --w6w-icon-swatch: #1f232c;
88
+ --w6w-loop-1: #5b9bff;
89
+ --w6w-loop-2: #a98bff;
90
+ --w6w-loop-3: #f0b13a;
91
+ --w6w-loop-4: #3cc6e0;
92
+ --w6w-loop-5: #e47ad6;
93
+ --w6w-loop-6: #8a8aff;
80
94
  --w6w-scheme: dark;
81
95
  --w6w-code-comment: #7d8797;
82
96
  --w6w-code-keyword: #d2a8ff;
@@ -105,6 +119,12 @@
105
119
  --w6w-health-down: var(--w6w-danger);
106
120
  --w6w-health-unknown: #5f6875;
107
121
  --w6w-icon-swatch: #f0f2f6;
122
+ --w6w-loop-1: #2f6fdf;
123
+ --w6w-loop-2: #7c4ddb;
124
+ --w6w-loop-3: #b7791f;
125
+ --w6w-loop-4: #0e8fa8;
126
+ --w6w-loop-5: #b0399f;
127
+ --w6w-loop-6: #4f4fc7;
108
128
  --w6w-code-comment: #6b7280;
109
129
  --w6w-code-keyword: #8250df;
110
130
  --w6w-code-string: #0a7b34;
@@ -130,6 +150,12 @@
130
150
  --w6w-health-down: var(--w6w-danger);
131
151
  --w6w-health-unknown: #9aa3b2;
132
152
  --w6w-icon-swatch: #1f232c;
153
+ --w6w-loop-1: #5b9bff;
154
+ --w6w-loop-2: #a98bff;
155
+ --w6w-loop-3: #f0b13a;
156
+ --w6w-loop-4: #3cc6e0;
157
+ --w6w-loop-5: #e47ad6;
158
+ --w6w-loop-6: #8a8aff;
133
159
  --w6w-code-comment: #7d8797;
134
160
  --w6w-code-keyword: #d2a8ff;
135
161
  --w6w-code-string: #7ee787;
@@ -405,6 +431,32 @@
405
431
  min-width: 0;
406
432
  }
407
433
 
434
+ /* ── Hover modifier: ResultViewer — the button overlays the top-right corner of
435
+ ANY child and is revealed on hover/focus; always shown where there is no hover. */
436
+ .w6w-copyable--hover {
437
+ position: relative;
438
+ align-items: flex-start;
439
+ }
440
+
441
+ .w6w-copyable--hover > .w6w-copyable-btn {
442
+ position: absolute;
443
+ top: var(--w6w-sp-1);
444
+ right: var(--w6w-sp-1);
445
+ background: var(--w6w-panel);
446
+ border-color: var(--w6w-border);
447
+ opacity: 0;
448
+ }
449
+
450
+ .w6w-copyable--hover:hover > .w6w-copyable-btn,
451
+ .w6w-copyable--hover:focus-within > .w6w-copyable-btn {
452
+ opacity: 1;
453
+ }
454
+
455
+ @media (hover: none) {
456
+ .w6w-copyable--hover > .w6w-copyable-btn {
457
+ opacity: 1;
458
+ }
459
+ }
408
460
  .w6w-code-block {
409
461
  background: var(--w6w-panel-2);
410
462
  border: 1px solid var(--w6w-border);
@@ -528,15 +580,17 @@
528
580
  /* The expanded form of a clipped value (`resolved-clip.ts`). A block with its
529
581
  own scroll, so "Show all" can never restore the unbounded inline paste that
530
582
  buried the other params and the run's result. */
583
+ .w6w-resolved-copy {
584
+ margin: var(--w6w-sp-1) 0;
585
+ }
586
+
531
587
  .w6w-resolved-text-full {
532
588
  display: block;
533
- margin: var(--w6w-sp-1) 0;
589
+ margin: 0;
534
590
  max-height: 14em;
535
591
  overflow: auto;
536
- padding: var(--w6w-sp-2);
537
- background: var(--w6w-panel-2);
538
- border: 1px solid var(--w6w-border);
539
- border-radius: var(--w6w-radius);
592
+ padding: 0;
593
+ padding-right: var(--w6w-sp-10);
540
594
  font-family: var(--w6w-font-mono);
541
595
  font-size: 0.85em; /* lint-tokens-allow: matches the sibling code-typography rules above in this same file */
542
596
  line-height: var(--w6w-lh-normal);
@@ -268,6 +268,41 @@
268
268
  .w6w-note-menu-item:hover {
269
269
  background: var(--w6w-panel-2);
270
270
  }
271
+ // The canvas right-click menu (CanvasContextMenu): the note menu's panel and items,
272
+ // placed at the pointer instead of under a toolbar button.
273
+ .w6w-canvas-menu {
274
+ top: auto;
275
+ z-index: 10;
276
+ flex-direction: column;
277
+ min-width: 170px;
278
+ .w6w-note-menu-item {
279
+ font-weight: var(--w6w-fw-medium);
280
+ }
281
+ .w6w-note-menu-item:focus-visible {
282
+ outline: none;
283
+ background: var(--w6w-panel-2);
284
+ }
285
+ .w6w-note-menu-item.danger {
286
+ color: var(--w6w-danger);
287
+ }
288
+ .w6w-note-menu-item.separated {
289
+ position: relative;
290
+ margin-top: var(--w6w-sp-2);
291
+ }
292
+ .w6w-note-menu-item.separated::before {
293
+ content: "";
294
+ position: absolute;
295
+ top: calc(-1 * var(--w6w-sp-1) - 0.5px);
296
+ right: 0;
297
+ left: 0;
298
+ border-top: 1px solid var(--w6w-border);
299
+ }
300
+ .w6w-note-menu-item[aria-disabled="true"] {
301
+ opacity: 0.45;
302
+ cursor: default;
303
+ background: transparent;
304
+ }
305
+ }
271
306
  .w6w-note-size-1 {
272
307
  font-size: var(--w6w-fs-xl);
273
308
  }
@@ -0,0 +1,35 @@
1
+ /* Every CodeMirror code view (`JsonEditor`, `CodeEditor`, `YamlEditor`) FILLS
2
+ its bordered box. The border is on `.cm-editor`, which react-codemirror
3
+ sizes with the `height` / `minHeight` / `maxHeight` props and whose
4
+ `.cm-scroller` it gives `height: 100%`. With only a min/max height (the Data
5
+ page's Document modal) that percentage has nothing definite to resolve
6
+ against, so the scroller — and the gutter column inside it — stopped at the
7
+ last content line, the horizontal scrollbar sat right under it, and the rest
8
+ of the box was empty.
9
+
10
+ The react-codemirror root (the wrapper's first child) is a one-cell grid.
11
+ A grid area is definite once its track is sized, so `.cm-editor`, stretched
12
+ into it, has a definite height whether that came from `height`, from
13
+ `minHeight` or from the content (capped by `maxHeight`), and the scroller and
14
+ the gutters fill it. `minmax(0, 1fr)` keeps a long line from widening the
15
+ editor: the scroller scrolls it instead. The wrapper is a flex column so a
16
+ wrapper given a definite height (a flex item with `min-height: 0`, as in
17
+ `_step-config.scss`) hands that height down to the editor.
18
+
19
+ Everything sits under `:where()` (specificity 0 for the wrapper part), so a
20
+ call site's own layout for the same elements — `_expression-modal.scss`'s
21
+ JSON pane, a host's dialog — still wins. */
22
+ :where(.w6w-json-editor, .w6w-code-editor, .w6w-yaml-editor) {
23
+ display: flex;
24
+ flex-direction: column;
25
+ }
26
+ :where(.w6w-json-editor, .w6w-code-editor, .w6w-yaml-editor) > :first-child {
27
+ display: grid;
28
+ grid-template-columns: minmax(0, 1fr);
29
+ flex: 1 1 auto;
30
+ min-height: 0;
31
+ }
32
+ :where(.w6w-json-editor, .w6w-code-editor, .w6w-yaml-editor) .cm-scroller,
33
+ :where(.w6w-json-editor, .w6w-code-editor, .w6w-yaml-editor) .cm-gutters {
34
+ min-height: 100%;
35
+ }
@@ -108,15 +108,16 @@
108
108
  /* The expanded form of a clipped value (`resolved-clip.ts`). A block with its
109
109
  own scroll, so "Show all" can never restore the unbounded inline paste that
110
110
  buried the other params and the run's result. */
111
+ .w6w-resolved-copy {
112
+ margin: var(--w6w-sp-1) 0;
113
+ }
111
114
  .w6w-resolved-text-full {
112
115
  display: block;
113
- margin: var(--w6w-sp-1) 0;
116
+ margin: 0;
114
117
  max-height: 14em;
115
118
  overflow: auto;
116
- padding: var(--w6w-sp-2);
117
- background: var(--w6w-panel-2);
118
- border: 1px solid var(--w6w-border);
119
- border-radius: var(--w6w-radius);
119
+ padding: 0;
120
+ padding-right: var(--w6w-sp-10);
120
121
  font-family: var(--w6w-font-mono);
121
122
  font-size: 0.85em; /* lint-tokens-allow: matches the sibling code-typography rules above in this same file */
122
123
  line-height: var(--w6w-lh-normal);
@@ -86,3 +86,67 @@
86
86
  .w6w-connection-id-copy:focus-within .w6w-copyable-btn {
87
87
  opacity: 1;
88
88
  }
89
+
90
+ /* Identify workflow connections and their consuming canvas nodes. */
91
+ .w6w-connection-app-heading {
92
+ display: flex;
93
+ align-items: center;
94
+ gap: var(--w6w-sp-2);
95
+ }
96
+ .w6w-connection-node-list {
97
+ display: flex;
98
+ flex-direction: column;
99
+ gap: var(--w6w-sp-2);
100
+ list-style: none;
101
+ margin: 0;
102
+ padding: 0;
103
+ }
104
+ .w6w-connection-node-list .w6w-btn {
105
+ display: flex;
106
+ align-items: center;
107
+ gap: var(--w6w-sp-2);
108
+ text-align: left;
109
+ width: 100%;
110
+ overflow-wrap: anywhere;
111
+ white-space: normal;
112
+ }
113
+
114
+ .w6w-connection-node-label {
115
+ display: flex;
116
+ flex-direction: column;
117
+ min-width: 0;
118
+ }
119
+
120
+ .w6w-workflow-connections-heading {
121
+ display: flex;
122
+ align-items: center;
123
+ justify-content: space-between;
124
+ gap: var(--w6w-sp-2);
125
+ }
126
+ .w6w-workflow-connections-heading h3 { margin: 0; font-size: inherit; }
127
+ .w6w-workflow-connection {
128
+ display: flex;
129
+ flex-direction: column;
130
+ gap: var(--w6w-sp-2);
131
+ padding-bottom: var(--w6w-sp-3);
132
+ border-bottom: 1px solid var(--w6w-border);
133
+ }
134
+ .w6w-connection-summary {
135
+ display: flex;
136
+ flex-direction: column;
137
+ flex: 1;
138
+ min-width: 0;
139
+ overflow-wrap: anywhere;
140
+ }
141
+ .w6w-connection-consumers summary { cursor: pointer; }
142
+ .w6w-connection-consumers[open] summary { margin-bottom: var(--w6w-sp-2); }
143
+ .w6w-connection-scope { display: flex; align-items: flex-start; gap: var(--w6w-sp-2); }
144
+ .w6w-connection-remove { border-top: 1px solid var(--w6w-border); padding-top: var(--w6w-sp-3); }
145
+
146
+ .w6w-connection-node-kind {
147
+ display: inline-flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ flex-shrink: 0;
151
+ color: var(--w6w-accent);
152
+ }
@@ -145,3 +145,27 @@
145
145
  flex: 1 1 auto;
146
146
  min-width: 0;
147
147
  }
148
+
149
+ /* ── Hover modifier: ResultViewer — the button overlays the top-right corner of
150
+ ANY child and is revealed on hover/focus; always shown where there is no hover. */
151
+ .w6w-copyable--hover {
152
+ position: relative;
153
+ align-items: flex-start;
154
+ }
155
+ .w6w-copyable--hover > .w6w-copyable-btn {
156
+ position: absolute;
157
+ top: var(--w6w-sp-1);
158
+ right: var(--w6w-sp-1);
159
+ background: var(--w6w-panel);
160
+ border-color: var(--w6w-border);
161
+ opacity: 0;
162
+ }
163
+ .w6w-copyable--hover:hover > .w6w-copyable-btn,
164
+ .w6w-copyable--hover:focus-within > .w6w-copyable-btn {
165
+ opacity: 1;
166
+ }
167
+ @media (hover: none) {
168
+ .w6w-copyable--hover > .w6w-copyable-btn {
169
+ opacity: 1;
170
+ }
171
+ }
@@ -0,0 +1,138 @@
1
+ /* Data stores (F-2): DataStoreList, ColumnsEditor, CsvPanel and the data-grid/entry rules ported from Studio's Data store detail page. */
2
+ .w6w-data-store-list {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: var(--w6w-sp-3);
6
+ }
7
+ .w6w-data-store-list-head {
8
+ display: flex;
9
+ justify-content: space-between;
10
+ align-items: flex-start;
11
+ gap: var(--w6w-sp-4);
12
+ }
13
+ .w6w-data-store-list-heading {
14
+ min-width: 0;
15
+ }
16
+ .w6w-data-store-list-actions {
17
+ display: flex;
18
+ gap: var(--w6w-sp-2);
19
+ flex-shrink: 0;
20
+ }
21
+ .w6w-data-columns-head {
22
+ display: flex;
23
+ justify-content: space-between;
24
+ align-items: center;
25
+ }
26
+ .w6w-data-columns-list {
27
+ list-style: none;
28
+ margin: 0;
29
+ padding: 0;
30
+ display: flex;
31
+ flex-direction: column;
32
+ gap: var(--w6w-sp-2);
33
+ }
34
+ .w6w-data-columns-row {
35
+ display: flex;
36
+ flex-wrap: wrap;
37
+ align-items: center;
38
+ gap: var(--w6w-sp-2);
39
+ }
40
+ .w6w-data-columns-required {
41
+ display: flex;
42
+ align-items: center;
43
+ gap: var(--w6w-sp-1);
44
+ }
45
+ .w6w-data-columns-error {
46
+ flex-basis: 100%;
47
+ }
48
+ .w6w-data-entries-toolbar {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: var(--w6w-sp-2);
52
+ margin: var(--w6w-sp-3) 0;
53
+ }
54
+ .w6w-data-entries-toolbar input[type="search"] {
55
+ flex: 1;
56
+ max-width: 20rem;
57
+ /* Same box as `.w6w-field` inputs — no host page styles a bare search input. */
58
+ background: var(--w6w-panel-2);
59
+ border: 1px solid var(--w6w-border);
60
+ border-radius: 8px;
61
+ padding: var(--w6w-sp-2) var(--w6w-sp-2-5);
62
+ color: var(--w6w-text);
63
+ font-size: var(--w6w-fs-sm);
64
+ font-family: inherit;
65
+ }
66
+ .w6w-data-entries-toolbar input[type="search"]:focus {
67
+ outline: none;
68
+ border-color: var(--w6w-accent);
69
+ }
70
+ /* Entries open a viewer. Keep the list quiet and bounded, even for long keys or JSON. */
71
+ .w6w-data-entry-list {
72
+ table-layout: fixed;
73
+ }
74
+ .w6w-data-entry-key,
75
+ .w6w-data-entry-preview {
76
+ display: block;
77
+ width: 100%;
78
+ overflow: hidden;
79
+ white-space: nowrap;
80
+ text-overflow: ellipsis;
81
+ }
82
+ .w6w-data-entry-key {
83
+ appearance: none;
84
+ border: 0;
85
+ border-radius: 0;
86
+ background: transparent;
87
+ padding: 0;
88
+ color: inherit;
89
+ font: inherit;
90
+ text-align: left;
91
+ cursor: pointer;
92
+ }
93
+ .w6w-data-entry-key:focus-visible {
94
+ outline: 2px solid var(--w6w-accent);
95
+ outline-offset: 2px;
96
+ }
97
+ .w6w-data-entry-delete {
98
+ margin-inline-end: auto;
99
+ }
100
+ /* The wide-table pane: the sheet scrolls INSIDE this box, so a 24-column
101
+ table never widens its container and the page itself never overflows. */
102
+ .w6w-data-grid-scroll {
103
+ overflow-x: auto;
104
+ max-width: 100%;
105
+ }
106
+ .w6w-data-grid-scroll input {
107
+ min-width: var(--w6w-sp-16);
108
+ }
109
+ .w6w-data-cell {
110
+ display: flex;
111
+ flex-direction: column;
112
+ gap: var(--w6w-sp-1);
113
+ }
114
+ .w6w-data-cell-error {
115
+ color: var(--w6w-danger);
116
+ font-size: var(--w6w-fs-xs);
117
+ }
118
+ .w6w-data-row-actions {
119
+ display: flex;
120
+ align-items: center;
121
+ gap: var(--w6w-sp-2);
122
+ }
123
+ .w6w-data-entry-editor {
124
+ margin-top: var(--w6w-sp-4);
125
+ }
126
+ .w6w-data-entry-editor-actions {
127
+ display: flex;
128
+ gap: var(--w6w-sp-2);
129
+ margin-top: var(--w6w-sp-3);
130
+ }
131
+ .w6w-data-csv-panel {
132
+ margin-bottom: var(--w6w-sp-4);
133
+ }
134
+ .w6w-data-csv-panel-actions {
135
+ display: flex;
136
+ align-items: center;
137
+ gap: var(--w6w-sp-3);
138
+ }
@@ -1,12 +1,12 @@
1
1
  .w6w-datavar-row {
2
2
  display: grid;
3
- grid-template-columns: 1fr 110px 1fr auto;
3
+ // A long expression must not widen its track and shift the other columns in that row.
4
+ grid-template-columns: minmax(0, 1fr) 110px minmax(0, 1fr) auto;
4
5
  gap: var(--w6w-sp-1-5);
5
- /* Align to the end so that on an `expression` row — where the value cell is a
6
- taller ExpressionInput (toolbar above its editor) — the key/type/remove
7
- cells line up with the editor at the bottom, not the toolbar. Single-line
8
- rows are unaffected (every cell is the same height). */
9
- align-items: end;
6
+ align-items: stretch;
7
+ }
8
+ .w6w-datavar-row > * {
9
+ min-width: 0;
10
10
  }
11
11
  .w6w-datavar-row input,
12
12
  .w6w-datavar-row select {
@@ -36,3 +36,14 @@
36
36
  .w6w-datavar-row .w6w-btn {
37
37
  padding: var(--w6w-sp-1-5) var(--w6w-sp-2-5);
38
38
  }
39
+ .w6w-datavar-modes {
40
+ margin-left: auto;
41
+ }
42
+ .w6w-datavar-modes .active {
43
+ background: var(--w6w-panel-2);
44
+ border-color: var(--w6w-accent);
45
+ color: var(--w6w-accent);
46
+ }
47
+ .w6w-datavar-error {
48
+ color: var(--w6w-danger);
49
+ }
@@ -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
+ }