vintage-frames 0.7.2 → 0.9.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "vintage-frames",
4
- "version": "0.7.2",
4
+ "version": "0.9.0",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -35,6 +35,11 @@
35
35
  "name": "fixed",
36
36
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
37
37
  "value": { "type": "boolean", "default": "false" }
38
+ },
39
+ {
40
+ "name": "origin",
41
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
42
+ "value": { "type": "PlacementOrigin | null | undefined" }
38
43
  }
39
44
  ],
40
45
  "slots": [
@@ -68,6 +73,11 @@
68
73
  "name": "fixed",
69
74
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
70
75
  "type": "boolean"
76
+ },
77
+ {
78
+ "name": "origin",
79
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
80
+ "type": "PlacementOrigin | null | undefined"
71
81
  }
72
82
  ],
73
83
  "events": []
@@ -141,6 +151,11 @@
141
151
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
142
152
  "value": { "type": "boolean", "default": "false" }
143
153
  },
154
+ {
155
+ "name": "origin",
156
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
157
+ "value": { "type": "PlacementOrigin | null | undefined" }
158
+ },
144
159
  {
145
160
  "name": "description",
146
161
  "description": "Description for the control — hint text, a format, a unit. A host-level\n`aria-describedby` cannot reach a focusable element inside a shadow root,\nso there was structurally no way to describe a field; this property is\nthat channel. It renders as a hidden span in the control's own shadow root\nwith the inner control's `aria-describedby` pointing at it — the\nshadow-internal IDREF idiom `vf-dialog`'s title patch already uses. A\nhost-level `aria-describedby` is bridged into the same span when this\nproperty is empty, and a failing constraint's validationMessage\njoins it too, so AT hears the error where it hears the hint.\n\nHost-role controls get neither half: their `aria-describedby` already\nworks, and their validation message reaches AT the way a native control's\ndoes — `aria-invalid` plus the browser's own validation UI, not AccName.",
@@ -221,6 +236,11 @@
221
236
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
222
237
  "type": "boolean"
223
238
  },
239
+ {
240
+ "name": "origin",
241
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
242
+ "type": "PlacementOrigin | null | undefined"
243
+ },
224
244
  {
225
245
  "name": "description",
226
246
  "description": "Description for the control — hint text, a format, a unit. A host-level\n`aria-describedby` cannot reach a focusable element inside a shadow root,\nso there was structurally no way to describe a field; this property is\nthat channel. It renders as a hidden span in the control's own shadow root\nwith the inner control's `aria-describedby` pointing at it — the\nshadow-internal IDREF idiom `vf-dialog`'s title patch already uses. A\nhost-level `aria-describedby` is bridged into the same span when this\nproperty is empty, and a failing constraint's validationMessage\njoins it too, so AT hears the error where it hears the hint.\n\nHost-role controls get neither half: their `aria-describedby` already\nworks, and their validation message reaches AT the way a native control's\ndoes — `aria-invalid` plus the browser's own validation UI, not AccName.",
@@ -295,6 +315,11 @@
295
315
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
296
316
  "value": { "type": "boolean", "default": "false" }
297
317
  },
318
+ {
319
+ "name": "origin",
320
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
321
+ "value": { "type": "PlacementOrigin | null | undefined" }
322
+ },
298
323
  {
299
324
  "name": "disabled",
300
325
  "description": "Disables the control: it stops responding and submits no value. Each\ncontrol dims per SPEC §1 (typically the label greys while the 1-bit chrome\nstays black).",
@@ -359,6 +384,11 @@
359
384
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
360
385
  "type": "boolean"
361
386
  },
387
+ {
388
+ "name": "origin",
389
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
390
+ "type": "PlacementOrigin | null | undefined"
391
+ },
362
392
  {
363
393
  "name": "disabled",
364
394
  "description": "Disables the control: it stops responding and submits no value. Each\ncontrol dims per SPEC §1 (typically the label greys while the 1-bit chrome\nstays black).",
@@ -445,6 +475,11 @@
445
475
  "name": "fixed",
446
476
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
447
477
  "value": { "type": "boolean", "default": "false" }
478
+ },
479
+ {
480
+ "name": "origin",
481
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
482
+ "value": { "type": "PlacementOrigin | null | undefined" }
448
483
  }
449
484
  ],
450
485
  "slots": [
@@ -490,6 +525,11 @@
490
525
  "name": "fixed",
491
526
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
492
527
  "type": "boolean"
528
+ },
529
+ {
530
+ "name": "origin",
531
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
532
+ "type": "PlacementOrigin | null | undefined"
493
533
  }
494
534
  ],
495
535
  "events": []
@@ -537,6 +577,11 @@
537
577
  "name": "fixed",
538
578
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
539
579
  "value": { "type": "boolean", "default": "false" }
580
+ },
581
+ {
582
+ "name": "origin",
583
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
584
+ "value": { "type": "PlacementOrigin | null | undefined" }
540
585
  }
541
586
  ],
542
587
  "slots": [
@@ -592,6 +637,11 @@
592
637
  "name": "fixed",
593
638
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
594
639
  "type": "boolean"
640
+ },
641
+ {
642
+ "name": "origin",
643
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
644
+ "type": "PlacementOrigin | null | undefined"
595
645
  }
596
646
  ],
597
647
  "events": [
@@ -604,17 +654,17 @@
604
654
  },
