@mkbabb/glass-ui 8.0.0 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/MIGRATION.md +4768 -0
  2. package/README.md +57 -13
  3. package/dist/DialogContent-CwIBvou_.js +157 -0
  4. package/dist/{DropdownMenuTrigger-8UZsBtZ8.js → DropdownMenuTrigger-CKRnhDSQ.js} +1 -1
  5. package/dist/{Surface-i1tWC-Ga.js → Surface-1nPoabc3.js} +1 -1
  6. package/dist/{accent-tone-solve-Cw7WkRD9.js → accent-tone-solve-5H6FY2QO.js} +1 -1
  7. package/dist/aurora.js +386 -355
  8. package/dist/{badge-owUOaaba.js → badge-BO6BC4G5.js} +1 -1
  9. package/dist/badge.js +1 -1
  10. package/dist/blob.js +44 -44
  11. package/dist/{button-yvGPb0Bx.js → button-BOFTUPyU.js} +1 -1
  12. package/dist/button.js +1 -1
  13. package/dist/{card-3HFFpC7_.js → card-ByyqRBvK.js} +2 -2
  14. package/dist/card.js +1 -1
  15. package/dist/carousel.js +3 -3
  16. package/dist/{checkbox-BnXuGgJ3.js → checkbox-B1qn65se.js} +1 -1
  17. package/dist/checkbox.js +1 -1
  18. package/dist/chip.js +8 -3
  19. package/dist/{class-names-q-UGOkHH.js → class-names-FlXcvRRT.js} +65 -18
  20. package/dist/{collapsible-B7O6m-Ch.js → collapsible-DFzK29Oh.js} +5 -2
  21. package/dist/collapsible.js +1 -1
  22. package/dist/color.glsl-DTJhdekG.js +34 -0
  23. package/dist/color.js +11 -11
  24. package/dist/color.wgsl-BTszLY39.js +398 -0
  25. package/dist/{command-BuBnYpxF.js → command-C-5xSEJ2.js} +8 -8
  26. package/dist/command.js +1 -1
  27. package/dist/component-styles.css +1 -0
  28. package/dist/components/_shared/class-names.d.ts +10 -1
  29. package/dist/components/_shared/control.d.ts +0 -1
  30. package/dist/components/_shared/index.d.ts +0 -1
  31. package/dist/components/_shared/menu/menu.css +1 -1
  32. package/dist/components/_shared/overlay/index.d.ts +1 -0
  33. package/dist/components/_shared/overlay/shortcuts.d.ts +12 -0
  34. package/dist/components/aurora/Aurora.vue.d.ts +1 -0
  35. package/dist/components/aurora/composables/atoms.d.ts +22 -6
  36. package/dist/components/aurora/composables/frameLoop.d.ts +6 -5
  37. package/dist/components/aurora/composables/runtime.d.ts +28 -1
  38. package/dist/components/aurora/composables/useAurora.d.ts +28 -0
  39. package/dist/components/aurora/composables/wgpuSetup.d.ts +1 -1
  40. package/dist/components/aurora/constants/presets.d.ts +62 -5
  41. package/dist/components/aurora/index.d.ts +1 -1
  42. package/dist/components/blob/Blob.vue.d.ts +3 -3
  43. package/dist/components/card/Card.vue.d.ts +8 -2
  44. package/dist/components/chip/Chip.vue.d.ts +1 -7
  45. package/dist/components/chip/chipVariants.d.ts +1 -0
  46. package/dist/components/collapsible/Collapsible.vue.d.ts +1 -0
  47. package/dist/components/command/CommandDialog.vue.d.ts +1 -1
  48. package/dist/components/configurator/Configurator.vue.d.ts +25 -2
  49. package/dist/components/configurator/ConfiguratorRow.vue.d.ts +4 -2
  50. package/dist/components/configurator/styles.css +1 -1
  51. package/dist/components/dark-mode-toggle/dark-mode-toggle.css +1 -1
  52. package/dist/components/deck/styles/capture.css +1 -1
  53. package/dist/components/dialog/styles.css +1 -1
  54. package/dist/components/dock/DockSeparator.vue.d.ts +2 -3
  55. package/dist/components/dock/GlassDock.vue.d.ts +1 -0
  56. package/dist/components/dock/composables/dockContext.d.ts +1 -8
  57. package/dist/components/dock/composables/dockCrossfadeContext.d.ts +0 -2
  58. package/dist/components/dock/composables/index.d.ts +1 -1
  59. package/dist/components/dock/composables/useDockHold.d.ts +16 -12
  60. package/dist/components/dock/composables/useDockRun.d.ts +20 -0
  61. package/dist/components/dock/composables/useDockSearch.d.ts +1 -1
  62. package/dist/components/dock/composables/useDockShellProps.d.ts +18 -101
  63. package/dist/components/dock/composables/useDockState.d.ts +2 -9
  64. package/dist/components/dock/constants.d.ts +15 -0
  65. package/dist/components/dock/index.d.ts +2 -2
  66. package/dist/components/dock/styles/controls/icon-button.css +1 -1
  67. package/dist/components/dock/styles/controls/tab-button.css +1 -1
  68. package/dist/components/dock/styles/controls/triggers.css +1 -1
  69. package/dist/components/dock/styles/controls.css +1 -1
  70. package/dist/components/dock/styles/density.css +1 -1
  71. package/dist/components/dock/styles/index.css +1 -1
  72. package/dist/components/dock/styles/layer-group.css +1 -1
  73. package/dist/components/dock/styles/layers.css +1 -1
  74. package/dist/components/dock/styles/morph.css +1 -1
  75. package/dist/components/dock/styles/run.css +1 -0
  76. package/dist/components/dock/styles/search.css +1 -1
  77. package/dist/components/dock/styles/shape.css +1 -1
  78. package/dist/components/dock/styles/shell-regions.css +1 -1
  79. package/dist/components/dock/styles/shell.css +1 -1
  80. package/dist/components/fourier-field/FourierField.vue.d.ts +29 -26
  81. package/dist/components/fourier-field/clock.d.ts +35 -0
  82. package/dist/components/fourier-field/constants.d.ts +80 -104
  83. package/dist/components/fourier-field/index.d.ts +3 -28
  84. package/dist/components/fourier-field/math.d.ts +69 -77
  85. package/dist/components/fourier-field/renderer/mint.d.ts +50 -0
  86. package/dist/components/fourier-field/renderer/uniforms.d.ts +84 -0
  87. package/dist/components/fourier-field/renderer/wgpu.d.ts +28 -0
  88. package/dist/components/fourier-field/shaders/compute.wgsl.d.ts +1 -0
  89. package/dist/components/fourier-field/shaders/render.wgsl.d.ts +1 -0
  90. package/dist/components/fourier-field/useFourierField.d.ts +49 -0
  91. package/dist/components/handmark/HandMark.vue.d.ts +18 -14
  92. package/dist/components/handmark/index.d.ts +4 -23
  93. package/dist/components/handmark/stroke.d.ts +92 -0
  94. package/dist/components/labeled-field/LabeledSwitch.vue.d.ts +3 -1
  95. package/dist/components/labeled-field/types.d.ts +1 -1
  96. package/dist/components/menu/DropdownMenu.vue.d.ts +1 -1
  97. package/dist/components/metric/coalesce-metric.d.ts +6 -1
  98. package/dist/components/metric/styles.css +1 -1
  99. package/dist/components/popover/Popover.vue.d.ts +1 -1
  100. package/dist/components/scroll-progress-rim/styles.css +1 -1
  101. package/dist/components/sheet/styles.css +1 -1
  102. package/dist/components/slider/styles.css +1 -1
  103. package/dist/components/tabs/SegmentedTabs.vue.d.ts +25 -112
  104. package/dist/components/tabs/composables/useTabDragMorph.d.ts +1 -1
  105. package/dist/components/tabs/composables/useTabResponsive.d.ts +11 -11
  106. package/dist/components/tabs/index.d.ts +1 -1
  107. package/dist/components/tabs/styles/drag.css +1 -1
  108. package/dist/components/tabs/styles/segmented.css +1 -1
  109. package/dist/components/tabs/types.d.ts +85 -0
  110. package/dist/components/timeline/index.d.ts +2 -0
  111. package/dist/components/toast/Toast.vue.d.ts +2 -2
  112. package/dist/composables/color/index.d.ts +0 -15
  113. package/dist/composables/dark/darkModeSyncScript.d.ts +42 -0
  114. package/dist/composables/dom/useResolveTokenColor.d.ts +1 -1
  115. package/dist/composables/glass/index.d.ts +2 -0
  116. package/dist/composables/keyboard/useKeyboardShortcuts.d.ts +47 -1
  117. package/dist/composables/motion/pointer/pointerFieldMappings.d.ts +0 -41
  118. package/dist/{components/search/composables → composables/search}/index.d.ts +2 -2
  119. package/dist/{components/search/composables/fuzzySearchIndex.d.ts → composables/search/match.d.ts} +8 -3
  120. package/dist/composables/sidebar/types.d.ts +5 -1
  121. package/dist/configurator-DiwVN573.js +339 -0
  122. package/dist/configurator.js +1 -1
  123. package/dist/constellation.js +5 -5
  124. package/dist/{content-CWO-XL7o.js → content-So3j6SOe.js} +1 -1
  125. package/dist/control-DJp15L4U.js +7 -0
  126. package/dist/dark-mode-toggle.js +2 -2
  127. package/dist/{dark-z_P5QwqI.js → dark-pONY3x93.js} +2 -2
  128. package/dist/dark.js +1 -1
  129. package/dist/{data-table-_RrOEdiw.js → data-table-Ba_uTfPc.js} +3 -3
  130. package/dist/data-table.js +1 -1
  131. package/dist/{deck-Ci6YjB5e.js → deck-Cm_VmyNL.js} +1 -1
  132. package/dist/deck.js +1 -1
  133. package/dist/{dialog-CbRnTRtg.js → dialog-BZoFG0j8.js} +1 -1
  134. package/dist/dialog.js +2 -2
  135. package/dist/dock.js +718 -496
  136. package/dist/dom.js +90 -8
  137. package/dist/easing.js +5 -5
  138. package/dist/expandable-container-CZUj9BzY.js +142 -0
  139. package/dist/expandable-container.js +2 -142
  140. package/dist/fourier-field.js +638 -855
  141. package/dist/fourier-math.js +6 -6
  142. package/dist/glass-ui.css +1 -1
  143. package/dist/glass-ui.js +88 -75
  144. package/dist/handmark.js +330 -718
  145. package/dist/index.d.ts +2 -2
  146. package/dist/infinite-scroll.js +16 -17
  147. package/dist/{input-Bls2A4Tt.js → input-eLZ_AU7l.js} +1 -1
  148. package/dist/input.js +1 -1
  149. package/dist/keyboard.js +64 -21
  150. package/dist/{label-BQEZhnK_.js → label-CE03H1KL.js} +2 -2
  151. package/dist/label.js +1 -1
  152. package/dist/labeled-field.js +9 -6
  153. package/dist/{menu-wLu1XGKn.js → menu-BnmCOa3y.js} +93 -90
  154. package/dist/menu.js +2 -2
  155. package/dist/metric.js +12 -7
  156. package/dist/{motion-D4uYE0UM.js → motion-BvV1_24p.js} +1 -1
  157. package/dist/motion-core.js +35 -35
  158. package/dist/{number-field-NFAwQ0HK.js → number-field-RP89046a.js} +2 -2
  159. package/dist/number-field.js +1 -1
  160. package/dist/pager-dots.js +3 -3
  161. package/dist/{participation-B0hdsIRo.js → participation-Di4UHbzk.js} +8 -8
  162. package/dist/{pointerFieldMappings-DP5tla5z.js → pointerFieldMappings-DXwlU5uj.js} +7 -23
  163. package/dist/popover-DA87hFBx.js +184 -0
  164. package/dist/popover.js +1 -1
  165. package/dist/{progress-DF8dWZIX.js → progress-eVa-mc7J.js} +1 -1
  166. package/dist/progress.js +1 -1
  167. package/dist/{radio-group-Ci8o-pDx.js → radio-group-B58Bz16F.js} +2 -2
  168. package/dist/radio-group.js +1 -1
  169. package/dist/{select-CDgwGH_P.js → select-fy3vtArm.js} +13 -13
  170. package/dist/select.js +1 -1
  171. package/dist/{separator-CN11t406.js → separator-D4EZM10u.js} +2 -2
  172. package/dist/separator.js +1 -1
  173. package/dist/{sheet-BEFvnO_u.js → sheet-BQJyER59.js} +120 -115
  174. package/dist/sheet.js +2 -2
  175. package/dist/shortcuts-DGGWNRNe.js +13 -0
  176. package/dist/sidebar.js +4 -4
  177. package/dist/{slider-gsc8jDIo.js → slider-5ChjjWSR.js} +1 -1
  178. package/dist/slider.js +1 -1
  179. package/dist/{status-dot-BpnqOP5N.js → status-dot-W4LFiJps.js} +2 -2
  180. package/dist/status-dot.js +1 -1
  181. package/dist/styles/accessibility.css +1 -1
  182. package/dist/styles/animations.css +1 -1
  183. package/dist/styles/components.css +1 -1
  184. package/dist/styles/glass/a11y-fallback.css +1 -1
  185. package/dist/styles/glass/dissolve.css +1 -1
  186. package/dist/styles/glass/focus-veil.css +1 -1
  187. package/dist/styles/glass/ladder.css +1 -1
  188. package/dist/styles/glass/material.css +1 -1
  189. package/dist/styles/glass/overlay-plate.css +1 -1
  190. package/dist/styles/glass/reveal.css +1 -1
  191. package/dist/styles/glass-specular-track.css +1 -1
  192. package/dist/styles/paper.css +1 -1
  193. package/dist/styles/scroll-choreography.css +1 -1
  194. package/dist/styles/scroll-chrome.css +1 -1
  195. package/dist/styles/scroll-driven.css +1 -1
  196. package/dist/styles/theme/literals.css +1 -1
  197. package/dist/styles/tokens/color-radius.css +1 -1
  198. package/dist/styles/tokens/dark-arm-glass.css +1 -1
  199. package/dist/styles/tokens/light-dark.css +1 -1
  200. package/dist/styles/tokens/offsets.css +1 -1
  201. package/dist/styles/tokens/scheme-motion.css +1 -1
  202. package/dist/styles/tokens/sizing.css +1 -1
  203. package/dist/styles/typography/semantic.css +1 -1
  204. package/dist/styles/typography/utilities.css +1 -1
  205. package/dist/styles/utilities/a11y-overrides.css +1 -1
  206. package/dist/styles/utilities/responsive.css +1 -1
  207. package/dist/styles/view-transition.css +1 -1
  208. package/dist/styles/viz-reveal.css +1 -1
  209. package/dist/surface.js +1 -1
  210. package/dist/{switch-DxZzDrmV.js → switch-BYUZ6g9G.js} +2 -2
  211. package/dist/switch.js +1 -1
  212. package/dist/{tabs-CYscnq5H.js → tabs-rdRXKXxd.js} +4 -3
  213. package/dist/tabs.js +1 -1
  214. package/dist/textarea.js +1 -1
  215. package/dist/timeline.js +44 -42
  216. package/dist/{toast-9c6Kp58L.js → toast-DVOwo6GB.js} +1 -1
  217. package/dist/toast.js +1 -1
  218. package/dist/{toggle-group-11aPGMfE.js → toggle-group-CC5b3o1R.js} +2 -2
  219. package/dist/toggle-group.js +1 -1
  220. package/dist/{tooltip-DqKMZ4dn.js → tooltip-DhTHhtJN.js} +2 -2
  221. package/dist/tooltip.js +1 -1
  222. package/dist/typewriter.js +1 -1
  223. package/dist/{useAccentTone-DFAh1osB.js → useAccentTone-DitmKfGL.js} +1 -1
  224. package/dist/{resolveCanvasColor-6MCrswTB.js → useCanvas2D-CQRElMyE.js} +1 -11
  225. package/dist/{usePointerVelocityField-DsIf7yyq.js → usePointerVelocityField-Lx26_Yap.js} +1 -1
  226. package/dist/useResolveTokenColor-B2FfJnd9.js +24 -0
  227. package/package.json +5 -21
  228. package/dist/DialogContent-4hzLiaCQ.js +0 -152
  229. package/dist/canvas.d.ts +0 -1
  230. package/dist/canvas.js +0 -2
  231. package/dist/color.wgsl-B0N3mKMb.js +0 -412
  232. package/dist/compile-D7VYG3gi.js +0 -19
  233. package/dist/components/dock/composables/useDockOverflowFit.d.ts +0 -20
  234. package/dist/components/dock/composables/useDockTouchGate.d.ts +0 -42
  235. package/dist/components/dock/styles/overflow.css +0 -1
  236. package/dist/components/fourier-field/composables/fourierFieldGLSetup.d.ts +0 -24
  237. package/dist/components/fourier-field/composables/fourierFieldWGPUSetup.d.ts +0 -31
  238. package/dist/components/fourier-field/composables/uniformBridgeWGPU.d.ts +0 -39
  239. package/dist/components/fourier-field/composables/useFourierField.d.ts +0 -56
  240. package/dist/components/fourier-field/shaders/fourier-field.compute.wgsl.d.ts +0 -1
  241. package/dist/components/fourier-field/shaders/fourier-field.glsl.d.ts +0 -4
  242. package/dist/components/fourier-field/shaders/fourier-field.render.wgsl.d.ts +0 -1
  243. package/dist/components/fourier-field/shaders/fourier-field.ribbon.d.ts +0 -51
  244. package/dist/components/handmark/brush.d.ts +0 -269
  245. package/dist/components/handmark/composables/useHandMark.d.ts +0 -99
  246. package/dist/components/handmark/constants.d.ts +0 -69
  247. package/dist/components/handmark/freehand.d.ts +0 -69
  248. package/dist/components/handmark/geometry.d.ts +0 -62
  249. package/dist/components/handmark/ink.d.ts +0 -11
  250. package/dist/components/handmark/noise.d.ts +0 -30
  251. package/dist/components/handmark/texture.d.ts +0 -39
  252. package/dist/components/handmark/types.d.ts +0 -70
  253. package/dist/components/search/SearchBar.vue.d.ts +0 -38
  254. package/dist/components/search/index.d.ts +0 -8
  255. package/dist/components/search/searchVariants.d.ts +0 -16
  256. package/dist/configurator-BoeScnDL.js +0 -311
  257. package/dist/control-Da4XeT43.js +0 -11
  258. package/dist/popover-DBMKTPkL.js +0 -181
  259. package/dist/search.d.ts +0 -1
  260. package/dist/search.js +0 -61
  261. package/dist/useFuzzySearch-CUnZknpm.js +0 -177
  262. package/dist/useResolveTokenColor-CspQv_ik.js +0 -107
  263. /package/dist/{components/search/composables → composables/search}/types.d.ts +0 -0
  264. /package/dist/{components/search/composables → composables/search}/useFuzzySearch.d.ts +0 -0
