@azure-id/orc 1.4.0 → 1.4.1

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.
@@ -37,6 +37,43 @@
37
37
  from { opacity: 0; transform: translateY(8px); }
38
38
  to { opacity: 1; transform: none; }
39
39
  }
40
+ /* ── the CLI Hook Interface (v1.4.1) ─────────────────────────────────────── */
41
+ /* The board is a thing you BUILD, so it moves the way a thing you build moves:
42
+ a chip arrives, a chip you just staged breathes once so you can find it, and
43
+ a row in the part picker slides in as the list narrows under your typing.
44
+ Every one of them is a FINITE animation with a real end state, so the cap in
45
+ the reduced-motion block below leaves each one at rest rather than frozen
46
+ part-way. */
47
+ .hk-chip { animation: hk-chip-in 200ms var(--ease) backwards; }
48
+ @keyframes hk-chip-in {
49
+ from { opacity: 0; transform: translateY(6px) scale(0.97); }
50
+ to { opacity: 1; transform: none; }
51
+ }
52
+ /* Staged, not written — and the one thing on the board that has to be findable
53
+ the instant it appears. Three pulses and it stops: an infinite one would have
54
+ to be REMOVED below rather than capped, and this one reads correctly at rest.
55
+ */
56
+ .hk-chip-new { animation: hk-chip-in 200ms var(--ease) backwards, hk-chip-mark 900ms var(--ease) 3; }
57
+ @keyframes hk-chip-mark {
58
+ 0%, 100% { box-shadow: inset 0 0 0 0 var(--accent); }
59
+ 50% { box-shadow: inset 0 0 0 2px var(--accent); }
60
+ }
61
+ /* Position, drop marker, and the zone's own border: transitions rather than
62
+ animations, so an interrupted drag never leaves a chip mid-flight. */
63
+ .hk-chip, .hk-zone, .hk-add, .hk-act, .hk-pick-row, .hk-theme, .hk-sample {
64
+ transition: border-color var(--dur) var(--ease), background var(--dur) var(--ease),
65
+ box-shadow var(--dur) var(--ease), opacity var(--dur) var(--ease),
66
+ transform var(--dur) var(--ease);
67
+ }
68
+ .hk-chip:hover:not(.hk-chip-dragging) { transform: translateY(-2px); }
69
+ .hk-add:hover:not(:disabled) { transform: translateY(-2px); }
70
+ .hk-pick-row { animation: hk-row-in 160ms var(--ease) backwards; }
71
+ @keyframes hk-row-in {
72
+ from { opacity: 0; transform: translateX(-6px); }
73
+ to { opacity: 1; transform: none; }
74
+ }
75
+ button.hk-pick-row:hover { transform: translateX(3px); }
76
+
40
77
  /* ---------------------------------------------------------- REDUCED MOTION */
41
78
  /* Non-negotiable: every animation and transition above is off. */
42
79
 
@@ -55,6 +92,12 @@
55
92
  nudges are removed outright rather than sped up. */
56
93
  .nav a:hover, .btn:active:not(:disabled), .action:hover,
57
94
  .todo:hover, .stat-link:hover, button.step:hover { transform: none !important; }
95
+ /* The board's own nudges, removed rather than shortened — a chip that lifts
96
+ under the pointer is an affordance, and a fast lift is still a lift. The
97
+ border and box-shadow changes stay: THEY are what says where a drop lands,
98
+ and a drop marker carried by motion alone would not exist here at all. */
99
+ .hk-chip:hover:not(.hk-chip-dragging), .hk-add:hover:not(:disabled),
100
+ button.hk-pick-row:hover { transform: none !important; }
58
101
  /* The vault pulse is one of two INFINITE animations on the page. Capping it to
59
102
  a single 1ms run would still leave a dash frozen mid-edge, so it is removed
60
103
  outright and the edge reads as a plain line. */
@@ -138,6 +138,20 @@
138
138
  .hk-prow-id {
139
139
  min-width: 0;
140
140
  }
141
+ /* v1.4.1 — the editor's two-column field (a name plus the sentence that
142
+ explains it, then the control) stacks; and DRAG IS OFF below this width. A
143
+ 40-pixel drop gap on a phone is not a target, so the three buttons on every
144
+ chip are the path — which is why they are buttons on the chip and not a
145
+ menu behind one. */
146
+ .hk-chip {
147
+ max-width: none;
148
+ flex-basis: 100%;
149
+ cursor: default;
150
+ }
151
+ .hk-grip { display: none; }
152
+ .hk-add { flex-basis: 100%; }
153
+ .hk-picker, .hk-editor { min-width: 0; }
154
+ .hk-theme { flex-basis: 100%; max-width: none; }
141
155
  /* The caution KEEPS its two columns. The mark and the sentence belong to each
142
156
  other, and stacking them puts a lone ✕ on a line of its own above the text
143
157
  it is about. The mark column narrows instead. */
