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.
@@ -109,6 +109,20 @@
109
109
  "name": "VfPositioned",
110
110
  "module": "src/position.ts"
111
111
  }
112
+ },
113
+ {
114
+ "kind": "field",
115
+ "name": "origin",
116
+ "type": {
117
+ "text": "PlacementOrigin | null | undefined"
118
+ },
119
+ "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.",
120
+ "attribute": "origin",
121
+ "reflects": true,
122
+ "inheritedFrom": {
123
+ "name": "VfPositioned",
124
+ "module": "src/position.ts"
125
+ }
112
126
  }
113
127
  ],
114
128
  "attributes": [
@@ -166,6 +180,18 @@
166
180
  "name": "VfPositioned",
167
181
  "module": "src/position.ts"
168
182
  }
183
+ },
184
+ {
185
+ "name": "origin",
186
+ "type": {
187
+ "text": "PlacementOrigin | null | undefined"
188
+ },
189
+ "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.",
190
+ "fieldName": "origin",
191
+ "inheritedFrom": {
192
+ "name": "VfPositioned",
193
+ "module": "src/position.ts"
194
+ }
169
195
  }
170
196
  ],
171
197
  "mixins": [
@@ -448,6 +474,20 @@
448
474
  "module": "src/position.ts"
449
475
  }
450
476
  },
477
+ {
478
+ "kind": "field",
479
+ "name": "origin",
480
+ "type": {
481
+ "text": "PlacementOrigin | null | undefined"
482
+ },
483
+ "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.",
484
+ "attribute": "origin",
485
+ "reflects": true,
486
+ "inheritedFrom": {
487
+ "name": "VfPositioned",
488
+ "module": "src/position.ts"
489
+ }
490
+ },
451
491
  {
452
492
  "kind": "field",
453
493
  "name": "bridgedAriaAttributes",
@@ -1107,6 +1147,18 @@
1107
1147
  "module": "src/position.ts"
1108
1148
  }
1109
1149
  },
1150
+ {
1151
+ "name": "origin",
1152
+ "type": {
1153
+ "text": "PlacementOrigin | null | undefined"
1154
+ },
1155
+ "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.",
1156
+ "fieldName": "origin",
1157
+ "inheritedFrom": {
1158
+ "name": "VfPositioned",
1159
+ "module": "src/position.ts"
1160
+ }
1161
+ },
1110
1162
  {
1111
1163
  "name": "description",
1112
1164
  "type": {
@@ -1422,6 +1474,20 @@
1422
1474
  "module": "src/position.ts"
1423
1475
  }
1424
1476
  },
1477
+ {
1478
+ "kind": "field",
1479
+ "name": "origin",
1480
+ "type": {
1481
+ "text": "PlacementOrigin | null | undefined"
1482
+ },
1483
+ "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.",
1484
+ "attribute": "origin",
1485
+ "reflects": true,
1486
+ "inheritedFrom": {
1487
+ "name": "VfPositioned",
1488
+ "module": "src/position.ts"
1489
+ }
1490
+ },
1425
1491
  {
1426
1492
  "kind": "field",
1427
1493
  "name": "externallyCoordinated",
@@ -1988,6 +2054,18 @@
1988
2054
  "module": "src/position.ts"
1989
2055
  }
1990
2056
  },
2057
+ {
2058
+ "name": "origin",
2059
+ "type": {
2060
+ "text": "PlacementOrigin | null | undefined"
2061
+ },
2062
+ "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.",
2063
+ "fieldName": "origin",
2064
+ "inheritedFrom": {
2065
+ "name": "VfPositioned",
2066
+ "module": "src/position.ts"
2067
+ }
2068
+ },
1991
2069
  {
1992
2070
  "name": "disabled",
1993
2071
  "type": {
@@ -2225,6 +2303,20 @@
2225
2303
  "name": "VfPositioned",
2226
2304
  "module": "src/position.ts"
2227
2305
  }
2306
+ },
2307
+ {
2308
+ "kind": "field",
2309
+ "name": "origin",
2310
+ "type": {
2311
+ "text": "PlacementOrigin | null | undefined"
2312
+ },
2313
+ "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.",
2314
+ "attribute": "origin",
2315
+ "reflects": true,
2316
+ "inheritedFrom": {
2317
+ "name": "VfPositioned",
2318
+ "module": "src/position.ts"
2319
+ }
2228
2320
  }
2229
2321
  ],
2230
2322
  "attributes": [
@@ -2304,6 +2396,18 @@
2304
2396
  "name": "VfPositioned",
2305
2397
  "module": "src/position.ts"
2306
2398
  }
2399
+ },
2400
+ {
2401
+ "name": "origin",
2402
+ "type": {
2403
+ "text": "PlacementOrigin | null | undefined"
2404
+ },
2405
+ "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.",
2406
+ "fieldName": "origin",
2407
+ "inheritedFrom": {
2408
+ "name": "VfPositioned",
2409
+ "module": "src/position.ts"
2410
+ }
2307
2411
  }
2308
2412
  ],
2309
2413
  "mixins": [
@@ -2459,9 +2563,16 @@
2459
2563
  "type": {
2460
2564
  "text": "number"
2461
2565
  }
2566
+ },
2567
+ {
2568
+ "name": "child",
2569
+ "optional": true,
2570
+ "type": {
2571
+ "text": "Element"
2572
+ }
2462
2573
  }
2463
2574
  ],
2464
- "description": "A viewport point (CSS px) as a placement on the screen — `{ left, top }`\nin whole system px on the placement lattice, measured from the raster's\ncorner with the bezel excluded: the pair a child dropped onto the desktop\nis written with. The screen sits in the shadow tree, which is why the\nconversion is a method here."
2575
+ "description": "A viewport point (CSS px) as a placement on the screen — `{ left, top }`\nin whole system px on the placement lattice, measured from the raster's\ncorner with the bezel excluded: the pair a child dropped onto the desktop\nis written with. The screen sits in the shadow tree, which is why the\nconversion is a method here. With `child`, the pair to write to that\nelement: the offset its `origin` adds is folded in, so its box's corner\nlands on the point."
2465
2576
  },
2466
2577
  {
2467
2578
  "kind": "field",
@@ -2919,6 +3030,20 @@
2919
3030
  "name": "VfPositioned",
2920
3031
  "module": "src/position.ts"
2921
3032
  }
3033
+ },
3034
+ {
3035
+ "kind": "field",
3036
+ "name": "origin",
3037
+ "type": {
3038
+ "text": "PlacementOrigin | null | undefined"
3039
+ },
3040
+ "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.",
3041
+ "attribute": "origin",
3042
+ "reflects": true,
3043
+ "inheritedFrom": {
3044
+ "name": "VfPositioned",
3045
+ "module": "src/position.ts"
3046
+ }
2922
3047
  }
2923
3048
  ],
2924
3049
  "events": [
@@ -2994,6 +3119,18 @@
2994
3119
  "name": "VfPositioned",
2995
3120
  "module": "src/position.ts"
2996
3121
  }
3122
+ },
3123
+ {
3124
+ "name": "origin",
3125
+ "type": {
3126
+ "text": "PlacementOrigin | null | undefined"
3127
+ },
3128
+ "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.",
3129
+ "fieldName": "origin",
3130
+ "inheritedFrom": {
3131
+ "name": "VfPositioned",
3132
+ "module": "src/position.ts"
3133
+ }
2997
3134
  }
2998
3135
  ],