@@ -42,8 +42,36 @@ export interface UseAuroraReturn {
42
42
  * acquisition and flips only when the backend readiness promise resolves.
43
43
  */
44
44
  isArmed: Readonly<Ref<boolean>>;
45
+ /**
46
+ * The SETTLE BEACON. `true` once the runtime has armed, the current config has been
47
+ * applied, and the ground→field entrance has finished painting over it.
48
+ *
49
+ * `Aurora.vue` publishes it as `data-aurora-settled`; every capture — π, gate, or a
50
+ * consumer's own — waits on that attribute. A wall-clock sleep is not a substitute:
51
+ * inside the entrance the field paints medium-INDEPENDENTLY, so an early capture
52
+ * reads a picture that is identical across every medium and across page loads, with
53
+ * perfect confidence and no way to tell. Three seats measured that picture.
54
+ *
55
+ * Any config change re-opens it — a preset switch has its own entrance. So does a
56
+ * context LOSS: the field it witnesses is gone, and the restore replays the entrance,
57
+ * so the beacon never carries its pre-loss stamp across that replay.
58
+ */
59
+ isSettled: Readonly<Ref<boolean>>;
45
60
  rendererStatus: Readonly<Ref<RendererStatus>>;
46
61
  }
62
+ /**
63
+ * How long past the last applied config the field needs before a capture is admissible.
64
+ *
65
+ * The entrance is the ground→field CROSSFADE: `.aurora-canvas-layer` transitions opacity
66
+ * 0→1 over `--duration-slow` (0.45 s) once `isArmed` flips, dissolving the palette-derived
67
+ * frame-0 ground into the live field. Until that completes a capture reads a blend of the
68
+ * two, which is what makes it medium-independent. 500 ms clears the 450 ms token with the
69
+ * margin for the frame the config write lands on.
70
+ *
71
+ * The clock is advanced by `requestAnimationFrame`, not `setTimeout`, so a backgrounded
72
+ * or parked surface never stamps a beacon it has not painted.
73
+ */
74
+ export declare const AURORA_SETTLE_MS = 500;
47
75
  /**
48
76
  * Vue-side wrapper for the imperative `createAurora` runtime.
49
77
  *
@@ -15,7 +15,7 @@
15
15
  import type { WebGPUCanvasFrame } from "../../../composables/glass/webgpu/useWebGPUCanvas.js";
16
16
  import { type AuroraCursorScalars } from "./frameLoop.js";
17
17
  import { type UploadableImageSource } from "./textureUpload.js";
18
- import type { AuroraConfig } from "../constants/presets.js";
18
+ import { type AuroraConfig } from "../constants/presets.js";
19
19
  import type { UsePointerVelocityField } from "../../../composables/motion/pointer/usePointerVelocityField.js";
20
20
  export interface AuroraWGPUSetupDeps {
21
21
  canvas: HTMLCanvasElement;
@@ -68,10 +68,23 @@ export type WarpMode = "fbm" | "cellular" | "hybrid" | "curl";
68
68
  * - `swirl` — cursor-local warp and luminance lean on both engines.
69
69
  * - `amplitude` — sizes the transient burst folded into cursor strength on the CPU.
70
70
  * Every axis is suppressed under `prefers-reduced-motion` + the DockBackgroundToggle
71
- * pause (the master tempo scalar is the single suppression seam). The wispy-sky
72
- * default carries no `interactivity` (every axis OFF — the default stays static).
71
+ * pause (the master tempo scalar is the single suppression seam).
72
+ *
73
+ * `swirl` is ON by default — a config opts OUT with `swirl: false`. Every aurora is
74
+ * pointer-shapeable, and a capability parked behind an opt-in flag is a capability the
75
+ * surface does not have. `light` and `scroll` remain explicit opt-ins: `light` is only
76
+ * meaningful where the config carries impasto to relight (see its own note), and `scroll`
77
+ * re-times the shader clock against page position, which no surface should inherit.
73
78
  */
