@mkbabb/glass-ui 0.3.0 → 2.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 (942) hide show
  1. package/README.md +170 -70
  2. package/dist/CardFooter-Yi0xtLLd.js +129 -0
  3. package/dist/CollapsibleContent-DHRuXE3P.js +52 -0
  4. package/dist/CommandShortcut-_INFUMu6.js +285 -0
  5. package/dist/ContextMenuContent-CvXfU5qz.js +85 -0
  6. package/dist/ContextMenuSubContent-DCkweFW9.js +250 -0
  7. package/dist/DataTable-Ce00dbHD.js +460 -0
  8. package/dist/DialogContent-CmCijgX9.js +93 -0
  9. package/dist/DialogFooter-DRdaCok0.js +165 -0
  10. package/dist/DiscoGlyph-wRA02zAJ.js +132 -0
  11. package/dist/GlyphFace-BnPMUZ16.js +51 -0
  12. package/dist/HoverCardContent-4nN5-5bz.js +83 -0
  13. package/dist/HoverPopover-Btv4RQfv.js +80 -0
  14. package/dist/IconTooltip-ge_mBSWR.js +25 -0
  15. package/dist/Input-CbakTe3B.js +32 -0
  16. package/dist/InstrumentChassis-DOaVYyWq.js +65 -0
  17. package/dist/InstrumentRail-jHDqXj70.js +44 -0
  18. package/dist/Label-C8QMJSsf.js +32 -0
  19. package/dist/MetricBadge-DRBB18Xq.js +78 -0
  20. package/dist/ModalOverlay-DKLVY-cj.js +53 -0
  21. package/dist/Notification-DrI1DT2v.js +99 -0
  22. package/dist/PaperBackdrop-Bc2drCqJ.js +31 -0
  23. package/dist/PopoverContent-BCH4eYs8.js +121 -0
  24. package/dist/Progress-CCH-2UBR.js +126 -0
  25. package/dist/ScrollingText-7P8skg5W.js +40 -0
  26. package/dist/SelectGroup-O69GTQ77.js +31 -0
  27. package/dist/SelectScrollDownButton-yu8EYUnu.js +235 -0
  28. package/dist/SelectSeparator-GTHxKO0a.js +49 -0
  29. package/dist/Separator-_NCypg_C.js +37 -0
  30. package/dist/Switch-CL0uxu8F.js +41 -0
  31. package/dist/Toaster-DY8_jtHv.js +255 -0
  32. package/dist/ToggleGroupItem-BYG_8M9M.js +152 -0
  33. package/dist/TooltipProvider-C5QLSPto.js +104 -0
  34. package/dist/UnderlineTabs-BtrUcXn-.js +64 -0
  35. package/dist/_plugin-vue_export-helper-n-_DRHWS.js +8 -0
  36. package/dist/animated-digit.d.ts +1 -0
  37. package/dist/animated-digit.js +44 -0
  38. package/dist/api/index.d.ts +30 -0
  39. package/dist/api.js +2 -0
  40. package/dist/aurora.d.ts +1 -0
  41. package/dist/aurora.js +541 -0
  42. package/dist/badge-BbxVKZfw.js +49 -0
  43. package/dist/badge.d.ts +1 -0
  44. package/dist/badge.js +2 -0
  45. package/dist/button-BlOW34DT.js +70 -0
  46. package/dist/button.d.ts +1 -0
  47. package/dist/button.js +2 -0
  48. package/dist/card.d.ts +1 -0
  49. package/dist/card.js +2 -0
  50. package/dist/carousel.d.ts +2 -0
  51. package/dist/carousel.js +394 -0
  52. package/dist/check-dwgetki8.js +7 -0
  53. package/dist/chevron-down-DILQA1t6.js +7 -0
  54. package/dist/chevron-right-fS7fal2t.js +7 -0
  55. package/dist/chevron-up-BtYjYQOS.js +7 -0
  56. package/dist/cn-DJXf4yaB.js +97 -0
  57. package/dist/collapsible.d.ts +1 -0
  58. package/dist/collapsible.js +2 -0
  59. package/dist/command.d.ts +1 -0
  60. package/dist/command.js +2 -0
  61. package/dist/components/custom/animated-digit/AnimatedDigit.vue.d.ts +48 -0
  62. package/dist/components/custom/animated-digit/index.d.ts +2 -0
  63. package/dist/components/custom/aurora/Aurora.vue.d.ts +95 -0
  64. package/dist/components/custom/aurora/composables/color.d.ts +39 -0
  65. package/dist/components/custom/aurora/composables/configSource.d.ts +10 -0
  66. package/dist/components/custom/aurora/composables/runtime.d.ts +54 -0
  67. package/dist/components/custom/aurora/composables/useAurora.d.ts +67 -0
  68. package/dist/components/custom/aurora/composables/useCursorInteraction.d.ts +25 -0
  69. package/dist/components/custom/aurora/index.d.ts +9 -0
  70. package/dist/components/custom/aurora/presets.d.ts +121 -0
  71. package/dist/components/custom/aurora/renderMode.d.ts +30 -0
  72. package/dist/components/custom/aurora/shaders/aurora.frag.d.ts +1 -0
  73. package/dist/components/custom/aurora/shaders/aurora.vert.d.ts +1 -0
  74. package/dist/components/custom/configurator/Configurator.vue.d.ts +102 -0
  75. package/dist/components/custom/configurator/ConfiguratorLayer.vue.d.ts +68 -0
  76. package/dist/components/custom/configurator/ConfiguratorRow.vue.d.ts +63 -0
  77. package/dist/components/custom/configurator/density.d.ts +30 -0
  78. package/dist/components/custom/configurator/index.d.ts +6 -0
  79. package/dist/components/custom/configurator/useConfiguratorState.d.ts +45 -0
  80. package/dist/components/custom/confirm-dialog/ConfirmDialog.vue.d.ts +32 -0
  81. package/dist/components/custom/controls/DarkModeToggle.vue.d.ts +23 -0
  82. package/dist/components/custom/disco-glyph/DiscoGlyph.vue.d.ts +58 -0
  83. package/dist/components/custom/disco-glyph/index.d.ts +1 -0
  84. package/dist/components/custom/dock/DockDropdownTrigger.vue.d.ts +29 -0
  85. package/dist/components/custom/dock/DockIconButton.vue.d.ts +30 -0
  86. package/dist/components/custom/dock/DockLayer.vue.d.ts +34 -0
  87. package/dist/components/custom/dock/DockLayerGroup.vue.d.ts +43 -0
  88. package/dist/components/custom/dock/DockSelectTrigger.vue.d.ts +29 -0
  89. package/dist/components/custom/dock/DockTabButton.vue.d.ts +39 -0
  90. package/dist/components/custom/dock/GlassDock.vue.d.ts +96 -0
  91. package/dist/components/custom/dock/composables/dockContext.d.ts +40 -0
  92. package/dist/components/custom/dock/composables/dockLayerContext.d.ts +29 -0
  93. package/dist/components/custom/dock/composables/index.d.ts +7 -0
  94. package/dist/components/custom/dock/composables/isTeleportedTarget.d.ts +9 -0
  95. package/dist/components/custom/dock/composables/useDockState.d.ts +70 -0
  96. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +34 -0
  97. package/dist/components/custom/dock/index.d.ts +9 -0
  98. package/dist/components/custom/expandable-container/ExpandableContainer.vue.d.ts +40 -0
  99. package/dist/components/custom/glass-carousel/GlassCarousel.vue.d.ts +36 -0
  100. package/dist/components/custom/glass-carousel/GlassCarouselItem.vue.d.ts +28 -0
  101. package/dist/components/custom/glass-carousel/index.d.ts +4 -0
  102. package/dist/components/custom/glass-carousel/useGlassCarousel.d.ts +30 -0
  103. package/dist/components/custom/glass-panel/GlassPanel.vue.d.ts +41 -0
  104. package/dist/components/custom/glass-panel/index.d.ts +2 -0
  105. package/dist/components/custom/glyph-face/GlyphFace.vue.d.ts +64 -0
  106. package/dist/components/custom/glyph-face/index.d.ts +2 -0
  107. package/dist/components/custom/glyph-face/keys.d.ts +35 -0
  108. package/dist/components/custom/header-ribbon/HeaderRibbon.vue.d.ts +31 -0
  109. package/dist/components/custom/header-ribbon/index.d.ts +2 -0
  110. package/dist/components/custom/header-ribbon/types.d.ts +7 -0
  111. package/dist/components/custom/hover-popover/HoverPopover.vue.d.ts +71 -0
  112. package/dist/components/custom/hover-popover/index.d.ts +1 -0
  113. package/dist/components/custom/icon-tooltip/IconTooltip.vue.d.ts +16 -0
  114. package/dist/components/custom/infinite-scroll/InfiniteScroll.vue.d.ts +33 -0
  115. package/dist/components/custom/infinite-scroll/composables/types.d.ts +21 -0
  116. package/dist/components/custom/infinite-scroll/composables/useInfiniteScroll.d.ts +9 -0
  117. package/dist/components/custom/instrument-chassis/ChassisDivider.vue.d.ts +30 -0
  118. package/dist/components/custom/instrument-chassis/InstrumentChassis.vue.d.ts +82 -0
  119. package/dist/components/custom/instrument-chassis/index.d.ts +3 -0
  120. package/dist/components/custom/instrument-rail/InstrumentRail.vue.d.ts +91 -0
  121. package/dist/components/custom/instrument-rail/index.d.ts +2 -0
  122. package/dist/components/custom/labeled-field/LabeledField.vue.d.ts +36 -0
  123. package/dist/components/custom/labeled-field/LabeledInput.vue.d.ts +15 -0
  124. package/dist/components/custom/labeled-field/LabeledSelect.vue.d.ts +18 -0
  125. package/dist/components/custom/labeled-field/LabeledSlider.vue.d.ts +16 -0
  126. package/dist/components/custom/labeled-field/LabeledSwitch.vue.d.ts +13 -0
  127. package/dist/components/custom/labeled-field/index.d.ts +5 -0
  128. package/dist/components/custom/metric-badge/MetricBadge.vue.d.ts +39 -0
  129. package/dist/components/custom/metric-badge/index.d.ts +1 -0
  130. package/dist/components/custom/metric-cell/MetricCell.vue.d.ts +97 -0
  131. package/dist/components/custom/metric-cell/index.d.ts +2 -0
  132. package/dist/components/custom/metric-stack/MetricRow.vue.d.ts +103 -0
  133. package/dist/components/custom/metric-stack/MetricStack.vue.d.ts +92 -0
  134. package/dist/components/custom/metric-stack/index.d.ts +4 -0
  135. package/dist/components/custom/paper-backdrop/PaperBackdrop.vue.d.ts +21 -0
  136. package/dist/components/custom/paper-backdrop/index.d.ts +2 -0
  137. package/dist/components/custom/pulse/Pulse.vue.d.ts +53 -0
  138. package/dist/components/custom/pulse/index.d.ts +1 -0
  139. package/dist/components/custom/responsive-tabs/ResponsiveTabs.vue.d.ts +67 -0
  140. package/dist/components/custom/responsive-tabs/index.d.ts +2 -0
  141. package/dist/components/custom/scrolling-text/ScrollingText.vue.d.ts +20 -0
  142. package/dist/components/custom/scrolling-text/index.d.ts +1 -0
  143. package/dist/components/custom/search/FuzzySearch.vue.d.ts +16 -0
  144. package/dist/components/custom/search/SearchBar.vue.d.ts +30 -0
  145. package/dist/components/custom/search/composables/fuzzySearchIndex.d.ts +42 -0
  146. package/dist/components/custom/search/composables/types.d.ts +31 -0
  147. package/dist/components/custom/search/composables/useFuzzySearch.d.ts +12 -0
  148. package/dist/components/custom/sortable-list/SortableHandle.vue.d.ts +32 -0
  149. package/dist/components/custom/sortable-list/SortableItem.vue.d.ts +38 -0
  150. package/dist/components/custom/sortable-list/SortableList.vue.d.ts +76 -0
  151. package/dist/components/custom/sortable-list/context.d.ts +26 -0
  152. package/dist/components/custom/sortable-list/index.d.ts +4 -0
  153. package/dist/components/custom/stacked-icons/StackedIconGroup.vue.d.ts +30 -0
  154. package/dist/components/custom/stacked-icons/index.d.ts +2 -0
  155. package/dist/components/custom/stacked-icons/types.d.ts +18 -0
  156. package/dist/components/custom/status-dot/StatusDot.vue.d.ts +18 -0
  157. package/dist/components/custom/status-dot/index.d.ts +1 -0
  158. package/dist/components/custom/tabs/BouncyTabs.vue.d.ts +24 -0
  159. package/dist/components/custom/tabs/BouncyToggle.vue.d.ts +56 -0
  160. package/dist/components/custom/tabs/UnderlineTabs.vue.d.ts +17 -0
  161. package/dist/components/custom/timeline/ContinuousTimeline.vue.d.ts +118 -0
  162. package/dist/components/custom/timeline/GlassTimeline.vue.d.ts +114 -0
  163. package/dist/components/custom/timeline/ScrubberTimeline.vue.d.ts +29 -0
  164. package/dist/components/custom/timeline/SegmentedTimeline.vue.d.ts +46 -0
  165. package/dist/components/custom/timeline/geometry.d.ts +100 -0
  166. package/dist/components/custom/timeline/index.d.ts +2 -0
  167. package/dist/components/custom/timeline/types.d.ts +57 -0
  168. package/dist/components/custom/toggle-chip/ToggleChip.vue.d.ts +39 -0
  169. package/dist/components/custom/toggle-chip/index.d.ts +17 -0
  170. package/dist/components/custom/typewriter/TypewriterText.vue.d.ts +85 -0
  171. package/dist/components/custom/typewriter/composables/useTypewriter.d.ts +22 -0
  172. package/dist/components/custom/typewriter/types.d.ts +137 -0
  173. package/dist/components/custom/typewriter/utils/keyboard.d.ts +15 -0
  174. package/dist/components/custom/typewriter/utils/pausePatterns.d.ts +28 -0
  175. package/dist/components/custom/typewriter/utils/timing.d.ts +17 -0
  176. package/dist/components/custom/typewriter/utils/typoStateMachine.d.ts +24 -0
  177. package/dist/components/ui/_shared/ModalOverlay.vue.d.ts +90 -0
  178. package/dist/components/ui/_shared/index.d.ts +2 -0
  179. package/dist/components/ui/_shared/menuItemVariants.d.ts +32 -0
  180. package/dist/components/ui/_shared/useStalePropWarning.d.ts +27 -0
  181. package/dist/components/ui/accordion/Accordion.vue.d.ts +19 -0
  182. package/dist/components/ui/accordion/AccordionContent.vue.d.ts +18 -0
  183. package/dist/components/ui/accordion/AccordionItem.vue.d.ts +18 -0
  184. package/dist/components/ui/accordion/AccordionTrigger.vue.d.ts +20 -0
  185. package/dist/components/ui/accordion/index.d.ts +4 -0
  186. package/dist/components/ui/alert/Alert.vue.d.ts +19 -0
  187. package/dist/components/ui/alert/AlertDescription.vue.d.ts +17 -0
  188. package/dist/components/ui/alert/AlertTitle.vue.d.ts +17 -0
  189. package/dist/components/ui/alert/index.d.ts +8 -0
  190. package/dist/components/ui/avatar/Avatar.vue.d.ts +23 -0
  191. package/dist/components/ui/avatar/AvatarFallback.vue.d.ts +14 -0
  192. package/dist/components/ui/avatar/AvatarImage.vue.d.ts +4 -0
  193. package/dist/components/ui/avatar/index.d.ts +9 -0
  194. package/dist/components/ui/badge/Badge.vue.d.ts +20 -0
  195. package/dist/components/ui/badge/index.d.ts +7 -0
  196. package/dist/components/ui/button/Button.vue.d.ts +23 -0
  197. package/dist/components/ui/button/index.d.ts +7 -0
  198. package/dist/components/ui/card/Card.vue.d.ts +56 -0
  199. package/dist/components/ui/card/CardContent.vue.d.ts +17 -0
  200. package/dist/components/ui/card/CardDescription.vue.d.ts +17 -0
  201. package/dist/components/ui/card/CardFooter.vue.d.ts +17 -0
  202. package/dist/components/ui/card/CardHeader.vue.d.ts +55 -0
  203. package/dist/components/ui/card/CardTitle.vue.d.ts +17 -0
  204. package/dist/components/ui/card/index.d.ts +6 -0
  205. package/dist/components/ui/carousel/Carousel.vue.d.ts +37 -0
  206. package/dist/components/ui/carousel/CarouselContent.vue.d.ts +16 -0
  207. package/dist/components/ui/carousel/CarouselDots.vue.d.ts +4 -0
  208. package/dist/components/ui/carousel/CarouselItem.vue.d.ts +14 -0
  209. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +22 -0
  210. package/dist/components/ui/carousel/CarouselPager.vue.d.ts +10 -0
  211. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +22 -0
  212. package/dist/components/ui/carousel/GlassCarouselPager.vue.d.ts +51 -0
  213. package/dist/components/ui/carousel/index.d.ts +10 -0
  214. package/dist/components/ui/carousel/interface.d.ts +20 -0
  215. package/dist/components/ui/carousel/useCarousel.d.ts +20 -0
  216. package/dist/components/ui/checkbox/Checkbox.vue.d.ts +22 -0
  217. package/dist/components/ui/checkbox/index.d.ts +1 -0
  218. package/dist/components/ui/collapsible/Collapsible.vue.d.ts +20 -0
  219. package/dist/components/ui/collapsible/CollapsibleContent.vue.d.ts +14 -0
  220. package/dist/components/ui/collapsible/CollapsibleTrigger.vue.d.ts +14 -0
  221. package/dist/components/ui/collapsible/index.d.ts +3 -0
  222. package/dist/components/ui/combobox/Combobox.vue.d.ts +29 -0
  223. package/dist/components/ui/combobox/ComboboxAnchor.vue.d.ts +18 -0
  224. package/dist/components/ui/combobox/ComboboxEmpty.vue.d.ts +18 -0
  225. package/dist/components/ui/combobox/ComboboxGroup.vue.d.ts +19 -0
  226. package/dist/components/ui/combobox/ComboboxInput.vue.d.ts +22 -0
  227. package/dist/components/ui/combobox/ComboboxItem.vue.d.ts +22 -0
  228. package/dist/components/ui/combobox/ComboboxItemIndicator.vue.d.ts +18 -0
  229. package/dist/components/ui/combobox/ComboboxList.vue.d.ts +32 -0
  230. package/dist/components/ui/combobox/ComboboxSeparator.vue.d.ts +18 -0
  231. package/dist/components/ui/combobox/ComboboxViewport.vue.d.ts +18 -0
  232. package/dist/components/ui/combobox/index.d.ts +11 -0
  233. package/dist/components/ui/command/Command.vue.d.ts +35 -0
  234. package/dist/components/ui/command/CommandDialog.vue.d.ts +18 -0
  235. package/dist/components/ui/command/CommandEmpty.vue.d.ts +18 -0
  236. package/dist/components/ui/command/CommandGroup.vue.d.ts +19 -0
  237. package/dist/components/ui/command/CommandInput.vue.d.ts +8 -0
  238. package/dist/components/ui/command/CommandItem.vue.d.ts +22 -0
  239. package/dist/components/ui/command/CommandList.vue.d.ts +30 -0
  240. package/dist/components/ui/command/CommandSeparator.vue.d.ts +18 -0
  241. package/dist/components/ui/command/CommandShortcut.vue.d.ts +17 -0
  242. package/dist/components/ui/command/index.d.ts +9 -0
  243. package/dist/components/ui/context-menu/ContextMenu.vue.d.ts +18 -0
  244. package/dist/components/ui/context-menu/ContextMenuCheckboxItem.vue.d.ts +24 -0
  245. package/dist/components/ui/context-menu/ContextMenuContent.vue.d.ts +30 -0
  246. package/dist/components/ui/context-menu/ContextMenuItem.vue.d.ts +23 -0
  247. package/dist/components/ui/context-menu/ContextMenuLabel.vue.d.ts +19 -0
  248. package/dist/components/ui/context-menu/ContextMenuRadioGroup.vue.d.ts +18 -0
  249. package/dist/components/ui/context-menu/ContextMenuRadioItem.vue.d.ts +22 -0
  250. package/dist/components/ui/context-menu/ContextMenuSeparator.vue.d.ts +8 -0
  251. package/dist/components/ui/context-menu/ContextMenuShortcut.vue.d.ts +17 -0
  252. package/dist/components/ui/context-menu/ContextMenuSubContent.vue.d.ts +34 -0
  253. package/dist/components/ui/context-menu/ContextMenuSubTrigger.vue.d.ts +19 -0
  254. package/dist/components/ui/context-menu/ContextMenuTrigger.vue.d.ts +14 -0
  255. package/dist/components/ui/context-menu/index.d.ts +12 -0
  256. package/dist/components/ui/data-table/DataTable.vue.d.ts +81 -0
  257. package/dist/components/ui/data-table/DataTablePagination.vue.d.ts +13 -0
  258. package/dist/components/ui/data-table/types.d.ts +56 -0
  259. package/dist/components/ui/dialog/Dialog.vue.d.ts +18 -0
  260. package/dist/components/ui/dialog/DialogClose.vue.d.ts +14 -0
  261. package/dist/components/ui/dialog/DialogContent.vue.d.ts +71 -0
  262. package/dist/components/ui/dialog/DialogDescription.vue.d.ts +18 -0
  263. package/dist/components/ui/dialog/DialogFooter.vue.d.ts +17 -0
  264. package/dist/components/ui/dialog/DialogHeader.vue.d.ts +17 -0
  265. package/dist/components/ui/dialog/DialogScrollContent.vue.d.ts +33 -0
  266. package/dist/components/ui/dialog/DialogTitle.vue.d.ts +18 -0
  267. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +14 -0
  268. package/dist/components/ui/dialog/index.d.ts +9 -0
  269. package/dist/components/ui/drawer/Drawer.vue.d.ts +30 -0
  270. package/dist/components/ui/drawer/DrawerContent.vue.d.ts +32 -0
  271. package/dist/components/ui/drawer/DrawerDescription.vue.d.ts +18 -0
  272. package/dist/components/ui/drawer/DrawerFooter.vue.d.ts +17 -0
  273. package/dist/components/ui/drawer/DrawerHeader.vue.d.ts +17 -0
  274. package/dist/components/ui/drawer/DrawerOverlay.vue.d.ts +8 -0
  275. package/dist/components/ui/drawer/DrawerTitle.vue.d.ts +18 -0
  276. package/dist/components/ui/drawer/index.d.ts +8 -0
  277. package/dist/components/ui/dropdown-menu/DropdownMenu.vue.d.ts +18 -0
  278. package/dist/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue.d.ts +24 -0
  279. package/dist/components/ui/dropdown-menu/DropdownMenuContent.vue.d.ts +32 -0
  280. package/dist/components/ui/dropdown-menu/DropdownMenuGroup.vue.d.ts +14 -0
  281. package/dist/components/ui/dropdown-menu/DropdownMenuItem.vue.d.ts +19 -0
  282. package/dist/components/ui/dropdown-menu/DropdownMenuLabel.vue.d.ts +19 -0
  283. package/dist/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue.d.ts +18 -0
  284. package/dist/components/ui/dropdown-menu/DropdownMenuRadioItem.vue.d.ts +22 -0
  285. package/dist/components/ui/dropdown-menu/DropdownMenuSeparator.vue.d.ts +8 -0
  286. package/dist/components/ui/dropdown-menu/DropdownMenuShortcut.vue.d.ts +17 -0
  287. package/dist/components/ui/dropdown-menu/DropdownMenuSub.vue.d.ts +18 -0
  288. package/dist/components/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts +34 -0
  289. package/dist/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue.d.ts +18 -0
  290. package/dist/components/ui/dropdown-menu/DropdownMenuTrigger.vue.d.ts +14 -0
  291. package/dist/components/ui/dropdown-menu/index.d.ts +15 -0
  292. package/dist/components/ui/hover-card/HoverCard.vue.d.ts +18 -0
  293. package/dist/components/ui/hover-card/HoverCardContent.vue.d.ts +20 -0
  294. package/dist/components/ui/hover-card/HoverCardTrigger.vue.d.ts +14 -0
  295. package/dist/components/ui/hover-card/index.d.ts +3 -0
  296. package/dist/components/ui/index.d.ts +41 -0
  297. package/dist/components/ui/input/Input.vue.d.ts +13 -0
  298. package/dist/components/ui/input/index.d.ts +1 -0
  299. package/dist/components/ui/label/Label.vue.d.ts +18 -0
  300. package/dist/components/ui/label/index.d.ts +1 -0
  301. package/dist/components/ui/metric-pill/MetricPill.vue.d.ts +43 -0
  302. package/dist/components/ui/metric-pill/index.d.ts +1 -0
  303. package/dist/components/ui/multi-select/MultiSelect.vue.d.ts +24 -0
  304. package/dist/components/ui/multi-select/index.d.ts +7 -0
  305. package/dist/components/ui/notification/Notification.vue.d.ts +16 -0
  306. package/dist/components/ui/notification/index.d.ts +1 -0
  307. package/dist/components/ui/number-field/NumberField.vue.d.ts +22 -0
  308. package/dist/components/ui/number-field/NumberFieldContent.vue.d.ts +17 -0
  309. package/dist/components/ui/number-field/NumberFieldDecrement.vue.d.ts +18 -0
  310. package/dist/components/ui/number-field/NumberFieldIncrement.vue.d.ts +18 -0
  311. package/dist/components/ui/number-field/NumberFieldInput.vue.d.ts +3 -0
  312. package/dist/components/ui/number-field/index.d.ts +5 -0
  313. package/dist/components/ui/popover/Popover.vue.d.ts +18 -0
  314. package/dist/components/ui/popover/PopoverContent.vue.d.ts +39 -0
  315. package/dist/components/ui/popover/PopoverTrigger.vue.d.ts +14 -0
  316. package/dist/components/ui/popover/index.d.ts +3 -0
  317. package/dist/components/ui/progress/Progress.vue.d.ts +111 -0
  318. package/dist/components/ui/progress/index.d.ts +2 -0
  319. package/dist/components/ui/radio-group/RadioGroup.vue.d.ts +22 -0
  320. package/dist/components/ui/radio-group/RadioGroupItem.vue.d.ts +8 -0
  321. package/dist/components/ui/radio-group/index.d.ts +2 -0
  322. package/dist/components/ui/section/Section.vue.d.ts +73 -0
  323. package/dist/components/ui/section/index.d.ts +1 -0
  324. package/dist/components/ui/select/Select.vue.d.ts +21 -0
  325. package/dist/components/ui/select/SelectContent.vue.d.ts +30 -0
  326. package/dist/components/ui/select/SelectGroup.vue.d.ts +18 -0
  327. package/dist/components/ui/select/SelectItem.vue.d.ts +21 -0
  328. package/dist/components/ui/select/SelectLabel.vue.d.ts +18 -0
  329. package/dist/components/ui/select/SelectScrollDownButton.vue.d.ts +18 -0
  330. package/dist/components/ui/select/SelectScrollUpButton.vue.d.ts +18 -0
  331. package/dist/components/ui/select/SelectSeparator.vue.d.ts +8 -0
  332. package/dist/components/ui/select/SelectTrigger.vue.d.ts +22 -0
  333. package/dist/components/ui/select/SelectValue.vue.d.ts +14 -0
  334. package/dist/components/ui/select/index.d.ts +10 -0
  335. package/dist/components/ui/separator/Separator.vue.d.ts +9 -0
  336. package/dist/components/ui/separator/index.d.ts +1 -0
  337. package/dist/components/ui/sheet/Sheet.vue.d.ts +18 -0
  338. package/dist/components/ui/sheet/SheetClose.vue.d.ts +14 -0
  339. package/dist/components/ui/sheet/SheetContent.vue.d.ts +53 -0
  340. package/dist/components/ui/sheet/SheetDescription.vue.d.ts +18 -0
  341. package/dist/components/ui/sheet/SheetFooter.vue.d.ts +17 -0
  342. package/dist/components/ui/sheet/SheetHeader.vue.d.ts +17 -0
  343. package/dist/components/ui/sheet/SheetTitle.vue.d.ts +18 -0
  344. package/dist/components/ui/sheet/SheetTrigger.vue.d.ts +14 -0
  345. package/dist/components/ui/sheet/index.d.ts +13 -0
  346. package/dist/components/ui/skeleton/Skeleton.vue.d.ts +32 -0
  347. package/dist/components/ui/skeleton/index.d.ts +1 -0
  348. package/dist/components/ui/slider/Slider.vue.d.ts +26 -0
  349. package/dist/components/ui/slider/index.d.ts +31 -0
  350. package/dist/components/ui/switch/Switch.vue.d.ts +12 -0
  351. package/dist/components/ui/switch/index.d.ts +1 -0
  352. package/dist/components/ui/table/Table.vue.d.ts +17 -0
  353. package/dist/components/ui/table/TableBody.vue.d.ts +17 -0
  354. package/dist/components/ui/table/TableCaption.vue.d.ts +17 -0
  355. package/dist/components/ui/table/TableCell.vue.d.ts +17 -0
  356. package/dist/components/ui/table/TableEmpty.vue.d.ts +20 -0
  357. package/dist/components/ui/table/TableHead.vue.d.ts +17 -0
  358. package/dist/components/ui/table/TableHeader.vue.d.ts +17 -0
  359. package/dist/components/ui/table/TableRow.vue.d.ts +17 -0
  360. package/dist/components/ui/table/index.d.ts +8 -0
  361. package/dist/components/ui/tabs/Tabs.vue.d.ts +19 -0
  362. package/dist/components/ui/tabs/TabsContent.vue.d.ts +18 -0
  363. package/dist/components/ui/tabs/TabsIndicator.vue.d.ts +8 -0
  364. package/dist/components/ui/tabs/TabsList.vue.d.ts +18 -0
  365. package/dist/components/ui/tabs/TabsTrigger.vue.d.ts +18 -0
  366. package/dist/components/ui/tabs/index.d.ts +5 -0
  367. package/dist/components/ui/tags-input/TagsInput.vue.d.ts +28 -0
  368. package/dist/components/ui/tags-input/TagsInputInput.vue.d.ts +8 -0
  369. package/dist/components/ui/tags-input/TagsInputItem.vue.d.ts +18 -0
  370. package/dist/components/ui/tags-input/TagsInputItemDelete.vue.d.ts +18 -0
  371. package/dist/components/ui/tags-input/TagsInputItemText.vue.d.ts +8 -0
  372. package/dist/components/ui/tags-input/index.d.ts +5 -0
  373. package/dist/components/ui/textarea/Textarea.vue.d.ts +13 -0
  374. package/dist/components/ui/textarea/index.d.ts +1 -0
  375. package/dist/components/ui/toast/Toast.vue.d.ts +104 -0
  376. package/dist/components/ui/toast/ToastAction.vue.d.ts +18 -0
  377. package/dist/components/ui/toast/ToastClose.vue.d.ts +8 -0
  378. package/dist/components/ui/toast/ToastDescription.vue.d.ts +18 -0
  379. package/dist/components/ui/toast/ToastTitle.vue.d.ts +18 -0
  380. package/dist/components/ui/toast/Toaster.vue.d.ts +3 -0
  381. package/dist/components/ui/toast/index.d.ts +8 -0
  382. package/dist/components/ui/toast/use-toast.d.ts +155 -0
  383. package/dist/components/ui/toggle/Toggle.vue.d.ts +29 -0
  384. package/dist/components/ui/toggle/index.d.ts +26 -0
  385. package/dist/components/ui/toggle-group/ToggleGroup.vue.d.ts +25 -0
  386. package/dist/components/ui/toggle-group/ToggleGroupItem.vue.d.ts +21 -0
  387. package/dist/components/ui/toggle-group/index.d.ts +2 -0
  388. package/dist/components/ui/toggle-group/toggleGroupContext.d.ts +21 -0
  389. package/dist/components/ui/tooltip/Tooltip.vue.d.ts +18 -0
  390. package/dist/components/ui/tooltip/TooltipContent.vue.d.ts +26 -0
  391. package/dist/components/ui/tooltip/TooltipProvider.vue.d.ts +14 -0
  392. package/dist/components/ui/tooltip/TooltipTrigger.vue.d.ts +14 -0
  393. package/dist/components/ui/tooltip/index.d.ts +4 -0
  394. package/dist/composables/dark/index.d.ts +1 -0
  395. package/dist/composables/dark/useGlobalDark.d.ts +7 -0
  396. package/dist/composables/dom/index.d.ts +6 -0
  397. package/dist/composables/dom/useBreakpoint.d.ts +38 -0
  398. package/dist/composables/dom/useClipboard.d.ts +45 -0
  399. package/dist/composables/dom/useResizeObserver.d.ts +50 -0
  400. package/dist/composables/dom/useTokenColor.d.ts +27 -0
  401. package/dist/composables/dom/useTouchGate.d.ts +18 -0
  402. package/dist/composables/dom/useViewportReady.d.ts +87 -0
  403. package/dist/composables/glass/index.d.ts +1 -0
  404. package/dist/composables/glass/useGlassRenderer.d.ts +37 -0
  405. package/dist/composables/glass/webgl/frostShader.d.ts +27 -0
  406. package/dist/composables/index.d.ts +9 -0
  407. package/dist/composables/keyboard/index.d.ts +1 -0
  408. package/dist/composables/keyboard/useKeyboardShortcuts.d.ts +33 -0
  409. package/dist/composables/motion/constants.d.ts +19 -0
  410. package/dist/composables/motion/index.d.ts +14 -0
  411. package/dist/composables/motion/installDarkModeSync.d.ts +1 -0
  412. package/dist/composables/motion/useAnimatedNumber.d.ts +40 -0
  413. package/dist/composables/motion/useAnimatedNumberMap.d.ts +29 -0
  414. package/dist/composables/motion/useIntersectionPause.d.ts +33 -0
  415. package/dist/composables/motion/useNumericTransition.d.ts +32 -0
  416. package/dist/composables/motion/useRAFLoop.d.ts +43 -0
  417. package/dist/composables/motion/useScrollProgress.d.ts +23 -0
  418. package/dist/composables/motion/useSpring.d.ts +66 -0
  419. package/dist/composables/motion/useSpringMount.d.ts +52 -0
  420. package/dist/composables/motion/useSpringOrchestrator.d.ts +15 -0
  421. package/dist/composables/motion/useSpringPress.d.ts +46 -0
  422. package/dist/composables/motion/useStagger.d.ts +50 -0
  423. package/dist/composables/motion/useStaggerReveal.d.ts +22 -0
  424. package/dist/composables/reactive/index.d.ts +2 -0
  425. package/dist/composables/reactive/useInterval.d.ts +24 -0
  426. package/dist/composables/reactive/useTimer.d.ts +24 -0
  427. package/dist/composables/sidebar/index.d.ts +7 -0
  428. package/dist/composables/sidebar/types.d.ts +44 -0
  429. package/dist/composables/sidebar/useScrollTracker.d.ts +12 -0
  430. package/dist/composables/sidebar/useSidebarFollow.d.ts +16 -0
  431. package/dist/composables/sidebar/useSidebarState.d.ts +39 -0
  432. package/dist/composables/sidebar/useTreeIndex.d.ts +37 -0
  433. package/dist/composables/sortable/index.d.ts +1 -0
  434. package/dist/composables/sortable/useSortable.d.ts +149 -0
  435. package/dist/configurator.d.ts +1 -0
  436. package/dist/configurator.js +2 -0
  437. package/dist/confirm-dialog.d.ts +1 -0
  438. package/dist/confirm-dialog.js +69 -0
  439. package/dist/context-menu.d.ts +1 -0
  440. package/dist/context-menu.js +3 -0
  441. package/dist/controls.d.ts +1 -0
  442. package/dist/controls.js +51 -0
  443. package/dist/createLucideIcon-Bn9a1b70.js +43 -0
  444. package/dist/dark.d.ts +1 -0
  445. package/dist/dark.js +2 -0
  446. package/dist/data-table.d.ts +1 -0
  447. package/dist/data-table.js +2 -0
  448. package/dist/dialog.d.ts +1 -0
  449. package/dist/dialog.js +3 -0
  450. package/dist/disco-glyph.d.ts +1 -0
  451. package/dist/disco-glyph.js +2 -0
  452. package/dist/dock.d.ts +1 -0
  453. package/dist/dock.js +548 -0
  454. package/dist/dockContext-BDGSrwsV.js +16 -0
  455. package/dist/dom.d.ts +1 -0
  456. package/dist/dom.js +4 -0
  457. package/dist/dropdown-menu-2K-SGkZU.js +363 -0
  458. package/dist/dropdown-menu.d.ts +1 -0
  459. package/dist/dropdown-menu.js +2 -0
  460. package/dist/expandable-container.d.ts +1 -0
  461. package/dist/expandable-container.js +64 -0
  462. package/dist/fonts/README.md +95 -0
  463. package/dist/fonts/fira-code/OFL.txt +93 -0
  464. package/dist/fonts/fira-code/fira-code-latin-ext.woff2 +0 -0
  465. package/dist/fonts/fira-code/fira-code-latin.woff2 +0 -0
  466. package/dist/fonts/plus-jakarta-sans/OFL.txt +93 -0
  467. package/dist/fonts/plus-jakarta-sans/plus-jakarta-sans-latin-ext.woff2 +0 -0
  468. package/dist/fonts/plus-jakarta-sans/plus-jakarta-sans-latin.woff2 +0 -0
  469. package/dist/forms.d.ts +3 -0
  470. package/dist/forms.js +311 -0
  471. package/dist/glass-carousel.d.ts +1 -0
  472. package/dist/glass-carousel.js +207 -0
  473. package/dist/glass-panel.d.ts +1 -0
  474. package/dist/glass-panel.js +44 -0
  475. package/dist/glass-ui.css +2 -1
  476. package/dist/glass-ui.js +1150 -10021
  477. package/dist/glyph-face.d.ts +1 -0
  478. package/dist/glyph-face.js +3 -0
  479. package/dist/header-ribbon.d.ts +1 -0
  480. package/dist/header-ribbon.js +63 -0
  481. package/dist/hover-card.d.ts +1 -0
  482. package/dist/hover-card.js +2 -0
  483. package/dist/hover-popover.d.ts +1 -0
  484. package/dist/hover-popover.js +2 -0
  485. package/dist/icon-tooltip.d.ts +1 -0
  486. package/dist/icon-tooltip.js +2 -0
  487. package/dist/index.d.ts +49 -6619
  488. package/dist/infinite-scroll.d.ts +2 -0
  489. package/dist/infinite-scroll.js +73 -0
  490. package/dist/instrument-chassis.d.ts +1 -0
  491. package/dist/instrument-chassis.js +2 -0
  492. package/dist/instrument-rail.d.ts +1 -0
  493. package/dist/instrument-rail.js +2 -0
  494. package/dist/keyboard.d.ts +1 -0
  495. package/dist/keyboard.js +2 -0
  496. package/dist/keys-DVkcUktU.js +11 -0
  497. package/dist/label.d.ts +1 -0
  498. package/dist/label.js +2 -0
  499. package/dist/labeled-field.d.ts +1 -0
  500. package/dist/labeled-field.js +194 -0
  501. package/dist/menuItemVariants-B2nDL7zH.js +30 -0
  502. package/dist/metric-badge.d.ts +1 -0
  503. package/dist/metric-badge.js +2 -0
  504. package/dist/metric-cell.d.ts +1 -0
  505. package/dist/metric-cell.js +54 -0
  506. package/dist/metric-stack.d.ts +1 -0
  507. package/dist/metric-stack.js +107 -0
  508. package/dist/minimize-2-LsCJ_eNt.js +38 -0
  509. package/dist/motion.d.ts +1 -0
  510. package/dist/motion.js +286 -0
  511. package/dist/notification.d.ts +1 -0
  512. package/dist/notification.js +2 -0
  513. package/dist/paper-backdrop.d.ts +1 -0
  514. package/dist/paper-backdrop.js +2 -0
  515. package/dist/popover.d.ts +1 -0
  516. package/dist/popover.js +2 -0
  517. package/dist/presets-BMzCDrmR.js +71 -0
  518. package/dist/progress.d.ts +1 -0
  519. package/dist/progress.js +2 -0
  520. package/dist/pulse.d.ts +1 -0
  521. package/dist/pulse.js +54 -0
  522. package/dist/reactive.d.ts +1 -0
  523. package/dist/reactive.js +3 -0
  524. package/dist/responsive-tabs.d.ts +1 -0
  525. package/dist/responsive-tabs.js +89 -0
  526. package/dist/scrolling-text.d.ts +1 -0
  527. package/dist/scrolling-text.js +2 -0
  528. package/dist/search-ocd8tmL9.js +12 -0
  529. package/dist/search.d.ts +1 -0
  530. package/dist/search.js +425 -0
  531. package/dist/select.d.ts +1 -0
  532. package/dist/select.js +4 -0
  533. package/dist/separator.d.ts +1 -0
  534. package/dist/separator.js +2 -0
  535. package/dist/sheet-CLVkb3AO.js +214 -0
  536. package/dist/sheet.d.ts +1 -0
  537. package/dist/sheet.js +2 -0
  538. package/dist/sidebar.d.ts +1 -0
  539. package/dist/sidebar.js +304 -0
  540. package/dist/slider-BQaLYFLh.js +133 -0
  541. package/dist/slider.d.ts +1 -0
  542. package/dist/slider.js +2 -0
  543. package/dist/sortable-list.d.ts +1 -0
  544. package/dist/sortable-list.js +82 -0
  545. package/dist/stacked-icons.d.ts +1 -0
  546. package/dist/stacked-icons.js +83 -0
  547. package/dist/status-dot.d.ts +1 -0
  548. package/dist/status-dot.js +55 -0
  549. package/dist/styles/animations.css +298 -0
  550. package/dist/styles/cards.css +44 -0
  551. package/dist/styles/disco-glyph.css +26 -0
  552. package/dist/styles/dock.css +1085 -0
  553. package/dist/styles/floating-panel.css +34 -0
  554. package/dist/styles/fonts.css +143 -0
  555. package/dist/styles/glass.css +277 -0
  556. package/dist/styles/glyph-face.css +92 -0
  557. package/dist/styles/hover-popover.css +44 -0
  558. package/dist/styles/index.css +96 -0
  559. package/dist/styles/instrument-chassis.css +313 -0
  560. package/dist/styles/instrument-rail.css +128 -0
  561. package/dist/styles/paper.css +68 -0
  562. package/dist/styles/theme.css +358 -0
  563. package/dist/styles/tokens.css +1495 -0
  564. package/dist/styles/transitions.css +245 -0
  565. package/dist/styles/typography.css +553 -0
  566. package/dist/styles/utilities.css +893 -0
  567. package/dist/tabs.d.ts +1 -0
  568. package/dist/tabs.js +206 -0
  569. package/dist/timeline.d.ts +1 -0
  570. package/dist/timeline.js +466 -0
  571. package/dist/toast.d.ts +1 -0
  572. package/dist/toast.js +2 -0
  573. package/dist/toggle-chip.d.ts +1 -0
  574. package/dist/toggle-chip.js +71 -0
  575. package/dist/toggle-group.d.ts +1 -0
  576. package/dist/toggle-group.js +2 -0
  577. package/dist/tokens.d.ts +53 -0
  578. package/dist/tokens.js +16 -0
  579. package/dist/tooltip.d.ts +1 -0
  580. package/dist/tooltip.js +2 -0
  581. package/dist/typewriter.d.ts +1 -0
  582. package/dist/typewriter.js +860 -0
  583. package/dist/useAnimatedNumber-DcvTR9B4.js +51 -0
  584. package/dist/useBreakpoint-BHlX-MhR.js +134 -0
  585. package/dist/useConfiguratorState-BlaevW0S.js +266 -0
  586. package/dist/useGlassRenderer-DMDdMH55.js +69 -0
  587. package/dist/useGlobalDark-PMiP5Jku.js +24 -0
  588. package/dist/useIntersectionPause-CXYfYg_C.js +39 -0
  589. package/dist/useInterval-COlTCeVa.js +18 -0
  590. package/dist/useKeyboardShortcuts-B1ev1YEC.js +99 -0
  591. package/dist/useResizeObserver-F4aRR4Cj.js +44 -0
  592. package/dist/useSortable-Ck0rBJ4g.js +175 -0
  593. package/dist/useSpringMount-BTRBNzXP.js +113 -0
  594. package/dist/useTimer-lp5NlH4w.js +20 -0
  595. package/dist/useTouchGate-BhhEMlwJ.js +84 -0
  596. package/dist/utils/cn.d.ts +27 -0
  597. package/dist/x-cdWAmO-q.js +10 -0
  598. package/package.json +514 -26
  599. package/src/fonts/README.md +95 -0
  600. package/src/fonts/fira-code/OFL.txt +93 -0
  601. package/src/fonts/fira-code/fira-code-latin-ext.woff2 +0 -0
  602. package/src/fonts/fira-code/fira-code-latin.woff2 +0 -0
  603. package/src/fonts/plus-jakarta-sans/OFL.txt +93 -0
  604. package/src/fonts/plus-jakarta-sans/plus-jakarta-sans-latin-ext.woff2 +0 -0
  605. package/src/fonts/plus-jakarta-sans/plus-jakarta-sans-latin.woff2 +0 -0
  606. package/src/styles/animations.css +172 -107
  607. package/src/styles/cards.css +30 -52
  608. package/src/styles/disco-glyph.css +26 -0
  609. package/src/styles/dock.css +991 -127
  610. package/src/styles/floating-panel.css +22 -37
  611. package/src/styles/fonts.css +143 -0
  612. package/src/styles/glass.css +129 -126
  613. package/src/styles/glyph-face.css +92 -0
  614. package/src/styles/hover-popover.css +44 -0
  615. package/src/styles/index.css +73 -3
  616. package/src/styles/instrument-chassis.css +313 -0
  617. package/src/styles/instrument-rail.css +128 -0
  618. package/src/styles/paper.css +68 -0
  619. package/src/styles/theme.css +292 -72
  620. package/src/styles/tokens.css +1345 -183
  621. package/src/styles/transitions.css +227 -208
  622. package/src/styles/typography.css +498 -222
  623. package/src/styles/utilities.css +612 -437
  624. package/src/components/custom/aurora/Aurora.vue +0 -34
  625. package/src/components/custom/aurora/composables/color.ts +0 -122
  626. package/src/components/custom/aurora/composables/useAurora.ts +0 -352
  627. package/src/components/custom/aurora/index.ts +0 -8
  628. package/src/components/custom/confirm-dialog/ConfirmDialog.vue +0 -88
  629. package/src/components/custom/controls/DarkModeToggle.vue +0 -96
  630. package/src/components/custom/dock/DockLayerGroup.vue +0 -21
  631. package/src/components/custom/dock/DockPopover.vue +0 -263
  632. package/src/components/custom/dock/GlassDock.vue +0 -276
  633. package/src/components/custom/dock/composables/index.ts +0 -16
  634. package/src/components/custom/dock/composables/isTeleportedTarget.ts +0 -19
  635. package/src/components/custom/dock/composables/useDockActionBar.ts +0 -33
  636. package/src/components/custom/dock/composables/useDockState.ts +0 -314
  637. package/src/components/custom/dock/composables/useDockTransition.ts +0 -146
  638. package/src/components/custom/dock/composables/useLayerTransition.ts +0 -135
  639. package/src/components/custom/dock/composables/usePopupMutex.ts +0 -83
  640. package/src/components/custom/dock/index.ts +0 -9
  641. package/src/components/custom/expandable-container/ExpandableContainer.vue +0 -64
  642. package/src/components/custom/glass-panel/GlassPanel.vue +0 -98
  643. package/src/components/custom/glass-panel/index.ts +0 -2
  644. package/src/components/custom/icon-tooltip/IconTooltip.vue +0 -20
  645. package/src/components/custom/index.ts +0 -15
  646. package/src/components/custom/infinite-scroll/InfiniteScroll.vue +0 -55
  647. package/src/components/custom/infinite-scroll/composables/types.ts +0 -23
  648. package/src/components/custom/infinite-scroll/composables/useInfiniteScroll.ts +0 -73
  649. package/src/components/custom/labeled-field/LabeledInput.vue +0 -29
  650. package/src/components/custom/labeled-field/LabeledSelect.vue +0 -59
  651. package/src/components/custom/labeled-field/LabeledSlider.vue +0 -32
  652. package/src/components/custom/labeled-field/LabeledSwitch.vue +0 -27
  653. package/src/components/custom/labeled-field/index.ts +0 -4
  654. package/src/components/custom/metaballs/MetaballCanvas.vue +0 -23
  655. package/src/components/custom/metaballs/index.ts +0 -4
  656. package/src/components/custom/metaballs/shaders.ts +0 -63
  657. package/src/components/custom/metaballs/types.ts +0 -29
  658. package/src/components/custom/metaballs/useMetaballs.ts +0 -252
  659. package/src/components/custom/search/FuzzySearch.vue +0 -589
  660. package/src/components/custom/search/SearchBar.vue +0 -44
  661. package/src/components/custom/search/composables/fuzzySearchIndex.ts +0 -224
  662. package/src/components/custom/search/composables/types.ts +0 -34
  663. package/src/components/custom/search/composables/useFuzzySearch.ts +0 -115
  664. package/src/components/custom/sidebar/ProgressiveSidebar.vue +0 -256
  665. package/src/components/custom/sidebar/composables/index.ts +0 -6
  666. package/src/components/custom/sidebar/composables/useScrollTracker.ts +0 -242
  667. package/src/components/custom/sidebar/composables/useSidebarFollow.ts +0 -247
  668. package/src/components/custom/sidebar/composables/useSidebarState.ts +0 -72
  669. package/src/components/custom/sidebar/composables/useTreeIndex.ts +0 -152
  670. package/src/components/custom/sidebar/index.ts +0 -15
  671. package/src/components/custom/sidebar/types.ts +0 -50
  672. package/src/components/custom/tabs/BouncyTabs.vue +0 -39
  673. package/src/components/custom/tabs/BouncyToggle.vue +0 -352
  674. package/src/components/custom/tabs/UnderlineTabs.vue +0 -115
  675. package/src/components/custom/timeline/GlassTimeline.vue +0 -174
  676. package/src/components/custom/timeline/index.ts +0 -1
  677. package/src/components/custom/typewriter/TypewriterText.vue +0 -239
  678. package/src/components/custom/typewriter/composables/useTypewriter.ts +0 -413
  679. package/src/components/custom/typewriter/types.ts +0 -159
  680. package/src/components/custom/typewriter/utils/keyboard.ts +0 -213
  681. package/src/components/custom/typewriter/utils/pausePatterns.ts +0 -55
  682. package/src/components/custom/typewriter/utils/timing.ts +0 -104
  683. package/src/components/custom/typewriter/utils/typoStateMachine.ts +0 -197
  684. package/src/components/index.ts +0 -2
  685. package/src/components/ui/accordion/Accordion.vue +0 -19
  686. package/src/components/ui/accordion/AccordionContent.vue +0 -24
  687. package/src/components/ui/accordion/AccordionItem.vue +0 -24
  688. package/src/components/ui/accordion/AccordionTrigger.vue +0 -39
  689. package/src/components/ui/accordion/index.ts +0 -4
  690. package/src/components/ui/alert/Alert.vue +0 -20
  691. package/src/components/ui/alert/AlertDescription.vue +0 -17
  692. package/src/components/ui/alert/AlertTitle.vue +0 -17
  693. package/src/components/ui/alert/index.ts +0 -23
  694. package/src/components/ui/avatar/Avatar.vue +0 -21
  695. package/src/components/ui/avatar/AvatarFallback.vue +0 -11
  696. package/src/components/ui/avatar/AvatarImage.vue +0 -9
  697. package/src/components/ui/avatar/index.ts +0 -24
  698. package/src/components/ui/badge/Badge.vue +0 -16
  699. package/src/components/ui/badge/index.ts +0 -25
  700. package/src/components/ui/button/Button.vue +0 -26
  701. package/src/components/ui/button/index.ts +0 -43
  702. package/src/components/ui/card/Card.vue +0 -28
  703. package/src/components/ui/card/CardContent.vue +0 -14
  704. package/src/components/ui/card/CardDescription.vue +0 -14
  705. package/src/components/ui/card/CardFooter.vue +0 -14
  706. package/src/components/ui/card/CardHeader.vue +0 -14
  707. package/src/components/ui/card/CardTitle.vue +0 -21
  708. package/src/components/ui/card/index.ts +0 -6
  709. package/src/components/ui/carousel/Carousel.vue +0 -53
  710. package/src/components/ui/carousel/CarouselContent.vue +0 -35
  711. package/src/components/ui/carousel/CarouselItem.vue +0 -24
  712. package/src/components/ui/carousel/CarouselNext.vue +0 -40
  713. package/src/components/ui/carousel/CarouselPrevious.vue +0 -40
  714. package/src/components/ui/carousel/index.ts +0 -10
  715. package/src/components/ui/carousel/interface.ts +0 -26
  716. package/src/components/ui/carousel/useCarousel.ts +0 -56
  717. package/src/components/ui/checkbox/Checkbox.vue +0 -33
  718. package/src/components/ui/checkbox/index.ts +0 -1
  719. package/src/components/ui/collapsible/Collapsible.vue +0 -15
  720. package/src/components/ui/collapsible/CollapsibleContent.vue +0 -11
  721. package/src/components/ui/collapsible/CollapsibleTrigger.vue +0 -11
  722. package/src/components/ui/collapsible/index.ts +0 -3
  723. package/src/components/ui/combobox/Combobox.vue +0 -17
  724. package/src/components/ui/combobox/ComboboxAnchor.vue +0 -23
  725. package/src/components/ui/combobox/ComboboxEmpty.vue +0 -21
  726. package/src/components/ui/combobox/ComboboxGroup.vue +0 -27
  727. package/src/components/ui/combobox/ComboboxInput.vue +0 -41
  728. package/src/components/ui/combobox/ComboboxItem.vue +0 -24
  729. package/src/components/ui/combobox/ComboboxItemIndicator.vue +0 -23
  730. package/src/components/ui/combobox/ComboboxList.vue +0 -29
  731. package/src/components/ui/combobox/ComboboxSeparator.vue +0 -21
  732. package/src/components/ui/combobox/ComboboxViewport.vue +0 -23
  733. package/src/components/ui/combobox/index.ts +0 -12
  734. package/src/components/ui/command/Command.vue +0 -30
  735. package/src/components/ui/command/CommandDialog.vue +0 -21
  736. package/src/components/ui/command/CommandEmpty.vue +0 -20
  737. package/src/components/ui/command/CommandGroup.vue +0 -29
  738. package/src/components/ui/command/CommandInput.vue +0 -33
  739. package/src/components/ui/command/CommandItem.vue +0 -26
  740. package/src/components/ui/command/CommandList.vue +0 -27
  741. package/src/components/ui/command/CommandSeparator.vue +0 -23
  742. package/src/components/ui/command/CommandShortcut.vue +0 -14
  743. package/src/components/ui/command/index.ts +0 -9
  744. package/src/components/ui/context-menu/ContextMenu.vue +0 -15
  745. package/src/components/ui/context-menu/ContextMenuCheckboxItem.vue +0 -40
  746. package/src/components/ui/context-menu/ContextMenuContent.vue +0 -36
  747. package/src/components/ui/context-menu/ContextMenuGroup.vue +0 -11
  748. package/src/components/ui/context-menu/ContextMenuItem.vue +0 -34
  749. package/src/components/ui/context-menu/ContextMenuLabel.vue +0 -25
  750. package/src/components/ui/context-menu/ContextMenuPortal.vue +0 -11
  751. package/src/components/ui/context-menu/ContextMenuRadioGroup.vue +0 -19
  752. package/src/components/ui/context-menu/ContextMenuRadioItem.vue +0 -40
  753. package/src/components/ui/context-menu/ContextMenuSeparator.vue +0 -20
  754. package/src/components/ui/context-menu/ContextMenuShortcut.vue +0 -14
  755. package/src/components/ui/context-menu/ContextMenuSub.vue +0 -19
  756. package/src/components/ui/context-menu/ContextMenuSubContent.vue +0 -35
  757. package/src/components/ui/context-menu/ContextMenuSubTrigger.vue +0 -34
  758. package/src/components/ui/context-menu/ContextMenuTrigger.vue +0 -13
  759. package/src/components/ui/context-menu/index.ts +0 -14
  760. package/src/components/ui/data-table/DataTable.vue +0 -167
  761. package/src/components/ui/data-table/DataTablePagination.vue +0 -112
  762. package/src/components/ui/data-table/types.ts +0 -48
  763. package/src/components/ui/dialog/Dialog.vue +0 -14
  764. package/src/components/ui/dialog/DialogClose.vue +0 -11
  765. package/src/components/ui/dialog/DialogContent.vue +0 -61
  766. package/src/components/ui/dialog/DialogDescription.vue +0 -24
  767. package/src/components/ui/dialog/DialogFooter.vue +0 -19
  768. package/src/components/ui/dialog/DialogHeader.vue +0 -16
  769. package/src/components/ui/dialog/DialogScrollContent.vue +0 -65
  770. package/src/components/ui/dialog/DialogTitle.vue +0 -29
  771. package/src/components/ui/dialog/DialogTrigger.vue +0 -11
  772. package/src/components/ui/dialog/index.ts +0 -9
  773. package/src/components/ui/drawer/Drawer.vue +0 -19
  774. package/src/components/ui/drawer/DrawerContent.vue +0 -28
  775. package/src/components/ui/drawer/DrawerDescription.vue +0 -20
  776. package/src/components/ui/drawer/DrawerFooter.vue +0 -14
  777. package/src/components/ui/drawer/DrawerHeader.vue +0 -14
  778. package/src/components/ui/drawer/DrawerOverlay.vue +0 -18
  779. package/src/components/ui/drawer/DrawerTitle.vue +0 -20
  780. package/src/components/ui/drawer/index.ts +0 -8
  781. package/src/components/ui/dropdown-menu/DropdownMenu.vue +0 -14
  782. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +0 -40
  783. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +0 -44
  784. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +0 -11
  785. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +0 -28
  786. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +0 -24
  787. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +0 -19
  788. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +0 -40
  789. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +0 -22
  790. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +0 -14
  791. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +0 -19
  792. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +0 -36
  793. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +0 -33
  794. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +0 -13
  795. package/src/components/ui/dropdown-menu/index.ts +0 -16
  796. package/src/components/ui/hover-card/HoverCard.vue +0 -14
  797. package/src/components/ui/hover-card/HoverCardContent.vue +0 -41
  798. package/src/components/ui/hover-card/HoverCardTrigger.vue +0 -11
  799. package/src/components/ui/hover-card/index.ts +0 -3
  800. package/src/components/ui/index.ts +0 -41
  801. package/src/components/ui/input/Input.vue +0 -24
  802. package/src/components/ui/input/index.ts +0 -1
  803. package/src/components/ui/label/Label.vue +0 -27
  804. package/src/components/ui/label/index.ts +0 -1
  805. package/src/components/ui/multi-select/MultiSelect.vue +0 -141
  806. package/src/components/ui/multi-select/index.ts +0 -7
  807. package/src/components/ui/notification/Notification.vue +0 -85
  808. package/src/components/ui/notification/index.ts +0 -1
  809. package/src/components/ui/number-field/NumberField.vue +0 -23
  810. package/src/components/ui/number-field/NumberFieldContent.vue +0 -14
  811. package/src/components/ui/number-field/NumberFieldDecrement.vue +0 -25
  812. package/src/components/ui/number-field/NumberFieldIncrement.vue +0 -25
  813. package/src/components/ui/number-field/NumberFieldInput.vue +0 -8
  814. package/src/components/ui/number-field/index.ts +0 -5
  815. package/src/components/ui/popover/Popover.vue +0 -15
  816. package/src/components/ui/popover/PopoverContent.vue +0 -61
  817. package/src/components/ui/popover/PopoverTrigger.vue +0 -11
  818. package/src/components/ui/popover/index.ts +0 -3
  819. package/src/components/ui/progress/Progress.vue +0 -39
  820. package/src/components/ui/progress/index.ts +0 -1
  821. package/src/components/ui/radio-group/RadioGroup.vue +0 -25
  822. package/src/components/ui/radio-group/RadioGroupItem.vue +0 -39
  823. package/src/components/ui/radio-group/index.ts +0 -2
  824. package/src/components/ui/scroll-area/ScrollArea.vue +0 -29
  825. package/src/components/ui/scroll-area/ScrollBar.vue +0 -30
  826. package/src/components/ui/scroll-area/index.ts +0 -2
  827. package/src/components/ui/scroll-pane/ScrollPane.vue +0 -25
  828. package/src/components/ui/scroll-pane/ScrollPaneHeader.vue +0 -75
  829. package/src/components/ui/scroll-pane/index.ts +0 -2
  830. package/src/components/ui/select/Select.vue +0 -15
  831. package/src/components/ui/select/SelectContent.vue +0 -57
  832. package/src/components/ui/select/SelectGroup.vue +0 -19
  833. package/src/components/ui/select/SelectItem.vue +0 -47
  834. package/src/components/ui/select/SelectItemText.vue +0 -11
  835. package/src/components/ui/select/SelectLabel.vue +0 -13
  836. package/src/components/ui/select/SelectScrollDownButton.vue +0 -24
  837. package/src/components/ui/select/SelectScrollUpButton.vue +0 -24
  838. package/src/components/ui/select/SelectSeparator.vue +0 -17
  839. package/src/components/ui/select/SelectTrigger.vue +0 -45
  840. package/src/components/ui/select/SelectValue.vue +0 -11
  841. package/src/components/ui/select/index.ts +0 -11
  842. package/src/components/ui/separator/Separator.vue +0 -35
  843. package/src/components/ui/separator/index.ts +0 -1
  844. package/src/components/ui/sheet/Sheet.vue +0 -14
  845. package/src/components/ui/sheet/SheetClose.vue +0 -11
  846. package/src/components/ui/sheet/SheetContent.vue +0 -56
  847. package/src/components/ui/sheet/SheetDescription.vue +0 -22
  848. package/src/components/ui/sheet/SheetFooter.vue +0 -19
  849. package/src/components/ui/sheet/SheetHeader.vue +0 -16
  850. package/src/components/ui/sheet/SheetTitle.vue +0 -22
  851. package/src/components/ui/sheet/SheetTrigger.vue +0 -11
  852. package/src/components/ui/sheet/index.ts +0 -31
  853. package/src/components/ui/skeleton/Skeleton.vue +0 -14
  854. package/src/components/ui/skeleton/index.ts +0 -1
  855. package/src/components/ui/slider/Slider.vue +0 -67
  856. package/src/components/ui/slider/index.ts +0 -1
  857. package/src/components/ui/switch/Switch.vue +0 -37
  858. package/src/components/ui/switch/index.ts +0 -1
  859. package/src/components/ui/table/Table.vue +0 -16
  860. package/src/components/ui/table/TableBody.vue +0 -14
  861. package/src/components/ui/table/TableCaption.vue +0 -14
  862. package/src/components/ui/table/TableCell.vue +0 -14
  863. package/src/components/ui/table/TableEmpty.vue +0 -39
  864. package/src/components/ui/table/TableFooter.vue +0 -16
  865. package/src/components/ui/table/TableHead.vue +0 -21
  866. package/src/components/ui/table/TableHeader.vue +0 -14
  867. package/src/components/ui/table/TableRow.vue +0 -21
  868. package/src/components/ui/table/index.ts +0 -9
  869. package/src/components/ui/tabs/Tabs.vue +0 -15
  870. package/src/components/ui/tabs/TabsContent.vue +0 -22
  871. package/src/components/ui/tabs/TabsIndicator.vue +0 -22
  872. package/src/components/ui/tabs/TabsList.vue +0 -25
  873. package/src/components/ui/tabs/TabsTrigger.vue +0 -29
  874. package/src/components/ui/tabs/index.ts +0 -5
  875. package/src/components/ui/tags-input/TagsInput.vue +0 -22
  876. package/src/components/ui/tags-input/TagsInputInput.vue +0 -19
  877. package/src/components/ui/tags-input/TagsInputItem.vue +0 -22
  878. package/src/components/ui/tags-input/TagsInputItemDelete.vue +0 -24
  879. package/src/components/ui/tags-input/TagsInputItemText.vue +0 -19
  880. package/src/components/ui/tags-input/index.ts +0 -5
  881. package/src/components/ui/textarea/Textarea.vue +0 -24
  882. package/src/components/ui/textarea/index.ts +0 -1
  883. package/src/components/ui/toast/Toast.vue +0 -57
  884. package/src/components/ui/toast/ToastAction.vue +0 -30
  885. package/src/components/ui/toast/ToastClose.vue +0 -31
  886. package/src/components/ui/toast/ToastDescription.vue +0 -25
  887. package/src/components/ui/toast/ToastTitle.vue +0 -25
  888. package/src/components/ui/toast/Toaster.vue +0 -31
  889. package/src/components/ui/toast/index.ts +0 -8
  890. package/src/components/ui/toast/use-toast.ts +0 -136
  891. package/src/components/ui/toggle/Toggle.vue +0 -35
  892. package/src/components/ui/toggle/index.ts +0 -27
  893. package/src/components/ui/toggle-group/ToggleGroup.vue +0 -34
  894. package/src/components/ui/toggle-group/ToggleGroupItem.vue +0 -35
  895. package/src/components/ui/toggle-group/index.ts +0 -2
  896. package/src/components/ui/tooltip/Tooltip.vue +0 -14
  897. package/src/components/ui/tooltip/TooltipContent.vue +0 -31
  898. package/src/components/ui/tooltip/TooltipProvider.vue +0 -11
  899. package/src/components/ui/tooltip/TooltipTrigger.vue +0 -11
  900. package/src/components/ui/tooltip/index.ts +0 -4
  901. package/src/composables/glass/index.ts +0 -8
  902. package/src/composables/glass/useGlassRenderer.ts +0 -252
  903. package/src/composables/glass/webgl/frostShader.ts +0 -221
  904. package/src/composables/glass/webgpu/glassShader.wgsl +0 -173
  905. package/src/composables/index.ts +0 -32
  906. package/src/composables/infinite-scroll/index.ts +0 -2
  907. package/src/composables/infinite-scroll/types.ts +0 -25
  908. package/src/composables/infinite-scroll/useInfiniteScroll.ts +0 -101
  909. package/src/composables/interaction/index.ts +0 -5
  910. package/src/composables/interaction/useHeightTransition.ts +0 -82
  911. package/src/composables/interaction/useHoverPopover.ts +0 -64
  912. package/src/composables/interaction/useHoverToggle.ts +0 -103
  913. package/src/composables/interaction/useLeaveTimer.ts +0 -17
  914. package/src/composables/interaction/useTouchGate.ts +0 -207
  915. package/src/composables/pagination/index.ts +0 -2
  916. package/src/composables/pagination/useOffsetPagination.ts +0 -70
  917. package/src/composables/prng.ts +0 -32
  918. package/src/composables/useCharSplit.ts +0 -31
  919. package/src/composables/useClipboard.ts +0 -46
  920. package/src/composables/useGlobalDark.ts +0 -61
  921. package/src/composables/useKeyboardShortcuts.ts +0 -205
  922. package/src/composables/useWatercolorBlob.ts +0 -136
  923. package/src/composables/virtual/index.ts +0 -22
  924. package/src/composables/virtual/useVirtualSectionWindow.ts +0 -338
  925. package/src/composables/virtual/useWindowedStore.ts +0 -86
  926. package/src/composables/virtual/virtualSectionLayout.ts +0 -212
  927. package/src/index.ts +0 -9
  928. package/src/styles/scroll-pane.css +0 -10
  929. package/src/utils/cn.ts +0 -6
  930. /package/{src/components/custom/confirm-dialog/index.ts → dist/components/custom/confirm-dialog/index.d.ts} +0 -0
  931. /package/{src/components/custom/controls/index.ts → dist/components/custom/controls/index.d.ts} +0 -0
  932. /package/{src/components/custom/expandable-container/index.ts → dist/components/custom/expandable-container/index.d.ts} +0 -0
  933. /package/{src/components/custom/icon-tooltip/index.ts → dist/components/custom/icon-tooltip/index.d.ts} +0 -0
  934. /package/{src/components/custom/infinite-scroll/composables/index.ts → dist/components/custom/infinite-scroll/composables/index.d.ts} +0 -0
  935. /package/{src/components/custom/infinite-scroll/index.ts → dist/components/custom/infinite-scroll/index.d.ts} +0 -0
  936. /package/{src/components/custom/search/composables/index.ts → dist/components/custom/search/composables/index.d.ts} +0 -0
  937. /package/{src/components/custom/search/index.ts → dist/components/custom/search/index.d.ts} +0 -0
  938. /package/{src/components/custom/tabs/index.ts → dist/components/custom/tabs/index.d.ts} +0 -0
  939. /package/{src/components/custom/typewriter/composables/index.ts → dist/components/custom/typewriter/composables/index.d.ts} +0 -0
  940. /package/{src/components/custom/typewriter/index.ts → dist/components/custom/typewriter/index.d.ts} +0 -0
  941. /package/{src/components/ui/data-table/index.ts → dist/components/ui/data-table/index.d.ts} +0 -0
  942. /package/{src/utils/index.ts → dist/utils/index.d.ts} +0 -0