2999
3136
  "mixins": [
@@ -3035,7 +3172,7 @@
3035
3172
  "declarations": [
3036
3173
  {
3037
3174
  "kind": "class",
3038
- "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.",
3175
+ "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.",
3039
3176
  "name": "VfDialog",
3040
3177
  "cssProperties": [
3041
3178
  {
@@ -3065,7 +3202,7 @@
3065
3202
  "name": "title-bar"
3066
3203
  },
3067
3204
  {
3068
- "description": "The centered title patch (or the plain-frame heading).",
3205
+ "description": "The centered title patch (default chrome only).",
3069
3206
  "name": "title"
3070
3207
  },
3071
3208
  {
@@ -3073,30 +3210,18 @@
3073
3210
  "name": "close-box"
3074
3211
  },
3075
3212
  {
3076
- "description": "The white content area.",
3213
+ "description": "The white content region.",
3077
3214
  "name": "body"
3078
3215
  },
3079
3216
  {
3080
- "description": "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.",
3217
+ "description": "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.",
3081
3218
  "name": "content"
3082
- },
3083
- {
3084
- "description": "The action row wrapping the buttons.",
3085
- "name": "footer"
3086
- },
3087
- {
3088
- "description": "The button group inside the footer.",
3089
- "name": "buttons"
3090
3219
  }
3091
3220
  ],
3092
3221
  "slots": [
3093
3222
  {
3094
- "description": "Default slot: dialog body content.",
3223
+ "description": "Default slot: the dialog's content.",
3095
3224
  "name": ""
3096
- },
3097
- {
3098
- "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.",
3099
- "name": "buttons"
3100
3225
  }
3101
3226
  ],
3102
3227
  "members": [
@@ -3123,7 +3248,7 @@
3123
3248
  "text": "string"
3124
3249
  },
3125
3250
  "default": "''",
3126
- "description": "Title text: the bar's centered patch, or the plain frame's heading.",
3251
+ "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.",
3127
3252
  "attribute": "heading"
3128
3253
  },
3129
3254
  {
@@ -3133,7 +3258,7 @@
3133
3258
  "text": "string"
3134
3259
  },
3135
3260
  "default": "''",
3136
- "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.",
3261
+ "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.",
3137
3262
  "attribute": "label"
3138
3263
  },
3139
3264
  {
@@ -3157,16 +3282,6 @@
3157
3282
  "attribute": "frame",
3158
3283
  "reflects": true
3159
3284
  },
3160
- {
3161
- "kind": "field",
3162
- "name": "_hasButtons",
3163
- "type": {
3164
- "text": "boolean"
3165
- },
3166
- "privacy": "private",
3167
- "default": "false",
3168
- "description": "Whether the `buttons` slot has assigned content (drives the footer)."
3169
- },
3170
3285
  {
3171
3286
  "kind": "field",
3172
3287
  "name": "_content",
@@ -3222,24 +3337,6 @@
3222
3337
  }
3223
3338
  }
3224
3339
  },
3225
- {
3226
- "kind": "method",
3227
- "name": "_onButtonsSlotChange",
3228
- "privacy": "private",
3229
- "return": {
3230
- "type": {
3231
- "text": "void"
3232
- }
3233
- },
3234
- "parameters": [
3235
- {
3236
- "name": "event",
3237
- "type": {
3238
- "text": "Event"
3239
- }
3240
- }
3241
- ]
3242
- },
3243
3340
  {
3244
3341
  "kind": "field",
3245
3342
  "name": "scale",
@@ -3805,7 +3902,7 @@
3805
3902
  "text": "string"
3806
3903
  },
3807
3904
  "default": "''",
3808
- "description": "Title text: the bar's centered patch, or the plain frame's heading.",
3905
+ "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.",
3809
3906
  "fieldName": "heading"
3810
3907
  },
3811
3908
  {
@@ -3814,7 +3911,7 @@
3814
3911
  "text": "string"
3815
3912
  },
3816
3913
  "default": "''",
3817
- "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.",
3914
+ "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.",
3818
3915
  "fieldName": "label"
3819
3916
  },
3820
3917
  {
@@ -4065,6 +4162,20 @@
4065
4162
  "name": "VfPositioned",
4066
4163
  "module": "src/position.ts"
4067
4164
  }
4165
+ },
4166
+ {
4167
+ "kind": "field",
4168
+ "name": "origin",
4169
+ "type": {
4170
+ "text": "PlacementOrigin | null | undefined"
4171
+ },
4172
+ "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.",
4173
+ "attribute": "origin",
4174
+ "reflects": true,
4175
+ "inheritedFrom": {
4176
+ "name": "VfPositioned",
4177
+ "module": "src/position.ts"
4178
+ }
4068
4179
  }
4069
4180
  ],
4070
4181
  "attributes": [
@@ -4113,6 +4224,18 @@
4113
4224
  "name": "VfPositioned",
4114
4225
  "module": "src/position.ts"
4115
4226
  }
4227
+ },
4228
+ {
4229
+ "name": "origin",
4230
+ "type": {
4231
+ "text": "PlacementOrigin | null | undefined"
4232
+ },
4233
+ "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.",
4234
+ "fieldName": "origin",
4235
+ "inheritedFrom": {
4236
+ "name": "VfPositioned",
4237
+ "module": "src/position.ts"
4238
+ }
4116
4239
  }
4117
4240
  ],
4118
4241
  "mixins": [
@@ -4307,6 +4430,20 @@
4307
4430
  "name": "VfPositioned",
4308
4431
  "module": "src/position.ts"
4309
4432
  }
4433
+ },
4434
+ {
4435
+ "kind": "field",
4436
+ "name": "origin",
4437
+ "type": {
4438
+ "text": "PlacementOrigin | null | undefined"
4439
+ },
4440
+ "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.",
4441
+ "attribute": "origin",
4442
+ "reflects": true,
4443
+ "inheritedFrom": {
4444
+ "name": "VfPositioned",
4445
+ "module": "src/position.ts"
4446
+ }
4310
4447
  }
4311
4448
  ],
4312
4449
  "attributes": [
@@ -4408,6 +4545,18 @@
4408
4545
  "name": "VfPositioned",
4409
4546
  "module": "src/position.ts"
4410
4547
  }
4548
+ },
4549
+ {
4550
+ "name": "origin",
4551
+ "type": {
4552
+ "text": "PlacementOrigin | null | undefined"
4553
+ },
4554
+ "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.",
4555
+ "fieldName": "origin",
4556
+ "inheritedFrom": {
4557
+ "name": "VfPositioned",
4558
+ "module": "src/position.ts"
4559
+ }
4411
4560
  }
4412
4561
  ],
4413
4562
  "mixins": [
@@ -4810,6 +4959,20 @@
4810
4959
  "name": "VfPositioned",
4811
4960
  "module": "src/position.ts"
4812
4961
  }
4962
+ },
4963
+ {
4964
+ "kind": "field",
4965
+ "name": "origin",
4966
+ "type": {
4967
+ "text": "PlacementOrigin | null | undefined"
4968
+ },
4969
+ "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.",
4970
+ "attribute": "origin",
4971
+ "reflects": true,
4972
+ "inheritedFrom": {
4973
+ "name": "VfPositioned",
4974
+ "module": "src/position.ts"
4975
+ }
4813
4976
  }
4814
4977
  ],
4815
4978
  "attributes": [
@@ -4890,6 +5053,18 @@
4890
5053
  "name": "VfPositioned",
4891
5054
  "module": "src/position.ts"
4892
5055
  }
5056
+ },
5057
+ {
5058
+ "name": "origin",
5059
+ "type": {
5060
+ "text": "PlacementOrigin | null | undefined"
5061
+ },
5062
+ "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.",
5063
+ "fieldName": "origin",
5064
+ "inheritedFrom": {
5065
+ "name": "VfPositioned",
5066
+ "module": "src/position.ts"
5067
+ }
4893
5068
  }
4894
5069
  ],
4895
5070
  "mixins": [
@@ -4935,11 +5110,11 @@
4935
5110
  "declarations": [
4936
5111
  {
4937
5112
  "kind": "class",
4938
- "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.",
5113
+ "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.",
4939
5114
  "name": "VfIcon",
4940
5115
  "cssProperties": [
4941
5116
  {
4942
- "description": "Space between the art cell and the name plate",
5117
+ "description": "Space between the art cell and the name plate; 0 by default, the plate directly under the cell as the Finder drew it",
4943
5118
  "name": "--vf-icon-gap"
4944
5119
  },
4945
5120
  {
@@ -5494,7 +5669,7 @@
5494
5669
  }
5495
5670
  }
5496
5671
  ],
5497
- "description": "Build this icon's outline for a drag, and put it where it draws: the\ndesktop's drag surface when the leader's handshake found one, else the\nicon's own frame. The geometry is measured off the rendered parts —\nthe frame (`at`, its box at the press), the art as it paints (the ghost\nwhile `open`), the cell and the plate — in system px relative to the\nframe, so the ring lands on the pixels the frame paints. Null when\nthere is nothing to draw with."
5672
+ "description": "Build this icon's outline for a drag, and put it where it draws: the\ndesktop's drag surface when the leader's handshake found one, else the\nicon's own frame. The geometry is measured off the rendered parts —\nthe frame (`at`, its box at the press), the art as it paints (the ghost\nwhile `open`), the cell and the plate — in system px relative to the\noutline's box, the frame widened to a plate that overhangs it, so the\nring lands on the pixels the frame paints. Null when there is nothing\nto draw with."
5498
5673
  },
5499
5674
  {
5500
5675
  "kind": "method",
@@ -5868,6 +6043,20 @@
5868
6043
  "name": "VfPositioned",
5869
6044
  "module": "src/position.ts"
5870
6045
  }
6046
+ },
6047
+ {
6048
+ "kind": "field",
6049
+ "name": "origin",
6050
+ "type": {
6051
+ "text": "PlacementOrigin | null | undefined"
6052
+ },
6053
+ "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.",
6054
+ "attribute": "origin",
6055
+ "reflects": true,
6056
+ "inheritedFrom": {
6057
+ "name": "VfPositioned",
6058
+ "module": "src/position.ts"
6059
+ }
5871
6060
  }