605
655
  {
606
656
  "name": "vf-dialog",
607
- "description": "`<vf-dialog>` — the System 7 modal dialog shell.\n\nTwo chromes, one modal lifecycle (native `<dialog>` for top-layer rendering\nand focus trapping, with a fully transparent backdrop — no dimming). Both\nare the same dBoxProc double frame — 1px outer rule, 2px gap, 2px inner\nband, no shadow (vfModalFrame):\n\n- **Default:** the movable modal (movableDBoxProc) — the striped title bar\n set into the top of that frame, with a centered title over a white body.\n Drag the title bar to move it. `closable` adds the standard close box\n (left of the bar) — the HIG's own figures disagree on whether a movable\n modal carries one (Figure 5-1 says yes, Figure 6-1 and the Chapter 6 text\n say no), so the component enables either reading rather than enforcing\n one.\n- **`frame=\"plain\"`:** the modal dialog box — the bare frame, no title bar —\n and immovable, like the original. A `heading` renders as a centered\n display-face heading at the top of the body (the reference art's \"Dialog\n title\"); `closable` is ignored, there being no bar to carry the widget.\n\nOpen it with `show()` (or set the `open` attribute/property); close with\n`close()`. Escape closes it and fires `vf-close` with\n`{ reason: 'escape' }`; the close box and programmatic closing fire\n`{ reason: 'close' }`. With `light-dismiss`, a click outside the frame\ncloses it too, with `{ reason: 'outside' }` — for the About box; off by\ndefault, since the classic modal ignored an outside click.\n\nKeyboard, the classic Dialog Manager's two rules (VfModalDialog):\non open, focus goes to the first text-entry control — a slotted control\nwith `autofocus` first — or, with none, to the default button\n(`vf-button variant=\"default\"`). Return or Enter activates the default\nbutton from anywhere in the dialog, a focused Cancel included; Space\npresses the focused control. A link keeps its own Enter, and in a\nmulti-line editor Return inserts the newline while the keypad's Enter\nactivates the button.\n---\n\n\n### **Events:**\n - **vf-close** - Dialog closed. Detail `{ reason: 'escape' | 'close' | 'outside' }` — `'outside'` only under `light-dismiss`.\n\n### **Slots:**\n - _default_ - Default slot: dialog body content.\n- **buttons** - Optional action buttons. Rendered as a bottom-right `vf-button-group` (equal-width, faces aligned); the footer only takes space when the slot is populated.\n\n### **CSS Properties:**\n - **--vf-dots-pattern** - the windoid bar's dot-grid dither — a 2×2 tile, one black pixel at the origin (`vfDots`; override the whole pattern like `--vf-desktop-pattern`) _(default: undefined)_\n- **--vf-titlebar-height** - window/dialog title bars _(default: undefined)_\n- **--vf-scrollbar-thumb** - scrollbar thumb/elevator (white) _(default: undefined)_\n- **--vf-scrollbar-track** - the scroll trough's base color under the dot-dither (white) _(default: undefined)_\n\n### **CSS Parts:**\n - **frame** - The outer frame (the double frame's 1px rule; the bar and the inner band sit inside it).\n- **title-bar** - The striped title bar (default chrome only).\n- **title** - The centered title patch (or the plain-frame heading).\n- **close-box** - The close widget (`closable`, default chrome only).\n- **body** - The white content area.\n- **content** - The scrolling region inside the body (heading + slotted content, not the footer). Inert while the content fits; over-stuffed, it scrolls under a System 7 rail and becomes a keyboard stop.\n- **footer** - The action row wrapping the buttons.\n- **buttons** - The button group inside the footer.",
657
+ "description": "`<vf-dialog>` — the System 7 modal dialog shell.\n\nTwo chromes, one modal lifecycle (native `<dialog>` for top-layer rendering\nand focus trapping, with a fully transparent backdrop — no dimming). Both\nare the same dBoxProc double frame — 1px outer rule, 2px gap, 2px inner\nband, no shadow (vfModalFrame):\n\n- **Default:** the movable modal (movableDBoxProc) — the striped title bar\n set into the top of that frame, with a centered title over a white body.\n Drag the title bar to move it. `closable` adds the standard close box\n (left of the bar) — the HIG's own figures disagree on whether a movable\n modal carries one (Figure 5-1 says yes, Figure 6-1 and the Chapter 6 text\n say no), so the component enables either reading rather than enforcing\n one.\n- **`frame=\"plain\"`:** the modal dialog box — the bare frame, no title bar —\n and immovable, like the original. With no bar, `heading` only names the\n dialog and `closable` is ignored.\n\nOpen it with `show()` (or set the `open` attribute/property); close with\n`close()`. Escape closes it and fires `vf-close` with\n`{ reason: 'escape' }`; the close box and programmatic closing fire\n`{ reason: 'close' }`. With `light-dismiss`, a click outside the frame\ncloses it too, with `{ reason: 'outside' }` — for the About box; off by\ndefault, since the classic modal ignored an outside click.\n\nKeyboard, the classic Dialog Manager's two rules (VfModalDialog):\non open, focus goes to the first text-entry control — a slotted control\nwith `autofocus` first — or, with none, to the default button\n(`vf-button variant=\"default\"`). Return or Enter activates the default\nbutton from anywhere in the dialog, a focused Cancel included; Space\npresses the focused control. A link keeps its own Enter, and in a\nmulti-line editor Return inserts the newline while the keypad's Enter\nactivates the button.\n\nSlotted children placed with `top`/`left` measure from the content region's\ncorner — the frame's inner edge, below the title bar — and flow content\nstarts at the same corner.\n---\n\n\n### **Events:**\n - **vf-close** - Dialog closed. Detail `{ reason: 'escape' | 'close' | 'outside' }` — `'outside'` only under `light-dismiss`.\n\n### **Slots:**\n - _default_ - Default slot: the dialog's content.\n\n### **CSS Properties:**\n - **--vf-dots-pattern** - the windoid bar's dot-grid dither — a 2×2 tile, one black pixel at the origin (`vfDots`; override the whole pattern like `--vf-desktop-pattern`) _(default: undefined)_\n- **--vf-titlebar-height** - window/dialog title bars _(default: undefined)_\n- **--vf-scrollbar-thumb** - scrollbar thumb/elevator (white) _(default: undefined)_\n- **--vf-scrollbar-track** - the scroll trough's base color under the dot-dither (white) _(default: undefined)_\n\n### **CSS Parts:**\n - **frame** - The outer frame (the double frame's 1px rule; the bar and the inner band sit inside it).\n- **title-bar** - The striped title bar (default chrome only).\n- **title** - The centered title patch (default chrome only).\n- **close-box** - The close widget (`closable`, default chrome only).\n- **body** - The white content region.\n- **content** - The scrolling region inside the body (the slotted content). Inert while the content fits; over-stuffed, it scrolls under a System 7 rail and becomes a keyboard stop.",
608
658
  "doc-url": "",
609
659
  "attributes": [
610
660
  {
611
661
  "name": "heading",
612
- "description": "Title text: the bar's centered patch, or the plain frame's heading.",
662
+ "description": "Title text: the bar's centered patch, and the dialog's accessible name.\nWith `frame=\"plain\"`, which has no bar, it only names the dialog.",
613
663
  "value": { "type": "string", "default": "''" }
614
664
  },
615
665
  {
616
666
  "name": "label",
617
- "description": "Accessible name for the dialog (`aria-label`), for a dialog with no\n`heading` — an untitled title bar has no text to be named by. Ignored when\nempty and a `heading` is set (the title patch names the dialog then);\ndefaults to `'Dialog'` when neither is given.",
667
+ "description": "Accessible name for the dialog (`aria-label`), for a dialog with no\n`heading` — an untitled title bar has no text to be named by. Ignored when\nempty and a `heading` is set (the heading names the dialog then);\ndefaults to `'Dialog'` when neither is given.",
618
668
  "value": { "type": "string", "default": "''" }
619
669
  },
620
670
  {
@@ -659,11 +709,7 @@
659
709
  }
660
710
  ],
661
711
  "slots": [
662
- { "name": "", "description": "Default slot: dialog body content." },
663
- {
664
- "name": "buttons",
665
- "description": "Optional action buttons. Rendered as a bottom-right `vf-button-group` (equal-width, faces aligned); the footer only takes space when the slot is populated."
666
- }
712
+ { "name": "", "description": "Default slot: the dialog's content." }
667
713
  ],
668
714
  "events": [
669
715
  {
@@ -675,12 +721,12 @@
675
721
  "properties": [
676
722
  {
677
723
  "name": "heading",
678
- "description": "Title text: the bar's centered patch, or the plain frame's heading.",
724
+ "description": "Title text: the bar's centered patch, and the dialog's accessible name.\nWith `frame=\"plain\"`, which has no bar, it only names the dialog.",
679
725
  "type": "string"
680
726
  },
681
727
  {
682
728
  "name": "label",
683
- "description": "Accessible name for the dialog (`aria-label`), for a dialog with no\n`heading` — an untitled title bar has no text to be named by. Ignored when\nempty and a `heading` is set (the title patch names the dialog then);\ndefaults to `'Dialog'` when neither is given.",
729
+ "description": "Accessible name for the dialog (`aria-label`), for a dialog with no\n`heading` — an untitled title bar has no text to be named by. Ignored when\nempty and a `heading` is set (the heading names the dialog then);\ndefaults to `'Dialog'` when neither is given.",
684
730
  "type": "string"
685
731
  },
686
732
  {
@@ -756,6 +802,11 @@
756
802
  "name": "fixed",
757
803
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
758
804
  "value": { "type": "boolean", "default": "false" }
805
+ },
806
+ {
807
+ "name": "origin",
808
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
809
+ "value": { "type": "PlacementOrigin | null | undefined" }
759
810
  }
760
811
  ],
761
812
  "slots": [
@@ -787,6 +838,11 @@
787
838
  "name": "fixed",
788
839
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
789
840
  "type": "boolean"
841
+ },
842
+ {
843
+ "name": "origin",
844
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
845
+ "type": "PlacementOrigin | null | undefined"
790
846
  }
791
847
  ],
792
848
  "events": []
@@ -846,6 +902,11 @@
846
902
  "name": "fixed",
847
903
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
848
904
  "value": { "type": "boolean", "default": "false" }
905
+ },
906
+ {
907
+ "name": "origin",
908
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
909
+ "value": { "type": "PlacementOrigin | null | undefined" }
849
910
  }
850
911
  ],
851
912
  "slots": [
@@ -906,6 +967,11 @@
906
967
  "name": "fixed",
907
968
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
908
969
  "type": "boolean"
970
+ },
971
+ {
972
+ "name": "origin",
973
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
974
+ "type": "PlacementOrigin | null | undefined"
909
975
  }
910
976
  ],
911
977
  "events": []
@@ -950,6 +1016,11 @@
950
1016
  "name": "fixed",
951
1017
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
952
1018
  "value": { "type": "boolean", "default": "false" }
1019
+ },
1020
+ {
1021
+ "name": "origin",
1022
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1023
+ "value": { "type": "PlacementOrigin | null | undefined" }
953
1024
  }
954
1025
  ],
955
1026
  "slots": [{ "name": "", "description": "The icons." }],
@@ -992,6 +1063,11 @@
992
1063
  "name": "fixed",
993
1064
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
994
1065
  "type": "boolean"
1066
+ },
1067
+ {
1068
+ "name": "origin",
1069
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1070
+ "type": "PlacementOrigin | null | undefined"
995
1071
  }
996
1072
  ],
997
1073
  "events": []
@@ -999,7 +1075,7 @@
999
1075
  },
