@arqel-dev/ui 0.15.0 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{AreaChart-NMQ2RQGA.js → AreaChart-JAZ6LUYG.js} +8 -4
- package/dist/AreaChart-JAZ6LUYG.js.map +1 -0
- package/dist/ArqelCreatePage-UZAHV4DK.js +8 -0
- package/dist/{ArqelCreatePage-MV4JN2MO.js.map → ArqelCreatePage-UZAHV4DK.js.map} +1 -1
- package/dist/ArqelDashboardPage-Z5R4XSH4.js +6 -0
- package/dist/{ArqelDashboardPage-QK3BYVK3.js.map → ArqelDashboardPage-Z5R4XSH4.js.map} +1 -1
- package/dist/ArqelEditPage-RRYFYOTC.js +8 -0
- package/dist/{ArqelShowPage-5WWUSYC7.js.map → ArqelEditPage-RRYFYOTC.js.map} +1 -1
- package/dist/ArqelIndexPage-RGZWKKAX.js +12 -0
- package/dist/{ArqelIndexPage-R6JL5KOH.js.map → ArqelIndexPage-RGZWKKAX.js.map} +1 -1
- package/dist/ArqelShowPage-TVCJAV2F.js +6 -0
- package/dist/{ArqelEditPage-7J3IS2BR.js.map → ArqelShowPage-TVCJAV2F.js.map} +1 -1
- package/dist/{BarChart-KLHKTLO2.js → BarChart-E52NJSJE.js} +8 -4
- package/dist/BarChart-E52NJSJE.js.map +1 -0
- package/dist/{DonutChart-L56R4QF2.js → DonutChart-IGSF4LEB.js} +3 -3
- package/dist/{DonutChart-L56R4QF2.js.map → DonutChart-IGSF4LEB.js.map} +1 -1
- package/dist/{FormRenderer-BJBRIkfH.d.ts → FormRenderer-By8fZp4t.d.ts} +2 -0
- package/dist/{LineChart-GHMPHFZZ.js → LineChart-RRPGAZON.js} +8 -4
- package/dist/LineChart-RRPGAZON.js.map +1 -0
- package/dist/PieChart-SGN7V5LQ.js +4 -0
- package/dist/{PieChart-T2VQOFPP.js.map → PieChart-SGN7V5LQ.js.map} +1 -1
- package/dist/{RadarChart-CSWR5AO7.js → RadarChart-3AOM736J.js} +8 -4
- package/dist/RadarChart-3AOM736J.js.map +1 -0
- package/dist/action.js +2 -2
- package/dist/{chunk-FP5R6WED.js → chunk-2JUWLJ3K.js} +21 -13
- package/dist/chunk-2JUWLJ3K.js.map +1 -0
- package/dist/{chunk-BJER6TOI.js → chunk-3VSDQCFO.js} +3 -3
- package/dist/{chunk-BJER6TOI.js.map → chunk-3VSDQCFO.js.map} +1 -1
- package/dist/{chunk-N5U2BB6T.js → chunk-4VWNBMMA.js} +8 -6
- package/dist/chunk-4VWNBMMA.js.map +1 -0
- package/dist/{chunk-ZAM5TUPP.js → chunk-CMNZLA32.js} +60 -25
- package/dist/chunk-CMNZLA32.js.map +1 -0
- package/dist/{chunk-CVAMCRLL.js → chunk-EG2DASKR.js} +8 -4
- package/dist/chunk-EG2DASKR.js.map +1 -0
- package/dist/{chunk-DSULVRB6.js → chunk-GJ2FKAOM.js} +5 -3
- package/dist/chunk-GJ2FKAOM.js.map +1 -0
- package/dist/{chunk-FV7RESKL.js → chunk-HNUUZEOL.js} +28 -16
- package/dist/chunk-HNUUZEOL.js.map +1 -0
- package/dist/{chunk-37FLEB4N.js → chunk-IO6RMVUF.js} +8 -4
- package/dist/chunk-IO6RMVUF.js.map +1 -0
- package/dist/{chunk-4I5S6MH3.js → chunk-LLANMODS.js} +4 -4
- package/dist/{chunk-4I5S6MH3.js.map → chunk-LLANMODS.js.map} +1 -1
- package/dist/{chunk-N6WLCHQE.js → chunk-Q7WGPKUN.js} +6 -4
- package/dist/chunk-Q7WGPKUN.js.map +1 -0
- package/dist/{chunk-AZICSFBA.js → chunk-S5UNPCMQ.js} +112 -38
- package/dist/chunk-S5UNPCMQ.js.map +1 -0
- package/dist/{chunk-MTNFFSVA.js → chunk-SK6H7ARE.js} +5 -3
- package/dist/chunk-SK6H7ARE.js.map +1 -0
- package/dist/{chunk-PSPJA5U6.js → chunk-WMOBLT3Z.js} +10 -5
- package/dist/chunk-WMOBLT3Z.js.map +1 -0
- package/dist/{chunk-C5H44NSP.js → chunk-WZRPGPLH.js} +10 -5
- package/dist/chunk-WZRPGPLH.js.map +1 -0
- package/dist/{chunk-UXN67E5L.js → chunk-YQ6KXR3U.js} +8 -10
- package/dist/chunk-YQ6KXR3U.js.map +1 -0
- package/dist/{chunk-HSDZM4AM.js → chunk-YYQ45W25.js} +37 -24
- package/dist/chunk-YYQ45W25.js.map +1 -0
- package/dist/flash.js +1 -1
- package/dist/form.d.ts +3 -1
- package/dist/form.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +9 -9
- package/dist/pages.js +16 -16
- package/dist/palette.js +1 -1
- package/dist/resource.js +2 -2
- package/dist/shell.js +8 -4
- package/dist/shell.js.map +1 -1
- package/dist/table.js +1 -1
- package/dist/utility.js +1 -1
- package/dist/widgets.js +2 -2
- package/package.json +6 -6
- package/dist/AreaChart-NMQ2RQGA.js.map +0 -1
- package/dist/ArqelCreatePage-MV4JN2MO.js +0 -8
- package/dist/ArqelDashboardPage-QK3BYVK3.js +0 -6
- package/dist/ArqelEditPage-7J3IS2BR.js +0 -8
- package/dist/ArqelIndexPage-R6JL5KOH.js +0 -12
- package/dist/ArqelShowPage-5WWUSYC7.js +0 -6
- package/dist/BarChart-KLHKTLO2.js.map +0 -1
- package/dist/LineChart-GHMPHFZZ.js.map +0 -1
- package/dist/PieChart-T2VQOFPP.js +0 -4
- package/dist/RadarChart-CSWR5AO7.js.map +0 -1
- package/dist/chunk-37FLEB4N.js.map +0 -1
- package/dist/chunk-AZICSFBA.js.map +0 -1
- package/dist/chunk-C5H44NSP.js.map +0 -1
- package/dist/chunk-CVAMCRLL.js.map +0 -1
- package/dist/chunk-DSULVRB6.js.map +0 -1
- package/dist/chunk-FP5R6WED.js.map +0 -1
- package/dist/chunk-FV7RESKL.js.map +0 -1
- package/dist/chunk-HSDZM4AM.js.map +0 -1
- package/dist/chunk-MTNFFSVA.js.map +0 -1
- package/dist/chunk-N5U2BB6T.js.map +0 -1
- package/dist/chunk-N6WLCHQE.js.map +0 -1
- package/dist/chunk-PSPJA5U6.js.map +0 -1
- package/dist/chunk-UXN67E5L.js.map +0 -1
- package/dist/chunk-ZAM5TUPP.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utility/Breadcrumbs.tsx","../src/utility/EmptyState.tsx","../src/utility/ErrorState.tsx","../src/utility/LoadingSkeleton.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"chunk-MTNFFSVA.js","sourcesContent":["/**\n * `<Breadcrumbs>` — renders the panel's breadcrumb trail.\n *\n * Items can be passed explicitly, or auto-resolved from Inertia shared\n * props (`panel.breadcrumbs`, populated server-side by\n * `Arqel\\Nav\\BreadcrumbsBuilder`). Each item is a link unless it's the\n * last entry, which is rendered as plain text and marked\n * `aria-current=\"page\"`.\n *\n * `usePage()` is only invoked when `items` is omitted — explicit-items\n * usage works outside Inertia (e.g. dashboard widgets, tests).\n */\n\nimport { usePage } from '@inertiajs/react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface BreadcrumbItem {\n label: string;\n url?: string | null;\n}\n\nexport interface BreadcrumbsProps {\n items?: BreadcrumbItem[];\n separator?: ReactNode;\n className?: string;\n}\n\ninterface PanelWithCrumbs {\n panel?: { breadcrumbs?: BreadcrumbItem[] } | null;\n}\n\nexport function Breadcrumbs(props: BreadcrumbsProps) {\n if (props.items === undefined) {\n return <SharedBreadcrumbs {...props} />;\n }\n return <BreadcrumbsList {...props} items={props.items} />;\n}\n\nfunction SharedBreadcrumbs(props: BreadcrumbsProps) {\n const page = usePage();\n const items = (page.props as unknown as PanelWithCrumbs).panel?.breadcrumbs ?? [];\n return <BreadcrumbsList {...props} items={items} />;\n}\n\nfunction BreadcrumbsList({\n items,\n separator = <span aria-hidden=\"true\">/</span>,\n className,\n}: BreadcrumbsProps & { items: BreadcrumbItem[] }) {\n if (items.length === 0) return null;\n\n return (\n <nav aria-label=\"Breadcrumb\" className={cn('text-sm', className)}>\n <ol className=\"flex flex-wrap items-center gap-2 text-muted-foreground\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={`${item.label}-${item.url ?? 'leaf'}`} className=\"flex items-center gap-2\">\n {isLast || !item.url ? (\n <span aria-current={isLast ? 'page' : undefined} className=\"text-foreground\">\n {item.label}\n </span>\n ) : (\n <a href={item.url} className=\"hover:underline\">\n {item.label}\n </a>\n )}\n {!isLast && separator}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","/**\n * `<EmptyState>` — standardised empty-state block.\n *\n * Used by DataTable's empty slot and as a stand-alone fallback when\n * a resource collection has zero records.\n */\n\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface EmptyStateProps {\n title: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n action?: ReactNode;\n className?: string;\n}\n\nexport function EmptyState({ title, description, icon, action, className }: EmptyStateProps) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center gap-3 px-4 py-12 text-center text-muted-foreground',\n className,\n )}\n >\n {icon && <div className=\"text-3xl\">{icon}</div>}\n <h2 className=\"text-base font-semibold text-foreground\">{title}</h2>\n {description && <p className=\"max-w-md text-sm\">{description}</p>}\n {action && <div className=\"mt-2\">{action}</div>}\n </div>\n );\n}\n","/**\n * `<ErrorState>` — generic error block (404 / 403 / 500).\n *\n * Phase 1 ships a plain layout; richer illustrations / Heroicons land\n * with `@arqel-dev/fields` icon registry.\n */\n\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface ErrorStateProps {\n status?: number;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n}\n\nexport function ErrorState({ status, title, description, action, className }: ErrorStateProps) {\n return (\n <div\n role=\"alert\"\n className={cn('flex flex-col items-center gap-3 px-4 py-16 text-center', className)}\n >\n {status && <span className=\"text-sm font-mono text-muted-foreground\">{status}</span>}\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n {description && <p className=\"max-w-md text-sm text-muted-foreground\">{description}</p>}\n {action && <div className=\"mt-2\">{action}</div>}\n </div>\n );\n}\n","/**\n * `<LoadingSkeleton>` — animated placeholder block.\n *\n * Variants:\n * - `line`: single text line (default)\n * - `block`: rectangular block (cards, hero areas)\n * - `circle`: circular (avatars)\n *\n * Heights / widths default to readable values; override via Tailwind\n * classes or explicit `height` / `width` props for bespoke layouts.\n */\n\nimport { cn } from '../utils/cn.js';\n\nexport type SkeletonVariant = 'line' | 'block' | 'circle';\n\nexport interface LoadingSkeletonProps {\n variant?: SkeletonVariant;\n width?: number | string;\n height?: number | string;\n count?: number;\n className?: string;\n}\n\nconst VARIANT_CLASSES: Record<SkeletonVariant, string> = {\n line: 'h-4 w-full',\n block: 'h-24 w-full',\n circle: 'h-10 w-10 rounded-full',\n};\n\nexport function LoadingSkeleton({\n variant = 'line',\n width,\n height,\n count = 1,\n className,\n}: LoadingSkeletonProps) {\n const items = Array.from({ length: count }, (_, i) => i);\n return (\n <div className=\"flex flex-col gap-2\" aria-hidden=\"true\">\n {items.map((i) => (\n <div\n key={i}\n style={{ width, height }}\n className={cn(\n 'animate-pulse bg-muted',\n variant !== 'circle' && 'rounded-sm',\n VARIANT_CLASSES[variant],\n className,\n )}\n />\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shadcn/hooks/use-mobile.ts","../src/shadcn/ui/tooltip.tsx","../src/shadcn/ui/sidebar.tsx","../src/shell/AppShell.tsx","../src/shell/Footer.tsx","../src/shell/MainContent.tsx","../src/shell/Sidebar.tsx","../src/shell/Topbar.tsx"],"names":["React","TooltipPrimitive","open","jsx","jsxs","Sidebar","useMemo"],"mappings":"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","file":"chunk-N5U2BB6T.js","sourcesContent":["import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\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 * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/utils/cn\"\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 ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\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 \"z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { PanelLeftIcon } from \"lucide-react\"\nimport { Slot } from \"radix-ui\"\n\nimport { useIsMobile } from \"@/shadcn/hooks/use-mobile\"\nimport { cn } from \"@/utils/cn\"\nimport { Button } from \"@/shadcn/ui/button\"\nimport { Input } from \"@/shadcn/ui/input\"\nimport { Separator } from \"@/shadcn/ui/separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@/shadcn/ui/sheet\"\nimport { Skeleton } from \"@/shadcn/ui/skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/shadcn/ui/tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...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\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\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 \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\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=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>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 hidden text-sidebar-foreground 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=\"flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-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 <PanelLeftIcon />\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 \"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] hover:after:bg-sidebar-border 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 \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full min-w-0 flex-1 flex-col bg-background\",\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(\"h-8 w-full bg-background 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(\"mx-2 w-auto bg-sidebar-border\", 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.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring 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.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground 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 ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\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.Root : \"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.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform peer-hover/menu-button:text-sidebar-accent-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible: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 \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground data-[state=open]:opacity-100 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 \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\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.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n }, [])\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\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 \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border 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.Root : \"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 \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","/**\n * `<AppShell>` — top-level admin layout wrapper.\n *\n * Four variants control where structural slots land:\n * - `sidebar-left` (default): sidebar on the left, topbar above main\n * - `sidebar-right`: sidebar on the right\n * - `topbar-only`: full-width content under the topbar (no sidebar)\n * - `full-width`: bare content, no chrome\n *\n * For sidebar variants, `<AppShell>` wraps content in shadcn's\n * `<SidebarProvider>` so the rail's collapsed/expanded state, mobile\n * sheet, and keyboard shortcuts work out of the box.\n *\n * Slots (`sidebar`, `topbar`, `footer`, `children`) are passed as React\n * nodes so callers can compose `<Sidebar />` / `<Topbar />` themselves\n * or substitute custom shells per panel.\n */\n\nimport type { ReactNode } from 'react';\nimport { CommandPalette } from '../palette/CommandPalette.js';\nimport { SidebarInset, SidebarProvider } from '../shadcn/ui/sidebar.js';\nimport { cn } from '../utils/cn.js';\n\nexport type AppShellVariant = 'sidebar-left' | 'sidebar-right' | 'topbar-only' | 'full-width';\n\nexport interface AppShellProps {\n variant?: AppShellVariant;\n sidebar?: ReactNode;\n topbar?: ReactNode;\n footer?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function AppShell({\n variant = 'sidebar-left',\n sidebar,\n topbar,\n footer,\n children,\n className,\n}: AppShellProps) {\n if (variant === 'full-width') {\n return (\n <div\n data-arqel-shell=\"full-width\"\n className={cn('min-h-screen bg-background text-foreground', className)}\n >\n <CommandPalette />\n {children}\n </div>\n );\n }\n\n if (variant === 'topbar-only') {\n return (\n <div\n data-arqel-shell=\"topbar-only\"\n className={cn('flex min-h-screen flex-col bg-background text-foreground', className)}\n >\n <CommandPalette />\n {topbar}\n <main className=\"min-w-0 flex-1\">{children}</main>\n {footer}\n </div>\n );\n }\n\n const sidebarSide = variant === 'sidebar-right' ? 'right' : 'left';\n\n return (\n <SidebarProvider>\n <div\n data-arqel-shell={variant}\n data-sidebar-side={sidebarSide}\n className={cn(\n 'flex min-h-svh w-full bg-background text-foreground',\n sidebarSide === 'right' && 'flex-row-reverse',\n className,\n )}\n >\n <CommandPalette />\n {sidebar}\n <SidebarInset>\n {topbar}\n <main className=\"min-w-0 flex-1\">{children}</main>\n {footer}\n </SidebarInset>\n </div>\n </SidebarProvider>\n );\n}\n","/**\n * `<Footer>` — minimal optional footer rendered below `<MainContent>`.\n */\n\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface FooterProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function Footer({ children, className }: FooterProps) {\n return (\n <footer\n data-arqel-footer=\"\"\n className={cn(\n 'shrink-0 border-t border-border bg-background px-4 py-3 text-sm text-muted-foreground',\n className,\n )}\n >\n {children}\n </footer>\n );\n}\n","/**\n * `<MainContent>` — padded content wrapper used inside `<AppShell>`.\n *\n * Accepts breadcrumb and header slots so pages don't need to redefine\n * their own scaffolding. `maxWidth` mirrors the Tailwind container scale\n * — `none` opts out of any constraint (useful for full-bleed dashboards).\n */\n\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport type MainContentMaxWidth = 'none' | 'md' | 'lg' | 'xl' | '2xl' | '4xl' | '6xl' | '7xl';\n\nexport interface MainContentProps {\n breadcrumbs?: ReactNode;\n header?: ReactNode;\n children: ReactNode;\n maxWidth?: MainContentMaxWidth;\n className?: string;\n}\n\nconst MAX_WIDTH_CLASSES: Record<MainContentMaxWidth, string> = {\n none: '',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n '2xl': 'max-w-2xl',\n '4xl': 'max-w-4xl',\n '6xl': 'max-w-6xl',\n '7xl': 'max-w-7xl',\n};\n\nexport function MainContent({\n breadcrumbs,\n header,\n children,\n maxWidth = '7xl',\n className,\n}: MainContentProps) {\n return (\n <div\n data-arqel-main=\"\"\n className={cn(\n 'mx-auto w-full px-4 py-6 sm:px-6 lg:px-8',\n MAX_WIDTH_CLASSES[maxWidth],\n className,\n )}\n >\n {breadcrumbs && <div className=\"mb-3\">{breadcrumbs}</div>}\n {header && <div className=\"mb-6\">{header}</div>}\n {children}\n </div>\n );\n}\n","/**\n * `<Sidebar>` — primary navigation rail.\n *\n * Wraps the shadcn `Sidebar` block. Items come from `useNavigation()`\n * shared props (Inertia panel.navigation) by default, but the component\n * also accepts an `items` override for custom panels. The shadcn block\n * already handles desktop rail, mobile sheet, collapsed/icon mode, and\n * keyboard/cookie state via `<SidebarProvider>` (rendered by `<AppShell>`).\n */\n\nimport { type NavigationItemPayload, useNavigation } from '@arqel-dev/hooks';\nimport { type ReactNode, useMemo } from 'react';\nimport {\n Sidebar as ShadcnSidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from '../shadcn/ui/sidebar.js';\nimport { resolveLucideIcon } from '../utils/icon.js';\n\nexport interface SidebarProps {\n items?: NavigationItemPayload[];\n brand?: ReactNode;\n footer?: ReactNode;\n className?: string;\n}\n\nexport function Sidebar({ items: itemsProp, brand, footer, className }: SidebarProps) {\n const { items: sharedItems } = useNavigation();\n const items = itemsProp ?? sharedItems;\n const grouped = useMemo(() => groupItems(items), [items]);\n\n return (\n <ShadcnSidebar collapsible=\"icon\" className={className}>\n {brand ? (\n <SidebarHeader>\n <div className=\"flex items-center gap-2 px-2 py-1.5 text-sm font-semibold\">{brand}</div>\n </SidebarHeader>\n ) : null}\n <SidebarContent>\n {grouped.map(([group, list]) => (\n <SidebarGroup key={group ?? '__ungrouped__'}>\n {group ? <SidebarGroupLabel>{group}</SidebarGroupLabel> : null}\n <SidebarGroupContent>\n <SidebarMenu>\n {list.map((item) => {\n const Icon = resolveLucideIcon(item.icon);\n return (\n <SidebarMenuItem key={item.url ?? item.label}>\n <SidebarMenuButton\n asChild={Boolean(item.url)}\n isActive={Boolean(item.active)}\n >\n {item.url ? (\n <a href={item.url}>\n {Icon ? <Icon /> : null}\n <span>{item.label}</span>\n </a>\n ) : (\n <>\n {Icon ? <Icon /> : null}\n <span>{item.label}</span>\n </>\n )}\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n })}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n ))}\n </SidebarContent>\n {footer ? <SidebarFooter>{footer}</SidebarFooter> : null}\n </ShadcnSidebar>\n );\n}\n\nfunction groupItems(\n items: NavigationItemPayload[],\n): Array<[string | undefined, NavigationItemPayload[]]> {\n const groups = new Map<string | undefined, NavigationItemPayload[]>();\n for (const item of items) {\n const key = item.group ?? undefined;\n const list = groups.get(key) ?? [];\n list.push(item);\n groups.set(key, list);\n }\n return Array.from(groups.entries());\n}\n","/**\n * `<Topbar>` — header strip above the main content.\n *\n * Phase 1 wires the brand slot, theme toggle, and a mobile menu trigger.\n * Search and tenant switcher are reserved slots for Phase 2 (command\n * palette + multi-tenancy). The user menu is exposed as a slot so apps\n * can plug in any dropdown impl (Base UI Menu, ShadCN-generated, etc.).\n */\n\nimport { useTheme } from '@arqel-dev/react/providers';\nimport type { ReactNode } from 'react';\nimport { Button } from '../action/Button.js';\nimport { SidebarTrigger } from '../shadcn/ui/sidebar.js';\nimport { cn } from '../utils/cn.js';\n\nexport interface TopbarProps {\n brand?: ReactNode;\n search?: ReactNode;\n userMenu?: ReactNode;\n tenantSwitcher?: ReactNode;\n onMobileMenuClick?: () => void;\n className?: string;\n}\n\nexport function Topbar({\n brand,\n search,\n userMenu,\n tenantSwitcher,\n onMobileMenuClick,\n className,\n}: TopbarProps) {\n const { resolved, toggle } = useTheme();\n\n return (\n <header\n data-arqel-topbar=\"\"\n className={cn(\n // `min-w-0 overflow-hidden` keep the topbar from ever pushing the body\n // wide: as a flex child it must be allowed to shrink below its content\n // (min-w-0), and any control cluster that still can't fit is clipped\n // here instead of overflowing the viewport. Radix popovers (tenant /\n // locale / user menus) render in a portal, so clipping the bar never\n // hides their open content.\n 'flex h-14 min-w-0 shrink-0 items-center gap-2 overflow-hidden border-b border-border bg-background px-4',\n className,\n )}\n >\n <SidebarTrigger className=\"-ml-1\" />\n {brand && <div className=\"flex min-w-0 items-center\">{brand}</div>}\n <div className=\"hidden min-w-0 flex-1 md:block\">{search}</div>\n <div className=\"ml-auto flex min-w-0 items-center gap-2 md:ml-0\">\n {tenantSwitcher}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`Switch to ${resolved === 'dark' ? 'light' : 'dark'} theme`}\n onClick={toggle}\n >\n <span aria-hidden=\"true\">{resolved === 'dark' ? '☀' : '☾'}</span>\n </Button>\n {userMenu}\n </div>\n </header>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pages/ArqelShowPage.tsx"],"names":[],"mappings":";;;;;AAgBA,IAAM,eAAA,GAA8B;AAAA,EAClC,QAAQ,EAAC;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAEe,SAAR,aAAA,GAAuF;AAC5F,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,MAAA,GAAU,KAAA,CAAM,MAAA,IAAU,EAAC;AAIjC,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,OAAO,SAAS,QAAA,IAAY,KAAA,CAAM,WAAW,IAAA,IAAQ,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU;AACzF,MAAA,MAAA,CAAO,IAAI,CAAA,GAAK,KAAA,CAAM,MAAA,CAAmC,IAAI,CAAA;AAAA,IAC/D;AAAA,EACF;AAEA,EAAA,MAAM,eAAgB,KAAA,CAA2C,IAAA;AACjE,EAAA,MAAM,SAAqB,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,QAAA,EAAU,MAAK,GAAI,eAAA;AAEhF,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,UAAU,KAAA,IAAS,QAAA;AAAA,QACrD,WAAA,EAAa,MAAM,cAAA,IAAkB;AAAA;AAAA,KACvC;AAAA,oBACA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAU,MAAM;AAAA,QAEhB,CAAA;AAAA,QACA,QAAQ;AAAC;AAAA;AACX,GAAA,EACF,CAAA;AAEJ","file":"chunk-N6WLCHQE.js","sourcesContent":["/**\n * Default Inertia page for `arqel::show`.\n *\n * Read-only render of the record. Re-uses `<FormRenderer>` with\n * every field forced to disabled — keeps a single rendering path\n * for create/edit/show without a parallel \"DetailRenderer\" stack.\n */\n\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport type { FormSchema } from '@arqel-dev/types/forms';\nimport type { RecordType, ResourceDetailProps } from '@arqel-dev/types/resources';\nimport { usePage } from '@inertiajs/react';\nimport type { JSX } from 'react';\nimport { FormRenderer } from '../form/FormRenderer.js';\nimport { PageHeader } from '../utility/PageHeader.js';\n\nconst FALLBACK_SCHEMA: FormSchema = {\n schema: [],\n columns: 1,\n model: null,\n inline: false,\n disabled: true,\n};\n\nexport default function ArqelShowPage<TRecord extends RecordType = RecordType>(): JSX.Element {\n const page = usePage();\n const props = page.props as unknown as ResourceDetailProps<TRecord>;\n const fields = (props.fields ?? []) as FieldSchema[];\n\n // Seed values from the record so FormRenderer has something to\n // display. Detail mode disables every field.\n const values: Record<string, unknown> = {};\n for (const field of fields) {\n const name = field.name;\n if (typeof name === 'string' && props.record !== null && typeof props.record === 'object') {\n values[name] = (props.record as Record<string, unknown>)[name];\n }\n }\n\n const declaredForm = (props as unknown as { form?: FormSchema }).form;\n const schema: FormSchema = declaredForm ? { ...declaredForm, disabled: true } : FALLBACK_SCHEMA;\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title={props.recordTitle ?? props.resource?.label ?? 'Record'}\n description={props.recordSubtitle ?? null}\n />\n <FormRenderer\n schema={schema}\n fields={fields}\n values={values}\n onChange={() => {\n // No-op — show pages are read-only.\n }}\n errors={{}}\n />\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/widgets/WidgetWrapper.tsx","../src/widgets/StatCard.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"chunk-PSPJA5U6.js","sourcesContent":["/**\n * `<WidgetWrapper>` — common chrome for dashboard widgets.\n *\n * Provides:\n * - Heading / description header.\n * - Loading skeleton (CLS-safe placeholder while deferred widgets fetch).\n * - Error state (`role=\"alert\"`) with optional retry action.\n * - `aria-label`-ed `<section>` so widgets are individually navigable.\n *\n * Used by `<StatCard>` (and shortly `<ChartCard>` / `<TableCard>`) so the\n * outer card chrome is consistent across widget types.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface WidgetWrapperProps {\n heading?: string | undefined;\n description?: string | undefined;\n loading?: boolean | undefined;\n error?: Error | null | undefined;\n onRetry?: (() => void) | undefined;\n /** Tailwind grid column span (number → `col-span-{n}`, or raw class). */\n columnSpan?: number | string | undefined;\n className?: string | undefined;\n children: ReactNode;\n}\n\nfunction resolveColumnSpan(columnSpan?: number | string): string | undefined {\n if (columnSpan === undefined) return undefined;\n if (typeof columnSpan === 'number') return `col-span-${columnSpan}`;\n return columnSpan;\n}\n\nexport function WidgetWrapper({\n heading,\n description,\n loading = false,\n error = null,\n onRetry,\n columnSpan,\n className,\n children,\n}: WidgetWrapperProps) {\n const t = useArqelTranslations();\n const baseClass = cn(\n 'rounded border bg-background p-4',\n resolveColumnSpan(columnSpan),\n className,\n );\n\n if (loading) {\n return (\n <section\n aria-label={heading}\n aria-busy=\"true\"\n className={baseClass}\n data-widget-state=\"loading\"\n >\n <div className=\"animate-pulse h-32 bg-muted rounded\" />\n </section>\n );\n }\n\n if (error) {\n return (\n <section aria-label={heading} className={baseClass} data-widget-state=\"error\">\n <div role=\"alert\" className=\"flex flex-col gap-2 text-sm text-destructive\">\n <p>{error.message}</p>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"self-start rounded border px-2 py-1 text-xs text-foreground hover:bg-muted\"\n >\n {t('arqel.actions.retry', 'Retry')}\n </button>\n )}\n </div>\n </section>\n );\n }\n\n return (\n <section aria-label={heading} className={baseClass} data-widget-state=\"ready\">\n {heading && <h2 className=\"text-sm font-medium text-muted-foreground\">{heading}</h2>}\n {description && <p className=\"mt-1 text-xs text-muted-foreground\">{description}</p>}\n <div className={cn(heading || description ? 'mt-3' : undefined)}>{children}</div>\n </section>\n );\n}\n","/**\n * `<StatCard>` — KPI / \"big number\" widget.\n *\n * Renders the payload produced by `Arqel\\Widgets\\StatWidget::data()`:\n *\n * {\n * name, type: 'stat', heading?, description?,\n * value, statDescription?, descriptionIcon?,\n * color, icon?, chart?: number[], url?\n * }\n *\n * Includes a tiny inline-SVG sparkline (no Recharts dep) when `chart`\n * is set. ChartCard / TableCard (Recharts-based) ship in a separate\n * cluster; this component is intentionally Recharts-free so the\n * common \"big number\" case stays bundle-cheap.\n */\n\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\nimport { WidgetWrapper } from './WidgetWrapper.js';\n\nexport type StatCardColor = 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info';\n\nexport interface StatCardWidget {\n name: string;\n type: 'stat';\n heading?: string;\n description?: string;\n value: string | number | null;\n statDescription?: string | null;\n descriptionIcon?: string | null;\n color: StatCardColor;\n icon?: string | null;\n chart?: number[] | null;\n url?: string | null;\n}\n\nexport interface StatCardProps {\n widget: StatCardWidget;\n className?: string | undefined;\n columnSpan?: number | string | undefined;\n}\n\nconst COLOR_TEXT: Record<StatCardColor, string> = {\n primary: 'text-primary',\n secondary: 'text-secondary-foreground',\n success: 'text-green-600',\n warning: 'text-amber-600',\n danger: 'text-red-600',\n info: 'text-sky-600',\n};\n\nconst COLOR_STROKE: Record<StatCardColor, string> = {\n primary: 'stroke-primary',\n secondary: 'stroke-secondary-foreground',\n success: 'stroke-green-500',\n warning: 'stroke-amber-500',\n danger: 'stroke-red-500',\n info: 'stroke-sky-500',\n};\n\ninterface SparklineProps {\n points: number[];\n color: StatCardColor;\n}\n\nfunction Sparkline({ points, color }: SparklineProps) {\n if (points.length < 2) return null;\n\n const min = Math.min(...points);\n const max = Math.max(...points);\n const range = max - min || 1;\n const stepX = 100 / (points.length - 1);\n\n const coords = points\n .map((value, index) => {\n const x = index * stepX;\n // Invert Y so larger values render higher in the viewBox.\n const y = 30 - ((value - min) / range) * 30;\n return `${x.toFixed(2)},${y.toFixed(2)}`;\n })\n .join(' ');\n\n return (\n <svg\n viewBox=\"0 0 100 30\"\n preserveAspectRatio=\"none\"\n className={cn('mt-3 h-8 w-full', COLOR_STROKE[color])}\n role=\"img\"\n aria-label=\"Trend sparkline\"\n data-testid=\"stat-card-sparkline\"\n >\n <polyline\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n points={coords}\n />\n </svg>\n );\n}\n\nexport function StatCard({ widget, className, columnSpan }: StatCardProps) {\n const { heading, description, value, statDescription, descriptionIcon, color, chart, url } =\n widget;\n\n const hasChart = Array.isArray(chart) && chart.length >= 2;\n\n const body: ReactNode = (\n <>\n <div className={cn('text-4xl font-bold tabular-nums', COLOR_TEXT[color])}>{value ?? '—'}</div>\n {statDescription && (\n <div className=\"mt-2 flex items-center gap-1 text-xs text-muted-foreground\">\n {descriptionIcon && (\n <span aria-hidden=\"true\" data-testid=\"stat-card-icon\">\n {/* Icon name passed through; an icon registry resolves it app-side. */}\n {descriptionIcon}\n </span>\n )}\n <span>{statDescription}</span>\n </div>\n )}\n {hasChart && <Sparkline points={chart as number[]} color={color} />}\n </>\n );\n\n const inner = url ? (\n <a\n href={url}\n className=\"block rounded outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid=\"stat-card-link\"\n >\n {body}\n </a>\n ) : (\n body\n );\n\n return (\n <WidgetWrapper\n heading={heading}\n description={description}\n columnSpan={columnSpan}\n className={className}\n >\n {inner}\n </WidgetWrapper>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pages/ArqelEditPage.tsx"],"names":[],"mappings":";;;;;;;AAiBA,IAAM,eAAA,GAA8B;AAAA,EAClC,QAAQ,EAAC;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AASe,SAAR,aAAA,GAAuF;AAC5F,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,MAAA,GAAU,KAAA,CAAM,MAAA,IAAU,EAAC;AACjC,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,EAAA,MAAM,MAAA,GAAU,MAA2C,IAAA,IAAQ,eAAA;AAEnE,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAE5C,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAuB;AACrC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAQ,MAAA,EAAiD,EAAA,IAAM,EAAE,CAAA;AAC5E,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAU,IAAA,IAAQ,EAAA;AACrC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,EAAU,SAAA,IAAa,QAAA;AAC9C,IAAA,MAAA,CAAO,GAAA,CAAI,GAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,EAA+B;AAAA,MAC1E,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAA,CAAM,WAAA,IAAe,QAAQ,KAAA,CAAM,QAAA,EAAU,SAAS,QAAQ,CAAA,CAAA;AAAA,QACrE,WAAA,EAAa,MAAM,cAAA,IAAkB;AAAA;AAAA,KACvC;AAAA,oBACA,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,WAAU,WAAA,EAChC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAQ,IAAA,CAAK,IAAA;AAAA,UACb,UAAU,CAAC,IAAA,EAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,UACnD,QAAQ,IAAA,CAAK;AAAA;AAAA,OACf;AAAA,sBACA,GAAA,CAAC,WAAA,EAAA,EAAY,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,UAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAK,EAAG;AAAA,KAAA,EACnF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-UXN67E5L.js","sourcesContent":["/**\n * Default Inertia page for `arqel::edit`.\n *\n * Same shape as `ArqelCreatePage` but seeds the form with the\n * server-emitted `record`. Submission posts to PUT `/{slug}/{id}`.\n */\n\nimport { useArqelForm } from '@arqel-dev/hooks';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport type { FormSchema } from '@arqel-dev/types/forms';\nimport type { RecordType, ResourceEditProps } from '@arqel-dev/types/resources';\nimport { router, usePage } from '@inertiajs/react';\nimport type { FormEvent, JSX } from 'react';\nimport { FormActions } from '../form/FormActions.js';\nimport { FormRenderer } from '../form/FormRenderer.js';\nimport { PageHeader } from '../utility/PageHeader.js';\n\nconst FALLBACK_SCHEMA: FormSchema = {\n schema: [],\n columns: 1,\n model: null,\n inline: false,\n disabled: false,\n};\n\ninterface ArqelFormShape {\n data: Record<string, unknown>;\n setData: (name: string, value: unknown) => void;\n errors: Record<string, string[]>;\n processing: boolean;\n}\n\nexport default function ArqelEditPage<TRecord extends RecordType = RecordType>(): JSX.Element {\n const page = usePage();\n const props = page.props as unknown as ResourceEditProps<TRecord>;\n const fields = (props.fields ?? []) as FieldSchema[];\n const record = props.record;\n const schema = (props as unknown as { form?: FormSchema }).form ?? FALLBACK_SCHEMA;\n\n const form = useArqelForm({ fields, record }) as unknown as ArqelFormShape;\n\n const submit = (e: FormEvent): void => {\n e.preventDefault();\n const id = String((record as { id?: string | number } | undefined)?.id ?? '');\n const slug = props.resource?.slug ?? '';\n const basePath = props.resource?.panelPath ?? '/admin';\n router.put(`${basePath}/${slug}/${id}`, form.data as Record<string, never>, {\n preserveScroll: true,\n });\n };\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title={props.recordTitle ?? `Edit ${props.resource?.label ?? 'record'}`}\n description={props.recordSubtitle ?? null}\n />\n <form onSubmit={submit} className=\"space-y-6\">\n <FormRenderer\n schema={schema}\n fields={fields}\n values={form.data}\n onChange={(name, value) => form.setData(name, value)}\n errors={form.errors}\n />\n <FormActions processing={form.processing} onCancel={() => window.history.back()} />\n </form>\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/form/FieldRegistry.tsx","../src/form/nativeFields.tsx","../src/form/FieldRenderer.tsx","../src/form/FormFieldset.tsx","../src/form/FormGrid.tsx","../src/form/FormSection.tsx","../src/form/FormTabs.tsx","../src/form/FormRenderer.tsx"],"names":["jsxs","jsx","useState","useId"],"mappings":"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","file":"chunk-ZAM5TUPP.js","sourcesContent":["/**\n * `FieldRegistry` — name → React component mapping for FieldRenderer.\n *\n * `@arqel-dev/fields` (FIELDS-JS-*) calls `registerField` at module init to\n * plug rich inputs in; until then FieldRenderer falls back to the\n * native HTML primitives in `nativeFields.tsx`. Registration is global\n * by design — apps can override Arqel defaults by re-registering with\n * the same name.\n */\n\nimport type { ComponentType } from 'react';\nimport type { FieldRendererProps } from './FieldRenderer.js';\n\nexport type FieldComponent = ComponentType<FieldRendererProps>;\n\nconst registry = new Map<string, FieldComponent>();\n\nexport function registerField(name: string, component: FieldComponent): void {\n registry.set(name, component);\n}\n\nexport function getFieldComponent(name: string): FieldComponent | undefined {\n return registry.get(name);\n}\n\nexport function unregisterField(name: string): void {\n registry.delete(name);\n}\n\nexport function getRegisteredFields(): string[] {\n return Array.from(registry.keys()).sort();\n}\n\n/** Test-only helper. */\nexport function clearFieldRegistry(): void {\n registry.clear();\n}\n","/**\n * Native HTML fallback inputs — used until `@arqel-dev/fields` registers\n * richer impls. One renderer per FieldSchema discriminant.\n */\n\nimport type {\n BelongsToFieldSchema,\n BooleanFieldSchema,\n CurrencyFieldSchema,\n DateFieldSchema,\n DateTimeFieldSchema,\n EmailFieldSchema,\n FieldSchema,\n HasManyFieldSchema,\n MultiSelectFieldSchema,\n NumberFieldSchema,\n PasswordFieldSchema,\n RadioFieldSchema,\n SelectFieldSchema,\n SlugFieldSchema,\n TextareaFieldSchema,\n TextFieldSchema,\n ToggleFieldSchema,\n UrlFieldSchema,\n} from '@arqel-dev/types/fields';\nimport { cn } from '../utils/cn.js';\n\nexport interface NativeProps {\n field: FieldSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n disabled?: boolean | undefined;\n errors?: string[] | undefined;\n className?: string | undefined;\n inputId?: string | undefined;\n describedBy?: string | undefined;\n}\n\nconst inputClasses = cn(\n 'h-9 rounded-sm border border-[var(--input)]',\n 'bg-background px-3 text-sm',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n);\n\nexport function NativeFieldInput(props: NativeProps) {\n const { field } = props;\n\n switch (field.type) {\n case 'text':\n case 'email':\n case 'url':\n case 'password':\n case 'slug':\n return <TextLike {...props} field={field} />;\n case 'textarea':\n return <Textarea {...props} field={field} />;\n case 'number':\n case 'currency':\n return <NumericInput {...props} field={field} />;\n case 'boolean':\n case 'toggle':\n return <Checkbox {...props} field={field} />;\n case 'select':\n return <SelectInput {...props} field={field} />;\n case 'multiSelect':\n case 'hasMany':\n return <MultiSelectInput {...props} field={field} />;\n case 'radio':\n return <RadioGroup {...props} field={field} />;\n case 'belongsTo':\n return <BelongsToInput {...props} field={field} />;\n case 'date':\n case 'dateTime':\n return <DateInput {...props} field={field} />;\n case 'file':\n case 'image':\n return <FileInput {...props} />;\n default:\n return <UnregisteredField field={field} />;\n }\n}\n\n/**\n * Visible fallback when a field's `type` has no native input. This usually\n * means the field declared a custom `component` whose `/register` module was\n * never imported, so `getFieldComponent` returned undefined and we fell\n * through here. Instead of rendering nothing (a bare label, no control, no\n * diagnostic — #233), surface an inline notice and warn in the console.\n */\nfunction UnregisteredField({ field }: { field: FieldSchema }) {\n if (field.component) {\n console.warn(\n `[arqel] field \"${field.name}\" uses unregistered component \"${field.component}\" — ` +\n 'did you import its /register module?',\n );\n } else {\n console.warn(`[arqel] field \"${field.name}\" has no native input for type \"${field.type}\".`);\n }\n const detail = field.component\n ? `unregistered component \"${field.component}\"`\n : `unsupported type \"${field.type}\"`;\n return (\n <p\n data-testid=\"arqel-unregistered-field\"\n role=\"alert\"\n className=\"rounded-sm border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive\"\n >\n Field \"{field.name}\" could not render: {detail}.\n </p>\n );\n}\n\n/* ─── primitives ─────────────────────────────────────────────────── */\n\ntype TextLikeField =\n | TextFieldSchema\n | EmailFieldSchema\n | UrlFieldSchema\n | PasswordFieldSchema\n | SlugFieldSchema;\n\nfunction TextLike({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: TextLikeField }) {\n const htmlType =\n field.type === 'email'\n ? 'email'\n : field.type === 'password'\n ? 'password'\n : field.type === 'url'\n ? 'url'\n : 'text';\n const isDisabled = disabled || field.disabled || field.readonly;\n return (\n <input\n id={inputId}\n type={htmlType}\n className={inputClasses}\n value={typeof value === 'string' ? value : ((value ?? '')?.toString() ?? '')}\n placeholder={field.placeholder ?? undefined}\n disabled={isDisabled}\n readOnly={field.readonly === true}\n required={field.required === true}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n\nfunction Textarea({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: TextareaFieldSchema }) {\n return (\n <textarea\n id={inputId}\n className={cn(inputClasses, 'h-auto min-h-[5rem] py-2')}\n value={typeof value === 'string' ? value : ''}\n placeholder={field.placeholder ?? undefined}\n disabled={disabled || field.disabled || field.readonly}\n readOnly={field.readonly === true}\n required={field.required === true}\n rows={4}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n\nfunction NumericInput({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: NumberFieldSchema | CurrencyFieldSchema }) {\n return (\n <input\n id={inputId}\n type=\"number\"\n className={inputClasses}\n value={value === null || value === undefined ? '' : String(value)}\n placeholder={field.placeholder ?? undefined}\n disabled={disabled || field.disabled || field.readonly}\n readOnly={field.readonly === true}\n required={field.required === true}\n aria-describedby={describedBy}\n onChange={(e) => {\n const raw = e.target.value;\n if (raw === '') {\n onChange(null);\n return;\n }\n const num = Number(raw);\n onChange(Number.isNaN(num) ? null : num);\n }}\n />\n );\n}\n\nfunction Checkbox({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: BooleanFieldSchema | ToggleFieldSchema }) {\n return (\n <input\n id={inputId}\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border-[var(--input)]\"\n checked={value === true}\n disabled={disabled || field.disabled || field.readonly}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.checked)}\n />\n );\n}\n\nfunction normaliseOptions(\n options: SelectFieldSchema['props']['options'] | undefined,\n): Array<{ value: string | number; label: string }> {\n if (!options) return [];\n if (Array.isArray(options)) return options;\n return Object.entries(options).map(([value, label]) => ({ value, label }));\n}\n\nfunction SelectInput({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: SelectFieldSchema }) {\n const options = normaliseOptions(field.props.options);\n return (\n <select\n id={inputId}\n className={inputClasses}\n value={value === null || value === undefined ? '' : String(value)}\n disabled={disabled || field.disabled || field.readonly}\n required={field.required === true}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n >\n {field.placeholder && <option value=\"\">{field.placeholder}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n\nfunction MultiSelectInput({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: MultiSelectFieldSchema | HasManyFieldSchema }) {\n const arr = Array.isArray(value) ? (value as Array<string | number>) : [];\n const options = field.type === 'multiSelect' ? normaliseOptions(field.props.options) : [];\n return (\n <select\n id={inputId}\n multiple\n className={cn(inputClasses, 'h-auto min-h-[6rem] py-1')}\n value={arr.map(String)}\n disabled={disabled || field.disabled || field.readonly}\n aria-describedby={describedBy}\n onChange={(e) => {\n const next = Array.from(e.target.selectedOptions, (o) => o.value);\n onChange(next);\n }}\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n\nfunction RadioGroup({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: RadioFieldSchema }) {\n return (\n <div\n id={inputId}\n className=\"flex flex-col gap-1\"\n aria-describedby={describedBy}\n role=\"radiogroup\"\n >\n {(field.props.options ?? []).map((opt) => (\n <label key={opt.value} className=\"inline-flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n name={field.name}\n value={String(opt.value)}\n checked={String(value ?? '') === String(opt.value)}\n disabled={disabled || field.disabled || field.readonly}\n onChange={() => onChange(opt.value)}\n />\n {opt.label}\n </label>\n ))}\n </div>\n );\n}\n\nfunction BelongsToInput({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: BelongsToFieldSchema }) {\n // Phase 1 fallback: native text input. The full async-search picker\n // ships in `@arqel-dev/fields/BelongsToField` and registers via FieldRegistry.\n return (\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={value === null || value === undefined ? '' : String(value)}\n placeholder={field.placeholder ?? `Search ${field.props.relatedResource}…`}\n disabled={disabled || field.disabled || field.readonly}\n readOnly={field.readonly === true}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n />\n );\n}\n\nfunction DateInput({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: DateFieldSchema | DateTimeFieldSchema }) {\n return (\n <input\n id={inputId}\n type={field.type === 'dateTime' ? 'datetime-local' : 'date'}\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n disabled={disabled || field.disabled || field.readonly}\n readOnly={field.readonly === true}\n required={field.required === true}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n />\n );\n}\n\nfunction FileInput({\n field,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: FieldSchema }) {\n return (\n <input\n id={inputId}\n type=\"file\"\n className=\"text-sm\"\n disabled={disabled || field.disabled || field.readonly}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.files?.[0] ?? null)}\n />\n );\n}\n","/**\n * `<FieldRenderer>` — renders a single field.\n *\n * Resolution order:\n * 1. Component registered via `registerField(field.component)` (rich\n * inputs from `@arqel-dev/fields`)\n * 2. Native fallback dispatched by `field.type` (text/number/boolean/...)\n *\n * Errors come from `errors[name]` (Inertia or client). The component\n * also honours `disabled` / `readonly` / `required` from the schema.\n */\n\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport { type ChangeEvent, type ReactNode, useId } from 'react';\nimport { cn } from '../utils/cn.js';\nimport { getFieldComponent } from './FieldRegistry.js';\nimport { NativeFieldInput } from './nativeFields.js';\n\nexport interface FieldRendererProps {\n field: FieldSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n errors?: string[] | undefined;\n disabled?: boolean | undefined;\n className?: string | undefined;\n inputId?: string | undefined;\n describedBy?: string | undefined;\n}\n\nexport function FieldRenderer(props: FieldRendererProps): ReactNode {\n const { field, errors, className } = props;\n const id = useId();\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = errors && errors.length > 0;\n\n const Custom = field.component ? getFieldComponent(field.component) : undefined;\n const Input = Custom ?? (NativeFieldInput as typeof NativeFieldInput);\n\n const describedBy = [field.helperText ? helperId : null, hasError ? errorId : null]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n data-arqel-field={field.name}\n data-field-type={field.type}\n className={cn('flex flex-col gap-1', className)}\n >\n {field.label !== null && field.label !== '' && (\n <label htmlFor={id} className=\"text-sm font-medium\">\n {field.label}\n {field.required && (\n <span aria-hidden=\"true\" className=\"ml-0.5 text-destructive\">\n *\n </span>\n )}\n </label>\n )}\n <Input {...props} inputId={id} describedBy={describedBy || undefined} />\n {field.helperText && !hasError && (\n <p id={helperId} className=\"text-xs text-muted-foreground\">\n {field.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" className=\"text-xs text-destructive\">\n {errors[0]}\n </p>\n )}\n </div>\n );\n}\n\n/* ─── helpers ────────────────────────────────────────────────────── */\n\nexport function asInputChange<T>(\n cast: (raw: string) => T,\n): (event: ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => T {\n return (event) => cast(event.target.value);\n}\n","/**\n * `<FormFieldset>` — semantic `<fieldset>` with grid body.\n */\n\nimport type { FieldsetProps } from '@arqel-dev/types/forms';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface FormFieldsetProps {\n config: FieldsetProps;\n children: ReactNode;\n className?: string;\n}\n\nexport function FormFieldset({ config, children, className }: FormFieldsetProps) {\n return (\n <fieldset className={cn('rounded-md border border-border p-4', className)}>\n <legend className=\"px-1 text-sm font-medium\">{config.legend}</legend>\n <div\n className=\"grid gap-4\"\n style={{ gridTemplateColumns: `repeat(${config.columns ?? 1}, minmax(0, 1fr))` }}\n >\n {children}\n </div>\n </fieldset>\n );\n}\n","/**\n * `<FormGrid>` — responsive CSS-grid container.\n */\n\nimport type { GridProps } from '@arqel-dev/types/forms';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface FormGridProps {\n config: GridProps;\n children: ReactNode;\n className?: string;\n}\n\nconst BREAKPOINT_PREFIX: Record<string, string> = {\n sm: 'sm:',\n md: 'md:',\n lg: 'lg:',\n xl: 'xl:',\n '2xl': '2xl:',\n};\n\nexport function FormGrid({ config, children, className }: FormGridProps) {\n return (\n <div\n className={cn('grid', gridColsClass(config.columns), className)}\n style={{ gap: config.gap ?? '1rem' }}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Emit responsive Tailwind column classes from a flat int or a\n * `{sm,md,lg,xl,2xl}` map. Mirrors `<DashboardGrid>`'s generator so a\n * `{sm:1, md:2, lg:3}` map genuinely reflows (1 col on mobile → multi-col on\n * desktop) instead of locking to a single inline `grid-template-columns` value.\n */\nfunction gridColsClass(columns: GridProps['columns']): string {\n if (typeof columns === 'number') {\n return `grid-cols-${Math.max(1, Math.min(12, columns))}`;\n }\n // Base fallback = 1 column on the smallest screens.\n const parts: string[] = ['grid-cols-1'];\n for (const bp of ['sm', 'md', 'lg', 'xl', '2xl'] as const) {\n const value = columns[bp];\n if (typeof value === 'number') {\n parts.push(`${BREAKPOINT_PREFIX[bp]}grid-cols-${Math.max(1, Math.min(12, value))}`);\n }\n }\n return parts.join(' ');\n}\n","/**\n * `<FormSection>` — heading + optional description + collapsible body.\n *\n * Renders a SectionEntry. Aside layout (heading on the left, body on the\n * right) ships behind the `aside` prop so wide forms can read like docs.\n */\n\nimport type { SectionProps } from '@arqel-dev/types/forms';\nimport { type ReactNode, useState } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface FormSectionProps {\n config: SectionProps;\n children: ReactNode;\n className?: string;\n}\n\nexport function FormSection({ config, children, className }: FormSectionProps) {\n const [open, setOpen] = useState(!config.collapsed);\n const collapsible = config.collapsible === true;\n\n const heading = (\n <div className=\"flex items-start gap-2\">\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-semibold\">{config.heading}</h3>\n {config.description && (\n <p className=\"text-xs text-muted-foreground\">{config.description}</p>\n )}\n </div>\n {collapsible && (\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n className=\"text-sm text-muted-foreground hover:underline\"\n >\n {open ? 'Hide' : 'Show'}\n </button>\n )}\n </div>\n );\n\n const body = open && (\n <div\n className=\"grid gap-4\"\n style={{ gridTemplateColumns: `repeat(${config.columns ?? 1}, minmax(0, 1fr))` }}\n >\n {children}\n </div>\n );\n\n return (\n <section\n data-arqel-section=\"\"\n className={cn(\n 'rounded-md border border-border bg-background',\n config.compact ? 'p-3' : 'p-4',\n className,\n )}\n >\n {config.aside ? (\n <div className=\"grid gap-4 md:grid-cols-[16rem_1fr]\">\n <div>{heading}</div>\n <div>{body}</div>\n </div>\n ) : (\n <>\n <div className=\"mb-3\">{heading}</div>\n {body}\n </>\n )}\n </section>\n );\n}\n","/**\n * `<FormTabs>` — minimal tabs implementation (Phase 1).\n *\n * UI-002+ wires Base UI Tabs primitive properly; this Phase 1 version\n * is keyboard-accessible (Arrow keys + Home/End) but doesn't yet support\n * lazy mounting or controlled mode.\n */\n\nimport type { TabsProps } from '@arqel-dev/types/forms';\nimport { type ReactElement, type ReactNode, useId, useRef, useState } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface FormTabConfig {\n id: string;\n label: string;\n badge?: number | undefined;\n content: ReactNode;\n}\n\nexport interface FormTabsProps {\n config: TabsProps;\n tabs: FormTabConfig[];\n className?: string;\n}\n\nexport function FormTabs({ config, tabs, className }: FormTabsProps): ReactElement | null {\n const [active, setActive] = useState(config.defaultTab ?? tabs[0]?.id ?? null);\n const baseId = useId();\n const refs = useRef<(HTMLButtonElement | null)[]>([]);\n\n if (tabs.length === 0 || active === null) return null;\n const activeIndex = Math.max(\n 0,\n tabs.findIndex((t) => t.id === active),\n );\n const activeTab = tabs[activeIndex];\n if (!activeTab) return null;\n\n const focus = (i: number) => {\n const target = tabs[i];\n if (!target) return;\n setActive(target.id);\n refs.current[i]?.focus();\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n focus((activeIndex + 1) % tabs.length);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n focus((activeIndex - 1 + tabs.length) % tabs.length);\n } else if (e.key === 'Home') {\n e.preventDefault();\n focus(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n focus(tabs.length - 1);\n }\n };\n\n return (\n <div className={className}>\n <div\n role=\"tablist\"\n aria-orientation={config.orientation}\n className=\"flex gap-1 border-b border-border\"\n >\n {tabs.map((tab, i) => {\n const selected = tab.id === active;\n return (\n <button\n key={tab.id}\n ref={(el) => {\n refs.current[i] = el;\n }}\n type=\"button\"\n role=\"tab\"\n id={`${baseId}-tab-${tab.id}`}\n aria-controls={`${baseId}-panel-${tab.id}`}\n aria-selected={selected}\n tabIndex={selected ? 0 : -1}\n onClick={() => setActive(tab.id)}\n onKeyDown={onKeyDown}\n className={cn(\n '-mb-px inline-flex min-h-11 items-center border-b-2 px-3 py-2 text-sm transition-colors',\n selected\n ? 'border-primary font-medium text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground',\n )}\n >\n {tab.label}\n {tab.badge !== undefined && tab.badge !== null && (\n <span className=\"ml-1 rounded-full bg-muted px-1.5 text-xs\">{tab.badge}</span>\n )}\n </button>\n );\n })}\n </div>\n <div\n role=\"tabpanel\"\n id={`${baseId}-panel-${activeTab.id}`}\n aria-labelledby={`${baseId}-tab-${activeTab.id}`}\n className=\"pt-4\"\n >\n {activeTab.content}\n </div>\n </div>\n );\n}\n","/**\n * `<FormRenderer>` — recursive walker over `FormSchema`.\n *\n * Each `SchemaEntry` dispatches to the matching layout component\n * (`Section`, `Fieldset`, `Grid`, `Tabs`, …) or to `<FieldRenderer>`\n * when it's a leaf. `Tabs` collects child `Tab` entries so the\n * keyboard-accessible `<FormTabs>` can render them as panels.\n *\n * The renderer is *presentational*: state lives in the caller (typically\n * `useArqelForm`). `value(name)` and `setValue(name, value)` resolve\n * field state, while `errors[name]` carries server/client validation\n * messages.\n */\n\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport {\n type FieldEntry,\n type FormSchema,\n isFieldEntry,\n isLayoutEntry,\n type LayoutEntry,\n type SchemaEntry,\n type TabEntry,\n} from '@arqel-dev/types/forms';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\nimport { FieldRenderer } from './FieldRenderer.js';\nimport { FormFieldset } from './FormFieldset.js';\nimport { FormGrid } from './FormGrid.js';\nimport { FormSection } from './FormSection.js';\nimport { type FormTabConfig, FormTabs } from './FormTabs.js';\n\nexport interface FormRendererProps {\n schema: FormSchema;\n fields: FieldSchema[];\n values: Record<string, unknown>;\n errors?: Record<string, string[]>;\n onChange: (name: string, value: unknown) => void;\n disabled?: boolean;\n className?: string;\n}\n\nexport function FormRenderer({\n schema,\n fields,\n values,\n errors = {},\n onChange,\n disabled = false,\n className,\n}: FormRendererProps) {\n // Resolve each schema entry to its OWN field object. A name-keyed Map\n // would silently collapse two fields sharing a `name` (e.g. a `status`\n // text + a `status` select) onto the last one, dropping a control. We\n // instead consume matching fields positionally — preferring an exact\n // (name, type) match and never reusing an already-claimed field — so\n // duplicate-named entries each render their distinct schema (#233).\n const remaining = [...fields];\n\n const claimField = (entry: FieldEntry): FieldSchema | undefined => {\n let idx = remaining.findIndex((f) => f.name === entry.name && f.type === entry.type);\n if (idx === -1) idx = remaining.findIndex((f) => f.name === entry.name);\n if (idx === -1) return undefined;\n return remaining.splice(idx, 1)[0];\n };\n\n const renderEntry = (entry: SchemaEntry, key: string): ReactNode => {\n if (isFieldEntry(entry)) {\n return renderFieldEntry(entry, key);\n }\n if (isLayoutEntry(entry)) {\n return renderLayoutEntry(entry, key);\n }\n return null;\n };\n\n const renderFieldEntry = (entry: FieldEntry, key: string): ReactNode => {\n const field = claimField(entry);\n if (!field) return null;\n return (\n <FieldRenderer\n key={key}\n field={field}\n value={values[entry.name]}\n errors={errors[entry.name]}\n disabled={disabled || schema.disabled === true}\n onChange={(value) => onChange(entry.name, value)}\n />\n );\n };\n\n const renderChildren = (entries: SchemaEntry[] | undefined): ReactNode => {\n if (!entries) return null;\n return entries.map((child, i) => renderEntry(child, `${i}`));\n };\n\n const renderLayoutEntry = (entry: LayoutEntry, key: string): ReactNode => {\n switch (entry.type) {\n case 'section':\n return (\n <FormSection key={key} config={entry.props}>\n {renderChildren(entry.schema)}\n </FormSection>\n );\n case 'fieldset':\n return (\n <FormFieldset key={key} config={entry.props}>\n {renderChildren(entry.schema)}\n </FormFieldset>\n );\n case 'grid':\n case 'columns':\n return (\n <FormGrid\n key={key}\n config={entry.type === 'columns' ? { columns: entry.props.columns } : entry.props}\n >\n {renderChildren(entry.schema)}\n </FormGrid>\n );\n case 'group':\n return (\n <div\n key={key}\n className={cn(\n 'flex gap-4',\n entry.props.orientation === 'vertical' ? 'flex-col' : 'flex-row',\n )}\n >\n {renderChildren(entry.schema)}\n </div>\n );\n case 'tabs': {\n const tabs: FormTabConfig[] = (entry.schema ?? [])\n .filter((c): c is TabEntry => isLayoutEntry(c) && c.type === 'tab')\n .map((tab) => ({\n id: tab.props.id,\n label: tab.props.label,\n badge: tab.props.badge,\n content: renderChildren(tab.schema) ?? <span key={`tab-${tab.props.id}-empty`} />,\n }));\n return <FormTabs key={key} config={entry.props} tabs={tabs} />;\n }\n case 'tab':\n // Tabs collect their children directly; lone Tab entries are\n // a no-op to avoid rendering the same content twice.\n return null;\n }\n };\n\n const columns = schema.columns ?? 1;\n\n return (\n <div\n data-arqel-form=\"\"\n className={cn('grid gap-4', className)}\n style={\n columns > 1 ? { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` } : undefined\n }\n >\n {schema.schema.map((entry, i) => renderEntry(entry, `${i}`))}\n </div>\n );\n}\n"]}
|