vintage-frames 0.10.1 → 0.12.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.
@@ -3,36 +3,31 @@ import { vfElement as n } from "../define.js";
3
3
  import { ScaleController as r, sys as i } from "../scale.js";
4
4
  import a from "../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.js";
5
5
  import { VfPositioned as o } from "../position.js";
6
- import { vfDisplay as s } from "../styles/recipes/display-face.js";
7
- import { vfBase as c } from "../styles/recipes/host.js";
8
- import { vfPanel as l } from "../styles/recipes/surface.js";
9
- import { vfFocusUnderline as u } from "../styles/recipes/focus.js";
10
- import { GridSnapController as d } from "../grid-snap.js";
11
- import { DocumentListenersController as f } from "../document-listeners.js";
12
- import { runSelectionBlink as p } from "../motion.js";
13
- import { CARET_DOWN as m, CARET_UP as h, glyphSvg as g } from "../glyphs.js";
14
- import { VfShadowRoleControl as _ } from "../form-control.js";
15
- import { FocusRuleController as v } from "../focus-modality.js";
16
- import { VfOption as y } from "./vf-option.js";
17
- import { clampScroll as b, ensureVisibleScroll as x, firstPickableRow as S, lastPickableRow as C, layoutClampedPopup as w } from "../popup-overflow.js";
18
- import { TypeAheadBuffer as T } from "../type-ahead.js";
19
- import { css as E, html as D, nothing as O } from "lit";
20
- import { property as k, query as A, queryAssignedElements as j, state as M } from "lit/decorators.js";
21
- import { classMap as N } from "lit/directives/class-map.js";
6
+ import { vfBodyDecls as s } from "../styles/recipes/body-face.js";
7
+ import { vfDisplay as c } from "../styles/recipes/display-face.js";
8
+ import { vfBase as l } from "../styles/recipes/host.js";
9
+ import { vfPanel as u } from "../styles/recipes/surface.js";
10
+ import { vfFocusUnderline as d } from "../styles/recipes/focus.js";
11
+ import { GridSnapController as f } from "../grid-snap.js";
12
+ import { DocumentListenersController as p } from "../document-listeners.js";
13
+ import { runSelectionBlink as m } from "../motion.js";
14
+ import { CARET_DOWN as h, CARET_DOWN_SMALL as g, CARET_UP as _, CARET_UP_SMALL as v, glyphSvg as y } from "../glyphs.js";
15
+ import { VfShadowRoleControl as b } from "../form-control.js";
16
+ import { FocusRuleController as x } from "../focus-modality.js";
17
+ import { VfOption as S } from "./vf-option.js";
18
+ import { clampScroll as C, ensureVisibleScroll as w, firstPickableRow as T, lastPickableRow as E, layoutClampedPopup as D } from "../popup-overflow.js";
19
+ import { TypeAheadBuffer as O } from "../type-ahead.js";
20
+ import { css as k, html as A, nothing as j } from "lit";
21
+ import { property as M, query as N, queryAssignedElements as P, state as F } from "lit/decorators.js";
22
+ import { classMap as I } from "lit/directives/class-map.js";
22
23
  //#region src/components/vf-select.ts