1000
1076
  {
1001
1077
  "name": "vf-icon",
1002
- "description": "`<vf-icon>` — a Finder icon: pixel art in a reserved cell with its name on a\nplate below, selectable, movable and renameable in place.\n\nIt is the one composite in the kit whose parts already existed separately —\n`vf-img` draws the art, `vf-list-item` inverts on selection, `vf-window`\ndrags — and the reason to have it anyway is that the *icon* is the unit the\nFinder actually manipulates. A picture and a caption that select together,\nmove together and rename together is a control, not a layout.\n\n### The art arrives by slot\n\nTwo slots, one per resource size — `large` is the 32×32 `ICN#` and `small`\nthe 16×16 `ics#` — each holding a `vf-img` around the consumer's own `<img>`:\n\n```html\n<vf-icon label=\"Macintosh HD\" selectable movable editable>\n <vf-img slot=\"large\"><img src=\"hd-32.png\" alt=\"\"></vf-img>\n <vf-img slot=\"small\"><img src=\"hd-16.png\" alt=\"\"></vf-img>\n</vf-icon>\n```\n\nSlots rather than `src` properties, for the reason `vf-img` exists at all:\nthe kit ships no raster files and never builds an `<img>` on a consumer's\nbehalf, so the graphic stays a real element in the light DOM with its own\n`alt`, `srcset`, loading behavior and asset URLs. A `src` string can express\nnone of that, and it could not hold an inline `<svg>` or a `<canvas>` either.\n`vf-list-item`'s `icon` slot makes the same trade.\n\nThe cost is that both files fetch even though one paints — pay it with two\ndata URIs, or slot only the size that view uses.\n\n### The cell is reserved, the art is registered in it\n\n`size` picks which slot paints *and* the cell it paints in: 32×32 or 16×16,\nheld whether or not there is art for it. A folder is 32×20 of ink and a\ndocument 25×32, and a row of them keeps one baseline only because the cell —\nnot the ink — is the unit, which is what an icon resource always was.\n\n### Everything centered lands on a whole pixel, by parity\n\nThe frame centers two things over one axis — the art cell and the name — and\na centered child sits at `(box − child) / 2`. That is a whole number exactly\nwhen the box and the child have the **same parity**. Half a system pixel is\nwhat fringes 1-bit art: the glyph stems smear across two device columns and\ngo gray, while the plate behind them stays sharp, because backgrounds are\npixel-snapped by the compositor and glyphs are not. A crisp plate under a\ngrey name is the signature of exactly this.\n\nSo the component makes the parities agree instead of correcting afterwards.\nThe cell is 32 or 16, and #measurePlate sizes the name plate to a\nwhole **even** number of system px — measured from the text, rounded up. Both\nchildren are then even, and so is every offset, at every display density and\nwhether or not a `width` is declared. Nothing is snapped, nothing leans on\nthe rasterizer, and `verify:icon` asserts both the geometry and that a field\nof names renders without a single gray pixel — with the kit's normal\nantialiasing left on, since a run on whole pixels gives it nothing to smooth.\n\nYour side of it is one rule: **a declared `width` must be even**, since the\ncomponent cannot round a number you chose. Supply art at the cell size too —\nwhich \"one image pixel is one system pixel\" already implies — because art\ndiffering from its cell by an odd number centers the same way.\n\n### Selection inverts, because the art is a 1-bit mask\n\nA System 7 icon is black ink and opaque white on a transparent surround —\nprecisely an image plus its mask — so inverting it flips ink and fill and\nleaves the surround alone, which is the whole of the classic selected\nappearance. `filter: invert(1)` reproduces it exactly for 1-bit art. Color\nart would invert into a photographic negative, which was never what\nSystem 7 showed: declare `color` and selection **darkens** the art\ninstead — Icon Utilities' ttSelected transform, every color blended\nhalfway toward black (`brightness(0.5)`), whites going gray, the\ntransparent surround still untouched. The declaration is the consumer's\nbecause the component cannot tell color art from a mask by looking at a\nslotted image. It covers whatever the cell shows, the derived open ghost\nincluded, so a color icon has one selected treatment open or closed. The\nlabel plate inverts to the `--vf-highlight` pair either way, sharing one\nselection color with `vf-list-item` — the selected name was inverted\nwhatever the art.\n\n### Open is derived, not shipped\n\nWith `open`, the art redraws as the Finder's open ghost: the outline held\nin solid black, the interior re-filled with the kit's loose 25% dither (the\nscrollbar trough's lattice), the transparent surround untouched. There is\nno second raster and no second fetch — the same alpha channel that makes\nselection an inversion makes the ghost derivable, and `src/open-art.ts`\nderives it from the slotted art by canvas compositing alone. No pixels are\never read back, so a cross-origin image that taints its canvas still works:\ntaint forbids reading, not drawing or displaying.\n\nThe ghost keeps the shape selection expects — ink and opaque white on a\ntransparent surround — so a selected open icon inverts exactly as a closed\none does, with no second treatment. The slot stays in the tree while the\nghost paints, hidden (it is where the art loads, and re-loads, from), and\nart the pipeline cannot draw — nothing slotted yet, a failed load, an\ninline `<svg>` — keeps rendering as itself rather than vanishing behind a\nstate it cannot show.\n\n### `movable`, not `draggable`\n\n`draggable` is a global HTML attribute *and* an `HTMLElement` accessor, so\ndeclaring it would both shadow a platform member and hand the element to the\nbrowser's own drag-and-drop machinery. This is the `align` trap from\n`vf-stack` in a second costume — `align`, `hidden`, `dir`, `draggable` and\n`title` all carry behavior a custom element never asked for. The kit already\nspells this parameter `movable` on `vf-window`, so the icon does too, and it\nmoves the same way: `DragController` tracks the gesture and\n`PlacementController` writes the result into `left`/`top` in whole system px,\nthe art's own unit — the same pair markup places an icon with, so a moved\nicon is still where it was dropped after a zoom.\n\nDragging is a pointer gesture with no keyboard equivalent, which is the kind\nof gap the kit closes rather than inherits (SPEC §1): a focused movable icon\nalso moves under the arrow keys, one system px at a time and eight with\nShift. Focus is what `selectable` grants, so the keyboard half of `movable`\nand `editable` presupposes it — see the role section below.\n\n### The drag is an outline; the icon stays put\n\nThe Finder dragged an icon as a dotted outline — the mask's boundary and\nthe name's rectangle — drawn over everything with the XOR pen, the icon\nitself staying put until the drop. The kit draws it from what it already\nhas: deriveDragOutline finds the ring the way the open ghost does\n(the silhouette from the art's alpha, eroded by one pixel, the ring the\nerosion removes), adds the plate's rectangle, and dotOutline dots\nit against a 2×2 checker — compositing only, so cross-origin art derives\ntoo, and art the pipeline cannot draw falls back to the cell's rectangle.\nThe canvas paints with the cursor's XOR recipe, `filter: invert(1)` under\n`mix-blend-mode: difference`: a dotted black line over a white window\nbody, and over the desktop dither a black line, the composition\nQuickDraw's pattern pen gave — the checker's phase is taken from where\nthe outline lands on the *screen* (penPhase), so its dots fall on\nthe pixels the dither leaves white wherever it goes, and the dither's own\nink fills in between them.\n\nIt draws on the desktop's drag surface: a layer in the screen's shadow,\nover windows, palettes and the menu bar alike, clipped at the raster's\nedge like everything else, reached through the `vf-drag-surface-request`\nhandshake (bubbles, non-composed — it travels up the slots the icon is\nassigned to, so it works from inside a window body). With no desktop the\ncanvas lives in the icon's own frame instead, translated by the delta,\nclipped by whatever clips the icon; the gesture and its events are the\nsame either way. Its origin is a whole count of system px from the\nsurface's, written as a live `sysLength()`, so a scale change mid-gesture\ncannot smear it.\n\n### The drag reports, the page files\n\nThe kit ships no filing semantics — folders are the page's own catalog —\nso a drag is a stream of events and a cancelable commit, on the icon:\n\n- `vf-drag-start` `{ left, top }` on the first lattice step away from the\n press (a plain click never starts one, and never fires a drop);\n- `vf-drag` `{ clientX, clientY, left, top, x, y }` on every step that\n changed the snapped proposal;\n- `vf-drop`, the same shape at the release, **cancelable**: its default\n action is the move, the proposal written through `left`/`top` and\n clamped whole in the container measured at the press. `preventDefault()`\n writes nothing — the page re-parents or places the icon itself, the\n outline's origin converted with the destination's `placementAt`;\n- `vf-drag-cancel` `{}` on Escape or a `pointercancel`: nothing written.\n\n`left`/`top` in the detail are the *proposal*, unclamped — the origin plus\nthe lattice-snapped delta — and only the default action clamps, so a page\nthat cancels gets the raw gesture. `x`/`y` are the outline's top-left in\nviewport CSS px: the frame's box at the press translated by the delta,\nthe press offset already inside it, so an icon placed at the\ndestination's `placementAt(x, y)` lands exactly where the outline was.\n\n### The selection travels\n\nA drag that begins on a *selected* icon takes every other selected,\nmovable icon of its field with it — the Finder outlined the whole\nselection under a drag on any member. Each follower draws its own outline\n(followDrag), moved by the same lattice delta as the leader's, and\nthe leader's events carry the set as `detail.icons`, itself first. The\ndefault action of the drop clamps the delta once for the whole group —\nthe arrangement is kept, and the group stops when its outermost member\nmeets the container's edge — then writes each member's origin plus that\ndelta. A cancel takes every outline down and writes nothing. A press on\nan unselected icon makes it the selection first (the outside listeners\nclear the others), so it drags alone; a Shift press that deselects the\npressed icon drags it alone too, the rest staying where they are.\n\nFor the selection to travel, a plain press on one of its members must not\ncollapse it: the other icons' outside-press listeners leave a selection\nalone when the press landed on an icon already selected in the same\nfield. A *click* on such an icon — released with no drag — collapses the\nselection to it on the release, so a click still single-selects and the\nsame press could have dragged them all.\n\nEscape is heard by a document listener scoped to the gesture rather than\nby the icon's own key handler, because a `movable`-only icon never takes\nfocus — an addition in the kit's idiom (a pointer-only gesture with no way\nout is the kind of gap SPEC §1 closes), not a claim about the Finder.\n\n`target` is the destination highlight the page sets on the folder under a\ndrag: the selected treatment of the art alone — inverted, or darkened\nunder `color` — with none of `selected`'s semantics: no event, no outside\nlistener, no `aria-selected`, the plate untouched.\n\nOpening gets the same treatment. The double-click is the pointer gesture,\nand its keyboard route is ⌘O / ⌘↓ — the System 7 Open shortcuts, with Ctrl\nstanding in for ⌘ off the Mac. Return is deliberately not one of them: the\nFinder's Return renamed, never opened, so on an editable icon it starts the\nedit and on a non-editable one it does nothing at all.\n\n### The name and the art are one target, and the second click decides\n\nA double-click opens the icon *wherever it lands* — the name is as much the\nicon as the picture is, and the Finder never made you aim at the 32 pixels of\nart. But the name is also where a single click renames, so the two gestures\nbegin with the same press and only the second one tells them apart.\n\nSo the rename waits for it. A press on the plate of an already-selected icon\narms the field rather than opening it, and the next press inside\nRENAME_DELAY_MS calls it off — leaving the double-click to open, with\nno rename box flashing up behind it. Nothing needs to *undo* an edit that\nbegan: the press that starts one and the press that opens are the same\npress, so the only thing that can be got right is not committing early.\n\nThe window is generous in the one direction that is cheap. Reading a lone\nclick as a pair costs a wait before the box appears; reading a pair as a lone\nclick renames when the user asked to open. The same reasoning covers a press\nthat turns into a drag, a press elsewhere, and any key — each calls the\npending rename off, because none of them is the click it is waiting for.\n\n### An icon alone is a picture; an icon in a field is an option\n\n`role=\"option\"` is only meaningful inside a `listbox` that owns it. Written\nunconditionally it is not merely untidy — the browser *drops* it, and\n`aria-selected` with it, so a `selectable` icon announced as a bare generic\nand its selection state reached assistive tech nowhere at all.\n\nSo the role follows the container. Owned, the icon is an `option` that names\nitself from its plate and publishes `aria-selected`. Unowned, it degrades to\n`role=\"img\"` with a name — the same vocabulary the derived open ghost uses,\nand true of what it is. Deliberately not `button`: that would promise Enter\nand Space activate, and here Return *renames* while the open route is ⌘O / ⌘↓.\n\nThe owner is `vf-icon-field`, the container a field of icons sits in, and\nit is what buys the selection state back:\n\n```html\n<vf-icon-field label=\"Desktop\">\n <vf-icon label=\"Macintosh HD\" selectable movable editable>…</vf-icon>\n <vf-icon label=\"Trash\" selectable movable editable>…</vf-icon>\n</vf-icon-field>\n```\n\nA `vf-desktop` cannot be that container itself: it also holds windows and a\nmenu bar, and a non-`option` child of a listbox is invalid the same way the\norphaned option was. The field is layout-neutral — placed icons anchor to\nthe nearest *positioned* ancestor, which is still the desktop's raster. An\nelement of your own carrying `role=\"listbox\"` still owns an icon the same\nway. One divergence from the APG listbox is deliberate: its options share\na single roving tab stop, while these stay one stop each, the way a Finder\nicon is reached on its own.\n\n**`selectable` is what makes an icon focusable**, and `movable`/`editable`\npresuppose it. That is the Finder's own model — you cannot move or rename\nwhat you have not selected — and the pointer path already assumed it: the\nrename opens on a press on the plate of an *already-selected* icon. A\n`movable`-only icon is a picture you can drag, not a widget.\n\n### The label is a property, because it is editable\n\nThe caption is `label` rather than slotted content: renaming means the\ncomponent owns the string and hands it back on `vf-change`, and it cannot own\ntext that lives in the consumer's DOM. An empty `label` draws no plate at\nall — that *is* the \"no label\" parameter, in preference to a second attribute\nthat could disagree with it. `editable` then lets a click on the plate of an\nalready-selected icon open the rename box a moment later, as the Finder's\ndoes (see above), with Return committing, Escape reverting, and the plate\nwidening as you type.\n\n### A name is never abbreviated, and never folded\n\nThere is no ellipsis, no clipping and no wrapping: one line, always. System 7\nsolved the long-name problem at the *other* end — HFS capped a filename at 31\ncharacters — so the Finder could afford to always draw the name in full, and\ndid. A name wider than its cell simply overflows it, centered, the way a name\nwider than a 32-pixel icon always did.\n\nStaying on one line is also what keeps the name on the grid: a single run has\na single measured width, so the even-plate rule above is one number rather\nthan one per line, each with its own parity. `width` is therefore the cell —\nthe grid pitch — not a bound on the name.\n\n`maxlength` (31) bounds the rename field rather than the `label` property:\nthe name belongs to the consumer's model, and truncating one handed to us\nwould lose data.\n\nThe box hugs its text while you type it, not only once you are done, which is\nwhat keeps the name from moving when the edit commits: the plate is the same\nwidth either side of it, so the glyphs stay exactly where they were.\n\nA file also has to be called *something*, so a rename committed empty — or\nas nothing but spaces — is refused rather than applied, and the previous name\ncomes back, which is what System 7 did. An empty `label` is still a perfectly\ngood state to *start* in, though: a freshly made icon has no name until it is\ngiven one. Such an icon draws no plate but stays selectable, focusable and\nrenameable — Return opens a field, and an edit with nothing in it yet is the\none time the box stops hugging and reserves a cell's width, since a field you\ncannot see is one you cannot type into.\n---\n\n\n### **Events:**\n - **vf-select** - Selection changed by user interaction. `detail: { selected: boolean }`.\n- **vf-change** - The name was committed. `detail: { label: string, previous: string }`.\n- **vf-open** - The icon was opened — double-clicked anywhere on it, its name included, or ⌘O / ⌘↓ from the keyboard (Ctrl off the Mac), the System 7 shortcuts. Return renames instead, as the Finder's did. `detail: {}`.\n- **vf-name-too-long** - A rename was typed or pasted past `maxlength`, and the field refused the excess. `detail: { attempted, accepted, limit }` — enough to raise the alert System 7 raised rather than drop the characters silently. Not fired for a `label` set from your own code, which is never truncated in the first place.\n- **vf-name-rejected** - A rename was committed with no name in it, so the edit was dropped and the old name put back. `detail: { attempted, kept, reason: 'empty' }`. A `vf-change` is *not* fired alongside it — nothing changed.\n- **vf-drag-start** - A drag began: the first lattice step away from the press. `detail: { left, top, icons }` — the origin, whole system px in the icon's container, and every icon the drag carries (this one first).\n- **vf-drag** - A step that changed the proposal. `detail: { clientX, clientY, left, top, x, y, icons }` — the pointer in viewport CSS px, the proposed origin in the container (whole system px on the lattice), the outline's top-left in viewport CSS px, and the icons travelling.\n- **vf-drop** - The release; cancelable. The same detail as `vf-drag`. Its default action writes the proposal through `left`/`top` — every icon in `icons` by the same delta, clamped whole in the container as a group; `preventDefault()` writes nothing.\n- **vf-drag-cancel** - The drag was abandoned — Escape, or a `pointercancel` — and nothing was written. `detail: {}`.\n\n### **Slots:**\n - **large** - The 32×32 art, normally a `vf-img` around an `<img>`.\n- **small** - The 16×16 art, shown under `size=\"small\"`.\n\n### **CSS Properties:**\n - **--vf-icon-gap** - Space between the art cell and the name plate _(default: undefined)_\n- **--vf-icon-label-height** - The name plate's line box _(default: undefined)_\n\n### **CSS Parts:**\n - **frame** - The icon and its label plate, stacked.\n- **icon** - The reserved art cell.\n- **label** - The name block; its lines are centered under the art.\n- **plate** - The inked run behind the name, which each wrapped line gets its own of (inverts when selected).\n- **input** - The rename field, while editing.",
1078
+ "description": "`<vf-icon>` — a Finder icon: pixel art in a reserved cell with its name on a\nplate below, selectable, movable and renameable in place.\n\nIt is the one composite in the kit whose parts already existed separately —\n`vf-img` draws the art, `vf-list-item` inverts on selection, `vf-window`\ndrags — and the reason to have it anyway is that the *icon* is the unit the\nFinder actually manipulates. A picture and a caption that select together,\nmove together and rename together is a control, not a layout.\n\n### The art arrives by slot\n\nTwo slots, one per resource size — `large` is the 32×32 `ICN#` and `small`\nthe 16×16 `ics#` — each holding a `vf-img` around the consumer's own `<img>`:\n\n```html\n<vf-icon label=\"Macintosh HD\" selectable movable editable>\n <vf-img slot=\"large\"><img src=\"hd-32.png\" alt=\"\"></vf-img>\n <vf-img slot=\"small\"><img src=\"hd-16.png\" alt=\"\"></vf-img>\n</vf-icon>\n```\n\nSlots rather than `src` properties, for the reason `vf-img` exists at all:\nthe kit ships no raster files and never builds an `<img>` on a consumer's\nbehalf, so the graphic stays a real element in the light DOM with its own\n`alt`, `srcset`, loading behavior and asset URLs. A `src` string can express\nnone of that, and it could not hold an inline `<svg>` or a `<canvas>` either.\n`vf-list-item`'s `icon` slot makes the same trade.\n\nThe cost is that both files fetch even though one paints — pay it with two\ndata URIs, or slot only the size that view uses.\n\n### The cell is reserved, the art is registered in it\n\n`size` picks which slot paints *and* the cell it paints in: 32×32 or 16×16,\nheld whether or not there is art for it. A folder is 32×20 of ink and a\ndocument 25×32, and a row of them keeps one baseline only because the cell —\nnot the ink — is the unit, which is what an icon resource always was.\n\n### Everything centered lands on a whole pixel, by parity\n\nThe frame centers two things over one axis — the art cell and the name — and\na centered child sits at `(box − child) / 2`. That is a whole number exactly\nwhen the box and the child have the **same parity**. Half a system pixel is\nwhat fringes 1-bit art: the glyph stems smear across two device columns and\ngo gray, while the plate behind them stays sharp, because backgrounds are\npixel-snapped by the compositor and glyphs are not. A crisp plate under a\ngrey name is the signature of exactly this.\n\nSo the component makes the parities agree instead of correcting afterwards.\nThe cell is 32 or 16, and #measurePlate sizes the name plate to a\nwhole **even** number of system px — measured from the text, rounded up. Both\nchildren are then even, and so is every offset, at every display density and\nwhether or not a `width` is declared. Nothing is snapped, nothing leans on\nthe rasterizer, and `verify:icon` asserts both the geometry and that a field\nof names renders without a single gray pixel — with the kit's normal\nantialiasing left on, since a run on whole pixels gives it nothing to smooth.\n\nYour side of it is one rule: **a declared `width` must be even**, since the\ncomponent cannot round a number you chose. Supply art at the cell size too —\nwhich \"one image pixel is one system pixel\" already implies — because art\ndiffering from its cell by an odd number centers the same way.\n\n### Selection inverts, because the art is a 1-bit mask\n\nA System 7 icon is black ink and opaque white on a transparent surround —\nprecisely an image plus its mask — so inverting it flips ink and fill and\nleaves the surround alone, which is the whole of the classic selected\nappearance. `filter: invert(1)` reproduces it exactly for 1-bit art. Color\nart would invert into a photographic negative, which was never what\nSystem 7 showed: declare `color` and selection **darkens** the art\ninstead — Icon Utilities' ttSelected transform, every color blended\nhalfway toward black (`brightness(0.5)`), whites going gray, the\ntransparent surround still untouched. The declaration is the consumer's\nbecause the component cannot tell color art from a mask by looking at a\nslotted image. It covers whatever the cell shows, the derived open ghost\nincluded, so a color icon has one selected treatment open or closed. The\nlabel plate inverts to the `--vf-highlight` pair either way, sharing one\nselection color with `vf-list-item` — the selected name was inverted\nwhatever the art.\n\n### Open is derived, not shipped\n\nWith `open`, the art redraws as the Finder's open ghost: the outline held\nin solid black, the interior re-filled with the kit's loose 25% dither (the\nscrollbar trough's lattice), the transparent surround untouched. There is\nno second raster and no second fetch — the same alpha channel that makes\nselection an inversion makes the ghost derivable, and `src/open-art.ts`\nderives it from the slotted art by canvas compositing alone. No pixels are\never read back, so a cross-origin image that taints its canvas still works:\ntaint forbids reading, not drawing or displaying.\n\nThe ghost keeps the shape selection expects — ink and opaque white on a\ntransparent surround — so a selected open icon inverts exactly as a closed\none does, with no second treatment. The slot stays in the tree while the\nghost paints, hidden (it is where the art loads, and re-loads, from), and\nart the pipeline cannot draw — nothing slotted yet, a failed load, an\ninline `<svg>` — keeps rendering as itself rather than vanishing behind a\nstate it cannot show.\n\n### `movable`, not `draggable`\n\n`draggable` is a global HTML attribute *and* an `HTMLElement` accessor, so\ndeclaring it would both shadow a platform member and hand the element to the\nbrowser's own drag-and-drop machinery. This is the `align` trap from\n`vf-stack` in a second costume — `align`, `hidden`, `dir`, `draggable` and\n`title` all carry behavior a custom element never asked for. The kit already\nspells this parameter `movable` on `vf-window`, so the icon does too, and it\nmoves the same way: `DragController` tracks the gesture and\n`PlacementController` writes the result into `left`/`top` in whole system px,\nthe art's own unit — the same pair markup places an icon with, so a moved\nicon is still where it was dropped after a zoom.\n\nDragging is a pointer gesture with no keyboard equivalent, which is the kind\nof gap the kit closes rather than inherits (SPEC §1): a focused movable icon\nalso moves under the arrow keys, one system px at a time and eight with\nShift. Focus is what `selectable` grants, so the keyboard half of `movable`\nand `editable` presupposes it — see the role section below.\n\n### The drag is an outline; the icon stays put\n\nThe Finder dragged an icon as a dotted outline — the mask's boundary and\nthe name's rectangle — drawn over everything with the XOR pen, the icon\nitself staying put until the drop. The kit draws it from what it already\nhas: deriveDragOutline finds the ring the way the open ghost does\n(the silhouette from the art's alpha, the plate's rectangle united with\nit, the whole inset by one pixel as `FrameRgn` inset a region, the ring\nthe inset removes — so where the art and the plate abut, the outline\nwraps around both), and dotOutline dots it against a 2×2 checker\n— compositing only, so cross-origin art derives too, and art the\npipeline cannot draw falls back to the cell's rectangle. The canvas\ncovers the frame widened to the plate, since a name wider than a\ndeclared `width` overhangs the frame.\nThe canvas paints with the cursor's XOR recipe, `filter: invert(1)` under\n`mix-blend-mode: difference`: a dotted black line over a white window\nbody, and over the desktop dither a black line, the composition\nQuickDraw's pattern pen gave — the checker's phase is taken from where\nthe outline lands on the *screen* (penPhase), so its dots fall on\nthe pixels the dither leaves white wherever it goes, and the dither's own\nink fills in between them.\n\nIt draws on the desktop's drag surface: a layer in the screen's shadow,\nover windows, palettes and the menu bar alike, clipped at the raster's\nedge like everything else, reached through the `vf-drag-surface-request`\nhandshake (bubbles, non-composed — it travels up the slots the icon is\nassigned to, so it works from inside a window body). With no desktop the\ncanvas lives in the icon's own frame instead, translated by the delta,\nclipped by whatever clips the icon; the gesture and its events are the\nsame either way. Its origin is a whole count of system px from the\nsurface's, written as a live `sysLength()`, so a scale change mid-gesture\ncannot smear it.\n\n### The drag reports, the page files\n\nThe kit ships no filing semantics — folders are the page's own catalog —\nso a drag is a stream of events and a cancelable commit, on the icon:\n\n- `vf-drag-start` `{ left, top }` on the first lattice step away from the\n press (a plain click never starts one, and never fires a drop);\n- `vf-drag` `{ clientX, clientY, left, top, x, y }` on every step that\n changed the snapped proposal;\n- `vf-drop`, the same shape at the release, **cancelable**: its default\n action is the move, the proposal written through `left`/`top` and\n clamped whole in the container measured at the press. `preventDefault()`\n writes nothing — the page re-parents or places the icon itself, the\n outline's origin converted with the destination's `placementAt`;\n- `vf-drag-cancel` `{}` on Escape or a `pointercancel`: nothing written.\n\n`left`/`top` in the detail are the *proposal*, unclamped — the origin plus\nthe lattice-snapped delta — and only the default action clamps, so a page\nthat cancels gets the raw gesture. `x`/`y` are the outline's top-left in\nviewport CSS px: the frame's box at the press translated by the delta,\nthe press offset already inside it, so an icon placed at the\ndestination's `placementAt(x, y)` lands exactly where the outline was.\n\n### The selection travels\n\nA drag that begins on a *selected* icon takes every other selected,\nmovable icon of its field with it — the Finder outlined the whole\nselection under a drag on any member. Each follower draws its own outline\n(followDrag), moved by the same lattice delta as the leader's, and\nthe leader's events carry the set as `detail.icons`, itself first. The\ndefault action of the drop clamps the delta once for the whole group —\nthe arrangement is kept, and the group stops when its outermost member\nmeets the container's edge — then writes each member's origin plus that\ndelta. A cancel takes every outline down and writes nothing. A press on\nan unselected icon makes it the selection first (the outside listeners\nclear the others), so it drags alone; a Shift press that deselects the\npressed icon drags it alone too, the rest staying where they are.\n\nFor the selection to travel, a plain press on one of its members must not\ncollapse it: the other icons' outside-press listeners leave a selection\nalone when the press landed on an icon already selected in the same\nfield. A *click* on such an icon — released with no drag — collapses the\nselection to it on the release, so a click still single-selects and the\nsame press could have dragged them all.\n\nEscape is heard by a document listener scoped to the gesture rather than\nby the icon's own key handler, because a `movable`-only icon never takes\nfocus — an addition in the kit's idiom (a pointer-only gesture with no way\nout is the kind of gap SPEC §1 closes), not a claim about the Finder.\n\n`target` is the destination highlight the page sets on the folder under a\ndrag: the selected treatment of the art alone — inverted, or darkened\nunder `color` — with none of `selected`'s semantics: no event, no outside\nlistener, no `aria-selected`, the plate untouched.\n\nOpening gets the same treatment. The double-click is the pointer gesture,\nand its keyboard route is ⌘O / ⌘↓ — the System 7 Open shortcuts, with Ctrl\nstanding in for ⌘ off the Mac. Return is deliberately not one of them: the\nFinder's Return renamed, never opened, so on an editable icon it starts the\nedit and on a non-editable one it does nothing at all.\n\n### The name and the art are one target, and the second click decides\n\nA double-click opens the icon *wherever it lands* — the name is as much the\nicon as the picture is, and the Finder never made you aim at the 32 pixels of\nart. But the name is also where a single click renames, so the two gestures\nbegin with the same press and only the second one tells them apart.\n\nSo the rename waits for it. A press on the plate of an already-selected icon\narms the field rather than opening it, and the next press inside\nRENAME_DELAY_MS calls it off — leaving the double-click to open, with\nno rename box flashing up behind it. Nothing needs to *undo* an edit that\nbegan: the press that starts one and the press that opens are the same\npress, so the only thing that can be got right is not committing early.\n\nThe window is generous in the one direction that is cheap. Reading a lone\nclick as a pair costs a wait before the box appears; reading a pair as a lone\nclick renames when the user asked to open. The same reasoning covers a press\nthat turns into a drag, a press elsewhere, and any key — each calls the\npending rename off, because none of them is the click it is waiting for.\n\n### An icon alone is a picture; an icon in a field is an option\n\n`role=\"option\"` is only meaningful inside a `listbox` that owns it. Written\nunconditionally it is not merely untidy — the browser *drops* it, and\n`aria-selected` with it, so a `selectable` icon announced as a bare generic\nand its selection state reached assistive tech nowhere at all.\n\nSo the role follows the container. Owned, the icon is an `option` that names\nitself from its plate and publishes `aria-selected`. Unowned, it degrades to\n`role=\"img\"` with a name — the same vocabulary the derived open ghost uses,\nand true of what it is. Deliberately not `button`: that would promise Enter\nand Space activate, and here Return *renames* while the open route is ⌘O / ⌘↓.\n\nThe owner is `vf-icon-field`, the container a field of icons sits in, and\nit is what buys the selection state back:\n\n```html\n<vf-icon-field label=\"Desktop\">\n <vf-icon label=\"Macintosh HD\" selectable movable editable>…</vf-icon>\n <vf-icon label=\"Trash\" selectable movable editable>…</vf-icon>\n</vf-icon-field>\n```\n\nA `vf-desktop` cannot be that container itself: it also holds windows and a\nmenu bar, and a non-`option` child of a listbox is invalid the same way the\norphaned option was. The field is layout-neutral — placed icons anchor to\nthe nearest *positioned* ancestor, which is still the desktop's raster. An\nelement of your own carrying `role=\"listbox\"` still owns an icon the same\nway. One divergence from the APG listbox is deliberate: its options share\na single roving tab stop, while these stay one stop each, the way a Finder\nicon is reached on its own.\n\n**`selectable` is what makes an icon focusable**, and `movable`/`editable`\npresuppose it. That is the Finder's own model — you cannot move or rename\nwhat you have not selected — and the pointer path already assumed it: the\nrename opens on a press on the plate of an *already-selected* icon. A\n`movable`-only icon is a picture you can drag, not a widget.\n\n### The label is a property, because it is editable\n\nThe caption is `label` rather than slotted content: renaming means the\ncomponent owns the string and hands it back on `vf-change`, and it cannot own\ntext that lives in the consumer's DOM. An empty `label` draws no plate at\nall — that *is* the \"no label\" parameter, in preference to a second attribute\nthat could disagree with it. `editable` then lets a click on the plate of an\nalready-selected icon open the rename box a moment later, as the Finder's\ndoes (see above), with Return committing, Escape reverting, and the plate\nwidening as you type.\n\n### A name is never abbreviated, and never folded\n\nThere is no ellipsis, no clipping and no wrapping: one line, always. System 7\nsolved the long-name problem at the *other* end — HFS capped a filename at 31\ncharacters — so the Finder could afford to always draw the name in full, and\ndid. A name wider than its cell simply overflows it, centered, the way a name\nwider than a 32-pixel icon always did.\n\nStaying on one line is also what keeps the name on the grid: a single run has\na single measured width, so the even-plate rule above is one number rather\nthan one per line, each with its own parity. `width` is therefore the cell —\nthe grid pitch — not a bound on the name.\n\n`maxlength` (31) bounds the rename field rather than the `label` property:\nthe name belongs to the consumer's model, and truncating one handed to us\nwould lose data.\n\nThe box hugs its text while you type it, not only once you are done, which is\nwhat keeps the name from moving when the edit commits: the plate is the same\nwidth either side of it, so the glyphs stay exactly where they were.\n\nA file also has to be called *something*, so a rename committed empty — or\nas nothing but spaces — is refused rather than applied, and the previous name\ncomes back, which is what System 7 did. An empty `label` is still a perfectly\ngood state to *start* in, though: a freshly made icon has no name until it is\ngiven one. Such an icon draws no plate but stays selectable, focusable and\nrenameable — Return opens a field, and an edit with nothing in it yet is the\none time the box stops hugging and reserves a cell's width, since a field you\ncannot see is one you cannot type into.\n---\n\n\n### **Events:**\n - **vf-select** - Selection changed by user interaction. `detail: { selected: boolean }`.\n- **vf-change** - The name was committed. `detail: { label: string, previous: string }`.\n- **vf-open** - The icon was opened — double-clicked anywhere on it, its name included, or ⌘O / ⌘↓ from the keyboard (Ctrl off the Mac), the System 7 shortcuts. Return renames instead, as the Finder's did. `detail: {}`.\n- **vf-name-too-long** - A rename was typed or pasted past `maxlength`, and the field refused the excess. `detail: { attempted, accepted, limit }` — enough to raise the alert System 7 raised rather than drop the characters silently. Not fired for a `label` set from your own code, which is never truncated in the first place.\n- **vf-name-rejected** - A rename was committed with no name in it, so the edit was dropped and the old name put back. `detail: { attempted, kept, reason: 'empty' }`. A `vf-change` is *not* fired alongside it — nothing changed.\n- **vf-drag-start** - A drag began: the first lattice step away from the press. `detail: { left, top, icons }` — the origin, whole system px in the icon's container, and every icon the drag carries (this one first).\n- **vf-drag** - A step that changed the proposal. `detail: { clientX, clientY, left, top, x, y, icons }` — the pointer in viewport CSS px, the proposed origin in the container (whole system px on the lattice), the outline's top-left in viewport CSS px, and the icons travelling.\n- **vf-drop** - The release; cancelable. The same detail as `vf-drag`. Its default action writes the proposal through `left`/`top` — every icon in `icons` by the same delta, clamped whole in the container as a group; `preventDefault()` writes nothing.\n- **vf-drag-cancel** - The drag was abandoned — Escape, or a `pointercancel` — and nothing was written. `detail: {}`.\n\n### **Slots:**\n - **large** - The 32×32 art, normally a `vf-img` around an `<img>`.\n- **small** - The 16×16 art, shown under `size=\"small\"`.\n\n### **CSS Properties:**\n - **--vf-icon-gap** - Space between the art cell and the name plate; 0 by default, the plate directly under the cell as the Finder drew it _(default: undefined)_\n- **--vf-icon-label-height** - The name plate's line box _(default: undefined)_\n\n### **CSS Parts:**\n - **frame** - The icon and its label plate, stacked.\n- **icon** - The reserved art cell.\n- **label** - The name block; its lines are centered under the art.\n- **plate** - The inked run behind the name, which each wrapped line gets its own of (inverts when selected).\n- **input** - The rename field, while editing.",
1003
1079
  "doc-url": "",
1004
1080
  "attributes": [
1005
1081
  {
@@ -1071,6 +1147,11 @@
1071
1147
  "name": "fixed",
1072
1148
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1073
1149
  "value": { "type": "boolean", "default": "false" }
1150
+ },
1151
+ {
1152
+ "name": "origin",
1153
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1154
+ "value": { "type": "PlacementOrigin | null | undefined" }
1074
1155
  }
1075
1156
  ],
1076
1157
  "slots": [
@@ -1192,6 +1273,11 @@
1192
1273
  "name": "fixed",
1193
1274
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1194
1275
  "type": "boolean"
1276
+ },
1277
+ {
1278
+ "name": "origin",
1279
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1280
+ "type": "PlacementOrigin | null | undefined"
1195
1281
  }
1196
1282
  ],
