@mkbabb/glass-ui 3.12.0 → 4.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 (436) hide show
  1. package/dist/CardAction-XH4YBVEK.js +158 -0
  2. package/dist/{CommandShortcut-CefCj5mt.js → CommandShortcut-DdtWXxOK.js} +58 -53
  3. package/dist/{ContextMenuSubContent-Bhg4f5jX.js → ContextMenuSubContent-B0Vs6atR.js} +4 -4
  4. package/dist/{DataTable-CUHMukiQ.js → DataTable-C464Zbqd.js} +99 -97
  5. package/dist/DialogContent-DDE6pQBU.js +103 -0
  6. package/dist/{DialogFooter-Gprw8H_A.js → DialogFooter-8eZbdmPc.js} +2 -2
  7. package/dist/FadingScroll-DwNnvKMs.js +76 -0
  8. package/dist/{HoverPopover-2LOIW34a.js → HoverPopover-Dpzwvc4t.js} +1 -1
  9. package/dist/IconChip-BDw1j5mu.js +54 -0
  10. package/dist/{IconTooltip-Cus0fvK0.js → IconTooltip-DSjasZIt.js} +1 -1
  11. package/dist/MetricBadge-BpC0R_Ec.js +79 -0
  12. package/dist/{Notification-DLMhblXR.js → Notification-DKjKsQq8.js} +10 -10
  13. package/dist/{NumberFieldContent-BbLOh8RU.js → NumberFieldContent-1VtwDSgf.js} +3 -3
  14. package/dist/PopoverContent-BTorlp--.js +127 -0
  15. package/dist/{Progress-iEuD9pxG.js → Progress-hAT4gqGH.js} +97 -77
  16. package/dist/{ScrollingText-BPP84wKo.js → ScrollingText-CUVFTWk2.js} +2 -2
  17. package/dist/{SelectScrollDownButton-T32cVFeM.js → SelectScrollDownButton-C1jb3b3K.js} +24 -8
  18. package/dist/{Switch-Ch-k3Rv-.js → Switch-Dr--uLGH.js} +2 -2
  19. package/dist/{Toaster-1rYWrmAm.js → Toaster-Bm_HQSpc.js} +55 -52
  20. package/dist/{ToggleGroupItem-COu_4IW4.js → ToggleGroupItem-Dzk9hWsF.js} +18 -22
  21. package/dist/animated-digit.js +3 -3
  22. package/dist/api/index.d.ts +10 -4
  23. package/dist/api.js +1 -1
  24. package/dist/aurora.js +113 -98
  25. package/dist/{badge-CaoFJzRb.js → badge-UILT_3pZ.js} +1 -1
  26. package/dist/badge.js +1 -1
  27. package/dist/{button-DN39cGqL.js → button-BNDWhAZb.js} +12 -12
  28. package/dist/button.js +1 -1
  29. package/dist/card.js +1 -1
  30. package/dist/carousel.d.ts +1 -1
  31. package/dist/carousel.js +101 -145
  32. package/dist/{check-BBKKKSTf.js → check-njhk-vfu.js} +1 -1
  33. package/dist/{chevron-down-BSkTP2aL.js → chevron-down-DKkxb4VV.js} +1 -1
  34. package/dist/{chevron-right-sDM0Yvrf.js → chevron-right-CPXbqQQz.js} +1 -1
  35. package/dist/{chevron-up-CCOD_FTz.js → chevron-up-n_24SqI-.js} +1 -1
  36. package/dist/coalesceMetric-5qIeZnTx.js +13 -0
  37. package/dist/collapsible.js +1 -1
  38. package/dist/{color-C5ls_QF7.js → color-DweYl7pE.js} +9 -7
  39. package/dist/color-swatch.d.ts +1 -0
  40. package/dist/color-swatch.js +47 -0
  41. package/dist/color.js +1 -1
  42. package/dist/command.js +1 -1
  43. package/dist/components/custom/animated-digit/AnimatedDigit.vue.d.ts +8 -0
  44. package/dist/components/custom/aurora/constants/presets.d.ts +16 -45
  45. package/dist/components/custom/aurora/constants/renderMode.d.ts +2 -0
  46. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +1 -1
  47. package/dist/components/custom/aurora/constants/shaders/vangogh-medium.glsl.d.ts +1 -0
  48. package/dist/components/custom/color-swatch/ColorSwatch.vue.d.ts +22 -0
  49. package/dist/components/custom/color-swatch/index.d.ts +1 -0
  50. package/dist/components/custom/configurator/Configurator.vue.d.ts +19 -8
  51. package/dist/components/custom/configurator/ConfiguratorRow.vue.d.ts +16 -0
  52. package/dist/components/custom/constellation/Constellation.vue.d.ts +23 -143
  53. package/dist/components/custom/constellation/composables/createConstellationField.d.ts +41 -0
  54. package/dist/components/custom/constellation/composables/useConstellation.d.ts +26 -0
  55. package/dist/components/custom/constellation/composables/useConstellationPointer.d.ts +35 -0
  56. package/dist/components/custom/constellation/constants.d.ts +61 -0
  57. package/dist/components/custom/constellation/constellationDraw.d.ts +30 -0
  58. package/dist/components/custom/constellation/constellationField.d.ts +3 -403
  59. package/dist/components/custom/constellation/constellationInteraction.d.ts +132 -0
  60. package/dist/components/custom/constellation/constellationTypes.d.ts +369 -0
  61. package/dist/components/custom/constellation/index.d.ts +5 -2
  62. package/dist/components/custom/controls/DarkModeToggle.vue.d.ts +11 -0
  63. package/dist/components/custom/dock/DockRail.vue.d.ts +89 -0
  64. package/dist/components/custom/dock/DockSection.vue.d.ts +69 -0
  65. package/dist/components/custom/dock/DockSeparator.vue.d.ts +49 -1
  66. package/dist/components/custom/dock/DockTabButton.vue.d.ts +5 -6
  67. package/dist/components/custom/dock/GlassDock.vue.d.ts +5 -118
  68. package/dist/components/custom/dock/composables/dockMorphContext.d.ts +36 -0
  69. package/dist/components/custom/dock/composables/index.d.ts +1 -0
  70. package/dist/components/custom/dock/composables/useDockClickIntegrity.d.ts +23 -0
  71. package/dist/components/custom/dock/composables/useDockMorphWindow.d.ts +15 -0
  72. package/dist/components/custom/dock/composables/useDockOrientationMorph.d.ts +44 -0
  73. package/dist/components/custom/dock/composables/useDockShellProps.d.ts +165 -0
  74. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +44 -0
  75. package/dist/components/custom/dock/constants.d.ts +83 -0
  76. package/dist/components/custom/dock/index.d.ts +5 -0
  77. package/dist/components/custom/expandable-container/ExpandableContainer.vue.d.ts +15 -37
  78. package/dist/components/custom/fading-scroll/FadingScroll.vue.d.ts +25 -0
  79. package/dist/components/custom/fading-scroll/composables/useFadingScroll.d.ts +31 -0
  80. package/dist/components/custom/fading-scroll/constants.d.ts +19 -0
  81. package/dist/components/custom/fading-scroll/index.d.ts +2 -0
  82. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +7 -0
  83. package/dist/components/custom/fourier-field/index.d.ts +1 -1
  84. package/dist/components/custom/fourier-field/math.d.ts +34 -0
  85. package/dist/components/custom/fourier-field/presets.d.ts +54 -0
  86. package/dist/components/custom/glass-panel/GlassPanel.vue.d.ts +8 -0
  87. package/dist/components/custom/goo-blob/composables/buildMetaballProgram.d.ts +18 -0
  88. package/dist/components/custom/goo-blob/composables/uploadBlobUniforms.d.ts +41 -0
  89. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +4 -3
  90. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +21 -8
  91. package/dist/components/custom/goo-blob/constants.d.ts +57 -0
  92. package/dist/components/custom/goo-blob/shaders/metaball-uniforms.glsl.d.ts +1 -0
  93. package/dist/components/custom/handmark/brush.d.ts +33 -6
  94. package/dist/components/custom/handmark/{useHandMark.d.ts → composables/useHandMark.d.ts} +6 -4
  95. package/dist/components/custom/handmark/constants.d.ts +39 -0
  96. package/dist/components/custom/handmark/geometry.d.ts +14 -12
  97. package/dist/components/custom/handmark/index.d.ts +8 -2
  98. package/dist/components/custom/handmark/types.d.ts +9 -0
  99. package/dist/components/custom/icon-chip/IconChip.vue.d.ts +4 -0
  100. package/dist/components/custom/icon-chip/index.d.ts +2 -0
  101. package/dist/components/custom/icon-chip/types.d.ts +72 -0
  102. package/dist/components/custom/instrument-chassis/InstrumentChassis.vue.d.ts +17 -4
  103. package/dist/components/custom/labeled-field/LabeledField.vue.d.ts +37 -0
  104. package/dist/components/custom/labeled-field/LabeledSelect.vue.d.ts +6 -0
  105. package/dist/components/custom/labeled-field/LabeledSlider.vue.d.ts +6 -0
  106. package/dist/components/custom/labeled-field/LabeledSwitch.vue.d.ts +6 -0
  107. package/dist/components/custom/metric-badge/MetricBadge.vue.d.ts +11 -18
  108. package/dist/components/custom/metric-badge/index.d.ts +1 -0
  109. package/dist/components/custom/metric-cell/MetricCell.vue.d.ts +15 -4
  110. package/dist/components/custom/metric-stack/MetricRow.vue.d.ts +6 -4
  111. package/dist/components/custom/pager-dots/PagerDots.vue.d.ts +39 -0
  112. package/dist/components/custom/pager-dots/index.d.ts +2 -0
  113. package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +20 -25
  114. package/dist/components/custom/tabs/composables/useTabIndicator.d.ts +30 -21
  115. package/dist/components/custom/tabs/constants.d.ts +18 -0
  116. package/dist/components/custom/tabs/index.d.ts +1 -1
  117. package/dist/components/custom/watercolor-dot/WatercolorDot.vue.d.ts +14 -0
  118. package/dist/components/ui/_shared/index.d.ts +2 -0
  119. package/dist/components/ui/_shared/menuItemVariants.d.ts +19 -0
  120. package/dist/components/ui/_shared/useSurfaceAxis.d.ts +41 -0
  121. package/dist/components/ui/card/Card.vue.d.ts +16 -4
  122. package/dist/components/ui/carousel/index.d.ts +0 -1
  123. package/dist/components/ui/command/Command.vue.d.ts +3 -0
  124. package/dist/components/ui/dialog/DialogContent.vue.d.ts +8 -3
  125. package/dist/components/ui/drawer/Drawer.vue.d.ts +1 -0
  126. package/dist/components/ui/drawer/DrawerContent.vue.d.ts +5 -0
  127. package/dist/components/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts +2 -2
  128. package/dist/components/ui/index.d.ts +0 -1
  129. package/dist/components/ui/metric-pill/MetricPill.vue.d.ts +6 -3
  130. package/dist/components/ui/popover/PopoverContent.vue.d.ts +3 -0
  131. package/dist/components/ui/progress/ProgressSectioned.vue.d.ts +14 -3
  132. package/dist/components/ui/select/SelectTrigger.vue.d.ts +27 -4
  133. package/dist/components/ui/sheet/SheetContent.vue.d.ts +6 -0
  134. package/dist/components/ui/skeleton/Skeleton.vue.d.ts +3 -0
  135. package/dist/components/ui/slider/index.d.ts +22 -19
  136. package/dist/components/ui/tabs/TabsIndicator.vue.d.ts +4 -1
  137. package/dist/components/ui/toast/use-toast.d.ts +2 -2
  138. package/dist/components/ui/toggle/Toggle.vue.d.ts +1 -1
  139. package/dist/components/ui/toggle/index.d.ts +1 -1
  140. package/dist/components/ui/toggle-group/ToggleGroup.vue.d.ts +1 -7
  141. package/dist/components/ui/toggle-group/ToggleGroupItem.vue.d.ts +1 -3
  142. package/dist/components/ui/toggle-group/toggleGroupContext.d.ts +0 -13
  143. package/dist/composables/color/index.d.ts +12 -0
  144. package/dist/composables/dark/useGlobalDark.d.ts +14 -12
  145. package/dist/composables/glass/index.d.ts +0 -1
  146. package/dist/composables/glass/useGlassBackdropLuminance.d.ts +59 -0
  147. package/dist/composables/glass/useSpecularTracking.d.ts +12 -3
  148. package/dist/composables/motion/core/index.d.ts +1 -1
  149. package/dist/composables/motion/curves.d.ts +48 -0
  150. package/dist/composables/motion/index.d.ts +2 -0
  151. package/dist/composables/motion/springPresets.d.ts +33 -0
  152. package/dist/composables/motion/suite.d.ts +2 -0
  153. package/dist/composables/motion/useLiquidFlex.d.ts +85 -0
  154. package/dist/composables/motion/useSpringMount.d.ts +1 -1
  155. package/dist/composables/motion/useViewTransition.d.ts +36 -1
  156. package/dist/configurator.js +1 -1
  157. package/dist/confirm-dialog.js +3 -3
  158. package/dist/constellation.js +373 -261
  159. package/dist/context-menu.js +2 -2
  160. package/dist/controls.js +48 -14
  161. package/dist/dark.js +1 -1
  162. package/dist/data-table.js +1 -1
  163. package/dist/dialog.js +2 -2
  164. package/dist/dock.js +901 -372
  165. package/dist/dockContext-Bu1Avy-a.js +17 -0
  166. package/dist/dom.js +5 -5
  167. package/dist/{dropdown-menu-D77jX6Df.js → dropdown-menu-BJ7E9js_.js} +11 -8
  168. package/dist/dropdown-menu.js +1 -1
  169. package/dist/expandable-container.js +44 -81
  170. package/dist/fading-scroll.d.ts +1 -0
  171. package/dist/fading-scroll.js +2 -0
  172. package/dist/forms.js +5 -5
  173. package/dist/fourier-field.js +140 -104
  174. package/dist/fourier-math.js +2 -2
  175. package/dist/glass-panel.js +90 -21
  176. package/dist/glass-ui.css +1 -1
  177. package/dist/glass-ui.js +230 -236
  178. package/dist/goo-blob.js +264 -228
  179. package/dist/handmark.js +203 -159
  180. package/dist/header-ribbon.js +1 -1
  181. package/dist/hover-card.js +1 -1
  182. package/dist/hover-popover.js +1 -1
  183. package/dist/icon-chip.d.ts +1 -0
  184. package/dist/icon-chip.js +2 -0
  185. package/dist/icon-tooltip.js +1 -1
  186. package/dist/index.d.ts +3 -5
  187. package/dist/instrument-chassis.js +1 -1
  188. package/dist/keyboard.js +1 -1
  189. package/dist/label.js +1 -1
  190. package/dist/labeled-field.js +28 -18
  191. package/dist/{math-DTpRVC0e.js → math-DeuJwLFx.js} +26 -2
  192. package/dist/{menuItemVariants-CCoBNkU5.js → menuItemVariants-DWRQXBxJ.js} +10 -4
  193. package/dist/metric-badge.js +1 -1
  194. package/dist/metric-cell.js +29 -22
  195. package/dist/metric-stack.js +35 -34
  196. package/dist/{minimize-2-lcXOuc6V.js → minimize-2-BV31Ob_h.js} +1 -1
  197. package/dist/motion-core.js +32 -136
  198. package/dist/motion-curves.d.ts +1 -0
  199. package/dist/motion-curves.js +130 -0
  200. package/dist/motion.js +38 -37
  201. package/dist/notification.js +1 -1
  202. package/dist/number-field.js +1 -1
  203. package/dist/pager-dots.d.ts +1 -0
  204. package/dist/pager-dots.js +91 -0
  205. package/dist/paper-backdrop.js +1 -1
  206. package/dist/popover.js +1 -1
  207. package/dist/progress.js +1 -1
  208. package/dist/pulse.js +1 -1
  209. package/dist/reactive.js +2 -2
  210. package/dist/scrolling-text.js +1 -1
  211. package/dist/{search-nbkvr2dC.js → search-BSGrf2Sk.js} +1 -1
  212. package/dist/search.js +10 -10
  213. package/dist/select.js +3 -3
  214. package/dist/separator.js +1 -1
  215. package/dist/sheet-CquRYOAw.js +218 -0
  216. package/dist/sheet.js +1 -1
  217. package/dist/{slider-ClgpP7EB.js → slider-DQ95MET2.js} +8 -8
  218. package/dist/slider.js +1 -1
  219. package/dist/sortable-list.js +3 -3
  220. package/dist/springPresets-WXaLbu8u.js +40 -0
  221. package/dist/stacked-icons.js +6 -6
  222. package/dist/styles/animations.css +25 -125
  223. package/dist/styles/cards.css +55 -0
  224. package/dist/styles/components.css +4 -1
  225. package/dist/styles/configurator.css +77 -0
  226. package/dist/styles/dock/density.css +19 -0
  227. package/dist/styles/dock/layer-group.css +83 -25
  228. package/dist/styles/dock/layers.css +23 -1
  229. package/dist/styles/dock/morph-bridge.css +123 -0
  230. package/dist/styles/dock/morph.css +175 -45
  231. package/dist/styles/dock/overflow.css +66 -1
  232. package/dist/styles/dock/rail-extend.css +397 -0
  233. package/dist/styles/dock/section.css +59 -0
  234. package/dist/styles/dock/shell.css +97 -110
  235. package/dist/styles/dock-controls/dark-mode-toggle.css +109 -0
  236. package/dist/styles/dock-controls/icon-button.css +143 -0
  237. package/dist/styles/dock-controls/tab-button.css +143 -0
  238. package/dist/styles/dock-controls/touch-floor.css +94 -0
  239. package/dist/styles/dock-controls/triggers.css +135 -0
  240. package/dist/styles/dock-controls.css +30 -595
  241. package/dist/styles/dock.css +8 -3
  242. package/dist/styles/drawer.css +48 -0
  243. package/dist/styles/feedback-tone.css +104 -0
  244. package/dist/styles/floating-panel.css +17 -0
  245. package/dist/styles/glass/a11y-fallback.css +245 -0
  246. package/dist/styles/glass/ladder.css +383 -0
  247. package/dist/styles/glass/material.css +238 -0
  248. package/dist/styles/glass/progress-rail.css +78 -0
  249. package/dist/styles/glass/squircle.css +66 -0
  250. package/dist/styles/glass/surface-axis.css +113 -0
  251. package/dist/styles/glass/surfaces.css +382 -0
  252. package/dist/styles/glass-refract.css +2 -0
  253. package/dist/styles/glass.css +34 -1188
  254. package/dist/styles/hover-popover.css +2 -0
  255. package/dist/styles/icon-chip.css +149 -0
  256. package/dist/styles/index.css +94 -18
  257. package/dist/styles/instrument-chassis.css +46 -0
  258. package/dist/styles/menu.css +127 -0
  259. package/dist/styles/paper.css +2 -68
  260. package/dist/styles/segmented-tabs.css +346 -0
  261. package/dist/styles/select.css +50 -0
  262. package/dist/styles/theme/bridges.css +347 -0
  263. package/dist/styles/theme/dark.css +7 -0
  264. package/dist/styles/theme/literals.css +94 -0
  265. package/dist/styles/theme/radius.css +95 -0
  266. package/dist/styles/theme.css +26 -529
  267. package/dist/styles/tokens/color-radius.css +287 -0
  268. package/dist/styles/tokens/dark-arm.css +308 -0
  269. package/dist/styles/tokens/glass.css +500 -0
  270. package/dist/styles/tokens/light-dark.css +187 -0
  271. package/dist/styles/tokens/offsets-sizing.css +562 -0
  272. package/dist/styles/tokens/property-regs.css +162 -0
  273. package/dist/styles/tokens/scale-paper.css +409 -0
  274. package/dist/styles/tokens/scheme-motion.css +352 -0
  275. package/dist/styles/tokens/shadow.css +166 -0
  276. package/dist/styles/tokens.css +22 -2360
  277. package/dist/styles/transitions.css +7 -7
  278. package/dist/styles/typography/scale.css +153 -0
  279. package/dist/styles/typography/semantic.css +220 -0
  280. package/dist/styles/typography/utilities.css +159 -0
  281. package/dist/styles/typography.css +23 -453
  282. package/dist/styles/utilities/a11y-overrides.css +169 -0
  283. package/dist/styles/utilities/animate.css +26 -0
  284. package/dist/styles/utilities/base.css +541 -0
  285. package/dist/styles/utilities/btn.css +218 -0
  286. package/dist/styles/utilities/components.css +317 -0
  287. package/dist/styles/utilities.css +19 -1318
  288. package/dist/styles/view-transition.css +4 -52
  289. package/dist/switch.js +1 -1
  290. package/dist/tabs.js +161 -181
  291. package/dist/timeline.js +2 -2
  292. package/dist/toast.js +1 -1
  293. package/dist/toggle-chip.js +3 -1
  294. package/dist/toggle-group.js +1 -1
  295. package/dist/tooltip.js +1 -1
  296. package/dist/typewriter.js +1 -1
  297. package/dist/{useAnimatedNumber-Bcpy5Etf.js → useAnimatedNumber-C_3wZLx4.js} +1 -1
  298. package/dist/useConfiguratorState-kiIlun8I.js +303 -0
  299. package/dist/useLiquidFlex-C12hXwOZ.js +30 -0
  300. package/dist/useRAFLoop-CdwJ7284.js +109 -0
  301. package/dist/{useScrollProgress-CffFGLa5.js → useScrollProgress-D7bYU2RK.js} +1 -1
  302. package/dist/useSpecularTracking-Bo5su68i.js +32 -0
  303. package/dist/useSpringMount-CvopqiFr.js +108 -0
  304. package/dist/useSurfaceAxis-CMnF2zHb.js +7 -0
  305. package/dist/{useTouchGate-WFyJYsth.js → useTouchGate-28Tk2-t2.js} +1 -1
  306. package/dist/useViewTransition-COsPjQVZ.js +47 -0
  307. package/dist/utils/coalesceMetric.d.ts +29 -0
  308. package/dist/utils/index.d.ts +1 -0
  309. package/dist/vReveal-D9k0jADx.js +10 -0
  310. package/dist/watercolor-dot.js +22 -13
  311. package/dist/{x-Dfsegz9Y.js → x-BUwTKe50.js} +1 -1
  312. package/package.json +134 -50
  313. package/src/styles/animations.css +25 -125
  314. package/src/styles/cards.css +53 -0
  315. package/src/styles/configurator.css +77 -0
  316. package/src/styles/dock/density.css +19 -0
  317. package/src/styles/dock/layer-group.css +83 -25
  318. package/src/styles/dock/layers.css +23 -1
  319. package/src/styles/dock/morph-bridge.css +123 -0
  320. package/src/styles/dock/morph.css +175 -45
  321. package/src/styles/dock/overflow.css +66 -1
  322. package/src/styles/dock/rail-extend.css +397 -0
  323. package/src/styles/dock/section.css +59 -0
  324. package/src/styles/dock/shell.css +97 -110
  325. package/src/styles/dock-controls/dark-mode-toggle.css +109 -0
  326. package/src/styles/dock-controls/icon-button.css +143 -0
  327. package/src/styles/dock-controls/tab-button.css +143 -0
  328. package/src/styles/dock-controls/touch-floor.css +94 -0
  329. package/src/styles/dock-controls/triggers.css +135 -0
  330. package/src/styles/dock-controls.css +30 -595
  331. package/src/styles/dock.css +8 -3
  332. package/src/styles/drawer.css +42 -0
  333. package/src/styles/feedback-tone.css +104 -0
  334. package/src/styles/floating-panel.css +15 -0
  335. package/src/styles/glass/a11y-fallback.css +245 -0
  336. package/src/styles/glass/ladder.css +383 -0
  337. package/src/styles/glass/material.css +238 -0
  338. package/src/styles/glass/progress-rail.css +78 -0
  339. package/src/styles/glass/squircle.css +66 -0
  340. package/src/styles/glass/surface-axis.css +113 -0
  341. package/src/styles/glass/surfaces.css +382 -0
  342. package/src/styles/glass.css +34 -1188
  343. package/src/styles/icon-chip.css +149 -0
  344. package/src/styles/index.css +93 -17
  345. package/src/styles/instrument-chassis.css +42 -0
  346. package/src/styles/menu.css +127 -0
  347. package/src/styles/paper.css +2 -68
  348. package/src/styles/segmented-tabs.css +340 -0
  349. package/src/styles/select.css +50 -0
  350. package/src/styles/theme/bridges.css +347 -0
  351. package/src/styles/theme/dark.css +7 -0
  352. package/src/styles/theme/literals.css +94 -0
  353. package/src/styles/theme/radius.css +95 -0
  354. package/src/styles/theme.css +26 -529
  355. package/src/styles/tokens/color-radius.css +287 -0
  356. package/src/styles/tokens/dark-arm.css +308 -0
  357. package/src/styles/tokens/glass.css +500 -0
  358. package/src/styles/tokens/light-dark.css +187 -0
  359. package/src/styles/tokens/offsets-sizing.css +562 -0
  360. package/src/styles/tokens/property-regs.css +162 -0
  361. package/src/styles/tokens/scale-paper.css +409 -0
  362. package/src/styles/tokens/scheme-motion.css +352 -0
  363. package/src/styles/tokens/shadow.css +166 -0
  364. package/src/styles/tokens.css +22 -2360
  365. package/src/styles/transitions.css +7 -7
  366. package/src/styles/typography/scale.css +153 -0
  367. package/src/styles/typography/semantic.css +220 -0
  368. package/src/styles/typography/utilities.css +159 -0
  369. package/src/styles/typography.css +23 -453
  370. package/src/styles/utilities/a11y-overrides.css +169 -0
  371. package/src/styles/utilities/animate.css +26 -0
  372. package/src/styles/utilities/base.css +541 -0
  373. package/src/styles/utilities/btn.css +218 -0
  374. package/src/styles/utilities/components.css +317 -0
  375. package/src/styles/utilities.css +19 -1318
  376. package/src/styles/view-transition.css +4 -52
  377. package/dist/CardAction-DuArVky-.js +0 -157
  378. package/dist/DeckProgress-Dmk4_AKN.js +0 -23
  379. package/dist/DialogContent-BRkT1cjP.js +0 -100
  380. package/dist/InstrumentRail-CUJ05YVG.js +0 -44
  381. package/dist/MetricBadge-BZVWIxNy.js +0 -80
  382. package/dist/PopoverContent-BId6ggf_.js +0 -121
  383. package/dist/TabsList-B8CVOQPC.js +0 -101
  384. package/dist/components/custom/deck-progress/DeckProgress.vue.d.ts +0 -27
  385. package/dist/components/custom/deck-progress/index.d.ts +0 -2
  386. package/dist/components/custom/dialog-native/GlassDialogNative.vue.d.ts +0 -57
  387. package/dist/components/custom/dialog-native/index.d.ts +0 -1
  388. package/dist/components/custom/instrument-rail/InstrumentRail.vue.d.ts +0 -91
  389. package/dist/components/custom/instrument-rail/index.d.ts +0 -2
  390. package/dist/components/ui/carousel/CarouselDots.vue.d.ts +0 -4
  391. package/dist/composables/motion/useRouteTransition.d.ts +0 -42
  392. package/dist/deck-progress.d.ts +0 -1
  393. package/dist/deck-progress.js +0 -2
  394. package/dist/dockContext-BKeIMmNk.js +0 -9
  395. package/dist/instrument-rail.d.ts +0 -1
  396. package/dist/instrument-rail.js +0 -2
  397. package/dist/sheet-VZEtNFvO.js +0 -214
  398. package/dist/styles/instrument-rail.css +0 -127
  399. package/dist/useConfiguratorState-DxAqksK6.js +0 -287
  400. package/dist/useGlassRenderer-D7YGOYiM.js +0 -69
  401. package/dist/useSpecularTracking-BVRZsRHA.js +0 -26
  402. package/dist/useSpringMount-BJSHcLl3.js +0 -113
  403. package/dist/useViewTransition-DaN5Zrox.js +0 -21
  404. package/dist/vReveal-zUIQk-rJ.js +0 -53
  405. package/src/styles/instrument-rail.css +0 -127
  406. /package/dist/{CollapsibleContent-CP9qF1v4.js → CollapsibleContent-C_s6fG7r.js} +0 -0
  407. /package/dist/{ContextMenuContent-DDa0v27s.js → ContextMenuContent-ON3x7cuk.js} +0 -0
  408. /package/dist/{HoverCardContent-B6CcQ8He.js → HoverCardContent-DkMaQzH5.js} +0 -0
  409. /package/dist/{Input-xuDwALQR.js → Input-DVG_J0ne.js} +0 -0
  410. /package/dist/{InstrumentChassis-C2f6cBaQ.js → InstrumentChassis-UUJX0-mW.js} +0 -0
  411. /package/dist/{Label-zRfbQdCn.js → Label-Ck9SWEKM.js} +0 -0
  412. /package/dist/{ModalOverlay-B1GkAjNb.js → ModalOverlay-CkPRRgl_.js} +0 -0
  413. /package/dist/{PaperBackdrop-CqwjnfLv.js → PaperBackdrop-nBKe0vkB.js} +0 -0
  414. /package/dist/{SelectGroup-BFiod7X2.js → SelectGroup-Dcczq44n.js} +0 -0
  415. /package/dist/{SelectSeparator-C4Ql0gzV.js → SelectSeparator-DK2y1Bun.js} +0 -0
  416. /package/dist/{Separator-D7sD7RKj.js → Separator-BArl4OaB.js} +0 -0
  417. /package/dist/{TooltipProvider-CmZzCuaG.js → TooltipProvider-B3MkB_8P.js} +0 -0
  418. /package/dist/{_plugin-vue_export-helper-ok8pgSl5.js → _plugin-vue_export-helper-CBt_VvXa.js} +0 -0
  419. /package/dist/{compile-BOXjLUxu.js → compile-EXXzEr1q.js} +0 -0
  420. /package/dist/{constants-yKeKnE84.js → constants-BPOqYJAm.js} +0 -0
  421. /package/dist/{createContext-B44Sah_H.js → createContext-B2RaZ-b8.js} +0 -0
  422. /package/dist/{createLucideIcon-B6uNAU9G.js → createLucideIcon-DydS2qgk.js} +0 -0
  423. /package/dist/{presets-BP_ALM0m.js → presets-BW2b-fr1.js} +0 -0
  424. /package/dist/{prng-D27-B3tK.js → prng-Cg22zv8g.js} +0 -0
  425. /package/dist/{supportsCssTimeline-C5oe0lnD.js → supportsCssTimeline-BWenxvHU.js} +0 -0
  426. /package/dist/{useGlobalDark-CAhOXNLO.js → useGlobalDark-C28t0VWJ.js} +0 -0
  427. /package/dist/{useIntersectionPause-Cck5Uxk8.js → useIntersectionPause-Bj4sPkMh.js} +0 -0
  428. /package/dist/{useInterval-Dsmqwi03.js → useInterval-CNdua40W.js} +0 -0
  429. /package/dist/{useKeyboardShortcuts-CyIYrndH.js → useKeyboardShortcuts-BXWXOZ-9.js} +0 -0
  430. /package/dist/{useResizeObserver-CWCbk5Px.js → useResizeObserver-V6nq5gJb.js} +0 -0
  431. /package/dist/{useResolveTokenColor-r9pnNjqK.js → useResolveTokenColor-NUG2zYAW.js} +0 -0
  432. /package/dist/{useSortable-C8ReQ50P.js → useSortable-BVqlJRBR.js} +0 -0
  433. /package/dist/{useTextHighlight-CWEi25hf.js → useTextHighlight-NmBM5V_4.js} +0 -0
  434. /package/dist/{useTimer-3xqf_54b.js → useTimer-B_PAasDL.js} +0 -0
  435. /package/dist/{useUserInvalidAria-DoJKMZ3s.js → useUserInvalidAria-CDfJuakL.js} +0 -0
  436. /package/dist/{useViewportReady-RIr5Wgkh.js → useViewportReady-CvBcCYDf.js} +0 -0
