@bl33dz/fa814698dcde12f86a37ac31dd3aedf9 1.0.5 → 1.0.7
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 +80 -95
- package/dist/fa814698dcde12f86a37ac31dd3aedf9.css +1 -1
- package/dist/perisai-ui.es.js +864 -847
- package/dist/perisai-ui.umd.js +1 -1
- package/package.json +45 -45
- package/src/{global.css → globals.css} +575 -575
- package/src/index.ts +178 -176
- package/src/lib/utils.ts +6 -6
- package/src/shadcn/accordion/Accordion.vue +19 -19
- package/src/shadcn/accordion/AccordionContent.vue +23 -23
- package/src/shadcn/accordion/AccordionItem.vue +23 -23
- package/src/shadcn/accordion/AccordionTrigger.vue +38 -38
- package/src/shadcn/accordion/index.ts +4 -4
- package/src/shadcn/avatar/Avatar.vue +18 -18
- package/src/shadcn/avatar/AvatarFallback.vue +21 -21
- package/src/shadcn/avatar/AvatarImage.vue +16 -16
- package/src/shadcn/avatar/index.ts +3 -3
- package/src/shadcn/breadcrumb/Breadcrumb.vue +8 -8
- package/src/shadcn/breadcrumb/BreadcrumbEllipsis.vue +9 -9
- package/src/shadcn/breadcrumb/BreadcrumbItem.vue +8 -8
- package/src/shadcn/breadcrumb/BreadcrumbLink.vue +8 -8
- package/src/shadcn/breadcrumb/BreadcrumbList.vue +8 -8
- package/src/shadcn/breadcrumb/BreadcrumbPage.vue +8 -8
- package/src/shadcn/breadcrumb/BreadcrumbSeparator.vue +8 -8
- package/src/shadcn/breadcrumb/index.ts +7 -7
- package/src/shadcn/button/Button.vue +29 -29
- package/src/shadcn/button/index.ts +38 -38
- package/src/shadcn/calendar/Calendar.vue +64 -64
- package/src/shadcn/calendar/CalendarCell.vue +23 -23
- package/src/shadcn/calendar/CalendarCellTrigger.vue +39 -39
- package/src/shadcn/calendar/CalendarGrid.vue +23 -23
- package/src/shadcn/calendar/CalendarGridBody.vue +15 -15
- package/src/shadcn/calendar/CalendarGridHead.vue +16 -16
- package/src/shadcn/calendar/CalendarGridRow.vue +22 -22
- package/src/shadcn/calendar/CalendarHeadCell.vue +23 -23
- package/src/shadcn/calendar/CalendarHeader.vue +23 -23
- package/src/shadcn/calendar/CalendarHeading.vue +30 -30
- package/src/shadcn/calendar/CalendarNextButton.vue +32 -32
- package/src/shadcn/calendar/CalendarPrevButton.vue +32 -32
- package/src/shadcn/calendar/index.ts +12 -12
- package/src/shadcn/card/Card.vue +8 -8
- package/src/shadcn/card/CardContent.vue +8 -8
- package/src/shadcn/card/CardDescription.vue +8 -8
- package/src/shadcn/card/CardHeader.vue +8 -8
- package/src/shadcn/card/CardTitle.vue +8 -8
- package/src/shadcn/card/index.ts +5 -5
- package/src/shadcn/checkbox/Checkbox.vue +38 -38
- package/src/shadcn/checkbox/index.ts +1 -1
- package/src/shadcn/command/Command.vue +87 -87
- package/src/shadcn/command/CommandDialog.vue +31 -31
- package/src/shadcn/command/CommandEmpty.vue +27 -27
- package/src/shadcn/command/CommandGroup.vue +45 -45
- package/src/shadcn/command/CommandInput.vue +39 -39
- package/src/shadcn/command/CommandItem.vue +76 -76
- package/src/shadcn/command/CommandList.vue +25 -25
- package/src/shadcn/command/CommandSeparator.vue +21 -21
- package/src/shadcn/command/CommandShortcut.vue +17 -17
- package/src/shadcn/command/index.ts +25 -25
- package/src/shadcn/context-menu/ContextMenu.vue +18 -18
- package/src/shadcn/context-menu/ContextMenuCheckboxItem.vue +38 -38
- package/src/shadcn/context-menu/ContextMenuContent.vue +34 -34
- package/src/shadcn/context-menu/ContextMenuGroup.vue +15 -15
- package/src/shadcn/context-menu/ContextMenuItem.vue +39 -39
- package/src/shadcn/context-menu/ContextMenuLabel.vue +22 -22
- package/src/shadcn/context-menu/ContextMenuPortal.vue +15 -15
- package/src/shadcn/context-menu/ContextMenuRadioGroup.vue +22 -22
- package/src/shadcn/context-menu/ContextMenuRadioItem.vue +38 -38
- package/src/shadcn/context-menu/ContextMenuSeparator.vue +22 -22
- package/src/shadcn/context-menu/ContextMenuShortcut.vue +17 -17
- package/src/shadcn/context-menu/ContextMenuSub.vue +22 -22
- package/src/shadcn/context-menu/ContextMenuSubContent.vue +33 -33
- package/src/shadcn/context-menu/ContextMenuSubTrigger.vue +33 -33
- package/src/shadcn/context-menu/ContextMenuTrigger.vue +17 -17
- package/src/shadcn/context-menu/index.ts +15 -15
- package/src/shadcn/dialog/Dialog.vue +18 -18
- package/src/shadcn/dialog/DialogClose.vue +15 -15
- package/src/shadcn/dialog/DialogContent.vue +46 -46
- package/src/shadcn/dialog/DialogDescription.vue +23 -23
- package/src/shadcn/dialog/DialogFooter.vue +15 -15
- package/src/shadcn/dialog/DialogHeader.vue +17 -17
- package/src/shadcn/dialog/DialogOverlay.vue +21 -21
- package/src/shadcn/dialog/DialogScrollContent.vue +56 -56
- package/src/shadcn/dialog/DialogTitle.vue +23 -23
- package/src/shadcn/dialog/DialogTrigger.vue +15 -15
- package/src/shadcn/dialog/index.ts +10 -10
- package/src/shadcn/dropdown-menu/DropdownMenu.vue +18 -18
- package/src/shadcn/dropdown-menu/DropdownMenuCheckboxItem.vue +38 -38
- package/src/shadcn/dropdown-menu/DropdownMenuContent.vue +36 -36
- package/src/shadcn/dropdown-menu/DropdownMenuGroup.vue +15 -15
- package/src/shadcn/dropdown-menu/DropdownMenuItem.vue +31 -31
- package/src/shadcn/dropdown-menu/DropdownMenuLabel.vue +23 -23
- package/src/shadcn/dropdown-menu/DropdownMenuRadioGroup.vue +22 -22
- package/src/shadcn/dropdown-menu/DropdownMenuRadioItem.vue +39 -39
- package/src/shadcn/dropdown-menu/DropdownMenuSeparator.vue +24 -24
- package/src/shadcn/dropdown-menu/DropdownMenuShortcut.vue +17 -17
- package/src/shadcn/dropdown-menu/DropdownMenuSub.vue +19 -19
- package/src/shadcn/dropdown-menu/DropdownMenuSubContent.vue +28 -28
- package/src/shadcn/dropdown-menu/DropdownMenuSubTrigger.vue +31 -31
- package/src/shadcn/dropdown-menu/DropdownMenuTrigger.vue +17 -17
- package/src/shadcn/dropdown-menu/index.ts +16 -16
- package/src/shadcn/menubar/Menubar.vue +33 -33
- package/src/shadcn/menubar/MenubarCheckboxItem.vue +38 -38
- package/src/shadcn/menubar/MenubarContent.vue +42 -42
- package/src/shadcn/menubar/MenubarGroup.vue +15 -15
- package/src/shadcn/menubar/MenubarItem.vue +37 -37
- package/src/shadcn/menubar/MenubarLabel.vue +20 -20
- package/src/shadcn/menubar/MenubarMenu.vue +15 -15
- package/src/shadcn/menubar/MenubarPortal.vue +5 -5
- package/src/shadcn/menubar/MenubarRadioGroup.vue +22 -22
- package/src/shadcn/menubar/MenubarRadioItem.vue +38 -38
- package/src/shadcn/menubar/MenubarSeparator.vue +21 -21
- package/src/shadcn/menubar/MenubarShortcut.vue +17 -17
- package/src/shadcn/menubar/MenubarSub.vue +23 -23
- package/src/shadcn/menubar/MenubarSubContent.vue +36 -36
- package/src/shadcn/menubar/MenubarSubTrigger.vue +28 -28
- package/src/shadcn/menubar/MenubarTrigger.vue +28 -28
- package/src/shadcn/menubar/index.ts +15 -15
- package/src/shadcn/navigation-menu/NavigationMenu.vue +35 -35
- package/src/shadcn/navigation-menu/NavigationMenuContent.vue +31 -31
- package/src/shadcn/navigation-menu/NavigationMenuIndicator.vue +23 -23
- package/src/shadcn/navigation-menu/NavigationMenuItem.vue +21 -21
- package/src/shadcn/navigation-menu/NavigationMenuLink.vue +26 -26
- package/src/shadcn/navigation-menu/NavigationMenuList.vue +28 -28
- package/src/shadcn/navigation-menu/NavigationMenuTrigger.vue +24 -24
- package/src/shadcn/navigation-menu/NavigationMenuViewport.vue +31 -31
- package/src/shadcn/navigation-menu/index.ts +14 -14
- package/src/shadcn/pagination/Pagination.vue +151 -151
- package/src/shadcn/pagination/PaginationContent.vue +22 -22
- package/src/shadcn/pagination/PaginationEllipsis.vue +25 -25
- package/src/shadcn/pagination/PaginationFirst.vue +33 -33
- package/src/shadcn/pagination/PaginationItem.vue +31 -31
- package/src/shadcn/pagination/PaginationLast.vue +33 -33
- package/src/shadcn/pagination/PaginationLink.vue +13 -13
- package/src/shadcn/pagination/PaginationNext.vue +22 -22
- package/src/shadcn/pagination/PaginationPrevious.vue +33 -33
- package/src/shadcn/pagination/index.ts +9 -9
- package/src/shadcn/popover/Popover.vue +18 -18
- package/src/shadcn/popover/PopoverAnchor.vue +15 -15
- package/src/shadcn/popover/PopoverContent.vue +46 -46
- package/src/shadcn/popover/PopoverTrigger.vue +15 -15
- package/src/shadcn/popover/index.ts +4 -4
- package/src/shadcn/radio-group/RadioGroup.vue +24 -24
- package/src/shadcn/radio-group/RadioGroupItem.vue +39 -39
- package/src/shadcn/radio-group/index.ts +2 -2
- package/src/shadcn/range-calendar/RangeCalendar.vue +71 -71
- package/src/shadcn/range-calendar/RangeCalendarCell.vue +23 -23
- package/src/shadcn/range-calendar/RangeCalendarCellTrigger.vue +41 -41
- package/src/shadcn/range-calendar/RangeCalendarGrid.vue +23 -23
- package/src/shadcn/range-calendar/RangeCalendarGridBody.vue +15 -15
- package/src/shadcn/range-calendar/RangeCalendarGridHead.vue +15 -15
- package/src/shadcn/range-calendar/RangeCalendarGridRow.vue +22 -22
- package/src/shadcn/range-calendar/RangeCalendarHeadCell.vue +23 -23
- package/src/shadcn/range-calendar/RangeCalendarHeader.vue +23 -23
- package/src/shadcn/range-calendar/RangeCalendarHeading.vue +30 -30
- package/src/shadcn/range-calendar/RangeCalendarNextButton.vue +32 -32
- package/src/shadcn/range-calendar/RangeCalendarPrevButton.vue +32 -32
- package/src/shadcn/range-calendar/index.ts +12 -12
- package/src/shadcn/select/Select.vue +18 -18
- package/src/shadcn/select/SelectContent.vue +52 -52
- package/src/shadcn/select/SelectGroup.vue +15 -15
- package/src/shadcn/select/SelectItem.vue +43 -43
- package/src/shadcn/select/SelectItemText.vue +15 -15
- package/src/shadcn/select/SelectLabel.vue +17 -17
- package/src/shadcn/select/SelectScrollDownButton.vue +26 -26
- package/src/shadcn/select/SelectScrollUpButton.vue +26 -26
- package/src/shadcn/select/SelectSeparator.vue +19 -19
- package/src/shadcn/select/SelectTrigger.vue +33 -33
- package/src/shadcn/select/SelectValue.vue +15 -15
- package/src/shadcn/select/index.ts +11 -11
- package/src/shadcn/separator/Separator.vue +31 -31
- package/src/shadcn/separator/index.ts +1 -1
- package/src/shadcn/sidebar/MenuGroup.vue +28 -28
- package/src/shadcn/sidebar/MenuItemRenderer.vue +23 -23
- package/src/shadcn/sidebar/Sidebar.vue +14 -14
- package/src/shadcn/sidebar/SidebarDemoContent.vue +26 -26
- package/src/shadcn/sidebar/SidebarMenuGroupWithLabel.vue +29 -29
- package/src/shadcn/sidebar/SidebarMenuItemWithIcon.vue +103 -103
- package/src/shadcn/sidebar/SidebarMenuSub.vue +10 -10
- package/src/shadcn/sidebar/SidebarMenuSubItemStyled.vue +38 -38
- package/src/shadcn/sidebar/SidebarTrigger.vue +8 -8
- package/src/shadcn/sidebar/index.ts +5 -5
- package/src/shadcn/slider/Slider.vue +43 -43
- package/src/shadcn/slider/index.ts +1 -1
- package/src/shadcn/sonner/Sonner.vue +19 -19
- package/src/shadcn/sonner/index.ts +1 -1
- package/src/shadcn/spinner/Spinner.vue +17 -0
- package/src/shadcn/spinner/index.ts +1 -0
- package/src/shadcn/switch/Switch.vue +38 -38
- package/src/shadcn/switch/index.ts +1 -1
- package/src/shadcn/tabs/CardTabsContent.vue +16 -16
- package/src/shadcn/tabs/CornerCutTabsTrigger.vue +102 -102
- package/src/shadcn/tabs/GridTabsList.vue +30 -30
- package/src/shadcn/tabs/ScrollableTabsList.vue +8 -8
- package/src/shadcn/tabs/Tabs.vue +23 -23
- package/src/shadcn/tabs/TabsContent.vue +21 -21
- package/src/shadcn/tabs/TabsList.vue +24 -24
- package/src/shadcn/tabs/TabsTrigger.vue +30 -30
- package/src/shadcn/tabs/VerticalTabsList.vue +28 -28
- package/src/shadcn/tabs/VerticalTabsTrigger.vue +16 -16
- package/src/shadcn/tabs/index.ts +10 -10
- package/src/shadcn/toggle/Toggle.vue +35 -35
- package/src/shadcn/toggle/index.ts +28 -28
- package/src/shadcn/tooltip/Tooltip.vue +18 -18
- package/src/shadcn/tooltip/TooltipContent.vue +34 -34
- package/src/shadcn/tooltip/TooltipProvider.vue +14 -14
- package/src/shadcn/tooltip/TooltipTrigger.vue +15 -15
- package/src/shadcn/tooltip/index.ts +4 -4
- package/src/shadcn/tree/index.ts +2 -0
- package/src/ui/InputOTP.vue +69 -69
- package/src/ui/InputOTPContext.ts +9 -9
- package/src/ui/InputOTPGroup.vue +7 -7
- package/src/ui/InputOTPSeparator.vue +8 -8
- package/src/ui/InputOTPSlot.vue +61 -61
- package/src/ui/PopoverContent.vue +27 -27
- package/src/ui/PopoverTrigger.vue +9 -9
- package/src/ui/SelectContent.vue +23 -23
- package/src/ui/SelectGroup.vue +12 -12
- package/src/ui/SelectItem.vue +25 -25
- package/src/ui/SelectLabel.vue +16 -16
- package/src/ui/SelectSeparator.vue +17 -17
- package/src/ui/SelectTrigger.vue +22 -22
- package/src/ui/SelectValue.vue +9 -9
- package/src/ui/SheetContent.vue +34 -34
- package/src/ui/SheetDescription.vue +9 -9
- package/src/ui/SheetHeader.vue +11 -11
- package/src/ui/SheetTitle.vue +9 -9
- package/src/ui/accordion-content.vue +21 -21
- package/src/ui/accordion-item.vue +18 -18
- package/src/ui/accordion-trigger.vue +14 -14
- package/src/ui/accordion.vue +9 -9
- package/src/ui/alert-actions.vue +13 -13
- package/src/ui/alert-description.vue +13 -13
- package/src/ui/alert-title.vue +13 -13
- package/src/ui/alert.vue +63 -63
- package/src/ui/avatar-fallback.vue +38 -38
- package/src/ui/avatar-group.vue +32 -32
- package/src/ui/avatar-image.vue +19 -19
- package/src/ui/avatar.vue +32 -32
- package/src/ui/badge.vue +90 -90
- package/src/ui/breadcrumb-item.vue +11 -11
- package/src/ui/breadcrumb-separator.vue +9 -9
- package/src/ui/breadcrumb.vue +11 -11
- package/src/ui/button.vue +76 -76
- package/src/ui/card-content.vue +16 -16
- package/src/ui/card-description.vue +16 -16
- package/src/ui/card-footer.vue +13 -13
- package/src/ui/card-header.vue +19 -19
- package/src/ui/card-title.vue +16 -16
- package/src/ui/card.vue +73 -73
- package/src/ui/category-breakdown-metric.vue +205 -205
- package/src/ui/checkbox.vue +84 -84
- package/src/ui/cn.ts +6 -6
- package/src/ui/dialog-body.vue +13 -13
- package/src/ui/dialog-close.vue +9 -9
- package/src/ui/dialog-content.vue +36 -36
- package/src/ui/dialog-description.vue +13 -13
- package/src/ui/dialog-footer.vue +13 -13
- package/src/ui/dialog-header.vue +13 -13
- package/src/ui/dialog-overlay.vue +14 -14
- package/src/ui/dialog-portal.vue +9 -9
- package/src/ui/dialog-title.vue +13 -13
- package/src/ui/dialog-trigger.vue +9 -9
- package/src/ui/dialog.vue +9 -9
- package/src/ui/dismissible-badges-demo.vue +94 -94
- package/src/ui/drawer-content.vue +53 -53
- package/src/ui/drawer-description.vue +23 -23
- package/src/ui/drawer-footer.vue +22 -22
- package/src/ui/drawer-header.vue +22 -22
- package/src/ui/drawer-title.vue +23 -23
- package/src/ui/drawer-trigger.vue +23 -23
- package/src/ui/drawer.vue +34 -34
- package/src/ui/dropdown-menu-checkbox-item.vue +27 -27
- package/src/ui/dropdown-menu-content.vue +23 -23
- package/src/ui/dropdown-menu-group.vue +7 -7
- package/src/ui/dropdown-menu-item.vue +19 -19
- package/src/ui/dropdown-menu-label.vue +17 -17
- package/src/ui/dropdown-menu-portal.vue +8 -8
- package/src/ui/dropdown-menu-radio-group.vue +14 -14
- package/src/ui/dropdown-menu-radio-item.vue +30 -30
- package/src/ui/dropdown-menu-separator.vue +13 -13
- package/src/ui/dropdown-menu-shortcut.vue +15 -15
- package/src/ui/dropdown-menu-sub-content.vue +8 -8
- package/src/ui/dropdown-menu-sub-trigger.vue +8 -8
- package/src/ui/dropdown-menu-sub.vue +8 -8
- package/src/ui/dropdown-menu-trigger.vue +8 -8
- package/src/ui/dropdown-menu.vue +9 -9
- package/src/ui/grouped-avatar.vue +19 -19
- package/src/ui/icons/Accessibility.vue +7 -7
- package/src/ui/icons/AlignLeft.vue +6 -6
- package/src/ui/icons/ArrowDown.vue +7 -7
- package/src/ui/icons/ArrowUp.vue +7 -7
- package/src/ui/icons/ArrowUpDown.vue +8 -8
- package/src/ui/icons/BookOpen.vue +6 -6
- package/src/ui/icons/Calendar.vue +9 -9
- package/src/ui/icons/Check.vue +6 -6
- package/src/ui/icons/ChevronRight.vue +6 -6
- package/src/ui/icons/Circle.vue +6 -6
- package/src/ui/icons/Copy.vue +7 -7
- package/src/ui/icons/Dot.vue +6 -6
- package/src/ui/icons/Edit.vue +6 -6
- package/src/ui/icons/FileText.vue +9 -9
- package/src/ui/icons/Folder.vue +6 -6
- package/src/ui/icons/FolderOpen.vue +7 -7
- package/src/ui/icons/Hash.vue +6 -6
- package/src/ui/icons/Home.vue +6 -6
- package/src/ui/icons/Minus.vue +6 -6
- package/src/ui/icons/MoreHorizontal.vue +8 -8
- package/src/ui/icons/Settings.vue +7 -7
- package/src/ui/icons/Slash.vue +6 -6
- package/src/ui/icons/Trash2.vue +6 -6
- package/src/ui/icons/Type.vue +6 -6
- package/src/ui/icons/User.vue +7 -7
- package/src/ui/input-otp.vue +52 -52
- package/src/ui/input.vue +98 -98
- package/src/ui/label.vue +19 -19
- package/src/ui/pagination.vue +41 -41
- package/src/ui/popover.vue +9 -9
- package/src/ui/progress.vue +67 -67
- package/src/ui/radio-group-item.vue +53 -53
- package/src/ui/radio-group.vue +27 -27
- package/src/ui/scrollable-tabs-list.vue +148 -148
- package/src/ui/select-multiple.vue +135 -135
- package/src/ui/select.vue +77 -77
- package/src/ui/separator.vue +60 -60
- package/src/ui/sheet.vue +50 -50
- package/src/ui/sidebar/BaseSidebar.vue +97 -97
- package/src/ui/sidebar/BasicSearch.vue +27 -27
- package/src/ui/sidebar/ResponsiveSearch.vue +54 -54
- package/src/ui/sidebar/Sidebar.vue +227 -227
- package/src/ui/sidebar/SidebarCollapseButton.vue +10 -10
- package/src/ui/sidebar/SidebarContent.vue +31 -31
- package/src/ui/sidebar/SidebarDescription.vue +10 -10
- package/src/ui/sidebar/SidebarExpandButton.vue +10 -10
- package/src/ui/sidebar/SidebarFooter.vue +10 -10
- package/src/ui/sidebar/SidebarGroup.vue +11 -11
- package/src/ui/sidebar/SidebarGroupContent.vue +10 -10
- package/src/ui/sidebar/SidebarGroupLabel.vue +7 -7
- package/src/ui/sidebar/SidebarHeader.vue +10 -10
- package/src/ui/sidebar/SidebarInset.vue +19 -19
- package/src/ui/sidebar/SidebarMenu.vue +7 -7
- package/src/ui/sidebar/SidebarMenuBadge.vue +7 -7
- package/src/ui/sidebar/SidebarMenuButton.vue +17 -17
- package/src/ui/sidebar/SidebarMenuItem.vue +10 -10
- package/src/ui/sidebar/SidebarMenuSub.vue +18 -18
- package/src/ui/sidebar/SidebarMenuSubContent.vue +10 -10
- package/src/ui/sidebar/SidebarMenuSubItem.vue +10 -10
- package/src/ui/sidebar/SidebarMenuSubTrigger.vue +10 -10
- package/src/ui/sidebar/SidebarProvider.vue +108 -108
- package/src/ui/sidebar/SidebarScrollArea.vue +10 -10
- package/src/ui/sidebar/SidebarSection.vue +10 -10
- package/src/ui/sidebar/SidebarSeparator.vue +8 -8
- package/src/ui/sidebar/SidebarShortcut.vue +10 -10
- package/src/ui/sidebar/SidebarTitle.vue +10 -10
- package/src/ui/sidebar/SidebarTrigger.vue +27 -27
- package/src/ui/sidebar/Wrapper.vue +12 -12
- package/src/ui/sidebar/context.ts +8 -8
- package/src/ui/sidebar/index.ts +27 -27
- package/src/ui/sidebar/sidebarStore.ts +40 -40
- package/src/ui/sidebar/types.ts +30 -30
- package/src/ui/sidebar/useAutoCollapse.ts +81 -81
- package/src/ui/sidebar.vue +24 -24
- package/src/ui/skeleton.vue +15 -15
- package/src/ui/slider.vue +32 -32
- package/src/ui/sonner.vue +67 -67
- package/src/ui/switch.vue +33 -33
- package/src/ui/tab-content.vue +28 -28
- package/src/ui/tab-list.vue +31 -31
- package/src/ui/tab-panel.vue +19 -19
- package/src/ui/tab-trigger.vue +34 -34
- package/src/ui/tab.vue +30 -30
- package/src/ui/table-body.vue +16 -16
- package/src/ui/table-caption.vue +20 -20
- package/src/ui/table-cell.vue +16 -16
- package/src/ui/table-footer.vue +16 -16
- package/src/ui/table-header.vue +132 -132
- package/src/ui/table-row.vue +16 -16
- package/src/ui/table.vue +55 -55
- package/src/ui/tabs.vue +33 -33
- package/src/ui/textarea.vue +91 -91
- package/src/ui/threat-gauge.vue +137 -137
- package/src/ui/toggle.vue +69 -69
- package/src/ui/tooltip-content.vue +52 -52
- package/src/ui/tooltip-provider.vue +13 -13
- package/src/ui/tooltip-root.vue +9 -9
- package/src/ui/tooltip-trigger.vue +13 -13
- package/src/ui/tooltip.vue +22 -22
- package/src/ui/utils.ts +6 -6
- package/vite.config.ts +39 -39
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
const props = defineProps({
|
|
3
|
-
class: { type: String, default: '' },
|
|
4
|
-
});
|
|
5
|
-
</script>
|
|
6
|
-
<template>
|
|
7
|
-
<span :class="['sidebar-shortcut', props.class]">
|
|
8
|
-
<slot />
|
|
9
|
-
</span>
|
|
10
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const props = defineProps({
|
|
3
|
+
class: { type: String, default: '' },
|
|
4
|
+
});
|
|
5
|
+
</script>
|
|
6
|
+
<template>
|
|
7
|
+
<span :class="['sidebar-shortcut', props.class]">
|
|
8
|
+
<slot />
|
|
9
|
+
</span>
|
|
10
|
+
</template>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
const props = defineProps({
|
|
3
|
-
class: { type: String, default: '' },
|
|
4
|
-
});
|
|
5
|
-
</script>
|
|
6
|
-
<template>
|
|
7
|
-
<div :class="['sidebar-title', props.class]">
|
|
8
|
-
<slot />
|
|
9
|
-
</div>
|
|
10
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const props = defineProps({
|
|
3
|
+
class: { type: String, default: '' },
|
|
4
|
+
});
|
|
5
|
+
</script>
|
|
6
|
+
<template>
|
|
7
|
+
<div :class="['sidebar-title', props.class]">
|
|
8
|
+
<slot />
|
|
9
|
+
</div>
|
|
10
|
+
</template>
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { inject } from 'vue';
|
|
3
|
-
import Button from '../button.vue';
|
|
4
|
-
import { PanelLeft } from 'lucide-vue-next';
|
|
5
|
-
|
|
6
|
-
interface SidebarContext {
|
|
7
|
-
toggleSidebar: () => void;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const ctx = inject('sidebarContext') as SidebarContext | undefined;
|
|
11
|
-
|
|
12
|
-
defineProps<{ class?: string }>();
|
|
13
|
-
const emit = defineEmits(['click']);
|
|
14
|
-
</script>
|
|
15
|
-
<template>
|
|
16
|
-
<Button
|
|
17
|
-
data-sidebar="trigger"
|
|
18
|
-
data-slot="sidebar-trigger"
|
|
19
|
-
variant="ghost"
|
|
20
|
-
size="icon"
|
|
21
|
-
:class="['size-7', $props.class]"
|
|
22
|
-
@click="(event) => { emit('click', event); ctx?.toggleSidebar(); }"
|
|
23
|
-
>
|
|
24
|
-
<PanelLeft class="w-4 h-4" />
|
|
25
|
-
<span class="sr-only">Toggle Sidebar</span>
|
|
26
|
-
</Button>
|
|
27
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { inject } from 'vue';
|
|
3
|
+
import Button from '../button.vue';
|
|
4
|
+
import { PanelLeft } from 'lucide-vue-next';
|
|
5
|
+
|
|
6
|
+
interface SidebarContext {
|
|
7
|
+
toggleSidebar: () => void;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const ctx = inject('sidebarContext') as SidebarContext | undefined;
|
|
11
|
+
|
|
12
|
+
defineProps<{ class?: string }>();
|
|
13
|
+
const emit = defineEmits(['click']);
|
|
14
|
+
</script>
|
|
15
|
+
<template>
|
|
16
|
+
<Button
|
|
17
|
+
data-sidebar="trigger"
|
|
18
|
+
data-slot="sidebar-trigger"
|
|
19
|
+
variant="ghost"
|
|
20
|
+
size="icon"
|
|
21
|
+
:class="['size-7', $props.class]"
|
|
22
|
+
@click="(event) => { emit('click', event); ctx?.toggleSidebar(); }"
|
|
23
|
+
>
|
|
24
|
+
<PanelLeft class="w-4 h-4" />
|
|
25
|
+
<span class="sr-only">Toggle Sidebar</span>
|
|
26
|
+
</Button>
|
|
27
|
+
</template>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { cn } from '@/lib/utils';
|
|
3
|
-
const props = defineProps({
|
|
4
|
-
height: { type: String, default: 'h-screen' },
|
|
5
|
-
class: { type: String, default: '' },
|
|
6
|
-
});
|
|
7
|
-
</script>
|
|
8
|
-
<template>
|
|
9
|
-
<div :class="cn('flex w-full border overflow-hidden relative z-0 bg-background', props.height, props.class)">
|
|
10
|
-
<slot />
|
|
11
|
-
</div>
|
|
12
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { cn } from '@/lib/utils';
|
|
3
|
+
const props = defineProps({
|
|
4
|
+
height: { type: String, default: 'h-screen' },
|
|
5
|
+
class: { type: String, default: '' },
|
|
6
|
+
});
|
|
7
|
+
</script>
|
|
8
|
+
<template>
|
|
9
|
+
<div :class="cn('flex w-full border overflow-hidden relative z-0 bg-background', props.height, props.class)">
|
|
10
|
+
<slot />
|
|
11
|
+
</div>
|
|
12
|
+
</template>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export const SIDEBAR_CONTEXT = Symbol('SIDEBAR_CONTEXT');
|
|
2
|
-
export interface SidebarContext {
|
|
3
|
-
state: 'expanded' | 'collapsed';
|
|
4
|
-
open: boolean;
|
|
5
|
-
setOpen: (open: boolean) => void;
|
|
6
|
-
isMobile: boolean;
|
|
7
|
-
toggleSidebar: () => void;
|
|
8
|
-
}
|
|
1
|
+
export const SIDEBAR_CONTEXT = Symbol('SIDEBAR_CONTEXT');
|
|
2
|
+
export interface SidebarContext {
|
|
3
|
+
state: 'expanded' | 'collapsed';
|
|
4
|
+
open: boolean;
|
|
5
|
+
setOpen: (open: boolean) => void;
|
|
6
|
+
isMobile: boolean;
|
|
7
|
+
toggleSidebar: () => void;
|
|
8
|
+
}
|
package/src/ui/sidebar/index.ts
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
export { default as SidebarProvider } from './SidebarProvider.vue';
|
|
2
|
-
export { default as Sidebar } from './Sidebar.vue';
|
|
3
|
-
export { default as SidebarTrigger } from './SidebarTrigger.vue';
|
|
4
|
-
export { default as SidebarGroup } from './SidebarGroup.vue';
|
|
5
|
-
export { default as SidebarGroupLabel } from './SidebarGroupLabel.vue';
|
|
6
|
-
export { default as SidebarGroupContent } from './SidebarGroupContent.vue';
|
|
7
|
-
export { default as SidebarMenu } from './SidebarMenu.vue';
|
|
8
|
-
export { default as SidebarMenuItem } from './SidebarMenuItem.vue';
|
|
9
|
-
export { default as SidebarMenuButton } from './SidebarMenuButton.vue';
|
|
10
|
-
export { default as SidebarMenuBadge } from './SidebarMenuBadge.vue';
|
|
11
|
-
export { default as SidebarMenuSub } from './SidebarMenuSub.vue';
|
|
12
|
-
export { default as SidebarMenuSubContent } from './SidebarMenuSubContent.vue';
|
|
13
|
-
export { default as SidebarMenuSubItem } from './SidebarMenuSubItem.vue';
|
|
14
|
-
export { default as SidebarMenuSubTrigger } from './SidebarMenuSubTrigger.vue';
|
|
15
|
-
export { default as SidebarContent } from './SidebarContent.vue';
|
|
16
|
-
export { default as SidebarHeader } from './SidebarHeader.vue';
|
|
17
|
-
export { default as SidebarFooter } from './SidebarFooter.vue';
|
|
18
|
-
export { default as SidebarTitle } from './SidebarTitle.vue';
|
|
19
|
-
export { default as SidebarDescription } from './SidebarDescription.vue';
|
|
20
|
-
export { default as SidebarSeparator } from './SidebarSeparator.vue';
|
|
21
|
-
export { default as SidebarScrollArea } from './SidebarScrollArea.vue';
|
|
22
|
-
export { default as SidebarShortcut } from './SidebarShortcut.vue';
|
|
23
|
-
export { default as SidebarCollapseButton } from './SidebarCollapseButton.vue';
|
|
24
|
-
export { default as SidebarExpandButton } from './SidebarExpandButton.vue';
|
|
25
|
-
export { default as SidebarInset } from './SidebarInset.vue';
|
|
26
|
-
export { default as Wrapper } from './Wrapper.vue';
|
|
27
|
-
export { default as BasicSearch } from './BasicSearch.vue';
|
|
1
|
+
export { default as SidebarProvider } from './SidebarProvider.vue';
|
|
2
|
+
export { default as Sidebar } from './Sidebar.vue';
|
|
3
|
+
export { default as SidebarTrigger } from './SidebarTrigger.vue';
|
|
4
|
+
export { default as SidebarGroup } from './SidebarGroup.vue';
|
|
5
|
+
export { default as SidebarGroupLabel } from './SidebarGroupLabel.vue';
|
|
6
|
+
export { default as SidebarGroupContent } from './SidebarGroupContent.vue';
|
|
7
|
+
export { default as SidebarMenu } from './SidebarMenu.vue';
|
|
8
|
+
export { default as SidebarMenuItem } from './SidebarMenuItem.vue';
|
|
9
|
+
export { default as SidebarMenuButton } from './SidebarMenuButton.vue';
|
|
10
|
+
export { default as SidebarMenuBadge } from './SidebarMenuBadge.vue';
|
|
11
|
+
export { default as SidebarMenuSub } from './SidebarMenuSub.vue';
|
|
12
|
+
export { default as SidebarMenuSubContent } from './SidebarMenuSubContent.vue';
|
|
13
|
+
export { default as SidebarMenuSubItem } from './SidebarMenuSubItem.vue';
|
|
14
|
+
export { default as SidebarMenuSubTrigger } from './SidebarMenuSubTrigger.vue';
|
|
15
|
+
export { default as SidebarContent } from './SidebarContent.vue';
|
|
16
|
+
export { default as SidebarHeader } from './SidebarHeader.vue';
|
|
17
|
+
export { default as SidebarFooter } from './SidebarFooter.vue';
|
|
18
|
+
export { default as SidebarTitle } from './SidebarTitle.vue';
|
|
19
|
+
export { default as SidebarDescription } from './SidebarDescription.vue';
|
|
20
|
+
export { default as SidebarSeparator } from './SidebarSeparator.vue';
|
|
21
|
+
export { default as SidebarScrollArea } from './SidebarScrollArea.vue';
|
|
22
|
+
export { default as SidebarShortcut } from './SidebarShortcut.vue';
|
|
23
|
+
export { default as SidebarCollapseButton } from './SidebarCollapseButton.vue';
|
|
24
|
+
export { default as SidebarExpandButton } from './SidebarExpandButton.vue';
|
|
25
|
+
export { default as SidebarInset } from './SidebarInset.vue';
|
|
26
|
+
export { default as Wrapper } from './Wrapper.vue';
|
|
27
|
+
export { default as BasicSearch } from './BasicSearch.vue';
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import { ref } from 'vue';
|
|
2
|
-
import { defineStore } from 'pinia';
|
|
3
|
-
|
|
4
|
-
type SidebarState = 'expanded' | 'collapsed';
|
|
5
|
-
|
|
6
|
-
export type SidebarContextProps = {
|
|
7
|
-
state: SidebarState;
|
|
8
|
-
open: boolean;
|
|
9
|
-
setOpen: (open: boolean) => void;
|
|
10
|
-
openMobile: boolean;
|
|
11
|
-
setOpenMobile: (open: boolean) => void;
|
|
12
|
-
isMobile: boolean;
|
|
13
|
-
toggleSidebar: () => void;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export const useSidebarStore = defineStore('sidebar', {
|
|
17
|
-
state: () => ({
|
|
18
|
-
open: true,
|
|
19
|
-
openMobile: false,
|
|
20
|
-
isMobile: false,
|
|
21
|
-
}),
|
|
22
|
-
getters: {
|
|
23
|
-
state: (state): SidebarState => (state.open ? 'expanded' : 'collapsed'),
|
|
24
|
-
},
|
|
25
|
-
actions: {
|
|
26
|
-
setOpen(open: boolean) {
|
|
27
|
-
this.open = open;
|
|
28
|
-
},
|
|
29
|
-
setOpenMobile(open: boolean) {
|
|
30
|
-
this.openMobile = open;
|
|
31
|
-
},
|
|
32
|
-
toggleSidebar() {
|
|
33
|
-
if (this.isMobile) {
|
|
34
|
-
this.setOpenMobile(!this.openMobile);
|
|
35
|
-
} else {
|
|
36
|
-
this.setOpen(!this.open);
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
});
|
|
1
|
+
import { ref } from 'vue';
|
|
2
|
+
import { defineStore } from 'pinia';
|
|
3
|
+
|
|
4
|
+
type SidebarState = 'expanded' | 'collapsed';
|
|
5
|
+
|
|
6
|
+
export type SidebarContextProps = {
|
|
7
|
+
state: SidebarState;
|
|
8
|
+
open: boolean;
|
|
9
|
+
setOpen: (open: boolean) => void;
|
|
10
|
+
openMobile: boolean;
|
|
11
|
+
setOpenMobile: (open: boolean) => void;
|
|
12
|
+
isMobile: boolean;
|
|
13
|
+
toggleSidebar: () => void;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const useSidebarStore = defineStore('sidebar', {
|
|
17
|
+
state: () => ({
|
|
18
|
+
open: true,
|
|
19
|
+
openMobile: false,
|
|
20
|
+
isMobile: false,
|
|
21
|
+
}),
|
|
22
|
+
getters: {
|
|
23
|
+
state: (state): SidebarState => (state.open ? 'expanded' : 'collapsed'),
|
|
24
|
+
},
|
|
25
|
+
actions: {
|
|
26
|
+
setOpen(open: boolean) {
|
|
27
|
+
this.open = open;
|
|
28
|
+
},
|
|
29
|
+
setOpenMobile(open: boolean) {
|
|
30
|
+
this.openMobile = open;
|
|
31
|
+
},
|
|
32
|
+
toggleSidebar() {
|
|
33
|
+
if (this.isMobile) {
|
|
34
|
+
this.setOpenMobile(!this.openMobile);
|
|
35
|
+
} else {
|
|
36
|
+
this.setOpen(!this.open);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
});
|
package/src/ui/sidebar/types.ts
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
export interface NavigationItem {
|
|
2
|
-
id: string;
|
|
3
|
-
title: string;
|
|
4
|
-
href: string;
|
|
5
|
-
icon?: any;
|
|
6
|
-
label?: string;
|
|
7
|
-
disabled?: boolean;
|
|
8
|
-
external?: boolean;
|
|
9
|
-
children?: NavigationItem[];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface RecentItem {
|
|
13
|
-
id: string;
|
|
14
|
-
title: string;
|
|
15
|
-
href: string;
|
|
16
|
-
icon?: any;
|
|
17
|
-
label?: string;
|
|
18
|
-
disabled?: boolean;
|
|
19
|
-
external?: boolean;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface SidebarContextProps {
|
|
23
|
-
isMobile: boolean;
|
|
24
|
-
state: string;
|
|
25
|
-
openMobile: boolean;
|
|
26
|
-
setOpenMobile: (open: boolean) => void;
|
|
27
|
-
// Add any other context values used in your sidebar system
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export type SidebarContextType = SidebarContextProps | null;
|
|
1
|
+
export interface NavigationItem {
|
|
2
|
+
id: string;
|
|
3
|
+
title: string;
|
|
4
|
+
href: string;
|
|
5
|
+
icon?: any;
|
|
6
|
+
label?: string;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
external?: boolean;
|
|
9
|
+
children?: NavigationItem[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface RecentItem {
|
|
13
|
+
id: string;
|
|
14
|
+
title: string;
|
|
15
|
+
href: string;
|
|
16
|
+
icon?: any;
|
|
17
|
+
label?: string;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
external?: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface SidebarContextProps {
|
|
23
|
+
isMobile: boolean;
|
|
24
|
+
state: string;
|
|
25
|
+
openMobile: boolean;
|
|
26
|
+
setOpenMobile: (open: boolean) => void;
|
|
27
|
+
// Add any other context values used in your sidebar system
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type SidebarContextType = SidebarContextProps | null;
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
import { ref, computed, onUnmounted, watch } from 'vue';
|
|
2
|
-
|
|
3
|
-
export interface UseAutoCollapseOptions {
|
|
4
|
-
defaultLocked?: boolean;
|
|
5
|
-
searchValue?: string;
|
|
6
|
-
autoCollapseDelay?: number;
|
|
7
|
-
unlockCollapseDelay?: number;
|
|
8
|
-
onLockToggle?: (locked: boolean) => void;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function useAutoCollapse({
|
|
12
|
-
defaultLocked = false,
|
|
13
|
-
searchValue = '',
|
|
14
|
-
autoCollapseDelay = 300,
|
|
15
|
-
unlockCollapseDelay = 300,
|
|
16
|
-
onLockToggle,
|
|
17
|
-
}: UseAutoCollapseOptions = {}) {
|
|
18
|
-
const isLocked = ref(defaultLocked);
|
|
19
|
-
const isHovered = ref(false);
|
|
20
|
-
const hoverTimeoutRef = { current: undefined as ReturnType<typeof setTimeout> | undefined };
|
|
21
|
-
|
|
22
|
-
const shouldAutoCollapse = computed(() => {
|
|
23
|
-
return !isLocked.value && !searchValue.trim();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
const isExpanded = computed(() => {
|
|
27
|
-
if (isLocked.value) return true;
|
|
28
|
-
if (searchValue.trim()) return true;
|
|
29
|
-
return isHovered.value;
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
const handleMouseEnter = () => {
|
|
33
|
-
if (shouldAutoCollapse.value) {
|
|
34
|
-
if (hoverTimeoutRef.current) {
|
|
35
|
-
clearTimeout(hoverTimeoutRef.current);
|
|
36
|
-
}
|
|
37
|
-
isHovered.value = true;
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const handleMouseLeave = () => {
|
|
42
|
-
if (shouldAutoCollapse.value) {
|
|
43
|
-
hoverTimeoutRef.current = setTimeout(() => {
|
|
44
|
-
isHovered.value = false;
|
|
45
|
-
}, autoCollapseDelay);
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const toggleLock = () => {
|
|
50
|
-
isLocked.value = !isLocked.value;
|
|
51
|
-
if (onLockToggle) onLockToggle(isLocked.value);
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const handleSearchClick = () => {
|
|
55
|
-
if (!isExpanded.value) {
|
|
56
|
-
isHovered.value = true;
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
onUnmounted(() => {
|
|
61
|
-
if (hoverTimeoutRef.current) {
|
|
62
|
-
clearTimeout(hoverTimeoutRef.current);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
// Keep in sync with parent if needed
|
|
67
|
-
watch(isLocked, (val) => {
|
|
68
|
-
if (onLockToggle) onLockToggle(val);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
isLocked,
|
|
73
|
-
isHovered,
|
|
74
|
-
isExpanded,
|
|
75
|
-
shouldAutoCollapse,
|
|
76
|
-
handleMouseEnter,
|
|
77
|
-
handleMouseLeave,
|
|
78
|
-
toggleLock,
|
|
79
|
-
handleSearchClick,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
1
|
+
import { ref, computed, onUnmounted, watch } from 'vue';
|
|
2
|
+
|
|
3
|
+
export interface UseAutoCollapseOptions {
|
|
4
|
+
defaultLocked?: boolean;
|
|
5
|
+
searchValue?: string;
|
|
6
|
+
autoCollapseDelay?: number;
|
|
7
|
+
unlockCollapseDelay?: number;
|
|
8
|
+
onLockToggle?: (locked: boolean) => void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function useAutoCollapse({
|
|
12
|
+
defaultLocked = false,
|
|
13
|
+
searchValue = '',
|
|
14
|
+
autoCollapseDelay = 300,
|
|
15
|
+
unlockCollapseDelay = 300,
|
|
16
|
+
onLockToggle,
|
|
17
|
+
}: UseAutoCollapseOptions = {}) {
|
|
18
|
+
const isLocked = ref(defaultLocked);
|
|
19
|
+
const isHovered = ref(false);
|
|
20
|
+
const hoverTimeoutRef = { current: undefined as ReturnType<typeof setTimeout> | undefined };
|
|
21
|
+
|
|
22
|
+
const shouldAutoCollapse = computed(() => {
|
|
23
|
+
return !isLocked.value && !searchValue.trim();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const isExpanded = computed(() => {
|
|
27
|
+
if (isLocked.value) return true;
|
|
28
|
+
if (searchValue.trim()) return true;
|
|
29
|
+
return isHovered.value;
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const handleMouseEnter = () => {
|
|
33
|
+
if (shouldAutoCollapse.value) {
|
|
34
|
+
if (hoverTimeoutRef.current) {
|
|
35
|
+
clearTimeout(hoverTimeoutRef.current);
|
|
36
|
+
}
|
|
37
|
+
isHovered.value = true;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const handleMouseLeave = () => {
|
|
42
|
+
if (shouldAutoCollapse.value) {
|
|
43
|
+
hoverTimeoutRef.current = setTimeout(() => {
|
|
44
|
+
isHovered.value = false;
|
|
45
|
+
}, autoCollapseDelay);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const toggleLock = () => {
|
|
50
|
+
isLocked.value = !isLocked.value;
|
|
51
|
+
if (onLockToggle) onLockToggle(isLocked.value);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const handleSearchClick = () => {
|
|
55
|
+
if (!isExpanded.value) {
|
|
56
|
+
isHovered.value = true;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
onUnmounted(() => {
|
|
61
|
+
if (hoverTimeoutRef.current) {
|
|
62
|
+
clearTimeout(hoverTimeoutRef.current);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Keep in sync with parent if needed
|
|
67
|
+
watch(isLocked, (val) => {
|
|
68
|
+
if (onLockToggle) onLockToggle(val);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
isLocked,
|
|
73
|
+
isHovered,
|
|
74
|
+
isExpanded,
|
|
75
|
+
shouldAutoCollapse,
|
|
76
|
+
handleMouseEnter,
|
|
77
|
+
handleMouseLeave,
|
|
78
|
+
toggleLock,
|
|
79
|
+
handleSearchClick,
|
|
80
|
+
};
|
|
81
|
+
}
|
package/src/ui/sidebar.vue
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<nav class="flex flex-col gap-2 w-48 bg-card border border-border rounded-lg p-4">
|
|
3
|
-
<button
|
|
4
|
-
v-for="item in items"
|
|
5
|
-
:key="item.label"
|
|
6
|
-
class="flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground"
|
|
7
|
-
@click="$emit('select', item)"
|
|
8
|
-
>
|
|
9
|
-
<component v-if="item.icon" :is="item.icon" class="w-4 h-4" />
|
|
10
|
-
<span>{{ item.label }}</span>
|
|
11
|
-
</button>
|
|
12
|
-
</nav>
|
|
13
|
-
</template>
|
|
14
|
-
|
|
15
|
-
<script setup>
|
|
16
|
-
import { defineProps, defineEmits } from 'vue';
|
|
17
|
-
const props = defineProps({
|
|
18
|
-
items: {
|
|
19
|
-
type: Array,
|
|
20
|
-
default: () => [],
|
|
21
|
-
},
|
|
22
|
-
});
|
|
23
|
-
const emit = defineEmits(['select']);
|
|
24
|
-
</script>
|
|
1
|
+
<template>
|
|
2
|
+
<nav class="flex flex-col gap-2 w-48 bg-card border border-border rounded-lg p-4">
|
|
3
|
+
<button
|
|
4
|
+
v-for="item in items"
|
|
5
|
+
:key="item.label"
|
|
6
|
+
class="flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground"
|
|
7
|
+
@click="$emit('select', item)"
|
|
8
|
+
>
|
|
9
|
+
<component v-if="item.icon" :is="item.icon" class="w-4 h-4" />
|
|
10
|
+
<span>{{ item.label }}</span>
|
|
11
|
+
</button>
|
|
12
|
+
</nav>
|
|
13
|
+
</template>
|
|
14
|
+
|
|
15
|
+
<script setup>
|
|
16
|
+
import { defineProps, defineEmits } from 'vue';
|
|
17
|
+
const props = defineProps({
|
|
18
|
+
items: {
|
|
19
|
+
type: Array,
|
|
20
|
+
default: () => [],
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
const emit = defineEmits(['select']);
|
|
24
|
+
</script>
|
package/src/ui/skeleton.vue
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div
|
|
3
|
-
data-slot="skeleton"
|
|
4
|
-
:class="cn('bg-accent animate-pulse rounded-md', $attrs.class)"
|
|
5
|
-
v-bind="$attrs"
|
|
6
|
-
>
|
|
7
|
-
<slot />
|
|
8
|
-
</div>
|
|
9
|
-
</template>
|
|
10
|
-
|
|
11
|
-
<script setup>
|
|
12
|
-
import { useAttrs } from 'vue';
|
|
13
|
-
import { cn } from './utils';
|
|
14
|
-
const $attrs = useAttrs();
|
|
15
|
-
</script>
|
|
1
|
+
<template>
|
|
2
|
+
<div
|
|
3
|
+
data-slot="skeleton"
|
|
4
|
+
:class="cn('bg-accent animate-pulse rounded-md', $attrs.class)"
|
|
5
|
+
v-bind="$attrs"
|
|
6
|
+
>
|
|
7
|
+
<slot />
|
|
8
|
+
</div>
|
|
9
|
+
</template>
|
|
10
|
+
|
|
11
|
+
<script setup>
|
|
12
|
+
import { useAttrs } from 'vue';
|
|
13
|
+
import { cn } from './utils';
|
|
14
|
+
const $attrs = useAttrs();
|
|
15
|
+
</script>
|
package/src/ui/slider.vue
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<Slider ref="sliderRef" :class="['relative flex w-full touch-none select-none items-center', customClass]" v-bind="props" />
|
|
3
|
-
</template>
|
|
4
|
-
|
|
5
|
-
<script setup>
|
|
6
|
-
import { defineProps, useAttrs } from 'vue';
|
|
7
|
-
|
|
8
|
-
const props = defineProps({
|
|
9
|
-
modelValue: {
|
|
10
|
-
type: Number,
|
|
11
|
-
default: 0,
|
|
12
|
-
},
|
|
13
|
-
min: {
|
|
14
|
-
type: Number,
|
|
15
|
-
default: 0,
|
|
16
|
-
},
|
|
17
|
-
max: {
|
|
18
|
-
type: Number,
|
|
19
|
-
default: 100,
|
|
20
|
-
},
|
|
21
|
-
step: {
|
|
22
|
-
type: Number,
|
|
23
|
-
default: 1,
|
|
24
|
-
},
|
|
25
|
-
disabled: {
|
|
26
|
-
type: Boolean,
|
|
27
|
-
default: false,
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
const $attrs = useAttrs();
|
|
32
|
-
</script>
|
|
1
|
+
<template>
|
|
2
|
+
<Slider ref="sliderRef" :class="['relative flex w-full touch-none select-none items-center', customClass]" v-bind="props" />
|
|
3
|
+
</template>
|
|
4
|
+
|
|
5
|
+
<script setup>
|
|
6
|
+
import { defineProps, useAttrs } from 'vue';
|
|
7
|
+
|
|
8
|
+
const props = defineProps({
|
|
9
|
+
modelValue: {
|
|
10
|
+
type: Number,
|
|
11
|
+
default: 0,
|
|
12
|
+
},
|
|
13
|
+
min: {
|
|
14
|
+
type: Number,
|
|
15
|
+
default: 0,
|
|
16
|
+
},
|
|
17
|
+
max: {
|
|
18
|
+
type: Number,
|
|
19
|
+
default: 100,
|
|
20
|
+
},
|
|
21
|
+
step: {
|
|
22
|
+
type: Number,
|
|
23
|
+
default: 1,
|
|
24
|
+
},
|
|
25
|
+
disabled: {
|
|
26
|
+
type: Boolean,
|
|
27
|
+
default: false,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const $attrs = useAttrs();
|
|
32
|
+
</script>
|