1197
1283
  "events": [
@@ -1263,6 +1349,11 @@
1263
1349
  "name": "fixed",
1264
1350
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1265
1351
  "value": { "type": "boolean", "default": "false" }
1352
+ },
1353
+ {
1354
+ "name": "origin",
1355
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1356
+ "value": { "type": "PlacementOrigin | null | undefined" }
1266
1357
  }
1267
1358
  ],
1268
1359
  "slots": [
@@ -1298,6 +1389,11 @@
1298
1389
  "name": "fixed",
1299
1390
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1300
1391
  "type": "boolean"
1392
+ },
1393
+ {
1394
+ "name": "origin",
1395
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1396
+ "type": "PlacementOrigin | null | undefined"
1301
1397
  }
1302
1398
  ],
1303
1399
  "events": []
@@ -1347,6 +1443,11 @@
1347
1443
  "name": "fixed",
1348
1444
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1349
1445
  "value": { "type": "boolean", "default": "false" }
1446
+ },
1447
+ {
1448
+ "name": "origin",
1449
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1450
+ "value": { "type": "PlacementOrigin | null | undefined" }
1350
1451
  }
1351
1452
  ],
1352
1453
  "slots": [{ "name": "", "description": "The caption text." }],
@@ -1392,6 +1493,11 @@
1392
1493
  "name": "fixed",