5872
6061
  ],
5873
6062
  "events": [
@@ -6043,6 +6232,18 @@
6043
6232
  "name": "VfPositioned",
6044
6233
  "module": "src/position.ts"
6045
6234
  }
6235
+ },
6236
+ {
6237
+ "name": "origin",
6238
+ "type": {
6239
+ "text": "PlacementOrigin | null | undefined"
6240
+ },
6241
+ "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.",
6242
+ "fieldName": "origin",
6243
+ "inheritedFrom": {
6244
+ "name": "VfPositioned",
6245
+ "module": "src/position.ts"
6246
+ }
6046
6247
  }
6047
6248
  ],
6048
6249
  "mixins": [
@@ -6233,6 +6434,20 @@
6233
6434
  "name": "VfPositioned",
6234
6435
  "module": "src/position.ts"
6235
6436
  }
6437
+ },
6438
+ {
6439
+ "kind": "field",
6440
+ "name": "origin",
6441
+ "type": {
6442
+ "text": "PlacementOrigin | null | undefined"
6443
+ },
6444
+ "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.",
6445
+ "attribute": "origin",
6446
+ "reflects": true,
6447
+ "inheritedFrom": {
6448
+ "name": "VfPositioned",
6449
+ "module": "src/position.ts"
6450
+ }
6236
6451
  }
6237
6452
  ],
6238
6453
  "attributes": [
@@ -6288,6 +6503,18 @@
6288
6503
  "name": "VfPositioned",
6289
6504
  "module": "src/position.ts"
6290
6505
  }
6506
+ },
6507
+ {
6508
+ "name": "origin",
6509
+ "type": {
6510
+ "text": "PlacementOrigin | null | undefined"
6511
+ },
6512
+ "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.",
6513
+ "fieldName": "origin",
6514
+ "inheritedFrom": {
6515
+ "name": "VfPositioned",
6516
+ "module": "src/position.ts"
6517
+ }
6291
6518
  }
6292
6519
  ],
6293
6520
  "mixins": [
@@ -6540,6 +6767,20 @@
6540
6767
  "name": "VfPositioned",
6541
6768
  "module": "src/position.ts"
6542
6769
  }
6770
+ },
6771
+ {
6772
+ "kind": "field",
6773
+ "name": "origin",
6774
+ "type": {
6775
+ "text": "PlacementOrigin | null | undefined"
6776
+ },
6777
+ "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.",
6778
+ "attribute": "origin",
6779
+ "reflects": true,
6780
+ "inheritedFrom": {
6781
+ "name": "VfPositioned",
6782
+ "module": "src/position.ts"
6783
+ }
6543
6784
  }
6544
6785
  ],
6545
6786
  "attributes": [
@@ -6628,6 +6869,18 @@
6628
6869
  "name": "VfPositioned",
6629
6870
  "module": "src/position.ts"
6630
6871
  }
6872
+ },
6873
+ {
6874
+ "name": "origin",
6875
+ "type": {
6876
+ "text": "PlacementOrigin | null | undefined"
6877
+ },
6878
+ "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.",
6879
+ "fieldName": "origin",
6880
+ "inheritedFrom": {
6881
+ "name": "VfPositioned",
6882
+ "module": "src/position.ts"
6883
+ }
6631
6884
  }
6632
6885
  ],
6633
6886
  "mixins": [
@@ -6795,6 +7048,20 @@
6795
7048
  "name": "VfPositioned",
6796
7049
  "module": "src/position.ts"
6797
7050
  }
7051
+ },
7052
+ {
7053
+ "kind": "field",
7054
+ "name": "origin",
7055
+ "type": {
7056
+ "text": "PlacementOrigin | null | undefined"
7057
+ },
7058
+ "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.",
7059
+ "attribute": "origin",
7060
+ "reflects": true,
7061
+ "inheritedFrom": {
7062
+ "name": "VfPositioned",
7063
+ "module": "src/position.ts"
7064
+ }
6798
7065
  }
6799
7066
  ],
6800
7067
  "attributes": [
@@ -6861,6 +7128,18 @@
6861
7128
  "name": "VfPositioned",
6862
7129
  "module": "src/position.ts"
6863
7130
  }
7131
+ },
7132
+ {
7133
+ "name": "origin",
7134
+ "type": {
7135
+ "text": "PlacementOrigin | null | undefined"
7136
+ },
7137
+ "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.",
7138
+ "fieldName": "origin",
7139
+ "inheritedFrom": {
7140
+ "name": "VfPositioned",
7141
+ "module": "src/position.ts"
7142
+ }
6864
7143
  }
6865
7144
  ],
6866
7145
  "mixins": [
@@ -7342,6 +7621,20 @@
7342
7621
  "name": "VfPositioned",
7343
7622
  "module": "src/position.ts"
7344
7623
  }
7624
+ },
7625
+ {
7626
+ "kind": "field",
7627
+ "name": "origin",
7628
+ "type": {
7629
+ "text": "PlacementOrigin | null | undefined"
7630
+ },
7631
+ "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.",
7632
+ "attribute": "origin",
7633
+ "reflects": true,
7634
+ "inheritedFrom": {
7635
+ "name": "VfPositioned",
7636
+ "module": "src/position.ts"
7637
+ }
7345
7638
  }
7346
7639
  ],
7347
7640
  "events": [
@@ -7423,6 +7716,18 @@
7423
7716
  "name": "VfPositioned",
7424
7717
  "module": "src/position.ts"
7425
7718
  }
7719
+ },
7720
+ {
7721
+ "name": "origin",
7722
+ "type": {
7723
+ "text": "PlacementOrigin | null | undefined"
7724
+ },
7725
+ "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.",
7726
+ "fieldName": "origin",
7727
+ "inheritedFrom": {
7728
+ "name": "VfPositioned",
7729
+ "module": "src/position.ts"
7730
+ }
7426
7731
  }
7427
7732
  ],
7428
7733
  "mixins": [
@@ -7794,6 +8099,20 @@
7794
8099
  "name": "VfPositioned",
7795
8100
  "module": "src/position.ts"
7796
8101
  }
8102
+ },
8103
+ {
8104
+ "kind": "field",
8105
+ "name": "origin",
8106
+ "type": {
8107
+ "text": "PlacementOrigin | null | undefined"
8108
+ },
8109
+ "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.",
8110
+ "attribute": "origin",
8111
+ "reflects": true,
8112
+ "inheritedFrom": {
8113
+ "name": "VfPositioned",
8114
+ "module": "src/position.ts"
8115
+ }
7797
8116
  }
7798
8117
  ],
7799
8118
  "attributes": [
@@ -7860,6 +8179,18 @@
7860
8179
  "name": "VfPositioned",
7861
8180
  "module": "src/position.ts"
7862
8181
  }
8182
+ },
8183
+ {
8184
+ "name": "origin",
8185
+ "type": {
8186
+ "text": "PlacementOrigin | null | undefined"
8187
+ },
8188
+ "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.",
8189
+ "fieldName": "origin",
8190
+ "inheritedFrom": {
8191
+ "name": "VfPositioned",
8192
+ "module": "src/position.ts"
8193
+ }
7863
8194
  }
7864
8195
  ],
7865
8196
  "mixins": [
@@ -8225,6 +8556,20 @@
8225
8556
  "name": "VfPositioned",
8226
8557
  "module": "src/position.ts"
8227
8558
  }
8559
+ },
8560
+ {
8561
+ "kind": "field",
8562
+ "name": "origin",
8563
+ "type": {
8564
+ "text": "PlacementOrigin | null | undefined"
8565
+ },
8566
+ "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.",
8567
+ "attribute": "origin",
8568
+ "reflects": true,
8569
+ "inheritedFrom": {
8570
+ "name": "VfPositioned",
8571
+ "module": "src/position.ts"
8572
+ }
8228
8573
  }
8229
8574
  ],
8230
8575
  "events": [
@@ -8323,6 +8668,18 @@
8323
8668
  "name": "VfPositioned",
8324
8669
  "module": "src/position.ts"
8325
8670
  }
8671
+ },
8672
+ {
8673
+ "name": "origin",
8674
+ "type": {
8675
+ "text": "PlacementOrigin | null | undefined"
8676
+ },
8677
+ "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.",
8678
+ "fieldName": "origin",
8679
+ "inheritedFrom": {
8680
+ "name": "VfPositioned",
8681
+ "module": "src/position.ts"
8682
+ }
8326
8683
  }
8327
8684
  ],
