@vritti/quantum-ui 0.5.6 → 0.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ErrorBoundary.js +2 -2
- package/dist/ErrorBoundary.js.map +1 -1
- package/dist/Sidebar.js +8 -3
- package/dist/Sidebar.js.map +1 -1
- package/dist/lib/components/ErrorBoundary/ErrorBoundary.d.ts +5 -2
- package/dist/lib/components/ErrorBoundary/ErrorBoundary.d.ts.map +1 -1
- package/dist/lib/components/Sidebar/Sidebar.d.ts +4 -0
- package/dist/lib/components/Sidebar/Sidebar.d.ts.map +1 -1
- package/dist/lib/components/Sidebar/index.d.ts +1 -1
- package/dist/lib/components/Sidebar/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/ErrorBoundary.js
CHANGED
|
@@ -141,9 +141,9 @@ const QueryErrorFallback = ({ error, resetErrorBoundary }) => {
|
|
|
141
141
|
}
|
|
142
142
|
);
|
|
143
143
|
};
|
|
144
|
-
const QueryErrorBoundary = ({ children }) => {
|
|
144
|
+
const QueryErrorBoundary = ({ children, fallback }) => {
|
|
145
145
|
const { pathname } = useLocation();
|
|
146
|
-
return /* @__PURE__ */ jsx(QueryErrorResetBoundary, { children: ({ reset }) => /* @__PURE__ */ jsx(m, { onReset: reset, resetKeys: [pathname], FallbackComponent: QueryErrorFallback, children }) });
|
|
146
|
+
return /* @__PURE__ */ jsx(QueryErrorResetBoundary, { children: ({ reset }) => fallback === void 0 ? /* @__PURE__ */ jsx(m, { onReset: reset, resetKeys: [pathname], FallbackComponent: QueryErrorFallback, children }) : /* @__PURE__ */ jsx(m, { onReset: reset, resetKeys: [pathname], fallback, children }) });
|
|
147
147
|
};
|
|
148
148
|
|
|
149
149
|
export { ErrorPage as E, ForbiddenErrorPage as F, NetworkErrorPage as N, QueryErrorBoundary as Q, ServerErrorPage as S, UnauthorizedErrorPage as U, NotFoundErrorPage as a, QueryErrorFallback as b, UnknownErrorPage as c, getErrorPagePreset as g, resolveErrorScreen as r };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorBoundary.js","sources":["../lib/components/ErrorBoundary/ErrorPage.tsx","../lib/components/ErrorBoundary/ErrorBoundary.tsx"],"sourcesContent":["import { isAxiosError } from 'axios';\nimport { AlertCircle, LogOut, PackageX, ServerCrash, ShieldX, WifiOff } from 'lucide-react';\nimport type React from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Button, type ButtonProps } from '../Button';\n\nexport type ErrorScreenKey =\n | 'unauthorized'\n | 'forbidden'\n | 'notFound'\n | 'serverError'\n | 'networkError'\n | 'unknownError';\n\nexport interface ErrorPagePreset {\n icon: React.ElementType;\n iconWrapperClassName: string;\n iconClassName: string;\n title: string;\n description: string;\n showRetry: boolean;\n showGoBack: boolean;\n showLogin: boolean;\n}\n\nexport interface ErrorPageProps {\n preset: ErrorPagePreset;\n onRetry?: () => void;\n onGoBack?: () => void;\n onLogin?: () => void;\n retryLabel?: string;\n goBackLabel?: string;\n loginLabel?: string;\n retryVariant?: ButtonProps['variant'];\n goBackVariant?: ButtonProps['variant'];\n loginVariant?: ButtonProps['variant'];\n className?: string;\n}\n\nconst ERROR_PAGE_PRESETS: Record<ErrorScreenKey, ErrorPagePreset> = {\n unauthorized: {\n icon: LogOut,\n iconWrapperClassName: 'bg-destructive/15',\n iconClassName: 'text-destructive',\n title: 'Session Expired',\n description: 'Your session has expired. Please log in again.',\n showRetry: false,\n showGoBack: false,\n showLogin: true,\n },\n forbidden: {\n icon: ShieldX,\n iconWrapperClassName: 'bg-warning/15',\n iconClassName: 'text-warning',\n title: 'Access Denied',\n description: 'You do not have permission to view this resource.',\n showRetry: false,\n showGoBack: true,\n showLogin: false,\n },\n notFound: {\n icon: PackageX,\n iconWrapperClassName: 'bg-primary/10 ring-1 ring-primary/20',\n iconClassName: 'text-primary',\n title: 'Not Found',\n description: 'The resource you are looking for does not exist or has been moved.',\n showRetry: false,\n showGoBack: true,\n showLogin: false,\n },\n serverError: {\n icon: ServerCrash,\n iconWrapperClassName: 'bg-destructive/15',\n iconClassName: 'text-destructive',\n title: 'Something Went Wrong',\n description: 'An unexpected server error occurred. Please try again.',\n showRetry: true,\n showGoBack: true,\n showLogin: false,\n },\n networkError: {\n icon: WifiOff,\n iconWrapperClassName: 'bg-warning/15',\n iconClassName: 'text-warning',\n title: 'Network Error',\n description: 'Unable to reach the server. Please check your connection and try again.',\n showRetry: true,\n showGoBack: true,\n showLogin: false,\n },\n unknownError: {\n icon: AlertCircle,\n iconWrapperClassName: 'bg-destructive/15',\n iconClassName: 'text-destructive',\n title: 'Something Went Wrong',\n description: 'An unexpected error occurred.',\n showRetry: true,\n showGoBack: true,\n showLogin: false,\n },\n};\n\nexport function getErrorPagePreset(screen: ErrorScreenKey): ErrorPagePreset {\n return ERROR_PAGE_PRESETS[screen];\n}\n\nexport function resolveErrorScreen(error: unknown): ErrorScreenKey {\n if (isAxiosError(error)) {\n const status = error.response?.status;\n\n if (!error.response) return 'networkError';\n if (status === 401) return 'unauthorized';\n if (status === 403) return 'forbidden';\n if (status === 404) return 'notFound';\n if (status && status >= 500) return 'serverError';\n return 'unknownError';\n }\n\n if (error instanceof Error) {\n if (error.message === 'No valid session') return 'unauthorized';\n if (error.message.toLowerCase().includes('network')) return 'networkError';\n }\n\n return 'unknownError';\n}\n\nexport const ErrorPage = ({\n preset,\n onRetry,\n onGoBack,\n onLogin,\n retryLabel = 'Try Again',\n goBackLabel = 'Go Back',\n loginLabel = 'Log In',\n retryVariant = 'default',\n goBackVariant = 'outline',\n loginVariant = 'default',\n className,\n}: ErrorPageProps) => {\n const Icon = preset.icon;\n\n return (\n <div className={cn('flex min-h-[70vh] flex-col items-center justify-center gap-4 px-4', className)}>\n <div className={cn('flex items-center justify-center w-16 h-16 rounded-full', preset.iconWrapperClassName)}>\n <Icon className={cn('h-8 w-8', preset.iconClassName)} />\n </div>\n <div className=\"text-center space-y-1.5\">\n <h2 className=\"text-lg font-semibold\">{preset.title}</h2>\n <p className=\"text-sm text-muted-foreground max-w-md\">{preset.description}</p>\n </div>\n <div className=\"flex gap-2\">\n {preset.showGoBack && onGoBack && (\n <Button variant={goBackVariant} onClick={onGoBack}>\n {goBackLabel}\n </Button>\n )}\n {preset.showRetry && onRetry && (\n <Button variant={retryVariant} onClick={onRetry}>\n {retryLabel}\n </Button>\n )}\n {preset.showLogin && onLogin && (\n <Button variant={loginVariant} onClick={onLogin}>\n {loginLabel}\n </Button>\n )}\n </div>\n </div>\n );\n};\n\ntype ScreenProps = Omit<ErrorPageProps, 'preset'>;\n\nexport const UnauthorizedErrorPage = (props: ScreenProps) => (\n <ErrorPage preset={getErrorPagePreset('unauthorized')} {...props} />\n);\nexport const ForbiddenErrorPage = (props: ScreenProps) => (\n <ErrorPage preset={getErrorPagePreset('forbidden')} {...props} />\n);\nexport const NotFoundErrorPage = (props: ScreenProps) => (\n <ErrorPage preset={getErrorPagePreset('notFound')} {...props} />\n);\nexport const ServerErrorPage = (props: ScreenProps) => (\n <ErrorPage preset={getErrorPagePreset('serverError')} {...props} />\n);\nexport const NetworkErrorPage = (props: ScreenProps) => (\n <ErrorPage preset={getErrorPagePreset('networkError')} {...props} />\n);\nexport const UnknownErrorPage = (props: ScreenProps) => (\n <ErrorPage preset={getErrorPagePreset('unknownError')} {...props} />\n);\n","import { QueryErrorResetBoundary } from '@tanstack/react-query';\nimport type React from 'react';\nimport { ErrorBoundary, type FallbackProps } from 'react-error-boundary';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { clearToken } from '../../utils/axios';\nimport { ErrorPage, getErrorPagePreset, resolveErrorScreen } from './ErrorPage';\n\n// Renders status-specific error UI when a query throws\nexport const QueryErrorFallback = ({ error, resetErrorBoundary }: FallbackProps) => {\n const navigate = useNavigate();\n const screen = resolveErrorScreen(error);\n const preset = getErrorPagePreset(screen);\n\n return (\n <ErrorPage\n preset={preset}\n onGoBack={() => navigate(-1)}\n onRetry={resetErrorBoundary}\n onLogin={() => {\n clearToken();\n window.location.href = '/login';\n }}\n />\n );\n};\n\n// Catches query errors and renders status-specific fallback UI\nexport const QueryErrorBoundary = ({ children }: { children: React.ReactNode }) => {\n const { pathname } = useLocation();\n\n return (\n <QueryErrorResetBoundary>\n {({ reset }) => (\n <ErrorBoundary onReset={reset} resetKeys={[pathname]} FallbackComponent={QueryErrorFallback}>\n {children}\n </ErrorBoundary>\n )}\n </QueryErrorResetBoundary>\n );\n};\n"],"names":["AlertCircle","ErrorBoundary"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.js","sources":["../lib/components/ErrorBoundary/ErrorPage.tsx","../lib/components/ErrorBoundary/ErrorBoundary.tsx"],"sourcesContent":["import { isAxiosError } from 'axios';\nimport { AlertCircle, LogOut, PackageX, ServerCrash, ShieldX, WifiOff } from 'lucide-react';\nimport type React from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Button, type ButtonProps } from '../Button';\n\nexport type ErrorScreenKey =\n | 'unauthorized'\n | 'forbidden'\n | 'notFound'\n | 'serverError'\n | 'networkError'\n | 'unknownError';\n\nexport interface ErrorPagePreset {\n icon: React.ElementType;\n iconWrapperClassName: string;\n iconClassName: string;\n title: string;\n description: string;\n showRetry: boolean;\n showGoBack: boolean;\n showLogin: boolean;\n}\n\nexport interface ErrorPageProps {\n preset: ErrorPagePreset;\n onRetry?: () => void;\n onGoBack?: () => void;\n onLogin?: () => void;\n retryLabel?: string;\n goBackLabel?: string;\n loginLabel?: string;\n retryVariant?: ButtonProps['variant'];\n goBackVariant?: ButtonProps['variant'];\n loginVariant?: ButtonProps['variant'];\n className?: string;\n}\n\nconst ERROR_PAGE_PRESETS: Record<ErrorScreenKey, ErrorPagePreset> = {\n unauthorized: {\n icon: LogOut,\n iconWrapperClassName: 'bg-destructive/15',\n iconClassName: 'text-destructive',\n title: 'Session Expired',\n description: 'Your session has expired. Please log in again.',\n showRetry: false,\n showGoBack: false,\n showLogin: true,\n },\n forbidden: {\n icon: ShieldX,\n iconWrapperClassName: 'bg-warning/15',\n iconClassName: 'text-warning',\n title: 'Access Denied',\n description: 'You do not have permission to view this resource.',\n showRetry: false,\n showGoBack: true,\n showLogin: false,\n },\n notFound: {\n icon: PackageX,\n iconWrapperClassName: 'bg-primary/10 ring-1 ring-primary/20',\n iconClassName: 'text-primary',\n title: 'Not Found',\n description: 'The resource you are looking for does not exist or has been moved.',\n showRetry: false,\n showGoBack: true,\n showLogin: false,\n },\n serverError: {\n icon: ServerCrash,\n iconWrapperClassName: 'bg-destructive/15',\n iconClassName: 'text-destructive',\n title: 'Something Went Wrong',\n description: 'An unexpected server error occurred. Please try again.',\n showRetry: true,\n showGoBack: true,\n showLogin: false,\n },\n networkError: {\n icon: WifiOff,\n iconWrapperClassName: 'bg-warning/15',\n iconClassName: 'text-warning',\n title: 'Network Error',\n description: 'Unable to reach the server. Please check your connection and try again.',\n showRetry: true,\n showGoBack: true,\n showLogin: false,\n },\n unknownError: {\n icon: AlertCircle,\n iconWrapperClassName: 'bg-destructive/15',\n iconClassName: 'text-destructive',\n title: 'Something Went Wrong',\n description: 'An unexpected error occurred.',\n showRetry: true,\n showGoBack: true,\n showLogin: false,\n },\n};\n\nexport function getErrorPagePreset(screen: ErrorScreenKey): ErrorPagePreset {\n return ERROR_PAGE_PRESETS[screen];\n}\n\nexport function resolveErrorScreen(error: unknown): ErrorScreenKey {\n if (isAxiosError(error)) {\n const status = error.response?.status;\n\n if (!error.response) return 'networkError';\n if (status === 401) return 'unauthorized';\n if (status === 403) return 'forbidden';\n if (status === 404) return 'notFound';\n if (status && status >= 500) return 'serverError';\n return 'unknownError';\n }\n\n if (error instanceof Error) {\n if (error.message === 'No valid session') return 'unauthorized';\n if (error.message.toLowerCase().includes('network')) return 'networkError';\n }\n\n return 'unknownError';\n}\n\nexport const ErrorPage = ({\n preset,\n onRetry,\n onGoBack,\n onLogin,\n retryLabel = 'Try Again',\n goBackLabel = 'Go Back',\n loginLabel = 'Log In',\n retryVariant = 'default',\n goBackVariant = 'outline',\n loginVariant = 'default',\n className,\n}: ErrorPageProps) => {\n const Icon = preset.icon;\n\n return (\n <div className={cn('flex min-h-[70vh] flex-col items-center justify-center gap-4 px-4', className)}>\n <div className={cn('flex items-center justify-center w-16 h-16 rounded-full', preset.iconWrapperClassName)}>\n <Icon className={cn('h-8 w-8', preset.iconClassName)} />\n </div>\n <div className=\"text-center space-y-1.5\">\n <h2 className=\"text-lg font-semibold\">{preset.title}</h2>\n <p className=\"text-sm text-muted-foreground max-w-md\">{preset.description}</p>\n </div>\n <div className=\"flex gap-2\">\n {preset.showGoBack && onGoBack && (\n <Button variant={goBackVariant} onClick={onGoBack}>\n {goBackLabel}\n </Button>\n )}\n {preset.showRetry && onRetry && (\n <Button variant={retryVariant} onClick={onRetry}>\n {retryLabel}\n </Button>\n )}\n {preset.showLogin && onLogin && (\n <Button variant={loginVariant} onClick={onLogin}>\n {loginLabel}\n </Button>\n )}\n </div>\n </div>\n );\n};\n\ntype ScreenProps = Omit<ErrorPageProps, 'preset'>;\n\nexport const UnauthorizedErrorPage = (props: ScreenProps) => (\n <ErrorPage preset={getErrorPagePreset('unauthorized')} {...props} />\n);\nexport const ForbiddenErrorPage = (props: ScreenProps) => (\n <ErrorPage preset={getErrorPagePreset('forbidden')} {...props} />\n);\nexport const NotFoundErrorPage = (props: ScreenProps) => (\n <ErrorPage preset={getErrorPagePreset('notFound')} {...props} />\n);\nexport const ServerErrorPage = (props: ScreenProps) => (\n <ErrorPage preset={getErrorPagePreset('serverError')} {...props} />\n);\nexport const NetworkErrorPage = (props: ScreenProps) => (\n <ErrorPage preset={getErrorPagePreset('networkError')} {...props} />\n);\nexport const UnknownErrorPage = (props: ScreenProps) => (\n <ErrorPage preset={getErrorPagePreset('unknownError')} {...props} />\n);\n","import { QueryErrorResetBoundary } from '@tanstack/react-query';\nimport type React from 'react';\nimport { ErrorBoundary, type FallbackProps } from 'react-error-boundary';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { clearToken } from '../../utils/axios';\nimport { ErrorPage, getErrorPagePreset, resolveErrorScreen } from './ErrorPage';\n\n// Renders status-specific error UI when a query throws\nexport const QueryErrorFallback = ({ error, resetErrorBoundary }: FallbackProps) => {\n const navigate = useNavigate();\n const screen = resolveErrorScreen(error);\n const preset = getErrorPagePreset(screen);\n\n return (\n <ErrorPage\n preset={preset}\n onGoBack={() => navigate(-1)}\n onRetry={resetErrorBoundary}\n onLogin={() => {\n clearToken();\n window.location.href = '/login';\n }}\n />\n );\n};\n\ninterface QueryErrorBoundaryProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n}\n\n// Catches query errors and renders status-specific fallback UI, or the given fallback in its place\nexport const QueryErrorBoundary = ({ children, fallback }: QueryErrorBoundaryProps) => {\n const { pathname } = useLocation();\n\n return (\n <QueryErrorResetBoundary>\n {({ reset }) =>\n fallback === undefined ? (\n <ErrorBoundary onReset={reset} resetKeys={[pathname]} FallbackComponent={QueryErrorFallback}>\n {children}\n </ErrorBoundary>\n ) : (\n <ErrorBoundary onReset={reset} resetKeys={[pathname]} fallback={fallback}>\n {children}\n </ErrorBoundary>\n )\n }\n </QueryErrorResetBoundary>\n );\n};\n"],"names":["AlertCircle","ErrorBoundary"],"mappings":"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"}
|
package/dist/Sidebar.js
CHANGED
|
@@ -2,7 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { useLocation, useNavigate } from 'react-router-dom';
|
|
3
3
|
import { S as Slot } from './index10.js';
|
|
4
4
|
import { c as cva } from './index9.js';
|
|
5
|
-
import { forwardRef, useState, useCallback, useEffect, useMemo, useRef,
|
|
5
|
+
import { forwardRef, useState, useCallback, useEffect, useMemo, useRef, useContext, createContext } from 'react';
|
|
6
6
|
import { u as useIsMobile } from './useIsMobile.js';
|
|
7
7
|
import { c as cn } from './utils.js';
|
|
8
8
|
import { T as TooltipProvider, a as Tooltip, b as TooltipTrigger, c as TooltipContent } from './tooltip2.js';
|
|
@@ -560,10 +560,12 @@ const FlatItem = ({ item, pathname, navigate }) => /* @__PURE__ */ jsx(SidebarMe
|
|
|
560
560
|
]
|
|
561
561
|
}
|
|
562
562
|
) });
|
|
563
|
-
const Sidebar = ({ groups, topOffset = 14 }) => {
|
|
563
|
+
const Sidebar = ({ groups, footer, topOffset = 14 }) => {
|
|
564
564
|
const location = useLocation();
|
|
565
565
|
const navigate = useNavigate();
|
|
566
566
|
const { sidebarProps, controlProps } = useSidebarMode();
|
|
567
|
+
const { state, isMobile } = useSidebar();
|
|
568
|
+
const isCollapsed = state === "collapsed" && !isMobile;
|
|
567
569
|
return /* @__PURE__ */ jsxs(
|
|
568
570
|
Sidebar$1,
|
|
569
571
|
{
|
|
@@ -580,7 +582,10 @@ const Sidebar = ({ groups, topOffset = 14 }) => {
|
|
|
580
582
|
(item) => item.children ? /* @__PURE__ */ jsx(CollapsibleItem, { item, pathname: location.pathname, navigate }, item.title) : /* @__PURE__ */ jsx(FlatItem, { item, pathname: location.pathname, navigate }, item.title)
|
|
581
583
|
) }) })
|
|
582
584
|
] }, group.label)) }),
|
|
583
|
-
/* @__PURE__ */
|
|
585
|
+
/* @__PURE__ */ jsxs(SidebarFooter, { children: [
|
|
586
|
+
typeof footer === "function" ? footer({ isCollapsed }) : footer,
|
|
587
|
+
/* @__PURE__ */ jsx(SidebarControl, { ...controlProps })
|
|
588
|
+
] }),
|
|
584
589
|
/* @__PURE__ */ jsx(SidebarRail, {})
|
|
585
590
|
]
|
|
586
591
|
}
|
package/dist/Sidebar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.js","sources":["../shadcn/shadcnSheet/sheet.tsx","../shadcn/shadcnSidebar/sidebar.tsx","../lib/components/Sidebar/Sidebar.tsx"],"sourcesContent":["'use client';\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport type React from 'react';\nimport { forwardRef } from 'react';\nimport { cn } from '../utils';\n\nconst Sheet = DialogPrimitive.Root;\n\nconst SheetTrigger = DialogPrimitive.Trigger;\n\nconst SheetClose = DialogPrimitive.Close;\n\nconst SheetPortal = DialogPrimitive.Portal;\n\nconst SheetOverlay = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n ref={ref}\n />\n));\nSheetOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\ninterface SheetContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n side?: 'top' | 'right' | 'bottom' | 'left';\n}\n\nconst SheetContent = forwardRef<React.ElementRef<typeof DialogPrimitive.Content>, SheetContentProps>(\n ({ side = 'right', className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500',\n side === 'top' &&\n 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',\n side === 'bottom' &&\n 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',\n side === 'left' &&\n 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm',\n side === 'right' &&\n 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </SheetPortal>\n ),\n);\nSheetContent.displayName = DialogPrimitive.Content.displayName;\n\nconst SheetHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-2 text-center sm:text-left', className)} {...props} />\n);\nSheetHeader.displayName = 'SheetHeader';\n\nconst SheetFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} />\n);\nSheetFooter.displayName = 'SheetFooter';\n\nconst SheetTitle = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold text-foreground', className)} {...props} />\n));\nSheetTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst SheetDescription = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n));\nSheetDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n","'use client';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { PanelLeftIcon } from 'lucide-react';\nimport type React from 'react';\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useIsMobile } from '../../lib/hooks/useIsMobile';\nimport { Button } from '../shadcnButton';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from '../shadcnDropdownMenu';\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '../shadcnSheet';\nimport { Skeleton } from '../shadcnSkeleton';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../shadcnTooltip';\nimport { cn } from '../utils';\n\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3.5rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\ntype SidebarContextProps = {\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 = createContext<SidebarContextProps | null>(null);\n\n// Accesses sidebar state from the nearest SidebarProvider\nfunction useSidebar() {\n const context = useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n return context;\n}\n\n// Provides sidebar state and keyboard shortcut to all sidebar sub-components\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = useState(false);\n\n const [_open, _setOpen] = useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = 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 [setOpenProp, open],\n );\n\n const toggleSidebar = useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen]);\n\n // Keyboard shortcut to toggle sidebar (Cmd+B / Ctrl+B)\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue = useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, toggleSidebar],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\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('group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full', className)}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\n// Main sidebar container with responsive mobile Sheet and desktop fixed panel\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n overlay = false,\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n overlay?: boolean;\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === 'none') {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn('bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col', className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n data-overlay={overlay || undefined}\n >\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'relative bg-transparent transition-[width] duration-200 ease-linear',\n overlay\n ? 'w-(--sidebar-width-icon)'\n : cn(\n 'w-(--sidebar-width)',\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 />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex',\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 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 overlay && state === 'expanded' && 'z-30 shadow-xl',\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\n// Toggle button that calls toggleSidebar from context\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('size-7', className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\n// Invisible rail at sidebar edge for drag/click toggling\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex',\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 'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Main content area wrapper that adjusts for sidebar inset variant\nfunction SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n 'bg-background relative flex w-full flex-1 flex-col',\n '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-2',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Sticky header area at the top of the sidebar\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n );\n}\n\n// Sticky footer area at the bottom of the sidebar\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n );\n}\n\n// Scrollable content area between header and footer\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n 'flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Groups related menu items with an optional label\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn('relative flex w-full min-w-0 flex-col p-2', className)}\n {...props}\n />\n );\n}\n\n// Label for a sidebar group, hides when collapsed to icon mode\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'div'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n 'text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Action button positioned in the top-right of a sidebar group\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Content wrapper within a sidebar group\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn('w-full text-sm', className)}\n {...props}\n />\n );\n}\n\n// Unordered list container for sidebar menu items\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn('flex w-full min-w-0 flex-col gap-1', className)}\n {...props}\n />\n );\n}\n\n// List item wrapper for a single menu entry\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn('group/menu-item relative', className)}\n {...props}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding,background-color,color] duration-200 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground 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-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n default: '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-8 text-sm',\n sm: 'h-7 text-xs',\n lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\n// Interactive menu button with tooltip support in collapsed icon mode\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot : 'button';\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n const tooltipProps = typeof tooltip === 'string' ? { children: tooltip } : tooltip;\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" hidden={state !== 'collapsed' || isMobile} {...tooltipProps} />\n </Tooltip>\n );\n}\n\n// Action button overlaid on a menu item (e.g., \"more\" or \"add\" buttons)\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'after:absolute after:-inset-2 md:after:hidden',\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 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Badge positioned on a menu item (e.g., unread count)\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium 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 />\n );\n}\n\n// Skeleton loading placeholder for a menu item\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n const width = useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\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\n// Nested submenu list container\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n 'border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\n// List item wrapper within a submenu\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn('group/menu-sub-item relative', className)}\n {...props}\n />\n );\n}\n\n// Link/button within a submenu item\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n size?: 'sm' | 'md';\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\n size === 'sm' && 'text-xs',\n size === 'md' && 'text-sm',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\ntype SidebarMode = 'expanded' | 'collapsed' | 'hover';\n\nconst SIDEBAR_MODE_OPTIONS: { value: SidebarMode; label: string }[] = [\n { value: 'expanded', label: 'Expanded' },\n { value: 'collapsed', label: 'Collapsed' },\n { value: 'hover', label: 'Expand on hover' },\n];\n\n// Manages sidebar mode state with localStorage persistence and hover behavior\nfunction useSidebarMode(storageKey = 'sidebar-mode') {\n const { setOpen } = useSidebar();\n\n const [sidebarMode, setSidebarMode] = useState<SidebarMode>(() => {\n const stored = localStorage.getItem(storageKey);\n if (stored === 'expanded' || stored === 'collapsed' || stored === 'hover') return stored;\n return 'expanded';\n });\n\n // Stable ref to avoid re-triggering effect when setOpen identity changes\n const setOpenRef = useRef(setOpen);\n setOpenRef.current = setOpen;\n\n // Sync sidebar open/close when mode changes\n useEffect(() => {\n if (sidebarMode === 'expanded') {\n setOpenRef.current(true);\n } else {\n setOpenRef.current(false);\n }\n }, [sidebarMode]);\n\n function handleModeChange(mode: SidebarMode) {\n setSidebarMode(mode);\n localStorage.setItem(storageKey, mode);\n }\n\n function handleMouseEnter() {\n if (sidebarMode === 'hover') setOpen(true);\n }\n\n function handleMouseLeave() {\n if (sidebarMode === 'hover') setOpen(false);\n }\n\n return {\n sidebarMode,\n setSidebarMode: handleModeChange,\n sidebarProps: {\n overlay: sidebarMode === 'hover',\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n },\n controlProps: {\n sidebarMode,\n onSidebarModeChange: handleModeChange,\n },\n };\n}\n\n// Renders a dropdown menu for selecting the sidebar display mode\nconst SidebarControl = ({\n sidebarMode,\n onSidebarModeChange,\n}: {\n sidebarMode: SidebarMode;\n onSidebarModeChange: (mode: SidebarMode) => void;\n}) => {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton tooltip=\"Sidebar control\">\n <PanelLeftIcon />\n <span>Sidebar control</span>\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"top\" align=\"start\" sideOffset={8} className=\"w-48\">\n <DropdownMenuLabel className=\"text-xs font-normal text-muted-foreground\">Sidebar control</DropdownMenuLabel>\n {SIDEBAR_MODE_OPTIONS.map((option) => (\n <DropdownMenuItem key={option.value} onClick={() => onSidebarModeChange(option.value)} className=\"gap-2\">\n <span className=\"flex size-3.5 items-center justify-center\">\n {sidebarMode === option.value && <span className=\"size-1.5 rounded-full bg-foreground\" />}\n </span>\n {option.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n};\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarControl,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n sidebarMenuButtonVariants,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarTrigger,\n useSidebar,\n useSidebarMode,\n};\n\nexport type { SidebarMode };\n","import { ChevronRight } from 'lucide-react';\nimport type * as React from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport {\n Collapsible as ShadcnCollapsible,\n CollapsibleContent as ShadcnCollapsibleContent,\n CollapsibleTrigger as ShadcnCollapsibleTrigger,\n} from '../../../shadcn/shadcnCollapsible';\nimport {\n Sidebar as ShadcnSidebar,\n SidebarContent as ShadcnSidebarContent,\n SidebarControl as ShadcnSidebarControl,\n SidebarFooter as ShadcnSidebarFooter,\n SidebarGroup as ShadcnSidebarGroup,\n SidebarGroupContent as ShadcnSidebarGroupContent,\n SidebarGroupLabel as ShadcnSidebarGroupLabel,\n SidebarMenu as ShadcnSidebarMenu,\n SidebarMenuButton as ShadcnSidebarMenuButton,\n SidebarMenuItem as ShadcnSidebarMenuItem,\n SidebarMenuSub as ShadcnSidebarMenuSub,\n SidebarMenuSubButton as ShadcnSidebarMenuSubButton,\n SidebarMenuSubItem as ShadcnSidebarMenuSubItem,\n SidebarRail as ShadcnSidebarRail,\n useSidebarMode as shadcnUseSidebarMode,\n} from '../../../shadcn/shadcnSidebar';\n\nexport interface SidebarNavChild {\n title: string;\n path: string;\n}\n\nexport interface SidebarNavItem {\n title: string;\n icon: React.ComponentType<{ className?: string }>;\n path: string;\n children?: SidebarNavChild[];\n endAdornment?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface SidebarNavGroup {\n label: string;\n items: SidebarNavItem[];\n}\n\nexport interface SidebarProps {\n groups: SidebarNavGroup[];\n topOffset?: number;\n}\n\n// Renders a collapsible menu item with a submenu\nconst CollapsibleItem: React.FC<{\n item: SidebarNavItem;\n pathname: string;\n navigate: (path: string) => void;\n}> = ({ item, pathname, navigate }) => (\n <ShadcnCollapsible\n defaultOpen={item.children?.some((child) => pathname === child.path)}\n className=\"group/collapsible\"\n >\n <ShadcnSidebarMenuItem>\n <ShadcnCollapsibleTrigger asChild>\n <ShadcnSidebarMenuButton tooltip={item.title} isActive={pathname.startsWith(item.path)}>\n <item.icon />\n <span>{item.title}</span>\n <ChevronRight className=\"ml-auto size-4 transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90\" />\n </ShadcnSidebarMenuButton>\n </ShadcnCollapsibleTrigger>\n <ShadcnCollapsibleContent>\n <ShadcnSidebarMenuSub>\n {item.children?.map((child) => (\n <ShadcnSidebarMenuSubItem key={child.path}>\n <ShadcnSidebarMenuSubButton isActive={pathname === child.path} onClick={() => navigate(child.path)}>\n <span>{child.title}</span>\n </ShadcnSidebarMenuSubButton>\n </ShadcnSidebarMenuSubItem>\n ))}\n </ShadcnSidebarMenuSub>\n </ShadcnCollapsibleContent>\n </ShadcnSidebarMenuItem>\n </ShadcnCollapsible>\n);\n\n// Renders a flat menu item without children\nconst FlatItem: React.FC<{\n item: SidebarNavItem;\n pathname: string;\n navigate: (path: string) => void;\n}> = ({ item, pathname, navigate }) => (\n <ShadcnSidebarMenuItem>\n <ShadcnSidebarMenuButton\n tooltip={item.title}\n isActive={pathname === item.path || pathname.startsWith(`${item.path}/`)}\n onClick={() => (item.disabled ? undefined : navigate(item.path))}\n aria-disabled={item.disabled}\n className={item.disabled ? 'opacity-60' : undefined}\n >\n <item.icon />\n <span>{item.title}</span>\n {item.endAdornment && <span className=\"ml-auto flex items-center\">{item.endAdornment}</span>}\n </ShadcnSidebarMenuButton>\n </ShadcnSidebarMenuItem>\n);\n\n// Data-driven sidebar that renders grouped nav items with collapsible support\nexport const Sidebar: React.FC<SidebarProps> = ({ groups, topOffset = 14 }) => {\n const location = useLocation();\n const navigate = useNavigate();\n const { sidebarProps, controlProps } = shadcnUseSidebarMode();\n\n return (\n <ShadcnSidebar\n {...sidebarProps}\n collapsible=\"icon\"\n style={{\n top: `calc(var(--spacing) * ${topOffset})`,\n height: `calc(100svh - calc(var(--spacing) * ${topOffset}))`,\n }}\n >\n <ShadcnSidebarContent>\n {groups.map((group) => (\n <ShadcnSidebarGroup key={group.label}>\n <ShadcnSidebarGroupLabel className=\"group-data-[collapsible=icon]:mt-0\">\n {group.label}\n </ShadcnSidebarGroupLabel>\n <ShadcnSidebarGroupContent>\n <ShadcnSidebarMenu>\n {group.items.map((item) =>\n item.children ? (\n <CollapsibleItem key={item.title} item={item} pathname={location.pathname} navigate={navigate} />\n ) : (\n <FlatItem key={item.title} item={item} pathname={location.pathname} navigate={navigate} />\n ),\n )}\n </ShadcnSidebarMenu>\n </ShadcnSidebarGroupContent>\n </ShadcnSidebarGroup>\n ))}\n </ShadcnSidebarContent>\n\n <ShadcnSidebarFooter>\n <ShadcnSidebarControl {...controlProps} />\n </ShadcnSidebarFooter>\n\n <ShadcnSidebarRail />\n </ShadcnSidebar>\n );\n};\n\nSidebar.displayName = 'Sidebar';\n\n// Re-export layout primitives consumers need alongside the sidebar\nexport {\n SidebarInset,\n SidebarProvider,\n} from '../../../shadcn/shadcnSidebar';\n"],"names":["DialogPrimitive.Root","DialogPrimitive.Portal","DialogPrimitive.Overlay","DialogPrimitive.Content","DialogPrimitive.Close","DialogPrimitive.Title","DialogPrimitive.Description","open","Sidebar","PanelLeftIcon","ShadcnCollapsible","ShadcnSidebarMenuItem","ShadcnCollapsibleTrigger","ShadcnSidebarMenuButton","ShadcnCollapsibleContent","ShadcnSidebarMenuSub","ShadcnSidebarMenuSubItem","ShadcnSidebarMenuSubButton","shadcnUseSidebarMode","ShadcnSidebar","ShadcnSidebarContent","ShadcnSidebarGroup","ShadcnSidebarGroupLabel","ShadcnSidebarGroupContent","ShadcnSidebarMenu","ShadcnSidebarFooter","ShadcnSidebarControl","ShadcnSidebarRail"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Sidebar.js","sources":["../shadcn/shadcnSheet/sheet.tsx","../shadcn/shadcnSidebar/sidebar.tsx","../lib/components/Sidebar/Sidebar.tsx"],"sourcesContent":["'use client';\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport type React from 'react';\nimport { forwardRef } from 'react';\nimport { cn } from '../utils';\n\nconst Sheet = DialogPrimitive.Root;\n\nconst SheetTrigger = DialogPrimitive.Trigger;\n\nconst SheetClose = DialogPrimitive.Close;\n\nconst SheetPortal = DialogPrimitive.Portal;\n\nconst SheetOverlay = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n ref={ref}\n />\n));\nSheetOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\ninterface SheetContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n side?: 'top' | 'right' | 'bottom' | 'left';\n}\n\nconst SheetContent = forwardRef<React.ElementRef<typeof DialogPrimitive.Content>, SheetContentProps>(\n ({ side = 'right', className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500',\n side === 'top' &&\n 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',\n side === 'bottom' &&\n 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',\n side === 'left' &&\n 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm',\n side === 'right' &&\n 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </SheetPortal>\n ),\n);\nSheetContent.displayName = DialogPrimitive.Content.displayName;\n\nconst SheetHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-2 text-center sm:text-left', className)} {...props} />\n);\nSheetHeader.displayName = 'SheetHeader';\n\nconst SheetFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} />\n);\nSheetFooter.displayName = 'SheetFooter';\n\nconst SheetTitle = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold text-foreground', className)} {...props} />\n));\nSheetTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst SheetDescription = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n));\nSheetDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n","'use client';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { PanelLeftIcon } from 'lucide-react';\nimport type React from 'react';\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useIsMobile } from '../../lib/hooks/useIsMobile';\nimport { Button } from '../shadcnButton';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from '../shadcnDropdownMenu';\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '../shadcnSheet';\nimport { Skeleton } from '../shadcnSkeleton';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../shadcnTooltip';\nimport { cn } from '../utils';\n\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3.5rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\ntype SidebarContextProps = {\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 = createContext<SidebarContextProps | null>(null);\n\n// Accesses sidebar state from the nearest SidebarProvider\nfunction useSidebar() {\n const context = useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n return context;\n}\n\n// Provides sidebar state and keyboard shortcut to all sidebar sub-components\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = useState(false);\n\n const [_open, _setOpen] = useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = 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 [setOpenProp, open],\n );\n\n const toggleSidebar = useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen]);\n\n // Keyboard shortcut to toggle sidebar (Cmd+B / Ctrl+B)\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue = useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, toggleSidebar],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\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('group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full', className)}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\n// Main sidebar container with responsive mobile Sheet and desktop fixed panel\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n overlay = false,\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n overlay?: boolean;\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === 'none') {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn('bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col', className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n data-overlay={overlay || undefined}\n >\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'relative bg-transparent transition-[width] duration-200 ease-linear',\n overlay\n ? 'w-(--sidebar-width-icon)'\n : cn(\n 'w-(--sidebar-width)',\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 />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex',\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 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 overlay && state === 'expanded' && 'z-30 shadow-xl',\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\n// Toggle button that calls toggleSidebar from context\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('size-7', className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\n// Invisible rail at sidebar edge for drag/click toggling\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex',\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 'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Main content area wrapper that adjusts for sidebar inset variant\nfunction SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n 'bg-background relative flex w-full flex-1 flex-col',\n '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-2',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Sticky header area at the top of the sidebar\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n );\n}\n\n// Sticky footer area at the bottom of the sidebar\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n );\n}\n\n// Scrollable content area between header and footer\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n 'flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Groups related menu items with an optional label\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn('relative flex w-full min-w-0 flex-col p-2', className)}\n {...props}\n />\n );\n}\n\n// Label for a sidebar group, hides when collapsed to icon mode\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'div'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n 'text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Action button positioned in the top-right of a sidebar group\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Content wrapper within a sidebar group\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn('w-full text-sm', className)}\n {...props}\n />\n );\n}\n\n// Unordered list container for sidebar menu items\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn('flex w-full min-w-0 flex-col gap-1', className)}\n {...props}\n />\n );\n}\n\n// List item wrapper for a single menu entry\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn('group/menu-item relative', className)}\n {...props}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding,background-color,color] duration-200 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground 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-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n default: '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-8 text-sm',\n sm: 'h-7 text-xs',\n lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\n// Interactive menu button with tooltip support in collapsed icon mode\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot : 'button';\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n const tooltipProps = typeof tooltip === 'string' ? { children: tooltip } : tooltip;\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" hidden={state !== 'collapsed' || isMobile} {...tooltipProps} />\n </Tooltip>\n );\n}\n\n// Action button overlaid on a menu item (e.g., \"more\" or \"add\" buttons)\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'after:absolute after:-inset-2 md:after:hidden',\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 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Badge positioned on a menu item (e.g., unread count)\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium 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 />\n );\n}\n\n// Skeleton loading placeholder for a menu item\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n const width = useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\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\n// Nested submenu list container\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n 'border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\n// List item wrapper within a submenu\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn('group/menu-sub-item relative', className)}\n {...props}\n />\n );\n}\n\n// Link/button within a submenu item\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n size?: 'sm' | 'md';\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\n size === 'sm' && 'text-xs',\n size === 'md' && 'text-sm',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\ntype SidebarMode = 'expanded' | 'collapsed' | 'hover';\n\nconst SIDEBAR_MODE_OPTIONS: { value: SidebarMode; label: string }[] = [\n { value: 'expanded', label: 'Expanded' },\n { value: 'collapsed', label: 'Collapsed' },\n { value: 'hover', label: 'Expand on hover' },\n];\n\n// Manages sidebar mode state with localStorage persistence and hover behavior\nfunction useSidebarMode(storageKey = 'sidebar-mode') {\n const { setOpen } = useSidebar();\n\n const [sidebarMode, setSidebarMode] = useState<SidebarMode>(() => {\n const stored = localStorage.getItem(storageKey);\n if (stored === 'expanded' || stored === 'collapsed' || stored === 'hover') return stored;\n return 'expanded';\n });\n\n // Stable ref to avoid re-triggering effect when setOpen identity changes\n const setOpenRef = useRef(setOpen);\n setOpenRef.current = setOpen;\n\n // Sync sidebar open/close when mode changes\n useEffect(() => {\n if (sidebarMode === 'expanded') {\n setOpenRef.current(true);\n } else {\n setOpenRef.current(false);\n }\n }, [sidebarMode]);\n\n function handleModeChange(mode: SidebarMode) {\n setSidebarMode(mode);\n localStorage.setItem(storageKey, mode);\n }\n\n function handleMouseEnter() {\n if (sidebarMode === 'hover') setOpen(true);\n }\n\n function handleMouseLeave() {\n if (sidebarMode === 'hover') setOpen(false);\n }\n\n return {\n sidebarMode,\n setSidebarMode: handleModeChange,\n sidebarProps: {\n overlay: sidebarMode === 'hover',\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n },\n controlProps: {\n sidebarMode,\n onSidebarModeChange: handleModeChange,\n },\n };\n}\n\n// Renders a dropdown menu for selecting the sidebar display mode\nconst SidebarControl = ({\n sidebarMode,\n onSidebarModeChange,\n}: {\n sidebarMode: SidebarMode;\n onSidebarModeChange: (mode: SidebarMode) => void;\n}) => {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton tooltip=\"Sidebar control\">\n <PanelLeftIcon />\n <span>Sidebar control</span>\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"top\" align=\"start\" sideOffset={8} className=\"w-48\">\n <DropdownMenuLabel className=\"text-xs font-normal text-muted-foreground\">Sidebar control</DropdownMenuLabel>\n {SIDEBAR_MODE_OPTIONS.map((option) => (\n <DropdownMenuItem key={option.value} onClick={() => onSidebarModeChange(option.value)} className=\"gap-2\">\n <span className=\"flex size-3.5 items-center justify-center\">\n {sidebarMode === option.value && <span className=\"size-1.5 rounded-full bg-foreground\" />}\n </span>\n {option.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n};\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarControl,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n sidebarMenuButtonVariants,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarTrigger,\n useSidebar,\n useSidebarMode,\n};\n\nexport type { SidebarMode };\n","import { ChevronRight } from 'lucide-react';\nimport type * as React from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport {\n Collapsible as ShadcnCollapsible,\n CollapsibleContent as ShadcnCollapsibleContent,\n CollapsibleTrigger as ShadcnCollapsibleTrigger,\n} from '../../../shadcn/shadcnCollapsible';\nimport {\n Sidebar as ShadcnSidebar,\n SidebarContent as ShadcnSidebarContent,\n SidebarControl as ShadcnSidebarControl,\n SidebarFooter as ShadcnSidebarFooter,\n SidebarGroup as ShadcnSidebarGroup,\n SidebarGroupContent as ShadcnSidebarGroupContent,\n SidebarGroupLabel as ShadcnSidebarGroupLabel,\n SidebarMenu as ShadcnSidebarMenu,\n SidebarMenuButton as ShadcnSidebarMenuButton,\n SidebarMenuItem as ShadcnSidebarMenuItem,\n SidebarMenuSub as ShadcnSidebarMenuSub,\n SidebarMenuSubButton as ShadcnSidebarMenuSubButton,\n SidebarMenuSubItem as ShadcnSidebarMenuSubItem,\n SidebarRail as ShadcnSidebarRail,\n useSidebar as shadcnUseSidebar,\n useSidebarMode as shadcnUseSidebarMode,\n} from '../../../shadcn/shadcnSidebar';\n\nexport interface SidebarNavChild {\n title: string;\n path: string;\n}\n\nexport interface SidebarNavItem {\n title: string;\n icon: React.ComponentType<{ className?: string }>;\n path: string;\n children?: SidebarNavChild[];\n endAdornment?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface SidebarNavGroup {\n label: string;\n items: SidebarNavItem[];\n}\n\nexport interface SidebarFooterState {\n isCollapsed: boolean;\n}\n\nexport interface SidebarProps {\n groups: SidebarNavGroup[];\n footer?: React.ReactNode | ((state: SidebarFooterState) => React.ReactNode);\n topOffset?: number;\n}\n\n// Renders a collapsible menu item with a submenu\nconst CollapsibleItem: React.FC<{\n item: SidebarNavItem;\n pathname: string;\n navigate: (path: string) => void;\n}> = ({ item, pathname, navigate }) => (\n <ShadcnCollapsible\n defaultOpen={item.children?.some((child) => pathname === child.path)}\n className=\"group/collapsible\"\n >\n <ShadcnSidebarMenuItem>\n <ShadcnCollapsibleTrigger asChild>\n <ShadcnSidebarMenuButton tooltip={item.title} isActive={pathname.startsWith(item.path)}>\n <item.icon />\n <span>{item.title}</span>\n <ChevronRight className=\"ml-auto size-4 transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90\" />\n </ShadcnSidebarMenuButton>\n </ShadcnCollapsibleTrigger>\n <ShadcnCollapsibleContent>\n <ShadcnSidebarMenuSub>\n {item.children?.map((child) => (\n <ShadcnSidebarMenuSubItem key={child.path}>\n <ShadcnSidebarMenuSubButton isActive={pathname === child.path} onClick={() => navigate(child.path)}>\n <span>{child.title}</span>\n </ShadcnSidebarMenuSubButton>\n </ShadcnSidebarMenuSubItem>\n ))}\n </ShadcnSidebarMenuSub>\n </ShadcnCollapsibleContent>\n </ShadcnSidebarMenuItem>\n </ShadcnCollapsible>\n);\n\n// Renders a flat menu item without children\nconst FlatItem: React.FC<{\n item: SidebarNavItem;\n pathname: string;\n navigate: (path: string) => void;\n}> = ({ item, pathname, navigate }) => (\n <ShadcnSidebarMenuItem>\n <ShadcnSidebarMenuButton\n tooltip={item.title}\n isActive={pathname === item.path || pathname.startsWith(`${item.path}/`)}\n onClick={() => (item.disabled ? undefined : navigate(item.path))}\n aria-disabled={item.disabled}\n className={item.disabled ? 'opacity-60' : undefined}\n >\n <item.icon />\n <span>{item.title}</span>\n {item.endAdornment && <span className=\"ml-auto flex items-center\">{item.endAdornment}</span>}\n </ShadcnSidebarMenuButton>\n </ShadcnSidebarMenuItem>\n);\n\n// Data-driven sidebar that renders grouped nav items with collapsible support\nexport const Sidebar: React.FC<SidebarProps> = ({ groups, footer, topOffset = 14 }) => {\n const location = useLocation();\n const navigate = useNavigate();\n const { sidebarProps, controlProps } = shadcnUseSidebarMode();\n const { state, isMobile } = shadcnUseSidebar();\n const isCollapsed = state === 'collapsed' && !isMobile;\n\n return (\n <ShadcnSidebar\n {...sidebarProps}\n collapsible=\"icon\"\n style={{\n top: `calc(var(--spacing) * ${topOffset})`,\n height: `calc(100svh - calc(var(--spacing) * ${topOffset}))`,\n }}\n >\n <ShadcnSidebarContent>\n {groups.map((group) => (\n <ShadcnSidebarGroup key={group.label}>\n <ShadcnSidebarGroupLabel className=\"group-data-[collapsible=icon]:mt-0\">\n {group.label}\n </ShadcnSidebarGroupLabel>\n <ShadcnSidebarGroupContent>\n <ShadcnSidebarMenu>\n {group.items.map((item) =>\n item.children ? (\n <CollapsibleItem key={item.title} item={item} pathname={location.pathname} navigate={navigate} />\n ) : (\n <FlatItem key={item.title} item={item} pathname={location.pathname} navigate={navigate} />\n ),\n )}\n </ShadcnSidebarMenu>\n </ShadcnSidebarGroupContent>\n </ShadcnSidebarGroup>\n ))}\n </ShadcnSidebarContent>\n\n <ShadcnSidebarFooter>\n {typeof footer === 'function' ? footer({ isCollapsed }) : footer}\n <ShadcnSidebarControl {...controlProps} />\n </ShadcnSidebarFooter>\n\n <ShadcnSidebarRail />\n </ShadcnSidebar>\n );\n};\n\nSidebar.displayName = 'Sidebar';\n\n// Re-export layout primitives consumers need alongside the sidebar\nexport {\n SidebarInset,\n SidebarProvider,\n} from '../../../shadcn/shadcnSidebar';\n"],"names":["DialogPrimitive.Root","DialogPrimitive.Portal","DialogPrimitive.Overlay","DialogPrimitive.Content","DialogPrimitive.Close","DialogPrimitive.Title","DialogPrimitive.Description","open","Sidebar","PanelLeftIcon","ShadcnCollapsible","ShadcnSidebarMenuItem","ShadcnCollapsibleTrigger","ShadcnSidebarMenuButton","ShadcnCollapsibleContent","ShadcnSidebarMenuSub","ShadcnSidebarMenuSubItem","ShadcnSidebarMenuSubButton","shadcnUseSidebarMode","shadcnUseSidebar","ShadcnSidebar","ShadcnSidebarContent","ShadcnSidebarGroup","ShadcnSidebarGroupLabel","ShadcnSidebarGroupContent","ShadcnSidebarMenu","ShadcnSidebarFooter","ShadcnSidebarControl","ShadcnSidebarRail"],"mappings":";;;;;;;;;;;;;;;AAQA,MAAM,QAAQA,IAAgB;AAM9B,MAAM,cAAcC,MAAgB;AAEpC,MAAM,YAAA,GAAe,WAGnB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAACC,OAAgB;AAAA,EAAhB;AAAA,IACC,SAAA,EAAW,EAAA;AAAA,MACT,wJAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG,KAAA;AAAA,IACJ;AAAA;AACF,CACD,CAAA;AACD,YAAA,CAAa,WAAA,GAAcA,OAAgB,CAAQ,WAAA;AAMnD,MAAM,YAAA,GAAe,UAAA;AAAA,EACnB,CAAC,EAAE,IAAA,GAAO,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,qBAClD,IAAA,CAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,oBACd,IAAA;AAAA,MAACC,OAAgB;AAAA,MAAhB;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,kMAAA;AAAA,UACA,SAAS,KAAA,IACP,mGAAA;AAAA,UACF,SAAS,QAAA,IACP,4GAAA;AAAA,UACF,SAAS,MAAA,IACP,+HAAA;AAAA,UACF,SAAS,OAAA,IACP,kIAAA;AAAA,UACF;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,0BACD,IAAA,CAACC,KAAgB,EAAhB,EAAsB,WAAU,+QAAA,EAC/B,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,CAAA,EAAA,EAAE,WAAU,SAAA,EAAU,CAAA;AAAA,4BACvB,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,OAAA,EAAK;AAAA,WAAA,EACjC;AAAA;AAAA;AAAA;AACF,GAAA,EACF;AAEJ,CAAA;AACA,YAAA,CAAa,WAAA,GAAcD,OAAgB,CAAQ,WAAA;AAEnD,MAAM,WAAA,GAAc,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,EAAM,qBACzC,GAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,kDAAA,EAAoD,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAEhG,WAAA,CAAY,WAAA,GAAc,aAAA;AAO1B,MAAM,UAAA,GAAa,WAGjB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA,CAACE,KAAgB,EAAhB,EAAsB,KAAU,SAAA,EAAW,EAAA,CAAG,yCAAyC,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAChH,CAAA;AACD,UAAA,CAAW,WAAA,GAAcA,KAAgB,CAAM,WAAA;AAE/C,MAAM,gBAAA,GAAmB,WAGvB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA,CAACC,WAAgB,EAAhB,EAA4B,KAAU,SAAA,EAAW,EAAA,CAAG,iCAAiC,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAC9G,CAAA;AACD,gBAAA,CAAiB,WAAA,GAAcA,WAAgB,CAAY,WAAA;;ACpE3D,MAAM,aAAA,GAAgB,OAAA;AACtB,MAAM,oBAAA,GAAuB,OAAA;AAC7B,MAAM,kBAAA,GAAqB,QAAA;AAC3B,MAAM,yBAAA,GAA4B,GAAA;AAYlC,MAAM,cAAA,GAAiB,cAA0C,IAAI,CAAA;AAGrE,SAAS,UAAA,GAAa;AACpB,EAAA,MAAM,OAAA,GAAU,WAAW,cAAc,CAAA;AACzC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,OAAA;AACT;AAGA,SAAS,eAAA,CAAgB;AAAA,EACvB,WAAA,GAAc,IAAA;AAAA,EACd,IAAA,EAAM,QAAA;AAAA,EACN,YAAA,EAAc,WAAA;AAAA,EACd,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAIG;AACD,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,WAAW,CAAA;AAC9C,EAAA,MAAM,OAAO,QAAA,IAAY,KAAA;AACzB,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAAC,KAAA,KAAmD;AAClD,MAAA,MAAM,YAAY,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AAC9D,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,CAAY,SAAS,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,SAAS,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAa,IAAI;AAAA,GACpB;AAEA,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,OAAO,QAAA,GAAW,aAAA,CAAc,CAACC,KAAAA,KAAS,CAACA,KAAI,CAAA,GAAI,OAAA,CAAQ,CAACA,KAAAA,KAAS,CAACA,KAAI,CAAA;AAAA,EAC5E,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAGtB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyB;AAC9C,MAAA,IAAI,MAAM,GAAA,KAAQ,yBAAA,KAA8B,KAAA,CAAM,OAAA,IAAW,MAAM,OAAA,CAAA,EAAU;AAC/E,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,aAAA,EAAc;AAAA,MAChB;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAChD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,GAAa,WAAA;AAElC,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,OAAO;AAAA,MACL,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,YAAY,aAAa;AAAA,GAC5D;AAEA,EAAA,uBACE,GAAA,CAAC,eAAe,QAAA,EAAf,EAAwB,OAAO,YAAA,EAC9B,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,aAAA,EAAe,CAAA,EAC9B,QAAA,kBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,KAAA,EACE;AAAA,QACE,iBAAA,EAAmB,aAAA;AAAA,QACnB,sBAAA,EAAwB,kBAAA;AAAA,QACxB,GAAG;AAAA,OACL;AAAA,MAEF,SAAA,EAAW,EAAA,CAAG,iFAAA,EAAmF,SAAS,CAAA;AAAA,MACzG,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,KAEL,CAAA,EACF,CAAA;AAEJ;AAGA,SAASC,SAAA,CAAQ;AAAA,EACf,IAAA,GAAO,MAAA;AAAA,EACP,OAAA,GAAU,SAAA;AAAA,EACV,WAAA,GAAc,WAAA;AAAA,EACd,OAAA,GAAU,KAAA;AAAA,EACV,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAKG;AACD,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,aAAA,KAAkB,UAAA,EAAW;AAElE,EAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,SAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,6EAAA,EAA+E,SAAS,CAAA;AAAA,QACrG,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,2BACG,KAAA,EAAA,EAAM,IAAA,EAAM,YAAY,YAAA,EAAc,aAAA,EAAgB,GAAG,KAAA,EACxD,QAAA,kBAAA,IAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,cAAA,EAAa,SAAA;AAAA,QACb,WAAA,EAAU,SAAA;AAAA,QACV,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAU,8EAAA;AAAA,QACV,KAAA,EACE;AAAA,UACE,iBAAA,EAAmB;AAAA,SACrB;AAAA,QAEF,IAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,WAAA,EAAA,EAAY,WAAU,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,cAAW,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BACnB,GAAA,CAAC,oBAAiB,QAAA,EAAA,8BAAA,EAA4B;AAAA,WAAA,EAChD,CAAA;AAAA,0BACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAS;AAAA;AAAA;AAAA,KACzD,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oDAAA;AAAA,MACV,YAAA,EAAY,KAAA;AAAA,MACZ,kBAAA,EAAkB,KAAA,KAAU,WAAA,GAAc,WAAA,GAAc,EAAA;AAAA,MACxD,cAAA,EAAc,OAAA;AAAA,MACd,WAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAU,SAAA;AAAA,MACV,gBAAc,OAAA,IAAW,MAAA;AAAA,MAEzB,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,aAAA;AAAA,YACV,SAAA,EAAW,EAAA;AAAA,cACT,qEAAA;AAAA,cACA,UACI,0BAAA,GACA,EAAA;AAAA,gBACE,qBAAA;AAAA,gBACA,wCAAA;AAAA,gBACA,oCAAA;AAAA,gBACA,OAAA,KAAY,UAAA,IAAc,OAAA,KAAY,OAAA,GAClC,kFAAA,GACA;AAAA;AACN;AACN;AAAA,SACF;AAAA,wBACA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,mBAAA;AAAA,YACV,SAAA,EAAW,EAAA;AAAA,cACT,sHAAA;AAAA,cACA,IAAA,KAAS,SACL,gFAAA,GACA,kFAAA;AAAA,cACJ,OAAA,KAAY,UAAA,IAAc,OAAA,KAAY,OAAA,GAClC,0FAAA,GACA,yHAAA;AAAA,cACJ,OAAA,IAAW,UAAU,UAAA,IAAc,gBAAA;AAAA,cACnC;AAAA,aACF;AAAA,YACC,GAAG,KAAA;AAAA,YAEJ,QAAA,kBAAA,GAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,cAAA,EAAa,SAAA;AAAA,gBACb,WAAA,EAAU,eAAA;AAAA,gBACV,SAAA,EAAU,kNAAA;AAAA,gBAET;AAAA;AAAA;AACH;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AA0BA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAmC;AAC5E,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,UAAA,EAAW;AAErC,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,cAAA,EAAa,MAAA;AAAA,MACb,WAAA,EAAU,cAAA;AAAA,MACV,YAAA,EAAW,gBAAA;AAAA,MACX,QAAA,EAAU,EAAA;AAAA,MACV,OAAA,EAAS,aAAA;AAAA,MACT,KAAA,EAAM,gBAAA;AAAA,MACN,SAAA,EAAW,EAAA;AAAA,QACT,iPAAA;AAAA,QACA,0EAAA;AAAA,QACA,wHAAA;AAAA,QACA,yJAAA;AAAA,QACA,2DAAA;AAAA,QACA,2DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,YAAA,CAAa,EAAE,SAAA,EAAW,GAAG,OAAM,EAAiC;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,oDAAA;AAAA,QACA,iNAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAeA,SAAS,aAAA,CAAc,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,gBAAA;AAAA,MACV,cAAA,EAAa,QAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,SAAS,CAAA;AAAA,MACjD,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC5E,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,cAAA,EAAa,SAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,QACT,gGAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,YAAA,CAAa,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC1E,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,cAAA,EAAa,OAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,2CAAA,EAA6C,SAAS,CAAA;AAAA,MACnE,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,iBAAA,CAAkB;AAAA,EACzB,SAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,GAAG;AACL,CAAA,EAAwD;AACtD,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,KAAA;AAE9B,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,qBAAA;AAAA,MACV,cAAA,EAAa,aAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,QACT,0OAAA;AAAA,QACA,6EAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AA0BA,SAAS,mBAAA,CAAoB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACjF,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,cAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,SAAS,CAAA;AAAA,MACxC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AACxE,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,cAAA,EAAa,MAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,oCAAA,EAAsC,SAAS,CAAA;AAAA,MAC5D,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AAC5E,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,cAAA,EAAa,WAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA;AAAA,MAClD,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,MAAM,yBAAA,GAA4B,GAAA;AAAA,EAChC,u1BAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,8DAAA;AAAA,QACT,OAAA,EACE;AAAA,OACJ;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,aAAA;AAAA,QACT,EAAA,EAAI,aAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAGA,SAAS,iBAAA,CAAkB;AAAA,EACzB,OAAA,GAAU,KAAA;AAAA,EACV,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,SAAA;AAAA,EACP,OAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAIoD;AAClD,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,QAAA;AAC9B,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,UAAA,EAAW;AAEvC,EAAA,MAAM,MAAA,mBACJ,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,qBAAA;AAAA,MACV,cAAA,EAAa,aAAA;AAAA,MACb,WAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAa,QAAA;AAAA,MACb,SAAA,EAAW,GAAG,yBAAA,CAA0B,EAAE,SAAS,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,MACpE,GAAG;AAAA;AAAA,GACN;AAGF,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAe,OAAO,OAAA,KAAY,WAAW,EAAE,QAAA,EAAU,SAAQ,GAAI,OAAA;AAE3E,EAAA,4BACG,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EAAE,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,oBAChC,GAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,OAAA,EAAQ,KAAA,EAAM,QAAA,EAAS,MAAA,EAAQ,KAAA,KAAU,WAAA,IAAe,QAAA,EAAW,GAAG,YAAA,EAAc;AAAA,GAAA,EAC3G,CAAA;AAEJ;AAwFA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,cAAA,EAAa,UAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,QACT,gGAAA;AAAA,QACA,sCAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,kBAAA,CAAmB,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AAC/E,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,cAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,8BAAA,EAAgC,SAAS,CAAA;AAAA,MACtD,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,oBAAA,CAAqB;AAAA,EAC5B,OAAA,GAAU,KAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAIG;AACD,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,GAAA;AAE9B,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,yBAAA;AAAA,MACV,cAAA,EAAa,iBAAA;AAAA,MACb,WAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAa,QAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,QACT,+eAAA;AAAA,QACA,wFAAA;AAAA,QACA,SAAS,IAAA,IAAQ,SAAA;AAAA,QACjB,SAAS,IAAA,IAAQ,SAAA;AAAA,QACjB,sCAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAIA,MAAM,oBAAA,GAAgE;AAAA,EACpE,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACvC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,EACzC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,iBAAA;AAC3B,CAAA;AAGA,SAAS,cAAA,CAAe,aAAa,cAAA,EAAgB;AACnD,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,UAAA,EAAW;AAE/B,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAsB,MAAM;AAChE,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AAC9C,IAAA,IAAI,WAAW,UAAA,IAAc,MAAA,KAAW,WAAA,IAAe,MAAA,KAAW,SAAS,OAAO,MAAA;AAClF,IAAA,OAAO,UAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAGrB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,gBAAgB,UAAA,EAAY;AAC9B,MAAA,UAAA,CAAW,QAAQ,IAAI,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,SAAS,iBAAiB,IAAA,EAAmB;AAC3C,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,EACvC;AAEA,EAAA,SAAS,gBAAA,GAAmB;AAC1B,IAAA,IAAI,WAAA,KAAgB,OAAA,EAAS,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC3C;AAEA,EAAA,SAAS,gBAAA,GAAmB;AAC1B,IAAA,IAAI,WAAA,KAAgB,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,cAAA,EAAgB,gBAAA;AAAA,IAChB,YAAA,EAAc;AAAA,MACZ,SAAS,WAAA,KAAgB,OAAA;AAAA,MACzB,YAAA,EAAc,gBAAA;AAAA,MACd,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,WAAA;AAAA,MACA,mBAAA,EAAqB;AAAA;AACvB,GACF;AACF;AAGA,MAAM,iBAAiB,CAAC;AAAA,EACtB,WAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,4BACG,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,uBAAoB,OAAA,EAAO,IAAA,EAC1B,QAAA,kBAAA,IAAA,CAAC,iBAAA,EAAA,EAAkB,SAAQ,iBAAA,EACzB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAACC,SAAA,EAAA,EAAc,CAAA;AAAA,sBACf,GAAA,CAAC,UAAK,QAAA,EAAA,iBAAA,EAAe;AAAA,KAAA,EACvB,CAAA,EACF,CAAA;AAAA,oBACA,IAAA,CAAC,uBAAoB,IAAA,EAAK,KAAA,EAAM,OAAM,OAAA,EAAQ,UAAA,EAAY,CAAA,EAAG,SAAA,EAAU,MAAA,EACrE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,MACvF,oBAAA,CAAqB,GAAA,CAAI,CAAC,MAAA,qBACzB,IAAA,CAAC,gBAAA,EAAA,EAAoC,OAAA,EAAS,MAAM,mBAAA,CAAoB,MAAA,CAAO,KAAK,CAAA,EAAG,WAAU,OAAA,EAC/F,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA,WAAA,KAAgB,MAAA,CAAO,yBAAS,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAsC,CAAA,EACzF,CAAA;AAAA,QACC,MAAA,CAAO;AAAA,OAAA,EAAA,EAJa,MAAA,CAAO,KAK9B,CACD;AAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;;ACrqBA,MAAM,kBAID,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,UAAS,qBAC/B,GAAA;AAAA,EAACC,WAAA;AAAA,EAAA;AAAA,IACC,WAAA,EAAa,KAAK,QAAA,EAAU,IAAA,CAAK,CAAC,KAAA,KAAU,QAAA,KAAa,MAAM,IAAI,CAAA;AAAA,IACnE,SAAA,EAAU,mBAAA;AAAA,IAEV,+BAACC,eAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAACC,kBAAA,EAAA,EAAyB,OAAA,EAAO,IAAA,EAC/B,QAAA,kBAAA,IAAA,CAACC,iBAAA,EAAA,EAAwB,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,EACnF,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,CAAK,MAAL,EAAU,CAAA;AAAA,wBACX,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,wBAClB,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,gGAAA,EAAiG;AAAA,OAAA,EAC3H,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAACC,kBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAACC,cAAA,EAAA,EACE,eAAK,QAAA,EAAU,GAAA,CAAI,CAAC,KAAA,qBACnB,GAAA,CAACC,kBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAACC,oBAAA,EAAA,EAA2B,UAAU,QAAA,KAAa,KAAA,CAAM,IAAA,EAAM,OAAA,EAAS,MAAM,QAAA,CAAS,KAAA,CAAM,IAAI,GAC/F,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM,GACrB,CAAA,EAAA,EAH6B,KAAA,CAAM,IAIrC,CACD,GACH,CAAA,EACF;AAAA,KAAA,EACF;AAAA;AACF,CAAA;AAIF,MAAM,QAAA,GAID,CAAC,EAAE,IAAA,EAAM,UAAU,QAAA,EAAS,yBAC9BN,eAAA,EAAA,EACC,QAAA,kBAAA,IAAA;AAAA,EAACE,iBAAA;AAAA,EAAA;AAAA,IACC,SAAS,IAAA,CAAK,KAAA;AAAA,IACd,QAAA,EAAU,aAAa,IAAA,CAAK,IAAA,IAAQ,SAAS,UAAA,CAAW,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IACvE,SAAS,MAAO,IAAA,CAAK,WAAW,MAAA,GAAY,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IAC9D,iBAAe,IAAA,CAAK,QAAA;AAAA,IACpB,SAAA,EAAW,IAAA,CAAK,QAAA,GAAW,YAAA,GAAe,MAAA;AAAA,IAE1C,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,CAAK,MAAL,EAAU,CAAA;AAAA,sBACX,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,MACjB,KAAK,YAAA,oBAAgB,GAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EAA6B,eAAK,YAAA,EAAa;AAAA;AAAA;AACvF,CAAA,EACF,CAAA;AAIK,MAAM,UAAkC,CAAC,EAAE,QAAQ,MAAA,EAAQ,SAAA,GAAY,IAAG,KAAM;AACrF,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAa,GAAIK,cAAA,EAAqB;AAC5D,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAIC,UAAA,EAAiB;AAC7C,EAAA,MAAM,WAAA,GAAc,KAAA,KAAU,WAAA,IAAe,CAAC,QAAA;AAE9C,EAAA,uBACE,IAAA;AAAA,IAACC,SAAA;AAAA,IAAA;AAAA,MACE,GAAG,YAAA;AAAA,MACJ,WAAA,EAAY,MAAA;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,GAAA,EAAK,yBAAyB,SAAS,CAAA,CAAA,CAAA;AAAA,QACvC,MAAA,EAAQ,uCAAuC,SAAS,CAAA,EAAA;AAAA,OAC1D;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAACC,kBACE,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,0BACVC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAACC,iBAAA,EAAA,EAAwB,SAAA,EAAU,oCAAA,EAChC,QAAA,EAAA,KAAA,CAAM,KAAA,EACT,CAAA;AAAA,0BACA,GAAA,CAACC,mBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAACC,WAAA,EAAA,EACE,gBAAM,KAAA,CAAM,GAAA;AAAA,YAAI,CAAC,SAChB,IAAA,CAAK,QAAA,uBACF,eAAA,EAAA,EAAiC,IAAA,EAAY,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,QAAA,EAAA,EAArD,KAAK,KAAoE,CAAA,uBAE9F,QAAA,EAAA,EAA0B,IAAA,EAAY,UAAU,QAAA,CAAS,QAAA,EAAU,QAAA,EAAA,EAArD,IAAA,CAAK,KAAoE;AAAA,aAG9F,CAAA,EACF;AAAA,SAAA,EAAA,EAduB,KAAA,CAAM,KAe/B,CACD,CAAA,EACH,CAAA;AAAA,6BAECC,aAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,OAAO,WAAW,UAAA,GAAa,MAAA,CAAO,EAAE,WAAA,EAAa,CAAA,GAAI,MAAA;AAAA,0BAC1D,GAAA,CAACC,cAAA,EAAA,EAAsB,GAAG,YAAA,EAAc;AAAA,SAAA,EAC1C,CAAA;AAAA,4BAECC,WAAA,EAAA,EAAkB;AAAA;AAAA;AAAA,GACrB;AAEJ;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;;;;"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
import { FallbackProps } from 'react-error-boundary';
|
|
3
3
|
export declare const QueryErrorFallback: ({ error, resetErrorBoundary }: FallbackProps) => import("react/jsx-runtime").JSX.Element;
|
|
4
|
-
|
|
4
|
+
interface QueryErrorBoundaryProps {
|
|
5
5
|
children: React.ReactNode;
|
|
6
|
-
|
|
6
|
+
fallback?: React.ReactNode;
|
|
7
|
+
}
|
|
8
|
+
export declare const QueryErrorBoundary: ({ children, fallback }: QueryErrorBoundaryProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
7
10
|
//# sourceMappingURL=ErrorBoundary.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../../../lib/components/ErrorBoundary/ErrorBoundary.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAMzE,eAAO,MAAM,kBAAkB,GAAI,+BAA+B,aAAa,4CAgB9E,CAAC;
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../../../lib/components/ErrorBoundary/ErrorBoundary.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAMzE,eAAO,MAAM,kBAAkB,GAAI,+BAA+B,aAAa,4CAgB9E,CAAC;AAEF,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAGD,eAAO,MAAM,kBAAkB,GAAI,wBAAwB,uBAAuB,4CAkBjF,CAAC"}
|
|
@@ -17,8 +17,12 @@ export interface SidebarNavGroup {
|
|
|
17
17
|
label: string;
|
|
18
18
|
items: SidebarNavItem[];
|
|
19
19
|
}
|
|
20
|
+
export interface SidebarFooterState {
|
|
21
|
+
isCollapsed: boolean;
|
|
22
|
+
}
|
|
20
23
|
export interface SidebarProps {
|
|
21
24
|
groups: SidebarNavGroup[];
|
|
25
|
+
footer?: React.ReactNode | ((state: SidebarFooterState) => React.ReactNode);
|
|
22
26
|
topOffset?: number;
|
|
23
27
|
}
|
|
24
28
|
export declare const Sidebar: React.FC<SidebarProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../../lib/components/Sidebar/Sidebar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../../lib/components/Sidebar/Sidebar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AA0BpC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,kBAAkB,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAyDD,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CA6C1C,CAAC;AAKF,OAAO,EACL,YAAY,EACZ,eAAe,GAChB,MAAM,+BAA+B,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Sidebar, SidebarInset, type SidebarNavChild, type SidebarNavGroup, type SidebarNavItem, type SidebarProps, SidebarProvider, } from './Sidebar';
|
|
1
|
+
export { Sidebar, type SidebarFooterState, SidebarInset, type SidebarNavChild, type SidebarNavGroup, type SidebarNavItem, type SidebarProps, SidebarProvider, } from './Sidebar';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../lib/components/Sidebar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,eAAe,GAChB,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../lib/components/Sidebar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,KAAK,kBAAkB,EACvB,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,eAAe,GAChB,MAAM,WAAW,CAAC"}
|