@tomny-dev/uzi 0.5.0 → 0.6.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 +4 -1
- package/dist/components/card/Card.d.ts +7 -5
- package/dist/components/card/Card.d.ts.map +1 -1
- package/dist/components/surface/Surface.d.ts +16 -0
- package/dist/components/surface/Surface.d.ts.map +1 -0
- package/dist/components/toolbar/Toolbar.d.ts +13 -0
- package/dist/components/toolbar/Toolbar.d.ts.map +1 -0
- package/dist/index.cjs +36 -31
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -32
- package/dist/index10.cjs.map +1 -1
- package/dist/index10.js +19 -15
- package/dist/index10.js.map +1 -1
- package/dist/index11.cjs +21 -18
- package/dist/index11.cjs.map +1 -1
- package/dist/index11.js +8 -15
- package/dist/index11.js.map +1 -1
- package/dist/index12.cjs +7 -14
- package/dist/index12.cjs.map +1 -1
- package/dist/index12.js +15 -37
- package/dist/index12.js.map +1 -1
- package/dist/index13.cjs +18 -52
- package/dist/index13.cjs.map +1 -1
- package/dist/index13.js +15 -77
- package/dist/index13.js.map +1 -1
- package/dist/index14.cjs +15 -80
- package/dist/index14.cjs.map +1 -1
- package/dist/index14.js +37 -13
- package/dist/index14.js.map +1 -1
- package/dist/index15.cjs +52 -18
- package/dist/index15.cjs.map +1 -1
- package/dist/index15.js +77 -9
- package/dist/index15.js.map +1 -1
- package/dist/index16.cjs +79 -8
- package/dist/index16.cjs.map +1 -1
- package/dist/index16.js +13 -41
- package/dist/index16.js.map +1 -1
- package/dist/index17.cjs +18 -60
- package/dist/index17.cjs.map +1 -1
- package/dist/index17.js +9 -428
- package/dist/index17.js.map +1 -1
- package/dist/index18.cjs +8 -430
- package/dist/index18.cjs.map +1 -1
- package/dist/index18.js +42 -4
- package/dist/index18.js.map +1 -1
- package/dist/index19.cjs +61 -5
- package/dist/index19.cjs.map +1 -1
- package/dist/index19.js +430 -13
- package/dist/index19.js.map +1 -1
- package/dist/index20.cjs +430 -12
- package/dist/index20.cjs.map +1 -1
- package/dist/index20.js +4 -4
- package/dist/index20.js.map +1 -1
- package/dist/index21.cjs +5 -5
- package/dist/index21.cjs.map +1 -1
- package/dist/index21.js +12 -9
- package/dist/index21.js.map +1 -1
- package/dist/index22.cjs +12 -9
- package/dist/index22.cjs.map +1 -1
- package/dist/index22.js +4 -4
- package/dist/index22.js.map +1 -1
- package/dist/index23.cjs +5 -5
- package/dist/index23.cjs.map +1 -1
- package/dist/index23.js +9 -12
- package/dist/index23.js.map +1 -1
- package/dist/index24.cjs +9 -12
- package/dist/index24.cjs.map +1 -1
- package/dist/index24.js +4 -38
- package/dist/index24.js.map +1 -1
- package/dist/index25.cjs +5 -55
- package/dist/index25.cjs.map +1 -1
- package/dist/index25.js +11 -116
- package/dist/index25.js.map +1 -1
- package/dist/index26.cjs +10 -116
- package/dist/index26.cjs.map +1 -1
- package/dist/index26.js +31 -19
- package/dist/index26.js.map +1 -1
- package/dist/index27.cjs +42 -24
- package/dist/index27.cjs.map +1 -1
- package/dist/index27.js +106 -93
- package/dist/index27.js.map +1 -1
- package/dist/index28.cjs +106 -93
- package/dist/index28.cjs.map +1 -1
- package/dist/index28.js +26 -23
- package/dist/index28.js.map +1 -1
- package/dist/index29.cjs +37 -25
- package/dist/index29.cjs.map +1 -1
- package/dist/index29.js +107 -26
- package/dist/index29.js.map +1 -1
- package/dist/index30.cjs +110 -37
- package/dist/index30.cjs.map +1 -1
- package/dist/index30.js +21 -113
- package/dist/index30.js.map +1 -1
- package/dist/index31.cjs +19 -125
- package/dist/index31.cjs.map +1 -1
- package/dist/index31.js +26 -17
- package/dist/index31.js.map +1 -1
- package/dist/index32.cjs +37 -20
- package/dist/index32.cjs.map +1 -1
- package/dist/index32.js +108 -104
- package/dist/index32.js.map +1 -1
- package/dist/index33.cjs +122 -103
- package/dist/index33.cjs.map +1 -1
- package/dist/index33.js +17 -4
- package/dist/index33.js.map +1 -1
- package/dist/index34.cjs +20 -5
- package/dist/index34.cjs.map +1 -1
- package/dist/index34.js +106 -58
- package/dist/index34.js.map +1 -1
- package/dist/index35.cjs +106 -57
- package/dist/index35.cjs.map +1 -1
- package/dist/index35.js +4 -22
- package/dist/index35.js.map +1 -1
- package/dist/index36.cjs +5 -31
- package/dist/index36.cjs.map +1 -1
- package/dist/index36.js +55 -44
- package/dist/index36.js.map +1 -1
- package/dist/index37.cjs +55 -44
- package/dist/index37.cjs.map +1 -1
- package/dist/index37.js +21 -31
- package/dist/index37.js.map +1 -1
- package/dist/index38.cjs +30 -45
- package/dist/index38.cjs.map +1 -1
- package/dist/index38.js +46 -141
- package/dist/index38.js.map +1 -1
- package/dist/index39.cjs +46 -141
- package/dist/index39.cjs.map +1 -1
- package/dist/index39.js +31 -41
- package/dist/index39.js.map +1 -1
- package/dist/index40.cjs +45 -60
- package/dist/index40.cjs.map +1 -1
- package/dist/index40.js +139 -163
- package/dist/index40.js.map +1 -1
- package/dist/index41.cjs +137 -161
- package/dist/index41.cjs.map +1 -1
- package/dist/index41.js +41 -12
- package/dist/index41.js.map +1 -1
- package/dist/index42.cjs +60 -14
- package/dist/index42.cjs.map +1 -1
- package/dist/index42.js +167 -15
- package/dist/index42.js.map +1 -1
- package/dist/index43.cjs +166 -14
- package/dist/index43.cjs.map +1 -1
- package/dist/index43.js +12 -15
- package/dist/index43.js.map +1 -1
- package/dist/index44.cjs +14 -21
- package/dist/index44.cjs.map +1 -1
- package/dist/index44.js +15 -28
- package/dist/index44.js.map +1 -1
- package/dist/index45.cjs +14 -27
- package/dist/index45.cjs.map +1 -1
- package/dist/index45.js +10 -8
- package/dist/index45.js.map +1 -1
- package/dist/index46.cjs +11 -8
- package/dist/index46.cjs.map +1 -1
- package/dist/index46.js +22 -15
- package/dist/index46.js.map +1 -1
- package/dist/index47.cjs +22 -15
- package/dist/index47.cjs.map +1 -1
- package/dist/index47.js +9 -13
- package/dist/index47.js.map +1 -1
- package/dist/index48.cjs +10 -16
- package/dist/index48.cjs.map +1 -1
- package/dist/index48.js +18 -25
- package/dist/index48.js.map +1 -1
- package/dist/index49.cjs +18 -25
- package/dist/index49.cjs.map +1 -1
- package/dist/index49.js +17 -14
- package/dist/index49.js.map +1 -1
- package/dist/index50.cjs +24 -17
- package/dist/index50.cjs.map +1 -1
- package/dist/index50.js +28 -28
- package/dist/index50.js.map +1 -1
- package/dist/index51.cjs +27 -28
- package/dist/index51.cjs.map +1 -1
- package/dist/index51.js +14 -17
- package/dist/index51.js.map +1 -1
- package/dist/index52.cjs +17 -22
- package/dist/index52.cjs.map +1 -1
- package/dist/index52.js +23 -23
- package/dist/index52.js.map +1 -1
- package/dist/index53.cjs +23 -23
- package/dist/index53.cjs.map +1 -1
- package/dist/index53.js +17 -10
- package/dist/index53.js.map +1 -1
- package/dist/index54.cjs +22 -11
- package/dist/index54.cjs.map +1 -1
- package/dist/index54.js +28 -14
- package/dist/index54.js.map +1 -1
- package/dist/index55.cjs +28 -13
- package/dist/index55.cjs.map +1 -1
- package/dist/index55.js +17 -11
- package/dist/index55.js.map +1 -1
- package/dist/index56.cjs +23 -13
- package/dist/index56.cjs.map +1 -1
- package/dist/index56.js +24 -16
- package/dist/index56.js.map +1 -1
- package/dist/index57.cjs +24 -15
- package/dist/index57.cjs.map +1 -1
- package/dist/index57.js +10 -9
- package/dist/index57.js.map +1 -1
- package/dist/index58.cjs +11 -12
- package/dist/index58.cjs.map +1 -1
- package/dist/index58.js +12 -87
- package/dist/index58.js.map +1 -1
- package/dist/index59.cjs +12 -89
- package/dist/index59.cjs.map +1 -1
- package/dist/index59.js +11 -21
- package/dist/index59.js.map +1 -1
- package/dist/index60.cjs +13 -30
- package/dist/index60.cjs.map +1 -1
- package/dist/index60.js +17 -43
- package/dist/index60.js.map +1 -1
- package/dist/index61.cjs +16 -44
- package/dist/index61.cjs.map +1 -1
- package/dist/index61.js +9 -57
- package/dist/index61.js.map +1 -1
- package/dist/index62.cjs +11 -83
- package/dist/index62.cjs.map +1 -1
- package/dist/index62.js +83 -426
- package/dist/index62.js.map +1 -1
- package/dist/index63.cjs +82 -427
- package/dist/index63.cjs.map +1 -1
- package/dist/index63.js +21 -59
- package/dist/index63.js.map +1 -1
- package/dist/index64.cjs +30 -87
- package/dist/index64.cjs.map +1 -1
- package/dist/index64.js +44 -240
- package/dist/index64.js.map +1 -1
- package/dist/index65.cjs +43 -239
- package/dist/index65.cjs.map +1 -1
- package/dist/index65.js +57 -43
- package/dist/index65.js.map +1 -1
- package/dist/index66.cjs +84 -63
- package/dist/index66.cjs.map +1 -1
- package/dist/index66.js +426 -73
- package/dist/index66.js.map +1 -1
- package/dist/index67.cjs +426 -71
- package/dist/index67.cjs.map +1 -1
- package/dist/index67.js +59 -21
- package/dist/index67.js.map +1 -1
- package/dist/index68.cjs +87 -30
- package/dist/index68.cjs.map +1 -1
- package/dist/index68.js +233 -88
- package/dist/index68.js.map +1 -1
- package/dist/index69.cjs +232 -89
- package/dist/index69.cjs.map +1 -1
- package/dist/index69.js +40 -16
- package/dist/index69.js.map +1 -1
- package/dist/index70.cjs +56 -20
- package/dist/index70.cjs.map +1 -1
- package/dist/index70.js +72 -145
- package/dist/index70.js.map +1 -1
- package/dist/index71.cjs +72 -145
- package/dist/index71.cjs.map +1 -1
- package/dist/index71.js +25 -0
- package/dist/index71.js.map +1 -0
- package/dist/index72.cjs +34 -0
- package/dist/index72.cjs.map +1 -0
- package/dist/index72.js +101 -0
- package/dist/index72.js.map +1 -0
- package/dist/index73.cjs +105 -0
- package/dist/index73.cjs.map +1 -0
- package/dist/index73.js +23 -0
- package/dist/index73.js.map +1 -0
- package/dist/index74.cjs +31 -0
- package/dist/index74.cjs.map +1 -0
- package/dist/index74.js +159 -0
- package/dist/index74.js.map +1 -0
- package/dist/index75.cjs +161 -0
- package/dist/index75.cjs.map +1 -0
- package/dist/index8.js.map +1 -1
- package/dist/index9.cjs.map +1 -1
- package/dist/index9.js.map +1 -1
- package/dist/style.css +215 -45
- package/package.json +2 -2
package/dist/index39.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index39.cjs","names":[],"sources":["../src/components/app-shell/AppShell.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport { TopBar, type TopBarProps } from \"../top-bar/TopBar\";\nimport styles from \"./app-shell.module.css\";\n\nconst DESKTOP_BREAKPOINT = 960;\n\nfunction getIsDesktop() {\n if (typeof window === \"undefined\") return false;\n return window.innerWidth >= DESKTOP_BREAKPOINT;\n}\n\nexport type AppShellProps = {\n /** Primary page content rendered in the main area. */\n children: ReactNode;\n /** Sidebar navigation or custom content. */\n sidebar: ReactNode;\n /** Brand element rendered next to the hamburger (text or JSX). */\n brand?: ReactNode;\n /** Optional brand href; when provided the brand renders as an anchor. */\n brandHref?: string;\n /** Optional content after the brand on the left side of the top bar. */\n topbarStart?: ReactNode;\n /** Optional content aligned to the right side of the top bar. */\n topbarEnd?: ReactNode;\n /** Optional built-in theme toggle for the top bar. */\n showThemeToggle?: boolean;\n themeToggleProps?: TopBarProps[\"themeToggleProps\"];\n topBarBrandingLocation?: TopBarProps[\"brandingLocation\"];\n /** Custom class names for styling overrides. */\n className?: string;\n sidebarClassName?: string;\n topbarClassName?: string;\n mainClassName?: string;\n /** Sets the sidebar width (e.g., `260`, `\"18rem\"`). */\n sidebarWidth?: number | string;\n /**\n * Closes the sidebar on mobile whenever this value changes.\n * Useful for reacting to route/pathname changes.\n */\n closeSidebarOnChangeKey?: unknown;\n /** Label for the hamburger button (aria-label). */\n hamburgerLabel?: string;\n /** Optional callback fired whenever the sidebar open state changes. */\n onSidebarToggle?: (open: boolean) => void;\n};\n\n/**\n * Responsive application shell with a collapsible sidebar and sticky top bar.\n *\n * - Sidebar opens by default on desktop, collapses on mobile.\n * - Closes on outside click/scroll/touch when in mobile mode.\n * - Provides optional hook to close the sidebar when a prop value changes\n * (e.g., route transitions).\n */\nexport function AppShell({\n children,\n sidebar,\n brand,\n brandHref,\n topbarStart,\n topbarEnd,\n showThemeToggle = false,\n themeToggleProps,\n topBarBrandingLocation = \"left\",\n className,\n sidebarClassName,\n topbarClassName,\n mainClassName,\n sidebarWidth,\n closeSidebarOnChangeKey,\n hamburgerLabel = \"Toggle navigation\",\n onSidebarToggle,\n}: AppShellProps) {\n const [isDesktop, setIsDesktop] = useState(false);\n const [sidebarOpen, setSidebarOpen] = useState(false);\n const [transitionsReady, setTransitionsReady] = useState(false);\n const prevIsDesktopRef = useRef(false);\n const closeKeyRef = useRef(closeSidebarOnChangeKey);\n\n const sidebarRef = useRef<HTMLElement | null>(null);\n const hamburgerRef = useRef<HTMLButtonElement | null>(null);\n const mainRef = useRef<HTMLElement | null>(null);\n const sidebarId = useId();\n\n useEffect(() => {\n const desktop = getIsDesktop();\n setIsDesktop(desktop);\n setSidebarOpen(desktop);\n prevIsDesktopRef.current = desktop;\n const transitionFrame = window.requestAnimationFrame(() => {\n setTransitionsReady(true);\n });\n\n const handleResize = () => {\n const nowDesktop = getIsDesktop();\n setIsDesktop(nowDesktop);\n if (nowDesktop !== prevIsDesktopRef.current) {\n setSidebarOpen(nowDesktop);\n prevIsDesktopRef.current = nowDesktop;\n }\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => {\n window.cancelAnimationFrame(transitionFrame);\n window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n\n // Close the sidebar when clicking outside or scrolling on mobile.\n useEffect(() => {\n if (isDesktop || !sidebarOpen) return;\n\n const mainElement = mainRef.current;\n const closeSidebar = () => setSidebarOpen(false);\n\n const onPointerDown = (e: PointerEvent) => {\n const target = e.target as Node | null;\n if (!target) return;\n if (sidebarRef.current?.contains(target)) return;\n if (hamburgerRef.current?.contains(target)) return;\n closeSidebar();\n };\n\n const timeoutId = window.setTimeout(() => {\n document.addEventListener(\"pointerdown\", onPointerDown);\n window.addEventListener(\"scroll\", closeSidebar, { passive: true });\n mainElement?.addEventListener(\"scroll\", closeSidebar, { passive: true });\n document.addEventListener(\"touchmove\", closeSidebar, { passive: true });\n }, 10);\n\n return () => {\n window.clearTimeout(timeoutId);\n document.removeEventListener(\"pointerdown\", onPointerDown);\n window.removeEventListener(\"scroll\", closeSidebar);\n mainElement?.removeEventListener(\"scroll\", closeSidebar);\n document.removeEventListener(\"touchmove\", closeSidebar);\n };\n }, [sidebarOpen, isDesktop]);\n\n // Allow consumers to request a mobile sidebar close when a value changes (e.g., pathname).\n useEffect(() => {\n if (!isDesktop && closeKeyRef.current !== closeSidebarOnChangeKey) {\n setSidebarOpen(false);\n }\n closeKeyRef.current = closeSidebarOnChangeKey;\n }, [closeSidebarOnChangeKey, isDesktop]);\n\n useEffect(() => {\n onSidebarToggle?.(sidebarOpen);\n }, [sidebarOpen, onSidebarToggle]);\n\n const toggleSidebar = () => setSidebarOpen((open) => !open);\n\n const sidebarWidthValue =\n sidebarWidth === undefined\n ? undefined\n : typeof sidebarWidth === \"number\"\n ? `${sidebarWidth}px`\n : sidebarWidth;\n\n const shellStyle: CSSProperties | undefined = sidebarWidthValue\n ? { [\"--app-shell-sidebar-width\" as string]: sidebarWidthValue }\n : undefined;\n\n const shellClasses = cx(\n styles.appShell,\n transitionsReady && styles.appShellAnimated,\n sidebarOpen ? styles.appShellOpen : styles.appShellCollapsed,\n className,\n );\n\n const sidebarClasses = cx(\n styles.appShellSidebar,\n sidebarOpen && styles.appShellSidebarOpen,\n sidebarClassName,\n );\n\n return (\n <div\n className={shellClasses}\n style={shellStyle}\n data-app-shell\n data-desktop={isDesktop ? \"true\" : \"false\"}\n data-sidebar-open={sidebarOpen ? \"true\" : \"false\"}\n >\n <TopBar\n className={cx(styles.appShellTopbar, topbarClassName)}\n leading={\n <button\n ref={hamburgerRef}\n type=\"button\"\n className={styles.appShellHamburger}\n onClick={toggleSidebar}\n aria-label={hamburgerLabel}\n aria-expanded={sidebarOpen}\n aria-controls={sidebarId}\n >\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M3 6h18M3 12h18M3 18h18\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n }\n brand={brand}\n brandHref={brandHref}\n brandingLocation={topBarBrandingLocation}\n start={topbarStart}\n actions={topbarEnd}\n showThemeToggle={showThemeToggle}\n themeToggleProps={themeToggleProps}\n />\n {!isDesktop && sidebarOpen && (\n <div\n className={styles.appShellBackdrop}\n onClick={() => setSidebarOpen(false)}\n onTouchStart={() => setSidebarOpen(false)}\n aria-hidden=\"true\"\n />\n )}\n <aside ref={sidebarRef} id={sidebarId} className={sidebarClasses} aria-label=\"Sidebar navigation\">\n {sidebar}\n </aside>\n <main ref={mainRef} className={cx(styles.appShellMain, mainClassName)}>\n {children}\n </main>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index39.cjs","names":[],"sources":["../src/components/top-bar/TopBar.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport {\n ThemeToggleButton,\n type ThemeToggleButtonProps,\n} from \"../theme-toggle-button/ThemeToggleButton\";\nimport styles from \"./top-bar.module.css\";\n\nexport type TopBarProps = HTMLAttributes<HTMLElement> & {\n leading?: ReactNode;\n brand?: ReactNode;\n brandHref?: string;\n brandingLocation?: \"left\" | \"center\";\n /** Content rendered after the brand in the left region (e.g. breadcrumbs, search). */\n start?: ReactNode;\n /** Content rendered in the center region. */\n center?: ReactNode;\n actions?: ReactNode;\n showThemeToggle?: boolean;\n themeToggleProps?: ThemeToggleButtonProps;\n innerClassName?: string;\n isSticky?: boolean;\n sticky?: boolean;\n};\n\nexport function TopBar({\n leading,\n brand,\n brandHref,\n brandingLocation = \"left\",\n start,\n center,\n actions,\n showThemeToggle = false,\n themeToggleProps,\n className,\n innerClassName,\n isSticky,\n sticky = true,\n children,\n ...rest\n}: TopBarProps) {\n const shouldStick = isSticky ?? sticky;\n const brandNode = !brand ? null : brandHref ? (\n <a href={brandHref} className={styles.topBarBrand}>\n <span className={styles.topBarBrandContent}>{brand}</span>\n </a>\n ) : (\n <div className={styles.topBarBrand}>\n <span className={styles.topBarBrandContent}>{brand}</span>\n </div>\n );\n\n return (\n <header\n className={cx(styles.topBar, !shouldStick && styles.topBarStatic, className)}\n {...rest}\n >\n <div className={cx(styles.topBarInner, innerClassName)}>\n <div className={styles.topBarStart}>\n {leading}\n {brandingLocation === \"left\" && brandNode}\n {start}\n </div>\n {(brandNode && brandingLocation === \"center\") || center || children ? (\n <div className={styles.topBarCenter}>\n <div className={styles.topBarCenterGroup}>\n {brandingLocation === \"center\" && brandNode}\n {center ?? children}\n </div>\n </div>\n ) : null}\n <div className={styles.topBarActions}>\n {showThemeToggle && <ThemeToggleButton {...themeToggleProps} />}\n {actions}\n </div>\n </div>\n </header>\n );\n}\n"],"mappings":";;;;;;AA2BA,SAAgB,OAAO,EACrB,SACA,OACA,WACA,mBAAmB,QACnB,OACA,QACA,SACA,kBAAkB,OAClB,kBACA,WACA,gBACA,UACA,SAAS,MACT,UACA,GAAG,QACW;CACd,MAAM,cAAc,YAAY;CAChC,MAAM,YAAY,CAAC,QAAQ,OAAO,YAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;EAAG,MAAM;EAAW,WAAW,uBAAA,QAAO;YACpC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAW,uBAAA,QAAO;aAAqB;EAAY,CAAA;CACxD,CAAA,IAEH,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAW,uBAAA,QAAO;YACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAW,uBAAA,QAAO;aAAqB;EAAY,CAAA;CACtD,CAAA;CAGP,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;EACE,WAAW,WAAA,GAAG,uBAAA,QAAO,QAAQ,CAAC,eAAe,uBAAA,QAAO,cAAc,SAAS;EAC3E,GAAI;YAEJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAW,WAAA,GAAG,uBAAA,QAAO,aAAa,cAAc;aAArD;IACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAW,uBAAA,QAAO;eAAvB;MACG;MACA,qBAAqB,UAAU;MAC/B;KACE;;IACH,aAAa,qBAAqB,YAAa,UAAU,WACzD,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAW,uBAAA,QAAO;eACrB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAW,uBAAA,QAAO;gBAAvB,CACG,qBAAqB,YAAY,WACjC,UAAU,QACR;;IACF,CAAA,IACH;IACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAW,uBAAA,QAAO;eAAvB,CACG,mBAAmB,iBAAA,GAAA,kBAAA,IAAA,CAAC,0BAAA,mBAAD,EAAmB,GAAI,iBAAmB,CAAA,GAC7D,OACE;;GACF;;CACC,CAAA;AAEZ"}
|
package/dist/index39.js
CHANGED
|
@@ -1,45 +1,35 @@
|
|
|
1
|
-
//#region src/components/
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
itemWithoutIcon,
|
|
32
|
-
itemActive,
|
|
33
|
-
itemCollapsed,
|
|
34
|
-
itemDisabled,
|
|
35
|
-
icon,
|
|
36
|
-
itemBody,
|
|
37
|
-
labelRow,
|
|
38
|
-
label,
|
|
39
|
-
description,
|
|
40
|
-
badge
|
|
1
|
+
//#region src/components/app-shell/app-shell.module.css
|
|
2
|
+
var appShell = "uzi-app-shell-module__appShell__S0cVI";
|
|
3
|
+
var appShellAnimated = "uzi-app-shell-module__appShellAnimated__-CRIl";
|
|
4
|
+
var appShellOpen = "uzi-app-shell-module__appShellOpen__1rZUl";
|
|
5
|
+
var appShellCollapsed = "uzi-app-shell-module__appShellCollapsed__fSasN";
|
|
6
|
+
var appShellTopbar = "uzi-app-shell-module__appShellTopbar__rgXsW";
|
|
7
|
+
var appShellTopbarLeft = "uzi-app-shell-module__appShellTopbarLeft__-EVuB";
|
|
8
|
+
var appShellTopbarStart = "uzi-app-shell-module__appShellTopbarStart__XXQpq";
|
|
9
|
+
var appShellTopbarRight = "uzi-app-shell-module__appShellTopbarRight__l1G57";
|
|
10
|
+
var appShellBrand = "uzi-app-shell-module__appShellBrand__TXwyN";
|
|
11
|
+
var appShellHamburger = "uzi-app-shell-module__appShellHamburger__BciFA";
|
|
12
|
+
var appShellSidebar = "uzi-app-shell-module__appShellSidebar__oY7uj";
|
|
13
|
+
var appShellMain = "uzi-app-shell-module__appShellMain__eHP2r";
|
|
14
|
+
var appShellBackdrop = "uzi-app-shell-module__appShellBackdrop__y31xs";
|
|
15
|
+
var appShellSidebarOpen = "uzi-app-shell-module__appShellSidebarOpen__Z5AIo";
|
|
16
|
+
var app_shell_module_default = {
|
|
17
|
+
appShell,
|
|
18
|
+
appShellAnimated,
|
|
19
|
+
appShellOpen,
|
|
20
|
+
appShellCollapsed,
|
|
21
|
+
appShellTopbar,
|
|
22
|
+
appShellTopbarLeft,
|
|
23
|
+
appShellTopbarStart,
|
|
24
|
+
appShellTopbarRight,
|
|
25
|
+
appShellBrand,
|
|
26
|
+
appShellHamburger,
|
|
27
|
+
appShellSidebar,
|
|
28
|
+
appShellMain,
|
|
29
|
+
appShellBackdrop,
|
|
30
|
+
appShellSidebarOpen
|
|
41
31
|
};
|
|
42
32
|
//#endregion
|
|
43
|
-
export {
|
|
33
|
+
export { appShell, appShellAnimated, appShellBackdrop, appShellBrand, appShellCollapsed, appShellHamburger, appShellMain, appShellOpen, appShellSidebar, appShellSidebarOpen, appShellTopbar, appShellTopbarLeft, appShellTopbarRight, appShellTopbarStart, app_shell_module_default as default };
|
|
44
34
|
|
|
45
35
|
//# sourceMappingURL=index39.js.map
|
package/dist/index39.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index39.js","names":[],"sources":["../src/components/
|
|
1
|
+
{"version":3,"file":"index39.js","names":[],"sources":["../src/components/app-shell/app-shell.module.css"],"sourcesContent":[".appShell {\n display: grid;\n grid-template-rows: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top)) 1fr;\n grid-template-columns: var(--app-shell-sidebar-width, 240px) 1fr;\n height: 100vh;\n height: 100dvh;\n}\n\n.appShellAnimated {\n transition: grid-template-columns 200ms ease;\n}\n\n.appShell.appShellOpen {\n grid-template-columns: var(--app-shell-sidebar-width, 240px) 1fr;\n}\n\n.appShell.appShellCollapsed {\n grid-template-columns: 0 1fr;\n}\n\n.appShellTopbar {\n --ts-topbar-bg: var(--surface-topbar, color-mix(in srgb, var(--background) 92%, transparent));\n --ts-topbar-border: var(--border);\n --ts-topbar-brand-fg: var(--foreground);\n grid-column: 1 / -1;\n min-height: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top));\n padding-left: 0;\n padding-right: 0;\n box-shadow: none;\n}\n\n.appShellTopbarLeft {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.appShellTopbarStart {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n}\n\n.appShellTopbarRight {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n flex-shrink: 0;\n}\n\n.appShellTopbarRight > * {\n min-width: 0;\n}\n\n.appShellBrand {\n font-size: 26px;\n color: var(--foreground);\n text-decoration: none;\n display: flex;\n align-items: center;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.appShellHamburger {\n background: transparent;\n border: none;\n padding: 0;\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--foreground);\n cursor: pointer;\n transition: background 120ms ease;\n}\n\n.appShellHamburger:hover {\n background: var(--accent);\n}\n\n.appShellHamburger:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.appShellHamburger svg {\n width: 28px;\n height: 28px;\n}\n\n.appShellSidebar {\n border-right: 1px solid var(--border);\n background: var(--panel);\n padding: 24px;\n overflow-y: auto;\n}\n\n.appShellAnimated .appShellSidebar {\n transition: transform 200ms ease, opacity 200ms ease;\n}\n\n.appShell.appShellCollapsed .appShellSidebar {\n transform: translateX(-110%);\n opacity: 0;\n pointer-events: none;\n}\n\n.appShellMain {\n overflow-y: auto;\n min-height: 0;\n flex: 1 1 0;\n}\n\n.appShellBackdrop {\n display: none;\n}\n\n@media (max-width: 960px) {\n .appShellBackdrop {\n display: block;\n position: fixed;\n inset: 0;\n top: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top));\n background: rgba(0, 0, 0, 0.5);\n z-index: 14;\n }\n\n .appShell {\n --app-shell-topbar-height: 56px;\n grid-template-columns: 1fr;\n grid-template-rows: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top)) 1fr;\n }\n\n .appShell.appShellOpen,\n .appShell.appShellCollapsed {\n grid-template-columns: 1fr;\n }\n\n .appShellSidebar {\n display: block;\n position: fixed;\n top: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top));\n left: 0;\n bottom: 0;\n width: var(--app-shell-sidebar-width, 240px);\n max-width: 80vw;\n background: var(--panel);\n padding: 16px 12px;\n transform: translateX(-105%);\n z-index: 15;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.35);\n }\n\n .appShellSidebar.appShellSidebarOpen {\n transform: translateX(0);\n }\n\n .appShellTopbar {\n padding-left: max(12px, env(safe-area-inset-left));\n padding-right: max(12px, env(safe-area-inset-right));\n gap: 10px;\n }\n\n .appShellTopbarLeft {\n gap: 10px;\n flex: 1;\n }\n\n .appShellTopbarStart {\n min-width: 0;\n }\n\n .appShellTopbarRight {\n gap: 6px;\n }\n\n .appShellBrand {\n font-size: 24px;\n max-width: 50vw;\n }\n\n .appShellHamburger {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n }\n\n .appShellHamburger svg {\n width: 24px;\n height: 24px;\n }\n}\n\n@media (max-width: 640px) {\n .appShellTopbar {\n gap: 8px;\n }\n\n .appShellBrand {\n font-size: 22px;\n max-width: 34vw;\n }\n\n .appShellTopbarRight {\n max-width: 44vw;\n }\n}\n\n@media (max-width: 480px) {\n .appShellBrand {\n font-size: 20px;\n max-width: 30vw;\n }\n}\n"],"mappings":""}
|
package/dist/index40.cjs
CHANGED
|
@@ -1,64 +1,49 @@
|
|
|
1
|
-
//#region src/components/
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
itemWithoutIcon,
|
|
32
|
-
itemActive,
|
|
33
|
-
itemCollapsed,
|
|
34
|
-
itemDisabled,
|
|
35
|
-
icon,
|
|
36
|
-
itemBody,
|
|
37
|
-
labelRow,
|
|
38
|
-
label,
|
|
39
|
-
description,
|
|
40
|
-
badge
|
|
1
|
+
//#region src/components/app-shell/app-shell.module.css
|
|
2
|
+
var appShell = "uzi-app-shell-module__appShell__S0cVI";
|
|
3
|
+
var appShellAnimated = "uzi-app-shell-module__appShellAnimated__-CRIl";
|
|
4
|
+
var appShellOpen = "uzi-app-shell-module__appShellOpen__1rZUl";
|
|
5
|
+
var appShellCollapsed = "uzi-app-shell-module__appShellCollapsed__fSasN";
|
|
6
|
+
var appShellTopbar = "uzi-app-shell-module__appShellTopbar__rgXsW";
|
|
7
|
+
var appShellTopbarLeft = "uzi-app-shell-module__appShellTopbarLeft__-EVuB";
|
|
8
|
+
var appShellTopbarStart = "uzi-app-shell-module__appShellTopbarStart__XXQpq";
|
|
9
|
+
var appShellTopbarRight = "uzi-app-shell-module__appShellTopbarRight__l1G57";
|
|
10
|
+
var appShellBrand = "uzi-app-shell-module__appShellBrand__TXwyN";
|
|
11
|
+
var appShellHamburger = "uzi-app-shell-module__appShellHamburger__BciFA";
|
|
12
|
+
var appShellSidebar = "uzi-app-shell-module__appShellSidebar__oY7uj";
|
|
13
|
+
var appShellMain = "uzi-app-shell-module__appShellMain__eHP2r";
|
|
14
|
+
var appShellBackdrop = "uzi-app-shell-module__appShellBackdrop__y31xs";
|
|
15
|
+
var appShellSidebarOpen = "uzi-app-shell-module__appShellSidebarOpen__Z5AIo";
|
|
16
|
+
var app_shell_module_default = {
|
|
17
|
+
appShell,
|
|
18
|
+
appShellAnimated,
|
|
19
|
+
appShellOpen,
|
|
20
|
+
appShellCollapsed,
|
|
21
|
+
appShellTopbar,
|
|
22
|
+
appShellTopbarLeft,
|
|
23
|
+
appShellTopbarStart,
|
|
24
|
+
appShellTopbarRight,
|
|
25
|
+
appShellBrand,
|
|
26
|
+
appShellHamburger,
|
|
27
|
+
appShellSidebar,
|
|
28
|
+
appShellMain,
|
|
29
|
+
appShellBackdrop,
|
|
30
|
+
appShellSidebarOpen
|
|
41
31
|
};
|
|
42
32
|
//#endregion
|
|
43
|
-
exports.
|
|
44
|
-
exports.
|
|
45
|
-
exports.
|
|
46
|
-
exports.
|
|
47
|
-
exports.
|
|
48
|
-
exports.
|
|
49
|
-
exports.
|
|
50
|
-
exports.
|
|
51
|
-
exports.
|
|
52
|
-
exports.
|
|
53
|
-
exports.
|
|
54
|
-
exports.
|
|
55
|
-
exports.
|
|
56
|
-
exports.
|
|
57
|
-
exports.
|
|
58
|
-
exports.sectionItems = sectionItems;
|
|
59
|
-
exports.sectionLabel = sectionLabel;
|
|
60
|
-
exports.sections = sections;
|
|
61
|
-
exports.sidebarNav = sidebarNav;
|
|
62
|
-
exports.sidebarNavCollapsed = sidebarNavCollapsed;
|
|
33
|
+
exports.appShell = appShell;
|
|
34
|
+
exports.appShellAnimated = appShellAnimated;
|
|
35
|
+
exports.appShellBackdrop = appShellBackdrop;
|
|
36
|
+
exports.appShellBrand = appShellBrand;
|
|
37
|
+
exports.appShellCollapsed = appShellCollapsed;
|
|
38
|
+
exports.appShellHamburger = appShellHamburger;
|
|
39
|
+
exports.appShellMain = appShellMain;
|
|
40
|
+
exports.appShellOpen = appShellOpen;
|
|
41
|
+
exports.appShellSidebar = appShellSidebar;
|
|
42
|
+
exports.appShellSidebarOpen = appShellSidebarOpen;
|
|
43
|
+
exports.appShellTopbar = appShellTopbar;
|
|
44
|
+
exports.appShellTopbarLeft = appShellTopbarLeft;
|
|
45
|
+
exports.appShellTopbarRight = appShellTopbarRight;
|
|
46
|
+
exports.appShellTopbarStart = appShellTopbarStart;
|
|
47
|
+
exports.default = app_shell_module_default;
|
|
63
48
|
|
|
64
49
|
//# sourceMappingURL=index40.cjs.map
|
package/dist/index40.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index40.cjs","names":[],"sources":["../src/components/
|
|
1
|
+
{"version":3,"file":"index40.cjs","names":[],"sources":["../src/components/app-shell/app-shell.module.css"],"sourcesContent":[".appShell {\n display: grid;\n grid-template-rows: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top)) 1fr;\n grid-template-columns: var(--app-shell-sidebar-width, 240px) 1fr;\n height: 100vh;\n height: 100dvh;\n}\n\n.appShellAnimated {\n transition: grid-template-columns 200ms ease;\n}\n\n.appShell.appShellOpen {\n grid-template-columns: var(--app-shell-sidebar-width, 240px) 1fr;\n}\n\n.appShell.appShellCollapsed {\n grid-template-columns: 0 1fr;\n}\n\n.appShellTopbar {\n --ts-topbar-bg: var(--surface-topbar, color-mix(in srgb, var(--background) 92%, transparent));\n --ts-topbar-border: var(--border);\n --ts-topbar-brand-fg: var(--foreground);\n grid-column: 1 / -1;\n min-height: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top));\n padding-left: 0;\n padding-right: 0;\n box-shadow: none;\n}\n\n.appShellTopbarLeft {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.appShellTopbarStart {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n}\n\n.appShellTopbarRight {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n flex-shrink: 0;\n}\n\n.appShellTopbarRight > * {\n min-width: 0;\n}\n\n.appShellBrand {\n font-size: 26px;\n color: var(--foreground);\n text-decoration: none;\n display: flex;\n align-items: center;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.appShellHamburger {\n background: transparent;\n border: none;\n padding: 0;\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--foreground);\n cursor: pointer;\n transition: background 120ms ease;\n}\n\n.appShellHamburger:hover {\n background: var(--accent);\n}\n\n.appShellHamburger:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.appShellHamburger svg {\n width: 28px;\n height: 28px;\n}\n\n.appShellSidebar {\n border-right: 1px solid var(--border);\n background: var(--panel);\n padding: 24px;\n overflow-y: auto;\n}\n\n.appShellAnimated .appShellSidebar {\n transition: transform 200ms ease, opacity 200ms ease;\n}\n\n.appShell.appShellCollapsed .appShellSidebar {\n transform: translateX(-110%);\n opacity: 0;\n pointer-events: none;\n}\n\n.appShellMain {\n overflow-y: auto;\n min-height: 0;\n flex: 1 1 0;\n}\n\n.appShellBackdrop {\n display: none;\n}\n\n@media (max-width: 960px) {\n .appShellBackdrop {\n display: block;\n position: fixed;\n inset: 0;\n top: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top));\n background: rgba(0, 0, 0, 0.5);\n z-index: 14;\n }\n\n .appShell {\n --app-shell-topbar-height: 56px;\n grid-template-columns: 1fr;\n grid-template-rows: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top)) 1fr;\n }\n\n .appShell.appShellOpen,\n .appShell.appShellCollapsed {\n grid-template-columns: 1fr;\n }\n\n .appShellSidebar {\n display: block;\n position: fixed;\n top: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top));\n left: 0;\n bottom: 0;\n width: var(--app-shell-sidebar-width, 240px);\n max-width: 80vw;\n background: var(--panel);\n padding: 16px 12px;\n transform: translateX(-105%);\n z-index: 15;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.35);\n }\n\n .appShellSidebar.appShellSidebarOpen {\n transform: translateX(0);\n }\n\n .appShellTopbar {\n padding-left: max(12px, env(safe-area-inset-left));\n padding-right: max(12px, env(safe-area-inset-right));\n gap: 10px;\n }\n\n .appShellTopbarLeft {\n gap: 10px;\n flex: 1;\n }\n\n .appShellTopbarStart {\n min-width: 0;\n }\n\n .appShellTopbarRight {\n gap: 6px;\n }\n\n .appShellBrand {\n font-size: 24px;\n max-width: 50vw;\n }\n\n .appShellHamburger {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n }\n\n .appShellHamburger svg {\n width: 24px;\n height: 24px;\n }\n}\n\n@media (max-width: 640px) {\n .appShellTopbar {\n gap: 8px;\n }\n\n .appShellBrand {\n font-size: 22px;\n max-width: 34vw;\n }\n\n .appShellTopbarRight {\n max-width: 44vw;\n }\n}\n\n@media (max-width: 480px) {\n .appShellBrand {\n font-size: 20px;\n max-width: 30vw;\n }\n}\n"],"mappings":""}
|
package/dist/index40.js
CHANGED
|
@@ -1,174 +1,150 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cx } from "./index3.js";
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
function SidebarNav({ items = [], sections, currentPath, getIsActive, matchStrategy = "prefix", onItemClick, header, footer, ariaLabel = "Sidebar navigation", collapsed = false, iconSize, className, itemClassName, sectionClassName }) {
|
|
52
|
-
const resolvedSections = useMemo(() => {
|
|
53
|
-
return sections?.length ? sections : [{
|
|
54
|
-
id: "default",
|
|
55
|
-
items
|
|
56
|
-
}];
|
|
57
|
-
}, [sections, items]);
|
|
58
|
-
const allItems = useMemo(() => resolvedSections.flatMap((section) => section.items), [resolvedSections]);
|
|
59
|
-
const defaultIsActiveFn = useMemo(() => {
|
|
60
|
-
if (matchStrategy === "most-specific") {
|
|
61
|
-
const mostSpecificHrefs = findMostSpecific(allItems, currentPath);
|
|
62
|
-
return (item) => {
|
|
63
|
-
if (item.active !== void 0) return item.active;
|
|
64
|
-
if (!item.href) return false;
|
|
65
|
-
return mostSpecificHrefs.has(item.href);
|
|
66
|
-
};
|
|
67
|
-
} else return (item, path) => {
|
|
68
|
-
if (item.active !== void 0) return item.active;
|
|
69
|
-
if (item.exact) return isActiveExact(item, path);
|
|
70
|
-
return isActivePrefix(item, path);
|
|
3
|
+
import { TopBar } from "./index38.js";
|
|
4
|
+
import app_shell_module_default from "./index39.js";
|
|
5
|
+
import { useEffect, useId, useRef, useState } from "react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
//#region src/components/app-shell/AppShell.tsx
|
|
8
|
+
var DESKTOP_BREAKPOINT = 960;
|
|
9
|
+
function getIsDesktop() {
|
|
10
|
+
if (typeof window === "undefined") return false;
|
|
11
|
+
return window.innerWidth >= DESKTOP_BREAKPOINT;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Responsive application shell with a collapsible sidebar and sticky top bar.
|
|
15
|
+
*
|
|
16
|
+
* - Sidebar opens by default on desktop, collapses on mobile.
|
|
17
|
+
* - Closes on outside click/scroll/touch when in mobile mode.
|
|
18
|
+
* - Provides optional hook to close the sidebar when a prop value changes
|
|
19
|
+
* (e.g., route transitions).
|
|
20
|
+
*/
|
|
21
|
+
function AppShell({ children, sidebar, brand, brandHref, topbarStart, topbarEnd, showThemeToggle = false, themeToggleProps, topBarBrandingLocation = "left", className, sidebarClassName, topbarClassName, mainClassName, sidebarWidth, closeSidebarOnChangeKey, hamburgerLabel = "Toggle navigation", onSidebarToggle }) {
|
|
22
|
+
const [isDesktop, setIsDesktop] = useState(false);
|
|
23
|
+
const [sidebarOpen, setSidebarOpen] = useState(false);
|
|
24
|
+
const [transitionsReady, setTransitionsReady] = useState(false);
|
|
25
|
+
const prevIsDesktopRef = useRef(false);
|
|
26
|
+
const closeKeyRef = useRef(closeSidebarOnChangeKey);
|
|
27
|
+
const sidebarRef = useRef(null);
|
|
28
|
+
const hamburgerRef = useRef(null);
|
|
29
|
+
const mainRef = useRef(null);
|
|
30
|
+
const sidebarId = useId();
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const desktop = getIsDesktop();
|
|
33
|
+
setIsDesktop(desktop);
|
|
34
|
+
setSidebarOpen(desktop);
|
|
35
|
+
prevIsDesktopRef.current = desktop;
|
|
36
|
+
const transitionFrame = window.requestAnimationFrame(() => {
|
|
37
|
+
setTransitionsReady(true);
|
|
38
|
+
});
|
|
39
|
+
const handleResize = () => {
|
|
40
|
+
const nowDesktop = getIsDesktop();
|
|
41
|
+
setIsDesktop(nowDesktop);
|
|
42
|
+
if (nowDesktop !== prevIsDesktopRef.current) {
|
|
43
|
+
setSidebarOpen(nowDesktop);
|
|
44
|
+
prevIsDesktopRef.current = nowDesktop;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
window.addEventListener("resize", handleResize);
|
|
48
|
+
return () => {
|
|
49
|
+
window.cancelAnimationFrame(transitionFrame);
|
|
50
|
+
window.removeEventListener("resize", handleResize);
|
|
71
51
|
};
|
|
72
|
-
}, [
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
52
|
+
}, []);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (isDesktop || !sidebarOpen) return;
|
|
55
|
+
const mainElement = mainRef.current;
|
|
56
|
+
const closeSidebar = () => setSidebarOpen(false);
|
|
57
|
+
const onPointerDown = (e) => {
|
|
58
|
+
const target = e.target;
|
|
59
|
+
if (!target) return;
|
|
60
|
+
if (sidebarRef.current?.contains(target)) return;
|
|
61
|
+
if (hamburgerRef.current?.contains(target)) return;
|
|
62
|
+
closeSidebar();
|
|
63
|
+
};
|
|
64
|
+
const timeoutId = window.setTimeout(() => {
|
|
65
|
+
document.addEventListener("pointerdown", onPointerDown);
|
|
66
|
+
window.addEventListener("scroll", closeSidebar, { passive: true });
|
|
67
|
+
mainElement?.addEventListener("scroll", closeSidebar, { passive: true });
|
|
68
|
+
document.addEventListener("touchmove", closeSidebar, { passive: true });
|
|
69
|
+
}, 10);
|
|
70
|
+
return () => {
|
|
71
|
+
window.clearTimeout(timeoutId);
|
|
72
|
+
document.removeEventListener("pointerdown", onPointerDown);
|
|
73
|
+
window.removeEventListener("scroll", closeSidebar);
|
|
74
|
+
mainElement?.removeEventListener("scroll", closeSidebar);
|
|
75
|
+
document.removeEventListener("touchmove", closeSidebar);
|
|
76
|
+
};
|
|
77
|
+
}, [sidebarOpen, isDesktop]);
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
if (!isDesktop && closeKeyRef.current !== closeSidebarOnChangeKey) setSidebarOpen(false);
|
|
80
|
+
closeKeyRef.current = closeSidebarOnChangeKey;
|
|
81
|
+
}, [closeSidebarOnChangeKey, isDesktop]);
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
onSidebarToggle?.(sidebarOpen);
|
|
84
|
+
}, [sidebarOpen, onSidebarToggle]);
|
|
85
|
+
const toggleSidebar = () => setSidebarOpen((open) => !open);
|
|
86
|
+
const sidebarWidthValue = sidebarWidth === void 0 ? void 0 : typeof sidebarWidth === "number" ? `${sidebarWidth}px` : sidebarWidth;
|
|
87
|
+
const shellStyle = sidebarWidthValue ? { ["--app-shell-sidebar-width"]: sidebarWidthValue } : void 0;
|
|
88
|
+
const shellClasses = cx(app_shell_module_default.appShell, transitionsReady && app_shell_module_default.appShellAnimated, sidebarOpen ? app_shell_module_default.appShellOpen : app_shell_module_default.appShellCollapsed, className);
|
|
89
|
+
const sidebarClasses = cx(app_shell_module_default.appShellSidebar, sidebarOpen && app_shell_module_default.appShellSidebarOpen, sidebarClassName);
|
|
90
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
91
|
+
className: shellClasses,
|
|
92
|
+
style: shellStyle,
|
|
93
|
+
"data-app-shell": true,
|
|
94
|
+
"data-desktop": isDesktop ? "true" : "false",
|
|
95
|
+
"data-sidebar-open": sidebarOpen ? "true" : "false",
|
|
83
96
|
children: [
|
|
84
|
-
|
|
85
|
-
className:
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
children:
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
97
|
+
/* @__PURE__ */ jsx(TopBar, {
|
|
98
|
+
className: cx(app_shell_module_default.appShellTopbar, topbarClassName),
|
|
99
|
+
leading: /* @__PURE__ */ jsx("button", {
|
|
100
|
+
ref: hamburgerRef,
|
|
101
|
+
type: "button",
|
|
102
|
+
className: app_shell_module_default.appShellHamburger,
|
|
103
|
+
onClick: toggleSidebar,
|
|
104
|
+
"aria-label": hamburgerLabel,
|
|
105
|
+
"aria-expanded": sidebarOpen,
|
|
106
|
+
"aria-controls": sidebarId,
|
|
107
|
+
children: /* @__PURE__ */ jsx("svg", {
|
|
108
|
+
viewBox: "0 0 24 24",
|
|
109
|
+
"aria-hidden": "true",
|
|
110
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
111
|
+
d: "M3 6h18M3 12h18M3 18h18",
|
|
112
|
+
stroke: "currentColor",
|
|
113
|
+
strokeWidth: "2.5",
|
|
114
|
+
strokeLinecap: "round"
|
|
115
|
+
})
|
|
116
|
+
})
|
|
117
|
+
}),
|
|
118
|
+
brand,
|
|
119
|
+
brandHref,
|
|
120
|
+
brandingLocation: topBarBrandingLocation,
|
|
121
|
+
start: topbarStart,
|
|
122
|
+
actions: topbarEnd,
|
|
123
|
+
showThemeToggle,
|
|
124
|
+
themeToggleProps
|
|
125
|
+
}),
|
|
126
|
+
!isDesktop && sidebarOpen && /* @__PURE__ */ jsx("div", {
|
|
127
|
+
className: app_shell_module_default.appShellBackdrop,
|
|
128
|
+
onClick: () => setSidebarOpen(false),
|
|
129
|
+
onTouchStart: () => setSidebarOpen(false),
|
|
130
|
+
"aria-hidden": "true"
|
|
106
131
|
}),
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
132
|
+
/* @__PURE__ */ jsx("aside", {
|
|
133
|
+
ref: sidebarRef,
|
|
134
|
+
id: sidebarId,
|
|
135
|
+
className: sidebarClasses,
|
|
136
|
+
"aria-label": "Sidebar navigation",
|
|
137
|
+
children: sidebar
|
|
138
|
+
}),
|
|
139
|
+
/* @__PURE__ */ jsx("main", {
|
|
140
|
+
ref: mainRef,
|
|
141
|
+
className: cx(app_shell_module_default.appShellMain, mainClassName),
|
|
142
|
+
children
|
|
143
|
+
})
|
|
111
144
|
]
|
|
112
145
|
});
|
|
113
146
|
}
|
|
114
|
-
function SidebarNavEntry({ item, active, collapsed, itemClassName, onItemClick }) {
|
|
115
|
-
const rel = item.rel ?? (item.target === "_blank" ? "noreferrer" : void 0);
|
|
116
|
-
const title = item.title ?? (typeof item.label === "string" ? item.label : void 0);
|
|
117
|
-
const hasIcon = Boolean(item.icon);
|
|
118
|
-
const classes = cx(sidebar_nav_module_default.item, !hasIcon && sidebar_nav_module_default.itemWithoutIcon, active && sidebar_nav_module_default.itemActive, collapsed && sidebar_nav_module_default.itemCollapsed, item.disabled && sidebar_nav_module_default.itemDisabled, itemClassName);
|
|
119
|
-
const content = /* @__PURE__ */ jsxs(Fragment, { children: [hasIcon ? /* @__PURE__ */ jsx("span", {
|
|
120
|
-
className: sidebar_nav_module_default.icon,
|
|
121
|
-
children: item.icon
|
|
122
|
-
}) : null, !collapsed ? /* @__PURE__ */ jsxs("span", {
|
|
123
|
-
className: sidebar_nav_module_default.itemBody,
|
|
124
|
-
children: [/* @__PURE__ */ jsxs("span", {
|
|
125
|
-
className: sidebar_nav_module_default.labelRow,
|
|
126
|
-
children: [/* @__PURE__ */ jsx("span", {
|
|
127
|
-
className: sidebar_nav_module_default.label,
|
|
128
|
-
children: item.label
|
|
129
|
-
}), item.badge && /* @__PURE__ */ jsx("span", {
|
|
130
|
-
className: sidebar_nav_module_default.badge,
|
|
131
|
-
children: item.badge
|
|
132
|
-
})]
|
|
133
|
-
}), item.description ? /* @__PURE__ */ jsx("span", {
|
|
134
|
-
className: sidebar_nav_module_default.description,
|
|
135
|
-
children: item.description
|
|
136
|
-
}) : null]
|
|
137
|
-
}) : null] });
|
|
138
|
-
const handleClick = () => {
|
|
139
|
-
if (item.disabled) return;
|
|
140
|
-
item.onClick?.();
|
|
141
|
-
onItemClick?.(item);
|
|
142
|
-
};
|
|
143
|
-
if (!item.href) return /* @__PURE__ */ jsx("button", {
|
|
144
|
-
type: "button",
|
|
145
|
-
className: classes,
|
|
146
|
-
"aria-current": active ? "page" : void 0,
|
|
147
|
-
"aria-disabled": item.disabled ? "true" : void 0,
|
|
148
|
-
disabled: item.disabled,
|
|
149
|
-
title: collapsed ? title : void 0,
|
|
150
|
-
onClick: handleClick,
|
|
151
|
-
children: content
|
|
152
|
-
});
|
|
153
|
-
if (item.disabled) return /* @__PURE__ */ jsx("div", {
|
|
154
|
-
className: classes,
|
|
155
|
-
"aria-current": active ? "page" : void 0,
|
|
156
|
-
"aria-disabled": "true",
|
|
157
|
-
title: collapsed ? title : void 0,
|
|
158
|
-
children: content
|
|
159
|
-
});
|
|
160
|
-
return /* @__PURE__ */ jsx("a", {
|
|
161
|
-
className: classes,
|
|
162
|
-
href: item.href,
|
|
163
|
-
target: item.target,
|
|
164
|
-
rel,
|
|
165
|
-
"aria-current": active ? "page" : void 0,
|
|
166
|
-
title: collapsed ? title : void 0,
|
|
167
|
-
onClick: handleClick,
|
|
168
|
-
children: content
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
147
|
//#endregion
|
|
172
|
-
export {
|
|
148
|
+
export { AppShell };
|
|
173
149
|
|
|
174
150
|
//# sourceMappingURL=index40.js.map
|