8328
8685
  "mixins": [
@@ -8798,6 +9155,20 @@
8798
9155
  "name": "VfPositioned",
8799
9156
  "module": "src/position.ts"
8800
9157
  }
9158
+ },
9159
+ {
9160
+ "kind": "field",
9161
+ "name": "origin",
9162
+ "type": {
9163
+ "text": "PlacementOrigin | null | undefined"
9164
+ },
9165
+ "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.",
9166
+ "attribute": "origin",
9167
+ "reflects": true,
9168
+ "inheritedFrom": {
9169
+ "name": "VfPositioned",
9170
+ "module": "src/position.ts"
9171
+ }
8801
9172
  }
8802
9173
  ],
8803
9174
  "attributes": [
@@ -8864,6 +9235,18 @@
8864
9235
  "name": "VfPositioned",
8865
9236
  "module": "src/position.ts"
8866
9237
  }
9238
+ },
9239
+ {
9240
+ "name": "origin",
9241
+ "type": {
9242
+ "text": "PlacementOrigin | null | undefined"
9243
+ },
9244
+ "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.",
9245
+ "fieldName": "origin",
9246
+ "inheritedFrom": {
9247
+ "name": "VfPositioned",
9248
+ "module": "src/position.ts"
9249
+ }
8867
9250
  }
8868
9251
  ],
8869
9252
  "mixins": [
@@ -9174,6 +9557,20 @@
9174
9557
  "module": "src/position.ts"
9175
9558
  }
9176
9559
  },
9560
+ {
9561
+ "kind": "field",
9562
+ "name": "origin",
9563
+ "type": {
9564
+ "text": "PlacementOrigin | null | undefined"
9565
+ },
9566
+ "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.",
9567
+ "attribute": "origin",
9568
+ "reflects": true,
9569
+ "inheritedFrom": {
9570
+ "name": "VfPositioned",
9571
+ "module": "src/position.ts"
9572
+ }
9573
+ },
9177
9574
  {
9178
9575
  "kind": "field",
9179
9576
  "name": "shadowRootOptions",
@@ -10099,6 +10496,18 @@
10099
10496
  "module": "src/position.ts"
10100
10497
  }
10101
10498
  },
10499
+ {
10500
+ "name": "origin",
10501
+ "type": {
10502
+ "text": "PlacementOrigin | null | undefined"
10503
+ },
10504
+ "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.",
10505
+ "fieldName": "origin",
10506
+ "inheritedFrom": {
10507
+ "name": "VfPositioned",
10508
+ "module": "src/position.ts"
10509
+ }
10510
+ },
10102
10511
  {
10103
10512
  "name": "value",
10104
10513
  "type": {
@@ -10369,6 +10778,20 @@
10369
10778
  "name": "VfPositioned",
10370
10779
  "module": "src/position.ts"
10371
10780
  }
10781
+ },
10782
+ {
10783
+ "kind": "field",
10784
+ "name": "origin",
10785
+ "type": {
10786
+ "text": "PlacementOrigin | null | undefined"
10787
+ },
10788
+ "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.",
10789
+ "attribute": "origin",
10790
+ "reflects": true,
10791
+ "inheritedFrom": {
10792
+ "name": "VfPositioned",
10793
+ "module": "src/position.ts"
10794
+ }
10372
10795
  }
10373
10796
  ],
10374
10797
  "attributes": [
@@ -10444,6 +10867,18 @@
10444
10867
  "name": "VfPositioned",
10445
10868
  "module": "src/position.ts"
10446
10869
  }
10870
+ },
10871
+ {
10872
+ "name": "origin",
10873
+ "type": {
10874
+ "text": "PlacementOrigin | null | undefined"
10875
+ },
10876
+ "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.",
10877
+ "fieldName": "origin",
10878
+ "inheritedFrom": {
10879
+ "name": "VfPositioned",
10880
+ "module": "src/position.ts"
10881
+ }
10447
10882
  }
10448
10883
  ],
10449
10884
  "mixins": [
@@ -10617,6 +11052,20 @@
10617
11052
  "name": "VfPositioned",
10618
11053
  "module": "src/position.ts"
10619
11054
  }
11055
+ },
11056
+ {
11057
+ "kind": "field",
11058
+ "name": "origin",
11059
+ "type": {
11060
+ "text": "PlacementOrigin | null | undefined"
11061
+ },
11062
+ "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.",
11063
+ "attribute": "origin",
11064
+ "reflects": true,
11065
+ "inheritedFrom": {
11066
+ "name": "VfPositioned",
11067
+ "module": "src/position.ts"
11068
+ }
10620
11069
  }
10621
11070
  ],
10622
11071
  "attributes": [
@@ -10688,11 +11137,23 @@
10688
11137
  {
10689
11138
  "name": "fixed",
10690
11139
  "type": {
10691
- "text": "boolean"
11140
+ "text": "boolean"
11141
+ },
11142
+ "default": "false",
11143
+ "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.",
11144
+ "fieldName": "fixed",
11145
+ "inheritedFrom": {
11146
+ "name": "VfPositioned",
11147
+ "module": "src/position.ts"
11148
+ }
11149
+ },
11150
+ {
11151
+ "name": "origin",
11152
+ "type": {
11153
+ "text": "PlacementOrigin | null | undefined"
10692
11154
  },
10693
- "default": "false",
10694
- "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.",
10695
- "fieldName": "fixed",
11155
+ "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.",
11156
+ "fieldName": "origin",
10696
11157
  "inheritedFrom": {
10697
11158
  "name": "VfPositioned",
10698
11159
  "module": "src/position.ts"
@@ -10944,6 +11405,20 @@
10944
11405
  "name": "VfPositioned",
10945
11406
  "module": "src/position.ts"
10946
11407
  }
11408
+ },
11409
+ {
11410
+ "kind": "field",
11411
+ "name": "origin",
11412
+ "type": {
11413
+ "text": "PlacementOrigin | null | undefined"
11414
+ },
11415
+ "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.",
11416
+ "attribute": "origin",
11417
+ "reflects": true,
11418
+ "inheritedFrom": {
11419
+ "name": "VfPositioned",
11420
+ "module": "src/position.ts"
11421
+ }
10947
11422
  }
10948
11423
  ],
10949
11424
  "attributes": [
@@ -11019,6 +11494,18 @@
11019
11494
  "name": "VfPositioned",
11020
11495
  "module": "src/position.ts"
11021
11496
  }
11497
+ },
11498
+ {
11499
+ "name": "origin",
11500
+ "type": {
11501
+ "text": "PlacementOrigin | null | undefined"
11502
+ },
11503
+ "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.",
11504
+ "fieldName": "origin",
11505
+ "inheritedFrom": {
11506
+ "name": "VfPositioned",
11507
+ "module": "src/position.ts"
11508
+ }
11022
11509
  }
11023
11510
  ],
11024
11511
  "mixins": [
@@ -11316,6 +11803,20 @@
11316
11803
  "module": "src/position.ts"
11317
11804
  }
11318
11805
  },
11806
+ {
11807
+ "kind": "field",
11808
+ "name": "origin",
11809
+ "type": {
11810
+ "text": "PlacementOrigin | null | undefined"
11811
+ },
11812
+ "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.",
11813
+ "attribute": "origin",
11814
+ "reflects": true,
11815
+ "inheritedFrom": {
11816
+ "name": "VfPositioned",
11817
+ "module": "src/position.ts"
11818
+ }
11819
+ },
11319
11820
  {
11320
11821
  "kind": "field",
11321
11822
  "name": "formAssociated",
@@ -11790,6 +12291,18 @@
11790
12291
  "module": "src/position.ts"
11791
12292
  }
11792
12293
  },
12294
+ {
12295
+ "name": "origin",
12296
+ "type": {
12297
+ "text": "PlacementOrigin | null | undefined"
12298
+ },
12299
+ "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.",
12300
+ "fieldName": "origin",
12301
+ "inheritedFrom": {
12302
+ "name": "VfPositioned",
12303
+ "module": "src/position.ts"
12304
+ }
12305
+ },
11793
12306
  {
11794
12307
  "name": "disabled",
11795
12308
  "type": {
@@ -12063,6 +12576,20 @@
12063
12576
  "module": "src/position.ts"
12064
12577
  }
12065
12578
  },
12579
+ {
12580
+ "kind": "field",
12581
+ "name": "origin",
12582
+ "type": {
12583
+ "text": "PlacementOrigin | null | undefined"
12584
+ },
12585
+ "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.",
12586
+ "attribute": "origin",
12587
+ "reflects": true,
12588
+ "inheritedFrom": {
12589
+ "name": "VfPositioned",
12590
+ "module": "src/position.ts"
12591
+ }
12592
+ },
12066
12593
  {
12067
12594
  "kind": "field",
12068
12595
  "name": "scale",
@@ -12235,6 +12762,18 @@
12235
12762
  "name": "VfPositioned",
12236
12763
  "module": "src/position.ts"
12237
12764
  }