@@ -1,11 +1,49 @@
1
1
  /*
2
2
  * tokens.css — Unified design tokens for @mkbabb/glass-ui
3
3
  *
4
- * Shared structural tokens used by all consumer projects.
5
- * Project-specific colors/fonts are overridden in each consumer's local CSS.
4
+ * Library default identity: warm-cream + muted-black, 13-stop per-section jewel
5
+ * palette, viz-basis colors (Fourier red / Chebyshev blue / Legendre purple),
6
+ * cartoon offset shadows, 0.625rem base radius, paper-and-glass forward.
7
+ *
8
+ * Structural tokens (durations, easings, springs, z-index, focus ring,
9
+ * interactive scales) are stable across consumers. Visual tokens (colors,
10
+ * shadows, radii, grain opacities) are consumer-overridable.
6
11
  */
7
12
 
8
13
  :root {
14
+ /* ═══════════════════════════════════════════════
15
+ §0 THEME BRIDGE FALLBACKS
16
+
17
+ theme.css uses these non-Tailwind names to register v4 utility
18
+ namespaces without self-referential @theme variables. The public
19
+ runtime tokens remain --font-*, --leading-*, and --tracking-* in
20
+ typography.css.
21
+ ═══════════════════════════════════════════════ */
22
+ --font-stack-display: "Fraunces", Georgia, serif;
23
+ --font-stack-serif: "Computer Modern Serif", "Latin Modern Roman", "CMU Serif", Georgia, serif;
24
+ --font-stack-sans: "Helvetica Neue", "Arial Nova", Arial, system-ui, sans-serif;
25
+ /* AC.W6b (v1.5.0) — self-hosted Fira Code engages by default for
26
+ every glass-ui consumer. The calibrated "Fira Code Fallback"
27
+ face (declared in typography.css) wraps the system mono stack
28
+ with metric overrides so the `font-display: swap` window is
29
+ geometry-neutral. */
30
+ --font-stack-mono: "Fira Code", "Fira Code Fallback", "Fira Mono", monospace;
31
+
32
+ --type-leading-micro: 1.2;
33
+ --type-leading-caption: 1.3;
34
+ --type-leading-small: 1.4;
35
+ --type-leading-body: 1.5;
36
+ --type-leading-prose: 1.618;
37
+ --type-leading-heading: 1.2;
38
+ --type-leading-display: 1.1;
39
+
40
+ --type-tracking-tight: -0.025em;
41
+ --type-tracking-snug: -0.01em;
42
+ --type-tracking-normal: 0;
43
+ --type-tracking-wide: 0.025em;
44
+ --type-tracking-wider: 0.05em;
45
+ --type-tracking-caps: 0.1em;
46
+
9
47
  /* ═══════════════════════════════════════════════
10
48
  §1 DURATION
11
49
  ═══════════════════════════════════════════════ */
@@ -16,55 +54,287 @@
16
54
  --duration-panel: 0.55s;
17
55
  --duration-xl: 1s;
18
56
  --duration-xxl: 1.5s;
19
- --duration-linger: 2.5s;
57
+ --duration-shimmer-fast: 3s;
58
+ --duration-shimmer: 5s;
59
+ /* Sparkle micro-event — primary-CTA disco-grain sparkle sweep, success
60
+ affirmations. R5 vocab.γ gap row 3 (single-site at dock.css:735 today,
61
+ reserved for J.W2.7 §17 audacious-CTA buildout). */
62
+ --duration-sparkle: 600ms;
63
+
64
+ /* AH.W5-e (FA-8 §4d) — motion-duration + staged-reveal canon.
65
+
66
+ Six duration tokens + three delay tokens promoted from raw literals
67
+ at speedtest's celebratory-reveal SFCs (SpeedtestResults, ThankYou,
68
+ ResultStack, CompleteBadge). Unified under the `--motion-*`
69
+ namespace (parallel to `--motion-ease-*`) so all motion tokens
70
+ cluster at one canon — duration + easing arm together. */
71
+
72
+ /* Staged-entrance pairing — opacity + transform Vue <Transition> arms
73
+ in the celebratory headline + result-row reveals. Partners with
74
+ `--motion-ease-staged-entrance` / `--motion-ease-overshoot`. */
75
+ --motion-duration-staged: 320ms;
76
+
77
+ /* One-shot celebratory shimmer — gold-headline shimmer animation
78
+ duration + staging delay. Shared canon so the speedtest results
79
+ headline and the thank-you headline stay in lockstep. */
80
+ --motion-duration-complete-shimmer: 2.4s;
81
+ --motion-delay-complete-shimmer: 220ms;
82
+ /* AJ.W2-ζ canon checkpoint — the gold-headline shimmer at
83
+ CompleteHeadline + ThankYou reads these two tokens under a
84
+ one-shot CSS animation. The gradient (background-size: 240% 100%
85
+ with --color-gold-light at 46%), the @keyframes
86
+ (gold-headline-shimmer: background-position 120% 0 → -120% 0),
87
+ and the animation declaration are mutually consistent: at 2.4s
88
+ duration + 220ms delay the bright band traverses the headline
89
+ glyphs cleanly. A regression that drops either token to 0ms /
90
+ unset / 0 would silently collapse the celebratory shimmer to an
91
+ imperceptible blow-through (live regression P1-12 surfaced this
92
+ risk; investigation closed at the publisher as a verify — both
93
+ values resolve correctly today). These two values are LOAD-
94
+ BEARING. Do not retire / zero / un-publish without an explicit
95
+ decision + companion consumer-side migration at speedtest's
96
+ CompleteHeadline.vue + ThankYou.vue. */
97
+
98
+ /* CompleteBadge staged-reveal cluster — the disc / ring / check curve
99
+ fires at three asymmetric durations + delays per the A4-AF staged-
100
+ variety design intent. Promoting the magic numbers makes the
101
+ staged-variety visible at the canon. */
102
+ --motion-duration-badge-disc: 420ms;
103
+ --motion-duration-badge-ring: 560ms;
104
+ --motion-duration-badge-check: 380ms;
105
+ --motion-delay-badge-disc: 80ms;
106
+ --motion-delay-badge-ring: 220ms;
107
+ --motion-delay-badge-check: 460ms;
108
+
109
+ /* AJ-W4-κ — staggered-reveal increment canon (per A5 §8.9). Promotes
110
+ the scattered per-consumer constants
111
+ (`STATS_CARD_STAGGER_MS = 40` in MetricGaugeCards,
112
+ `BAR_STAGGER_MS = 80` in DistributionChart,
113
+ `SERIES_STAGGER_MS = 120` in TimeSeriesChart,
114
+ `useStagger` default 80ms) to one shared canon so a per-row /
115
+ per-cell / per-bar cascade across consumer surfaces reads at one
116
+ of three named tiers.
117
+
118
+ The three tiers are perceptually distinct registers:
119
+ • tight (40ms) — dense row cascades where the gap between
120
+ consecutive reveals should be sub-perceptual (StatsCards row
121
+ strip, results-table rows under their `:nth-child(N+1)` delays)
122
+ • default (80ms) — the canonical row-stagger rhythm (the
123
+ speedtest ResultStack row-tint sweep, the DistributionChart
124
+ bar entrance — both already at 80ms). Aliased as `default`
125
+ to match `useStagger`'s built-in fallback so consumers
126
+ omitting `delayMs` resolve to the same token.
127
+ • relaxed (120ms) — wider cascades where each reveal carries
128
+ its own attention budget (TimeSeriesChart series entrance)
129
+
130
+ The FD2 §6 rule-1 "shared period multiple" canon for ambient
131
+ cycles extends here to staggers: at 40/80/120ms, the default
132
+ (80ms) is the LCM of tight (40) AND a 2/3 of relaxed (120)
133
+ — a tight cascade beating against a default cascade syncs on
134
+ every-other-reveal, and a default cascade against a relaxed
135
+ cascade syncs on every-three-reveals. Consumers that nest
136
+ multiple cascades on adjacent surfaces should pick adjacent
137
+ tiers so the cross-beats stay quiet.
138
+
139
+ Consumers can read these tokens directly from inline-style
140
+ calc() expressions (`animation-delay: calc(var(--motion-stagger-default) * var(--row-index))`)
141
+ or via JS by resolving the CSS custom property at runtime
142
+ (`getComputedStyle(document.documentElement).getPropertyValue('--motion-stagger-default')`).
143
+ The latter shape collapses the speedtest TS-side constants
144
+ (SERIES_STAGGER_MS, BAR_STAGGER_MS, STATS_CARD_STAGGER_MS) into
145
+ single-source token reads. */
146
+ --motion-stagger-tight: 40ms;
147
+ --motion-stagger-default: 80ms;
148
+ --motion-stagger-relaxed: 120ms;
20
149
 
21
150
  /* ═══════════════════════════════════════════════
22
151
  §2 EASING — Spring curves via linear()
23
- ═══════════════════════════════════════════════
24
152
 
25
- Generated from damped spring physics:
26
- x(t) = 1 - e^(-ζωt)(cos(ωd·t) + (ζ/√(1-ζ²))sin(ωd·t))
153
+ Generated from `scripts/regen-spring-tokens.mjs` — DO NOT hand-edit.
154
+ To tune a spring: edit the PRESETS table in the script and re-run
155
+ `node scripts/regen-spring-tokens.mjs`. The script invokes
156
+ `springLinearStops()` from `@mkbabb/keyframes.js` which solves the
157
+ analytic second-order damped harmonic oscillator and emits CSS
158
+ `linear()` stops; this is the single source of truth tying each
159
+ (response, ζ) pair to its serialized curve.
160
+
161
+ iOS-canonical (response, dampingFraction) per AL-X4 §3:
162
+ smooth: (0.50s, ζ=0.86) — gentle settle, sub-perceptual overshoot ~0.5%
163
+ snappy: (0.35s, ζ=0.85) — quick crisp, micro-overshoot
164
+ bouncy: (0.50s, ζ=0.65) — emphatic overshoot ~7%
165
+ gentle: (0.70s, ζ=1.00) — patient critically-damped
166
+
167
+ Note on `smooth`: at ζ=0.86 the analytic solver produces a peak
168
+ of 1.00498 (+0.5%) at the 24% slot — mathematically present but
169
+ sub-perceptual. I keep ζ=0.86 rather than promoting to ζ=1.0
170
+ because true critical damping is `gentle`'s register, and
171
+ `smooth` wants a slightly faster visual settle than `gentle`'s
172
+ patient curve. The 0.5% peak does not read as overshoot to the
173
+ eye but does narrowly distinguish `smooth` from `gentle`.
174
+ ═══════════════════════════════════════════════ */
175
+ --spring-smooth: linear(0, 0.09804 2.041%, 0.29288 4.082%, 0.49447 6.122%, 0.66436 8.163%, 0.79208 10.204%, 0.88050 12.245%, 0.93754 14.286%, 0.97182 16.327%, 0.99083 18.367%, 1.00027 20.408%, 1.00413 22.449%, 1.00502 24.490%, 1.00453 26.531%, 1.00355 28.571%, 1.00254 30.612%, 1.00169 32.653%, 1.00105 34.694%, 1.00060 36.735%, 1.00031 38.776%, 1.00014 40.816%, 1.00005 42.857%, 1.00000 44.898%, 1.00000 46.939%, 1.00000 48.980%, 1.00000 51.020%, 1.00000 53.061%, 1.00000 55.102%, 1.00000 57.143%, 1.00000 59.184%, 1.00000 61.224%, 1.00000 63.265%, 1.00000 65.306%, 1.00000 67.347%, 1.00000 69.388%, 1.00000 71.429%, 1.00000 73.469%, 1.00000 75.510%, 1.00000 77.551%, 1.00000 79.592%, 1.00000 81.633%, 1.00000 83.673%, 1.00000 85.714%, 1.00000 87.755%, 1.00000 89.796%, 1.00000 91.837%, 1.00000 93.878%, 1.00000 95.918%, 1.00000 97.959%, 1);
176
+ --spring-snappy: linear(0, 0.10438 2.041%, 0.32622 4.082%, 0.56668 6.122%, 0.77153 8.163%, 0.91961 10.204%, 1.01073 12.245%, 1.05549 14.286%, 1.06804 16.327%, 1.06171 18.367%, 1.04686 20.408%, 1.03044 22.449%, 1.01629 24.490%, 1.00596 26.531%, 0.99954 28.571%, 0.99633 30.612%, 0.99537 32.653%, 0.99575 34.694%, 0.99674 36.735%, 0.99786 38.776%, 0.99884 40.816%, 0.99956 42.857%, 1.00001 44.898%, 1.00024 46.939%, 1.00000 48.980%, 1.00000 51.020%, 1.00000 53.061%, 1.00000 55.102%, 1.00000 57.143%, 1.00000 59.184%, 1.00000 61.224%, 1.00000 63.265%, 1.00000 65.306%, 1.00000 67.347%, 1.00000 69.388%, 1.00000 71.429%, 1.00000 73.469%, 1.00000 75.510%, 1.00000 77.551%, 1.00000 79.592%, 1.00000 81.633%, 1.00000 83.673%, 1.00000 85.714%, 1.00000 87.755%, 1.00000 89.796%, 1.00000 91.837%, 1.00000 93.878%, 1.00000 95.918%, 1.00000 97.959%, 1);
177
+ --spring-bouncy: linear(0, 0.11105 2.041%, 0.36430 4.082%, 0.65496 6.122%, 0.90929 8.163%, 1.08828 10.204%, 1.18289 12.245%, 1.20482 14.286%, 1.17641 16.327%, 1.12214 18.367%, 1.06276 20.408%, 1.01239 22.449%, 0.97809 24.490%, 0.96099 26.531%, 0.95826 28.571%, 0.96514 30.612%, 0.97666 32.653%, 0.98873 34.694%, 0.99867 36.735%, 1.00520 38.776%, 1.00825 40.816%, 1.00847 42.857%, 1.00686 44.898%, 1.00443 46.939%, 1.00199 48.980%, 1.00004 51.020%, 0.99880 53.061%, 0.99827 55.102%, 0.99829 57.143%, 0.99866 59.184%, 0.99916 61.224%, 0.99966 63.265%, 1.00004 65.306%, 1.00027 67.347%, 1.00000 69.388%, 1.00000 71.429%, 1.00000 73.469%, 1.00000 75.510%, 1.00000 77.551%, 1.00000 79.592%, 1.00000 81.633%, 1.00000 83.673%, 1.00000 85.714%, 1.00000 87.755%, 1.00000 89.796%, 1.00000 91.837%, 1.00000 93.878%, 1.00000 95.918%, 1.00000 97.959%, 1);
178
+ --spring-gentle: linear(0, 0.09415 2.041%, 0.27374 4.082%, 0.45506 6.122%, 0.60779 8.163%, 0.72570 10.204%, 0.81213 12.245%, 0.87336 14.286%, 0.91570 16.327%, 0.94445 18.367%, 0.96371 20.408%, 0.97645 22.449%, 0.98481 24.490%, 0.99025 26.531%, 0.99377 28.571%, 0.99604 30.612%, 0.99749 32.653%, 0.99841 34.694%, 0.99900 36.735%, 0.99937 38.776%, 0.99961 40.816%, 0.99975 42.857%, 0.99985 44.898%, 1.00000 46.939%, 1.00000 48.980%, 1.00000 51.020%, 1.00000 53.061%, 1.00000 55.102%, 1.00000 57.143%, 1.00000 59.184%, 1.00000 61.224%, 1.00000 63.265%, 1.00000 65.306%, 1.00000 67.347%, 1.00000 69.388%, 1.00000 71.429%, 1.00000 73.469%, 1.00000 75.510%, 1.00000 77.551%, 1.00000 79.592%, 1.00000 81.633%, 1.00000 83.673%, 1.00000 85.714%, 1.00000 87.755%, 1.00000 89.796%, 1.00000 91.837%, 1.00000 93.878%, 1.00000 95.918%, 1.00000 97.959%, 1);
179
+
180
+ /* Core cubic-bezier (exits, fallbacks, non-spring uses) */
181
+ --motion-ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
182
+ --motion-ease-out: cubic-bezier(0, 0, 0.2, 1);
183
+ --motion-ease-in: cubic-bezier(0.4, 0, 1, 1);
184
+ --motion-ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
27
185
 
28
- smooth: ζ=1.0 — critically damped, no overshoot
29
- snappy: ζ=0.65 — 7% overshoot, quick settle
30
- bouncy: ζ=0.45 — 20% overshoot, visible bounce-settle
31
- gentle: ζ=0.85 — barely perceptible overshoot, slow ease
32
- */
186
+ --ease-standard: var(--motion-ease-standard);
187
+ --ease-out: var(--motion-ease-out);
188
+ --ease-in: var(--motion-ease-in);
189
+ --ease-out-expo: var(--motion-ease-out-expo);
33
190
 
34
- /* Spring curves (primary use for entrances) */
35
- --spring-smooth: linear(0, 0.0974, 0.2816, 0.4656, 0.6189, 0.7361, 0.821, 0.8806, 0.9213, 0.9487, 0.9668, 0.9787, 0.9864, 0.9914, 0.9945, 0.9966, 0.9978, 0.9987, 0.9992, 0.9995, 0.9997, 0.9998, 0.9999, 0.9999, 1);
36
- --spring-snappy: linear(0, 0.0727, 0.2386, 0.4363, 0.6262, 0.7861, 0.9075, 0.9902, 1.0395, 1.0628, 1.068, 1.0619, 1.0501, 1.0366, 1.0239, 1.0133, 1.0054, 1.0001, 0.997, 0.9956, 0.9954, 0.9959, 0.9967, 0.9976, 0.9985, 0.9992, 0.9997, 1, 1.0002, 1.0003, 1.0003);
37
- --spring-bouncy: linear(0, 0.0492, 0.1748, 0.3455, 0.5335, 0.7169, 0.8796, 1.0117, 1.1087, 1.1706, 1.2005, 1.2039, 1.1874, 1.1575, 1.1206, 1.0818, 1.0454, 1.0141, 0.9895, 0.9723, 0.962, 0.958, 0.959, 0.9635, 0.9703, 0.9781, 0.986, 0.9931, 0.9991, 1.0036, 1.0066, 1.0082, 1.0087, 1.0082, 1.007, 1.0055, 1.0039, 1.0023, 1.0009);
38
- --spring-gentle: linear(0, 0.1018, 0.3031, 0.5094, 0.6812, 0.8083, 0.8945, 0.9486, 0.98, 0.9964, 1.0038, 1.0061, 1.006, 1.0049, 1.0036, 1.0024, 1.0015, 1.0008, 1.0004, 1.0002, 1.0001, 1, 1, 1, 1);
191
+ /* Apple-inspired micro-interactions, switches, dock hover */
192
+ --motion-ease-apple: cubic-bezier(0.25, 0.1, 0.25, 1);
193
+ --motion-ease-apple-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
39
194
 
40
- /* Core cubic-bezier (for exits, fallback, non-spring uses) */
41
- --ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
42
- --ease-out: cubic-bezier(0, 0, 0.2, 1);
43
- --ease-in: cubic-bezier(0.4, 0, 1, 1);
44
- --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
195
+ --ease-apple: var(--motion-ease-apple);
196
+ --ease-apple-spring: var(--motion-ease-apple-spring);
197
+ --ease-spring: var(--spring-snappy);
198
+ --ease-decelerate: var(--ease-out);
199
+ --ease-accelerate: var(--ease-in);
200
+
201
+ /* ═══════════════════════════════════════════════
202
+ §2.A AMBIENT MOTION — Pulse aura tokens (AB.W3.T1)
203
+
204
+ Parameterise the breathing rhythm for `<Pulse variant="aura">`
205
+ so consumers don't re-author the cycle per site. The 6s
206
+ duration is the canon ambient-pulse rate (matches the dial's
207
+ idle breathing). Scale 1.0 ↔ 1.15 reads as a quiet halo at
208
+ intensity="normal"; the Pulse component remaps min/max from
209
+ its `intensity` prop ('subtle' = 1.06; 'vivid' = 1.22).
210
+
211
+ Opacity min/max scope is `--pulse-aura-opacity-{min,max}` —
212
+ the aura ALWAYS keeps a visible halo (min 0.55) so the colour
213
+ stays read at the trough; the peak goes to 0.95 so the breath
214
+ reads as a soft swell, not a fade-in-fade-out.
215
+
216
+ Reduced motion: Pulse.vue's scoped @media bracket forces
217
+ `animation: none` and parks at the min stop. Depth + colour
218
+ remain visible; the breath cycle disables.
219
+ ═══════════════════════════════════════════════ */
220
+ --animate-ambient-pulse-duration: 6s;
221
+ --animate-ambient-pulse-scale-min: 1.0;
222
+ --animate-ambient-pulse-scale-max: 1.15;
223
+ --animate-ambient-pulse-easing: var(--ease-apple);
224
+
225
+ /* Aura opacity range — keep the trough visible (the colour reads
226
+ at every phase of the cycle). Consumers may override per site
227
+ (e.g. the completion one-shot uses min=0 to fade out). */
228
+ --pulse-aura-opacity-min: 0.55;
229
+ --pulse-aura-opacity-max: 0.95;
230
+
231
+ /* ═══════════════════════════════════════════════
232
+ §2.B SECTIONED PROGRESS — phase-bus rail (AB.W3.T2)
233
+
234
+ The sectioned `<Progress variant="sectioned">` exposes one
235
+ height knob + one track tint knob. Defaults size the rail at
236
+ 0.875rem (14px) — the W3 spec minimum (≥ 14px mobile, ≥ 18px
237
+ desktop). Consumers override the height per breakpoint via the
238
+ same token name on the consumer-side surface.
239
+
240
+ The bar reads as a recessed glass channel: inner top
241
+ catch-light + lower inner shadow + small outer drop. The
242
+ depth lives entirely in the Progress.vue scoped block; this
243
+ token only parameterises the rail BACKGROUND and HEIGHT —
244
+ depth shadows compose from the existing --shadow-color rung.
245
+ ═══════════════════════════════════════════════ */
246
+ --progress-sectioned-height: 0.875rem;
247
+ --progress-sectioned-track: var(--secondary);
248
+
249
+ /* ═══════════════════════════════════════════════
250
+ §2.C ANIMATION EXPRESSIVENESS — AI.W4 grammar
251
+ (publisher-side; consumer-side companions live in speedtest)
252
+
253
+ Three idiom families compose the W4 wave:
254
+
255
+ • Progress lifecycle (M.1) — the under-meter / survey progress bar
256
+ rides an intake pulse on rising-edge, a crescendo brightening at
257
+ ≥85%, and a one-shot discharge flash at 100%. The crescendo is a
258
+ typed CSS variable (`@property --progress-crescendo`) so the
259
+ indicator's leading-edge gradient stop interpolates smoothly.
260
+
261
+ • Chassis phase-tint companion (M.1) — the `--phase-color` cross-
262
+ fade established by the chassis cascade gains an amount companion
263
+ (`@property --phase-tint-amount`) so the chassis backdrop "warms
264
+ toward" the active phase. Both typed vars interpolate together
265
+ across the speedtest-owned `--motion-duration-phase-handoff`
266
+ window; the chassis reads the consumer-tuned clock with a safe
267
+ 600ms default so a non-speedtest consumer still gets the cross-
268
+ fade shape.
269
+
270
+ • Audacious button press-ripple (M.2 Q5 — ratified G-AI-D27) — the
271
+ `btn-audacious` utility gains an in-place `@property --ripple-
272
+ radius` ripple emanating from the pressed surface. Single typed
273
+ length, ramps 0 → max over the ripple duration, retires on
274
+ release. Q3 (needle micro-jitter) + Q4 (DockLayerGroup sympath-
275
+ etic motion) were pruned at G-AI-D27 — no tokens reserved.
276
+
277
+ All three families coexist with the existing `--motion-*` /
278
+ `--phase-*` cluster. Speedtest re-uses these tokens at the existing
279
+ --motion-duration-phase-handoff (consumer-side, 600ms). PRM brackets
280
+ live alongside each consumer rule. */
281
+
282
+ /* Progress lifecycle — typed crescendo + segment-local durations */
283
+ --motion-duration-progress-intake: 220ms; /* rising-edge pulse */
284
+ --motion-duration-progress-crescendo: 240ms; /* leading-edge brighten */
285
+ --motion-duration-progress-indeterminate: 4s; /* indeterminate sweep period */
286
+
287
+ /* Chassis depth-of-tint peak — the amount `--phase-tint-amount`
288
+ interpolates toward when a phase is active. Subtle by intent;
289
+ a 6% color-mix reads as "warmth toward the phase" without
290
+ overwhelming the chassis chrome's resting register. */
291
+ --phase-tint-peak: 6%;
292
+
293
+ /* Audacious button press-ripple — geometry + duration. The ripple
294
+ radius caps at 12rem so an oversized button doesn't paint a
295
+ transparent halo beyond its bounds (the parent's `overflow:
296
+ hidden` clips the visible region; the cap keeps the gradient
297
+ falloff well-defined). */
298
+ --ripple-radius-max: 12rem;
299
+ --motion-duration-ripple: 340ms;
300
+
301
+ /* Skeleton breath variant — the M.3 "known-imminent" loading
302
+ register. 6s cycle (the canon ambient rate) so a known-imminent
303
+ skeleton breathes in lockstep with the dial and the Pulse aura.
304
+ Coexists with the 1.5s shimmer (sliding gradient) and the
305
+ Tailwind animate-pulse (2s, short-wait) variants — distinct
306
+ temporal registers per use-case. */
307
+ --skeleton-breath-duration: 6s;
45
308
 
46
309
  /* ═══════════════════════════════════════════════
47
310
  §3 Z-INDEX SCALE
48
311
  ═══════════════════════════════════════════════ */
312
+ /* V.W2 T12 — Aurora background tier (sits behind --z-background).
313
+ Consumed by `<Aurora>` in speedtest's App.vue (`-z-10` literal today). */
314
+ --z-behind: -10;
49
315
  --z-background: 0;
50
316
  --z-content: 10;
51
317
  --z-controls: 20;
52
318
  --z-bar: 30;
319
+ --z-header: 35;
53
320
  --z-dock: 40;
321
+ --z-panel: 45;
54
322
  --z-overlay: 50;
55
- --z-hovercard: 60;
56
- --z-popover: 70;
57
- --z-modal: 80;
58
- --z-fullscreen: 90;
59
- --z-toast: 100;
323
+ --z-hovercard: 120;
324
+ --z-tooltip: 120;
325
+ --z-popover: 130;
326
+ --z-modal: 140;
327
+ --z-fullscreen: 150;
328
+ --z-toast: 160;
60
329
  --z-toggle: 999;
61
330
  --z-max: 9999;
62
331
  --z-debug: 99999;
63
332
 
64
333
  /* ═══════════════════════════════════════════════
65
- §4 BORDER RADIUS
334
+ §4 BORDER RADIUS — 0.625rem base (warm-cream identity)
66
335
  ═══════════════════════════════════════════════ */
67
- --radius: 0.5rem;
336
+ --radius: 0.625rem;
337
+ --radius-xs: 4px;
68
338
  --radius-sm: 4px;
69
339
  --radius-md: 6px;
70
340
  --radius-lg: var(--radius);
@@ -73,19 +343,172 @@
73
343
  --radius-pill: 9999px;
74
344
 
75
345
  /* Semantic aliases */
76
- --radius-card: var(--radius-2xl);
77
- --radius-panel: var(--radius-xl);
346
+ --radius-card: var(--radius-2xl);
347
+ --radius-panel: var(--radius-xl);
78
348
  --radius-dialog: var(--radius-2xl);
79
- --radius-input: var(--radius);
349
+ --radius-input: var(--radius);
80
350
  --radius-button: var(--radius);
81
- --radius-badge: var(--radius-pill);
82
- --radius-dock: var(--radius-pill);
351
+ --radius-badge: var(--radius-pill);
352
+ --radius-dock: var(--radius-pill);
353
+ /* Tooltip alias — semantic handle for the lg rung; consumed by W2 ui/tooltip
354
+ migration (currently inline `rounded-lg`). R5 vocab.γ gap row 5. */
355
+ --radius-tooltip: var(--radius-lg);
83
356
 
84
357
  /* ═══════════════════════════════════════════════
85
- §5 BOX SHADOWS
86
- Projects define --shadow-color in their preset.
358
+ §5 COLOR PALETTE — Warm cream / muted black
359
+
360
+ Neutral scale: perceptually-uniform L* steps at hue 48 (warm paper).
361
+ Each pair visibly distinct at 20px viewing distance.
362
+ 0 → 1 : 3 L (page → soft field)
363
+ 1 → 2 : 5 L (soft field → chip / tab-inactive)
364
+ 2 → 3 : 8 L (chip → hover / highlight)
365
+ 3 → 4 : 12 L (highlight → subtle border)
366
+ 4 → 5 : 25 L (border → muted text, contrast jump)
367
+ 5 → 6 : 10 L (muted text → strong-muted text, secondary register)
368
+
369
+ Semantic aliases re-point into the scale — no back-compat shims.
87
370
  ═══════════════════════════════════════════════ */
88
- --shadow-color: hsl(0 0% 0%);
371
+ --neutral-0: hsl(48 12% 98%); /* L 98 — page surface */
372
+ --neutral-1: hsl(48 10% 95%); /* L 95 — soft field bg */
373
+ --neutral-2: hsl(48 9% 90%); /* L 90 — chip / tab-inactive bg */
374
+ --neutral-3: hsl(48 8% 82%); /* L 82 — hover / highlight bg */
375
+ --neutral-4: hsl(48 7% 70%); /* L 70 — subtle border */
376
+ --neutral-5: hsl(48 6% 40%); /* L 40 — muted text (WCAG AA: 5.23:1 vs L98 page / 4.91:1 vs L95 muted) */
377
+ /* W7-α' (AK-FD1) — strong-muted text rung. One principled ladder step
378
+ (10 L darker, the 5→6 cadence above) past muted text toward
379
+ --foreground (L10). Sits at the 1/3 point of the L40→L10 muted→primary
380
+ gap: legible secondary text that reads less-faint than muted but not as
381
+ assertive as primary. By-COLOUR per the canon (a neutral step, not an
382
+ alpha mute); hue held at 48, sat nudged 6→7 toward --foreground's 10.
383
+ WCAG AA: 7.79:1 vs L98 page / 7.31:1 vs L95 muted (cf. neutral-5's
384
+ 5.23:1) — comfortably above the 4.5:1 body floor. */
385
+ --neutral-6: hsl(48 7% 30%); /* L 30 — strong-muted text (secondary register) */
386
+
387
+ --background: var(--neutral-0);
388
+ --foreground: hsl(24 10% 10%);
389
+ --card: var(--neutral-0);
390
+ --card-foreground: var(--foreground);
391
+ --popover: var(--neutral-0);
392
+ --popover-foreground: var(--foreground);
393
+
394
+ --muted: var(--neutral-1);
395
+ --muted-foreground: var(--neutral-5);
396
+ /* W7-α' (AK-FD1) — one rung less-faint than --muted-foreground for
397
+ secondary text that reads too-faint at the muted rung over resting
398
+ glass (CardDescription). By-colour neutral step, not alpha. */
399
+ --muted-foreground-strong: var(--neutral-6);
400
+ --secondary: var(--neutral-2);
401
+ --secondary-foreground: var(--foreground);
402
+ --accent: var(--neutral-3);
403
+ --accent-foreground: var(--foreground);
404
+
405
+ --border: var(--neutral-4);
406
+ --input: var(--neutral-4);
407
+
408
+ --primary: hsl(24 10% 10%);
409
+ --primary-foreground: var(--neutral-0);
410
+ --destructive: hsl(0 72% 50%);
411
+ --destructive-foreground: var(--neutral-0);
412
+ --ring: hsl(24 10% 10%);
413
+ --shadow: hsl(24 10% 10%);
414
+ --shadow-color: var(--foreground);
415
+
416
+ /* Foreground-tint rungs — canonical handles for the 36+ raw
417
+ `color-mix(in srgb, var(--foreground) N%, transparent)` sites surveyed
418
+ in R5 axis-1. Each rung's α is named in its key (4 → 4%, 22 → 22%).
419
+ Auto-dark via --foreground; no explicit dark mirrors needed. R5
420
+ vocab.γ gap row 1. Consumers land in W2.B + W3.C. */
421
+ --surface-tint-4: color-mix(in srgb, var(--foreground) 4%, transparent);
422
+ --surface-tint-6: color-mix(in srgb, var(--foreground) 6%, transparent);
423
+ --surface-tint-8: color-mix(in srgb, var(--foreground) 8%, transparent);
424
+ --surface-tint-10: color-mix(in srgb, var(--foreground) 10%, transparent);
425
+ --surface-tint-12: color-mix(in srgb, var(--foreground) 12%, transparent);
426
+ --surface-tint-15: color-mix(in srgb, var(--foreground) 15%, transparent);
427
+ --surface-tint-18: color-mix(in srgb, var(--foreground) 18%, transparent);
428
+ --surface-tint-22: color-mix(in srgb, var(--foreground) 22%, transparent);
429
+ --surface-tint-25: color-mix(in srgb, var(--foreground) 25%, transparent);
430
+ /* Higher-α rungs added at L.W5 (absorbs K R4 — 4 P1 sites whose
431
+ literal `color-mix(in srgb, var(--foreground) {35,40,70}%, transparent)`
432
+ expressions bypassed the canonical token family). See `docs/tranches/L/
433
+ audit/W5-A-doc-cohort-proof.md`. */
434
+ --surface-tint-35: color-mix(in srgb, var(--foreground) 35%, transparent);
435
+ --surface-tint-40: color-mix(in srgb, var(--foreground) 40%, transparent);
436
+ --surface-tint-70: color-mix(in srgb, var(--foreground) 70%, transparent);
437
+
438
+ /* Muted-tinted surface rungs — canonical handles for the 9 raw
439
+ `color-mix(in srgb, var(--muted) N%, transparent)` sites in
440
+ FuzzySearch / BouncyToggle / Slider scoped CSS. (AI.W5-δ — the
441
+ ProgressiveSidebar consumer retired at the wave; the canonical token
442
+ rung lives on for the remaining consumers.) Auto-dark via --muted.
443
+ R5 vocab.γ axis-1 row. */
444
+ --muted-soft: color-mix(in srgb, var(--muted) 30%, transparent);
445
+ --muted-medium: color-mix(in srgb, var(--muted) 50%, transparent);
446
+
447
+ /* ═══════════════════════════════════════════════
448
+ §6 SECTION PALETTE — 13-stop jewel tones (light)
449
+ ═══════════════════════════════════════════════ */
450
+ --section-color-0: hsl(334 63% 47%); /* rose */
451
+ --section-color-1: hsl(272 44% 47%); /* purple */
452
+ --section-color-2: hsl(224 58% 46%); /* indigo */
453
+ --section-color-3: hsl(194 62% 36%); /* teal-cyan */
454
+ --section-color-4: hsl(163 46% 35%); /* forest */
455
+ --section-color-5: hsl(35 70% 42%); /* amber */
456
+ --section-color-6: hsl(6 72% 49%); /* tomato-red */
457
+ --section-color-7: hsl(286 46% 47%); /* violet */
458
+ --section-color-8: hsl(342 62% 44%); /* ruby */
459
+ --section-color-9: hsl(205 20% 38%); /* slate-blue */
460
+ --section-color-10: hsl(86 38% 36%); /* olive */
461
+ --section-color-11: hsl(187 58% 39%); /* ocean */
462
+ --section-color-12: hsl(256 44% 52%); /* periwinkle */
463
+
464
+ /* Accent colors */
465
+ --accent-pink: hsl(330 65% 55%);
466
+ --section-heading: hsl(328 60% 46%);
467
+ --accent-red: hsl(0 72% 50%);
468
+
469
+ /* ═══════════════════════════════════════════════
470
+ §6b VIZ BASIS — core brand hues
471
+ ═══════════════════════════════════════════════ */
472
+ --viz-fourier: hsl(6 72% 49%);
473
+ --viz-chebyshev: hsl(224 58% 46%);
474
+ --viz-legendre: hsl(286 46% 47%);
475
+ --viz-amber: var(--section-color-5);
476
+ --viz-green: var(--section-color-4);
477
+
478
+ /* Semantic UI accents */
479
+ --tier-featured: hsl(45 100% 50%);
480
+ --tier-saved: hsl(210 100% 60%);
481
+ --like: hsl(0 80% 60%);
482
+ --success: hsl(142 71% 45%);
483
+ --warning: hsl(38 92% 50%);
484
+ --info: hsl(217 91% 60%);
485
+ --delete: hsl(0 70% 55%);
486
+
487
+ /* Semantic foregrounds — text/glyph atop --success/--warning/--info plates.
488
+ Notification.vue currently hardcodes `text-white`/`text-foreground`
489
+ inline; W2 migrates consumers to read these tokens. Warning carries a
490
+ dark glyph because the amber plate is too luminous for white. R5
491
+ vocab.γ gap row 4. */
492
+ --success-foreground: var(--neutral-0);
493
+ --warning-foreground: hsl(24 10% 10%);
494
+ --info-foreground: var(--neutral-0);
495
+
496
+ /* ═══════════════════════════════════════════════
497
+ §7 SHADOWS — cartoon offset is the signature
498
+ ═══════════════════════════════════════════════ */
499
+ --shadow-cartoon: 3px 3px 0px 0px color-mix(in srgb, var(--foreground) 8%, transparent);
500
+ --shadow-cartoon-hover: 4px 4px 0px 0px color-mix(in srgb, var(--foreground) 10%, transparent);
501
+ --shadow-soft: 0 4px 12px rgba(0, 0, 0, 0.1);
502
+ --shadow-elevated: 0 8px 24px rgba(0, 0, 0, 0.12);
503
+ --shadow-modal:
504
+ 4px 4px 0px 0px color-mix(in srgb, var(--foreground) 8%, transparent),
505
+ 0 24px 64px color-mix(in srgb, var(--foreground) 12%, transparent);
506
+
507
+ --cartoon-shadow: var(--shadow-cartoon);
508
+ --cartoon-shadow-hover: var(--shadow-cartoon-hover);
509
+ --soft-shadow: var(--shadow-soft);
510
+ --elevated-shadow: var(--shadow-elevated);
511
+ --modal-shadow: var(--shadow-modal);
89
512
 
90
513
  /* Elevation scale */
91
514
  --shadow-xs: 0 1px 3px color-mix(in srgb, var(--shadow-color) 4%, transparent),
@@ -96,7 +519,59 @@
96
519
  --shadow-xl: 0 8px 24px color-mix(in srgb, var(--shadow-color) 14%, transparent);
97
520
  --shadow-2xl: 0 25px 50px -12px color-mix(in srgb, var(--shadow-color) 25%, transparent);
98
521
 
99
- /* Cartoon / offset shadows */
522
+ /* Z.W2.T3a — uniform-cast shadow rung. Offset 0 / 0, no directional
523
+ Y bias. Use case: dock-hosted icons (e.g. the speedtest settings
524
+ gear) where the surrounding dock shadow's downward cast reads as
525
+ a per-icon right-edge halo on the rightmost child (A2 §B7). The
526
+ uniform variant carries the same color-mix recipe family as the
527
+ sized rungs (`--shadow-md`, `--shadow-lg`) so the perceived
528
+ elevation is a peer, not a sibling. Consumers compose via
529
+ `--shadow-dock-override: var(--shadow-uniform)` per-instance, or
530
+ attach to per-icon-button stacks where directional cast is wrong-
531
+ shape. Documented in DESIGN.md token table. */
532
+ --shadow-uniform: 0 0 12px color-mix(in srgb, var(--shadow-color) 8%, transparent);
533
+
534
+ /* Card = soft drop plate by default. The cartoon offset is a brand-flavoured
535
+ decoration (a sticker look), not the canonical card shape. Consumers
536
+ wanting the cartoon look pass <Card surface="cartoon">, which composes the
537
+ `.cartoon-surface` utility (it reads --shadow-cartoon directly). R3-spec
538
+ §F.1, S.W4; Q.W3 Lane H. */
539
+ --shadow-card: var(--shadow-md);
540
+ --card-shadow: var(--shadow-card);
541
+
542
+ /* AI.W1-α — sticky CardHeader background. Parameterises the
543
+ `bg-card/60` literal value.js's PaneHeader.vue carried so the
544
+ glass-ui canon owns the recipe. The scroll-driven `<CardHeader
545
+ shrink>` choreography reads this token for its sticky-header
546
+ backdrop tint; consumers retune per-app by overriding the
547
+ variable at any ancestor. Auto-dark via `--card`. */
548
+ --card-header-bg: color-mix(in srgb, var(--card) 60%, transparent);
549
+
550
+ /* Dock shadows */
551
+ /* User 2026-05-13 (third + fourth report). The dock previously layered:
552
+ 1) directional `0 4px 20px` drop → retired (third report; the Y-
553
+ offset concentrated on the pill's rounded right cap and read as
554
+ a right-edge halo on the rightmost child).
555
+ 2) `0 0 0 1px` hairline outer ring → retired (fourth report; in
556
+ dark mode the 10% cream-white ring traced the right-cap arc and
557
+ still read as a shadow even after the directional drop was
558
+ gone).
559
+ The dock's own `border: 1.5px solid var(--glass-border-dock)` already
560
+ provides silhouette definition, so the outer ring was redundant. The
561
+ canonical dock shadow is now a single omnidirectional glow in the
562
+ `--shadow-md`/`--shadow-lg` family. Per-instance directional drop
563
+ can still be reinstated via `--shadow-dock-override` (consumed by
564
+ every `.glass-dock` state selector — see dock.css). */
565
+ --shadow-dock: 0 0 20px color-mix(in srgb, var(--shadow-color) 14%, transparent);
566
+ --shadow-dock-collapsed: 0 0 12px color-mix(in srgb, var(--shadow-color) 12%, transparent);
567
+ --dock-shadow: var(--shadow-dock);
568
+ --dock-shadow-collapsed: var(--shadow-dock-collapsed);
569
+
570
+ /* Cartoon shadow color primitives (kept for tiered cartoon utilities) */
571
+ --shadow-cartoon-color: rgb(0 0 0 / 0.12);
572
+ --shadow-cartoon-color-soft: rgb(0 0 0 / 0.06);
573
+
574
+ /* Tiered cartoon shadows */
100
575
  --shadow-cartoon-sm: -3px 2px 1px color-mix(in srgb, var(--shadow-color) 10%, transparent),
101
576
  0 3px 1px color-mix(in srgb, var(--shadow-color) 10%, transparent),
102
577
  -3px 3px 1px color-mix(in srgb, var(--shadow-color) 6%, transparent);
@@ -106,167 +581,483 @@
106
581
  --shadow-cartoon-lg: -6px 4px 1px color-mix(in srgb, var(--shadow-color) 12%, transparent),
107
582
  0 6px 1px color-mix(in srgb, var(--shadow-color) 12%, transparent),
108
583
  -6px 6px 2px color-mix(in srgb, var(--shadow-color) 8%, transparent);
584
+ --cartoon-shadow-sm: var(--shadow-cartoon-sm);
585
+ --cartoon-shadow-md: var(--shadow-cartoon-md);
586
+ --cartoon-shadow-lg: var(--shadow-cartoon-lg);
109
587
 
110
- /* Card offset shadow */
111
- --shadow-card: 4px 4px 0px 0px color-mix(in srgb, var(--shadow-color) 50%, transparent);
112
- --shadow-card-hover: 5px 5px 0px 0px color-mix(in srgb, var(--shadow-color) 60%, transparent);
113
-
114
- /* Dock shadows */
115
- --shadow-dock: 0 4px 20px color-mix(in srgb, var(--shadow-color) 25%, transparent), 0 0 0 1px color-mix(in srgb, var(--shadow-color) 15%, transparent);
116
- --shadow-dock-collapsed: 0 2px 12px color-mix(in srgb, var(--shadow-color) 20%, transparent), 0 0 0 1px color-mix(in srgb, var(--shadow-color) 15%, transparent);
588
+ /* ═══════════════════════════════════════════════
589
+ §8 GLASSMORPHISM Five-tier surface ladder (v0.8.0)
117
590
 
118
- /* Cartoon shadow colors */
119
- --shadow-cartoon-color: rgb(0 0 0 / 0.12);
120
- --shadow-cartoon-color-soft: rgb(0 0 0 / 0.06);
121
- --shadow-cartoon-color-hover: rgb(0 0 0 / 0.16);
122
- --shadow-cartoon-color-hover-soft: rgb(0 0 0 / 0.08);
591
+ Tier semantics, alpha-monotonic:
592
+ wash ~0.30α + light blur (was `subtle`)
593
+ quiet ~0.50α + medium blur (the formerly missing rung)
594
+ resting ~0.65α + canonical blur (was `default`; the speedtest plate)
595
+ floating ~0.80α + heavier blur (was `elevated`)
596
+ overlay ~0.95α + heaviest blur (NEW; modal-over-modal)
123
597
 
124
- /* ═══════════════════════════════════════════════
125
- §6 GLASSMORPHISM Four-tier surface system
126
- subtle → lightest (dock bg, input bg, hover overlays)
127
- default → standard (cards, content containers, select triggers)
128
- medium → heavier (popovers, dropdowns, floating panels)
129
- elevated → heaviest (dialogs, command palette, modal overlays)
598
+ v0.8.0 retires the four-tier `subtle | default | medium | elevated`
599
+ ladder outright. No legacy aliases. Consumers migrate at the same
600
+ breaking change. R3-spec §A.
130
601
  ═══════════════════════════════════════════════ */
131
602
 
132
603
  /* Opacity primitives */
133
- --glass-opacity-subtle: 0.30;
134
- --glass-opacity-default: 0.50;
135
- --glass-opacity-medium: 0.65;
136
- --glass-opacity-elevated: 0.80;
604
+ --glass-opacity-wash: 0.30;
605
+ --glass-opacity-quiet: 0.50;
606
+ --glass-opacity-resting: 0.65;
607
+ --glass-opacity-floating: 0.80;
608
+ --glass-opacity-overlay: 0.95;
609
+
610
+ /* Blur primitives. The radii here feather the dock + meter card to a
611
+ barely-perceptible diffusion that lets the substrate behind it bleed
612
+ through cleanly while keeping hero typography crisp at meter scale.
613
+ The resting blur sits at 12px so a glass plate reads as a diffusion
614
+ without consumer-side override. */
615
+ --glass-blur-wash-radius: 1px;
616
+ --glass-blur-quiet-radius: 10px;
617
+ --glass-blur-resting-radius: 12px;
618
+ --glass-blur-floating-radius: 16px;
619
+ --glass-blur-overlay-radius: 24px;
620
+ /* AJ.W2-β — dock blur lifted to 14px (was 0px at J.W3.C, was 1px
621
+ pre-J.W3.C). Per FD1 §4 §1.9 (AJ-time live regression P1-11):
622
+ "the dock should feel anchored to its surface; too much blur
623
+ dissociates" — but zero blur reads as "transparent-with-tint",
624
+ NOT as "feathered glass." The AJ-time perceptual register
625
+ overrides the J.W3.C compositor-cost concern: 14px is the lower
626
+ end of the FD1 §4 target range (14-16px); the dock composes
627
+ `blur()` only (no saturate — preserved from J.W3.C); the
628
+ `prefers-reduced-transparency` PRM bracket at glass.css:229
629
+ still maps the dock to its opacity-only register.
630
+ Quiet tier (above) lifted 3px → 10px on the same perceptual-
631
+ register reset (FD1 §4 target range 10-12px; 10px is the lower
632
+ end). The MetricBadge pills + InstrumentChassis-internal cells
633
+ now read as translucent gauge rather than flat tint.
137
634
 
138
- /* Blur primitives */
139
- --glass-blur-subtle: blur(4px) saturate(1.05);
140
- --glass-blur-default: blur(8px) saturate(1.2);
141
- --glass-blur-medium: blur(12px) saturate(1.3);
142
- --glass-blur-elevated: blur(16px) saturate(1.4);
635
+ AL-W3-α (T10 per A-synthesis §1.5): retune 14px → 11px with a
636
+ paired opacity lift 0.32 → 0.42 (below). The user mandate at
637
+ AL-time was "slight blur" + "refined glassyness" — at 11px /
638
+ 0.42 the dock reads as a CRISPER GLASS PILL (the iOS Control
639
+ Center register), not a feathered watercolour wash. Holds the
640
+ register at the lower blur radius. */
641
+ --glass-blur-dock-radius: 11px;
642
+
643
+ --glass-blur-wash: blur(var(--glass-blur-wash-radius)) saturate(1.05);
644
+ --glass-blur-quiet: blur(var(--glass-blur-quiet-radius));
645
+ --glass-blur-resting: blur(var(--glass-blur-resting-radius)) saturate(1.05);
646
+ --glass-blur-floating: blur(var(--glass-blur-floating-radius)) saturate(1.4);
647
+ --glass-blur-overlay: blur(var(--glass-blur-overlay-radius)) saturate(1.5);
648
+ /* Dock blur composes blur() only — no saturate. The 14px radius
649
+ feathers the aurora bleed-through into a watercolour register
650
+ while `--glass-bg-dock` (32% card opacity) carries the
651
+ translucent register. The dock reads as "feathered glass" rather
652
+ than "transparent tint" (AJ.W2-β). */
653
+ --glass-blur-dock: blur(var(--glass-blur-dock-radius));
654
+
655
+ /* Dock-specific opacity. Lighter than `resting` (0.65) so the dock reads
656
+ as a translucent overlay rather than a panel — backdrop bleed visible
657
+ through it. Consumed by `.glass-dock` via the `--glass-bg-dock` token.
658
+
659
+ AL-W3-α (T10 per A-synthesis §1.5): retune 0.32 → 0.42 paired with
660
+ the dock blur radius drop (14px → 11px above). The user mandate at
661
+ AL-time was "slight blur" + "refined glassyness" — the +0.10 opacity
662
+ lift HOLDS the surface register against the tightened blur, so the
663
+ dock still reads as a clearly painted chrome rather than dissociating
664
+ into a frosted ghost. */
665
+ --glass-opacity-dock: 0.42;
666
+
667
+ /* Chassis-specific opacity. Looser than `default` (0.50) so the
668
+ <InstrumentChassis> surface reads as glass-over-aurora at its
669
+ 64rem-wide footprint; the default tier stays calibrated for cards.
670
+ Mirrors the dock-tier pattern (own opacity primitive + composed bg).
671
+ Light 0.28 sits in the gap between dock (0.32) and a hypothetical
672
+ wash tier; dark 0.36 mirrors the +0.08 step the dock takes from
673
+ `glass-bg-medium` (0.65) down to its own 0.32. */
674
+ --glass-opacity-chassis: 0.28;
143
675
 
144
676
  /* Composed backgrounds */
145
- --glass-bg-subtle: color-mix(in srgb, var(--card) calc(var(--glass-opacity-subtle) * 100%), transparent);
146
- --glass-bg-default: color-mix(in srgb, var(--card) calc(var(--glass-opacity-default) * 100%), transparent);
147
- --glass-bg-medium: color-mix(in srgb, var(--card) calc(var(--glass-opacity-medium) * 100%), transparent);
148
- --glass-bg-elevated: color-mix(in srgb, var(--card) calc(var(--glass-opacity-elevated) * 100%), transparent);
149
-
150
- /* Composed borders — foreground-tinted for Apple-like luminosity */
151
- --glass-border-subtle: color-mix(in srgb, var(--foreground) 8%, transparent);
152
- --glass-border-default: color-mix(in srgb, var(--foreground) 10%, transparent);
153
- --glass-border-medium: color-mix(in srgb, var(--foreground) 12%, transparent);
154
- --glass-border-elevated: color-mix(in srgb, var(--foreground) 15%, transparent);
155
-
156
- /* Shadow per tier */
157
- --glass-shadow-subtle: var(--shadow-sm);
158
- --glass-shadow-default: var(--shadow-md);
159
- --glass-shadow-medium: var(--shadow-lg);
160
- --glass-shadow-elevated: var(--shadow-xl),
161
- 0 0 0 0.5px color-mix(in srgb, var(--shadow-color) 5%, transparent);
162
-
163
- /* Shared decorative */
164
- --glass-grain-opacity: 0.035;
677
+ --glass-bg-wash: color-mix(in srgb, var(--card) calc(var(--glass-opacity-wash) * 100%), transparent);
678
+ --glass-bg-quiet: color-mix(in srgb, var(--card) calc(var(--glass-opacity-quiet) * 100%), transparent);
679
+ --glass-bg-resting: color-mix(in srgb, var(--card) calc(var(--glass-opacity-resting) * 100%), transparent);
680
+ --glass-bg-floating: color-mix(in srgb, var(--card) calc(var(--glass-opacity-floating) * 100%), transparent);
681
+ --glass-bg-overlay: color-mix(in srgb, var(--card) calc(var(--glass-opacity-overlay) * 100%), transparent);
682
+ --glass-bg-dock: color-mix(in srgb, var(--card) calc(var(--glass-opacity-dock) * 100%), transparent);
683
+ --glass-bg-chassis: color-mix(in srgb, var(--card) calc(var(--glass-opacity-chassis) * 100%), transparent);
684
+
685
+ /* Composed borders — foreground-tinted */
686
+ --glass-border-wash: color-mix(in srgb, var(--foreground) 8%, transparent);
687
+ --glass-border-quiet: color-mix(in srgb, var(--foreground) 10%, transparent);
688
+ --glass-border-resting: color-mix(in srgb, var(--foreground) 12%, transparent);
689
+ --glass-border-floating: color-mix(in srgb, var(--foreground) 15%, transparent);
690
+ --glass-border-overlay: color-mix(in srgb, var(--foreground) 18%, transparent);
691
+ --glass-border-dock: color-mix(in srgb, var(--foreground) 11%, transparent);
692
+ --glass-border: var(--glass-border-quiet);
693
+ --glass-border-strong: var(--glass-border-floating);
694
+
695
+ /* Shared decorative. Light grain dropped 0.035 → 0.025 in P.W1.B —
696
+ at the chassis scale the original alpha read as crawl over the new
697
+ lower-alpha chassis bg; the grain's role is texture, not reading,
698
+ so it sits at the perceptual floor. Dark companion drops 0.06 →
699
+ 0.045 below to keep the soft-light blend alive without stippling. */
700
+ --glass-grain-opacity: 0.025;
701
+ --glass-grain-opacity-disco: 0.08;
165
702
  --glass-highlight: inset 0 0.5px 0 0 hsl(0 0% 100% / 0.25);
166
703
 
167
- /* ═══════════════════════════════════════════════
168
- §7 ANIMATION OFFSETS
169
- ═══════════════════════════════════════════════ */
170
- --animation-slide-sm: 3px;
171
- --animation-slide-md: 6px;
172
- --animation-slide-lg: 8px;
173
- --popover-offset: 0.375rem;
704
+ /* Hairline-accent — 0.5px catch-light + under-shadow pair.
705
+ Single token composes the canonical 2-stop hairline used by dock,
706
+ instrument-chassis. The `.hairline-accent` utility
707
+ (utilities.css §hairline) adopts these via `box-shadow:`. */
708
+ --hairline-catch-light: inset 0 0.5px 0 0 rgb(255 255 255 / 0.06);
709
+ --hairline-under-shadow: 0 0.5px 0 0 rgb(0 0 0 / 0.04);
710
+ --border-hairline: var(--hairline-catch-light), var(--hairline-under-shadow);
711
+
712
+ /* Specular catch-light — 1.5px-tall top-edge highlight that swaps in for
713
+ --glass-highlight on interactive moments (e.g. primary-action hover).
714
+ Reads as a real catch-light on a curved surface. The `-dark` companion
715
+ is overridden inside `.dark`; the named token here is the explicit
716
+ handle consumers can reference to compose dark-aware layers. */
717
+ --glass-specular: inset 0 1.5px 0 0 hsl(0 0% 100% / 0.45);
718
+ --glass-specular-dark: inset 0 1.5px 0 0 hsl(0 0% 100% / 0.30);
719
+
720
+ /* Chassis curvature illusion — a subtle radial gradient at the chassis
721
+ top centre that lifts the surface without committing to literal 3D.
722
+ Composed into <InstrumentChassis>'s background stack. */
723
+ --glass-curvature-overlay: radial-gradient(
724
+ ellipse at 50% -20%,
725
+ hsl(0 0% 100% / 0.06),
726
+ transparent 60%
727
+ );
728
+ --glass-curvature-overlay-dark: radial-gradient(
729
+ ellipse at 50% -20%,
730
+ hsl(0 0% 100% / 0.06),
731
+ transparent 60%
732
+ );
733
+
734
+ /* Chart palette aliases — speedtest et al. read these for phase tinting.
735
+ Defaults map to viz-basis hues; consumers can override per app. */
736
+ --chart-ping: var(--viz-chebyshev);
737
+ --chart-download: var(--viz-fourier);
738
+ --chart-upload: var(--viz-amber);
739
+ --chart-jitter: var(--viz-legendre);
740
+
741
+ /* O.W6 Lane D — WCAG companion `--chart-{phase}-label` tokens
742
+ (speedtest AC.W6c.T2 — F1.V-04 closure).
743
+
744
+ The canvas-side hues above preserve their saturated brand register
745
+ (correct against the meter dial); the COMPANION tokens darken to
746
+ L≈0.40 so phase-label text on `--background` clears the WCAG 2.1
747
+ AA-body 4.5:1 contrast floor. Mirrors the two-token discipline
748
+ already established by `--meter-{background-color,track-stroke}`:
749
+ one token feeds the canvas/visual, the second feeds the label
750
+ text.
751
+
752
+ Light-mode L≈0.40 in OKLCH preserves the hue rotation while
753
+ dropping luminance enough for body contrast; dark-mode flips to
754
+ L≈0.85 against the dark canvas. Consumers reach these via
755
+ `color: var(--chart-ping-label)` (etc.) on label elements ONLY —
756
+ chart strokes/fills continue to read `--chart-ping`. */
757
+ --chart-ping-label: oklch(0.40 0.18 230);
758
+ --chart-download-label: oklch(0.40 0.20 22);
759
+ --chart-upload-label: oklch(0.40 0.16 55);
760
+ --chart-jitter-label: oklch(0.40 0.20 305);
761
+
762
+ /* O.W6 Lane D — Meter track stroke (speedtest AC.W6c.T3 — F1.V-02
763
+ closure). Promoted from speedtest's consumer-side declaration so
764
+ glass-ui owns the canonical light + dark values. The light-mode
765
+ value reads opaque foreground (composes through canvas
766
+ `globalAlpha` in consumer renderers; e.g., speedtest's `rings.ts`
767
+ `globalAlpha = 0.22` lands the phantom-track at the perceptual
768
+ sweet-spot). The dark-mode companion lives under `.dark` below
769
+ and ALSO reads `var(--foreground)` — the prior speedtest value
770
+ `var(--background)` rendered bg-on-bg invisible at dark mode. */
771
+ --meter-track-stroke: var(--foreground);
772
+
773
+ /* Shadow per tier — complete box-shadow lists for glass surface classes */
774
+ --glass-shadow-wash: var(--shadow-sm), var(--glass-highlight);
775
+ --glass-shadow-quiet: var(--shadow-md), var(--glass-highlight);
776
+ --glass-shadow-resting: var(--shadow-lg), var(--glass-highlight);
777
+ --glass-shadow-floating: var(--shadow-xl),
778
+ 0 0 0 0.5px color-mix(in srgb, var(--shadow-color) 5%, transparent),
779
+ var(--glass-highlight);
780
+ --glass-shadow-overlay: var(--shadow-2xl),
781
+ 0 0 0 0.5px color-mix(in srgb, var(--shadow-color) 8%, transparent),
782
+ var(--glass-highlight);
783
+ --glass-shadow: var(--glass-shadow-quiet);
784
+ --glass-shadow-lg: var(--glass-shadow-floating);
785
+
786
+ /* ─────────────────────────────────────────────────────────────
787
+ AL-W1-α augmented — SPINE 8th tier (HOUSING register)
788
+
789
+ Closes the AK W2 chassis-spine architectural underclaim per
790
+ AL-X5 §4.1. The spine register is a polished SLEEVE, not glass:
791
+ NO backdrop-filter, NO plate opacity, hairline outer stroke,
792
+ interior radial vignette that subtly carries the phase-color
793
+ cascade. Consumed exclusively by `<InstrumentChassis variant="spine">`
794
+ at App-level mount paths (quiet-content routes).
795
+
796
+ The 4 tokens here cover the minimum viable substrate the SLIM
797
+ Y4/Y6/Y7 retention set ratified. The 35 rejected axes (saturate
798
+ band, edge-light per tier, depth-shadow per tier, tier-up macro)
799
+ stay rejected per the conservative-creation mandate.
800
+ ───────────────────────────────────────────────────────────── */
801
+ --glass-spine-opacity: 0;
802
+ --glass-spine-blur: 0px;
803
+ --glass-spine-border: var(--surface-tint-8);
804
+ --glass-spine-vignette: radial-gradient(
805
+ ellipse at 50% 0%,
806
+ color-mix(in oklab, var(--phase-color, var(--surface-tint-8)) 8%, transparent),
807
+ transparent 60%
808
+ );
809
+
810
+ /* ─────────────────────────────────────────────────────────────
811
+ AL-W10 SLIM — UNDER-SHADOW recipe rungs
812
+
813
+ Per AL-X5 §4 + Y7 §3. iOS Liquid Glass surfaces carry a 0.5px
814
+ dark hairline along the bottom edge (reads as under-shadow /
815
+ glass thickness). The substrate `--hairline-under-shadow`
816
+ already publishes one quiet rung; the four-rung ladder here
817
+ names the SLIM retention set (Y4 §3.2 / Y6 §4.3) — `quiet`,
818
+ `default`, `vivid`, `spine` cover the consumer landings without
819
+ multiplying tokens per tier. The 3 hand-rolled literals at
820
+ `instrument-chassis.css:52`, `dock.css:279`, `dock.css:952`
821
+ retire to these.
822
+
823
+ Composes as a NON-INSET box-shadow layer alongside the existing
824
+ `--glass-shadow-*` recipe (the inset under-shadow stays at the
825
+ hand-rolled literal where it's load-bearing on chassis-internal
826
+ surfaces).
827
+ ───────────────────────────────────────────────────────────── */
828
+ --glass-under-shadow-quiet: 0 2px 8px -1px oklch(0 0 0 / 0.04);
829
+ --glass-under-shadow-default: 0 4px 16px -2px oklch(0 0 0 / 0.08);
830
+ --glass-under-shadow-vivid: 0 8px 32px -4px oklch(0 0 0 / 0.12);
831
+ --glass-under-shadow-spine: 0 1px 0 0 oklch(0 0 0 / 0.06);
832
+
833
+ /* Overlay scrim rungs — substrate-aware modal/dialog backdrop tints.
834
+ Three weights cover the deployed range: dialog-scroll (subtle),
835
+ canonical modal (default), drawer/full-cover (strong). Currently
836
+ 5 raw `bg-black/{40,50,80}` sites across Dialog/Sheet/Drawer/
837
+ ConfirmDialog hardcode the value; W2.A migrates consumers.
838
+ R5 vocab.γ gap row 2. */
839
+ --overlay-scrim: color-mix(in srgb, var(--shadow-color) 50%, transparent);
840
+ --overlay-scrim-strong: color-mix(in srgb, var(--shadow-color) 80%, transparent);
841
+ --overlay-scrim-subtle: color-mix(in srgb, var(--shadow-color) 40%, transparent);
174
842
 
175
843
  /* ═══════════════════════════════════════════════
176
- §7b HOVER LIFT OFFSETS
844
+ §9 ANIMATION OFFSETS
177
845
  ═══════════════════════════════════════════════ */
846
+ /* Hover lift offsets */
178
847
  --lift-sm: -1px;
179
848
  --lift-md: -2px;
180
849
  --lift-lg: -4px;
181
850
 
182
- /* ═══════════════════════════════════════════════
183
- §7c LAYOUT TOKENS
184
- ═══════════════════════════════════════════════ */
851
+ /* Layout tokens */
185
852
  --mask-fade-width: 1rem;
853
+ /* J.W3.C — dock content overflow caps. When dock content exceeds
854
+ these dimensions, the inner `.dock-layers` (horizontal) /
855
+ `.glass-dock.vertical` (rail) container scrolls with a
856
+ `.scroll-fade-{x,y}` mask-fade so the boundary feathers rather
857
+ than cliffs. Defaults clamp to 80vw / 80vh capped at sensible
858
+ desktop widths; consumers override per-dock by setting either
859
+ token directly on a `.glass-dock` instance. User findings 1 + 5a. */
860
+ --dock-max-inline-size: min(80vw, 64rem);
861
+ --dock-max-block-size: min(80vh, 48rem);
862
+
863
+ /* AB.W1.T1 — chassis max-block-size guardrail.
864
+ Maximum block size a centred consumer-app card may consume while
865
+ preserving the inline dock footprint. The recipe subtracts the
866
+ consumer-owned `--dock-footer-space` (dock height + dock inset +
867
+ card-edge inset) and `--page-padding-top` from the dynamic viewport,
868
+ then takes one further rem of breathing room so the card never
869
+ butts the dock — the user mandate is `≥ 1rem visible gap above
870
+ dock`. Both consumer tokens carry safe fallbacks for callers that
871
+ have not declared them.
872
+
873
+ Consumers should shrink internal regions (meter, readout, timeline)
874
+ before falling back to scroll. This token is a guardrail against
875
+ chassis overflow, NOT a license to make the card scroll as the
876
+ default solution; clamp-first / no-scroll-first is the canon.
877
+ See DESIGN.md `## Chassis sizing — dock-adjusted viewport`. */
878
+ --chassis-max-block-size: calc(
879
+ 100dvh
880
+ - var(--dock-footer-space, 5.75rem)
881
+ - var(--page-padding-top, 0rem)
882
+ - 1rem
883
+ );
186
884
  --max-width-input: 24rem;
885
+ --input-min-width-sm: 5rem;
886
+ --min-width-input-sm: var(--input-min-width-sm);
887
+ --chart-height-compact: 15rem;
888
+ --chart-height-default: 22.5rem;
889
+ --chart-height-large: 25rem;
890
+ --chart-margin: 1.25rem;
187
891
  --paper-texture-size: 200px 200px;
188
892
 
189
- /* ═══════════════════════════════════════════════
190
- §7d BORDER OPACITY SCALE
191
- ═══════════════════════════════════════════════ */
192
- --border-opacity-light: 0.15;
893
+ /* Border opacity scale */
894
+ --border-opacity-light: 0.15;
193
895
  --border-opacity-medium: 0.25;
194
896
  --border-opacity-strong: 0.6;
195
897
 
196
898
  /* ═══════════════════════════════════════════════
197
- §8 SIZING
899
+ §10 SIZING
198
900
  ═══════════════════════════════════════════════ */
199
901
  --size-icon-btn: 2.5rem;
902
+ --icon-xs: 0.75rem;
903
+ --icon-sm: 0.875rem;
904
+ --icon-md: 1rem;
905
+ --icon-lg: 1.25rem;
906
+ --icon-xl: 1.5rem;
907
+ /* V.W2 T9 — 32px rung; spinner glyphs (Loader2) + dense table-row buttons.
908
+ Naming follows the radius ladder + Tailwind convention (2xl > xl > xxl) —
909
+ see B6 §2.4 for the naming rationale. */
910
+ --icon-2xl: 2rem;
911
+ /* V.W2 T10 — 40px rung; empty-state hero glyph (DashboardMap MapIcon).
912
+ AI.W5-ζ — rebound from `2.5rem` literal to `var(--size-icon-btn)` so
913
+ the alignment is contractual single-source-of-truth rather than the
914
+ coincidental numerical match noted prior. */
915
+ --icon-3xl: var(--size-icon-btn);
916
+ /* V.W2 T11 — 56px rung; FlowSelector school/home survey-flow picker.
917
+ Largest rung in the icon ladder; reserved for hero-class glyphs. */
918
+ --icon-hero: 3.5rem;
919
+
920
+ /* Golden-ratio spacing rungs — φ² and φ³. Preemptive substrate; W4 hero
921
+ chassis + W5 StoryChassis migration land the consumers. R3 §A row 1.
922
+ The 0..4 rungs are not currently named (consumers reach via
923
+ Tailwind's spacing scale); 5/6 land here because their values fall
924
+ outside the default ladder and the audacious chassis pattern wants
925
+ a named handle. */
926
+ --space-phi-5: 2.618rem; /* φ² */
927
+ --space-phi-6: 4.236rem; /* φ³ */
200
928
 
201
929
  /* Dock geometry — consumers may override locally */
202
930
  --dock-h: calc(var(--size-icon-btn) + 0.75rem + 3px);
203
931
  --dock-margin: 0.5rem;
204
932
  --dock-menubar-reserve: 4rem;
205
933
 
206
- /* ═══════════════════════════════════════════════
207
- §8b COMPONENT FONT OVERRIDES
208
- Consumers override these locally.
209
- ═══════════════════════════════════════════════ */
934
+ /* Dock active-state ladder (O.W6 Lane B)
935
+ Token-overridable active paint for `.dock-icon-button`. Promoted
936
+ from hardcoded `background: var(--muted); color: var(--foreground)`
937
+ per bbnf-buddy O11/c R1: 7 `:deep()` escapes at `ToolsLayer.vue`
938
+ redefine bg/color/scale/border/shadow on the active variant; the
939
+ ladder absorbs ~3 of 7 at a stroke. Defaults preserve the prior
940
+ visual contract (no transform, no border, no shadow) — overrides
941
+ take effect per-instance via `:root` or a parent scope, e.g.
942
+ `.tools-layer { --dock-active-scale: 1.2; --dock-active-bg: …; }`.
943
+ ≥ 2-consumer coverage: bbnf-buddy ToolsLayer (override consumer) +
944
+ speedtest dock (default consumer). */
945
+ --dock-active-bg: var(--muted);
946
+ --dock-active-color: var(--foreground);
947
+ --dock-active-scale: 1;
948
+ --dock-active-border: none;
949
+ --dock-active-shadow: none;
950
+
951
+ /* Q.W3 Lane G (Q-cos-13) — the O.W6 Lane D `--icon-tooltip-hit-area`
952
+ token retired here. IconTooltip no longer owns a wrap-span; the
953
+ slotted child carries its own WCAG 2.5.5 hit-area (interactive
954
+ children via their four-state contract, bare glyphs via a
955
+ `min-h-11 min-w-11` host). No orphaned token left behind. */
956
+
957
+ /* O.W6 Lane D — Dock touch-target floor. Mirrors the IconTooltip
958
+ hit-area but for the dock-control surface. The base value tracks
959
+ the desktop default (`--size-icon-btn`); the
960
+ `@media (pointer: coarse)` block at `dock.css` lifts it to the
961
+ WCAG 2.5.5 floor on touch devices. */
962
+ --dock-touch-target: 2.75rem; /* 44px */
963
+
964
+ /* MetricBadge — stacked variant geometry. The 2-row stacked layout
965
+ (label / value+unit) wants a taller floor than the inline pill so the
966
+ label has breathing room above the baseline pair. T.W2.T2 +
967
+ audit B-spec §3.2 vertical-rhythm table land 42px (2.625rem) as the
968
+ min-height with 6px (0.375rem) block padding. The inline ladder
969
+ keeps its tight defaults via `--metric-badge-min-height` /
970
+ `--metric-badge-padding-block` (declared inline at the
971
+ `.metric-badge` selector). */
972
+ --metric-badge-min-height-stacked: 2.625rem;
973
+ --metric-badge-padding-block-stacked: 0.375rem;
974
+
975
+ /* Configurator — N.W2 Lane A density axis (4 rungs).
976
+ The `comfortable` rung restates the pre-N.W2 baked recipe exactly
977
+ (`gap-1.5 py-2` = 0.375rem / 0.5rem) so unparameterised consumers
978
+ see no visual change. `mobile` halves the vertical breathing room
979
+ for narrow-viewport studios; `spacious` doubles it for settings-
980
+ page hosts. See `<ConfiguratorRow>` scoped CSS for the attribute-
981
+ selector binding. */
982
+ --configurator-row-gap-mobile: 0.25rem; /* 4px — tight */
983
+ --configurator-row-gap-compact: 0.3125rem; /* 5px — slightly tighter */
984
+ --configurator-row-gap-comfortable: 0.375rem; /* 6px — pre-N.W2 default */
985
+ --configurator-row-gap-spacious: 0.75rem; /* 12px — generous */
986
+
987
+ --configurator-row-py-mobile: 0.25rem; /* 4px — tight */
988
+ --configurator-row-py-compact: 0.375rem; /* 6px — slightly tighter */
989
+ --configurator-row-py-comfortable: 0.5rem; /* 8px — pre-N.W2 default */
990
+ --configurator-row-py-spacious: 0.875rem; /* 14px — generous */
991
+
992
+ /* Component font override (consumers override locally) */
210
993
  --select-font: inherit;
211
994
 
212
995
  /* ═══════════════════════════════════════════════
213
- §9 INTERACTIVE SCALE TRANSFORMS
996
+ §11 INTERACTIVE SCALES & FOCUS
214
997
  ═══════════════════════════════════════════════ */
215
998
  --scale-hover: 1.08;
216
999
  --scale-hover-dock: 1.1;
217
- --scale-press: 0.95;
1000
+ --scale-press: 0.96;
218
1001
  --scale-press-dock: 0.92;
219
- --scale-press-btn: 0.97;
220
1002
 
221
- /* ═══════════════════════════════════════════════
222
- §10 FOCUS RING
223
- ═══════════════════════════════════════════════ */
1003
+ /* Press-scale — the canonical iOS Liquid Glass press value.
1004
+ `--scale-press` (0.96) is the canonical rung every primitive
1005
+ should reach for unless it has a documented reason — see
1006
+ DESIGN.md §L3. `--scale-press-btn` (aliased to `--scale-press-sm`,
1007
+ 0.97) is the slightly-softer rung the legacy button + slider
1008
+ recipes consume.
1009
+
1010
+ AL-W10 SLIM reconciliation (per audit G-W1-2 / G-W1-4 F-2):
1011
+ the prior `--scale-press: 0.95` value drifted from the §L3
1012
+ canonical 0.96 rung; the canon-amend lifts the token to match
1013
+ the iOS `.regular` control rung the precept ratifies.
1014
+
1015
+ Q.W4 Lane D (Q-sty-5) retired the P.W4 `--scale-press-{xs,md,lg}`
1016
+ rungs: the ladder was minted as preemptive consumer-facing
1017
+ substrate for a words/frontend `active:scale-[X.XX]` absorption
1018
+ that never landed — a fleet-wide grep (words/frontend, fourier,
1019
+ bbnf-buddy, speedtest, keyframes.js + glass-ui src/) found zero
1020
+ `var(--scale-press-{xs,md,lg})` consumers. Substrate-without-
1021
+ consumer is binary (N invariant 23 / L invariant 8); the three
1022
+ unused rungs are gone. `sm` is retained — `--scale-press-btn`
1023
+ aliases it. */
1024
+ --scale-press-sm: 0.97;
1025
+ --scale-press-btn: var(--scale-press-sm);
1026
+ --opacity-disabled: 0.5;
1027
+ --opacity-icon-muted: 0.8;
1028
+
224
1029
  --focus-ring-width: 2px;
225
1030
  --focus-ring-shadow: 0 0 0 var(--focus-ring-width) color-mix(in srgb, var(--ring) 30%, transparent),
226
1031
  0 0 8px color-mix(in srgb, var(--ring) 15%, transparent);
1032
+ --focus-ring: var(--focus-ring-shadow);
227
1033
 
228
1034
  /* ═══════════════════════════════════════════════
229
- §11 PAPER TEXTURES
1035
+ §12 PAPER TEXTURES
230
1036
  ═══════════════════════════════════════════════ */
231
- --paper-clean-texture: url("data:image/svg+xml,%3Csvg width='200' height='200' viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
232
- --paper-aged-texture: url("data:image/svg+xml,%3Csvg width='200' height='200' viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.5' numOctaves='5' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.06'/%3E%3C/svg%3E");
1037
+ /* Canonical subtle paper-texture opacity restored from fourier-original
1038
+ (`4df1a06:web/src/style.css:53-54`) after A.W3.5.ab confirmed the
1039
+ heretofore `opacity='1'` URI rendered as an overt grain field in every
1040
+ downstream consumer of `.paper-texture`. The SVG `opacity` attribute is
1041
+ baked at parse-time and cannot read a CSS var, so the subtle value must
1042
+ be inlined; if a consumer needs a heavier overlay, they should layer
1043
+ a wrapper element with its own `opacity:`/`mix-blend-mode:` atop. */
1044
+ --paper-clean-texture: url("data:image/svg+xml,%3Csvg width='200' height='200' viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
1045
+ --paper-aged-texture: url("data:image/svg+xml,%3Csvg width='200' height='200' viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.5' numOctaves='5' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.06'/%3E%3C/svg%3E");
233
1046
 
234
1047
  /* ═══════════════════════════════════════════════
235
- §9 DEFAULT COLOR PALETTE (consumers override locally)
1048
+ §13 GOLD (accent family kept for consumers using it)
236
1049
  ═══════════════════════════════════════════════ */
237
- --background: hsl(0 0% 100%);
238
- --foreground: hsl(222.2 84% 4.9%);
239
- --muted: hsl(210 40% 96.1%);
240
- --muted-foreground: hsl(215.4 16.3% 46.9%);
241
- --popover: hsl(0 0% 100%);
242
- --popover-foreground: hsl(222.2 84% 4.9%);
243
- --card: hsl(0 0% 100%);
244
- --card-foreground: hsl(222.2 84% 4.9%);
245
- --border: hsl(214.3 31.8% 91.4%);
246
- --input: hsl(214.3 31.8% 91.4%);
247
- --primary: hsl(222.2 47.4% 11.2%);
248
- --primary-foreground: hsl(210 40% 98%);
249
- --secondary: hsl(210 40% 96.1%);
250
- --secondary-foreground: hsl(222.2 47.4% 11.2%);
251
- --accent: hsl(210 40% 96.1%);
252
- --accent-foreground: hsl(222.2 47.4% 11.2%);
253
- --destructive: hsl(0 84.2% 60.2%);
254
- --destructive-foreground: hsl(210 40% 98%);
255
- --ring: hsl(222.2 84% 4.9%);
256
- --shadow: hsl(0 0% 65%);
1050
+ --gold: hsl(43 74% 49%);
1051
+ --gold-light: hsl(51 100% 50%);
1052
+ --gold-dark: hsl(34 87% 38%);
257
1053
 
258
- /* ═══════════════════════════════════════════════
259
- §12 GOLD PALETTE
260
- ═══════════════════════════════════════════════ */
261
- --color-gold: hsl(43 74% 49%);
262
- --color-gold-light: hsl(51 100% 50%);
263
- --color-gold-dark: hsl(34 87% 38%);
1054
+ --color-gold: var(--gold);
1055
+ --color-gold-light: var(--gold-light);
1056
+ --color-gold-dark: var(--gold-dark);
264
1057
 
265
1058
  /* ═══════════════════════════════════════════════
266
- §13 RAINBOW PALETTE
1059
+ §14 RAINBOW PALETTE
267
1060
  ═══════════════════════════════════════════════ */
268
-
269
- /* Rainbow vivid */
270
1061
  --rainbow-red: hsl(0 85% 60%);
271
1062
  --rainbow-orange: hsl(30 90% 55%);
272
1063
  --rainbow-yellow: hsl(55 90% 55%);
@@ -275,7 +1066,6 @@
275
1066
  --rainbow-indigo: hsl(260 70% 60%);
276
1067
  --rainbow-violet: hsl(300 75% 60%);
277
1068
 
278
- /* Rainbow pastel */
279
1069
  --rainbow-pastel-red: hsl(0 50% 78%);
280
1070
  --rainbow-pastel-orange: hsl(25 55% 76%);
281
1071
  --rainbow-pastel-yellow: hsl(50 55% 78%);
@@ -283,51 +1073,423 @@
283
1073
  --rainbow-pastel-blue: hsl(220 45% 76%);
284
1074
  --rainbow-pastel-indigo: hsl(260 35% 76%);
285
1075
  --rainbow-pastel-violet: hsl(280 40% 78%);
1076
+
1077
+ /* ═══════════════════════════════════════════════
1078
+ §16 TIMELINE
1079
+ Timeline primitive tokens. All three variants (scrubber +
1080
+ segmented + continuous) compose these. Both segmented + continuous
1081
+ arrays carry the same `TimelineSegment[]` data shape; only the
1082
+ rendering geometry differs. See DESIGN.md `## Timeline Primitive`.
1083
+ ═══════════════════════════════════════════════ */
1084
+
1085
+ /* Heights — per-variant rail thickness */
1086
+ --timeline-scrubber-height: 0.5rem; /* 8px — single-track scrubber */
1087
+ --timeline-segmented-height: 0.625rem; /* 10px — N adjacent bands */
1088
+ --timeline-continuous-height: 0.75rem; /* 12px — ONE pill, N regions */
1089
+
1090
+ /* Geometry — shared across all variants */
1091
+ --timeline-dot-size: 0.875rem; /* 14px — boundary dot diameter (pointer: fine) */
1092
+ --timeline-dot-size-touch: 1.25rem; /* 20px — boundary dot diameter (pointer: coarse) */
1093
+ --timeline-touch-target: 44px; /* AC.W6d F2.I-04 — WCAG 2.5.5 target-size floor.
1094
+ The `::before` halo around each dot extends to
1095
+ this dimension so finger-precision users meet
1096
+ the (target-size: 44×44 minimum) clause without
1097
+ the visible dot growing to that footprint at
1098
+ pointer: fine. */
1099
+ --timeline-segment-flex: 1 1 0; /* per-cell flex distribution (segmented) */
1100
+
1101
+ /* Boundary-dot glass knobs (Q.W4 Lane B — promoted from
1102
+ ContinuousTimeline.vue SFC fallbacks; `3cb70db` minted these as a
1103
+ private dialect). The continuous-variant dot is a GLASS primitive:
1104
+ a translucent tinted fill over a backdrop blur with a hairline
1105
+ ring. These knobs let consumers retune the resting glass + the
1106
+ per-state tints without a `:deep()` reach.
1107
+ fill — resting translucent fill
1108
+ blur — backdrop blur tier behind the dot
1109
+ ring — hairline glass ring (border-color)
1110
+ tint-current — wash colour for the active-phase dot
1111
+ tint-completed — wash colour for the completed-phase dot
1112
+ check-color — completion-tick stroke (defaults to the
1113
+ completed tint) */
1114
+ --timeline-dot-fill: var(--surface-tint-12);
1115
+ --timeline-dot-blur: var(--glass-blur-quiet);
1116
+ --timeline-dot-ring: var(--glass-border-floating);
1117
+ --timeline-dot-tint-current: var(--accent, var(--foreground));
1118
+ --timeline-dot-tint-completed: var(--success, var(--foreground));
1119
+ --timeline-dot-check-color: var(--timeline-dot-tint-completed);
1120
+
1121
+ /* Continuous-variant specific — seam dividers between regions.
1122
+ Set `--timeline-continuous-seam-opacity: 0` to suppress the
1123
+ inter-region 1px dividers entirely. Default `0.25` reads as a
1124
+ subtle hairline; the `--timeline-continuous-seam-color` knob lets
1125
+ consumers override the seam tint independently of opacity. */
1126
+ --timeline-continuous-seam-opacity: 0.25;
1127
+ --timeline-continuous-seam-color: color-mix(
1128
+ in srgb,
1129
+ var(--foreground) calc(var(--timeline-continuous-seam-opacity) * 100%),
1130
+ transparent
1131
+ );
1132
+
1133
+ /* Per-segment default gradient fallback — applied when a segment
1134
+ omits its `gradient` field. Consumers can override per-phase via
1135
+ the `--timeline-segment-gradient-{key}` knobs below. */
1136
+ --timeline-segment-default-gradient: linear-gradient(
1137
+ 90deg,
1138
+ var(--surface-tint-15),
1139
+ var(--surface-tint-25)
1140
+ );
1141
+
1142
+ /* Per-phase gradient defaults — paint the canonical chart palette
1143
+ at the gradient leading edge, fading to a 60%-opacity tail. The
1144
+ speedtest consumer wires these via `gradient: "var(--timeline-segment-gradient-ping)"`
1145
+ per segment; the same names work for any consumer who follows the
1146
+ ping/download/upload/jitter taxonomy. */
1147
+ --timeline-segment-gradient-ping: linear-gradient(
1148
+ 90deg,
1149
+ var(--chart-ping),
1150
+ color-mix(in srgb, var(--chart-ping) 60%, transparent)
1151
+ );
1152
+ --timeline-segment-gradient-download: linear-gradient(
1153
+ 90deg,
1154
+ var(--chart-download),
1155
+ color-mix(in srgb, var(--chart-download) 60%, transparent)
1156
+ );
1157
+ --timeline-segment-gradient-upload: linear-gradient(
1158
+ 90deg,
1159
+ var(--chart-upload),
1160
+ color-mix(in srgb, var(--chart-upload) 60%, transparent)
1161
+ );
1162
+ --timeline-segment-gradient-jitter: linear-gradient(
1163
+ 90deg,
1164
+ var(--chart-jitter),
1165
+ color-mix(in srgb, var(--chart-jitter) 60%, transparent)
1166
+ );
1167
+
1168
+ /* ═══════════════════════════════════════════════
1169
+ §17 METRIC
1170
+
1171
+ MetricRow / MetricStack value-clamp dialect. The post-P
1172
+ `9ba68ca` + `d244dd5` commits introduced this 8-token family
1173
+ (plus the P.W5 Lane A.1 MetricRow clamp work) as a private SFC
1174
+ dialect — the defaults lived as `var(…, fallback)` literals
1175
+ scattered across MetricRow.vue / MetricStack.vue, never
1176
+ discoverable or `:root`-overridable. Q.W4 Lane A promotes the
1177
+ whole family here per the DESIGN.md feature-token-home rule;
1178
+ the SFCs now consume them bare.
1179
+
1180
+ The declared values ARE the `audacious` poster register — the
1181
+ hero-scale clamp for a single giant number the user watches
1182
+ climb. MetricStack's `[data-register="result"]` scoped selector
1183
+ legitimately overrides this register-locally for the compact
1184
+ multi-row ledger; that override now retunes a globally declared
1185
+ default rather than minting a fallback.
1186
+
1187
+ Three clamp arms each: `min` (floor), `cqi` (the binding
1188
+ container-query middle term), `max` (ceiling). value + label
1189
+ carry all three; unit carries min/max only (its cqi coefficient
1190
+ is a fixed 6cqi, not consumer-tuned).
1191
+ ═══════════════════════════════════════════════ */
1192
+
1193
+ /* Value register — audacious-poster hero clamp */
1194
+ --metric-row-value-clamp-min: 4.5rem;
1195
+ --metric-row-value-clamp-cqi: 34cqi;
1196
+ --metric-row-value-clamp-max: var(--type-display-hero);
1197
+
1198
+ /* Unit register — one tier below the value it qualifies */
1199
+ --metric-row-unit-clamp-min: 1.5rem;
1200
+ --metric-row-unit-clamp-max: 3.25rem;
1201
+
1202
+ /* Label register — uppercase, the binding row-height term in the
1203
+ compact `result` register */
1204
+ --metric-row-label-clamp-min: 1.125rem;
1205
+ --metric-row-label-clamp-cqi: 5cqi;
1206
+ --metric-row-label-clamp-max: 2.75rem;
1207
+
1208
+ /* ═══════════════════════════════════════════════
1209
+ §2.D INSTRUMENT-CLUSTER COMPOSITION RHYTHM —
1210
+ AK.W3 / FD1 TRANSPOSITION 5 absorb.
1211
+
1212
+ The under-meter progress bar nests INTO the dial's painted-disc
1213
+ bound (FD2 §5.2) and any two stacked progress rails inside a
1214
+ cluster share the same vertical rhythm token. Both tokens were
1215
+ authored speedtest-local (`AJ.W3-α`, `AJ.W3-μ.3`) but the design
1216
+ intent is library-canon: the instrument-chassis family owns the
1217
+ under-meter / progress-cluster grammar, so the tokens absorb here
1218
+ at AK.W3. Speedtest reads transitively through the canon.
1219
+
1220
+ AM-W7-δ — `--meter-progress-gap` RETIRED (dead-canon). It was
1221
+ absorbed pre-emptively at AK.W3 for a post-nest "meter ↔ per-phase
1222
+ progress-bar gap" composition that never materialised: speedtest's
1223
+ bar uses the negative `--meter-progress-inset` instead, and a
1224
+ fleet grep (glass-ui src/ + demo + speedtest) found ZERO `var()`
1225
+ consumers (only doc references in pre-AL/pre-AK audits flagging it
1226
+ as G-AL-D-METER-PROGRESS-GAP-DEAD-CANON, routed to retire). Per
1227
+ NO-legacy-code it is removed rather than kept as speculative
1228
+ forward-compat reservation; a future glass-ui Meter primitive that
1229
+ needs the gap re-authors it at its real consumer.
1230
+
1231
+ • `--meter-progress-inset` — the negative-margin inset that pulls
1232
+ the under-meter bar INTO the unpainted ring lane around the
1233
+ dial canvas (~4% of meter-size, two-thirds of the way through
1234
+ the lane). Consumed at `.phase-progress` with `margin-block-
1235
+ start: calc(-1 * var(--meter-progress-inset))`.
1236
+ • `--progress-stack-gap` — vertical rhythm between any two stacked
1237
+ progress rails inside one cluster (the under-meter bar cluster
1238
+ + the global PhaseTimeline siblinged at W3-β).
1239
+
1240
+ The `--meter-size` reference inside the inset clamp resolves
1241
+ against the consumer's own `--meter-size` declaration; when no
1242
+ consumer ships one (a non-speedtest demo of the chassis), the
1243
+ inline fallback of 200px keeps the calc well-defined. */
1244
+ --meter-progress-inset: calc(var(--meter-size, 200px) * 0.04);
1245
+ --progress-stack-gap: clamp(0.1875rem, 0.4cqi, 0.375rem);
1246
+
1247
+ /* ═══════════════════════════════════════════════
1248
+ §2.E CELEBRATION-TIER REGISTER — AK.W3 / FD1
1249
+ TRANSPOSITION 5 absorb.
1250
+
1251
+ The celebration cluster (speedtest "Complete!" headline,
1252
+ ThankYou's "Thanks for taking the time" headline) is a SHARED
1253
+ peak across multiple consumer surfaces. Before AK.W3 these
1254
+ tokens were speedtest-local (`AJ.W3-μ.4`, W2-C headline-parity)
1255
+ but the design intent is library-canon: any glass-ui consumer
1256
+ composing a "completion" / "thank-you" surface should reach
1257
+ for the same row-rhythm + headline-ceiling pair.
1258
+
1259
+ • `--celebration-row-rhythm` — gap between the celebration
1260
+ cluster's rows (cqi-axis so the rhythm tracks the card's
1261
+ intrinsic width).
1262
+ • `--text-celebration-headline-size` — the SINGLE designed peak
1263
+ both celebration surfaces clamp toward (the W2-C unification).
1264
+ cqi-axis so the size tracks each card's intrinsic width.
1265
+ • `--complete-headline-size` — the per-consumer FONT-SIZE HOOK
1266
+ that `CompleteHeadline.vue` reads (`font-size:
1267
+ var(--complete-headline-size, …)`). Each consumer assigns the
1268
+ canon clamp (`--text-celebration-headline-size`) to this hook
1269
+ at the container so the headline pegs at the shared peak.
1270
+ The default falls back to a smaller hero-rung clamp for
1271
+ consumers that haven't opted into the celebration ceiling. */
1272
+ --celebration-row-rhythm: clamp(0.5rem, 1.6cqi, 1rem);
1273
+ --text-celebration-headline-size: clamp(2.5rem, 12cqi, 9rem);
1274
+ --complete-headline-size: clamp(2.25rem, 11cqi, 4rem);
1275
+
1276
+ /* ═══════════════════════════════════════════════
1277
+ §19 TABLE DENSITY
1278
+
1279
+ A single unitless knob `--table-density` scales the cell
1280
+ padding and header row height of the Table / DataTable
1281
+ primitive. Default `1` is backward-compatible (resolves to
1282
+ the same `1rem` cell padding and `3rem` header height as the
1283
+ pre-knob hardcoded values). Consumers set this on a wrapping
1284
+ element or on `:root` to tune density for their context:
1285
+
1286
+ • 0.75 — compact admin table (tighter rows, more data/screen)
1287
+ • 1 — default (unchanged)
1288
+ • 1.25 — comfortable / touch-friendly rows
1289
+
1290
+ The derived tokens are read by the `table-cell` and `table-head`
1291
+ CSS utilities (utilities.css) which TableCell.vue and TableHead.vue
1292
+ consume instead of the former Tailwind `p-4` / `h-12` literals.
1293
+ Changing `--table-density` cascades instantly via CSS inheritance —
1294
+ no JS prop is needed.
1295
+ ═══════════════════════════════════════════════ */
1296
+ --table-density: 1;
1297
+ --table-cell-px: calc(1rem * var(--table-density));
1298
+ --table-cell-py: calc(1rem * var(--table-density));
1299
+ --table-head-h: calc(3rem * var(--table-density));
1300
+ --table-head-px: calc(1rem * var(--table-density));
286
1301
  }
287
1302
 
288
1303
  /* ═══════════════════════════════════════════════
289
- §10 DEFAULT DARK MODE (consumers override locally)
1304
+ DARK MODE warm dark, section palette brightened ~20% L
290
1305
  ═══════════════════════════════════════════════ */
291
1306
  .dark {
292
- /* Glass opacity boosted for dark backgrounds */
293
- --glass-opacity-subtle: 0.42;
294
- --glass-opacity-default: 0.58;
295
- --glass-opacity-medium: 0.72;
296
- --glass-opacity-elevated: 0.88;
1307
+ /* Neutral scale mirrors light-mode pattern: step UP from the background's
1308
+ low L toward foreground. Same perceptual deltas as light. */
1309
+ --neutral-0: hsl(24 8% 6%); /* L 6 — page surface (dark) */
1310
+ --neutral-1: hsl(24 6% 11%); /* L 11 — soft field */
1311
+ --neutral-2: hsl(24 5% 16%); /* L 16 — chip / tab-inactive */
1312
+ --neutral-3: hsl(24 5% 22%); /* L 22 — hover / highlight */
1313
+ --neutral-4: hsl(24 5% 34%); /* L 34 — subtle border */
1314
+ --neutral-5: hsl(48 5% 62%); /* L 62 — muted text (WCAG AA: 7.39:1 vs L6 page / 6.58:1 vs L11 muted) */
1315
+ /* W7-α' (AK-FD1) — strong-muted text. Same principled ladder step as
1316
+ light, mirrored: 10 L LIGHTER than muted (62→72) toward --foreground
1317
+ (L90), the 1/3 point of the L62→L90 muted→primary gap. By-colour; hue
1318
+ 48, sat nudged 5→6. WCAG AA: 9.86:1 vs L6 page / 8.78:1 vs L11 muted
1319
+ (cf. neutral-5's 7.39:1). */
1320
+ --neutral-6: hsl(48 6% 72%); /* L 72 — strong-muted text (secondary register) */
1321
+
1322
+ --background: var(--neutral-0);
1323
+ --foreground: hsl(48 10% 90%);
1324
+ --card: hsl(24 8% 10%);
1325
+ --card-foreground: var(--foreground);
1326
+ --popover: hsl(24 8% 10%);
1327
+ --popover-foreground: var(--foreground);
1328
+
1329
+ --muted: var(--neutral-1);
1330
+ --muted-foreground: var(--neutral-5);
1331
+ /* W7-α' (AK-FD1) — strong-muted secondary text. Auto-tracks the dark
1332
+ neutral-6 rung above; by-colour, not alpha. */
1333
+ --muted-foreground-strong: var(--neutral-6);
1334
+ --secondary: var(--neutral-2);
1335
+ --secondary-foreground: var(--foreground);
1336
+ --accent: var(--neutral-3);
1337
+ --accent-foreground: var(--foreground);
1338
+
1339
+ --border: var(--neutral-4);
1340
+ --input: var(--neutral-4);
1341
+
1342
+ --primary: hsl(48 10% 90%);
1343
+ --primary-foreground: hsl(24 10% 10%);
1344
+ --destructive: hsl(0 62.8% 30.6%);
1345
+ --destructive-foreground: hsl(48 10% 90%);
1346
+ --ring: hsl(48 10% 70%);
1347
+ --shadow: hsl(0 0% 5%);
1348
+
1349
+ /* Section palette — brightened for dark backgrounds */
1350
+ --section-color-0: hsl(334 72% 70%);
1351
+ --section-color-1: hsl(272 54% 73%);
1352
+ --section-color-2: hsl(224 67% 72%);
1353
+ --section-color-3: hsl(194 61% 64%);
1354
+ --section-color-4: hsl(163 50% 60%);
1355
+ --section-color-5: hsl(37 73% 67%);
1356
+ --section-color-6: hsl(6 77% 66%);
1357
+ --section-color-7: hsl(286 58% 72%);
1358
+ --section-color-8: hsl(342 71% 69%);
1359
+ --section-color-9: hsl(205 24% 70%);
1360
+ --section-color-10: hsl(86 44% 63%);
1361
+ --section-color-11: hsl(187 63% 65%);
1362
+ --section-color-12: hsl(256 60% 74%);
1363
+
1364
+ --accent-pink: hsl(335 55% 65%);
1365
+ --section-heading: hsl(330 55% 68%);
1366
+ --accent-red: hsl(0 68% 62%);
1367
+
1368
+ --viz-fourier: hsl(6 77% 66%);
1369
+ --viz-chebyshev: hsl(224 67% 72%);
1370
+ --viz-legendre: hsl(286 58% 72%);
1371
+ --viz-amber: var(--section-color-5);
1372
+ --viz-green: var(--section-color-4);
297
1373
 
298
- --glass-grain-opacity: 0.06;
1374
+ /* O.W6 Lane D — WCAG companion labels lift to L≈0.85 against the
1375
+ deep dark canvas; same two-token discipline as light mode (canvas
1376
+ hue preserved at `--chart-*`; only the label register shifts). */
1377
+ --chart-ping-label: oklch(0.85 0.12 230);
1378
+ --chart-download-label: oklch(0.85 0.14 22);
1379
+ --chart-upload-label: oklch(0.85 0.12 55);
1380
+ --chart-jitter-label: oklch(0.85 0.14 305);
1381
+
1382
+ /* O.W6 Lane D — Meter track stroke dark companion. Mirrors `:root`
1383
+ (was speedtest's consumer-side `var(--background)` — bg-on-bg
1384
+ invisible at dark mode; F1.V-02 closure). */
1385
+ --meter-track-stroke: var(--foreground);
1386
+
1387
+ --tier-featured: hsl(45 100% 60%);
1388
+ --tier-saved: hsl(210 100% 70%);
1389
+ --like: hsl(0 80% 68%);
1390
+ --success: hsl(142 71% 58%);
1391
+ --warning: hsl(38 92% 60%);
1392
+ --info: hsl(217 91% 70%);
1393
+ --delete: hsl(0 70% 62%);
1394
+
1395
+ /* Semantic foregrounds — off-white over dark plates. Mirrors the
1396
+ `--destructive-foreground` dark pattern (hsl 48 10% 90%). The warning
1397
+ glyph stays dark-on-amber; the dark amber rung is luminous enough that
1398
+ a darker glyph still reads (matches light-mode behaviour). */
1399
+ --success-foreground: hsl(48 10% 96%);
1400
+ --warning-foreground: hsl(24 10% 10%);
1401
+ --info-foreground: hsl(48 10% 96%);
1402
+
1403
+ --shadow-cartoon: 3px 3px 0px 0px color-mix(in srgb, var(--foreground) 6%, transparent);
1404
+ --shadow-cartoon-hover: 4px 4px 0px 0px color-mix(in srgb, var(--foreground) 8%, transparent);
1405
+ --shadow-soft: 0 4px 12px rgba(0, 0, 0, 0.3);
1406
+ --shadow-elevated: 0 8px 24px rgba(0, 0, 0, 0.35);
1407
+ --shadow-modal:
1408
+ 4px 4px 0px 0px color-mix(in srgb, var(--foreground) 6%, transparent),
1409
+ 0 24px 64px color-mix(in srgb, var(--foreground) 18%, transparent);
1410
+
1411
+ --shadow-cartoon-color: rgb(255 255 255 / 0.07);
1412
+ --shadow-cartoon-color-soft: rgb(255 255 255 / 0.03);
1413
+
1414
+ /* Glass opacity + grain for dark — five-tier ladder, alpha-monotonic.
1415
+ Each rung lifts ~0.08 from its light counterpart so the dark surfaces
1416
+ carry comparable read-weight against the deeper canvas. */
1417
+ --glass-opacity-wash: 0.38;
1418
+ --glass-opacity-quiet: 0.58;
1419
+ --glass-opacity-resting: 0.72;
1420
+ --glass-opacity-floating: 0.88;
1421
+ --glass-opacity-overlay: 0.96;
1422
+ --glass-opacity-chassis: 0.36;
1423
+ --glass-grain-opacity: 0.045;
299
1424
  --glass-highlight: inset 0 0.5px 0 0 hsl(0 0% 100% / 0.08);
300
1425
 
301
- --background: hsl(224 71% 4%);
302
- --foreground: hsl(210 40% 98%);
303
- --muted: hsl(217.2 32.6% 17.5%);
304
- --muted-foreground: hsl(215 20.2% 65.1%);
305
- --popover: hsl(224 71% 4%);
306
- --popover-foreground: hsl(210 40% 98%);
307
- --card: hsl(224 50% 10%);
308
- --card-foreground: hsl(210 40% 98%);
309
- --border: hsl(216 34% 17%);
310
- --input: hsl(216 34% 17%);
311
- --primary: hsl(210 40% 98%);
312
- --primary-foreground: hsl(222.2 47.4% 11.2%);
313
- --secondary: hsl(217.2 32.6% 17.5%);
314
- --secondary-foreground: hsl(210 40% 98%);
315
- --accent: hsl(217.2 32.6% 17.5%);
316
- --accent-foreground: hsl(210 40% 98%);
317
- --destructive: hsl(0 72% 50%);
318
- --destructive-foreground: hsl(210 40% 98%);
319
- --ring: hsl(212.7 26.8% 83.9%);
320
- --shadow: hsl(0 0% 10%);
321
- --shadow-card: 4px 4px 0px 0px color-mix(in srgb, var(--shadow-color) 85%, transparent);
322
- --shadow-card-hover: 5px 5px 0px 0px color-mix(in srgb, var(--shadow-color) 95%, transparent);
323
-
324
- --shadow-cartoon-color: rgb(255 255 255 / 0.07);
325
- --shadow-cartoon-color-soft: rgb(255 255 255 / 0.03);
326
- --shadow-cartoon-color-hover: rgb(255 255 255 / 0.10);
327
- --shadow-cartoon-color-hover-soft: rgb(255 255 255 / 0.05);
328
-
329
- /* Gold boosted for dark backgrounds */
330
- --color-gold: hsl(43 74% 55%);
331
- --color-gold-light: hsl(51 100% 55%);
332
- --color-gold-dark: hsl(34 87% 45%);
1426
+ /* Hairline-accent dark mirror — see light counterpart at line ~404. */
1427
+ --hairline-catch-light: inset 0 0.5px 0 0 rgb(255 255 255 / 0.05);
1428
+ --hairline-under-shadow: 0 0.5px 0 0 rgb(0 0 0 / 0.06);
1429
+
1430
+ /* Specular + curvature — softened for dark backdrops. Disco-grain stays
1431
+ at the same opacity ceiling; the dark grain blend already lifts it. */
1432
+ --glass-specular: inset 0 1.5px 0 0 hsl(0 0% 100% / 0.30);
1433
+ --glass-curvature-overlay: radial-gradient(
1434
+ ellipse at 50% -20%,
1435
+ hsl(0 0% 100% / 0.06),
1436
+ transparent 60%
1437
+ );
1438
+
1439
+ /* Gold boosted for dark */
1440
+ --gold: hsl(43 74% 55%);
1441
+ --gold-light: hsl(51 100% 55%);
1442
+ --gold-dark: hsl(34 87% 45%);
1443
+ }
1444
+
1445
+ /* ═══════════════════════════════════════════════
1446
+ §18 TYPED CSS PROPERTIES Houdini @property registrations
1447
+ (AI.W4 grammar adjacent to §2.C tokens above)
1448
+
1449
+ Three typed custom properties register with the CSS Houdini @property
1450
+ API so transitions interpolate VALUES (percentage / length) rather
1451
+ than the textual representation. Unregistered fallback is safe — the
1452
+ `initial-value` provides a sensible default for any consumer that
1453
+ imports this stylesheet on a browser that doesn't yet support the
1454
+ typed @property registration (the cross-fade collapses to the
1455
+ initial value, then re-paints at the new state).
1456
+
1457
+ Browser support: Chromium 85+, Safari 16.4+, Firefox 128+. The
1458
+ speedtest deployment target sits well within the floor.
1459
+
1460
+ • --progress-crescendo (percentage) — the leading-edge brightness
1461
+ ramp on `<Progress variant="gradient">` past 85% modelValue.
1462
+ `inherits: false` because the value is consumed at one
1463
+ declaration only (the gradient stop calculation); inheriting
1464
+ would let an unrelated ancestor accidentally drive a sibling
1465
+ progress bar.
1466
+
1467
+ • --phase-tint-amount (percentage) — the chassis depth-of-tint
1468
+ companion to `--phase-color`. `inherits: true` because the
1469
+ value cascades from the chassis root through every region
1470
+ wrapper that reads it for a sympathetic tint (matches the
1471
+ `--phase-color` inheritance pattern).
1472
+
1473
+ • --ripple-radius (length) — the `btn-audacious` press ripple
1474
+ radial. `inherits: false` because each button owns its own
1475
+ ripple state (a hovered parent must not push a ripple-radius
1476
+ onto a non-pressed child).
1477
+ ═══════════════════════════════════════════════ */
1478
+
1479
+ @property --progress-crescendo {
1480
+ syntax: "<percentage>";
1481
+ inherits: false;
1482
+ initial-value: 0%;
1483
+ }
1484
+
1485
+ @property --phase-tint-amount {
1486
+ syntax: "<percentage>";
1487
+ inherits: true;
1488
+ initial-value: 0%;
1489
+ }
1490
+
1491
+ @property --ripple-radius {
1492
+ syntax: "<length>";
1493
+ inherits: false;
1494
+ initial-value: 0px;
333
1495
  }