@mkbabb/glass-ui 0.2.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 (335) hide show
  1. package/README.md +172 -0
  2. package/dist/glass-ui.css +1 -0
  3. package/dist/glass-ui.js +10019 -0
  4. package/dist/index.d.ts +6619 -0
  5. package/package.json +65 -0
  6. package/src/components/custom/aurora/Aurora.vue +34 -0
  7. package/src/components/custom/aurora/composables/color.ts +122 -0
  8. package/src/components/custom/aurora/composables/useAurora.ts +355 -0
  9. package/src/components/custom/aurora/index.ts +8 -0
  10. package/src/components/custom/confirm-dialog/ConfirmDialog.vue +88 -0
  11. package/src/components/custom/confirm-dialog/index.ts +1 -0
  12. package/src/components/custom/controls/DarkModeToggle.vue +96 -0
  13. package/src/components/custom/controls/index.ts +1 -0
  14. package/src/components/custom/dock/DockLayerGroup.vue +21 -0
  15. package/src/components/custom/dock/DockPopover.vue +263 -0
  16. package/src/components/custom/dock/GlassDock.vue +276 -0
  17. package/src/components/custom/dock/composables/index.ts +16 -0
  18. package/src/components/custom/dock/composables/isTeleportedTarget.ts +19 -0
  19. package/src/components/custom/dock/composables/useDockActionBar.ts +33 -0
  20. package/src/components/custom/dock/composables/useDockState.ts +301 -0
  21. package/src/components/custom/dock/composables/useDockTransition.ts +146 -0
  22. package/src/components/custom/dock/composables/useLayerTransition.ts +135 -0
  23. package/src/components/custom/dock/composables/usePopupMutex.ts +83 -0
  24. package/src/components/custom/dock/index.ts +9 -0
  25. package/src/components/custom/expandable-container/ExpandableContainer.vue +64 -0
  26. package/src/components/custom/expandable-container/index.ts +1 -0
  27. package/src/components/custom/glass-panel/GlassPanel.vue +98 -0
  28. package/src/components/custom/glass-panel/index.ts +2 -0
  29. package/src/components/custom/icon-tooltip/IconTooltip.vue +20 -0
  30. package/src/components/custom/icon-tooltip/index.ts +1 -0
  31. package/src/components/custom/index.ts +15 -0
  32. package/src/components/custom/infinite-scroll/InfiniteScroll.vue +55 -0
  33. package/src/components/custom/infinite-scroll/composables/index.ts +2 -0
  34. package/src/components/custom/infinite-scroll/composables/types.ts +23 -0
  35. package/src/components/custom/infinite-scroll/composables/useInfiniteScroll.ts +73 -0
  36. package/src/components/custom/infinite-scroll/index.ts +1 -0
  37. package/src/components/custom/labeled-field/LabeledInput.vue +29 -0
  38. package/src/components/custom/labeled-field/LabeledSelect.vue +59 -0
  39. package/src/components/custom/labeled-field/LabeledSlider.vue +32 -0
  40. package/src/components/custom/labeled-field/LabeledSwitch.vue +27 -0
  41. package/src/components/custom/labeled-field/index.ts +4 -0
  42. package/src/components/custom/metaballs/MetaballCanvas.vue +23 -0
  43. package/src/components/custom/metaballs/index.ts +4 -0
  44. package/src/components/custom/metaballs/shaders.ts +63 -0
  45. package/src/components/custom/metaballs/types.ts +29 -0
  46. package/src/components/custom/metaballs/useMetaballs.ts +252 -0
  47. package/src/components/custom/search/FuzzySearch.vue +589 -0
  48. package/src/components/custom/search/SearchBar.vue +44 -0
  49. package/src/components/custom/search/composables/fuzzySearchIndex.ts +224 -0
  50. package/src/components/custom/search/composables/index.ts +5 -0
  51. package/src/components/custom/search/composables/types.ts +34 -0
  52. package/src/components/custom/search/composables/useFuzzySearch.ts +115 -0
  53. package/src/components/custom/search/index.ts +7 -0
  54. package/src/components/custom/sidebar/ProgressiveSidebar.vue +256 -0
  55. package/src/components/custom/sidebar/composables/index.ts +6 -0
  56. package/src/components/custom/sidebar/composables/useScrollTracker.ts +242 -0
  57. package/src/components/custom/sidebar/composables/useSidebarFollow.ts +247 -0
  58. package/src/components/custom/sidebar/composables/useSidebarState.ts +72 -0
  59. package/src/components/custom/sidebar/composables/useTreeIndex.ts +152 -0
  60. package/src/components/custom/sidebar/index.ts +15 -0
  61. package/src/components/custom/sidebar/types.ts +50 -0
  62. package/src/components/custom/tabs/BouncyTabs.vue +39 -0
  63. package/src/components/custom/tabs/BouncyToggle.vue +352 -0
  64. package/src/components/custom/tabs/UnderlineTabs.vue +115 -0
  65. package/src/components/custom/tabs/index.ts +5 -0
  66. package/src/components/custom/timeline/GlassTimeline.vue +174 -0
  67. package/src/components/custom/timeline/index.ts +1 -0
  68. package/src/components/custom/typewriter/TypewriterText.vue +239 -0
  69. package/src/components/custom/typewriter/composables/index.ts +1 -0
  70. package/src/components/custom/typewriter/composables/useTypewriter.ts +413 -0
  71. package/src/components/custom/typewriter/index.ts +7 -0
  72. package/src/components/custom/typewriter/types.ts +159 -0
  73. package/src/components/custom/typewriter/utils/keyboard.ts +213 -0
  74. package/src/components/custom/typewriter/utils/pausePatterns.ts +55 -0
  75. package/src/components/custom/typewriter/utils/timing.ts +104 -0
  76. package/src/components/custom/typewriter/utils/typoStateMachine.ts +197 -0
  77. package/src/components/index.ts +2 -0
  78. package/src/components/ui/accordion/Accordion.vue +19 -0
  79. package/src/components/ui/accordion/AccordionContent.vue +24 -0
  80. package/src/components/ui/accordion/AccordionItem.vue +24 -0
  81. package/src/components/ui/accordion/AccordionTrigger.vue +39 -0
  82. package/src/components/ui/accordion/index.ts +4 -0
  83. package/src/components/ui/alert/Alert.vue +20 -0
  84. package/src/components/ui/alert/AlertDescription.vue +17 -0
  85. package/src/components/ui/alert/AlertTitle.vue +17 -0
  86. package/src/components/ui/alert/index.ts +23 -0
  87. package/src/components/ui/avatar/Avatar.vue +21 -0
  88. package/src/components/ui/avatar/AvatarFallback.vue +11 -0
  89. package/src/components/ui/avatar/AvatarImage.vue +9 -0
  90. package/src/components/ui/avatar/index.ts +24 -0
  91. package/src/components/ui/badge/Badge.vue +16 -0
  92. package/src/components/ui/badge/index.ts +25 -0
  93. package/src/components/ui/button/Button.vue +26 -0
  94. package/src/components/ui/button/index.ts +43 -0
  95. package/src/components/ui/card/Card.vue +28 -0
  96. package/src/components/ui/card/CardContent.vue +14 -0
  97. package/src/components/ui/card/CardDescription.vue +14 -0
  98. package/src/components/ui/card/CardFooter.vue +14 -0
  99. package/src/components/ui/card/CardHeader.vue +14 -0
  100. package/src/components/ui/card/CardTitle.vue +21 -0
  101. package/src/components/ui/card/index.ts +6 -0
  102. package/src/components/ui/carousel/Carousel.vue +53 -0
  103. package/src/components/ui/carousel/CarouselContent.vue +35 -0
  104. package/src/components/ui/carousel/CarouselItem.vue +24 -0
  105. package/src/components/ui/carousel/CarouselNext.vue +40 -0
  106. package/src/components/ui/carousel/CarouselPrevious.vue +40 -0
  107. package/src/components/ui/carousel/index.ts +10 -0
  108. package/src/components/ui/carousel/interface.ts +26 -0
  109. package/src/components/ui/carousel/useCarousel.ts +56 -0
  110. package/src/components/ui/checkbox/Checkbox.vue +33 -0
  111. package/src/components/ui/checkbox/index.ts +1 -0
  112. package/src/components/ui/collapsible/Collapsible.vue +15 -0
  113. package/src/components/ui/collapsible/CollapsibleContent.vue +11 -0
  114. package/src/components/ui/collapsible/CollapsibleTrigger.vue +11 -0
  115. package/src/components/ui/collapsible/index.ts +3 -0
  116. package/src/components/ui/combobox/Combobox.vue +17 -0
  117. package/src/components/ui/combobox/ComboboxAnchor.vue +23 -0
  118. package/src/components/ui/combobox/ComboboxEmpty.vue +21 -0
  119. package/src/components/ui/combobox/ComboboxGroup.vue +27 -0
  120. package/src/components/ui/combobox/ComboboxInput.vue +41 -0
  121. package/src/components/ui/combobox/ComboboxItem.vue +24 -0
  122. package/src/components/ui/combobox/ComboboxItemIndicator.vue +23 -0
  123. package/src/components/ui/combobox/ComboboxList.vue +29 -0
  124. package/src/components/ui/combobox/ComboboxSeparator.vue +21 -0
  125. package/src/components/ui/combobox/ComboboxViewport.vue +23 -0
  126. package/src/components/ui/combobox/index.ts +12 -0
  127. package/src/components/ui/command/Command.vue +30 -0
  128. package/src/components/ui/command/CommandDialog.vue +21 -0
  129. package/src/components/ui/command/CommandEmpty.vue +20 -0
  130. package/src/components/ui/command/CommandGroup.vue +29 -0
  131. package/src/components/ui/command/CommandInput.vue +33 -0
  132. package/src/components/ui/command/CommandItem.vue +26 -0
  133. package/src/components/ui/command/CommandList.vue +27 -0
  134. package/src/components/ui/command/CommandSeparator.vue +23 -0
  135. package/src/components/ui/command/CommandShortcut.vue +14 -0
  136. package/src/components/ui/command/index.ts +9 -0
  137. package/src/components/ui/context-menu/ContextMenu.vue +15 -0
  138. package/src/components/ui/context-menu/ContextMenuCheckboxItem.vue +40 -0
  139. package/src/components/ui/context-menu/ContextMenuContent.vue +36 -0
  140. package/src/components/ui/context-menu/ContextMenuGroup.vue +11 -0
  141. package/src/components/ui/context-menu/ContextMenuItem.vue +34 -0
  142. package/src/components/ui/context-menu/ContextMenuLabel.vue +25 -0
  143. package/src/components/ui/context-menu/ContextMenuPortal.vue +11 -0
  144. package/src/components/ui/context-menu/ContextMenuRadioGroup.vue +19 -0
  145. package/src/components/ui/context-menu/ContextMenuRadioItem.vue +40 -0
  146. package/src/components/ui/context-menu/ContextMenuSeparator.vue +20 -0
  147. package/src/components/ui/context-menu/ContextMenuShortcut.vue +14 -0
  148. package/src/components/ui/context-menu/ContextMenuSub.vue +19 -0
  149. package/src/components/ui/context-menu/ContextMenuSubContent.vue +35 -0
  150. package/src/components/ui/context-menu/ContextMenuSubTrigger.vue +34 -0
  151. package/src/components/ui/context-menu/ContextMenuTrigger.vue +13 -0
  152. package/src/components/ui/context-menu/index.ts +14 -0
  153. package/src/components/ui/data-table/DataTable.vue +167 -0
  154. package/src/components/ui/data-table/DataTablePagination.vue +112 -0
  155. package/src/components/ui/data-table/index.ts +3 -0
  156. package/src/components/ui/data-table/types.ts +48 -0
  157. package/src/components/ui/dialog/Dialog.vue +14 -0
  158. package/src/components/ui/dialog/DialogClose.vue +11 -0
  159. package/src/components/ui/dialog/DialogContent.vue +61 -0
  160. package/src/components/ui/dialog/DialogDescription.vue +24 -0
  161. package/src/components/ui/dialog/DialogFooter.vue +19 -0
  162. package/src/components/ui/dialog/DialogHeader.vue +16 -0
  163. package/src/components/ui/dialog/DialogScrollContent.vue +65 -0
  164. package/src/components/ui/dialog/DialogTitle.vue +29 -0
  165. package/src/components/ui/dialog/DialogTrigger.vue +11 -0
  166. package/src/components/ui/dialog/index.ts +9 -0
  167. package/src/components/ui/drawer/Drawer.vue +19 -0
  168. package/src/components/ui/drawer/DrawerContent.vue +28 -0
  169. package/src/components/ui/drawer/DrawerDescription.vue +20 -0
  170. package/src/components/ui/drawer/DrawerFooter.vue +14 -0
  171. package/src/components/ui/drawer/DrawerHeader.vue +14 -0
  172. package/src/components/ui/drawer/DrawerOverlay.vue +18 -0
  173. package/src/components/ui/drawer/DrawerTitle.vue +20 -0
  174. package/src/components/ui/drawer/index.ts +8 -0
  175. package/src/components/ui/dropdown-menu/DropdownMenu.vue +14 -0
  176. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +40 -0
  177. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +44 -0
  178. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
  179. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +28 -0
  180. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +24 -0
  181. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +19 -0
  182. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +40 -0
  183. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +22 -0
  184. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
  185. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
  186. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +36 -0
  187. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +33 -0
  188. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +13 -0
  189. package/src/components/ui/dropdown-menu/index.ts +16 -0
  190. package/src/components/ui/hover-card/HoverCard.vue +14 -0
  191. package/src/components/ui/hover-card/HoverCardContent.vue +41 -0
  192. package/src/components/ui/hover-card/HoverCardTrigger.vue +11 -0
  193. package/src/components/ui/hover-card/index.ts +3 -0
  194. package/src/components/ui/index.ts +41 -0
  195. package/src/components/ui/input/Input.vue +24 -0
  196. package/src/components/ui/input/index.ts +1 -0
  197. package/src/components/ui/label/Label.vue +27 -0
  198. package/src/components/ui/label/index.ts +1 -0
  199. package/src/components/ui/multi-select/MultiSelect.vue +141 -0
  200. package/src/components/ui/multi-select/index.ts +7 -0
  201. package/src/components/ui/notification/Notification.vue +85 -0
  202. package/src/components/ui/notification/index.ts +1 -0
  203. package/src/components/ui/number-field/NumberField.vue +23 -0
  204. package/src/components/ui/number-field/NumberFieldContent.vue +14 -0
  205. package/src/components/ui/number-field/NumberFieldDecrement.vue +25 -0
  206. package/src/components/ui/number-field/NumberFieldIncrement.vue +25 -0
  207. package/src/components/ui/number-field/NumberFieldInput.vue +8 -0
  208. package/src/components/ui/number-field/index.ts +5 -0
  209. package/src/components/ui/popover/Popover.vue +15 -0
  210. package/src/components/ui/popover/PopoverContent.vue +61 -0
  211. package/src/components/ui/popover/PopoverTrigger.vue +11 -0
  212. package/src/components/ui/popover/index.ts +3 -0
  213. package/src/components/ui/progress/Progress.vue +39 -0
  214. package/src/components/ui/progress/index.ts +1 -0
  215. package/src/components/ui/radio-group/RadioGroup.vue +25 -0
  216. package/src/components/ui/radio-group/RadioGroupItem.vue +39 -0
  217. package/src/components/ui/radio-group/index.ts +2 -0
  218. package/src/components/ui/scroll-area/ScrollArea.vue +29 -0
  219. package/src/components/ui/scroll-area/ScrollBar.vue +30 -0
  220. package/src/components/ui/scroll-area/index.ts +2 -0
  221. package/src/components/ui/scroll-pane/ScrollPane.vue +25 -0
  222. package/src/components/ui/scroll-pane/ScrollPaneHeader.vue +75 -0
  223. package/src/components/ui/scroll-pane/index.ts +2 -0
  224. package/src/components/ui/select/Select.vue +15 -0
  225. package/src/components/ui/select/SelectContent.vue +57 -0
  226. package/src/components/ui/select/SelectGroup.vue +19 -0
  227. package/src/components/ui/select/SelectItem.vue +47 -0
  228. package/src/components/ui/select/SelectItemText.vue +11 -0
  229. package/src/components/ui/select/SelectLabel.vue +13 -0
  230. package/src/components/ui/select/SelectScrollDownButton.vue +24 -0
  231. package/src/components/ui/select/SelectScrollUpButton.vue +24 -0
  232. package/src/components/ui/select/SelectSeparator.vue +17 -0
  233. package/src/components/ui/select/SelectTrigger.vue +45 -0
  234. package/src/components/ui/select/SelectValue.vue +11 -0
  235. package/src/components/ui/select/index.ts +11 -0
  236. package/src/components/ui/separator/Separator.vue +35 -0
  237. package/src/components/ui/separator/index.ts +1 -0
  238. package/src/components/ui/sheet/Sheet.vue +14 -0
  239. package/src/components/ui/sheet/SheetClose.vue +11 -0
  240. package/src/components/ui/sheet/SheetContent.vue +56 -0
  241. package/src/components/ui/sheet/SheetDescription.vue +22 -0
  242. package/src/components/ui/sheet/SheetFooter.vue +19 -0
  243. package/src/components/ui/sheet/SheetHeader.vue +16 -0
  244. package/src/components/ui/sheet/SheetTitle.vue +22 -0
  245. package/src/components/ui/sheet/SheetTrigger.vue +11 -0
  246. package/src/components/ui/sheet/index.ts +31 -0
  247. package/src/components/ui/skeleton/Skeleton.vue +14 -0
  248. package/src/components/ui/skeleton/index.ts +1 -0
  249. package/src/components/ui/slider/Slider.vue +66 -0
  250. package/src/components/ui/slider/index.ts +1 -0
  251. package/src/components/ui/switch/Switch.vue +37 -0
  252. package/src/components/ui/switch/index.ts +1 -0
  253. package/src/components/ui/table/Table.vue +16 -0
  254. package/src/components/ui/table/TableBody.vue +14 -0
  255. package/src/components/ui/table/TableCaption.vue +14 -0
  256. package/src/components/ui/table/TableCell.vue +14 -0
  257. package/src/components/ui/table/TableEmpty.vue +39 -0
  258. package/src/components/ui/table/TableFooter.vue +16 -0
  259. package/src/components/ui/table/TableHead.vue +21 -0
  260. package/src/components/ui/table/TableHeader.vue +14 -0
  261. package/src/components/ui/table/TableRow.vue +21 -0
  262. package/src/components/ui/table/index.ts +9 -0
  263. package/src/components/ui/tabs/Tabs.vue +15 -0
  264. package/src/components/ui/tabs/TabsContent.vue +22 -0
  265. package/src/components/ui/tabs/TabsIndicator.vue +22 -0
  266. package/src/components/ui/tabs/TabsList.vue +25 -0
  267. package/src/components/ui/tabs/TabsTrigger.vue +29 -0
  268. package/src/components/ui/tabs/index.ts +5 -0
  269. package/src/components/ui/tags-input/TagsInput.vue +22 -0
  270. package/src/components/ui/tags-input/TagsInputInput.vue +19 -0
  271. package/src/components/ui/tags-input/TagsInputItem.vue +22 -0
  272. package/src/components/ui/tags-input/TagsInputItemDelete.vue +24 -0
  273. package/src/components/ui/tags-input/TagsInputItemText.vue +19 -0
  274. package/src/components/ui/tags-input/index.ts +5 -0
  275. package/src/components/ui/textarea/Textarea.vue +24 -0
  276. package/src/components/ui/textarea/index.ts +1 -0
  277. package/src/components/ui/toast/Toast.vue +57 -0
  278. package/src/components/ui/toast/ToastAction.vue +30 -0
  279. package/src/components/ui/toast/ToastClose.vue +31 -0
  280. package/src/components/ui/toast/ToastDescription.vue +25 -0
  281. package/src/components/ui/toast/ToastTitle.vue +25 -0
  282. package/src/components/ui/toast/Toaster.vue +31 -0
  283. package/src/components/ui/toast/index.ts +8 -0
  284. package/src/components/ui/toast/use-toast.ts +136 -0
  285. package/src/components/ui/toggle/Toggle.vue +35 -0
  286. package/src/components/ui/toggle/index.ts +27 -0
  287. package/src/components/ui/toggle-group/ToggleGroup.vue +34 -0
  288. package/src/components/ui/toggle-group/ToggleGroupItem.vue +35 -0
  289. package/src/components/ui/toggle-group/index.ts +2 -0
  290. package/src/components/ui/tooltip/Tooltip.vue +14 -0
  291. package/src/components/ui/tooltip/TooltipContent.vue +31 -0
  292. package/src/components/ui/tooltip/TooltipProvider.vue +11 -0
  293. package/src/components/ui/tooltip/TooltipTrigger.vue +11 -0
  294. package/src/components/ui/tooltip/index.ts +4 -0
  295. package/src/composables/glass/index.ts +8 -0
  296. package/src/composables/glass/useGlassRenderer.ts +252 -0
  297. package/src/composables/glass/webgl/frostShader.ts +221 -0
  298. package/src/composables/glass/webgpu/glassShader.wgsl +173 -0
  299. package/src/composables/index.ts +32 -0
  300. package/src/composables/infinite-scroll/index.ts +2 -0
  301. package/src/composables/infinite-scroll/types.ts +25 -0
  302. package/src/composables/infinite-scroll/useInfiniteScroll.ts +101 -0
  303. package/src/composables/interaction/index.ts +5 -0
  304. package/src/composables/interaction/useHeightTransition.ts +82 -0
  305. package/src/composables/interaction/useHoverPopover.ts +64 -0
  306. package/src/composables/interaction/useHoverToggle.ts +103 -0
  307. package/src/composables/interaction/useLeaveTimer.ts +17 -0
  308. package/src/composables/interaction/useTouchGate.ts +207 -0
  309. package/src/composables/pagination/index.ts +2 -0
  310. package/src/composables/pagination/useOffsetPagination.ts +70 -0
  311. package/src/composables/prng.ts +32 -0
  312. package/src/composables/useCharSplit.ts +31 -0
  313. package/src/composables/useClipboard.ts +46 -0
  314. package/src/composables/useGlobalDark.ts +61 -0
  315. package/src/composables/useKeyboardShortcuts.ts +205 -0
  316. package/src/composables/useWatercolorBlob.ts +136 -0
  317. package/src/composables/virtual/index.ts +22 -0
  318. package/src/composables/virtual/useVirtualSectionWindow.ts +338 -0
  319. package/src/composables/virtual/useWindowedStore.ts +86 -0
  320. package/src/composables/virtual/virtualSectionLayout.ts +212 -0
  321. package/src/index.ts +9 -0
  322. package/src/styles/animations.css +233 -0
  323. package/src/styles/cards.css +66 -0
  324. package/src/styles/dock.css +221 -0
  325. package/src/styles/floating-panel.css +49 -0
  326. package/src/styles/glass.css +266 -0
  327. package/src/styles/index.css +26 -0
  328. package/src/styles/scroll-pane.css +10 -0
  329. package/src/styles/theme.css +138 -0
  330. package/src/styles/tokens.css +333 -0
  331. package/src/styles/transitions.css +226 -0
  332. package/src/styles/typography.css +277 -0
  333. package/src/styles/utilities.css +697 -0
  334. package/src/utils/cn.ts +6 -0
  335. package/src/utils/index.ts +1 -0