12765
+ },
12766
+ {
12767
+ "name": "origin",
12768
+ "type": {
12769
+ "text": "PlacementOrigin | null | undefined"
12770
+ },
12771
+ "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.",
12772
+ "fieldName": "origin",
12773
+ "inheritedFrom": {
12774
+ "name": "VfPositioned",
12775
+ "module": "src/position.ts"
12776
+ }
12238
12777
  }
12239
12778
  ],
12240
12779
  "mixins": [
@@ -12419,9 +12958,16 @@
12419
12958
  "type": {
12420
12959
  "text": "number"
12421
12960
  }
12961
+ },
12962
+ {
12963
+ "name": "child",
12964
+ "optional": true,
12965
+ "type": {
12966
+ "text": "Element"
12967
+ }
12422
12968
  }
12423
12969
  ],
12424
- "description": "A viewport point (CSS px) as a placement on the scrolled plane —\n`{ left, top }` in whole system px on the placement lattice, the pair a\nchild dropped here is written with. The plane travels with the scroll,\nso its box already carries the scroll offset and the border-floor\npadding; nothing is left for the caller to add."
12970
+ "description": "A viewport point (CSS px) as a placement on the scrolled plane —\n`{ left, top }` in whole system px on the placement lattice, the pair a\nchild dropped here is written with. The plane travels with the scroll,\nso its box already carries the scroll offset and the border-floor\npadding; nothing is left for the caller to add. With `child`, the pair\nto write to that element: the offset its `origin` adds is folded in, so\nits box's corner lands on the point."
12425
12971
  },
12426
12972
  {
12427
12973
  "kind": "method",
@@ -12503,6 +13049,20 @@
12503
13049
  "name": "VfPositioned",
12504
13050
  "module": "src/position.ts"
12505
13051
  }
13052
+ },
13053
+ {
13054
+ "kind": "field",
13055
+ "name": "origin",
13056
+ "type": {
13057
+ "text": "PlacementOrigin | null | undefined"
13058
+ },
13059
+ "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.",
13060
+ "attribute": "origin",
13061
+ "reflects": true,
13062
+ "inheritedFrom": {
13063
+ "name": "VfPositioned",
13064
+ "module": "src/position.ts"
13065
+ }
12506
13066
  }
12507
13067
  ],
12508
13068
  "attributes": [
@@ -12569,6 +13129,18 @@
12569
13129
  "name": "VfPositioned",
12570
13130
  "module": "src/position.ts"
12571
13131
  }
13132
+ },
13133
+ {
13134
+ "name": "origin",
13135
+ "type": {
13136
+ "text": "PlacementOrigin | null | undefined"
13137
+ },
13138
+ "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.",
13139
+ "fieldName": "origin",
13140
+ "inheritedFrom": {
13141
+ "name": "VfPositioned",
13142
+ "module": "src/position.ts"
13143
+ }
12572
13144
  }
12573
13145
  ],
12574
13146
  "mixins": [
@@ -13640,6 +14212,20 @@
13640
14212
  "module": "src/position.ts"
13641
14213
  }
13642
14214
  },
14215
+ {
14216
+ "kind": "field",
14217
+ "name": "origin",
14218
+ "type": {
14219
+ "text": "PlacementOrigin | null | undefined"
14220
+ },
14221
+ "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.",
14222
+ "attribute": "origin",
14223
+ "reflects": true,
14224
+ "inheritedFrom": {
14225
+ "name": "VfPositioned",
14226
+ "module": "src/position.ts"
14227
+ }
14228
+ },
13643
14229
  {
13644
14230
  "kind": "field",
13645
14231
  "name": "bridgedAriaAttributes",
@@ -14210,6 +14796,18 @@
14210
14796
  "module": "src/position.ts"
14211
14797
  }
14212
14798
  },
14799
+ {
14800
+ "name": "origin",
14801
+ "type": {
14802
+ "text": "PlacementOrigin | null | undefined"
14803
+ },
14804
+ "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.",
14805
+ "fieldName": "origin",
14806
+ "inheritedFrom": {
14807
+ "name": "VfPositioned",
14808
+ "module": "src/position.ts"
14809
+ }
14810
+ },
14213
14811
  {
14214
14812
  "name": "description",
14215
14813
  "type": {
@@ -14384,6 +14982,20 @@
14384
14982
  "name": "VfPositioned",
14385
14983
  "module": "src/position.ts"
14386
14984
  }
14985
+ },
14986
+ {
14987
+ "kind": "field",
14988
+ "name": "origin",
14989
+ "type": {
14990
+ "text": "PlacementOrigin | null | undefined"
14991
+ },
14992
+ "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.",
14993
+ "attribute": "origin",
14994
+ "reflects": true,
14995
+ "inheritedFrom": {
14996
+ "name": "VfPositioned",
14997
+ "module": "src/position.ts"
14998
+ }
14387
14999
  }
14388
15000
  ],
14389
15001
  "attributes": [
@@ -14432,6 +15044,18 @@
14432
15044
  "name": "VfPositioned",
14433
15045
  "module": "src/position.ts"
14434
15046
  }
15047
+ },
15048
+ {
15049
+ "name": "origin",
15050
+ "type": {
15051
+ "text": "PlacementOrigin | null | undefined"
15052
+ },
15053
+ "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.",
15054
+ "fieldName": "origin",
15055
+ "inheritedFrom": {
15056
+ "name": "VfPositioned",
15057
+ "module": "src/position.ts"
15058
+ }
14435
15059
  }
14436
15060
  ],
14437
15061
  "mixins": [
@@ -14864,6 +15488,20 @@
14864
15488
  "module": "src/position.ts"
14865
15489
  }
14866
15490
  },
15491
+ {
15492
+ "kind": "field",
15493
+ "name": "origin",
15494
+ "type": {
15495
+ "text": "PlacementOrigin | null | undefined"
15496
+ },
15497
+ "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.",
15498
+ "attribute": "origin",
15499
+ "reflects": true,
15500
+ "inheritedFrom": {
15501
+ "name": "VfPositioned",
15502
+ "module": "src/position.ts"
15503
+ }
15504
+ },
14867
15505
  {
14868
15506
  "kind": "field",
14869
15507
  "name": "formAssociated",
@@ -15374,6 +16012,18 @@
15374
16012
  "module": "src/position.ts"
15375
16013
  }
15376
16014
  },
16015
+ {
16016
+ "name": "origin",
16017
+ "type": {
16018
+ "text": "PlacementOrigin | null | undefined"
16019
+ },
16020
+ "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.",
16021
+ "fieldName": "origin",
16022
+ "inheritedFrom": {
16023
+ "name": "VfPositioned",
16024
+ "module": "src/position.ts"
16025
+ }
16026
+ },
15377
16027
  {
15378
16028
  "name": "disabled",
15379
16029
  "type": {
@@ -15609,6 +16259,20 @@
15609
16259
  "name": "VfPositioned",
15610
16260
  "module": "src/position.ts"
15611
16261
  }
16262
+ },
16263
+ {
16264
+ "kind": "field",
16265
+ "name": "origin",
16266
+ "type": {
16267
+ "text": "PlacementOrigin | null | undefined"
16268
+ },
16269
+ "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.",
16270
+ "attribute": "origin",
16271
+ "reflects": true,
16272
+ "inheritedFrom": {
16273
+ "name": "VfPositioned",
16274
+ "module": "src/position.ts"
16275
+ }
15612
16276
  }
15613
16277
  ],
15614
16278
  "attributes": [
@@ -15706,6 +16370,18 @@
15706
16370
  "name": "VfPositioned",
15707
16371
  "module": "src/position.ts"
15708
16372
  }
16373
+ },
16374
+ {
16375
+ "name": "origin",
16376
+ "type": {
16377
+ "text": "PlacementOrigin | null | undefined"
16378
+ },
16379
+ "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.",
16380
+ "fieldName": "origin",
16381
+ "inheritedFrom": {
16382
+ "name": "VfPositioned",
16383
+ "module": "src/position.ts"
16384
+ }
15709
16385
  }
15710
16386
  ],
15711
16387
  "mixins": [
@@ -15919,6 +16595,20 @@
15919
16595
  "module": "src/position.ts"
15920
16596
  }
15921
16597
  },