@@ -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 rules live in
7
- 04-motion.css and nowhere else. The board's affordances are borders and
8
- opacity, and both survive a reader who has asked for less motion. */
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
@@ -89,14 +92,21 @@
89
92
 
90
93
  /* ── the board ─────────────────────────────────────────────────────────── */
91
94
  .hk-line-wrap {
92
- margin-bottom: 16px;
95
+ margin-bottom: 18px;
93
96
  }
94
97
  .hk-line-head {
95
98
  display: flex;
96
99
  justify-content: space-between;
97
- align-items: baseline;
100
+ align-items: center;
101
+ flex-wrap: wrap;
102
+ gap: 8px;
98
103
  margin-bottom: 6px;
99
104
  }
105
+ .hk-line-title {
106
+ display: flex;
107
+ align-items: baseline;
108
+ gap: 10px;
109
+ }
100
110
  .hk-line-name {
101
111
  font-size: 12px;
102
112
  font-weight: 600;
@@ -113,13 +123,23 @@
113
123
  .hk-zone {
114
124
  display: flex;
115
125
  flex-wrap: wrap;
116
- gap: 8px;
117
- padding: 10px;
126
+ gap: 10px;
127
+ padding: 12px;
118
128
  border: 1px dashed var(--line);
119
129
  border-radius: 10px;
120
- min-height: 64px;
130
+ min-height: 84px;
121
131
  align-items: stretch;
122
132
  }
133
+ /* The zone under a chip being dragged over it. A border change, not a glow:
134
+ the affordance has to survive a reader who asked for less motion. */
135
+ .hk-zone-hot {
136
+ border-color: var(--accent);
137
+ border-style: solid;
138
+ background: var(--bg-sunken);
139
+ }
140
+ .hk-zone-why {
141
+ flex-basis: 100%;
142
+ }
123
143
  /* An illegal line is DISABLED with its reason on the zone itself — never a
124
144
  toast after the fact, never a validation error on Apply. A user should not be
125
145
  able to do the wrong thing and then be told off for it. */
@@ -142,82 +162,125 @@
142
162
  padding: 8px;
143
163
  }
144
164
 
145
- /* A chip's child count CHANGES with its state — an open editor adds a whole
146
- drawer — so it is a FLEX COLUMN and never declares its rows. A card whose
147
- child count changes with its state must not have a row template; that is what
148
- put a 250px ellipse on the Extra panel. */
165
+ /* A chip's child count CHANGES with its state — a part with no description is
166
+ one row shorter — so it is a FLEX COLUMN and never declares its rows. A card
167
+ whose child count changes with its state must not have a row template; that
168
+ is what put a 250px ellipse on the Extra panel. */
149
169
  .hk-chip {
150
170
  display: flex;
151
171
  flex-direction: column;
152
- gap: 4px;
153
- padding: 8px;
172
+ gap: 5px;
173
+ padding: 9px 10px;
154
174
  border: 1px solid var(--line);
155
- border-radius: 8px;
175
+ border-radius: 9px;
156
176
  background: var(--bg-raised);
157
- min-width: 120px;
177
+ min-width: 150px;
178
+ max-width: 280px;
179
+ cursor: grab;
180
+ /* The drop marker is drawn on this edge, so the space for it is reserved
181
+ always — a border that appears on hover would shift every chip to its
182
+ right by two pixels at the moment of the drop decision. */
183
+ box-shadow: inset 0 0 0 0 var(--accent);
158
184
  }
159
185
  .hk-chip:focus-visible {
160
186
  outline: 2px solid var(--accent);
161
187
  outline-offset: 2px;
162
188
  }
