vintage-frames 0.12.8 → 0.14.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 (62) hide show
  1. package/custom-elements.json +26 -26
  2. package/dist/chrome.d.ts +1 -1
  3. package/dist/components/vf-checkbox.d.ts +6 -5
  4. package/dist/components/vf-checkbox.js +41 -37
  5. package/dist/components/vf-container.d.ts +16 -20
  6. package/dist/components/vf-container.js +25 -17
  7. package/dist/components/vf-desktop.d.ts +4 -5
  8. package/dist/components/vf-desktop.js +13 -18
  9. package/dist/components/vf-fieldset.js +30 -22
  10. package/dist/components/vf-icon.js +55 -55
  11. package/dist/components/vf-list.js +30 -29
  12. package/dist/components/vf-menu.js +24 -22
  13. package/dist/components/vf-number-field.js +32 -30
  14. package/dist/components/vf-progress-bar.d.ts +2 -2
  15. package/dist/components/vf-progress-bar.js +65 -52
  16. package/dist/components/vf-radio.js +3 -4
  17. package/dist/components/vf-scroll-area.js +27 -26
  18. package/dist/components/vf-select.js +108 -90
  19. package/dist/components/vf-separator.d.ts +5 -5
  20. package/dist/components/vf-separator.js +36 -10
  21. package/dist/components/vf-slider.js +11 -11
  22. package/dist/components/vf-swatch.d.ts +2 -2
  23. package/dist/components/vf-swatch.js +73 -72
  24. package/dist/components/vf-text-area.js +37 -35
  25. package/dist/components/vf-text-field.js +20 -18
  26. package/dist/components/vf-window.d.ts +6 -9
  27. package/dist/components/vf-window.js +106 -87
  28. package/dist/index.d.ts +20 -10
  29. package/dist/index.js +63 -62
  30. package/dist/pattern-fill.d.ts +21 -50
  31. package/dist/pattern-fill.js +19 -54
  32. package/dist/scroll-rail.d.ts +6 -6
  33. package/dist/scroll-rail.js +24 -29
  34. package/dist/styles/base.d.ts +3 -1
  35. package/dist/styles/recipes/field.d.ts +10 -6
  36. package/dist/styles/recipes/field.js +8 -7
  37. package/dist/styles/recipes/focus.d.ts +7 -3
  38. package/dist/styles/recipes/pattern.d.ts +19 -10
  39. package/dist/styles/recipes/pattern.js +27 -18
  40. package/dist/styles/recipes/rule.d.ts +11 -8
  41. package/dist/styles/recipes/rule.js +31 -13
  42. package/dist/styles/recipes/scroll-rail.d.ts +21 -13
  43. package/dist/styles/recipes/scroll-rail.js +27 -37
  44. package/dist/styles/recipes/shadow.d.ts +10 -6
  45. package/dist/styles/recipes/shadow.js +4 -2
  46. package/dist/styles/recipes/stroke.d.ts +85 -0
  47. package/dist/styles/recipes/stroke.js +53 -0
  48. package/dist/styles/recipes/surface.d.ts +8 -4
  49. package/dist/styles/recipes/surface.js +23 -17
  50. package/dist/styles/recipes/tile.d.ts +11 -3
  51. package/dist/styles/recipes/tile.js +12 -12
  52. package/dist/styles/recipes/title-bar.d.ts +7 -0
  53. package/dist/styles/recipes/title-bar.js +25 -22
  54. package/dist/styles/recipes/toggle.js +3 -3
  55. package/dist/tile-grid.d.ts +98 -64
  56. package/dist/tile-grid.js +63 -30
  57. package/dist/track-width.d.ts +1 -2
  58. package/dist/zoom.d.ts +9 -9
  59. package/docs/SPEC.md +33 -32
  60. package/editor/vscode.html-custom-data.json +5 -5
  61. package/editor/web-types.json +8 -8
  62. package/package.json +1 -1
@@ -4,37 +4,42 @@ import { ScaleController as n, effectiveScale as r, snapSys as i, sysLength as a
4
4
  import s from "../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.js";
5
5
  import { PlacementController as c, VfPositioned as l, placementIn as u, warnMovableContract as d } from "../position.js";
6
6
  import { vfBase as f } from "../styles/recipes/host.js";
7
- import { DOT_MOTIF as p, DOT_RECTS as m, DOT_SPAN as h, vfDots as g, vfStripes as _ } from "../styles/recipes/pattern.js";
8
- import { vfChromeFrame as v } from "../styles/recipes/surface.js";
9
- import { vfRule as y } from "../styles/recipes/rule.js";
10
- import { vfTitleBar as b, vfWindowWidgets as x } from "../styles/recipes/title-bar.js";
11
- import { vfFocus as S } from "../styles/recipes/focus.js";
12
- import { TileRasterCache as C, patternOverride as w, tileGrid as T, vfTileGrid as E } from "../tile-grid.js";
13
- import { GridSnapController as D } from "../grid-snap.js";
14
- import { DocumentListenersController as O } from "../document-listeners.js";
15
- import { VfSized as k } from "../size.js";
16
- import { DragController as A } from "../drag.js";
17
- import { TitleCenterController as j, chromeTitleBar as M, closeBox as N, widgetLabel as P, zoomBox as F } from "../chrome.js";
18
- import { prefersReducedMotion as I, windowRectFraction as L } from "../motion.js";
19
- import { paintSelectionRect as R, penPhase as z, xorPenCanvas as B } from "../open-art.js";
7
+ import { RepeatTileController as p, patternOverride as m, tileGrid as h, vfTileGrid as g } from "../tile-grid.js";
8
+ import { DOTS as _, DOT_SPAN as v, vfDots as y, vfStripes as b } from "../styles/recipes/pattern.js";
9
+ import { vfStrokeDecls as x, vfStrokeInset as S } from "../styles/recipes/stroke.js";
10
+ import { vfChromeFrame as C } from "../styles/recipes/surface.js";
11
+ import { vfRule as w } from "../styles/recipes/rule.js";
12
+ import { vfTitleBar as T, vfWindowWidgets as E } from "../styles/recipes/title-bar.js";
13
+ import { vfFocus as D } from "../styles/recipes/focus.js";
14
+ import { GridSnapController as O } from "../grid-snap.js";
15
+ import { DocumentListenersController as k } from "../document-listeners.js";
16
+ import { VfSized as A } from "../size.js";
17
+ import { DragController as j } from "../drag.js";
18
+ import { TitleCenterController as M, chromeTitleBar as N, closeBox as P, widgetLabel as F, zoomBox as I } from "../chrome.js";
19
+ import { prefersReducedMotion as L, windowRectFraction as R } from "../motion.js";
20
+ import { paintSelectionRect as z, penPhase as B, xorPenCanvas as V } from "../open-art.js";
20
21
  import "./vf-scroll-area.js";
21
- import { LitElement as V, css as H, html as U, nothing as W } from "lit";
22
- import { property as G, query as K, state as q } from "lit/decorators.js";
22
+ import { LitElement as H, css as U, html as W, nothing as G } from "lit";
23
+ import { property as K, query as q, state as J } from "lit/decorators.js";
23
24
  //#region src/components/vf-window.ts
24
- var J = 80, Y = 54;
25
- function X(e, t, n) {
25
+ var Y = 80, X = 54;
26
+ function Z(e, t, n) {
26
27
  let r = Math.max(t, e);
27
28
  return n == null ? r : Math.min(n, r);
28
29
  }
29
- var Z = 24, Q = 8, $ = class extends k(l(V)) {
30
+ var Q = 24, $ = class extends A(l(H)) {
30
31
  constructor(...e) {
31
- super(...e), this.heading = "", this.active = !0, this.closable = !0, this.zoomable = !1, this.movable = !1, this.outlineDrag = !1, this.resizable = !1, this._hasHeader = !1, this._hasStatus = !1, this.scale = new n(this), this.gridSnap = new D(this), this.titleCenter = new j(this), this._dotsPattern = "", this.#e = new C(), this.#t = (e, t, n) => {
32
+ super(...e), this.heading = "", this.active = !0, this.closable = !0, this.zoomable = !1, this.movable = !1, this.outlineDrag = !1, this.resizable = !1, this._hasHeader = !1, this._hasStatus = !1, this.scale = new n(this), this.gridSnap = new O(this), this.titleCenter = new M(this), this._dotsPattern = "", this.#e = new p(this, {
33
+ getBox: () => this.renderRoot?.querySelector(".vf-dots"),
34
+ getArt: () => this.variant === "utility" && !this._dotsPattern ? _ : null,
35
+ property: "--_vf-dots-tile"
36
+ }), this.#t = (e, t, n) => {
32
37
  let r = o(this.offsetWidth, this);
33
38
  return {
34
- x: Math.min(Math.max(e, Z - r), n.width - Z),
35
- y: Math.min(Math.max(t, 0), Math.max(0, n.height - Z))
39
+ x: Math.min(Math.max(e, Q - r), n.width - Q),
40
+ y: Math.min(Math.max(t, 0), Math.max(0, n.height - Q))
36
41
  };
37
- }, this._placement = new c(this, (e, t, n) => this.#t(e, t, n)), this._drag = new A(this, {
42
+ }, this._placement = new c(this, (e, t, n) => this.#t(e, t, n)), this._drag = new j(this, {
38
43
  onDragStart: (e) => {
39
44
  if (!this.movable || e.button !== 0 || e.composedPath().some((e) => e instanceof HTMLElement && e.classList.contains("box"))) return null;
40
45
  this.#S();
@@ -47,7 +52,7 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
47
52
  onDragEnd: (e, t) => {
48
53
  this.#y(t);
49
54
  }
50
- }), this._resizeState = null, this.#n = this.attachInternals(), this.#r = null, this.#i = new O(this, () => [[
55
+ }), this._resizeState = null, this.#n = this.attachInternals(), this.#r = null, this.#i = new k(this, () => [[
51
56
  document,