16598
+ {
16599
+ "kind": "field",
16600
+ "name": "origin",
16601
+ "type": {
16602
+ "text": "PlacementOrigin | null | undefined"
16603
+ },
16604
+ "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.",
16605
+ "attribute": "origin",
16606
+ "reflects": true,
16607
+ "inheritedFrom": {
16608
+ "name": "VfPositioned",
16609
+ "module": "src/position.ts"
16610
+ }
16611
+ },
15922
16612
  {
15923
16613
  "kind": "field",
15924
16614
  "name": "bridgedAriaAttributes",
@@ -16540,6 +17230,18 @@
16540
17230
  "module": "src/position.ts"
16541
17231
  }
16542
17232
  },
17233
+ {
17234
+ "name": "origin",
17235
+ "type": {
17236
+ "text": "PlacementOrigin | null | undefined"
17237
+ },
17238
+ "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.",
17239
+ "fieldName": "origin",
17240
+ "inheritedFrom": {
17241
+ "name": "VfPositioned",
17242
+ "module": "src/position.ts"
17243
+ }
17244
+ },
16543
17245
  {
16544
17246
  "name": "description",
16545
17247
  "type": {
@@ -16737,6 +17439,20 @@
16737
17439
  "module": "src/position.ts"
16738
17440
  }
16739
17441
  },
17442
+ {
17443
+ "kind": "field",
17444
+ "name": "origin",
17445
+ "type": {
17446
+ "text": "PlacementOrigin | null | undefined"
17447
+ },
17448
+ "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.",
17449
+ "attribute": "origin",
17450
+ "reflects": true,
17451
+ "inheritedFrom": {
17452
+ "name": "VfPositioned",
17453
+ "module": "src/position.ts"
17454
+ }
17455
+ },
16740
17456
  {
16741
17457
  "kind": "field",
16742
17458
  "name": "shadowRootOptions",
@@ -17623,6 +18339,18 @@
17623
18339
  "module": "src/position.ts"
17624
18340
  }
17625
18341
  },
18342
+ {
18343
+ "name": "origin",
18344
+ "type": {
18345
+ "text": "PlacementOrigin | null | undefined"
18346
+ },
18347
+ "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.",
18348
+ "fieldName": "origin",
18349
+ "inheritedFrom": {
18350
+ "name": "VfPositioned",
18351
+ "module": "src/position.ts"
18352
+ }
18353
+ },
17626
18354
  {
17627
18355
  "name": "value",
17628
18356
  "type": {
@@ -17879,6 +18607,20 @@
17879
18607
  "module": "src/position.ts"
17880
18608
  }
17881
18609
  },
18610
+ {
18611
+ "kind": "field",
18612
+ "name": "origin",
18613
+ "type": {
18614
+ "text": "PlacementOrigin | null | undefined"
18615
+ },
18616
+ "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.",
18617
+ "attribute": "origin",
18618
+ "reflects": true,
18619
+ "inheritedFrom": {
18620
+ "name": "VfPositioned",
18621
+ "module": "src/position.ts"
18622
+ }
18623
+ },
17882
18624
  {
17883
18625
  "kind": "field",
17884
18626
  "name": "shadowRootOptions",
@@ -18772,6 +19514,18 @@
18772
19514
  "module": "src/position.ts"
18773
19515
  }
18774
19516
  },
19517
+ {
19518
+ "name": "origin",
19519
+ "type": {
19520
+ "text": "PlacementOrigin | null | undefined"
19521
+ },
19522
+ "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.",
19523
+ "fieldName": "origin",
19524
+ "inheritedFrom": {
19525
+ "name": "VfPositioned",
19526
+ "module": "src/position.ts"
19527
+ }
19528
+ },
18775
19529
  {
18776
19530
  "name": "value",
18777
19531
  "type": {
@@ -19274,9 +20028,16 @@
19274
20028
  "type": {
19275
20029
  "text": "number"
19276
20030
  }
20031
+ },
20032
+ {
20033
+ "name": "child",
20034
+ "optional": true,
20035
+ "type": {
20036
+ "text": "Element"
20037
+ }
19277
20038
  }
19278
20039
  ],
19279
- "description": "A viewport point (CSS px) as a placement in the window's content region\n— `{ left, top }` in whole system px on the placement lattice, the pair a\nchild dropped into this window is written with: the body's corner, or\nunder `scrollbars` the scrolled plane, scroll offset included. The anchor\nsits in the shadow tree, which is why the conversion is a method here\nrather than the page's own `toSysExact` against a rect."
20040
+ "description": "A viewport point (CSS px) as a placement in the window's content region\n— `{ left, top }` in whole system px on the placement lattice, the pair a\nchild dropped into this window is written with: the body's corner, or\nunder `scrollbars` the scrolled plane, scroll offset included. The anchor\nsits in the shadow tree, which is why the conversion is a method here\nrather than the page's own `toSysExact` against a rect. With `child`,\nthe pair to write to that element: the offset its `origin` adds is\nfolded in, so its box's corner lands on the point."
19280
20041
  },
19281
20042
  {
19282
20043
  "kind": "method",
@@ -19509,6 +20270,20 @@
19509
20270
  "name": "VfPositioned",
19510
20271
  "module": "src/position.ts"
19511
20272
  }
20273
+ },
20274
+ {
20275
+ "kind": "field",
20276
+ "name": "origin",
20277
+ "type": {
20278
+ "text": "PlacementOrigin | null | undefined"
20279
+ },
20280
+ "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.",
20281
+ "attribute": "origin",
20282
+ "reflects": true,
20283
+ "inheritedFrom": {
20284
+ "name": "VfPositioned",
20285
+ "module": "src/position.ts"
20286
+ }
19512
20287
  }
19513
20288
  ],
19514
20289
  "events": [
@@ -19696,6 +20471,18 @@
19696
20471
  "name": "VfPositioned",
19697
20472
  "module": "src/position.ts"
19698
20473
  }
20474
+ },
20475
+ {
20476
+ "name": "origin",
20477
+ "type": {
20478
+ "text": "PlacementOrigin | null | undefined"
20479
+ },
20480
+ "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.",
20481
+ "fieldName": "origin",
20482
+ "inheritedFrom": {
20483
+ "name": "VfPositioned",
20484
+ "module": "src/position.ts"
20485
+ }
19699
20486
  }
19700
20487
  ],
19701
20488
  "mixins": [
@@ -22317,6 +23104,13 @@
22317
23104
  "type": {
22318
23105
  "text": "boolean"
22319
23106
  }
23107
+ },
23108
+ {
23109
+ "kind": "field",
23110
+ "name": "origin",
23111
+ "type": {
23112
+ "text": "PlacementOrigin | null | undefined"
23113
+ }
22320
23114
  }
22321
23115
  ],
22322
23116
  "superclass": {
@@ -22327,7 +23121,7 @@
22327
23121
  },