@@ -0,0 +1,78 @@
1
+ /* glass/progress-rail.css
2
+ The @utility glass-progress-rail — restyles <Progress variant=default> into the deck-position rail. A @utility (not @layer components) so it outranks the variant's baked h-4/rounded-pill utilities.
3
+ Carved from the glass.css cascade root; @import-ed by glass.css in cascade
4
+ order, each in its own @layer components (isomorphic to the monolith).
5
+ See docs/precepts/design-idioms.md §cohesion-aware partials. */
6
+ /* ── Deck-position rail (AW.W16 · AX.W24) ───────────────────────────────────
7
+ A Tailwind `@utility` that RESTYLES the shipped `<Progress variant="default">`
8
+ (the reka-ui ProgressRoot track + its indicator child) into the thin
9
+ bottom-of-deck position rail. It composes the EXISTING fill — it does NOT
10
+ re-author a second track/range mechanic. Every visual axis is a
11
+ `--progress-rail-*` token, so a consumer/dark-flip re-tints with zero library
12
+ edit (`:root { --progress-rail-fill: … }`). The viewport-pinned chrome
13
+ (`position: fixed`, `env(safe-area-inset-bottom)`, the z-index) is CONSUMER-
14
+ supplied — this recipe owns only the LOOK.
15
+
16
+ AX.W24 — WHY `@utility`, not `@layer components`. The rail RESTYLES the default
17
+ Progress: it must override the `h-4` height + `rounded-pill` radius utilities the
18
+ variant bakes. Those utilities live in `@layer utilities`, which ALWAYS outranks
19
+ `@layer components` regardless of source order, so the prior `@layer components`
20
+ recipe's `height: 3px` was a silent no-op (the rail painted as a 16px bar). An
21
+ `@utility` lands the recipe IN `@layer utilities` alongside `h-4`, where a single-
22
+ class selector wins the geometry by source order — the idiomatic Tailwind-v4 way
23
+ to author a restyle-class that out-ranks base utilities (the `btn-audacious` /
24
+ `cartoon-surface` pattern).
25
+
26
+ The COLOUR fix is the SEPARATE token-read-at-source path (NOT a layer-juggle):
27
+ `ProgressDefault` reads `--progress-fill`/`--progress-track` and dropped its
28
+ `bg-secondary`/`bg-primary` utilities, so this recipe FEEDS those tokens rather
29
+ than fighting a utility colour. The `--progress-fill` set on the rail root cascades
30
+ to the indicator child (a CSS custom property inherits), so the indicator reads the
31
+ override hue. */
32
+ @utility glass-progress-rail {
33
+ /* The track hairline + zero radius — the rail reads as a thin square sliver, not
34
+ the variant's 16px `rounded-pill` bar. A single-class @utility ties `h-4`/
35
+ `rounded-pill` on SPECIFICITY (both 0,1,0) and Tailwind's utility sort can emit
36
+ `h-4` later, so the bare tie loses. The doubled-class self-reference (`&&` →
37
+ `.glass-progress-rail.glass-progress-rail`, specificity 0,2,0) wins the geometry
38
+ DETERMINISTICALLY over the base utilities regardless of emit order — the precise,
39
+ contained way to out-rank a base utility without `!important`. */
40
+ && {
41
+ height: var(--progress-rail-h, 3px);
42
+ border-radius: 0;
43
+ }
44
+ /* Feed the token-read default variant — these route the consumer's
45
+ `--progress-rail-*` axes into the `--progress-fill`/`--progress-track` tokens
46
+ the variant reads at source (the cascade-correct colour path). */
47
+ --progress-track: var(
48
+ --progress-rail-track,
49
+ color-mix(in srgb, var(--foreground) 8%, transparent)
50
+ );
51
+ --progress-fill: var(--progress-rail-fill, var(--primary));
52
+
53
+ /* The fill — the shipped ProgressIndicator child. The indicator paints the
54
+ inherited `--progress-fill`; the leading-edge glow is re-authored (AX.W24 F2)
55
+ as a TRAILING right-edge INSET box-shadow that lives INSIDE the indicator's
56
+ own box. The prior `4px 0 8px` OUTSET rightward shadow extended PAST the fill
57
+ boundary into the ProgressRoot's load-bearing `overflow-hidden` clip and was
58
+ eaten — invisible at every value. An `inset` shadow offset leftward
59
+ (`inset -Npx 0 …`) brightens just inside the indicator's right (leading) edge
60
+ — the moving position head — and never crosses the fill boundary, so the clip
61
+ cannot eat it (the clip is never lifted; that would re-break the default
62
+ Progress look for every other consumer). `box-shadow` is a separate property
63
+ from `background`, so it composes cleanly over the token-read fill. */
64
+ && > * {
65
+ border-radius: 0;
66
+ box-shadow:
67
+ inset
68
+ calc(-1 * var(--progress-rail-glow-x, 4px))
69
+ 0
70
+ var(--progress-rail-glow-blur, 8px)
71
+ calc(-1 * var(--progress-rail-glow-spread, 2px))
72
+ color-mix(
73
+ in srgb,
74
+ hsl(0 0% 100%) var(--progress-rail-glow-strength, 55%),
75
+ transparent
76
+ );
77
+ }
78
+ }
@@ -0,0 +1,66 @@
1
+ /* glass/squircle.css
2
+ The AX.W56 rounded-vs-squircle policy + the @supports (corner-shape: superellipse(2)) squircle coupling onto the overlay-band glass. After the base ladder (overrides it).
3
+ Carved from the glass.css cascade root; @import-ed by glass.css in cascade
4
+ order, each in its own @layer components (isomorphic to the monolith).
5
+ See docs/precepts/design-idioms.md §cohesion-aware partials. */
6
+ /* ── AX.W56 — the rounded-vs-squircle POLICY (re-homes AW.W23's squircle) ─────
7
+ Cards, glass buttons, and pills stay ROUND. The earlier AW.W23 block applied
8
+ `corner-shape: squircle` to `.glass-card`/`.glass-btn`/`.btn-pill`, which
9
+ inverted the design intent — the superellipse is imperceptible at a 16px card
10
+ radius or a stadium pill, so the squircle on those surfaces was visual cost
11
+ without read. The squircle is RE-HOMED onto the one surface where it reads: the
12
+ big-dock card shell (`dock.css` → `var(--corner-shape-bigdock)` under
13
+ `@supports (corner-shape: superellipse(2))`). This is a clean break — no alias,
14
+ no `--corner-shape-card` decl here (it resolves `round`, the default, so a
15
+ `corner-shape` rule would be a no-op). The `--corner-shape-*` token axis lives
16
+ in `theme.css`; a consumer who WANTS a squircle card opts in by re-pointing
17
+ `--corner-shape-card` at `superellipse(var(--corner-k-squircle))`. Do NOT
18
+ re-add a squircle rule to the card/button/pill surfaces — they are round by
19
+ policy. */
20
+
21
+ /* ── AX.W56(R1) + W56b — squircle coupling onto the large-radius glass FAMILY ───
22
+ W54 makes GLASS the default for the overlay-band surfaces; W56(R1)+W56b couple
23
+ the SQUIRCLE onto the whole LARGE-RADIUS glass family — Dialog + Sheet content
24
+ (`.glass-floating.{rounded-dialog,sheet-animate}`), the Configurator/floating
25
+ PANEL (`.configurator`, `.floating-panel`), and the glass HERO overlay
26
+ (`.glass-hero`, the thin opt-in utility the page-redesign hero reads). Every one
27
+ sits AT or ABOVE the ~--radius-xl threshold where the superellipse READS — the
28
+ same iOS-26 idiom the big-dock card shell carries (the backdrop-filter blur halo
29
+ + the cartoon under-shadow follow the shape). Each surface reads its OWN
30
+ tokenized `var(--corner-shape-<surface>)` (theme.css) so it is independently
31
+ overridable — never a blanket `.glass-floating` rule (data cards + pills stay
32
+ round by policy; the compound selectors scope to the named surface only). Mirrors
33
+ the big-dock idiom EXACTLY: an `@supports`-gated ENHANCEMENT (Chrome 139+, no
34
+ FF/Safari 2026) over the `border-radius` round CONTRACT — the squircle is the
35
+ better tier, NOT a degraded fallback. The `@supports` condition tests the LITERAL
36
+ `superellipse(2)` (a `var()` is not evaluable in an `@supports` query) — the same
37
+ Chrome-139 feature the token resolves to. */
38
+ @layer components {
39
+ @supports (corner-shape: superellipse(2)) {
40
+ .glass-floating.rounded-dialog {
41
+ corner-shape: var(--corner-shape-dialog);
42
+ }
43
+ .glass-floating.sheet-animate {
44
+ corner-shape: var(--corner-shape-sheet);
45
+ }
46
+ .configurator,
47
+ .floating-panel {
48
+ corner-shape: var(--corner-shape-panel);
49
+ }
50
+ .glass-hero {
51
+ corner-shape: var(--corner-shape-hero);
52
+ }
53
+ }
54
+ }
55
+
56
+ /* ── The glass HERO opt-in utility (W56b fold 7) ────────────────────────────────
57
+ A thin large-radius editorial glass OVERLAY — distinct from a data Card (which
58
+ stays round by policy). It is the surface the page-redesign hero (W60) reads;
59
+ minting it here (with its consumer) keeps the squircle off every `.glass-card`.
60
+ The corner-shape squircle rides the `@supports` block above; the un-gated
61
+ `border-radius` here is the cross-engine round CONTRACT. */
62
+ @layer components {
63
+ .glass-hero {
64
+ border-radius: var(--radius-2xl);
65
+ }
66
+ }
@@ -0,0 +1,113 @@
1
+ /* glass/surface-axis.css — the ONE shared {glass·veil·opaque} surface-decoration
2
+ axis (BA.W-SURFACE-AXIS).
3
+
4
+ The house minted `--glass-level` (the opacity knob, AX.W54) and `--glass-tint-*`
5
+ (the legibility seam, AX.W55) as SHARED inheriting axes, but left the
6
+ {glass·veil·opaque} surface-DECORATION choice as a per-component one-off
7
+ (`<Card>` had the only true axis; `<Dialog>` a binary string; everyone else
8
+ none). This seam factors that choice ONCE — every enrolled surface composes a
9
+ base glass tier + the `[data-surface]` attribute, and these rules apply the
10
+ three-rung decoration UNIFORMLY:
11
+
12
+ glass — the resolved tier's plain glass rung (IDENTITY; no rule needed —
13
+ the bare tier paints).
14
+ veil — the borderless/rimless text-legibility plate: the `--glass-bg-quiet`
15
+ fill + blur with the box border AND rim STRIPPED (the boxed look
16
+ reads as a dividing line on a text plate). Reads `--glass-bg-quiet`
17
+ + the W55 `--glass-tint-*` seam through the SAME `--glass-*` ladder,
18
+ so `--glass-level` / the bright-bucket darken retune it in lockstep
19
+ with every glass surface — NO veil-local recipe fork.
20
+ opaque — the `--glass-level:0` solid-card escape (the `.glass-opaque` rung):
21
+ solid `--card` + `blur(0)` through the ONE level knob, the tint axis
22
+ zeroed (a solid plate has no translucent backdrop to darken-over).
23
+
24
+ NO second axis: `cartoon` stays a Card-local decoration (it is NOT a
25
+ {glass·veil·opaque} member — the shared axis is the three-rung MATERIAL
26
+ decoration; cartoon rides Card's own `surface` superset). The `Surface` union +
27
+ the `surfaceClass(surface, tier)` resolver are the TS half
28
+ (`src/components/ui/_shared/useSurfaceAxis.ts`); this file is the CSS half.
29
+
30
+ Cascade: `@layer components`, @import-ed AFTER ladder.css so the attr rules
31
+ (specificity 0-1-0, equal to the `.glass-*` classes) win by source order over
32
+ the base rung's border/box-shadow. */
33
+ @layer components {
34
+ /* ── veil — the borderless text-legibility plate ──────────────────────────
35
+ Composes the SAME deltas as the `veil-surface` @utility (cards.css), keyed
36
+ off the SAME `--glass-bg-quiet` + `--glass-tint-*` tokens (no recipe fork).
37
+ Each delta is an overridable `--veil-*` rung so a consumer re-points the
38
+ plate to any other ladder rung. */
39
+ [data-surface="veil"] {
40
+ --veil-bg: color-mix(
41
+ in oklab,
42
+ var(--glass-bg-quiet),
43
+ var(--glass-tint-source) var(--glass-tint-strength)
44
+ );
45
+ --veil-blur: var(--glass-blur-quiet);
46
+ /* The three veil deltas over a bare rung — each overridable. */
47
+ --veil-border: none;
48
+ --veil-shadow: none;
49
+ --veil-feather: none;
50
+
51
+ background: var(--veil-bg);
52
+ backdrop-filter: var(--veil-blur);
53
+ -webkit-backdrop-filter: var(--veil-blur);
54
+ border: var(--veil-border);
55
+ box-shadow: var(--veil-shadow);
56
+ /* The optional radial feather — a `mask-image` only painted when
57
+ `--veil-feather` is set to a gradient (default `none` = no mask = a
58
+ clean rectangle). `mask-image: none` is the identity. */
59
+ mask-image: var(--veil-feather);
60
+ }
61
+
62
+ /* ── opaque — the solid-card escape ───────────────────────────────────────
63
+ The level-0 endpoint of the SAME glass machinery — a solid `--card` plate
64
+ with `blur(0)`. A surface that ALSO carries a base tier keeps its glass
65
+ edge/rim/under-shadow (a solid plate with a glass edge, not a bare div).
66
+
67
+ THE SUBSTITUTION-VS-INHERITANCE TRAP (the recurring AX.W55 / dock-scale
68
+ class, live-found in the π readback): the `--glass-bg-*` tier tokens bake
69
+ `var(--glass-level)` at their `:root` DECLARATION (where level=1), so a
70
+ DESCENDANT element's `--glass-level: 0` does NOT re-resolve the `:root`-baked
71
+ `--glass-bg-floating` — the plate stayed translucent (α 0.8, NOT solid). The
72
+ `.glass-opaque` class works only when `--glass-level` is set at `:root` (the
73
+ cohesion fixture's pattern); a PER-ELEMENT opaque surface (the whole point of
74
+ `surface="opaque"`) needs the solid plate composed AT THE ELEMENT. So the
75
+ opaque rung sets the SOLID `--card` background + `blur(0)` DIRECTLY (the
76
+ level-0 endpoint resolved here, not via the baked token) — AND still flips the
77
+ `--glass-level: 0` / `--glass-tint-strength: 0%` knobs so a NESTED glass
78
+ descendant + any consumer reading the level scalar see the opaque register
79
+ coherently. The adaptive TINT axis is zeroed (a solid plate has no
80
+ translucent backdrop to darken-over — the bucket-INVARIANT contract). */
81
+ [data-surface="opaque"] {
82
+ --glass-level: 0;
83
+ --glass-tint-strength: 0%;
84
+ /* The SOLID --card plate composed at the element via the house color-mix
85
+ idiom (`--card` over transparent at 0% transparent = fully solid --card)
86
+ — functionally `var(--card)`, expressed as the cohesion-sanctioned mix
87
+ the token ladder already speaks. */
88
+ background: color-mix(in srgb, var(--card), transparent 0%);
89
+ backdrop-filter: none;
90
+ -webkit-backdrop-filter: none;
91
+ }
92
+
93
+ /* ── .paper-ink-mark — the PAPER ink-hairline MARK register ────────────────
94
+ (BA.W-SURFACE-AXIS scope 8). The 2px `--foreground` ink mark on a paper
95
+ surface — NO plate, NO blur, NO glass. This is a MARK register, NOT a
96
+ `[data-surface]` plate rung: a `[data-surface]` value DECORATES a glass
97
+ plate (fill + edge + rim); `.paper-ink-mark` is the opposite — a bare ink
98
+ hairline drawn directly on paper, the math-paper section-rail / underline-
99
+ tab vocabulary. Recorded here (the surface-decoration seam) co-located with
100
+ the plate axis but DISTINCT from it — the canon note is in CLAUDE.md.
101
+
102
+ ≥2 consumers at birth: (1) the math-paper section rail (the `border-l-[3px]`
103
+ family composes it for a VERTICAL left-edge ink rail); (2) W-TABS's re-cut
104
+ underline indicator (a HORIZONTAL 2px ink mark — W-TABS CONSUMES this seam,
105
+ a shape gap there triumvirates HERE per the DAG §5 seam rule). The register
106
+ exposes ONE knob (`--paper-ink-mark-weight`, default 2px) + the ink color;
107
+ the consumer applies the weight on whichever edge/axis it draws (a left
108
+ `border-inline-start-width` rail, a bottom `block-size` underline). */
109
+ .paper-ink-mark {
110
+ --paper-ink-mark-weight: 2px;
111
+ --paper-ink-mark-color: var(--foreground);
112
+ }
113
+ }
@@ -0,0 +1,382 @@
1
+ /* glass/surfaces.css
2
+ The convenience-shorthand surfaces — .glass-card / .glass-pill / .glass-btn + the glass pill-input + the chromatic edge-dispersion rim fringe.
3
+ Carved from the glass.css cascade root; @import-ed by glass.css in cascade
4
+ order, each in its own @layer components (isomorphic to the monolith).
5
+ See docs/precepts/design-idioms.md §cohesion-aware partials. */
6
+ @layer components {
7
+ /* ── Convenience shorthands (tier + shape) ── */
8
+
9
+ /* Static surface utility — no hover lift, no transition.
10
+ Interactive cards live in <Card> (which owns its own hover composition)
11
+ or in components that explicitly opt into a hover variant. */
12
+ .glass-card {
13
+ /* Focus-elevation rungs (AQ.W3 §W3.1a) — identity = at-rest paint; the
14
+ `:has(:focus-visible)` rule redefines them (one source, shared with
15
+ the fallback). */
16
+ --card-focus-shadow: var(--shadow-card);
17
+ --card-focus-border: var(--glass-border-quiet);
18
+ position: relative;
19
+ background: color-mix(in oklab, var(--glass-bg-quiet), var(--glass-tint-source) var(--glass-tint-strength));
20
+ backdrop-filter: var(--glass-blur-quiet);
21
+ border: 1px solid var(--card-focus-border);
22
+ border-radius: var(--radius-card);
23
+ box-shadow: var(--glass-material-rim), var(--card-focus-shadow);
24
+ /* AY.W-A11Y-PERF O-4 — upgrade `layout style` → include `paint` so the
25
+ maximal-glass nested backdrop-filter sample (a glass Button in this card)
26
+ does not escape the card box (the standard nested-backdrop-cost mitigation;
27
+ `contain: paint` clips DESCENDANTS only — the card's own rim/drop-shadow is
28
+ NOT clipped, device-verified). */
29
+ contain: layout style paint;
30
+ transition:
31
+ box-shadow var(--duration-fast) var(--ease-standard),
32
+ border-color var(--duration-fast) var(--ease-standard);
33
+ }
34
+
35
+ /* Elevate one rung on descendant KEYBOARD focus (`:focus-visible`, not
36
+ pointer). Scoped to `.glass-card`. `:has()` Baseline Widely; the
37
+ `@supports not selector(:has(*))` class fallback (below) ships anyway
38
+ (focus-elevation is UX-critical — child-state-styling MANDATORY clause). */
39
+ .glass-card:has(:focus-visible) {
40
+ --card-focus-shadow: var(--shadow-md);
41
+ --card-focus-border: var(--glass-border-floating);
42
+ }
43
+
44
+ /* ── Glassmorphic circular icon button ── */
45
+
46
+ /* BA.W-DEMO-AFFORDANCES (IG-A4) — the two size registers below are
47
+ MUTUALLY EXCLUSIVE; never stack `.glass-btn` and `.btn-pill` on one
48
+ element. `.glass-btn` is the FIXED-square icon primitive (width/height:
49
+ var(--size-icon-btn) + contain:paint) — `.btn-pill` is the CONTENT-WIDTH
50
+ text pill. Stacked, the fixed square wins and contain:paint clips the
51
+ wrapped label into a ~40px blob (the R8-17 "play button" defect). A
52
+ text-bearing `.glass-btn` collapses the same way even without `.btn-pill`.
53
+ For a play/replay affordance reach for <StoryPlayButton> (demo) or a real
54
+ <Button> with a leading Lucide glyph, never an icon-button carrying text.
55
+ Machine-locked by proof:demo-affordances (W1 — no class co-occurrence,
56
+ no text-bearing icon button). */
57
+ .glass-btn {
58
+ @apply flex items-center justify-center cursor-pointer;
59
+
60
+ /* Individual-transform identity base (AQ.W3 §W3.2) — `scale: 1` at rest
61
+ mints the stacking context once so the hover/press scale below does
62
+ not flicker it into being (the z-index/anchor hazard). */
63
+ scale: 1;
64
+ width: var(--size-icon-btn);
65
+ height: var(--size-icon-btn);
66
+ border-radius: var(--radius-pill);
67
+ border: 1.5px solid var(--glass-border-wash);
68
+ background: var(--glass-bg-wash);
69
+ backdrop-filter: var(--glass-blur-wash);
70
+ /* AY.W-A11Y-PERF O-4 — paint containment so the glass button's own
71
+ backdrop-filter sample stays inside the box when it nests in a glass card /
72
+ dialog / dock (the nested-backdrop-cost mitigation; clips descendants only,
73
+ the button's own rim/shadow is unaffected — device-verified). */
74
+ contain: paint;
75
+ color: var(--muted-foreground);
76
+ /* AX.W52 §6 doctrine — the surface legs ride the bezier `--ease-standard`;
77
+ the `scale` leg is reconciled onto `--spring-smooth` (was `--spring-snappy`)
78
+ so the icon-button hover settles on the SAME ONE register as `.btn-pill` /
79
+ `.tap-squish` / `btn-interactive` (the gate asserts one scale register
80
+ across all four). The press still reads crisp — `--spring-smooth` ζ=0.86
81
+ settles fast without a visible bounce. */
82
+ transition:
83
+ background var(--duration-fast) var(--ease-standard),
84
+ border-color var(--duration-fast) var(--ease-standard),
85
+ color var(--duration-fast) var(--ease-standard),
86
+ scale var(--spring-smooth-duration) var(--spring-smooth);
87
+ }
88
+
89
+ .glass-btn:hover:not(:disabled) {
90
+ background: color-mix(in srgb, var(--background) 85%, transparent);
91
+ border-color: var(--surface-tint-22);
92
+ color: var(--foreground);
93
+ scale: var(--scale-hover);
94
+ }
95
+
96
+ .glass-btn:active:not(:disabled) {
97
+ scale: var(--scale-press);
98
+ }
99
+
100
+ .glass-btn:focus-visible {
101
+ outline: none;
102
+ box-shadow: var(--focus-ring-shadow);
103
+ }
104
+
105
+ .glass-btn:disabled {
106
+ opacity: 0.35;
107
+ cursor: not-allowed;
108
+ pointer-events: none;
109
+ }
110
+
111
+ .glass-btn.is-active,
112
+ .glass-btn[aria-pressed="true"] {
113
+ background: var(--surface-tint-10);
114
+ border-color: var(--surface-tint-25);
115
+ color: var(--foreground);
116
+ }
117
+
118
+ /* ── Pill button base ─────────────────────────── */
119
+ .btn-pill {
120
+ @apply inline-flex items-center justify-center cursor-pointer font-medium border-none;
121
+
122
+ /* AX.W52 §6 identity base — `scale: 1` at rest so the hover/press scale
123
+ below animates the `scale` longhand (not `transform`) coherently and
124
+ does not flicker the stacking context into being (AQ.W3 §W3.2). */
125
+ scale: 1;
126
+ /* AX.W51 D18 — the pill GEOMETRY rides the ONE `--ui-scale` comfort axis.
127
+ gap / padding scale by the master scalar; the font reads the
128
+ `--control-text` register (`calc(--type-small * --ui-scale)`, the same
129
+ `text-sm` register the Button CVA paints), so a bare `.btn-pill` consumer
130
+ and a `<Button>` agree on the control font, and ONE `--ui-scale` override
131
+ grows the pill's height (via padding) + gap + font in lockstep. Desktop
132
+ default is the identity (scale 1 → the prior proportion). */
133
+ gap: calc(0.375rem * var(--ui-scale));
134
+ border-radius: var(--radius-pill);
135
+ padding: calc(0.5rem * var(--ui-scale)) calc(1rem * var(--ui-scale));
136
+ font-size: var(--control-text);
137
+ /* AX.W52 — the ONE coherent button transition (RED witness 5/6). The
138
+ SURFACE legs (bg/border/box-shadow/color/opacity) ride the bezier
139
+ `--ease-standard` (a colour cross-fade reads as a wobble on a spring);
140
+ the TRANSFORM leg (`scale`) rides `--spring-smooth` (the sub-perceptual
141
+ settle), so the hover lift + the surface cross-fade read as ONE glide.
142
+ The DEAD `transform` leg is retired — the variants animate the `scale`
143
+ longhand. CRITICAL: `.tap-squish` (composed alongside on the button
144
+ base, utilities.css) ALSO lists this full coherent set, so neither
145
+ class's `transition` shorthand can clobber the other down to a
146
+ scale-only animation — the cascade bug that left every button
147
+ transitioning ONLY `scale` (the live-readback RED, RED witness 5). The
148
+ doctrine: surface-props→bezier, transform→spring (tokens.css §2). */
149
+ transition:
150
+ background-color var(--duration-fast) var(--ease-standard),
151
+ border-color var(--duration-fast) var(--ease-standard),
152
+ box-shadow var(--duration-fast) var(--ease-standard),
153
+ color var(--duration-fast) var(--ease-standard),
154
+ opacity var(--duration-fast) var(--ease-standard),
155
+ scale var(--spring-smooth-duration) var(--spring-smooth);
156
+ }
157
+
158
+ .btn-pill > * {
159
+ @apply flex-shrink-0;
160
+ }
161
+
162
+
163
+ .btn-pill:disabled {
164
+ opacity: var(--opacity-disabled);
165
+ cursor: not-allowed;
166
+ pointer-events: none;
167
+ }
168
+
169
+ /* ── Glass-button backdrop ─────────────────────────────────────────────
170
+ AX.W52 — the `glass`/`glass-wash` Button variants compose `.glass-wash`,
171
+ which resolves `--glass-blur-wash` = `blur(1px)` — a sub-perceptual
172
+ diffusion authored for a small detail TILE, not a button the user reads
173
+ as "glass" (the live readback found the glass variants at a negligible
174
+ 1px). A hero control wants a real glass blur. `.btn-glass` re-points the
175
+ backdrop at `--glass-blur-btn` (the `quiet`-tier 10px radius + the gentle
176
+ `saturate(1.05) brightness(1.02)` light-concentration), so the glass
177
+ button variants actually read as liquid glass while the wash TILE tier
178
+ keeps its 1px untouched. Declares the UNPREFIXED `backdrop-filter` ONLY —
179
+ Lightning CSS emits the `-webkit-` companion per the single-source
180
+ authorship discipline above (hand-authoring both forms makes Lightning
181
+ dedup-and-keep-prefixed, which modern Chromium then drops). */
182
+ .btn-glass {
183
+ backdrop-filter: var(--glass-blur-btn);
184
+ }
185
+
186
+ /* ── Pill input ───────────────────────────────── */
187
+ .input-pill {
188
+ @apply flex w-full;
189
+
190
+ /* AX.W51 D18 — the input pill rides the ONE `--ui-scale` comfort axis: the
191
+ height reads the `--control-h-md` cohort (`max(calc(2.5rem * --ui-scale),
192
+ --control-floor)`, the h-10 register with the WCAG-44px coarse clamp), the
193
+ font reads `--control-text`, the inline padding scales — so ONE override
194
+ grows the field's height + padding + font in lockstep. Desktop default is
195
+ the identity. */
196
+ height: var(--control-h-md);
197
+ border-radius: var(--radius-pill);
198
+ /* AW.W13 — the resting field edge reads as an enclosed control at rest
199
+ (~15%α — ~2× the prior 8% glass-wash floor that vanished on cream). The
200
+ `:focus-visible` accent ring + the `:user-invalid`/`[aria-invalid]`
201
+ destructive ring below still win by order + specificity.
202
+ AX.W54 — moved off the srgb `--surface-tint-15` fork onto the glass
203
+ border seam so the pill is ONE glass model with the rest of the ladder.
204
+ BA.W-SURFACE-AXIS scope 7 — re-pointed onto the SHARED `--control-surface-*`
205
+ REST register so Input/Textarea/NumberField/Select/Combobox/TagsInput are
206
+ ONE material at rest (the input rung was the warmer of the two; Select rode
207
+ the `glass-wash` gray — the no-gray control-family seam). The register reads
208
+ the same `--glass-*` ladder, so `--glass-level`/the W55 bright bucket retune
209
+ the whole form family in lockstep (--control-surface-border defaults to the
210
+ `--glass-border-floating` 15%α rung, --control-surface-bg to `--glass-bg-quiet`,
211
+ --control-surface-blur to `--glass-blur-quiet`). */
212
+ border: 1.5px solid var(--control-surface-border);
213
+ background: var(--control-surface-bg);
214
+ /* The control's REAL glass blur — the shared register's quiet-tier radius
215
+ (the same `--control-surface-blur` pairs with `--control-surface-bg`); the
216
+ `--glass-level` knob clarifies it in lockstep with every surface. */
217
+ backdrop-filter: var(--control-surface-blur);
218
+ padding: 0 calc(1rem * var(--ui-scale));
219
+ font-size: var(--control-text);
220
+ color: var(--foreground);
221
+ transition:
222
+ background-color var(--duration-fast) var(--ease-standard),
223
+ border-color var(--duration-fast) var(--ease-standard),
224
+ box-shadow var(--duration-fast) var(--ease-standard),
225
+ color var(--duration-fast) var(--ease-standard),
226
+ opacity var(--duration-fast) var(--ease-standard);
227
+ }
228
+
229
+ .input-pill::placeholder {
230
+ color: var(--surface-tint-35);
231
+ }
232
+
233
+ /* BA.W-SURFACE-AXIS scope 7 — the shared control REST surface class. The
234
+ NON-pill control families (the Select trigger, the TagsInput root) that do
235
+ NOT compose `.input-pill` but want the SAME resting material read this — so
236
+ the whole form band is ONE register at rest (the Select default rode the
237
+ lighter `glass-wash` gray before; this is the no-gray control-family seam).
238
+ It carries the bg/border/blur ONLY (each control owns its own height/radius/
239
+ padding/font), so a non-pill control composes `.control-surface` + its own
240
+ geometry. The hover lift brightens the fill one step toward the resting rung. */
241
+ .control-surface {
242
+ background: var(--control-surface-bg);
243
+ border: 1px solid var(--control-surface-border);
244
+ backdrop-filter: var(--control-surface-blur);
245
+ -webkit-backdrop-filter: var(--control-surface-blur);
246
+ }
247
+ .control-surface:hover:not(:disabled, [data-disabled]) {
248
+ background: var(--control-surface-bg-hover);
249
+ }
250
+
251
+ /* AQ.W4 §W4.6 — keyboard-focus ring only. Was bare `:focus` (showed the
252
+ accent ring on a mouse click); `:focus-visible` matches the
253
+ `.focus-ring` / `.glass-btn` / dock-control discipline. Ordered BEFORE
254
+ the `:user-invalid` rungs so an invalid focused field shows destructive,
255
+ not accent (the `:user-invalid:focus-visible` rule below wins by order +
256
+ specificity). `:focus-visible` Baseline Widely — no fallback. */
257
+ .input-pill:focus-visible {
258
+ outline: none;
259
+ border-color: var(--color-accent-opaque, var(--ring));
260
+ box-shadow: 0 0 0 2px var(--color-accent, color-mix(in srgb, var(--ring) 30%, transparent));
261
+ }
262
+
263
+ /* AQ.W4 §W4.1 — validity vocabulary on `.input-pill` (Input + Textarea).
264
+ The forgiving `:where(:user-invalid, .user-invalid-fallback,
265
+ [aria-invalid="true"])` group is ONE rule covering THREE trigger surfaces:
266
+ native constraint-validation (`:user-invalid`), the `useUserInvalidAria`
267
+ fallback class for engines without `:user-invalid` (css §3.2; NOT a
268
+ live+dead alias — the class is the SOLE fallback), AND (AW.W18) the
269
+ imperative `[aria-invalid="true"]` attribute. The `[aria-invalid]` arm
270
+ serves APP-DRIVEN validity — a custom key match, an async server check —
271
+ where there is no native constraint to trip `:user-invalid`, so the app
272
+ sets the ARIA attribute and the library's own ring paints with no
273
+ `:deep()` re-paint at the consumer. The destructive/success tints reuse
274
+ the semantic tokens via `color-mix` per the house pattern (W2). Non-color
275
+ reinforcement is the error TEXT (W4.5 `error` slot) + the `required`
276
+ asterisk — the border/bg shift is the supplementary cue, never the sole
277
+ one. `:user-valid` is intentionally subtle (border only, no bg fill) so
278
+ a long valid form is not a wall of green. */
279
+ .input-pill:where(:user-invalid, .user-invalid-fallback, [aria-invalid="true"]) {
280
+ border-color: var(--destructive);
281
+ background: color-mix(in srgb, var(--destructive) 8%, var(--glass-bg-quiet));
282
+ }
283
+ .input-pill:where(:user-valid, .user-valid-fallback) {
284
+ border-color: var(--success);
285
+ }
286
+ /* Invalid + keyboard-focused → destructive ring (overrides the accent
287
+ `:focus-visible` ring above by order + the extra invalid compound). The
288
+ `[aria-invalid]` arm rides the same widened group so an app-driven
289
+ invalid field shows the destructive ring on focus too. */
290
+ .input-pill:where(:user-invalid, .user-invalid-fallback, [aria-invalid="true"]):focus-visible {
291
+ border-color: var(--destructive);
292
+ box-shadow: 0 0 0 var(--focus-ring-width)
293
+ color-mix(in srgb, var(--destructive) 35%, transparent);
294
+ }
295
+
296
+ /* AQ.W4 §W4.3 — `field-sizing: content` autosize (opt-in via the Textarea
297
+ `autosize` prop → `[data-autosize]`). The textarea grows vertically with
298
+ content between a 3-line floor and a token-driven ceiling, then scrolls.
299
+ `field-sizing` Baseline Newly (Chromium 2024) — on a non-supporting
300
+ engine the declaration is ignored and the element keeps the
301
+ `min/max-block-size` bounds + standard scroll (no JS, no `@supports`,
302
+ no grid-mirror polyfill). The fixed-size path (default, `min-h-20`) is
303
+ the unchanged no-op fallback. */
304
+ .input-pill[data-autosize] {
305
+ field-sizing: content;
306
+ width: 100%;
307
+ min-block-size: 3lh;
308
+ max-block-size: var(--textarea-autosize-max, 12lh);
309
+ resize: vertical;
310
+ }
311
+
312
+ .input-pill:disabled {
313
+ opacity: 0.5;
314
+ cursor: not-allowed;
315
+ }
316
+
317
+ /* AW.W13 — the Select trigger mirrors the input pill's resting border lift.
318
+ The reka-ui SelectTrigger renders `role="combobox"` over the `.glass-wash`
319
+ surface; its 8%α `--glass-border-wash` field edge vanished on cream just
320
+ like the input pill, so the same `--surface-tint-15` lift makes the
321
+ trigger read as an enclosed control at rest. Scoped to the combobox role
322
+ so the lift reaches ONLY the Select trigger, not every `.glass-wash`
323
+ surface. */
324
+ .glass-wash[role="combobox"] {
325
+ border-color: var(--surface-tint-15);
326
+ }
327
+
328
+ /* ── BA.W-PAGER — the glass pager pill chassis (.glass-pager-ring) ──────────
329
+ The ONE pager-CHASSIS ring register: a `--radius-pill` glass-floating pill
330
+ (the DockRail-chip recipe — `--glass-bg-floating` + `--glass-blur-floating`
331
+ + `--glass-edge-light`/`--glass-specular` + the soft drop + the `.dark`
332
+ box-shadow arm). It encapsulates BOTH the `<PagerDots ring>` dot rail AND
333
+ the `<CarouselPager>` counter (the counter re-registers OFF the opaque
334
+ `bg-card` slab onto this — the R9/R10-5 dark-slab class dies in the same
335
+ edit). NEVER an opaque `bg-card` plate: this is the house "controls in a
336
+ glass pill" idiom, translucent (reads the substrate through it), already
337
+ dark/light-safe, already specular-rimmed (≥2-consumer-proven on the dock
338
+ rail-extend chips + the dock collapsed pill). The legibility floor over the
339
+ carousel's image content rides the SAME rebuilt registers
340
+ (W-DARK-MATERIAL/W-NO-GRAY) — no local opaque fallback. */
341
+ .glass-pager-ring {
342
+ display: inline-flex;
343
+ align-items: center;
344
+ gap: 0.375rem;
345
+ padding-inline: 0.625rem;
346
+ padding-block: 0.3125rem;
347
+ border-radius: var(--radius-pill);
348
+ background: var(--glass-bg-floating);
349
+ backdrop-filter: var(--glass-blur-floating);
350
+ -webkit-backdrop-filter: var(--glass-blur-floating);
351
+ box-shadow:
352
+ var(--glass-edge-light),
353
+ var(--glass-specular),
354
+ 0 2px 6px -2px color-mix(in srgb, var(--shadow-color) 22%, transparent);
355
+ /* §6 EASING DOCTRINE — the surface channel cross-fades on the bezier
356
+ `--ease-standard` (NEVER a spring; a surface prop on a spring is the
357
+ violation). */
358
+ transition:
359
+ background-color var(--duration-fast) var(--ease-standard),
360
+ box-shadow var(--duration-fast) var(--ease-standard),
361
+ border-color var(--duration-fast) var(--ease-standard);
362
+ }
363
+ .dark .glass-pager-ring {
364
+ box-shadow:
365
+ var(--glass-edge-light-dark),
366
+ var(--glass-specular-dark),
367
+ 0 2px 6px -2px color-mix(in srgb, var(--shadow-color) 30%, transparent);
368
+ }
369
+
370
+ /* ── AW.W23 — chromatic edge dispersion (the polished-glass rim fringe) ──
371
+ An opt-in `.glass-chromatic` composes the warm/cool oklab fringe OVER the
372
+ W22 uniform rim (it does NOT replace it — the rim still rides each rung's
373
+ box-shadow). The fringe is a transparency garnish, so it composes ONLY
374
+ under `prefers-reduced-transparency: no-preference` and drops under
375
+ `reduce` (handled by the bracket below). The fringe lands as a dedicated
376
+ inset box-shadow pair on the material surface so it adds onto the rim. */
377
+ @media (prefers-reduced-transparency: no-preference) {
378
+ .glass-chromatic {
379
+ box-shadow: var(--glass-edge-dispersion), var(--glass-material-rim);
380
+ }
381
+ }
382
+ }