23
- var P, F = class extends o(_) {
24
- static {
25
- P = this;
26
- }
27
- static {
28
- this.ITEM_HEIGHT = 16;
29
- }
24
+ var L = class extends o(b) {
30
25
  static {
31
26
  this.styles = [
32
- c,
33
- s,
34
27
  l,
35
- E`
28
+ c,
29
+ u,
30
+ k`
36
31
  :host {
37
32
  /* A popup menu is sized to its widest option — never stretched to fill
38
33
  its container. fit-content holds that intrinsic width even inside a
@@ -42,6 +37,14 @@ var P, F = class extends o(_) {
42
37
  display: inline-block;
43
38
  width: fit-content;
44
39
  }
40
+ /* The small pill restates the height token on the host, so the pill, the
41
+ arrow slots and the slotted options (which inherit it) all derive from
42
+ the one small height. A --vf-popup-height set on the element itself
43
+ still wins over :host. */
44
+ :host([size='small']) {
45
+ --vf-popup-height: var(--vf-popup-height-small, 12px);
46
+ ${s}
47
+ }
45
48
  .control {
46
49
  /* Also the anchor the focus rule below hangs from. */
47
50
  position: relative;
@@ -96,7 +99,7 @@ var P, F = class extends o(_) {
96
99
  }
97
100
  .control.vf-focus-rule::after {
98
101
  --vf-focus-underline-offset: -4px;
99
- ${u}
102
+ ${d}
100
103
  left: calc(var(--vf-scale, 1) * -1px);
101
104
  right: calc(var(--vf-scale, 1) * -1px);
102
105
  }
@@ -121,6 +124,23 @@ var P, F = class extends o(_) {
121
124
  overflow: hidden;
122
125
  text-overflow: ellipsis;
123
126
  }
127
+ /* A line box as tall as the small pill's content (10 rows) centers the
128
+ body face's 16px em with 9 rows above the baseline and 1 below, which
129
+ puts the second descender row on the border. An 8px line box leaves 8
130
+ above and 2 below for the descenders.
131
+
132
+ The em's 4px descent reaches 2 rows past those 2, and this box is a
133
+ scroll container (overflow: hidden, for the ellipsis): with the clip
134
+ ending at the content's last row, that inkless spill is 2px of
135
+ scrollable overflow a find-in-page could scroll. So the padding covers
136
+ all 4 rows below the baseline, and the negative margin hands the extra
137
+ 2 back to layout. The clip now ends 2 rows below the content, on the
138
+ border and the shadow, where the face draws nothing. */
139
+ :host([size='small']) .value {
140
+ line-height: calc(var(--vf-scale, 1) * (var(--vf-popup-height, 12px) - 4px));
141
+ padding-bottom: calc(var(--vf-scale, 1) * 4px);
142
+ margin-bottom: calc(var(--vf-scale, 1) * -2px);
143
+ }
124
144
  /* Sizer contributes width only: collapsed to zero height and clipped so it
125
145
  never adds a row, but its widest line still drives the grid cell width. */
126
146
  .sizer {
@@ -143,6 +163,17 @@ var P, F = class extends o(_) {
143
163
  width: calc(var(--vf-scale, 1) * 11px);
144
164
  height: calc(var(--vf-scale, 1) * 6px);
145
165
  }
166
+ /* The small ▼ is 5 rows tall, which centers on a half row, so it is
167
+ pinned 3 rows down the 10-row content: 3 blank rows above it, 2 below,
168
+ its middle row on the middle row of the x-height (rows 3–7). */
169
+ :host([size='small']) .arrow {
170
+ align-self: flex-start;
171
+ padding-top: calc(var(--vf-scale, 1) * 3px);
172
+ }
173
+ :host([size='small']) .arrow svg {
174
+ width: calc(var(--vf-scale, 1) * 9px);
175
+ height: calc(var(--vf-scale, 1) * 5px);
176
+ }
146
177
  /* Disabled: only the value label dims; the box, hard shadow and ▼ arrow
147
178
  stay solid black (System 7 dims the label, not the control). */
148
179
  :host([disabled]) .label,
@@ -226,6 +257,14 @@ var P, F = class extends o(_) {
226
257
  width: calc(var(--vf-scale, 1) * 11px);
227
258
  height: calc(var(--vf-scale, 1) * 6px);
228
259
  }
260
+ /* The small caret in a 10px slot: 2 rows above it, 3 below (5 rows can't
261
+ center), and 14 in, which keeps the regular caret's center column. */
262
+ :host([size='small']) .arrow-slot svg {
263
+ left: calc(var(--vf-scale, 1) * 14px);
264
+ top: calc(var(--vf-scale, 1) * 2px);
265
+ width: calc(var(--vf-scale, 1) * 9px);
266
+ height: calc(var(--vf-scale, 1) * 5px);
267
+ }
229
268
  `
230
269
  ];
231
270
  }
@@ -242,7 +281,7 @@ var P, F = class extends o(_) {
242
281
  return this.rowScroll < this.optionItems.length - this.visibleSlots;
243
282
  }
244
283
  constructor() {
245
- super(), this.value = "", this.name = "", this.label = "", this.open = !1, this.cachedOptions = [], this.scale = new r(this), this.gridSnap = new d(this), this.focusRule = new v(this), this.panelListeners = new f(this, () => [
284
+ super(), this.value = "", this.name = "", this.size = "regular", this.label = "", this.open = !1, this.cachedOptions = [], this.scale = new r(this), this.gridSnap = new f(this), this.focusRule = new x(this), this.panelListeners = new p(this, () => [
246
285
  [
247
286
  document,
248
287
  "pointerdown",
@@ -260,7 +299,7 @@ var P, F = class extends o(_) {
260
299
  "resize",
261
300
  this.handleWindowResize
262
301
  ]
263
- ]), this.pressListeners = new f(this, () => [
302
+ ]), this.pressListeners = new p(this, () => [
264
303
  [
265
304
  document,
266
305
  "pointermove",
@@ -279,8 +318,8 @@ var P, F = class extends o(_) {
279
318
  this.handlePressCancel,
280
319
  !0
281
320
  ]
282
- ]), this.activeIndex = -1, this.rowScroll = 0, this.visibleSlots = 0, this.rowHeight = 0, this.arrowScroll = null, this.pressStartArrow = null, this.pressing = !1, this.pressOpenedPanel = !1, this.pressMoved = !1, this.pressStartOption = null, this.pressDownTime = 0, this.pressDownX = 0, this.pressDownY = 0, this.swallowClick = !1, this.blinking = !1, this.typeAhead = new T(), this.handleSlotChange = () => {
283
- if (this.cachedOptions = this.assignedOptions ?? [], this.value === "") {
321
+ ]), this.activeIndex = -1, this.rowScroll = 0, this.visibleSlots = 0, this.rowHeight = 0, this.arrowScroll = null, this.pressStartArrow = null, this.pressing = !1, this.pressOpenedPanel = !1, this.pressMoved = !1, this.pressStartOption = null, this.pressDownTime = 0, this.pressDownX = 0, this.pressDownY = 0, this.swallowClick = !1, this.blinking = !1, this.typeAhead = new O(), this.handleSlotChange = () => {
322
+ if (this.cachedOptions = this.assignedOptions ?? [], this.applySize(), this.value === "") {
284
323
  let e = this.optionItems.find((e) => !e.disabled);
285
324
  e && (this.value = this.optionValue(e));
286
325
  }
@@ -407,7 +446,7 @@ var P, F = class extends o(_) {
407
446
  this.controlEl?.focus(e);
408
447
  }
409
448
  updated(e) {
410
- e.has("value") && this.applySelection(), (e.has("value") || e.has("disabled")) && this.syncFormValue(this.value), e.has("disabled") && this.disabled && this.open && this.closePanel(!1);
449
+ e.has("value") && this.applySelection(), (e.has("value") || e.has("disabled")) && this.syncFormValue(this.value), e.has("disabled") && this.disabled && this.open && this.closePanel(!1), e.has("size") && (this.applySize(), this.open && this.closePanel(!1));
411
450
  }
412
451
  formDisabledCallback(e) {
413
452
  super.formDisabledCallback(e), this.syncFormValue(this.value), e && this.open && this.closePanel(!1);
@@ -424,6 +463,10 @@ var P, F = class extends o(_) {
424
463
  applySelection() {
425
464
  for (let e of this.optionItems) e.selected = this.optionValue(e) === this.value;
426
465
  }
466
+ applySize() {
467
+ let e = this.size === "small" ? "small" : "regular";
468
+ for (let t of this.optionItems) t.size = e;
469
+ }
427
470
  async openPanel() {
428
471
  if (this.open || this.isDisabled) return;
429
472
  this.open = !0, this.panelListeners.attach(), await this.updateComplete;
@@ -433,15 +476,15 @@ var P, F = class extends o(_) {
433
476
  positionPanel(e) {
434
477
  let t = this.controlEl, n = this.panelEl;
435
478
  if (!t || !n) return;
436
- let r = t.getBoundingClientRect(), a = this.optionItems[0]?.getBoundingClientRect()?.height || i(P.ITEM_HEIGHT, this), o = getComputedStyle(n), s = parseFloat(o.borderTopWidth) || 0, c = (e) => i(parseFloat(o.getPropertyValue(e)) || 0, this), l = w({
437
- idealTop: r.top - e * a,
438
- rowHeight: a,
439
- border: s,
479
+ let r = t.getBoundingClientRect(), a = getComputedStyle(n), o = parseFloat(a.borderTopWidth) || 0, s = this.optionItems[0]?.getBoundingClientRect()?.height || r.height - 2 * o, c = (e) => i(parseFloat(a.getPropertyValue(e)) || 0, this), l = D({
480
+ idealTop: r.top - e * s,
481
+ rowHeight: s,
482
+ border: o,
440
483
  rowCount: this.optionItems.length,
441
484
  viewTop: c("--vf-popup-clamp-top"),
442
485
  viewBottom: window.innerHeight - c("--vf-popup-clamp-bottom")
443
486
  }), u = r.left;
444
- n.style.minWidth = `${r.width}px`, n.style.top = `${l.panelTop}px`, n.style.left = `${u}px`, n.style.height = `${l.panelHeight}px`, this.rowHeight = a, this.visibleSlots = l.visibleSlots, this.rowScroll = l.initialScroll, this.applyScroll();
487
+ n.style.minWidth = `${r.width}px`, n.style.top = `${l.panelTop}px`, n.style.left = `${u}px`, n.style.height = `${l.panelHeight}px`, this.rowHeight = s, this.visibleSlots = l.visibleSlots, this.rowScroll = l.initialScroll, this.applyScroll();
445
488
  }
446
489
  closePanel(e) {
447
490
  this.open && (this.open = !1, this.cancelBlink(), this.stopArrowScroll(), this.endPress(), this.clearActive(), this.typeAhead.reset(), this.panelListeners.detach(), e && this.controlEl?.focus());
@@ -451,11 +494,11 @@ var P, F = class extends o(_) {
451
494
  this.rowsEl && (this.rowsEl.style.transform = e ? `translateY(${-e}px)` : ""), this.upArrowEl?.classList.toggle("shown", this.showUpArrow), this.downArrowEl?.classList.toggle("shown", this.showDownArrow);
452
495
  }
453
496
  revealRow(e) {
454
- let t = x(e, this.rowScroll, this.optionItems.length, this.visibleSlots);
497
+ let t = w(e, this.rowScroll, this.optionItems.length, this.visibleSlots);
455
498
  t !== this.rowScroll && (this.rowScroll = t, this.applyScroll());
456
499
  }
457
500
  stepArrowScroll(e) {
458
- let t = b(this.rowScroll + e, this.rowScroll, this.optionItems.length, this.visibleSlots);
501
+ let t = C(this.rowScroll + e, this.rowScroll, this.optionItems.length, this.visibleSlots);
459
502
  return t !== this.rowScroll && (this.rowScroll = t, this.applyScroll(), !0);
460
503
  }
461
504
  startArrowScroll(e) {
@@ -531,7 +574,7 @@ var P, F = class extends o(_) {
531
574
  if (e.disabled || this.blinking) return;
532
575
  let t = this.optionItems.indexOf(e);
533
576
  this.setActive(t, !1), this.blinking = !0;
534
- let n = p((t) => {
577
+ let n = m((t) => {
535
578
  e.active = t;
536
579
  }, () => {
537
580
  this.commit(e);
@@ -547,7 +590,7 @@ var P, F = class extends o(_) {
547
590
  this.value = r, e(this, "vf-change", { value: r }), t(this, "input"), t(this, "change");
548
591
  }
549
592
  optionFromEvent(e) {
550
- return e.composedPath().find((e) => e instanceof y);
593
+ return e.composedPath().find((e) => e instanceof S);
551
594
  }
552
595
  endPress() {
553
596
  this.pressing && (this.pressing = !1, this.pressStartOption = null, this.pressStartArrow = null, this.pressListeners.detach());
@@ -557,7 +600,7 @@ var P, F = class extends o(_) {
557
600
  if (!this.open || !n) return null;
558
601
  let r = n.getBoundingClientRect();
559
602
  if (e < r.left || e >= r.right || t < r.top || t >= r.bottom) return null;
560
- let i = S(this.rowScroll), a = C(this.rowScroll, this.optionItems.length, this.visibleSlots);
603
+ let i = T(this.rowScroll), a = E(this.rowScroll, this.optionItems.length, this.visibleSlots);
561
604
  for (let n = i; n <= a; n += 1) {
562
605
  let r = this.optionItems[n];
563
606
  if (!r) continue;
@@ -580,10 +623,10 @@ var P, F = class extends o(_) {
580
623
  this.selectOption(e);
581
624
  }
582
625
  render() {
583
- let e = this.optionItems.find((e) => this.optionValue(e) === this.value), t = e ? (e.textContent ?? "").trim() : "", n = this.isDisabled;
584
- return D`
626
+ let e = this.optionItems.find((e) => this.optionValue(e) === this.value), t = e ? (e.textContent ?? "").trim() : "", n = this.isDisabled, r = this.size === "small", i = r ? g : h, a = r ? v : _;
627
+ return A`
585
628
  <div
586
- class=${N({
629
+ class=${I({
587
630
  control: !0,
588
631
  "vf-snap": !0,
589
632
  "vf-focus-rule": this.focusRule.marked && !this.open,
@@ -595,20 +638,20 @@ var P, F = class extends o(_) {
595
638
  aria-expanded=${this.open ? "true" : "false"}
596
639
  aria-disabled=${n ? "true" : "false"}
597
640
  aria-controls="listbox"
598
- aria-label=${this.label || this.hostLabel || O}
641
+ aria-label=${this.label || this.hostLabel || j}
599
642
  aria-describedby=${this.describedBy}
600
- aria-required=${this.required ? "true" : O}
601
- aria-invalid=${this.validity.valid ? O : "true"}
643
+ aria-required=${this.required ? "true" : j}
644
+ aria-invalid=${this.validity.valid ? j : "true"}
602
645
  tabindex=${n ? "-1" : "0"}
603
646
  >
604
647
  <span class="label" part="label">
605
648
  <span class="value">${t}</span>
606
649
  <span class="sizer" aria-hidden="true">
607
- ${this.optionItems.map((e) => D`<span>${(e.textContent ?? "").trim()}</span>`)}
650
+ ${this.optionItems.map((e) => A`<span>${(e.textContent ?? "").trim()}</span>`)}
608
651
  </span>
609
652
  </span>
610
653
  <span class="arrow" part="arrow" aria-hidden="true"
611
- >${g(m, "caret")}</span
654
+ >${y(i, "caret")}</span
612
655
  >
613
656
  </div>
614
657
  <div
@@ -616,7 +659,7 @@ var P, F = class extends o(_) {
616
659
  class="panel vf-panel ${this.open ? "open" : ""}"
617
660
  part="panel"
618
661
  role="listbox"
619
- aria-label=${this.label || this.hostLabel || O}
662
+ aria-label=${this.label || this.hostLabel || j}
620
663
  aria-hidden=${this.open ? "false" : "true"}
621
664
  >
622
665
  <!-- role="presentation" so the strip that carries the roll doesn't
@@ -636,7 +679,7 @@ var P, F = class extends o(_) {
636
679
  @pointermove=${this.handleArrowEnter}
637
680
  @pointerleave=${this.handleArrowLeave}
638
681
  >
639
- ${g(h, "caret")}
682
+ ${y(a, "caret")}
640
683
  </div>
641
684
  <div
642
685
  class="arrow-slot down"
@@ -646,13 +689,13 @@ var P, F = class extends o(_) {
646
689
  @pointermove=${this.handleArrowEnter}
647
690
  @pointerleave=${this.handleArrowLeave}
648
691
  >
649
- ${g(m, "caret")}
692
+ ${y(i, "caret")}
650
693
  </div>
651
694
  </div>
652
695
  ${this.renderDescription()}
653
696
  `;
654
697
  }
655
698
  };
656
- a([k()], F.prototype, "value", void 0), a([k({ reflect: !0 })], F.prototype, "name", void 0), a([k()], F.prototype, "label", void 0), a([M()], F.prototype, "open", void 0), a([A(".control")], F.prototype, "controlEl", void 0), a([A(".panel")], F.prototype, "panelEl", void 0), a([A(".rows")], F.prototype, "rowsEl", void 0), a([A(".arrow-slot.up")], F.prototype, "upArrowEl", void 0), a([A(".arrow-slot.down")], F.prototype, "downArrowEl", void 0), a([j({ selector: "vf-option" })], F.prototype, "assignedOptions", void 0), a([M()], F.prototype, "cachedOptions", void 0), F = P = a([n("vf-select")], F);
699
+ a([M()], L.prototype, "value", void 0), a([M({ reflect: !0 })], L.prototype, "name", void 0), a([M({ reflect: !0 })], L.prototype, "size", void 0), a([M()], L.prototype, "label", void 0), a([F()], L.prototype, "open", void 0), a([N(".control")], L.prototype, "controlEl", void 0), a([N(".panel")], L.prototype, "panelEl", void 0), a([N(".rows")], L.prototype, "rowsEl", void 0), a([N(".arrow-slot.up")], L.prototype, "upArrowEl", void 0), a([N(".arrow-slot.down")], L.prototype, "downArrowEl", void 0), a([P({ selector: "vf-option" })], L.prototype, "assignedOptions", void 0), a([F()], L.prototype, "cachedOptions", void 0), L = a([n("vf-select")], L);
657
700
  //#endregion
658
- export { F as VfSelect };
701
+ export { L as VfSelect };
package/dist/glyphs.d.ts CHANGED
@@ -54,6 +54,14 @@ export declare const CARET_DOWN: Glyph;
54
54
  * retrace both. Same synthesis convention as {@link STEPPER_UP_FILL}.
55
55
  */
56
56
  export declare const CARET_UP: Glyph;
57
+ /**
58
+ * The small popup's ▼ (`vf-select size="small"`) — {@link CARET_DOWN} without
59
+ * its widest row: the same staircase, 9×5. Also the small panel's bottom
60
+ * scroll arrow, as the regular caret is the regular panel's.
61
+ */
62
+ export declare const CARET_DOWN_SMALL: Glyph;
63
+ /** {@link CARET_DOWN_SMALL} mirrored vertically: the small panel's top scroll arrow. */
64
+ export declare const CARET_UP_SMALL: Glyph;
57
65
  /**
58
66
  * The "little arrows" stepper at rest — a rounded 1-bit frame enclosing hollow
59
67
  * up/down arrows (`Little arrows.png`), used by `vf-number-field`.
package/dist/glyphs.js CHANGED
@@ -33,59 +33,67 @@ var t = {
33
33
  h: 6,
34
34
  d: "M5 0h1v1h-1zM4 1h3v1h-3zM3 2h5v1h-5zM2 3h7v1h-7zM1 4h9v1h-9zM0 5h11v1h-11z"
35
35
  }, l = {
36
+ w: 9,
37
+ h: 5,
38
+ d: "M0 0h9v1h-9zM1 1h7v1h-7zM2 2h5v1h-5zM3 3h3v1h-3zM4 4h1v1h-1z"
39
+ }, u = {
40
+ w: 9,
41
+ h: 5,
42
+ d: "M4 0h1v1h-1zM3 1h3v1h-3zM2 2h5v1h-5zM1 3h7v1h-7zM0 4h9v1h-9z"
43
+ }, d = {
36
44
  w: 15,
37
45
  h: 25,
38
46
  d: "M2 0h11v1h-11zM1 1h1v1h-1zM13 1h1v1h-1zM0 2h1v1h-1zM14 2h1v1h-1zM0 3h1v1h-1zM7 3h1v1h-1zM14 3h1v1h-1zM0 4h1v1h-1zM6 4h1v1h-1zM8 4h1v1h-1zM14 4h1v1h-1zM0 5h1v1h-1zM5 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM0 6h1v1h-1zM4 6h1v1h-1zM10 6h1v1h-1zM14 6h1v1h-1zM0 7h1v1h-1zM3 7h3v1h-3zM9 7h3v1h-3zM14 7h1v1h-1zM0 8h1v1h-1zM5 8h1v1h-1zM9 8h1v1h-1zM14 8h1v1h-1zM0 9h1v1h-1zM5 9h1v1h-1zM9 9h1v1h-1zM14 9h1v1h-1zM0 10h1v1h-1zM5 10h5v1h-5zM14 10h1v1h-1zM0 11h1v1h-1zM14 11h1v1h-1zM0 12h1v1h-1zM14 12h1v1h-1zM0 13h1v1h-1zM14 13h1v1h-1zM0 14h1v1h-1zM5 14h5v1h-5zM14 14h1v1h-1zM0 15h1v1h-1zM5 15h1v1h-1zM9 15h1v1h-1zM14 15h1v1h-1zM0 16h1v1h-1zM5 16h1v1h-1zM9 16h1v1h-1zM14 16h1v1h-1zM0 17h1v1h-1zM3 17h3v1h-3zM9 17h3v1h-3zM14 17h1v1h-1zM0 18h1v1h-1zM4 18h1v1h-1zM10 18h1v1h-1zM14 18h1v1h-1zM0 19h1v1h-1zM5 19h1v1h-1zM9 19h1v1h-1zM14 19h1v1h-1zM0 20h1v1h-1zM6 20h1v1h-1zM8 20h1v1h-1zM14 20h1v1h-1zM0 21h1v1h-1zM7 21h1v1h-1zM14 21h1v1h-1zM0 22h1v1h-1zM14 22h1v1h-1zM1 23h1v1h-1zM13 23h1v1h-1zM2 24h11v1h-11z"
39
- }, u = {
47
+ }, f = {
40
48
  w: 11,
41
49
  h: 12,
42
50
  d: "M1 0h9v1h-9zM0 1h1v1h-1zM10 1h1v1h-1zM0 2h1v1h-1zM10 2h1v1h-1zM0 3h1v1h-1zM3 3h1v1h-1zM5 3h1v1h-1zM7 3h1v1h-1zM10 3h1v1h-1zM0 4h1v1h-1zM3 4h1v1h-1zM5 4h1v1h-1zM7 4h1v1h-1zM10 4h1v1h-1zM0 5h1v1h-1zM3 5h1v1h-1zM5 5h1v1h-1zM7 5h1v1h-1zM10 5h1v1h-1zM0 6h1v1h-1zM3 6h1v1h-1zM5 6h1v1h-1zM7 6h1v1h-1zM10 6h1v1h-1zM0 7h1v1h-1zM3 7h1v1h-1zM5 7h1v1h-1zM7 7h1v1h-1zM10 7h1v1h-1zM1 8h1v1h-1zM9 8h1v1h-1zM2 9h1v1h-1zM8 9h1v1h-1zM3 10h1v1h-1zM7 10h1v1h-1zM4 11h3v1h-3z"
43
- }, d = {
51
+ }, p = {
44
52
  w: 11,
45
53
  h: 12,
46
54
  d: "M1 0h9v1h-9zM0 1h11v1h-11zM0 2h11v1h-11zM0 3h11v1h-11zM0 4h11v1h-11zM0 5h11v1h-11zM0 6h11v1h-11zM0 7h11v1h-11zM1 8h9v1h-9zM2 9h7v1h-7zM3 10h5v1h-5zM4 11h3v1h-3z"
47
- }, f = {
55
+ }, m = {
48
56
  w: 15,
49
57
  h: 25,
50
58
  d: "M7 3h1v1h-1zM6 4h3v1h-3zM5 5h5v1h-5zM4 6h7v1h-7zM3 7h9v1h-9zM5 8h5v1h-5zM5 9h5v1h-5zM5 10h5v1h-5z"
51
- }, p = {
59
+ }, h = {
52
60
  w: 15,
53
61
  h: 25,
54
62
  d: "M5 14h5v1h-5zM5 15h5v1h-5zM5 16h5v1h-5zM3 17h9v1h-9zM4 18h7v1h-7zM5 19h5v1h-5zM6 20h3v1h-3zM7 21h1v1h-1z"
55
- }, m = {
63
+ }, g = {
56
64
  w: 16,
57
65
  h: 16,
58
66
  d: "M7 3h2v1h-2zM6 4h1v1h-1zM9 4h1v1h-1zM5 5h1v1h-1zM10 5h1v1h-1zM4 6h1v1h-1zM11 6h1v1h-1zM3 7h1v1h-1zM12 7h1v1h-1zM2 8h4v1h-4zM10 8h4v1h-4zM5 9h1v1h-1zM10 9h1v1h-1zM5 10h1v1h-1zM10 10h1v1h-1zM5 11h1v1h-1zM10 11h1v1h-1zM5 12h6v1h-6z"
59
- }, h = {
67
+ }, _ = {
60
68
  w: 16,
61
69
  h: 16,
62
70
  d: "M7 3h2v1h-2zM6 4h4v1h-4zM5 5h6v1h-6zM4 6h8v1h-8zM3 7h10v1h-10zM2 8h12v1h-12zM5 9h6v1h-6zM5 10h6v1h-6zM5 11h6v1h-6zM5 12h6v1h-6z"
63
- }, g = {
71
+ }, v = {
64
72
  w: 16,
65
73
  h: 16,
66
74
  d: "M5 3h6v1h-6zM5 4h1v1h-1zM10 4h1v1h-1zM5 5h1v1h-1zM10 5h1v1h-1zM5 6h1v1h-1zM10 6h1v1h-1zM2 7h4v1h-4zM10 7h4v1h-4zM3 8h1v1h-1zM12 8h1v1h-1zM4 9h1v1h-1zM11 9h1v1h-1zM5 10h1v1h-1zM10 10h1v1h-1zM6 11h1v1h-1zM9 11h1v1h-1zM7 12h2v1h-2z"
67
- }, _ = {
75
+ }, y = {
68
76
  w: 16,
69
77
  h: 16,
70
78
  d: "M5 3h6v1h-6zM5 4h6v1h-6zM5 5h6v1h-6zM5 6h6v1h-6zM2 7h12v1h-12zM3 8h10v1h-10zM4 9h8v1h-8zM5 10h6v1h-6zM6 11h4v1h-4zM7 12h2v1h-2z"
71
- }, v = {
79
+ }, b = {
72
80
  w: 16,
73
81
  h: 16,
74
82
  d: "M8 2h1v1h-1zM7 3h2v1h-2zM6 4h1v1h-1zM8 4h1v1h-1zM5 5h1v1h-1zM8 5h5v1h-5zM4 6h1v1h-1zM12 6h1v1h-1zM3 7h1v1h-1zM12 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM4 9h1v1h-1zM12 9h1v1h-1zM5 10h1v1h-1zM8 10h5v1h-5zM6 11h1v1h-1zM8 11h1v1h-1zM7 12h2v1h-2zM8 13h1v1h-1z"
75
- }, y = {
83
+ }, x = {
76
84
  w: 16,
77
85
  h: 16,
78
86
  d: "M8 2h1v1h-1zM7 3h2v1h-2zM6 4h3v1h-3zM5 5h8v1h-8zM4 6h9v1h-9zM3 7h10v1h-10zM3 8h10v1h-10zM4 9h9v1h-9zM5 10h8v1h-8zM6 11h3v1h-3zM7 12h2v1h-2zM8 13h1v1h-1z"
79
- }, b = {
87
+ }, S = {
80
88
  w: 16,
81
89
  h: 16,
82
90
  d: "M7 2h1v1h-1zM7 3h2v1h-2zM7 4h1v1h-1zM9 4h1v1h-1zM3 5h5v1h-5zM10 5h1v1h-1zM3 6h1v1h-1zM11 6h1v1h-1zM3 7h1v1h-1zM12 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM11 9h1v1h-1zM3 10h5v1h-5zM10 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM7 12h2v1h-2zM7 13h1v1h-1z"
83
- }, x = {
91
+ }, C = {
84
92
  w: 16,
85
93
  h: 16,
86
94
  d: "M7 2h1v1h-1zM7 3h2v1h-2zM7 4h3v1h-3zM3 5h8v1h-8zM3 6h9v1h-9zM3 7h10v1h-10zM3 8h10v1h-10zM3 9h9v1h-9zM3 10h8v1h-8zM7 11h3v1h-3zM7 12h2v1h-2zM7 13h1v1h-1z"
87
95
  };
88
- function S(t, n) {
96
+ function w(t, n) {
89
97
  return e`<svg
90
98
  class=${n}
91
99
  viewBox="0 0 ${t.w} ${t.h}"
@@ -97,4 +105,4 @@ function S(t, n) {
97
105
  </svg>`;
98
106
  }
99
107
  //#endregion
100
- export { s as CARET_DOWN, c as CARET_UP, t as CHECKBOX_X, o as CHECKMARK, a as RADIO_DOT, n as RADIO_FACE, r as RADIO_RING, i as RADIO_RING_PRESSED, g as SCROLL_ARROW_DOWN, _ as SCROLL_ARROW_DOWN_FILL, v as SCROLL_ARROW_LEFT, y as SCROLL_ARROW_LEFT_FILL, b as SCROLL_ARROW_RIGHT, x as SCROLL_ARROW_RIGHT_FILL, m as SCROLL_ARROW_UP, h as SCROLL_ARROW_UP_FILL, u as SLIDER_THUMB, d as SLIDER_THUMB_FACE, l as STEPPER, p as STEPPER_DOWN_FILL, f as STEPPER_UP_FILL, S as glyphSvg };
108
+ export { s as CARET_DOWN, l as CARET_DOWN_SMALL, c as CARET_UP, u as CARET_UP_SMALL, t as CHECKBOX_X, o as CHECKMARK, a as RADIO_DOT, n as RADIO_FACE, r as RADIO_RING, i as RADIO_RING_PRESSED, v as SCROLL_ARROW_DOWN, y as SCROLL_ARROW_DOWN_FILL, b as SCROLL_ARROW_LEFT, x as SCROLL_ARROW_LEFT_FILL, S as SCROLL_ARROW_RIGHT, C as SCROLL_ARROW_RIGHT_FILL, g as SCROLL_ARROW_UP, _ as SCROLL_ARROW_UP_FILL, f as SLIDER_THUMB, p as SLIDER_THUMB_FACE, d as STEPPER, h as STEPPER_DOWN_FILL, m as STEPPER_UP_FILL, w as glyphSvg };
package/dist/index.d.ts CHANGED
@@ -24,6 +24,7 @@ export { VfTextField } from './components/vf-text-field.js';
24
24
  export { VfTextArea } from './components/vf-text-area.js';
25
25
  export { VfNumberField } from './components/vf-number-field.js';
26
26
  export { VfSelect } from './components/vf-select.js';
27
+ export type { VfSelectSize } from './components/vf-select.js';
27
28
  export { VfOption } from './components/vf-option.js';
28
29
  export { VfProgressBar } from './components/vf-progress-bar.js';
29
30
  export { VfSlider } from './components/vf-slider.js';
@@ -125,7 +126,7 @@ export type { Pattern, PatternMotif, PatternName } from './patterns.js';
125
126
  export { PatternFillController, vfPatternFill } from './pattern-fill.js';
126
127
  export type { PatternFillOptions } from './pattern-fill.js';
127
128
  /** Glyph sprites (`glyphSvg(CHECKMARK, 'check')`) and their pixel geometry. */
128
- export { glyphSvg, CHECKBOX_X, RADIO_FACE, RADIO_RING, RADIO_RING_PRESSED, RADIO_DOT, CHECKMARK, CARET_DOWN, STEPPER, STEPPER_UP_FILL, STEPPER_DOWN_FILL, SLIDER_THUMB, SLIDER_THUMB_FACE, } from './glyphs.js';
129
+ export { glyphSvg, CHECKBOX_X, RADIO_FACE, RADIO_RING, RADIO_RING_PRESSED, RADIO_DOT, CHECKMARK, CARET_DOWN, CARET_DOWN_SMALL, STEPPER, STEPPER_UP_FILL, STEPPER_DOWN_FILL, SLIDER_THUMB, SLIDER_THUMB_FACE, } from './glyphs.js';
129
130
  export type { Glyph } from './glyphs.js';
130
131
  /** Pixel-stepped corner profiles and the clip-paths traced from them. */
131
132
  export { steppedRectClip, steppedRingClip, steppedCornerClip, BUTTON_FRAME, BUTTON_FACE, RING_FRAME, RING_HOLE, RING_INSET, SCREEN_CORNER, } from './pixel-frame.js';
package/dist/index.js CHANGED
@@ -32,44 +32,44 @@ import { VfSized as Ie } from "./size.js";
32
32
  import { DragController as Le } from "./drag.js";
33
33
  import { ScrollStateController as Re } from "./scroll-state.js";
34
34
  import { BLINK_FLIPS as ze, BLINK_INTERVAL_MS as Be, PRESS_HOLD_MS as Ve, RENAME_DELAY_MS as He, WALK_BEAT_MS as Ue, WALK_STEP_MS as We, WALK_STEP_PX as Ge, prefersReducedMotion as Ke, runOutlineTravel as qe, runSelectionBlink as Je } from "./motion.js";
35
- import { CARET_DOWN as Ye, CHECKBOX_X as Xe, CHECKMARK as Ze, RADIO_DOT as Qe, RADIO_FACE as $e, RADIO_RING as et, RADIO_RING_PRESSED as tt, SLIDER_THUMB as nt, SLIDER_THUMB_FACE as rt, STEPPER as it, STEPPER_DOWN_FILL as at, STEPPER_UP_FILL as ot, glyphSvg as st } from "./glyphs.js";
36
- import { ScrollRailController as ct, renderScrollRail as lt } from "./scroll-rail.js";
37
- import { VfScrollArea as ut } from "./components/vf-scroll-area.js";
38
- import { VfWindow as dt } from "./components/vf-window.js";
39
- import { VfModalDialog as ft, modalDialogStyles as pt } from "./modal-dialog.js";
40
- import { VfDialog as mt } from "./components/vf-dialog.js";
41
- import { VfSeparator as ht } from "./components/vf-separator.js";
42
- import { VfFormControl as gt } from "./form-control.js";
43
- import { VfButton as _t } from "./components/vf-button.js";
44
- import { VfButtonGroup as vt } from "./components/vf-button-group.js";
45
- import { VfSwatch as yt } from "./components/vf-swatch.js";
46
- import { VfToggleControl as bt } from "./toggle-control.js";
47
- import { VfCheckbox as xt } from "./components/vf-checkbox.js";
48
- import { VfRadio as St } from "./components/vf-radio.js";
49
- import { VfRadioGroup as Ct } from "./components/vf-radio-group.js";
50
- import { FocusRuleController as wt, focusModality as Tt, trackFocusModality as Et } from "./focus-modality.js";
51
- import { VfTextControlBase as Dt } from "./text-control.js";
52
- import { VfTextField as Ot } from "./components/vf-text-field.js";
53
- import { VfTextArea as kt } from "./components/vf-text-area.js";
54
- import { VfNumberField as At } from "./components/vf-number-field.js";
55
- import { VfOption as jt } from "./components/vf-option.js";
56
- import { VfSelect as Mt } from "./components/vf-select.js";
57
- import { VfProgressBar as Nt } from "./components/vf-progress-bar.js";
58
- import { VfSlider as Pt } from "./components/vf-slider.js";
59
- import { VfLabel as Ft } from "./components/vf-label.js";
60
- import { VfParagraph as It } from "./components/vf-paragraph.js";
61
- import { VfImg as Lt } from "./components/vf-img.js";
62
- import { VfIcon as Rt } from "./components/vf-icon.js";
63
- import { VfIconField as zt } from "./components/vf-icon-field.js";
64
- import { VfMenuBar as Bt } from "./components/vf-menu-bar.js";
65
- import { VfMenu as Vt } from "./components/vf-menu.js";
66
- import { VfMenuItem as Ht } from "./components/vf-menu-item.js";
67
- import { VfList as Ut } from "./components/vf-list.js";
68
- import { VfListItem as Wt } from "./components/vf-list-item.js";
69
- import { VfFieldset as Gt } from "./components/vf-fieldset.js";
70
- import { VfGrid as Kt } from "./components/vf-grid.js";
71
- import { VfStack as qt } from "./components/vf-stack.js";
72
- import { VfContainer as Jt } from "./components/vf-container.js";
73
- import { CURSOR_ARROW as Yt, CURSOR_CROSSHAIR as Xt, CURSOR_I_BEAM as Zt, CURSOR_WAIT as Qt } from "./cursor-art.js";
74
- import { applyCursor as $t } from "./cursor.js";
75
- export { ze as BLINK_FLIPS, Be as BLINK_INTERVAL_MS, Ee as BUTTON_FACE, De as BUTTON_FRAME, Ye as CARET_DOWN, Xe as CHECKBOX_X, Ze as CHECKMARK, r as CLASSIC_DPI, i as CSS_REFERENCE_DPI, Yt as CURSOR_ARROW, Xt as CURSOR_CROSSHAIR, Zt as CURSOR_I_BEAM, Qt as CURSOR_WAIT, Te as DocumentListenersController, Le as DragController, wt as FocusRuleController, Ce as GridSnapController, G as PATTERNS, K as PATTERN_NAMES, q as PATTERN_SIZE, D as PIXEL_GRID_METRICS, Ve as PRESS_HOLD_MS, xe as PatternFillController, T as PlacementController, Qe as RADIO_DOT, $e as RADIO_FACE, et as RADIO_RING, tt as RADIO_RING_PRESSED, He as RENAME_DELAY_MS, Oe as RING_FRAME, ke as RING_HOLE, Ae as RING_INSET, ie as RULE_EDGES, je as SCREEN_CORNER, nt as SLIDER_THUMB, rt as SLIDER_THUMB_FACE, it as STEPPER, at as STEPPER_DOWN_FILL, ot as STEPPER_UP_FILL, a as SYSTEM_PX_IN_CSS_PX, d as ScaleController, ct as ScrollRailController, Re as ScrollStateController, R as TILE_LATTICE, ge as TileRasterCache, be as TrackWidthController, k as VF_BODY_FAMILY, M as VF_DISPLAY_FAMILY, _t as VfButton, vt as VfButtonGroup, xt as VfCheckbox, Jt as VfContainer, Fe as VfDesktop, mt as VfDialog, Gt as VfFieldset, gt as VfFormControl, Kt as VfGrid, Rt as VfIcon, zt as VfIconField, Lt as VfImg, Ft as VfLabel, Ut as VfList, Wt as VfListItem, Vt as VfMenu, Bt as VfMenuBar, Ht as VfMenuItem, ft as VfModalDialog, At as VfNumberField, jt as VfOption, It as VfParagraph, E as VfPositioned, Nt as VfProgressBar, St as VfRadio, Ct as VfRadioGroup, ut as VfScrollArea, Mt as VfSelect, ht as VfSeparator, Ie as VfSized, Pt as VfSlider, qt as VfStack, yt as VfSwatch, kt as VfTextArea, Dt as VfTextControlBase, Ot as VfTextField, bt as VfToggleControl, dt as VfWindow, Ue as WALK_BEAT_MS, We as WALK_STEP_MS, Ge as WALK_STEP_PX, $t as applyCursor, f as applyScale, t as defineElement, o as devicePxPerSystemPx, p as effectiveScale, e as emit, Tt as focusModality, m as getScale, s as getZoom, st as glyphSvg, pt as modalDialogStyles, h as onScaleChange, c as onZoomChange, J as parsePattern, ae as parseRule, Y as patternHex, X as patternMotif, _e as patternOverride, Z as patternRects, Ke as prefersReducedMotion, A as registerBodyFace, N as registerDisplayFace, O as registerEmbeddedFont, lt as renderScrollRail, we as requestGridSnap, l as resetZoomBaseline, oe as ruleClasses, qe as runOutlineTravel, Je as runSelectionBlink, g as snapSys, _ as snapToDevicePx, v as snapToSystemPx, Me as steppedCornerClip, Ne as steppedRectClip, Pe as steppedRingClip, y as sys, b as sysLength, x as sysLengths, S as systemPxQuantum, ve as tileGrid, z as tileImage, B as tileRaster, V as tileRects, H as tileSpan, C as toSys, w as toSysExact, Et as trackFocusModality, u as truePixelRatio, I as vfBase, j as vfBodyDecls, te as vfChromeFrame, P as vfDisplay, F as vfDisplayDecls, Q as vfDots, n as vfElement, me as vfField, ue as vfFocus, de as vfFocusRing, fe as vfFocusUnderline, ee as vfHardShadowDecls, ne as vfModalFrame, re as vfPanel, Se as vfPatternFill, se as vfRule, he as vfScrollRail, L as vfStaticText, $ as vfStripes, ye as vfTileGrid, U as vfTileMaskSize, W as vfTileSize, ce as vfTitleBar, pe as vfToggle, le as vfWindowWidgets };
35
+ import { CARET_DOWN as Ye, CARET_DOWN_SMALL as Xe, CHECKBOX_X as Ze, CHECKMARK as Qe, RADIO_DOT as $e, RADIO_FACE as et, RADIO_RING as tt, RADIO_RING_PRESSED as nt, SLIDER_THUMB as rt, SLIDER_THUMB_FACE as it, STEPPER as at, STEPPER_DOWN_FILL as ot, STEPPER_UP_FILL as st, glyphSvg as ct } from "./glyphs.js";
36
+ import { ScrollRailController as lt, renderScrollRail as ut } from "./scroll-rail.js";
37
+ import { VfScrollArea as dt } from "./components/vf-scroll-area.js";
38
+ import { VfWindow as ft } from "./components/vf-window.js";
39
+ import { VfModalDialog as pt, modalDialogStyles as mt } from "./modal-dialog.js";
40
+ import { VfDialog as ht } from "./components/vf-dialog.js";
41
+ import { VfSeparator as gt } from "./components/vf-separator.js";
42
+ import { VfFormControl as _t } from "./form-control.js";
43
+ import { VfButton as vt } from "./components/vf-button.js";
44
+ import { VfButtonGroup as yt } from "./components/vf-button-group.js";
45
+ import { VfSwatch as bt } from "./components/vf-swatch.js";
46
+ import { VfToggleControl as xt } from "./toggle-control.js";
47
+ import { VfCheckbox as St } from "./components/vf-checkbox.js";
48
+ import { VfRadio as Ct } from "./components/vf-radio.js";
49
+ import { VfRadioGroup as wt } from "./components/vf-radio-group.js";
50
+ import { FocusRuleController as Tt, focusModality as Et, trackFocusModality as Dt } from "./focus-modality.js";
51
+ import { VfTextControlBase as Ot } from "./text-control.js";
52
+ import { VfTextField as kt } from "./components/vf-text-field.js";
53
+ import { VfTextArea as At } from "./components/vf-text-area.js";
54
+ import { VfNumberField as jt } from "./components/vf-number-field.js";
55
+ import { VfOption as Mt } from "./components/vf-option.js";
56
+ import { VfSelect as Nt } from "./components/vf-select.js";
57
+ import { VfProgressBar as Pt } from "./components/vf-progress-bar.js";
58
+ import { VfSlider as Ft } from "./components/vf-slider.js";
59
+ import { VfLabel as It } from "./components/vf-label.js";
60
+ import { VfParagraph as Lt } from "./components/vf-paragraph.js";
61
+ import { VfImg as Rt } from "./components/vf-img.js";
62
+ import { VfIcon as zt } from "./components/vf-icon.js";
63
+ import { VfIconField as Bt } from "./components/vf-icon-field.js";
64
+ import { VfMenuBar as Vt } from "./components/vf-menu-bar.js";
65
+ import { VfMenu as Ht } from "./components/vf-menu.js";
66
+ import { VfMenuItem as Ut } from "./components/vf-menu-item.js";
67
+ import { VfList as Wt } from "./components/vf-list.js";
68
+ import { VfListItem as Gt } from "./components/vf-list-item.js";
69
+ import { VfFieldset as Kt } from "./components/vf-fieldset.js";
70
+ import { VfGrid as qt } from "./components/vf-grid.js";
71
+ import { VfStack as Jt } from "./components/vf-stack.js";
72
+ import { VfContainer as Yt } from "./components/vf-container.js";
73
+ import { CURSOR_ARROW as Xt, CURSOR_CROSSHAIR as Zt, CURSOR_I_BEAM as Qt, CURSOR_WAIT as $t } from "./cursor-art.js";
74
+ import { applyCursor as en } from "./cursor.js";
75
+ export { ze as BLINK_FLIPS, Be as BLINK_INTERVAL_MS, Ee as BUTTON_FACE, De as BUTTON_FRAME, Ye as CARET_DOWN, Xe as CARET_DOWN_SMALL, Ze as CHECKBOX_X, Qe as CHECKMARK, r as CLASSIC_DPI, i as CSS_REFERENCE_DPI, Xt as CURSOR_ARROW, Zt as CURSOR_CROSSHAIR, Qt as CURSOR_I_BEAM, $t as CURSOR_WAIT, Te as DocumentListenersController, Le as DragController, Tt as FocusRuleController, Ce as GridSnapController, G as PATTERNS, K as PATTERN_NAMES, q as PATTERN_SIZE, D as PIXEL_GRID_METRICS, Ve as PRESS_HOLD_MS, xe as PatternFillController, T as PlacementController, $e as RADIO_DOT, et as RADIO_FACE, tt as RADIO_RING, nt as RADIO_RING_PRESSED, He as RENAME_DELAY_MS, Oe as RING_FRAME, ke as RING_HOLE, Ae as RING_INSET, ie as RULE_EDGES, je as SCREEN_CORNER, rt as SLIDER_THUMB, it as SLIDER_THUMB_FACE, at as STEPPER, ot as STEPPER_DOWN_FILL, st as STEPPER_UP_FILL, a as SYSTEM_PX_IN_CSS_PX, d as ScaleController, lt as ScrollRailController, Re as ScrollStateController, R as TILE_LATTICE, ge as TileRasterCache, be as TrackWidthController, k as VF_BODY_FAMILY, M as VF_DISPLAY_FAMILY, vt as VfButton, yt as VfButtonGroup, St as VfCheckbox, Yt as VfContainer, Fe as VfDesktop, ht as VfDialog, Kt as VfFieldset, _t as VfFormControl, qt as VfGrid, zt as VfIcon, Bt as VfIconField, Rt as VfImg, It as VfLabel, Wt as VfList, Gt as VfListItem, Ht as VfMenu, Vt as VfMenuBar, Ut as VfMenuItem, pt as VfModalDialog, jt as VfNumberField, Mt as VfOption, Lt as VfParagraph, E as VfPositioned, Pt as VfProgressBar, Ct as VfRadio, wt as VfRadioGroup, dt as VfScrollArea, Nt as VfSelect, gt as VfSeparator, Ie as VfSized, Ft as VfSlider, Jt as VfStack, bt as VfSwatch, At as VfTextArea, Ot as VfTextControlBase, kt as VfTextField, xt as VfToggleControl, ft as VfWindow, Ue as WALK_BEAT_MS, We as WALK_STEP_MS, Ge as WALK_STEP_PX, en as applyCursor, f as applyScale, t as defineElement, o as devicePxPerSystemPx, p as effectiveScale, e as emit, Et as focusModality, m as getScale, s as getZoom, ct as glyphSvg, mt as modalDialogStyles, h as onScaleChange, c as onZoomChange, J as parsePattern, ae as parseRule, Y as patternHex, X as patternMotif, _e as patternOverride, Z as patternRects, Ke as prefersReducedMotion, A as registerBodyFace, N as registerDisplayFace, O as registerEmbeddedFont, ut as renderScrollRail, we as requestGridSnap, l as resetZoomBaseline, oe as ruleClasses, qe as runOutlineTravel, Je as runSelectionBlink, g as snapSys, _ as snapToDevicePx, v as snapToSystemPx, Me as steppedCornerClip, Ne as steppedRectClip, Pe as steppedRingClip, y as sys, b as sysLength, x as sysLengths, S as systemPxQuantum, ve as tileGrid, z as tileImage, B as tileRaster, V as tileRects, H as tileSpan, C as toSys, w as toSysExact, Dt as trackFocusModality, u as truePixelRatio, I as vfBase, j as vfBodyDecls, te as vfChromeFrame, P as vfDisplay, F as vfDisplayDecls, Q as vfDots, n as vfElement, me as vfField, ue as vfFocus, de as vfFocusRing, fe as vfFocusUnderline, ee as vfHardShadowDecls, ne as vfModalFrame, re as vfPanel, Se as vfPatternFill, se as vfRule, he as vfScrollRail, L as vfStaticText, $ as vfStripes, ye as vfTileGrid, U as vfTileMaskSize, W as vfTileSize, ce as vfTitleBar, pe as vfToggle, le as vfWindowWidgets };
@@ -69,7 +69,8 @@ export declare const RING_INSET = 4;
69
69
  /**
70
70
  * The screen-corner mask: per-row width (system px) of the black staircase a
71
71
  * compact Mac's ROM painted over the rounded corners of its CRT — what makes
72
- * the System 7 menu bar's top corners read as rounded. Traced from a 1x
72
+ * the System 7 menu bar's top corners read as rounded, and what a bezeled
73
+ * `vf-desktop` paints on all four screen corners. Traced from a 1x
73
74
  * screen capture (5×5 corner crop): y0 run 5, y1 3, y2 2, y3–y4 1. The same
74
75
  * radius-5 staircase as {@link RING_FRAME}'s corner — QuickDraw had one
75
76
  * vocabulary for round corners — but the opposite *object*: this is the ink
@@ -80,14 +81,15 @@ export declare const SCREEN_CORNER: readonly number[];
80
81
  /** Compile a profile into a stepped `polygon()` clip-path value. */
81
82
  export declare const steppedRectClip: (p: SteppedProfile) => string;
82
83
  /**
83
- * Compile a corner-mask run list into the ink polygon for one *top* corner —
84
- * the corner box minus the rounded silhouette, i.e. the region the screen
85
- * mask blacked out. Runs are the mask's per-row width, topmost first; `side`
86
- * mirrors the staircase (via `100% - …`) for the top-right corner. Clip an
87
- * element `runs[0]` wide × `runs.length` tall (system px), anchored into its
88
- * corner, and let its `background` supply the ink.
84
+ * Compile a corner-mask run list into the ink polygon for one corner — the
85
+ * corner box minus the rounded silhouette, i.e. the region the screen mask
86
+ * blacked out. Runs are the mask's per-row width, the row on the box's edge
87
+ * first; `side` mirrors the staircase (via `100% - …`) for a right corner,
88
+ * `edge` for a bottom one. Clip an element `runs[0]` wide × `runs.length`
89
+ * tall (system px), anchored into its corner, and let its `background`
90
+ * supply the ink.
89
91
  */
90
- export declare const steppedCornerClip: (runs: readonly number[], side: "left" | "right") => string;
92
+ export declare const steppedCornerClip: (runs: readonly number[], side: "left" | "right", edge?: "top" | "bottom") => string;
91
93
  /**
92
94
  * Compile an outer profile and a hole profile into a ring (a stepped donut).
93
95
  *
@@ -55,13 +55,13 @@ var e = {
55
55
  for (let e of n) i.push(`${o(e.from)} ${s(e.y)}`, `${o(e.to)} ${s(e.y)}`);
56
56
  for (let e of r) i.push(`${o(e.to)} ${o(e.y)}`, `${o(e.from)} ${o(e.y)}`);
57
57
  return i;
58
- }, u = (e) => `polygon(${l(e).join(", ")})`, d = (e, t) => {
59
- let n = t === "left" ? o : s, r = e[0] ?? 0, i = [`${n(0)} ${o(0)}`, `${n(r)} ${o(0)}`];
58
+ }, u = (e) => `polygon(${l(e).join(", ")})`, d = (e, t, n = "top") => {
59
+ let r = t === "left" ? o : s, i = n === "top" ? o : s, a = e[0] ?? 0, c = [`${r(0)} ${i(0)}`, `${r(a)} ${i(0)}`];
60
60
  for (let t = 1; t <= e.length; t++) {
61
- let a = e[t] ?? 0;
62
- a !== r && (i.push(`${n(r)} ${o(t)}`, `${n(a)} ${o(t)}`), r = a);
61
+ let n = e[t] ?? 0;
62
+ n !== a && (c.push(`${r(a)} ${i(t)}`, `${r(n)} ${i(t)}`), a = n);
63
63
  }
64
- return `polygon(${i.join(", ")})`;
64
+ return `polygon(${c.join(", ")})`;
65
65
  }, f = (e, t) => {
66
66
  let n = l(e), r = l(t), i = `50% ${o(e.start)}`, a = `50% ${o(t.start)}`, s = [...n.slice(1), n[0]], c = [r[0], ...r.slice(1).reverse()];
67
67
  return `polygon(evenodd, ${[