74
79
  export interface AuroraInteractivity {
80
+ /**
81
+ * Cursor-driven impasto relight. Steers `uLightDir`, which only `relightImpasto`
82
+ * consumes, and every term of that is multiplied by `uImpasto` — so `light` steers
83
+ * relighting ONLY where `impasto > 0`. The medium name is not the key: `impasto`
84
+ * defaults to 0 (`DEFAULT_AURORA_CONFIG`) and the atoms door raises it for `oil` and
85
+ * `vangogh` alone, so `light` over crayon, pastel, watercolor, oil-pastel, kuwahara
86
+ * or either metal shapes nothing unless the config sets `impasto` itself.
87
+ */
75
88
  light?: boolean;
76
89
  scroll?: boolean;
77
90
  /**
@@ -188,6 +201,16 @@ export interface AuroraConfig {
188
201
  breathPeriod: number;
189
202
  saturation: number;
190
203
  paperGrain: number;
204
+ /**
205
+ * Pigment alpha of the PAINTED image, 0..1. Live presentation applies it once as the
206
+ * canvas element's own opacity; capture keeps it in the transparent GPU buffer.
207
+ *
208
+ * It composites over the palette-derived GROUND placeholder, which is mounted
209
+ * unconditionally at full opacity and is alpha-blind — a raster of the same field —
210
+ * so `alpha` re-weights the ground→field dissolve, not the surface's delivered
211
+ * presence. The presence envelope is the `opacityCeiling` prop, applied once around
212
+ * placeholder + canvas together.
213
+ */
191
214
  alpha: number;
192
215
  /**
193
216
  * the §3 chroma FLOOR (the warm-field vividness contract).
@@ -204,12 +227,46 @@ export interface AuroraConfig {
204
227
  */
205
228
  vividness?: number;
206
229
  /**
207
- * Pointer/scroll interactivity opt-in (default OFF — the wispy-sky
208
- * default stays static). Omitted = every
209
- * axis off. Aliased on `/api` as part of the `AuroraConfig` surface.
230
+ * Pointer/scroll interactivity. `swirl` is ON unless a config says
231
+ * `swirl: false` — the pointer shapes every aurora by default, PRM-guarded by the
232
+ * master tempo scalar. `light` and `scroll` stay explicit opt-ins.
233
+ * Aliased on `/api` as part of the `AuroraConfig` surface.
210
234
  */
211
235
  interactivity?: AuroraInteractivity;
212
236
  }