1393
1494
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1394
1495
  "type": "boolean"
1496
+ },
1497
+ {
1498
+ "name": "origin",
1499
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1500
+ "type": "PlacementOrigin | null | undefined"
1395
1501
  }
1396
1502
  ],
1397
1503
  "events": []
@@ -1431,6 +1537,11 @@
1431
1537
  "name": "fixed",
1432
1538
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1433
1539
  "value": { "type": "boolean", "default": "false" }
1540
+ },
1541
+ {
1542
+ "name": "origin",
1543
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1544
+ "value": { "type": "PlacementOrigin | null | undefined" }
1434
1545
  }
1435
1546
  ],
1436
1547
  "slots": [
@@ -1478,6 +1589,11 @@
1478
1589
  "name": "fixed",
1479
1590
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1480
1591
  "type": "boolean"
1592
+ },
1593
+ {
1594
+ "name": "origin",
1595
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1596
+ "type": "PlacementOrigin | null | undefined"
1481
1597
  }
1482
1598
  ],
1483
1599
  "events": []
@@ -1522,6 +1638,11 @@
1522
1638
  "name": "fixed",
1523
1639
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1524
1640
  "value": { "type": "boolean", "default": "false" }
1641
+ },
1642
+ {
1643
+ "name": "origin",
1644
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1645
+ "value": { "type": "PlacementOrigin | null | undefined" }
1525
1646
  }
