@tetrascience-npm/tetrascience-react-ui 1.0.0-beta.136.1 → 1.0.0-beta.138.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/dist/components/ai/context.d.ts +4 -4
- package/dist/components/composed/AppShellSimple/AppShellSimple.cjs +2 -0
- package/dist/components/composed/AppShellSimple/AppShellSimple.cjs.map +1 -0
- package/dist/components/composed/AppShellSimple/AppShellSimple.d.ts +49 -0
- package/dist/components/composed/AppShellSimple/AppShellSimple.js +204 -0
- package/dist/components/composed/AppShellSimple/AppShellSimple.js.map +1 -0
- package/dist/components/composed/AppShellSimple/index.d.ts +2 -0
- package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
- package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
- package/dist/components/composed/DataAppShell/DataAppShell.js +86 -93
- package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
- package/dist/components/composed/DataAppShell/PrimaryNav.cjs +1 -1
- package/dist/components/composed/DataAppShell/PrimaryNav.cjs.map +1 -1
- package/dist/components/composed/DataAppShell/PrimaryNav.js +106 -92
- package/dist/components/composed/DataAppShell/PrimaryNav.js.map +1 -1
- package/dist/components/composed/PageHeader/PageHeader.cjs +2 -0
- package/dist/components/composed/PageHeader/PageHeader.cjs.map +1 -0
- package/dist/components/composed/PageHeader/PageHeader.d.ts +106 -0
- package/dist/components/composed/PageHeader/PageHeader.js +38 -0
- package/dist/components/composed/PageHeader/PageHeader.js.map +1 -0
- package/dist/components/composed/PageHeader/index.d.ts +1 -0
- package/dist/components/ui/badge.d.ts +1 -1
- package/dist/components/ui/button.d.ts +2 -2
- package/dist/components/ui/input-group.d.ts +1 -1
- package/dist/components/ui/item.d.ts +2 -2
- package/dist/components/ui/tabs.d.ts +1 -1
- package/dist/composed/AppShellSimple.cjs +2 -0
- package/dist/composed/AppShellSimple.cjs.map +1 -0
- package/dist/composed/AppShellSimple.js +5 -0
- package/dist/composed/AppShellSimple.js.map +1 -0
- package/dist/composed/PageHeader.cjs +2 -0
- package/dist/composed/PageHeader.cjs.map +1 -0
- package/dist/composed/PageHeader.js +5 -0
- package/dist/composed/PageHeader.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +714 -710
- package/dist/index.js.map +1 -1
- package/dist/index.tailwind.css +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataAppShell.cjs","sources":["../../../../src/components/composed/DataAppShell/DataAppShell.tsx"],"sourcesContent":["import { ArrowLeft, ChevronRight, Menu } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { ShellCollapseButton } from \"./CollapseButton\";\nimport { DataAppShellPrimaryNav } from \"./PrimaryNav\";\nimport { DataAppShellProvider, type DataAppShellNavVariant } from \"./ShellContext\";\n\nimport type { NavGroup } from \"./PrimaryNav\";\n\nimport { TDPLink } from \"@/components/composed/tdp-link\";\nimport { TopBar } from \"@/components/composed/TopBar\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetTitle,\n SheetTrigger,\n} from \"@/components/ui/sheet\";\nimport { cn } from \"@/lib/utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n// Nav item types live with the nav engine — re-exported here for back-compat.\nexport type { NavPage, NavGroup } from \"./PrimaryNav\";\n\nexport interface BreadcrumbItemConfig {\n /** Display label */\n label: string;\n /** If provided, renders as a link */\n href?: string;\n /** Click handler (used when no href is provided) */\n onClick?: () => void;\n}\n\nexport interface DataAppShellProps {\n // -- Sidebar --\n /** Application name/abbreviation shown in the logo button */\n appName: string;\n /** Full application name shown in the app dropdown and mobile nav header */\n appFullName?: string;\n /** Custom icon element shown in the logo area */\n appIcon?: React.ReactNode;\n /** Optional version string shown below the app name/icon in the sidebar header */\n version?: string;\n /** Navigation groups; each group contains one or more pages */\n navGroups: NavGroup[];\n /** Callback when the app name / icon is clicked in the dropdown */\n onAppNameClick?: () => void;\n /** TDP path to navigate to when \"Back to TDP Platform\" is clicked (uses TDPLink — requires TdpNavigationProvider) */\n backToPlatformPath?: string;\n /** Fallback callback when \"Back to TDP Platform\" is clicked and no backToPlatformPath is set */\n onBackToPlatform?: () => void;\n /** Slot rendered at the bottom of the sidebar (e.g. user avatar + menu) */\n userMenu?: React.ReactNode;\n\n // -- Top nav --\n /** Breadcrumb items from root to current page */\n breadcrumbs?: BreadcrumbItemConfig[];\n /** Slot rendered after the breadcrumbs in the top bar's left group\n * (e.g. a collapsed horizontal workflow's step dropdown) */\n headerLeft?: React.ReactNode;\n /** Center \"context\" slot in the top bar (e.g. a version / status selector) */\n headerCenter?: React.ReactNode;\n /** Slot for right-side actions in the top nav (e.g. data count pills, next button) */\n headerActions?: React.ReactNode;\n\n // -- Shell zones --\n /** Primary nav axis — `vertical` (sidebar/rail, default) or `horizontal` (top nav row) */\n navVariant?: DataAppShellNavVariant;\n /**\n * Vertical primary nav presentation:\n * - `rail` (default) — permanent 48px icon-only rail.\n * - `sidebar` — collapsible 220px sidebar with labels; its brand-row chevron\n * collapses it to an icon rail (with an expand chevron under the logo),\n * driven by the shell's `collapsed` state.\n */\n primaryNav?: \"rail\" | \"sidebar\";\n /** Slot rendered between the primary nav and the content (e.g. a vertical `DataAppShellSecondaryNav`) */\n sidebarPanel?: React.ReactNode;\n /** Full-width zone between the top bar and the content row (e.g. a horizontal `DataAppShellSecondaryNav`) */\n secondaryBar?: React.ReactNode;\n /** Slot rendered after the content (e.g. a DataAppShellRightPanel) — its FAB anchors to the content row */\n rightPanel?: React.ReactNode;\n /** Show the primary nav zone. Set false to hide it entirely. */\n showNavRail?: boolean; // default true\n /** Show the top bar zone. Set false to hide it entirely. */\n showTopBar?: boolean; // default true\n\n // -- Collapse (vertical nav only) --\n /** Controlled collapse state — drives the secondary zone (via ShellContext)\n * and, with `hideNavOnCollapse`, the primary rail */\n collapsed?: boolean;\n /** Uncontrolled initial collapse state */\n defaultCollapsed?: boolean;\n /** Called whenever the shell collapse state flips */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Collapsing also hides the primary rail, leaving one icon rail (the secondary\n * nav) with an expand affordance — or a floating expand button if there is none. */\n hideNavOnCollapse?: boolean;\n /** Media query that auto-collapses the shell while it matches.\n * Pass `false` to disable. Defaults to `\"(max-width: 1023px)\"`. */\n autoCollapse?: string | false;\n\n /** Main content area */\n children: React.ReactNode;\n /** Additional className for the root container */\n className?: string;\n}\n\n// =============================================================================\n// Sidebar shared body (used by desktop rail + mobile Sheet)\n// =============================================================================\n\ninterface SidebarBodyProps\n extends Pick<\n DataAppShellProps,\n | \"appName\"\n | \"appFullName\"\n | \"appIcon\"\n | \"version\"\n | \"navGroups\"\n | \"onAppNameClick\"\n | \"backToPlatformPath\"\n | \"onBackToPlatform\"\n | \"userMenu\"\n > {\n /**\n * compact=true → narrow icon rail (48px): icon-only nav buttons, tooltips on hover\n * compact=false → expanded mobile sheet (220px): icon + label side-by-side rows\n */\n compact: boolean;\n /** Called after a nav page item is clicked — used by mobile sheet to close itself */\n onAfterNavClick?: () => void;\n}\n\n// =============================================================================\n// App header menu — logo/name button opening the app dropdown\n// =============================================================================\n\ninterface AppHeaderMenuProps\n extends Pick<\n DataAppShellProps,\n | \"appName\"\n | \"appFullName\"\n | \"appIcon\"\n | \"version\"\n | \"onAppNameClick\"\n | \"backToPlatformPath\"\n | \"onBackToPlatform\"\n > {\n /** compact=true → icon-only trigger (rail); compact=false → icon + name row */\n compact: boolean;\n /** Which side of the trigger the dropdown opens on — `right` beside a rail, `bottom` under a top bar */\n menuSide?: \"right\" | \"bottom\";\n}\n\nfunction AppHeaderMenu({\n appName,\n appFullName,\n appIcon,\n version,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n compact,\n menuSide = \"right\",\n}: AppHeaderMenuProps) {\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"cursor-pointer bg-transparent border-none p-0\",\n !compact && \"flex items-center gap-3 w-full text-left\"\n )}\n >\n {/* Icon */}\n <span\n className={cn(\n \"flex items-center justify-center rounded-lg bg-sidebar-accent border border-sidebar-border font-bold text-foreground shrink-0 w-8 h-8 text-[10px]\"\n )}\n >\n {appIcon ?? appName}\n </span>\n\n {/* Name (expanded only — no version here) */}\n {!compact && (\n <span className=\"text-sm font-semibold text-foreground truncate leading-snug\">\n {appFullName ?? appName}\n </span>\n )}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent side={menuSide} align=\"start\" className=\"min-w-[220px]\">\n <DropdownMenuItem\n className=\"gap-3 px-3 py-2.5\"\n onSelect={() => onAppNameClick?.()}\n >\n <div className=\"w-8 h-8 rounded-lg bg-sidebar-accent border border-sidebar-border flex items-center justify-center shrink-0\">\n <span className=\"text-[10px] font-bold text-foreground\">\n {appIcon ?? appName}\n </span>\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-semibold text-foreground truncate\">\n {appFullName ?? appName}\n </span>\n {version && (\n <span className=\"text-[10px] text-muted-foreground/70 font-mono leading-none mt-0.5\">\n {version}\n </span>\n )}\n </div>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"gap-2.5 p-0\" asChild>\n {backToPlatformPath ? (\n <TDPLink\n path={backToPlatformPath}\n navigationOptions={{ newTab: false }}\n className=\"flex items-center gap-2.5 w-full px-2 py-1.5 !no-underline hover:!no-underline\"\n >\n <ArrowLeft className=\"w-4 h-4 text-muted-foreground\" />\n Back to TDP Platform\n </TDPLink>\n ) : (\n <button\n type=\"button\"\n className=\"flex items-center gap-2.5 w-full px-2 py-1.5 bg-transparent border-none cursor-pointer\"\n onClick={onBackToPlatform}\n >\n <ArrowLeft className=\"w-4 h-4 text-muted-foreground\" />\n Back to TDP Platform\n </button>\n )}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n// =============================================================================\n// Sidebar shared body — the PrimaryNav engine with the app header + user slots\n// =============================================================================\n\nfunction SidebarBody({\n appName,\n appFullName,\n appIcon,\n version,\n navGroups,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n userMenu,\n compact,\n onAfterNavClick,\n}: SidebarBodyProps) {\n return (\n <DataAppShellPrimaryNav\n variant={compact ? \"rail\" : \"sidebar\"}\n aria-label=\"Application navigation\"\n navGroups={navGroups}\n onSelect={() => onAfterNavClick?.()}\n header={\n <AppHeaderMenu\n appName={appName}\n appFullName={appFullName}\n appIcon={appIcon}\n version={version}\n onAppNameClick={onAppNameClick}\n backToPlatformPath={backToPlatformPath}\n onBackToPlatform={onBackToPlatform}\n compact={compact}\n />\n }\n user={userMenu}\n className=\"h-full w-full\"\n />\n );\n}\n\n// =============================================================================\n// Icon rail sidebar (desktop only — hidden on mobile)\n// =============================================================================\n\nfunction IconRailSidebar(props: Omit<SidebarBodyProps, \"compact\" | \"onAfterNavClick\">) {\n return (\n <div\n data-slot=\"data-app-sidebar-rail\"\n className=\"hidden md:flex w-12 flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <SidebarBody compact {...props} />\n </div>\n );\n}\n\n// =============================================================================\n// Collapsible primary sidebar (desktop only — hidden on mobile). Expanded, it\n// shows the app name, labelled nav, and a collapse chevron in the brand row;\n// collapsed, it becomes an icon rail with the expand chevron directly under\n// the logo (mirrors the SW-2118 playground).\n// =============================================================================\n\ninterface PrimarySidebarProps extends Omit<SidebarBodyProps, \"compact\" | \"onAfterNavClick\"> {\n collapsed: boolean;\n onCollapsedChange: (collapsed: boolean) => void;\n}\n\nfunction PrimarySidebar({ collapsed, onCollapsedChange, ...sidebarProps }: PrimarySidebarProps) {\n const { appName, appFullName, appIcon, version, onAppNameClick, backToPlatformPath, onBackToPlatform } =\n sidebarProps;\n const headerMenuProps = {\n appName,\n appFullName,\n appIcon,\n version,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n };\n\n if (collapsed) {\n return (\n <div\n data-slot=\"data-app-sidebar-rail\"\n data-collapsed=\"true\"\n className=\"hidden md:flex w-12 flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <DataAppShellPrimaryNav\n variant=\"rail\"\n aria-label=\"Application navigation\"\n navGroups={sidebarProps.navGroups}\n header={\n <div className=\"flex flex-col items-center gap-2\">\n <AppHeaderMenu {...headerMenuProps} compact />\n <ShellCollapseButton\n direction=\"right\"\n label=\"Expand navigation\"\n onClick={() => onCollapsedChange(false)}\n />\n </div>\n }\n user={sidebarProps.userMenu}\n className=\"h-full w-full\"\n />\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"data-app-sidebar\"\n data-collapsed=\"false\"\n className=\"hidden md:flex w-[220px] flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <DataAppShellPrimaryNav\n variant=\"sidebar\"\n aria-label=\"Application navigation\"\n navGroups={sidebarProps.navGroups}\n header={\n <div className=\"flex items-center gap-2 w-full min-w-0\">\n <div className=\"flex-1 min-w-0\">\n <AppHeaderMenu {...headerMenuProps} compact={false} />\n </div>\n <ShellCollapseButton\n direction=\"left\"\n label=\"Collapse navigation\"\n onClick={() => onCollapsedChange(true)}\n />\n </div>\n }\n user={sidebarProps.userMenu}\n className=\"h-full w-full\"\n />\n </div>\n );\n}\n\n// =============================================================================\n// Breadcrumb trail — rendered from the shell's breadcrumb config\n// =============================================================================\n\nfunction TopNavBreadcrumb({ items }: { items: BreadcrumbItemConfig[] }) {\n return (\n // min-w-0 lets the trail shrink inside the top bar's flex-1 left group;\n // flex-nowrap keeps it one line instead of Breadcrumb's default wrap\n // (which, combined with a squeezed left group, wrapped mid-trail and\n // pushed the rest of the top bar around — SW-2118).\n <Breadcrumb className=\"min-w-0\">\n <BreadcrumbList className=\"flex-nowrap min-w-0\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const isClickable = !isLast && (!!item.href || !!item.onClick);\n // Only the current (last) crumb truncates — earlier crumbs keep\n // their natural width so the trail reads left-to-right.\n const itemClassName = isLast ? \"min-w-0\" : \"shrink-0\";\n return (\n <React.Fragment key={`${item.label}-${index}`}>\n {index > 0 && <BreadcrumbSeparator className=\"shrink-0\">/</BreadcrumbSeparator>}\n <BreadcrumbItem className={itemClassName}>\n {isLast ? (\n <BreadcrumbPage className=\"truncate\">{item.label}</BreadcrumbPage>\n ) : isClickable && item.href ? (\n <BreadcrumbLink href={item.href} className=\"whitespace-nowrap\">\n {item.label}\n </BreadcrumbLink>\n ) : isClickable && item.onClick ? (\n <button\n type=\"button\"\n className=\"text-sm text-primary hover:underline cursor-pointer bg-transparent border-none p-0 font-normal whitespace-nowrap\"\n onClick={item.onClick}\n >\n {item.label}\n </button>\n ) : (\n <span className=\"text-sm text-muted-foreground whitespace-nowrap\">\n {item.label}\n </span>\n )}\n </BreadcrumbItem>\n </React.Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n\n// =============================================================================\n// Top nav — maps shell props onto the reusable TopBar (left/center/right)\n// =============================================================================\n\nfunction TopNav({\n breadcrumbs = [],\n headerLeft,\n headerCenter,\n headerActions,\n mobileTrigger,\n}: {\n breadcrumbs?: BreadcrumbItemConfig[];\n headerLeft?: React.ReactNode;\n headerCenter?: React.ReactNode;\n headerActions?: React.ReactNode;\n mobileTrigger?: React.ReactNode;\n}) {\n return (\n <TopBar\n data-slot=\"data-app-top-nav\"\n left={\n <>\n {/* Mobile hamburger (hidden on md+). shrink-0 — only the\n breadcrumb trail gives up width when the left group is tight. */}\n {mobileTrigger && <div className=\"shrink-0\">{mobileTrigger}</div>}\n <TopNavBreadcrumb items={breadcrumbs} />\n {headerLeft != null && <div className=\"shrink-0\">{headerLeft}</div>}\n </>\n }\n center={headerCenter}\n right={headerActions}\n />\n );\n}\n\n// =============================================================================\n// DataAppShell\n// =============================================================================\n\nfunction DataAppShell({\n appName,\n appFullName,\n appIcon,\n version,\n navGroups,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n userMenu,\n breadcrumbs = [],\n headerLeft,\n headerCenter,\n headerActions,\n navVariant = \"vertical\",\n primaryNav = \"rail\",\n sidebarPanel,\n secondaryBar,\n rightPanel,\n showNavRail = true,\n showTopBar = true,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n hideNavOnCollapse = false,\n autoCollapse = \"(max-width: 1023px)\",\n children,\n className,\n}: DataAppShellProps) {\n const [mobileNavOpen, setMobileNavOpen] = React.useState(false);\n\n // ── Single collapse toggle (controlled/uncontrolled) ───────────────────────\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const collapsed = collapsedProp ?? internalCollapsed;\n const collapsedRef = React.useRef(collapsed);\n collapsedRef.current = collapsed;\n // Set when the media query (not the user) collapsed the shell, so leaving\n // the breakpoint restores the expanded state without fighting manual toggles.\n const autoCollapsedRef = React.useRef(false);\n\n const setCollapsed = React.useCallback(\n (next: boolean) => {\n autoCollapsedRef.current = false;\n if (collapsedProp === undefined) setInternalCollapsed(next);\n onCollapsedChange?.(next);\n },\n [collapsedProp, onCollapsedChange],\n );\n\n // ── Responsive auto-collapse below the breakpoint ───────────────────────────\n // The media-query handler lives in a ref so the subscription survives\n // re-renders without re-running for every collapse/callback change.\n const applyAutoCollapseRef = React.useRef((matches: boolean) => void matches);\n applyAutoCollapseRef.current = (matches: boolean) => {\n if (matches && !collapsedRef.current) {\n if (collapsedProp === undefined) setInternalCollapsed(true);\n onCollapsedChange?.(true);\n autoCollapsedRef.current = true;\n } else if (!matches && autoCollapsedRef.current) {\n autoCollapsedRef.current = false;\n if (collapsedProp === undefined) setInternalCollapsed(false);\n onCollapsedChange?.(false);\n }\n };\n\n React.useEffect(() => {\n if (autoCollapse === false || navVariant !== \"vertical\") return;\n const mql = window.matchMedia(autoCollapse);\n applyAutoCollapseRef.current(mql.matches);\n const onChange = (e: MediaQueryListEvent) => applyAutoCollapseRef.current(e.matches);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, [autoCollapse, navVariant]);\n\n const sidebarProps = {\n appName,\n appFullName,\n appIcon,\n version,\n navGroups,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n userMenu,\n };\n\n const isVertical = navVariant === \"vertical\";\n // A collapsible sidebar renders its own collapsed rail, so it is never\n // hidden by collapse. hideNavOnCollapse only removes the permanent icon rail.\n const isCollapsibleSidebar = isVertical && primaryNav === \"sidebar\";\n const navHidden =\n !showNavRail || (hideNavOnCollapse && collapsed && !isCollapsibleSidebar);\n\n // CSS-grid template areas per navVariant — the shell knows zones, never\n // domain concepts. Zones absent from the tree simply collapse their track.\n // The secondary (side) zone starts below the top bar / secondary bar, so\n // breadcrumbs span the full width beside the primary nav.\n const gridClass = isVertical\n ? \"grid h-screen w-full overflow-hidden [grid-template-columns:auto_auto_minmax(0,1fr)] [grid-template-rows:auto_auto_minmax(0,1fr)] [grid-template-areas:'nav_top_top'_'nav_sub_sub'_'nav_side_body']\"\n : \"grid h-screen w-full overflow-hidden [grid-template-columns:auto_minmax(0,1fr)] [grid-template-rows:auto_auto_auto_minmax(0,1fr)] [grid-template-areas:'pnav_pnav'_'top_top'_'sub_sub'_'side_body']\";\n\n return (\n <DataAppShellProvider value={{ navVariant, collapsed, setCollapsed, hideNavOnCollapse }}>\n <Sheet open={mobileNavOpen} onOpenChange={setMobileNavOpen}>\n <div\n data-slot=\"data-app-shell\"\n data-nav-variant={navVariant}\n data-collapsed={collapsed || undefined}\n className={cn(gridClass, className)}\n >\n {/* Primary nav zone */}\n {!navHidden &&\n (isVertical ? (\n <div className=\"[grid-area:nav] min-h-0\">\n {isCollapsibleSidebar ? (\n <PrimarySidebar\n collapsed={collapsed}\n onCollapsedChange={setCollapsed}\n {...sidebarProps}\n />\n ) : (\n <IconRailSidebar {...sidebarProps} />\n )}\n </div>\n ) : (\n <div className=\"[grid-area:pnav] hidden md:block border-b border-sidebar-border bg-sidebar px-3 py-1.5\">\n <DataAppShellPrimaryNav\n variant=\"top\"\n aria-label=\"Application navigation\"\n navGroups={navGroups}\n header={<AppHeaderMenu {...sidebarProps} compact menuSide=\"bottom\" />}\n user={userMenu}\n />\n </div>\n ))}\n\n {/* Floating expand affordance — hideNavOnCollapse with no secondary rail */}\n {hideNavOnCollapse && collapsed && !sidebarPanel && (\n <Button\n data-slot=\"data-app-shell-expand-fab\"\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"Expand navigation\"\n className=\"absolute left-2 top-2 z-50 shadow-elevation-2\"\n onClick={() => setCollapsed(false)}\n >\n <ChevronRight className=\"w-4 h-4\" />\n </Button>\n )}\n\n {/* Mobile sidebar Sheet */}\n <SheetContent\n side=\"left\"\n showCloseButton={false}\n className=\"p-0 bg-sidebar border-r border-sidebar-border data-[side=left]:w-[220px] data-[side=left]:sm:w-[220px] data-[side=left]:sm:max-w-[220px] flex flex-col\"\n >\n <SheetTitle className=\"sr-only\">Navigation</SheetTitle>\n <SheetDescription className=\"sr-only\">\n Application navigation menu\n </SheetDescription>\n <SidebarBody\n compact={false}\n onAfterNavClick={() => setMobileNavOpen(false)}\n {...sidebarProps}\n />\n </SheetContent>\n\n {/* Secondary (side) zone — e.g. a vertical DataAppShellSecondaryNav */}\n {sidebarPanel && <div className=\"[grid-area:side] min-h-0 flex\">{sidebarPanel}</div>}\n\n {/* Top bar zone */}\n {showTopBar && (\n <div className=\"[grid-area:top] min-w-0\">\n <TopNav\n breadcrumbs={breadcrumbs}\n headerLeft={headerLeft}\n headerCenter={headerCenter}\n headerActions={headerActions}\n mobileTrigger={\n <SheetTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Open navigation menu\"\n className=\"md:hidden w-7 h-7 shrink-0 text-muted-foreground\"\n >\n <Menu className=\"w-4 h-4\" />\n </Button>\n </SheetTrigger>\n }\n />\n </div>\n )}\n\n {/* Secondary bar zone — e.g. a horizontal DataAppShellSecondaryNav */}\n {secondaryBar && <div className=\"[grid-area:sub] min-w-0\">{secondaryBar}</div>}\n\n {/* Body zone: content + right panel. relative — anchors the right\n panel's floating FAB trigger */}\n <div className=\"[grid-area:body] relative flex min-h-0 min-w-0 overflow-hidden\">\n <main\n data-slot=\"data-app-shell-content\"\n className=\"flex-1 min-w-0 overflow-auto bg-background\"\n >\n {children}\n </main>\n\n {/* Right panel slot (e.g. DataAppShellRightPanel) */}\n {rightPanel}\n </div>\n </div>\n </Sheet>\n </DataAppShellProvider>\n );\n}\n\nexport default DataAppShell;\nexport { AppHeaderMenu, DataAppShell };\n"],"names":["AppHeaderMenu","appName","appFullName","appIcon","version","onAppNameClick","backToPlatformPath","onBackToPlatform","compact","menuSide","jsxs","DropdownMenu","jsx","DropdownMenuTrigger","cn","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","TDPLink","ArrowLeft","SidebarBody","navGroups","userMenu","onAfterNavClick","DataAppShellPrimaryNav","IconRailSidebar","props","PrimarySidebar","collapsed","onCollapsedChange","sidebarProps","headerMenuProps","ShellCollapseButton","TopNavBreadcrumb","items","Breadcrumb","BreadcrumbList","item","index","isLast","isClickable","itemClassName","React","BreadcrumbSeparator","BreadcrumbItem","BreadcrumbPage","BreadcrumbLink","TopNav","breadcrumbs","headerLeft","headerCenter","headerActions","mobileTrigger","TopBar","Fragment","DataAppShell","navVariant","primaryNav","sidebarPanel","secondaryBar","rightPanel","showNavRail","showTopBar","collapsedProp","defaultCollapsed","hideNavOnCollapse","autoCollapse","children","className","mobileNavOpen","setMobileNavOpen","internalCollapsed","setInternalCollapsed","collapsedRef","autoCollapsedRef","setCollapsed","next","applyAutoCollapseRef","matches","mql","onChange","e","isVertical","isCollapsibleSidebar","navHidden","gridClass","DataAppShellProvider","Sheet","Button","ChevronRight","SheetContent","SheetTitle","SheetDescription","SheetTrigger","Menu"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataAppShell.cjs","sources":["../../../../src/components/composed/DataAppShell/DataAppShell.tsx"],"sourcesContent":["import { ArrowLeft, ChevronRight, Menu } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { ShellCollapseButton } from \"./CollapseButton\";\nimport { DataAppShellPrimaryNav } from \"./PrimaryNav\";\nimport { DataAppShellProvider, type DataAppShellNavVariant } from \"./ShellContext\";\n\nimport type { NavGroup } from \"./PrimaryNav\";\n\nimport { TDPLink } from \"@/components/composed/tdp-link\";\nimport { TopBar } from \"@/components/composed/TopBar\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetTitle,\n SheetTrigger,\n} from \"@/components/ui/sheet\";\nimport { cn } from \"@/lib/utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n// Nav item types live with the nav engine — re-exported here for back-compat.\nexport type { NavPage, NavGroup } from \"./PrimaryNav\";\n\nexport interface BreadcrumbItemConfig {\n /** Display label */\n label: string;\n /** If provided, renders as a link */\n href?: string;\n /** Click handler (used when no href is provided) */\n onClick?: () => void;\n}\n\nexport interface DataAppShellProps {\n // -- Sidebar --\n /** Application name/abbreviation shown in the logo button */\n appName: string;\n /** Full application name shown in the app dropdown and mobile nav header */\n appFullName?: string;\n /** Custom icon element shown in the logo area */\n appIcon?: React.ReactNode;\n /** Optional version string shown below the app name/icon in the sidebar header */\n version?: string;\n /** Navigation groups; each group contains one or more pages */\n navGroups: NavGroup[];\n /** Callback when the app name / icon is clicked in the dropdown */\n onAppNameClick?: () => void;\n /** TDP path to navigate to when \"Back to TDP Platform\" is clicked (uses TDPLink — requires TdpNavigationProvider) */\n backToPlatformPath?: string;\n /** Fallback callback when \"Back to TDP Platform\" is clicked and no backToPlatformPath is set */\n onBackToPlatform?: () => void;\n /** Slot rendered at the bottom of the sidebar (e.g. user avatar + menu) */\n userMenu?: React.ReactNode;\n\n // -- Top nav --\n /** Breadcrumb items from root to current page */\n breadcrumbs?: BreadcrumbItemConfig[];\n /** Slot rendered after the breadcrumbs in the top bar's left group\n * (e.g. a collapsed horizontal workflow's step dropdown) */\n headerLeft?: React.ReactNode;\n /** Center \"context\" slot in the top bar (e.g. a version / status selector) */\n headerCenter?: React.ReactNode;\n /** Slot for right-side actions in the top nav (e.g. data count pills, next button) */\n headerActions?: React.ReactNode;\n\n // -- Shell zones --\n /** Primary nav axis — `vertical` (sidebar/rail, default) or `horizontal` (top nav row) */\n navVariant?: DataAppShellNavVariant;\n /**\n * Vertical primary nav presentation:\n * - `rail` (default) — permanent 48px icon-only rail.\n * - `sidebar` — collapsible 220px sidebar with labels; its brand-row chevron\n * collapses it to an icon rail (with an expand chevron under the logo),\n * driven by the shell's `collapsed` state.\n */\n primaryNav?: \"rail\" | \"sidebar\";\n /** Slot rendered between the primary nav and the content (e.g. a vertical `DataAppShellSecondaryNav`) */\n sidebarPanel?: React.ReactNode;\n /** Full-width zone between the top bar and the content row (e.g. a horizontal `DataAppShellSecondaryNav`) */\n secondaryBar?: React.ReactNode;\n /** Slot rendered after the content (e.g. a DataAppShellRightPanel) — its FAB anchors to the content row */\n rightPanel?: React.ReactNode;\n /** Show the primary nav zone. Set false to hide it entirely. */\n showNavRail?: boolean; // default true\n /** Show the top bar zone. Set false to hide it entirely. */\n showTopBar?: boolean; // default true\n\n // -- Collapse (vertical nav only) --\n /** Controlled collapse state — drives the secondary zone (via ShellContext)\n * and, with `hideNavOnCollapse`, the primary rail */\n collapsed?: boolean;\n /** Uncontrolled initial collapse state */\n defaultCollapsed?: boolean;\n /** Called whenever the shell collapse state flips */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Collapsing also hides the primary rail, leaving one icon rail (the secondary\n * nav) with an expand affordance — or a floating expand button if there is none. */\n hideNavOnCollapse?: boolean;\n /** Media query that auto-collapses the shell while it matches.\n * Pass `false` to disable. Defaults to `\"(max-width: 1023px)\"`. */\n autoCollapse?: string | false;\n\n /** Main content area */\n children: React.ReactNode;\n /** Additional className for the root container */\n className?: string;\n}\n\n// =============================================================================\n// Sidebar shared body (used by desktop rail + mobile Sheet)\n// =============================================================================\n\ninterface SidebarBodyProps\n extends Pick<\n DataAppShellProps,\n | \"appName\"\n | \"appFullName\"\n | \"appIcon\"\n | \"version\"\n | \"navGroups\"\n | \"onAppNameClick\"\n | \"backToPlatformPath\"\n | \"onBackToPlatform\"\n | \"userMenu\"\n > {\n /**\n * compact=true → narrow icon rail (48px): icon-only nav buttons, tooltips on hover\n * compact=false → expanded mobile sheet (220px): icon + label side-by-side rows\n */\n compact: boolean;\n /** Called after a nav page item is clicked — used by mobile sheet to close itself */\n onAfterNavClick?: () => void;\n}\n\n// =============================================================================\n// App header menu — logo/name button opening the app dropdown\n// =============================================================================\n\ninterface AppHeaderMenuProps\n extends Pick<\n DataAppShellProps,\n | \"appName\"\n | \"appFullName\"\n | \"appIcon\"\n | \"version\"\n | \"onAppNameClick\"\n | \"backToPlatformPath\"\n | \"onBackToPlatform\"\n > {\n /** compact=true → icon-only trigger (rail); compact=false → icon + name row */\n compact: boolean;\n /** Which side of the trigger the dropdown opens on — `right` beside a rail, `bottom` under a top bar */\n menuSide?: \"right\" | \"bottom\";\n}\n\nfunction AppHeaderMenu({\n appName,\n appFullName,\n appIcon,\n version,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n compact,\n menuSide = \"right\",\n}: AppHeaderMenuProps) {\n const logo = (\n <span className=\"flex items-center justify-center rounded-lg bg-sidebar-accent border border-sidebar-border font-bold text-foreground shrink-0 size-8 text-[10px]\">\n {appIcon ?? appName}\n </span>\n );\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"cursor-pointer bg-transparent border-none p-0\",\n !compact && \"flex items-center w-full text-left\"\n )}\n >\n {/* Icon — expanded: centered in the 48px gutter so it lines up with\n the nav icons below; compact: bare, centered by the rail header */}\n {compact ? logo : <span className=\"flex w-12 shrink-0 justify-center\">{logo}</span>}\n\n {/* Name (expanded only — no version here) */}\n {!compact && (\n <span className=\"text-sm font-semibold text-foreground truncate leading-snug\">\n {appFullName ?? appName}\n </span>\n )}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent side={menuSide} align=\"start\" className=\"min-w-[220px]\">\n <DropdownMenuItem\n className=\"gap-3 px-3 py-2.5\"\n onSelect={() => onAppNameClick?.()}\n >\n <div className=\"w-8 h-8 rounded-lg bg-sidebar-accent border border-sidebar-border flex items-center justify-center shrink-0\">\n <span className=\"text-[10px] font-bold text-foreground\">\n {appIcon ?? appName}\n </span>\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-semibold text-foreground truncate\">\n {appFullName ?? appName}\n </span>\n {version && (\n <span className=\"text-[10px] text-muted-foreground/70 font-mono leading-none mt-0.5\">\n {version}\n </span>\n )}\n </div>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"gap-2.5 p-0\" asChild>\n {backToPlatformPath ? (\n <TDPLink\n path={backToPlatformPath}\n navigationOptions={{ newTab: false }}\n className=\"flex items-center gap-2.5 w-full px-2 py-1.5 !no-underline hover:!no-underline\"\n >\n <ArrowLeft className=\"w-4 h-4 text-muted-foreground\" />\n Back to TDP Platform\n </TDPLink>\n ) : (\n <button\n type=\"button\"\n className=\"flex items-center gap-2.5 w-full px-2 py-1.5 bg-transparent border-none cursor-pointer\"\n onClick={onBackToPlatform}\n >\n <ArrowLeft className=\"w-4 h-4 text-muted-foreground\" />\n Back to TDP Platform\n </button>\n )}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n// =============================================================================\n// Sidebar shared body — the PrimaryNav engine with the app header + user slots\n// =============================================================================\n\nfunction SidebarBody({\n appName,\n appFullName,\n appIcon,\n version,\n navGroups,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n userMenu,\n compact,\n onAfterNavClick,\n}: SidebarBodyProps) {\n return (\n <DataAppShellPrimaryNav\n variant={compact ? \"rail\" : \"sidebar\"}\n aria-label=\"Application navigation\"\n navGroups={navGroups}\n onSelect={() => onAfterNavClick?.()}\n header={\n <AppHeaderMenu\n appName={appName}\n appFullName={appFullName}\n appIcon={appIcon}\n version={version}\n onAppNameClick={onAppNameClick}\n backToPlatformPath={backToPlatformPath}\n onBackToPlatform={onBackToPlatform}\n compact={compact}\n />\n }\n user={userMenu}\n className=\"h-full w-full\"\n />\n );\n}\n\n// =============================================================================\n// Icon rail sidebar (desktop only — hidden on mobile)\n// =============================================================================\n\nfunction IconRailSidebar(props: Omit<SidebarBodyProps, \"compact\" | \"onAfterNavClick\">) {\n return (\n <div\n data-slot=\"data-app-sidebar-rail\"\n className=\"hidden md:flex w-12 flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <SidebarBody compact {...props} />\n </div>\n );\n}\n\n// =============================================================================\n// Collapsible primary sidebar (desktop only — hidden on mobile). Expanded, it\n// shows the app name, labelled nav, and a collapse chevron in the brand row;\n// collapsed, it becomes an icon rail with the expand chevron directly under\n// the logo (mirrors the SW-2118 playground).\n// =============================================================================\n\ninterface PrimarySidebarProps extends Omit<SidebarBodyProps, \"compact\" | \"onAfterNavClick\"> {\n collapsed: boolean;\n onCollapsedChange: (collapsed: boolean) => void;\n}\n\nfunction PrimarySidebar({ collapsed, onCollapsedChange, ...sidebarProps }: PrimarySidebarProps) {\n const { appName, appFullName, appIcon, version, onAppNameClick, backToPlatformPath, onBackToPlatform } =\n sidebarProps;\n const headerMenuProps = {\n appName,\n appFullName,\n appIcon,\n version,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n };\n\n if (collapsed) {\n return (\n <div\n data-slot=\"data-app-sidebar-rail\"\n data-collapsed=\"true\"\n className=\"hidden md:flex w-12 flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <DataAppShellPrimaryNav\n variant=\"rail\"\n aria-label=\"Application navigation\"\n navGroups={sidebarProps.navGroups}\n header={\n <div className=\"flex flex-col items-center gap-2\">\n <AppHeaderMenu {...headerMenuProps} compact />\n <ShellCollapseButton\n direction=\"right\"\n label=\"Expand navigation\"\n onClick={() => onCollapsedChange(false)}\n />\n </div>\n }\n user={sidebarProps.userMenu}\n className=\"h-full w-full\"\n />\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"data-app-sidebar\"\n data-collapsed=\"false\"\n className=\"hidden md:flex w-[220px] flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <DataAppShellPrimaryNav\n variant=\"sidebar\"\n aria-label=\"Application navigation\"\n navGroups={sidebarProps.navGroups}\n header={\n <div className=\"flex items-center gap-2 w-full min-w-0\">\n <div className=\"flex-1 min-w-0\">\n <AppHeaderMenu {...headerMenuProps} compact={false} />\n </div>\n <ShellCollapseButton\n direction=\"left\"\n label=\"Collapse navigation\"\n onClick={() => onCollapsedChange(true)}\n />\n </div>\n }\n user={sidebarProps.userMenu}\n className=\"h-full w-full\"\n />\n </div>\n );\n}\n\n// =============================================================================\n// Breadcrumb trail — rendered from the shell's breadcrumb config\n// =============================================================================\n\nfunction TopNavBreadcrumb({ items }: { items: BreadcrumbItemConfig[] }) {\n return (\n // min-w-0 lets the trail shrink inside the top bar's flex-1 left group;\n // flex-nowrap keeps it one line instead of Breadcrumb's default wrap\n // (which, combined with a squeezed left group, wrapped mid-trail and\n // pushed the rest of the top bar around — SW-2118).\n <Breadcrumb className=\"min-w-0\">\n <BreadcrumbList className=\"flex-nowrap min-w-0\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const isClickable = !isLast && (!!item.href || !!item.onClick);\n // Only the current (last) crumb truncates — earlier crumbs keep\n // their natural width so the trail reads left-to-right.\n const itemClassName = isLast ? \"min-w-0\" : \"shrink-0\";\n return (\n <React.Fragment key={`${item.label}-${index}`}>\n {index > 0 && <BreadcrumbSeparator className=\"shrink-0\">/</BreadcrumbSeparator>}\n <BreadcrumbItem className={itemClassName}>\n {isLast ? (\n <BreadcrumbPage className=\"truncate\">{item.label}</BreadcrumbPage>\n ) : isClickable && item.href ? (\n <BreadcrumbLink href={item.href} className=\"whitespace-nowrap\">\n {item.label}\n </BreadcrumbLink>\n ) : isClickable && item.onClick ? (\n <button\n type=\"button\"\n className=\"text-sm text-primary hover:underline cursor-pointer bg-transparent border-none p-0 font-normal whitespace-nowrap\"\n onClick={item.onClick}\n >\n {item.label}\n </button>\n ) : (\n <span className=\"text-sm text-muted-foreground whitespace-nowrap\">\n {item.label}\n </span>\n )}\n </BreadcrumbItem>\n </React.Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n\n// =============================================================================\n// Top nav — maps shell props onto the reusable TopBar (left/center/right)\n// =============================================================================\n\nfunction TopNav({\n breadcrumbs = [],\n headerLeft,\n headerCenter,\n headerActions,\n mobileTrigger,\n}: {\n breadcrumbs?: BreadcrumbItemConfig[];\n headerLeft?: React.ReactNode;\n headerCenter?: React.ReactNode;\n headerActions?: React.ReactNode;\n mobileTrigger?: React.ReactNode;\n}) {\n return (\n <TopBar\n data-slot=\"data-app-top-nav\"\n left={\n <>\n {/* Mobile hamburger (hidden on md+). shrink-0 — only the\n breadcrumb trail gives up width when the left group is tight. */}\n {mobileTrigger && <div className=\"shrink-0\">{mobileTrigger}</div>}\n <TopNavBreadcrumb items={breadcrumbs} />\n {headerLeft != null && <div className=\"shrink-0\">{headerLeft}</div>}\n </>\n }\n center={headerCenter}\n right={headerActions}\n />\n );\n}\n\n// =============================================================================\n// DataAppShell\n// =============================================================================\n\nfunction DataAppShell({\n appName,\n appFullName,\n appIcon,\n version,\n navGroups,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n userMenu,\n breadcrumbs = [],\n headerLeft,\n headerCenter,\n headerActions,\n navVariant = \"vertical\",\n primaryNav = \"rail\",\n sidebarPanel,\n secondaryBar,\n rightPanel,\n showNavRail = true,\n showTopBar = true,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n hideNavOnCollapse = false,\n autoCollapse = \"(max-width: 1023px)\",\n children,\n className,\n}: DataAppShellProps) {\n const [mobileNavOpen, setMobileNavOpen] = React.useState(false);\n\n // ── Single collapse toggle (controlled/uncontrolled) ───────────────────────\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const collapsed = collapsedProp ?? internalCollapsed;\n const collapsedRef = React.useRef(collapsed);\n collapsedRef.current = collapsed;\n // Set when the media query (not the user) collapsed the shell, so leaving\n // the breakpoint restores the expanded state without fighting manual toggles.\n const autoCollapsedRef = React.useRef(false);\n\n const setCollapsed = React.useCallback(\n (next: boolean) => {\n autoCollapsedRef.current = false;\n if (collapsedProp === undefined) setInternalCollapsed(next);\n onCollapsedChange?.(next);\n },\n [collapsedProp, onCollapsedChange],\n );\n\n // ── Responsive auto-collapse below the breakpoint ───────────────────────────\n // The media-query handler lives in a ref so the subscription survives\n // re-renders without re-running for every collapse/callback change.\n const applyAutoCollapseRef = React.useRef((matches: boolean) => void matches);\n applyAutoCollapseRef.current = (matches: boolean) => {\n if (matches && !collapsedRef.current) {\n if (collapsedProp === undefined) setInternalCollapsed(true);\n onCollapsedChange?.(true);\n autoCollapsedRef.current = true;\n } else if (!matches && autoCollapsedRef.current) {\n autoCollapsedRef.current = false;\n if (collapsedProp === undefined) setInternalCollapsed(false);\n onCollapsedChange?.(false);\n }\n };\n\n React.useEffect(() => {\n if (autoCollapse === false || navVariant !== \"vertical\") return;\n const mql = window.matchMedia(autoCollapse);\n applyAutoCollapseRef.current(mql.matches);\n const onChange = (e: MediaQueryListEvent) => applyAutoCollapseRef.current(e.matches);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, [autoCollapse, navVariant]);\n\n const sidebarProps = {\n appName,\n appFullName,\n appIcon,\n version,\n navGroups,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n userMenu,\n };\n\n const isVertical = navVariant === \"vertical\";\n // A collapsible sidebar renders its own collapsed rail, so it is never\n // hidden by collapse. hideNavOnCollapse only removes the permanent icon rail.\n const isCollapsibleSidebar = isVertical && primaryNav === \"sidebar\";\n const navHidden =\n !showNavRail || (hideNavOnCollapse && collapsed && !isCollapsibleSidebar);\n\n // CSS-grid template areas per navVariant — the shell knows zones, never\n // domain concepts. Zones absent from the tree simply collapse their track.\n // The secondary (side) zone starts below the top bar / secondary bar, so\n // breadcrumbs span the full width beside the primary nav.\n const gridClass = isVertical\n ? \"grid h-screen w-full overflow-hidden [grid-template-columns:auto_auto_minmax(0,1fr)] [grid-template-rows:auto_auto_minmax(0,1fr)] [grid-template-areas:'nav_top_top'_'nav_sub_sub'_'nav_side_body']\"\n : \"grid h-screen w-full overflow-hidden [grid-template-columns:auto_minmax(0,1fr)] [grid-template-rows:auto_auto_auto_minmax(0,1fr)] [grid-template-areas:'pnav_pnav'_'top_top'_'sub_sub'_'side_body']\";\n\n return (\n <DataAppShellProvider value={{ navVariant, collapsed, setCollapsed, hideNavOnCollapse }}>\n <Sheet open={mobileNavOpen} onOpenChange={setMobileNavOpen}>\n <div\n data-slot=\"data-app-shell\"\n data-nav-variant={navVariant}\n data-collapsed={collapsed || undefined}\n className={cn(gridClass, className)}\n >\n {/* Primary nav zone */}\n {!navHidden &&\n (isVertical ? (\n <div className=\"[grid-area:nav] min-h-0\">\n {isCollapsibleSidebar ? (\n <PrimarySidebar\n collapsed={collapsed}\n onCollapsedChange={setCollapsed}\n {...sidebarProps}\n />\n ) : (\n <IconRailSidebar {...sidebarProps} />\n )}\n </div>\n ) : (\n <div className=\"[grid-area:pnav] hidden md:block border-b border-sidebar-border bg-sidebar px-3 py-1.5\">\n <DataAppShellPrimaryNav\n variant=\"top\"\n aria-label=\"Application navigation\"\n navGroups={navGroups}\n header={<AppHeaderMenu {...sidebarProps} compact menuSide=\"bottom\" />}\n user={userMenu}\n />\n </div>\n ))}\n\n {/* Floating expand affordance — hideNavOnCollapse with no secondary rail */}\n {hideNavOnCollapse && collapsed && !sidebarPanel && (\n <Button\n data-slot=\"data-app-shell-expand-fab\"\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"Expand navigation\"\n className=\"absolute left-2 top-2 z-50 shadow-elevation-2\"\n onClick={() => setCollapsed(false)}\n >\n <ChevronRight className=\"w-4 h-4\" />\n </Button>\n )}\n\n {/* Mobile sidebar Sheet */}\n <SheetContent\n side=\"left\"\n showCloseButton={false}\n className=\"p-0 bg-sidebar border-r border-sidebar-border data-[side=left]:w-[220px] data-[side=left]:sm:w-[220px] data-[side=left]:sm:max-w-[220px] flex flex-col\"\n >\n <SheetTitle className=\"sr-only\">Navigation</SheetTitle>\n <SheetDescription className=\"sr-only\">\n Application navigation menu\n </SheetDescription>\n <SidebarBody\n compact={false}\n onAfterNavClick={() => setMobileNavOpen(false)}\n {...sidebarProps}\n />\n </SheetContent>\n\n {/* Secondary (side) zone — e.g. a vertical DataAppShellSecondaryNav */}\n {sidebarPanel && <div className=\"[grid-area:side] min-h-0 flex\">{sidebarPanel}</div>}\n\n {/* Top bar zone */}\n {showTopBar && (\n <div className=\"[grid-area:top] min-w-0\">\n <TopNav\n breadcrumbs={breadcrumbs}\n headerLeft={headerLeft}\n headerCenter={headerCenter}\n headerActions={headerActions}\n mobileTrigger={\n <SheetTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Open navigation menu\"\n className=\"md:hidden w-7 h-7 shrink-0 text-muted-foreground\"\n >\n <Menu className=\"w-4 h-4\" />\n </Button>\n </SheetTrigger>\n }\n />\n </div>\n )}\n\n {/* Secondary bar zone — e.g. a horizontal DataAppShellSecondaryNav */}\n {secondaryBar && <div className=\"[grid-area:sub] min-w-0\">{secondaryBar}</div>}\n\n {/* Body zone: content + right panel. relative — anchors the right\n panel's floating FAB trigger */}\n <div className=\"[grid-area:body] relative flex min-h-0 min-w-0 overflow-hidden\">\n <main\n data-slot=\"data-app-shell-content\"\n className=\"flex-1 min-w-0 overflow-auto bg-background\"\n >\n {children}\n </main>\n\n {/* Right panel slot (e.g. DataAppShellRightPanel) */}\n {rightPanel}\n </div>\n </div>\n </Sheet>\n </DataAppShellProvider>\n );\n}\n\nexport default DataAppShell;\nexport { AppHeaderMenu, DataAppShell };\n"],"names":["AppHeaderMenu","appName","appFullName","appIcon","version","onAppNameClick","backToPlatformPath","onBackToPlatform","compact","menuSide","logo","jsx","jsxs","DropdownMenu","DropdownMenuTrigger","cn","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","TDPLink","ArrowLeft","SidebarBody","navGroups","userMenu","onAfterNavClick","DataAppShellPrimaryNav","IconRailSidebar","props","PrimarySidebar","collapsed","onCollapsedChange","sidebarProps","headerMenuProps","ShellCollapseButton","TopNavBreadcrumb","items","Breadcrumb","BreadcrumbList","item","index","isLast","isClickable","itemClassName","React","BreadcrumbSeparator","BreadcrumbItem","BreadcrumbPage","BreadcrumbLink","TopNav","breadcrumbs","headerLeft","headerCenter","headerActions","mobileTrigger","TopBar","Fragment","DataAppShell","navVariant","primaryNav","sidebarPanel","secondaryBar","rightPanel","showNavRail","showTopBar","collapsedProp","defaultCollapsed","hideNavOnCollapse","autoCollapse","children","className","mobileNavOpen","setMobileNavOpen","internalCollapsed","setInternalCollapsed","collapsedRef","autoCollapsedRef","setCollapsed","next","applyAutoCollapseRef","matches","mql","onChange","e","isVertical","isCollapsibleSidebar","navHidden","gridClass","DataAppShellProvider","Sheet","Button","ChevronRight","SheetContent","SheetTitle","SheetDescription","SheetTrigger","Menu"],"mappings":"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"}
|
|
@@ -1,68 +1,61 @@
|
|
|
1
1
|
import { jsx as e, jsxs as i, Fragment as ee } from "react/jsx-runtime";
|
|
2
2
|
import { ChevronRight as ae, Menu as re, ArrowLeft as j } from "lucide-react";
|
|
3
|
-
import * as
|
|
4
|
-
import { ShellCollapseButton as
|
|
3
|
+
import * as u from "react";
|
|
4
|
+
import { ShellCollapseButton as E } from "./CollapseButton.js";
|
|
5
5
|
import { DataAppShellPrimaryNav as N } from "./PrimaryNav.js";
|
|
6
|
-
import { DataAppShellProvider as
|
|
7
|
-
import { TDPLink as
|
|
6
|
+
import { DataAppShellProvider as ne } from "./ShellContext.js";
|
|
7
|
+
import { TDPLink as te } from "../../../composed/tdp-link.js";
|
|
8
8
|
import { TopBar as le } from "../TopBar/TopBar.js";
|
|
9
9
|
import { Breadcrumb as ie, BreadcrumbList as se, BreadcrumbSeparator as oe, BreadcrumbItem as de, BreadcrumbPage as ce, BreadcrumbLink as me } from "../../../ui/breadcrumb.js";
|
|
10
|
-
import { Button as
|
|
11
|
-
import { DropdownMenu as ue, DropdownMenuTrigger as pe, DropdownMenuContent as fe, DropdownMenuItem as
|
|
10
|
+
import { Button as I } from "../../../ui/button.js";
|
|
11
|
+
import { DropdownMenu as ue, DropdownMenuTrigger as pe, DropdownMenuContent as fe, DropdownMenuItem as G, DropdownMenuSeparator as he } from "../../../ui/dropdown-menu.js";
|
|
12
12
|
import { Sheet as be, SheetContent as ge, SheetTitle as ve, SheetDescription as xe, SheetTrigger as we } from "../../../ui/sheet.js";
|
|
13
|
-
import { cn as
|
|
13
|
+
import { cn as O } from "../../../lib/utils.js";
|
|
14
14
|
function k({
|
|
15
|
-
appName:
|
|
15
|
+
appName: n,
|
|
16
16
|
appFullName: a,
|
|
17
17
|
appIcon: r,
|
|
18
|
-
version:
|
|
18
|
+
version: t,
|
|
19
19
|
onAppNameClick: l,
|
|
20
20
|
backToPlatformPath: s,
|
|
21
|
-
onBackToPlatform:
|
|
21
|
+
onBackToPlatform: p,
|
|
22
22
|
compact: d,
|
|
23
|
-
menuSide:
|
|
23
|
+
menuSide: m = "right"
|
|
24
24
|
}) {
|
|
25
|
+
const c = /* @__PURE__ */ e("span", { className: "flex items-center justify-center rounded-lg bg-sidebar-accent border border-sidebar-border font-bold text-foreground shrink-0 size-8 text-[10px]", children: r ?? n });
|
|
25
26
|
return /* @__PURE__ */ i(ue, { modal: !1, children: [
|
|
26
27
|
/* @__PURE__ */ e(pe, { asChild: !0, children: /* @__PURE__ */ i(
|
|
27
28
|
"button",
|
|
28
29
|
{
|
|
29
30
|
type: "button",
|
|
30
|
-
className:
|
|
31
|
+
className: O(
|
|
31
32
|
"cursor-pointer bg-transparent border-none p-0",
|
|
32
|
-
!d && "flex items-center
|
|
33
|
+
!d && "flex items-center w-full text-left"
|
|
33
34
|
),
|
|
34
35
|
children: [
|
|
35
|
-
/* @__PURE__ */ e(
|
|
36
|
-
|
|
37
|
-
{
|
|
38
|
-
className: M(
|
|
39
|
-
"flex items-center justify-center rounded-lg bg-sidebar-accent border border-sidebar-border font-bold text-foreground shrink-0 w-8 h-8 text-[10px]"
|
|
40
|
-
),
|
|
41
|
-
children: r ?? t
|
|
42
|
-
}
|
|
43
|
-
),
|
|
44
|
-
!d && /* @__PURE__ */ e("span", { className: "text-sm font-semibold text-foreground truncate leading-snug", children: a ?? t })
|
|
36
|
+
d ? c : /* @__PURE__ */ e("span", { className: "flex w-12 shrink-0 justify-center", children: c }),
|
|
37
|
+
!d && /* @__PURE__ */ e("span", { className: "text-sm font-semibold text-foreground truncate leading-snug", children: a ?? n })
|
|
45
38
|
]
|
|
46
39
|
}
|
|
47
40
|
) }),
|
|
48
|
-
/* @__PURE__ */ i(fe, { side:
|
|
41
|
+
/* @__PURE__ */ i(fe, { side: m, align: "start", className: "min-w-[220px]", children: [
|
|
49
42
|
/* @__PURE__ */ i(
|
|
50
|
-
|
|
43
|
+
G,
|
|
51
44
|
{
|
|
52
45
|
className: "gap-3 px-3 py-2.5",
|
|
53
46
|
onSelect: () => l?.(),
|
|
54
47
|
children: [
|
|
55
|
-
/* @__PURE__ */ e("div", { className: "w-8 h-8 rounded-lg bg-sidebar-accent border border-sidebar-border flex items-center justify-center shrink-0", children: /* @__PURE__ */ e("span", { className: "text-[10px] font-bold text-foreground", children: r ??
|
|
48
|
+
/* @__PURE__ */ e("div", { className: "w-8 h-8 rounded-lg bg-sidebar-accent border border-sidebar-border flex items-center justify-center shrink-0", children: /* @__PURE__ */ e("span", { className: "text-[10px] font-bold text-foreground", children: r ?? n }) }),
|
|
56
49
|
/* @__PURE__ */ i("div", { className: "flex flex-col min-w-0", children: [
|
|
57
|
-
/* @__PURE__ */ e("span", { className: "text-sm font-semibold text-foreground truncate", children: a ??
|
|
58
|
-
|
|
50
|
+
/* @__PURE__ */ e("span", { className: "text-sm font-semibold text-foreground truncate", children: a ?? n }),
|
|
51
|
+
t && /* @__PURE__ */ e("span", { className: "text-[10px] text-muted-foreground/70 font-mono leading-none mt-0.5", children: t })
|
|
59
52
|
] })
|
|
60
53
|
]
|
|
61
54
|
}
|
|
62
55
|
),
|
|
63
56
|
/* @__PURE__ */ e(he, {}),
|
|
64
|
-
/* @__PURE__ */ e(
|
|
65
|
-
|
|
57
|
+
/* @__PURE__ */ e(G, { className: "gap-2.5 p-0", asChild: !0, children: s ? /* @__PURE__ */ i(
|
|
58
|
+
te,
|
|
66
59
|
{
|
|
67
60
|
path: s,
|
|
68
61
|
navigationOptions: { newTab: !1 },
|
|
@@ -77,7 +70,7 @@ function k({
|
|
|
77
70
|
{
|
|
78
71
|
type: "button",
|
|
79
72
|
className: "flex items-center gap-2.5 w-full px-2 py-1.5 bg-transparent border-none cursor-pointer",
|
|
80
|
-
onClick:
|
|
73
|
+
onClick: p,
|
|
81
74
|
children: [
|
|
82
75
|
/* @__PURE__ */ e(j, { className: "w-4 h-4 text-muted-foreground" }),
|
|
83
76
|
"Back to TDP Platform"
|
|
@@ -88,64 +81,64 @@ function k({
|
|
|
88
81
|
] });
|
|
89
82
|
}
|
|
90
83
|
function F({
|
|
91
|
-
appName:
|
|
84
|
+
appName: n,
|
|
92
85
|
appFullName: a,
|
|
93
86
|
appIcon: r,
|
|
94
|
-
version:
|
|
87
|
+
version: t,
|
|
95
88
|
navGroups: l,
|
|
96
89
|
onAppNameClick: s,
|
|
97
|
-
backToPlatformPath:
|
|
90
|
+
backToPlatformPath: p,
|
|
98
91
|
onBackToPlatform: d,
|
|
99
|
-
userMenu:
|
|
100
|
-
compact:
|
|
92
|
+
userMenu: m,
|
|
93
|
+
compact: c,
|
|
101
94
|
onAfterNavClick: h
|
|
102
95
|
}) {
|
|
103
96
|
return /* @__PURE__ */ e(
|
|
104
97
|
N,
|
|
105
98
|
{
|
|
106
|
-
variant:
|
|
99
|
+
variant: c ? "rail" : "sidebar",
|
|
107
100
|
"aria-label": "Application navigation",
|
|
108
101
|
navGroups: l,
|
|
109
102
|
onSelect: () => h?.(),
|
|
110
103
|
header: /* @__PURE__ */ e(
|
|
111
104
|
k,
|
|
112
105
|
{
|
|
113
|
-
appName:
|
|
106
|
+
appName: n,
|
|
114
107
|
appFullName: a,
|
|
115
108
|
appIcon: r,
|
|
116
|
-
version:
|
|
109
|
+
version: t,
|
|
117
110
|
onAppNameClick: s,
|
|
118
|
-
backToPlatformPath:
|
|
111
|
+
backToPlatformPath: p,
|
|
119
112
|
onBackToPlatform: d,
|
|
120
|
-
compact:
|
|
113
|
+
compact: c
|
|
121
114
|
}
|
|
122
115
|
),
|
|
123
|
-
user:
|
|
116
|
+
user: m,
|
|
124
117
|
className: "h-full w-full"
|
|
125
118
|
}
|
|
126
119
|
);
|
|
127
120
|
}
|
|
128
|
-
function Ne(
|
|
121
|
+
function Ne(n) {
|
|
129
122
|
return /* @__PURE__ */ e(
|
|
130
123
|
"div",
|
|
131
124
|
{
|
|
132
125
|
"data-slot": "data-app-sidebar-rail",
|
|
133
126
|
className: "hidden md:flex w-12 flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50",
|
|
134
|
-
children: /* @__PURE__ */ e(F, { compact: !0, ...
|
|
127
|
+
children: /* @__PURE__ */ e(F, { compact: !0, ...n })
|
|
135
128
|
}
|
|
136
129
|
);
|
|
137
130
|
}
|
|
138
|
-
function ke({ collapsed:
|
|
139
|
-
const { appName:
|
|
140
|
-
appName:
|
|
131
|
+
function ke({ collapsed: n, onCollapsedChange: a, ...r }) {
|
|
132
|
+
const { appName: t, appFullName: l, appIcon: s, version: p, onAppNameClick: d, backToPlatformPath: m, onBackToPlatform: c } = r, h = {
|
|
133
|
+
appName: t,
|
|
141
134
|
appFullName: l,
|
|
142
135
|
appIcon: s,
|
|
143
|
-
version:
|
|
136
|
+
version: p,
|
|
144
137
|
onAppNameClick: d,
|
|
145
|
-
backToPlatformPath:
|
|
146
|
-
onBackToPlatform:
|
|
138
|
+
backToPlatformPath: m,
|
|
139
|
+
onBackToPlatform: c
|
|
147
140
|
};
|
|
148
|
-
return
|
|
141
|
+
return n ? /* @__PURE__ */ e(
|
|
149
142
|
"div",
|
|
150
143
|
{
|
|
151
144
|
"data-slot": "data-app-sidebar-rail",
|
|
@@ -160,7 +153,7 @@ function ke({ collapsed: t, onCollapsedChange: a, ...r }) {
|
|
|
160
153
|
header: /* @__PURE__ */ i("div", { className: "flex flex-col items-center gap-2", children: [
|
|
161
154
|
/* @__PURE__ */ e(k, { ...h, compact: !0 }),
|
|
162
155
|
/* @__PURE__ */ e(
|
|
163
|
-
|
|
156
|
+
E,
|
|
164
157
|
{
|
|
165
158
|
direction: "right",
|
|
166
159
|
label: "Expand navigation",
|
|
@@ -188,7 +181,7 @@ function ke({ collapsed: t, onCollapsedChange: a, ...r }) {
|
|
|
188
181
|
header: /* @__PURE__ */ i("div", { className: "flex items-center gap-2 w-full min-w-0", children: [
|
|
189
182
|
/* @__PURE__ */ e("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ e(k, { ...h, compact: !1 }) }),
|
|
190
183
|
/* @__PURE__ */ e(
|
|
191
|
-
|
|
184
|
+
E,
|
|
192
185
|
{
|
|
193
186
|
direction: "left",
|
|
194
187
|
label: "Collapse navigation",
|
|
@@ -203,17 +196,17 @@ function ke({ collapsed: t, onCollapsedChange: a, ...r }) {
|
|
|
203
196
|
}
|
|
204
197
|
);
|
|
205
198
|
}
|
|
206
|
-
function _e({ items:
|
|
199
|
+
function _e({ items: n }) {
|
|
207
200
|
return (
|
|
208
201
|
// min-w-0 lets the trail shrink inside the top bar's flex-1 left group;
|
|
209
202
|
// flex-nowrap keeps it one line instead of Breadcrumb's default wrap
|
|
210
203
|
// (which, combined with a squeezed left group, wrapped mid-trail and
|
|
211
204
|
// pushed the rest of the top bar around — SW-2118).
|
|
212
|
-
/* @__PURE__ */ e(ie, { className: "min-w-0", children: /* @__PURE__ */ e(se, { className: "flex-nowrap min-w-0", children:
|
|
213
|
-
const
|
|
214
|
-
return /* @__PURE__ */ i(
|
|
205
|
+
/* @__PURE__ */ e(ie, { className: "min-w-0", children: /* @__PURE__ */ e(se, { className: "flex-nowrap min-w-0", children: n.map((a, r) => {
|
|
206
|
+
const t = r === n.length - 1, l = !t && (!!a.href || !!a.onClick), s = t ? "min-w-0" : "shrink-0";
|
|
207
|
+
return /* @__PURE__ */ i(u.Fragment, { children: [
|
|
215
208
|
r > 0 && /* @__PURE__ */ e(oe, { className: "shrink-0", children: "/" }),
|
|
216
|
-
/* @__PURE__ */ e(de, { className: s, children:
|
|
209
|
+
/* @__PURE__ */ e(de, { className: s, children: t ? /* @__PURE__ */ e(ce, { className: "truncate", children: a.label }) : l && a.href ? /* @__PURE__ */ e(me, { href: a.href, className: "whitespace-nowrap", children: a.label }) : l && a.onClick ? /* @__PURE__ */ e(
|
|
217
210
|
"button",
|
|
218
211
|
{
|
|
219
212
|
type: "button",
|
|
@@ -227,10 +220,10 @@ function _e({ items: t }) {
|
|
|
227
220
|
);
|
|
228
221
|
}
|
|
229
222
|
function Ce({
|
|
230
|
-
breadcrumbs:
|
|
223
|
+
breadcrumbs: n = [],
|
|
231
224
|
headerLeft: a,
|
|
232
225
|
headerCenter: r,
|
|
233
|
-
headerActions:
|
|
226
|
+
headerActions: t,
|
|
234
227
|
mobileTrigger: l
|
|
235
228
|
}) {
|
|
236
229
|
return /* @__PURE__ */ e(
|
|
@@ -239,32 +232,32 @@ function Ce({
|
|
|
239
232
|
"data-slot": "data-app-top-nav",
|
|
240
233
|
left: /* @__PURE__ */ i(ee, { children: [
|
|
241
234
|
l && /* @__PURE__ */ e("div", { className: "shrink-0", children: l }),
|
|
242
|
-
/* @__PURE__ */ e(_e, { items:
|
|
235
|
+
/* @__PURE__ */ e(_e, { items: n }),
|
|
243
236
|
a != null && /* @__PURE__ */ e("div", { className: "shrink-0", children: a })
|
|
244
237
|
] }),
|
|
245
238
|
center: r,
|
|
246
|
-
right:
|
|
239
|
+
right: t
|
|
247
240
|
}
|
|
248
241
|
);
|
|
249
242
|
}
|
|
250
243
|
function Ge({
|
|
251
|
-
appName:
|
|
244
|
+
appName: n,
|
|
252
245
|
appFullName: a,
|
|
253
246
|
appIcon: r,
|
|
254
|
-
version:
|
|
247
|
+
version: t,
|
|
255
248
|
navGroups: l,
|
|
256
249
|
onAppNameClick: s,
|
|
257
|
-
backToPlatformPath:
|
|
250
|
+
backToPlatformPath: p,
|
|
258
251
|
onBackToPlatform: d,
|
|
259
|
-
userMenu:
|
|
260
|
-
breadcrumbs:
|
|
252
|
+
userMenu: m,
|
|
253
|
+
breadcrumbs: c = [],
|
|
261
254
|
headerLeft: h,
|
|
262
255
|
headerCenter: H,
|
|
263
256
|
headerActions: P,
|
|
264
257
|
navVariant: b = "vertical",
|
|
265
258
|
primaryNav: $ = "rail",
|
|
266
259
|
sidebarPanel: _,
|
|
267
|
-
secondaryBar:
|
|
260
|
+
secondaryBar: M,
|
|
268
261
|
rightPanel: q,
|
|
269
262
|
showNavRail: J = !0,
|
|
270
263
|
showTopBar: K = !0,
|
|
@@ -276,47 +269,47 @@ function Ge({
|
|
|
276
269
|
children: U,
|
|
277
270
|
className: W
|
|
278
271
|
}) {
|
|
279
|
-
const [X,
|
|
280
|
-
|
|
281
|
-
const x =
|
|
272
|
+
const [X, T] = u.useState(!1), [Y, y] = u.useState(Q), f = g ?? Y, R = u.useRef(f);
|
|
273
|
+
R.current = f;
|
|
274
|
+
const x = u.useRef(!1), B = u.useCallback(
|
|
282
275
|
(o) => {
|
|
283
276
|
x.current = !1, g === void 0 && y(o), v?.(o);
|
|
284
277
|
},
|
|
285
278
|
[g, v]
|
|
286
|
-
), A =
|
|
279
|
+
), A = u.useRef((o) => {
|
|
287
280
|
});
|
|
288
281
|
A.current = (o) => {
|
|
289
|
-
o && !
|
|
290
|
-
},
|
|
282
|
+
o && !R.current ? (g === void 0 && y(!0), v?.(!0), x.current = !0) : !o && x.current && (x.current = !1, g === void 0 && y(!1), v?.(!1));
|
|
283
|
+
}, u.useEffect(() => {
|
|
291
284
|
if (S === !1 || b !== "vertical") return;
|
|
292
285
|
const o = window.matchMedia(S);
|
|
293
286
|
A.current(o.matches);
|
|
294
|
-
const
|
|
295
|
-
return o.addEventListener("change",
|
|
287
|
+
const L = (V) => A.current(V.matches);
|
|
288
|
+
return o.addEventListener("change", L), () => o.removeEventListener("change", L);
|
|
296
289
|
}, [S, b]);
|
|
297
290
|
const w = {
|
|
298
|
-
appName:
|
|
291
|
+
appName: n,
|
|
299
292
|
appFullName: a,
|
|
300
293
|
appIcon: r,
|
|
301
|
-
version:
|
|
294
|
+
version: t,
|
|
302
295
|
navGroups: l,
|
|
303
296
|
onAppNameClick: s,
|
|
304
|
-
backToPlatformPath:
|
|
297
|
+
backToPlatformPath: p,
|
|
305
298
|
onBackToPlatform: d,
|
|
306
|
-
userMenu:
|
|
307
|
-
}, D = b === "vertical",
|
|
308
|
-
return /* @__PURE__ */ e(
|
|
299
|
+
userMenu: m
|
|
300
|
+
}, D = b === "vertical", z = D && $ === "sidebar", Z = !J || C && f && !z;
|
|
301
|
+
return /* @__PURE__ */ e(ne, { value: { navVariant: b, collapsed: f, setCollapsed: B, hideNavOnCollapse: C }, children: /* @__PURE__ */ e(be, { open: X, onOpenChange: T, children: /* @__PURE__ */ i(
|
|
309
302
|
"div",
|
|
310
303
|
{
|
|
311
304
|
"data-slot": "data-app-shell",
|
|
312
305
|
"data-nav-variant": b,
|
|
313
|
-
"data-collapsed":
|
|
314
|
-
className:
|
|
306
|
+
"data-collapsed": f || void 0,
|
|
307
|
+
className: O(D ? "grid h-screen w-full overflow-hidden [grid-template-columns:auto_auto_minmax(0,1fr)] [grid-template-rows:auto_auto_minmax(0,1fr)] [grid-template-areas:'nav_top_top'_'nav_sub_sub'_'nav_side_body']" : "grid h-screen w-full overflow-hidden [grid-template-columns:auto_minmax(0,1fr)] [grid-template-rows:auto_auto_auto_minmax(0,1fr)] [grid-template-areas:'pnav_pnav'_'top_top'_'sub_sub'_'side_body']", W),
|
|
315
308
|
children: [
|
|
316
|
-
!Z && (D ? /* @__PURE__ */ e("div", { className: "[grid-area:nav] min-h-0", children:
|
|
309
|
+
!Z && (D ? /* @__PURE__ */ e("div", { className: "[grid-area:nav] min-h-0", children: z ? /* @__PURE__ */ e(
|
|
317
310
|
ke,
|
|
318
311
|
{
|
|
319
|
-
collapsed:
|
|
312
|
+
collapsed: f,
|
|
320
313
|
onCollapsedChange: B,
|
|
321
314
|
...w
|
|
322
315
|
}
|
|
@@ -327,11 +320,11 @@ function Ge({
|
|
|
327
320
|
"aria-label": "Application navigation",
|
|
328
321
|
navGroups: l,
|
|
329
322
|
header: /* @__PURE__ */ e(k, { ...w, compact: !0, menuSide: "bottom" }),
|
|
330
|
-
user:
|
|
323
|
+
user: m
|
|
331
324
|
}
|
|
332
325
|
) })),
|
|
333
|
-
C &&
|
|
334
|
-
|
|
326
|
+
C && f && !_ && /* @__PURE__ */ e(
|
|
327
|
+
I,
|
|
335
328
|
{
|
|
336
329
|
"data-slot": "data-app-shell-expand-fab",
|
|
337
330
|
variant: "outline",
|
|
@@ -355,7 +348,7 @@ function Ge({
|
|
|
355
348
|
F,
|
|
356
349
|
{
|
|
357
350
|
compact: !1,
|
|
358
|
-
onAfterNavClick: () =>
|
|
351
|
+
onAfterNavClick: () => T(!1),
|
|
359
352
|
...w
|
|
360
353
|
}
|
|
361
354
|
)
|
|
@@ -366,12 +359,12 @@ function Ge({
|
|
|
366
359
|
K && /* @__PURE__ */ e("div", { className: "[grid-area:top] min-w-0", children: /* @__PURE__ */ e(
|
|
367
360
|
Ce,
|
|
368
361
|
{
|
|
369
|
-
breadcrumbs:
|
|
362
|
+
breadcrumbs: c,
|
|
370
363
|
headerLeft: h,
|
|
371
364
|
headerCenter: H,
|
|
372
365
|
headerActions: P,
|
|
373
366
|
mobileTrigger: /* @__PURE__ */ e(we, { asChild: !0, children: /* @__PURE__ */ e(
|
|
374
|
-
|
|
367
|
+
I,
|
|
375
368
|
{
|
|
376
369
|
variant: "ghost",
|
|
377
370
|
size: "icon",
|
|
@@ -382,7 +375,7 @@ function Ge({
|
|
|
382
375
|
) })
|
|
383
376
|
}
|
|
384
377
|
) }),
|
|
385
|
-
|
|
378
|
+
M && /* @__PURE__ */ e("div", { className: "[grid-area:sub] min-w-0", children: M }),
|
|
386
379
|
/* @__PURE__ */ i("div", { className: "[grid-area:body] relative flex min-h-0 min-w-0 overflow-hidden", children: [
|
|
387
380
|
/* @__PURE__ */ e(
|
|
388
381
|
"main",
|