52
57
  "pointerdown",
53
58
  this.#a,
@@ -61,7 +66,7 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
61
66
  this.#s("finish");
62
67
  }, this.#o = (e) => {
63
68
  e.key !== "Escape" || !this.#r || (e.preventDefault(), e.stopPropagation(), this.#s("finish"));
64
- }, this.#f = null, this.#p = new O(this, () => [[
69
+ }, this.#f = null, this.#p = new k(this, () => [[
65
70
  document,
66
71
  "keydown",
67
72
  this.#m,
@@ -73,15 +78,15 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
73
78
  static {
74
79
  this.styles = [
75
80
  f,
76
- _,
81
+ b,
82
+ y,
77
83
  g,
84
+ D,
85
+ C,
86
+ w,
87
+ T,
78
88
  E,
79
- S,
80
- v,
81
- y,
82
- b,
83
- x,
84
- H`
89
+ U`
85
90
  :host {
86
91
  display: block;
87
92
  position: relative;
@@ -143,12 +148,12 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
143
148
  a focused widget out of the tree, so focus can't be dropped to
144
149
  <body> by a click on another window. */
145
150
  :host(:not([active])) .box {
146
- border-color: transparent;
151
+ --_vf-stroke-ink: transparent;
147
152
  background-color: transparent;
148
153
  box-shadow: none;
149
154
  }
150
155
  :host(:not([active])) .zoom::after {
151
- border-color: transparent;
156
+ --_vf-stroke-ink: transparent;
152
157
  }
153
158
 
154
159
  /* --- Utility (windoid) variant --------------------------------- */
@@ -191,7 +196,7 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
191
196
  a white (invisible, over the patch ring) borderline — rather than the
192
197
  big bar's 9×9 sunburst, which cannot land whole on a 5×5 interior. */
193
198
  :host([variant='utility']) .box:active {
194
- border-color: var(--vf-white, #ffffff);
199
+ --_vf-stroke-ink: var(--vf-white, #ffffff);
195
200
  background-color: var(--vf-black, #000000);
196
201
  background-image: none;
197
202
  }
@@ -268,11 +273,19 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
268
273
  vertical rail's arrows begin under it. Takes no space until the slot
269
274
  is populated. Clipped like the body; a drop-open panel still escapes
270
275
  (see the body's note). A div with a class, never a <header>: that
271
- element maps to a banner landmark (see render()). */
276
+ element maps to a banner landmark (see render()).
277
+
278
+ The rule is a stroke, so the header's own box runs under it: the
279
+ slot is the box content lays out, places and clips in, above the
280
+ rule. */
272
281
  .header {
273
- position: relative;
274
282
  flex: none;
275
283
  background: var(--vf-white, #ffffff);
284
+ }
285
+ .header > slot {
286
+ display: block;
287
+ position: relative;
288
+ height: 100%;
276
289
  overflow: hidden;
277
290
  }
278
291
  .header.empty {
@@ -292,7 +305,6 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
292
305
  .status {
293
306
  flex: none;
294
307
  display: flex;
295
- align-items: center;
296
308
  height: calc(var(--vf-scale, 1) * var(--vf-status-bar-height, 15px));
297
309
  /* The rule is vfRule's vf-rule-top on the element. */
298
310
  background: var(--vf-white, #ffffff);
@@ -301,6 +313,16 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
301
313
  white-space: nowrap;
302
314
  overflow: hidden;
303
315
  }
316
+ /* The rule is a stroke, so the strip's own box runs under it: the slot
317
+ centers the content in the 14px below the rule and clips it there.
318
+ Sideways it still runs to the strip's edges, as before. */
319
+ .status > slot {
320
+ display: flex;
321
+ align-items: center;
322
+ flex: 1 1 auto;
323
+ min-width: 0;
324
+ overflow-y: clip;
325
+ }
304
326
  /* Clear the grow box: its 15px cell plus the strip's own 6px inset. */
305
327
  :host([resizable]) .status {
306
328
  padding-inline-end: calc(var(--vf-scale, 1) * 21px);
@@ -310,18 +332,20 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
310
332
  }
311
333
 
312
334
  /* --- Grow box --------------------------------------------------- */
335
+ /* Flush inside the frame's stroke, which is padding (vfChromeFrame);
336
+ the two nested squares place against the box the same way, the
337
+ lower-right one clear of its top/left stroke. */
313
338
  .grow {
314
339
  position: absolute;
315
- right: 0;
316
- bottom: 0;
340
+ right: ${S(0)};
341
+ bottom: ${S(0)};
317
342
  z-index: 1;
318
343
  width: calc(var(--vf-scale, 1) * 15px);
319
344
  height: calc(var(--vf-scale, 1) * 15px);
320
- border-top: calc(var(--vf-scale, 1) * 1px) solid var(--vf-black, #000000);
321
- border-left: calc(var(--vf-scale, 1) * 1px) solid var(--vf-black, #000000);
322
345
  background: var(--vf-white, #ffffff);
323
346
  touch-action: none;
324
347
  cursor: var(--vf-cursor, default);
348
+ ${x({ edges: ["top", "left"] })}
325
349
  }
326
350
  .grow::before {
327
351
  content: '';
@@ -330,17 +354,17 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
330
354
  bottom: calc(var(--vf-scale, 1) * 1px);
331
355
  width: calc(var(--vf-scale, 1) * 9px);
332
356
  height: calc(var(--vf-scale, 1) * 9px);
333
- border: calc(var(--vf-scale, 1) * 1px) solid var(--vf-black, #000000);
357
+ ${x()}
334
358
  }
335
359
  .grow::after {
336
360
  content: '';
337
361
  position: absolute;
338
- top: calc(var(--vf-scale, 1) * 2px);
339
- left: calc(var(--vf-scale, 1) * 2px);
362
+ top: ${S(2)};
363
+ left: ${S(2)};
340
364
  width: calc(var(--vf-scale, 1) * 7px);
341
365
  height: calc(var(--vf-scale, 1) * 7px);
342
- border: calc(var(--vf-scale, 1) * 1px) solid var(--vf-black, #000000);
343
366
  background: var(--vf-white, #ffffff);
367
+ ${x()}
344
368
  }
345
369
  /* Inactive window: the size box empties with the scroll rails (the same
346
370
  HIG no-interactive-UX treatment ScrollStateController drives for the
@@ -354,21 +378,16 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
354
378
  }
355
379
  #e;
356
380
  willUpdate(e) {
357
- super.willUpdate(e), this.variant === "utility" && (this._dotsPattern = w(this, "--vf-dots-pattern"));
381
+ super.willUpdate(e), this.variant === "utility" && (this._dotsPattern = m(this, "--vf-dots-pattern"));
358
382
  }
359
383
  _dotsTexture() {
360
- if (this.width == null) return;
384
+ if (!this._dotsPattern || this.width == null) return;
361
385
  let e = Math.max(1, this.width - 2);
362
- if (this._dotsPattern) return T({
363
- cols: Math.ceil(e / h),
386
+ return h({
387
+ cols: Math.ceil(e / v),
364
388
  rows: 1,
365
- tile: h
389
+ tile: v
366
390
  });
367
- let t = Math.ceil((e + p) / h) * h, n = Q + p;
368
- return U`<div
369
- class="vf-tile-raster"
370
- style="width:${a(t)};height:${a(n)};background-image:${this.#e.for(p, p, m, t, n)}"
371
- ></div>`;
372
391
  }
373
392
  #t;
374
393
  placementAt(e, t, n) {
@@ -381,7 +400,7 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
381
400
  async show(e = {}) {
382
401
  this.#s("finish"), this.hidden = !1;
383
402
  let t = e.from;
384
- if (!t || I()) return !1;
403
+ if (!t || L()) return !1;
385
404
  let n = {
386
405
  closing: !1,
387
406
  animations: []
@@ -397,7 +416,7 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
397
416
  async hide(e = {}) {
398
417
  let t = this.#r?.closing === !1, n = !this.hidden && !t;
399
418
  this.#s(t ? "cancel" : "finish");
400
- let r = e.to, i = r && n && this.isConnected && !I() ? this.#u(r, this.getBoundingClientRect(), !0) : null;
419
+ let r = e.to, i = r && n && this.isConnected && !L() ? this.#u(r, this.getBoundingClientRect(), !0) : null;
401
420
  if (this.hidden = !0, !i) return !1;
402
421
  let a = {
403
422
  closing: !0,
@@ -440,8 +459,8 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
440
459
  animations: []
441
460
  };
442
461
  for (let e = 0; e < 14; e++) {
443
- let t = L(e), r = (e, n) => e + Math.trunc((n - e) * t), o = r(l.left, u.left), s = r(l.top, u.top), c = Math.max(1, r(l.right, u.right) - o), f = Math.max(1, r(l.bottom, u.bottom) - s), p = B("window-rect"), m = p.style;
444
- m.position = "absolute", m.left = a(o), m.top = a(s), m.width = a(c), m.height = a(f), m.visibility = "hidden", R(p, c, f, z(o, s)), i.append(p), d.canvases.push(p);
462
+ let t = R(e), r = (e, n) => e + Math.trunc((n - e) * t), o = r(l.left, u.left), s = r(l.top, u.top), c = Math.max(1, r(l.right, u.right) - o), f = Math.max(1, r(l.bottom, u.bottom) - s), p = V("window-rect"), m = p.style;
463
+ m.position = "absolute", m.left = a(o), m.top = a(s), m.width = a(c), m.height = a(f), m.visibility = "hidden", z(p, c, f, B(o, s)), i.append(p), d.canvases.push(p);
445
464
  let h = n ? 13 - e : e;
446
465
  d.animations.push(p.animate([{ visibility: "visible" }, { visibility: "visible" }], {
447
466
  delay: h * 17,
@@ -476,13 +495,13 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
476
495
  #_(e, t, n) {
477
496
  let r = e.base.x + t, i = e.base.y + n;
478
497
  e.canvas.style.left = a(r), e.canvas.style.top = a(i);
479
- let o = z(r, i);
480
- o !== e.phase && (e.phase = o, R(e.canvas, e.width, e.height, o));
498
+ let o = B(r, i);
499
+ o !== e.phase && (e.phase = o, z(e.canvas, e.width, e.height, o));
481
500
  }
482
501
  #v(e) {
483
502
  let t = this.#d();
484
503
  if (!t) return null;
485
- let n = r(this), i = t.getBoundingClientRect(), o = Math.max(1, Math.round(e.width / n)), s = Math.max(1, Math.round(e.height / n)), c = B("drag-outline"), l = c.style;
504
+ let n = r(this), i = t.getBoundingClientRect(), o = Math.max(1, Math.round(e.width / n)), s = Math.max(1, Math.round(e.height / n)), c = V("drag-outline"), l = c.style;
486
505
  return l.position = "absolute", l.width = a(o), l.height = a(s), t.append(c), {
487
506
  canvas: c,
488
507
  base: {
@@ -555,7 +574,7 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
555
574
  _onGrowPointerMove(e) {
556
575
  let t = this._resizeState;
557
576
  if (!t || e.pointerId !== t.pointerId) return;
558
- let n = X(i(t.baseWidth + o(e.clientX - t.startX, this), this), this.minWidth ?? J, this.maxWidth), r = X(i(t.baseHeight + o(e.clientY - t.startY, this), this), this.minHeight ?? Y, this.maxHeight);
577
+ let n = Z(i(t.baseWidth + o(e.clientX - t.startX, this), this), this.minWidth ?? Y, this.maxWidth), r = Z(i(t.baseHeight + o(e.clientY - t.startY, this), this), this.minHeight ?? X, this.maxHeight);
559
578
  (n !== this.width || r !== this.height) && (t.emitPending = !0, t.resized = !0), this.width = n, this.height = r;
560
579
  }
561
580
  _onGrowPointerEnd(t) {
@@ -570,42 +589,42 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
570
589
  });
571
590
  }
572
591
  render() {
573
- return U`
592
+ return W`
574
593
  <div
575
594
  class="vf-frame vf-snap"
576
595
  part="frame"
577
596
  role="group"
578
- aria-labelledby=${this.heading ? "title" : W}
597
+ aria-labelledby=${this.heading ? "title" : G}
579
598
  >
580
- ${M(this._drag, U`
581
- ${this.closable ? N(P("Close", this.heading), this._onCloseClick) : W}
599
+ ${N(this._drag, W`
600
+ ${this.closable ? P(F("Close", this.heading), this._onCloseClick) : G}
582
601
  <span class="vf-title" part="title" id="title">${this.heading}</span>
583
- ${this.zoomable ? F(P("Zoom", this.heading), this._onZoomClick) : W}
584
- `, this.variant === "utility" ? "vf-dots" : "vf-stripes", this.variant === "utility" ? this._dotsTexture() : void 0)}
602
+ ${this.zoomable ? I(F("Zoom", this.heading), this._onZoomClick) : G}
603
+ `, this.variant === "utility" ? this._dotsPattern ? "vf-dots vf-dots-token" : "vf-dots" : "vf-stripes", this.variant === "utility" ? this._dotsTexture() : void 0)}
585
604
  <div
586
605
  class="header vf-rule-bottom ${this._hasHeader ? "" : "empty"}"
587
606
  part="header"
588
- style=${this.headerHeight == null ? W : `height:${a(this.headerHeight)}`}
607
+ style=${this.headerHeight == null ? G : `height:${a(this.headerHeight)}`}
589
608
  >
590
609
  <slot name="header" @slotchange=${this._onHeaderSlotChange}></slot>
591
610
  </div>
592
611
  <div class="body" part="body">
593
- ${this.scrollbars ? U`
612
+ ${this.scrollbars ? W`
594
613
  <vf-scroll-area
595
614
  class="edge-scroll"
596
615
  axis=${this.scrollbars}
597
616
  ?corner=${this.resizable && !this._hasStatus}
598
- label=${this.heading || W}
617
+ label=${this.heading || G}
599
618
  exportparts="viewport"
600
619
  >
601
620
  <slot></slot>
602
621
  </vf-scroll-area>
603
- ` : U`<slot></slot>`}
622
+ ` : W`<slot></slot>`}
604
623
  </div>
605
624
  <div class="status vf-rule-top ${this._hasStatus ? "" : "empty"}" part="status-bar">
606
625
  <slot name="status" @slotchange=${this._onStatusSlotChange}></slot>
607
626
  </div>
608
- ${this.resizable ? U`
627
+ ${this.resizable ? W`
609
628
  <div
610
629
  class="grow"
611
630
  part="grow-box"
@@ -615,45 +634,45 @@ var Z = 24, Q = 8, $ = class extends k(l(V)) {
615
634
  @pointercancel=${this._onGrowPointerEnd}
616
635
  @lostpointercapture=${this._onGrowPointerEnd}
617
636
  ></div>
618
- ` : W}
637
+ ` : G}
619
638
  </div>
620
639
  `;
621
640
  }
622
641
  };
623
- s([G({ reflect: !0 })], $.prototype, "variant", void 0), s([G()], $.prototype, "heading", void 0), s([G({
642
+ s([K({ reflect: !0 })], $.prototype, "variant", void 0), s([K()], $.prototype, "heading", void 0), s([K({
624
643
  type: Boolean,
625
644
  reflect: !0
626
- })], $.prototype, "active", void 0), s([G({
645
+ })], $.prototype, "active", void 0), s([K({
627
646
  type: Boolean,
628
647
  reflect: !0
629
- })], $.prototype, "closable", void 0), s([G({
648
+ })], $.prototype, "closable", void 0), s([K({
630
649
  type: Boolean,
631
650
  reflect: !0
632
- })], $.prototype, "zoomable", void 0), s([G({
651
+ })], $.prototype, "zoomable", void 0), s([K({
633
652
  type: Boolean,
634
653
  reflect: !0
635
- })], $.prototype, "movable", void 0), s([G({
654
+ })], $.prototype, "movable", void 0), s([K({
636
655
  type: Boolean,
637
656
  reflect: !0,
638
657
  attribute: "outline-drag"
639
- })], $.prototype, "outlineDrag", void 0), s([G({
658
+ })], $.prototype, "outlineDrag", void 0), s([K({
640
659
  type: Boolean,
641
660
  reflect: !0
642
- })], $.prototype, "resizable", void 0), s([G({
661
+ })], $.prototype, "resizable", void 0), s([K({
643
662
  type: Number,
644
663
  attribute: "min-width"
645
- })], $.prototype, "minWidth", void 0), s([G({
664
+ })], $.prototype, "minWidth", void 0), s([K({
646
665
  type: Number,
647
666
  attribute: "min-height"
648
- })], $.prototype, "minHeight", void 0), s([G({
667
+ })], $.prototype, "minHeight", void 0), s([K({
649
668
  type: Number,
650
669
  attribute: "max-width"
651
- })], $.prototype, "maxWidth", void 0), s([G({
670
+ })], $.prototype, "maxWidth", void 0), s([K({
652
671
  type: Number,
653
672
  attribute: "max-height"
654
- })], $.prototype, "maxHeight", void 0), s([G({ reflect: !0 })], $.prototype, "scrollbars", void 0), s([G({
673
+ })], $.prototype, "maxHeight", void 0), s([K({ reflect: !0 })], $.prototype, "scrollbars", void 0), s([K({
655
674
  type: Number,
656
675
  attribute: "header-height"
657
- })], $.prototype, "headerHeight", void 0), s([q()], $.prototype, "_hasHeader", void 0), s([q()], $.prototype, "_hasStatus", void 0), s([K(".body")], $.prototype, "body", void 0), s([K("vf-scroll-area")], $.prototype, "scrollArea", void 0), $ = s([t("vf-window")], $);
676
+ })], $.prototype, "headerHeight", void 0), s([J()], $.prototype, "_hasHeader", void 0), s([J()], $.prototype, "_hasStatus", void 0), s([q(".body")], $.prototype, "body", void 0), s([q("vf-scroll-area")], $.prototype, "scrollArea", void 0), $ = s([t("vf-window")], $);
658
677
  //#endregion
659
678
  export { $ as VfWindow };
package/dist/index.d.ts CHANGED
@@ -92,7 +92,7 @@ export { CURSOR_ARROW, CURSOR_I_BEAM, CURSOR_CROSSHAIR, CURSOR_WAIT, } from './c
92
92
  * `static styles` to inherit the kit's type, panel frame, window chrome, focus
93
93
  * ring, field well and System 7 scroll-rail skin.
94
94
  */
95
- export { vfBase, vfBodyDecls, vfDisplay, vfDisplayDecls, vfStaticText, vfPanel, vfChromeFrame, vfModalFrame, vfRule, vfTitleBar, vfWindowWidgets, vfHardShadowDecls, vfStripes, vfDots, vfFocus, vfFocusRing, vfFocusUnderline, vfToggle, vfField, vfScrollRail, vfTileSize, vfTileMaskSize, tileImage, tileRaster, tileRects, tileSpan, TILE_LATTICE, } from './styles/base.js';
95
+ export { vfBase, vfBodyDecls, vfDisplay, vfDisplayDecls, vfStaticText, vfPanel, vfChromeFrame, vfModalFrame, vfRule, vfTitleBar, vfWindowWidgets, vfHardShadow, vfHardShadowDecls, vfStripes, vfDots, vfFocus, vfFocusRing, vfFocusUnderline, vfToggle, vfField, vfScrollRail, vfTileSize, vfTileMaskSize, tileImage, tileRaster, tileRects, tileSpan, TILE_LATTICE, } from './styles/base.js';
96
96
  export type { TileRect } from './styles/base.js';
97
97
  /**
98
98
  * The 1px rule's attribute grammar (`vf-container rule="top bottom"`): the
@@ -102,16 +102,26 @@ export type { TileRect } from './styles/base.js';
102
102
  export { RULE_EDGES, parseRule, ruleClasses } from './styles/base.js';
103
103
  export type { RuleEdge } from './styles/base.js';
104
104
  /**
105
- * The exact tiled fill (TILE-GRID-PLAN.md): a surface's own art as one
106
- * whole-surface raster (`tileRaster` + the `vf-tile-raster` rules), and a
107
- * consumer pattern token as a flat grid of absolutely placed tiles
108
- * (`tileGrid()`), each box paint-snapped to the device grid on its own — so
109
- * the fill stays 1-bit at the zoom-minted scales a CSS `background-repeat`
110
- * length cannot hold. `vfTileGrid` carries the container and tile rules;
111
- * `patternOverride` reads whether a token is in play; `TileRasterCache`
112
- * memoizes the encoded raster against its size.
105
+ * A 1-bit stroke for a box of your own: `vfStrokeDecls()` draws the line as
106
+ * padding plus an inset shadow, the way every kit frame is drawn, because a
107
+ * CSS `border` of `calc(var(--vf-scale, 1) * 1px)` renders thin under Safari's
108
+ * page zoom. `vfStrokeInset()` offsets a child placed against the box, and
109
+ * `vfStrokeShadow()` restates the painted width alone.
113
110
  */
114
- export { vfTileGrid, tileGrid, patternOverride, TileRasterCache } from './tile-grid.js';
111
+ export { vfStrokeDecls, vfStrokeInset, vfStrokeShadow } from './styles/base.js';
112
+ export type { VfStrokeOptions } from './styles/base.js';
113
+ /**
114
+ * The exact tiled fill (src/tile-grid.ts): a surface's own art as a CSS
115
+ * repeat of one tile drawn at the display's resolution — `repeatTile()` for
116
+ * the image at `devicePxAt()` a box, `vfRepeatTileSize` for its
117
+ * `background-size`, `RepeatTileController` to keep a box's tile current —
118
+ * and a consumer pattern token as a flat grid of absolutely placed tiles
119
+ * (`tileGrid()`, with `vfTileGrid`'s container and tile rules), each box
120
+ * paint-snapped to the device grid on its own. `patternOverride` reads
121
+ * whether a token is in play.
122
+ */
123
+ export { vfTileGrid, tileGrid, patternOverride, REPEAT_TILE, vfRepeatTileSize, repeatTile, devicePxAt, RepeatTileController, } from './tile-grid.js';
124
+ export type { TileMotif, RepeatTileOptions } from './tile-grid.js';
115
125
  /**
116
126
  * The standard pattern set — the 38 MacPaint fills as 8-byte QuickDraw
117
127
  * patterns (`PATTERNS`, named; `PATTERN_NAMES` in palette order), the
package/dist/index.js CHANGED
@@ -11,65 +11,66 @@ import { vfDisplay as P, vfDisplayDecls as F } from "./styles/recipes/display-fa
11
11
  import { vfBase as I } from "./styles/recipes/host.js";
12
12
  import { vfStaticText as L } from "./styles/recipes/static-text.js";
13
13
  import { TILE_LATTICE as R, tileImage as z, tileRaster as B, tileRects as V, tileSpan as H, vfTileMaskSize as U, vfTileSize as W } from "./styles/recipes/tile.js";
14
- import { PATTERNS as G, PATTERN_NAMES as K, PATTERN_SIZE as q, parsePattern as J, patternHex as Y, patternMotif as X, patternRects as Z } from "./patterns.js";
15
- import { vfDots as Q, vfStripes as $ } from "./styles/recipes/pattern.js";
16
- import { vfHardShadowDecls as ee } from "./styles/recipes/shadow.js";
17
- import { vfChromeFrame as te, vfModalFrame as ne, vfPanel as re } from "./styles/recipes/surface.js";
18
- import { RULE_EDGES as ie, parseRule as ae, ruleClasses as oe, vfRule as se } from "./styles/recipes/rule.js";
19
- import { vfTitleBar as ce, vfWindowWidgets as le } from "./styles/recipes/title-bar.js";
20
- import { vfFocus as ue, vfFocusRing as de, vfFocusUnderline as fe } from "./styles/recipes/focus.js";
21
- import { vfToggle as pe } from "./styles/recipes/toggle.js";
22
- import { vfField as me } from "./styles/recipes/field.js";
23
- import { vfScrollRail as he } from "./styles/recipes/scroll-rail.js";
24
- import { TileRasterCache as ge, patternOverride as _e, tileGrid as ve, vfTileGrid as ye } from "./tile-grid.js";
25
- import { TrackWidthController as be } from "./track-width.js";
26
- import { PatternFillController as xe, vfPatternFill as Se } from "./pattern-fill.js";
27
- import { GridSnapController as Ce, requestGridSnap as we } from "./grid-snap.js";
28
- import { DocumentListenersController as Te } from "./document-listeners.js";
29
- import { BUTTON_FACE as Ee, BUTTON_FRAME as De, RING_FRAME as Oe, RING_HOLE as ke, RING_INSET as Ae, SCREEN_CORNER as je, steppedCornerClip as Me, steppedRectClip as Ne, steppedRingClip as Pe } from "./pixel-frame.js";
30
- import { VfDesktop as Fe } from "./components/vf-desktop.js";
31
- import { VfSized as Ie } from "./size.js";
32
- import { DragController as Le } from "./drag.js";
33
- import { BLINK_FLIPS as Re, BLINK_INTERVAL_MS as ze, DRAG_SLOP_COARSE_PX as Be, DRAG_SLOP_PX as Ve, PRESS_HOLD_MS as He, RENAME_DELAY_MS as Ue, TAP_PAIR_MS as We, TAP_PAIR_SLOP_PX as Ge, WALK_BEAT_MS as Ke, WALK_STEP_MS as qe, WALK_STEP_PX as Je, WINDOW_RECTS_VISIBLE as Ye, WINDOW_RECT_RATIO as Xe, WINDOW_RECT_STEPS as Ze, WINDOW_RECT_STEP_MS as Qe, dragSlop as $e, prefersReducedMotion as et, runOutlineTravel as tt, runSelectionBlink as nt, windowRectFraction as rt } from "./motion.js";
34
- import { ScrollStateController as it } from "./scroll-state.js";
35
- import { CARET_DOWN as at, CARET_DOWN_SMALL as ot, CHECKBOX_X as st, CHECKMARK as ct, RADIO_DOT as lt, RADIO_FACE as ut, RADIO_RING as dt, RADIO_RING_PRESSED as ft, SLIDER_THUMB as pt, SLIDER_THUMB_FACE as mt, STEPPER as ht, STEPPER_DOWN_FILL as gt, STEPPER_UP_FILL as _t, glyphSvg as vt } from "./glyphs.js";
36
- import { ScrollRailController as yt, renderScrollRail as bt } from "./scroll-rail.js";
37
- import { VfScrollArea as xt } from "./components/vf-scroll-area.js";
38
- import { VfWindow as St } from "./components/vf-window.js";
39
- import { VfModalDialog as Ct, modalDialogStyles as wt } from "./modal-dialog.js";
40
- import { VfDialog as Tt } from "./components/vf-dialog.js";
41
- import { VfSeparator as Et } from "./components/vf-separator.js";
42
- import { VfFormControl as Dt } from "./form-control.js";
43
- import { VfButton as Ot } from "./components/vf-button.js";
44
- import { VfButtonGroup as kt } from "./components/vf-button-group.js";
45
- import { VfSwatch as At } from "./components/vf-swatch.js";
46
- import { VfToggleControl as jt } from "./toggle-control.js";
47
- import { VfCheckbox as Mt } from "./components/vf-checkbox.js";
48
- import { VfRadio as Nt } from "./components/vf-radio.js";
49
- import { VfRadioGroup as Pt } from "./components/vf-radio-group.js";
50
- import { FocusRuleController as Ft, focusModality as It, trackFocusModality as Lt } from "./focus-modality.js";
51
- import { VfTextControlBase as Rt } from "./text-control.js";
52
- import { VfTextField as zt } from "./components/vf-text-field.js";
53
- import { VfTextArea as Bt } from "./components/vf-text-area.js";
54
- import { VfNumberField as Vt } from "./components/vf-number-field.js";
55
- import { VfOption as Ht } from "./components/vf-option.js";
56
- import { VfSelect as Ut } from "./components/vf-select.js";
57
- import { VfProgressBar as Wt } from "./components/vf-progress-bar.js";
58
- import { VfSlider as Gt } from "./components/vf-slider.js";
59
- import { VfLabel as Kt } from "./components/vf-label.js";
60
- import { VfParagraph as qt } from "./components/vf-paragraph.js";
61
- import { VfImg as Jt } from "./components/vf-img.js";
62
- import { VfIcon as Yt } from "./components/vf-icon.js";
63
- import { VfIconField as Xt } from "./components/vf-icon-field.js";
64
- import { VfMenuBar as Zt } from "./components/vf-menu-bar.js";
65
- import { VfMenu as Qt } from "./components/vf-menu.js";
66
- import { VfMenuItem as $t } from "./components/vf-menu-item.js";
67
- import { VfList as en } from "./components/vf-list.js";
68
- import { VfListItem as tn } from "./components/vf-list-item.js";
69
- import { VfFieldset as nn } from "./components/vf-fieldset.js";
70
- import { VfGrid as rn } from "./components/vf-grid.js";
71
- import { VfStack as an } from "./components/vf-stack.js";
72
- import { VfContainer as on } from "./components/vf-container.js";
73
- import { CURSOR_ARROW as sn, CURSOR_CROSSHAIR as cn, CURSOR_I_BEAM as ln, CURSOR_WAIT as un } from "./cursor-art.js";
74
- import { applyCursor as dn } from "./cursor.js";
75
- export { Re as BLINK_FLIPS, ze as BLINK_INTERVAL_MS, Ee as BUTTON_FACE, De as BUTTON_FRAME, at as CARET_DOWN, ot as CARET_DOWN_SMALL, st as CHECKBOX_X, ct as CHECKMARK, r as CLASSIC_DPI, i as CSS_REFERENCE_DPI, sn as CURSOR_ARROW, cn as CURSOR_CROSSHAIR, ln as CURSOR_I_BEAM, un as CURSOR_WAIT, Be as DRAG_SLOP_COARSE_PX, Ve as DRAG_SLOP_PX, Te as DocumentListenersController, Le as DragController, Ft as FocusRuleController, Ce as GridSnapController, G as PATTERNS, K as PATTERN_NAMES, q as PATTERN_SIZE, D as PIXEL_GRID_METRICS, He as PRESS_HOLD_MS, xe as PatternFillController, T as PlacementController, lt as RADIO_DOT, ut as RADIO_FACE, dt as RADIO_RING, ft as RADIO_RING_PRESSED, Ue as RENAME_DELAY_MS, Oe as RING_FRAME, ke as RING_HOLE, Ae as RING_INSET, ie as RULE_EDGES, je as SCREEN_CORNER, pt as SLIDER_THUMB, mt as SLIDER_THUMB_FACE, ht as STEPPER, gt as STEPPER_DOWN_FILL, _t as STEPPER_UP_FILL, a as SYSTEM_PX_IN_CSS_PX, d as ScaleController, yt as ScrollRailController, it as ScrollStateController, We as TAP_PAIR_MS, Ge as TAP_PAIR_SLOP_PX, R as TILE_LATTICE, ge as TileRasterCache, be as TrackWidthController, k as VF_BODY_FAMILY, M as VF_DISPLAY_FAMILY, Ot as VfButton, kt as VfButtonGroup, Mt as VfCheckbox, on as VfContainer, Fe as VfDesktop, Tt as VfDialog, nn as VfFieldset, Dt as VfFormControl, rn as VfGrid, Yt as VfIcon, Xt as VfIconField, Jt as VfImg, Kt as VfLabel, en as VfList, tn as VfListItem, Qt as VfMenu, Zt as VfMenuBar, $t as VfMenuItem, Ct as VfModalDialog, Vt as VfNumberField, Ht as VfOption, qt as VfParagraph, E as VfPositioned, Wt as VfProgressBar, Nt as VfRadio, Pt as VfRadioGroup, xt as VfScrollArea, Ut as VfSelect, Et as VfSeparator, Ie as VfSized, Gt as VfSlider, an as VfStack, At as VfSwatch, Bt as VfTextArea, Rt as VfTextControlBase, zt as VfTextField, jt as VfToggleControl, St as VfWindow, Ke as WALK_BEAT_MS, qe as WALK_STEP_MS, Je as WALK_STEP_PX, Ye as WINDOW_RECTS_VISIBLE, Xe as WINDOW_RECT_RATIO, Ze as WINDOW_RECT_STEPS, Qe as WINDOW_RECT_STEP_MS, dn as applyCursor, f as applyScale, t as defineElement, o as devicePxPerSystemPx, $e as dragSlop, p as effectiveScale, e as emit, It as focusModality, m as getScale, s as getZoom, vt as glyphSvg, wt 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, et as prefersReducedMotion, A as registerBodyFace, N as registerDisplayFace, O as registerEmbeddedFont, bt as renderScrollRail, we as requestGridSnap, l as resetZoomBaseline, oe as ruleClasses, tt as runOutlineTravel, nt 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, Lt 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, rt as windowRectFraction };
14
+ import { REPEAT_TILE as G, RepeatTileController as K, devicePxAt as q, patternOverride as J, repeatTile as Y, tileGrid as X, vfRepeatTileSize as Z, vfTileGrid as Q } from "./tile-grid.js";
15
+ import { PATTERNS as $, PATTERN_NAMES as ee, PATTERN_SIZE as te, parsePattern as ne, patternHex as re, patternMotif as ie, patternRects as ae } from "./patterns.js";
16
+ import { vfDots as oe, vfStripes as se } from "./styles/recipes/pattern.js";
17
+ import { vfHardShadow as ce, vfHardShadowDecls as le } from "./styles/recipes/shadow.js";
18
+ import { vfStrokeDecls as ue, vfStrokeInset as de, vfStrokeShadow as fe } from "./styles/recipes/stroke.js";
19
+ import { vfChromeFrame as pe, vfModalFrame as me, vfPanel as he } from "./styles/recipes/surface.js";
20
+ import { RULE_EDGES as ge, parseRule as _e, ruleClasses as ve, vfRule as ye } from "./styles/recipes/rule.js";
21
+ import { vfTitleBar as be, vfWindowWidgets as xe } from "./styles/recipes/title-bar.js";
22
+ import { vfFocus as Se, vfFocusRing as Ce, vfFocusUnderline as we } from "./styles/recipes/focus.js";
23
+ import { vfToggle as Te } from "./styles/recipes/toggle.js";
24
+ import { vfField as Ee } from "./styles/recipes/field.js";
25
+ import { vfScrollRail as De } from "./styles/recipes/scroll-rail.js";
26
+ import { PatternFillController as Oe, vfPatternFill as ke } from "./pattern-fill.js";
27
+ import { GridSnapController as Ae, requestGridSnap as je } from "./grid-snap.js";
28
+ import { DocumentListenersController as Me } from "./document-listeners.js";
29
+ import { BUTTON_FACE as Ne, BUTTON_FRAME as Pe, RING_FRAME as Fe, RING_HOLE as Ie, RING_INSET as Le, SCREEN_CORNER as Re, steppedCornerClip as ze, steppedRectClip as Be, steppedRingClip as Ve } from "./pixel-frame.js";
30
+ import { VfDesktop as He } from "./components/vf-desktop.js";
31
+ import { VfSized as Ue } from "./size.js";
32
+ import { DragController as We } from "./drag.js";
33
+ import { BLINK_FLIPS as Ge, BLINK_INTERVAL_MS as Ke, DRAG_SLOP_COARSE_PX as qe, DRAG_SLOP_PX as Je, PRESS_HOLD_MS as Ye, RENAME_DELAY_MS as Xe, TAP_PAIR_MS as Ze, TAP_PAIR_SLOP_PX as Qe, WALK_BEAT_MS as $e, WALK_STEP_MS as et, WALK_STEP_PX as tt, WINDOW_RECTS_VISIBLE as nt, WINDOW_RECT_RATIO as rt, WINDOW_RECT_STEPS as it, WINDOW_RECT_STEP_MS as at, dragSlop as ot, prefersReducedMotion as st, runOutlineTravel as ct, runSelectionBlink as lt, windowRectFraction as ut } from "./motion.js";
34
+ import { ScrollStateController as dt } from "./scroll-state.js";
35
+ import { CARET_DOWN as ft, CARET_DOWN_SMALL as pt, CHECKBOX_X as mt, CHECKMARK as ht, RADIO_DOT as gt, RADIO_FACE as _t, RADIO_RING as vt, RADIO_RING_PRESSED as yt, SLIDER_THUMB as bt, SLIDER_THUMB_FACE as xt, STEPPER as St, STEPPER_DOWN_FILL as Ct, STEPPER_UP_FILL as wt, glyphSvg as Tt } from "./glyphs.js";
36
+ import { ScrollRailController as Et, renderScrollRail as Dt } from "./scroll-rail.js";
37
+ import { VfScrollArea as Ot } from "./components/vf-scroll-area.js";
38
+ import { VfWindow as kt } from "./components/vf-window.js";
39
+ import { VfModalDialog as At, modalDialogStyles as jt } from "./modal-dialog.js";
40
+ import { VfDialog as Mt } from "./components/vf-dialog.js";
41
+ import { VfSeparator as Nt } from "./components/vf-separator.js";
42
+ import { VfFormControl as Pt } from "./form-control.js";
43
+ import { VfButton as Ft } from "./components/vf-button.js";
44
+ import { VfButtonGroup as It } from "./components/vf-button-group.js";
45
+ import { VfSwatch as Lt } from "./components/vf-swatch.js";
46
+ import { VfToggleControl as Rt } from "./toggle-control.js";
47
+ import { VfCheckbox as zt } from "./components/vf-checkbox.js";
48
+ import { VfRadio as Bt } from "./components/vf-radio.js";
49
+ import { VfRadioGroup as Vt } from "./components/vf-radio-group.js";
50
+ import { FocusRuleController as Ht, focusModality as Ut, trackFocusModality as Wt } from "./focus-modality.js";
51
+ import { VfTextControlBase as Gt } from "./text-control.js";
52
+ import { VfTextField as Kt } from "./components/vf-text-field.js";
53
+ import { VfTextArea as qt } from "./components/vf-text-area.js";
54
+ import { VfNumberField as Jt } from "./components/vf-number-field.js";
55
+ import { VfOption as Yt } from "./components/vf-option.js";
56
+ import { VfSelect as Xt } from "./components/vf-select.js";
57
+ import { TrackWidthController as Zt } from "./track-width.js";
58
+ import { VfProgressBar as Qt } from "./components/vf-progress-bar.js";
59
+ import { VfSlider as $t } from "./components/vf-slider.js";
60
+ import { VfLabel as en } from "./components/vf-label.js";
61
+ import { VfParagraph as tn } from "./components/vf-paragraph.js";
62
+ import { VfImg as nn } from "./components/vf-img.js";
63
+ import { VfIcon as rn } from "./components/vf-icon.js";
64
+ import { VfIconField as an } from "./components/vf-icon-field.js";
65
+ import { VfMenuBar as on } from "./components/vf-menu-bar.js";
66
+ import { VfMenu as sn } from "./components/vf-menu.js";
67
+ import { VfMenuItem as cn } from "./components/vf-menu-item.js";
68
+ import { VfList as ln } from "./components/vf-list.js";
69
+ import { VfListItem as un } from "./components/vf-list-item.js";
70
+ import { VfFieldset as dn } from "./components/vf-fieldset.js";
71
+ import { VfGrid as fn } from "./components/vf-grid.js";
72
+ import { VfStack as pn } from "./components/vf-stack.js";
73
+ import { VfContainer as mn } from "./components/vf-container.js";
74
+ import { CURSOR_ARROW as hn, CURSOR_CROSSHAIR as gn, CURSOR_I_BEAM as _n, CURSOR_WAIT as vn } from "./cursor-art.js";
75
+ import { applyCursor as yn } from "./cursor.js";
76
+ export { Ge as BLINK_FLIPS, Ke as BLINK_INTERVAL_MS, Ne as BUTTON_FACE, Pe as BUTTON_FRAME, ft as CARET_DOWN, pt as CARET_DOWN_SMALL, mt as CHECKBOX_X, ht as CHECKMARK, r as CLASSIC_DPI, i as CSS_REFERENCE_DPI, hn as CURSOR_ARROW, gn as CURSOR_CROSSHAIR, _n as CURSOR_I_BEAM, vn as CURSOR_WAIT, qe as DRAG_SLOP_COARSE_PX, Je as DRAG_SLOP_PX, Me as DocumentListenersController, We as DragController, Ht as FocusRuleController, Ae as GridSnapController, $ as PATTERNS, ee as PATTERN_NAMES, te as PATTERN_SIZE, D as PIXEL_GRID_METRICS, Ye as PRESS_HOLD_MS, Oe as PatternFillController, T as PlacementController, gt as RADIO_DOT, _t as RADIO_FACE, vt as RADIO_RING, yt as RADIO_RING_PRESSED, Xe as RENAME_DELAY_MS, G as REPEAT_TILE, Fe as RING_FRAME, Ie as RING_HOLE, Le as RING_INSET, ge as RULE_EDGES, K as RepeatTileController, Re as SCREEN_CORNER, bt as SLIDER_THUMB, xt as SLIDER_THUMB_FACE, St as STEPPER, Ct as STEPPER_DOWN_FILL, wt as STEPPER_UP_FILL, a as SYSTEM_PX_IN_CSS_PX, d as ScaleController, Et as ScrollRailController, dt as ScrollStateController, Ze as TAP_PAIR_MS, Qe as TAP_PAIR_SLOP_PX, R as TILE_LATTICE, Zt as TrackWidthController, k as VF_BODY_FAMILY, M as VF_DISPLAY_FAMILY, Ft as VfButton, It as VfButtonGroup, zt as VfCheckbox, mn as VfContainer, He as VfDesktop, Mt as VfDialog, dn as VfFieldset, Pt as VfFormControl, fn as VfGrid, rn as VfIcon, an as VfIconField, nn as VfImg, en as VfLabel, ln as VfList, un as VfListItem, sn as VfMenu, on as VfMenuBar, cn as VfMenuItem, At as VfModalDialog, Jt as VfNumberField, Yt as VfOption, tn as VfParagraph, E as VfPositioned, Qt as VfProgressBar, Bt as VfRadio, Vt as VfRadioGroup, Ot as VfScrollArea, Xt as VfSelect, Nt as VfSeparator, Ue as VfSized, $t as VfSlider, pn as VfStack, Lt as VfSwatch, qt as VfTextArea, Gt as VfTextControlBase, Kt as VfTextField, Rt as VfToggleControl, kt as VfWindow, $e as WALK_BEAT_MS, et as WALK_STEP_MS, tt as WALK_STEP_PX, nt as WINDOW_RECTS_VISIBLE, rt as WINDOW_RECT_RATIO, it as WINDOW_RECT_STEPS, at as WINDOW_RECT_STEP_MS, yn as applyCursor, f as applyScale, t as defineElement, q as devicePxAt, o as devicePxPerSystemPx, ot as dragSlop, p as effectiveScale, e as emit, Ut as focusModality, m as getScale, s as getZoom, Tt as glyphSvg, jt as modalDialogStyles, h as onScaleChange, c as onZoomChange, ne as parsePattern, _e as parseRule, re as patternHex, ie as patternMotif, J as patternOverride, ae as patternRects, st as prefersReducedMotion, A as registerBodyFace, N as registerDisplayFace, O as registerEmbeddedFont, Dt as renderScrollRail, Y as repeatTile, je as requestGridSnap, l as resetZoomBaseline, ve as ruleClasses, ct as runOutlineTravel, lt as runSelectionBlink, g as snapSys, _ as snapToDevicePx, v as snapToSystemPx, ze as steppedCornerClip, Be as steppedRectClip, Ve as steppedRingClip, y as sys, b as sysLength, x as sysLengths, S as systemPxQuantum, X as tileGrid, z as tileImage, B as tileRaster, V as tileRects, H as tileSpan, C as toSys, w as toSysExact, Wt as trackFocusModality, u as truePixelRatio, I as vfBase, j as vfBodyDecls, pe as vfChromeFrame, P as vfDisplay, F as vfDisplayDecls, oe as vfDots, n as vfElement, Ee as vfField, Se as vfFocus, Ce as vfFocusRing, we as vfFocusUnderline, ce as vfHardShadow, le as vfHardShadowDecls, me as vfModalFrame, he as vfPanel, ke as vfPatternFill, Z as vfRepeatTileSize, ye as vfRule, De as vfScrollRail, L as vfStaticText, se as vfStripes, ue as vfStrokeDecls, de as vfStrokeInset, fe as vfStrokeShadow, Q as vfTileGrid, U as vfTileMaskSize, W as vfTileSize, be as vfTitleBar, Te as vfToggle, xe as vfWindowWidgets, ut as windowRectFraction };