@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
@@ -1,2 +1,2 @@
1
1
  export { default as SegmentedTabs } from "./SegmentedTabs.vue.js";
2
- export type { SegmentedTabOption, SegmentedTabsVariant, SegmentedTabsSemantics, SegmentedTabsActivation, SegmentedTabsOrientation, SegmentedTabsProps, SegmentedTabsResponsive, } from "./SegmentedTabs.vue.js";
2
+ export type { SegmentedTabOption, SegmentedTabsVariant, SegmentedTabsSemantics, SegmentedTabsActivation, SegmentedTabsOrientation, SegmentedTabsProps, SegmentedTabsResponsive, } from "./types.js";
@@ -1 +1 @@
1
- .glass-drag-grabbable{cursor: grab;touch-action: none;}.glass-drag-lift{cursor: grabbing;will-change: transform;}.segmented-tabs:has(.segmented-indicator.glass-drag-grabbable) .segmented-tab[data-active]{pointer-events: none;}.segmented-indicator.glass-drag-lift{z-index: 30;}
1
+ @layer components{.glass-drag-grabbable{cursor: grab;touch-action: none;}.glass-drag-lift{cursor: grabbing;will-change: transform;}.segmented-tabs:has(.segmented-indicator.glass-drag-grabbable) .segmented-tab[data-active]{pointer-events: none;}.segmented-indicator.glass-drag-lift{z-index: 30;}}
@@ -1 +1 @@
1
- .segmented-tabs{--bouncy-track-trim: 0.1875rem;--bouncy-slider-radius: var(--radius-tab);--bouncy-track-radius: calc(var(--bouncy-slider-radius) + var(--bouncy-track-trim));--stretch: 1;position: relative;display: inline-grid;grid-auto-flow: column;grid-auto-columns: 1fr;padding: var(--bouncy-track-trim);border-radius: var(--bouncy-track-radius);overflow: visible;}.segmented-tabs--vertical{display: inline-flex;flex-direction: column;grid-auto-flow: unset;grid-auto-columns: unset;align-items: stretch;--bouncy-slider-radius: var(--radius-strip);--radius-ctx: var(--bouncy-track-radius);--radius-inset: var(--bouncy-track-trim);}.segmented-tabs--vertical .segmented-indicator{border-radius: max( var(--radius-floor),calc(var(--radius-ctx) - var(--radius-inset)) );}@media (min-width: 640px){.segmented-tabs{--bouncy-track-trim: 0.25rem;}}.segmented-indicator{position: absolute;z-index: 0;border-radius: var(--bouncy-slider-radius);transform-origin: var(--eyeglass-origin,50%) center;scale: var(--eyeglass-span,var(--stretch)) var(--eyeglass-swell,1);}.segmented-tabs--vertical .segmented-indicator{transform-origin: center var(--eyeglass-origin,50%);scale: var(--eyeglass-swell,1) var(--eyeglass-span,var(--stretch));}.segmented-tabs--underline .segmented-indicator{background: none;border-radius: 0;border-block-end: var(--paper-ink-mark-weight) solid var(--paper-ink-mark-color);scale: var(--stretch) 1;}.segmented-tabs--underline.segmented-tabs--vertical .segmented-indicator{border-block-end: none;border-inline-start: var(--paper-ink-mark-weight) solid var(--paper-ink-mark-color);scale: 1 var(--stretch);}.segmented-tabs:not(.segmented-tabs--underline){--eyeglass-span-max: 1.6;--eyeglass-cascade-annotation: 100ms;--eyeglass-light-clock: var(--engage-control-engage-release);transition: background var(--eyeglass-light-clock) var(--ease-standard);}.segmented-tabs:not(.segmented-tabs--underline) .segmented-indicator{box-shadow: var(--glass-rim-top),var(--glass-rim-bottom),inset 0 1px 2px var(--tab-track-recess-ink);}.segmented-tabs[data-eyeglass-wake]:not(.segmented-tabs--underline){--eyeglass-light-clock: var(--engage-control-engage-attack);background: color-mix( in oklab,var(--glass-plate-quiet),var(--glass-capsule-warm) var(--glass-capsule-warm-floor) );}.segmented-tabs[data-eyeglass-wake]:not(.segmented-tabs--underline) .segmented-indicator{box-shadow: var(--glass-rim-top),var(--glass-rim-bottom),var(--glass-shadow-capsule);}.segmented-indicator[data-eyeglass-clamped]{--eyeglass-swell: 1.22;}@media (prefers-reduced-motion: no-preference){.segmented-indicator--js{transition: translate var(--tab-indicator-duration) var(--spring-dock),width var(--tab-indicator-duration) var(--spring-dock),height var(--tab-indicator-duration) var(--spring-dock),scale var(--tab-indicator-duration) var(--ease-cartoon-punch),box-shadow var(--eyeglass-light-clock,var(--duration-fast)) var(--ease-standard),opacity var(--duration-fast) ease;}}.segmented-tab{position: relative;z-index: 10;border: none;background: none;font-weight: 500;cursor: pointer;white-space: nowrap;padding: 0.25rem 0.625rem;border-radius: var(--bouncy-slider-radius);font: inherit;font-size: var(--type-caption);color: color-mix(in oklab,var(--muted-foreground),var(--glass-capsule-warm) 12%);transition: color var(--duration-fast) ease;scale: 1;translate: 0;}@media (min-width: 640px){.segmented-tab{padding: 0.3125rem 0.75rem;font-size: var(--type-small);}}.segmented-tab[data-active]{color: var(--foreground);transition-delay: var(--eyeglass-cascade-annotation,0s);}.segmented-tab.is-disabled{opacity: 0.4;cursor: not-allowed;pointer-events: none;filter: blur(0.5px);}.segmented-tabs--underline{display: flex;grid-auto-flow: unset;grid-auto-columns: unset;gap: 0.25rem;padding: 0;background: none;-webkit-backdrop-filter: none;backdrop-filter: none;box-shadow: none;border-radius: 0;border-block-end: 1px solid var(--border);}.segmented-tabs--underline.segmented-tabs--vertical{flex-direction: column;align-items: stretch;border-block-end: none;border-inline-start: 1px solid var(--border);}.segmented-tabs--underline .segmented-tab{padding: 0.375rem 0.75rem;font-size: var(--type-subheading);letter-spacing: var(--type-tracking-display);border-radius: var(--bouncy-slider-radius);transition: color var(--duration-fast) ease;}.segmented-tabs--underline.segmented-tabs--vertical .segmented-tab{text-align: start;}.segmented-tabs--underline .segmented-tab:hover{color: color-mix(in oklab,var(--foreground) 70%,transparent);}
1
+ @layer components{.segmented-tabs{--bouncy-track-trim: 0.1875rem;--bouncy-slider-radius: var(--radius-tab);--bouncy-track-radius: calc(var(--bouncy-slider-radius) + var(--bouncy-track-trim));--stretch: 1;position: relative;display: inline-grid;grid-auto-flow: column;grid-auto-columns: 1fr;padding: var(--bouncy-track-trim);border-radius: var(--bouncy-track-radius);overflow: visible;}.segmented-tabs--vertical{display: inline-flex;flex-direction: column;grid-auto-flow: unset;grid-auto-columns: unset;align-items: stretch;--bouncy-slider-radius: var(--radius-strip);--radius-ctx: var(--bouncy-track-radius);--radius-inset: var(--bouncy-track-trim);}.segmented-tabs--vertical .segmented-indicator{border-radius: max( var(--radius-floor),calc(var(--radius-ctx) - var(--radius-inset)) );}@media (min-width: 640px){.segmented-tabs{--bouncy-track-trim: 0.25rem;}}.segmented-indicator{position: absolute;z-index: 0;border-radius: var(--bouncy-slider-radius);transform-origin: var(--eyeglass-origin,50%) center;scale: var(--eyeglass-span,var(--stretch)) var(--eyeglass-swell,1);}.segmented-tabs--vertical .segmented-indicator{transform-origin: center var(--eyeglass-origin,50%);scale: var(--eyeglass-swell,1) var(--eyeglass-span,var(--stretch));}.segmented-tabs--underline .segmented-indicator{background: none;border-radius: 0;border-block-end: var(--paper-ink-mark-weight) solid var(--paper-ink-mark-color);scale: var(--stretch) 1;}.segmented-tabs--underline.segmented-tabs--vertical .segmented-indicator{border-block-end: none;border-inline-start: var(--paper-ink-mark-weight) solid var(--paper-ink-mark-color);scale: 1 var(--stretch);}.segmented-tabs:not(.segmented-tabs--underline){--eyeglass-span-max: 1.6;--eyeglass-cascade-annotation: 100ms;--eyeglass-light-clock: var(--engage-control-engage-release);transition: background var(--eyeglass-light-clock) var(--ease-standard);}.segmented-tabs:not(.segmented-tabs--underline) .segmented-indicator{box-shadow: var(--glass-rim-top),var(--glass-rim-bottom),inset 0 1px 2px var(--tab-track-recess-ink);}.segmented-tabs[data-eyeglass-wake]:not(.segmented-tabs--underline){--eyeglass-light-clock: var(--engage-control-engage-attack);background: color-mix( in oklab,var(--glass-plate-quiet),var(--glass-capsule-warm) var(--glass-capsule-warm-floor) );}.segmented-tabs[data-eyeglass-wake]:not(.segmented-tabs--underline) .segmented-indicator{box-shadow: var(--glass-rim-top),var(--glass-rim-bottom),var(--glass-shadow-capsule);}.segmented-indicator[data-eyeglass-clamped]{--eyeglass-swell: 1.22;}@media (prefers-reduced-motion: no-preference){.segmented-indicator--js{transition: translate var(--tab-indicator-duration) var(--spring-dock),width var(--tab-indicator-duration) var(--spring-dock),height var(--tab-indicator-duration) var(--spring-dock),scale var(--tab-indicator-duration) var(--ease-cartoon-punch),box-shadow var(--eyeglass-light-clock,var(--duration-fast)) var(--ease-standard),opacity var(--duration-fast) ease;}}.segmented-tab{position: relative;z-index: 10;border: none;background: none;font-weight: 500;cursor: pointer;white-space: nowrap;padding: 0.25rem 0.625rem;border-radius: var(--bouncy-slider-radius);font: inherit;font-size: var(--type-caption);color: color-mix(in oklab,var(--muted-foreground),var(--glass-capsule-warm) 12%);transition: color var(--duration-fast) ease;scale: 1;translate: 0;}@media (min-width: 640px){.segmented-tab{padding: 0.3125rem 0.75rem;font-size: var(--type-small);}}.segmented-tab[data-active]{color: var(--foreground);transition-delay: var(--eyeglass-cascade-annotation,0s);}.segmented-tab.is-disabled{opacity: 0.4;cursor: not-allowed;pointer-events: none;filter: blur(0.5px);}.segmented-tabs--underline{display: flex;grid-auto-flow: unset;grid-auto-columns: unset;gap: 0.25rem;padding: 0;background: none;-webkit-backdrop-filter: none;backdrop-filter: none;box-shadow: none;border-radius: 0;border-block-end: 1px solid var(--border);}.segmented-tabs--underline.segmented-tabs--vertical{flex-direction: column;align-items: stretch;border-block-end: none;border-inline-start: 1px solid var(--border);}.segmented-tabs--underline .segmented-tab{padding: 0.375rem 0.75rem;font-size: var(--type-subheading);letter-spacing: var(--type-tracking-display);border-radius: var(--bouncy-slider-radius);transition: color var(--duration-fast) ease;}.segmented-tabs--underline.segmented-tabs--vertical .segmented-tab{text-align: start;}.segmented-tabs--underline .segmented-tab:not([data-active]){color: var(--muted-foreground);}.segmented-tabs--underline .segmented-tab:hover{color: color-mix(in oklab,var(--foreground) 70%,transparent);}}
@@ -0,0 +1,85 @@
1
+ import type { HTMLAttributes } from "vue";
2
+ import type { Motion } from "../_shared/axes.js";
3
+ import type { TabActivation } from "./composables/useTabRovingFocus.js";
4
+ /** The canonical tab/option shape — one descriptor across both materials. */
5
+ export interface SegmentedTabOption<V extends string = string> {
6
+ label: string;
7
+ value: V;
8
+ icon?: string;
9
+ disabled?: boolean;
10
+ /**
11
+ * The `id` of the tabpanel this option reveals. When set and semantics resolve to
12
+ * `tabs`, it is emitted as the tab's `aria-controls`, completing the APG
13
+ * tablist↔tabpanel linkage for consumers that own a panel. Ignored in `toggle`
14
+ * semantics (a toggle group mutates a shared surface, not a distinct panel).
15
+ */
16
+ controls?: string;
17
+ }
18
+ /** The two materials: `pill` is the default glass eyeglass; `underline` is the paper ink hairline. */
19
+ export type SegmentedTabsVariant = "pill" | "underline";
20
+ /** The interaction semantic, independent of material. `toggle` exposes a
21
+ * group of pressed buttons; `tabs` exposes a tablist with selected tabs. */
22
+ export type SegmentedTabsSemantics = "toggle" | "tabs";
23
+ /** Whether focus movement also selects. Manual activation waits for Enter/Space. */
24
+ export type SegmentedTabsActivation = TabActivation;
25
+ /** The orientation axis — `horizontal` (default) lays children in a row + tracks
26
+ * the indicator on the inline axis; `vertical` stacks a column + tracks the
27
+ * block axis (the vertical underline is the leading-edge ink rail). */
28
+ export type SegmentedTabsOrientation = "horizontal" | "vertical";
29
+ export interface SegmentedTabsResponsive<V extends string = string> {
30
+ /**
31
+ * CSS length consumed inside `(min-width: <breakpoint>)`. BELOW it the
32
+ * strip collapses to a `<Select>`; at/above it renders the tab strip.
33
+ * Defaults to `"640px"` (Tailwind `sm:`).
34
+ */
35
+ breakpoint?: string;
36
+ /**
37
+ * Optional subset shown in the desktop strip (the mobile Select keeps the
38
+ * full option list). Falls back to `options`.
39
+ */
40
+ desktopOptions?: SegmentedTabOption<V>[] | null;
41
+ /** Accessible name for the mobile `<SelectTrigger>`. */
42
+ ariaLabel?: string;
43
+ /** Class merged onto the mobile `<SelectTrigger>` only. */
44
+ triggerClass?: HTMLAttributes["class"];
45
+ }
46
+ export interface SegmentedTabsProps<V extends string = string> {
47
+ options: SegmentedTabOption<V>[];
48
+ /** Accessible name shared by the desktop strip and responsive Select. */
49
+ ariaLabel?: string;
50
+ /**
51
+ * The material — `pill` (DEFAULT, the glass eyeglass) or `underline` (the paper
52
+ * ink-hairline rule). TWO, and the eyeglass is not a third: it is what `pill`
53
+ * IS. A "million variants that are essentially the same thing" is the failure
54
+ * mode this axis exists to refuse.
55
+ */
56
+ variant?: SegmentedTabsVariant;
57
+ /**
58
+ * Interaction semantics, independent of `variant`. When omitted, preserves the
59
+ * historical mapping: `pill` → `toggle`, `underline` → `tabs`.
60
+ */
61
+ semantics?: SegmentedTabsSemantics;
62
+ /** Selection follows focus by default; manual mode activates with Enter/Space. */
63
+ activation?: SegmentedTabsActivation;
64
+ /**
65
+ * Orientation — `horizontal` (default) or `vertical`. Axis-derived on the
66
+ * one indicator engine.
67
+ */
68
+ orientation?: SegmentedTabsOrientation;
69
+ /**
70
+ * Responsive collapse — below the breakpoint the strip becomes a `<Select>`.
71
+ * `true` uses defaults; an object tunes the breakpoint, desktop subset, and
72
+ * accessible name.
73
+ */
74
+ responsive?: boolean | SegmentedTabsResponsive<V>;
75
+ /**
76
+ * Motion weight. `full` (default) lets the pill indicator follow a pointer,
77
+ * squash with drag velocity, and settle to the nearest tab. Drag supplements the
78
+ * fully operable click and keyboard path; it is never the sole selection method.
79
+ * `reduced` and `off` use the click-only strip while preserving roving focus.
80
+ * Underline has no deformable indicator. Reduced-motion preference forces
81
+ * `full → reduced`.
82
+ */
83
+ motion?: Motion;
84
+ class?: HTMLAttributes["class"];
85
+ }
@@ -1,2 +1,4 @@
1
1
  export { default as Timeline } from "./Timeline.vue.js";
