@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.
- package/README.md +172 -0
- package/dist/glass-ui.css +1 -0
- package/dist/glass-ui.js +10019 -0
- package/dist/index.d.ts +6619 -0
- package/package.json +65 -0
- package/src/components/custom/aurora/Aurora.vue +34 -0
- package/src/components/custom/aurora/composables/color.ts +122 -0
- package/src/components/custom/aurora/composables/useAurora.ts +355 -0
- package/src/components/custom/aurora/index.ts +8 -0
- package/src/components/custom/confirm-dialog/ConfirmDialog.vue +88 -0
- package/src/components/custom/confirm-dialog/index.ts +1 -0
- package/src/components/custom/controls/DarkModeToggle.vue +96 -0
- package/src/components/custom/controls/index.ts +1 -0
- package/src/components/custom/dock/DockLayerGroup.vue +21 -0
- package/src/components/custom/dock/DockPopover.vue +263 -0
- package/src/components/custom/dock/GlassDock.vue +276 -0
- package/src/components/custom/dock/composables/index.ts +16 -0
- package/src/components/custom/dock/composables/isTeleportedTarget.ts +19 -0
- package/src/components/custom/dock/composables/useDockActionBar.ts +33 -0
- package/src/components/custom/dock/composables/useDockState.ts +301 -0
- package/src/components/custom/dock/composables/useDockTransition.ts +146 -0
- package/src/components/custom/dock/composables/useLayerTransition.ts +135 -0
- package/src/components/custom/dock/composables/usePopupMutex.ts +83 -0
- package/src/components/custom/dock/index.ts +9 -0
- package/src/components/custom/expandable-container/ExpandableContainer.vue +64 -0
- package/src/components/custom/expandable-container/index.ts +1 -0
- package/src/components/custom/glass-panel/GlassPanel.vue +98 -0
- package/src/components/custom/glass-panel/index.ts +2 -0
- package/src/components/custom/icon-tooltip/IconTooltip.vue +20 -0
- package/src/components/custom/icon-tooltip/index.ts +1 -0
- package/src/components/custom/index.ts +15 -0
- package/src/components/custom/infinite-scroll/InfiniteScroll.vue +55 -0
- package/src/components/custom/infinite-scroll/composables/index.ts +2 -0
- package/src/components/custom/infinite-scroll/composables/types.ts +23 -0
- package/src/components/custom/infinite-scroll/composables/useInfiniteScroll.ts +73 -0
- package/src/components/custom/infinite-scroll/index.ts +1 -0
- package/src/components/custom/labeled-field/LabeledInput.vue +29 -0
- package/src/components/custom/labeled-field/LabeledSelect.vue +59 -0
- package/src/components/custom/labeled-field/LabeledSlider.vue +32 -0
- package/src/components/custom/labeled-field/LabeledSwitch.vue +27 -0
- package/src/components/custom/labeled-field/index.ts +4 -0
- package/src/components/custom/metaballs/MetaballCanvas.vue +23 -0
- package/src/components/custom/metaballs/index.ts +4 -0
- package/src/components/custom/metaballs/shaders.ts +63 -0
- package/src/components/custom/metaballs/types.ts +29 -0
- package/src/components/custom/metaballs/useMetaballs.ts +252 -0
- package/src/components/custom/search/FuzzySearch.vue +589 -0
- package/src/components/custom/search/SearchBar.vue +44 -0
- package/src/components/custom/search/composables/fuzzySearchIndex.ts +224 -0
- package/src/components/custom/search/composables/index.ts +5 -0
- package/src/components/custom/search/composables/types.ts +34 -0
- package/src/components/custom/search/composables/useFuzzySearch.ts +115 -0
- package/src/components/custom/search/index.ts +7 -0
- package/src/components/custom/sidebar/ProgressiveSidebar.vue +256 -0
- package/src/components/custom/sidebar/composables/index.ts +6 -0
- package/src/components/custom/sidebar/composables/useScrollTracker.ts +242 -0
- package/src/components/custom/sidebar/composables/useSidebarFollow.ts +247 -0
- package/src/components/custom/sidebar/composables/useSidebarState.ts +72 -0
- package/src/components/custom/sidebar/composables/useTreeIndex.ts +152 -0
- package/src/components/custom/sidebar/index.ts +15 -0
- package/src/components/custom/sidebar/types.ts +50 -0
- package/src/components/custom/tabs/BouncyTabs.vue +39 -0
- package/src/components/custom/tabs/BouncyToggle.vue +352 -0
- package/src/components/custom/tabs/UnderlineTabs.vue +115 -0
- package/src/components/custom/tabs/index.ts +5 -0
- package/src/components/custom/timeline/GlassTimeline.vue +174 -0
- package/src/components/custom/timeline/index.ts +1 -0
- package/src/components/custom/typewriter/TypewriterText.vue +239 -0
- package/src/components/custom/typewriter/composables/index.ts +1 -0
- package/src/components/custom/typewriter/composables/useTypewriter.ts +413 -0
- package/src/components/custom/typewriter/index.ts +7 -0
- package/src/components/custom/typewriter/types.ts +159 -0
- package/src/components/custom/typewriter/utils/keyboard.ts +213 -0
- package/src/components/custom/typewriter/utils/pausePatterns.ts +55 -0
- package/src/components/custom/typewriter/utils/timing.ts +104 -0
- package/src/components/custom/typewriter/utils/typoStateMachine.ts +197 -0
- package/src/components/index.ts +2 -0
- package/src/components/ui/accordion/Accordion.vue +19 -0
- package/src/components/ui/accordion/AccordionContent.vue +24 -0
- package/src/components/ui/accordion/AccordionItem.vue +24 -0
- package/src/components/ui/accordion/AccordionTrigger.vue +39 -0
- package/src/components/ui/accordion/index.ts +4 -0
- package/src/components/ui/alert/Alert.vue +20 -0
- package/src/components/ui/alert/AlertDescription.vue +17 -0
- package/src/components/ui/alert/AlertTitle.vue +17 -0
- package/src/components/ui/alert/index.ts +23 -0
- package/src/components/ui/avatar/Avatar.vue +21 -0
- package/src/components/ui/avatar/AvatarFallback.vue +11 -0
- package/src/components/ui/avatar/AvatarImage.vue +9 -0
- package/src/components/ui/avatar/index.ts +24 -0
- package/src/components/ui/badge/Badge.vue +16 -0
- package/src/components/ui/badge/index.ts +25 -0
- package/src/components/ui/button/Button.vue +26 -0
- package/src/components/ui/button/index.ts +43 -0
- package/src/components/ui/card/Card.vue +28 -0
- package/src/components/ui/card/CardContent.vue +14 -0
- package/src/components/ui/card/CardDescription.vue +14 -0
- package/src/components/ui/card/CardFooter.vue +14 -0
- package/src/components/ui/card/CardHeader.vue +14 -0
- package/src/components/ui/card/CardTitle.vue +21 -0
- package/src/components/ui/card/index.ts +6 -0
- package/src/components/ui/carousel/Carousel.vue +53 -0
- package/src/components/ui/carousel/CarouselContent.vue +35 -0
- package/src/components/ui/carousel/CarouselItem.vue +24 -0
- package/src/components/ui/carousel/CarouselNext.vue +40 -0
- package/src/components/ui/carousel/CarouselPrevious.vue +40 -0
- package/src/components/ui/carousel/index.ts +10 -0
- package/src/components/ui/carousel/interface.ts +26 -0
- package/src/components/ui/carousel/useCarousel.ts +56 -0
- package/src/components/ui/checkbox/Checkbox.vue +33 -0
- package/src/components/ui/checkbox/index.ts +1 -0
- package/src/components/ui/collapsible/Collapsible.vue +15 -0
- package/src/components/ui/collapsible/CollapsibleContent.vue +11 -0
- package/src/components/ui/collapsible/CollapsibleTrigger.vue +11 -0
- package/src/components/ui/collapsible/index.ts +3 -0
- package/src/components/ui/combobox/Combobox.vue +17 -0
- package/src/components/ui/combobox/ComboboxAnchor.vue +23 -0
- package/src/components/ui/combobox/ComboboxEmpty.vue +21 -0
- package/src/components/ui/combobox/ComboboxGroup.vue +27 -0
- package/src/components/ui/combobox/ComboboxInput.vue +41 -0
- package/src/components/ui/combobox/ComboboxItem.vue +24 -0
- package/src/components/ui/combobox/ComboboxItemIndicator.vue +23 -0
- package/src/components/ui/combobox/ComboboxList.vue +29 -0
- package/src/components/ui/combobox/ComboboxSeparator.vue +21 -0
- package/src/components/ui/combobox/ComboboxViewport.vue +23 -0
- package/src/components/ui/combobox/index.ts +12 -0
- package/src/components/ui/command/Command.vue +30 -0
- package/src/components/ui/command/CommandDialog.vue +21 -0
- package/src/components/ui/command/CommandEmpty.vue +20 -0
- package/src/components/ui/command/CommandGroup.vue +29 -0
- package/src/components/ui/command/CommandInput.vue +33 -0
- package/src/components/ui/command/CommandItem.vue +26 -0
- package/src/components/ui/command/CommandList.vue +27 -0
- package/src/components/ui/command/CommandSeparator.vue +23 -0
- package/src/components/ui/command/CommandShortcut.vue +14 -0
- package/src/components/ui/command/index.ts +9 -0
- package/src/components/ui/context-menu/ContextMenu.vue +15 -0
- package/src/components/ui/context-menu/ContextMenuCheckboxItem.vue +40 -0
- package/src/components/ui/context-menu/ContextMenuContent.vue +36 -0
- package/src/components/ui/context-menu/ContextMenuGroup.vue +11 -0
- package/src/components/ui/context-menu/ContextMenuItem.vue +34 -0
- package/src/components/ui/context-menu/ContextMenuLabel.vue +25 -0
- package/src/components/ui/context-menu/ContextMenuPortal.vue +11 -0
- package/src/components/ui/context-menu/ContextMenuRadioGroup.vue +19 -0
- package/src/components/ui/context-menu/ContextMenuRadioItem.vue +40 -0
- package/src/components/ui/context-menu/ContextMenuSeparator.vue +20 -0
- package/src/components/ui/context-menu/ContextMenuShortcut.vue +14 -0
- package/src/components/ui/context-menu/ContextMenuSub.vue +19 -0
- package/src/components/ui/context-menu/ContextMenuSubContent.vue +35 -0
- package/src/components/ui/context-menu/ContextMenuSubTrigger.vue +34 -0
- package/src/components/ui/context-menu/ContextMenuTrigger.vue +13 -0
- package/src/components/ui/context-menu/index.ts +14 -0
- package/src/components/ui/data-table/DataTable.vue +167 -0
- package/src/components/ui/data-table/DataTablePagination.vue +112 -0
- package/src/components/ui/data-table/index.ts +3 -0
- package/src/components/ui/data-table/types.ts +48 -0
- package/src/components/ui/dialog/Dialog.vue +14 -0
- package/src/components/ui/dialog/DialogClose.vue +11 -0
- package/src/components/ui/dialog/DialogContent.vue +61 -0
- package/src/components/ui/dialog/DialogDescription.vue +24 -0
- package/src/components/ui/dialog/DialogFooter.vue +19 -0
- package/src/components/ui/dialog/DialogHeader.vue +16 -0
- package/src/components/ui/dialog/DialogScrollContent.vue +65 -0
- package/src/components/ui/dialog/DialogTitle.vue +29 -0
- package/src/components/ui/dialog/DialogTrigger.vue +11 -0
- package/src/components/ui/dialog/index.ts +9 -0
- package/src/components/ui/drawer/Drawer.vue +19 -0
- package/src/components/ui/drawer/DrawerContent.vue +28 -0
- package/src/components/ui/drawer/DrawerDescription.vue +20 -0
- package/src/components/ui/drawer/DrawerFooter.vue +14 -0
- package/src/components/ui/drawer/DrawerHeader.vue +14 -0
- package/src/components/ui/drawer/DrawerOverlay.vue +18 -0
- package/src/components/ui/drawer/DrawerTitle.vue +20 -0
- package/src/components/ui/drawer/index.ts +8 -0
- package/src/components/ui/dropdown-menu/DropdownMenu.vue +14 -0
- package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +40 -0
- package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +44 -0
- package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
- package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +28 -0
- package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +24 -0
- package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +19 -0
- package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +40 -0
- package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +22 -0
- package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
- package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
- package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +36 -0
- package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +33 -0
- package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +13 -0
- package/src/components/ui/dropdown-menu/index.ts +16 -0
- package/src/components/ui/hover-card/HoverCard.vue +14 -0
- package/src/components/ui/hover-card/HoverCardContent.vue +41 -0
- package/src/components/ui/hover-card/HoverCardTrigger.vue +11 -0
- package/src/components/ui/hover-card/index.ts +3 -0
- package/src/components/ui/index.ts +41 -0
- package/src/components/ui/input/Input.vue +24 -0
- package/src/components/ui/input/index.ts +1 -0
- package/src/components/ui/label/Label.vue +27 -0
- package/src/components/ui/label/index.ts +1 -0
- package/src/components/ui/multi-select/MultiSelect.vue +141 -0
- package/src/components/ui/multi-select/index.ts +7 -0
- package/src/components/ui/notification/Notification.vue +85 -0
- package/src/components/ui/notification/index.ts +1 -0
- package/src/components/ui/number-field/NumberField.vue +23 -0
- package/src/components/ui/number-field/NumberFieldContent.vue +14 -0
- package/src/components/ui/number-field/NumberFieldDecrement.vue +25 -0
- package/src/components/ui/number-field/NumberFieldIncrement.vue +25 -0
- package/src/components/ui/number-field/NumberFieldInput.vue +8 -0
- package/src/components/ui/number-field/index.ts +5 -0
- package/src/components/ui/popover/Popover.vue +15 -0
- package/src/components/ui/popover/PopoverContent.vue +61 -0
- package/src/components/ui/popover/PopoverTrigger.vue +11 -0
- package/src/components/ui/popover/index.ts +3 -0
- package/src/components/ui/progress/Progress.vue +39 -0
- package/src/components/ui/progress/index.ts +1 -0
- package/src/components/ui/radio-group/RadioGroup.vue +25 -0
- package/src/components/ui/radio-group/RadioGroupItem.vue +39 -0
- package/src/components/ui/radio-group/index.ts +2 -0
- package/src/components/ui/scroll-area/ScrollArea.vue +29 -0
- package/src/components/ui/scroll-area/ScrollBar.vue +30 -0
- package/src/components/ui/scroll-area/index.ts +2 -0
- package/src/components/ui/scroll-pane/ScrollPane.vue +25 -0
- package/src/components/ui/scroll-pane/ScrollPaneHeader.vue +75 -0
- package/src/components/ui/scroll-pane/index.ts +2 -0
- package/src/components/ui/select/Select.vue +15 -0
- package/src/components/ui/select/SelectContent.vue +57 -0
- package/src/components/ui/select/SelectGroup.vue +19 -0
- package/src/components/ui/select/SelectItem.vue +47 -0
- package/src/components/ui/select/SelectItemText.vue +11 -0
- package/src/components/ui/select/SelectLabel.vue +13 -0
- package/src/components/ui/select/SelectScrollDownButton.vue +24 -0
- package/src/components/ui/select/SelectScrollUpButton.vue +24 -0
- package/src/components/ui/select/SelectSeparator.vue +17 -0
- package/src/components/ui/select/SelectTrigger.vue +45 -0
- package/src/components/ui/select/SelectValue.vue +11 -0
- package/src/components/ui/select/index.ts +11 -0
- package/src/components/ui/separator/Separator.vue +35 -0
- package/src/components/ui/separator/index.ts +1 -0
- package/src/components/ui/sheet/Sheet.vue +14 -0
- package/src/components/ui/sheet/SheetClose.vue +11 -0
- package/src/components/ui/sheet/SheetContent.vue +56 -0
- package/src/components/ui/sheet/SheetDescription.vue +22 -0
- package/src/components/ui/sheet/SheetFooter.vue +19 -0
- package/src/components/ui/sheet/SheetHeader.vue +16 -0
- package/src/components/ui/sheet/SheetTitle.vue +22 -0
- package/src/components/ui/sheet/SheetTrigger.vue +11 -0
- package/src/components/ui/sheet/index.ts +31 -0
- package/src/components/ui/skeleton/Skeleton.vue +14 -0
- package/src/components/ui/skeleton/index.ts +1 -0
- package/src/components/ui/slider/Slider.vue +66 -0
- package/src/components/ui/slider/index.ts +1 -0
- package/src/components/ui/switch/Switch.vue +37 -0
- package/src/components/ui/switch/index.ts +1 -0
- package/src/components/ui/table/Table.vue +16 -0
- package/src/components/ui/table/TableBody.vue +14 -0
- package/src/components/ui/table/TableCaption.vue +14 -0
- package/src/components/ui/table/TableCell.vue +14 -0
- package/src/components/ui/table/TableEmpty.vue +39 -0
- package/src/components/ui/table/TableFooter.vue +16 -0
- package/src/components/ui/table/TableHead.vue +21 -0
- package/src/components/ui/table/TableHeader.vue +14 -0
- package/src/components/ui/table/TableRow.vue +21 -0
- package/src/components/ui/table/index.ts +9 -0
- package/src/components/ui/tabs/Tabs.vue +15 -0
- package/src/components/ui/tabs/TabsContent.vue +22 -0
- package/src/components/ui/tabs/TabsIndicator.vue +22 -0
- package/src/components/ui/tabs/TabsList.vue +25 -0
- package/src/components/ui/tabs/TabsTrigger.vue +29 -0
- package/src/components/ui/tabs/index.ts +5 -0
- package/src/components/ui/tags-input/TagsInput.vue +22 -0
- package/src/components/ui/tags-input/TagsInputInput.vue +19 -0
- package/src/components/ui/tags-input/TagsInputItem.vue +22 -0
- package/src/components/ui/tags-input/TagsInputItemDelete.vue +24 -0
- package/src/components/ui/tags-input/TagsInputItemText.vue +19 -0
- package/src/components/ui/tags-input/index.ts +5 -0
- package/src/components/ui/textarea/Textarea.vue +24 -0
- package/src/components/ui/textarea/index.ts +1 -0
- package/src/components/ui/toast/Toast.vue +57 -0
- package/src/components/ui/toast/ToastAction.vue +30 -0
- package/src/components/ui/toast/ToastClose.vue +31 -0
- package/src/components/ui/toast/ToastDescription.vue +25 -0
- package/src/components/ui/toast/ToastTitle.vue +25 -0
- package/src/components/ui/toast/Toaster.vue +31 -0
- package/src/components/ui/toast/index.ts +8 -0
- package/src/components/ui/toast/use-toast.ts +136 -0
- package/src/components/ui/toggle/Toggle.vue +35 -0
- package/src/components/ui/toggle/index.ts +27 -0
- package/src/components/ui/toggle-group/ToggleGroup.vue +34 -0
- package/src/components/ui/toggle-group/ToggleGroupItem.vue +35 -0
- package/src/components/ui/toggle-group/index.ts +2 -0
- package/src/components/ui/tooltip/Tooltip.vue +14 -0
- package/src/components/ui/tooltip/TooltipContent.vue +31 -0
- package/src/components/ui/tooltip/TooltipProvider.vue +11 -0
- package/src/components/ui/tooltip/TooltipTrigger.vue +11 -0
- package/src/components/ui/tooltip/index.ts +4 -0
- package/src/composables/glass/index.ts +8 -0
- package/src/composables/glass/useGlassRenderer.ts +252 -0
- package/src/composables/glass/webgl/frostShader.ts +221 -0
- package/src/composables/glass/webgpu/glassShader.wgsl +173 -0
- package/src/composables/index.ts +32 -0
- package/src/composables/infinite-scroll/index.ts +2 -0
- package/src/composables/infinite-scroll/types.ts +25 -0
- package/src/composables/infinite-scroll/useInfiniteScroll.ts +101 -0
- package/src/composables/interaction/index.ts +5 -0
- package/src/composables/interaction/useHeightTransition.ts +82 -0
- package/src/composables/interaction/useHoverPopover.ts +64 -0
- package/src/composables/interaction/useHoverToggle.ts +103 -0
- package/src/composables/interaction/useLeaveTimer.ts +17 -0
- package/src/composables/interaction/useTouchGate.ts +207 -0
- package/src/composables/pagination/index.ts +2 -0
- package/src/composables/pagination/useOffsetPagination.ts +70 -0
- package/src/composables/prng.ts +32 -0
- package/src/composables/useCharSplit.ts +31 -0
- package/src/composables/useClipboard.ts +46 -0
- package/src/composables/useGlobalDark.ts +61 -0
- package/src/composables/useKeyboardShortcuts.ts +205 -0
- package/src/composables/useWatercolorBlob.ts +136 -0
- package/src/composables/virtual/index.ts +22 -0
- package/src/composables/virtual/useVirtualSectionWindow.ts +338 -0
- package/src/composables/virtual/useWindowedStore.ts +86 -0
- package/src/composables/virtual/virtualSectionLayout.ts +212 -0
- package/src/index.ts +9 -0
- package/src/styles/animations.css +233 -0
- package/src/styles/cards.css +66 -0
- package/src/styles/dock.css +221 -0
- package/src/styles/floating-panel.css +49 -0
- package/src/styles/glass.css +266 -0
- package/src/styles/index.css +26 -0
- package/src/styles/scroll-pane.css +10 -0
- package/src/styles/theme.css +138 -0
- package/src/styles/tokens.css +333 -0
- package/src/styles/transitions.css +226 -0
- package/src/styles/typography.css +277 -0
- package/src/styles/utilities.css +697 -0
- package/src/utils/cn.ts +6 -0
- 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)}
|