237
+ /**
238
+ * The per-axis liveness floor of the drift demand gate.
239
+ *
240
+ * The four drift axes do NOT share a domain — nuclei 0..0.05, palette 0..0.04, breath
241
+ * 0..0.15, warp 0..0.015 — so ONE flat epsilon over raw values would retire whole axes
242
+ * (any epsilon that reaches `paletteDrift` is above `warpDrift`'s entire range). Each
243
+ * axis therefore carries its own floor, seeded at 1% of that axis's authored domain.
244
+ *
245
+ * The floors are the SHAPE, not the cut. Cutting them where they would actually park a
246
+ * loop is a PAINT decision and it is `W-AURORA-FIELD`'s (π-FIELD), because the shipped
247
+ * configs do not separate in config space: the recessive shell field
248
+ * (`aurora-hero.ts` `nucleiDrift`/`paletteDrift` 0.012) and the focal studio default
249
+ * (0.015) sit 25% apart on both axes and are identical on the other two. What separates
250
+ * them is not the drift amplitude but the composited range their palettes can express —
251
+ * shell chroma ≤ 0.07 over an L span of 0.03 against the studio's C 0.16/0.13/0.095 —
252
+ * and that term is the field re-founding's to derive, not this gate's to guess.
253
+ */
254
+ export declare const AURORA_DRIFT_FLOOR: {
255
+ readonly nucleiDrift: 0.0005;
256
+ readonly paletteDrift: 0.0004;
257
+ readonly breathDepth: 0.0015;
258
+ readonly warpDrift: 0.00015;
259
+ };
260
+ /**
261
+ * The demand gate over the four drift axes — the ONE predicate the WebGL2 frame loop
262
+ * and BOTH WGSL loops consume.
263
+ *
264
+ * It was three copies of a `!== 0` ladder, and they had already diverged: the image
265
+ * pipeline's copy omitted `breathDepth`, so an image-source aurora carrying breath and
266
+ * no drift parked its loop and never rendered the breath. Liveness is an AMPLITUDE
267
+ * question against each axis's own domain, never a literal comparison against zero.
268
+ */
269
+ export declare function isAuroraDriftLive(config: AuroraConfig): boolean;
213
270
  /**
214
271
  * Pointer-cursor API exposed by `createAurora`. Values in 0..1 (CSS-top-origin).
215
272
  * Runtime flips Y and eases internally.
@@ -1,6 +1,6 @@
1
1
  export { default as Aurora } from "./Aurora.vue.js";
2
2
  export { resolveRenderMode, isSoftwareWebGLRenderer, type AuroraRenderMode, type ResolveRenderModeOptions, } from "./constants/renderMode.js";
3
- export { useAurora } from "./composables/useAurora.js";
3
+ export { useAurora, AURORA_SETTLE_MS } from "./composables/useAurora.js";
4
4
  export type { UseAuroraReturn } from "./composables/useAurora.js";
5
5
  export { useCursorInteraction } from "./composables/useCursorInteraction.js";
6
6
  export { createAurora } from "./composables/runtime.js";
@@ -62,14 +62,14 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
62
62
  resume: () => void;
63
63
  settled: Readonly<import("vue").Ref<boolean, boolean>>;
64
64
  settledFrame: Readonly<import("vue").Ref<import(".").BlobSettledFrame | null, import(".").BlobSettledFrame | null>>;
65
- rendererStatus: Readonly<import("vue").Ref<import("../../composables/glass/webgpu/rendererStatus.js").RendererStatus, import("../../composables/glass/webgpu/rendererStatus.js").RendererStatus>>;
65
+ rendererStatus: Readonly<import("vue").Ref<import("../../index.js").RendererStatus, import("../../index.js").RendererStatus>>;
66
66
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
67
67
  click: () => any;
68
- rendererStatus: (status: import("../../composables/glass/webgpu/rendererStatus.js").RendererStatus) => any;
68
+ rendererStatus: (status: import("../../index.js").RendererStatus) => any;
69
69
  "update:paused": (value: boolean) => any;
70
70
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
71
71
  onClick?: (() => any) | undefined;
72
- onRendererStatus?: ((status: import("../../composables/glass/webgpu/rendererStatus.js").RendererStatus) => any) | undefined;
72
+ onRendererStatus?: ((status: import("../../index.js").RendererStatus) => any) | undefined;
73
73
  "onUpdate:paused"?: ((value: boolean) => any) | undefined;
74
74
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
75
75
  declare const _default: typeof __VLS_export;
@@ -9,8 +9,14 @@ export type CardSize = "sm" | "md";
9
9
  * and no capacity. `shadow` is CARD's own — Surface went three-prop and the
10
10
  * card is the one component with a real elevation grammar, so it stamps its own
11
11
  * `data-shadow` for the edge keying instead of routing the flag through a
12
- * primitive that no longer reads it. `grain` and `specular` are gone from the
13
- * whole library. `cartoon` / `grid` / `metal` / `variant` / `dataHue` /
12
+ * primitive that no longer reads it. `grain` and `specular` are gone as PROPS,
13
+ * not as capacities: `v-specular` ships with `createSpecularWriter` and
14
+ * `useSpecularTracking` (`src/index.ts:475-479`) over the
15
+ * `.glass-specular-track` opt-in (`styles/index.css:205`), and grain lives on
16
+ * as `--glass-grain-opacity` (`styles/tokens/glass-fx.css:10`) and
17
+ * `@utility paper-grain-overlay` (`styles/paper.css:125`). A card that wants
18
+ * either arms it on the element.
19
+ * `cartoon` / `grid` / `metal` / `variant` / `dataHue` /
14
20
  * `dataHueStrength` are struck: three of them wrote a class a consumer can write
15
21
  * (`cartoon-surface`, `paper-grid`), and `variant`+`dataHue`+`selected` were one
16
22
  * state wearing three props. A per-instance rim hue is `--glass-accent`, written
@@ -8,13 +8,7 @@ type __VLS_Slots = {} & {
8
8
  } & {
9
9
  default?: (props: typeof __VLS_16) => any;
10
10
  };
11
- declare const __VLS_base: import("vue").DefineComponent<import("./types.js").StaticChipProps | import("./types.js").SelectableChipProps | import("./types.js").ActionChipProps | import("./types.js").RemovableChipProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
12
- "update:modelValue": (value: boolean) => any;
13
- remove: (event: MouseEvent) => any;
14
- }, string, import("vue").PublicProps, Readonly<import("./types.js").StaticChipProps | import("./types.js").SelectableChipProps | import("./types.js").ActionChipProps | import("./types.js").RemovableChipProps> & Readonly<{
15
- "onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
16
- onRemove?: ((event: MouseEvent) => any) | undefined;
17
- }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
+ declare const __VLS_base: import("vue").DefineSetupFnComponent<Record<string, any>, {}, {}, Record<string, any> & {}, import("vue").PublicProps>;
18
12
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
19
13
  declare const _default: typeof __VLS_export;
20
14
  export default _default;
@@ -1,5 +1,6 @@
1
1
  import { type ClassValue } from "../_shared/class-names.js";
2
2
  declare const SIZE: {
3
+ readonly xs: "gap-0.5 px-1 py-0.5 text-micro";
3
4
  readonly sm: "gap-1 px-2.5 py-1 text-caption";
4
5
  readonly md: "gap-1.5 px-3.5 py-1.5 text-small";
5
6
  readonly lg: "gap-2 px-5 py-2 text-base";
@@ -21,6 +21,7 @@ declare const __VLS_base: import("vue").DefineComponent<CollapsibleProps, {}, {}
21
21
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
22
22
  }>, {
23
23
  disabled: boolean;
24
+ open: boolean;
24
25
  defaultOpen: boolean;
25
26
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
26
27
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -10,11 +10,11 @@ declare const __VLS_base: import("vue").DefineComponent<CommandDialogProps, {},
10
10
  "onUpdate:modelValue"?: ((value: import("./index.js").ComboboxValue) => any) | undefined;
11
11
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
12
12
  }>, {
13
+ modal: boolean;
13
14
  unmountOnHide: boolean;
14
15
  open: boolean;
15
16
  defaultOpen: boolean;
16
17
  surface: import("../_shared/axes.js").Surface;
17
- modal: boolean;
18
18
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
19
19
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
20
20
  declare const _default: typeof __VLS_export;
@@ -53,7 +53,7 @@ export interface ConfiguratorPreset<T> {
53
53
  readonly config: T;
54
54
  }
55
55
  declare const __VLS_export: <T>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
56
- props: import("vue").PublicProps & __VLS_PrettifyLocal<{
56
+ props: import("vue").PublicProps & __VLS_PrettifyLocal<({
57
57
  /** Optional preset table; presented to the `presets` slot fallback. */
58
58
  presets?: readonly ConfiguratorPreset<T>[];
59
59
  /** Currently active preset key — display only; selection is the consumer's. */
@@ -98,10 +98,33 @@ declare const __VLS_export: <T>(__VLS_props: NonNullable<Awaited<typeof __VLS_se
98
98
  * length to pin the band (`min === max`), or a `[min, max]` pair.
99
99
  */
100
100
  asideWidth?: string | readonly [min: string, max: string];
101
+ /**
102
+ * Mount the studio inside an <ExpandableContainer>: a corner trigger that
103
+ * promotes the whole instrument to a full-window ROOM and back. The
104
+ * container already ships focus trap, Esc, body-overflow lock and focus
105
+ * restore, so this prop wires an affordance rather than a mechanism.
106
+ *
107
+ * The subtree is TELEPORTED, never duplicated — one mount, so a live GPU
108
+ * stage in the `#stage` slot survives the promotion instead of being torn
109
+ * down and re-created behind a second canvas.
110
+ *
111
+ * Expanded, the gallery is forced to `top`: the room has the width for the
112
+ * full preset ribbon, and spending it on a 400px gutter is the one thing
113
+ * expansion is for.
114
+ */
115
+ expandable?: boolean;
116
+ /** Accessible name of the expand trigger. */
117
+ expandLabel?: string;
118
+ /** Accessible name of the collapse trigger. */
119
+ collapseLabel?: string;
101
120
  /** Optional outer container override. */
102
121
  class?: HTMLAttributes["class"];
103
122
  } & {
123
+ /** Two-way so a consumer can drive/observe the room from outside the trigger. */
124
+ expanded?: boolean;
125
+ }) & {
104
126
  onReset?: (() => any) | undefined;
127
+ "onUpdate:expanded"?: ((value: boolean) => any) | undefined;
105
128
  "onSelect-preset"?: ((key: string) => any) | undefined;
106
129
  "onSelect-layer"?: ((id: string) => any) | undefined;
107
130
  }> & (typeof globalThis extends {
@@ -147,7 +170,7 @@ declare const __VLS_export: <T>(__VLS_props: NonNullable<Awaited<typeof __VLS_se
147
170
  (e: "select-preset", key: string): void;
148
171
  (e: "select-layer", id: string): void;
149
172
  (e: "reset"): void;
150
- };
173
+ } & ((event: "update:expanded", value: boolean) => void);
151
174
  }>) => import("vue").VNode & {
152
175
  __ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
153
176
  };
@@ -41,7 +41,7 @@ import { type ConfiguratorSize } from "./size.js";
41
41
  * interchangeable — they emphasize DIFFERENT features:
42
42
  * - **ConfiguratorRow** (this) — for TOKEN, PRESET controls. Carries the
43
43
  * token-`name` reference, the opt-in `reset` affordance (`canReset`), and the
44
- * three-rung `size` axis (local-prop-over-inject). No a11y for/id wiring.
44
+ * three-rung `size` axis (local-prop-over-inject).
45
45
  * - **LabeledField** — for form controls. Carries stable label, description,
46
46
  * error, requirement, state, and layout associations without styling the control.
47
47
  *
@@ -74,7 +74,9 @@ type __VLS_Props = {
74
74
  size?: ConfiguratorSize;
75
75
  class?: HTMLAttributes["class"];
76
76
  };
77
- declare var __VLS_12: {};
77
+ declare var __VLS_12: {
78
+ labelledBy: string;
79
+ };
78
80
  type __VLS_Slots = {} & {
79
81
  default?: (props: typeof __VLS_12) => any;
80
82
  };
