@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,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
+ }