@bl33dz/fa814698dcde12f86a37ac31dd3aedf9 1.0.6 → 1.0.9
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 +97 -94
- package/dist/perisai-ui.umd.js +1 -1
- package/package.json +45 -45
- package/src/globals.css +575 -575
- package/src/index.ts +178 -177
- 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 -17
- package/src/shadcn/spinner/index.ts +1 -1
- 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 +1 -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
package/src/ui/threat-gauge.vue
CHANGED
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div :class="['relative', $attrs.class]" :style="{ width: `${size}px`, height: `${size}px` }">
|
|
3
|
-
<svg
|
|
4
|
-
:width="size"
|
|
5
|
-
:height="size"
|
|
6
|
-
:viewBox="`0 0 ${size} ${size}`"
|
|
7
|
-
class="overflow-visible"
|
|
8
|
-
>
|
|
9
|
-
<!-- Colored segments with FLAT ends and visible gaps -->
|
|
10
|
-
<path
|
|
11
|
-
v-for="seg in segments"
|
|
12
|
-
:key="seg.key"
|
|
13
|
-
:d="createArcPath(seg.tRange[0], seg.tRange[1])"
|
|
14
|
-
fill="none"
|
|
15
|
-
:stroke="seg.color"
|
|
16
|
-
:stroke-width="strokeWidth"
|
|
17
|
-
stroke-linecap="butt"
|
|
18
|
-
/>
|
|
19
|
-
<!-- Indicator circle on the active segment -->
|
|
20
|
-
<circle
|
|
21
|
-
:cx="indicatorX"
|
|
22
|
-
:cy="indicatorY"
|
|
23
|
-
:r="indicatorRadius"
|
|
24
|
-
fill="#ffffff"
|
|
25
|
-
:stroke="activeSeg.color"
|
|
26
|
-
:stroke-width="indicatorStroke"
|
|
27
|
-
/>
|
|
28
|
-
</svg>
|
|
29
|
-
<!-- LEVEL text centered inside the gauge box -->
|
|
30
|
-
<div
|
|
31
|
-
class="absolute left-1/2 font-semibold text-center"
|
|
32
|
-
:style="{
|
|
33
|
-
top: '50%',
|
|
34
|
-
transform: 'translate(-50%, -50%)',
|
|
35
|
-
color: colors[level],
|
|
36
|
-
fontSize: `${levelSize}px`,
|
|
37
|
-
lineHeight: 1.1,
|
|
38
|
-
}"
|
|
39
|
-
>
|
|
40
|
-
{{ level }}
|
|
41
|
-
</div>
|
|
42
|
-
</div>
|
|
43
|
-
</template>
|
|
44
|
-
|
|
45
|
-
<script setup lang="ts">
|
|
46
|
-
import { computed, defineProps, toRefs } from 'vue';
|
|
47
|
-
|
|
48
|
-
type Level = 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
|
|
49
|
-
|
|
50
|
-
const props = defineProps({
|
|
51
|
-
value: { type: Number, required: true },
|
|
52
|
-
level: { type: String as () => Level, required: true },
|
|
53
|
-
size: { type: Number, default: 240 },
|
|
54
|
-
gapDegrees: { type: Number, default: 10 },
|
|
55
|
-
thicknessRatio: { type: Number, default: 0.09 },
|
|
56
|
-
snapToSegmentCenter: { type: Boolean, default: false },
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
const { value, level, size, gapDegrees, thicknessRatio, snapToSegmentCenter } = toRefs(props);
|
|
60
|
-
|
|
61
|
-
const colors: Record<Level, string> = {
|
|
62
|
-
LOW: 'var(--success-500)',
|
|
63
|
-
MEDIUM: 'var(--warning-400)',
|
|
64
|
-
HIGH: 'var(--warning-600)',
|
|
65
|
-
CRITICAL: 'var(--error-500)',
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const order: Level[] = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];
|
|
69
|
-
const valueRanges: [number, number][] = [
|
|
70
|
-
[0, 25],
|
|
71
|
-
[25, 50],
|
|
72
|
-
[50, 75],
|
|
73
|
-
[75, 100.0001],
|
|
74
|
-
];
|
|
75
|
-
|
|
76
|
-
const n = 4;
|
|
77
|
-
const gapT = computed(() => Math.max(0, Math.min(gapDegrees.value, 30)) / 180);
|
|
78
|
-
const totalGapT = computed(() => gapT.value * (n - 1));
|
|
79
|
-
const segT = computed(() => (1 - totalGapT.value) / n);
|
|
80
|
-
|
|
81
|
-
const segments = computed(() =>
|
|
82
|
-
order.map((key, i) => {
|
|
83
|
-
const startT = i * (segT.value + gapT.value);
|
|
84
|
-
const endT = startT + segT.value;
|
|
85
|
-
return {
|
|
86
|
-
key,
|
|
87
|
-
color: colors[key],
|
|
88
|
-
range: valueRanges[i],
|
|
89
|
-
tRange: [startT, endT],
|
|
90
|
-
};
|
|
91
|
-
})
|
|
92
|
-
);
|
|
93
|
-
|
|
94
|
-
const strokeWidth = computed(() => Math.max(4, size.value * thicknessRatio.value));
|
|
95
|
-
const radius = computed(() => size.value * 0.45);
|
|
96
|
-
const centerX = computed(() => size.value / 2);
|
|
97
|
-
const centerY = computed(() => size.value * 0.65);
|
|
98
|
-
|
|
99
|
-
const pct = computed(() => Math.min(Math.max(value.value, 0), 100));
|
|
100
|
-
|
|
101
|
-
const activeSeg = computed(() =>
|
|
102
|
-
segments.value.find((s) => s.key === level.value) ||
|
|
103
|
-
segments.value.find((s) => pct.value >= s.range[0] && pct.value < s.range[1]) ||
|
|
104
|
-
segments.value[0]
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
function createArcPath(startT: number, endT: number, segmentsCount = 42) {
|
|
108
|
-
const pts: string[] = [];
|
|
109
|
-
const span = Math.max(0, Math.min(1, endT) - Math.max(0, startT));
|
|
110
|
-
const steps = Math.max(2, Math.round(segmentsCount * span));
|
|
111
|
-
for (let i = 0; i <= steps; i++) {
|
|
112
|
-
const t = startT + ((endT - startT) * i) / steps;
|
|
113
|
-
const ang = Math.PI * (1 - t);
|
|
114
|
-
const x = centerX.value + radius.value * Math.cos(ang);
|
|
115
|
-
const y = centerY.value - radius.value * Math.sin(ang);
|
|
116
|
-
pts.push(`${x} ${y}`);
|
|
117
|
-
}
|
|
118
|
-
return `M ${pts[0]} L ${pts.slice(1).join(' ')}`;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const [vMin, vMax] = computed(() => activeSeg.value.range).value;
|
|
122
|
-
const pctForIndicator = computed(() =>
|
|
123
|
-
snapToSegmentCenter.value
|
|
124
|
-
? (vMin + vMax) / 2
|
|
125
|
-
: Math.min(Math.max(pct.value, vMin), vMax)
|
|
126
|
-
);
|
|
127
|
-
const local = computed(() => (pctForIndicator.value - vMin) / (vMax - vMin));
|
|
128
|
-
const [tMin, tMax] = computed(() => activeSeg.value.tRange).value;
|
|
129
|
-
const tIndicator = computed(() => tMin + (tMax - tMin) * local.value);
|
|
130
|
-
const angIndicator = computed(() => Math.PI * (1 - tIndicator.value));
|
|
131
|
-
const indicatorX = computed(() => centerX.value + radius.value * Math.cos(angIndicator.value));
|
|
132
|
-
const indicatorY = computed(() => centerY.value - radius.value * Math.sin(angIndicator.value));
|
|
133
|
-
|
|
134
|
-
const levelSize = computed(() => size.value * 0.12);
|
|
135
|
-
const indicatorRadius = computed(() => Math.max(8, size.value * 0.04));
|
|
136
|
-
const indicatorStroke = computed(() => Math.max(2.5, size.value * 0.015));
|
|
137
|
-
</script>
|
|
1
|
+
<template>
|
|
2
|
+
<div :class="['relative', $attrs.class]" :style="{ width: `${size}px`, height: `${size}px` }">
|
|
3
|
+
<svg
|
|
4
|
+
:width="size"
|
|
5
|
+
:height="size"
|
|
6
|
+
:viewBox="`0 0 ${size} ${size}`"
|
|
7
|
+
class="overflow-visible"
|
|
8
|
+
>
|
|
9
|
+
<!-- Colored segments with FLAT ends and visible gaps -->
|
|
10
|
+
<path
|
|
11
|
+
v-for="seg in segments"
|
|
12
|
+
:key="seg.key"
|
|
13
|
+
:d="createArcPath(seg.tRange[0], seg.tRange[1])"
|
|
14
|
+
fill="none"
|
|
15
|
+
:stroke="seg.color"
|
|
16
|
+
:stroke-width="strokeWidth"
|
|
17
|
+
stroke-linecap="butt"
|
|
18
|
+
/>
|
|
19
|
+
<!-- Indicator circle on the active segment -->
|
|
20
|
+
<circle
|
|
21
|
+
:cx="indicatorX"
|
|
22
|
+
:cy="indicatorY"
|
|
23
|
+
:r="indicatorRadius"
|
|
24
|
+
fill="#ffffff"
|
|
25
|
+
:stroke="activeSeg.color"
|
|
26
|
+
:stroke-width="indicatorStroke"
|
|
27
|
+
/>
|
|
28
|
+
</svg>
|
|
29
|
+
<!-- LEVEL text centered inside the gauge box -->
|
|
30
|
+
<div
|
|
31
|
+
class="absolute left-1/2 font-semibold text-center"
|
|
32
|
+
:style="{
|
|
33
|
+
top: '50%',
|
|
34
|
+
transform: 'translate(-50%, -50%)',
|
|
35
|
+
color: colors[level],
|
|
36
|
+
fontSize: `${levelSize}px`,
|
|
37
|
+
lineHeight: 1.1,
|
|
38
|
+
}"
|
|
39
|
+
>
|
|
40
|
+
{{ level }}
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</template>
|
|
44
|
+
|
|
45
|
+
<script setup lang="ts">
|
|
46
|
+
import { computed, defineProps, toRefs } from 'vue';
|
|
47
|
+
|
|
48
|
+
type Level = 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
|
|
49
|
+
|
|
50
|
+
const props = defineProps({
|
|
51
|
+
value: { type: Number, required: true },
|
|
52
|
+
level: { type: String as () => Level, required: true },
|
|
53
|
+
size: { type: Number, default: 240 },
|
|
54
|
+
gapDegrees: { type: Number, default: 10 },
|
|
55
|
+
thicknessRatio: { type: Number, default: 0.09 },
|
|
56
|
+
snapToSegmentCenter: { type: Boolean, default: false },
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const { value, level, size, gapDegrees, thicknessRatio, snapToSegmentCenter } = toRefs(props);
|
|
60
|
+
|
|
61
|
+
const colors: Record<Level, string> = {
|
|
62
|
+
LOW: 'var(--success-500)',
|
|
63
|
+
MEDIUM: 'var(--warning-400)',
|
|
64
|
+
HIGH: 'var(--warning-600)',
|
|
65
|
+
CRITICAL: 'var(--error-500)',
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const order: Level[] = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];
|
|
69
|
+
const valueRanges: [number, number][] = [
|
|
70
|
+
[0, 25],
|
|
71
|
+
[25, 50],
|
|
72
|
+
[50, 75],
|
|
73
|
+
[75, 100.0001],
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
const n = 4;
|
|
77
|
+
const gapT = computed(() => Math.max(0, Math.min(gapDegrees.value, 30)) / 180);
|
|
78
|
+
const totalGapT = computed(() => gapT.value * (n - 1));
|
|
79
|
+
const segT = computed(() => (1 - totalGapT.value) / n);
|
|
80
|
+
|
|
81
|
+
const segments = computed(() =>
|
|
82
|
+
order.map((key, i) => {
|
|
83
|
+
const startT = i * (segT.value + gapT.value);
|
|
84
|
+
const endT = startT + segT.value;
|
|
85
|
+
return {
|
|
86
|
+
key,
|
|
87
|
+
color: colors[key],
|
|
88
|
+
range: valueRanges[i],
|
|
89
|
+
tRange: [startT, endT],
|
|
90
|
+
};
|
|
91
|
+
})
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
const strokeWidth = computed(() => Math.max(4, size.value * thicknessRatio.value));
|
|
95
|
+
const radius = computed(() => size.value * 0.45);
|
|
96
|
+
const centerX = computed(() => size.value / 2);
|
|
97
|
+
const centerY = computed(() => size.value * 0.65);
|
|
98
|
+
|
|
99
|
+
const pct = computed(() => Math.min(Math.max(value.value, 0), 100));
|
|
100
|
+
|
|
101
|
+
const activeSeg = computed(() =>
|
|
102
|
+
segments.value.find((s) => s.key === level.value) ||
|
|
103
|
+
segments.value.find((s) => pct.value >= s.range[0] && pct.value < s.range[1]) ||
|
|
104
|
+
segments.value[0]
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
function createArcPath(startT: number, endT: number, segmentsCount = 42) {
|
|
108
|
+
const pts: string[] = [];
|
|
109
|
+
const span = Math.max(0, Math.min(1, endT) - Math.max(0, startT));
|
|
110
|
+
const steps = Math.max(2, Math.round(segmentsCount * span));
|
|
111
|
+
for (let i = 0; i <= steps; i++) {
|
|
112
|
+
const t = startT + ((endT - startT) * i) / steps;
|
|
113
|
+
const ang = Math.PI * (1 - t);
|
|
114
|
+
const x = centerX.value + radius.value * Math.cos(ang);
|
|
115
|
+
const y = centerY.value - radius.value * Math.sin(ang);
|
|
116
|
+
pts.push(`${x} ${y}`);
|
|
117
|
+
}
|
|
118
|
+
return `M ${pts[0]} L ${pts.slice(1).join(' ')}`;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const [vMin, vMax] = computed(() => activeSeg.value.range).value;
|
|
122
|
+
const pctForIndicator = computed(() =>
|
|
123
|
+
snapToSegmentCenter.value
|
|
124
|
+
? (vMin + vMax) / 2
|
|
125
|
+
: Math.min(Math.max(pct.value, vMin), vMax)
|
|
126
|
+
);
|
|
127
|
+
const local = computed(() => (pctForIndicator.value - vMin) / (vMax - vMin));
|
|
128
|
+
const [tMin, tMax] = computed(() => activeSeg.value.tRange).value;
|
|
129
|
+
const tIndicator = computed(() => tMin + (tMax - tMin) * local.value);
|
|
130
|
+
const angIndicator = computed(() => Math.PI * (1 - tIndicator.value));
|
|
131
|
+
const indicatorX = computed(() => centerX.value + radius.value * Math.cos(angIndicator.value));
|
|
132
|
+
const indicatorY = computed(() => centerY.value - radius.value * Math.sin(angIndicator.value));
|
|
133
|
+
|
|
134
|
+
const levelSize = computed(() => size.value * 0.12);
|
|
135
|
+
const indicatorRadius = computed(() => Math.max(8, size.value * 0.04));
|
|
136
|
+
const indicatorStroke = computed(() => Math.max(2.5, size.value * 0.015));
|
|
137
|
+
</script>
|
package/src/ui/toggle.vue
CHANGED
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { computed, useAttrs } from 'vue';
|
|
3
|
-
import { useVModel } from '@vueuse/core';
|
|
4
|
-
import { cn } from './utils';
|
|
5
|
-
import Label from './label.vue';
|
|
6
|
-
import { Toggle } from '@/shadcn/toggle';
|
|
7
|
-
|
|
8
|
-
const props = defineProps({
|
|
9
|
-
modelValue: Boolean,
|
|
10
|
-
variant: {
|
|
11
|
-
type: String,
|
|
12
|
-
default: 'default',
|
|
13
|
-
validator: (v: string) => ['default', 'outline'].includes(v),
|
|
14
|
-
},
|
|
15
|
-
size: {
|
|
16
|
-
type: String,
|
|
17
|
-
default: 'default',
|
|
18
|
-
validator: (v: string) => ['default', 'sm', 'lg'].includes(v),
|
|
19
|
-
},
|
|
20
|
-
label: String,
|
|
21
|
-
id: String,
|
|
22
|
-
disabled: Boolean,
|
|
23
|
-
ariaLabel: String,
|
|
24
|
-
class: String,
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
const emit = defineEmits(['update:modelValue']);
|
|
28
|
-
const attrs = useAttrs();
|
|
29
|
-
const pressed = useVModel(props, 'modelValue', emit);
|
|
30
|
-
|
|
31
|
-
const baseClass =
|
|
32
|
-
'inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*=\'size-\'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap';
|
|
33
|
-
|
|
34
|
-
const variantClasses = {
|
|
35
|
-
default: 'bg-transparent',
|
|
36
|
-
outline: 'border bg-border bg-transparent hover:bg-accent hover:text-accent-foreground',
|
|
37
|
-
};
|
|
38
|
-
const sizeClasses = {
|
|
39
|
-
default: 'h-9 px-2 min-w-9',
|
|
40
|
-
sm: 'h-8 px-1.5 min-w-8',
|
|
41
|
-
lg: 'h-10 px-2.5 min-w-10',
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
const toggleClass = computed(() =>
|
|
45
|
-
cn(
|
|
46
|
-
baseClass,
|
|
47
|
-
variantClasses[props.variant],
|
|
48
|
-
sizeClasses[props.size],
|
|
49
|
-
props.class,
|
|
50
|
-
),
|
|
51
|
-
);
|
|
52
|
-
</script>
|
|
53
|
-
|
|
54
|
-
<template>
|
|
55
|
-
<div class="flex items-center gap-2">
|
|
56
|
-
<Toggle
|
|
57
|
-
:id="id"
|
|
58
|
-
data-slot="toggle"
|
|
59
|
-
:class="toggleClass"
|
|
60
|
-
:aria-label="ariaLabel"
|
|
61
|
-
:disabled="disabled"
|
|
62
|
-
v-bind="attrs"
|
|
63
|
-
v-model="pressed"
|
|
64
|
-
>
|
|
65
|
-
<slot />
|
|
66
|
-
</Toggle>
|
|
67
|
-
<Label v-if="label" :for="id">{{ label }}</Label>
|
|
68
|
-
</div>
|
|
69
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, useAttrs } from 'vue';
|
|
3
|
+
import { useVModel } from '@vueuse/core';
|
|
4
|
+
import { cn } from './utils';
|
|
5
|
+
import Label from './label.vue';
|
|
6
|
+
import { Toggle } from '@/shadcn/toggle';
|
|
7
|
+
|
|
8
|
+
const props = defineProps({
|
|
9
|
+
modelValue: Boolean,
|
|
10
|
+
variant: {
|
|
11
|
+
type: String,
|
|
12
|
+
default: 'default',
|
|
13
|
+
validator: (v: string) => ['default', 'outline'].includes(v),
|
|
14
|
+
},
|
|
15
|
+
size: {
|
|
16
|
+
type: String,
|
|
17
|
+
default: 'default',
|
|
18
|
+
validator: (v: string) => ['default', 'sm', 'lg'].includes(v),
|
|
19
|
+
},
|
|
20
|
+
label: String,
|
|
21
|
+
id: String,
|
|
22
|
+
disabled: Boolean,
|
|
23
|
+
ariaLabel: String,
|
|
24
|
+
class: String,
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
const emit = defineEmits(['update:modelValue']);
|
|
28
|
+
const attrs = useAttrs();
|
|
29
|
+
const pressed = useVModel(props, 'modelValue', emit);
|
|
30
|
+
|
|
31
|
+
const baseClass =
|
|
32
|
+
'inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*=\'size-\'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap';
|
|
33
|
+
|
|
34
|
+
const variantClasses = {
|
|
35
|
+
default: 'bg-transparent',
|
|
36
|
+
outline: 'border bg-border bg-transparent hover:bg-accent hover:text-accent-foreground',
|
|
37
|
+
};
|
|
38
|
+
const sizeClasses = {
|
|
39
|
+
default: 'h-9 px-2 min-w-9',
|
|
40
|
+
sm: 'h-8 px-1.5 min-w-8',
|
|
41
|
+
lg: 'h-10 px-2.5 min-w-10',
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const toggleClass = computed(() =>
|
|
45
|
+
cn(
|
|
46
|
+
baseClass,
|
|
47
|
+
variantClasses[props.variant],
|
|
48
|
+
sizeClasses[props.size],
|
|
49
|
+
props.class,
|
|
50
|
+
),
|
|
51
|
+
);
|
|
52
|
+
</script>
|
|
53
|
+
|
|
54
|
+
<template>
|
|
55
|
+
<div class="flex items-center gap-2">
|
|
56
|
+
<Toggle
|
|
57
|
+
:id="id"
|
|
58
|
+
data-slot="toggle"
|
|
59
|
+
:class="toggleClass"
|
|
60
|
+
:aria-label="ariaLabel"
|
|
61
|
+
:disabled="disabled"
|
|
62
|
+
v-bind="attrs"
|
|
63
|
+
v-model="pressed"
|
|
64
|
+
>
|
|
65
|
+
<slot />
|
|
66
|
+
</Toggle>
|
|
67
|
+
<Label v-if="label" :for="id">{{ label }}</Label>
|
|
68
|
+
</div>
|
|
69
|
+
</template>
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { defineProps, useSlots } from 'vue';
|
|
3
|
-
import { cn } from './utils';
|
|
4
|
-
import { TooltipContent } from '@/shadcn/tooltip';
|
|
5
|
-
|
|
6
|
-
const props = defineProps({
|
|
7
|
-
sideOffset: { type: Number, default: 0 },
|
|
8
|
-
variant: { type: String, default: 'default' },
|
|
9
|
-
class: { type: String, default: '' },
|
|
10
|
-
});
|
|
11
|
-
const slots = useSlots();
|
|
12
|
-
|
|
13
|
-
const tooltipVariants = {
|
|
14
|
-
default: 'bg-primary text-primary-foreground',
|
|
15
|
-
secondary: 'bg-secondary text-secondary-foreground',
|
|
16
|
-
outline: 'bg-popover text-popover-foreground border border-border shadow-md',
|
|
17
|
-
'soft-success': 'bg-green-50 text-green-700 border border-green-200 dark:bg-green-950 dark:text-green-300 dark:border-green-800',
|
|
18
|
-
'soft-warning': 'bg-yellow-50 text-yellow-700 border border-yellow-200 dark:bg-yellow-950 dark:text-yellow-300 dark:border-yellow-800',
|
|
19
|
-
'soft-danger': 'bg-red-50 text-red-700 border border-red-200 dark:bg-red-950 dark:text-red-300 dark:border-red-800',
|
|
20
|
-
'soft-info': 'bg-blue-50 text-blue-700 border border-blue-200 dark:bg-blue-950 dark:text-blue-300 dark:border-blue-800',
|
|
21
|
-
'soft-primary': 'bg-cyan-50 text-cyan-700 border border-cyan-200 dark:bg-cyan-950 dark:text-cyan-300 dark:border-cyan-800',
|
|
22
|
-
'soft-purple': 'bg-purple-50 text-purple-700 border border-purple-200 dark:bg-purple-950 dark:text-purple-300 dark:border-purple-800',
|
|
23
|
-
'soft-pink': 'bg-pink-50 text-pink-700 border border-pink-200 dark:bg-pink-950 dark:text-pink-300 dark:border-pink-800',
|
|
24
|
-
'soft-indigo': 'bg-indigo-50 text-indigo-700 border border-indigo-200 dark:bg-indigo-950 dark:text-indigo-300 dark:border-indigo-800',
|
|
25
|
-
'soft-orange': 'bg-orange-50 text-orange-700 border border-orange-200 dark:bg-orange-950 dark:text-orange-300 dark:border-orange-800',
|
|
26
|
-
'soft-teal': 'bg-teal-50 text-teal-700 border border-teal-200 dark:bg-teal-950 dark:text-teal-300 dark:border-teal-800',
|
|
27
|
-
'soft-neutral': 'bg-stone-50 text-stone-700 border border-stone-200 dark:bg-stone-900 dark:text-stone-300 dark:border-stone-700',
|
|
28
|
-
};
|
|
29
|
-
const tooltipArrowVariants = {
|
|
30
|
-
default: 'bg-primary fill-primary',
|
|
31
|
-
secondary: 'bg-secondary fill-secondary',
|
|
32
|
-
outline: 'bg-popover fill-popover border border-border',
|
|
33
|
-
'soft-success': 'bg-green-50 fill-green-50 border border-green-200 dark:bg-green-950 dark:fill-green-950 dark:border-green-800',
|
|
34
|
-
'soft-warning': 'bg-yellow-50 fill-yellow-50 border border-yellow-200 dark:bg-yellow-950 dark:fill-yellow-950 dark:border-yellow-800',
|
|
35
|
-
'soft-danger': 'bg-red-50 fill-red-50 border border-red-200 dark:bg-red-950 dark:fill-red-950 dark:border-red-800',
|
|
36
|
-
'soft-info': 'bg-blue-50 fill-blue-50 border border-blue-200 dark:bg-blue-950 dark:fill-blue-950 dark:border-blue-800',
|
|
37
|
-
'soft-primary': 'bg-cyan-50 fill-cyan-50 border border-cyan-200 dark:bg-cyan-950 dark:fill-cyan-950 dark:border-cyan-800',
|
|
38
|
-
'soft-purple': 'bg-purple-50 fill-purple-50 border border-purple-200 dark:bg-purple-950 dark:fill-purple-950 dark:border-purple-800',
|
|
39
|
-
'soft-pink': 'bg-pink-50 fill-pink-50 border border-pink-200 dark:bg-pink-950 dark:fill-pink-950 dark:border-pink-800',
|
|
40
|
-
'soft-indigo': 'bg-indigo-50 fill-indigo-50 border border-indigo-200 dark:bg-indigo-950 dark:fill-indigo-950 dark:border-indigo-800',
|
|
41
|
-
'soft-orange': 'bg-orange-50 fill-orange-50 border border-orange-200 dark:bg-orange-950 dark:fill-orange-950 dark:border-orange-800',
|
|
42
|
-
'soft-teal': 'bg-teal-50 fill-teal-50 border border-teal-200 dark:bg-teal-950 dark:fill-teal-950 dark:border-teal-800',
|
|
43
|
-
'soft-neutral': 'bg-stone-50 fill-stone-50 border border-stone-200 dark:bg-stone-900 dark:fill-stone-900 dark:border-stone-700',
|
|
44
|
-
};
|
|
45
|
-
</script>
|
|
46
|
-
<template>
|
|
47
|
-
<TooltipContent data-slot="tooltip-content" :side-offset="props.sideOffset"
|
|
48
|
-
:class="cn(tooltipVariants[props.variant] || tooltipVariants.default, props.class, 'p-3 animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit rounded-md px-3 py-1.5 text-xs text-balance')"
|
|
49
|
-
v-bind="props">
|
|
50
|
-
<slot />
|
|
51
|
-
</TooltipContent>
|
|
52
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { defineProps, useSlots } from 'vue';
|
|
3
|
+
import { cn } from './utils';
|
|
4
|
+
import { TooltipContent } from '@/shadcn/tooltip';
|
|
5
|
+
|
|
6
|
+
const props = defineProps({
|
|
7
|
+
sideOffset: { type: Number, default: 0 },
|
|
8
|
+
variant: { type: String, default: 'default' },
|
|
9
|
+
class: { type: String, default: '' },
|
|
10
|
+
});
|
|
11
|
+
const slots = useSlots();
|
|
12
|
+
|
|
13
|
+
const tooltipVariants = {
|
|
14
|
+
default: 'bg-primary text-primary-foreground',
|
|
15
|
+
secondary: 'bg-secondary text-secondary-foreground',
|
|
16
|
+
outline: 'bg-popover text-popover-foreground border border-border shadow-md',
|
|
17
|
+
'soft-success': 'bg-green-50 text-green-700 border border-green-200 dark:bg-green-950 dark:text-green-300 dark:border-green-800',
|
|
18
|
+
'soft-warning': 'bg-yellow-50 text-yellow-700 border border-yellow-200 dark:bg-yellow-950 dark:text-yellow-300 dark:border-yellow-800',
|
|
19
|
+
'soft-danger': 'bg-red-50 text-red-700 border border-red-200 dark:bg-red-950 dark:text-red-300 dark:border-red-800',
|
|
20
|
+
'soft-info': 'bg-blue-50 text-blue-700 border border-blue-200 dark:bg-blue-950 dark:text-blue-300 dark:border-blue-800',
|
|
21
|
+
'soft-primary': 'bg-cyan-50 text-cyan-700 border border-cyan-200 dark:bg-cyan-950 dark:text-cyan-300 dark:border-cyan-800',
|
|
22
|
+
'soft-purple': 'bg-purple-50 text-purple-700 border border-purple-200 dark:bg-purple-950 dark:text-purple-300 dark:border-purple-800',
|
|
23
|
+
'soft-pink': 'bg-pink-50 text-pink-700 border border-pink-200 dark:bg-pink-950 dark:text-pink-300 dark:border-pink-800',
|
|
24
|
+
'soft-indigo': 'bg-indigo-50 text-indigo-700 border border-indigo-200 dark:bg-indigo-950 dark:text-indigo-300 dark:border-indigo-800',
|
|
25
|
+
'soft-orange': 'bg-orange-50 text-orange-700 border border-orange-200 dark:bg-orange-950 dark:text-orange-300 dark:border-orange-800',
|
|
26
|
+
'soft-teal': 'bg-teal-50 text-teal-700 border border-teal-200 dark:bg-teal-950 dark:text-teal-300 dark:border-teal-800',
|
|
27
|
+
'soft-neutral': 'bg-stone-50 text-stone-700 border border-stone-200 dark:bg-stone-900 dark:text-stone-300 dark:border-stone-700',
|
|
28
|
+
};
|
|
29
|
+
const tooltipArrowVariants = {
|
|
30
|
+
default: 'bg-primary fill-primary',
|
|
31
|
+
secondary: 'bg-secondary fill-secondary',
|
|
32
|
+
outline: 'bg-popover fill-popover border border-border',
|
|
33
|
+
'soft-success': 'bg-green-50 fill-green-50 border border-green-200 dark:bg-green-950 dark:fill-green-950 dark:border-green-800',
|
|
34
|
+
'soft-warning': 'bg-yellow-50 fill-yellow-50 border border-yellow-200 dark:bg-yellow-950 dark:fill-yellow-950 dark:border-yellow-800',
|
|
35
|
+
'soft-danger': 'bg-red-50 fill-red-50 border border-red-200 dark:bg-red-950 dark:fill-red-950 dark:border-red-800',
|
|
36
|
+
'soft-info': 'bg-blue-50 fill-blue-50 border border-blue-200 dark:bg-blue-950 dark:fill-blue-950 dark:border-blue-800',
|
|
37
|
+
'soft-primary': 'bg-cyan-50 fill-cyan-50 border border-cyan-200 dark:bg-cyan-950 dark:fill-cyan-950 dark:border-cyan-800',
|
|
38
|
+
'soft-purple': 'bg-purple-50 fill-purple-50 border border-purple-200 dark:bg-purple-950 dark:fill-purple-950 dark:border-purple-800',
|
|
39
|
+
'soft-pink': 'bg-pink-50 fill-pink-50 border border-pink-200 dark:bg-pink-950 dark:fill-pink-950 dark:border-pink-800',
|
|
40
|
+
'soft-indigo': 'bg-indigo-50 fill-indigo-50 border border-indigo-200 dark:bg-indigo-950 dark:fill-indigo-950 dark:border-indigo-800',
|
|
41
|
+
'soft-orange': 'bg-orange-50 fill-orange-50 border border-orange-200 dark:bg-orange-950 dark:fill-orange-950 dark:border-orange-800',
|
|
42
|
+
'soft-teal': 'bg-teal-50 fill-teal-50 border border-teal-200 dark:bg-teal-950 dark:fill-teal-950 dark:border-teal-800',
|
|
43
|
+
'soft-neutral': 'bg-stone-50 fill-stone-50 border border-stone-200 dark:bg-stone-900 dark:fill-stone-900 dark:border-stone-700',
|
|
44
|
+
};
|
|
45
|
+
</script>
|
|
46
|
+
<template>
|
|
47
|
+
<TooltipContent data-slot="tooltip-content" :side-offset="props.sideOffset"
|
|
48
|
+
:class="cn(tooltipVariants[props.variant] || tooltipVariants.default, props.class, 'p-3 animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit rounded-md px-3 py-1.5 text-xs text-balance')"
|
|
49
|
+
v-bind="props">
|
|
50
|
+
<slot />
|
|
51
|
+
</TooltipContent>
|
|
52
|
+
</template>
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { useAttrs, defineProps } from 'vue';
|
|
3
|
-
import { TooltipProvider } from '@/shadcn/tooltip';
|
|
4
|
-
const props = defineProps({
|
|
5
|
-
delayDuration: { type: Number, default: 0 },
|
|
6
|
-
});
|
|
7
|
-
const attrs = useAttrs();
|
|
8
|
-
</script>
|
|
9
|
-
<template>
|
|
10
|
-
<TooltipProvider :delay-duration="props.delayDuration" v-bind="attrs">
|
|
11
|
-
<slot />
|
|
12
|
-
</TooltipProvider>
|
|
13
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { useAttrs, defineProps } from 'vue';
|
|
3
|
+
import { TooltipProvider } from '@/shadcn/tooltip';
|
|
4
|
+
const props = defineProps({
|
|
5
|
+
delayDuration: { type: Number, default: 0 },
|
|
6
|
+
});
|
|
7
|
+
const attrs = useAttrs();
|
|
8
|
+
</script>
|
|
9
|
+
<template>
|
|
10
|
+
<TooltipProvider :delay-duration="props.delayDuration" v-bind="attrs">
|
|
11
|
+
<slot />
|
|
12
|
+
</TooltipProvider>
|
|
13
|
+
</template>
|
package/src/ui/tooltip-root.vue
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { useAttrs } from 'vue';
|
|
3
|
-
const attrs = useAttrs();
|
|
4
|
-
</script>
|
|
5
|
-
<template>
|
|
6
|
-
<div data-slot="tooltip" v-bind="attrs">
|
|
7
|
-
<slot />
|
|
8
|
-
</div>
|
|
9
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { useAttrs } from 'vue';
|
|
3
|
+
const attrs = useAttrs();
|
|
4
|
+
</script>
|
|
5
|
+
<template>
|
|
6
|
+
<div data-slot="tooltip" v-bind="attrs">
|
|
7
|
+
<slot />
|
|
8
|
+
</div>
|
|
9
|
+
</template>
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
<script setup lang="ts">
|
|
3
|
-
import TooltipTrigger from "@/shadcn/tooltip/TooltipTrigger.vue";
|
|
4
|
-
import { defineProps } from "vue";
|
|
5
|
-
const props = defineProps<{ asChild?: boolean }>();
|
|
6
|
-
</script>
|
|
7
|
-
|
|
8
|
-
<template>
|
|
9
|
-
<slot v-if="props.asChild" />
|
|
10
|
-
<TooltipTrigger v-else data-slot="tooltip-trigger" v-bind="props">
|
|
11
|
-
<slot />
|
|
12
|
-
</TooltipTrigger>
|
|
13
|
-
</template>
|
|
1
|
+
|
|
2
|
+
<script setup lang="ts">
|
|
3
|
+
import TooltipTrigger from "@/shadcn/tooltip/TooltipTrigger.vue";
|
|
4
|
+
import { defineProps } from "vue";
|
|
5
|
+
const props = defineProps<{ asChild?: boolean }>();
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<template>
|
|
9
|
+
<slot v-if="props.asChild" />
|
|
10
|
+
<TooltipTrigger v-else data-slot="tooltip-trigger" v-bind="props">
|
|
11
|
+
<slot />
|
|
12
|
+
</TooltipTrigger>
|
|
13
|
+
</template>
|
package/src/ui/tooltip.vue
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { defineProps, useSlots } from 'vue';
|
|
3
|
-
import TooltipProvider from './tooltip-provider.vue';
|
|
4
|
-
import { Tooltip } from '@/shadcn/tooltip';
|
|
5
|
-
import { cn } from './utils';
|
|
6
|
-
|
|
7
|
-
const props = defineProps({
|
|
8
|
-
sideOffset: { type: Number, default: 0 },
|
|
9
|
-
variant: { type: String, default: 'default' },
|
|
10
|
-
class: { type: String, default: '' },
|
|
11
|
-
delayDuration: { type: Number, default: 0 },
|
|
12
|
-
});
|
|
13
|
-
const slots = useSlots();
|
|
14
|
-
</script>
|
|
15
|
-
|
|
16
|
-
<template>
|
|
17
|
-
<TooltipProvider :delay-duration="props.delayDuration">
|
|
18
|
-
<Tooltip data-slot="tooltip" v-bind="props">
|
|
19
|
-
<slot />
|
|
20
|
-
</Tooltip>
|
|
21
|
-
</TooltipProvider>
|
|
22
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { defineProps, useSlots } from 'vue';
|
|
3
|
+
import TooltipProvider from './tooltip-provider.vue';
|
|
4
|
+
import { Tooltip } from '@/shadcn/tooltip';
|
|
5
|
+
import { cn } from './utils';
|
|
6
|
+
|
|
7
|
+
const props = defineProps({
|
|
8
|
+
sideOffset: { type: Number, default: 0 },
|
|
9
|
+
variant: { type: String, default: 'default' },
|
|
10
|
+
class: { type: String, default: '' },
|
|
11
|
+
delayDuration: { type: Number, default: 0 },
|
|
12
|
+
});
|
|
13
|
+
const slots = useSlots();
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<template>
|
|
17
|
+
<TooltipProvider :delay-duration="props.delayDuration">
|
|
18
|
+
<Tooltip data-slot="tooltip" v-bind="props">
|
|
19
|
+
<slot />
|
|
20
|
+
</Tooltip>
|
|
21
|
+
</TooltipProvider>
|
|
22
|
+
</template>
|