1526
1647
  ],
1527
1648
  "slots": [{ "name": "", "description": "`vf-list-item` elements." }],
@@ -1573,6 +1694,11 @@
1573
1694
  "name": "fixed",
1574
1695
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1575
1696
  "type": "boolean"
1697
+ },
1698
+ {
1699
+ "name": "origin",
1700
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1701
+ "type": "PlacementOrigin | null | undefined"
1576
1702
  }
1577
1703
  ],
1578
1704
  "events": [
@@ -1617,6 +1743,11 @@
1617
1743
  "name": "fixed",
1618
1744
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1619
1745
  "value": { "type": "boolean", "default": "false" }
1746
+ },
1747
+ {
1748
+ "name": "origin",
1749
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1750
+ "value": { "type": "PlacementOrigin | null | undefined" }
1620
1751
  }
1621
1752
  ],
1622
1753
  "slots": [{ "name": "", "description": "`vf-menu` elements." }],
@@ -1652,6 +1783,11 @@
1652
1783
  "name": "fixed",
1653
1784
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1654
1785
  "type": "boolean"
1786
+ },
1787
+ {
1788
+ "name": "origin",
1789
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1790
+ "type": "PlacementOrigin | null | undefined"
1655
1791
  }
1656
1792
  ],
1657
1793
  "events": []