2
2
  export type { TimelineProps, TimelineSegment, TimelineSegmentState, } from "./types.js";
3
+ export { accentFor, HUE_OFFSET, HUE_STRIDE, HUE_STOPS } from "./geometry.js";
4
+ export type { TimelineSpan } from "./geometry.js";
@@ -35,18 +35,18 @@ type __VLS_Slots = {} & {
35
35
  };
36
36
  declare const __VLS_base: import("vue").DefineComponent<ToastProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
37
37
  pause: () => any;
38
+ resume: () => any;
38
39
  "update:open": (value: boolean) => any;
39
40
  escapeKeyDown: (event: KeyboardEvent) => any;
40
- resume: () => any;
41
41
  swipeStart: (event: ToastSwipeEvent) => any;
42
42
  swipeMove: (event: ToastSwipeEvent) => any;
43
43
  swipeCancel: (event: ToastSwipeEvent) => any;
44
44
  swipeEnd: (event: ToastSwipeEvent) => any;
45
45
  }, string, import("vue").PublicProps, Readonly<ToastProps> & Readonly<{
46
46
  onPause?: (() => any) | undefined;
47
+ onResume?: (() => any) | undefined;
47
48
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
48
49
  onEscapeKeyDown?: ((event: KeyboardEvent) => any) | undefined;
49
- onResume?: (() => any) | undefined;
50
50
  onSwipeStart?: ((event: ToastSwipeEvent) => any) | undefined;
51
51
  onSwipeMove?: ((event: ToastSwipeEvent) => any) | undefined;
52
52
  onSwipeCancel?: ((event: ToastSwipeEvent) => any) | undefined;
@@ -4,15 +4,6 @@ export interface OklchStop {
4
4
  C: number;
5
5
  h: number;
6
6
  }
7
- /**
8
- * A color seam: resolves a CSS color string to a GAMMA-sRGB triple in [0,1].
9
- * `defaultBlobColorResolver` is the default. A general-purpose injection type for
10
- * consumers that theme a substrate through an external color pipeline — the
11
- * `<FourierField>` ambient background takes it as an optional `colorResolver` prop
12
- * (paired with the `color` token seam). The goo-blob resolves color internally through
13
- * `cssToOklch → oklchToGammaRgb` without dependency injection.
14
- */
15
- export type ColorResolver = (css: string) => [number, number, number];
16
7
  /**
17
8
  * OKLCh stop → LINEAR-sRGB in [0,1] — aurora's bundle-canonical bake target (the
18
9
  * shader ACES-tonemaps in linear, so the LUT stays linear).
@@ -61,12 +52,6 @@ export declare function oklchToGammaRgb(stop: OklchStop): [number, number, numbe
61
52
  export declare function cssToOklch(css: string): OklchStop;
62
53
  /** OKLCh stop → `#rrggbb` gamma hex through value.js `toRgba8`. */
63
54
  export declare function oklchStopToHex(s: OklchStop): string;
64
- /**
65
- * Default `ColorResolver`: `(css) => gamma [r,g,b]` through
66
- * `cssToOklch → oklchToGammaRgb`. `<FourierField>` can pass it as its
67
- * `colorResolver`; Blob uses the same body internally without a DI seam.
68
- */
69
- export declare const defaultBlobColorResolver: ColorResolver;
70
55
  /**
71
56
  * Harmony schemes for the OKLCh palette derivers. Each maps the seed hue onto the
72
57
  * derived stops differently:
@@ -8,6 +8,48 @@ export interface DarkModeSyncScriptOptions {
8
8
  * uses. Override ONLY if a consumer reconfigured the vueuse storage key.
9
9
  */
10
10
  storageKey?: string;
11
+ /**
12
+ * What an ABSENT or `"auto"` stored mode resolves to. `"os"` (the default)
13
+ * follows `prefers-color-scheme`, which is right for an app. `false`/`true`
14
+ * resolve DETERMINISTICALLY, which is right for a document that must not flip
15
+ * with the projector's OS theme — a briefing, a print target, a capture.
16
+ *
17
+ * The scalar forms answer BOTH cases at once. The object form answers them
18
+ * SEPARATELY, which is the only way to say "a first visit is a deliberate
19
+ * light document, but a reader who chose `auto` gets their platform":
20
+ *
21
+ * ```ts
22
+ * darkModeSyncScript({ defaultDark: { absent: false, auto: "os" } });
23
+ * ```
24
+ *
25
+ * No scalar reproduces that pair — `false` makes `auto` mean light and `"os"`
26
+ * makes a first visit follow the OS — which is why a consumer with the split
27
+ * policy hand-rolls the whole `<head>` block instead of calling this.
28
+ *
29
+ * [2026-09-22 · register-wave N-3 — an UNREADABLE store (a throwing
30
+ * `localStorage` accessor or `getItem`) counts as ABSENT: the scalar forms
31
+ * fall to their one arm, the object form to `absent`.]
32
+ */
33
+ defaultDark?: boolean | "os" | {
34
+ absent: boolean | "os";
35
+ auto: boolean | "os";
36
+ };
37
+ /**
38
+ * Honour `?light` / `?dark` in the query string, above storage and above the
39
+ * default. This is the capture-forcing seam: a screenshot pipeline asks for a
40
+ * mode in the URL rather than driving a toggle and hoping.
41
+ */
42
+ queryOverride?: boolean;
43
+ /**
44
+ * Write the RESOLVED mode back to storage, so an absent or `"auto"` value
45
+ * becomes a concrete `"dark"`/`"light"` at first paint and the runtime
46
+ * composable and the stamp cannot disagree about what `auto` meant.
47
+ *
48
+ * The write is emitted AFTER the stamp, so a storage that throws on write
49
+ * (quota, privacy mode, a sandboxed origin) costs the write-back and nothing
50
+ * else — the page is already themed when it fails.
51
+ */
52
+ normalize?: boolean;
11
53
  }
