@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.
Files changed (35) hide show
  1. package/dist/blocks.d.ts +6 -6
  2. package/dist/blocks.js +6 -3
  3. package/dist/blocks.js.map +1 -1
  4. package/dist/{chunk-XLAOE5MV.js → chunk-7DAA3DPJ.js} +11 -6
  5. package/dist/chunk-7DAA3DPJ.js.map +1 -0
  6. package/dist/chunk-EXTOGROG.js +42 -0
  7. package/dist/chunk-EXTOGROG.js.map +1 -0
  8. package/dist/{chunk-BR3JI3KN.js → chunk-L56VUE3E.js} +3 -2
  9. package/dist/chunk-L56VUE3E.js.map +1 -0
  10. package/dist/{chunk-ZQXZ4UGE.js → chunk-PYXUFFMO.js} +10 -3
  11. package/dist/chunk-PYXUFFMO.js.map +1 -0
  12. package/dist/{chunk-DPLCEU34.js → chunk-RE4M2G2Y.js} +76 -85
  13. package/dist/chunk-RE4M2G2Y.js.map +1 -0
  14. package/dist/{chunk-L2H5GIF7.js → chunk-VVBBKTC5.js} +6 -1
  15. package/dist/chunk-VVBBKTC5.js.map +1 -0
  16. package/dist/{context-2wTOwxCk.d.ts → context-CWkgje9v.d.ts} +3 -2
  17. package/dist/index.d.ts +23 -10
  18. package/dist/index.js +149 -116
  19. package/dist/index.js.map +1 -1
  20. package/dist/inertia.d.ts +1 -1
  21. package/dist/inertia.js +5 -4
  22. package/dist/inertia.js.map +1 -1
  23. package/dist/locales/fr.d.ts +2 -2
  24. package/dist/locales/pt.d.ts +2 -2
  25. package/dist/shells.d.ts +1 -1
  26. package/dist/shells.js +4 -3
  27. package/dist/shells.js.map +1 -1
  28. package/dist/{sidebar-BLL2tgTt.d.ts → sidebar-_xQ3IehY.d.ts} +3 -1
  29. package/dist/{types-1LUmNJf_.d.ts → types-DEJsTx8E.d.ts} +2 -1
  30. package/package.json +2 -1
  31. package/dist/chunk-BR3JI3KN.js.map +0 -1
  32. package/dist/chunk-DPLCEU34.js.map +0 -1
  33. package/dist/chunk-L2H5GIF7.js.map +0 -1
  34. package/dist/chunk-XLAOE5MV.js.map +0 -1
  35. 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-ZQXZ4UGE.js";
35
+ } from "./chunk-PYXUFFMO.js";
36
36
  import {
37
37
  hrefToString,
38
+ pathOfHref,
38
39
  resolveLink
39
- } from "./chunk-L2H5GIF7.js";
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
- return currentUrl.startsWith(hrefToString(item.href));
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 matches = currentUrl === href || currentUrl.startsWith(`${href}/`);
391
- if (matches && href.length > best.length) {
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-XLAOE5MV.js.map
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-L2H5GIF7.js";
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-BR3JI3KN.js.map
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":"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","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
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
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
- return /* @__PURE__ */ jsx8(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs4(
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-ZQXZ4UGE.js.map
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"]}