22328
23122
  {
22329
23123
  "kind": "mixin",
22330
- "description": "Explicit placement — `top`/`left` in whole system px, on **every** component.\n\nNo exceptions, deliberately. These are web components, and a consumer may put\none wherever they like; the kit does not get to decide that a `vf-option` is\nonly ever a popup row. The rows a container normally owns (`vf-option`,\n`vf-menu-item`, `vf-list-item`) and a bar's `vf-menu` take the pair on the\nsame terms as anything else — and stating an origin on one *inside* its\nmanaging parent does take it out of that parent's flow layout, which is the\nplacement working, not failing. Each of those components documents what its\ncontainer stops doing for it. `vf-dialog` takes the pair in viewport\ncoordinates, the one difference the platform forces (see modal-dialog.ts).\n\nA DITL resource laid a dialog out as a list of items, each with a rectangle\nin the window's own coordinates; arranging controls by stating where they go\nis as native to System 7 as stacking them. This mixin is that mechanism:\ndeclaring `top` or `left` takes the element out of normal flow and\nabsolutely positions it within its parent, both coordinates in the art's own\nunit so the position scales with the display like every other metric. A\nwindow or dialog body can be laid out either way — a tree of `vf-stack`s, or\npositioned children — with no stylesheet in either case.\n\nMechanics, mirroring how `vf-stack` writes its declared size:\n\n- Setting either property writes `position: absolute` and both offsets onto\n the host's inline style as `calc(var(--vf-scale, 1) * Npx)` — live against\n the display, resolved at paint time. The coordinate left unset is 0.\n- `right`/`bottom` are released to `auto` and `margin` zeroed, so the stated\n offsets are the whole story — an auto-width box with both edges set would\n stretch rather than sit (the `vf-icon` seed logic, generalized).\n- Unsetting both returns the element to normal flow: every inline\n declaration this wrote is removed, and stylesheet values resume.\n\nThe anchor is CSS's own: the nearest positioned ancestor's padding box. The\nkit's containers are all deliberate anchors — a desktop's raster, a window's\ncontent region (the frame's inner edge, below the title bar — the 12px body\ninset governs flow content only, exactly the DITL convention), a dialog's\ncontent area, a stack's box, a fieldset's border box, a scroll area's\nscrolled plane. In a non-kit parent, give the parent `position: relative`,\nthe one line of CSS this feature can't write for you.\n\nThe writing rides a ReactiveController (`hostUpdated`) rather than\nan `updated()` override, for a lifecycle reason worth keeping in the source:\nthe mixin sits *under* each component class, and most components override\n`updated()` without calling `super.updated()` — Lit's base is a no-op, so\nnothing ever forced the call — which would silently shadow a mixin-level\noverride. A controller is invoked by ReactiveElement itself, after every\nupdate, no matter what the subclass does.\n\nA gesture writes **through these properties**: `vf-window`'s title-bar drag\nand `vf-icon`'s drag and arrow nudge hand their new origin to a\nPlacementController, which snaps it onto the placement lattice and\nsets `left`/`top`. A moved element is therefore placed exactly the way an\nauthored one is — a live `calc()` in the art's own unit — and stays where it\nwas dropped when the zoom or the display changes what a system px costs.\n\nIt did not always. Writing the resolved CSS px straight to the inline style\nfroze the coordinate in the wrong unit: `--vf-scale` moved under it at every\nzoom step and the same constant read back as a different number of system px,\nso moved windows and icons slid off the grid the rest of the kit stayed on\n(by `3z / round(3z)` — 10% at 110% zoom, where nothing else moves at all).\n\nSetting a property yourself is still the deliberate way to re-place a moved\nelement. The controller re-applies **only when the values changed**, so an\nunrelated update — a heading change, a desktop toggling `active` — never\nre-asserts a coordinate and costs nothing.\n\n**Every write it makes is announced** as `vf-placement-change` (bubbles,\n`composed: false`, detail `{ left, top }` — nulls on a return to flow). It\nis an internal coordination event on the terms of the menu handshakes:\nparent and child share one light tree, and a kit protocol must not leak out\nof a consumer's shadow boundary. `vf-scroll-area` listens for it and\nre-measures, because a placed child moved through `top`/`left` changes the\nscroll range with no box changing anywhere a ResizeObserver can see — the\nplane's box is never grown by an absolutely positioned child. One funnel\ncovers a drop, an arrow nudge and a page's own `icon.left = …` alike.\n\n**`fixed`** holds the placement against the *visible* region of the nearest\nscrolling ancestor instead of its scrolled plane — a tool strip over a\ndocument, a column header over rows — and the flag alone places at (0,0).\nThe engine underneath is `position: sticky`, the one way the platform holds\na box against a scrollport from inside it on the compositor (a scroll\nlistener counter-translating lags a frame; a layer outside the scroller\nstops wheel and touch over it). Sticky boxes stay in flow, which is not\nwhat a placement is, so the controller erases the footprint: the host is\nblockified (no line box), shrink-wrapped, and given a negative right/bottom\nmargin equal to its own box — a 0×0 margin box that flow content lays out\nas if it weren't there, measured by a ResizeObserver so a relabel or a zoom\nstep keeps it exact. `z-index: 1` puts it over the plane's placed children,\nwhich is where a fixed strip belongs. Two facts of the engine that the\ndocs state as rules: sticky only ever pushes a box *down* from where the\nflow put it, so a fixed child comes before the flow content in its parent;\nand a scroll container that never scrolls (a plain window body is\n`overflow: hidden`) holds it exactly where placement would.",
23124
+ "description": "Explicit placement — `top`/`left` in whole system px, on **every** component.\n\nNo exceptions, deliberately. These are web components, and a consumer may put\none wherever they like; the kit does not get to decide that a `vf-option` is\nonly ever a popup row. The rows a container normally owns (`vf-option`,\n`vf-menu-item`, `vf-list-item`) and a bar's `vf-menu` take the pair on the\nsame terms as anything else — and stating an origin on one *inside* its\nmanaging parent does take it out of that parent's flow layout, which is the\nplacement working, not failing. Each of those components documents what its\ncontainer stops doing for it. `vf-dialog` takes the pair in viewport\ncoordinates, the one difference the platform forces (see modal-dialog.ts).\n\nA DITL resource laid a dialog out as a list of items, each with a rectangle\nin the window's own coordinates; arranging controls by stating where they go\nis as native to System 7 as stacking them. This mixin is that mechanism:\ndeclaring `top` or `left` takes the element out of normal flow and\nabsolutely positions it within its parent, both coordinates in the art's own\nunit so the position scales with the display like every other metric. A\nwindow or dialog body can be laid out either way — a tree of `vf-stack`s, or\npositioned children — with no stylesheet in either case.\n\nMechanics, mirroring how `vf-stack` writes its declared size:\n\n- Setting either property writes `position: absolute` and both offsets onto\n the host's inline style as `calc(var(--vf-scale, 1) * Npx)` — live against\n the display, resolved at paint time. The coordinate left unset is 0.\n- `right`/`bottom` are released to `auto` and `margin` zeroed, so the stated\n offsets are the whole story — an auto-width box with both edges set would\n stretch rather than sit (the `vf-icon` seed logic, generalized).\n- Unsetting both returns the element to normal flow: every inline\n declaration this wrote is removed, and stylesheet values resume.\n\nThe anchor is CSS's own: the nearest positioned ancestor's padding box. The\nkit's containers are all deliberate anchors — a desktop's raster, a window's\nor a dialog's content region (the frame's inner edge, below any title bar,\nwith no inset — flow content starts there too, exactly the DITL\nconvention), a stack's box, a fieldset's border box, a scroll area's\nscrolled plane. In a non-kit parent, give the parent `position: relative`,\nthe one line of CSS this feature can't write for you.\n\nThe writing rides a ReactiveController (`hostUpdated`) rather than\nan `updated()` override, for a lifecycle reason worth keeping in the source:\nthe mixin sits *under* each component class, and most components override\n`updated()` without calling `super.updated()` — Lit's base is a no-op, so\nnothing ever forced the call — which would silently shadow a mixin-level\noverride. A controller is invoked by ReactiveElement itself, after every\nupdate, no matter what the subclass does.\n\nA gesture writes **through these properties**: `vf-window`'s title-bar drag\nand `vf-icon`'s drag and arrow nudge hand their new origin to a\nPlacementController, which snaps it onto the placement lattice and\nsets `left`/`top`. A moved element is therefore placed exactly the way an\nauthored one is — a live `calc()` in the art's own unit — and stays where it\nwas dropped when the zoom or the display changes what a system px costs.\n\nIt did not always. Writing the resolved CSS px straight to the inline style\nfroze the coordinate in the wrong unit: `--vf-scale` moved under it at every\nzoom step and the same constant read back as a different number of system px,\nso moved windows and icons slid off the grid the rest of the kit stayed on\n(by `3z / round(3z)` — 10% at 110% zoom, where nothing else moves at all).\n\nSetting a property yourself is still the deliberate way to re-place a moved\nelement. The controller re-applies **only when the values changed**, so an\nunrelated update — a heading change, a desktop toggling `active` — never\nre-asserts a coordinate and costs nothing.\n\n**Every write it makes is announced** as `vf-placement-change` (bubbles,\n`composed: false`, detail `{ left, top }` — nulls on a return to flow). It\nis an internal coordination event on the terms of the menu handshakes:\nparent and child share one light tree, and a kit protocol must not leak out\nof a consumer's shadow boundary. `vf-scroll-area` listens for it and\nre-measures, because a placed child moved through `top`/`left` changes the\nscroll range with no box changing anywhere a ResizeObserver can see — the\nplane's box is never grown by an absolutely positioned child. One funnel\ncovers a drop, an arrow nudge and a page's own `icon.left = …` alike.\n\n**`origin`** names which point of the host's own box the pair places —\nnine keywords, vertical then horizontal (`top center`, `bottom right`,\n`center`), `top left` the default. A title stays centered on its `left`\nwhatever its text; a button group keeps its bottom-right corner in from\nthe dialog's however long its labels run. The point is measured, not\ntransformed: the controller reads the host's border box in whole system px\n(w × h) and writes `left` as the stated `L` less ⌈w·fx⌉ (`fx` 0, ½ or 1),\n`top` the same way — the ceiling sends an odd size's leftover half toward\nthe start, the tie rule the kit's other centering uses. A ResizeObserver\nkeeps the offset current through a relabel or a late font, and each such\nrewrite is announced like any other write. A zoom step changes CSS px, not\nsystem px, so it recomputes the same offset. `translate: -50% 0` would have\nbeen the no-JavaScript version, and fails twice: a percentage of an odd\nwidth is half a pixel, which smears the 1-bit art, and a transform makes\nthe host the containing block for `position: fixed` descendants — a placed\ngroup holding a `vf-select` would trap its list. `top left` is the plain\ncode path: no observer, no measurement, the same inline style as before\nthe attribute existed. An unknown value places as `top left` and warns once\nper element. On its own the attribute places nothing: it changes what the\npair means, and is inert on a host in flow.\n\n**`fixed`** holds the placement against the *visible* region of the nearest\nscrolling ancestor instead of its scrolled plane — a tool strip over a\ndocument, a column header over rows — and the flag alone places at (0,0).\nThe engine underneath is `position: sticky`, the one way the platform holds\na box against a scrollport from inside it on the compositor (a scroll\nlistener counter-translating lags a frame; a layer outside the scroller\nstops wheel and touch over it). Sticky boxes stay in flow, which is not\nwhat a placement is, so the controller erases the footprint: the host is\nblockified (no line box), shrink-wrapped, and given a negative right/bottom\nmargin equal to its own box — a 0×0 margin box that flow content lays out\nas if it weren't there, measured by a ResizeObserver so a relabel or a zoom\nstep keeps it exact. `z-index: 1` puts it over the plane's placed children,\nwhich is where a fixed strip belongs. Two facts of the engine that the\ndocs state as rules: sticky only ever pushes a box *down* from where the\nflow put it, so a fixed child comes before the flow content in its parent;\nand a scroll container that never scrolls (a plain window body is\n`overflow: hidden`) holds it exactly where placement would.",
22331
23125
  "name": "VfPositioned",
22332
23126
  "members": [
22333
23127
  {
@@ -22358,6 +23152,16 @@
22358
23152
  "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.",
22359
23153
  "attribute": "fixed",
22360
23154
  "reflects": true
23155
+ },
23156
+ {
23157
+ "kind": "field",
23158
+ "name": "origin",
23159
+ "type": {
23160
+ "text": "PlacementOrigin | null | undefined"
23161
+ },
23162
+ "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.",
23163
+ "attribute": "origin",
23164
+ "reflects": true
22361
23165
  }
22362
23166
  ],
22363
23167
  "attributes": [
@@ -22385,6 +23189,14 @@
22385
23189
  "default": "false",
22386
23190
  "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.",
22387
23191
  "fieldName": "fixed"
23192
+ },
23193
+ {
23194
+ "name": "origin",
23195
+ "type": {
23196
+ "text": "PlacementOrigin | null | undefined"
23197
+ },
23198
+ "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.",
23199
+ "fieldName": "origin"
22388
23200
  }
22389
23201
  ],