@@ -1 +1 @@
1
- :root{--configurator-pad-inline: 1.25rem;}.configurator{-webkit-backdrop-filter: none;backdrop-filter: none;}.configurator > .configurator-presets,.configurator > .configurator-aside{-webkit-backdrop-filter: var(--glass-blur-floating);backdrop-filter: var(--glass-blur-floating);}.configurator-section-label{font-family: var(--font-text);font-size: var(--configurator-section-size);line-height: var(--type-leading-body);font-weight: var(--configurator-section-weight);letter-spacing: var(--type-tracking-tight);color: var(--foreground);}.configurator-presets{padding-block: var(--configurator-preset-row-weight);}.configurator-presets .configurator-gallery-track,.configurator-presets [role="group"]{gap: var(--configurator-preset-row-gap);}.configurator-layer{border-color: var(--configurator-divider-section);background-color: var(--configurator-section-tint);border-radius: max( var(--radius-floor),calc(var(--radius-ctx) - var(--radius-inset)) );}.configurator-layer:has(+ .configurator-layer){border-end-start-radius: 0;border-end-end-radius: 0;border-bottom-width: 0;}.configurator-layer + .configurator-layer{margin-block-start: 0;border-start-start-radius: 0;border-start-end-radius: 0;}.configurator-layer-trigger{padding-inline: var(--configurator-pad-inline);}.configurator-layer-body{padding-inline: var(--configurator-pad-inline);}.configurator-layer-body[data-dividers] > * + *{border-color: var(--configurator-divider);}.configurator-aside,.configurator-presets,.configurator-footer{border-color: var(--configurator-divider);}[data-slot="configurator"] > [data-gallery-dock]{grid-row: 1;grid-column: 1;}[data-slot="configurator"] > .configurator-stage{grid-row: 2;grid-column: 1;}[data-slot="configurator"] > .configurator-aside{grid-row: 3;grid-column: 1;}@media (min-width: 1024px){[data-slot="configurator"]{grid-template-columns: minmax(0,1fr) minmax( var(--configurator-aside-min,300px),var(--configurator-aside-max,400px) );grid-template-rows: auto minmax(0,1fr);}[data-slot="configurator"][data-gallery="aside"] > [data-gallery-dock]{grid-row: 1;grid-column: 2;}[data-slot="configurator"][data-gallery="aside"] > .configurator-stage{grid-row: 1 / span 2;grid-column: 1;}[data-slot="configurator"][data-gallery="aside"] > .configurator-aside{grid-row: 2;grid-column: 2;}[data-slot="configurator"][data-gallery="top"] > [data-gallery-dock]{grid-row: 1;grid-column: 1 / span 2;}[data-slot="configurator"][data-gallery="top"] > .configurator-stage{grid-row: 2;grid-column: 1;}[data-slot="configurator"][data-gallery="top"] > .configurator-aside{grid-row: 2;grid-column: 2;}}[data-slot="configurator"] > [data-gallery-dock]{border-color: var(--configurator-divider);}[data-slot="configurator"][data-gallery="aside"] > [data-gallery-dock]{border-bottom-width: 1px;}@media (min-width: 1024px){[data-slot="configurator"][data-gallery="top"] > [data-gallery-dock]{border-bottom-width: 1px;}}.configurator-preset-tile{inline-size: clamp(160px,22vw,232px);border-radius: var(--radius-card);}[data-slot="configurator"][data-gallery="top"] .configurator-preset-tile{inline-size: clamp(200px,20vw,288px);}.configurator-preset-well{background-size: cover;background-position: center;image-rendering: auto;}.configurator-preset-well.is-loading{background-image: linear-gradient( 100deg,color-mix(in oklab,var(--card) 84%,transparent) 30%,color-mix(in oklab,var(--foreground) 8%,var(--card)) 50%,color-mix(in oklab,var(--card) 84%,transparent) 70% );background-size: 200% 100%;animation: configurator-preset-shimmer 1.2s ease-in-out infinite;}@media (prefers-reduced-motion: reduce){.configurator-preset-well.is-loading{animation: none;}}@keyframes configurator-preset-shimmer{from{background-position: 200% 0;}to{background-position: -200% 0;}}.configurator-preset-tile.is-active{box-shadow: inset 0 0 0 2px var(--focus-ring-color),var(--shadow-cartoon-lg);}.configurator-preset-chip{border-radius: var(--radius-pill);}.configurator-preset-chip.is-active{--glass-capsule-fill: var(--glass-plate-quiet);}@media (min-width: 1024px){[data-slot="configurator"][data-aside-side="left"] > .configurator-stage{grid-column: 2;}[data-slot="configurator"][data-aside-side="left"] > .configurator-aside{grid-column: 1;}[data-slot="configurator"][data-aside-side="left"][data-gallery="aside"] > [data-gallery-dock]{grid-column: 1;}}
1
+ :root{--configurator-pad-inline: 1.25rem;}@layer components{.configurator-shell{-webkit-backdrop-filter: none;backdrop-filter: none;container-type: inline-size;display: grid;grid-template-rows: minmax(0,1fr);min-block-size: 0;min-inline-size: min(20rem,100%);}.configurator > .configurator-presets,.configurator > .configurator-aside{-webkit-backdrop-filter: var(--glass-blur-floating);backdrop-filter: var(--glass-blur-floating);}.configurator-section-label{font-family: var(--font-text);font-size: var(--configurator-section-size);line-height: var(--type-leading-body);font-weight: var(--configurator-section-weight);letter-spacing: var(--type-tracking-tight);color: var(--foreground);}.configurator-presets{padding-block: var(--configurator-preset-row-weight);}.configurator-presets .configurator-gallery-track,.configurator-presets [role="group"]{gap: var(--configurator-preset-row-gap);}.configurator-layer{border-width: 1px;border-color: var(--configurator-divider-section);background-color: var(--configurator-section-tint);border-radius: max( var(--radius-floor),calc(var(--radius-ctx) - var(--radius-inset)) );}.configurator-layer:has(+ .configurator-layer){border-end-start-radius: 0;border-end-end-radius: 0;border-bottom-width: 0;}.configurator-layer + .configurator-layer{margin-block-start: 0;border-start-start-radius: 0;border-start-end-radius: 0;}.configurator-layer-trigger{padding-inline: var(--configurator-pad-inline);}.configurator-layer-body{padding-inline: var(--configurator-pad-inline);}@media (hover: hover){[data-slot="configurator-reset"]:hover{background: color-mix( in oklab,var(--foreground) calc(var(--fill-hover) * 100%),transparent );color: var(--foreground);}.configurator-layer-trigger:hover{background: color-mix( in oklab,var(--foreground) calc(var(--fill-hover) * 100%),transparent );}}.configurator-layer-body[data-dividers] > * + *{border-color: var(--configurator-divider);}.configurator-aside,.configurator-presets,.configurator-footer{border-color: var(--configurator-divider);}.configurator-aside{border-block-start-width: 1px;}[data-slot="configurator"]{grid-template-columns: minmax(0,1fr);grid-template-rows: auto minmax(var(--configurator-stage-min,18rem),auto) minmax(0,1fr);}[data-slot="configurator"] > [data-gallery-dock]{grid-row: 1;grid-column: 1;}[data-slot="configurator"] > .configurator-stage{grid-row: 2;grid-column: 1;}[data-slot="configurator"] > .configurator-aside{grid-row: 3;grid-column: 1;}@container (inline-size >= 64rem){[data-slot="configurator"]{grid-template-columns: minmax(0,1fr) minmax( var(--configurator-aside-min,300px),var(--configurator-aside-max,400px) );grid-template-rows: auto minmax(0,1fr);}[data-slot="configurator"][data-gallery="aside"] > [data-gallery-dock]{grid-row: 1;grid-column: 2;}[data-slot="configurator"][data-gallery="aside"] > .configurator-stage{grid-row: 1 / span 2;grid-column: 1;}[data-slot="configurator"][data-gallery="aside"] > .configurator-aside{grid-row: 2;grid-column: 2;}[data-slot="configurator"][data-gallery="top"] > [data-gallery-dock]{grid-row: 1;grid-column: 1 / span 2;}[data-slot="configurator"][data-gallery="top"] > .configurator-stage{grid-row: 2;grid-column: 1;}[data-slot="configurator"][data-gallery="top"] > .configurator-aside{grid-row: 2;grid-column: 2;}[data-slot="configurator"] > .configurator-aside{border-block-start-width: 0;border-inline-start-width: 1px;}[data-slot="configurator"][data-aside-side="left"] > .configurator-aside{border-inline-start-width: 0;border-inline-end-width: 1px;}}[data-slot="configurator"] > [data-gallery-dock]{border-color: var(--configurator-divider);}[data-slot="configurator"][data-gallery="aside"] > [data-gallery-dock]{border-bottom-width: 1px;}@container (inline-size >= 64rem){[data-slot="configurator"][data-gallery="top"] > [data-gallery-dock]{border-bottom-width: 1px;}}.configurator-preset-tile{inline-size: clamp(160px,22cqi,232px);border-radius: var(--radius-card);}[data-slot="configurator"][data-gallery="top"] .configurator-preset-tile{inline-size: clamp(200px,20cqi,288px);}.configurator-preset-well{background-size: cover;background-position: center;image-rendering: auto;}.configurator-preset-well.is-loading{background-image: linear-gradient( 100deg,color-mix(in oklab,var(--card) 84%,transparent) 30%,color-mix(in oklab,var(--foreground) 8%,var(--card)) 50%,color-mix(in oklab,var(--card) 84%,transparent) 70% );background-size: 200% 100%;animation: configurator-preset-shimmer 1.2s ease-in-out infinite;}@media (prefers-reduced-motion: reduce){.configurator-preset-well.is-loading{animation: none;}}}@keyframes configurator-preset-shimmer{from{background-position: 200% 0;}to{background-position: -200% 0;}}@layer components{.configurator-preset-tile.is-active{box-shadow: inset 0 0 0 2px var(--focus-ring-color),var(--shadow-cartoon-lg);}.configurator-preset-chip{border-radius: var(--radius-pill);}.configurator-preset-chip.is-active{--glass-capsule-fill: var(--glass-plate-quiet);}@container (inline-size >= 64rem){[data-slot="configurator"][data-aside-side="left"] > .configurator-stage{grid-column: 2;}[data-slot="configurator"][data-aside-side="left"] > .configurator-aside{grid-column: 1;}[data-slot="configurator"][data-aside-side="left"][data-gallery="aside"] > [data-gallery-dock]{grid-column: 1;}}.configurator-expand-host[data-state="expanded"] > [data-part="panel"]{padding: var(--space-section);}.configurator-expand-host[data-state="expanded"] .configurator-shell{block-size: 100%;}}
@@ -1 +1 @@
1
- @layer components{.dark-mode-toggle-button{--dark-mode-toggle-size: 2.25rem;--dark-mode-toggle-padding: 0.375rem;appearance: none;display: inline-grid;place-items: center;flex: none;width: var(--dark-mode-toggle-size);height: var(--dark-mode-toggle-size);padding: var(--dark-mode-toggle-padding);border: 0;border-radius: var(--radius-pill);color: var(--foreground);background: transparent;opacity: 0.8;cursor: pointer;transition: opacity var(--duration-fast) var(--ease-standard),background-color var(--duration-fast) var(--ease-standard),box-shadow var(--duration-fast) var(--ease-standard);}.dark-mode-toggle-button:hover{background: var(--surface-tint-10);opacity: 1;}.dark-mode-toggle-button:focus-visible{outline: none;box-shadow: var(--focus-ring-shadow,var(--dock-ring));opacity: 1;}.dark-mode-toggle-button > svg{display: block;width: 100%;height: 100%;fill: currentColor;}.dark-mode-toggle-button[data-size="sm"]{--dark-mode-toggle-size: 1.75rem;--dark-mode-toggle-padding: 0.25rem;}.dark-mode-toggle-button[data-size="lg"]{--dark-mode-toggle-size: 2.75rem;--dark-mode-toggle-padding: 0.5rem;}.dark-mode-toggle-button[data-size="control"]{--dark-mode-toggle-size: var(--control-size,2.25rem);--dark-mode-toggle-padding: var(--control-icon-padding,0.375rem);}.dark-mode-toggle-button[data-size="dock"],.glass-dock .dark-mode-toggle-button:not([data-size="sm"]):not([data-size="lg"]):not( [data-size="control"] ){--dark-mode-toggle-size: var(--dock-control-size,var(--size-icon-btn));--dark-mode-toggle-padding: calc( ( var(--dock-control-size,var(--size-icon-btn)) - var(--dock-control-glyph-size,var(--dock-icon-glyph,1.25rem)) ) / 2 );}.toggle-sun,.toggle-circle{transform-origin: center;transition-property: transform;transition-duration: var(--spring-dock-duration);transition-timing-function: var(--spring-dock);}:where(.dark) .dark-mode-toggle-button .toggle-sun{transform: rotate(0.5turn);}:where(.dark) .dark-mode-toggle-button .toggle-circle{transform: translateX(-15%);}}@media (prefers-reduced-motion: reduce){.dark-mode-toggle-button,.dark-mode-toggle-button .toggle-sun,.dark-mode-toggle-button .toggle-circle{transition: none;}}
1
+ @layer components{.dark-mode-toggle-button{--dark-mode-toggle-size: 2.25rem;--dark-mode-toggle-padding: 0.375rem;appearance: none;display: inline-grid;place-items: center;flex: none;width: var(--dark-mode-toggle-size);height: var(--dark-mode-toggle-size);padding: var(--dark-mode-toggle-padding);border: 0;border-radius: var(--radius-pill);color: var(--foreground);background: transparent;opacity: 0.8;cursor: pointer;transition: opacity var(--duration-fast) var(--ease-standard),background-color var(--duration-fast) var(--ease-standard),box-shadow var(--duration-fast) var(--ease-standard);}.dark-mode-toggle-button:hover{background: var(--surface-tint-10);opacity: 1;}.dark-mode-toggle-button:focus-visible{outline: none;box-shadow: var(--focus-ring-shadow,var(--dock-ring));opacity: 1;}.dark-mode-toggle-button > svg{display: block;width: 100%;height: 100%;fill: currentColor;}.dark-mode-toggle-button[data-size="sm"]{--dark-mode-toggle-size: 1.75rem;--dark-mode-toggle-padding: 0.25rem;}.dark-mode-toggle-button[data-size="lg"]{--dark-mode-toggle-size: 2.75rem;--dark-mode-toggle-padding: 0.5rem;}.dark-mode-toggle-button[data-size="control"]{--dark-mode-toggle-size: var(--control-size,2.25rem);--dark-mode-toggle-padding: var(--control-icon-padding,0.375rem);}.dark-mode-toggle-button[data-size="dock"],.glass-dock .dark-mode-toggle-button:not([data-size="sm"]):not([data-size="lg"]):not( [data-size="control"] ){--dark-mode-toggle-size: var(--dock-control-size,var(--size-icon-btn));--dark-mode-toggle-padding: calc( ( var(--dock-control-size,var(--size-icon-btn)) - var(--dock-control-glyph-size,var(--dock-icon-glyph,1.25rem)) ) / 2 );}.toggle-sun,.toggle-circle{transform-origin: center;transition-property: transform;transition-duration: var(--spring-dock-duration);transition-timing-function: var(--spring-dock);}:where(.dark) .dark-mode-toggle-button .toggle-sun{transform: rotate(0.5turn);}:where(.dark) .dark-mode-toggle-button .toggle-circle{transform: translateX(-15%);}}@layer components{@media (prefers-reduced-motion: reduce){.dark-mode-toggle-button,.dark-mode-toggle-button .toggle-sun,.dark-mode-toggle-button .toggle-circle{transition: none;}}}
@@ -1 +1 @@
1
- @layer components{[data-deck-capture="export"] .deck-stage{--deck-export-inline: 1280px;--deck-export-block: 720px;position: relative;inset: auto;margin: 0;aspect-ratio: auto;inline-size: var(--deck-export-inline);block-size: var(--deck-export-block);max-inline-size: none;max-block-size: none;border-radius: 0;}[data-deck-capture="export"] .deck-slide{border-radius: 0;box-shadow: none;}[data-deck-capture="export"] .deck-ground,[data-deck-capture="freeze"] .deck-ground,[data-deck-capture="export"] .deck-slide,[data-deck-capture="freeze"] .deck-slide{transition: none !important;animation: none !important;}[data-deck-capture="export"] .deck-slide[data-state="active"],[data-deck-capture="freeze"] .deck-slide[data-state="active"]{--turn-x: 0px !important;--turn-s: 1 !important;--turn-r: 0deg !important;}[data-deck-capture="export"] .deck-slide::before,[data-deck-capture="export"] .deck-slide::after,[data-deck-capture="freeze"] .deck-slide::before,[data-deck-capture="freeze"] .deck-slide::after{opacity: 0 !important;animation: none !important;}[data-deck-capture="export"] [data-reveal],[data-deck-capture="freeze"] [data-reveal],[data-deck-capture="print"] [data-reveal]{opacity: 1 !important;animation: none !important;}[data-deck-capture="print"] .deck-stage{position: static;display: block;aspect-ratio: auto;inline-size: auto;block-size: auto;overflow: visible;}[data-deck-capture="print"] .deck-strip{display: block;overflow: visible;perspective: none;}[data-deck-capture="print"] .deck-ground{display: none;}[data-deck-capture="print"] .deck-slide{position: relative;opacity: 1 !important;visibility: visible !important;transform: none !important;pointer-events: auto;margin-block: var(--space-family);background: var(--background);}[data-deck-capture="print"] .deck-slide::before,[data-deck-capture="print"] .deck-slide::after{opacity: 0 !important;}}@media print{@page{size: 1280px 720px;margin: 0;}html,body{overflow: visible !important;margin: 0 !important;padding: 0 !important;print-color-adjust: exact;-webkit-print-color-adjust: exact;}html,body,#app{block-size: auto !important;min-block-size: 0 !important;}.deck-stage{position: static !important;display: block !important;aspect-ratio: auto !important;inline-size: auto !important;block-size: auto !important;overflow: visible !important;}.deck-strip{display: block !important;overflow: visible !important;perspective: none !important;}.deck-ground{display: none !important;}.deck-slide{position: relative !important;opacity: 1 !important;visibility: visible !important;transform: none !important;box-shadow: none !important;border-radius: 0 !important;margin: 0 !important;block-size: 719px !important;overflow: hidden !important;background: var(--background) !important;}.deck-slide::before,.deck-slide::after{opacity: 0 !important;}.deck-slide:not(:last-child){break-after: page;}.deck-stage .sr-only{display: none !important;}}
1
+ @layer components{[data-deck-capture="export"] .deck-stage{--deck-export-inline: 1280px;--deck-export-block: 720px;position: relative;inset: auto;margin: 0;aspect-ratio: auto;inline-size: var(--deck-export-inline);block-size: var(--deck-export-block);max-inline-size: none;max-block-size: none;border-radius: 0;}[data-deck-capture="export"] .deck-slide{border-radius: 0;box-shadow: none;}[data-deck-capture="export"] .deck-ground,[data-deck-capture="freeze"] .deck-ground,[data-deck-capture="export"] .deck-slide,[data-deck-capture="freeze"] .deck-slide{transition: none !important;animation: none !important;}[data-deck-capture="export"] .deck-slide[data-state="active"],[data-deck-capture="freeze"] .deck-slide[data-state="active"]{--turn-x: 0px !important;--turn-s: 1 !important;--turn-r: 0deg !important;}[data-deck-capture="export"] .deck-slide::before,[data-deck-capture="export"] .deck-slide::after,[data-deck-capture="freeze"] .deck-slide::before,[data-deck-capture="freeze"] .deck-slide::after{opacity: 0 !important;animation: none !important;}[data-deck-capture="export"] [data-reveal],[data-deck-capture="freeze"] [data-reveal],[data-deck-capture="print"] [data-reveal]{opacity: 1 !important;animation: none !important;}[data-deck-capture="print"] .deck-stage{position: static;display: block;aspect-ratio: auto;inline-size: auto;block-size: auto;overflow: visible;}[data-deck-capture="print"] .deck-strip{display: block;overflow: visible;perspective: none;}[data-deck-capture="print"] .deck-ground{display: none;}[data-deck-capture="print"] .deck-slide{position: relative;opacity: 1 !important;visibility: visible !important;transform: none !important;pointer-events: auto;margin-block: var(--space-family);background: var(--background);}[data-deck-capture="print"] .deck-slide::before,[data-deck-capture="print"] .deck-slide::after{opacity: 0 !important;}}@layer components{@media print{@page{size: 1280px 720px;margin: 0;}html,body{overflow: visible !important;margin: 0 !important;padding: 0 !important;print-color-adjust: exact;-webkit-print-color-adjust: exact;}html,body,#app{block-size: auto !important;min-block-size: 0 !important;}.deck-stage{position: static !important;display: block !important;aspect-ratio: auto !important;inline-size: auto !important;block-size: auto !important;overflow: visible !important;}.deck-strip{display: block !important;overflow: visible !important;perspective: none !important;}.deck-ground{display: none !important;}.deck-slide{position: relative !important;opacity: 1 !important;visibility: visible !important;transform: none !important;box-shadow: none !important;border-radius: 0 !important;margin: 0 !important;block-size: 719px !important;overflow: hidden !important;background: var(--background) !important;}.deck-slide::before,.deck-slide::after{opacity: 0 !important;}.deck-slide:not(:last-child){break-after: page;}.deck-stage .sr-only{display: none !important;}}}
@@ -1 +1 @@
1
- :where([data-slot="dialog-content"]){border-radius: var(--radius-3xl);display: grid;gap: var(--space-body);inline-size: min(100% - 2 * var(--space-section),32rem);padding-inline: var(--space-family);padding-block: var(--space-family);translate: -50% -50%;}:where([data-slot="dialog-header"]){display: flex;flex-direction: column;gap: var(--space-atom);text-align: start;}:where([data-slot="dialog-content"]:has([data-slot="dialog-close"])) :where([data-slot="dialog-header"]){padding-inline-end: calc(var(--touch-target) + var(--space-atom));}:where([data-slot="dialog-title"]){font-size: calc(var(--type-body) * 1.272);line-height: var(--type-leading-body);letter-spacing: var(--type-tracking-tight);}:where([data-slot="dialog-description"]){font-size: var(--type-body);line-height: var(--type-leading-body);color: var(--foreground);}:where([data-slot="dialog-footer"]){display: flex;flex-direction: row;justify-content: flex-end;gap: var(--space-body);}:where([data-slot="dialog-close"]){position: absolute;inset-block-start: var(--space-family);inset-inline-end: var(--space-family);display: inline-flex;align-items: center;justify-content: center;inline-size: var(--touch-target);block-size: var(--touch-target);border-radius: var(--radius-pill);color: var(--foreground);cursor: pointer;isolation: isolate;}:where([data-slot="dialog-close"])::before{content: "";position: absolute;inset: 0;z-index: -1;border-radius: inherit;background: transparent;transition: background-color var(--spring-press-duration) var(--spring-press),scale var(--spring-press-duration) var(--spring-press);}@media (hover: hover){:where([data-slot="dialog-close"]):hover::before{background: color-mix(in oklab,var(--foreground) 5%,transparent);scale: var(--scale-hover);}}:where([data-slot="dialog-close"]):active::before{background: color-mix(in oklab,var(--foreground) 12%,transparent);scale: var(--scale-press);}:where([data-slot="dialog-close"]):focus-visible{outline: 2px solid color-mix(in oklab,var(--foreground) 48%,transparent);outline-offset: 2px;}@property --rebuff-x{syntax: "<length>";inherits: false;initial-value: 0px;}@keyframes glass-dialog-rebuff-a{0%{--rebuff-x: 0px;}22%{--rebuff-x: -4px;}48%{--rebuff-x: 3px;}72%{--rebuff-x: -1.6px;}88%{--rebuff-x: 0.6px;}100%{--rebuff-x: 0px;}}@keyframes glass-dialog-rebuff-b{0%{--rebuff-x: 0px;}22%{--rebuff-x: -4px;}48%{--rebuff-x: 3px;}72%{--rebuff-x: -1.6px;}88%{--rebuff-x: 0.6px;}100%{--rebuff-x: 0px;}}:where([data-slot="dialog-content"][data-rebuff]){translate: calc(-50% + var(--rebuff-x)) -50%;}:where([data-slot="dialog-content"][data-rebuff="a"]){animation: glass-dialog-rebuff-a var(--spring-press-duration) var(--spring-press);}:where([data-slot="dialog-content"][data-rebuff="b"]){animation: glass-dialog-rebuff-b var(--spring-press-duration) var(--spring-press);}@keyframes glass-dialog-rebuff-flash{0%,100%{outline-color: transparent;}50%{outline-color: color-mix(in oklab,var(--foreground) 48%,transparent);}}@media (prefers-reduced-motion: reduce){:where([data-slot="dialog-content"][data-rebuff]){outline: 2px solid transparent;outline-offset: 0;animation: glass-dialog-rebuff-flash var(--spring-press-duration) linear;}}
1
+ @layer components{:where([data-slot="dialog-content"]){border-radius: var(--radius-3xl);display: grid;gap: var(--space-body);inline-size: min(100% - 2 * var(--space-section),32rem);padding-inline: var(--space-family);padding-block: var(--space-family);translate: -50% -50%;}:where([data-slot="dialog-header"]){display: flex;flex-direction: column;gap: var(--space-atom);text-align: start;}:where([data-slot="dialog-content"]:has([data-slot="dialog-close"])) :where([data-slot="dialog-header"]){padding-inline-end: calc(var(--touch-target) + var(--space-atom));}:where([data-slot="dialog-title"]){font-size: calc(var(--type-body) * 1.272);line-height: var(--type-leading-body);letter-spacing: var(--type-tracking-tight);}:where([data-slot="dialog-description"]){font-size: var(--type-body);line-height: var(--type-leading-body);color: var(--foreground);}:where([data-slot="dialog-footer"]){display: flex;flex-direction: row;justify-content: flex-end;gap: var(--space-body);}:where([data-slot="dialog-close"]){position: absolute;inset-block-start: var(--space-family);inset-inline-end: var(--space-family);display: inline-flex;align-items: center;justify-content: center;inline-size: var(--touch-target);block-size: var(--touch-target);border-radius: var(--radius-pill);color: var(--foreground);cursor: pointer;isolation: isolate;}:where([data-slot="dialog-close"])::before{content: "";position: absolute;inset: 0;z-index: -1;border-radius: inherit;background: transparent;transition: background-color var(--spring-press-duration) var(--spring-press),scale var(--spring-press-duration) var(--spring-press);}@media (hover: hover){:where([data-slot="dialog-close"]):hover::before{background: color-mix(in oklab,var(--foreground) 5%,transparent);scale: var(--scale-hover);}}:where([data-slot="dialog-close"]):active::before{background: color-mix(in oklab,var(--foreground) 12%,transparent);scale: var(--scale-press);}:where([data-slot="dialog-close"]):focus-visible{outline: 2px solid color-mix(in oklab,var(--foreground) 48%,transparent);outline-offset: 2px;}}@property --rebuff-x{syntax: "<length>";inherits: false;initial-value: 0px;}@keyframes glass-dialog-rebuff-a{0%{--rebuff-x: 0px;}22%{--rebuff-x: -4px;}48%{--rebuff-x: 3px;}72%{--rebuff-x: -1.6px;}88%{--rebuff-x: 0.6px;}100%{--rebuff-x: 0px;}}@keyframes glass-dialog-rebuff-b{0%{--rebuff-x: 0px;}22%{--rebuff-x: -4px;}48%{--rebuff-x: 3px;}72%{--rebuff-x: -1.6px;}88%{--rebuff-x: 0.6px;}100%{--rebuff-x: 0px;}}@layer components{:where([data-slot="dialog-content"][data-rebuff]){translate: calc(-50% + var(--rebuff-x)) -50%;}:where([data-slot="dialog-content"][data-rebuff="a"]){animation: glass-dialog-rebuff-a var(--spring-press-duration) var(--spring-press);}:where([data-slot="dialog-content"][data-rebuff="b"]){animation: glass-dialog-rebuff-b var(--spring-press-duration) var(--spring-press);}}@keyframes glass-dialog-rebuff-flash{0%,100%{outline-color: transparent;}50%{outline-color: color-mix(in oklab,var(--foreground) 48%,transparent);}}@layer components{@media (prefers-reduced-motion: reduce){:where([data-slot="dialog-content"][data-rebuff]){outline: 2px solid transparent;outline-offset: 0;animation: glass-dialog-rebuff-flash var(--spring-press-duration) linear;}}}
@@ -6,12 +6,11 @@
6
6
  * class was axis-blind — a fixed VERTICAL 1px hairline that paints a useless
7
7
  * 1px-wide sliver in a column (vertical) dock and a single cell-sliver in a grid
8
8
  * dock. This primitive bundles the orientation contract the bare class could not:
9
- * it reads the dock `orientation`/`layout` via `useOptionalDockContext()` and the
10
- * dock-root ancestor class (`.glass-dock.vertical`, `.layout-grid`) drives the
9
+ * it reads the dock `orientation` via `useOptionalDockContext()` and the
10
+ * dock-root ancestor class (`.glass-dock.vertical`) drives the
11
11
  * PERPENDICULAR paint (dock.css) —
12
12
  * - row dock (horizontal, default) → a vertical 1px rule
13
13
  * - column dock (vertical) → a horizontal 1px rule
14
- * - grid dock (`layout="grid"`) → a full-row section break (grid-column: 1, -1)
15
14
  *
16
15
  * It is a thin oriented `<div>` (KISS); `data-orientation` is the explicit axis
17
16
  * marker (so the perpendicular paint resolves even when used inside a
@@ -22,6 +22,7 @@ declare const __VLS_base: import("vue").DefineComponent<DockProps, {
22
22
  keepOpen: (kind?: import("./composables/dockContext.js").DockHoldKind) => void;
23
23
  release: (kind?: import("./composables/dockContext.js").DockHoldKind) => void;
24
24
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DockProps> & Readonly<{}>, {
25
+ collapse: import(".").DockCollapse;
25
26
  backdropMode: import(".").DockBackdropMode;
26
27
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
27
28
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1,6 +1,5 @@
1
1
  import type { ComputedRef } from "vue";
2
2
  export type DockOrientation = "horizontal" | "vertical";
3
- export type DockLayout = "linear" | "grid";
4
3
  /**
5
4
  * What KIND of hold a token is. The two are different facts about the dock and
6
5
  * only one of them is a hand:
@@ -20,7 +19,7 @@ export type DockHoldKind = "morph" | "grasp";
20
19
  * Dock context surfaces the dock id + orientation + held-state coordination
21
20
  * to descendants.
22
21
  *
23
- * One typed key carries id, orientation, layout, and held-state coordination.
22
+ * One typed key carries id, orientation, and held-state coordination.
24
23
  * Paired helpers:
25
24
  * - `useDockContext()` — strict; throws when used outside `<GlassDock>`.
26
25
  * - `useOptionalDockContext()` — befitting silent default for primitives
@@ -32,12 +31,6 @@ export type DockHoldKind = "morph" | "grasp";
32
31
  export interface DockContext {
33
32
  id: string;
34
33
  orientation: ComputedRef<DockOrientation>;
35
- /**
36
- * In-cap arrangement (`linear` row/column vs `grid` tile panel).
37
- * `<DockSeparator>` reads this to paint a full-row section break in a grid dock
38
- * (a 1px perpendicular hairline is useless in a 2D tile grid).
39
- */
40
- layout: ComputedRef<DockLayout>;
41
34
  /**
42
35
  * Acquire a hold token; suppresses timer-based collapse. `kind` defaults to
43
36
  * `"morph"` (posture only). Pass `"grasp"` for a live pointer hold — it takes
@@ -52,5 +52,3 @@ export declare const DOCK_CROSSFADE_KEY: import("vue").InjectionKey<DockCrossfad
52
52
  export declare function provideDockCrossfadeContext(context: DockCrossfadeContext): void;
53
53
  /** Strict — throws when used outside `<DockCrossfade>`. */
54
54
  export declare const useDockCrossfadeContext: () => DockCrossfadeContext;
55
- /** Befitting silent default; reserved for future consumers. */
56
- export declare const useOptionalDockCrossfadeContext: () => DockCrossfadeContext | null;
@@ -6,5 +6,5 @@ export { useDockHold } from "./useDockHold.js";
6
6
  export type { UseDockHoldOptions, UseDockHoldReturn } from "./useDockHold.js";
7
7
  export { isTeleportedTarget } from "../../_shared/overlay/isTeleportedTarget.js";
8
8
  export { provideDockContext, useDockContext, useOptionalDockContext, DOCK_CONTEXT_KEY, type DockContext, type DockOrientation, } from "./dockContext.js";
9
- export { provideDockCrossfadeContext, useDockCrossfadeContext, useOptionalDockCrossfadeContext, DOCK_CROSSFADE_KEY, type DockFaceDescriptor, type DockFaceRegistration, type DockCrossfadeContext, } from "./dockCrossfadeContext.js";
9
+ export { provideDockCrossfadeContext, useDockCrossfadeContext, DOCK_CROSSFADE_KEY, type DockFaceDescriptor, type DockFaceRegistration, type DockCrossfadeContext, } from "./dockCrossfadeContext.js";
10
10
  export { useDockMorphOrchestrator, type UseDockMorphOrchestratorOptions, type UseDockMorphOrchestratorReturn, } from "./useDockMorph.js";
@@ -16,18 +16,22 @@ import type { Ref } from "vue";
16
16
  * STANDALONE control engages on its own drag and a control inside a dock does NOT
17
17
  * co-engage off a sibling's hold.
18
18
  *
19
- * Why NATIVE host listeners (not a Vue `@pointerdown` template binding):
20
- * reka-ui's `<SliderRoot>` is a FORWARDING component — it renders through a
21
- * `CollectionSlot` + `resolveDynamicComponent` (SliderHorizontal/Vertical) +
22
- * `forwardRef` chain and binds its OWN cached `onPointerdown`
23
- * (`SliderRoot.js → SliderImpl.js`, which calls `setPointerCapture`). A consumer
24
- * `@pointerdown` arrives as `$attrs.onPointerdown` and is DROPPED across that
25
- * Slot/forwardRef boundary — vue-tsc + units pass, only a real drag catches it
26
- * (the canonical binding-verification class, `feedback_glass_ui_binding_*`). A
27
- * native `addEventListener` on the RESOLVED host element is immune: the event
28
- * always reaches the DOM node the user actually presses. This host-native behavior is
29
- * preferable to a Reka `dragging`-ref subscription, which Reka does not publicly expose
30
- * and which would re-introduce the same forwarding fragility).
19
+ * Why NATIVE host listeners (not a Vue `@pointerdown` template binding) — and NOT
20
+ * because the binding would be lost. reka-ui's `<SliderRoot>` is a forwarding
21
+ * component and does set `inheritAttrs: false` (`SliderRoot.js:17`), but it re-merges
22
+ * `$attrs` by hand on the way out — `mergeProps(_ctx.$attrs, { … onPointerdown })`
23
+ * (`:149`) — and `mergeProps` CHAINS `onX` handlers rather than overwriting them, so a
24
+ * consumer `@pointerdown` arrives and runs. Measured at our pin and at the consumer's:
25
+ * the merged order is reka's slide start, reka's update, then the consumer — LAST,
26
+ * which is the one real limit (it cannot `preventDefault` ahead of the slide).
27
+ * `tests/components/ui/slider/attrs-pointerdown-channel.test.ts` holds the arrival as a
28
+ * standing arm; the order was measured at the seat and is not asserted there.
29
+ *
30
+ * The native listeners are taken for three reasons that do hold: `pointerdown` AND
31
+ * `touchstart` fold onto ONE acquire under one owner; the release is window-scoped and
32
+ * so survives reka's `setPointerCapture` retarget; and the acquire is
33
+ * capture-independent, which is what makes it instant-on. A Reka `dragging`-ref
34
+ * subscription serves none of the three and is not publicly exposed.
31
35
  *
32
36
  * The hold is INSTANT-ON (Apple "Building Fluid Interfaces", facet 5): the first
33
37
  * line `keepOpen()` is capture-independent and synchronous, so the halo +
@@ -0,0 +1,20 @@
1
+ import { type ComputedRef, type Ref } from "vue";
2
+ export interface UseDockRunOptions {
3
+ /** The scroll port — `.dock-run`, the element the seats are children of. */
4
+ runEl: Ref<HTMLElement | null>;
5
+ /** The `role="status"` node reach announces through. */
6
+ statusEl: Ref<HTMLElement | null>;
7
+ /** Resolved layout axis; selects the scroll axis and the arrow-key pair. */
8
+ orientation: ComputedRef<"horizontal" | "vertical">;
9
+ }
10
+ export interface UseDockRunReturn {
11
+ /**
12
+ * Bring `seat` fully into view at its lattice anchor, on the DOCK spring. Exposed
13
+ * so a consumer driving selection programmatically reaches the same anchor the
14
+ * pointer and keyboard paths do — one reach, three callers.
15
+ */
16
+ reach: (seat: HTMLElement) => void;
17
+ /** Re-derive the tab stop. Called on mount, on focus moves, and on content change. */
18
+ syncRoving: () => void;
19
+ }
20
+ export declare function useDockRun(options: UseDockRunOptions): UseDockRunReturn;
@@ -1,6 +1,6 @@
1
1
  import { type MaybeRefOrGetter, type Ref } from "vue";
2
2
  import type { UseDockStateReturn } from "./useDockState.js";
3
- import { type FuzzySearchState, type SearchableItem, type SearchResult } from "../../search/composables/index.js";
3
+ import { type FuzzySearchState, type SearchableItem, type SearchResult } from "../../../composables/search/index.js";
4
4
  import { type UseScrollChromeReturn } from "../../../composables/motion/scroll/useScrollChrome.js";
5
5
  export interface UseDockSearchOptions<T extends SearchableItem = SearchableItem> {
6
6
  /** Composes the existing dock state machine (no fork) — `armSearch`/`disarmSearch`