@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.
- package/CHANGELOG.md +48 -0
- package/LICENSE +21 -0
- package/README.md +260 -2
- package/dist/ActionTestForm.d.ts +76 -0
- package/dist/AddConnectionModal.d.ts +24 -0
- package/dist/AppPicker.d.ts +83 -0
- package/dist/CodeBlock-CZu4TFSi.cjs +15 -0
- package/dist/CodeBlock-CZu4TFSi.cjs.map +1 -0
- package/dist/CodeBlock-Dot3Pd7P.js +2889 -0
- package/dist/CodeBlock-Dot3Pd7P.js.map +1 -0
- package/dist/CodeBlock.d.ts +65 -0
- package/dist/CodeEditor.d.ts +42 -0
- package/dist/ConfirmModal-DJPYXE9t.cjs +11 -0
- package/dist/ConfirmModal-DJPYXE9t.cjs.map +1 -0
- package/dist/ConfirmModal-sY1tzkBO.js +6335 -0
- package/dist/ConfirmModal-sY1tzkBO.js.map +1 -0
- package/dist/Copyable-1niV9gUa.js +771 -0
- package/dist/Copyable-1niV9gUa.js.map +1 -0
- package/dist/Copyable-CYZU1o4X.cjs +2 -0
- package/dist/Copyable-CYZU1o4X.cjs.map +1 -0
- package/dist/JsonEditor.d.ts +60 -0
- package/dist/NodeConfigForm.d.ts +70 -0
- package/dist/ParamsForm.d.ts +56 -0
- package/dist/PropertyEntryForm.d.ts +56 -0
- package/dist/RetryPolicyFields.d.ts +18 -0
- package/dist/StepBuilderModal.d.ts +375 -0
- package/dist/TriggerFillForm.d.ts +52 -0
- package/dist/WaitEditor.d.ts +6 -0
- package/dist/WorkflowFlowEditor.d.ts +119 -0
- package/dist/YamlEditor.d.ts +46 -0
- package/dist/app-categories.d.ts +38 -0
- package/dist/app-pages.d.ts +111 -0
- package/dist/code.cjs +2 -0
- package/dist/code.cjs.map +1 -0
- package/dist/code.d.ts +29 -0
- package/dist/code.mjs +7 -0
- package/dist/code.mjs.map +1 -0
- package/dist/components/ApiCallsPanel.d.ts +41 -0
- package/dist/components/AppIcon.d.ts +25 -0
- package/dist/components/AuthFieldsForm.d.ts +22 -0
- package/dist/components/Combobox.d.ts +24 -0
- package/dist/components/ConfirmModal.d.ts +33 -0
- package/dist/components/Copyable.d.ts +51 -0
- package/dist/components/CopyableText.d.ts +40 -0
- package/dist/components/DeleteButton.d.ts +16 -0
- package/dist/components/EditButton.d.ts +10 -0
- package/dist/components/ExecutionDetail.d.ts +70 -0
- package/dist/components/ExecutionFilters.d.ts +59 -0
- package/dist/components/ExecutionList.d.ts +60 -0
- package/dist/components/ExecutionLogPanel.d.ts +98 -0
- package/dist/components/ExecutionStats.d.ts +47 -0
- package/dist/components/ExpressionEditorModal.d.ts +42 -0
- package/dist/components/ExpressionInput.d.ts +36 -0
- package/dist/components/ExpressionOptions.d.ts +185 -0
- package/dist/components/HealthStatusPill.d.ts +25 -0
- package/dist/components/HistoryTimeline.d.ts +56 -0
- package/dist/components/Icon.d.ts +34 -0
- package/dist/components/IconButton.d.ts +60 -0
- package/dist/components/InfoTip.d.ts +15 -0
- package/dist/components/InternalIcon.d.ts +19 -0
- package/dist/components/ListItem.d.ts +25 -0
- package/dist/components/Modal.d.ts +29 -0
- package/dist/components/RepoSyncIndicator.d.ts +29 -0
- package/dist/components/ResolvedParams.d.ts +31 -0
- package/dist/components/ServerResources.d.ts +47 -0
- package/dist/components/StepStatusPill.d.ts +51 -0
- package/dist/components/UptimeStrip.d.ts +56 -0
- package/dist/components/execution-format.d.ts +24 -0
- package/dist/components/expression-dom.d.ts +154 -0
- package/dist/components/expression-template.d.ts +86 -0
- package/dist/components/history-scale.d.ts +33 -0
- package/dist/components/icons.d.ts +41 -0
- package/dist/components/resolved-clip.d.ts +42 -0
- package/dist/components/server-resources-format.d.ts +68 -0
- package/dist/components/server-resources.fixture.d.ts +9 -0
- package/dist/components/use-copy.d.ts +14 -0
- package/dist/createW6WApi.d.ts +31 -0
- package/dist/flow-connect.d.ts +138 -0
- package/dist/flow-fanout.d.ts +15 -0
- package/dist/flow-types.d.ts +356 -0
- package/dist/flow-utils.d.ts +284 -0
- package/dist/flow.cjs +3 -0
- package/dist/flow.cjs.map +1 -0
- package/dist/flow.d.ts +22 -0
- package/dist/flow.mjs +1977 -0
- package/dist/flow.mjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +94 -0
- package/dist/index.mjs +1811 -0
- package/dist/index.mjs.map +1 -0
- package/dist/oauth-popup.d.ts +17 -0
- package/dist/output-shape.d.ts +58 -0
- package/dist/provider.d.ts +420 -0
- package/dist/resolve-params.d.ts +112 -0
- package/dist/resolved-json.d.ts +21 -0
- package/dist/run-visuals.d.ts +90 -0
- package/dist/step-preview-state.d.ts +143 -0
- package/dist/theme.d.ts +32 -0
- package/dist/trigger-fields.d.ts +56 -0
- package/dist/types.d.ts +413 -0
- package/dist/ui.css +1 -0
- package/dist/use-app-action-defs.d.ts +7 -0
- package/dist/use-enter-submit.d.ts +23 -0
- package/dist/use-seed-sources.d.ts +16 -0
- package/package.json +111 -3
- package/src/code.css +542 -0
- package/src/styles/_buttons.scss +38 -0
- package/src/styles/_chips.scss +210 -0
- package/src/styles/_code.scss +139 -0
- package/src/styles/_copyable.scss +147 -0
- package/src/styles/_data-vars.scss +38 -0
- package/src/styles/_execution-history.scss +282 -0
- package/src/styles/_execution-log.scss +178 -0
- package/src/styles/_expression-field.scss +65 -0
- package/src/styles/_expression-inline.scss +63 -0
- package/src/styles/_expression-modal.scss +292 -0
- package/src/styles/_fields.scss +161 -0
- package/src/styles/_flow.scss +217 -0
- package/src/styles/_fx.scss +158 -0
- package/src/styles/_health.scss +46 -0
- package/src/styles/_history-timeline.scss +156 -0
- package/src/styles/_icon-button.scss +22 -0
- package/src/styles/_icon.scss +15 -0
- package/src/styles/_icons.scss +31 -0
- package/src/styles/_incoming-state.scss +46 -0
- package/src/styles/_info-tip.scss +9 -0
- package/src/styles/_layout.scss +6 -0
- package/src/styles/_lists.scss +64 -0
- package/src/styles/_modal.scss +125 -0
- package/src/styles/_multiselect.scss +69 -0
- package/src/styles/_repo-sync-indicator.scss +99 -0
- package/src/styles/_scale.scss +70 -0
- package/src/styles/_sections.scss +36 -0
- package/src/styles/_server-resources.scss +163 -0
- package/src/styles/_step-builder.scss +376 -0
- package/src/styles/_step-config.scss +195 -0
- package/src/styles/_tabs.scss +54 -0
- package/src/styles/_tester.scss +111 -0
- package/src/styles/_tokens.scss +141 -0
- package/src/styles/_uptime.scss +61 -0
- package/src/styles.css +4208 -0
- package/src/styles.scss +61 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/* Chips: a var/secret/expr segment. Distinct look per kind; sits inline in the
|
|
2
|
+
text flow. */
|
|
3
|
+
.w6w-expr-chip {
|
|
4
|
+
display: inline-flex;
|
|
5
|
+
align-items: center;
|
|
6
|
+
gap: var(--w6w-sp-1);
|
|
7
|
+
vertical-align: baseline;
|
|
8
|
+
box-sizing: border-box;
|
|
9
|
+
/* Never exceed the field's content box; the label truncates before the chip
|
|
10
|
+
can overrun the adjacent ƒx button. */
|
|
11
|
+
max-width: 100%;
|
|
12
|
+
border: 1px solid var(--w6w-border);
|
|
13
|
+
border-radius: 6px;
|
|
14
|
+
padding: 1px var(--w6w-sp-1-5);
|
|
15
|
+
margin: 0 3px;
|
|
16
|
+
font-size: 12.5px;
|
|
17
|
+
line-height: 1.4;
|
|
18
|
+
font-family: var(--w6w-font-mono);
|
|
19
|
+
color: var(--w6w-text);
|
|
20
|
+
background: var(--w6w-panel);
|
|
21
|
+
white-space: nowrap;
|
|
22
|
+
user-select: none;
|
|
23
|
+
}
|
|
24
|
+
.w6w-expr-chip-var {
|
|
25
|
+
border-color: var(--w6w-accent);
|
|
26
|
+
color: var(--w6w-accent);
|
|
27
|
+
background: color-mix(in srgb, var(--w6w-accent) 14%, transparent);
|
|
28
|
+
}
|
|
29
|
+
.w6w-expr-chip-secret {
|
|
30
|
+
border-color: var(--w6w-danger);
|
|
31
|
+
color: var(--w6w-danger);
|
|
32
|
+
background: color-mix(in srgb, var(--w6w-danger) 14%, transparent);
|
|
33
|
+
}
|
|
34
|
+
.w6w-expr-chip-expr {
|
|
35
|
+
border-style: dashed;
|
|
36
|
+
background: color-mix(in srgb, var(--w6w-text) 8%, transparent);
|
|
37
|
+
}
|
|
38
|
+
.w6w-expr-chip-render {
|
|
39
|
+
border-color: var(--w6w-success);
|
|
40
|
+
color: var(--w6w-success);
|
|
41
|
+
background: color-mix(in srgb, var(--w6w-success) 14%, transparent);
|
|
42
|
+
}
|
|
43
|
+
.w6w-expr-chip-sigil {
|
|
44
|
+
flex: none;
|
|
45
|
+
font-weight: var(--w6w-fw-semibold);
|
|
46
|
+
opacity: 0.8;
|
|
47
|
+
}
|
|
48
|
+
.w6w-expr-chip-label {
|
|
49
|
+
min-width: 0;
|
|
50
|
+
overflow: hidden;
|
|
51
|
+
text-overflow: ellipsis;
|
|
52
|
+
white-space: nowrap;
|
|
53
|
+
font-weight: var(--w6w-fw-medium);
|
|
54
|
+
}
|
|
55
|
+
.w6w-expr-chip-x {
|
|
56
|
+
display: inline-flex;
|
|
57
|
+
flex: none;
|
|
58
|
+
align-items: center;
|
|
59
|
+
justify-content: center;
|
|
60
|
+
width: 15px;
|
|
61
|
+
height: 15px;
|
|
62
|
+
border-radius: 4px;
|
|
63
|
+
background: transparent;
|
|
64
|
+
color: inherit;
|
|
65
|
+
opacity: 0.6;
|
|
66
|
+
font-size: var(--w6w-fs-sm);
|
|
67
|
+
line-height: 1;
|
|
68
|
+
cursor: pointer;
|
|
69
|
+
}
|
|
70
|
+
.w6w-expr-chip-x:hover {
|
|
71
|
+
opacity: 1;
|
|
72
|
+
background: var(--w6w-border);
|
|
73
|
+
}
|
|
74
|
+
/* The render affordance: flips a var/render chip in place (see `makeChip`). */
|
|
75
|
+
.w6w-expr-chip-toggle {
|
|
76
|
+
display: inline-flex;
|
|
77
|
+
flex: none;
|
|
78
|
+
align-items: center;
|
|
79
|
+
justify-content: center;
|
|
80
|
+
width: 15px;
|
|
81
|
+
height: 15px;
|
|
82
|
+
border-radius: 4px;
|
|
83
|
+
background: transparent;
|
|
84
|
+
color: inherit;
|
|
85
|
+
opacity: 0.6;
|
|
86
|
+
font-size: var(--w6w-fs-xs);
|
|
87
|
+
line-height: 1;
|
|
88
|
+
cursor: pointer;
|
|
89
|
+
}
|
|
90
|
+
.w6w-expr-chip-toggle:hover {
|
|
91
|
+
opacity: 1;
|
|
92
|
+
background: var(--w6w-border);
|
|
93
|
+
}
|
|
94
|
+
.w6w-expr-replace {
|
|
95
|
+
border: 1px solid var(--w6w-border);
|
|
96
|
+
border-radius: 6px;
|
|
97
|
+
background: transparent;
|
|
98
|
+
color: var(--w6w-muted);
|
|
99
|
+
font-size: var(--w6w-fs-xs);
|
|
100
|
+
font-family: inherit;
|
|
101
|
+
padding: 3px var(--w6w-sp-2);
|
|
102
|
+
cursor: pointer;
|
|
103
|
+
}
|
|
104
|
+
.w6w-expr-replace:hover {
|
|
105
|
+
color: var(--w6w-text);
|
|
106
|
+
background: var(--w6w-panel);
|
|
107
|
+
}
|
|
108
|
+
/* Insert affordance + popover menu (variable / secret / expression). */
|
|
109
|
+
.w6w-expr-insert {
|
|
110
|
+
position: relative;
|
|
111
|
+
display: inline-flex;
|
|
112
|
+
}
|
|
113
|
+
.w6w-expr-insert-btn {
|
|
114
|
+
border: 1px dashed var(--w6w-border);
|
|
115
|
+
border-radius: 6px;
|
|
116
|
+
background: transparent;
|
|
117
|
+
color: var(--w6w-muted);
|
|
118
|
+
font-size: var(--w6w-fs-xs);
|
|
119
|
+
font-family: inherit;
|
|
120
|
+
padding: 3px var(--w6w-sp-2);
|
|
121
|
+
cursor: pointer;
|
|
122
|
+
}
|
|
123
|
+
.w6w-expr-insert-btn:hover {
|
|
124
|
+
color: var(--w6w-text);
|
|
125
|
+
border-color: var(--w6w-accent);
|
|
126
|
+
}
|
|
127
|
+
.w6w-expr-menu {
|
|
128
|
+
position: absolute;
|
|
129
|
+
top: calc(100% + var(--w6w-sp-1));
|
|
130
|
+
left: 0;
|
|
131
|
+
z-index: 60;
|
|
132
|
+
display: flex;
|
|
133
|
+
flex-direction: column;
|
|
134
|
+
gap: var(--w6w-sp-2);
|
|
135
|
+
min-width: 200px;
|
|
136
|
+
background: var(--w6w-panel);
|
|
137
|
+
border: 1px solid var(--w6w-border);
|
|
138
|
+
border-radius: 8px;
|
|
139
|
+
padding: var(--w6w-sp-2);
|
|
140
|
+
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35);
|
|
141
|
+
}
|
|
142
|
+
.w6w-expr-menu-group {
|
|
143
|
+
display: flex;
|
|
144
|
+
flex-direction: column;
|
|
145
|
+
gap: var(--w6w-sp-1);
|
|
146
|
+
}
|
|
147
|
+
.w6w-expr-menu-group + .w6w-expr-menu-group {
|
|
148
|
+
border-top: 1px solid var(--w6w-border);
|
|
149
|
+
padding-top: var(--w6w-sp-2);
|
|
150
|
+
}
|
|
151
|
+
.w6w-expr-menu-label {
|
|
152
|
+
font-size: 0.72em;
|
|
153
|
+
font-weight: var(--w6w-fw-semibold);
|
|
154
|
+
letter-spacing: 0.04em;
|
|
155
|
+
text-transform: uppercase;
|
|
156
|
+
color: var(--w6w-muted);
|
|
157
|
+
}
|
|
158
|
+
/* A secret-typed field surfaces the Secrets group first + highlighted, so
|
|
159
|
+
picking a secret is the obvious one-click path (task 3.2). */
|
|
160
|
+
.w6w-expr-menu-group.is-primary {
|
|
161
|
+
background: var(--w6w-panel-2);
|
|
162
|
+
border-radius: 6px;
|
|
163
|
+
padding: var(--w6w-sp-1-5);
|
|
164
|
+
margin: -2px;
|
|
165
|
+
}
|
|
166
|
+
.w6w-expr-menu-group.is-primary .w6w-expr-menu-label {
|
|
167
|
+
color: var(--w6w-accent);
|
|
168
|
+
}
|
|
169
|
+
.w6w-expr-menu-empty {
|
|
170
|
+
font-size: var(--w6w-fs-xs);
|
|
171
|
+
color: var(--w6w-muted);
|
|
172
|
+
padding: var(--w6w-sp-0-5) var(--w6w-sp-2);
|
|
173
|
+
font-style: italic;
|
|
174
|
+
}
|
|
175
|
+
.w6w-expr-menu-item {
|
|
176
|
+
text-align: left;
|
|
177
|
+
background: transparent;
|
|
178
|
+
border: none;
|
|
179
|
+
border-radius: 6px;
|
|
180
|
+
padding: 5px var(--w6w-sp-2);
|
|
181
|
+
color: var(--w6w-text);
|
|
182
|
+
font-size: 13px;
|
|
183
|
+
font-family: inherit;
|
|
184
|
+
cursor: pointer;
|
|
185
|
+
}
|
|
186
|
+
.w6w-expr-menu-item:hover {
|
|
187
|
+
background: var(--w6w-panel-2);
|
|
188
|
+
}
|
|
189
|
+
.w6w-expr-menu-add {
|
|
190
|
+
display: flex;
|
|
191
|
+
gap: var(--w6w-sp-1-5);
|
|
192
|
+
align-items: center;
|
|
193
|
+
}
|
|
194
|
+
.w6w-expr-menu-add input {
|
|
195
|
+
flex: 1;
|
|
196
|
+
min-width: 0;
|
|
197
|
+
background: var(--w6w-panel-2);
|
|
198
|
+
border: 1px solid var(--w6w-border);
|
|
199
|
+
border-radius: 6px;
|
|
200
|
+
padding: 5px var(--w6w-sp-2);
|
|
201
|
+
color: var(--w6w-text);
|
|
202
|
+
font-size: 13px;
|
|
203
|
+
font-family: inherit;
|
|
204
|
+
}
|
|
205
|
+
.w6w-expr-menu-add input:focus {
|
|
206
|
+
outline: none;
|
|
207
|
+
border-color: var(--w6w-accent);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/* Typed key/value rows (the `vars` form element / `data` control step). */
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
.w6w-code-block {
|
|
2
|
+
background: var(--w6w-panel-2);
|
|
3
|
+
border: 1px solid var(--w6w-border);
|
|
4
|
+
border-radius: var(--w6w-radius);
|
|
5
|
+
margin: 0;
|
|
6
|
+
overflow-x: auto;
|
|
7
|
+
padding: var(--w6w-sp-3) 14px;
|
|
8
|
+
tab-size: 2;
|
|
9
|
+
}
|
|
10
|
+
.w6w-code-block code {
|
|
11
|
+
background: none;
|
|
12
|
+
display: block;
|
|
13
|
+
font-family: var(--w6w-font-mono);
|
|
14
|
+
font-size: 13px;
|
|
15
|
+
line-height: 1.55;
|
|
16
|
+
padding: 0;
|
|
17
|
+
}
|
|
18
|
+
/* Each line is its own row so a line number can sit beside the text rather
|
|
19
|
+
than inside it — a number inside the flow would be caught by a copy. */
|
|
20
|
+
.w6w-code-line {
|
|
21
|
+
display: flex;
|
|
22
|
+
gap: var(--w6w-sp-3);
|
|
23
|
+
white-space: pre;
|
|
24
|
+
}
|
|
25
|
+
.w6w-code-line-text {
|
|
26
|
+
white-space: inherit;
|
|
27
|
+
}
|
|
28
|
+
/* `user-select: none` keeps the gutter out of a mouse selection; `aria-hidden`
|
|
29
|
+
on the element keeps it out of the accessibility tree. Both are needed —
|
|
30
|
+
neither one alone stops a copy from picking up the digits. */
|
|
31
|
+
.w6w-code-line-no {
|
|
32
|
+
color: var(--w6w-muted);
|
|
33
|
+
flex: 0 0 auto;
|
|
34
|
+
min-width: 2ch;
|
|
35
|
+
opacity: 0.65;
|
|
36
|
+
text-align: right;
|
|
37
|
+
user-select: none;
|
|
38
|
+
}
|
|
39
|
+
/* Wrapped mode indents continuation rows to the text column so a wrapped line
|
|
40
|
+
still reads as one line. */
|
|
41
|
+
.w6w-code-block--wrap .w6w-code-line,
|
|
42
|
+
.w6w-code-block--wrap .w6w-code-line-text {
|
|
43
|
+
white-space: pre-wrap;
|
|
44
|
+
word-break: break-word;
|
|
45
|
+
}
|
|
46
|
+
.w6w-code-block--wrap {
|
|
47
|
+
overflow-x: hidden;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Resolved params (Test tab, read-only): inline badge weight — like
|
|
51
|
+
JsonParamField's "Invalid JSON" hint, not a full `.w6w-result.w6w-error`
|
|
52
|
+
block per param, since either can appear once per configured param. */
|
|
53
|
+
.w6w-param-unresolved {
|
|
54
|
+
color: var(--w6w-danger);
|
|
55
|
+
font-size: 0.85em;
|
|
56
|
+
font-style: italic;
|
|
57
|
+
}
|
|
58
|
+
.w6w-param-unevaluated {
|
|
59
|
+
color: var(--w6w-muted);
|
|
60
|
+
font-size: 0.85em;
|
|
61
|
+
font-style: italic;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* One resolved param: a table row, not a stacked form field — this list is
|
|
65
|
+
read-only display, never an editable `.w6w-field`, so it earns its own
|
|
66
|
+
compact key-left/value-right layout instead of a label-above-control block
|
|
67
|
+
(human report, 2026-09-01: key and value were indistinguishable and every
|
|
68
|
+
row burned a full stacked block of vertical space). ONE grid across the
|
|
69
|
+
whole list (`.w6w-resolved-table`), not one grid per row, so every row's
|
|
70
|
+
key column lines up with the one above and below it. */
|
|
71
|
+
.w6w-resolved-table {
|
|
72
|
+
display: grid;
|
|
73
|
+
grid-template-columns: auto 1fr;
|
|
74
|
+
align-items: baseline;
|
|
75
|
+
}
|
|
76
|
+
/* Each row is `display: contents` — it renders no box of its own, so its two
|
|
77
|
+
children (label, value) become direct items of the parent grid above,
|
|
78
|
+
sharing its column tracks instead of sizing their own. */
|
|
79
|
+
.w6w-resolved-row {
|
|
80
|
+
display: contents;
|
|
81
|
+
font-size: calc(var(--w6w-fs-sm) * 0.9);
|
|
82
|
+
}
|
|
83
|
+
/* No `column-gap` on the grid: a gap leaves a hole no cell's own border
|
|
84
|
+
crosses, breaking the row divider into two segments. The same visual
|
|
85
|
+
space between key and value comes from padding instead, which is part of
|
|
86
|
+
each cell's own box — the border-bottom stays one unbroken line. */
|
|
87
|
+
.w6w-resolved-row > * {
|
|
88
|
+
padding: var(--w6w-sp-1-5) 0;
|
|
89
|
+
border-bottom: 1px solid var(--w6w-border);
|
|
90
|
+
}
|
|
91
|
+
.w6w-resolved-row:last-child > * {
|
|
92
|
+
border-bottom: none;
|
|
93
|
+
}
|
|
94
|
+
.w6w-resolved-label {
|
|
95
|
+
padding-right: var(--w6w-sp-3);
|
|
96
|
+
color: var(--w6w-muted);
|
|
97
|
+
}
|
|
98
|
+
/* One resolved row's value. `anywhere` (not `break-word`) because these values
|
|
99
|
+
are markup and URLs as often as prose: a single unbroken 40kB attribute
|
|
100
|
+
string would otherwise force the whole modal to scroll sideways. Full-
|
|
101
|
+
strength text color (not `--w6w-muted`) so it reads as the actual content,
|
|
102
|
+
distinct from the label beside it. */
|
|
103
|
+
.w6w-resolved-value {
|
|
104
|
+
color: var(--w6w-text);
|
|
105
|
+
overflow-wrap: anywhere;
|
|
106
|
+
min-width: 0;
|
|
107
|
+
}
|
|
108
|
+
/* The expanded form of a clipped value (`resolved-clip.ts`). A block with its
|
|
109
|
+
own scroll, so "Show all" can never restore the unbounded inline paste that
|
|
110
|
+
buried the other params and the run's result. */
|
|
111
|
+
.w6w-resolved-text-full {
|
|
112
|
+
display: block;
|
|
113
|
+
margin: var(--w6w-sp-1) 0;
|
|
114
|
+
max-height: 14em;
|
|
115
|
+
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);
|
|
120
|
+
font-family: var(--w6w-font-mono);
|
|
121
|
+
font-size: 0.85em; /* lint-tokens-allow: matches the sibling code-typography rules above in this same file */
|
|
122
|
+
line-height: var(--w6w-lh-normal);
|
|
123
|
+
white-space: pre-wrap;
|
|
124
|
+
}
|
|
125
|
+
/* Link-weight toggle — this sits inside a value, so it must not read as a
|
|
126
|
+
second action competing with the modal's own buttons. */
|
|
127
|
+
.w6w-resolved-more {
|
|
128
|
+
background: none;
|
|
129
|
+
border: none;
|
|
130
|
+
padding: 0;
|
|
131
|
+
margin-left: var(--w6w-sp-2);
|
|
132
|
+
color: var(--w6w-accent);
|
|
133
|
+
font-size: 0.85em; /* lint-tokens-allow: matches the sibling code-typography rules above in this same file */
|
|
134
|
+
cursor: pointer;
|
|
135
|
+
white-space: nowrap;
|
|
136
|
+
}
|
|
137
|
+
.w6w-resolved-more:hover {
|
|
138
|
+
text-decoration: underline;
|
|
139
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/* Copyable — an in-box copy affordance decorating a value-displaying control
|
|
2
|
+
(an <input>, a <textarea>, or CodeBlock's <pre>). Mirrors `.w6w-fx-wrap`
|
|
3
|
+
(`_fx.scss:1-88`): the WRAPPER owns the box chrome and every child it holds
|
|
4
|
+
is flattened below, so the value and the copy affordance read as ONE box. */
|
|
5
|
+
.w6w-copyable {
|
|
6
|
+
display: flex;
|
|
7
|
+
align-items: center;
|
|
8
|
+
gap: var(--w6w-sp-1);
|
|
9
|
+
background: var(--w6w-panel-2);
|
|
10
|
+
border: 1px solid var(--w6w-border);
|
|
11
|
+
border-radius: 8px;
|
|
12
|
+
padding: var(--w6w-sp-1) var(--w6w-sp-2);
|
|
13
|
+
/* Box-family invariant: byte-identical to `.w6w-fx-wrap`'s at `_fx.scss:13` —
|
|
14
|
+
six rules across four partials share this value (`building-blocks.md` §3
|
|
15
|
+
row 7); a scale token here would drift the moment that family moves. */
|
|
16
|
+
min-height: 38px;
|
|
17
|
+
}
|
|
18
|
+
/* A textarea/pre is taller than the button, so the button rides at the top —
|
|
19
|
+
mirrors `.w6w-fx-wrap:has(> textarea)` (`_fx.scss:16-18`). */
|
|
20
|
+
.w6w-copyable:has(> textarea),
|
|
21
|
+
.w6w-copyable:has(> pre) {
|
|
22
|
+
align-items: flex-start;
|
|
23
|
+
}
|
|
24
|
+
/* Focus reads on the box now that the inner control has no border of its own. */
|
|
25
|
+
.w6w-copyable:focus-within {
|
|
26
|
+
border-color: var(--w6w-accent);
|
|
27
|
+
}
|
|
28
|
+
.w6w-copyable > input,
|
|
29
|
+
.w6w-copyable > textarea,
|
|
30
|
+
.w6w-copyable > pre {
|
|
31
|
+
flex: 1 1 auto;
|
|
32
|
+
min-width: 0;
|
|
33
|
+
}
|
|
34
|
+
/* The control inside the wrapper carries NO chrome of its own. Mirrors
|
|
35
|
+
`_fx.scss:36-88`'s selector list and property list WHOLESALE
|
|
36
|
+
(s/w6w-fx-wrap/w6w-copyable/g) — not re-derived, gated for parity by the
|
|
37
|
+
project's test plan. See that file for the measured leak evidence (7.0px
|
|
38
|
+
alignment / 2px / 29% height) each property below defends against; a host
|
|
39
|
+
page's unscoped `input[type="text"], … textarea { … }` rule (studio's own,
|
|
40
|
+
layered AFTER this stylesheet) is exactly what these declarations beat. */
|
|
41
|
+
.w6w-field .w6w-copyable input[type="text"],
|
|
42
|
+
.w6w-field .w6w-copyable input[type="password"],
|
|
43
|
+
.w6w-field .w6w-copyable input[type="number"],
|
|
44
|
+
.w6w-field .w6w-copyable select,
|
|
45
|
+
.w6w-field .w6w-copyable textarea,
|
|
46
|
+
.w6w-datavar-row .w6w-copyable input,
|
|
47
|
+
.w6w-datavar-row .w6w-copyable select,
|
|
48
|
+
.w6w-copyable input[type="text"],
|
|
49
|
+
.w6w-copyable input[type="password"],
|
|
50
|
+
.w6w-copyable input[type="number"],
|
|
51
|
+
.w6w-copyable select,
|
|
52
|
+
.w6w-copyable textarea {
|
|
53
|
+
border: none;
|
|
54
|
+
background: transparent;
|
|
55
|
+
border-radius: 0;
|
|
56
|
+
/* lint-tokens-allow: mirrors _fx.scss:36-88 byte-for-byte, required by the parity gate */
|
|
57
|
+
padding: 4px 2px;
|
|
58
|
+
outline: none;
|
|
59
|
+
margin: 0;
|
|
60
|
+
min-height: 0;
|
|
61
|
+
}
|
|
62
|
+
/* The wrapper never draws a box around a box (mirrors `_fx.scss:91-98`). */
|
|
63
|
+
.w6w-copyable .w6w-code-block {
|
|
64
|
+
border: none;
|
|
65
|
+
background: transparent;
|
|
66
|
+
padding: 0;
|
|
67
|
+
}
|
|
68
|
+
/* Button chrome extends `.w6w-icon-btn` (`_icons.scss:1-11`) in markup — this
|
|
69
|
+
class only pins the flex behaviour and the copied state, no re-authored
|
|
70
|
+
hover/active states. */
|
|
71
|
+
.w6w-copyable-btn {
|
|
72
|
+
flex: none;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* ── CodeBlock: the button OVERLAYS the box's top-right corner ──────────────
|
|
76
|
+
For an <input>/<textarea> the button is a flex sibling, which is right: the
|
|
77
|
+
value is one line and the control shrinks to leave room for it. A <pre> is
|
|
78
|
+
different — it is a block of many lines, and a flex sibling would carve a
|
|
79
|
+
permanent empty column out of the full height of it to seat one 28px button.
|
|
80
|
+
So here the button leaves the flow and sits over the corner instead.
|
|
81
|
+
|
|
82
|
+
Absolute against the WRAPPER, not the <pre>, on purpose: the <pre> is the
|
|
83
|
+
element that scrolls (`overflow-x: auto`, plus `overflow-y` when `maxHeight`
|
|
84
|
+
is set), so anchoring to it would slide the button out of view on a wide or
|
|
85
|
+
tall snippet. Anchored to the wrapper it stays pinned to the visible corner. */
|
|
86
|
+
.w6w-copyable:has(> pre) {
|
|
87
|
+
position: relative;
|
|
88
|
+
}
|
|
89
|
+
.w6w-copyable:has(> pre) > .w6w-copyable-btn {
|
|
90
|
+
position: absolute;
|
|
91
|
+
top: var(--w6w-sp-1);
|
|
92
|
+
right: var(--w6w-sp-1);
|
|
93
|
+
/* An opaque backdrop, which the flex-sibling case does not need: this button
|
|
94
|
+
sits ON the code, and `.w6w-icon-btn`'s transparent idle state would let
|
|
95
|
+
the first line's text read through it. It also restores the hover feedback
|
|
96
|
+
— `.w6w-icon-btn:hover` paints `--w6w-panel-2`, which is the wrapper's own
|
|
97
|
+
background here and would otherwise be a no-op. */
|
|
98
|
+
background: var(--w6w-panel);
|
|
99
|
+
border-color: var(--w6w-border);
|
|
100
|
+
}
|
|
101
|
+
/* Keep the first line clear of the button. Deliberately NOT folded into the
|
|
102
|
+
`.w6w-copyable .w6w-code-block` reset above — that rule mirrors
|
|
103
|
+
`_fx.scss:91-98` and is held byte-for-byte by the parity gate. 40px = the
|
|
104
|
+
button's ~28px box + its 4px inset + a 8px gap before the text. */
|
|
105
|
+
.w6w-copyable:has(> pre) > .w6w-code-block {
|
|
106
|
+
padding-right: var(--w6w-sp-10);
|
|
107
|
+
}
|
|
108
|
+
.w6w-copyable-btn.is-copied {
|
|
109
|
+
/* Mirrors `.w6w-expr-chip-render`'s "confirmed/success" convention exactly
|
|
110
|
+
(`_chips.scss:38-42`) — the one visual for a copied/success state. */
|
|
111
|
+
border-color: var(--w6w-success);
|
|
112
|
+
color: var(--w6w-success);
|
|
113
|
+
background: color-mix(in srgb, var(--w6w-success) 14%, transparent);
|
|
114
|
+
}
|
|
115
|
+
/* Scoped visually-hidden live region — not a new general `sr-only` utility
|
|
116
|
+
(none exists in `ui` to extend; see `Copyable.tsx` for why this, not the
|
|
117
|
+
button's own accessible name, carries the "Copied" announcement). */
|
|
118
|
+
.w6w-copyable-status {
|
|
119
|
+
position: absolute;
|
|
120
|
+
overflow: hidden;
|
|
121
|
+
width: 1px;
|
|
122
|
+
height: 1px;
|
|
123
|
+
white-space: nowrap;
|
|
124
|
+
clip-path: inset(50%);
|
|
125
|
+
border: 0;
|
|
126
|
+
padding: 0;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* ── Bare modifier: CopyableText (D-7) ───────────────────────────────────
|
|
130
|
+
A self-contained modifier, NOT a widening of the shared `> input, >
|
|
131
|
+
textarea, > pre` selector above (`:28-33`) — that list stays untouched.
|
|
132
|
+
Strips the box chrome the base `.w6w-copyable` rule sets (`:5-17`: border,
|
|
133
|
+
background, padding, min-height), and separately gives its own `> span`
|
|
134
|
+
child the SAME flex-and-shrink pair the shared selector gives an
|
|
135
|
+
`<input>`/`<textarea>`/`<pre>` (`:28-33` below) — a bare `<span>` is not in
|
|
136
|
+
that list, and without this it silently reproduces the overflow bug
|
|
137
|
+
`studio/src/pages/VarsPage.tsx:62-79` had to hand-patch. */
|
|
138
|
+
.w6w-copyable--bare {
|
|
139
|
+
border: none;
|
|
140
|
+
background: transparent;
|
|
141
|
+
padding: 0;
|
|
142
|
+
min-height: 0;
|
|
143
|
+
}
|
|
144
|
+
.w6w-copyable--bare > span {
|
|
145
|
+
flex: 1 1 auto;
|
|
146
|
+
min-width: 0;
|
|
147
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
.w6w-datavar-row {
|
|
2
|
+
display: grid;
|
|
3
|
+
grid-template-columns: 1fr 110px 1fr auto;
|
|
4
|
+
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;
|
|
10
|
+
}
|
|
11
|
+
.w6w-datavar-row input,
|
|
12
|
+
.w6w-datavar-row select {
|
|
13
|
+
background: var(--w6w-panel-2);
|
|
14
|
+
border: 1px solid var(--w6w-border);
|
|
15
|
+
border-radius: 8px;
|
|
16
|
+
padding: var(--w6w-sp-1-5) var(--w6w-sp-2);
|
|
17
|
+
color: var(--w6w-text);
|
|
18
|
+
font-size: 13px;
|
|
19
|
+
font-family: inherit;
|
|
20
|
+
min-width: 0;
|
|
21
|
+
}
|
|
22
|
+
/* The block above is `.w6w-datavar-row input` at (0,1,1), which TIES with a host
|
|
23
|
+
`input[type="text"] { margin-top: 4px }` and loses on source order — so the
|
|
24
|
+
margin has to be re-declared at a specificity that wins, rather than added to
|
|
25
|
+
that block where it would have no effect. `.w6w-field` is always an ancestor
|
|
26
|
+
here (`VarsField` renders one), giving (0,2,1). */
|
|
27
|
+
.w6w-field .w6w-datavar-row input,
|
|
28
|
+
.w6w-field .w6w-datavar-row select {
|
|
29
|
+
margin: 0;
|
|
30
|
+
}
|
|
31
|
+
.w6w-datavar-row input:focus,
|
|
32
|
+
.w6w-datavar-row select:focus {
|
|
33
|
+
outline: none;
|
|
34
|
+
border-color: var(--w6w-accent);
|
|
35
|
+
}
|
|
36
|
+
.w6w-datavar-row .w6w-btn {
|
|
37
|
+
padding: var(--w6w-sp-1-5) var(--w6w-sp-2-5);
|
|
38
|
+
}
|