@mesob/ui 0.2.2 → 0.2.3

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.
@@ -0,0 +1,19 @@
1
+ import * as React from 'react';
2
+
3
+ type BreadcrumbItemData = {
4
+ label: string;
5
+ href?: string;
6
+ };
7
+ type BreadcrumbContextValue = {
8
+ items: BreadcrumbItemData[];
9
+ setItems: (items: BreadcrumbItemData[]) => void;
10
+ push: (item: BreadcrumbItemData) => void;
11
+ pop: () => void;
12
+ clear: () => void;
13
+ };
14
+ declare const BreadcrumbContext: React.Context<BreadcrumbContextValue | null>;
15
+ declare function useBreadcrumbs(options?: {
16
+ items?: BreadcrumbItemData[];
17
+ }): BreadcrumbContextValue;
18
+
19
+ export { BreadcrumbContext, type BreadcrumbContextValue, type BreadcrumbItemData, useBreadcrumbs };
@@ -0,0 +1,19 @@
1
+ "use client";
2
+
3
+ // src/components/app-breadcrumbs-context.tsx
4
+ import { createContext, useContext } from "react";
5
+ var BreadcrumbContext = createContext(
6
+ null
7
+ );
8
+ function useBreadcrumbs(options) {
9
+ const context = useContext(BreadcrumbContext);
10
+ if (!context) {
11
+ throw new Error("useBreadcrumbs must be used within BreadcrumbProvider");
12
+ }
13
+ return context;
14
+ }
15
+ export {
16
+ BreadcrumbContext,
17
+ useBreadcrumbs
18
+ };
19
+ //# sourceMappingURL=app-breadcrumbs-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/app-breadcrumbs-context.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, useContext } from 'react';\n\nexport type BreadcrumbItemData = {\n label: string;\n href?: string;\n};\n\nexport type BreadcrumbContextValue = {\n items: BreadcrumbItemData[];\n setItems: (items: BreadcrumbItemData[]) => void;\n push: (item: BreadcrumbItemData) => void;\n pop: () => void;\n clear: () => void;\n};\n\nexport const BreadcrumbContext = createContext<BreadcrumbContextValue | null>(\n null,\n);\n\nexport function useBreadcrumbs(options?: { items?: BreadcrumbItemData[] }) {\n const context = useContext(BreadcrumbContext);\n if (!context) {\n throw new Error('useBreadcrumbs must be used within BreadcrumbProvider');\n }\n return context;\n}\n"],"mappings":";;;AAEA,SAAS,eAAe,kBAAkB;AAenC,IAAM,oBAAoB;AAAA,EAC/B;AACF;AAEO,SAAS,eAAe,SAA4C;AACzE,QAAM,UAAU,WAAW,iBAAiB;AAC5C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AACA,SAAO;AACT;","names":[]}
@@ -1,21 +1,12 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as __app_breadcrumbs_context from './app-breadcrumbs-context';
3
+ import { BreadcrumbItemData } from './app-breadcrumbs-context';
4
+ export { BreadcrumbItemData } from './app-breadcrumbs-context';
2
5
  import * as React from 'react';
3
6
 