22390
23202
  "parameters": [
@@ -22429,9 +23241,16 @@
22429
23241
  "type": {
22430
23242
  "text": "Element"
22431
23243
  }
23244
+ },
23245
+ {
23246
+ "name": "child",
23247
+ "optional": true,
23248
+ "type": {
23249
+ "text": "Element"
23250
+ }
22432
23251
  }
22433
23252
  ],
22434
- "description": "A viewport point as a placement in `anchor`'s coordinates: `{ left, top }`\nin whole system px on the placement lattice, measured from the anchor's\nbox the way a placed child's `top`/`left` are — the unit and lattice a\ndrag lands on, so the result can be written straight to a child's pair.\n\nThe three containers whose anchor sits in shadow DOM (`vf-window`'s\ncontent region, `vf-desktop`'s screen, `vf-scroll-area`'s plane) expose it\nas `placementAt(clientX, clientY)`; everywhere else the anchor is the\nelement's own padding box, and `toSysExact` against\n`getBoundingClientRect()` is the documented conversion. The anchor is\nexpected to carry no border of its own (the three do not), so its border\nbox is its padding box; `scaleAt` is the element whose `--vf-scale` the\nconversion reads — the component's host."
23253
+ "description": "A viewport point as a placement in `anchor`'s coordinates: `{ left, top }`\nin whole system px on the placement lattice, measured from the anchor's\nbox the way a placed child's `top`/`left` are — the unit and lattice a\ndrag lands on, so the result can be written straight to a child's pair.\n\nThe three containers whose anchor sits in shadow DOM (`vf-window`'s\ncontent region, `vf-desktop`'s screen, `vf-scroll-area`'s plane) expose it\nas `placementAt(clientX, clientY)`; everywhere else the anchor is the\nelement's own padding box, and `toSysExact` against\n`getBoundingClientRect()` is the documented conversion. The anchor is\nexpected to carry no border of its own (the three do not), so its border\nbox is its padding box; `scaleAt` is the element whose `--vf-scale` the\nconversion reads — the component's host.\n\nWith `child`, the pair to write to *that* element so its box's corner\nlands on the point: the offset its `origin` adds is folded in, and is zero\nfor a child with none."
22435
23254
  },
22436
23255
  {
22437
23256
  "kind": "class",
@@ -22495,6 +23314,15 @@
22495
23314
  "description": "The box the gesture is clamped into, in system px: the one seed\nmeasured, or a fresh measurement before any gesture. A group drag reads\nit to clamp a whole selection's delta at once.",
22496
23315
  "readonly": true
22497
23316
  },
23317
+ {
23318
+ "kind": "field",
23319
+ "name": "offset",
23320
+ "type": {
23321
+ "text": "Readonly<Offset>"
23322
+ },
23323
+ "description": "The offset the host's stated pair sits from its box's top-left corner,\nin whole system px — what its `origin` adds, `(0, 0)` without one. A\ngroup drag reads it to clamp each member's box rather than its pair.",
23324
+ "readonly": true
23325
+ },
22498
23326
  {
22499
23327
  "kind": "method",
22500
23328
  "name": "seed",
@@ -22503,7 +23331,7 @@
22503
23331
  "text": "{ x: number; y: number }"
22504
23332
  }
22505
23333
  },
22506
- "description": "The origin a move adds its delta to, in system px.\n\nA stated coordinate is authoritative and needs no measuring — including\nthe one this controller wrote last time. Otherwise the host is wherever\nlayout or a stylesheet put it, so the *used* position is read and\nconverted: absolutely positioned hosts through their computed offsets\n(`left: 10%` and `left: 1em` are perfectly good ways to place one, and\nboth resolve to px here), everything else through its in-flow offset,\nwhich is measured against the same padding box `left`/`top` will be."
23334
+ "description": "The origin a move adds its delta to, in system px — the stated pair,\nwhich with an `origin` is the origin point rather than the corner.\n\nA stated coordinate is authoritative and needs no measuring — including\nthe one this controller wrote last time. Otherwise the host is wherever\nlayout or a stylesheet put it, so the *used* position is read and\nconverted: absolutely positioned hosts through their computed offsets\n(`left: 10%` and `left: 1em` are perfectly good ways to place one, and\nboth resolve to px here), everything else through its in-flow offset,\nwhich is measured against the same padding box `left`/`top` will be.\nThat read is the corner, so the origin's offset is added back."
22507
23335
  },
22508
23336
  {
22509
23337
  "kind": "method",
@@ -22527,7 +23355,7 @@
22527
23355
  }
22528
23356
  }
22529
23357
  ],
22530
- "description": "Place the host at a system-px origin, clamped by its own rule and snapped.\n\nThe clamp runs *here*, during the gesture, which is the moment the user is\nactually pushing against an edge — and nowhere else. Re-clamping later, on\na parent that shrank under a zoom, would move a host nobody moved and would\nnot give the position back when the parent grew again.\n\nIt runs against the box seed measured, not a fresh one. The\ndifference only shows when the movable contract is unmet: a host with no\nstated origin is in normal flow, so its first move takes it out — and an\nauto-height parent then collapses to whatever is left, which is a box the\nhost never actually sat in. Re-measuring per move would clamp the rest of\nthe gesture into that phantom, walking the host to the parent's origin\nwhile the user drags away from it. The box at the moment of the press is\nthe one the user is pushing against."
23358
+ "description": "Place the host at a system-px origin, clamped by its own rule and snapped.\n\nThe clamp runs *here*, during the gesture, which is the moment the user is\nactually pushing against an edge — and nowhere else. Re-clamping later, on\na parent that shrank under a zoom, would move a host nobody moved and would\nnot give the position back when the parent grew again.\n\nIt runs against the box seed measured, not a fresh one. The\ndifference only shows when the movable contract is unmet: a host with no\nstated origin is in normal flow, so its first move takes it out — and an\nauto-height parent then collapses to whatever is left, which is a box the\nhost never actually sat in. Re-measuring per move would clamp the rest of\nthe gesture into that phantom, walking the host to the parent's origin\nwhile the user drags away from it. The box at the moment of the press is\nthe one the user is pushing against.\n\nThe pair is the origin point; the clamp is a rule about the *box*. So\nthe origin's offset comes off before the clamp and goes back on after,\nand a dragged title stays centered on wherever it was dropped."
22531
23359
  },
22532
23360
  {
22533
23361
  "kind": "method",