@azure-id/orc 1.4.0 → 1.4.2
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 +229 -0
- package/README-id.md +39 -2
- package/README.md +53 -63
- package/bin/cli.js +212 -15
- package/bin/webui/api.js +16 -0
- package/bin/webui/css/04-motion.css +61 -0
- package/bin/webui/css/06-responsive.css +17 -1
- package/bin/webui/css/panels/hookui.css +493 -98
- package/bin/webui/fixtures/hookui.js +431 -409
- package/bin/webui/i18n/en/hookui.json +119 -44
- package/bin/webui/i18n/en/tour.json +1 -1
- package/bin/webui/i18n/id/hookui.json +137 -62
- package/bin/webui/i18n/id/tour.json +1 -1
- package/bin/webui/js/panels/hookui.js +1266 -466
- package/package.json +1 -1
- package/templates/hooks/README.md +8 -1
- package/templates/hooks/orc-statusline.js +15 -4
- package/templates/hooks/orc-subagent-line.js +5 -2
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
Every colour comes from a token defined once, on bare :root, in
|
|
4
4
|
00-tokens.css. This file defines none.
|
|
5
5
|
|
|
6
|
-
Nothing here declares an animation, deliberately: the motion
|
|
7
|
-
04-motion.css and nowhere else
|
|
8
|
-
|
|
6
|
+
Nothing here declares an animation or a @keyframes, deliberately: the motion
|
|
7
|
+
rules live in 04-motion.css and nowhere else, because THE ONE reduced-motion
|
|
8
|
+
media block lives there and a rule in this file — which loads BEFORE it —
|
|
9
|
+
could not be switched off from there at equal specificity. What is here is
|
|
10
|
+
state that survives a reader who asked for less motion: borders, opacity and
|
|
11
|
+
a drop marker drawn as a real edge. */
|
|
9
12
|
|
|
10
13
|
/* ── the preview ───────────────────────────────────────────────────────── */
|
|
11
14
|
/* A terminal is a monospaced grid, so the preview has to be one too. Anything
|
|
@@ -17,7 +20,7 @@
|
|
|
17
20
|
margin: 0;
|
|
18
21
|
padding: 10px 12px;
|
|
19
22
|
border-radius: 8px;
|
|
20
|
-
background: var(--
|
|
23
|
+
background: var(--surface-2);
|
|
21
24
|
border: 1px solid var(--line);
|
|
22
25
|
/* A wide line SCROLLS inside its own box. The page body must never scroll
|
|
23
26
|
sideways — and squeezing a status line to fit would misreport its width,
|
|
@@ -54,22 +57,184 @@
|
|
|
54
57
|
margin-bottom: 10px;
|
|
55
58
|
}
|
|
56
59
|
|
|
57
|
-
.
|
|
60
|
+
/* ── the terminal window (v1.4.2) ──────────────────────────────────────── */
|
|
61
|
+
/* The preview is a claim about what a terminal will print, so it is drawn as a
|
|
62
|
+
terminal. The chrome is not decoration: the title bar states the width the
|
|
63
|
+
picture was rendered at, and the ruler under it shows where that width falls.
|
|
64
|
+
Everything inside stays on the same monospaced grid - anything proportional
|
|
65
|
+
here would misrepresent every width decision the user makes. */
|
|
66
|
+
.hk-term {
|
|
67
|
+
border: 1px solid var(--line);
|
|
68
|
+
border-radius: 10px;
|
|
69
|
+
overflow: hidden;
|
|
70
|
+
background: var(--surface-2);
|
|
71
|
+
}
|
|
72
|
+
.hk-term-bar {
|
|
73
|
+
display: flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
gap: 10px;
|
|
76
|
+
padding: 6px 10px;
|
|
77
|
+
border-bottom: 1px solid var(--line);
|
|
78
|
+
background: var(--surface-3);
|
|
79
|
+
}
|
|
80
|
+
.hk-term-dots {
|
|
81
|
+
display: flex;
|
|
82
|
+
gap: 5px;
|
|
83
|
+
flex: 0 0 auto;
|
|
84
|
+
}
|
|
85
|
+
.hk-term-dot {
|
|
86
|
+
width: 9px;
|
|
87
|
+
height: 9px;
|
|
88
|
+
border-radius: 50%;
|
|
89
|
+
background: var(--line);
|
|
90
|
+
}
|
|
91
|
+
.hk-term-title {
|
|
92
|
+
font-size: 11px;
|
|
93
|
+
color: var(--text-dim);
|
|
94
|
+
flex: 1 1 auto;
|
|
95
|
+
min-width: 0;
|
|
96
|
+
overflow: hidden;
|
|
97
|
+
text-overflow: ellipsis;
|
|
98
|
+
white-space: nowrap;
|
|
99
|
+
}
|
|
100
|
+
.hk-term-tags {
|
|
101
|
+
display: flex;
|
|
102
|
+
gap: 6px;
|
|
103
|
+
flex: 0 0 auto;
|
|
104
|
+
}
|
|
105
|
+
/* The colour set and the symbol set the picture was drawn with. The words are
|
|
106
|
+
the CLI's own and are printed verbatim. */
|
|
107
|
+
.hk-term-tag {
|
|
108
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
109
|
+
font-size: 10px;
|
|
110
|
+
color: var(--text-dim);
|
|
111
|
+
border: 1px solid var(--line);
|
|
112
|
+
border-radius: 999px;
|
|
113
|
+
padding: 1px 7px;
|
|
114
|
+
}
|
|
115
|
+
.hk-term-screen {
|
|
116
|
+
padding: 10px 12px;
|
|
117
|
+
overflow-x: auto;
|
|
118
|
+
scrollbar-width: thin;
|
|
119
|
+
scrollbar-color: var(--line) transparent;
|
|
120
|
+
}
|
|
121
|
+
.hk-term-screen::-webkit-scrollbar {
|
|
122
|
+
height: 8px;
|
|
123
|
+
}
|
|
124
|
+
.hk-term-screen::-webkit-scrollbar-track {
|
|
125
|
+
background: transparent;
|
|
126
|
+
}
|
|
127
|
+
.hk-term-screen::-webkit-scrollbar-thumb {
|
|
128
|
+
background: var(--line);
|
|
129
|
+
border-radius: 4px;
|
|
130
|
+
}
|
|
131
|
+
/* The line inside a window has no box of its own: the window IS the box, and a
|
|
132
|
+
second border around the same string reads as a second thing. */
|
|
133
|
+
.hk-preview-flat {
|
|
134
|
+
border: none;
|
|
135
|
+
background: transparent;
|
|
136
|
+
padding: 0;
|
|
137
|
+
overflow-x: visible;
|
|
138
|
+
}
|
|
139
|
+
.hk-term-sm .hk-term-screen {
|
|
140
|
+
padding: 7px 10px;
|
|
141
|
+
}
|
|
142
|
+
.hk-term-sm .hk-preview {
|
|
143
|
+
font-size: 12px;
|
|
144
|
+
}
|
|
145
|
+
.hk-ruler {
|
|
146
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
147
|
+
font-size: 13px;
|
|
148
|
+
line-height: 1.55;
|
|
149
|
+
white-space: pre;
|
|
150
|
+
color: var(--text-dim);
|
|
151
|
+
opacity: 0.55;
|
|
152
|
+
border-bottom: 1px solid var(--line);
|
|
153
|
+
margin-bottom: 6px;
|
|
154
|
+
padding-bottom: 2px;
|
|
155
|
+
}
|
|
156
|
+
.hk-widths {
|
|
157
|
+
margin-top: 8px;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* ── the comparison drawer ─────────────────────────────────────────────── */
|
|
161
|
+
/* Eleven more terminals is a wall of them, and it pushed the board off the
|
|
162
|
+
screen. One drawer, closed by default, fetched on the first open. */
|
|
163
|
+
.hk-compare {
|
|
58
164
|
margin-top: 14px;
|
|
165
|
+
border: 1px solid var(--line);
|
|
166
|
+
border-radius: 10px;
|
|
167
|
+
overflow: hidden;
|
|
168
|
+
}
|
|
169
|
+
.hk-compare-head {
|
|
170
|
+
display: flex;
|
|
171
|
+
align-items: center;
|
|
172
|
+
gap: 10px;
|
|
173
|
+
width: 100%;
|
|
174
|
+
text-align: left;
|
|
175
|
+
padding: 9px 12px;
|
|
176
|
+
border: none;
|
|
177
|
+
background: var(--surface-3);
|
|
178
|
+
color: var(--text);
|
|
179
|
+
cursor: pointer;
|
|
180
|
+
font: inherit;
|
|
181
|
+
}
|
|
182
|
+
.hk-compare-head .tier-caret {
|
|
183
|
+
color: var(--text-dim);
|
|
184
|
+
}
|
|
185
|
+
.hk-compare-open .hk-compare-head .tier-caret {
|
|
186
|
+
transform: rotate(90deg);
|
|
187
|
+
}
|
|
188
|
+
.hk-compare-title {
|
|
189
|
+
font-weight: 600;
|
|
190
|
+
font-size: 13px;
|
|
191
|
+
}
|
|
192
|
+
.hk-compare-body {
|
|
193
|
+
display: none;
|
|
194
|
+
padding: 12px;
|
|
195
|
+
gap: 10px;
|
|
196
|
+
}
|
|
197
|
+
.hk-compare-open .hk-compare-body {
|
|
59
198
|
display: grid;
|
|
60
|
-
gap: 6px;
|
|
61
199
|
}
|
|
62
|
-
.hk-
|
|
200
|
+
.hk-compare-group {
|
|
201
|
+
font-size: 11px;
|
|
202
|
+
letter-spacing: 0.06em;
|
|
203
|
+
text-transform: uppercase;
|
|
204
|
+
color: var(--text-dim);
|
|
205
|
+
margin-top: 4px;
|
|
206
|
+
}
|
|
207
|
+
.hk-compare-row {
|
|
63
208
|
display: grid;
|
|
64
|
-
grid-template-columns:
|
|
209
|
+
grid-template-columns: 110px 1fr;
|
|
65
210
|
gap: 10px;
|
|
66
211
|
align-items: center;
|
|
212
|
+
min-width: 0;
|
|
67
213
|
}
|
|
68
|
-
.hk-
|
|
214
|
+
.hk-compare-label {
|
|
215
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
69
216
|
font-size: 11px;
|
|
70
|
-
color: var(--
|
|
217
|
+
color: var(--text-dim);
|
|
71
218
|
text-align: right;
|
|
72
219
|
}
|
|
220
|
+
.hk-compare-row .hk-term-bar {
|
|
221
|
+
display: none;
|
|
222
|
+
}
|
|
223
|
+
/* A control this SHAPE cannot use. It keeps its slot and carries the reason —
|
|
224
|
+
"this shape cannot use it" and "we forgot to offer it" must never look the
|
|
225
|
+
same, and a value already set has to stay readable. */
|
|
226
|
+
.hk-inert {
|
|
227
|
+
display: grid;
|
|
228
|
+
gap: 4px;
|
|
229
|
+
}
|
|
230
|
+
.hk-inert > :first-child {
|
|
231
|
+
opacity: 0.45;
|
|
232
|
+
pointer-events: none;
|
|
233
|
+
}
|
|
234
|
+
.hk-editor-live {
|
|
235
|
+
display: grid;
|
|
236
|
+
gap: 6px;
|
|
237
|
+
}
|
|
73
238
|
|
|
74
239
|
/* ── cautions ──────────────────────────────────────────────────────────── */
|
|
75
240
|
.hk-caution {
|
|
@@ -89,22 +254,29 @@
|
|
|
89
254
|
|
|
90
255
|
/* ── the board ─────────────────────────────────────────────────────────── */
|
|
91
256
|
.hk-line-wrap {
|
|
92
|
-
margin-bottom:
|
|
257
|
+
margin-bottom: 18px;
|
|
93
258
|
}
|
|
94
259
|
.hk-line-head {
|
|
95
260
|
display: flex;
|
|
96
261
|
justify-content: space-between;
|
|
97
|
-
align-items:
|
|
262
|
+
align-items: center;
|
|
263
|
+
flex-wrap: wrap;
|
|
264
|
+
gap: 8px;
|
|
98
265
|
margin-bottom: 6px;
|
|
99
266
|
}
|
|
267
|
+
.hk-line-title {
|
|
268
|
+
display: flex;
|
|
269
|
+
align-items: baseline;
|
|
270
|
+
gap: 10px;
|
|
271
|
+
}
|
|
100
272
|
.hk-line-name {
|
|
101
273
|
font-size: 12px;
|
|
102
274
|
font-weight: 600;
|
|
103
|
-
color: var(--
|
|
275
|
+
color: var(--text-dim);
|
|
104
276
|
}
|
|
105
277
|
.hk-line-count {
|
|
106
278
|
font-size: 11px;
|
|
107
|
-
color: var(--
|
|
279
|
+
color: var(--text-dim);
|
|
108
280
|
}
|
|
109
281
|
.hk-full {
|
|
110
282
|
color: var(--warn);
|
|
@@ -113,13 +285,23 @@
|
|
|
113
285
|
.hk-zone {
|
|
114
286
|
display: flex;
|
|
115
287
|
flex-wrap: wrap;
|
|
116
|
-
gap:
|
|
117
|
-
padding:
|
|
288
|
+
gap: 10px;
|
|
289
|
+
padding: 12px;
|
|
118
290
|
border: 1px dashed var(--line);
|
|
119
291
|
border-radius: 10px;
|
|
120
|
-
min-height:
|
|
292
|
+
min-height: 84px;
|
|
121
293
|
align-items: stretch;
|
|
122
294
|
}
|
|
295
|
+
/* The zone under a chip being dragged over it. A border change, not a glow:
|
|
296
|
+
the affordance has to survive a reader who asked for less motion. */
|
|
297
|
+
.hk-zone-hot {
|
|
298
|
+
border-color: var(--accent);
|
|
299
|
+
border-style: solid;
|
|
300
|
+
background: var(--surface-2);
|
|
301
|
+
}
|
|
302
|
+
.hk-zone-why {
|
|
303
|
+
flex-basis: 100%;
|
|
304
|
+
}
|
|
123
305
|
/* An illegal line is DISABLED with its reason on the zone itself — never a
|
|
124
306
|
toast after the fact, never a validation error on Apply. A user should not be
|
|
125
307
|
able to do the wrong thing and then be told off for it. */
|
|
@@ -129,8 +311,8 @@
|
|
|
129
311
|
45deg,
|
|
130
312
|
transparent,
|
|
131
313
|
transparent 6px,
|
|
132
|
-
var(--
|
|
133
|
-
var(--
|
|
314
|
+
var(--surface-2) 6px,
|
|
315
|
+
var(--surface-2) 12px
|
|
134
316
|
);
|
|
135
317
|
}
|
|
136
318
|
.hk-blocked {
|
|
@@ -138,122 +320,280 @@
|
|
|
138
320
|
gap: 8px;
|
|
139
321
|
align-items: center;
|
|
140
322
|
font-size: 12px;
|
|
141
|
-
color: var(--
|
|
323
|
+
color: var(--text-dim);
|
|
142
324
|
padding: 8px;
|
|
143
325
|
}
|
|
144
326
|
|
|
145
|
-
/* A chip's child count CHANGES with its state —
|
|
146
|
-
|
|
147
|
-
child count changes with its state must not have a row template; that
|
|
148
|
-
put a 250px ellipse on the Extra panel. */
|
|
327
|
+
/* A chip's child count CHANGES with its state — a part with no description is
|
|
328
|
+
one row shorter — so it is a FLEX COLUMN and never declares its rows. A card
|
|
329
|
+
whose child count changes with its state must not have a row template; that
|
|
330
|
+
is what put a 250px ellipse on the Extra panel. */
|
|
149
331
|
.hk-chip {
|
|
150
332
|
display: flex;
|
|
151
333
|
flex-direction: column;
|
|
152
|
-
gap:
|
|
153
|
-
padding:
|
|
334
|
+
gap: 5px;
|
|
335
|
+
padding: 9px 10px;
|
|
154
336
|
border: 1px solid var(--line);
|
|
155
|
-
border-radius:
|
|
156
|
-
background: var(--
|
|
157
|
-
min-width:
|
|
337
|
+
border-radius: 9px;
|
|
338
|
+
background: var(--surface-3);
|
|
339
|
+
min-width: 150px;
|
|
340
|
+
max-width: 280px;
|
|
341
|
+
cursor: grab;
|
|
342
|
+
/* The drop marker is drawn on this edge, so the space for it is reserved
|
|
343
|
+
always — a border that appears on hover would shift every chip to its
|
|
344
|
+
right by two pixels at the moment of the drop decision. */
|
|
345
|
+
box-shadow: inset 0 0 0 0 var(--accent);
|
|
158
346
|
}
|
|
159
347
|
.hk-chip:focus-visible {
|
|
160
348
|
outline: 2px solid var(--accent);
|
|
161
349
|
outline-offset: 2px;
|
|
162
350
|
}
|
|
163
|
-
.hk-chip
|
|
351
|
+
.hk-chip:active {
|
|
352
|
+
cursor: grabbing;
|
|
353
|
+
}
|
|
354
|
+
.hk-chip-dragging {
|
|
355
|
+
opacity: 0.4;
|
|
356
|
+
border-style: dashed;
|
|
357
|
+
}
|
|
358
|
+
/* WHERE IT WILL LAND, on the edge it will land on. A gap that opens up would
|
|
359
|
+
move every other chip while the pointer is deciding. */
|
|
360
|
+
.hk-drop-before {
|
|
361
|
+
box-shadow: inset 3px 0 0 0 var(--accent);
|
|
362
|
+
}
|
|
363
|
+
.hk-drop-after {
|
|
364
|
+
box-shadow: inset -3px 0 0 0 var(--accent);
|
|
365
|
+
}
|
|
366
|
+
/* Staged, not written. The dashed accent edge is the same language the edit bar
|
|
367
|
+
uses at the bottom of the page. */
|
|
368
|
+
.hk-chip-new {
|
|
164
369
|
border-color: var(--accent);
|
|
165
|
-
|
|
370
|
+
border-style: dashed;
|
|
166
371
|
}
|
|
167
372
|
.hk-chip-face {
|
|
168
|
-
min-height: 24px;
|
|
169
|
-
}
|
|
170
|
-
.hk-chip-foot {
|
|
171
373
|
display: flex;
|
|
172
|
-
justify-content: space-between;
|
|
173
374
|
align-items: center;
|
|
174
375
|
gap: 6px;
|
|
376
|
+
min-height: 24px;
|
|
377
|
+
}
|
|
378
|
+
.hk-grip {
|
|
379
|
+
color: var(--text-dim);
|
|
380
|
+
font-size: 14px;
|
|
381
|
+
line-height: 1;
|
|
382
|
+
cursor: grab;
|
|
383
|
+
user-select: none;
|
|
175
384
|
}
|
|
176
385
|
.hk-chip-id {
|
|
177
386
|
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
178
387
|
font-size: 11px;
|
|
179
|
-
color: var(--
|
|
388
|
+
color: var(--text-dim);
|
|
180
389
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
line-height: 1;
|
|
188
|
-
padding: 2px 4px;
|
|
189
|
-
border-radius: 4px;
|
|
190
|
-
}
|
|
191
|
-
.hk-icon:hover {
|
|
192
|
-
background: var(--bg-sunken);
|
|
193
|
-
color: var(--fg);
|
|
390
|
+
/* "What is this thing" is the first question anybody asks of a bar full of
|
|
391
|
+
symbols, and until v1.4.1 the answer lived only in a tooltip. */
|
|
392
|
+
.hk-chip-desc {
|
|
393
|
+
font-size: 11px;
|
|
394
|
+
line-height: 1.45;
|
|
395
|
+
color: var(--text-dim);
|
|
194
396
|
}
|
|
195
|
-
.hk-
|
|
397
|
+
.hk-chip-acts {
|
|
196
398
|
display: flex;
|
|
197
399
|
gap: 4px;
|
|
198
400
|
flex-wrap: wrap;
|
|
401
|
+
margin-top: 2px;
|
|
199
402
|
}
|
|
403
|
+
.hk-act {
|
|
404
|
+
font-size: 11px;
|
|
405
|
+
padding: 3px 8px;
|
|
406
|
+
border: 1px solid var(--line);
|
|
407
|
+
border-radius: 5px;
|
|
408
|
+
background: var(--surface-2);
|
|
409
|
+
color: var(--text-dim);
|
|
410
|
+
cursor: pointer;
|
|
411
|
+
}
|
|
412
|
+
.hk-act:hover {
|
|
413
|
+
border-color: var(--accent);
|
|
414
|
+
color: var(--text);
|
|
415
|
+
}
|
|
416
|
+
.hk-act-remove:hover {
|
|
417
|
+
border-color: var(--bad);
|
|
418
|
+
color: var(--bad);
|
|
419
|
+
}
|
|
420
|
+
|
|
200
421
|
.hk-add {
|
|
201
422
|
border: 1px dashed var(--line);
|
|
202
423
|
background: none;
|
|
203
|
-
color: var(--
|
|
204
|
-
border-radius:
|
|
205
|
-
padding:
|
|
424
|
+
color: var(--text-dim);
|
|
425
|
+
border-radius: 9px;
|
|
426
|
+
padding: 10px 18px;
|
|
206
427
|
cursor: pointer;
|
|
207
428
|
font-size: 12px;
|
|
429
|
+
min-width: 150px;
|
|
208
430
|
}
|
|
209
|
-
.hk-add:hover {
|
|
431
|
+
.hk-add:hover:not(:disabled) {
|
|
210
432
|
border-color: var(--accent);
|
|
211
|
-
color: var(--
|
|
433
|
+
color: var(--text);
|
|
434
|
+
}
|
|
435
|
+
.hk-add:disabled {
|
|
436
|
+
cursor: not-allowed;
|
|
437
|
+
opacity: 0.5;
|
|
212
438
|
}
|
|
213
439
|
|
|
214
440
|
.hk-line-opts {
|
|
215
441
|
display: flex;
|
|
216
442
|
align-items: center;
|
|
217
443
|
gap: 8px;
|
|
218
|
-
margin-top: 6px;
|
|
219
444
|
}
|
|
220
|
-
.hk-
|
|
445
|
+
.hk-select,
|
|
221
446
|
.hk-input {
|
|
222
447
|
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
223
448
|
font-size: 12px;
|
|
224
449
|
padding: 4px 8px;
|
|
225
450
|
border: 1px solid var(--line);
|
|
226
451
|
border-radius: 6px;
|
|
227
|
-
background: var(--
|
|
228
|
-
color: var(--
|
|
229
|
-
max-width:
|
|
452
|
+
background: var(--surface-2);
|
|
453
|
+
color: var(--text);
|
|
454
|
+
max-width: 260px;
|
|
455
|
+
}
|
|
456
|
+
/* THE OPEN LIST IS NOT THE CLOSED BOX (v1.4.2). A native <select> popup is
|
|
457
|
+
drawn by the platform, and it inherits the control's `color` while taking its
|
|
458
|
+
background from the system - so a light `--fg` on a dark panel arrived as
|
|
459
|
+
near-white text on the platform's near-white menu, and the values could not
|
|
460
|
+
be read at all. `color-scheme` tells the platform which menu to draw, and the
|
|
461
|
+
option rule states both halves rather than leaving one of them to chance. */
|
|
462
|
+
.hk-select {
|
|
463
|
+
color-scheme: light dark;
|
|
464
|
+
}
|
|
465
|
+
.hk-select option,
|
|
466
|
+
.hk-select optgroup {
|
|
467
|
+
background: var(--surface-3);
|
|
468
|
+
color: var(--text);
|
|
469
|
+
}
|
|
470
|
+
.hk-select option:disabled {
|
|
471
|
+
color: var(--text-dim);
|
|
230
472
|
}
|
|
231
473
|
|
|
232
|
-
/* ── the
|
|
233
|
-
.hk-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
474
|
+
/* ── the part picker ───────────────────────────────────────────────────── */
|
|
475
|
+
.hk-picker {
|
|
476
|
+
display: flex;
|
|
477
|
+
flex-direction: column;
|
|
478
|
+
gap: 10px;
|
|
479
|
+
min-width: min(560px, 76vw);
|
|
480
|
+
}
|
|
481
|
+
.hk-picker-search {
|
|
482
|
+
display: flex;
|
|
483
|
+
align-items: center;
|
|
484
|
+
gap: 10px;
|
|
485
|
+
}
|
|
486
|
+
.hk-picker-input {
|
|
487
|
+
flex: 1 1 auto;
|
|
488
|
+
max-width: none;
|
|
489
|
+
}
|
|
490
|
+
.hk-picker-list {
|
|
491
|
+
display: flex;
|
|
492
|
+
flex-direction: column;
|
|
493
|
+
gap: 6px;
|
|
494
|
+
max-height: 46vh;
|
|
495
|
+
overflow-y: auto;
|
|
496
|
+
scrollbar-width: thin;
|
|
497
|
+
scrollbar-color: var(--line) transparent;
|
|
498
|
+
}
|
|
499
|
+
.hk-picker-list::-webkit-scrollbar {
|
|
500
|
+
width: 8px;
|
|
501
|
+
}
|
|
502
|
+
.hk-picker-list::-webkit-scrollbar-track {
|
|
503
|
+
background: transparent;
|
|
504
|
+
}
|
|
505
|
+
.hk-picker-list::-webkit-scrollbar-thumb {
|
|
506
|
+
background: var(--line);
|
|
507
|
+
border-radius: 4px;
|
|
508
|
+
}
|
|
509
|
+
/* One click, one part. A refused row is drawn as a plain div and gets NO button
|
|
510
|
+
at all — never a disabled one: "we decided against this" and "we forgot" must
|
|
511
|
+
not look the same. */
|
|
512
|
+
.hk-pick-row {
|
|
513
|
+
display: flex;
|
|
514
|
+
flex-direction: column;
|
|
515
|
+
align-items: stretch;
|
|
516
|
+
gap: 4px;
|
|
517
|
+
width: 100%;
|
|
518
|
+
padding: 9px 11px;
|
|
519
|
+
border: 1px solid var(--line);
|
|
520
|
+
border-radius: 8px;
|
|
521
|
+
background: var(--surface-3);
|
|
522
|
+
text-align: left;
|
|
523
|
+
cursor: pointer;
|
|
524
|
+
color: inherit;
|
|
525
|
+
}
|
|
526
|
+
button.hk-pick-row:hover {
|
|
527
|
+
border-color: var(--accent);
|
|
528
|
+
background: var(--surface-2);
|
|
529
|
+
}
|
|
530
|
+
.hk-pick-row-off {
|
|
531
|
+
cursor: default;
|
|
532
|
+
opacity: 0.7;
|
|
533
|
+
background: none;
|
|
534
|
+
}
|
|
535
|
+
.hk-pick-top {
|
|
536
|
+
display: flex;
|
|
537
|
+
align-items: center;
|
|
238
538
|
gap: 8px;
|
|
539
|
+
flex-wrap: wrap;
|
|
239
540
|
}
|
|
240
|
-
.hk-
|
|
241
|
-
font-
|
|
242
|
-
|
|
243
|
-
|
|
541
|
+
.hk-pick-desc {
|
|
542
|
+
font-size: 12px;
|
|
543
|
+
line-height: 1.5;
|
|
544
|
+
color: var(--text-dim);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/* ── move ──────────────────────────────────────────────────────────────── */
|
|
548
|
+
.hk-move-line {
|
|
549
|
+
display: flex;
|
|
550
|
+
flex-direction: column;
|
|
551
|
+
gap: 6px;
|
|
552
|
+
padding: 9px 0;
|
|
553
|
+
border-bottom: 1px solid var(--line);
|
|
554
|
+
}
|
|
555
|
+
.hk-move-slots {
|
|
556
|
+
display: flex;
|
|
557
|
+
gap: 6px;
|
|
558
|
+
flex-wrap: wrap;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/* ── the part editor ───────────────────────────────────────────────────── */
|
|
562
|
+
.hk-editor {
|
|
563
|
+
display: flex;
|
|
564
|
+
flex-direction: column;
|
|
565
|
+
gap: 9px;
|
|
566
|
+
min-width: min(620px, 78vw);
|
|
567
|
+
}
|
|
568
|
+
.hk-editor-live {
|
|
569
|
+
position: sticky;
|
|
570
|
+
top: 0;
|
|
571
|
+
z-index: 1;
|
|
572
|
+
background: var(--surface-3);
|
|
573
|
+
padding-bottom: 4px;
|
|
574
|
+
}
|
|
575
|
+
/* The editor is a flex COLUMN that stretches its children, which turned a small
|
|
576
|
+
secondary button into a full-width box that read as a text field. */
|
|
577
|
+
.hk-swap {
|
|
578
|
+
align-self: flex-start;
|
|
579
|
+
}
|
|
580
|
+
.hk-section-wrap {
|
|
581
|
+
display: flex;
|
|
582
|
+
flex-direction: column;
|
|
583
|
+
gap: 3px;
|
|
584
|
+
margin-top: 10px;
|
|
244
585
|
}
|
|
245
586
|
.hk-section {
|
|
246
587
|
font-size: 11px;
|
|
247
588
|
text-transform: uppercase;
|
|
248
589
|
letter-spacing: 0.06em;
|
|
249
|
-
color: var(--
|
|
250
|
-
margin-top: 8px;
|
|
590
|
+
color: var(--text-dim);
|
|
251
591
|
border-bottom: 1px solid var(--line);
|
|
252
592
|
padding-bottom: 3px;
|
|
253
593
|
}
|
|
254
594
|
/* THE SHAPE PICKER IS A GALLERY, NOT A DROPDOWN: every option drawn with this
|
|
255
|
-
component's real value. A dropdown containing
|
|
256
|
-
|
|
595
|
+
component's real value. A dropdown containing a renderer's name tells nobody
|
|
596
|
+
anything. */
|
|
257
597
|
.hk-gallery {
|
|
258
598
|
display: grid;
|
|
259
599
|
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
|
|
@@ -267,29 +607,41 @@
|
|
|
267
607
|
padding: 6px 8px;
|
|
268
608
|
border: 1px solid var(--line);
|
|
269
609
|
border-radius: 6px;
|
|
270
|
-
background: var(--
|
|
610
|
+
background: var(--surface-2);
|
|
271
611
|
cursor: pointer;
|
|
272
612
|
text-align: left;
|
|
273
613
|
}
|
|
614
|
+
.hk-sample:hover {
|
|
615
|
+
border-color: var(--accent);
|
|
616
|
+
}
|
|
274
617
|
.hk-sample-on {
|
|
275
618
|
border-color: var(--accent);
|
|
276
|
-
background: var(--
|
|
619
|
+
background: var(--surface-3);
|
|
277
620
|
}
|
|
278
621
|
.hk-sample-id {
|
|
279
622
|
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
280
623
|
font-size: 10px;
|
|
281
|
-
color: var(--
|
|
624
|
+
color: var(--text-dim);
|
|
282
625
|
}
|
|
283
626
|
|
|
627
|
+
/* A control, its name, and the sentence that says what it does. The sentence is
|
|
628
|
+
why this is a two-line left column rather than a label. */
|
|
284
629
|
.hk-field {
|
|
285
630
|
display: grid;
|
|
286
|
-
grid-template-columns:
|
|
287
|
-
gap:
|
|
288
|
-
align-items:
|
|
631
|
+
grid-template-columns: 190px 1fr;
|
|
632
|
+
gap: 12px;
|
|
633
|
+
align-items: start;
|
|
634
|
+
padding: 5px 0;
|
|
635
|
+
}
|
|
636
|
+
.hk-field-left {
|
|
637
|
+
display: flex;
|
|
638
|
+
flex-direction: column;
|
|
639
|
+
gap: 2px;
|
|
289
640
|
}
|
|
290
641
|
.hk-field-name {
|
|
291
642
|
font-size: 12px;
|
|
292
|
-
|
|
643
|
+
font-weight: 600;
|
|
644
|
+
color: var(--text);
|
|
293
645
|
}
|
|
294
646
|
.hk-picks {
|
|
295
647
|
display: flex;
|
|
@@ -302,14 +654,17 @@
|
|
|
302
654
|
padding: 3px 7px;
|
|
303
655
|
border: 1px solid var(--line);
|
|
304
656
|
border-radius: 5px;
|
|
305
|
-
background: var(--
|
|
306
|
-
color: var(--
|
|
657
|
+
background: var(--surface-2);
|
|
658
|
+
color: var(--text-dim);
|
|
307
659
|
cursor: pointer;
|
|
308
660
|
}
|
|
661
|
+
.hk-pick:hover {
|
|
662
|
+
border-color: var(--accent);
|
|
663
|
+
}
|
|
309
664
|
.hk-pick-on {
|
|
310
665
|
border-color: var(--accent);
|
|
311
|
-
color: var(--
|
|
312
|
-
background: var(--
|
|
666
|
+
color: var(--text);
|
|
667
|
+
background: var(--surface-3);
|
|
313
668
|
}
|
|
314
669
|
.hk-checks {
|
|
315
670
|
display: grid;
|
|
@@ -323,30 +678,33 @@
|
|
|
323
678
|
font-size: 12px;
|
|
324
679
|
}
|
|
325
680
|
|
|
326
|
-
/* ── the
|
|
681
|
+
/* ── the reference list ────────────────────────────────────────────────── */
|
|
327
682
|
.hk-palette-search {
|
|
328
|
-
font-size: 12px;
|
|
329
|
-
padding: 4px 10px;
|
|
330
|
-
border: 1px solid var(--line);
|
|
331
|
-
border-radius: 6px;
|
|
332
|
-
background: var(--bg-sunken);
|
|
333
|
-
color: var(--fg);
|
|
334
683
|
min-width: 180px;
|
|
335
684
|
}
|
|
336
|
-
/* A row's child count changes with its state — a refused row carries a reason
|
|
337
|
-
|
|
685
|
+
/* A row's child count changes with its state — a refused row carries a reason —
|
|
686
|
+
so it is a flex column, not a grid with declared columns. */
|
|
338
687
|
.hk-prow {
|
|
339
688
|
display: flex;
|
|
340
|
-
flex-
|
|
689
|
+
flex-direction: column;
|
|
690
|
+
gap: 4px;
|
|
691
|
+
padding: 9px 0;
|
|
692
|
+
border-bottom: 1px solid var(--line);
|
|
693
|
+
}
|
|
694
|
+
.hk-prow-head {
|
|
695
|
+
display: flex;
|
|
341
696
|
align-items: center;
|
|
342
697
|
gap: 10px;
|
|
343
|
-
|
|
344
|
-
border-bottom: 1px solid var(--line);
|
|
698
|
+
flex-wrap: wrap;
|
|
345
699
|
}
|
|
346
700
|
.hk-prow-id {
|
|
347
701
|
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
348
702
|
font-size: 12px;
|
|
349
|
-
|
|
703
|
+
}
|
|
704
|
+
.hk-prow-desc {
|
|
705
|
+
font-size: 12px;
|
|
706
|
+
line-height: 1.5;
|
|
707
|
+
color: var(--text-dim);
|
|
350
708
|
}
|
|
351
709
|
.hk-prow-why {
|
|
352
710
|
flex-basis: 100%;
|
|
@@ -365,6 +723,43 @@
|
|
|
365
723
|
align-items: center;
|
|
366
724
|
}
|
|
367
725
|
|
|
726
|
+
/* ── the colour set picker ─────────────────────────────────────────────── */
|
|
727
|
+
/* Each option carries the CLI's own sentence about what it is FOR, so it is a
|
|
728
|
+
card and not a word in a row of words. */
|
|
729
|
+
.hk-theme-list {
|
|
730
|
+
display: flex;
|
|
731
|
+
flex-wrap: wrap;
|
|
732
|
+
gap: 8px;
|
|
733
|
+
}
|
|
734
|
+
.hk-theme {
|
|
735
|
+
display: flex;
|
|
736
|
+
flex-direction: column;
|
|
737
|
+
align-items: flex-start;
|
|
738
|
+
gap: 3px;
|
|
739
|
+
flex: 1 1 220px;
|
|
740
|
+
max-width: 320px;
|
|
741
|
+
padding: 8px 10px;
|
|
742
|
+
border: 1px solid var(--line);
|
|
743
|
+
border-radius: 8px;
|
|
744
|
+
background: var(--surface-2);
|
|
745
|
+
cursor: pointer;
|
|
746
|
+
text-align: left;
|
|
747
|
+
color: inherit;
|
|
748
|
+
}
|
|
749
|
+
.hk-theme:hover {
|
|
750
|
+
border-color: var(--accent);
|
|
751
|
+
}
|
|
752
|
+
.hk-theme-on {
|
|
753
|
+
border-color: var(--accent);
|
|
754
|
+
background: var(--surface-3);
|
|
755
|
+
}
|
|
756
|
+
.hk-theme-name {
|
|
757
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
758
|
+
font-size: 12px;
|
|
759
|
+
font-weight: 600;
|
|
760
|
+
color: var(--text);
|
|
761
|
+
}
|
|
762
|
+
|
|
368
763
|
/* A number field is a NUMBER field: wide enough for three digits and its
|
|
369
764
|
spinner, and no wider. A 200px box for a value between 0 and 8 reads as a
|
|
370
765
|
free-text field somebody has to think about. */
|