@akira-io/ui 2.1.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blocks.d.ts +6 -6
- package/dist/blocks.js +6 -3
- package/dist/blocks.js.map +1 -1
- package/dist/{chunk-XLAOE5MV.js → chunk-7DAA3DPJ.js} +11 -6
- package/dist/chunk-7DAA3DPJ.js.map +1 -0
- package/dist/chunk-EXTOGROG.js +42 -0
- package/dist/chunk-EXTOGROG.js.map +1 -0
- package/dist/{chunk-BR3JI3KN.js → chunk-L56VUE3E.js} +3 -2
- package/dist/chunk-L56VUE3E.js.map +1 -0
- package/dist/{chunk-ZQXZ4UGE.js → chunk-PYXUFFMO.js} +10 -3
- package/dist/chunk-PYXUFFMO.js.map +1 -0
- package/dist/{chunk-DPLCEU34.js → chunk-RE4M2G2Y.js} +76 -85
- package/dist/chunk-RE4M2G2Y.js.map +1 -0
- package/dist/{chunk-L2H5GIF7.js → chunk-VVBBKTC5.js} +6 -1
- package/dist/chunk-VVBBKTC5.js.map +1 -0
- package/dist/{context-2wTOwxCk.d.ts → context-CWkgje9v.d.ts} +3 -2
- package/dist/index.d.ts +23 -10
- package/dist/index.js +149 -116
- package/dist/index.js.map +1 -1
- package/dist/inertia.d.ts +1 -1
- package/dist/inertia.js +5 -4
- package/dist/inertia.js.map +1 -1
- package/dist/locales/fr.d.ts +2 -2
- package/dist/locales/pt.d.ts +2 -2
- package/dist/shells.d.ts +1 -1
- package/dist/shells.js +4 -3
- package/dist/shells.js.map +1 -1
- package/dist/{sidebar-BLL2tgTt.d.ts → sidebar-_xQ3IehY.d.ts} +3 -1
- package/dist/{types-1LUmNJf_.d.ts → types-DEJsTx8E.d.ts} +2 -1
- package/package.json +2 -1
- package/dist/chunk-BR3JI3KN.js.map +0 -1
- package/dist/chunk-DPLCEU34.js.map +0 -1
- package/dist/chunk-L2H5GIF7.js.map +0 -1
- package/dist/chunk-XLAOE5MV.js.map +0 -1
- package/dist/chunk-ZQXZ4UGE.js.map +0 -1
|
@@ -32,11 +32,12 @@ import {
|
|
|
32
32
|
SidebarTrigger,
|
|
33
33
|
useIsMobile,
|
|
34
34
|
useSidebar
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-PYXUFFMO.js";
|
|
36
36
|
import {
|
|
37
37
|
hrefToString,
|
|
38
|
+
pathOfHref,
|
|
38
39
|
resolveLink
|
|
39
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-VVBBKTC5.js";
|
|
40
41
|
import {
|
|
41
42
|
Separator
|
|
42
43
|
} from "./chunk-53V4J7MC.js";
|
|
@@ -179,7 +180,9 @@ function isItemActive(item, currentUrl) {
|
|
|
179
180
|
if (!currentUrl) {
|
|
180
181
|
return false;
|
|
181
182
|
}
|
|
182
|
-
|
|
183
|
+
const currentPath = pathOfHref(currentUrl);
|
|
184
|
+
const path = pathOfHref(item.href);
|
|
185
|
+
return currentPath === path || currentPath.startsWith(`${path}/`);
|
|
183
186
|
}
|
|
184
187
|
function NavMain({
|
|
185
188
|
items = [],
|
|
@@ -383,12 +386,14 @@ function NavUser({
|
|
|
383
386
|
// src/shells/app-sidebar.tsx
|
|
384
387
|
import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
385
388
|
function mostSpecificActiveHref(groups, currentUrl) {
|
|
389
|
+
const currentPath = pathOfHref(currentUrl);
|
|
386
390
|
let best = "";
|
|
387
391
|
for (const group of groups) {
|
|
388
392
|
for (const item of group.items) {
|
|
389
393
|
const href = hrefToString(item.href);
|
|
390
|
-
const
|
|
391
|
-
|
|
394
|
+
const path = pathOfHref(href);
|
|
395
|
+
const matches = currentPath === path || currentPath.startsWith(`${path}/`);
|
|
396
|
+
if (matches && path.length > best.length) {
|
|
392
397
|
best = href;
|
|
393
398
|
}
|
|
394
399
|
}
|
|
@@ -602,4 +607,4 @@ export {
|
|
|
602
607
|
Heading,
|
|
603
608
|
SettingsLayout
|
|
604
609
|
};
|
|
605
|
-
//# sourceMappingURL=chunk-
|
|
610
|
+
//# sourceMappingURL=chunk-7DAA3DPJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-collapsed-groups.tsx","../src/hooks/use-initials.tsx","../src/shells/nav-footer.tsx","../src/shells/nav-main.tsx","../src/shells/user-info.tsx","../src/shells/user-menu-content.tsx","../src/shells/nav-user.tsx","../src/shells/app-sidebar.tsx","../src/shells/breadcrumbs.tsx","../src/shells/app-sidebar-header.tsx","../src/shells/heading.tsx","../src/shells/settings-layout.tsx"],"sourcesContent":["import { useCallback, useState } from 'react';\n\nexport const SIDEBAR_COLLAPSED_GROUPS_KEY = 'akira-ui:collapsed-nav-groups';\n\nfunction readCollapsedGroups(): string[] | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n try {\n const raw = window.localStorage.getItem(SIDEBAR_COLLAPSED_GROUPS_KEY);\n\n if (raw === null) {\n return null;\n }\n\n const parsed: unknown = JSON.parse(raw);\n\n return Array.isArray(parsed)\n ? parsed.filter(\n (entry): entry is string => typeof entry === 'string',\n )\n : null;\n } catch {\n return null;\n }\n}\n\nfunction writeCollapsedGroups(groups: string[]): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n window.localStorage.setItem(\n SIDEBAR_COLLAPSED_GROUPS_KEY,\n JSON.stringify(groups),\n );\n } catch {\n return;\n }\n}\n\nfunction withGroup(groups: string[], group: string, collapsed: boolean) {\n if (!collapsed) {\n return groups.filter((entry) => entry !== group);\n }\n\n return groups.includes(group) ? groups : [...groups, group];\n}\n\nexport interface CollapsedGroupsOptions {\n group: string;\n defaultOpen?: boolean;\n collapsedGroups?: string[];\n onCollapsedChange?: (collapsedGroups: string[]) => void;\n}\n\nexport function useCollapsedGroup({\n group,\n defaultOpen = true,\n collapsedGroups,\n onCollapsedChange,\n}: CollapsedGroupsOptions) {\n const isControlled =\n collapsedGroups !== undefined && onCollapsedChange !== undefined;\n\n const [storedGroups, setStoredGroups] = useState<string[]>(\n () => readCollapsedGroups() ?? (defaultOpen ? [] : [group]),\n );\n\n const setOpen = useCallback(\n (open: boolean) => {\n if (isControlled) {\n onCollapsedChange(withGroup(collapsedGroups, group, !open));\n\n return;\n }\n\n const next = withGroup(\n readCollapsedGroups() ?? storedGroups,\n group,\n !open,\n );\n\n setStoredGroups(next);\n writeCollapsedGroups(next);\n },\n [collapsedGroups, group, isControlled, onCollapsedChange, storedGroups],\n );\n\n const source = isControlled ? collapsedGroups : storedGroups;\n\n return { open: !source.includes(group), setOpen };\n}\n","import { useCallback } from 'react';\n\nexport function useInitials() {\n return useCallback((fullName: string): string => {\n const names = fullName.trim().split(' ');\n\n if (names.length === 0) return '';\n if (names.length === 1) return names[0].charAt(0).toUpperCase();\n\n const firstInitial = names[0].charAt(0);\n const lastInitial = names[names.length - 1].charAt(0);\n\n return `${firstInitial}${lastInitial}`.toUpperCase();\n }, []);\n}\n","import { type ComponentPropsWithoutRef } from 'react';\n\nimport { Icon } from '@/components/ui/icon';\nimport {\n SidebarGroup,\n SidebarGroupContent,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from '@/components/ui/sidebar';\nimport { hrefToString } from '@/lib/href';\nimport type { NavItem } from '@/types';\n\nexport function NavFooter({\n items,\n className,\n ...props\n}: ComponentPropsWithoutRef<typeof SidebarGroup> & {\n items: NavItem[];\n}) {\n return (\n <SidebarGroup\n {...props}\n className={`group-data-[collapsible=icon]:p-0 ${className || ''}`}\n >\n <SidebarGroupContent>\n <SidebarMenu>\n {items.map((item) => (\n <SidebarMenuItem key={item.title}>\n <SidebarMenuButton\n asChild\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <a\n href={hrefToString(item.href)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {item.icon && (\n <Icon\n iconNode={item.icon}\n className=\"h-5 w-5\"\n />\n )}\n <span>{item.title}</span>\n </a>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n","import { ChevronDown } from 'lucide-react';\n\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '@/components/ui/collapsible';\nimport {\n SidebarGroup,\n SidebarGroupLabel,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from '@/components/ui/sidebar';\nimport { useCollapsedGroup } from '@/hooks/use-collapsed-groups';\nimport { pathOfHref, resolveLink } from '@/lib/href';\nimport { cn } from '@/lib/utils';\nimport type { LinkComponent, NavItem } from '@/types';\n\nfunction isItemActive(item: NavItem, currentUrl: string): boolean {\n if (item.isActive !== undefined) {\n return item.isActive;\n }\n\n if (!currentUrl) {\n return false;\n }\n\n const currentPath = pathOfHref(currentUrl);\n const path = pathOfHref(item.href);\n\n return currentPath === path || currentPath.startsWith(`${path}/`);\n}\n\nexport interface NavMainProps {\n items: NavItem[];\n label?: string;\n currentUrl?: string;\n linkComponent?: LinkComponent;\n collapsible?: boolean;\n defaultOpen?: boolean;\n collapsedGroups?: string[];\n onCollapsedChange?: (collapsedGroups: string[]) => void;\n}\n\nexport function NavMain({\n items = [],\n label = 'Platform',\n currentUrl = '',\n linkComponent,\n collapsible = false,\n defaultOpen = true,\n collapsedGroups,\n onCollapsedChange,\n}: NavMainProps) {\n const Link = resolveLink(linkComponent);\n const holdsCurrentRoute = items.some((item) =>\n isItemActive(item, currentUrl),\n );\n const { open, setOpen } = useCollapsedGroup({\n group: label,\n defaultOpen,\n collapsedGroups,\n onCollapsedChange,\n });\n const expanded = open || holdsCurrentRoute;\n\n const menu = (\n <SidebarMenu>\n {items.map((item) => (\n <SidebarMenuItem key={item.title}>\n <SidebarMenuButton\n asChild\n isActive={isItemActive(item, currentUrl)}\n tooltip={{ children: item.title }}\n >\n <Link href={item.href} prefetch>\n {item.icon && <item.icon />}\n <span>{item.title}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n );\n\n if (!collapsible || !label) {\n return (\n <SidebarGroup className=\"px-2 py-0\">\n {label && <SidebarGroupLabel>{label}</SidebarGroupLabel>}\n {menu}\n </SidebarGroup>\n );\n }\n\n return (\n <SidebarGroup className=\"px-2 py-0\">\n <Collapsible open={expanded} onOpenChange={setOpen}>\n <CollapsibleTrigger asChild>\n <SidebarGroupLabel className=\"w-full cursor-pointer justify-between\">\n {label}\n <ChevronDown\n className={cn(\n 'size-4 transition-transform',\n !expanded && '-rotate-90',\n )}\n />\n </SidebarGroupLabel>\n </CollapsibleTrigger>\n <CollapsibleContent>{menu}</CollapsibleContent>\n </Collapsible>\n </SidebarGroup>\n );\n}\n","import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';\nimport { useInitials } from '@/hooks/use-initials';\nimport { compactRadius } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SharedUser } from '@/types';\n\nexport function UserInfo({\n user,\n showEmail = false,\n}: {\n user: SharedUser;\n showEmail?: boolean;\n}) {\n const getInitials = useInitials();\n\n return (\n <>\n <Avatar\n className={cn(\n compactRadius,\n 'group-data-[collapsible=icon]:size-10',\n )}\n >\n <AvatarImage src={user.avatar} alt={user.name} />\n <AvatarFallback\n className={cn(compactRadius, 'bg-muted text-foreground')}\n >\n {getInitials(user.name)}\n </AvatarFallback>\n </Avatar>\n <div\n data-slot=\"user-info-identity\"\n className=\"text-sm leading-tight grid flex-1 text-left group-data-[collapsible=icon]:hidden\"\n >\n <span className=\"font-medium truncate\">{user.name}</span>\n {showEmail && (\n <span className=\"text-xs truncate text-muted-foreground\">\n {user.email}\n </span>\n )}\n </div>\n </>\n );\n}\n","import { LogOut, Settings } from 'lucide-react';\n\nimport {\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from '@/components/ui/dropdown-menu';\nimport { resolveLink } from '@/lib/href';\nimport type { LinkComponent, SharedUser, UrlLike } from '@/types';\nimport { UserInfo } from './user-info';\n\ninterface UserMenuContentProps {\n user: SharedUser;\n settingsHref: UrlLike;\n logoutHref: UrlLike;\n linkComponent?: LinkComponent;\n onSettingsClick?: () => void;\n onLogout?: () => void;\n settingsLabel?: string;\n logoutLabel?: string;\n}\n\nexport function UserMenuContent({\n user,\n settingsHref,\n logoutHref,\n linkComponent,\n onSettingsClick,\n onLogout,\n settingsLabel = 'Settings',\n logoutLabel = 'Log out',\n}: UserMenuContentProps) {\n const Link = resolveLink(linkComponent);\n\n return (\n <>\n <DropdownMenuLabel className=\"p-0 font-normal\">\n <div className=\"gap-2 px-1 py-1.5 text-sm flex items-center text-left\">\n <UserInfo user={user} showEmail={true} />\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem asChild>\n <Link\n className=\"block w-full\"\n href={settingsHref}\n as=\"button\"\n prefetch\n onClick={onSettingsClick}\n >\n <Settings className=\"mr-2\" />\n {settingsLabel}\n </Link>\n </DropdownMenuItem>\n </DropdownMenuGroup>\n <DropdownMenuSeparator />\n <DropdownMenuItem asChild>\n <Link\n className=\"block w-full\"\n href={logoutHref}\n as=\"button\"\n onClick={onLogout}\n data-test=\"logout-button\"\n >\n <LogOut className=\"mr-2\" />\n {logoutLabel}\n </Link>\n </DropdownMenuItem>\n </>\n );\n}\n","import { ChevronsUpDown } from 'lucide-react';\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport {\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n useSidebar,\n} from '@/components/ui/sidebar';\nimport { useIsMobile } from '@/hooks/use-mobile';\nimport type { LinkComponent, SharedUser, UrlLike } from '@/types';\nimport { UserInfo } from './user-info';\nimport { UserMenuContent } from './user-menu-content';\n\ninterface NavUserProps {\n user: SharedUser;\n settingsHref: UrlLike;\n logoutHref: UrlLike;\n linkComponent?: LinkComponent;\n onSettingsClick?: () => void;\n onLogout?: () => void;\n}\n\nexport function NavUser({\n user,\n settingsHref,\n logoutHref,\n linkComponent,\n onSettingsClick,\n onLogout,\n}: NavUserProps) {\n const { state } = useSidebar();\n const isMobile = useIsMobile();\n\n return (\n <SidebarMenu>\n <SidebarMenuItem>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton\n className=\"group group-data-[collapsible=icon]:p-0! cursor-pointer bg-sidebar-accent text-sidebar-accent-foreground hover:bg-sidebar-accent-hover data-[state=open]:bg-sidebar-accent-hover\"\n data-test=\"sidebar-menu-button\"\n >\n <UserInfo user={user} />\n <ChevronsUpDown\n data-slot=\"nav-user-chevron\"\n className=\"size-4 ml-auto group-data-[collapsible=icon]:hidden\"\n />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"min-w-56 rounded-xl w-(--radix-dropdown-menu-trigger-width)\"\n align=\"end\"\n side={\n isMobile\n ? 'bottom'\n : state === 'collapsed'\n ? 'left'\n : 'bottom'\n }\n >\n <UserMenuContent\n user={user}\n settingsHref={settingsHref}\n logoutHref={logoutHref}\n linkComponent={linkComponent}\n onSettingsClick={onSettingsClick}\n onLogout={onLogout}\n />\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n );\n}\n","import { type ReactNode } from 'react';\n\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from '@/components/ui/sidebar';\nimport { hrefToString, pathOfHref, resolveLink } from '@/lib/href';\nimport type {\n LinkComponent,\n NavGroup,\n NavItem,\n SharedUser,\n UrlLike,\n} from '@/types';\nimport { NavFooter } from './nav-footer';\nimport { NavMain } from './nav-main';\nimport { NavUser } from './nav-user';\n\nfunction mostSpecificActiveHref(\n groups: NavGroup[],\n currentUrl: string,\n): string {\n const currentPath = pathOfHref(currentUrl);\n let best = '';\n for (const group of groups) {\n for (const item of group.items) {\n const href = hrefToString(item.href);\n const path = pathOfHref(href);\n const matches =\n currentPath === path || currentPath.startsWith(`${path}/`);\n if (matches && path.length > best.length) {\n best = href;\n }\n }\n }\n return best;\n}\n\ninterface AppSidebarProps {\n logo: ReactNode;\n logoHref: UrlLike;\n groups: NavGroup[];\n footerItems?: NavItem[];\n user: SharedUser;\n settingsHref: UrlLike;\n logoutHref: UrlLike;\n currentUrl?: string;\n linkComponent?: LinkComponent;\n collapsibleGroups?: boolean;\n collapsedGroups?: string[];\n onCollapsedChange?: (collapsedGroups: string[]) => void;\n onSettingsClick?: () => void;\n onLogout?: () => void;\n}\n\nexport function AppSidebar({\n logo,\n logoHref,\n groups,\n footerItems = [],\n user,\n settingsHref,\n logoutHref,\n currentUrl = '',\n linkComponent,\n collapsibleGroups = false,\n collapsedGroups,\n onCollapsedChange,\n onSettingsClick,\n onLogout,\n}: AppSidebarProps) {\n const Link = resolveLink(linkComponent);\n const activeHref = mostSpecificActiveHref(groups, currentUrl);\n const resolvedGroups = groups.map((group) => ({\n ...group,\n items: group.items.map((item) => ({\n ...item,\n isActive: hrefToString(item.href) === activeHref,\n })),\n }));\n\n return (\n <Sidebar collapsible=\"icon\" variant=\"inset\">\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton asChild>\n <Link href={logoHref} prefetch>\n {logo}\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarHeader>\n\n <SidebarContent>\n {resolvedGroups.map((group, index) => (\n <NavMain\n key={group.label ?? index}\n items={group.items}\n label={group.label ?? ''}\n currentUrl={currentUrl}\n linkComponent={linkComponent}\n collapsible={collapsibleGroups}\n collapsedGroups={collapsedGroups}\n onCollapsedChange={onCollapsedChange}\n />\n ))}\n </SidebarContent>\n\n <SidebarFooter>\n {footerItems.length > 0 && (\n <NavFooter items={footerItems} className=\"mt-auto\" />\n )}\n <NavUser\n user={user}\n settingsHref={settingsHref}\n logoutHref={logoutHref}\n linkComponent={linkComponent}\n onSettingsClick={onSettingsClick}\n onLogout={onLogout}\n />\n </SidebarFooter>\n </Sidebar>\n );\n}\n","import { Fragment } from 'react';\n\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '@/components/ui/breadcrumb';\nimport { resolveLink } from '@/lib/href';\nimport type {\n BreadcrumbItem as BreadcrumbItemType,\n LinkComponent,\n} from '@/types';\n\nexport function Breadcrumbs({\n breadcrumbs,\n linkComponent,\n}: {\n breadcrumbs: BreadcrumbItemType[];\n linkComponent?: LinkComponent;\n}) {\n const Link = resolveLink(linkComponent);\n\n if (breadcrumbs.length === 0) {\n return null;\n }\n\n return (\n <Breadcrumb>\n <BreadcrumbList>\n {breadcrumbs.map((item, index) => {\n const isLast = index === breadcrumbs.length - 1;\n return (\n <Fragment key={index}>\n <BreadcrumbItem>\n {isLast ? (\n <BreadcrumbPage>\n {item.title}\n </BreadcrumbPage>\n ) : (\n <BreadcrumbLink asChild>\n <Link href={item.href}>\n {item.title}\n </Link>\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && <BreadcrumbSeparator />}\n </Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n","import { Search } from 'lucide-react';\nimport { useEffect, useState } from 'react';\n\nimport { SidebarTrigger } from '@/components/ui/sidebar';\nimport type {\n BreadcrumbItem as BreadcrumbItemType,\n LinkComponent,\n} from '@/types';\nimport { Breadcrumbs } from './breadcrumbs';\n\ninterface AppSidebarHeaderProps {\n breadcrumbs?: BreadcrumbItemType[];\n linkComponent?: LinkComponent;\n onSearchClick?: () => void;\n searchLabel?: string;\n}\n\nexport function AppSidebarHeader({\n breadcrumbs = [],\n linkComponent,\n onSearchClick,\n searchLabel = 'Search...',\n}: AppSidebarHeaderProps) {\n const [modifier, setModifier] = useState('Ctrl');\n\n useEffect(() => {\n const platform = navigator.userAgent;\n setModifier(/Mac|iPhone|iPad|iPod/.test(platform) ? '⌘' : 'Ctrl');\n }, []);\n\n return (\n <header className=\"h-16 gap-2 px-6 group-has-data-[collapsible=icon]/sidebar-wrapper:h-12 md:px-4 flex shrink-0 items-center border-b border-sidebar-border/50 transition-[width,height] ease-linear\">\n <div className=\"gap-2 flex items-center\">\n <SidebarTrigger className=\"-ml-1\" />\n <Breadcrumbs\n breadcrumbs={breadcrumbs}\n linkComponent={linkComponent}\n />\n </div>\n\n {onSearchClick && (\n <button\n type=\"button\"\n onClick={onSearchClick}\n className=\"h-9 w-56 gap-2 rounded-xl px-3 text-sm ml-auto flex items-center border border-border/60 bg-muted/30 text-muted-foreground transition-colors hover:bg-muted/50\"\n >\n <Search className=\"size-4\" />\n <span>{searchLabel}</span>\n <kbd className=\"gap-0.5 px-1.5 py-0.5 font-semibold rounded-xl ml-auto inline-flex items-center border border-border/60 bg-background font-sans text-[10px] text-muted-foreground\">\n <span>{modifier}</span>\n <span>K</span>\n </kbd>\n </button>\n )}\n </header>\n );\n}\n","export function Heading({\n title,\n description,\n}: {\n title: string;\n description?: string;\n}) {\n return (\n <div className=\"mb-8 space-y-0.5\">\n <h2 className=\"text-xl font-semibold tracking-tight\">{title}</h2>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n );\n}\n","import { type PropsWithChildren } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { Separator } from '@/components/ui/separator';\nimport { hrefToString, resolveLink } from '@/lib/href';\nimport { cn } from '@/lib/utils';\nimport type { LinkComponent, NavItem } from '@/types';\nimport { Heading } from './heading';\n\nexport interface SettingsLayoutProps {\n items: NavItem[];\n linkComponent?: LinkComponent;\n currentPath?: string;\n title?: string;\n description?: string;\n wide?: boolean;\n}\n\nexport function SettingsLayout({\n items,\n linkComponent,\n currentPath,\n title = 'Settings',\n description = 'Manage your profile and account settings',\n wide = false,\n children,\n}: PropsWithChildren<SettingsLayoutProps>) {\n const Link = resolveLink(linkComponent);\n const activePath =\n currentPath ??\n (typeof window === 'undefined' ? '' : window.location.pathname);\n\n return (\n <div className=\"px-4 py-6\">\n <Heading title={title} description={description} />\n\n <div className=\"lg:flex-row lg:space-x-12 flex flex-col\">\n <aside className=\"max-w-xl lg:w-48 w-full\">\n <nav className=\"space-y-1 space-x-0 flex flex-col\">\n {items.map((item, index) => {\n const href = hrefToString(item.href);\n return (\n <Button\n key={`${href}-${index}`}\n size=\"sm\"\n variant=\"ghost\"\n asChild\n className={cn('w-full justify-start', {\n 'bg-muted': activePath === href,\n })}\n >\n <Link href={item.href}>\n {item.icon && (\n <item.icon className=\"h-4 w-4\" />\n )}\n {item.title}\n </Link>\n </Button>\n );\n })}\n </nav>\n </aside>\n\n <Separator className=\"my-6 lg:hidden\" />\n\n <div\n className={cn(\n wide ? 'min-w-0 flex-1' : 'md:max-w-2xl flex-1',\n )}\n >\n <section\n className={cn(\n 'space-y-12',\n wide ? 'max-w-5xl' : 'max-w-xl',\n )}\n >\n {children}\n </section>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["useCallback","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","Fragment","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// src/components/ui/floating-sheet-context.ts
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
var floatingSheetDefaultLabels = {
|
|
4
|
+
backLabel: "Back",
|
|
5
|
+
closeLabel: "Close"
|
|
6
|
+
};
|
|
7
|
+
var FLOATING_SHEET_OFFSET_LIMIT = 3;
|
|
8
|
+
var FloatingSheetStackContext = React.createContext(null);
|
|
9
|
+
function useFloatingSheetStack() {
|
|
10
|
+
const context = React.useContext(FloatingSheetStackContext);
|
|
11
|
+
if (!context) {
|
|
12
|
+
throw new Error(
|
|
13
|
+
"FloatingSheet must be rendered inside a FloatingSheetStack."
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
return context;
|
|
17
|
+
}
|
|
18
|
+
var floatingSheetDefaultEdges = {
|
|
19
|
+
top: true,
|
|
20
|
+
bottom: true
|
|
21
|
+
};
|
|
22
|
+
var FloatingSheetEdgesContext = React.createContext(floatingSheetDefaultEdges);
|
|
23
|
+
var FloatingSheetReportEdgesContext = React.createContext(null);
|
|
24
|
+
|
|
25
|
+
// src/hooks/use-sheet-portal-container.ts
|
|
26
|
+
import * as React2 from "react";
|
|
27
|
+
function useSheetPortalContainer(container) {
|
|
28
|
+
const stack = React2.useContext(FloatingSheetStackContext);
|
|
29
|
+
return container ?? stack?.container ?? void 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export {
|
|
33
|
+
floatingSheetDefaultLabels,
|
|
34
|
+
FLOATING_SHEET_OFFSET_LIMIT,
|
|
35
|
+
FloatingSheetStackContext,
|
|
36
|
+
useFloatingSheetStack,
|
|
37
|
+
floatingSheetDefaultEdges,
|
|
38
|
+
FloatingSheetEdgesContext,
|
|
39
|
+
FloatingSheetReportEdgesContext,
|
|
40
|
+
useSheetPortalContainer
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=chunk-EXTOGROG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/floating-sheet-context.ts","../src/hooks/use-sheet-portal-container.ts"],"sourcesContent":["import * as React from 'react';\n\nexport interface FloatingSheetLabels {\n backLabel: string;\n closeLabel: string;\n}\n\nexport const floatingSheetDefaultLabels: FloatingSheetLabels = {\n backLabel: 'Back',\n closeLabel: 'Close',\n};\n\nexport const FLOATING_SHEET_OFFSET_LIMIT = 3;\n\nexport interface FloatingSheetStackEntry {\n id: string;\n title: React.ReactNode;\n persistent: boolean;\n close: () => void;\n}\n\nexport interface FloatingSheetStackContextValue {\n labels: FloatingSheetLabels;\n container: HTMLElement | null;\n entries: FloatingSheetStackEntry[];\n register: (entry: FloatingSheetStackEntry) => void;\n unregister: (id: string) => void;\n closeAll: () => void;\n}\n\nexport const FloatingSheetStackContext =\n React.createContext<FloatingSheetStackContextValue | null>(null);\n\nexport function useFloatingSheetStack(): FloatingSheetStackContextValue {\n const context = React.useContext(FloatingSheetStackContext);\n\n if (!context) {\n throw new Error(\n 'FloatingSheet must be rendered inside a FloatingSheetStack.',\n );\n }\n\n return context;\n}\n\nexport interface FloatingSheetEdges {\n top: boolean;\n bottom: boolean;\n}\n\nexport const floatingSheetDefaultEdges: FloatingSheetEdges = {\n top: true,\n bottom: true,\n};\n\nexport const FloatingSheetEdgesContext =\n React.createContext<FloatingSheetEdges>(floatingSheetDefaultEdges);\n\nexport const FloatingSheetReportEdgesContext = React.createContext<\n ((edges: FloatingSheetEdges) => void) | null\n>(null);\n","import * as React from 'react';\n\nimport { FloatingSheetStackContext } from '@/components/ui/floating-sheet-context';\n\nexport function useSheetPortalContainer(\n container?: HTMLElement | null,\n): HTMLElement | undefined {\n const stack = React.useContext(FloatingSheetStackContext);\n\n return container ?? stack?.container ?? undefined;\n}\n"],"mappings":";AAAA,YAAY,WAAW;AAOhB,IAAM,6BAAkD;AAAA,EAC3D,WAAW;AAAA,EACX,YAAY;AAChB;AAEO,IAAM,8BAA8B;AAkBpC,IAAM,4BACH,oBAAqD,IAAI;AAE5D,SAAS,wBAAwD;AACpE,QAAM,UAAgB,iBAAW,yBAAyB;AAE1D,MAAI,CAAC,SAAS;AACV,UAAM,IAAI;AAAA,MACN;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAOO,IAAM,4BAAgD;AAAA,EACzD,KAAK;AAAA,EACL,QAAQ;AACZ;AAEO,IAAM,4BACH,oBAAkC,yBAAyB;AAE9D,IAAM,kCAAwC,oBAEnD,IAAI;;;AC5DN,YAAYA,YAAW;AAIhB,SAAS,wBACZ,WACuB;AACvB,QAAM,QAAc,kBAAW,yBAAyB;AAExD,SAAO,aAAa,OAAO,aAAa;AAC5C;","names":["React"]}
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
} from "./chunk-BP2YDMMI.js";
|
|
16
16
|
import {
|
|
17
17
|
resolveLink
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-VVBBKTC5.js";
|
|
19
19
|
import {
|
|
20
20
|
Input
|
|
21
21
|
} from "./chunk-53V4J7MC.js";
|
|
@@ -437,6 +437,7 @@ function useTour(definition, options) {
|
|
|
437
437
|
|
|
438
438
|
export {
|
|
439
439
|
loginFormLabels,
|
|
440
|
+
fieldError,
|
|
440
441
|
useLoginFormContext,
|
|
441
442
|
LoginFormProvider,
|
|
442
443
|
LoginFormRoot,
|
|
@@ -455,4 +456,4 @@ export {
|
|
|
455
456
|
useTourController,
|
|
456
457
|
useTour
|
|
457
458
|
};
|
|
458
|
-
//# sourceMappingURL=chunk-
|
|
459
|
+
//# sourceMappingURL=chunk-L56VUE3E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/blocks/login-form/types.ts","../src/blocks/login-form/context.tsx","../src/blocks/login-form/parts.tsx","../src/blocks/login-form/preset.tsx","../src/blocks/login-form/index.ts","../src/blocks/tour/gate.ts","../src/blocks/tour/types.ts","../src/blocks/tour/tour.tsx"],"sourcesContent":["export interface LoginFormLabels {\n emailLabel: string;\n emailPlaceholder: string;\n passwordLabel: string;\n passwordPlaceholder: string;\n forgotPasswordLabel: string;\n rememberLabel: string;\n submitLabel: string;\n submittingLabel: string;\n}\n\nexport const loginFormLabels: LoginFormLabels = {\n emailLabel: 'Email address',\n emailPlaceholder: 'email@example.com',\n passwordLabel: 'Password',\n passwordPlaceholder: 'Password',\n forgotPasswordLabel: 'Forgot your password?',\n rememberLabel: 'Remember me',\n submitLabel: 'Log in',\n submittingLabel: 'Signing in',\n};\n\nexport type LoginFormErrors = Record<string, string | string[] | undefined>;\n\nexport function fieldError(\n errors: LoginFormErrors,\n field: string,\n): string | undefined {\n const value = errors[field];\n\n if (!value) {\n return undefined;\n }\n\n const messages = Array.isArray(value) ? value : [value];\n\n return messages.find(\n (message) => typeof message === 'string' && message.length > 0,\n );\n}\n","import {\n loginFormLabels,\n type LoginFormErrors,\n type LoginFormLabels,\n} from '@/blocks/login-form/types';\nimport { useUiLabels } from '@/locales/context';\nimport type { LinkComponent } from '@/types';\nimport { createContext, useContext, type ReactNode } from 'react';\n\nexport interface LoginFormContextValue {\n errors: LoginFormErrors;\n processing: boolean;\n linkComponent?: LinkComponent;\n labels?: Partial<LoginFormLabels>;\n}\n\nconst LoginFormContext = createContext<LoginFormContextValue>({\n errors: {},\n processing: false,\n});\n\nexport function useLoginFormContext(): LoginFormContextValue & {\n labels: LoginFormLabels;\n} {\n const context = useContext(LoginFormContext);\n const labels = useUiLabels('loginForm', loginFormLabels, context.labels);\n\n return { ...context, labels };\n}\n\nexport function LoginFormProvider({\n errors = {},\n processing = false,\n linkComponent,\n labels,\n children,\n}: {\n errors?: LoginFormErrors;\n processing?: boolean;\n linkComponent?: LinkComponent;\n labels?: Partial<LoginFormLabels>;\n children: ReactNode;\n}) {\n return (\n <LoginFormContext.Provider\n value={{\n errors,\n processing,\n linkComponent,\n labels,\n }}\n >\n {children}\n </LoginFormContext.Provider>\n );\n}\n","import {\n LoginFormProvider,\n useLoginFormContext,\n} from '@/blocks/login-form/context';\nimport {\n fieldError,\n type LoginFormErrors,\n type LoginFormLabels,\n} from '@/blocks/login-form/types';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { Field, FieldControl, FieldLabel } from '@/components/ui/field';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { PasswordInput } from '@/components/ui/password-input';\nimport { resolveLink } from '@/lib/href';\nimport { cn } from '@/lib/utils';\nimport type { LinkComponent, SlotNameProps, UrlLike } from '@/types';\nimport type { ReactNode } from 'react';\n\nexport interface LoginFormRootProps {\n errors?: LoginFormErrors;\n processing?: boolean;\n linkComponent?: LinkComponent;\n labels?: Partial<LoginFormLabels>;\n children: ReactNode;\n className?: string;\n}\n\nexport function LoginFormRoot({\n errors,\n processing,\n linkComponent,\n labels,\n children,\n className,\n slotName = 'login-form',\n}: LoginFormRootProps & SlotNameProps) {\n return (\n <LoginFormProvider\n errors={errors}\n processing={processing}\n linkComponent={linkComponent}\n labels={labels}\n >\n <div data-slot={slotName} className={cn('gap-6 grid', className)}>\n {children}\n </div>\n </LoginFormProvider>\n );\n}\n\nexport interface LoginFormStatusProps {\n message?: string;\n}\n\nexport function LoginFormStatus({\n message,\n slotName = 'login-form-status',\n}: LoginFormStatusProps & SlotNameProps) {\n if (!message) {\n return null;\n }\n\n return (\n <Alert slotName={slotName}>\n <AlertDescription>{message}</AlertDescription>\n </Alert>\n );\n}\n\nexport interface LoginFormEmailProps {\n id?: string;\n name?: string;\n label?: string;\n placeholder?: string;\n error?: string;\n tabIndex?: number;\n autoFocus?: boolean;\n required?: boolean;\n}\n\nexport function LoginFormEmail({\n id = 'email',\n name = 'email',\n label,\n placeholder,\n error,\n tabIndex,\n autoFocus = true,\n required = true,\n slotName = 'login-form-email',\n}: LoginFormEmailProps & SlotNameProps) {\n const { errors, labels } = useLoginFormContext();\n const message = error ?? fieldError(errors, name);\n\n return (\n <Field id={id} error={message} required={required} slotName={slotName}>\n <FieldLabel>{label ?? labels.emailLabel}</FieldLabel>\n <FieldControl>\n <Input\n name={name}\n type=\"email\"\n required={required}\n autoFocus={autoFocus}\n autoComplete=\"email\"\n tabIndex={tabIndex}\n placeholder={placeholder ?? labels.emailPlaceholder}\n />\n </FieldControl>\n </Field>\n );\n}\n\nexport interface LoginFormPasswordProps {\n id?: string;\n name?: string;\n label?: string;\n placeholder?: string;\n error?: string;\n tabIndex?: number;\n autoFocus?: boolean;\n required?: boolean;\n forgotPasswordHref?: UrlLike;\n forgotPasswordLabel?: string;\n linkComponent?: LinkComponent;\n}\n\nexport function LoginFormPassword({\n id = 'password',\n name = 'password',\n label,\n placeholder,\n error,\n tabIndex,\n autoFocus = false,\n required = true,\n forgotPasswordHref,\n forgotPasswordLabel,\n linkComponent,\n slotName = 'login-form-password',\n}: LoginFormPasswordProps & SlotNameProps) {\n const context = useLoginFormContext();\n const message = error ?? fieldError(context.errors, name);\n const Link = resolveLink(linkComponent ?? context.linkComponent);\n\n return (\n <Field id={id} error={message} required={required} slotName={slotName}>\n <FieldLabel>{label ?? context.labels.passwordLabel}</FieldLabel>\n <FieldControl>\n <PasswordInput\n name={name}\n required={required}\n autoFocus={autoFocus}\n autoComplete=\"current-password\"\n tabIndex={tabIndex}\n placeholder={\n placeholder ?? context.labels.passwordPlaceholder\n }\n />\n </FieldControl>\n {forgotPasswordHref && (\n <Link\n href={forgotPasswordHref}\n className=\"mr-1 text-xs font-medium self-end text-muted-foreground underline-offset-4 transition-colors hover:text-foreground hover:underline\"\n >\n {forgotPasswordLabel ?? context.labels.forgotPasswordLabel}\n </Link>\n )}\n </Field>\n );\n}\n\nexport interface LoginFormRememberProps {\n id?: string;\n name?: string;\n label?: string;\n tabIndex?: number;\n}\n\nexport function LoginFormRemember({\n id = 'remember',\n name = 'remember',\n label,\n tabIndex,\n slotName = 'login-form-remember',\n}: LoginFormRememberProps & SlotNameProps) {\n const { labels } = useLoginFormContext();\n\n return (\n <div data-slot={slotName} className=\"gap-3 flex items-center\">\n <Checkbox id={id} name={name} tabIndex={tabIndex} />\n <Label htmlFor={id}>{label ?? labels.rememberLabel}</Label>\n </div>\n );\n}\n\nexport interface LoginFormSubmitProps {\n label?: string;\n submittingLabel?: string;\n processing?: boolean;\n tabIndex?: number;\n}\n\nexport function LoginFormSubmit({\n label,\n submittingLabel,\n processing,\n tabIndex,\n slotName = 'login-form-submit',\n}: LoginFormSubmitProps & SlotNameProps) {\n const context = useLoginFormContext();\n const pending = processing ?? context.processing;\n const pendingLabel = submittingLabel ?? context.labels.submittingLabel;\n\n return (\n <Button\n slotName={slotName}\n type=\"submit\"\n className=\"w-full\"\n tabIndex={tabIndex}\n aria-label={pending ? pendingLabel : undefined}\n loading={pending}\n loadingLabel={pendingLabel}\n >\n {pending ? pendingLabel : (label ?? context.labels.submitLabel)}\n </Button>\n );\n}\n","import {\n LoginFormEmail,\n LoginFormPassword,\n LoginFormRemember,\n LoginFormRoot,\n LoginFormStatus,\n LoginFormSubmit,\n} from '@/blocks/login-form/parts';\nimport type {\n LoginFormErrors,\n LoginFormLabels,\n} from '@/blocks/login-form/types';\nimport type { LinkComponent, SlotNameProps, UrlLike } from '@/types';\n\nexport interface LoginFormPresetProps {\n errors?: LoginFormErrors;\n processing?: boolean;\n linkComponent?: LinkComponent;\n labels?: Partial<LoginFormLabels>;\n status?: string;\n forgotPasswordHref?: UrlLike;\n className?: string;\n}\n\nexport function LoginFormPreset({\n errors,\n processing,\n linkComponent,\n labels,\n status,\n forgotPasswordHref,\n className,\n slotName = 'login-form',\n}: LoginFormPresetProps & SlotNameProps) {\n return (\n <LoginFormRoot\n errors={errors}\n processing={processing}\n linkComponent={linkComponent}\n labels={labels}\n className={className}\n slotName={slotName}\n >\n <LoginFormStatus message={status} />\n <LoginFormEmail />\n <LoginFormPassword forgotPasswordHref={forgotPasswordHref} />\n <LoginFormRemember />\n <LoginFormSubmit />\n </LoginFormRoot>\n );\n}\n","import {\n LoginFormEmail,\n LoginFormPassword,\n LoginFormRemember,\n LoginFormRoot,\n LoginFormStatus,\n LoginFormSubmit,\n} from '@/blocks/login-form/parts';\n\nexport const LoginForm = {\n Root: LoginFormRoot,\n Status: LoginFormStatus,\n Email: LoginFormEmail,\n Password: LoginFormPassword,\n Remember: LoginFormRemember,\n Submit: LoginFormSubmit,\n};\n\nexport {\n LoginFormProvider,\n useLoginFormContext,\n type LoginFormContextValue,\n} from '@/blocks/login-form/context';\nexport {\n LoginFormEmail,\n LoginFormPassword,\n LoginFormRemember,\n LoginFormRoot,\n LoginFormStatus,\n LoginFormSubmit,\n type LoginFormEmailProps,\n type LoginFormPasswordProps,\n type LoginFormRememberProps,\n type LoginFormRootProps,\n type LoginFormStatusProps,\n type LoginFormSubmitProps,\n} from '@/blocks/login-form/parts';\nexport {\n LoginFormPreset,\n type LoginFormPresetProps,\n} from '@/blocks/login-form/preset';\nexport {\n fieldError,\n loginFormLabels,\n type LoginFormErrors,\n type LoginFormLabels,\n} from '@/blocks/login-form/types';\n","import type {\n TourBreakpoint,\n TourDefinition,\n TourStep,\n} from '@/blocks/tour/types';\n\nexport function stepsForBreakpoint(\n steps: TourStep[],\n breakpoint: TourBreakpoint,\n): TourStep[] {\n return steps.filter(\n (step) => !step.breakpoints || step.breakpoints.includes(breakpoint),\n );\n}\n\nexport function resolveSteps(\n steps: TourStep[],\n isPresent: (target: string) => boolean,\n): TourStep[] {\n return steps.filter((step) => isPresent(step.target));\n}\n\nexport function shouldStartTour(input: {\n definition: TourDefinition;\n seen: Record<string, number>;\n resolvedStepCount: number;\n force?: boolean;\n}): boolean {\n if (input.resolvedStepCount === 0) {\n return false;\n }\n\n if (input.force) {\n return true;\n }\n\n return input.definition.version > (input.seen[input.definition.id] ?? 0);\n}\n","export type TourBreakpoint = 'mobile' | 'desktop';\n\nexport type TourOutcome = 'completed' | 'skipped' | 'dismissed';\n\nexport interface TourStep {\n target: string;\n title: string;\n description: string;\n breakpoints?: TourBreakpoint[];\n}\n\nexport interface TourDefinition {\n id: string;\n version: number;\n steps: TourStep[];\n}\n\nexport interface TourProgress {\n tour: string;\n version: number;\n lastStep: number;\n outcome: TourOutcome;\n}\n\nexport interface TourLabels {\n next: string;\n previous: string;\n done: string;\n progress: string;\n}\n\nexport const DEFAULT_TOUR_LABELS: TourLabels = {\n next: 'Next',\n previous: 'Previous',\n done: 'Done',\n progress: '{{current}} of {{total}}',\n};\n","import { driver, type Driver } from 'driver.js';\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type PropsWithChildren,\n type ReactElement,\n} from 'react';\n\nimport 'driver.js/dist/driver.css';\n\nimport { shouldStartTour, stepsForBreakpoint } from '@/blocks/tour/gate';\nimport {\n DEFAULT_TOUR_LABELS,\n type TourBreakpoint,\n type TourDefinition,\n type TourLabels,\n type TourOutcome,\n type TourProgress,\n} from '@/blocks/tour/types';\nimport { useUiLabels } from '@/locales/context';\n\ninterface TourControllerValue {\n startTour: (\n definition: TourDefinition,\n options?: { force?: boolean },\n ) => void;\n}\n\nconst TourContext = createContext<TourControllerValue | null>(null);\n\nconst MOBILE_BREAKPOINT = 768;\n\nconst WAIT_FOR_TARGET = 4000;\n\nfunction currentBreakpoint(): TourBreakpoint {\n return window.innerWidth < MOBILE_BREAKPOINT ? 'mobile' : 'desktop';\n}\n\nfunction outcomeOf(instance: Driver, highlighted: boolean): TourOutcome {\n if (!highlighted) {\n return 'dismissed';\n }\n\n return instance.hasNextStep() ? 'skipped' : 'completed';\n}\n\nexport function TourProvider({\n children,\n seen,\n onProgress,\n labels,\n}: PropsWithChildren<{\n seen: Record<string, number>;\n onProgress: (progress: TourProgress) => void;\n labels?: Partial<TourLabels>;\n}>): ReactElement {\n const seenRef = useRef(seen);\n seenRef.current = seen;\n\n const onProgressRef = useRef(onProgress);\n onProgressRef.current = onProgress;\n\n const driverRef = useRef<Driver | null>(null);\n const activeRef = useRef<{\n definition: TourDefinition;\n lastStep: number;\n highlighted: boolean;\n } | null>(null);\n\n const { next, previous, done, progress } = useUiLabels(\n 'tour',\n DEFAULT_TOUR_LABELS,\n labels,\n );\n\n const report = useCallback((outcome: TourOutcome): void => {\n const active = activeRef.current;\n\n if (!active) {\n return;\n }\n\n activeRef.current = null;\n\n onProgressRef.current({\n tour: active.definition.id,\n version: active.definition.version,\n lastStep: active.lastStep,\n outcome,\n });\n }, []);\n\n const startTour = useCallback(\n (definition: TourDefinition, options?: { force?: boolean }): void => {\n const alreadyRunning =\n activeRef.current?.definition.id === definition.id;\n\n if (alreadyRunning && !options?.force) {\n return;\n }\n\n const steps = stepsForBreakpoint(\n definition.steps,\n currentBreakpoint(),\n );\n\n const allowed = shouldStartTour({\n definition,\n seen: seenRef.current,\n resolvedStepCount: steps.length,\n force: options?.force,\n });\n\n if (!allowed) {\n return;\n }\n\n driverRef.current?.destroy();\n activeRef.current = { definition, lastStep: 0, highlighted: false };\n\n const instance = driver({\n showProgress: true,\n progressText: progress,\n nextBtnText: next,\n prevBtnText: previous,\n doneBtnText: done,\n popoverClass: 'akira-tour',\n waitForElement: WAIT_FOR_TARGET,\n skipMissingElement: true,\n steps: steps.map((step) => ({\n element: step.target,\n popover: {\n title: step.title,\n description: step.description,\n },\n })),\n onHighlightStarted: () => {\n if (activeRef.current) {\n activeRef.current.lastStep =\n instance.getActiveIndex() ?? 0;\n activeRef.current.highlighted = true;\n }\n },\n onDestroyStarted: () => {\n report(\n outcomeOf(\n instance,\n activeRef.current?.highlighted ?? false,\n ),\n );\n instance.destroy();\n },\n });\n\n driverRef.current = instance;\n instance.drive();\n },\n [report, next, previous, done, progress],\n );\n\n useEffect(\n () => () => {\n report('dismissed');\n driverRef.current?.destroy();\n driverRef.current = null;\n },\n [report],\n );\n\n const value = useMemo(() => ({ startTour }), [startTour]);\n\n return (\n <TourContext.Provider value={value}>{children}</TourContext.Provider>\n );\n}\n\nexport function useTourController(): TourControllerValue {\n const context = useContext(TourContext);\n\n if (!context) {\n throw new Error(\n 'useTourController must be used inside a TourProvider.',\n );\n }\n\n return context;\n}\n\nexport function useTour(\n definition: TourDefinition,\n options?: { enabled?: boolean },\n): { restart: () => void } {\n const { startTour } = useTourController();\n const enabled = options?.enabled ?? true;\n\n const definitionRef = useRef(definition);\n definitionRef.current = definition;\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n const frame = window.requestAnimationFrame(() =>\n startTour(definitionRef.current),\n );\n\n return () => window.cancelAnimationFrame(frame);\n }, [definition.id, definition.version, enabled, startTour]);\n\n return { restart: () => startTour(definitionRef.current, { force: true }) };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,IAAM,kBAAmC;AAAA,EAC5C,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,iBAAiB;AACrB;AAIO,SAAS,WACZ,QACA,OACkB;AAClB,QAAM,QAAQ,OAAO,KAAK;AAE1B,MAAI,CAAC,OAAO;AACR,WAAO;AAAA,EACX;AAEA,QAAM,WAAW,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAEtD,SAAO,SAAS;AAAA,IACZ,CAAC,YAAY,OAAO,YAAY,YAAY,QAAQ,SAAS;AAAA,EACjE;AACJ;;;AChCA,SAAS,eAAe,kBAAkC;AAqClD;AA5BR,IAAM,mBAAmB,cAAqC;AAAA,EAC1D,QAAQ,CAAC;AAAA,EACT,YAAY;AAChB,CAAC;AAEM,SAAS,sBAEd;AACE,QAAM,UAAU,WAAW,gBAAgB;AAC3C,QAAM,SAAS,YAAY,aAAa,iBAAiB,QAAQ,MAAM;AAEvE,SAAO,EAAE,GAAG,SAAS,OAAO;AAChC;AAEO,SAAS,kBAAkB;AAAA,EAC9B,SAAS,CAAC;AAAA,EACV,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACJ,GAMG;AACC,SACI;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACG,OAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;ACTY,gBAAAA,MAoDJ,YApDI;AAhBL,SAAS,cAAc;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACf,GAAuC;AACnC,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA,0BAAAA,KAAC,SAAI,aAAW,UAAU,WAAW,GAAG,cAAc,SAAS,GAC1D,UACL;AAAA;AAAA,EACJ;AAER;AAMO,SAAS,gBAAgB;AAAA,EAC5B;AAAA,EACA,WAAW;AACf,GAAyC;AACrC,MAAI,CAAC,SAAS;AACV,WAAO;AAAA,EACX;AAEA,SACI,gBAAAA,KAAC,SAAM,UACH,0BAAAA,KAAC,oBAAkB,mBAAQ,GAC/B;AAER;AAaO,SAAS,eAAe;AAAA,EAC3B,KAAK;AAAA,EACL,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AACf,GAAwC;AACpC,QAAM,EAAE,QAAQ,OAAO,IAAI,oBAAoB;AAC/C,QAAM,UAAU,SAAS,WAAW,QAAQ,IAAI;AAEhD,SACI,qBAAC,SAAM,IAAQ,OAAO,SAAS,UAAoB,UAC/C;AAAA,oBAAAA,KAAC,cAAY,mBAAS,OAAO,YAAW;AAAA,IACxC,gBAAAA,KAAC,gBACG,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,cAAa;AAAA,QACb;AAAA,QACA,aAAa,eAAe,OAAO;AAAA;AAAA,IACvC,GACJ;AAAA,KACJ;AAER;AAgBO,SAAS,kBAAkB;AAAA,EAC9B,KAAK;AAAA,EACL,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACf,GAA2C;AACvC,QAAM,UAAU,oBAAoB;AACpC,QAAM,UAAU,SAAS,WAAW,QAAQ,QAAQ,IAAI;AACxD,QAAM,OAAO,YAAY,iBAAiB,QAAQ,aAAa;AAE/D,SACI,qBAAC,SAAM,IAAQ,OAAO,SAAS,UAAoB,UAC/C;AAAA,oBAAAA,KAAC,cAAY,mBAAS,QAAQ,OAAO,eAAc;AAAA,IACnD,gBAAAA,KAAC,gBACG,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAa;AAAA,QACb;AAAA,QACA,aACI,eAAe,QAAQ,OAAO;AAAA;AAAA,IAEtC,GACJ;AAAA,IACC,sBACG,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAM;AAAA,QACN,WAAU;AAAA,QAET,iCAAuB,QAAQ,OAAO;AAAA;AAAA,IAC3C;AAAA,KAER;AAER;AASO,SAAS,kBAAkB;AAAA,EAC9B,KAAK;AAAA,EACL,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,WAAW;AACf,GAA2C;AACvC,QAAM,EAAE,OAAO,IAAI,oBAAoB;AAEvC,SACI,qBAAC,SAAI,aAAW,UAAU,WAAU,2BAChC;AAAA,oBAAAA,KAAC,YAAS,IAAQ,MAAY,UAAoB;AAAA,IAClD,gBAAAA,KAAC,SAAM,SAAS,IAAK,mBAAS,OAAO,eAAc;AAAA,KACvD;AAER;AASO,SAAS,gBAAgB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACf,GAAyC;AACrC,QAAM,UAAU,oBAAoB;AACpC,QAAM,UAAU,cAAc,QAAQ;AACtC,QAAM,eAAe,mBAAmB,QAAQ,OAAO;AAEvD,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,MAAK;AAAA,MACL,WAAU;AAAA,MACV;AAAA,MACA,cAAY,UAAU,eAAe;AAAA,MACrC,SAAS;AAAA,MACT,cAAc;AAAA,MAEb,oBAAU,eAAgB,SAAS,QAAQ,OAAO;AAAA;AAAA,EACvD;AAER;;;AClMQ,SAQI,OAAAC,MARJ,QAAAC,aAAA;AAXD,SAAS,gBAAgB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACf,GAAyC;AACrC,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,wBAAAD,KAAC,mBAAgB,SAAS,QAAQ;AAAA,QAClC,gBAAAA,KAAC,kBAAe;AAAA,QAChB,gBAAAA,KAAC,qBAAkB,oBAAwC;AAAA,QAC3D,gBAAAA,KAAC,qBAAkB;AAAA,QACnB,gBAAAA,KAAC,mBAAgB;AAAA;AAAA;AAAA,EACrB;AAER;;;ACzCO,IAAM,YAAY;AAAA,EACrB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AACZ;;;ACVO,SAAS,mBACZ,OACA,YACU;AACV,SAAO,MAAM;AAAA,IACT,CAAC,SAAS,CAAC,KAAK,eAAe,KAAK,YAAY,SAAS,UAAU;AAAA,EACvE;AACJ;AAEO,SAAS,aACZ,OACA,WACU;AACV,SAAO,MAAM,OAAO,CAAC,SAAS,UAAU,KAAK,MAAM,CAAC;AACxD;AAEO,SAAS,gBAAgB,OAKpB;AACR,MAAI,MAAM,sBAAsB,GAAG;AAC/B,WAAO;AAAA,EACX;AAEA,MAAI,MAAM,OAAO;AACb,WAAO;AAAA,EACX;AAEA,SAAO,MAAM,WAAW,WAAW,MAAM,KAAK,MAAM,WAAW,EAAE,KAAK;AAC1E;;;ACNO,IAAM,sBAAkC;AAAA,EAC3C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,UAAU;AACd;;;ACpCA,SAAS,cAA2B;AACpC;AAAA,EACI,iBAAAE;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGG;AAEP,OAAO;AAoKC,gBAAAC,YAAA;AAhJR,IAAM,cAAcC,eAA0C,IAAI;AAElE,IAAM,oBAAoB;AAE1B,IAAM,kBAAkB;AAExB,SAAS,oBAAoC;AACzC,SAAO,OAAO,aAAa,oBAAoB,WAAW;AAC9D;AAEA,SAAS,UAAU,UAAkB,aAAmC;AACpE,MAAI,CAAC,aAAa;AACd,WAAO;AAAA,EACX;AAEA,SAAO,SAAS,YAAY,IAAI,YAAY;AAChD;AAEO,SAAS,aAAa;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAIkB;AACd,QAAM,UAAU,OAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,gBAAgB,OAAO,UAAU;AACvC,gBAAc,UAAU;AAExB,QAAM,YAAY,OAAsB,IAAI;AAC5C,QAAM,YAAY,OAIR,IAAI;AAEd,QAAM,EAAE,MAAM,UAAU,MAAM,SAAS,IAAI;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,SAAS,YAAY,CAAC,YAA+B;AACvD,UAAM,SAAS,UAAU;AAEzB,QAAI,CAAC,QAAQ;AACT;AAAA,IACJ;AAEA,cAAU,UAAU;AAEpB,kBAAc,QAAQ;AAAA,MAClB,MAAM,OAAO,WAAW;AAAA,MACxB,SAAS,OAAO,WAAW;AAAA,MAC3B,UAAU,OAAO;AAAA,MACjB;AAAA,IACJ,CAAC;AAAA,EACL,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY;AAAA,IACd,CAAC,YAA4B,YAAwC;AACjE,YAAM,iBACF,UAAU,SAAS,WAAW,OAAO,WAAW;AAEpD,UAAI,kBAAkB,CAAC,SAAS,OAAO;AACnC;AAAA,MACJ;AAEA,YAAM,QAAQ;AAAA,QACV,WAAW;AAAA,QACX,kBAAkB;AAAA,MACtB;AAEA,YAAM,UAAU,gBAAgB;AAAA,QAC5B;AAAA,QACA,MAAM,QAAQ;AAAA,QACd,mBAAmB,MAAM;AAAA,QACzB,OAAO,SAAS;AAAA,MACpB,CAAC;AAED,UAAI,CAAC,SAAS;AACV;AAAA,MACJ;AAEA,gBAAU,SAAS,QAAQ;AAC3B,gBAAU,UAAU,EAAE,YAAY,UAAU,GAAG,aAAa,MAAM;AAElE,YAAM,WAAW,OAAO;AAAA,QACpB,cAAc;AAAA,QACd,cAAc;AAAA,QACd,aAAa;AAAA,QACb,aAAa;AAAA,QACb,aAAa;AAAA,QACb,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,UACxB,SAAS,KAAK;AAAA,UACd,SAAS;AAAA,YACL,OAAO,KAAK;AAAA,YACZ,aAAa,KAAK;AAAA,UACtB;AAAA,QACJ,EAAE;AAAA,QACF,oBAAoB,MAAM;AACtB,cAAI,UAAU,SAAS;AACnB,sBAAU,QAAQ,WACd,SAAS,eAAe,KAAK;AACjC,sBAAU,QAAQ,cAAc;AAAA,UACpC;AAAA,QACJ;AAAA,QACA,kBAAkB,MAAM;AACpB;AAAA,YACI;AAAA,cACI;AAAA,cACA,UAAU,SAAS,eAAe;AAAA,YACtC;AAAA,UACJ;AACA,mBAAS,QAAQ;AAAA,QACrB;AAAA,MACJ,CAAC;AAED,gBAAU,UAAU;AACpB,eAAS,MAAM;AAAA,IACnB;AAAA,IACA,CAAC,QAAQ,MAAM,UAAU,MAAM,QAAQ;AAAA,EAC3C;AAEA;AAAA,IACI,MAAM,MAAM;AACR,aAAO,WAAW;AAClB,gBAAU,SAAS,QAAQ;AAC3B,gBAAU,UAAU;AAAA,IACxB;AAAA,IACA,CAAC,MAAM;AAAA,EACX;AAEA,QAAM,QAAQ,QAAQ,OAAO,EAAE,UAAU,IAAI,CAAC,SAAS,CAAC;AAExD,SACI,gBAAAD,KAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AAEtD;AAEO,SAAS,oBAAyC;AACrD,QAAM,UAAUE,YAAW,WAAW;AAEtC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI;AAAA,MACN;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAEO,SAAS,QACZ,YACA,SACuB;AACvB,QAAM,EAAE,UAAU,IAAI,kBAAkB;AACxC,QAAM,UAAU,SAAS,WAAW;AAEpC,QAAM,gBAAgB,OAAO,UAAU;AACvC,gBAAc,UAAU;AAExB,YAAU,MAAM;AACZ,QAAI,CAAC,SAAS;AACV;AAAA,IACJ;AAEA,UAAM,QAAQ,OAAO;AAAA,MAAsB,MACvC,UAAU,cAAc,OAAO;AAAA,IACnC;AAEA,WAAO,MAAM,OAAO,qBAAqB,KAAK;AAAA,EAClD,GAAG,CAAC,WAAW,IAAI,WAAW,SAAS,SAAS,SAAS,CAAC;AAE1D,SAAO,EAAE,SAAS,MAAM,UAAU,cAAc,SAAS,EAAE,OAAO,KAAK,CAAC,EAAE;AAC9E;","names":["jsx","jsx","jsxs","createContext","useContext","jsx","createContext","useContext"]}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useSheetPortalContainer
|
|
3
|
+
} from "./chunk-EXTOGROG.js";
|
|
1
4
|
import {
|
|
2
5
|
Input,
|
|
3
6
|
Separator
|
|
@@ -44,9 +47,11 @@ function DropdownMenuContent({
|
|
|
44
47
|
className,
|
|
45
48
|
sideOffset = 4,
|
|
46
49
|
slotName = "dropdown-menu-content",
|
|
50
|
+
container,
|
|
47
51
|
...props
|
|
48
52
|
}) {
|
|
49
|
-
|
|
53
|
+
const portalContainer = useSheetPortalContainer(container);
|
|
54
|
+
return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
|
|
50
55
|
DropdownMenuPrimitive.Content,
|
|
51
56
|
{
|
|
52
57
|
sideOffset,
|
|
@@ -665,9 +670,11 @@ function TooltipContent({
|
|
|
665
670
|
sideOffset = 4,
|
|
666
671
|
children,
|
|
667
672
|
slotName = "tooltip-content",
|
|
673
|
+
container,
|
|
668
674
|
...props
|
|
669
675
|
}) {
|
|
670
|
-
|
|
676
|
+
const portalContainer = useSheetPortalContainer(container);
|
|
677
|
+
return /* @__PURE__ */ jsx8(TooltipPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs4(
|
|
671
678
|
TooltipPrimitive.Content,
|
|
672
679
|
{
|
|
673
680
|
sideOffset,
|
|
@@ -1461,4 +1468,4 @@ export {
|
|
|
1461
1468
|
SidebarMenuSubItem,
|
|
1462
1469
|
SidebarMenuSubButton
|
|
1463
1470
|
};
|
|
1464
|
-
//# sourceMappingURL=chunk-
|
|
1471
|
+
//# sourceMappingURL=chunk-PYXUFFMO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/dropdown-menu.tsx","../src/components/ui/avatar.tsx","../src/components/ui/breadcrumb.tsx","../src/components/ui/collapsible.tsx","../src/components/ui/icon.tsx","../src/components/ui/sheet.tsx","../src/components/ui/skeleton.tsx","../src/components/ui/tooltip.tsx","../src/hooks/use-mobile.tsx","../src/components/ui/sidebar.tsx"],"sourcesContent":["import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { useSheetPortalContainer } from '@/hooks/use-sheet-portal-container';\nimport { menuSurface } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nfunction DropdownMenu({\n modal = false,\n slotName = 'dropdown-menu',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root> & SlotNameProps) {\n return (\n <DropdownMenuPrimitive.Root\n modal={modal}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction DropdownMenuPortal({\n slotName = 'dropdown-menu-portal',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal> & SlotNameProps) {\n return <DropdownMenuPrimitive.Portal {...props} data-slot={slotName} />;\n}\n\nfunction DropdownMenuTrigger({\n slotName = 'dropdown-menu-trigger',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger> & SlotNameProps) {\n return <DropdownMenuPrimitive.Trigger {...props} data-slot={slotName} />;\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n slotName = 'dropdown-menu-content',\n container,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content> &\n SlotNameProps & { container?: HTMLElement | null }) {\n const portalContainer = useSheetPortalContainer(container);\n\n return (\n <DropdownMenuPrimitive.Portal container={portalContainer}>\n <DropdownMenuPrimitive.Content\n sideOffset={sideOffset}\n className={cn(\n `${menuSurface} data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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 p-1.5 z-50 min-w-[8rem] overflow-hidden`,\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuGroup({\n slotName = 'dropdown-menu-group',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group> & SlotNameProps) {\n return <DropdownMenuPrimitive.Group {...props} data-slot={slotName} />;\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n slotName = 'dropdown-menu-item',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: 'default' | 'destructive';\n} & SlotNameProps) {\n return (\n <DropdownMenuPrimitive.Item\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"font-medium gap-2 rounded-xl px-2 py-2 text-sm data-[inset]:pl-8 [&_svg:not([class*='size-'])]:size-5 focus:font-semibold relative flex cursor-default items-center outline-hidden transition-all select-none focus:bg-primary/10 focus:text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:!text-destructive\",\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n slotName = 'dropdown-menu-checkbox-item',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> &\n SlotNameProps) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n className={cn(\n \"gap-2 py-1.5 pr-2 pl-8 text-sm [&_svg:not([class*='size-'])]:size-4 rounded-xl relative flex cursor-default items-center outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n checked={checked}\n {...props}\n data-slot={slotName}\n >\n <span className=\"left-2 size-3.5 pointer-events-none absolute flex items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuRadioGroup({\n slotName = 'dropdown-menu-radio-group',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup> &\n SlotNameProps) {\n return <DropdownMenuPrimitive.RadioGroup {...props} data-slot={slotName} />;\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n slotName = 'dropdown-menu-radio-item',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> &\n SlotNameProps) {\n return (\n <DropdownMenuPrimitive.RadioItem\n className={cn(\n \"gap-2 py-1.5 pr-2 pl-8 text-sm [&_svg:not([class*='size-'])]:size-4 rounded-xl relative flex cursor-default items-center outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n <span className=\"left-2 size-3.5 pointer-events-none absolute flex items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n slotName = 'dropdown-menu-label',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n} & SlotNameProps) {\n return (\n <DropdownMenuPrimitive.Label\n data-inset={inset}\n className={cn(\n 'px-2 py-2 text-xs font-medium tracking-wider data-[inset]:pl-8 text-muted-foreground uppercase',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction DropdownMenuSeparator({\n className,\n slotName = 'dropdown-menu-separator',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator> &\n SlotNameProps) {\n return (\n <DropdownMenuPrimitive.Separator\n className={cn('-mx-1 my-1 h-px bg-border', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction DropdownMenuShortcut({\n className,\n slotName = 'dropdown-menu-shortcut',\n ...props\n}: React.ComponentProps<'span'> & SlotNameProps) {\n return (\n <span\n className={cn(\n 'text-xs tracking-widest ml-auto text-muted-foreground',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction DropdownMenuSub({\n slotName = 'dropdown-menu-sub',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub> & SlotNameProps) {\n return <DropdownMenuPrimitive.Sub {...props} data-slot={slotName} />;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n slotName = 'dropdown-menu-sub-trigger',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n} & SlotNameProps) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-inset={inset}\n className={cn(\n 'font-medium rounded-xl px-2 py-2 text-sm data-[inset]:pl-8 focus:font-semibold data-[state=open]:font-semibold flex cursor-default items-center outline-hidden transition-all select-none focus:bg-primary/10 focus:text-primary data-[state=open]:bg-primary/10 data-[state=open]:text-primary',\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n {children}\n <ChevronRightIcon className=\"size-4 ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nfunction DropdownMenuSubContent({\n className,\n slotName = 'dropdown-menu-sub-content',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent> &\n SlotNameProps) {\n return (\n <DropdownMenuPrimitive.SubContent\n className={cn(\n `${menuSurface} data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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 p-1.5 z-50 min-w-[8rem] overflow-hidden`,\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n};\n","import * as AvatarPrimitive from '@radix-ui/react-avatar';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nfunction Avatar({\n className,\n slotName = 'avatar',\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root> & SlotNameProps) {\n return (\n <AvatarPrimitive.Root\n className={cn(\n 'size-8 relative flex shrink-0 overflow-hidden rounded-full',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction AvatarImage({\n className,\n slotName = 'avatar-image',\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image> & SlotNameProps) {\n return (\n <AvatarPrimitive.Image\n className={cn('aspect-square size-full', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction AvatarFallback({\n className,\n slotName = 'avatar-fallback',\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback> & SlotNameProps) {\n return (\n <AvatarPrimitive.Fallback\n className={cn(\n 'flex size-full items-center justify-center rounded-full bg-muted',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nexport { Avatar, AvatarFallback, AvatarImage };\n","import { Slot } from '@radix-ui/react-slot';\nimport { ChevronRight, MoreHorizontal } from 'lucide-react';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nfunction Breadcrumb({\n slotName = 'breadcrumb',\n ...props\n}: React.ComponentProps<'nav'> & SlotNameProps) {\n return <nav aria-label=\"breadcrumb\" {...props} data-slot={slotName} />;\n}\n\nfunction BreadcrumbList({\n className,\n slotName = 'breadcrumb-list',\n ...props\n}: React.ComponentProps<'ol'> & SlotNameProps) {\n return (\n <ol\n className={cn(\n 'gap-1.5 text-sm sm:gap-2.5 flex flex-wrap items-center break-words text-muted-foreground',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction BreadcrumbItem({\n className,\n slotName = 'breadcrumb-item',\n ...props\n}: React.ComponentProps<'li'> & SlotNameProps) {\n return (\n <li\n className={cn('gap-1.5 inline-flex items-center', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n slotName = 'breadcrumb-link',\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n} & SlotNameProps) {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n className={cn('transition-colors hover:text-foreground', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction BreadcrumbPage({\n className,\n slotName = 'breadcrumb-page',\n ...props\n}: React.ComponentProps<'span'> & SlotNameProps) {\n return (\n <span\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn('font-semibold text-foreground', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n slotName = 'breadcrumb-separator',\n ...props\n}: React.ComponentProps<'li'> & SlotNameProps) {\n return (\n <li\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn('[&>svg]:size-3.5', className)}\n {...props}\n data-slot={slotName}\n >\n {children ?? <ChevronRight />}\n </li>\n );\n}\n\nfunction BreadcrumbEllipsis({\n className,\n slotName = 'breadcrumb-ellipsis',\n ...props\n}: React.ComponentProps<'span'> & SlotNameProps) {\n return (\n <span\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n 'size-9 rounded-xl flex items-center justify-center',\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n <MoreHorizontal className=\"size-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n );\n}\n\nexport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n};\n","import type { SlotNameProps } from '@/types';\nimport * as CollapsiblePrimitive from '@radix-ui/react-collapsible';\n\nfunction Collapsible({\n slotName = 'collapsible',\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root> & SlotNameProps) {\n return <CollapsiblePrimitive.Root {...props} data-slot={slotName} />;\n}\n\nfunction CollapsibleTrigger({\n slotName = 'collapsible-trigger',\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger> &\n SlotNameProps) {\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction CollapsibleContent({\n slotName = 'collapsible-content',\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent> &\n SlotNameProps) {\n return (\n <CollapsiblePrimitive.CollapsibleContent\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nexport { Collapsible, CollapsibleContent, CollapsibleTrigger };\n","import type { IconComponent } from '@/types';\n\ninterface IconProps {\n iconNode?: IconComponent | null;\n className?: string;\n}\n\nexport function Icon({ iconNode: IconComponent, className }: IconProps) {\n if (!IconComponent) {\n return null;\n }\n\n return <IconComponent className={className} />;\n}\n","import * as SheetPrimitive from '@radix-ui/react-dialog';\nimport { XIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { floatingSurface, focusRing } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nfunction Sheet({\n preserveScroll = false,\n onOpenChange: onOpenChangeProp,\n slotName = 'sheet',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Root> & {\n preserveScroll?: boolean;\n} & SlotNameProps) {\n const scrollPosition = React.useRef(0);\n\n const onOpenChange = (open: boolean) => {\n if (preserveScroll) {\n if (open) {\n scrollPosition.current = window.scrollY;\n } else {\n setTimeout(() => {\n window.scrollTo(0, scrollPosition.current);\n }, 0);\n }\n }\n\n onOpenChangeProp?.(open);\n };\n\n return (\n <SheetPrimitive.Root\n {...props}\n onOpenChange={onOpenChange}\n data-slot={slotName}\n />\n );\n}\n\nfunction SheetTrigger({\n slotName = 'sheet-trigger',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger> & SlotNameProps) {\n return <SheetPrimitive.Trigger {...props} data-slot={slotName} />;\n}\n\nfunction SheetClose({\n slotName = 'sheet-close',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close> & SlotNameProps) {\n return <SheetPrimitive.Close {...props} data-slot={slotName} />;\n}\n\nfunction SheetPortal({\n slotName = 'sheet-portal',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal> & SlotNameProps) {\n return <SheetPrimitive.Portal {...props} data-slot={slotName} />;\n}\n\nfunction SheetOverlay({\n className,\n slotName = 'sheet-overlay',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay> & SlotNameProps) {\n return (\n <SheetPrimitive.Overlay\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 inset-0 bg-black/60 backdrop-blur-sm fixed z-50',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = 'right',\n slotName = 'sheet-content',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: 'top' | 'right' | 'bottom' | 'left';\n} & SlotNameProps) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n className={cn(\n `${floatingSurface} data-[state=open]:animate-in data-[state=closed]:animate-out gap-4 ease-in-out fixed z-50 flex flex-col transition data-[state=closed]:duration-300 data-[state=open]:duration-500`,\n side === 'right' &&\n 'data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 sm:max-w-sm rounded-l-3xl h-full w-3/4 border-l border-border',\n side === 'left' &&\n 'data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 sm:max-w-sm rounded-r-3xl h-full w-3/4 border-r border-border',\n side === 'top' &&\n 'data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 rounded-b-3xl h-auto border-b border-border',\n side === 'bottom' &&\n 'data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 rounded-t-3xl h-auto border-t border-border',\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n {children}\n <SheetPrimitive.Close\n className={cn(\n 'top-4 right-4 size-9 shadow-xs absolute flex items-center justify-center rounded-full border border-border bg-muted text-muted-foreground transition-colors hover:bg-accent hover:text-foreground disabled:pointer-events-none',\n focusRing,\n )}\n >\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({\n className,\n slotName = 'sheet-header',\n ...props\n}: React.ComponentProps<'div'> & SlotNameProps) {\n return (\n <div\n className={cn('gap-1.5 p-4 flex flex-col', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SheetFooter({\n className,\n slotName = 'sheet-footer',\n ...props\n}: React.ComponentProps<'div'> & SlotNameProps) {\n return (\n <div\n className={cn('gap-2 p-4 mt-auto flex flex-col', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SheetTitle({\n className,\n slotName = 'sheet-title',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title> & SlotNameProps) {\n return (\n <SheetPrimitive.Title\n className={cn('font-semibold text-foreground', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SheetDescription({\n className,\n slotName = 'sheet-description',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description> & SlotNameProps) {\n return (\n <SheetPrimitive.Description\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nexport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n};\n","import { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nfunction Skeleton({\n className,\n slotName = 'skeleton',\n ...props\n}: React.ComponentProps<'div'> & SlotNameProps) {\n return (\n <div\n className={cn('animate-pulse rounded-xl bg-muted', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nexport { Skeleton };\n","import * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport * as React from 'react';\n\nimport { useSheetPortalContainer } from '@/hooks/use-sheet-portal-container';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nfunction TooltipProvider({\n delayDuration = 0,\n slotName = 'tooltip-provider',\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider> & SlotNameProps) {\n return (\n <TooltipPrimitive.Provider\n delayDuration={delayDuration}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction Tooltip({\n slotName = 'tooltip',\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root> & SlotNameProps) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root {...props} data-slot={slotName} />\n </TooltipProvider>\n );\n}\n\nfunction TooltipTrigger({\n slotName = 'tooltip-trigger',\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger> & SlotNameProps) {\n return <TooltipPrimitive.Trigger {...props} data-slot={slotName} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 4,\n children,\n slotName = 'tooltip-content',\n container,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content> &\n SlotNameProps & { container?: HTMLElement | null }) {\n const portalContainer = useSheetPortalContainer(container);\n\n return (\n <TooltipPrimitive.Portal container={portalContainer}>\n <TooltipPrimitive.Content\n sideOffset={sideOffset}\n className={cn(\n '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 max-w-sm px-3 py-1.5 text-xs shadow-2xl rounded-xl z-50 bg-primary text-primary-foreground',\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"size-2.5 z-50 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-primary fill-primary\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","import { useEffect, useState } from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = useState<boolean>();\n\n useEffect(() => {\n const mql = window.matchMedia(\n `(max-width: ${MOBILE_BREAKPOINT - 1}px)`,\n );\n\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n\n mql.addEventListener('change', onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n return !!isMobile;\n}\n","import { Slot } from '@radix-ui/react-slot';\nimport { VariantProps, cva } from 'class-variance-authority';\nimport { PanelLeftIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Separator } from '@/components/ui/separator';\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from '@/components/ui/sheet';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/ui/tooltip';\nimport { useIsMobile } from '@/hooks/use-mobile';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state';\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\ntype SidebarContext = {\n state: 'expanded' | 'collapsed';\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContext | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n slotName = 'sidebar-wrapper',\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n} & SlotNameProps) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [setOpenProp, open],\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile\n ? setOpenMobile((open) => !open)\n : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue = React.useMemo<SidebarContext>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n ],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n 'group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar',\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n slotName = 'sidebar',\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n} & SlotNameProps) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === 'none') {\n return (\n <div\n className={cn(\n 'flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground',\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet\n open={openMobile}\n onOpenChange={setOpenMobile}\n {...props}\n preserveScroll\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>\n Displays the mobile sidebar.\n </SheetDescription>\n </SheetHeader>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-mobile=\"true\"\n className=\"p-0 w-(--sidebar-width) rounded-none bg-sidebar text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n slotName={slotName}\n >\n <div className=\"flex h-full w-full flex-col\">\n {children}\n </div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"group peer md:block hidden text-sidebar-foreground\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot={slotName}\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n className={cn(\n 'relative h-svh w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)',\n )}\n />\n <div\n className={cn(\n 'inset-y-0 md:flex fixed z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear',\n side === 'left'\n ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'\n : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\n // Adjust the padding for floating and inset variants.\n variant === 'floating' || variant === 'inset'\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n className=\"group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:rounded-2xl flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n slotName = 'sidebar-trigger',\n ...props\n}: React.ComponentProps<typeof Button> & SlotNameProps) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('h-7 w-7', className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n slotName={slotName}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({\n className,\n slotName = 'sidebar-rail',\n ...props\n}: React.ComponentProps<'button'> & SlotNameProps) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'inset-y-0 w-4 group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:inset-y-0 sm:flex absolute z-20 hidden -translate-x-1/2 transition-all ease-linear after:absolute after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border',\n 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarInset({\n className,\n slotName = 'sidebar-inset',\n ...props\n}: React.ComponentProps<'main'> & SlotNameProps) {\n return (\n <main\n className={cn(\n 'relative flex min-h-svh max-w-full flex-1 flex-col bg-background',\n 'peer-data-[variant=inset]:min-h-[calc(100svh-(--spacing(4)))] md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-0',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarInput({\n className,\n slotName = 'sidebar-input',\n ...props\n}: React.ComponentProps<typeof Input> & SlotNameProps) {\n return (\n <Input\n data-sidebar=\"input\"\n className={cn('h-11 w-full bg-background shadow-none', className)}\n {...props}\n slotName={slotName}\n />\n );\n}\n\nfunction SidebarHeader({\n className,\n slotName = 'sidebar-header',\n ...props\n}: React.ComponentProps<'div'> & SlotNameProps) {\n return (\n <div\n data-sidebar=\"header\"\n className={cn(\n 'gap-2 p-2 group-data-[collapsible=icon]:px-0 flex flex-col',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarFooter({\n className,\n slotName = 'sidebar-footer',\n ...props\n}: React.ComponentProps<'div'> & SlotNameProps) {\n return (\n <div\n data-sidebar=\"footer\"\n className={cn(\n 'gap-2 p-2 group-data-[collapsible=icon]:px-0 flex flex-col pb-[max(0.5rem,env(safe-area-inset-bottom))]',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarSeparator({\n className,\n slotName = 'sidebar-separator',\n ...props\n}: React.ComponentProps<typeof Separator> & SlotNameProps) {\n return (\n <Separator\n data-sidebar=\"separator\"\n className={cn('mx-2 w-auto bg-sidebar-border', className)}\n {...props}\n slotName={slotName}\n />\n );\n}\n\nfunction SidebarContent({\n className,\n slotName = 'sidebar-content',\n ...props\n}: React.ComponentProps<'div'> & SlotNameProps) {\n return (\n <div\n data-sidebar=\"content\"\n className={cn(\n 'min-h-0 gap-2 flex flex-1 flex-col overflow-auto group-data-[collapsible=icon]:overflow-hidden',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarGroup({\n className,\n slotName = 'sidebar-group',\n ...props\n}: React.ComponentProps<'div'> & SlotNameProps) {\n return (\n <div\n data-sidebar=\"group\"\n className={cn(\n 'min-w-0 p-2 group-data-[collapsible=icon]:px-0 relative flex w-full flex-col',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n slotName = 'sidebar-group-label',\n ...props\n}: React.ComponentProps<'div'> & { asChild?: boolean } & SlotNameProps) {\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n data-sidebar=\"group-label\"\n className={cn(\n 'h-8 rounded-xl px-2 text-xs font-medium tracking-wider [&>svg]:size-4 flex shrink-0 items-center text-sidebar-foreground/70 uppercase ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:outline-1 focus-visible:outline-offset-0 focus-visible:outline-ring focus-visible:outline-solid [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:pointer-events-none group-data-[collapsible=icon]:opacity-0 group-data-[collapsible=icon]:select-none',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n slotName = 'sidebar-group-action',\n ...props\n}: React.ComponentProps<'button'> & { asChild?: boolean } & SlotNameProps) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-sidebar=\"group-action\"\n className={cn(\n 'top-3.5 right-3 w-5 p-0 [&>svg]:size-4 rounded-xl absolute flex aspect-square items-center justify-center text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:outline-1 focus-visible:outline-offset-0 focus-visible:outline-ring focus-visible:outline-solid [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:-inset-2 md:after:hidden after:absolute',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarGroupContent({\n className,\n slotName = 'sidebar-group-content',\n ...props\n}: React.ComponentProps<'div'> & SlotNameProps) {\n return (\n <div\n data-sidebar=\"group-content\"\n className={cn('text-sm w-full', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarMenu({\n className,\n slotName = 'sidebar-menu',\n ...props\n}: React.ComponentProps<'ul'> & SlotNameProps) {\n return (\n <ul\n data-sidebar=\"menu\"\n className={cn(\n 'min-w-0 gap-1 flex w-full flex-col group-data-[collapsible=icon]:items-center',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarMenuItem({\n className,\n slotName = 'sidebar-menu-item',\n ...props\n}: React.ComponentProps<'li'> & SlotNameProps) {\n return (\n <li\n data-sidebar=\"menu-item\"\n className={cn('group/menu-item relative', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n 'peer/menu-button flex w-full items-center gap-3 overflow-hidden rounded-xl p-2.5 text-left text-sm font-medium outline-hidden ring-sidebar-ring transition-all hover:bg-accent hover:text-accent-foreground focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-offset-0 focus-visible:outline-ring active:scale-[0.98] disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-primary/10 data-[active=true]:font-semibold data-[active=true]:text-primary group-data-[collapsible=icon]:size-10! group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:gap-0 group-data-[collapsible=icon]:p-2.5! [&>span:last-child]:truncate group-data-[collapsible=icon]:[&>span:last-child]:hidden [&>svg]:size-5 [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n default:\n 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n outline:\n 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\n },\n size: {\n default: 'h-11 text-sm',\n sm: 'h-9 text-sm',\n lg: 'h-14 text-sm',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n slotName = 'sidebar-menu-button',\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants> &\n SlotNameProps) {\n const Comp = asChild ? Slot : 'button';\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n sidebarMenuButtonVariants({ variant, size }),\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== 'collapsed' || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n slotName = 'sidebar-menu-action',\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n} & SlotNameProps) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-sidebar=\"menu-action\"\n className={cn(\n 'top-1.5 right-1 w-5 p-0 [&>svg]:size-4 rounded-xl absolute flex aspect-square items-center justify-center text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform peer-hover/menu-button:text-sidebar-accent-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:outline-1 focus-visible:outline-offset-0 focus-visible:outline-ring focus-visible:outline-solid [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:-inset-2 md:after:hidden after:absolute',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'md:opacity-0 group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground data-[state=open]:opacity-100',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarMenuBadge({\n className,\n slotName = 'sidebar-menu-badge',\n ...props\n}: React.ComponentProps<'div'> & SlotNameProps) {\n return (\n <div\n data-sidebar=\"menu-badge\"\n className={cn(\n 'right-1 h-5 min-w-5 px-1 text-xs font-medium rounded-xl pointer-events-none absolute flex items-center justify-center text-sidebar-foreground tabular-nums select-none',\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n slotName = 'sidebar-menu-skeleton',\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n} & SlotNameProps) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-sidebar=\"menu-skeleton\"\n className={cn(\n 'h-8 gap-2 px-2 rounded-xl flex items-center',\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-xl\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({\n className,\n slotName = 'sidebar-menu-sub',\n ...props\n}: React.ComponentProps<'ul'> & SlotNameProps) {\n return (\n <ul\n data-sidebar=\"menu-sub\"\n className={cn(\n 'mx-3.5 min-w-0 gap-1 px-2.5 py-0.5 flex translate-x-px flex-col border-l border-sidebar-border',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarMenuSubItem({\n className,\n slotName = 'sidebar-menu-sub-item',\n ...props\n}: React.ComponentProps<'li'> & SlotNameProps) {\n return (\n <li\n data-sidebar=\"menu-sub-item\"\n className={cn('group/menu-sub-item relative', className)}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isActive = false,\n className,\n slotName = 'sidebar-menu-sub-button',\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n size?: 'sm' | 'md';\n isActive?: boolean;\n} & SlotNameProps) {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'h-9 min-w-0 gap-2 px-2 text-sm font-medium [&>svg]:size-4 rounded-xl flex -translate-x-px items-center overflow-hidden text-sidebar-foreground ring-sidebar-ring outline-hidden hover:bg-accent hover:text-accent-foreground focus-visible:outline-1 focus-visible:outline-offset-0 focus-visible:outline-ring focus-visible:outline-solid active:bg-accent disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:shrink-0 [&>svg]:text-current',\n 'data-[active=true]:font-semibold data-[active=true]:bg-primary/10 data-[active=true]:text-primary',\n size === 'sm' && 'h-9 text-sm',\n size === 'md' && 'h-9 text-sm',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n};\n"],"mappings":"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","names":["jsx","jsx","jsxs","jsx","CollapsibleTrigger","CollapsibleContent","jsx","jsx","jsxs","jsx","jsx","jsxs","Slot","React","jsx","jsxs","open","Slot"]}
|