163
- .hk-chip-open {
189
+ .hk-chip:active {
190
+ cursor: grabbing;
191
+ }
192
+ .hk-chip-dragging {
193
+ opacity: 0.4;
194
+ border-style: dashed;
195
+ }
196
+ /* WHERE IT WILL LAND, on the edge it will land on. A gap that opens up would
197
+ move every other chip while the pointer is deciding. */
198
+ .hk-drop-before {
199
+ box-shadow: inset 3px 0 0 0 var(--accent);
200
+ }
201
+ .hk-drop-after {
202
+ box-shadow: inset -3px 0 0 0 var(--accent);
203
+ }
204
+ /* Staged, not written. The dashed accent edge is the same language the edit bar
205
+ uses at the bottom of the page. */
206
+ .hk-chip-new {
164
207
  border-color: var(--accent);
165
- width: 100%;
208
+ border-style: dashed;
166
209
  }
167
210
  .hk-chip-face {
168
- min-height: 24px;
169
- }
170
- .hk-chip-foot {
171
211
  display: flex;
172
- justify-content: space-between;
173
212
  align-items: center;
174
213
  gap: 6px;
214
+ min-height: 24px;
215
+ }
216
+ .hk-grip {
217
+ color: var(--fg-dim);
218
+ font-size: 14px;
219
+ line-height: 1;
220
+ cursor: grab;
221
+ user-select: none;
175
222
  }
176
223
  .hk-chip-id {
177
224
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
178
225
  font-size: 11px;
179
226
  color: var(--fg-dim);
180
227
  }
181
- .hk-icon {
182
- background: none;
183
- border: none;
228
+ /* "What is this thing" is the first question anybody asks of a bar full of
229
+ symbols, and until v1.4.1 the answer lived only in a tooltip. */
230
+ .hk-chip-desc {
231
+ font-size: 11px;
232
+ line-height: 1.45;
184
233
  color: var(--fg-dim);
185
- cursor: pointer;
186
- font-size: 14px;
187
- line-height: 1;
188
- padding: 2px 4px;
189
- border-radius: 4px;
190
234
  }
191
- .hk-icon:hover {
192
- background: var(--bg-sunken);
193
- color: var(--fg);
194
- }
195
- .hk-move {
235
+ .hk-chip-acts {
196
236
  display: flex;
197
237
  gap: 4px;
198
238
  flex-wrap: wrap;
239
+ margin-top: 2px;
240
+ }
241
+ .hk-act {
242
+ font-size: 11px;
243
+ padding: 3px 8px;
244
+ border: 1px solid var(--line);
245
+ border-radius: 5px;
246
+ background: var(--bg-sunken);
247
+ color: var(--fg-dim);
248
+ cursor: pointer;
249
+ }
250
+ .hk-act:hover {
251
+ border-color: var(--accent);
252
+ color: var(--fg);
253
+ }
254
+ .hk-act-remove:hover {
255
+ border-color: var(--bad);
256
+ color: var(--bad);
199
257
  }
258
+
200
259
  .hk-add {
201
260
  border: 1px dashed var(--line);
202
261
  background: none;
203
262
  color: var(--fg-dim);
204
- border-radius: 8px;
205
- padding: 8px 14px;
263
+ border-radius: 9px;
264
+ padding: 10px 18px;
206
265
  cursor: pointer;
207
266
  font-size: 12px;
267
+ min-width: 150px;
208
268
  }
209
- .hk-add:hover {
269
+ .hk-add:hover:not(:disabled) {
210
270
  border-color: var(--accent);
211
271
  color: var(--fg);
212
272
  }
273
+ .hk-add:disabled {
274
+ cursor: not-allowed;
275
+ opacity: 0.5;
276
+ }
213
277
 
214
278
  .hk-line-opts {
215
279
  display: flex;
216
280
  align-items: center;
217
281
  gap: 8px;
218
- margin-top: 6px;
219
282
  }
220
- .hk-sep,
283
+ .hk-select,
221
284
  .hk-input {
222
285
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
223
286
  font-size: 12px;
@@ -226,34 +289,132 @@
226
289
  border-radius: 6px;
227
290
  background: var(--bg-sunken);
228
291
  color: var(--fg);
229
- max-width: 200px;
292
+ max-width: 260px;
230
293
  }
231
294
 
232
- /* ── the editor drawer ─────────────────────────────────────────────────── */
233
- .hk-drawer {
234
- border-top: 1px solid var(--line);
235
- margin-top: 8px;
236
- padding-top: 10px;
237
- display: grid;
295
+ /* ── the part picker ───────────────────────────────────────────────────── */
296
+ .hk-picker {
297
+ display: flex;
298
+ flex-direction: column;
299
+ gap: 10px;
300
+ min-width: min(560px, 76vw);
301
+ }
302
+ .hk-picker-search {
303
+ display: flex;
304
+ align-items: center;
305
+ gap: 10px;
306
+ }
307
+ .hk-picker-input {
308
+ flex: 1 1 auto;
309
+ max-width: none;
310
+ }
311
+ .hk-picker-list {
312
+ display: flex;
313
+ flex-direction: column;
314
+ gap: 6px;
315
+ max-height: 46vh;
316
+ overflow-y: auto;
317
+ scrollbar-width: thin;
318
+ scrollbar-color: var(--line) transparent;
319
+ }
320
+ .hk-picker-list::-webkit-scrollbar {
321
+ width: 8px;
322
+ }
323
+ .hk-picker-list::-webkit-scrollbar-track {
324
+ background: transparent;
325
+ }
326
+ .hk-picker-list::-webkit-scrollbar-thumb {
327
+ background: var(--line);
328
+ border-radius: 4px;
329
+ }
330
+ /* One click, one part. A refused row is drawn as a plain div and gets NO button
331
+ at all — never a disabled one: "we decided against this" and "we forgot" must
332
+ not look the same. */
333
+ .hk-pick-row {
334
+ display: flex;
335
+ flex-direction: column;
336
+ align-items: stretch;
337
+ gap: 4px;
338
+ width: 100%;
339
+ padding: 9px 11px;
340
+ border: 1px solid var(--line);
341
+ border-radius: 8px;
342
+ background: var(--bg-raised);
343
+ text-align: left;
344
+ cursor: pointer;
345
+ color: inherit;
346
+ }
347
+ button.hk-pick-row:hover {
348
+ border-color: var(--accent);
349
+ background: var(--bg-sunken);
350
+ }
351
+ .hk-pick-row-off {
352
+ cursor: default;
353
+ opacity: 0.7;
354
+ background: none;
355
+ }
356
+ .hk-pick-top {
357
+ display: flex;
358
+ align-items: center;
238
359
  gap: 8px;
360
+ flex-wrap: wrap;
239
361
  }
240
- .hk-drawer-head {
241
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
242
- font-weight: 600;
243
- font-size: 13px;
362
+ .hk-pick-desc {
363
+ font-size: 12px;
364
+ line-height: 1.5;
365
+ color: var(--fg-dim);
366
+ }
367
+
368
+ /* ── move ──────────────────────────────────────────────────────────────── */
369
+ .hk-move-line {
370
+ display: flex;
371
+ flex-direction: column;
372
+ gap: 6px;
373
+ padding: 9px 0;
374
+ border-bottom: 1px solid var(--line);
375
+ }
376
+ .hk-move-slots {
377
+ display: flex;
378
+ gap: 6px;
379
+ flex-wrap: wrap;
380
+ }
381
+
382
+ /* ── the part editor ───────────────────────────────────────────────────── */
383
+ .hk-editor {
384
+ display: flex;
385
+ flex-direction: column;
386
+ gap: 9px;
387
+ min-width: min(620px, 78vw);
388
+ }
389
+ .hk-editor-live {
390
+ position: sticky;
391
+ top: 0;
392
+ z-index: 1;
393
+ background: var(--bg-raised);
394
+ padding-bottom: 4px;
395
+ }
396
+ /* The editor is a flex COLUMN that stretches its children, which turned a small
397
+ secondary button into a full-width box that read as a text field. */
398
+ .hk-swap {
399
+ align-self: flex-start;
400
+ }
401
+ .hk-section-wrap {
402
+ display: flex;
403
+ flex-direction: column;
404
+ gap: 3px;
405
+ margin-top: 10px;
244
406
  }
245
407
  .hk-section {
246
408
  font-size: 11px;
247
409
  text-transform: uppercase;
248
410
  letter-spacing: 0.06em;
249
411
  color: var(--fg-dim);
250
- margin-top: 8px;
251
412
  border-bottom: 1px solid var(--line);
252
413
  padding-bottom: 3px;
253
414
  }
254
415
  /* THE SHAPE PICKER IS A GALLERY, NOT A DROPDOWN: every option drawn with this
255
- component's real value. A dropdown containing the word `braille-bar` tells
256
- nobody anything. */
416
+ component's real value. A dropdown containing a renderer's name tells nobody
417
+ anything. */
257
418
  .hk-gallery {
258
419
  display: grid;
259
420
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
@@ -271,6 +432,9 @@
271
432
  cursor: pointer;
272
433
  text-align: left;
273
434
  }
435
+ .hk-sample:hover {
436
+ border-color: var(--accent);
437
+ }
274
438
  .hk-sample-on {
275
439
  border-color: var(--accent);
276
440
  background: var(--bg-raised);
@@ -281,15 +445,24 @@
281
445
  color: var(--fg-dim);
282
446
  }
283
447
 
448
+ /* A control, its name, and the sentence that says what it does. The sentence is
449
+ why this is a two-line left column rather than a label. */
284
450
  .hk-field {
285
451
  display: grid;
286
- grid-template-columns: 110px 1fr;
287
- gap: 10px;
288
- align-items: center;
452
+ grid-template-columns: 190px 1fr;
453
+ gap: 12px;
454
+ align-items: start;
455
+ padding: 5px 0;
456
+ }
457
+ .hk-field-left {
458
+ display: flex;
459
+ flex-direction: column;
460
+ gap: 2px;
289
461
  }
290
462
  .hk-field-name {
291
463
  font-size: 12px;
292
- color: var(--fg-dim);
464
+ font-weight: 600;
465
+ color: var(--fg);
293
466
  }
294
467
  .hk-picks {
295
468
  display: flex;
@@ -306,6 +479,9 @@
306
479
  color: var(--fg-dim);
307
480
  cursor: pointer;
308
481
  }
482
+ .hk-pick:hover {
483
+ border-color: var(--accent);
484
+ }
309
485
  .hk-pick-on {
310
486
  border-color: var(--accent);
311
487
  color: var(--fg);
@@ -323,30 +499,33 @@
323
499
  font-size: 12px;
324
500
  }
325
501
 
326
- /* ── the palette ───────────────────────────────────────────────────────── */
502
+ /* ── the reference list ────────────────────────────────────────────────── */
327
503
  .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
504
  min-width: 180px;
335
505
  }
336
- /* A row's child count changes with its state — a refused row carries a reason
337
- and no buttons — so it is a flex column, not a grid with declared columns. */
506
+ /* A row's child count changes with its state — a refused row carries a reason
507
+ so it is a flex column, not a grid with declared columns. */
338
508
  .hk-prow {
339
509
  display: flex;
340
- flex-wrap: wrap;
510
+ flex-direction: column;
511
+ gap: 4px;
512
+ padding: 9px 0;
513
+ border-bottom: 1px solid var(--line);
514
+ }
515
+ .hk-prow-head {
516
+ display: flex;
341
517
  align-items: center;
342
518
  gap: 10px;
343
- padding: 7px 0;
344
- border-bottom: 1px solid var(--line);
519
+ flex-wrap: wrap;
345
520
  }
346
521
  .hk-prow-id {
347
522
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
348
523
  font-size: 12px;
349
- min-width: 150px;
524
+ }
525
+ .hk-prow-desc {
526
+ font-size: 12px;
527
+ line-height: 1.5;
528
+ color: var(--fg-dim);
350
529
  }
351
530
  .hk-prow-why {
352
531
  flex-basis: 100%;
@@ -365,6 +544,43 @@
365
544
  align-items: center;
366
545
  }
367
546
 
547
+ /* ── the colour set picker ─────────────────────────────────────────────── */
548
+ /* Each option carries the CLI's own sentence about what it is FOR, so it is a
549
+ card and not a word in a row of words. */
550
+ .hk-theme-list {
551
+ display: flex;
552
+ flex-wrap: wrap;
553
+ gap: 8px;
554
+ }
555
+ .hk-theme {
556
+ display: flex;
557
+ flex-direction: column;
558
+ align-items: flex-start;
559
+ gap: 3px;
560
+ flex: 1 1 220px;
561
+ max-width: 320px;
562
+ padding: 8px 10px;
563
+ border: 1px solid var(--line);
564
+ border-radius: 8px;
565
+ background: var(--bg-sunken);
566
+ cursor: pointer;
567
+ text-align: left;
568
+ color: inherit;
569
+ }
570
+ .hk-theme:hover {
571
+ border-color: var(--accent);
572
+ }
573
+ .hk-theme-on {
574
+ border-color: var(--accent);
575
+ background: var(--bg-raised);
576
+ }
577
+ .hk-theme-name {
578
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
579
+ font-size: 12px;
580
+ font-weight: 600;
581
+ color: var(--fg);
582
+ }
583
+
368
584
  /* A number field is a NUMBER field: wide enough for three digits and its
369
585
  spinner, and no wider. A 200px box for a value between 0 and 8 reads as a
370
586
  free-text field somebody has to think about. */