12
54
  /**
13
55
  * Return the inline `<head>` script STRING that resolves dark/light at parse
@@ -14,7 +14,7 @@ export interface ResolveTokenColorCache {
14
14
  *
15
15
  * @param css the color string (a `var(--token)` wrapper or a literal)
16
16
  * @param el the element to resolve the cascade against (the host wrapper)
17
- * @returns the concrete color string the `ColorResolver` can parse
17
+ * @returns the concrete color string a `(css) => rgb` resolver can parse
18
18
  */
19
19
  export declare function resolveTokenColor(css: string, el: HTMLElement | null): string;
20
20
  /**
@@ -1,5 +1,7 @@
1
1
  export { useSpecularTracking, createSpecularWriter, } from "./useSpecularTracking.js";
2
2
  export type { UseSpecularTracking, SpecularWriter, } from "./useSpecularTracking.js";
3
3
  export { vSpecular } from "./vSpecular.js";
4
+ export type { RendererStatus } from "./webgpu/rendererStatus.js";
5
+ export type { GpuBackend } from "./webgpu/useGpuSubstrate.js";
4
6
  export { useCanvas2D, resolveCanvasColor } from "./canvas2d/index.js";
5
7
  export type { Canvas2DFrame, Canvas2DHandle, Canvas2DOptions, Canvas2DSuspendReason, } from "./canvas2d/index.js";
@@ -18,6 +18,17 @@ export interface RegisteredShortcut {
18
18
  handler: (e: KeyboardEvent) => void;
19
19
  options: ShortcutOptions;
20
20
  }
21
+ /**
22
+ * A registration the help UI can render: the element type of
23
+ * `useRegisteredShortcuts()`, which filters on the label the registrar supplied.
24
+ * Type-only narrowing — `options.label` is the field the runtime guarantees, so
25
+ * that is the field the type promises.
26
+ */
27
+ export interface LabeledShortcut extends RegisteredShortcut {
28
+ options: ShortcutOptions & {
29
+ label: string;
30
+ };
31
+ }
21
32
  export interface ShortcutCombo {
22
33
  key: string;
23
34
  ctrl: boolean;
@@ -29,5 +40,40 @@ export interface ShortcutCombo {
29
40
  export declare const isMac: boolean;
30
41
  export declare function formatComboParts(raw: string): string[];
31
42
  export declare function formatCombo(raw: string): string;
43
+ /**
44
+ * The spoken form of a combo, for an `aria-label` beside the `<kbd>` glyphs.
45
+ * `"mod+shift+z"` → "Control Shift Z" (or "Command Shift Z" on a Mac);
46
+ * `"delete"` → "Delete or Backspace".
47
+ */
48
+ export declare function formatComboLabel(raw: string): string;
32
49
  export declare function registerShortcut(combo: string, handler: (e: KeyboardEvent) => void, options?: ShortcutOptions): () => void;
33
- export declare function useRegisteredShortcuts(): ComputedRef<RegisteredShortcut[]>;
50
+ /**
51
+ * Quiet every shortcut registered SO FAR for non-Escape keys, and return the
52
+ * release. A modal owns the keyboard while it is open: the nineteen app-level
53
+ * accelerators behind it must not fire, and nothing but the modal's own bindings
54
+ * should answer a keystroke aimed at it.
55
+ *
56
+ * ORDERING — call this BEFORE the modal registers its own bindings. The barrier is
57
+ * `seq > topBarrier`, so anything registered after the call is still live and
58
+ * anything registered before is not; suspending afterwards would silence the modal
59
+ * along with the app. The in-house overlays wire it in that order.
60
+ *
61
+ * Content that stays mounted across a close (`force-mount`, `unmount-on-hide="false"`,
62
+ * a reopen inside the exit spring) keeps the registration seq it took at mount and
63
+ * so falls BELOW the next barrier. Register on open and release on close, as the
64
+ * in-house overlays do — ExpandableContainer registers its Escape inside its open
65
+ * watch, not at mount.
66
+ *
67
+ * Escape is exempt by design and keeps its reversed LIFO walk, so the top-most
68
+ * overlay is always dismissable. Within a layer the forward first-registered-wins
69
+ * order is untouched, so a late registrant cannot shadow a destructive binding.
70
+ *
71
+ * `useRegisteredShortcuts()` is NOT barrier-filtered, deliberately: it is the
72
+ * reference list of what the app answers to, not a live capability probe. A help
73
+ * overlay is itself a modal, and filtering would hand it an empty list.
74
+ *
75
+ * The returned release is idempotent and order-free — it splices out its own
76
+ * barrier by identity, so nested suspensions can resume in any order.
77
+ */
78
+ export declare function suspendShortcuts(): () => void;
79
+ export declare function useRegisteredShortcuts(): ComputedRef<LabeledShortcut[]>;
@@ -20,47 +20,6 @@ export interface PointerFieldSnapshot {
20
20
  /** The smoothed active-engagement envelope (0..1). */
21
21
  engagement: number;
22
22
  }
23
- /** The default bias gain — the curve advances at most ±BIAS_GAIN faster/slower (≤0.15). */
24
- export declare const FOURIER_BIAS_GAIN = 0.15;
25
- /** The default centroid-lean fraction (the subtle lean). */
26
- export declare const FOURIER_FOLLOW_LEAN = 0.15;
27
- export interface FourierLeanGeometry {
28
- /** The canvas backing aspect (w/h) — the model→clip fit inverse. */
29
- aspect: number;
30
- /** The fit scale (`model = center + clip·aspect / scale`). */
31
- scale: number;
32
- /**
33
- * The head→cursor direction in CLIP space (the renderer computes it from the head
34
- * model position + the cursor clip position). Its dot with the head's travel tangent
35
- * is the draw-bias alignment. Omit (or zero) → no draw-bias (phaseRateMul = 1).
36
- */
37
- headToCursor?: PointerVec2;
38
- /** The head's travel TANGENT (clip space), for the draw-bias alignment. Omit → no bias. */
39
- headTangent?: PointerVec2;
40
- }
41
- export interface FourierLeanOptions {
42
- /** The centroid-lean fraction (default {@link FOURIER_FOLLOW_LEAN}). */
43
- lean?: number;
44
- /** The draw-bias gain (default {@link FOURIER_BIAS_GAIN}; clamped ≤0.15). */
45
- biasGain?: number;
46
- }
47
- export interface FourierLeanResult {
48
- /** The MODEL-space centroid lean the setups subtract from `fit.center`. */
49
- leanX: number;
50
- leanY: number;
51
- /**
52
- * The clock phase-rate multiplier (1 = neutral). >1 draws toward the cursor a hair
53
- * faster; <1 a hair slower. Bounded [1-biasGain, 1+biasGain].
54
- */
55
- phaseRateMul: number;
56
- }
57
- /**
58
- * The fourier draw-bias + subtle-lean mapping (PURE). The lean uses the SAME [0,1]→clip
59
- * (y-inverted) → model math the renderer inverts, at the subtle FOLLOW_LEAN (NOT the retired
60
- * FOLLOW_REACH teleport), scaled by engagement. The draw-bias modulates the clock phase-rate
61
- * by the head-tangent · head→cursor alignment, bounded by biasGain.
62
- */
63
- export declare function fourierLeanMapping(snap: PointerFieldSnapshot, geom: FourierLeanGeometry, options?: FourierLeanOptions): FourierLeanResult;
64
23
  /** The steady velocity-lead gain (the body anticipates the heading). */
65
24
  export declare const BLOB_LEAD_K = 0.09;
66
25
  /** The pseudopod stretch gain off |acceleration| (capped LOW so it swells, never taffies). */
@@ -1,5 +1,5 @@
1
1
  export { useFuzzySearch } from "./useFuzzySearch.js";
2
2
  export type { UseFuzzySearchOptions } from "./useFuzzySearch.js";
3
- export { buildIndex, searchIndex, fuzzyMatch, clearSearchCache } from "./fuzzySearchIndex.js";
4
- export type { SearchIndex } from "./fuzzySearchIndex.js";
3
+ export { buildIndex, searchIndex, fuzzyMatch, clearSearchCache } from "./match.js";
4
+ export type { SearchIndex } from "./match.js";
5
5
  export type { SearchableItem, SearchResult, FuzzySearchState } from "./types.js";
@@ -1,7 +1,12 @@
1
1
  /**
2
- * Generic fuzzy search index — builds a flat searchable index from items
3
- * and scores queries with VSCode-style fuzzy matching.
4
- * Pure functions, no Vue reactivity.
2
+ * The engine's matcher — builds a flat searchable index from items and scores queries
3
+ * with VSCode-style fuzzy matching. Pure functions, no Vue reactivity.
4
+ *
5
+ * [2026-08-25 · BK #42 W-SEARCH] Landed here from
6
+ * `src/components/search/composables/fuzzySearchIndex.ts`. The name lost its
7
+ * `fuzzySearchIndex` prefix with the directory: under `composables/search/` the words
8
+ * "search" and "fuzzy" are the path, and a file called `search/fuzzySearchIndex.ts`
9
+ * says them twice.
5
10
  */
6
11
  import type { SearchableItem, SearchResult } from "./types.js";
7
12
  interface IndexEntry<T extends SearchableItem> {
@@ -14,7 +14,11 @@ export interface SectionHierarchy {
14
14
  depth: number;
15
15
  /** ID of the root-level ancestor (self.id when depth === 0). */
16
16
  rootId: string;
17
- /** Direct parent ID (self.id for root nodes). */
17
+ /**
18
+ * Direct parent ID (null for root nodes). [2026-09-22 · O-32 §3.4: the index used
19
+ * to write self.id for roots and the root id at every depth; read `rootId` for the
20
+ * root-level ancestor.]
21
+ */
18
22
  parentId: string | null;
19
23
  /** Index within root-level nodes. */
20
24
  rootIndex: number;