@@ -1706,6 +1842,11 @@
1706
1842
  "name": "fixed",
1707
1843
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1708
1844
  "value": { "type": "boolean", "default": "false" }
1845
+ },
1846
+ {
1847
+ "name": "origin",
1848
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1849
+ "value": { "type": "PlacementOrigin | null | undefined" }
1709
1850
  }
1710
1851
  ],
1711
1852
  "slots": [{ "name": "", "description": "The item label." }],
@@ -1761,6 +1902,11 @@
1761
1902
  "name": "fixed",
1762
1903
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1763
1904
  "type": "boolean"
1905
+ },
1906
+ {
1907
+ "name": "origin",
1908
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1909
+ "type": "PlacementOrigin | null | undefined"
1764
1910
  }
1765
1911
  ],
1766
1912
  "events": [
@@ -1805,6 +1951,11 @@
1805
1951
  "name": "fixed",
1806
1952
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1807
1953
  "value": { "type": "boolean", "default": "false" }
1954
+ },
1955
+ {
1956
+ "name": "origin",
1957
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
1958
+ "value": { "type": "PlacementOrigin | null | undefined" }
1808
1959
  }
1809
1960
  ],
1810
1961
  "slots": [
@@ -1869,6 +2020,11 @@
1869
2020
  "name": "fixed",
1870
2021
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1871
2022
  "type": "boolean"
2023
+ },
2024
+ {
2025
+ "name": "origin",
2026
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2027
+ "type": "PlacementOrigin | null | undefined"
1872
2028
  }
1873
2029
  ],
1874
2030
  "events": []
@@ -1909,6 +2065,11 @@
1909
2065
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
1910
2066
  "value": { "type": "boolean", "default": "false" }
1911
2067
  },
2068
+ {
2069
+ "name": "origin",
2070
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2071
+ "value": { "type": "PlacementOrigin | null | undefined" }
2072
+ },
1912
2073
  {
1913
2074
  "name": "value",
1914
2075
  "description": "Current value. Synced on every keystroke and submitted with forms.",
@@ -2000,6 +2161,11 @@
2000
2161
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2001
2162
  "type": "boolean"
2002
2163
  },
2164
+ {
2165
+ "name": "origin",
2166
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2167
+ "type": "PlacementOrigin | null | undefined"
2168
+ },
2003
2169
  {
2004
2170
  "name": "value",
2005
2171
  "description": "Current value. Synced on every keystroke and submitted with forms.",
@@ -2120,6 +2286,11 @@
2120
2286
  "name": "fixed",
2121
2287
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2122
2288
  "value": { "type": "boolean", "default": "false" }
2289
+ },
2290
+ {
2291
+ "name": "origin",
2292
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2293
+ "value": { "type": "PlacementOrigin | null | undefined" }
2123
2294
  }
2124
2295
  ],
2125
2296
  "events": [],
@@ -2160,6 +2331,11 @@
2160
2331
  "name": "fixed",
2161
2332
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2162
2333
  "type": "boolean"
2334
+ },
2335
+ {
2336
+ "name": "origin",
2337
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2338
+ "type": "PlacementOrigin | null | undefined"
2163
2339
  }
2164
2340
  ],
2165
2341
  "events": []
@@ -2204,6 +2380,11 @@
2204
2380
  "name": "fixed",
2205
2381
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2206
2382
  "value": { "type": "boolean", "default": "false" }
2383
+ },
2384
+ {
2385
+ "name": "origin",
2386
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2387
+ "value": { "type": "PlacementOrigin | null | undefined" }
2207
2388
  }
2208
2389
  ],
2209
2390
  "slots": [{ "name": "", "description": "The paragraph copy." }],
@@ -2244,6 +2425,11 @@
2244
2425
  "name": "fixed",
2245
2426
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2246
2427
  "type": "boolean"
2428
+ },
2429
+ {
2430
+ "name": "origin",
2431
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2432
+ "type": "PlacementOrigin | null | undefined"
2247
2433
  }
2248
2434
  ],
2249
2435
  "events": []
@@ -2288,6 +2474,11 @@
2288
2474
  "name": "fixed",
2289
2475
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2290
2476
  "value": { "type": "boolean", "default": "false" }
2477
+ },
2478
+ {
2479
+ "name": "origin",
2480
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2481
+ "value": { "type": "PlacementOrigin | null | undefined" }
2291
2482
  }
2292
2483
  ],
2293
2484
  "events": [],
@@ -2329,6 +2520,11 @@
2329
2520
  "name": "fixed",
2330
2521
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2331
2522
  "type": "boolean"
2523
+ },
2524
+ {
2525
+ "name": "origin",
2526
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2527
+ "type": "PlacementOrigin | null | undefined"
2332
2528
  }
2333
2529
  ],
2334
2530
  "events": []
@@ -2369,6 +2565,11 @@
2369
2565
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2370
2566
  "value": { "type": "boolean", "default": "false" }
2371
2567
  },
2568
+ {
2569
+ "name": "origin",
2570
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2571
+ "value": { "type": "PlacementOrigin | null | undefined" }
2572
+ },
2372
2573
  {
2373
2574
  "name": "disabled",
2374
2575
  "description": "Disables the control: it stops responding and submits no value. Each\ncontrol dims per SPEC §1 (typically the label greys while the 1-bit chrome\nstays black).",
@@ -2433,6 +2634,11 @@
2433
2634
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2434
2635
  "type": "boolean"
2435
2636
  },
2637
+ {
2638
+ "name": "origin",
2639
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2640
+ "type": "PlacementOrigin | null | undefined"
2641
+ },
2436
2642
  {
2437
2643
  "name": "disabled",
2438
2644
  "description": "Disables the control: it stops responding and submits no value. Each\ncontrol dims per SPEC §1 (typically the label greys while the 1-bit chrome\nstays black).",
@@ -2514,6 +2720,11 @@
2514
2720
  "name": "fixed",
2515
2721
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2516
2722
  "value": { "type": "boolean", "default": "false" }
2723
+ },
2724
+ {
2725
+ "name": "origin",
2726
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2727
+ "value": { "type": "PlacementOrigin | null | undefined" }
2517
2728
  }
2518
2729
  ],
2519
2730
  "slots": [
@@ -2565,6 +2776,11 @@
2565
2776
  "name": "fixed",
2566
2777
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2567
2778
  "type": "boolean"
2779
+ },
2780
+ {
2781
+ "name": "origin",
2782
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2783
+ "type": "PlacementOrigin | null | undefined"
2568
2784
  }
2569
2785
  ],
2570
2786
  "events": [
@@ -2612,6 +2828,11 @@
2612
2828
  "name": "fixed",
2613
2829
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2614
2830
  "value": { "type": "boolean", "default": "false" }
2831
+ },
2832
+ {
2833
+ "name": "origin",
2834
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2835
+ "value": { "type": "PlacementOrigin | null | undefined" }
2615
2836
  }
2616
2837
  ],
2617
2838
  "slots": [{ "name": "", "description": "Scrollable content." }],
@@ -2647,6 +2868,11 @@
2647
2868
  "name": "fixed",
2648
2869
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2649
2870
  "type": "boolean"
2871
+ },
2872
+ {
2873
+ "name": "origin",
2874
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2875
+ "type": "PlacementOrigin | null | undefined"
2650
2876
  }
2651
2877
  ],
2652
2878
  "events": []
@@ -2687,6 +2913,11 @@
2687
2913
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2688
2914
  "value": { "type": "boolean", "default": "false" }
2689
2915
  },
