@w6w/ui 0.0.0-stage → 0.1.0

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 (143) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/LICENSE +21 -0
  3. package/README.md +260 -2
  4. package/dist/ActionTestForm.d.ts +76 -0
  5. package/dist/AddConnectionModal.d.ts +24 -0
  6. package/dist/AppPicker.d.ts +83 -0
  7. package/dist/CodeBlock-CZu4TFSi.cjs +15 -0
  8. package/dist/CodeBlock-CZu4TFSi.cjs.map +1 -0
  9. package/dist/CodeBlock-Dot3Pd7P.js +2889 -0
  10. package/dist/CodeBlock-Dot3Pd7P.js.map +1 -0
  11. package/dist/CodeBlock.d.ts +65 -0
  12. package/dist/CodeEditor.d.ts +42 -0
  13. package/dist/ConfirmModal-DJPYXE9t.cjs +11 -0
  14. package/dist/ConfirmModal-DJPYXE9t.cjs.map +1 -0
  15. package/dist/ConfirmModal-sY1tzkBO.js +6335 -0
  16. package/dist/ConfirmModal-sY1tzkBO.js.map +1 -0
  17. package/dist/Copyable-1niV9gUa.js +771 -0
  18. package/dist/Copyable-1niV9gUa.js.map +1 -0
  19. package/dist/Copyable-CYZU1o4X.cjs +2 -0
  20. package/dist/Copyable-CYZU1o4X.cjs.map +1 -0
  21. package/dist/JsonEditor.d.ts +60 -0
  22. package/dist/NodeConfigForm.d.ts +70 -0
  23. package/dist/ParamsForm.d.ts +56 -0
  24. package/dist/PropertyEntryForm.d.ts +56 -0
  25. package/dist/RetryPolicyFields.d.ts +18 -0
  26. package/dist/StepBuilderModal.d.ts +375 -0
  27. package/dist/TriggerFillForm.d.ts +52 -0
  28. package/dist/WaitEditor.d.ts +6 -0
  29. package/dist/WorkflowFlowEditor.d.ts +119 -0
  30. package/dist/YamlEditor.d.ts +46 -0
  31. package/dist/app-categories.d.ts +38 -0
  32. package/dist/app-pages.d.ts +111 -0
  33. package/dist/code.cjs +2 -0
  34. package/dist/code.cjs.map +1 -0
  35. package/dist/code.d.ts +29 -0
  36. package/dist/code.mjs +7 -0
  37. package/dist/code.mjs.map +1 -0
  38. package/dist/components/ApiCallsPanel.d.ts +41 -0
  39. package/dist/components/AppIcon.d.ts +25 -0
  40. package/dist/components/AuthFieldsForm.d.ts +22 -0
  41. package/dist/components/Combobox.d.ts +24 -0
  42. package/dist/components/ConfirmModal.d.ts +33 -0
  43. package/dist/components/Copyable.d.ts +51 -0
  44. package/dist/components/CopyableText.d.ts +40 -0
  45. package/dist/components/DeleteButton.d.ts +16 -0
  46. package/dist/components/EditButton.d.ts +10 -0
  47. package/dist/components/ExecutionDetail.d.ts +70 -0
  48. package/dist/components/ExecutionFilters.d.ts +59 -0
  49. package/dist/components/ExecutionList.d.ts +60 -0
  50. package/dist/components/ExecutionLogPanel.d.ts +98 -0
  51. package/dist/components/ExecutionStats.d.ts +47 -0
  52. package/dist/components/ExpressionEditorModal.d.ts +42 -0
  53. package/dist/components/ExpressionInput.d.ts +36 -0
  54. package/dist/components/ExpressionOptions.d.ts +185 -0
  55. package/dist/components/HealthStatusPill.d.ts +25 -0
  56. package/dist/components/HistoryTimeline.d.ts +56 -0
  57. package/dist/components/Icon.d.ts +34 -0
  58. package/dist/components/IconButton.d.ts +60 -0
  59. package/dist/components/InfoTip.d.ts +15 -0
  60. package/dist/components/InternalIcon.d.ts +19 -0
  61. package/dist/components/ListItem.d.ts +25 -0
  62. package/dist/components/Modal.d.ts +29 -0
  63. package/dist/components/RepoSyncIndicator.d.ts +29 -0
  64. package/dist/components/ResolvedParams.d.ts +31 -0
  65. package/dist/components/ServerResources.d.ts +47 -0
  66. package/dist/components/StepStatusPill.d.ts +51 -0
  67. package/dist/components/UptimeStrip.d.ts +56 -0
  68. package/dist/components/execution-format.d.ts +24 -0
  69. package/dist/components/expression-dom.d.ts +154 -0
  70. package/dist/components/expression-template.d.ts +86 -0
  71. package/dist/components/history-scale.d.ts +33 -0
  72. package/dist/components/icons.d.ts +41 -0
  73. package/dist/components/resolved-clip.d.ts +42 -0
  74. package/dist/components/server-resources-format.d.ts +68 -0
  75. package/dist/components/server-resources.fixture.d.ts +9 -0
  76. package/dist/components/use-copy.d.ts +14 -0
  77. package/dist/createW6WApi.d.ts +31 -0
  78. package/dist/flow-connect.d.ts +138 -0
  79. package/dist/flow-fanout.d.ts +15 -0
  80. package/dist/flow-types.d.ts +356 -0
  81. package/dist/flow-utils.d.ts +284 -0
  82. package/dist/flow.cjs +3 -0
  83. package/dist/flow.cjs.map +1 -0
  84. package/dist/flow.d.ts +22 -0
  85. package/dist/flow.mjs +1977 -0
  86. package/dist/flow.mjs.map +1 -0
  87. package/dist/index.cjs +2 -0
  88. package/dist/index.cjs.map +1 -0
  89. package/dist/index.d.ts +94 -0
  90. package/dist/index.mjs +1811 -0
  91. package/dist/index.mjs.map +1 -0
  92. package/dist/oauth-popup.d.ts +17 -0
  93. package/dist/output-shape.d.ts +58 -0
  94. package/dist/provider.d.ts +420 -0
  95. package/dist/resolve-params.d.ts +112 -0
  96. package/dist/resolved-json.d.ts +21 -0
  97. package/dist/run-visuals.d.ts +90 -0
  98. package/dist/step-preview-state.d.ts +143 -0
  99. package/dist/theme.d.ts +32 -0
  100. package/dist/trigger-fields.d.ts +56 -0
  101. package/dist/types.d.ts +413 -0
  102. package/dist/ui.css +1 -0
  103. package/dist/use-app-action-defs.d.ts +7 -0
  104. package/dist/use-enter-submit.d.ts +23 -0
  105. package/dist/use-seed-sources.d.ts +16 -0
  106. package/package.json +111 -3
  107. package/src/code.css +542 -0
  108. package/src/styles/_buttons.scss +38 -0
  109. package/src/styles/_chips.scss +210 -0
  110. package/src/styles/_code.scss +139 -0
  111. package/src/styles/_copyable.scss +147 -0
  112. package/src/styles/_data-vars.scss +38 -0
  113. package/src/styles/_execution-history.scss +282 -0
  114. package/src/styles/_execution-log.scss +178 -0
  115. package/src/styles/_expression-field.scss +65 -0
  116. package/src/styles/_expression-inline.scss +63 -0
  117. package/src/styles/_expression-modal.scss +292 -0
  118. package/src/styles/_fields.scss +161 -0
  119. package/src/styles/_flow.scss +217 -0
  120. package/src/styles/_fx.scss +158 -0
  121. package/src/styles/_health.scss +46 -0
  122. package/src/styles/_history-timeline.scss +156 -0
  123. package/src/styles/_icon-button.scss +22 -0
  124. package/src/styles/_icon.scss +15 -0
  125. package/src/styles/_icons.scss +31 -0
  126. package/src/styles/_incoming-state.scss +46 -0
  127. package/src/styles/_info-tip.scss +9 -0
  128. package/src/styles/_layout.scss +6 -0
  129. package/src/styles/_lists.scss +64 -0
  130. package/src/styles/_modal.scss +125 -0
  131. package/src/styles/_multiselect.scss +69 -0
  132. package/src/styles/_repo-sync-indicator.scss +99 -0
  133. package/src/styles/_scale.scss +70 -0
  134. package/src/styles/_sections.scss +36 -0
  135. package/src/styles/_server-resources.scss +163 -0
  136. package/src/styles/_step-builder.scss +376 -0
  137. package/src/styles/_step-config.scss +195 -0
  138. package/src/styles/_tabs.scss +54 -0
  139. package/src/styles/_tester.scss +111 -0
  140. package/src/styles/_tokens.scss +141 -0
  141. package/src/styles/_uptime.scss +61 -0
  142. package/src/styles.css +4208 -0
  143. package/src/styles.scss +61 -0
