@rimelight/ui 0.0.1
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/LICENSE +21 -0
- package/README.md +30 -0
- package/i18n-data.json +186 -0
- package/package.json +49 -0
- package/src/components/FormattedDate.astro +22 -0
- package/src/components/HeaderLink.astro +24 -0
- package/src/components/HttpObservatory.astro +103 -0
- package/src/components/LighthouseScores.astro +204 -0
- package/src/components/MissingTranslationBanner.astro +39 -0
- package/src/components/TableOfContents.astro +106 -0
- package/src/components/ThemeToggle.astro +71 -0
- package/src/components/accordion/Accordion.astro +257 -0
- package/src/components/accordion/AccordionContent.astro +34 -0
- package/src/components/accordion/AccordionItem.astro +29 -0
- package/src/components/accordion/AccordionTrigger.astro +33 -0
- package/src/components/alert/Alert.astro +34 -0
- package/src/components/alert/AlertDescription.astro +15 -0
- package/src/components/alert/AlertTitle.astro +17 -0
- package/src/components/alert-dialog/AlertDialog.astro +275 -0
- package/src/components/alert-dialog/AlertDialogAction.astro +46 -0
- package/src/components/alert-dialog/AlertDialogCancel.astro +46 -0
- package/src/components/alert-dialog/AlertDialogContent.astro +52 -0
- package/src/components/alert-dialog/AlertDialogDescription.astro +18 -0
- package/src/components/alert-dialog/AlertDialogFooter.astro +16 -0
- package/src/components/alert-dialog/AlertDialogHeader.astro +14 -0
- package/src/components/alert-dialog/AlertDialogTitle.astro +20 -0
- package/src/components/alert-dialog/AlertDialogTrigger.astro +47 -0
- package/src/components/aspect-ratio/AspectRatio.astro +32 -0
- package/src/components/avatar/Avatar.astro +29 -0
- package/src/components/avatar/AvatarFallback.astro +18 -0
- package/src/components/avatar/AvatarImage.astro +66 -0
- package/src/components/badge/Badge.astro +57 -0
- package/src/components/breadcrumb/Breadcrumb.astro +12 -0
- package/src/components/breadcrumb/BreadcrumbEllipsis.astro +29 -0
- package/src/components/breadcrumb/BreadcrumbItem.astro +15 -0
- package/src/components/breadcrumb/BreadcrumbLink.astro +24 -0
- package/src/components/breadcrumb/BreadcrumbList.astro +17 -0
- package/src/components/breadcrumb/BreadcrumbPage.astro +22 -0
- package/src/components/breadcrumb/BreadcrumbSeparator.astro +24 -0
- package/src/components/button/Button.astro +58 -0
- package/src/components/button-group/ButtonGroup.astro +64 -0
- package/src/components/button-group/ButtonGroupSeparator.astro +20 -0
- package/src/components/button-group/ButtonGroupText.astro +19 -0
- package/src/components/card/Card.astro +36 -0
- package/src/components/card/CardAction.astro +16 -0
- package/src/components/card/CardContent.astro +16 -0
- package/src/components/card/CardDescription.astro +16 -0
- package/src/components/card/CardFooter.astro +16 -0
- package/src/components/card/CardHeader.astro +19 -0
- package/src/components/card/CardTitle.astro +16 -0
- package/src/components/carousel/Carousel.astro +55 -0
- package/src/components/carousel/CarouselContent.astro +26 -0
- package/src/components/carousel/CarouselItem.astro +26 -0
- package/src/components/carousel/CarouselNext.astro +39 -0
- package/src/components/carousel/CarouselPrevious.astro +41 -0
- package/src/components/carousel/carousel-script.ts +188 -0
- package/src/components/carousel/index.ts +1 -0
- package/src/components/checkbox/Checkbox.astro +133 -0
- package/src/components/collapsible/Collapsible.astro +161 -0
- package/src/components/collapsible/CollapsibleContent.astro +22 -0
- package/src/components/collapsible/CollapsibleTrigger.astro +44 -0
- package/src/components/dialog/Dialog.astro +389 -0
- package/src/components/dialog/DialogClose.astro +35 -0
- package/src/components/dialog/DialogContent.astro +78 -0
- package/src/components/dialog/DialogDescription.astro +14 -0
- package/src/components/dialog/DialogFooter.astro +14 -0
- package/src/components/dialog/DialogHeader.astro +14 -0
- package/src/components/dialog/DialogTitle.astro +18 -0
- package/src/components/dialog/DialogTrigger.astro +47 -0
- package/src/components/dropdown/Dropdown.astro +604 -0
- package/src/components/dropdown/DropdownContent.astro +118 -0
- package/src/components/dropdown/DropdownItem.astro +48 -0
- package/src/components/dropdown/DropdownLabel.astro +29 -0
- package/src/components/dropdown/DropdownSeparator.astro +21 -0
- package/src/components/dropdown/DropdownShortcut.astro +17 -0
- package/src/components/dropdown/DropdownSub.astro +15 -0
- package/src/components/dropdown/DropdownSubContent.astro +39 -0
- package/src/components/dropdown/DropdownSubTrigger.astro +34 -0
- package/src/components/dropdown/DropdownTrigger.astro +52 -0
- package/src/components/dropzone/Dropzone.astro +236 -0
- package/src/components/dropzone/DropzoneFilesList.astro +26 -0
- package/src/components/dropzone/DropzoneLoadingIndicator.astro +10 -0
- package/src/components/dropzone/DropzoneUploadIndicator.astro +10 -0
- package/src/components/embeds/YoutubeEmbed.astro +94 -0
- package/src/components/hero/Hero.astro +166 -0
- package/src/components/icons/Flag.astro +62 -0
- package/src/components/image/ExtendedImage.astro +46 -0
- package/src/components/image/Image.astro +25 -0
- package/src/components/input/Input.astro +27 -0
- package/src/components/input-group/InputGroup.astro +28 -0
- package/src/components/input-group/InputGroupAddon.astro +76 -0
- package/src/components/input-group/InputGroupButton.astro +36 -0
- package/src/components/input-group/InputGroupInput.astro +18 -0
- package/src/components/input-group/InputGroupText.astro +17 -0
- package/src/components/input-group/InputGroupTextarea.astro +22 -0
- package/src/components/input-otp/InputOtp.astro +352 -0
- package/src/components/input-otp/InputOtpGroup.astro +16 -0
- package/src/components/input-otp/InputOtpSeparator.astro +25 -0
- package/src/components/input-otp/InputOtpSlot.astro +50 -0
- package/src/components/input-otp/InputOtpTypes.ts +6 -0
- package/src/components/item/Item.astro +52 -0
- package/src/components/item/ItemActions.astro +16 -0
- package/src/components/item/ItemContent.astro +16 -0
- package/src/components/item/ItemDescription.astro +19 -0
- package/src/components/item/ItemFooter.astro +16 -0
- package/src/components/item/ItemGroup.astro +16 -0
- package/src/components/item/ItemHeader.astro +16 -0
- package/src/components/item/ItemMedia.astro +40 -0
- package/src/components/item/ItemSeparator.astro +23 -0
- package/src/components/item/ItemTitle.astro +16 -0
- package/src/components/kbd/Kbd.astro +21 -0
- package/src/components/kbd/KbdGroup.astro +16 -0
- package/src/components/label/Label.astro +24 -0
- package/src/components/marquee/Marquee.astro +73 -0
- package/src/components/native-select/NativeSelect.astro +68 -0
- package/src/components/native-select/NativeSelectOptGroup.astro +15 -0
- package/src/components/native-select/NativeSelectOption.astro +15 -0
- package/src/components/pagination/Pagination.astro +20 -0
- package/src/components/pagination/PaginationContent.astro +16 -0
- package/src/components/pagination/PaginationEllipsis.astro +37 -0
- package/src/components/pagination/PaginationItem.astro +16 -0
- package/src/components/pagination/PaginationLink.astro +27 -0
- package/src/components/pagination/PaginationNext.astro +33 -0
- package/src/components/pagination/PaginationPrevious.astro +33 -0
- package/src/components/popover/Popover.astro +717 -0
- package/src/components/popover/PopoverContent.astro +102 -0
- package/src/components/popover/PopoverDescription.astro +14 -0
- package/src/components/popover/PopoverHeader.astro +14 -0
- package/src/components/popover/PopoverTitle.astro +14 -0
- package/src/components/popover/PopoverTrigger.astro +51 -0
- package/src/components/progress/Progress.astro +154 -0
- package/src/components/prose/Prose.astro +619 -0
- package/src/components/radio-group/RadioGroup.astro +162 -0
- package/src/components/radio-group/RadioGroupItem.astro +133 -0
- package/src/components/radio-group/RadioGroupTypes.ts +6 -0
- package/src/components/section/Section.astro +167 -0
- package/src/components/select/Select.astro +752 -0
- package/src/components/select/SelectContent.astro +94 -0
- package/src/components/select/SelectGroup.astro +9 -0
- package/src/components/select/SelectItem.astro +51 -0
- package/src/components/select/SelectLabel.astro +14 -0
- package/src/components/select/SelectSearch.astro +49 -0
- package/src/components/select/SelectSeparator.astro +12 -0
- package/src/components/select/SelectTrigger.astro +56 -0
- package/src/components/select/SelectTypes.ts +13 -0
- package/src/components/select/SelectValue.astro +19 -0
- package/src/components/separator/Separator.astro +36 -0
- package/src/components/sheet/Sheet.astro +15 -0
- package/src/components/sheet/SheetClose.astro +15 -0
- package/src/components/sheet/SheetContent.astro +89 -0
- package/src/components/sheet/SheetDescription.astro +16 -0
- package/src/components/sheet/SheetFooter.astro +16 -0
- package/src/components/sheet/SheetHeader.astro +16 -0
- package/src/components/sheet/SheetTitle.astro +16 -0
- package/src/components/sheet/SheetTrigger.astro +15 -0
- package/src/components/sidebar/Sidebar.astro +231 -0
- package/src/components/sidebar/SidebarContent.astro +25 -0
- package/src/components/sidebar/SidebarFooter.astro +22 -0
- package/src/components/sidebar/SidebarGroup.astro +22 -0
- package/src/components/sidebar/SidebarGroupContent.astro +22 -0
- package/src/components/sidebar/SidebarGroupLabel.astro +53 -0
- package/src/components/sidebar/SidebarHeader.astro +22 -0
- package/src/components/sidebar/SidebarInput.astro +24 -0
- package/src/components/sidebar/SidebarInset.astro +22 -0
- package/src/components/sidebar/SidebarMenu.astro +22 -0
- package/src/components/sidebar/SidebarMenuAction.astro +63 -0
- package/src/components/sidebar/SidebarMenuBadge.astro +31 -0
- package/src/components/sidebar/SidebarMenuButton.astro +124 -0
- package/src/components/sidebar/SidebarMenuItem.astro +22 -0
- package/src/components/sidebar/SidebarMenuSkeleton.astro +43 -0
- package/src/components/sidebar/SidebarMenuSub.astro +25 -0
- package/src/components/sidebar/SidebarMenuSubButton.astro +52 -0
- package/src/components/sidebar/SidebarMenuSubItem.astro +17 -0
- package/src/components/sidebar/SidebarProvider.astro +215 -0
- package/src/components/sidebar/SidebarRail.astro +72 -0
- package/src/components/sidebar/SidebarSeparator.astro +25 -0
- package/src/components/sidebar/SidebarTrigger.astro +69 -0
- package/src/components/skeleton/Skeleton.astro +14 -0
- package/src/components/slider/Slider.astro +425 -0
- package/src/components/spinner/Spinner.astro +23 -0
- package/src/components/switch/Switch.astro +192 -0
- package/src/components/switch/SwitchTypes.ts +6 -0
- package/src/components/table/Table.astro +20 -0
- package/src/components/table/TableBody.astro +18 -0
- package/src/components/table/TableCaption.astro +18 -0
- package/src/components/table/TableCell.astro +18 -0
- package/src/components/table/TableFoot.astro +18 -0
- package/src/components/table/TableHead.astro +18 -0
- package/src/components/table/TableHeader.astro +18 -0
- package/src/components/table/TableRow.astro +17 -0
- package/src/components/tabs/Tabs.astro +270 -0
- package/src/components/tabs/TabsContent.astro +28 -0
- package/src/components/tabs/TabsList.astro +23 -0
- package/src/components/tabs/TabsTrigger.astro +34 -0
- package/src/components/textarea/Textarea.astro +31 -0
- package/src/components/toast/ToastDescription.astro +22 -0
- package/src/components/toast/ToastItem.astro +56 -0
- package/src/components/toast/ToastTemplate.astro +27 -0
- package/src/components/toast/ToastTitle.astro +59 -0
- package/src/components/toast/Toaster.astro +981 -0
- package/src/components/toast/index.ts +1 -0
- package/src/components/toast/toast-manager.ts +234 -0
- package/src/components/toggle/Toggle.astro +174 -0
- package/src/components/toggle/ToggleTypes.ts +14 -0
- package/src/components/tooltip/Tooltip.astro +422 -0
- package/src/components/tooltip/TooltipContent.astro +83 -0
- package/src/components/tooltip/TooltipTrigger.astro +13 -0
- package/src/components/video/Video.astro +121 -0
- package/src/config/cookies.ts +5 -0
- package/src/config/index.ts +3 -0
- package/src/config/links.ts +4 -0
- package/src/config/site.config.ts +45 -0
- package/src/domain/cms/index.ts +1 -0
- package/src/domain/cms/types.ts +20 -0
- package/src/domain/i18n/constants.ts +21 -0
- package/src/domain/i18n/cookie-storage.ts +13 -0
- package/src/domain/i18n/country-to-locale-map.ts +67 -0
- package/src/domain/i18n/fallbacks.generated.ts +230 -0
- package/src/domain/i18n/fetcher.ts +268 -0
- package/src/domain/i18n/flags.ts +16 -0
- package/src/domain/i18n/format.ts +90 -0
- package/src/domain/i18n/index.ts +10 -0
- package/src/domain/i18n/middleware/i18n.ts +160 -0
- package/src/domain/i18n/resolve-locale.ts +55 -0
- package/src/domain/i18n/runtime-constants.ts +14 -0
- package/src/domain/i18n/schema.ts +29 -0
- package/src/domain/index.ts +4 -0
- package/src/domain/seo/constants.ts +20 -0
- package/src/domain/seo/index.ts +3 -0
- package/src/domain/seo/services/index.ts +3 -0
- package/src/domain/seo/services/llms.ts +53 -0
- package/src/domain/seo/services/robots.ts +12 -0
- package/src/domain/seo/services/sitemap.ts +56 -0
- package/src/domain/seo/utils.ts +37 -0
- package/src/domain/theme/constants.ts +6 -0
- package/src/domain/theme/index.ts +2 -0
- package/src/domain/theme/schema.ts +10 -0
- package/src/env.d.ts +49 -0
- package/src/i18n.generated.d.ts +202 -0
- package/src/lib/component-preview.ts +73 -0
- package/src/lib/index.ts +6 -0
- package/src/lib/remark/remark-modified-time.ts +13 -0
- package/src/lib/showcase-preview-elements.ts +408 -0
- package/src/lib/showcase-renderer.ts +218 -0
- package/src/lib/showcase-utils.ts +189 -0
- package/src/lib/turnstile.ts +35 -0
- package/src/lib/utils/starwind/positioning.ts +318 -0
- package/src/locales/de/blog.json +9 -0
- package/src/locales/de/common.json +19 -0
- package/src/locales/de/errors.json +6 -0
- package/src/locales/de/home.json +20 -0
- package/src/locales/de/messages.json +8 -0
- package/src/locales/de/nav.json +13 -0
- package/src/locales/de/projects.json +9 -0
- package/src/locales/de/services.json +43 -0
- package/src/locales/en/blog.json +9 -0
- package/src/locales/en/chat.json +29 -0
- package/src/locales/en/common.json +19 -0
- package/src/locales/en/cookie_notice.json +11 -0
- package/src/locales/en/editor.json +24 -0
- package/src/locales/en/errors.json +6 -0
- package/src/locales/en/home.json +20 -0
- package/src/locales/en/messages.json +8 -0
- package/src/locales/en/nav.json +13 -0
- package/src/locales/en/projects.json +9 -0
- package/src/locales/en/services.json +43 -0
- package/src/locales/es/blog.json +9 -0
- package/src/locales/es/common.json +19 -0
- package/src/locales/es/errors.json +6 -0
- package/src/locales/es/home.json +20 -0
- package/src/locales/es/messages.json +8 -0
- package/src/locales/es/nav.json +13 -0
- package/src/locales/es/projects.json +9 -0
- package/src/locales/es/services.json +43 -0
- package/src/locales/ja/blog.json +9 -0
- package/src/locales/ja/common.json +19 -0
- package/src/locales/ja/errors.json +6 -0
- package/src/locales/ja/home.json +20 -0
- package/src/locales/ja/messages.json +8 -0
- package/src/locales/ja/nav.json +13 -0
- package/src/locales/ja/projects.json +9 -0
- package/src/locales/ja/services.json +43 -0
- package/src/locales/pt/blog.json +9 -0
- package/src/locales/pt/chat.json +29 -0
- package/src/locales/pt/common.json +19 -0
- package/src/locales/pt/cookie_notice.json +11 -0
- package/src/locales/pt/editor.json +24 -0
- package/src/locales/pt/errors.json +6 -0
- package/src/locales/pt/home.json +20 -0
- package/src/locales/pt/messages.json +8 -0
- package/src/locales/pt/nav.json +13 -0
- package/src/locales/pt/projects.json +9 -0
- package/src/locales/pt/services.json +43 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/server/cookies.ts +98 -0
- package/src/utils/server/index.ts +1 -0
- package/src/utils/shared/deep-merge.ts +36 -0
- package/src/utils/shared/embed.ts +105 -0
- package/src/utils/shared/index.ts +3 -0
- package/src/utils/shared/parse-boolean.ts +14 -0
- package/worker-configuration.d.ts +14791 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { HTMLAttributes } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
import Sheet from "../sheet/Sheet.astro";
|
|
6
|
+
import SheetContent from "../sheet/SheetContent.astro";
|
|
7
|
+
import SheetDescription from "../sheet/SheetDescription.astro";
|
|
8
|
+
import SheetHeader from "../sheet/SheetHeader.astro";
|
|
9
|
+
import SheetTitle from "../sheet/SheetTitle.astro";
|
|
10
|
+
|
|
11
|
+
export interface SidebarProps extends HTMLAttributes<"div"> {
|
|
12
|
+
/**
|
|
13
|
+
* The side of the viewport the sidebar appears on
|
|
14
|
+
* @default "left"
|
|
15
|
+
*/
|
|
16
|
+
side?: "left" | "right";
|
|
17
|
+
/**
|
|
18
|
+
* The visual variant of the sidebar
|
|
19
|
+
* @default "sidebar"
|
|
20
|
+
*/
|
|
21
|
+
variant?: "sidebar" | "floating" | "inset";
|
|
22
|
+
/**
|
|
23
|
+
* How the sidebar collapses
|
|
24
|
+
* @default "offcanvas"
|
|
25
|
+
*/
|
|
26
|
+
collapsible?: "offcanvas" | "icon" | "none";
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type Props = SidebarProps;
|
|
30
|
+
|
|
31
|
+
export const sidebar = cv({
|
|
32
|
+
base: "starwind-sidebar group peer text-sidebar-foreground hidden md:block",
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
export const sidebarGap = cv({
|
|
36
|
+
base: [
|
|
37
|
+
"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear",
|
|
38
|
+
"group-data-[collapsible=offcanvas]:w-0",
|
|
39
|
+
"group-data-[side=right]:rotate-180",
|
|
40
|
+
],
|
|
41
|
+
variants: {
|
|
42
|
+
variant: {
|
|
43
|
+
sidebar: "group-data-[collapsible=icon]:w-(--sidebar-width-icon)",
|
|
44
|
+
floating: "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+1rem)]",
|
|
45
|
+
inset: "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+1rem)]",
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
defaultVariants: {
|
|
49
|
+
variant: "sidebar",
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
export const sidebarContainer = cv({
|
|
54
|
+
base: [
|
|
55
|
+
"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex",
|
|
56
|
+
],
|
|
57
|
+
variants: {
|
|
58
|
+
side: {
|
|
59
|
+
left: "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]",
|
|
60
|
+
right: "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
|
|
61
|
+
},
|
|
62
|
+
variant: {
|
|
63
|
+
sidebar: [
|
|
64
|
+
"group-data-[collapsible=icon]:w-(--sidebar-width-icon)",
|
|
65
|
+
"group-data-[side=left]:border-r group-data-[side=right]:border-l",
|
|
66
|
+
],
|
|
67
|
+
floating: "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+1rem+2px)]",
|
|
68
|
+
inset: "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+1rem+2px)]",
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
defaultVariants: {
|
|
72
|
+
side: "left",
|
|
73
|
+
variant: "sidebar",
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
export const sidebarInner = cv({
|
|
78
|
+
base: "bg-sidebar flex h-full w-full flex-col",
|
|
79
|
+
variants: {
|
|
80
|
+
variant: {
|
|
81
|
+
sidebar: "",
|
|
82
|
+
floating: "border-sidebar-border rounded-lg b shadow-sm",
|
|
83
|
+
inset: "border-sidebar-border rounded-lg b shadow-sm",
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
defaultVariants: {
|
|
87
|
+
variant: "sidebar",
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
export const sidebarMobileContent = cv({
|
|
92
|
+
base: "bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden",
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
const {
|
|
96
|
+
side = "left",
|
|
97
|
+
variant = "sidebar",
|
|
98
|
+
collapsible = "offcanvas",
|
|
99
|
+
class: className,
|
|
100
|
+
...rest
|
|
101
|
+
} = Astro.props;
|
|
102
|
+
|
|
103
|
+
const SIDEBAR_WIDTH_MOBILE = "18rem";
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
{/* Non-collapsible sidebar */}
|
|
107
|
+
{
|
|
108
|
+
collapsible === "none" ? (
|
|
109
|
+
<div
|
|
110
|
+
class:list={[
|
|
111
|
+
"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col",
|
|
112
|
+
className,
|
|
113
|
+
]}
|
|
114
|
+
{...rest}
|
|
115
|
+
data-slot="sidebar"
|
|
116
|
+
>
|
|
117
|
+
<slot />
|
|
118
|
+
</div>
|
|
119
|
+
) : (
|
|
120
|
+
<>
|
|
121
|
+
{/* Desktop sidebar */}
|
|
122
|
+
<div
|
|
123
|
+
class:list={[sidebar(), className]}
|
|
124
|
+
data-state="expanded"
|
|
125
|
+
data-collapsible=""
|
|
126
|
+
data-collapsible-mode={collapsible}
|
|
127
|
+
data-variant={variant}
|
|
128
|
+
data-side={side}
|
|
129
|
+
data-slot="sidebar"
|
|
130
|
+
>
|
|
131
|
+
{/* Gap placeholder for layout */}
|
|
132
|
+
<div data-slot="sidebar-gap" class={sidebarGap({ variant })} />
|
|
133
|
+
|
|
134
|
+
{/* Fixed sidebar container */}
|
|
135
|
+
<div class={sidebarContainer({ side, variant })} {...rest} data-slot="sidebar-container">
|
|
136
|
+
<div data-slot="sidebar-inner" class={sidebarInner({ variant })}>
|
|
137
|
+
<slot />
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
{/* Mobile sidebar (Sheet) */}
|
|
143
|
+
<Sheet class="md:hidden" data-slot="sidebar-mobile">
|
|
144
|
+
<SheetContent
|
|
145
|
+
side={side}
|
|
146
|
+
class={sidebarMobileContent()}
|
|
147
|
+
style={{ "--sidebar-width": SIDEBAR_WIDTH_MOBILE }}
|
|
148
|
+
>
|
|
149
|
+
<SheetHeader class="sr-only">
|
|
150
|
+
<SheetTitle>Sidebar</SheetTitle>
|
|
151
|
+
<SheetDescription>Mobile navigation sidebar</SheetDescription>
|
|
152
|
+
</SheetHeader>
|
|
153
|
+
<div class="flex h-full w-full flex-col">
|
|
154
|
+
<slot />
|
|
155
|
+
</div>
|
|
156
|
+
</SheetContent>
|
|
157
|
+
</Sheet>
|
|
158
|
+
</>
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
<script>
|
|
163
|
+
class SidebarHandler {
|
|
164
|
+
private sidebar: HTMLElement;
|
|
165
|
+
private provider: HTMLElement;
|
|
166
|
+
private collapsibleMode: string;
|
|
167
|
+
private boundUpdateState: () => void;
|
|
168
|
+
|
|
169
|
+
constructor(sidebar: HTMLElement) {
|
|
170
|
+
this.sidebar = sidebar;
|
|
171
|
+
this.provider = sidebar.closest<HTMLElement>('[data-slot="sidebar-provider"]')!;
|
|
172
|
+
this.collapsibleMode =
|
|
173
|
+
sidebar.dataset.collapsibleMode ||
|
|
174
|
+
(sidebar.closest("[data-collapsible]") as HTMLElement)?.dataset.collapsible ||
|
|
175
|
+
"offcanvas";
|
|
176
|
+
sidebar.dataset.collapsibleMode = this.collapsibleMode;
|
|
177
|
+
|
|
178
|
+
this.boundUpdateState = this.updateState.bind(this);
|
|
179
|
+
this.init();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
private init() {
|
|
183
|
+
this.updateState();
|
|
184
|
+
this.provider.addEventListener("sidebar:change", this.boundUpdateState);
|
|
185
|
+
this.provider.addEventListener("sidebar:mobile-change", this.boundUpdateState);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private updateState() {
|
|
189
|
+
const state = this.provider.getAttribute("data-state") || "expanded";
|
|
190
|
+
this.sidebar.setAttribute("data-state", state);
|
|
191
|
+
|
|
192
|
+
if (state === "collapsed") {
|
|
193
|
+
this.sidebar.setAttribute("data-collapsible", this.collapsibleMode);
|
|
194
|
+
} else {
|
|
195
|
+
this.sidebar.setAttribute("data-collapsible", "");
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
this.syncSidebarMenuTooltips();
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
private syncSidebarMenuTooltips() {
|
|
202
|
+
const hasEnabledSidebar = Array.from(
|
|
203
|
+
document.querySelectorAll<HTMLElement>(
|
|
204
|
+
'[data-slot="sidebar"][data-collapsible-mode="icon"][data-state="collapsed"]',
|
|
205
|
+
),
|
|
206
|
+
).some((sidebar) => getComputedStyle(sidebar).display !== "none");
|
|
207
|
+
|
|
208
|
+
if (hasEnabledSidebar) {
|
|
209
|
+
document.documentElement.setAttribute("data-starwind-sidebar-tooltips", "enabled");
|
|
210
|
+
} else {
|
|
211
|
+
document.documentElement.removeAttribute("data-starwind-sidebar-tooltips");
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const sidebarInstances = new WeakMap<HTMLElement, SidebarHandler>();
|
|
217
|
+
|
|
218
|
+
const setupSidebars = () => {
|
|
219
|
+
document.querySelectorAll<HTMLElement>('[data-slot="sidebar"]').forEach((sidebar) => {
|
|
220
|
+
if (sidebarInstances.has(sidebar)) return;
|
|
221
|
+
const provider = sidebar.closest<HTMLElement>('[data-slot="sidebar-provider"]');
|
|
222
|
+
if (!provider) return;
|
|
223
|
+
sidebarInstances.set(sidebar, new SidebarHandler(sidebar));
|
|
224
|
+
});
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
setupSidebars();
|
|
228
|
+
document.addEventListener("astro:after-swap", setupSidebars);
|
|
229
|
+
document.addEventListener("starwind:init", setupSidebars);
|
|
230
|
+
</script>
|
|
231
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { HTMLAttributes } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
export interface SidebarContentProps extends HTMLAttributes<"div"> {}
|
|
6
|
+
type Props = SidebarContentProps;
|
|
7
|
+
|
|
8
|
+
export const sidebarContent = cv({
|
|
9
|
+
base: [
|
|
10
|
+
"flex min-h-0 flex-1 flex-col gap-5xs overflow-auto",
|
|
11
|
+
"group-data-[collapsible=icon]:overflow-hidden",
|
|
12
|
+
],
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const { class: className, ...rest } = Astro.props;
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
<div
|
|
19
|
+
class:list={[sidebarContent(), className]}
|
|
20
|
+
data-sidebar="content"
|
|
21
|
+
{...rest}
|
|
22
|
+
data-slot="sidebar-content"
|
|
23
|
+
>
|
|
24
|
+
<slot />
|
|
25
|
+
</div>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { HTMLAttributes } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
export interface SidebarFooterProps extends HTMLAttributes<"div"> {}
|
|
6
|
+
type Props = SidebarFooterProps;
|
|
7
|
+
|
|
8
|
+
export const sidebarFooter = cv({
|
|
9
|
+
base: "flex flex-col gap-5xs p-5xs",
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const { class: className, ...rest } = Astro.props;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
<div
|
|
16
|
+
class:list={[sidebarFooter(), className]}
|
|
17
|
+
data-sidebar="footer"
|
|
18
|
+
{...rest}
|
|
19
|
+
data-slot="sidebar-footer"
|
|
20
|
+
>
|
|
21
|
+
<slot />
|
|
22
|
+
</div>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { HTMLAttributes } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
export interface SidebarGroupProps extends HTMLAttributes<"div"> {}
|
|
6
|
+
type Props = SidebarGroupProps;
|
|
7
|
+
|
|
8
|
+
export const sidebarGroup = cv({
|
|
9
|
+
base: "relative flex w-full min-w-0 flex-col p-5xs",
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const { class: className, ...rest } = Astro.props;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
<div
|
|
16
|
+
class:list={[sidebarGroup(), className]}
|
|
17
|
+
data-sidebar="group"
|
|
18
|
+
{...rest}
|
|
19
|
+
data-slot="sidebar-group"
|
|
20
|
+
>
|
|
21
|
+
<slot />
|
|
22
|
+
</div>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { HTMLAttributes } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
export interface SidebarGroupContentProps extends HTMLAttributes<"div"> {}
|
|
6
|
+
type Props = SidebarGroupContentProps;
|
|
7
|
+
|
|
8
|
+
export const sidebarGroupContent = cv({
|
|
9
|
+
base: "w-full text-sm",
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const { class: className, ...rest } = Astro.props;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
<div
|
|
16
|
+
class:list={[sidebarGroupContent(), className]}
|
|
17
|
+
data-sidebar="group-content"
|
|
18
|
+
{...rest}
|
|
19
|
+
data-slot="sidebar-group-content"
|
|
20
|
+
>
|
|
21
|
+
<slot />
|
|
22
|
+
</div>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { HTMLAttributes } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
export interface SidebarGroupLabelProps extends HTMLAttributes<"div"> {
|
|
6
|
+
/**
|
|
7
|
+
* Render as a child element wrapper instead of a div
|
|
8
|
+
*/
|
|
9
|
+
asChild?: boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
export const sidebarGroupLabel = cv({
|
|
14
|
+
base: [
|
|
15
|
+
"text-sidebar-foreground/70 ring-sidebar-outline",
|
|
16
|
+
"flex h-3xl shrink-0 items-center rounded-md px-2 text-sm font-medium",
|
|
17
|
+
"outline-hidden transition-[margin,opacity] duration-200 ease-linear",
|
|
18
|
+
"focus-visible:ring-2",
|
|
19
|
+
"[&>svg]:size-4.5 [&>svg]:shrink-0",
|
|
20
|
+
"group-data-[collapsible=icon]:-mt-10 group-data-[collapsible=icon]:op-0",
|
|
21
|
+
],
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const { asChild = false, class: className, ...rest } = Astro.props;
|
|
25
|
+
|
|
26
|
+
let hasChildren = false;
|
|
27
|
+
if (Astro.slots.has("default")) {
|
|
28
|
+
hasChildren = true;
|
|
29
|
+
}
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
{
|
|
33
|
+
asChild && hasChildren ? (
|
|
34
|
+
<div
|
|
35
|
+
class:list={[sidebarGroupLabel(), className]}
|
|
36
|
+
data-sidebar="group-label"
|
|
37
|
+
data-as-child
|
|
38
|
+
{...rest}
|
|
39
|
+
data-slot="sidebar-group-label"
|
|
40
|
+
>
|
|
41
|
+
<slot />
|
|
42
|
+
</div>
|
|
43
|
+
) : (
|
|
44
|
+
<div
|
|
45
|
+
class:list={[sidebarGroupLabel(), className]}
|
|
46
|
+
data-sidebar="group-label"
|
|
47
|
+
{...rest}
|
|
48
|
+
data-slot="sidebar-group-label"
|
|
49
|
+
>
|
|
50
|
+
<slot />
|
|
51
|
+
</div>
|
|
52
|
+
)
|
|
53
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { HTMLAttributes } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
export interface SidebarHeaderProps extends HTMLAttributes<"div"> {}
|
|
6
|
+
type Props = SidebarHeaderProps;
|
|
7
|
+
|
|
8
|
+
export const sidebarHeader = cv({
|
|
9
|
+
base: "flex flex-col gap-5xs p-5xs",
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const { class: className, ...rest } = Astro.props;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
<div
|
|
16
|
+
class:list={[sidebarHeader(), className]}
|
|
17
|
+
data-sidebar="header"
|
|
18
|
+
{...rest}
|
|
19
|
+
data-slot="sidebar-header"
|
|
20
|
+
>
|
|
21
|
+
<slot />
|
|
22
|
+
</div>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { ComponentProps } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
// eslint-disable-next-line typescript/consistent-type-imports
|
|
6
|
+
import Input from "../input/Input.astro";
|
|
7
|
+
|
|
8
|
+
const sidebarInput = cv({
|
|
9
|
+
base: "bg-background focus-visible:ring-sidebar-outline h-10 w-full shadow-none focus-visible:ring-2",
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
type Props = ComponentProps<typeof Input>;
|
|
13
|
+
|
|
14
|
+
const { size = "md", class: className, ...rest } = Astro.props;
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
<Input
|
|
18
|
+
size={size}
|
|
19
|
+
class:list={[sidebarInput(), className]}
|
|
20
|
+
data-sidebar="input"
|
|
21
|
+
{...rest}
|
|
22
|
+
data-slot="sidebar-input"
|
|
23
|
+
/>
|
|
24
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { HTMLAttributes } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
export interface SidebarInsetProps extends HTMLAttributes<"main"> {}
|
|
6
|
+
type Props = SidebarInsetProps;
|
|
7
|
+
|
|
8
|
+
export const sidebarInset = cv({
|
|
9
|
+
base: [
|
|
10
|
+
"bg-background relative flex w-full flex-1 flex-col",
|
|
11
|
+
"md:peer-data-[variant=inset]:m-2xl md:peer-data-[variant=inset]:ml-0",
|
|
12
|
+
"md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm",
|
|
13
|
+
"md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2xl",
|
|
14
|
+
],
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const { class: className, ...rest } = Astro.props;
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
<main class:list={[sidebarInset(), className]} {...rest} data-slot="sidebar-inset">
|
|
21
|
+
<slot />
|
|
22
|
+
</main>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { HTMLAttributes } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
export interface SidebarMenuProps extends HTMLAttributes<"ul"> {}
|
|
6
|
+
type Props = SidebarMenuProps;
|
|
7
|
+
|
|
8
|
+
export const sidebarMenu = cv({
|
|
9
|
+
base: "flex w-full min-w-0 flex-col gap-5xs",
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const { class: className, ...rest } = Astro.props;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
<ul
|
|
16
|
+
class:list={[sidebarMenu(), className]}
|
|
17
|
+
data-sidebar="menu"
|
|
18
|
+
{...rest}
|
|
19
|
+
data-slot="sidebar-menu"
|
|
20
|
+
>
|
|
21
|
+
<slot />
|
|
22
|
+
</ul>
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { ComponentProps } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
// eslint-disable-next-line typescript/consistent-type-imports
|
|
6
|
+
import Button from "../button/Button.astro";
|
|
7
|
+
|
|
8
|
+
export interface SidebarMenuActionProps extends ComponentProps<typeof Button> {
|
|
9
|
+
/**
|
|
10
|
+
* When true, shows the action only when the menu item is hovered
|
|
11
|
+
* @default false
|
|
12
|
+
*/
|
|
13
|
+
showOnHover?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type Props = SidebarMenuActionProps;
|
|
17
|
+
|
|
18
|
+
export const sidebarMenuAction = cv({
|
|
19
|
+
base: [
|
|
20
|
+
"text-sidebar-foreground ring-sidebar-outline",
|
|
21
|
+
"absolute top-xs right-2xs flex aspect-square w-2xs items-center justify-center rounded-md p-0",
|
|
22
|
+
"outline-hidden transition-transform",
|
|
23
|
+
"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
|
|
24
|
+
"peer-hover/menu-button:text-sidebar-accent-foreground",
|
|
25
|
+
"[&>svg]:size-4 [&>svg]:shrink-0",
|
|
26
|
+
"after:absolute after:-inset-2 md:after:hidden",
|
|
27
|
+
"peer-data-[size=sm]/menu-button:top-2xs",
|
|
28
|
+
"peer-data-[size=default]/menu-button:top-xs",
|
|
29
|
+
"peer-data-[size=lg]/menu-button:top-sm",
|
|
30
|
+
"group-data-[collapsible=icon]:hidden",
|
|
31
|
+
],
|
|
32
|
+
variants: {
|
|
33
|
+
showOnHover: {
|
|
34
|
+
true: [
|
|
35
|
+
"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
|
|
36
|
+
"group-focus-within/menu-item:op-100 group-hover/menu-item:op-100",
|
|
37
|
+
"data-[state=open]:op-100",
|
|
38
|
+
"md:op-0",
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const {
|
|
45
|
+
showOnHover = false,
|
|
46
|
+
variant = "ghost",
|
|
47
|
+
size = "icon-sm",
|
|
48
|
+
class: className,
|
|
49
|
+
...rest
|
|
50
|
+
} = Astro.props;
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
<Button
|
|
54
|
+
variant={variant}
|
|
55
|
+
size={size}
|
|
56
|
+
class:list={[sidebarMenuAction({ showOnHover }), className]}
|
|
57
|
+
data-sidebar="menu-action"
|
|
58
|
+
{...rest}
|
|
59
|
+
data-slot="sidebar-menu-action"
|
|
60
|
+
>
|
|
61
|
+
<slot />
|
|
62
|
+
</Button>
|
|
63
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { HTMLAttributes } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
export interface SidebarMenuBadgeProps extends HTMLAttributes<"div"> {}
|
|
6
|
+
type Props = SidebarMenuBadgeProps;
|
|
7
|
+
|
|
8
|
+
export const sidebarMenuBadge = cv({
|
|
9
|
+
base: [
|
|
10
|
+
"text-sidebar-foreground pointer-events-none absolute right-2xs flex h-2xs min-w-2xs",
|
|
11
|
+
"items-center justify-center rounded-md px-2xs text-xs font-medium tabular-nums select-none",
|
|
12
|
+
"peer-hover/menu-button:text-sidebar-accent-foreground",
|
|
13
|
+
"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
|
|
14
|
+
"peer-data-[size=sm]/menu-button:top-2xs",
|
|
15
|
+
"peer-data-[size=default]/menu-button:top-xs",
|
|
16
|
+
"peer-data-[size=lg]/menu-button:top-sm",
|
|
17
|
+
"group-data-[collapsible=icon]:hidden",
|
|
18
|
+
],
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const { class: className, ...rest } = Astro.props;
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
<div
|
|
25
|
+
class:list={[sidebarMenuBadge(), className]}
|
|
26
|
+
data-sidebar="menu-badge"
|
|
27
|
+
{...rest}
|
|
28
|
+
data-slot="sidebar-menu-badge"
|
|
29
|
+
>
|
|
30
|
+
<slot />
|
|
31
|
+
</div>
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { HTMLAttributes } from "astro/types";
|
|
3
|
+
import { cv } from "css-variants";
|
|
4
|
+
|
|
5
|
+
type VariantProps<T extends (...args: any) => any> = NonNullable<Parameters<T>[0]>;
|
|
6
|
+
|
|
7
|
+
import Tooltip from "../tooltip/Tooltip.astro";
|
|
8
|
+
import TooltipContent from "../tooltip/TooltipContent.astro";
|
|
9
|
+
import TooltipTrigger from "../tooltip/TooltipTrigger.astro";
|
|
10
|
+
|
|
11
|
+
export interface SidebarMenuButtonProps
|
|
12
|
+
extends HTMLAttributes<"button">,
|
|
13
|
+
Omit<HTMLAttributes<"a">, "type">,
|
|
14
|
+
VariantProps<typeof sidebarMenuButton> {
|
|
15
|
+
/**
|
|
16
|
+
* Render as a child element wrapper instead of a button
|
|
17
|
+
*/
|
|
18
|
+
asChild?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Whether the menu item is currently active
|
|
21
|
+
*/
|
|
22
|
+
isActive?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Tooltip text to show when sidebar is collapsed
|
|
25
|
+
*/
|
|
26
|
+
tooltip?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
export const sidebarMenuButton = cv({
|
|
31
|
+
base: [
|
|
32
|
+
"peer/menu-button flex w-full items-center gap-3 overflow-hidden rounded-md p-2xl text-left",
|
|
33
|
+
"ring-sidebar-outline outline-hidden transition-[width,height,padding]",
|
|
34
|
+
"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
|
|
35
|
+
"focus-visible:ring-2",
|
|
36
|
+
"active:bg-sidebar-accent active:text-sidebar-accent-foreground",
|
|
37
|
+
"disabled:pointer-events-none disabled:op-50",
|
|
38
|
+
"aria-disabled:pointer-events-none aria-disabled:op-50",
|
|
39
|
+
"group-has-data-[sidebar=menu-action]/menu-item:pr-8",
|
|
40
|
+
"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground data-[active=true]:font-medium",
|
|
41
|
+
"data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground",
|
|
42
|
+
"group-data-[collapsible=icon]:size-10! group-data-[collapsible=icon]:p-2.5!",
|
|
43
|
+
"[&>span:last-child]:truncate [&>svg]:size-4.5 [&>svg]:shrink-0",
|
|
44
|
+
],
|
|
45
|
+
variants: {
|
|
46
|
+
variant: {
|
|
47
|
+
default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
|
|
48
|
+
outline: [
|
|
49
|
+
"bg-background shadow-sidebar-border shadow-xs",
|
|
50
|
+
"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-sidebar-accent",
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
size: {
|
|
54
|
+
default: "h-3xl text-base",
|
|
55
|
+
sm: "h-3xs text-sm",
|
|
56
|
+
lg: "h-3xl text-lg group-data-[collapsible=icon]:p-0!",
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
defaultVariants: {
|
|
60
|
+
variant: "default",
|
|
61
|
+
size: "default",
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const {
|
|
66
|
+
asChild = false,
|
|
67
|
+
isActive = false,
|
|
68
|
+
tooltip,
|
|
69
|
+
variant,
|
|
70
|
+
size,
|
|
71
|
+
class: className,
|
|
72
|
+
...rest
|
|
73
|
+
} = Astro.props;
|
|
74
|
+
|
|
75
|
+
const Tag = Astro.props.href ? "a" : "button";
|
|
76
|
+
|
|
77
|
+
const buttonClasses = sidebarMenuButton({ variant, size });
|
|
78
|
+
const buttonDataAttrs = {
|
|
79
|
+
"data-slot": "sidebar-menu-button",
|
|
80
|
+
"data-sidebar": "menu-button",
|
|
81
|
+
"data-size": size || "default",
|
|
82
|
+
"data-active": isActive,
|
|
83
|
+
};
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
{
|
|
87
|
+
tooltip ? (
|
|
88
|
+
<Tooltip openDelay={0} closeDelay={0} class="starwind-sidebar-menu-button-tooltip w-full">
|
|
89
|
+
<TooltipTrigger>
|
|
90
|
+
{asChild ? (
|
|
91
|
+
<div class:list={[buttonClasses, className]} {...buttonDataAttrs} data-as-child>
|
|
92
|
+
<slot />
|
|
93
|
+
</div>
|
|
94
|
+
) : (
|
|
95
|
+
<Tag class:list={[buttonClasses, className]} {...buttonDataAttrs} {...rest}>
|
|
96
|
+
<slot />
|
|
97
|
+
</Tag>
|
|
98
|
+
)}
|
|
99
|
+
</TooltipTrigger>
|
|
100
|
+
<TooltipContent
|
|
101
|
+
side="right"
|
|
102
|
+
align="center"
|
|
103
|
+
class="starwind-sidebar-tooltip-content ws-nowrap"
|
|
104
|
+
>
|
|
105
|
+
{tooltip}
|
|
106
|
+
</TooltipContent>
|
|
107
|
+
</Tooltip>
|
|
108
|
+
) : asChild ? (
|
|
109
|
+
<div class:list={[buttonClasses, className]} {...buttonDataAttrs} data-as-child>
|
|
110
|
+
<slot />
|
|
111
|
+
</div>
|
|
112
|
+
) : (
|
|
113
|
+
<Tag class:list={[buttonClasses, className]} {...buttonDataAttrs} {...rest}>
|
|
114
|
+
<slot />
|
|
115
|
+
</Tag>
|
|
116
|
+
)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
<style is:global>
|
|
120
|
+
:root:not([data-starwind-sidebar-tooltips="enabled"]) .starwind-sidebar-tooltip-content {
|
|
121
|
+
display: none !important;
|
|
122
|
+
}
|
|
123
|
+
</style>
|
|
124
|
+
|