package/README.md ADDED
@@ -0,0 +1,172 @@
1
+ # glass-ui
2
+
3
+ Glassmorphic design system for Vue 3.5. Shared components, design tokens, and composables built on reka-ui and Tailwind CSS v4, with a golden-ratio typography scale.
4
+
5
+ ## Features
6
+
7
+ - 32 shadcn-vue components (Button, Card, Dialog, Select, Tabs, Popover, Slider, etc.)
8
+ - Four-tier glassmorphism: `.glass-subtle`, `.glass-default`, `.glass-medium`, `.glass-elevated`
9
+ - Convenience shorthands: `.glass-card`, `.glass-pill`, `.glass-btn`, `.floating-panel`
10
+ - GlassDock: collapsible glass action bar with dual-layer grid and ref-counted state
11
+ - Golden-ratio typography scale (√φ ≈ 1.272, 11 stops from micro to display-3)
12
+ - Design tokens: duration, easing, z-index, radius (primitive + semantic), shadows, glass tiers, paper textures
13
+ - Vue `<Transition>` class sets, shared `@keyframes`, SVG noise textures
14
+ - Composables: dock state, hover popover, touch gate, keyboard shortcuts, clipboard, dark mode
15
+
16
+ ## Install
17
+
18
+ ```bash
19
+ npm install @mkbabb/glass-ui
20
+ ```
21
+
22
+ ## Usage
23
+
24
+ ```ts
25
+ import { Button, Card, Dialog, GlassDock, DarkModeToggle } from "@mkbabb/glass-ui";
26
+ import { useDockState, useKeyboardShortcuts, copyToClipboard } from "@mkbabb/glass-ui";
27
+ ```
28
+
29
+ ```css
30
+ @import "tailwindcss";
31
+ @import "tw-animate-css";
32
+ @import "@mkbabb/glass-ui/styles";
33
+ @variant dark (&:where(.dark, .dark *));
34
+
35
+ /* override tokens locally for your project */
36
+ :root {
37
+ --glass-opacity-subtle: 0.82;
38
+ --glass-blur-default: blur(12px);
39
+ }
40
+ ```
41
+
42
+ ## Build
43
+
44
+ ```bash
45
+ npm run build # library → dist/glass-ui.js + glass-ui.css + index.d.ts
46
+ npm run typecheck # vue-tsc --noEmit
47
+ ```
48
+
49
+ ## Structure
50
+
51
+ ```
52
+ src/
53
+ ├── index.ts # barrel: components + composables + utils
54
+ ├── components/
55
+ │ ├── ui/ # 32 shadcn-vue components (reka-ui primitives)
56
+ │ │ ├── button/ # Primitive + CVA (8 variants, 5 sizes)
57
+ │ │ ├── card/ # Card, CardHeader, CardTitle, CardContent, etc.
58
+ │ │ ├── dialog/ # Dialog, DialogContent, DialogHeader, etc.
59
+ │ │ ├── select/ # Select, SelectTrigger, SelectContent, etc.
60
+ │ │ ├── tabs/ # Tabs, TabsList, TabsTrigger, TabsContent
61
+ │ │ ├── popover/ # Popover, PopoverTrigger, PopoverContent
62
+ │ │ ├── dropdown-menu/ # DropdownMenu + 14 subcomponents
63
+ │ │ ├── tooltip/ # Tooltip, TooltipTrigger, TooltipContent
64
+ │ │ ├── slider/ # reka-ui Slider with glass track
65
+ │ │ ├── input/ # Glass-styled input
66
+ │ │ └── ... # + 22 more (toggle, switch, checkbox, badge, etc.)
67
+ │ └── custom/
68
+ │ ├── dock/ # GlassDock, DockPopover, DockLayerGroup
69
+ │ ├── aurora/ # Aurora WebGL background
70
+ │ └── controls/ # DarkModeToggle
71
+ ├── composables/
72
+ │ ├── dock/ # useDockState, useDockTransition, useLayerTransition, usePopupMutex, useDockActionBar
73
+ │ ├── interaction/ # useHeightTransition, useHoverPopover, useHoverToggle, useTouchGate, useLeaveTimer
74
+ │ ├── useClipboard.ts # copyToClipboard (navigator.clipboard + textarea fallback)
75
+ │ ├── useGlobalDark.ts # createGlobalState(useDark) + Safari FOUC fix
76
+ │ ├── useKeyboardShortcuts.ts # singleton registry, Mod key aliasing, grouped display
77
+ │ ├── useWatercolorBlob.ts # seeded PRNG blob animation (Mulberry32)
78
+ │ └── prng.ts # mulberry32, hashString, seededRandom
79
+ ├── styles/
80
+ │ ├── index.css # imports all below in order
81
+ │ ├── tokens.css # design tokens (duration, easing, z-index, radius, shadows, glass, paper)
82
+ │ ├── theme.css # @theme block (Tailwind color/font/radius aliases)
83
+ │ ├── typography.css # golden-ratio type scale + semantic classes
84
+ │ ├── glass.css # .glass-{subtle,default,medium,elevated}, .glass-card, .glass-pill, .glass-btn
85
+ │ ├── dock.css # .dock-icon-btn, .dock-select-trigger, .dock-layer-grid, etc.
86
+ │ ├── cards.css # .cartoon-card, .elevated-card, .paper-texture
87
+ │ ├── floating-panel.css # .floating-panel, .floating-panel-item
88
+ │ ├── transitions.css # Vue <Transition> classes: fade, fade-slide, pop, dialog-scale, dropdown
89
+ │ ├── animations.css # @keyframes: dialog-in/out, floating-panel-in, collapsible, tooltip, shimmer
90
+ │ └── utilities.css # scrollbar-hidden, focus-ring, btn-press, rainbow-text, touch-gate, etc.
91
+ └── utils/
92
+ └── cn.ts # clsx + tailwind-merge
93
+ ```
94
+
95
+ ## Glass Token System
96
+
97
+ Four tiers with 1:1 alignment across opacity, blur, background, border, and shadow:
98
+
99
+ | Tier | Opacity | Blur | Use |
100
+ |------|---------|------|-----|
101
+ | `subtle` | 0.30 | 4px | Dock backgrounds, input fills, hover overlays |
102
+ | `default` | 0.50 | 8px | Cards, content containers, select triggers |
103
+ | `medium` | 0.65 | 12px | Popovers, dropdowns, floating panels |
104
+ | `elevated` | 0.80 | 16px | Dialogs, command palette, modal overlays |
105
+
106
+ Each tier defines `--glass-{opacity,blur,bg,border,shadow}-{tier}`. Consumers override the primitives (`--glass-opacity-subtle`, `--glass-blur-default`, etc.) in their own `:root` to tune intensity.
107
+
108
+ Convenience classes bundle a tier with a shape:
109
+ - `.glass-card` = default tier + `var(--radius-card)`
110
+ - `.glass-pill` = default tier + `var(--radius-pill)`
111
+
112
+ ## Design Tokens
113
+
114
+ `tokens.css` defines the shared `:root` properties consumed by all style modules and components:
115
+
116
+ | Category | Tokens | Notes |
117
+ |----------|--------|-------|
118
+ | Duration | `--duration-fast` through `--duration-linger` | 6 stops, 0.1s–2.5s |
119
+ | Easing | `--ease-spring`, `--ease-dock`, `--ease-standard`, etc. | 12 curves (core + apple + extended) |
120
+ | Z-index | `--z-background` through `--z-debug` | 14-level scale, 0–99999 |
121
+ | Radius | `--radius` base + `sm`/`md`/`lg`/`xl`/`2xl`/`pill` | Primitive scale from 0.5rem base |
122
+ | Radius (semantic) | `--radius-card`, `--radius-panel`, `--radius-dialog`, `--radius-input`, `--radius-button`, `--radius-badge`, `--radius-dock` | Aliases into the primitive scale |
123
+ | Shadows | `--shadow-xs` through `--shadow-2xl` | Elevation scale, hsl-based |
124
+ | Shadows (cartoon) | `--shadow-cartoon-sm`/`md`/`lg`, `--shadow-card` | Offset hard shadows |
125
+ | Glass | `--glass-{opacity,blur,bg,border,shadow}-{subtle,default,medium,elevated}` | 4 tiers, all aligned |
126
+ | Paper | `--paper-clean-texture`, `--paper-aged-texture` | SVG feTurbulence noise |
127
+ | Colors | Full shadcn HSL-channel palette | Override locally per project |
128
+
129
+ ## Typography
130
+
131
+ Type scale based on √φ ≈ 1.272 (modulated golden ratio). Each step is φ^(n/2) of the base.
132
+
133
+ | Token | Size | ~px | Class |
134
+ |-------|------|-----|-------|
135
+ | `--type-micro` | 0.6875rem | 11 | `.text-micro` |
136
+ | `--type-caption` | 0.75rem | 12 | `.text-caption` |
137
+ | `--type-small` | 0.875rem | 14 | `.text-small` |
138
+ | `--type-body` | 1rem | 16 | `.text-body` |
139
+ | `--type-prose` | 1.125rem | 18 | `.text-prose` |
140
+ | `--type-subheading` | 1.272rem | 20 | `.text-subheading` |
141
+ | `--type-heading` | 1.618rem | 26 | `.text-heading` |
142
+ | `--type-title` | 2.058rem | 33 | `.text-title` |
143
+ | `--type-display-1` | 2.618rem | 42 | `.text-display` |
144
+ | `--type-display-2` | 3.33rem | 53 | `.text-display-2` |
145
+ | `--type-display-3` | 4.236rem | 68 | `.text-display-3` |
146
+
147
+ The `@theme` block in `theme.css` maps these to Tailwind's `--font-size-*` tokens, so `text-sm`, `text-lg`, etc. adopt the golden-ratio scale.
148
+
149
+ ## Conventions
150
+
151
+ - TypeScript `strict:true`, `verbatimModuleSyntax:true`
152
+ - `moduleResolution:bundler`, `target:ES2022`, `lib:ES2023`
153
+ - `import type` for all type-only imports
154
+ - Named exports only, no defaults
155
+ - shadcn-vue component pattern: reka-ui `Primitive` / `useForwardPropsEmits`, CVA for variants, `cn()` for class composition
156
+ - All shadows normalized to `hsl(var(--shadow-color) / alpha)` format
157
+ - Color palette as HSL channels in `:root` (e.g., `--primary: 222.2 47.4% 11.2%`), consumed as `hsl(var(--primary))` in `@theme`
158
+ - Button four-state guarantee: standard, hover, active (`scale-[0.97]`), disabled (`opacity-50`)
159
+
160
+ ## Dependencies
161
+
162
+ All runtime deps are peer:
163
+
164
+ | Package | Role |
165
+ |---------|------|
166
+ | `vue` ^3.5 | Framework |
167
+ | `reka-ui` ^2.0 | Headless UI primitives |
168
+ | `@vueuse/core` ^14.0 | Composable utilities (useDark, createGlobalState, useEventListener) |
169
+ | `tailwindcss` ^4.0 | Utility CSS framework |
170
+ | `class-variance-authority` ^0.7 | Component variant definitions |
171
+ | `clsx` ^2.0 | Conditional class joining |
172
+ | `tailwind-merge` ^3.0 | Tailwind class conflict resolution |
@@ -0,0 +1 @@
1
+ .dropdown-menu-content[data-v-2106840e],.dropdown-sub-content[data-v-27fd1248]{font-family:var(--dropdown-menu-font, inherit)}.notification-enter-active[data-v-06387036],.notification-leave-active[data-v-06387036]{transition:all .3s ease}.notification-enter-from[data-v-06387036],.notification-leave-to[data-v-06387036]{transform:translate(100%);opacity:0}.notification-move[data-v-06387036]{transition:transform .3s ease}.pane-header[data-v-aa943c4f]{animation:pane-header-shrink-aa943c4f linear both;animation-timeline:--pane-scroll;animation-range:0px 120px}.pane-header-title[data-v-aa943c4f]{animation:pane-title-shrink-aa943c4f linear both;animation-timeline:--pane-scroll;animation-range:0px 120px}.pane-header-desc-wrap[data-v-aa943c4f]{display:grid;grid-template-rows:1fr;overflow:hidden;margin-top:.125rem;animation:pane-desc-shrink-aa943c4f linear both;animation-timeline:--pane-scroll;animation-range:0px 80px}.pane-header-desc-wrap>p[data-v-aa943c4f]{min-height:0}@keyframes pane-header-shrink-aa943c4f{0%{padding-top:1rem;padding-bottom:.5rem}to{padding-top:.5rem;padding-bottom:.25rem}}@keyframes pane-title-shrink-aa943c4f{0%{font-size:var(--type-display-2, 3.33rem)}to{font-size:var(--type-subheading, 1.272rem)}}@keyframes pane-desc-shrink-aa943c4f{0%{grid-template-rows:1fr;opacity:1;margin-top:.125rem}to{grid-template-rows:0fr;opacity:0;margin-top:0}}.confirm-panel-enter-active[data-v-c3955245]{transition:opacity var(--duration-normal) var(--ease-out),transform var(--duration-normal) var(--ease-out)}.confirm-panel-leave-active[data-v-c3955245]{transition:opacity var(--duration-fast) var(--ease-in),transform var(--duration-fast) var(--ease-in)}.confirm-panel-enter-from[data-v-c3955245],.confirm-panel-leave-to[data-v-c3955245]{opacity:0;transform:scale(.95)}.dark-mode-toggle-button[data-v-eccc2243]{cursor:pointer;border:0;padding:0;border-radius:var(--radius-pill);position:relative;isolation:isolate;background:none;opacity:.8;transition:opacity var(--duration-normal) var(--ease-standard),background var(--duration-normal) var(--ease-standard);z-index:var(--z-popover)}.dark-mode-toggle-button svg[data-v-eccc2243]{fill:var(--foreground);width:100%;height:100%}.dark-mode-toggle-button[data-v-eccc2243]:hover,.dark-mode-toggle-button[data-v-eccc2243]:focus{outline:none;opacity:1;background:#80808026}.toggle-sun[data-v-eccc2243]{transform-origin:center center;transition:transform .75s var(--spring-bouncy)}.toggle-circle[data-v-eccc2243]{transform:translate(0);transition:transform .5s var(--ease-out)}:where(.dark) .dark-mode-toggle-button .toggle-sun[data-v-eccc2243]{transform:rotate(.5turn)}:where(.dark) .dark-mode-toggle-button .toggle-circle[data-v-eccc2243]{transform:translate(-15%)}.glass-dock[data-v-4a5d029d]{display:inline-flex;align-items:center;border-radius:var(--radius-dock);white-space:nowrap;overflow:hidden;padding:.375rem .5rem;background:var(--glass-bg-medium);backdrop-filter:var(--glass-blur-subtle);-webkit-backdrop-filter:var(--glass-blur-subtle);border:1.5px solid var(--glass-border-medium);box-shadow:var(--shadow-dock);transition:width var(--duration-normal) var(--spring-snappy),padding var(--duration-normal) var(--spring-snappy),box-shadow var(--duration-normal) var(--ease-standard),transform var(--duration-normal) var(--spring-snappy),background var(--duration-normal) var(--ease-standard),border-color var(--duration-normal) var(--ease-standard)}.glass-dock.collapsed[data-v-4a5d029d]{cursor:pointer;padding:.375rem;justify-content:center;background:var(--glass-bg-subtle);border-color:var(--glass-border-elevated);box-shadow:var(--shadow-dock-collapsed)}.glass-dock.collapsed .dock-layer--summary[data-v-4a5d029d]{min-width:2.5rem;justify-content:center}.glass-dock.collapsed[data-v-4a5d029d]:hover{background:var(--glass-bg-subtle);border-color:var(--glass-border-elevated);box-shadow:var(--shadow-dock);transform:scale(1.03)}.glass-dock[data-v-4a5d029d]:where(.fixed){z-index:var(--z-dock)}.dock-inline[data-v-4a5d029d]{margin:0 auto}.dock-sticky[data-v-4a5d029d]{position:sticky;top:0;z-index:var(--z-dock);margin:0 auto}.dock-layers[data-v-4a5d029d]{display:grid;transition:opacity var(--duration-instant) var(--ease-standard)}.dock-layers.dock-transitioning[data-v-4a5d029d]{opacity:0;pointer-events:none}.dock-layer[data-v-4a5d029d]{display:flex;align-items:center;white-space:nowrap;grid-area:1 / 1;gap:.375rem;height:2.5rem}.dock-layer.layer-active[data-v-4a5d029d]{pointer-events:auto}.dock-layer[data-v-4a5d029d]:not(.layer-active){pointer-events:none;position:absolute;visibility:hidden}.glass-dock.expanded[data-v-4a5d029d]{overflow:visible}.glass-dock.expanded:not(.fit-content) .dock-layers[data-v-4a5d029d]{width:100%}.glass-dock.expanded:not(.fit-content) .dock-layer--full[data-v-4a5d029d]{width:100%}.glass-dock.no-transition[data-v-4a5d029d]{transition:none!important}.glass-dock.always-expanded[data-v-4a5d029d]{cursor:default;overflow:visible}.glass-dock.dock-wrap[data-v-4a5d029d]{white-space:normal;border-radius:var(--radius-2xl);max-width:calc(100vw - 1rem);padding:.375rem .625rem}.glass-dock.dock-wrap .dock-layer--full[data-v-4a5d029d]{flex-wrap:wrap;justify-content:center;height:auto;min-height:2rem;gap:.25rem .375rem}.glass-dock.dock-wrap .dock-layer--summary[data-v-4a5d029d]{height:auto;min-height:2rem}.glass-dock.dock-wrap[data-v-4a5d029d] .dock-separator{display:none}.glass-dock.dock-wrap.collapsed[data-v-4a5d029d]{border-radius:var(--radius-pill);white-space:nowrap;max-width:none}@media(min-width:640px){.glass-dock.dock-wrap[data-v-4a5d029d]{white-space:nowrap;border-radius:var(--radius-pill);max-width:none;padding:.375rem .75rem}.glass-dock.dock-wrap .dock-layer--full[data-v-4a5d029d]{flex-wrap:nowrap;height:2.5rem;gap:.25rem}.glass-dock.dock-wrap .dock-layer--summary[data-v-4a5d029d]{height:2.5rem}.glass-dock.dock-wrap[data-v-4a5d029d] .dock-separator{display:block}}.dock-popover[data-v-a1190369]{position:relative;display:flex;align-items:center;flex-shrink:0}.popover-trigger[data-v-a1190369]{z-index:2;position:relative}.popover-panel[data-v-a1190369]{position:absolute;display:flex;flex-direction:column;align-items:stretch;pointer-events:auto;overflow:hidden;gap:.125rem;padding:.25rem;z-index:var(--z-modal);background:var(--glass-bg-elevated);backdrop-filter:var(--glass-blur-elevated);-webkit-backdrop-filter:var(--glass-blur-elevated);border:1px solid var(--glass-border-elevated);border-radius:var(--radius-panel);box-shadow:var(--glass-shadow-elevated)}.pop-up-enter-active[data-v-a1190369],.pop-down-enter-active[data-v-a1190369]{transition:opacity var(--duration-fast) var(--ease-standard),transform var(--duration-slow) var(--spring-snappy)}.pop-up-leave-active[data-v-a1190369],.pop-down-leave-active[data-v-a1190369]{transition:opacity var(--duration-fast) var(--ease-out),transform var(--duration-fast) var(--ease-out)}.pop-up-enter-from[data-v-a1190369]{opacity:0;transform:scale(.85) translateY(8px)}.pop-up-leave-to[data-v-a1190369]{opacity:0;transform:scale(.95) translateY(4px)}.pop-down-enter-from[data-v-a1190369]{opacity:0;transform:scale(.85) translateY(-8px)}.pop-down-leave-to[data-v-a1190369]{opacity:0;transform:scale(.95) translateY(-4px)}.fuzzy-search[data-v-100fd6e4]{position:relative}.fuzzy-search-input-wrap[data-v-100fd6e4]{display:flex;align-items:center;gap:.375rem;border:1.5px solid color-mix(in srgb,var(--border) 60%,transparent);border-radius:var(--radius-pill);background:color-mix(in srgb,var(--muted) 30%,transparent);padding:.35rem .625rem;transition:border-color var(--duration-fast) var(--ease-standard),background var(--duration-fast) var(--ease-standard),box-shadow var(--duration-fast) var(--ease-standard)}.fuzzy-search-input-wrap[data-v-100fd6e4]:focus-within{border-color:color-mix(in srgb,var(--ring) 40%,transparent);background:var(--background);box-shadow:var(--focus-ring-shadow)}.fuzzy-search-icon[data-v-100fd6e4]{width:.8rem;height:.8rem;flex-shrink:0;color:color-mix(in srgb,var(--muted-foreground) 50%,transparent)}.fuzzy-search-input[data-v-100fd6e4]{flex:1;min-width:0;border:none;outline:none;background:transparent;font-size:.78rem;color:var(--foreground);font-family:inherit}.fuzzy-search-input[data-v-100fd6e4]::placeholder{color:color-mix(in srgb,var(--muted-foreground) 45%,transparent)}.fuzzy-search-action-btn[data-v-100fd6e4]{display:flex;align-items:center;justify-content:center;padding:.15rem;border:none;background:none;color:color-mix(in srgb,var(--muted-foreground) 45%,transparent);cursor:pointer;border-radius:var(--radius-sm);transition:color var(--duration-fast),background var(--duration-fast)}.fuzzy-search-action-btn[data-v-100fd6e4]:hover{color:var(--foreground);background:color-mix(in srgb,var(--muted) 50%,transparent)}.fuzzy-search-results[data-v-100fd6e4]{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:var(--z-popover);max-height:50vh;overflow-y:auto;overscroll-behavior:contain;background:color-mix(in srgb,var(--background) 97%,transparent);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1.5px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-md);padding:.25rem}.fuzzy-search-result[data-v-100fd6e4]{display:flex;align-items:baseline;gap:.375rem;width:100%;padding:.35rem .5rem;border:none;background:none;cursor:pointer;text-align:left;border-radius:var(--radius-sm);transition:background var(--duration-instant) var(--ease-standard)}.fuzzy-search-result[data-v-100fd6e4]:hover,.fuzzy-search-result.is-selected[data-v-100fd6e4]{background:color-mix(in srgb,var(--muted) 50%,transparent)}.fuzzy-search-badge[data-v-100fd6e4]{flex-shrink:0;font-size:.6rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:.1rem .3rem;border-radius:var(--radius-sm);background:var(--muted);color:color-mix(in srgb,var(--muted-foreground) 70%,transparent);line-height:1}.fuzzy-search-label[data-v-100fd6e4]{flex:1;min-width:0;font-size:.875rem;color:color-mix(in srgb,var(--foreground) 85%,transparent);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.4}.fuzzy-search-label[data-v-100fd6e4] mark{background:#ffdd3359;color:inherit;border-radius:var(--radius-sm);padding:0 1px}.fuzzy-search-backdrop[data-v-100fd6e4]{position:fixed;inset:0;z-index:calc(var(--z-popover) - 5)}.fuzzy-search--sidebar[data-v-100fd6e4]{margin-bottom:.5rem}.fuzzy-search--floating .fuzzy-search-input-wrap[data-v-100fd6e4]{border:none;border-radius:0;background:transparent;padding:0}.fuzzy-search--floating .fuzzy-search-input[data-v-100fd6e4]{font-size:1rem}.fuzzy-search--floating .fuzzy-search-results[data-v-100fd6e4]{border-radius:0;border-left:none;border-right:none;top:100%;max-height:60vh}.fuzzy-search-dropdown-enter-active[data-v-100fd6e4],.fuzzy-search-dropdown-leave-active[data-v-100fd6e4]{transition:opacity var(--duration-fast) var(--ease-standard),transform var(--duration-fast) var(--ease-out-expo)}.fuzzy-search-dropdown-enter-from[data-v-100fd6e4],.fuzzy-search-dropdown-leave-to[data-v-100fd6e4]{opacity:0;transform:translateY(-4px)}.fuzzy-search-modal-overlay[data-v-100fd6e4]{position:fixed;inset:0;z-index:var(--z-modal);display:flex;align-items:flex-start;justify-content:center;padding-top:min(12vh,6rem);background:color-mix(in srgb,var(--background) 55%,transparent);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}.fuzzy-search-modal[data-v-100fd6e4]{width:min(36rem,calc(100vw - 2rem));max-height:70vh;display:flex;flex-direction:column;border-radius:var(--radius-xl);border:1.5px solid var(--border);background:var(--background);box-shadow:var(--shadow-xl);overflow:hidden}.fuzzy-search-modal-header[data-v-100fd6e4]{display:flex;align-items:center;gap:.5rem;padding:.75rem .875rem;border-bottom:1px solid color-mix(in srgb,var(--border) 50%,transparent)}.fuzzy-search-modal-icon[data-v-100fd6e4]{width:1rem;height:1rem;flex-shrink:0;color:color-mix(in srgb,var(--muted-foreground) 50%,transparent)}.fuzzy-search-modal-input[data-v-100fd6e4]{flex:1;min-width:0;border:none;outline:none;background:transparent;font-size:1rem;color:var(--foreground);font-family:inherit}.fuzzy-search-modal-input[data-v-100fd6e4]::placeholder{color:color-mix(in srgb,var(--muted-foreground) 40%,transparent)}.fuzzy-search-modal-results[data-v-100fd6e4]{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:.375rem}.fuzzy-search-modal-result[data-v-100fd6e4]{padding:.5rem .625rem}.fuzzy-search-modal-result .fuzzy-search-badge[data-v-100fd6e4]{font-size:.65rem;padding:.125rem .375rem}.fuzzy-search-modal-result .fuzzy-search-label[data-v-100fd6e4]{font-size:1rem}.fuzzy-search-modal-empty[data-v-100fd6e4]{padding:2rem 1rem;text-align:center;color:color-mix(in srgb,var(--muted-foreground) 50%,transparent);font-size:1rem}.fuzzy-search-modal-footer[data-v-100fd6e4]{display:flex;align-items:center;gap:1rem;padding:.5rem .875rem;border-top:1px solid color-mix(in srgb,var(--border) 50%,transparent)}.fuzzy-search-modal-hint[data-v-100fd6e4]{font-size:.875rem;font-family:var(--font-mono, monospace);color:color-mix(in srgb,var(--muted-foreground) 45%,transparent);display:flex;align-items:center;gap:.25rem}.fuzzy-search-modal-hint kbd[data-v-100fd6e4]{display:inline-flex;align-items:center;justify-content:center;min-width:1.25rem;height:1.125rem;padding:0 .25rem;border-radius:var(--radius-sm);border:1px solid color-mix(in srgb,var(--border) 60%,transparent);background:color-mix(in srgb,var(--muted) 40%,transparent);font-size:.6rem;line-height:1}.fuzzy-search-modal-enter-active[data-v-100fd6e4]{transition:opacity .2s var(--ease-standard)}.fuzzy-search-modal-enter-active .fuzzy-search-modal[data-v-100fd6e4]{transition:opacity .2s var(--ease-standard),transform .25s var(--ease-out-expo)}.fuzzy-search-modal-leave-active[data-v-100fd6e4]{transition:opacity var(--duration-fast) var(--ease-standard)}.fuzzy-search-modal-leave-active .fuzzy-search-modal[data-v-100fd6e4]{transition:opacity var(--duration-fast) var(--ease-standard),transform var(--duration-fast) var(--ease-in)}.fuzzy-search-modal-enter-from[data-v-100fd6e4]{opacity:0}.fuzzy-search-modal-enter-from .fuzzy-search-modal[data-v-100fd6e4]{opacity:0;transform:scale(.96) translateY(-8px)}.fuzzy-search-modal-leave-to[data-v-100fd6e4]{opacity:0}.fuzzy-search-modal-leave-to .fuzzy-search-modal[data-v-100fd6e4]{opacity:0;transform:scale(.97) translateY(-4px)}.progressive-sidebar[data-v-76909199]{--sidebar-top-inset: 1rem;--sidebar-bottom-inset: 1.5rem}.progressive-sidebar--sticky[data-v-76909199]{display:none}@media(min-width:1024px){.progressive-sidebar--sticky[data-v-76909199]{display:block;position:sticky;top:var(--sidebar-top-inset);align-self:start;min-height:0;max-height:calc(100dvh - var(--sidebar-top-inset) - var(--sidebar-bottom-inset))}}.sidebar-nav[data-v-76909199]{overflow-y:auto;overscroll-behavior:contain;border-radius:var(--radius-xl);background:var(--card);max-height:calc(100dvh - var(--sidebar-top-inset) - var(--sidebar-bottom-inset));scrollbar-gutter:stable;scroll-padding-bottom:var(--sidebar-bottom-inset);touch-action:pan-y;padding:.625rem .625rem var(--sidebar-bottom-inset);border:2px solid color-mix(in srgb,var(--foreground) 15%,transparent)}.sidebar-header[data-v-76909199]{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:0 .625rem}.sidebar-label[data-v-76909199]{font-size:var(--type-small);font-weight:700;text-transform:uppercase;margin:0;letter-spacing:.08em;color:color-mix(in srgb,var(--muted-foreground) 60%,transparent)}.sidebar-top-btn[data-v-76909199]{flex-shrink:0;display:flex;align-items:center;justify-content:center;cursor:pointer;width:1.25rem;height:1.25rem;border-radius:var(--radius-sm);border:1px solid color-mix(in srgb,var(--border) 40%,transparent);background:none;color:color-mix(in srgb,var(--muted-foreground) 45%,transparent);transition:all var(--duration-fast) var(--ease-standard)}.sidebar-top-btn[data-v-76909199]:hover{color:var(--foreground);border-color:var(--border);background:color-mix(in srgb,var(--muted) 50%,transparent)}.sidebar-list[data-v-76909199]{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:1px}.sidebar-link[data-v-76909199]{display:block;width:100%;text-align:left;background:none;border:none;cursor:pointer;font-weight:500;font-size:1rem;line-height:1.35;padding:.28rem .625rem;border-radius:var(--radius-md);color:var(--muted-foreground);transition:color var(--duration-normal) var(--ease-out-expo),background-color var(--duration-normal) var(--ease-out-expo),font-weight var(--duration-fast) var(--ease-standard)}.sidebar-link[data-v-76909199]:hover{color:var(--foreground);background:color-mix(in srgb,var(--muted) 50%,transparent)}.sidebar-link.is-active[data-v-76909199]{background:none;font-weight:600;color:var(--primary)}.sidebar-link.is-active-sub[data-v-76909199]{font-weight:600;background:color-mix(in srgb,var(--muted) 40%,transparent);color:var(--primary)}.sidebar-sublist-wrapper[data-v-76909199]{display:grid;opacity:0;grid-template-rows:0fr;transition:grid-template-rows .4s var(--ease-out-expo),opacity .3s var(--ease-out-expo)}.sidebar-sublist-wrapper.is-expanded[data-v-76909199]{opacity:1;grid-template-rows:1fr}.sidebar-sublist-wrapper>.sidebar-sublist[data-v-76909199]{overflow:hidden}.sidebar-sublist[data-v-76909199]{list-style:none;padding:0 0 0 .625rem;margin:.0625rem 0 .125rem}.sidebar-sublink[data-v-76909199]{font-size:.78rem;padding:.2rem .45rem}.sidebar-subsublist[data-v-76909199]{list-style:none;padding:0 0 0 .5rem;margin:.03125rem 0 .0625rem}.sidebar-subsublink[data-v-76909199]{font-size:.72rem;padding:.15rem .32rem}.progressive-sidebar--drawer .sidebar-nav[data-v-76909199]{max-height:100%;border:none;border-radius:0;background:transparent}.underline-tabs[data-v-899e87db]{position:relative;display:flex;gap:.25rem}.underline-indicator[data-v-899e87db]{position:absolute;bottom:0;left:0;height:2px;background:var(--foreground);border-radius:var(--radius-sm);transition:transform .25s cubic-bezier(.34,1.56,.64,1),width .25s cubic-bezier(.34,1.56,.64,1)}.underline-tab[data-v-899e87db]{position:relative;border:none;background:none;font-weight:500;cursor:pointer;white-space:nowrap;padding:.375rem .75rem;font:inherit;color:var(--muted-foreground);transition:color var(--duration-normal) var(--ease-standard);border-radius:.25rem}.underline-tab[data-v-899e87db]:hover{color:color-mix(in srgb,var(--foreground) 70%,transparent)}.underline-tab.is-active[data-v-899e87db]{color:var(--foreground)}.bouncy-toggle[data-v-3205a359]{position:relative;display:inline-grid;grid-auto-flow:column;grid-auto-columns:1fr;padding:.1875rem;border-radius:.4375rem;background:color-mix(in srgb,var(--muted) 50%,transparent)}@media(min-width:640px){.bouncy-toggle[data-v-3205a359]{padding:.25rem;border-radius:.5rem}}.bouncy-slider[data-v-3205a359]{position:absolute;background:var(--background);z-index:0;inset-block:.1875rem;border-radius:.3125rem;box-shadow:0 1px 3px #00000014,0 0 0 1px color-mix(in srgb,var(--border) 30%,transparent);transition:transform var(--duration-normal) var(--spring-snappy),width var(--duration-normal) var(--spring-snappy),opacity var(--duration-fast) ease}@media(min-width:640px){.bouncy-slider[data-v-3205a359]{inset-block:.25rem;border-radius:.375rem}}.bouncy-btn[data-v-3205a359]{position:relative;z-index:10;border:none;background:none;font-weight:500;cursor:pointer;white-space:nowrap;padding:.25rem .625rem;border-radius:.3125rem;font:inherit;font-size:.8125rem;color:var(--muted-foreground);transition:color var(--duration-fast) ease}@media(min-width:640px){.bouncy-btn[data-v-3205a359]{padding:.3125rem .75rem;font-size:.875rem}}.bouncy-btn.is-active[data-v-3205a359]{color:var(--foreground)}.bouncy-btn.is-disabled[data-v-3205a359]{opacity:.4;cursor:not-allowed;pointer-events:none;filter:blur(.5px)}.bouncy-toggle--pill[data-v-3205a359]{border-radius:var(--radius-pill);background:color-mix(in srgb,var(--foreground) 5%,transparent);padding:.125rem;gap:.125rem}.bouncy-slider--pill[data-v-3205a359]{border-radius:var(--radius-pill);background:var(--foreground);box-shadow:none;inset-block:.125rem}.bouncy-btn--pill[data-v-3205a359]{border-radius:var(--radius-pill);padding:.125rem .625rem;font-size:.75rem;font-weight:500}@media(min-width:640px){.bouncy-btn--pill[data-v-3205a359]{padding:.125rem .625rem;font-size:.75rem}}.bouncy-btn--pill.is-active[data-v-3205a359]{color:var(--background)}.timeline-row[data-v-c2e9e244]{flex:1 1 0;min-width:0;padding:0 .25rem;position:relative;display:flex;align-items:center}.timeline-caret[data-v-c2e9e244]{position:absolute;bottom:calc(100% + 6px);transform:translate(-50%);pointer-events:none;opacity:0;transition:opacity var(--duration-fast) var(--ease-standard);z-index:var(--z-popover);user-select:none;-webkit-user-select:none}.timeline-row:hover .timeline-caret[data-v-c2e9e244],.timeline-row:has(.glass-track:active) .timeline-caret[data-v-c2e9e244]{opacity:1}.caret-value[data-v-c2e9e244]{display:block;padding:.125rem .375rem;font-size:var(--type-small);font-weight:500;color:var(--popover-foreground);background:var(--popover);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-sm);white-space:nowrap}.glass-track[data-v-c2e9e244]{position:relative;width:100%;height:24px;border-radius:var(--radius-pill);background:color-mix(in srgb,var(--foreground) 5%,transparent);backdrop-filter:var(--glass-blur-subtle);-webkit-backdrop-filter:var(--glass-blur-subtle);cursor:pointer;touch-action:none;overflow:hidden;transition:background var(--duration-fast) var(--ease-standard);outline:none}.glass-track[data-v-c2e9e244]:hover,.glass-track[data-v-c2e9e244]:focus-visible{background:color-mix(in srgb,var(--foreground) 8%,transparent)}.glass-track[data-v-c2e9e244]:focus-visible{box-shadow:var(--focus-ring-shadow)}.glass-fill[data-v-c2e9e244]{position:absolute;top:0;left:0;bottom:0;background:color-mix(in srgb,var(--foreground) 7%,transparent);border-radius:var(--radius-pill);pointer-events:none}.glass-thumb[data-v-c2e9e244]{position:absolute;top:50%;transform:translate(calc(-50% - 3px),-50%);width:6px;height:16px;border-radius:var(--radius-sm);background:color-mix(in srgb,var(--foreground) 25%,transparent);opacity:0;pointer-events:none;transition:opacity var(--duration-fast) var(--ease-standard),width var(--duration-fast) var(--ease-standard),height var(--duration-fast) var(--ease-standard),background var(--duration-fast) var(--ease-standard)}.glass-track:hover .glass-thumb[data-v-c2e9e244]{opacity:1;width:8px;height:18px;background:color-mix(in srgb,var(--foreground) 40%,transparent)}.tw-root[data-v-b71400e5]{display:inline}.tw-tail[data-v-b71400e5]{white-space:nowrap}.tw-char[data-v-b71400e5]{display:inline}.tw-char--interactive[data-v-b71400e5]{cursor:pointer;border-radius:var(--radius-sm);padding:0 1px;margin:0 -1px;transition:background-color var(--duration-fast) var(--ease-standard)}.tw-char--interactive[data-v-b71400e5]:hover{background-color:#80808026}.tw-cursor[data-v-b71400e5]{display:inline-block;font-weight:100}.tw-cursor--blink[data-v-b71400e5]{animation:tw-cursor-blink-b71400e5 1.06s step-end infinite}@keyframes tw-cursor-blink-b71400e5{0%,50%{opacity:1}51%,to{opacity:0}}.glass-panel[data-v-0f243be8]{position:relative}.glass-panel--svg[data-v-0f243be8]{background:color-mix(in srgb,var(--card) 15%,transparent)}.glass-panel--fallback[data-v-0f243be8]{background:color-mix(in srgb,var(--card) 92%,transparent);border:1px solid color-mix(in srgb,var(--border) 35%,transparent)}