2916
+ {
2917
+ "name": "origin",
2918
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2919
+ "value": { "type": "PlacementOrigin | null | undefined" }
2920
+ },
2690
2921
  {
2691
2922
  "name": "description",
2692
2923
  "description": "Description for the control — hint text, a format, a unit. A host-level\n`aria-describedby` cannot reach a focusable element inside a shadow root,\nso there was structurally no way to describe a field; this property is\nthat channel. It renders as a hidden span in the control's own shadow root\nwith the inner control's `aria-describedby` pointing at it — the\nshadow-internal IDREF idiom `vf-dialog`'s title patch already uses. A\nhost-level `aria-describedby` is bridged into the same span when this\nproperty is empty, and a failing constraint's validationMessage\njoins it too, so AT hears the error where it hears the hint.\n\nHost-role controls get neither half: their `aria-describedby` already\nworks, and their validation message reaches AT the way a native control's\ndoes — `aria-invalid` plus the browser's own validation UI, not AccName.",
@@ -2750,6 +2981,11 @@
2750
2981
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2751
2982
  "type": "boolean"
2752
2983
  },
2984
+ {
2985
+ "name": "origin",
2986
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
2987
+ "type": "PlacementOrigin | null | undefined"
2988
+ },
2753
2989
  {
2754
2990
  "name": "description",
2755
2991
  "description": "Description for the control — hint text, a format, a unit. A host-level\n`aria-describedby` cannot reach a focusable element inside a shadow root,\nso there was structurally no way to describe a field; this property is\nthat channel. It renders as a hidden span in the control's own shadow root\nwith the inner control's `aria-describedby` pointing at it — the\nshadow-internal IDREF idiom `vf-dialog`'s title patch already uses. A\nhost-level `aria-describedby` is bridged into the same span when this\nproperty is empty, and a failing constraint's validationMessage\njoins it too, so AT hears the error where it hears the hint.\n\nHost-role controls get neither half: their `aria-describedby` already\nworks, and their validation message reaches AT the way a native control's\ndoes — `aria-invalid` plus the browser's own validation UI, not AccName.",
@@ -2826,6 +3062,11 @@
2826
3062
  "name": "fixed",
2827
3063
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2828
3064
  "value": { "type": "boolean", "default": "false" }
3065
+ },
3066
+ {
3067
+ "name": "origin",
3068
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
3069
+ "value": { "type": "PlacementOrigin | null | undefined" }
2829
3070
  }
2830
3071
  ],
2831
3072
  "events": [],
@@ -2851,6 +3092,11 @@
2851
3092
  "name": "fixed",
2852
3093
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2853
3094
  "type": "boolean"
3095
+ },
3096
+ {
3097
+ "name": "origin",
3098
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
3099
+ "type": "PlacementOrigin | null | undefined"
2854
3100
  }
2855
3101
  ],
2856
3102
  "events": []
@@ -2906,6 +3152,11 @@
2906
3152
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2907
3153
  "value": { "type": "boolean", "default": "false" }
2908
3154
  },
3155
+ {
3156
+ "name": "origin",
3157
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
3158
+ "value": { "type": "PlacementOrigin | null | undefined" }
3159
+ },
2909
3160
  {
2910
3161
  "name": "disabled",
2911
3162
  "description": "Disables the control: it stops responding and submits no value. Each\ncontrol dims per SPEC §1 (typically the label greys while the 1-bit chrome\nstays black).",
@@ -2984,6 +3235,11 @@
2984
3235
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
2985
3236
  "type": "boolean"
2986
3237
  },
3238
+ {
3239
+ "name": "origin",
3240
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
3241
+ "type": "PlacementOrigin | null | undefined"
3242
+ },
2987
3243
  {
2988
3244
  "name": "disabled",
2989
3245
  "description": "Disables the control: it stops responding and submits no value. Each\ncontrol dims per SPEC §1 (typically the label greys while the 1-bit chrome\nstays black).",
@@ -3084,6 +3340,11 @@
3084
3340
  "name": "fixed",
3085
3341
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
3086
3342
  "value": { "type": "boolean", "default": "false" }
3343
+ },
3344
+ {
3345
+ "name": "origin",
3346
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
3347
+ "value": { "type": "PlacementOrigin | null | undefined" }
3087
3348
  }
3088
3349
  ],
3089
3350
  "slots": [
@@ -3139,6 +3400,11 @@
3139
3400
  "name": "fixed",
3140
3401
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
3141
3402
  "type": "boolean"
3403
+ },
3404
+ {
3405
+ "name": "origin",
3406
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
3407
+ "type": "PlacementOrigin | null | undefined"
3142
3408
  }
3143
3409
  ],
3144
3410
  "events": []
@@ -3194,6 +3460,11 @@
3194
3460
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
3195
3461
  "value": { "type": "boolean", "default": "false" }
3196
3462
  },
3463
+ {
3464
+ "name": "origin",
3465
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
3466
+ "value": { "type": "PlacementOrigin | null | undefined" }
3467
+ },
3197
3468
  {
3198
3469
  "name": "description",
3199
3470
  "description": "Description for the control — hint text, a format, a unit. A host-level\n`aria-describedby` cannot reach a focusable element inside a shadow root,\nso there was structurally no way to describe a field; this property is\nthat channel. It renders as a hidden span in the control's own shadow root\nwith the inner control's `aria-describedby` pointing at it — the\nshadow-internal IDREF idiom `vf-dialog`'s title patch already uses. A\nhost-level `aria-describedby` is bridged into the same span when this\nproperty is empty, and a failing constraint's validationMessage\njoins it too, so AT hears the error where it hears the hint.\n\nHost-role controls get neither half: their `aria-describedby` already\nworks, and their validation message reaches AT the way a native control's\ndoes — `aria-invalid` plus the browser's own validation UI, not AccName.",
@@ -3253,6 +3524,11 @@
3253
3524
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
3254
3525
  "type": "boolean"
3255
3526
  },
3527
+ {
3528
+ "name": "origin",
3529
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
3530
+ "type": "PlacementOrigin | null | undefined"
3531
+ },
3256
3532
  {
3257
3533
  "name": "description",
3258
3534
  "description": "Description for the control — hint text, a format, a unit. A host-level\n`aria-describedby` cannot reach a focusable element inside a shadow root,\nso there was structurally no way to describe a field; this property is\nthat channel. It renders as a hidden span in the control's own shadow root\nwith the inner control's `aria-describedby` pointing at it — the\nshadow-internal IDREF idiom `vf-dialog`'s title patch already uses. A\nhost-level `aria-describedby` is bridged into the same span when this\nproperty is empty, and a failing constraint's validationMessage\njoins it too, so AT hears the error where it hears the hint.\n\nHost-role controls get neither half: their `aria-describedby` already\nworks, and their validation message reaches AT the way a native control's\ndoes — `aria-invalid` plus the browser's own validation UI, not AccName.",
@@ -3312,6 +3588,11 @@
3312
3588
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
3313
3589
  "value": { "type": "boolean", "default": "false" }
3314
3590
  },
3591
+ {
3592
+ "name": "origin",
3593
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
3594
+ "value": { "type": "PlacementOrigin | null | undefined" }
3595
+ },
3315
3596
  {
3316
3597
  "name": "value",
3317
3598
  "description": "Current value. Synced on every keystroke and submitted with forms.",
@@ -3393,6 +3674,11 @@
3393
3674
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
3394
3675
  "type": "boolean"
3395
3676
  },
3677
+ {
3678
+ "name": "origin",
3679
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
3680
+ "type": "PlacementOrigin | null | undefined"
3681
+ },
3396
3682
  {
3397
3683
  "name": "value",
3398
3684
  "description": "Current value. Synced on every keystroke and submitted with forms.",
@@ -3499,6 +3785,11 @@
3499
3785
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
3500
3786
  "value": { "type": "boolean", "default": "false" }
3501
3787
  },
3788
+ {
3789
+ "name": "origin",
3790
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
3791
+ "value": { "type": "PlacementOrigin | null | undefined" }
3792
+ },
3502
3793
  {
3503
3794
  "name": "value",
3504
3795
  "description": "Current value. Synced on every keystroke and submitted with forms.",
@@ -3580,6 +3871,11 @@
3580
3871
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
3581
3872
  "type": "boolean"
3582
3873
  },
3874
+ {
3875
+ "name": "origin",
3876
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
3877
+ "type": "PlacementOrigin | null | undefined"
3878
+ },
3583
3879
  {
3584
3880
  "name": "value",
3585
3881
  "description": "Current value. Synced on every keystroke and submitted with forms.",
@@ -3757,6 +4053,11 @@
3757
4053
  "name": "fixed",
3758
4054
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
3759
4055
  "value": { "type": "boolean", "default": "false" }
4056
+ },
4057
+ {
4058
+ "name": "origin",
4059
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
4060
+ "value": { "type": "PlacementOrigin | null | undefined" }
3760
4061
  }
3761
4062
  ],
3762
4063
  "slots": [
@@ -3875,6 +4176,11 @@
3875
4176
  "name": "fixed",
3876
4177
  "description": "Hold the placement against the visible region of the nearest scrolling\nancestor: the element keeps its stated `top`/`left` while the content\nscrolls under it, and the flag alone places it at (0,0). It comes\nbefore the flow content in its parent. Where nothing scrolls it renders\nexactly as placed.",
3877
4178
  "type": "boolean"
4179
+ },
4180
+ {
4181
+ "name": "origin",
4182
+ "description": "Which point of the element's own box `top`/`left` place: one of nine\nkeywords, vertical then horizontal — `top left` (the default), `top\ncenter`, `top right`, `center left`, `center`, `center right`, `bottom\nleft`, `bottom center`, `bottom right`. The point is measured in whole\nsystem px and kept current as the box changes; an odd size's leftover\nhalf goes toward the start. An unknown value places as `top left` and\nwarns once. On its own it places nothing.",
4183
+ "type": "PlacementOrigin | null | undefined"
3878
4184
  }
3879
4185
  ],
3880
4186
  "events": [