4
- type BreadcrumbItemData = {
5
- label: string;
6
- href?: string;
7
- };
8
- type BreadcrumbContextValue = {
9
- items: BreadcrumbItemData[];
10
- setItems: (items: BreadcrumbItemData[]) => void;
11
- push: (item: BreadcrumbItemData) => void;
12
- pop: () => void;
13
- clear: () => void;
14
- };
15
- type UseBreadcrumbsOptions = {
7
+ declare function useBreadcrumbs(options?: {
16
8
  items?: BreadcrumbItemData[];
17
- };
18
- declare function useBreadcrumbs(options?: UseBreadcrumbsOptions): BreadcrumbContextValue;
9
+ }): __app_breadcrumbs_context.BreadcrumbContextValue;
19
10
  type BreadcrumbProviderProps = {
20
11
  children: React.ReactNode;
21
12
  defaultItems?: BreadcrumbItemData[];
@@ -85,22 +85,20 @@ function useMesob() {
85
85
 
86
86
  // src/components/app-breadcrumbs.tsx
87
87
  import {
88
- createContext as createContext2,
89
88
  Fragment,
90
89
  useCallback,
91
- useContext as useContext2,
92
90
  useEffect,
93
91
  useMemo as useMemo2,
94
92
  useRef,
95
93
  useState
96
94
  } from "react";
95
+ import {
96
+ BreadcrumbContext,
97
+ useBreadcrumbs as useBreadcrumbsBase
98
+ } from "./app-breadcrumbs-context";
97
99
  import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
98
- var BreadcrumbContext = createContext2(null);
99
100
  function useBreadcrumbs(options) {
100
- const context = useContext2(BreadcrumbContext);
101
- if (!context) {
102
- throw new Error("useBreadcrumbs must be used within BreadcrumbProvider");
103
- }
101
+ const context = useBreadcrumbsBase(options);
104
102
  const { setItems } = context;
105
103
  const prevItemsStrRef = useRef(void 0);
106
104
  useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/components/breadcrumb.tsx","../../src/components/tooltip.tsx","../../src/components/mesob-context.tsx","../../src/components/app-breadcrumbs.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from '@mesob/ui/lib/utils';\nimport { Slot } from '@radix-ui/react-slot';\nimport { IconChevronRight, IconDots } from '@tabler/icons-react';\nimport type * as React from 'react';\n\nfunction Breadcrumb({ ...props }: React.ComponentProps<'nav'>) {\n return <nav aria-label=\"breadcrumb\" data-slot=\"breadcrumb\" {...props} />;\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<'ol'>) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n 'text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn('inline-flex items-center gap-1.5', className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn('hover:text-foreground transition-colors', className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn('text-foreground font-normal', className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn('[&>svg]:size-3.5', className)}\n {...props}\n >\n {children ?? <IconChevronRight />}\n </li>\n );\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn('flex size-9 items-center justify-center', className)}\n {...props}\n >\n <IconDots className=\"size-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n );\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n};\n","'use client';\n\nimport { cn } from '@mesob/ui/lib/utils';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport type * as React from 'react';\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props}>\n {children}\n </TooltipPrimitive.Root>\n );\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","'use client';\n\nimport { TooltipProvider } from '@mesob/ui/components/tooltip';\nimport {\n type ComponentType,\n createContext,\n type ReactNode,\n useContext,\n useMemo,\n} from 'react';\n\nexport type MesobLinkProps = {\n href: string;\n children: ReactNode;\n className?: string;\n onClick?: () => void;\n};\n\nexport type Router = {\n push: (href: string) => void;\n replace: (href: string) => void;\n back: () => void;\n forward: () => void;\n refresh: () => void;\n prefetch: (href: string) => void;\n};\n\nexport type MesobContextValue = {\n linkComponent?: ComponentType<MesobLinkProps>;\n t?: (key: string, params?: Record<string, string | number>) => string;\n router?: Router;\n};\n\nconst MesobContext = createContext<MesobContextValue | null>(null);\n\nexport type MesobProviderProps = {\n children: ReactNode;\n linkComponent?: ComponentType<MesobLinkProps>;\n /** Hook that returns the app's t function (e.g. from next-intl useTranslations()). */\n useTranslation?: () => (\n key: string,\n params?: Record<string, string | number>,\n ) => string;\n /** Hook that returns the app's router (e.g. from next-intl useRouter()). */\n useRouter?: () => Router;\n};\n\nexport function MesobProvider({\n children,\n linkComponent,\n useTranslation,\n useRouter,\n}: MesobProviderProps) {\n const t = useTranslation?.();\n const router = useRouter?.();\n const value = useMemo<MesobContextValue>(\n () => ({ linkComponent, t: t ?? undefined, router: router ?? undefined }),\n [linkComponent, t, router],\n );\n return (\n <MesobContext.Provider value={value}>\n <TooltipProvider delayDuration={0}>{children}</TooltipProvider>\n </MesobContext.Provider>\n );\n}\n\nexport function useMesob(): MesobContextValue | null {\n return useContext(MesobContext);\n}\n","'use client';\n\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '@mesob/ui/components/breadcrumb';\nimport { useMesob } from '@mesob/ui/components/mesob-context';\nimport type * as React from 'react';\nimport {\n createContext,\n Fragment,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\ntype BreadcrumbItemData = {\n label: string;\n href?: string;\n};\n\ntype BreadcrumbContextValue = {\n items: BreadcrumbItemData[];\n setItems: (items: BreadcrumbItemData[]) => void;\n push: (item: BreadcrumbItemData) => void;\n pop: () => void;\n clear: () => void;\n};\n\nconst BreadcrumbContext = createContext<BreadcrumbContextValue | null>(null);\n\ntype UseBreadcrumbsOptions = {\n items?: BreadcrumbItemData[];\n};\n\nexport function useBreadcrumbs(options?: UseBreadcrumbsOptions) {\n const context = useContext(BreadcrumbContext);\n if (!context) {\n throw new Error('useBreadcrumbs must be used within BreadcrumbProvider');\n }\n\n const { setItems } = context;\n const prevItemsStrRef = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n const items = options?.items;\n if (!items) {\n return;\n }\n const itemsStr = JSON.stringify(items);\n if (prevItemsStrRef.current !== itemsStr) {\n prevItemsStrRef.current = itemsStr;\n setItems(items);\n }\n }, [options?.items, setItems]);\n\n return context;\n}\n\ntype BreadcrumbProviderProps = {\n children: React.ReactNode;\n defaultItems?: BreadcrumbItemData[];\n};\n\nexport function BreadcrumbProvider({\n children,\n defaultItems = [],\n}: BreadcrumbProviderProps) {\n const [items, setItems] = useState<BreadcrumbItemData[]>(defaultItems);\n\n const push = useCallback((item: BreadcrumbItemData) => {\n setItems((prev) => [...prev, item]);\n }, []);\n\n const pop = useCallback(() => {\n setItems((prev) => prev.slice(0, -1));\n }, []);\n\n const clear = useCallback(() => {\n setItems([]);\n }, []);\n\n const value = useMemo(\n () => ({\n items,\n setItems,\n push,\n pop,\n clear,\n }),\n [items, push, pop, clear],\n );\n\n return (\n <BreadcrumbContext.Provider value={value}>\n {children}\n </BreadcrumbContext.Provider>\n );\n}\n\ntype AppBreadcrumbsProps = {\n linkComponent?: React.ComponentType<{\n href: string;\n children: React.ReactNode;\n className?: string;\n }>;\n className?: string;\n};\n\nexport function AppBreadcrumbs({\n linkComponent: linkProp,\n className,\n}: AppBreadcrumbsProps) {\n const mesob = useMesob();\n const Link = linkProp ?? mesob?.linkComponent;\n const { items } = useBreadcrumbs(undefined);\n\n if (items.length === 0) {\n return null;\n }\n\n return (\n <Breadcrumb className={className}>\n <BreadcrumbList>\n {items.map((crumb, index) => {\n let content: React.ReactNode;\n if (crumb.href) {\n if (Link) {\n content = (\n <Link href={crumb.href} className=\"hover:underline\">\n {crumb.label}\n </Link>\n );\n } else {\n content = (\n <a href={crumb.href} className=\"hover:underline\">\n {crumb.label}\n </a>\n );\n }\n } else {\n content = <BreadcrumbPage>{crumb.label}</BreadcrumbPage>;\n }\n\n return (\n <Fragment key={`${crumb.label}-${crumb.href ?? ''}-${index}`}>\n {index > 0 && <BreadcrumbSeparator className=\"hidden md:block\" />}\n <BreadcrumbItem className={index === 0 ? 'hidden md:block' : ''}>\n {content}\n </BreadcrumbItem>\n </Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n"],"mappings":";;;AAAA,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ACJA,SAAS,YAAY;AACrB,SAAS,kBAAkB,gBAAgB;AAIlC,cA+EL,YA/EK;AADT,SAAS,WAAW,EAAE,GAAG,MAAM,GAAgC;AAC7D,SAAO,oBAAC,SAAI,cAAW,cAAa,aAAU,cAAc,GAAG,OAAO;AACxE;AAEA,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAA+B;AAC3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAA+B;AAC3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,oCAAoC,SAAS;AAAA,MAC1D,GAAG;AAAA;AAAA,EACN;AAEJ;AAoBA,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAAiC;AAC7E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,iBAAc;AAAA,MACd,gBAAa;AAAA,MACb,WAAW,GAAG,+BAA+B,SAAS;AAAA,MACrD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA+B;AAC7B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,WAAW,GAAG,oBAAoB,SAAS;AAAA,MAC1C,GAAG;AAAA,MAEH,sBAAY,oBAAC,oBAAiB;AAAA;AAAA,EACjC;AAEJ;;;AC3EA,YAAY,sBAAsB;AAQ9B,gBAAAA,MAiCE,QAAAC,aAjCF;;;ACRJ;AAAA,EAEE;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AAoDD,gBAAAC,YAAA;AA5BN,IAAM,eAAe,cAAwC,IAAI;AAiC1D,SAAS,WAAqC;AACnD,SAAO,WAAW,YAAY;AAChC;;;ACzDA;AAAA,EACE,iBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAgFH,gBAAAC,MAmDQ,QAAAC,aAnDR;AAjEJ,IAAM,oBAAoBJ,eAA6C,IAAI;AAMpE,SAAS,eAAe,SAAiC;AAC9D,QAAM,UAAUC,YAAW,iBAAiB;AAC5C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEA,QAAM,EAAE,SAAS,IAAI;AACrB,QAAM,kBAAkB,OAA2B,MAAS;AAE5D,YAAU,MAAM;AACd,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,UAAM,WAAW,KAAK,UAAU,KAAK;AACrC,QAAI,gBAAgB,YAAY,UAAU;AACxC,sBAAgB,UAAU;AAC1B,eAAS,KAAK;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,SAAS,OAAO,QAAQ,CAAC;AAE7B,SAAO;AACT;AAOO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,eAAe,CAAC;AAClB,GAA4B;AAC1B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA+B,YAAY;AAErE,QAAM,OAAO,YAAY,CAAC,SAA6B;AACrD,aAAS,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EACpC,GAAG,CAAC,CAAC;AAEL,QAAM,MAAM,YAAY,MAAM;AAC5B,aAAS,CAAC,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,EACtC,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,YAAY,MAAM;AAC9B,aAAS,CAAC,CAAC;AAAA,EACb,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQC;AAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,OAAO,MAAM,KAAK,KAAK;AAAA,EAC1B;AAEA,SACE,gBAAAC,KAAC,kBAAkB,UAAlB,EAA2B,OACzB,UACH;AAEJ;AAWO,SAAS,eAAe;AAAA,EAC7B,eAAe;AAAA,EACf;AACF,GAAwB;AACtB,QAAM,QAAQ,SAAS;AACvB,QAAM,OAAO,YAAY,OAAO;AAChC,QAAM,EAAE,MAAM,IAAI,eAAe,MAAS;AAE1C,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,SACE,gBAAAA,KAAC,cAAW,WACV,0BAAAA,KAAC,kBACE,gBAAM,IAAI,CAAC,OAAO,UAAU;AAC3B,QAAI;AACJ,QAAI,MAAM,MAAM;AACd,UAAI,MAAM;AACR,kBACE,gBAAAA,KAAC,QAAK,MAAM,MAAM,MAAM,WAAU,mBAC/B,gBAAM,OACT;AAAA,MAEJ,OAAO;AACL,kBACE,gBAAAA,KAAC,OAAE,MAAM,MAAM,MAAM,WAAU,mBAC5B,gBAAM,OACT;AAAA,MAEJ;AAAA,IACF,OAAO;AACL,gBAAU,gBAAAA,KAAC,kBAAgB,gBAAM,OAAM;AAAA,IACzC;AAEA,WACE,gBAAAC,MAAC,YACE;AAAA,cAAQ,KAAK,gBAAAD,KAAC,uBAAoB,WAAU,mBAAkB;AAAA,MAC/D,gBAAAA,KAAC,kBAAe,WAAW,UAAU,IAAI,oBAAoB,IAC1D,mBACH;AAAA,SAJa,GAAG,MAAM,KAAK,IAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,EAK1D;AAAA,EAEJ,CAAC,GACH,GACF;AAEJ;","names":["jsx","jsxs","jsx","createContext","useContext","useMemo","jsx","jsxs"]}
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/components/breadcrumb.tsx","../../src/components/tooltip.tsx","../../src/components/mesob-context.tsx","../../src/components/app-breadcrumbs.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from '@mesob/ui/lib/utils';\nimport { Slot } from '@radix-ui/react-slot';\nimport { IconChevronRight, IconDots } from '@tabler/icons-react';\nimport type * as React from 'react';\n\nfunction Breadcrumb({ ...props }: React.ComponentProps<'nav'>) {\n return <nav aria-label=\"breadcrumb\" data-slot=\"breadcrumb\" {...props} />;\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<'ol'>) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n 'text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn('inline-flex items-center gap-1.5', className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn('hover:text-foreground transition-colors', className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn('text-foreground font-normal', className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn('[&>svg]:size-3.5', className)}\n {...props}\n >\n {children ?? <IconChevronRight />}\n </li>\n );\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn('flex size-9 items-center justify-center', className)}\n {...props}\n >\n <IconDots className=\"size-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n );\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n};\n","'use client';\n\nimport { cn } from '@mesob/ui/lib/utils';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport type * as React from 'react';\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props}>\n {children}\n </TooltipPrimitive.Root>\n );\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","'use client';\n\nimport { TooltipProvider } from '@mesob/ui/components/tooltip';\nimport {\n type ComponentType,\n createContext,\n type ReactNode,\n useContext,\n useMemo,\n} from 'react';\n\nexport type MesobLinkProps = {\n href: string;\n children: ReactNode;\n className?: string;\n onClick?: () => void;\n};\n\nexport type Router = {\n push: (href: string) => void;\n replace: (href: string) => void;\n back: () => void;\n forward: () => void;\n refresh: () => void;\n prefetch: (href: string) => void;\n};\n\nexport type MesobContextValue = {\n linkComponent?: ComponentType<MesobLinkProps>;\n t?: (key: string, params?: Record<string, string | number>) => string;\n router?: Router;\n};\n\nconst MesobContext = createContext<MesobContextValue | null>(null);\n\nexport type MesobProviderProps = {\n children: ReactNode;\n linkComponent?: ComponentType<MesobLinkProps>;\n /** Hook that returns the app's t function (e.g. from next-intl useTranslations()). */\n useTranslation?: () => (\n key: string,\n params?: Record<string, string | number>,\n ) => string;\n /** Hook that returns the app's router (e.g. from next-intl useRouter()). */\n useRouter?: () => Router;\n};\n\nexport function MesobProvider({\n children,\n linkComponent,\n useTranslation,\n useRouter,\n}: MesobProviderProps) {\n const t = useTranslation?.();\n const router = useRouter?.();\n const value = useMemo<MesobContextValue>(\n () => ({ linkComponent, t: t ?? undefined, router: router ?? undefined }),\n [linkComponent, t, router],\n );\n return (\n <MesobContext.Provider value={value}>\n <TooltipProvider delayDuration={0}>{children}</TooltipProvider>\n </MesobContext.Provider>\n );\n}\n\nexport function useMesob(): MesobContextValue | null {\n return useContext(MesobContext);\n}\n","'use client';\n\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '@mesob/ui/components/breadcrumb';\nimport { useMesob } from '@mesob/ui/components/mesob-context';\nimport type * as React from 'react';\nimport {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { BreadcrumbItemData as BID } from './app-breadcrumbs-context';\nimport {\n BreadcrumbContext,\n useBreadcrumbs as useBreadcrumbsBase,\n} from './app-breadcrumbs-context';\n\nexport type { BreadcrumbItemData } from './app-breadcrumbs-context';\n\nexport function useBreadcrumbs(options?: { items?: BID[] }) {\n const context = useBreadcrumbsBase(options);\n const { setItems } = context;\n const prevItemsStrRef = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n const items = options?.items;\n if (!items) {\n return;\n }\n const itemsStr = JSON.stringify(items);\n if (prevItemsStrRef.current !== itemsStr) {\n prevItemsStrRef.current = itemsStr;\n setItems(items);\n }\n }, [options?.items, setItems]);\n\n return context;\n}\n\ntype BreadcrumbProviderProps = {\n children: React.ReactNode;\n defaultItems?: BID[];\n};\n\nexport function BreadcrumbProvider({\n children,\n defaultItems = [],\n}: BreadcrumbProviderProps) {\n const [items, setItems] = useState<BID[]>(defaultItems);\n\n const push = useCallback((item: BID) => {\n setItems((prev) => [...prev, item]);\n }, []);\n\n const pop = useCallback(() => {\n setItems((prev) => prev.slice(0, -1));\n }, []);\n\n const clear = useCallback(() => {\n setItems([]);\n }, []);\n\n const value = useMemo(\n () => ({\n items,\n setItems,\n push,\n pop,\n clear,\n }),\n [items, push, pop, clear],\n );\n\n return (\n <BreadcrumbContext.Provider value={value}>\n {children}\n </BreadcrumbContext.Provider>\n );\n}\n\ntype AppBreadcrumbsProps = {\n linkComponent?: React.ComponentType<{\n href: string;\n children: React.ReactNode;\n className?: string;\n }>;\n className?: string;\n};\n\nexport function AppBreadcrumbs({\n linkComponent: linkProp,\n className,\n}: AppBreadcrumbsProps) {\n const mesob = useMesob();\n const Link = linkProp ?? mesob?.linkComponent;\n const { items } = useBreadcrumbs(undefined);\n\n if (items.length === 0) {\n return null;\n }\n\n return (\n <Breadcrumb className={className}>\n <BreadcrumbList>\n {items.map((crumb, index) => {\n let content: React.ReactNode;\n if (crumb.href) {\n if (Link) {\n content = (\n <Link href={crumb.href} className=\"hover:underline\">\n {crumb.label}\n </Link>\n );\n } else {\n content = (\n <a href={crumb.href} className=\"hover:underline\">\n {crumb.label}\n </a>\n );\n }\n } else {\n content = <BreadcrumbPage>{crumb.label}</BreadcrumbPage>;\n }\n\n return (\n <Fragment key={`${crumb.label}-${crumb.href ?? ''}-${index}`}>\n {index > 0 && <BreadcrumbSeparator className=\"hidden md:block\" />}\n <BreadcrumbItem className={index === 0 ? 'hidden md:block' : ''}>\n {content}\n </BreadcrumbItem>\n </Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","jsx","useMemo","jsx","jsxs"]}
@@ -229,20 +229,12 @@ import * as React from "react";
229
229
  import { Slot as Slot2 } from "@radix-ui/react-slot";
230
230
  import { IconMenu2 } from "@tabler/icons-react";
231
231
  import { cva as cva2 } from "class-variance-authority";
232
- import * as React3 from "react";
233
-
234
- // src/components/sidebar-context.tsx
235
232
  import * as React2 from "react";
236
- var SidebarContext = React2.createContext(null);
237
- function useSidebar() {
238
- const context = React2.useContext(SidebarContext);
239
- if (!context) {
240
- throw new Error("useSidebar must be used within a SidebarProvider.");
241
- }
242
- return context;
243
- }
244
-
245
- // src/components/sidebar.tsx
233
+ import {
234
+ SidebarContext,
235
+ useSidebar
236
+ } from "./sidebar-context";
237
+ import { useSidebar as useSidebar2 } from "./sidebar-context";
246
238
  import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
247
239
  var SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
248
240
  var SIDEBAR_WIDTH_MOBILE = "18rem";
@@ -446,6 +438,7 @@ var sidebarMenuButtonVariants = cva2(
446
438
  import { IconChevronDown } from "@tabler/icons-react";
447
439
  import { useEffect as useEffect3, useRef, useState as useState3 } from "react";
448
440
  import { useToggle } from "react-use";
441
+ import { useSidebar as useSidebar3 } from "./sidebar-context";
449
442
  import { Fragment as Fragment2, jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
450
443
  function isLinkActive(pathname, href, pathMatch = "prefix") {
451
444
  if (!pathname) {
@@ -625,7 +618,7 @@ function AppSidebar({
625
618
  pathname,
626
619
  roles
627
620
  }) {
628
- const { isMobile, setOpenMobile } = useSidebar();
621
+ const { isMobile, setOpenMobile } = useSidebar3();
629
622
  const closeSidebar = () => {
630
623
  if (isMobile) {
631
624
  setOpenMobile(false);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/components/tooltip.tsx","../../src/components/mesob-context.tsx","../../src/components/link.tsx","../../src/components/button.tsx","../../src/components/input.tsx","../../src/components/separator.tsx","../../src/components/sheet.tsx","../../src/components/skeleton.tsx","../../src/hooks/use-mobile.ts","../../src/components/sidebar.tsx","../../src/components/sidebar-context.tsx","../../src/components/app-sidebar.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport { cn } from '@mesob/ui/lib/utils';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport type * as React from 'react';\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props}>\n {children}\n </TooltipPrimitive.Root>\n );\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","'use client';\n\nimport { TooltipProvider } from '@mesob/ui/components/tooltip';\nimport {\n type ComponentType,\n createContext,\n type ReactNode,\n useContext,\n useMemo,\n} from 'react';\n\nexport type MesobLinkProps = {\n href: string;\n children: ReactNode;\n className?: string;\n onClick?: () => void;\n};\n\nexport type Router = {\n push: (href: string) => void;\n replace: (href: string) => void;\n back: () => void;\n forward: () => void;\n refresh: () => void;\n prefetch: (href: string) => void;\n};\n\nexport type MesobContextValue = {\n linkComponent?: ComponentType<MesobLinkProps>;\n t?: (key: string, params?: Record<string, string | number>) => string;\n router?: Router;\n};\n\nconst MesobContext = createContext<MesobContextValue | null>(null);\n\nexport type MesobProviderProps = {\n children: ReactNode;\n linkComponent?: ComponentType<MesobLinkProps>;\n /** Hook that returns the app's t function (e.g. from next-intl useTranslations()). */\n useTranslation?: () => (\n key: string,\n params?: Record<string, string | number>,\n ) => string;\n /** Hook that returns the app's router (e.g. from next-intl useRouter()). */\n useRouter?: () => Router;\n};\n\nexport function MesobProvider({\n children,\n linkComponent,\n useTranslation,\n useRouter,\n}: MesobProviderProps) {\n const t = useTranslation?.();\n const router = useRouter?.();\n const value = useMemo<MesobContextValue>(\n () => ({ linkComponent, t: t ?? undefined, router: router ?? undefined }),\n [linkComponent, t, router],\n );\n return (\n <MesobContext.Provider value={value}>\n <TooltipProvider delayDuration={0}>{children}</TooltipProvider>\n </MesobContext.Provider>\n );\n}\n\nexport function useMesob(): MesobContextValue | null {\n return useContext(MesobContext);\n}\n","'use client';\n\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useMesob } from './mesob-context';\n\nexport type LinkProps = {\n href: string;\n children: ReactNode;\n className?: string;\n onClick?: () => void;\n};\n\nexport function Link({\n href,\n children,\n className,\n onClick,\n ...props\n}: LinkProps & ComponentProps<'a'>) {\n const mesob = useMesob();\n const LinkComponent = mesob?.linkComponent ?? 'a';\n\n if (LinkComponent === 'a') {\n return (\n <a href={href} className={className} onClick={onClick} {...props}>\n {children}\n </a>\n );\n }\n\n return (\n <LinkComponent\n href={href}\n className={className}\n onClick={onClick}\n {...props}\n >\n {children}\n </LinkComponent>\n );\n}\n","import { cn } from '@mesob/ui/lib/utils';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n 'bg-primary text-primary-foreground hover:bg-primary-600 dark:hover:bg-primary-400',\n destructive:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',\n outline:\n 'border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary-600 dark:hover:bg-secondary-400',\n ghost:\n 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:text-primary-600 dark:hover:text-primary-400 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n 'icon-sm': 'size-8',\n 'icon-lg': 'size-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\ntype ButtonProps = React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n };\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n leftIcon,\n rightIcon,\n children,\n ...props\n}: ButtonProps) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {leftIcon}\n {children}\n {rightIcon}\n </>\n )}\n </Comp>\n );\n}\n\nexport { Button, buttonVariants };\n","import { cn } from '@mesob/ui/lib/utils';\nimport type * as React from 'react';\n\nfunction Input({ className, type, ...props }: React.ComponentProps<'input'>) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","'use client';\n\nimport { cn } from '@mesob/ui/lib/utils';\nimport * as SeparatorPrimitive from '@radix-ui/react-separator';\nimport type * as React from 'react';\n\nfunction Separator({\n className,\n orientation = 'horizontal',\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","'use client';\n\nimport { cn } from '@mesob/ui/lib/utils';\nimport * as SheetPrimitive from '@radix-ui/react-dialog';\nimport { IconX } from '@tabler/icons-react';\nimport type * as React from 'react';\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=open]:opacity-100 fixed inset-0 z-50 bg-[var(--overlay,oklch(0_0_0/0.5))]',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = 'right',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: 'top' | 'right' | 'bottom' | 'left';\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n 'bg-background text-foreground border-border data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:opacity-100 fixed z-[51] flex min-w-0 flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500',\n side === 'right' &&\n 'data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm',\n side === 'left' &&\n 'data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm',\n side === 'top' &&\n 'data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b',\n side === 'bottom' &&\n 'data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t',\n className,\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <IconX className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn('flex flex-col gap-1.5 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn('mt-auto flex flex-col gap-2 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn('text-foreground font-semibold', className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n","import { cn } from '@mesob/ui/lib/utils';\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn('bg-accent animate-pulse rounded-md', className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","import * as React from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(\n undefined,\n );\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n mql.addEventListener('change', onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n return !!isMobile;\n}\n","'use client';\n\nimport { Button } from '@mesob/ui/components/button';\nimport { Input } from '@mesob/ui/components/input';\nimport { Separator } from '@mesob/ui/components/separator';\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from '@mesob/ui/components/sheet';\nimport { Skeleton } from '@mesob/ui/components/skeleton';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@mesob/ui/components/tooltip';\nimport { useIsMobile } from '@mesob/ui/hooks/use-mobile';\nimport { cn } from '@mesob/ui/lib/utils';\nimport { Slot } from '@radix-ui/react-slot';\nimport { IconMenu2 } from '@tabler/icons-react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport {\n SidebarContext,\n type SidebarContextProps,\n useSidebar,\n} from './sidebar-context';\n\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state';\nconst SIDEBAR_WIDTH_COOKIE = 'sidebar_width';\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH_DEFAULT = 256;\nconst SIDEBAR_WIDTH_MIN = 200;\nconst SIDEBAR_WIDTH_MAX = 480;\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\nfunction getWidthFromCookie(): number {\n if (typeof document === 'undefined') {\n return SIDEBAR_WIDTH_DEFAULT;\n }\n const m = document.cookie.match(\n new RegExp(`(?:^|; )${SIDEBAR_WIDTH_COOKIE}=([^;]*)`),\n );\n const n = m ? Number(m[1]) : Number.NaN;\n return Number.isFinite(n) && n >= SIDEBAR_WIDTH_MIN && n <= SIDEBAR_WIDTH_MAX\n ? n\n : SIDEBAR_WIDTH_DEFAULT;\n}\n\nfunction setWidthCookie(width: number) {\n document.cookie = `${SIDEBAR_WIDTH_COOKIE}=${width}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n}\n\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] = React.useState(false);\n const [width, setWidthState] = React.useState(getWidthFromCookie);\n\n const setWidth = React.useCallback((w: number) => {\n const clamped = Math.max(SIDEBAR_WIDTH_MIN, Math.min(SIDEBAR_WIDTH_MAX, w));\n setWidthState(clamped);\n setWidthCookie(clamped);\n }, []);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [open, setOpenProp],\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile\n ? setOpenMobile((value) => !value)\n : setOpen((value) => !value);\n }, [isMobile, setOpen]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue: SidebarContextProps = {\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n width,\n setWidth,\n minWidth: SIDEBAR_WIDTH_MIN,\n maxWidth: SIDEBAR_WIDTH_MAX,\n };\n\n const sidebarWidthValue = open ? `${width}px` : SIDEBAR_WIDTH;\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': sidebarWidthValue,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n 'group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === 'none') {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n 'bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col',\n className,\n )}\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 >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)',\n )}\n />\n <div\n 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 // Adjust the padding for floating and inset variants.\n variant === 'floating' || variant === 'inset'\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n 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\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: 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 <IconMenu2 />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\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\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\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn('bg-background h-8 w-full shadow-none', className)}\n {...props}\n />\n );\n}\n\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\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\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn('bg-sidebar-border mx-2 w-auto', className)}\n {...props}\n />\n );\n}\n\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\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\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\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 // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: 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\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\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] hover:bg-sidebar-active focus-visible:ring-2 active:bg-sidebar-active 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]:relative data-[active=true]:bg-sidebar-active data-[active=true]:pl-3 data-[active=true]:font-medium data-[active=true]:text-sidebar-primary data-[active=true]:before:absolute data-[active=true]:before:left-1 data-[active=true]:before:top-[6px] data-[active=true]:before:bottom-[6px] data-[active=true]:before:w-[3px] data-[active=true]:before:rounded-full data-[active=true]:before:bg-primary data-[active=true]:before:content-[\"\"] data-[state=open]:hover:bg-sidebar-active group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 min-w-0',\n {\n variants: {\n variant: {\n default: 'hover:bg-sidebar-active',\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\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 if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== 'collapsed' || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...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 // Increases the hit area of the button on mobile.\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\nfunction SidebarMenuBadge({\n className,\n ...props\n}: 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\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(\n () => `${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 && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ 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 relative 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\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: 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\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-active active:bg-sidebar-active [&>svg]:text-sidebar-primary 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]:relative data-[active=true]:bg-sidebar-active data-[active=true]:pl-3 data-[active=true]:text-sidebar-primary data-[active=true]:before:absolute data-[active=true]:before:left-1 data-[active=true]:before:top-[6px] data-[active=true]:before:bottom-[6px] data-[active=true]:before:w-[3px] data-[active=true]:before:rounded-full data-[active=true]:before:bg-primary data-[active=true]:before:content-[\"\"]',\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\nexport { useSidebar } from './sidebar-context';\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n};\n","'use client';\n\nimport * as React from 'react';\n\nexport type SidebarContextProps = {\n state: 'expanded' | 'collapsed';\n open: boolean;\n setOpen: (open: boolean | ((open: boolean) => boolean)) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n width: number;\n setWidth: (w: number) => void;\n minWidth: number;\n maxWidth: number;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nexport function useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n return context;\n}\n\nexport { SidebarContext };\n","'use client';\n\nimport { Link } from '@mesob/ui/components/link';\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n} from '@mesob/ui/components/sidebar';\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@mesob/ui/components/tooltip';\nimport { cn } from '@mesob/ui/lib/utils';\nimport { IconChevronDown } from '@tabler/icons-react';\nimport type * as React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { useToggle } from 'react-use';\nimport { useSidebar } from './sidebar-context';\n\nexport type NavItem = {\n title: string;\n href?: string;\n icon?: React.ComponentType<{ className?: string }>;\n group?: string;\n children?: NavItem[];\n pathMatch?: 'exact' | 'prefix';\n permission?: string[];\n};\n\ntype AppSidebarProps = {\n logo: React.ReactNode;\n navItems: NavItem[];\n footer?: React.ReactNode;\n pathname?: string;\n roles?: string[];\n};\n\nfunction isLinkActive(\n pathname: string | undefined,\n href: string | undefined,\n pathMatch: 'exact' | 'prefix' = 'prefix',\n): boolean {\n if (!pathname) {\n return false;\n }\n if (!href) {\n return false;\n }\n if (pathMatch === 'exact') {\n return pathname === href;\n }\n if (pathname === href) {\n return true;\n }\n return pathname.startsWith(`${href}/`);\n}\n\nfunction hasActiveDescendant(item: NavItem, pathname?: string): boolean {\n if (!pathname) {\n return false;\n }\n if (isLinkActive(pathname, item.href, item.pathMatch ?? 'prefix')) {\n return true;\n }\n return item.children?.some((c) => hasActiveDescendant(c, pathname)) ?? false;\n}\n\nfunction hasPermission(roles?: string[], permission?: string[]): boolean {\n if (!permission?.length) {\n return true;\n }\n if (!roles?.length) {\n return true;\n }\n return permission.some((p) => roles.includes(p));\n}\n\nconst TRUNCATION_TOOLTIP_MIN_LENGTH = 24;\n\nfunction TruncationTooltip({\n text,\n children,\n}: {\n text: string;\n children: React.ReactNode;\n}) {\n const ref = useRef<HTMLSpanElement>(null);\n const [truncated, setTruncated] = useState(false);\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-measure when label changes (ResizeObserver doesn't fire on text change)\n useEffect(() => {\n const el = ref.current;\n if (!el) {\n return;\n }\n const check = () => setTruncated(el.scrollWidth > el.clientWidth);\n check();\n const ro = new ResizeObserver(check);\n ro.observe(el);\n return () => ro.disconnect();\n }, [text]);\n const showTooltip = truncated || text.length >= TRUNCATION_TOOLTIP_MIN_LENGTH;\n const inner = (\n <span ref={ref} className=\"min-w-0 truncate block\">\n {children}\n </span>\n );\n if (!showTooltip) {\n return inner;\n }\n return (\n <Tooltip>\n <TooltipTrigger asChild>{inner}</TooltipTrigger>\n <TooltipContent side=\"right\" sideOffset={8}>\n {text}\n </TooltipContent>\n </Tooltip>\n );\n}\n\ntype MenuLabelProps = {\n icon?: React.ComponentType<{ className?: string }>;\n label: string;\n};\n\nfunction MenuLabel({ icon: Icon, label }: MenuLabelProps) {\n return (\n <div className=\"text-sidebar-foreground flex min-h-0 min-w-0 flex-1 cursor-pointer items-center gap-2 text-sm\">\n {Icon ? <Icon className=\"size-4 shrink-0\" /> : null}\n <TruncationTooltip text={label}>{label}</TruncationTooltip>\n </div>\n );\n}\n\nfunction RowContent({\n item,\n hasChildren,\n showChildren,\n}: {\n item: NavItem;\n hasChildren: boolean;\n showChildren: boolean;\n}) {\n return (\n <>\n <MenuLabel icon={item.icon} label={item.title} />\n {hasChildren && (\n <IconChevronDown\n className={cn(\n 'ml-auto size-4 shrink-0 cursor-pointer transition-transform',\n showChildren && 'rotate-180',\n )}\n aria-hidden\n />\n )}\n </>\n );\n}\n\ntype NavItemRowProps = {\n item: NavItem;\n level: number;\n pathname?: string;\n roles?: string[];\n onNavClick?: () => void;\n};\n\nfunction NavItemRow({\n item,\n level,\n pathname,\n roles,\n onNavClick,\n}: NavItemRowProps) {\n const [open, toggle] = useToggle(hasActiveDescendant(item, pathname));\n const hasChildren = (item.children?.length ?? 0) > 0;\n const showChildren =\n (open || hasActiveDescendant(item, pathname)) && hasChildren;\n const pathMatch = item.pathMatch ?? 'prefix';\n const isActive = isLinkActive(pathname, item.href, pathMatch);\n const lineLeft = 28 + 20 * level;\n\n if (!hasPermission(roles, item.permission)) {\n return null;\n }\n\n const paddingLeft = 20 + 20 * level;\n const rowWrapperClass = cn(\n 'text-sidebar-foreground relative flex h-8 w-full min-w-0 items-center rounded-md pr-2 text-left text-sm transition duration-300 ease-in-out',\n 'hover:bg-sidebar-active',\n isActive && 'bg-sidebar-active text-sidebar-primary',\n );\n const rowContent = (\n <>\n {isActive && (\n <div\n className=\"absolute left-1 top-1.5 bottom-1.5 z-10 w-[3px] rounded-full bg-primary\"\n aria-hidden\n />\n )}\n <RowContent\n item={item}\n hasChildren={hasChildren}\n showChildren={showChildren}\n />\n </>\n );\n\n return (\n <li className=\"relative mt-1\">\n {item.href ? (\n <Link\n href={item.href}\n onClick={hasChildren ? toggle : onNavClick}\n className={rowWrapperClass}\n style={{ paddingLeft }}\n aria-current={isActive ? 'page' : undefined}\n >\n {rowContent}\n </Link>\n ) : (\n <button\n type=\"button\"\n onClick={toggle}\n className={rowWrapperClass}\n style={{ paddingLeft }}\n aria-expanded={showChildren}\n aria-label={item.title}\n >\n {rowContent}\n </button>\n )}\n\n {showChildren && (\n <ul className=\"relative mt-1\">\n <div\n className=\"absolute top-0 bottom-0 z-10 w-px bg-sidebar-border\"\n style={{ left: lineLeft }}\n aria-hidden\n />\n {(item.children ?? []).map((child) => (\n <NavItemRow\n key={child.href ?? child.title}\n item={child}\n level={level + 1}\n pathname={pathname}\n roles={roles}\n onNavClick={onNavClick}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\nexport function AppSidebar({\n logo,\n navItems,\n footer,\n pathname,\n roles,\n}: AppSidebarProps) {\n const { isMobile, setOpenMobile } = useSidebar();\n const closeSidebar = () => {\n if (isMobile) {\n setOpenMobile(false);\n }\n };\n const groupedItems = navItems.reduce(\n (acc, item) => {\n const group = item.group ?? 'default';\n if (!acc[group]) {\n acc[group] = [];\n }\n acc[group].push(item);\n return acc;\n },\n {} as Record<string, NavItem[]>,\n );\n\n return (\n <Sidebar>\n <SidebarHeader>{logo}</SidebarHeader>\n <SidebarContent>\n <nav\n aria-label=\"Main navigation\"\n className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-x-hidden overflow-y-auto\"\n >\n {Object.entries(groupedItems).map(([groupName, items]) => (\n <SidebarGroup key={groupName} className=\"py-0\">\n {groupName !== 'default' && (\n <SidebarGroupLabel className=\"uppercase tracking-wide\">\n {groupName}\n </SidebarGroupLabel>\n )}\n <SidebarGroupContent>\n <ul className=\"flex w-full min-w-0 list-none flex-col gap-0 p-0\">\n {items.map((item) => (\n <NavItemRow\n key={item.href ?? item.title}\n item={item}\n level={0}\n pathname={pathname}\n roles={roles}\n onNavClick={closeSidebar}\n />\n ))}\n </ul>\n </SidebarGroupContent>\n </SidebarGroup>\n ))}\n </nav>\n </SidebarContent>\n {footer && <SidebarFooter>{footer}</SidebarFooter>}\n </Sidebar>\n );\n}\n"],"mappings":";;;AAAA,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ACFA,YAAY,sBAAsB;AAQ9B,cAiCE,YAjCF;AAQJ,SAAS,QAAQ;AAAA,EACf;AAAA,EACA,GAAG;AACL,GAAuD;AACrD,SACE,oBAAkB,uBAAjB,EAAsB,aAAU,WAAW,GAAG,OAC5C,UACH;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB,GAAG;AACL,GAA0D;AACxD,SAAO,oBAAkB,0BAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AAC1E;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAA0D;AACxD,SACE,oBAAkB,yBAAjB,EACC;AAAA,IAAkB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,oBAAkB,wBAAjB,EAAuB,WAAU,sGAAqG;AAAA;AAAA;AAAA,EACzI,GACF;AAEJ;;;ACvDA;AAAA,EAEE;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AAoDD,gBAAAA,YAAA;AA5BN,IAAM,eAAe,cAAwC,IAAI;AAiC1D,SAAS,WAAqC;AACnD,SAAO,WAAW,YAAY;AAChC;;;AC5CM,gBAAAC,YAAA;AAZC,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAoC;AAClC,QAAM,QAAQ,SAAS;AACvB,QAAM,gBAAgB,OAAO,iBAAiB;AAE9C,MAAI,kBAAkB,KAAK;AACzB,WACE,gBAAAA,KAAC,OAAE,MAAY,WAAsB,SAAmB,GAAG,OACxD,UACH;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;ACvCA,SAAS,YAAY;AACrB,SAAS,WAA8B;AAwDnC,SAQI,UARJ,OAAAC,MAQI,QAAAC,aARJ;AArDJ,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OACE;AAAA,QACF,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;;;AC/BI,gBAAAC,YAAA;;;ACFJ,YAAY,wBAAwB;AAUhC,gBAAAC,YAAA;;;ACVJ,YAAY,oBAAoB;AAChC,SAAS,aAAa;AAIb,gBAAAC,MAiED,QAAAC,aAjEC;AADT,SAAS,MAAM,EAAE,GAAG,MAAM,GAAqD;AAC7E,SAAO,gBAAAD,KAAgB,qBAAf,EAAoB,aAAU,SAAS,GAAG,OAAO;AAC3D;AAcA,SAAS,YAAY;AAAA,EACnB,GAAG;AACL,GAAuD;AACrD,SAAO,gBAAAE,KAAgB,uBAAf,EAAsB,aAAU,gBAAgB,GAAG,OAAO;AACpE;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA,GAAG;AACL,GAAwD;AACtD,SACE,gBAAAA;AAAA,IAAgB;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAEG;AACD,SACE,gBAAAC,MAAC,eACC;AAAA,oBAAAD,KAAC,gBAAa;AAAA,IACd,gBAAAC;AAAA,MAAgB;AAAA,MAAf;AAAA,QACC,aAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA,SAAS,WACP;AAAA,UACF,SAAS,UACP;AAAA,UACF,SAAS,SACP;AAAA,UACF,SAAS,YACP;AAAA,UACF;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,UACD,gBAAAA,MAAgB,sBAAf,EAAqB,WAAU,8OAC9B;AAAA,4BAAAD,KAAC,SAAM,WAAU,UAAS;AAAA,YAC1B,gBAAAA,KAAC,UAAK,WAAU,WAAU,mBAAK;AAAA,aACjC;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,6BAA6B,SAAS;AAAA,MACnD,GAAG;AAAA;AAAA,EACN;AAEJ;AAYA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA,GAAG;AACL,GAAsD;AACpD,SACE,gBAAAE;AAAA,IAAgB;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA,GAAG;AACL,GAA4D;AAC1D,SACE,gBAAAA;AAAA,IAAgB;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;;;AC1HI,gBAAAC,YAAA;;;ACJJ,YAAY,WAAW;;;ACqBvB,SAAS,QAAAC,aAAY;AACrB,SAAS,iBAAiB;AAC1B,SAAS,OAAAC,YAA8B;AACvC,YAAYC,YAAW;;;ACtBvB,YAAYC,YAAW;AAgBvB,IAAM,iBAAuB,qBAA0C,IAAI;AAEpE,SAAS,aAAa;AAC3B,QAAM,UAAgB,kBAAW,cAAc;AAC/C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,SAAO;AACT;;;ADwHQ,gBAAAC,MAkEE,QAAAC,aAlEF;AAjHR,IAAM,yBAAyB,KAAK,KAAK,KAAK;AAK9C,IAAM,uBAAuB;AAkI7B,SAAS,QAAQ;AAAA,EACf,OAAO;AAAA,EACP,UAAU;AAAA,EACV,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAIG;AACD,QAAM,EAAE,UAAU,OAAO,YAAY,cAAc,IAAI,WAAW;AAElE,MAAI,gBAAgB,QAAQ;AAC1B,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,aAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,MAAI,UAAU;AACZ,WACE,gBAAAA,KAAC,SAAM,MAAM,YAAY,cAAc,eAAgB,GAAG,OACxD,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,gBAAa;AAAA,QACb,aAAU;AAAA,QACV,eAAY;AAAA,QACZ,WAAU;AAAA,QACV,OACE;AAAA,UACE,mBAAmB;AAAA,QACrB;AAAA,QAEF;AAAA,QAEA;AAAA,0BAAAA,MAAC,eAAY,WAAU,WACrB;AAAA,4BAAAD,KAAC,cAAW,qBAAO;AAAA,YACnB,gBAAAA,KAAC,oBAAiB,0CAA4B;AAAA,aAChD;AAAA,UACA,gBAAAA,KAAC,SAAI,WAAU,+BAA+B,UAAS;AAAA;AAAA;AAAA,IACzD,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAY;AAAA,MACZ,oBAAkB,UAAU,cAAc,cAAc;AAAA,MACxD,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,aAAU;AAAA,MAGV;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,aAAU;AAAA,YACV,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY,cAAc,YAAY,UAClC,qFACA;AAAA,YACN;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAU;AAAA,YACV,WAAW;AAAA,cACT;AAAA,cACA,SAAS,SACL,mFACA;AAAA;AAAA,cAEJ,YAAY,cAAc,YAAY,UAClC,6FACA;AAAA,cACJ;AAAA,YACF;AAAA,YACC,GAAG;AAAA,YAEJ,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,gBAAa;AAAA,gBACb,aAAU;AAAA,gBACV,WAAU;AAAA,gBAET;AAAA;AAAA,YACH;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAiFA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC3E,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,2BAA2B,SAAS;AAAA,MACjD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC3E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,2BAA2B,SAAS;AAAA,MACjD,GAAG;AAAA;AAAA,EACN;AAEJ;AAgBA,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC5E,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC1E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,6CAA6C,SAAS;AAAA,MACnE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAAwD;AACtD,QAAM,OAAO,UAAUC,QAAO;AAE9B,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAyBA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,kBAAkB,SAAS;AAAA,MACxC,GAAG;AAAA;AAAA,EACN;AAEJ;AAwBA,IAAM,4BAA4BC;AAAA,EAChC;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;;;AE5eA,SAAS,uBAAuB;AAEhC,SAAS,aAAAC,YAAW,QAAQ,YAAAC,iBAAgB;AAC5C,SAAS,iBAAiB;AAsFtB,SAyCA,YAAAC,WAzCA,OAAAC,OAQA,QAAAC,aARA;AAjEJ,SAAS,aACP,UACA,MACA,YAAgC,UACvB;AACT,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MAAI,cAAc,SAAS;AACzB,WAAO,aAAa;AAAA,EACtB;AACA,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA,EACT;AACA,SAAO,SAAS,WAAW,GAAG,IAAI,GAAG;AACvC;AAEA,SAAS,oBAAoB,MAAe,UAA4B;AACtE,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,MAAI,aAAa,UAAU,KAAK,MAAM,KAAK,aAAa,QAAQ,GAAG;AACjE,WAAO;AAAA,EACT;AACA,SAAO,KAAK,UAAU,KAAK,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC,KAAK;AACzE;AAEA,SAAS,cAAc,OAAkB,YAAgC;AACvE,MAAI,CAAC,YAAY,QAAQ;AACvB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO;AAAA,EACT;AACA,SAAO,WAAW,KAAK,CAAC,MAAM,MAAM,SAAS,CAAC,CAAC;AACjD;AAEA,IAAM,gCAAgC;AAEtC,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AACF,GAGG;AACD,QAAM,MAAM,OAAwB,IAAI;AACxC,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAS,KAAK;AAEhD,EAAAC,WAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,IAAI;AACP;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,aAAa,GAAG,cAAc,GAAG,WAAW;AAChE,UAAM;AACN,UAAM,KAAK,IAAI,eAAe,KAAK;AACnC,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,IAAI,CAAC;AACT,QAAM,cAAc,aAAa,KAAK,UAAU;AAChD,QAAM,QACJ,gBAAAH,MAAC,UAAK,KAAU,WAAU,0BACvB,UACH;AAEF,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,SACE,gBAAAC,MAAC,WACC;AAAA,oBAAAD,MAAC,kBAAe,SAAO,MAAE,iBAAM;AAAA,IAC/B,gBAAAA,MAAC,kBAAe,MAAK,SAAQ,YAAY,GACtC,gBACH;AAAA,KACF;AAEJ;AAOA,SAAS,UAAU,EAAE,MAAM,MAAM,MAAM,GAAmB;AACxD,SACE,gBAAAC,MAAC,SAAI,WAAU,iGACZ;AAAA,WAAO,gBAAAD,MAAC,QAAK,WAAU,mBAAkB,IAAK;AAAA,IAC/C,gBAAAA,MAAC,qBAAkB,MAAM,OAAQ,iBAAM;AAAA,KACzC;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,gBAAAC,MAAAF,WAAA,EACE;AAAA,oBAAAC,MAAC,aAAU,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO;AAAA,IAC9C,eACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,gBAAgB;AAAA,QAClB;AAAA,QACA,eAAW;AAAA;AAAA,IACb;AAAA,KAEJ;AAEJ;AAUA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,CAAC,MAAM,MAAM,IAAI,UAAU,oBAAoB,MAAM,QAAQ,CAAC;AACpE,QAAM,eAAe,KAAK,UAAU,UAAU,KAAK;AACnD,QAAM,gBACH,QAAQ,oBAAoB,MAAM,QAAQ,MAAM;AACnD,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,WAAW,aAAa,UAAU,KAAK,MAAM,SAAS;AAC5D,QAAM,WAAW,KAAK,KAAK;AAE3B,MAAI,CAAC,cAAc,OAAO,KAAK,UAAU,GAAG;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK,KAAK;AAC9B,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd;AACA,QAAM,aACJ,gBAAAC,MAAAF,WAAA,EACG;AAAA,gBACC,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAW;AAAA;AAAA,IACb;AAAA,IAEF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF;AAGF,SACE,gBAAAC,MAAC,QAAG,WAAU,iBACX;AAAA,SAAK,OACJ,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,SAAS,cAAc,SAAS;AAAA,QAChC,WAAW;AAAA,QACX,OAAO,EAAE,YAAY;AAAA,QACrB,gBAAc,WAAW,SAAS;AAAA,QAEjC;AAAA;AAAA,IACH,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO,EAAE,YAAY;AAAA,QACrB,iBAAe;AAAA,QACf,cAAY,KAAK;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAGD,gBACC,gBAAAC,MAAC,QAAG,WAAU,iBACZ;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,eAAW;AAAA;AAAA,MACb;AAAA,OACE,KAAK,YAAY,CAAC,GAAG,IAAI,CAAC,UAC1B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM;AAAA,UACN,OAAO,QAAQ;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QALK,MAAM,QAAQ,MAAM;AAAA,MAM3B,CACD;AAAA,OACH;AAAA,KAEJ;AAEJ;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,EAAE,UAAU,cAAc,IAAI,WAAW;AAC/C,QAAM,eAAe,MAAM;AACzB,QAAI,UAAU;AACZ,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AACA,QAAM,eAAe,SAAS;AAAA,IAC5B,CAAC,KAAK,SAAS;AACb,YAAM,QAAQ,KAAK,SAAS;AAC5B,UAAI,CAAC,IAAI,KAAK,GAAG;AACf,YAAI,KAAK,IAAI,CAAC;AAAA,MAChB;AACA,UAAI,KAAK,EAAE,KAAK,IAAI;AACpB,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SACE,gBAAAC,MAAC,WACC;AAAA,oBAAAD,MAAC,iBAAe,gBAAK;AAAA,IACrB,gBAAAA,MAAC,kBACC,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAW;AAAA,QACX,WAAU;AAAA,QAET,iBAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,WAAW,KAAK,MAClD,gBAAAC,MAAC,gBAA6B,WAAU,QACrC;AAAA,wBAAc,aACb,gBAAAD,MAAC,qBAAkB,WAAU,2BAC1B,qBACH;AAAA,UAEF,gBAAAA,MAAC,uBACC,0BAAAA,MAAC,QAAG,WAAU,oDACX,gBAAM,IAAI,CAAC,SACV,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA,OAAO;AAAA,cACP;AAAA,cACA;AAAA,cACA,YAAY;AAAA;AAAA,YALP,KAAK,QAAQ,KAAK;AAAA,UAMzB,CACD,GACH,GACF;AAAA,aAnBiB,SAoBnB,CACD;AAAA;AAAA,IACH,GACF;AAAA,IACC,UAAU,gBAAAA,MAAC,iBAAe,kBAAO;AAAA,KACpC;AAEJ;","names":["jsx","jsx","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsx","Slot","cva","React","React","jsx","jsxs","jsx","jsxs","jsx","jsx","Slot","jsx","cva","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect"]}
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/components/tooltip.tsx","../../src/components/mesob-context.tsx","../../src/components/link.tsx","../../src/components/button.tsx","../../src/components/input.tsx","../../src/components/separator.tsx","../../src/components/sheet.tsx","../../src/components/skeleton.tsx","../../src/hooks/use-mobile.ts","../../src/components/sidebar.tsx","../../src/components/app-sidebar.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport { cn } from '@mesob/ui/lib/utils';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport type * as React from 'react';\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props}>\n {children}\n </TooltipPrimitive.Root>\n );\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","'use client';\n\nimport { TooltipProvider } from '@mesob/ui/components/tooltip';\nimport {\n type ComponentType,\n createContext,\n type ReactNode,\n useContext,\n useMemo,\n} from 'react';\n\nexport type MesobLinkProps = {\n href: string;\n children: ReactNode;\n className?: string;\n onClick?: () => void;\n};\n\nexport type Router = {\n push: (href: string) => void;\n replace: (href: string) => void;\n back: () => void;\n forward: () => void;\n refresh: () => void;\n prefetch: (href: string) => void;\n};\n\nexport type MesobContextValue = {\n linkComponent?: ComponentType<MesobLinkProps>;\n t?: (key: string, params?: Record<string, string | number>) => string;\n router?: Router;\n};\n\nconst MesobContext = createContext<MesobContextValue | null>(null);\n\nexport type MesobProviderProps = {\n children: ReactNode;\n linkComponent?: ComponentType<MesobLinkProps>;\n /** Hook that returns the app's t function (e.g. from next-intl useTranslations()). */\n useTranslation?: () => (\n key: string,\n params?: Record<string, string | number>,\n ) => string;\n /** Hook that returns the app's router (e.g. from next-intl useRouter()). */\n useRouter?: () => Router;\n};\n\nexport function MesobProvider({\n children,\n linkComponent,\n useTranslation,\n useRouter,\n}: MesobProviderProps) {\n const t = useTranslation?.();\n const router = useRouter?.();\n const value = useMemo<MesobContextValue>(\n () => ({ linkComponent, t: t ?? undefined, router: router ?? undefined }),\n [linkComponent, t, router],\n );\n return (\n <MesobContext.Provider value={value}>\n <TooltipProvider delayDuration={0}>{children}</TooltipProvider>\n </MesobContext.Provider>\n );\n}\n\nexport function useMesob(): MesobContextValue | null {\n return useContext(MesobContext);\n}\n","'use client';\n\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useMesob } from './mesob-context';\n\nexport type LinkProps = {\n href: string;\n children: ReactNode;\n className?: string;\n onClick?: () => void;\n};\n\nexport function Link({\n href,\n children,\n className,\n onClick,\n ...props\n}: LinkProps & ComponentProps<'a'>) {\n const mesob = useMesob();\n const LinkComponent = mesob?.linkComponent ?? 'a';\n\n if (LinkComponent === 'a') {\n return (\n <a href={href} className={className} onClick={onClick} {...props}>\n {children}\n </a>\n );\n }\n\n return (\n <LinkComponent\n href={href}\n className={className}\n onClick={onClick}\n {...props}\n >\n {children}\n </LinkComponent>\n );\n}\n","import { cn } from '@mesob/ui/lib/utils';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n 'bg-primary text-primary-foreground hover:bg-primary-600 dark:hover:bg-primary-400',\n destructive:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',\n outline:\n 'border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary-600 dark:hover:bg-secondary-400',\n ghost:\n 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:text-primary-600 dark:hover:text-primary-400 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n 'icon-sm': 'size-8',\n 'icon-lg': 'size-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\ntype ButtonProps = React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n };\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n leftIcon,\n rightIcon,\n children,\n ...props\n}: ButtonProps) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {leftIcon}\n {children}\n {rightIcon}\n </>\n )}\n </Comp>\n );\n}\n\nexport { Button, buttonVariants };\n","import { cn } from '@mesob/ui/lib/utils';\nimport type * as React from 'react';\n\nfunction Input({ className, type, ...props }: React.ComponentProps<'input'>) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","'use client';\n\nimport { cn } from '@mesob/ui/lib/utils';\nimport * as SeparatorPrimitive from '@radix-ui/react-separator';\nimport type * as React from 'react';\n\nfunction Separator({\n className,\n orientation = 'horizontal',\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","'use client';\n\nimport { cn } from '@mesob/ui/lib/utils';\nimport * as SheetPrimitive from '@radix-ui/react-dialog';\nimport { IconX } from '@tabler/icons-react';\nimport type * as React from 'react';\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=open]:opacity-100 fixed inset-0 z-50 bg-[var(--overlay,oklch(0_0_0/0.5))]',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = 'right',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: 'top' | 'right' | 'bottom' | 'left';\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n 'bg-background text-foreground border-border data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:opacity-100 fixed z-[51] flex min-w-0 flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500',\n side === 'right' &&\n 'data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm',\n side === 'left' &&\n 'data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm',\n side === 'top' &&\n 'data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b',\n side === 'bottom' &&\n 'data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t',\n className,\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <IconX className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn('flex flex-col gap-1.5 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn('mt-auto flex flex-col gap-2 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn('text-foreground font-semibold', className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n","import { cn } from '@mesob/ui/lib/utils';\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn('bg-accent animate-pulse rounded-md', className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","import * as React from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(\n undefined,\n );\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n mql.addEventListener('change', onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n return !!isMobile;\n}\n","'use client';\n\nimport { Button } from '@mesob/ui/components/button';\nimport { Input } from '@mesob/ui/components/input';\nimport { Separator } from '@mesob/ui/components/separator';\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from '@mesob/ui/components/sheet';\nimport { Skeleton } from '@mesob/ui/components/skeleton';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@mesob/ui/components/tooltip';\nimport { useIsMobile } from '@mesob/ui/hooks/use-mobile';\nimport { cn } from '@mesob/ui/lib/utils';\nimport { Slot } from '@radix-ui/react-slot';\nimport { IconMenu2 } from '@tabler/icons-react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport {\n SidebarContext,\n type SidebarContextProps,\n useSidebar,\n} from './sidebar-context';\n\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state';\nconst SIDEBAR_WIDTH_COOKIE = 'sidebar_width';\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH_DEFAULT = 256;\nconst SIDEBAR_WIDTH_MIN = 200;\nconst SIDEBAR_WIDTH_MAX = 480;\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\nfunction getWidthFromCookie(): number {\n if (typeof document === 'undefined') {\n return SIDEBAR_WIDTH_DEFAULT;\n }\n const m = document.cookie.match(\n new RegExp(`(?:^|; )${SIDEBAR_WIDTH_COOKIE}=([^;]*)`),\n );\n const n = m ? Number(m[1]) : Number.NaN;\n return Number.isFinite(n) && n >= SIDEBAR_WIDTH_MIN && n <= SIDEBAR_WIDTH_MAX\n ? n\n : SIDEBAR_WIDTH_DEFAULT;\n}\n\nfunction setWidthCookie(width: number) {\n document.cookie = `${SIDEBAR_WIDTH_COOKIE}=${width}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n}\n\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] = React.useState(false);\n const [width, setWidthState] = React.useState(getWidthFromCookie);\n\n const setWidth = React.useCallback((w: number) => {\n const clamped = Math.max(SIDEBAR_WIDTH_MIN, Math.min(SIDEBAR_WIDTH_MAX, w));\n setWidthState(clamped);\n setWidthCookie(clamped);\n }, []);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [open, setOpenProp],\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile\n ? setOpenMobile((value) => !value)\n : setOpen((value) => !value);\n }, [isMobile, setOpen]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue: SidebarContextProps = {\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n width,\n setWidth,\n minWidth: SIDEBAR_WIDTH_MIN,\n maxWidth: SIDEBAR_WIDTH_MAX,\n };\n\n const sidebarWidthValue = open ? `${width}px` : SIDEBAR_WIDTH;\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': sidebarWidthValue,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n 'group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === 'none') {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n 'bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col',\n className,\n )}\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 >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)',\n )}\n />\n <div\n 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 // Adjust the padding for floating and inset variants.\n variant === 'floating' || variant === 'inset'\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n 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\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: 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 <IconMenu2 />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\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\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\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn('bg-background h-8 w-full shadow-none', className)}\n {...props}\n />\n );\n}\n\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\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\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn('bg-sidebar-border mx-2 w-auto', className)}\n {...props}\n />\n );\n}\n\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\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\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\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 // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: 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\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\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] hover:bg-sidebar-active focus-visible:ring-2 active:bg-sidebar-active 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]:relative data-[active=true]:bg-sidebar-active data-[active=true]:pl-3 data-[active=true]:font-medium data-[active=true]:text-sidebar-primary data-[active=true]:before:absolute data-[active=true]:before:left-1 data-[active=true]:before:top-[6px] data-[active=true]:before:bottom-[6px] data-[active=true]:before:w-[3px] data-[active=true]:before:rounded-full data-[active=true]:before:bg-primary data-[active=true]:before:content-[\"\"] data-[state=open]:hover:bg-sidebar-active group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 min-w-0',\n {\n variants: {\n variant: {\n default: 'hover:bg-sidebar-active',\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\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 if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== 'collapsed' || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...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 // Increases the hit area of the button on mobile.\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\nfunction SidebarMenuBadge({\n className,\n ...props\n}: 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\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(\n () => `${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 && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ 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 relative 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\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: 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\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-active active:bg-sidebar-active [&>svg]:text-sidebar-primary 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]:relative data-[active=true]:bg-sidebar-active data-[active=true]:pl-3 data-[active=true]:text-sidebar-primary data-[active=true]:before:absolute data-[active=true]:before:left-1 data-[active=true]:before:top-[6px] data-[active=true]:before:bottom-[6px] data-[active=true]:before:w-[3px] data-[active=true]:before:rounded-full data-[active=true]:before:bg-primary data-[active=true]:before:content-[\"\"]',\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\nexport { useSidebar } from './sidebar-context';\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n};\n","'use client';\n\nimport { Link } from '@mesob/ui/components/link';\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n} from '@mesob/ui/components/sidebar';\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@mesob/ui/components/tooltip';\nimport { cn } from '@mesob/ui/lib/utils';\nimport { IconChevronDown } from '@tabler/icons-react';\nimport type * as React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { useToggle } from 'react-use';\nimport { useSidebar } from './sidebar-context';\n\nexport type NavItem = {\n title: string;\n href?: string;\n icon?: React.ComponentType<{ className?: string }>;\n group?: string;\n children?: NavItem[];\n pathMatch?: 'exact' | 'prefix';\n permission?: string[];\n};\n\ntype AppSidebarProps = {\n logo: React.ReactNode;\n navItems: NavItem[];\n footer?: React.ReactNode;\n pathname?: string;\n roles?: string[];\n};\n\nfunction isLinkActive(\n pathname: string | undefined,\n href: string | undefined,\n pathMatch: 'exact' | 'prefix' = 'prefix',\n): boolean {\n if (!pathname) {\n return false;\n }\n if (!href) {\n return false;\n }\n if (pathMatch === 'exact') {\n return pathname === href;\n }\n if (pathname === href) {\n return true;\n }\n return pathname.startsWith(`${href}/`);\n}\n\nfunction hasActiveDescendant(item: NavItem, pathname?: string): boolean {\n if (!pathname) {\n return false;\n }\n if (isLinkActive(pathname, item.href, item.pathMatch ?? 'prefix')) {\n return true;\n }\n return item.children?.some((c) => hasActiveDescendant(c, pathname)) ?? false;\n}\n\nfunction hasPermission(roles?: string[], permission?: string[]): boolean {\n if (!permission?.length) {\n return true;\n }\n if (!roles?.length) {\n return true;\n }\n return permission.some((p) => roles.includes(p));\n}\n\nconst TRUNCATION_TOOLTIP_MIN_LENGTH = 24;\n\nfunction TruncationTooltip({\n text,\n children,\n}: {\n text: string;\n children: React.ReactNode;\n}) {\n const ref = useRef<HTMLSpanElement>(null);\n const [truncated, setTruncated] = useState(false);\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-measure when label changes (ResizeObserver doesn't fire on text change)\n useEffect(() => {\n const el = ref.current;\n if (!el) {\n return;\n }\n const check = () => setTruncated(el.scrollWidth > el.clientWidth);\n check();\n const ro = new ResizeObserver(check);\n ro.observe(el);\n return () => ro.disconnect();\n }, [text]);\n const showTooltip = truncated || text.length >= TRUNCATION_TOOLTIP_MIN_LENGTH;\n const inner = (\n <span ref={ref} className=\"min-w-0 truncate block\">\n {children}\n </span>\n );\n if (!showTooltip) {\n return inner;\n }\n return (\n <Tooltip>\n <TooltipTrigger asChild>{inner}</TooltipTrigger>\n <TooltipContent side=\"right\" sideOffset={8}>\n {text}\n </TooltipContent>\n </Tooltip>\n );\n}\n\ntype MenuLabelProps = {\n icon?: React.ComponentType<{ className?: string }>;\n label: string;\n};\n\nfunction MenuLabel({ icon: Icon, label }: MenuLabelProps) {\n return (\n <div className=\"text-sidebar-foreground flex min-h-0 min-w-0 flex-1 cursor-pointer items-center gap-2 text-sm\">\n {Icon ? <Icon className=\"size-4 shrink-0\" /> : null}\n <TruncationTooltip text={label}>{label}</TruncationTooltip>\n </div>\n );\n}\n\nfunction RowContent({\n item,\n hasChildren,\n showChildren,\n}: {\n item: NavItem;\n hasChildren: boolean;\n showChildren: boolean;\n}) {\n return (\n <>\n <MenuLabel icon={item.icon} label={item.title} />\n {hasChildren && (\n <IconChevronDown\n className={cn(\n 'ml-auto size-4 shrink-0 cursor-pointer transition-transform',\n showChildren && 'rotate-180',\n )}\n aria-hidden\n />\n )}\n </>\n );\n}\n\ntype NavItemRowProps = {\n item: NavItem;\n level: number;\n pathname?: string;\n roles?: string[];\n onNavClick?: () => void;\n};\n\nfunction NavItemRow({\n item,\n level,\n pathname,\n roles,\n onNavClick,\n}: NavItemRowProps) {\n const [open, toggle] = useToggle(hasActiveDescendant(item, pathname));\n const hasChildren = (item.children?.length ?? 0) > 0;\n const showChildren =\n (open || hasActiveDescendant(item, pathname)) && hasChildren;\n const pathMatch = item.pathMatch ?? 'prefix';\n const isActive = isLinkActive(pathname, item.href, pathMatch);\n const lineLeft = 28 + 20 * level;\n\n if (!hasPermission(roles, item.permission)) {\n return null;\n }\n\n const paddingLeft = 20 + 20 * level;\n const rowWrapperClass = cn(\n 'text-sidebar-foreground relative flex h-8 w-full min-w-0 items-center rounded-md pr-2 text-left text-sm transition duration-300 ease-in-out',\n 'hover:bg-sidebar-active',\n isActive && 'bg-sidebar-active text-sidebar-primary',\n );\n const rowContent = (\n <>\n {isActive && (\n <div\n className=\"absolute left-1 top-1.5 bottom-1.5 z-10 w-[3px] rounded-full bg-primary\"\n aria-hidden\n />\n )}\n <RowContent\n item={item}\n hasChildren={hasChildren}\n showChildren={showChildren}\n />\n </>\n );\n\n return (\n <li className=\"relative mt-1\">\n {item.href ? (\n <Link\n href={item.href}\n onClick={hasChildren ? toggle : onNavClick}\n className={rowWrapperClass}\n style={{ paddingLeft }}\n aria-current={isActive ? 'page' : undefined}\n >\n {rowContent}\n </Link>\n ) : (\n <button\n type=\"button\"\n onClick={toggle}\n className={rowWrapperClass}\n style={{ paddingLeft }}\n aria-expanded={showChildren}\n aria-label={item.title}\n >\n {rowContent}\n </button>\n )}\n\n {showChildren && (\n <ul className=\"relative mt-1\">\n <div\n className=\"absolute top-0 bottom-0 z-10 w-px bg-sidebar-border\"\n style={{ left: lineLeft }}\n aria-hidden\n />\n {(item.children ?? []).map((child) => (\n <NavItemRow\n key={child.href ?? child.title}\n item={child}\n level={level + 1}\n pathname={pathname}\n roles={roles}\n onNavClick={onNavClick}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\nexport function AppSidebar({\n logo,\n navItems,\n footer,\n pathname,\n roles,\n}: AppSidebarProps) {\n const { isMobile, setOpenMobile } = useSidebar();\n const closeSidebar = () => {\n if (isMobile) {\n setOpenMobile(false);\n }\n };\n const groupedItems = navItems.reduce(\n (acc, item) => {\n const group = item.group ?? 'default';\n if (!acc[group]) {\n acc[group] = [];\n }\n acc[group].push(item);\n return acc;\n },\n {} as Record<string, NavItem[]>,\n );\n\n return (\n <Sidebar>\n <SidebarHeader>{logo}</SidebarHeader>\n <SidebarContent>\n <nav\n aria-label=\"Main navigation\"\n className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-x-hidden overflow-y-auto\"\n >\n {Object.entries(groupedItems).map(([groupName, items]) => (\n <SidebarGroup key={groupName} className=\"py-0\">\n {groupName !== 'default' && (\n <SidebarGroupLabel className=\"uppercase tracking-wide\">\n {groupName}\n </SidebarGroupLabel>\n )}\n <SidebarGroupContent>\n <ul className=\"flex w-full min-w-0 list-none flex-col gap-0 p-0\">\n {items.map((item) => (\n <NavItemRow\n key={item.href ?? item.title}\n item={item}\n level={0}\n pathname={pathname}\n roles={roles}\n onNavClick={closeSidebar}\n />\n ))}\n </ul>\n </SidebarGroupContent>\n </SidebarGroup>\n ))}\n </nav>\n </SidebarContent>\n {footer && <SidebarFooter>{footer}</SidebarFooter>}\n </Sidebar>\n );\n}\n"],"mappings":"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","names":["jsx","jsx","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsx","Slot","cva","React","useSidebar","jsx","jsxs","jsx","jsxs","jsx","jsx","Slot","jsx","cva","useEffect","useState","useSidebar","Fragment","jsx","jsxs"]}
@@ -98,22 +98,20 @@ function useMesob() {
98
98
 
99
99
  // src/components/app-breadcrumbs.tsx
100
100
  import {
101
- createContext as createContext2,
102
101
  Fragment,
103
102
  useCallback,
104
- useContext as useContext2,
105
103
  useEffect,
106
104
  useMemo as useMemo2,
107
105
  useRef,
108
106
  useState
109
107
  } from "react";
108
+ import {
109
+ BreadcrumbContext,
110
+ useBreadcrumbs as useBreadcrumbsBase
111
+ } from "./app-breadcrumbs-context";
110
112
  import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
111
- var BreadcrumbContext = createContext2(null);
112
113
  function useBreadcrumbs(options) {
113
- const context = useContext2(BreadcrumbContext);
114
- if (!context) {
115
- throw new Error("useBreadcrumbs must be used within BreadcrumbProvider");
116
- }
114
+ const context = useBreadcrumbsBase(options);
117
115
  const { setItems } = context;
118
116
  const prevItemsStrRef = useRef(void 0);
119
117
  useEffect(() => {
@@ -298,20 +296,12 @@ function useIsMobile() {
298
296
  import { Slot as Slot3 } from "@radix-ui/react-slot";
299
297
  import { IconMenu2 } from "@tabler/icons-react";
300
298
  import { cva as cva2 } from "class-variance-authority";
301
- import * as React3 from "react";
302
-
303
- // src/components/sidebar-context.tsx
304
299
  import * as React2 from "react";
305
- var SidebarContext = React2.createContext(null);
306
- function useSidebar() {
307
- const context = React2.useContext(SidebarContext);
308
- if (!context) {
309
- throw new Error("useSidebar must be used within a SidebarProvider.");
310
- }
311
- return context;
312
- }
313
-
314
- // src/components/sidebar.tsx
300
+ import {
301
+ SidebarContext,
302
+ useSidebar
303
+ } from "./sidebar-context";
304
+ import { useSidebar as useSidebar2 } from "./sidebar-context";
315
305
  import { jsx as jsx10, jsxs as jsxs6 } from "react/jsx-runtime";
316
306
  var SIDEBAR_COOKIE_NAME = "sidebar_state";
317
307
  var SIDEBAR_WIDTH_COOKIE = "sidebar_width";
@@ -345,16 +335,16 @@ function SidebarProvider({
345
335
  ...props
346
336
  }) {
347
337
  const isMobile = useIsMobile();
348
- const [openMobile, setOpenMobile] = React3.useState(false);
349
- const [width, setWidthState] = React3.useState(getWidthFromCookie);
350
- const setWidth = React3.useCallback((w) => {
338
+ const [openMobile, setOpenMobile] = React2.useState(false);
339
+ const [width, setWidthState] = React2.useState(getWidthFromCookie);
340
+ const setWidth = React2.useCallback((w) => {
351
341
  const clamped = Math.max(SIDEBAR_WIDTH_MIN, Math.min(SIDEBAR_WIDTH_MAX, w));
352
342
  setWidthState(clamped);
353
343
  setWidthCookie(clamped);
354
344
  }, []);
355
- const [_open, _setOpen] = React3.useState(defaultOpen);
345
+ const [_open, _setOpen] = React2.useState(defaultOpen);
356
346
  const open = openProp ?? _open;
357
- const setOpen = React3.useCallback(
347
+ const setOpen = React2.useCallback(
358
348
  (value) => {
359
349
  const openState = typeof value === "function" ? value(open) : value;
360
350
  if (setOpenProp) {
@@ -366,10 +356,10 @@ function SidebarProvider({
366
356
  },
367
357
  [open, setOpenProp]
368
358
  );
369
- const toggleSidebar = React3.useCallback(() => {
359
+ const toggleSidebar = React2.useCallback(() => {
370
360
  return isMobile ? setOpenMobile((value) => !value) : setOpen((value) => !value);
371
361
  }, [isMobile, setOpen]);
372
- React3.useEffect(() => {
362
+ React2.useEffect(() => {
373
363
  const handleKeyDown = (event) => {
374
364
  if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
375
365
  event.preventDefault();