@clayer/dashboard-layout 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -0
- package/dist/index.d.ts +473 -0
- package/dist/index.js +1393 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dashboard-layout.tsx"],"sourcesContent":["import {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n type UIEvent\n} from \"react\";\nimport { useTheme } from \"@clayer/theme\";\nimport { cn } from \"@clayer/utils\";\n\nimport type {\n DashboardBackgroundComponent,\n DashboardContentConfig,\n DashboardHeaderConfig,\n DashboardLayoutConfig,\n DashboardLayoutProps,\n DashboardLayoutStyles,\n DashboardMobileConfig,\n DashboardMobileUtilityItem,\n DashboardNavGroup,\n DashboardNavItem,\n DashboardNavLink,\n DashboardRenderLinkProps,\n DashboardSidebarBottomPanelConfig,\n DashboardSidebarConfig,\n DashboardUser,\n HeaderAction\n} from \"./types\";\n\nconst defaultSidebar: Required<Pick<DashboardSidebarConfig, \"collapsible\" | \"defaultCollapsed\" | \"width\" | \"collapsedWidth\" | \"showTooltipsWhenCollapsed\" | \"closeOnNavigateMobile\">> = {\n collapsible: true,\n defaultCollapsed: false,\n width: 280,\n collapsedWidth: 80,\n showTooltipsWhenCollapsed: true,\n closeOnNavigateMobile: true\n};\n\nconst densityClasses = {\n compact: {\n header: \"h-14\",\n content: \"p-4\",\n navItem: \"min-h-9 px-2.5 py-2 text-sm\",\n childItem: \"min-h-8 px-3 py-1.5 text-sm\"\n },\n comfortable: {\n header: \"h-16\",\n content: \"p-4 lg:p-6\",\n navItem: \"min-h-10 px-3 py-2 text-sm\",\n childItem: \"min-h-9 px-3 py-2 text-sm\"\n },\n spacious: {\n header: \"h-20\",\n content: \"p-5 lg:p-8\",\n navItem: \"min-h-11 px-4 py-2.5 text-base\",\n childItem: \"min-h-10 px-4 py-2 text-sm\"\n }\n};\n\nconst maxWidthClasses: Record<NonNullable<DashboardContentConfig[\"maxWidth\"]>, string> = {\n none: \"max-w-none\",\n \"screen-xl\": \"max-w-screen-xl\",\n \"screen-2xl\": \"max-w-screen-2xl\",\n \"7xl\": \"max-w-7xl\"\n};\n\nconst layoutPaddingClasses: Record<NonNullable<DashboardLayoutConfig[\"padding\"]>, string> = {\n none: \"p-0\",\n sm: \"p-0 lg:p-2\",\n md: \"p-0 lg:p-3\",\n lg: \"p-0 lg:p-4\"\n};\n\nconst layoutRadiusClasses: Record<NonNullable<DashboardLayoutConfig[\"radius\"]>, string> = {\n none: \"rounded-none\",\n sm: \"rounded-none lg:rounded-md\",\n md: \"rounded-none lg:rounded-lg\",\n lg: \"rounded-none lg:rounded-xl\",\n xl: \"rounded-none lg:rounded-2xl\"\n};\n\nconst layoutShadowClasses: Record<NonNullable<DashboardLayoutConfig[\"shadow\"]>, string> = {\n none: \"shadow-none\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-xl\"\n};\n\nconst userMenuRadiusClasses = {\n none: \"rounded-none\",\n sm: \"rounded-md\",\n md: \"rounded-lg\",\n lg: \"rounded-xl\",\n full: \"rounded-full\"\n};\n\nconst userMenuPaddingClasses = {\n none: \"p-0\",\n sm: \"p-1.5\",\n md: \"p-2\"\n};\n\nconst userMenuBackgroundClasses = {\n transparent: \"bg-transparent\",\n background: \"bg-background\",\n muted: \"bg-muted/60\"\n};\n\nconst userMenuShadowClasses = {\n none: \"shadow-none\",\n sm: \"shadow-sm\",\n md: \"shadow-md\"\n};\n\ntype ResolvedDashboardLayoutConfig = {\n padding: NonNullable<DashboardLayoutConfig[\"padding\"]>;\n bordered: boolean;\n radius: NonNullable<DashboardLayoutConfig[\"radius\"]>;\n shadow: NonNullable<DashboardLayoutConfig[\"shadow\"]>;\n borders: {\n sidebar: boolean;\n header: boolean;\n footer: boolean;\n mobileBottomNav: boolean;\n };\n background: NonNullable<DashboardLayoutConfig[\"background\"]>;\n backgroundComponents: NonNullable<DashboardLayoutConfig[\"backgroundComponents\"]>;\n};\n\nconst defaultLayoutConfig = {\n padding: \"none\",\n bordered: false,\n radius: \"none\",\n shadow: \"none\",\n borders: {\n sidebar: true,\n header: true,\n footer: true,\n mobileBottomNav: true\n },\n background: {\n root: \"bg-background\",\n shell: \"bg-background\",\n sidebar: \"bg-sidebar\",\n header: \"bg-background/85\",\n breadcrumb: \"bg-background/70\",\n main: \"bg-muted/30\",\n content: undefined,\n footer: \"bg-background\",\n mobileBottomNav: \"bg-background\"\n },\n backgroundComponents: {}\n} satisfies ResolvedDashboardLayoutConfig;\n\nfunction resolveSurfaceBackgroundClass({\n value,\n hasComponent\n}: {\n value?: string;\n hasComponent?: boolean;\n}) {\n if (hasComponent || !value) {\n return undefined;\n }\n\n if (value === \"transparent\") {\n return \"bg-transparent\";\n }\n\n if (value === \"inherit\") {\n return \"bg-inherit\";\n }\n\n return value;\n}\n\nfunction SurfaceBackground({ component }: { component?: DashboardBackgroundComponent }) {\n if (!component) {\n return null;\n }\n\n if (\n typeof component === \"object\" &&\n component !== null &&\n !Array.isArray(component) &&\n \"content\" in component\n ) {\n return (\n <div\n className={cn(\n \"absolute inset-0 z-0 h-full w-full\",\n !component.interactive && \"pointer-events-none\",\n component.className\n )}\n style={component.style}\n aria-hidden={!component.interactive}\n >\n {component.content}\n </div>\n );\n }\n\n return (\n <div className=\"pointer-events-none absolute inset-0 z-0 h-full w-full\" aria-hidden>\n {component}\n </div>\n );\n}\n\nfunction useControllableState({\n value,\n defaultValue,\n onChange\n}: {\n value?: boolean;\n defaultValue: boolean;\n onChange?: (value: boolean) => void;\n}) {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const setValue = useCallback(\n (nextValue: boolean) => {\n if (!isControlled) {\n setInternalValue(nextValue);\n }\n onChange?.(nextValue);\n },\n [isControlled, onChange]\n );\n\n return [currentValue, setValue] as const;\n}\n\nfunction defaultIsItemActive(item: DashboardNavLink, currentPath?: string) {\n if (!currentPath) {\n return false;\n }\n\n return item.exact ? currentPath === item.href : currentPath === item.href || currentPath.startsWith(`${item.href}/`);\n}\n\nfunction DefaultLink({ href, children, className, onClick, external, \"aria-current\": ariaCurrent }: DashboardRenderLinkProps) {\n return (\n <a\n href={href}\n className={className}\n onClick={onClick}\n target={external ? \"_blank\" : undefined}\n rel={external ? \"noreferrer\" : undefined}\n aria-current={ariaCurrent}\n >\n {children}\n </a>\n );\n}\n\nfunction getThemeStyles(styles?: Record<string, string | undefined>) {\n return styles as DashboardLayoutStyles | undefined;\n}\n\nfunction Badge({ children, className }: { children: ReactNode; className?: string }) {\n if (!children) {\n return null;\n }\n\n return (\n <span\n className={cn(\n \"ml-auto rounded-full bg-[hsl(var(--cx-sidebar-foreground)/0.12)] px-2 py-0.5 text-[11px] font-medium leading-5\",\n className\n )}\n >\n {children}\n </span>\n );\n}\n\nfunction NavIcon({ icon: Icon, className }: { icon?: DashboardNavLink[\"icon\"]; className?: string }) {\n if (!Icon) {\n return (\n <span className={cn(\"grid size-5 shrink-0 place-items-center leading-none\", className)} aria-hidden>\n <span className=\"size-2 rounded-full bg-current opacity-60\" />\n </span>\n );\n }\n\n return (\n <span className={cn(\"grid size-5 shrink-0 place-items-center leading-none\", className)} aria-hidden>\n <Icon className=\"block size-4 shrink-0 leading-none\" aria-hidden />\n </span>\n );\n}\n\nfunction SidebarLink({\n item,\n active,\n collapsed,\n closeMobile,\n onExpandPersist,\n onCollapsedTooltipChange,\n renderLink,\n styles,\n density\n}: {\n item: DashboardNavLink;\n active: boolean;\n collapsed: boolean;\n closeMobile?: () => void;\n onExpandPersist?: () => void;\n onCollapsedTooltipChange?: (tooltip: { label: string; top: number; left: number } | null) => void;\n renderLink: (props: DashboardRenderLinkProps) => ReactNode;\n styles?: DashboardLayoutStyles;\n density: keyof typeof densityClasses;\n}) {\n const handleClick = () => {\n onCollapsedTooltipChange?.(null);\n onExpandPersist?.();\n item.onClick?.();\n closeMobile?.();\n };\n const handleTooltipShow = (element: HTMLElement) => {\n if (!collapsed) {\n return;\n }\n\n const rect = element.getBoundingClientRect();\n onCollapsedTooltipChange?.({\n label: item.label,\n top: rect.top + rect.height / 2,\n left: rect.right + 12\n });\n };\n\n const className = cn(\n \"group relative flex w-full items-center gap-3 rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n active\n ? \"bg-sidebar-active text-white shadow-sm\"\n : \"text-sidebar-foreground/78 transition-colors hover:bg-[hsl(var(--cx-sidebar-foreground)/0.08)] hover:text-sidebar-foreground motion-reduce:transition-none\",\n densityClasses[density].navItem,\n item.disabled && \"pointer-events-none opacity-45\",\n collapsed && \"justify-center px-2\",\n styles?.sidebarNavItem,\n active && styles?.sidebarNavItemActive\n );\n\n return (\n <li\n onMouseEnter={(event) => handleTooltipShow(event.currentTarget)}\n onMouseLeave={() => onCollapsedTooltipChange?.(null)}\n onFocus={(event) => handleTooltipShow(event.currentTarget)}\n onBlur={() => onCollapsedTooltipChange?.(null)}\n >\n {renderLink({\n href: item.href,\n external: item.external,\n onClick: handleClick,\n className,\n \"aria-current\": active ? \"page\" : undefined,\n children: (\n <>\n <NavIcon icon={item.icon} className={styles?.sidebarNavItemIcon} />\n <span className={cn(\"min-w-0 flex-1 truncate\", collapsed && \"sr-only\", styles?.sidebarNavItemLabel)}>\n {item.label}\n </span>\n {!collapsed ? <Badge className={styles?.sidebarNavItemBadge}>{item.badge}</Badge> : null}\n </>\n )\n })}\n </li>\n );\n}\n\nfunction SidebarGroup({\n item,\n collapsed,\n currentPath,\n isItemActive,\n closeMobile,\n onExpandPersist,\n onCollapsedTooltipChange,\n renderLink,\n styles,\n density\n}: {\n item: DashboardNavGroup;\n collapsed: boolean;\n currentPath?: string;\n isItemActive: (item: DashboardNavLink, currentPath?: string) => boolean;\n closeMobile?: () => void;\n onExpandPersist?: () => void;\n onCollapsedTooltipChange?: (tooltip: { label: string; top: number; left: number } | null) => void;\n renderLink: (props: DashboardRenderLinkProps) => ReactNode;\n styles?: DashboardLayoutStyles;\n density: keyof typeof densityClasses;\n}) {\n const hasActiveChild = item.children.some((child) => isItemActive(child, currentPath));\n const [open, setOpen] = useState(item.defaultOpen ?? hasActiveChild);\n useEffect(() => {\n if (hasActiveChild) {\n setOpen(true);\n }\n }, [hasActiveChild]);\n const handleTooltipShow = (element: HTMLElement) => {\n if (!collapsed) {\n return;\n }\n\n const rect = element.getBoundingClientRect();\n onCollapsedTooltipChange?.({\n label: item.label,\n top: rect.top + rect.height / 2,\n left: rect.right + 12\n });\n };\n\n return (\n <li\n className={cn(\"space-y-1\", styles?.sidebarGroup)}\n onMouseLeave={() => onCollapsedTooltipChange?.(null)}\n onBlur={() => onCollapsedTooltipChange?.(null)}\n >\n <button\n type=\"button\"\n onClick={() => {\n onCollapsedTooltipChange?.(null);\n onExpandPersist?.();\n setOpen((value) => !value);\n }}\n onMouseEnter={(event) => handleTooltipShow(event.currentTarget)}\n onFocus={(event) => handleTooltipShow(event.currentTarget)}\n aria-expanded={open}\n className={cn(\n \"group relative flex w-full items-center gap-3 rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n hasActiveChild\n ? \"bg-sidebar-active text-white shadow-sm\"\n : \"text-sidebar-foreground/78 transition-colors hover:bg-[hsl(var(--cx-sidebar-foreground)/0.08)] hover:text-sidebar-foreground motion-reduce:transition-none\",\n densityClasses[density].navItem,\n collapsed && \"justify-center px-2\",\n styles?.sidebarGroupTrigger,\n hasActiveChild && styles?.sidebarNavItemActive\n )}\n >\n <NavIcon icon={item.icon} className={styles?.sidebarNavItemIcon} />\n <span className={cn(\"min-w-0 flex-1 truncate text-left\", collapsed && \"sr-only\", styles?.sidebarNavItemLabel)}>\n {item.label}\n </span>\n {!collapsed ? <Badge className={styles?.sidebarNavItemBadge}>{item.badge}</Badge> : null}\n {!collapsed ? <span className={cn(\"text-xs transition-transform\", open && \"rotate-90\")}>›</span> : null}\n </button>\n\n {!collapsed && open ? (\n <ul\n className={cn(\n \"ml-5 space-y-1 border-l border-[hsl(var(--cx-sidebar-foreground)/0.12)] pl-3\",\n styles?.sidebarGroupContent\n )}\n >\n {item.children\n .filter((child) => !child.hidden)\n .map((child) => (\n <SidebarLink\n key={child.href}\n item={child}\n active={isItemActive(child, currentPath)}\n collapsed={false}\n closeMobile={closeMobile}\n onExpandPersist={onExpandPersist}\n onCollapsedTooltipChange={onCollapsedTooltipChange}\n renderLink={renderLink}\n styles={{ ...styles, sidebarNavItem: cn(styles?.sidebarNavItem, styles?.sidebarGroupChildItem) }}\n density={density}\n />\n ))}\n </ul>\n ) : null}\n </li>\n );\n}\n\nfunction SidebarNav({\n items,\n collapsed,\n currentPath,\n isItemActive,\n closeMobile,\n onExpandPersist,\n onCollapsedTooltipChange,\n renderLink,\n styles,\n density\n}: {\n items: DashboardNavItem[];\n collapsed: boolean;\n currentPath?: string;\n isItemActive: (item: DashboardNavLink, currentPath?: string) => boolean;\n closeMobile?: () => void;\n onExpandPersist?: () => void;\n onCollapsedTooltipChange?: (tooltip: { label: string; top: number; left: number } | null) => void;\n renderLink: (props: DashboardRenderLinkProps) => ReactNode;\n styles?: DashboardLayoutStyles;\n density: keyof typeof densityClasses;\n}) {\n return (\n <nav\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto overflow-x-hidden px-3 py-4\",\n styles?.sidebarNav\n )}\n aria-label=\"Sidebar navigation\"\n >\n <ul className=\"space-y-1\">\n {items\n .filter((item) => item.type === \"divider\" || !item.hidden)\n .map((item, index) => {\n if (item.type === \"divider\") {\n return (\n <li key={`${item.label ?? \"divider\"}-${index}`} className={cn(\"px-3 py-3\", styles?.sidebarNavSection)}>\n {item.label && !collapsed ? (\n <span className=\"text-xs font-semibold uppercase tracking-wide text-sidebar-foreground/45\">{item.label}</span>\n ) : (\n <span className=\"block border-t border-[hsl(var(--cx-sidebar-foreground)/0.12)]\" />\n )}\n </li>\n );\n }\n\n if (item.type === \"group\") {\n return (\n <SidebarGroup\n key={item.label}\n item={item}\n collapsed={collapsed}\n currentPath={currentPath}\n isItemActive={isItemActive}\n closeMobile={closeMobile}\n onExpandPersist={onExpandPersist}\n onCollapsedTooltipChange={onCollapsedTooltipChange}\n renderLink={renderLink}\n styles={styles}\n density={density}\n />\n );\n }\n\n return (\n <SidebarLink\n key={item.href}\n item={item}\n active={isItemActive(item, currentPath)}\n collapsed={collapsed}\n closeMobile={closeMobile}\n onExpandPersist={onExpandPersist}\n onCollapsedTooltipChange={onCollapsedTooltipChange}\n renderLink={renderLink}\n styles={styles}\n density={density}\n />\n );\n })}\n </ul>\n </nav>\n );\n}\n\nfunction DashboardSidebar({\n logo,\n sidebarHeader,\n sidebarBottomPanel,\n sidebarFooter,\n items,\n collapsed,\n onCollapsedChange,\n sidebar,\n currentPath,\n isItemActive,\n closeMobile,\n renderLink,\n styles,\n density,\n layout,\n mobile\n}: {\n logo?: ReactNode;\n sidebarHeader?: ReactNode;\n sidebarBottomPanel?: DashboardSidebarBottomPanelConfig;\n sidebarFooter?: ReactNode;\n items: DashboardNavItem[];\n collapsed: boolean;\n onCollapsedChange: (collapsed: boolean) => void;\n sidebar: typeof defaultSidebar;\n currentPath?: string;\n isItemActive: (item: DashboardNavLink, currentPath?: string) => boolean;\n closeMobile?: () => void;\n renderLink: (props: DashboardRenderLinkProps) => ReactNode;\n styles?: DashboardLayoutStyles;\n density: keyof typeof densityClasses;\n layout: ResolvedDashboardLayoutConfig;\n mobile?: boolean;\n}) {\n const effectiveCollapsed = collapsed;\n const width = mobile ? sidebar.width : effectiveCollapsed ? sidebar.collapsedWidth : sidebar.width;\n const [collapsedTooltip, setCollapsedTooltip] = useState<{\n label: string;\n top: number;\n left: number;\n } | null>(null);\n const fallbackBottomPanel: DashboardSidebarBottomPanelConfig | undefined = sidebarFooter\n ? ({\n content: sidebarFooter\n })\n : undefined;\n const bottomPanel = sidebarBottomPanel ?? fallbackBottomPanel;\n const showBottomPanel = bottomPanel && (mobile || !effectiveCollapsed);\n const [bottomPanelCollapsed, setBottomPanelCollapsed] = useControllableState({\n value: bottomPanel?.collapsed,\n defaultValue: bottomPanel?.defaultCollapsed ?? false,\n onChange: bottomPanel?.onCollapsedChange\n });\n const isSidebarCompact = !mobile && effectiveCollapsed;\n const isPanelBodyCollapsed = Boolean(bottomPanel?.collapsible && bottomPanelCollapsed && !isSidebarCompact);\n const bottomPanelContent = isSidebarCompact ? bottomPanel?.collapsedContent : bottomPanel?.content;\n const bottomPanelHeight = isPanelBodyCollapsed ? bottomPanel?.collapsedHeight : bottomPanel?.height;\n const bottomPanelStyle: CSSProperties | undefined = bottomPanelHeight\n ? { height: bottomPanelHeight }\n : undefined;\n const handleExpandPersist = () => {\n if (!mobile && collapsed) {\n setCollapsedTooltip(null);\n onCollapsedChange(false);\n }\n };\n const handleSidebarToggle = () => {\n if (mobile) {\n return;\n }\n setCollapsedTooltip(null);\n onCollapsedChange(!effectiveCollapsed);\n };\n\n return (\n <aside\n className={cn(\n \"relative flex h-full min-h-0 shrink-0 flex-col overflow-hidden text-sidebar-foreground transition-[width] duration-200 ease-out motion-reduce:transition-none\",\n resolveSurfaceBackgroundClass({\n value: layout.background.sidebar,\n hasComponent: Boolean(layout.backgroundComponents.sidebar)\n }),\n layout.borders.sidebar && \"border-r border-[hsl(var(--cx-sidebar-foreground)/0.12)]\",\n !mobile && \"hidden lg:flex\",\n styles?.sidebar\n )}\n style={{ width }}\n >\n <SurfaceBackground component={layout.backgroundComponents.sidebar} />\n <div className={cn(\"relative z-10 flex min-h-0 flex-1 flex-col\", styles?.sidebarInner)}>\n <div\n className={cn(\n \"flex h-16 shrink-0 items-center gap-3 border-b border-[hsl(var(--cx-sidebar-foreground)/0.12)] px-4\",\n collapsed && !mobile && \"justify-center px-2\",\n styles?.sidebarHeader\n )}\n >\n <div className={cn(\"min-w-0 flex-1\", effectiveCollapsed && !mobile && \"sr-only\", styles?.sidebarLogo)}>{sidebarHeader ?? logo}</div>\n {sidebar.collapsible && !mobile ? (\n <button\n type=\"button\"\n onClick={handleSidebarToggle}\n className={cn(\n \"grid size-9 place-items-center rounded-lg text-sidebar-foreground/70 hover:bg-[hsl(var(--cx-sidebar-foreground)/0.08)] hover:text-sidebar-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n styles?.sidebarToggle\n )}\n aria-label={effectiveCollapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n >\n {effectiveCollapsed ? \"›\" : \"‹\"}\n </button>\n ) : null}\n </div>\n\n <SidebarNav\n items={items}\n collapsed={effectiveCollapsed && !mobile}\n currentPath={currentPath}\n isItemActive={isItemActive}\n closeMobile={closeMobile}\n onExpandPersist={handleExpandPersist}\n onCollapsedTooltipChange={sidebar.showTooltipsWhenCollapsed && effectiveCollapsed ? setCollapsedTooltip : undefined}\n renderLink={renderLink}\n styles={styles}\n density={density}\n />\n\n {showBottomPanel && bottomPanelContent ? (\n <div\n className={cn(\n bottomPanel.sticky !== false && \"sticky bottom-0\",\n \"shrink-0 overflow-hidden bg-transparent p-4\",\n bottomPanel.bordered !== false && \"border-t border-[hsl(var(--cx-sidebar-foreground)/0.12)]\",\n effectiveCollapsed && !mobile && \"px-2\",\n styles?.sidebarFooter,\n bottomPanel.className\n )}\n style={bottomPanelStyle}\n >\n {!isSidebarCompact && (bottomPanel.title || bottomPanel.collapsible) ? (\n <div className=\"mb-3 flex items-center justify-between gap-3\">\n {bottomPanel.title ? (\n <div className=\"min-w-0 truncate font-semibold text-sidebar-foreground\">\n {bottomPanel.title}\n </div>\n ) : (\n <span />\n )}\n {bottomPanel.collapsible ? (\n <button\n type=\"button\"\n onClick={() => setBottomPanelCollapsed(!bottomPanelCollapsed)}\n className=\"grid size-7 shrink-0 place-items-center rounded-md text-sidebar-foreground/70 hover:bg-[hsl(var(--cx-sidebar-foreground)/0.08)] hover:text-sidebar-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-expanded={!bottomPanelCollapsed}\n aria-label={bottomPanel.collapseButtonLabel ?? (bottomPanelCollapsed ? \"Expand sidebar panel\" : \"Collapse sidebar panel\")}\n >\n <span className={cn(\"transition-transform\", bottomPanelCollapsed ? \"-rotate-90\" : \"rotate-90\")}>›</span>\n </button>\n ) : null}\n </div>\n ) : null}\n\n {!isPanelBodyCollapsed ? (\n <div className=\"min-h-0 overflow-hidden\">\n {bottomPanelContent}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n {sidebar.showTooltipsWhenCollapsed && effectiveCollapsed && collapsedTooltip ? (\n <span\n className=\"pointer-events-none fixed z-[70] -translate-y-1/2 whitespace-nowrap rounded-md bg-foreground px-2 py-1 text-xs text-background shadow-lg\"\n style={{ top: collapsedTooltip.top, left: collapsedTooltip.left }}\n >\n {collapsedTooltip.label}\n </span>\n ) : null}\n </aside>\n );\n}\n\nfunction ActionButton({ action, styles }: { action: Extract<HeaderAction, { type: \"button\" | \"icon\" }>; styles?: DashboardLayoutStyles }) {\n const Icon = action.icon;\n const isIcon = action.type === \"icon\";\n\n return (\n <button\n type=\"button\"\n onClick={action.onClick}\n className={cn(\n \"relative inline-flex items-center justify-center gap-2 rounded-lg border border-border bg-background text-sm font-medium text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n isIcon ? \"size-9\" : \"h-9 px-3\",\n action.type === \"button\" && action.variant === \"solid\" && \"border-primary bg-primary text-primary-foreground hover:bg-primary/90\",\n action.type === \"button\" && action.variant === \"ghost\" && \"border-transparent bg-transparent hover:bg-muted\",\n action.type === \"button\" && action.variant === \"soft\" && \"border-transparent bg-primary/10 text-primary hover:bg-primary/15\",\n action.type === \"button\" && action.tone === \"danger\" && \"border-danger text-danger hover:bg-danger/10\",\n styles?.headerActionButton\n )}\n aria-label={action.label}\n >\n {Icon ? <Icon className=\"size-4\" aria-hidden /> : null}\n {!isIcon ? <span>{action.label}</span> : null}\n {isIcon && action.badge ? <span className=\"absolute -right-1 -top-1 rounded-full bg-danger px-1.5 text-[10px] font-semibold text-white\">{action.badge}</span> : null}\n </button>\n );\n}\n\nfunction DropdownAction({ action, styles }: { action: Extract<HeaderAction, { type: \"dropdown\" }>; styles?: DashboardLayoutStyles }) {\n const [open, setOpen] = useState(false);\n const Icon = action.icon;\n\n return (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen((value) => !value)}\n aria-expanded={open}\n className={cn(\"inline-flex h-9 items-center gap-2 rounded-lg border border-border bg-background px-3 text-sm font-medium hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\", styles?.headerActionButton)}\n >\n {Icon ? <Icon className=\"size-4\" aria-hidden /> : null}\n {action.label}\n </button>\n {open ? (\n <div className=\"absolute right-0 top-11 z-50 w-52 rounded-lg border border-border bg-background p-1 shadow-lg\">\n {action.items.map((item) => {\n const ItemIcon = item.icon;\n\n return (\n <button\n key={item.label}\n type=\"button\"\n onClick={() => {\n item.onClick?.();\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2 rounded-md px-3 py-2 text-left text-sm hover:bg-muted\"\n >\n {ItemIcon ? <ItemIcon className=\"size-4\" aria-hidden /> : null}\n {item.label}\n </button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction HeaderActions({\n actions,\n headerActions,\n styles\n}: {\n actions?: HeaderAction[];\n headerActions?: ReactNode;\n styles?: DashboardLayoutStyles;\n}) {\n return (\n <div className={cn(\"flex items-center gap-2\", styles?.headerActions)}>\n {actions?.map((action, index) => {\n if (action.type === \"custom\") {\n return <Fragment key={index}>{action.render}</Fragment>;\n }\n\n if (action.type === \"dropdown\") {\n return <DropdownAction key={`${action.label}-${index}`} action={action} styles={styles} />;\n }\n\n return <ActionButton key={`${action.label}-${index}`} action={action} styles={styles} />;\n })}\n {headerActions}\n </div>\n );\n}\n\nfunction DashboardBreadcrumbs({\n breadcrumbs,\n renderLink,\n styles,\n}: {\n breadcrumbs?: DashboardHeaderConfig[\"breadcrumbs\"];\n renderLink: (props: DashboardRenderLinkProps) => ReactNode;\n styles?: DashboardLayoutStyles;\n}) {\n if (!breadcrumbs?.length) {\n return null;\n }\n\n return (\n <nav className={cn(\"flex min-w-0 items-center gap-1 overflow-x-auto whitespace-nowrap text-sm text-muted-foreground\", styles?.headerBreadcrumbs)} aria-label=\"Breadcrumbs\">\n {breadcrumbs.map((item, index) => {\n const isLast = index === breadcrumbs.length - 1;\n\n return (\n <Fragment key={`${item.label}-${index}`}>\n {index > 0 ? <span aria-hidden>/</span> : null}\n {item.href && !isLast\n ? renderLink({ href: item.href, className: \"hover:text-foreground\", children: item.label })\n : <span className={cn(isLast && \"text-foreground\")}>{item.label}</span>}\n </Fragment>\n );\n })}\n </nav>\n );\n}\n\nfunction DashboardUserMenu({\n user,\n config,\n styles,\n placement = \"bottom\",\n triggerClassName,\n menuClassName\n}: {\n user?: DashboardUser;\n config?: DashboardHeaderConfig[\"userMenu\"];\n styles?: DashboardLayoutStyles;\n placement?: \"top\" | \"bottom\";\n triggerClassName?: string;\n menuClassName?: string;\n}) {\n const [open, setOpen] = useState(false);\n const [avatarFailed, setAvatarFailed] = useState(false);\n const initials = user?.initials ?? user?.name?.split(\" \").map((part) => part[0]).join(\"\").slice(0, 2).toUpperCase() ?? \"U\";\n const UserIcon = user?.icon;\n const userMenuConfig = {\n bordered: false,\n background: \"transparent\",\n radius: \"lg\",\n padding: \"sm\",\n shadow: \"none\",\n showRole: true,\n ...config\n } as const;\n\n if (!user) {\n return null;\n }\n\n return (\n <div className={cn(\"relative\", styles?.headerUserMenu)}>\n <button\n type=\"button\"\n onClick={() => setOpen((value) => !value)}\n aria-expanded={open}\n className={cn(\n \"flex items-center gap-2 transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n userMenuConfig.bordered && \"border border-border\",\n userMenuBackgroundClasses[userMenuConfig.background],\n userMenuRadiusClasses[userMenuConfig.radius],\n userMenuPaddingClasses[userMenuConfig.padding],\n userMenuShadowClasses[userMenuConfig.shadow],\n triggerClassName\n )}\n >\n {user.avatarUrl && !avatarFailed ? (\n <img\n src={user.avatarUrl}\n alt=\"\"\n className=\"size-8 rounded-full object-cover\"\n onError={() => setAvatarFailed(true)}\n />\n ) : (\n <span className=\"grid size-8 place-items-center rounded-full bg-primary text-xs font-semibold text-primary-foreground\">{initials}</span>\n )}\n <span className=\"hidden min-w-0 text-left lg:block\">\n <span className=\"flex max-w-36 items-center gap-1.5\">\n <span className=\"truncate text-sm font-medium\">{user.name}</span>\n {UserIcon ? <UserIcon className=\"size-3.5 shrink-0 text-primary\" aria-hidden /> : null}\n </span>\n {userMenuConfig.showRole ? (\n <span className=\"block max-w-36 truncate text-xs text-muted-foreground\">{user.role ?? user.email}</span>\n ) : null}\n </span>\n </button>\n\n {open ? (\n <div\n className={cn(\n \"z-50 w-64 rounded-lg border border-border bg-background p-2 shadow-lg\",\n placement === \"top\" ? \"absolute right-0 bottom-12\" : \"absolute right-0 top-12\",\n menuClassName\n )}\n >\n <div className=\"px-3 py-2\">\n <p className=\"truncate text-sm font-medium\">{user.name}</p>\n <p className=\"truncate text-xs text-muted-foreground\">{user.email}</p>\n </div>\n <div className=\"my-1 border-t border-border\" />\n {user.menuItems?.map((item, index) => {\n if (item.type === \"divider\") {\n return <div key={index} className=\"my-1 border-t border-border\" />;\n }\n\n const Icon = item.icon;\n\n return item.href ? (\n <a key={item.label} href={item.href} className=\"flex items-center gap-2 rounded-md px-3 py-2 text-sm hover:bg-muted\">\n {Icon ? <Icon className=\"size-4\" aria-hidden /> : null}\n {item.label}\n </a>\n ) : (\n <button\n key={item.label}\n type=\"button\"\n onClick={() => {\n item.onClick?.();\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2 rounded-md px-3 py-2 text-left text-sm hover:bg-muted\"\n >\n {Icon ? <Icon className=\"size-4\" aria-hidden /> : null}\n {item.label}\n </button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction DashboardHeader({\n header,\n user,\n mobile,\n mobileOpen,\n setMobileOpen,\n renderLink,\n headerActions,\n styles,\n density,\n layout,\n breadcrumbsVisible\n}: {\n header?: DashboardHeaderConfig;\n user?: DashboardUser;\n mobile?: DashboardMobileConfig;\n mobileOpen: boolean;\n setMobileOpen: (open: boolean) => void;\n renderLink: (props: DashboardRenderLinkProps) => ReactNode;\n headerActions?: ReactNode;\n styles?: DashboardLayoutStyles;\n density: keyof typeof densityClasses;\n layout: ResolvedDashboardLayoutConfig;\n breadcrumbsVisible: boolean;\n}) {\n const heightStyle: CSSProperties | undefined = header?.height ? { height: header.height } : undefined;\n const showMobileBottomNav = Boolean(mobile?.bottomNav);\n const showMobileHeaderToggle = header?.showSidebarToggle !== false && !showMobileBottomNav;\n\n return (\n <header\n className={cn(\n \"relative z-30 backdrop-blur-xl\",\n resolveSurfaceBackgroundClass({\n value: layout.background.header,\n hasComponent: Boolean(layout.backgroundComponents.header)\n }),\n layout.borders.header && \"border-b border-border\",\n header?.sticky !== false && \"sticky top-0\",\n styles?.header\n )}\n >\n <SurfaceBackground component={layout.backgroundComponents.header} />\n <div\n className={cn(\"relative z-10 flex items-center justify-between gap-4 px-4 lg:px-6\", densityClasses[density].header, styles?.headerInner)}\n style={heightStyle}\n >\n <div className={cn(\"flex min-w-0 items-center gap-3\", styles?.headerLeft)}>\n {showMobileHeaderToggle ? (\n <button\n type=\"button\"\n onClick={() => setMobileOpen(!mobileOpen)}\n className=\"grid size-9 place-items-center rounded-lg border border-border bg-background text-foreground hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring lg:hidden\"\n aria-label=\"Open navigation\"\n aria-expanded={mobileOpen}\n >\n ☰\n </button>\n ) : null}\n <div className=\"min-w-0\">\n {header?.title ? <h1 className={cn(\"truncate text-lg font-semibold\", styles?.headerTitle)}>{header.title}</h1> : null}\n {header?.subtitle ? <p className={cn(\"truncate text-sm text-muted-foreground\", styles?.headerSubtitle)}>{header.subtitle}</p> : null}\n </div>\n </div>\n\n <div className=\"hidden shrink-0 items-center gap-2 lg:flex\">\n <HeaderActions actions={header?.actions} headerActions={headerActions} styles={styles} />\n <DashboardUserMenu user={user} config={header?.userMenu} styles={styles} />\n </div>\n </div>\n {header?.showBreadcrumbs ? (\n <div\n className={cn(\n \"relative overflow-hidden border-t border-border/70 transition-all duration-200 ease-out motion-reduce:transition-none\",\n resolveSurfaceBackgroundClass({\n value: layout.background.breadcrumb,\n hasComponent: Boolean(layout.backgroundComponents.breadcrumb)\n }),\n breadcrumbsVisible ? \"max-h-12 opacity-100 translate-y-0\" : \"max-h-0 -translate-y-1 opacity-0\"\n )}\n aria-hidden={!breadcrumbsVisible}\n >\n <SurfaceBackground component={layout.backgroundComponents.breadcrumb} />\n <div className=\"relative z-10 px-4 py-2 lg:px-6\">\n <DashboardBreadcrumbs breadcrumbs={header.breadcrumbs} renderLink={renderLink} styles={styles} />\n </div>\n </div>\n ) : null}\n </header>\n );\n}\n\nfunction DashboardContent({\n children,\n content,\n styles,\n density,\n layout\n}: {\n children: ReactNode;\n content?: DashboardContentConfig;\n styles?: DashboardLayoutStyles;\n density: keyof typeof densityClasses;\n layout: ResolvedDashboardLayoutConfig;\n}) {\n const padded = content?.padded !== false;\n const maxWidth = content?.maxWidth ?? \"none\";\n\n return (\n <div\n className={cn(\n \"relative\",\n resolveSurfaceBackgroundClass({\n value: layout.background.main,\n hasComponent: Boolean(layout.backgroundComponents.main)\n }),\n resolveSurfaceBackgroundClass({\n value: layout.background.content,\n hasComponent: Boolean(layout.backgroundComponents.content)\n }),\n padded && densityClasses[density].content,\n styles?.content\n )}\n >\n <SurfaceBackground component={layout.backgroundComponents.main} />\n <SurfaceBackground component={layout.backgroundComponents.content} />\n <div\n className={cn(\n \"relative z-10\",\n maxWidthClasses[maxWidth],\n content?.centered && \"mx-auto\",\n styles?.pageContainer\n )}\n >\n {children}\n </div>\n </div>\n );\n}\n\nfunction MobileDrawer({\n open,\n setOpen,\n sidebarProps,\n styles\n}: {\n open: boolean;\n setOpen: (open: boolean) => void;\n sidebarProps: Parameters<typeof DashboardSidebar>[0];\n styles?: DashboardLayoutStyles;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [rendered, setRendered] = useState(open);\n\n useEffect(() => {\n if (open) {\n setRendered(true);\n return;\n }\n\n const timeoutId = window.setTimeout(() => {\n setRendered(false);\n }, 220);\n\n return () => window.clearTimeout(timeoutId);\n }, [open]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, setOpen]);\n\n if (!rendered) {\n return null;\n }\n\n return (\n <div className=\"fixed inset-0 z-50 lg:hidden\" role=\"dialog\" aria-modal=\"true\">\n <button\n className={cn(\n \"absolute inset-0 bg-black/50 transition-opacity duration-200 ease-out motion-reduce:transition-none\",\n open ? \"opacity-100\" : \"opacity-0\"\n )}\n type=\"button\"\n aria-label=\"Close navigation\"\n onClick={() => setOpen(false)}\n />\n <div\n ref={panelRef}\n className={cn(\n \"absolute inset-y-0 left-0 flex max-w-[86vw] shadow-2xl transition-transform duration-200 ease-out motion-reduce:transition-none\",\n open ? \"translate-x-0\" : \"-translate-x-full\",\n styles?.mobileDrawer\n )}\n >\n <DashboardSidebar {...sidebarProps} mobile closeMobile={() => setOpen(false)} collapsed={false} />\n </div>\n </div>\n );\n}\n\nfunction MobileBottomNav({\n items,\n currentPath,\n isItemActive,\n renderLink,\n user,\n userMenuConfig,\n mobileOpen,\n setMobileOpen,\n utilityItems,\n styles,\n layout\n}: {\n items?: DashboardNavLink[];\n currentPath?: string;\n isItemActive: (item: DashboardNavLink, currentPath?: string) => boolean;\n renderLink: (props: DashboardRenderLinkProps) => ReactNode;\n user?: DashboardUser;\n userMenuConfig?: DashboardHeaderConfig[\"userMenu\"];\n mobileOpen: boolean;\n setMobileOpen: (open: boolean) => void;\n utilityItems?: DashboardMobileUtilityItem[];\n styles?: DashboardLayoutStyles;\n layout: ResolvedDashboardLayoutConfig;\n}) {\n const resolvedUtilityItems = utilityItems?.length\n ? utilityItems\n : ([{ type: \"sidebar-toggle\" }, { type: \"user-menu\" }] satisfies DashboardMobileUtilityItem[]);\n\n if (!items?.length && !resolvedUtilityItems.length) {\n return null;\n }\n\n const mobileUserMenuConfig = {\n ...userMenuConfig,\n bordered: false,\n background: \"transparent\",\n padding: \"none\",\n shadow: \"none\",\n showRole: false\n } satisfies DashboardHeaderConfig[\"userMenu\"];\n const itemBaseClassName =\n \"group flex h-full min-h-[4.5rem] w-full min-w-[4.75rem] flex-col items-center justify-center gap-1 px-2.5 py-2 text-[0.7rem] font-medium leading-none transition-colors\";\n const itemShellClassName =\n \"relative flex min-w-[4.75rem] flex-1 basis-0 items-stretch before:absolute before:bottom-3 before:left-0 before:top-3 before:w-px before:bg-border/70 before:content-[''] first:before:hidden\";\n const iconWrapClassName =\n \"grid size-6 place-items-center text-current transition-transform duration-200 motion-reduce:transition-none\";\n\n return (\n <nav\n className={cn(\n \"fixed inset-x-0 bottom-0 z-40 pb-[env(safe-area-inset-bottom)] lg:hidden\",\n resolveSurfaceBackgroundClass({\n value: layout.background.mobileBottomNav,\n hasComponent: Boolean(layout.backgroundComponents.mobileBottomNav)\n }),\n styles?.mobileBottomNav\n )}\n aria-label=\"Mobile navigation\"\n >\n <SurfaceBackground component={layout.backgroundComponents.mobileBottomNav} />\n <div className=\"relative z-10 w-full\">\n <div\n className={cn(\n \"flex min-h-[5.25rem] w-full items-stretch bg-background/95 backdrop-blur-2xl\",\n layout.borders.mobileBottomNav && \"border-t border-border/80\"\n )}\n >\n <ul className=\"flex min-w-0 flex-1 items-stretch overflow-x-auto overflow-y-hidden\">\n {items?.map((item) => {\n const active = isItemActive(item, currentPath);\n const Icon = item.icon;\n\n return (\n <li key={item.href} className={itemShellClassName}>\n {renderLink({\n href: item.href,\n external: item.external,\n \"aria-current\": active ? \"page\" : undefined,\n className: cn(\n itemBaseClassName,\n active ? \"text-primary\" : \"text-muted-foreground hover:text-foreground\"\n ),\n children: (\n <>\n <span\n className={cn(\n \"h-0.5 w-8 rounded-full transition-all duration-200 motion-reduce:transition-none\",\n active ? \"bg-primary opacity-100\" : \"bg-transparent opacity-0\"\n )}\n />\n {Icon ? (\n <span className={cn(iconWrapClassName, active && \"-translate-y-px\")} aria-hidden>\n <Icon className=\"size-[1.3rem]\" aria-hidden />\n </span>\n ) : (\n <span className={cn(iconWrapClassName, active && \"-translate-y-px\")} aria-hidden>\n <span className=\"size-2.5 rounded-full bg-current\" />\n </span>\n )}\n <span className=\"max-w-16 truncate leading-none\">{item.label}</span>\n </>\n )\n })}\n </li>\n );\n })}\n {resolvedUtilityItems.map((item, index) => {\n if (item.type === \"custom\") {\n return (\n <li key={item.key} className={itemShellClassName}>\n {item.render}\n </li>\n );\n }\n\n if (item.type === \"user-menu\") {\n return user ? (\n <li key={`mobile-user-${index}`} className={itemShellClassName}>\n <DashboardUserMenu\n user={user}\n config={mobileUserMenuConfig}\n styles={styles}\n placement=\"top\"\n menuClassName=\"fixed bottom-[calc(env(safe-area-inset-bottom)+6.25rem)] right-3 z-[90] w-[min(16rem,calc(100vw-1.5rem))] max-w-[calc(100vw-1.5rem)] rounded-2xl border border-border/80 bg-background/98 shadow-[0_24px_60px_-24px_rgba(15,23,42,0.55)] backdrop-blur-xl\"\n triggerClassName={cn(\n itemBaseClassName,\n \"text-foreground hover:text-foreground\"\n )}\n />\n </li>\n ) : null;\n }\n\n const Icon = item.icon;\n return (\n <li key={`mobile-sidebar-toggle-${index}`} className={itemShellClassName}>\n <button\n type=\"button\"\n onClick={() => setMobileOpen(!mobileOpen)}\n className={cn(\n itemBaseClassName,\n \"text-foreground hover:text-foreground\"\n )}\n aria-label={item.label ?? \"Open navigation\"}\n aria-expanded={mobileOpen}\n >\n <span className={iconWrapClassName} aria-hidden>\n {Icon ? <Icon className=\"size-[1.3rem]\" aria-hidden /> : \"☰\"}\n </span>\n <span className=\"max-w-16 truncate leading-none\">{item.label ?? \"Menu\"}</span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n </nav>\n );\n}\n\nexport function DashboardLayout({\n children,\n logo,\n sidebarItems = [],\n currentPath,\n isItemActive = defaultIsItemActive,\n renderLink = DefaultLink,\n user,\n header,\n sidebar: sidebarConfig,\n mobile,\n content,\n layout: layoutConfig,\n headerActions,\n sidebarBottomPanel,\n sidebarFooter,\n sidebarHeader,\n footer,\n variant = \"classic\",\n density = \"comfortable\",\n styles,\n className,\n style\n}: DashboardLayoutProps) {\n const theme = useTheme();\n const themeStyles = getThemeStyles(theme.layout?.DashboardLayout);\n const mergedStyles = useMemo(() => ({ ...themeStyles, ...styles }), [themeStyles, styles]);\n const layout = useMemo(\n () => ({\n ...defaultLayoutConfig,\n ...layoutConfig,\n borders: {\n ...defaultLayoutConfig.borders,\n ...layoutConfig?.borders\n },\n background: {\n ...defaultLayoutConfig.background,\n ...layoutConfig?.background\n },\n backgroundComponents: {\n ...defaultLayoutConfig.backgroundComponents,\n ...layoutConfig?.backgroundComponents\n }\n }),\n [layoutConfig]\n );\n const sidebar = { ...defaultSidebar, ...sidebarConfig };\n const [collapsed, setCollapsed] = useControllableState({\n value: sidebarConfig?.collapsed,\n defaultValue: sidebar.defaultCollapsed,\n onChange: sidebarConfig?.onCollapsedChange\n });\n const [mobileOpen, setMobileOpen] = useState(false);\n const [breadcrumbsVisible, setBreadcrumbsVisible] = useState(true);\n const lastMainScrollTopRef = useRef(0);\n const breadcrumbScrollIntentRef = useRef(0);\n const mobileOpenRef = useRef(mobileOpen);\n const mobileDrawerHistoryEntryActiveRef = useRef(false);\n const mobileDrawerClosingFromHistoryRef = useRef(false);\n const skipNextDrawerPopstateRef = useRef(false);\n const showBottomNav = Boolean(mobile?.bottomNav && (mobile.bottomNavItems?.length || mobile.utilityItems?.length));\n const breadcrumbBehavior = header?.breadcrumbBehavior ?? \"hide-on-scroll\";\n\n useEffect(() => {\n mobileOpenRef.current = mobileOpen;\n }, [mobileOpen]);\n\n useEffect(() => {\n setBreadcrumbsVisible(true);\n lastMainScrollTopRef.current = 0;\n breadcrumbScrollIntentRef.current = 0;\n }, [currentPath]);\n\n useEffect(() => {\n if (mobile?.drawer === false || typeof window === \"undefined\") {\n return;\n }\n\n const handlePopState = () => {\n if (skipNextDrawerPopstateRef.current) {\n skipNextDrawerPopstateRef.current = false;\n return;\n }\n\n if (mobileDrawerHistoryEntryActiveRef.current && mobileOpenRef.current) {\n mobileDrawerClosingFromHistoryRef.current = true;\n mobileDrawerHistoryEntryActiveRef.current = false;\n setMobileOpen(false);\n }\n };\n\n window.addEventListener(\"popstate\", handlePopState);\n return () => window.removeEventListener(\"popstate\", handlePopState);\n }, [mobile?.drawer]);\n\n useEffect(() => {\n if (mobile?.drawer === false || typeof window === \"undefined\") {\n return;\n }\n\n if (mobileOpen) {\n if (!mobileDrawerHistoryEntryActiveRef.current) {\n window.history.pushState({ ...(window.history.state ?? {}), __clayerMobileDrawer: true }, \"\", window.location.href);\n mobileDrawerHistoryEntryActiveRef.current = true;\n }\n return;\n }\n\n if (mobileDrawerClosingFromHistoryRef.current) {\n mobileDrawerClosingFromHistoryRef.current = false;\n return;\n }\n\n if (mobileDrawerHistoryEntryActiveRef.current) {\n mobileDrawerHistoryEntryActiveRef.current = false;\n skipNextDrawerPopstateRef.current = true;\n window.history.back();\n }\n }, [mobile?.drawer, mobileOpen]);\n\n const handleMainScroll = useCallback(\n (event: UIEvent<HTMLElement>) => {\n if (!header?.showBreadcrumbs || breadcrumbBehavior === \"static\") {\n return;\n }\n\n const nextScrollTop = event.currentTarget.scrollTop;\n const maxScrollTop = Math.max(0, event.currentTarget.scrollHeight - event.currentTarget.clientHeight);\n const previousScrollTop = lastMainScrollTopRef.current;\n const delta = nextScrollTop - previousScrollTop;\n const clampedNextScrollTop = Math.max(0, nextScrollTop);\n const distanceFromBottom = Math.max(0, maxScrollTop - clampedNextScrollTop);\n\n if (Math.abs(delta) < 2) {\n lastMainScrollTopRef.current = clampedNextScrollTop;\n return;\n }\n\n if (clampedNextScrollTop < 16) {\n if (!breadcrumbsVisible) {\n setBreadcrumbsVisible(true);\n }\n lastMainScrollTopRef.current = clampedNextScrollTop;\n breadcrumbScrollIntentRef.current = 0;\n return;\n }\n\n const isSameDirection =\n Math.sign(delta) === Math.sign(breadcrumbScrollIntentRef.current) ||\n breadcrumbScrollIntentRef.current === 0;\n\n breadcrumbScrollIntentRef.current = isSameDirection\n ? breadcrumbScrollIntentRef.current + delta\n : delta;\n\n const hideThreshold = 18;\n const showThreshold = 14;\n const minHideScrollTop = 56;\n const showResetScrollTop = 28;\n const bottomIgnoreZone = 24;\n\n if (distanceFromBottom < bottomIgnoreZone && delta > 0) {\n lastMainScrollTopRef.current = clampedNextScrollTop;\n breadcrumbScrollIntentRef.current = Math.max(0, breadcrumbScrollIntentRef.current);\n return;\n }\n\n if (\n breadcrumbsVisible &&\n clampedNextScrollTop > minHideScrollTop &&\n breadcrumbScrollIntentRef.current > hideThreshold\n ) {\n setBreadcrumbsVisible(false);\n breadcrumbScrollIntentRef.current = 0;\n } else if (\n !breadcrumbsVisible &&\n (clampedNextScrollTop < showResetScrollTop ||\n breadcrumbScrollIntentRef.current < -showThreshold)\n ) {\n setBreadcrumbsVisible(true);\n breadcrumbScrollIntentRef.current = 0;\n }\n\n lastMainScrollTopRef.current = clampedNextScrollTop;\n },\n [breadcrumbBehavior, breadcrumbsVisible, header?.showBreadcrumbs]\n );\n\n const sidebarProps = {\n logo,\n sidebarHeader,\n sidebarBottomPanel,\n sidebarFooter,\n items: sidebarItems,\n collapsed,\n onCollapsedChange: setCollapsed,\n sidebar,\n currentPath,\n isItemActive,\n renderLink,\n styles: mergedStyles,\n density,\n layout\n };\n\n return (\n <div\n className={cn(\n \"relative h-screen overflow-hidden text-foreground\",\n resolveSurfaceBackgroundClass({\n value: layout.background.root,\n hasComponent: Boolean(layout.backgroundComponents.root)\n }),\n layoutPaddingClasses[layout.padding],\n mergedStyles.root,\n className\n )}\n style={style}\n >\n <SurfaceBackground component={layout.backgroundComponents.root} />\n <div\n className={cn(\n \"relative z-10 flex h-full min-h-0 overflow-hidden\",\n resolveSurfaceBackgroundClass({\n value: layout.background.shell,\n hasComponent: Boolean(layout.backgroundComponents.shell)\n }),\n layoutRadiusClasses[layout.radius],\n layoutShadowClasses[layout.shadow],\n layout.bordered && \"border border-border\",\n variant === \"floating\" && !layoutConfig && \"rounded-none lg:rounded-xl lg:border lg:border-border\",\n mergedStyles.shell\n )}\n >\n <SurfaceBackground component={layout.backgroundComponents.shell} />\n <DashboardSidebar {...sidebarProps} />\n\n <div className={cn(\"relative z-10 flex min-h-0 min-w-0 flex-1 flex-col\", mergedStyles.main)}>\n {mobile?.showHeader !== false ? (\n <DashboardHeader\n header={header}\n user={user}\n mobile={mobile}\n mobileOpen={mobileOpen}\n setMobileOpen={setMobileOpen}\n renderLink={renderLink}\n headerActions={headerActions}\n styles={mergedStyles}\n density={density}\n layout={layout}\n breadcrumbsVisible={breadcrumbBehavior === \"static\" ? true : breadcrumbsVisible}\n />\n ) : null}\n\n <main\n className={cn(\"relative min-h-0 min-w-0 flex-1 overflow-y-auto\", showBottomNav && \"pb-20 lg:pb-0\", mergedStyles.main)}\n onScroll={handleMainScroll}\n >\n <div className=\"relative z-10\">\n <DashboardContent content={content} styles={mergedStyles} density={density} layout={layout}>\n {children}\n </DashboardContent>\n </div>\n </main>\n\n {footer ? (\n <footer\n className={cn(\n \"relative px-4 py-3\",\n resolveSurfaceBackgroundClass({\n value: layout.background.footer,\n hasComponent: Boolean(layout.backgroundComponents.footer)\n }),\n layout.borders.footer && \"border-t border-border\",\n mergedStyles.footer\n )}\n >\n <SurfaceBackground component={layout.backgroundComponents.footer} />\n <div className=\"relative z-10\">{footer}</div>\n </footer>\n ) : null}\n </div>\n </div>\n\n {mobile?.drawer !== false ? (\n <MobileDrawer open={mobileOpen} setOpen={setMobileOpen} sidebarProps={sidebarProps} styles={mergedStyles} />\n ) : null}\n\n {mobile?.bottomNav ? (\n <MobileBottomNav\n items={mobile.bottomNavItems}\n currentPath={currentPath}\n isItemActive={isItemActive}\n renderLink={renderLink}\n user={user}\n userMenuConfig={header?.userMenu}\n mobileOpen={mobileOpen}\n setMobileOpen={setMobileOpen}\n utilityItems={mobile.utilityItems}\n styles={mergedStyles}\n layout={layout}\n />\n ) : null}\n </div>\n );\n}\n\nexport function DashboardShell({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"flex min-h-screen overflow-hidden bg-inherit text-foreground\", className)} {...props} />;\n}\n\nexport function DashboardMain({ className, ...props }: HTMLAttributes<HTMLElement>) {\n return <main className={cn(\"min-w-0 flex-1 overflow-y-auto bg-transparent\", className)} {...props} />;\n}\n\nexport function DashboardFooter({ className, ...props }: HTMLAttributes<HTMLElement>) {\n return <footer className={cn(\"border-t border-border bg-transparent px-4 py-3\", className)} {...props} />;\n}\n\nexport function DashboardActionGroup({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"flex items-center gap-2\", className)} {...props} />;\n}\n\nexport function SidebarNavItem({ className, ...props }: HTMLAttributes<HTMLLIElement>) {\n return <li className={cn(\"list-none\", className)} {...props} />;\n}\n\nexport function SidebarNavGroup({ className, ...props }: HTMLAttributes<HTMLLIElement>) {\n return <li className={cn(\"list-none space-y-1\", className)} {...props} />;\n}\n\nexport {\n DashboardSidebar,\n DashboardHeader,\n DashboardContent,\n DashboardBreadcrumbs,\n DashboardUserMenu,\n SidebarNav,\n MobileBottomNav as DashboardMobileNav\n};\n"],"mappings":"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","names":["Fragment"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@clayer/dashboard-layout",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@clayer/theme": "1.0.0",
|
|
22
|
+
"@clayer/utils": "1.0.0"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"react": ">=18",
|
|
26
|
+
"react-dom": ">=18"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/react": "^18.3.12",
|
|
30
|
+
"typescript": "^5.6.3",
|
|
31
|
+
"tsup": "^8.3.5"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"dev": "tsup --watch",
|
|
35
|
+
"build": "tsup",
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
38
|
+
"clean": "rm -rf dist"
|
|
39
|
+
}
|
|
40
|
+
}
|