@@ -0,0 +1,282 @@
1
+ /* --- ExecutionList ------------------------------------------------------- */
2
+ /* Rows of past executions: a click-to-select list plus a prev/next pager.
3
+ Closer in shape to `.w6w-execution-log` (`_execution-log.scss`) than to
4
+ `.w6w-history-*`: that family lays out a time-proportional strip against a
5
+ shared axis, while this is a plain in-order list of one row per run. The row
6
+ itself is `ListItem` (`.w6w-list-item`, `_lists.scss`) — reused whole, box,
7
+ hover, focus ring, `active` highlight and all — so this partial only owns
8
+ the LIST around the rows: the `ul` reset and the pager strip.
9
+
10
+ Spacing/type come from the scale tokens only (the `lint:tokens` ratchet has
11
+ no baseline entry for this file, so anything literal here would be a new
12
+ violation); colour stays on `_execution-log.scss`'s pill and the shared
13
+ `.w6w-btn` classes. */
14
+
15
+ .w6w-execution-list {
16
+ display: flex;
17
+ flex-direction: column;
18
+ gap: var(--w6w-sp-3);
19
+ width: 100%;
20
+ min-width: 0;
21
+ }
22
+
23
+ /* A `<ul>`, reset to a bare vertical stack — the marker/indent are the only
24
+ things `_layout.scss`'s `.w6w-stack` doesn't already strip, and rows are
25
+ `<li>` so the list is announced as a list, not a run of cards. */
26
+ .w6w-execution-list-rows {
27
+ display: flex;
28
+ flex-direction: column;
29
+ gap: var(--w6w-sp-1);
30
+ list-style: none;
31
+ margin: 0;
32
+ padding: 0;
33
+ width: 100%;
34
+ min-width: 0;
35
+ }
36
+
37
+ .w6w-execution-list-rows > li {
38
+ min-width: 0;
39
+ }
40
+
41
+ /* Both non-list branches (the loading and the empty `<p>`) hang straight off
42
+ the root, so one direct-child rule covers them and neither needs a class the
43
+ pinned markup doesn't have. Same dashed box `.w6w-execution-log-empty`
44
+ uses — one treatment for "nothing here yet" across the run-log family. */
45
+ .w6w-execution-list > p {
46
+ width: 100%;
47
+ margin: 0;
48
+ padding: var(--w6w-sp-4);
49
+ border: 1px dashed var(--w6w-border);
50
+ border-radius: var(--w6w-radius);
51
+ color: var(--w6w-muted);
52
+ font-size: var(--w6w-fs-sm);
53
+ text-align: center;
54
+ }
55
+
56
+ .w6w-execution-list-pager {
57
+ display: flex;
58
+ align-items: center;
59
+ justify-content: flex-end;
60
+ gap: var(--w6w-sp-2);
61
+ }
62
+
63
+ /* --- ExecutionFilters --------------------------------------------------- */
64
+ /* One dense row of heterogeneous controls. The control chrome cannot come from
65
+ `_fields.scss`: those rules are anchored on `.w6w-field` (a labelled,
66
+ stacked field with a visible `<span>`), and these controls are labelled
67
+ accessibly (`aria-label`) instead — a visible label per control would triple
68
+ the bar's height. Tokens only, for the same reason as the rules above. */
69
+
70
+ /* The row is width-driven: a wrapped line is formed from each control's
71
+ *hypothetical* size, so six controls plus their gaps sit on one line for as
72
+ long as they fit, and the row breaks by itself once they don't. That is the
73
+ behaviour this bar needs — it renders full width in the studio History page
74
+ and ~500px wide inside the detail modal — so the break follows THIS box
75
+ rather than the viewport, and nothing here may key off a media query. */
76
+ .w6w-execution-filters {
77
+ display: flex;
78
+ flex-wrap: wrap;
79
+ align-items: center;
80
+ gap: var(--w6w-sp-2);
81
+ width: 100%;
82
+ min-width: 0;
83
+ }
84
+
85
+ /* These are bare form elements, so a host's own global `input`/`select` chrome
86
+ lands on them too — and in the studio it is decisive: `studio/src/styles.css`
87
+ gives `input[type="search"]`/`input[type="date"]` a `width: 100%` and a
88
+ `margin-top`. A `width: 100%` on a flex item whose `flex-basis` is `auto` IS
89
+ that item's basis, so each date picker asked for the whole bar and the row
90
+ broke into one control per line, while the margin lifted the two inputs off
91
+ the selects' line. Both are pinned back here; at (0,2,1) this selector beats
92
+ a host's bare `input[type=…]` (0,1,1) and `input` (0,0,1) rules without
93
+ needing `!important`, and a host that leaves the controls alone is unaffected
94
+ because `width: auto`/`margin: 0` are what these controls want anyway. */
95
+ .w6w-execution-filters input[type="search"],
96
+ .w6w-execution-filters input[type="date"],
97
+ .w6w-execution-filters select {
98
+ background: var(--w6w-panel-2);
99
+ border: 1px solid var(--w6w-border);
100
+ border-radius: var(--w6w-radius);
101
+ padding: var(--w6w-sp-2) var(--w6w-sp-2-5);
102
+ margin: 0;
103
+ width: auto;
104
+ color: var(--w6w-text);
105
+ font-size: var(--w6w-fs-sm);
106
+ font-family: inherit;
107
+ }
108
+
109
+ .w6w-execution-filters input[type="search"]:focus-visible,
110
+ .w6w-execution-filters input[type="date"]:focus-visible,
111
+ .w6w-execution-filters select:focus-visible {
112
+ outline: 2px solid var(--w6w-accent);
113
+ outline-offset: 1px;
114
+ }
115
+
116
+ /* The dropdowns and the two date pickers show one short, fixed label, so they
117
+ keep their intrinsic width and neither grow nor shrink: the row's spare width
118
+ is the search box's alone. */
119
+ .w6w-execution-filters select,
120
+ .w6w-execution-filters input[type="date"] {
121
+ flex: 0 0 auto;
122
+ }
123
+
124
+ /* The search box is the only control that flexes — it takes the spare width and
125
+ gives it back down to a 160px floor, and that floor is what sets the row's
126
+ breakpoint: 160px of search + the five intrinsic controls + five 8px gaps
127
+ ≈ 757px, so the bar is one row from the 760px the layout promises, and wraps
128
+ below it. */
129
+ .w6w-execution-filters-search {
130
+ flex: 1 1 160px;
131
+ min-width: 160px;
132
+ }
133
+
134
+ /* Clear is a fixed-size control and stays at the end of the row. */
135
+ .w6w-execution-filters-clear {
136
+ flex: 0 0 auto;
137
+ }
138
+
139
+ /* --- ExecutionStats ----------------------------------------------------- */
140
+ /* The `DashboardPage.tsx` `StatCard` shape (big value, muted label) promoted
141
+ out of the page and onto tokens — that page had the value's type ramp and
142
+ weight inline, which is exactly what a shared component must not leave to
143
+ its host. */
144
+
145
+ .w6w-execution-stats {
146
+ display: flex;
147
+ flex-direction: column;
148
+ gap: var(--w6w-sp-2);
149
+ width: 100%;
150
+ min-width: 0;
151
+ }
152
+
153
+ .w6w-execution-stats-label {
154
+ margin: 0;
155
+ color: var(--w6w-muted);
156
+ font-size: var(--w6w-fs-sm);
157
+ }
158
+
159
+ .w6w-execution-stats-cards {
160
+ display: flex;
161
+ flex-wrap: wrap;
162
+ gap: var(--w6w-sp-3);
163
+ }
164
+
165
+ .w6w-execution-stat {
166
+ display: flex;
167
+ flex-direction: column;
168
+ gap: var(--w6w-sp-0-5);
169
+ flex: 1 1 140px;
170
+ min-width: 0;
171
+ padding: var(--w6w-sp-3);
172
+ border: 1px solid var(--w6w-border);
173
+ border-radius: var(--w6w-radius);
174
+ background: var(--w6w-panel-2);
175
+ }
176
+
177
+ .w6w-execution-stat-value {
178
+ color: var(--w6w-text);
179
+ font-size: var(--w6w-fs-3xl);
180
+ font-weight: var(--w6w-fw-semibold);
181
+ line-height: var(--w6w-lh-tight);
182
+ }
183
+
184
+ .w6w-execution-stat-label {
185
+ color: var(--w6w-muted);
186
+ font-size: var(--w6w-fs-sm);
187
+ }
188
+
189
+ /* --- ExecutionDetail ---------------------------------------------------- */
190
+
191
+ .w6w-execution-detail {
192
+ width: 100%;
193
+ min-width: 0;
194
+ }
195
+
196
+ /* Title block left, controls right; the actions keep their width, the name
197
+ wraps or ellipses into whatever is left. */
198
+ .w6w-execution-detail-head {
199
+ display: flex;
200
+ align-items: flex-start;
201
+ justify-content: space-between;
202
+ gap: var(--w6w-sp-3);
203
+ }
204
+
205
+ .w6w-execution-detail-title {
206
+ display: flex;
207
+ flex-direction: column;
208
+ gap: var(--w6w-sp-0-5);
209
+ min-width: 0;
210
+ }
211
+
212
+ .w6w-execution-detail-name {
213
+ margin: 0;
214
+ color: var(--w6w-text);
215
+ font-size: var(--w6w-fs-lg);
216
+ font-weight: var(--w6w-fw-semibold);
217
+ overflow-wrap: anywhere;
218
+ }
219
+
220
+ .w6w-execution-detail-meta {
221
+ display: flex;
222
+ align-items: center;
223
+ gap: var(--w6w-sp-2);
224
+ }
225
+
226
+ .w6w-execution-detail-actions {
227
+ display: flex;
228
+ align-items: center;
229
+ gap: var(--w6w-sp-2);
230
+ flex-shrink: 0;
231
+ }
232
+
233
+ .w6w-execution-detail-id-line {
234
+ margin: 0;
235
+ }
236
+
237
+ .w6w-execution-detail-id {
238
+ font-family: var(--w6w-font-mono);
239
+ font-size: var(--w6w-fs-sm);
240
+ color: var(--w6w-muted);
241
+ overflow-wrap: anywhere;
242
+ }
243
+
244
+ /* A `<dl>` whose pairs are `<div>`s, so the three facts row up side by side
245
+ instead of stacking as three label/value paragraphs. */
246
+ .w6w-execution-detail-timing {
247
+ display: flex;
248
+ flex-wrap: wrap;
249
+ gap: var(--w6w-sp-5);
250
+ margin: 0;
251
+ }
252
+
253
+ .w6w-execution-detail-timing-item {
254
+ display: flex;
255
+ flex-direction: column;
256
+ gap: var(--w6w-sp-0-5);
257
+ min-width: 0;
258
+ }
259
+
260
+ .w6w-execution-detail-timing-item dt {
261
+ color: var(--w6w-muted);
262
+ font-size: var(--w6w-fs-xs);
263
+ }
264
+
265
+ .w6w-execution-detail-timing-item dd {
266
+ margin: 0;
267
+ color: var(--w6w-text);
268
+ font-size: var(--w6w-fs-sm);
269
+ }
270
+
271
+ /* The view-level failure notice: the same danger token `.w6w-btn-danger` and
272
+ the health pills use, tinted rather than filled so it reads as a notice and
273
+ not as a button. */
274
+ .w6w-execution-detail-error-message {
275
+ margin: 0;
276
+ padding: var(--w6w-sp-2) var(--w6w-sp-3);
277
+ border: 1px solid var(--w6w-danger);
278
+ border-radius: var(--w6w-radius);
279
+ background: color-mix(in srgb, var(--w6w-danger) 10%, transparent);
280
+ color: var(--w6w-danger);
281
+ font-size: var(--w6w-fs-sm);
282
+ }
@@ -0,0 +1,178 @@
1
+ /* --- StepStatusPill ---------------------------------------------------- */
2
+ /* Mirrors `.w6w-health-pill` shape for shape (see `_health.scss`), with its
3
+ own five-state colour set behind `--w6w-step-color` — never a new global
4
+ `--w6w-*` token, only the base palette (`--w6w-muted`/`--w6w-accent`/
5
+ `--w6w-success`/`--w6w-danger`) this file is scoped to. */
6
+ .w6w-step-pill {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ gap: var(--w6w-sp-1-5);
10
+ padding: var(--w6w-sp-0-5) var(--w6w-sp-2) var(--w6w-sp-0-5) var(--w6w-sp-1-5);
11
+ border: 1px solid color-mix(in srgb, var(--w6w-step-color) 40%, var(--w6w-border));
12
+ border-radius: 999px;
13
+ background: color-mix(in srgb, var(--w6w-step-color) 12%, transparent);
14
+ color: var(--w6w-text);
15
+ font-size: var(--w6w-fs-xs);
16
+ line-height: var(--w6w-lh-normal);
17
+ white-space: nowrap;
18
+ --w6w-step-color: var(--w6w-muted);
19
+ }
20
+ .w6w-step-pill-pending {
21
+ --w6w-step-color: var(--w6w-muted);
22
+ }
23
+ .w6w-step-pill-running {
24
+ --w6w-step-color: var(--w6w-accent);
25
+ }
26
+ .w6w-step-pill-succeeded {
27
+ --w6w-step-color: var(--w6w-success);
28
+ }
29
+ .w6w-step-pill-failed {
30
+ --w6w-step-color: var(--w6w-danger);
31
+ }
32
+ /* Same base colour as `pending` — a dashed border, not a second colour, is
33
+ what keeps this distinct: colour alone is never the only signal, and this
34
+ pill already carries a different text label too. */
35
+ .w6w-step-pill-skipped {
36
+ --w6w-step-color: var(--w6w-muted);
37
+ border-style: dashed;
38
+ }
39
+ /* The two RUN states (`ExecutionStatus`), both deliberately in the same muted
40
+ family as `pending`/`skipped` above: neither is a verdict on the work —
41
+ `queued` hasn't started and `canceled` stopped before reaching one — so
42
+ neither earns `--w6w-success`/`--w6w-danger`/`--w6w-accent`, and this file
43
+ keeps its stated scope (the base palette only, never a new global token).
44
+ `canceled` takes `skipped`'s dashed border for the same reason that one
45
+ does; the two never co-occur in one list (one is a step state, the other a
46
+ run state), and the label carries the meaning regardless. */
47
+ .w6w-step-pill-queued {
48
+ --w6w-step-color: var(--w6w-muted);
49
+ }
50
+ .w6w-step-pill-canceled {
51
+ --w6w-step-color: var(--w6w-muted);
52
+ border-style: dashed;
53
+ }
54
+ .w6w-step-pill-dot {
55
+ flex-shrink: 0;
56
+ width: 8px;
57
+ height: 8px;
58
+ border-radius: 50%;
59
+ background: var(--w6w-step-color);
60
+ }
61
+ .w6w-step-pill-label {
62
+ overflow: hidden;
63
+ text-overflow: ellipsis;
64
+ }
65
+
66
+ /* --- ExecutionLogPanel --------------------------------------------------- */
67
+ /* A vertical ordered list, not `_history-timeline.scss`'s idiom: that
68
+ partial lays out a fixed WINDOW of time-proportional lanes (`left`/`width`
69
+ percentages against a shared axis) for a health-history strip, which has
70
+ no notion of "one row per step" or of steps that haven't happened yet.
71
+ This panel is a plain in-order list of a priori unbounded rows, closer in
72
+ shape to `.w6w-resolved-table`'s row list — reused here as `.w6w-stack`
73
+ (`_layout.scss`) for the two-block (input/output) stack inside a row,
74
+ rather than inventing a second vertical-list treatment.
75
+
76
+ Each row's own box (border/background/border-radius/padding) comes from
77
+ `.w6w-section` (`_sections.scss`), reused rather than duplicated here —
78
+ `ApiCallsPanel.tsx`'s collapsed-by-default `<details>` idiom, applied to
79
+ this panel's rows (REVIEW.md R-1). This file only adds the row-specific
80
+ layout `.w6w-section` doesn't know about: the flex line for the summary's
81
+ pill/label/timing. */
82
+
83
+ /* The optional header row (T1.1.1 A4) — rendered only when the host supplies
84
+ `onDismiss`, and in BOTH branches below, since the empty state is exactly
85
+ where a dismiss control is needed most. Right-aligned, mirroring where
86
+ studio's own `.notice-close` dismiss sits on a panel header; that class is
87
+ studio-scoped CSS and does not exist in this package, so only the placement
88
+ transfers, not the rule. */
89
+ .w6w-execution-log-head {
90
+ display: flex;
91
+ justify-content: flex-end;
92
+ align-items: center;
93
+ gap: var(--w6w-sp-2);
94
+ width: 100%;
95
+ margin-bottom: var(--w6w-sp-2);
96
+ }
97
+
98
+ .w6w-execution-log {
99
+ display: flex;
100
+ flex-direction: column;
101
+ gap: var(--w6w-sp-3);
102
+ list-style: none;
103
+ margin: 0;
104
+ padding: 0;
105
+ width: 100%;
106
+ }
107
+
108
+ /* `width: 100%` plus padding and a border overflows the parent under the
109
+ default content-box sizing; this package has no global box-sizing reset, so
110
+ it opts in per element (as `_chips.scss` and `_step-config.scss` do). */
111
+ .w6w-execution-log-empty {
112
+ box-sizing: border-box;
113
+ width: 100%;
114
+ padding: var(--w6w-sp-4);
115
+ border: 1px dashed var(--w6w-border);
116
+ border-radius: var(--w6w-radius);
117
+ text-align: center;
118
+ }
119
+
120
+ .w6w-execution-log-row {
121
+ min-width: 0;
122
+ }
123
+
124
+ .w6w-execution-log-row-header {
125
+ display: flex;
126
+ align-items: center;
127
+ gap: var(--w6w-sp-2);
128
+ flex-wrap: wrap;
129
+ }
130
+
131
+ .w6w-execution-log-row-label {
132
+ flex: 1 1 auto;
133
+ min-width: 0;
134
+ font-weight: var(--w6w-fw-medium);
135
+ overflow: hidden;
136
+ text-overflow: ellipsis;
137
+ white-space: nowrap;
138
+ }
139
+
140
+ /* Shrinkable, so a narrow row (the 360px docked panel) wraps the
141
+ "<ts> → <ts> (elapsed)" text inside the row's box. With `flex-shrink: 0` it
142
+ kept its max-content width, wrapped onto its own flex line, and ran past the
143
+ row's border. */
144
+ .w6w-execution-log-timing {
145
+ flex: 0 1 auto;
146
+ min-width: 0;
147
+ color: var(--w6w-muted);
148
+ font-size: var(--w6w-fs-xs);
149
+ }
150
+
151
+ .w6w-execution-log-json {
152
+ min-width: 0;
153
+ }
154
+
155
+ /* Error blocks (step `error`, run `runError`/`stepErrors`). The box itself is
156
+ `.w6w-result.w6w-error` (`_tester.scss`) — TriggerFillForm's StepError
157
+ visual, reused, not restyled here; these rules only place it. */
158
+ .w6w-execution-log-errors {
159
+ width: 100%;
160
+ margin-bottom: var(--w6w-sp-2);
161
+ }
162
+
163
+ /* A step's error sits after its `.w6w-section` box, inside the same `<li>` —
164
+ closer to its own row than the list's row gap, so it reads as that row's. */
165
+ .w6w-execution-log-row > .w6w-error {
166
+ margin-top: var(--w6w-sp-1-5);
167
+ }
168
+
169
+ /* TriggerFillForm's inline `opacity: 0.75; marginBottom: 4` code line, as tokens. */
170
+ .w6w-execution-log-error-code {
171
+ opacity: 0.75;
172
+ margin-bottom: var(--w6w-sp-1);
173
+ }
174
+
175
+ .w6w-execution-log-error-label {
176
+ display: block;
177
+ margin-bottom: var(--w6w-sp-1);
178
+ }
@@ -0,0 +1,65 @@
1
+ /* Expression input: a field whose contents are inline SEGMENTS — plain text
2
+ plus var/secret/expr chips, edited in place (contentEditable, like a Notion /
3
+ Zapier block field). A small toolbar carries the Insert menu + the {{ }} (fx)
4
+ mode toggle. Theme-aware via the shared tokens. */
5
+ .w6w-expr {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: var(--w6w-sp-1-5);
9
+ }
10
+ /* Inline expression field: ONE input-like box holding the editable surface plus
11
+ a ƒx button that reads as a trailing decoration INSIDE it — the same idiom as
12
+ `.w6w-multiselect` above and `.w6w-expr-sealed` below. The box lives here so
13
+ the standalone uses still render as a field (the `secret` param path and the
14
+ public ExpressionInput export). When this rides inside a `.w6w-fx-wrap`, that
15
+ wrapper is the box and this is flattened — see `.w6w-fx-wrap` below. */
16
+ .w6w-expr-field {
17
+ display: flex;
18
+ align-items: center;
19
+ gap: var(--w6w-sp-1);
20
+ background: var(--w6w-panel-2);
21
+ border: 1px solid var(--w6w-border);
22
+ border-radius: 8px;
23
+ padding: var(--w6w-sp-1) var(--w6w-sp-2);
24
+ min-height: 38px;
25
+ }
26
+ .w6w-expr-field:focus-within {
27
+ border-color: var(--w6w-accent);
28
+ }
29
+ .w6w-expr-field .w6w-expr-editor {
30
+ flex: 1;
31
+ min-width: 0;
32
+ }
33
+ /* The ƒx rides inside the box, so it draws no chrome of its own — only its
34
+ colour states remain. */
35
+ .w6w-expr-field .w6w-expr-edit {
36
+ border: none;
37
+ background: transparent;
38
+ }
39
+ .w6w-expr-edit {
40
+ flex-shrink: 0;
41
+ color: var(--w6w-muted);
42
+ font-family: var(--w6w-font-mono);
43
+ font-size: 13px;
44
+ line-height: 1;
45
+ padding: var(--w6w-sp-1) var(--w6w-sp-1-5);
46
+ cursor: pointer;
47
+ }
48
+ .w6w-expr-edit:hover {
49
+ color: var(--w6w-accent);
50
+ }
51
+ /* Sealed at-rest secret (masked chip + Replace). */
52
+ .w6w-expr-sealed {
53
+ display: flex;
54
+ align-items: center;
55
+ gap: var(--w6w-sp-1-5);
56
+ background: var(--w6w-panel-2);
57
+ border: 1px solid var(--w6w-border);
58
+ border-radius: 8px;
59
+ padding: 5px var(--w6w-sp-2);
60
+ min-height: 38px;
61
+ }
62
+ .w6w-expr-sealed.is-readonly {
63
+ opacity: 0.7;
64
+ }
65
+ /* Expression editor modal: left data sources | right (editor over preview). */
@@ -0,0 +1,63 @@
1
+ /* The raw {{ }} input stands alone, so it keeps an input box of its own. */
2
+ .w6w-expr-raw {
3
+ width: 100%;
4
+ background: var(--w6w-panel-2);
5
+ border: 1px solid var(--w6w-border);
6
+ border-radius: 8px;
7
+ padding: var(--w6w-sp-2) var(--w6w-sp-2-5);
8
+ min-height: 38px;
9
+ color: var(--w6w-text);
10
+ font-family: var(--w6w-font-mono);
11
+ font-size: 13px;
12
+ line-height: var(--w6w-lh-relaxed);
13
+ }
14
+ .w6w-expr-raw:focus {
15
+ outline: none;
16
+ border-color: var(--w6w-accent);
17
+ }
18
+ /* The inline editor surface (one continuous field) sits INSIDE
19
+ `.w6w-expr-field`'s box, so it draws no chrome — the border, the background
20
+ and the focus ring all belong to that box. */
21
+ .w6w-expr-editor {
22
+ width: 100%;
23
+ padding: var(--w6w-sp-0-5) 0;
24
+ color: var(--w6w-text);
25
+ font-size: var(--w6w-fs-sm);
26
+ font-family: inherit;
27
+ line-height: var(--w6w-lh-relaxed);
28
+ outline: none;
29
+ white-space: pre-wrap;
30
+ word-break: break-word;
31
+ }
32
+ .w6w-expr-editor.is-readonly,
33
+ .w6w-expr-input.is-readonly {
34
+ opacity: 0.7;
35
+ }
36
+ /* Placeholder for the empty contentEditable field. */
37
+ .w6w-expr-editor.is-empty::before {
38
+ content: attr(data-placeholder);
39
+ color: var(--w6w-muted);
40
+ pointer-events: none;
41
+ }
42
+ /* Masked (secret) fields: mask typed TEXT as dots; chips are exempt — a chip
43
+ shows a name/label, never a secret value. */
44
+ .w6w-expr-editor.is-masked {
45
+ -webkit-text-security: disc;
46
+ text-security: disc;
47
+ }
48
+ .w6w-expr-editor.is-masked .w6w-expr-chip {
49
+ -webkit-text-security: none;
50
+ text-security: none;
51
+ }
52
+ /* Sealed at-rest secret uses a simple flex wrapper (chip + Replace). */
53
+ .w6w-expr-input {
54
+ display: flex;
55
+ flex-wrap: wrap;
56
+ align-items: center;
57
+ gap: var(--w6w-sp-1-5);
58
+ background: var(--w6w-panel-2);
59
+ border: 1px solid var(--w6w-border);
60
+ border-radius: 8px;
61
+ padding: 5px var(--w6w-sp-2);
62
+ min-height: 38px;
63
+ }