@omnitron-dev/prism 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -2
- package/THIRD-PARTY-NOTICES.txt +26 -0
- package/dist/accessibility/index.js +2 -0
- package/dist/accessibility/index.js.map +1 -1
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/blocks/auth-block/guards.d.ts +3 -2
- package/dist/blocks/auth-block/guards.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/dashboard-block.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/types.d.ts +4 -2
- package/dist/blocks/dashboard-block/types.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/use-dashboard-block.d.ts +2 -2
- package/dist/blocks/dashboard-block/use-dashboard-block.d.ts.map +1 -1
- package/dist/blocks/data-grid-block/data-grid-block.d.ts.map +1 -1
- package/dist/blocks/data-grid-block/types.d.ts +3 -0
- package/dist/blocks/data-grid-block/types.d.ts.map +1 -1
- package/dist/blocks/index.js +80 -255
- package/dist/blocks/index.js.map +1 -1
- package/dist/chunk-2AB7VGPW.js +447 -0
- package/dist/chunk-2AB7VGPW.js.map +1 -0
- package/dist/{chunk-LOY2NPCO.js → chunk-2E67PQ4T.js} +3 -3
- package/dist/{chunk-LOY2NPCO.js.map → chunk-2E67PQ4T.js.map} +1 -1
- package/dist/chunk-2KG2NI73.js +84 -0
- package/dist/chunk-2KG2NI73.js.map +1 -0
- package/dist/chunk-2UYRW6X3.js +44 -0
- package/dist/chunk-2UYRW6X3.js.map +1 -0
- package/dist/chunk-36C5H56C.js +208 -0
- package/dist/chunk-36C5H56C.js.map +1 -0
- package/dist/chunk-36FOXX25.js +73 -0
- package/dist/chunk-36FOXX25.js.map +1 -0
- package/dist/{chunk-52PQL67Q.js → chunk-3VSM7NZG.js} +18 -15
- package/dist/chunk-3VSM7NZG.js.map +1 -0
- package/dist/{chunk-GUGTDURV.js → chunk-4B2LTPK2.js} +2 -2
- package/dist/{chunk-GUGTDURV.js.map → chunk-4B2LTPK2.js.map} +1 -1
- package/dist/chunk-4HUGZJKU.js +108 -0
- package/dist/chunk-4HUGZJKU.js.map +1 -0
- package/dist/{chunk-PXXPLHIY.js → chunk-4Q5L7LDG.js} +3 -3
- package/dist/{chunk-PXXPLHIY.js.map → chunk-4Q5L7LDG.js.map} +1 -1
- package/dist/{chunk-BRDWQVRT.js → chunk-4R7EZ7GQ.js} +3 -2
- package/dist/chunk-4R7EZ7GQ.js.map +1 -0
- package/dist/chunk-6IANOSMD.js +185 -0
- package/dist/chunk-6IANOSMD.js.map +1 -0
- package/dist/{chunk-YHE7HXSG.js → chunk-7ATBURW2.js} +3 -3
- package/dist/{chunk-YHE7HXSG.js.map → chunk-7ATBURW2.js.map} +1 -1
- package/dist/{chunk-7G5D5PTC.js → chunk-AATAOOSF.js} +4 -4
- package/dist/{chunk-7G5D5PTC.js.map → chunk-AATAOOSF.js.map} +1 -1
- package/dist/chunk-AKLRKCYH.js +128 -0
- package/dist/chunk-AKLRKCYH.js.map +1 -0
- package/dist/chunk-CT46KJOR.js +133 -0
- package/dist/chunk-CT46KJOR.js.map +1 -0
- package/dist/{chunk-LSPFFEJT.js → chunk-D4GFAJAZ.js} +298 -3900
- package/dist/chunk-D4GFAJAZ.js.map +1 -0
- package/dist/{chunk-BJE2AKD4.js → chunk-D5J3KW6Q.js} +3 -2
- package/dist/chunk-D5J3KW6Q.js.map +1 -0
- package/dist/chunk-DEPJRTVT.js +3 -0
- package/dist/{chunk-FU52GL2E.js.map → chunk-DEPJRTVT.js.map} +1 -1
- package/dist/{chunk-472SOF76.js → chunk-DHTYHUYI.js} +85 -107
- package/dist/chunk-DHTYHUYI.js.map +1 -0
- package/dist/{chunk-FF5RF32O.js → chunk-E7WM2RXA.js} +3 -2
- package/dist/chunk-E7WM2RXA.js.map +1 -0
- package/dist/chunk-F6RZ7LW6.js +1271 -0
- package/dist/chunk-F6RZ7LW6.js.map +1 -0
- package/dist/chunk-FOGY3HA4.js +217 -0
- package/dist/chunk-FOGY3HA4.js.map +1 -0
- package/dist/chunk-G2GANYMW.js +139 -0
- package/dist/chunk-G2GANYMW.js.map +1 -0
- package/dist/chunk-I6DILPFE.js +293 -0
- package/dist/chunk-I6DILPFE.js.map +1 -0
- package/dist/{chunk-HOXFSQUV.js → chunk-IRYU3NTG.js} +2 -2
- package/dist/{chunk-HOXFSQUV.js.map → chunk-IRYU3NTG.js.map} +1 -1
- package/dist/chunk-JTIUGPW5.js +284 -0
- package/dist/chunk-JTIUGPW5.js.map +1 -0
- package/dist/{chunk-GUFHFEPZ.js → chunk-JZBSPDED.js} +2 -2
- package/dist/{chunk-GUFHFEPZ.js.map → chunk-JZBSPDED.js.map} +1 -1
- package/dist/{chunk-PFT2BNYO.js → chunk-KPY7TA4D.js} +5 -5
- package/dist/{chunk-PFT2BNYO.js.map → chunk-KPY7TA4D.js.map} +1 -1
- package/dist/{chunk-GMIE6III.js → chunk-LFWKGNCX.js} +50 -623
- package/dist/chunk-LFWKGNCX.js.map +1 -0
- package/dist/chunk-LH4ZZZYB.js +37 -0
- package/dist/chunk-LH4ZZZYB.js.map +1 -0
- package/dist/chunk-NFJ7CPG3.js +13 -0
- package/dist/chunk-NFJ7CPG3.js.map +1 -0
- package/dist/chunk-NFPOIHD4.js +3 -0
- package/dist/{chunk-JSQTYDPG.js.map → chunk-NFPOIHD4.js.map} +1 -1
- package/dist/{chunk-XIXSSI3B.js → chunk-NJM5AVBM.js} +3 -2
- package/dist/chunk-NJM5AVBM.js.map +1 -0
- package/dist/{chunk-4Z5DE5GK.js → chunk-NSNM53WI.js} +133 -115
- package/dist/chunk-NSNM53WI.js.map +1 -0
- package/dist/chunk-NTREGTG7.js +31 -0
- package/dist/chunk-NTREGTG7.js.map +1 -0
- package/dist/{chunk-ADG4HZEP.js → chunk-OKJA6SJM.js} +4 -4
- package/dist/chunk-OKJA6SJM.js.map +1 -0
- package/dist/{chunk-SU3LVQ7N.js → chunk-Q6JDNFSG.js} +11 -226
- package/dist/chunk-Q6JDNFSG.js.map +1 -0
- package/dist/chunk-RPOGINR5.js +115 -0
- package/dist/chunk-RPOGINR5.js.map +1 -0
- package/dist/{chunk-KQ67XB6T.js → chunk-RSWVYIXK.js} +151 -114
- package/dist/chunk-RSWVYIXK.js.map +1 -0
- package/dist/chunk-SSEHL5VP.js +110 -0
- package/dist/chunk-SSEHL5VP.js.map +1 -0
- package/dist/chunk-TEIGUOWN.js +523 -0
- package/dist/chunk-TEIGUOWN.js.map +1 -0
- package/dist/{chunk-AYYFMTMI.js → chunk-TJ7DHXUX.js} +2 -2
- package/dist/{chunk-AYYFMTMI.js.map → chunk-TJ7DHXUX.js.map} +1 -1
- package/dist/{chunk-75FQ5IW3.js → chunk-TZHWYT34.js} +3 -3
- package/dist/{chunk-75FQ5IW3.js.map → chunk-TZHWYT34.js.map} +1 -1
- package/dist/chunk-TZWHELY4.js +45 -0
- package/dist/chunk-TZWHELY4.js.map +1 -0
- package/dist/{chunk-OKTLA23Q.js → chunk-UEINJFLS.js} +6 -6
- package/dist/chunk-UEINJFLS.js.map +1 -0
- package/dist/chunk-URFQX3I6.js +129 -0
- package/dist/chunk-URFQX3I6.js.map +1 -0
- package/dist/chunk-VG6FOMOH.js +187 -0
- package/dist/chunk-VG6FOMOH.js.map +1 -0
- package/dist/{chunk-PGHEP4JD.js → chunk-VQVVHMPG.js} +3 -3
- package/dist/{chunk-PGHEP4JD.js.map → chunk-VQVVHMPG.js.map} +1 -1
- package/dist/{chunk-DRFNMZLG.js → chunk-VUKOT432.js} +3 -2
- package/dist/chunk-VUKOT432.js.map +1 -0
- package/dist/chunk-WD4N72DL.js +315 -0
- package/dist/chunk-WD4N72DL.js.map +1 -0
- package/dist/chunk-XBYMG4QK.js +119 -0
- package/dist/chunk-XBYMG4QK.js.map +1 -0
- package/dist/chunk-YHM6GIHV.js +3 -0
- package/dist/chunk-YHM6GIHV.js.map +1 -0
- package/dist/{chunk-SNZK5X6F.js → chunk-Z2AN43YU.js} +4 -2
- package/dist/chunk-Z2AN43YU.js.map +1 -0
- package/dist/chunk-ZNWHMQRM.js +171 -0
- package/dist/chunk-ZNWHMQRM.js.map +1 -0
- package/dist/{chunk-YSIG2XYH.js → chunk-ZRJYQN6Y.js} +2 -2
- package/dist/{chunk-YSIG2XYH.js.map → chunk-ZRJYQN6Y.js.map} +1 -1
- package/dist/{chunk-AD4W7HYC.js → chunk-ZYI3MHLE.js} +3 -2
- package/dist/chunk-ZYI3MHLE.js.map +1 -0
- package/dist/cli/index.js +59 -421
- package/dist/cli/index.js.map +1 -1
- package/dist/components/admin-filters/admin-data-table.d.ts +7 -1
- package/dist/components/admin-filters/admin-data-table.d.ts.map +1 -1
- package/dist/components/admin-filters/filter-toolbar.d.ts.map +1 -1
- package/dist/components/admin-filters/index.js +8 -0
- package/dist/components/admin-filters/index.js.map +1 -0
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/index.js +5 -0
- package/dist/components/alert/index.js.map +1 -0
- package/dist/components/animate/index.js +5 -0
- package/dist/components/animate/index.js.map +1 -0
- package/dist/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
- package/dist/components/breadcrumbs/index.js +4 -0
- package/dist/components/breadcrumbs/index.js.map +1 -0
- package/dist/components/card/index.js +4 -0
- package/dist/components/card/index.js.map +1 -0
- package/dist/components/chart/chart.d.ts.map +1 -1
- package/dist/components/chart/index.css +52 -0
- package/dist/components/chart/index.css.map +1 -0
- package/dist/components/chart/index.js +5 -0
- package/dist/components/chart/index.js.map +1 -0
- package/dist/components/chart/types.d.ts +3 -1
- package/dist/components/chart/types.d.ts.map +1 -1
- package/dist/components/chart/use-chart.d.ts.map +1 -1
- package/dist/components/command-palette/command-palette.d.ts +3 -1
- package/dist/components/command-palette/command-palette.d.ts.map +1 -1
- package/dist/components/command-palette/index.js +4 -0
- package/dist/components/command-palette/index.js.map +1 -0
- package/dist/components/confirm-dialog/index.js +4 -0
- package/dist/components/confirm-dialog/index.js.map +1 -0
- package/dist/components/date-input/date-input.d.ts +1 -0
- package/dist/components/date-input/date-input.d.ts.map +1 -1
- package/dist/components/date-input/index.d.ts +0 -1
- package/dist/components/date-input/index.d.ts.map +1 -1
- package/dist/components/doc-layout/index.js +5 -4
- package/dist/components/doc-layout/index.js.map +1 -1
- package/dist/components/editor/index.js +4 -3
- package/dist/components/editor/index.js.map +1 -1
- package/dist/components/emoji-picker/index.js +2 -1
- package/dist/components/emoji-picker/index.js.map +1 -1
- package/dist/components/empty-content/empty-content.d.ts.map +1 -1
- package/dist/components/empty-content/index.js +4 -0
- package/dist/components/empty-content/index.js.map +1 -0
- package/dist/components/error-boundary/index.js +6 -0
- package/dist/components/error-boundary/index.js.map +1 -0
- package/dist/components/index.css +13 -10
- package/dist/components/index.css.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +47 -21
- package/dist/components/index.js.map +1 -1
- package/dist/components/knowledge-graph/edge-labels.d.ts.map +1 -1
- package/dist/components/knowledge-graph/index.js +18 -16
- package/dist/components/knowledge-graph/index.js.map +1 -1
- package/dist/components/label/index.js +5 -0
- package/dist/components/label/index.js.map +1 -0
- package/dist/components/label/label.d.ts.map +1 -1
- package/dist/components/loading-screen/index.js +4 -0
- package/dist/components/loading-screen/index.js.map +1 -0
- package/dist/components/map/MapPointPicker.d.ts.map +1 -1
- package/dist/components/map/index.js +2 -1
- package/dist/components/map/index.js.map +1 -1
- package/dist/components/navigation-progress/index.js +4 -0
- package/dist/components/navigation-progress/index.js.map +1 -0
- package/dist/components/page-content/index.js +4 -0
- package/dist/components/page-content/index.js.map +1 -0
- package/dist/components/popover/index.js +4 -0
- package/dist/components/popover/index.js.map +1 -0
- package/dist/components/research/diagram.d.ts.map +1 -1
- package/dist/components/research/index.js +6 -4
- package/dist/components/research/index.js.map +1 -1
- package/dist/components/research-editor/extensions.d.ts +1 -1
- package/dist/components/research-editor/index.js +11 -10
- package/dist/components/research-editor/index.js.map +1 -1
- package/dist/components/research-editor/math-navigation.d.ts +2 -2
- package/dist/components/research-editor/math-navigation.d.ts.map +1 -1
- package/dist/components/scroll-to-top/index.js +4 -0
- package/dist/components/scroll-to-top/index.js.map +1 -0
- package/dist/components/search-input/index.js +7 -0
- package/dist/components/search-input/index.js.map +1 -0
- package/dist/components/search-input/search-input.d.ts +3 -1
- package/dist/components/search-input/search-input.d.ts.map +1 -1
- package/dist/components/skeleton/index.js +4 -0
- package/dist/components/skeleton/index.js.map +1 -0
- package/dist/components/snackbar/index.js +6 -0
- package/dist/components/snackbar/index.js.map +1 -0
- package/dist/components/stepper/index.js +4 -0
- package/dist/components/stepper/index.js.map +1 -0
- package/dist/components/table/index.d.ts +1 -0
- package/dist/components/table/index.d.ts.map +1 -1
- package/dist/components/table/index.js +5 -0
- package/dist/components/table/index.js.map +1 -0
- package/dist/components/table/table-viewport.d.ts +13 -0
- package/dist/components/table/table-viewport.d.ts.map +1 -0
- package/dist/components/table/table.d.ts +3 -1
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/tabs/index.js +6 -0
- package/dist/components/tabs/index.js.map +1 -0
- package/dist/components/tabs/tabs.d.ts +12 -1
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/core/index.js +12 -10
- package/dist/core/index.js.map +1 -1
- package/dist/forms/index.js +2 -0
- package/dist/forms/index.js.map +1 -1
- package/dist/hooks/index.js +14 -12
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-config-from-query.d.ts +2 -0
- package/dist/hooks/use-config-from-query.d.ts.map +1 -1
- package/dist/hooks/use-image-dimensions.d.ts.map +1 -1
- package/dist/hooks/use-keyboard-shortcut.d.ts.map +1 -1
- package/dist/hooks/use-scroll-position.d.ts.map +1 -1
- package/dist/hooks/use-window-size.d.ts.map +1 -1
- package/dist/icons/context.d.ts.map +1 -1
- package/dist/icons/index.js +3 -2
- package/dist/icons/index.js.map +1 -1
- package/dist/index.css +13 -10
- package/dist/index.css.map +1 -1
- package/dist/index.js +57 -31
- package/dist/index.js.map +1 -1
- package/dist/internal/research-parser.js +3 -0
- package/dist/internal/research-parser.js.map +1 -0
- package/dist/layouts/core/header-section.d.ts +1 -0
- package/dist/layouts/core/header-section.d.ts.map +1 -1
- package/dist/layouts/dashboard/layout.d.ts +3 -1
- package/dist/layouts/dashboard/layout.d.ts.map +1 -1
- package/dist/layouts/dashboard/sidenav.d.ts.map +1 -1
- package/dist/layouts/index.js +9 -8
- package/dist/layouts/index.js.map +1 -1
- package/dist/netron/index.js +2 -1
- package/dist/netron/index.js.map +1 -1
- package/dist/registry/index.js +1 -1
- package/dist/state/create-store.d.ts.map +1 -1
- package/dist/state/index.js +3 -2
- package/dist/state/index.js.map +1 -1
- package/dist/state/settings-version.d.ts.map +1 -1
- package/dist/theme/components/Chip.d.ts.map +1 -1
- package/dist/theme/components/Dialog.d.ts.map +1 -1
- package/dist/theme/components/TextField.d.ts.map +1 -1
- package/dist/theme/components/index.d.ts.map +1 -1
- package/dist/theme/components/theme-utils.d.ts +2 -2
- package/dist/theme/components/theme-utils.d.ts.map +1 -1
- package/dist/theme/index.js +8 -6
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/palette/overrides.d.ts +1 -0
- package/dist/theme/palette/overrides.d.ts.map +1 -1
- package/dist/theme/semantic-surface.d.ts +8 -0
- package/dist/theme/semantic-surface.d.ts.map +1 -0
- package/dist/types/index.js +2 -2
- package/dist/ui/index.js +6 -5
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/async-lock.d.ts.map +1 -1
- package/package.json +143 -37
- package/dist/chunk-472SOF76.js.map +0 -1
- package/dist/chunk-4Z5DE5GK.js.map +0 -1
- package/dist/chunk-52PQL67Q.js.map +0 -1
- package/dist/chunk-AD4W7HYC.js.map +0 -1
- package/dist/chunk-ADG4HZEP.js.map +0 -1
- package/dist/chunk-BJE2AKD4.js.map +0 -1
- package/dist/chunk-BRDWQVRT.js.map +0 -1
- package/dist/chunk-DRFNMZLG.js.map +0 -1
- package/dist/chunk-FF5RF32O.js.map +0 -1
- package/dist/chunk-FU52GL2E.js +0 -3
- package/dist/chunk-GMIE6III.js.map +0 -1
- package/dist/chunk-JSQTYDPG.js +0 -3
- package/dist/chunk-KQ67XB6T.js.map +0 -1
- package/dist/chunk-LSPFFEJT.js.map +0 -1
- package/dist/chunk-OKTLA23Q.js.map +0 -1
- package/dist/chunk-SNZK5X6F.js.map +0 -1
- package/dist/chunk-SU3LVQ7N.js.map +0 -1
- package/dist/chunk-XIXSSI3B.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/blocks/auth-block/guards.tsx"],"names":[],"mappings":"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","file":"chunk-4HUGZJKU.js","sourcesContent":["'use client';\n\n/**\n * Route Guards\n *\n * Authentication and authorization guards for route protection.\n * Works with any router (React Router, Next.js, TanStack Router).\n *\n * @module blocks/auth-block\n */\n\nimport { type ReactNode, useEffect, useState } from 'react';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * User role type - string or enum value.\n */\nexport type Role = string;\n\n/**\n * Permission type - string identifier.\n */\nexport type Permission = string;\n\n/**\n * User with roles and permissions for authorization.\n */\nexport interface AuthUser {\n /** User ID */\n id: string | number;\n /** User roles */\n roles?: Role[];\n /** User permissions (fine-grained) */\n permissions?: Permission[];\n /** Email verified status */\n emailVerified?: boolean;\n /** Any additional properties */\n [key: string]: unknown;\n}\n\n/**\n * Auth state for guards.\n */\nexport interface AuthState {\n /** Whether user is authenticated */\n isAuthenticated: boolean;\n /** Whether auth state is still loading */\n isLoading: boolean;\n /** Current user (if authenticated) */\n user?: AuthUser | null;\n}\n\n/**\n * Props for useAuth hook.\n * Guards need this to check auth state.\n */\nexport interface UseAuth {\n (): AuthState;\n}\n\n// =============================================================================\n// AUTH GUARD\n// =============================================================================\n\n/**\n * AuthGuard props.\n */\nexport interface AuthGuardProps {\n /** Children to render when authorized */\n children: ReactNode;\n /** Hook to get auth state */\n useAuth: UseAuth;\n /** Component to show while loading */\n loadingComponent?: ReactNode;\n /** Called when not authenticated (e.g., redirect to login) */\n onUnauthenticated?: () => void;\n /** Component to show when not authenticated (if no redirect) */\n unauthenticatedComponent?: ReactNode;\n}\n\n/**\n * Guard that requires authentication.\n *\n * @example\n * ```tsx\n * import { AuthGuard } from '@omnitron-dev/prism/blocks';\n * import { useAuth } from '../hooks/use-auth';\n *\n * function ProtectedPage() {\n * return (\n * <AuthGuard\n * useAuth={useAuth}\n * onUnauthenticated={() => navigate('/login')}\n * loadingComponent={<LoadingScreen />}\n * >\n * <DashboardContent />\n * </AuthGuard>\n * );\n * }\n * ```\n */\nexport function AuthGuard({\n children,\n useAuth,\n loadingComponent = null,\n onUnauthenticated,\n unauthenticatedComponent = null,\n}: AuthGuardProps): ReactNode {\n const { isAuthenticated, isLoading } = useAuth();\n const [checked, setChecked] = useState(false);\n\n useEffect(() => {\n if (!isLoading) {\n if (!isAuthenticated) {\n onUnauthenticated?.();\n }\n setChecked(true);\n }\n }, [isAuthenticated, isLoading, onUnauthenticated]);\n\n if (isLoading || !checked) {\n return loadingComponent;\n }\n\n if (!isAuthenticated) {\n return unauthenticatedComponent;\n }\n\n return children;\n}\n\n// =============================================================================\n// GUEST GUARD\n// =============================================================================\n\n/**\n * GuestGuard props.\n */\nexport interface GuestGuardProps {\n /** Children to render when not authenticated */\n children: ReactNode;\n /** Hook to get auth state */\n useAuth: UseAuth;\n /** Component to show while loading */\n loadingComponent?: ReactNode;\n /** Called when authenticated (e.g., redirect to dashboard) */\n onAuthenticated?: () => void;\n /** Component to show when authenticated (if no redirect) */\n authenticatedComponent?: ReactNode;\n}\n\n/**\n * Guard that requires NO authentication.\n * Use for login, register, forgot password pages.\n *\n * @example\n * ```tsx\n * import { GuestGuard } from '@omnitron-dev/prism/blocks';\n * import { useAuth } from '../hooks/use-auth';\n *\n * function LoginPage() {\n * return (\n * <GuestGuard\n * useAuth={useAuth}\n * onAuthenticated={() => navigate('/dashboard')}\n * loadingComponent={<LoadingScreen />}\n * >\n * <LoginForm />\n * </GuestGuard>\n * );\n * }\n * ```\n */\nexport function GuestGuard({\n children,\n useAuth,\n loadingComponent = null,\n onAuthenticated,\n authenticatedComponent = null,\n}: GuestGuardProps): ReactNode {\n const { isAuthenticated, isLoading } = useAuth();\n const [checked, setChecked] = useState(false);\n\n useEffect(() => {\n if (!isLoading) {\n if (isAuthenticated) {\n onAuthenticated?.();\n }\n setChecked(true);\n }\n }, [isAuthenticated, isLoading, onAuthenticated]);\n\n if (isLoading || !checked) {\n return loadingComponent;\n }\n\n if (isAuthenticated) {\n return authenticatedComponent;\n }\n\n return children;\n}\n\n// =============================================================================\n// ROLE-BASED GUARD\n// =============================================================================\n\n/**\n * RoleBasedGuard props.\n */\nexport interface RoleBasedGuardProps {\n /** Children to render when authorized */\n children: ReactNode;\n /** Hook to get auth state */\n useAuth: UseAuth;\n /** Required roles (user must have at least one) */\n roles?: Role[];\n /** Required permissions. All are required unless permissionStrategy is specified. */\n permissions?: Permission[];\n permissionStrategy?: 'any' | 'all';\n /** Require email verification */\n requireEmailVerified?: boolean;\n /** Match strategy for roles: 'any' (default) or 'all' */\n roleMatchStrategy?: 'any' | 'all';\n /** Component to show while loading */\n loadingComponent?: ReactNode;\n /** Called when access denied */\n onAccessDenied?: (reason: AccessDeniedReason) => void;\n /** Component to show when access denied */\n accessDeniedComponent?: ReactNode;\n}\n\n/**\n * Reason for access denial.\n */\nexport type AccessDeniedReason = 'not_authenticated' | 'missing_role' | 'missing_permission' | 'email_not_verified';\n\n/**\n * Guard for role/permission-based access control.\n *\n * @example\n * ```tsx\n * import { RoleBasedGuard } from '@omnitron-dev/prism/blocks';\n * import { useAuth } from '../hooks/use-auth';\n *\n * // Require admin role\n * function AdminPage() {\n * return (\n * <RoleBasedGuard\n * useAuth={useAuth}\n * roles={['admin']}\n * onAccessDenied={() => navigate('/403')}\n * >\n * <AdminPanel />\n * </RoleBasedGuard>\n * );\n * }\n *\n * // Require specific permission\n * function EditUserPage() {\n * return (\n * <RoleBasedGuard\n * useAuth={useAuth}\n * permissions={['users:write']}\n * accessDeniedComponent={<AccessDenied />}\n * >\n * <UserEditForm />\n * </RoleBasedGuard>\n * );\n * }\n *\n * // Require admin OR moderator role\n * function ModeratePage() {\n * return (\n * <RoleBasedGuard\n * useAuth={useAuth}\n * roles={['admin', 'moderator']}\n * roleMatchStrategy=\"any\"\n * >\n * <ModerateContent />\n * </RoleBasedGuard>\n * );\n * }\n *\n * // Require email verified\n * function VerifiedOnlyPage() {\n * return (\n * <RoleBasedGuard\n * useAuth={useAuth}\n * requireEmailVerified\n * onAccessDenied={(reason) => {\n * if (reason === 'email_not_verified') {\n * navigate('/verify-email');\n * }\n * }}\n * >\n * <VerifiedContent />\n * </RoleBasedGuard>\n * );\n * }\n * ```\n */\nexport function RoleBasedGuard({\n children,\n useAuth,\n roles = [],\n permissions = [],\n permissionStrategy = 'all',\n requireEmailVerified = false,\n roleMatchStrategy = 'any',\n loadingComponent = null,\n onAccessDenied,\n accessDeniedComponent = null,\n}: RoleBasedGuardProps): ReactNode {\n const { isAuthenticated, isLoading, user } = useAuth();\n // Derive access during render. Storing it in an effect exposes the previous\n // user's children for one render after a role/permission change.\n let reason: AccessDeniedReason | null = null;\n if (!isAuthenticated || !user) reason = 'not_authenticated';\n else if (requireEmailVerified && !user.emailVerified) reason = 'email_not_verified';\n else if (roles.length > 0 && !hasRole(user, roles, roleMatchStrategy)) reason = 'missing_role';\n else if (permissions.length > 0 && !hasPermission(user, permissions, permissionStrategy)) reason = 'missing_permission';\n\n useEffect(() => {\n if (!isLoading && reason) onAccessDenied?.(reason);\n }, [isLoading, reason, onAccessDenied]);\n\n if (isLoading) return loadingComponent;\n if (reason) return accessDeniedComponent;\n\n return children;\n}\n\n// =============================================================================\n// UTILITY HOOKS\n// =============================================================================\n\n/**\n * Check if user has specific role(s).\n *\n * @example\n * ```tsx\n * const isAdmin = hasRole(user, 'admin');\n * const isModerator = hasRole(user, ['admin', 'moderator'], 'any');\n * const isSuperAdmin = hasRole(user, ['admin', 'superuser'], 'all');\n * ```\n */\nexport function hasRole(\n user: AuthUser | null | undefined,\n role: Role | Role[],\n strategy: 'any' | 'all' = 'any'\n): boolean {\n if (!user?.roles?.length) return false;\n\n const roles = Array.isArray(role) ? role : [role];\n // An empty requirement grants nothing. Under `all`, `[].every()` is `true`\n // — a vacuous truth that reads as \"every requirement is met\" and means \"no\n // requirement was checked\". A list arriving empty from config or from a\n // filtered array would open whatever it guards.\n if (roles.length === 0) return false;\n\n return strategy === 'all' ? roles.every((r) => user.roles!.includes(r)) : roles.some((r) => user.roles!.includes(r));\n}\n\n/**\n * Check if user has specific permission(s).\n *\n * @example\n * ```tsx\n * const canEdit = hasPermission(user, 'users:write');\n * const canManage = hasPermission(user, ['users:read', 'users:write'], 'all');\n * ```\n */\nexport function hasPermission(\n user: AuthUser | null | undefined,\n permission: Permission | Permission[],\n strategy: 'any' | 'all' = 'all'\n): boolean {\n if (!user?.permissions?.length) return false;\n\n const permissions = Array.isArray(permission) ? permission : [permission];\n // Same vacuous truth as `hasRole`, and here it was reachable by default:\n // `hasPermission(user, [])` returned `true` for any user holding at least\n // one permission, because the default strategy is `all` and `[].every()`\n // is `true`. Measured before this line existed.\n if (permissions.length === 0) return false;\n\n return strategy === 'all'\n ? permissions.every((p) => user.permissions!.includes(p))\n : permissions.some((p) => user.permissions!.includes(p));\n}\n\n/**\n * Create a conditional render helper based on roles/permissions.\n *\n * @example\n * ```tsx\n * const { canRender } = useConditionalRender(user);\n *\n * return (\n * <div>\n * {canRender({ roles: ['admin'] }) && <AdminPanel />}\n * {canRender({ permissions: ['users:write'] }) && <EditButton />}\n * </div>\n * );\n * ```\n */\nexport function createConditionalRender(user: AuthUser | null | undefined) {\n return {\n canRender: (options: {\n roles?: Role[];\n permissions?: Permission[];\n roleMatchStrategy?: 'any' | 'all';\n }): boolean => {\n const { roles = [], permissions = [], roleMatchStrategy = 'any' } = options;\n\n if (roles.length > 0 && !hasRole(user, roles, roleMatchStrategy)) {\n return false;\n }\n\n if (permissions.length > 0 && !hasPermission(user, permissions, 'all')) {\n return false;\n }\n\n return true;\n },\n };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { scrollbarStyles } from './chunk-
|
|
1
|
+
import { scrollbarStyles } from './chunk-IRYU3NTG.js';
|
|
2
2
|
import Box from '@mui/material/Box';
|
|
3
3
|
import { styled } from '@mui/material/styles';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
@@ -70,5 +70,5 @@ function Scrollbar({
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
export { Scrollbar };
|
|
73
|
-
//# sourceMappingURL=chunk-
|
|
74
|
-
//# sourceMappingURL=chunk-
|
|
73
|
+
//# sourceMappingURL=chunk-4Q5L7LDG.js.map
|
|
74
|
+
//# sourceMappingURL=chunk-4Q5L7LDG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/scrollbar/scrollbar.tsx"],"names":[],"mappings":";;;;;AAwDA,IAAM,aAAA,GAAgB,OAAO,GAAA,EAAK;AAAA,EAChC,iBAAA,EAAmB,CAAC,IAAA,KAAS,IAAA,KAAS;AACxC,CAAC,CAAA,CAAsB,CAAC,EAAE,KAAA,EAAO,YAAW,KAAM;AAChD,EAAA,MAAM,EAAE,WAAA,EAAa,aAAA,EAAe,QAAA,EAAU,MAAK,GAAI,UAAA;AAEvD,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,SAAS,GAAA,EAAK,OAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,WAAW,QAAA,EAAS;AAClE,IAAA,IAAI,SAAS,GAAA,EAAK,OAAO,EAAE,SAAA,EAAW,QAAA,EAAU,WAAW,MAAA,EAAO;AAClE,IAAA,OAAO,EAAE,UAAU,MAAA,EAAO;AAAA,EAC5B,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,CAAA;AAAA,IACV,SAAA,EAAW,CAAA;AAAA,IACX,GAAG,WAAA,EAAY;AAAA,IACf,GAAI,WAAA,IAAe;AAAA,MACjB,QAAA,EAAU,CAAA;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe;AAAA,KACjB;AAAA,IACA,GAAI,CAAC,aAAA,IAAiB,gBAAgB,KAAA,EAAO,EAAE,UAAU,CAAA;AAAA,IACzD,GAAI,aAAA,IAAiB;AAAA,MACnB,cAAA,EAAgB,MAAA;AAAA,MAChB,eAAA,EAAiB,MAAA;AAAA,MACjB,sBAAA,EAAwB;AAAA,QACtB,OAAA,EAAS;AAAA;AACX;AACF,GACF;AACF,CAAC,CAAA;AA+BM,SAAS,SAAA,CAAU;AAAA,EACxB,QAAA;AAAA,EACA,EAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,aAAA,GAAgB,KAAA;AAAA,EAChB,QAAA,GAAW,IAAA;AAAA,EACX,IAAA,GAAO,GAAA;AAAA,EACP,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmD;AACjD,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,WAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,EAAA,EAAI;AAAA,QACF;AAAA,UACE,GAAI,SAAA,KAAc,MAAA,IAAa,EAAE,SAAA,EAAU;AAAA,UAC3C,GAAI,SAAA,KAAc,MAAA,IAAa,EAAE,SAAA;AAAU,SAC7C;AAAA,QACA,GAAI,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,GAAI,EAAA,GAAK,CAAC,EAAE;AAAA,OAClC;AAAA,MACC,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/scrollbar/scrollbar.tsx"],"names":[],"mappings":";;;;;AAwDA,IAAM,aAAA,GAAgB,OAAO,GAAA,EAAK;AAAA,EAChC,iBAAA,EAAmB,CAAC,IAAA,KAAS,IAAA,KAAS;AACxC,CAAC,CAAA,CAAsB,CAAC,EAAE,KAAA,EAAO,YAAW,KAAM;AAChD,EAAA,MAAM,EAAE,WAAA,EAAa,aAAA,EAAe,QAAA,EAAU,MAAK,GAAI,UAAA;AAEvD,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,SAAS,GAAA,EAAK,OAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,WAAW,QAAA,EAAS;AAClE,IAAA,IAAI,SAAS,GAAA,EAAK,OAAO,EAAE,SAAA,EAAW,QAAA,EAAU,WAAW,MAAA,EAAO;AAClE,IAAA,OAAO,EAAE,UAAU,MAAA,EAAO;AAAA,EAC5B,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,CAAA;AAAA,IACV,SAAA,EAAW,CAAA;AAAA,IACX,GAAG,WAAA,EAAY;AAAA,IACf,GAAI,WAAA,IAAe;AAAA,MACjB,QAAA,EAAU,CAAA;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe;AAAA,KACjB;AAAA,IACA,GAAI,CAAC,aAAA,IAAiB,gBAAgB,KAAA,EAAO,EAAE,UAAU,CAAA;AAAA,IACzD,GAAI,aAAA,IAAiB;AAAA,MACnB,cAAA,EAAgB,MAAA;AAAA,MAChB,eAAA,EAAiB,MAAA;AAAA,MACjB,sBAAA,EAAwB;AAAA,QACtB,OAAA,EAAS;AAAA;AACX;AACF,GACF;AACF,CAAC,CAAA;AA+BM,SAAS,SAAA,CAAU;AAAA,EACxB,QAAA;AAAA,EACA,EAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,aAAA,GAAgB,KAAA;AAAA,EAChB,QAAA,GAAW,IAAA;AAAA,EACX,IAAA,GAAO,GAAA;AAAA,EACP,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmD;AACjD,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,WAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,EAAA,EAAI;AAAA,QACF;AAAA,UACE,GAAI,SAAA,KAAc,MAAA,IAAa,EAAE,SAAA,EAAU;AAAA,UAC3C,GAAI,SAAA,KAAc,MAAA,IAAa,EAAE,SAAA;AAAU,SAC7C;AAAA,QACA,GAAI,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,GAAI,EAAA,GAAK,CAAC,EAAE;AAAA,OAClC;AAAA,MACC,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ","file":"chunk-4Q5L7LDG.js","sourcesContent":["'use client';\n\n/**\n * Scrollbar Component\n *\n * Custom scrollbar wrapper with themed styling.\n *\n * @module components/scrollbar\n */\n\nimport type { ReactNode, Ref } from 'react';\nimport Box from '@mui/material/Box';\nimport { styled } from '@mui/material/styles';\nimport { scrollbarStyles } from '../../theme/mixins.js';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ScrollbarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Content to scroll */\n children?: ReactNode;\n /** Additional styles */\n sx?: SxProps<Theme>;\n /** Fill available content space */\n fillContent?: boolean;\n /** Hide scrollbar (content still scrollable) */\n hideScrollbar?: boolean;\n /** Reveal on hover or keyboard focus; native visibility on touch/high contrast. */\n autoHide?: boolean;\n /** Scrollbar axis */\n axis?: 'x' | 'y' | 'both';\n /** Max height constraint */\n maxHeight?: number | string;\n /** Min height constraint */\n minHeight?: number | string;\n /** Additional class name */\n className?: string;\n /** Scroll event handler */\n onScroll?: React.UIEventHandler<HTMLDivElement>;\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\ninterface ScrollbarRootProps {\n ownerState: {\n fillContent: boolean;\n hideScrollbar: boolean;\n autoHide: boolean;\n axis: 'x' | 'y' | 'both';\n };\n}\n\nconst ScrollbarRoot = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<ScrollbarRootProps>(({ theme, ownerState }) => {\n const { fillContent, hideScrollbar, autoHide, axis } = ownerState;\n\n const getOverflow = () => {\n if (axis === 'x') return { overflowX: 'auto', overflowY: 'hidden' } as const;\n if (axis === 'y') return { overflowX: 'hidden', overflowY: 'auto' } as const;\n return { overflow: 'auto' } as const;\n };\n\n return {\n minWidth: 0,\n minHeight: 0,\n ...getOverflow(),\n ...(fillContent && {\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n }),\n ...(!hideScrollbar && scrollbarStyles(theme, { autoHide })),\n ...(hideScrollbar && {\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n }),\n };\n});\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Scrollbar - Custom scrollbar wrapper with themed styling.\n *\n * @example\n * ```tsx\n * <Scrollbar maxHeight={400}>\n * <List>...</List>\n * </Scrollbar>\n * ```\n *\n * @example\n * ```tsx\n * // Horizontal scrollbar\n * <Scrollbar axis=\"x\">\n * <Stack direction=\"row\" spacing={2}>...</Stack>\n * </Scrollbar>\n * ```\n *\n * @example\n * ```tsx\n * // Fill available space\n * <Scrollbar fillContent>\n * {content}\n * </Scrollbar>\n * ```\n */\nexport function Scrollbar({\n children,\n sx,\n fillContent = false,\n hideScrollbar = false,\n autoHide = true,\n axis = 'y',\n maxHeight,\n minHeight,\n className,\n ref,\n ...other\n}: ScrollbarProps & { ref?: Ref<HTMLDivElement> }) {\n const ownerState = {\n fillContent,\n hideScrollbar,\n autoHide,\n axis,\n };\n\n return (\n <ScrollbarRoot\n ref={ref}\n ownerState={ownerState}\n className={className}\n sx={[\n {\n ...(maxHeight !== undefined && { maxHeight }),\n ...(minHeight !== undefined && { minHeight }),\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n >\n {children}\n </ScrollbarRoot>\n );\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useState, useCallback, useMemo } from 'react';
|
|
2
2
|
|
|
3
|
+
// src/core/hooks/use-boolean.ts
|
|
3
4
|
function useBoolean(defaultValue = false) {
|
|
4
5
|
const [value, setValue] = useState(defaultValue);
|
|
5
6
|
const onTrue = useCallback(() => {
|
|
@@ -24,5 +25,5 @@ function useBoolean(defaultValue = false) {
|
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
export { useBoolean };
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
28
|
-
//# sourceMappingURL=chunk-
|
|
28
|
+
//# sourceMappingURL=chunk-4R7EZ7GQ.js.map
|
|
29
|
+
//# sourceMappingURL=chunk-4R7EZ7GQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/hooks/use-boolean.ts"],"names":[],"mappings":";;;AAiEO,SAAS,UAAA,CAAW,eAAe,KAAA,EAAyB;AACjE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,YAAY,CAAA;AAE/C,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAChC,IAAA,QAAA,CAAS,KAAK,CAAA;AAAA,EAChB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,IAAA,QAAA,CAAS,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,OAAA;AAAA,IACL,OAAO;AAAA,MACL,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAQ;AAAA,GACnC;AACF","file":"chunk-4R7EZ7GQ.js","sourcesContent":["'use client';\n\n/**\n * useBoolean Hook\n *\n * A hook for managing boolean state with convenient toggle methods.\n *\n * @module core/hooks/use-boolean\n */\n\nimport { useState, useCallback, useMemo } from 'react';\n\n/**\n * Return type for useBoolean hook.\n */\nexport interface UseBooleanReturn {\n /** Current boolean value */\n value: boolean;\n /** Set value to true */\n onTrue: () => void;\n /** Set value to false */\n onFalse: () => void;\n /** Toggle the value */\n onToggle: () => void;\n /** Set to specific value */\n setValue: (value: boolean) => void;\n}\n\n/**\n * Hook for managing boolean state with convenient toggle methods.\n *\n * @param defaultValue - Initial boolean value (default: false)\n * @returns Boolean state and control methods\n *\n * @example\n * ```tsx\n * function Modal() {\n * const dialog = useBoolean();\n *\n * return (\n * <>\n * <Button onClick={dialog.onTrue}>Open</Button>\n * <Dialog open={dialog.value} onClose={dialog.onFalse}>\n * <DialogContent>...</DialogContent>\n * </Dialog>\n * </>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * function Sidebar() {\n * const { value: isCollapsed, onToggle } = useBoolean(false);\n *\n * return (\n * <nav style={{ width: isCollapsed ? 64 : 240 }}>\n * <IconButton onClick={onToggle}>\n * {isCollapsed ? <MenuIcon /> : <CloseIcon />}\n * </IconButton>\n * </nav>\n * );\n * }\n * ```\n */\nexport function useBoolean(defaultValue = false): UseBooleanReturn {\n const [value, setValue] = useState(defaultValue);\n\n const onTrue = useCallback(() => {\n setValue(true);\n }, []);\n\n const onFalse = useCallback(() => {\n setValue(false);\n }, []);\n\n const onToggle = useCallback(() => {\n setValue((prev) => !prev);\n }, []);\n\n return useMemo(\n () => ({\n value,\n onTrue,\n onFalse,\n onToggle,\n setValue,\n }),\n [value, onTrue, onFalse, onToggle]\n );\n}\n"]}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import Box from '@mui/material/Box';
|
|
2
|
+
import Stack from '@mui/material/Stack';
|
|
3
|
+
import Typography from '@mui/material/Typography';
|
|
4
|
+
import { alpha } from '@mui/material/styles';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
// src/components/empty-content/empty-content.tsx
|
|
8
|
+
function IconWrapper({ icon, color = "primary.main", size = 64 }) {
|
|
9
|
+
return /* @__PURE__ */ jsx(
|
|
10
|
+
Box,
|
|
11
|
+
{
|
|
12
|
+
sx: {
|
|
13
|
+
width: size,
|
|
14
|
+
height: size,
|
|
15
|
+
borderRadius: "50%",
|
|
16
|
+
display: "flex",
|
|
17
|
+
alignItems: "center",
|
|
18
|
+
justifyContent: "center",
|
|
19
|
+
bgcolor: (theme) => {
|
|
20
|
+
const parts = color.split(".");
|
|
21
|
+
let resolved = theme.palette;
|
|
22
|
+
for (const part of parts) {
|
|
23
|
+
resolved = resolved?.[part];
|
|
24
|
+
}
|
|
25
|
+
return typeof resolved === "string" ? alpha(resolved, 0.08) : alpha(theme.palette.primary.main, 0.08);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
children: icon
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
function EmptyContent({
|
|
33
|
+
illustration,
|
|
34
|
+
icon,
|
|
35
|
+
iconColor = "primary.main",
|
|
36
|
+
iconSize = 64,
|
|
37
|
+
title = "No data",
|
|
38
|
+
description,
|
|
39
|
+
action,
|
|
40
|
+
actions,
|
|
41
|
+
maxWidth = 400,
|
|
42
|
+
filled = false,
|
|
43
|
+
sx,
|
|
44
|
+
illustrationSx,
|
|
45
|
+
slotProps,
|
|
46
|
+
compact = false
|
|
47
|
+
}) {
|
|
48
|
+
const visual = icon ? /* @__PURE__ */ jsx(IconWrapper, { icon, color: iconColor, size: iconSize }) : illustration ? /* @__PURE__ */ jsx(Box, { sx: illustrationSx, children: illustration }) : null;
|
|
49
|
+
const allActions = [...actions ?? [], ...action ? [action] : []];
|
|
50
|
+
return /* @__PURE__ */ jsx(
|
|
51
|
+
Stack,
|
|
52
|
+
{
|
|
53
|
+
sx: {
|
|
54
|
+
alignItems: "center",
|
|
55
|
+
justifyContent: "center",
|
|
56
|
+
textAlign: "center",
|
|
57
|
+
py: compact ? 4 : 8,
|
|
58
|
+
px: 2,
|
|
59
|
+
// Default non-compact behavior: vertically center inside the
|
|
60
|
+
// available "main content" area. Two complementary anchors:
|
|
61
|
+
// * `flex: 1, alignSelf: 'stretch'` — when the parent IS a
|
|
62
|
+
// flex column with explicit height (DashboardLayout main,
|
|
63
|
+
// full-height page wrappers), EmptyContent grows to fill
|
|
64
|
+
// the column and the inner `justifyContent: center` puts
|
|
65
|
+
// the message in the middle of that column.
|
|
66
|
+
// * `minHeight: calc(100vh - 240px)` — fallback for the
|
|
67
|
+
// common case where the page wrapper is just a content-
|
|
68
|
+
// sized `<Stack>` or `<Box>`. 240px is the typical
|
|
69
|
+
// vertical chrome (header ~64 + breadcrumbs ~60 + page
|
|
70
|
+
// padding ~80 + a small margin), so this leaves enough
|
|
71
|
+
// space below the breadcrumbs for the message to sit at
|
|
72
|
+
// the optical center of the visible viewport.
|
|
73
|
+
//
|
|
74
|
+
// `compact` keeps the inline-sized behavior for callers that
|
|
75
|
+
// drop EmptyContent inside a card cell or sidebar.
|
|
76
|
+
// `filled` is the explicit "fill my parent" mode and shares
|
|
77
|
+
// the same fallback so the visual is consistent.
|
|
78
|
+
...!compact && {
|
|
79
|
+
flex: 1,
|
|
80
|
+
alignSelf: "stretch",
|
|
81
|
+
minHeight: "calc(100vh - 240px)"
|
|
82
|
+
},
|
|
83
|
+
...filled && { height: "100%" },
|
|
84
|
+
...sx
|
|
85
|
+
},
|
|
86
|
+
children: /* @__PURE__ */ jsxs(
|
|
87
|
+
Box,
|
|
88
|
+
{
|
|
89
|
+
sx: {
|
|
90
|
+
maxWidth,
|
|
91
|
+
display: "flex",
|
|
92
|
+
flexDirection: "column",
|
|
93
|
+
alignItems: "center",
|
|
94
|
+
gap: compact ? 1.5 : 2.5
|
|
95
|
+
},
|
|
96
|
+
children: [
|
|
97
|
+
visual,
|
|
98
|
+
/* @__PURE__ */ jsxs(Stack, { spacing: 0.5, sx: {
|
|
99
|
+
alignItems: "center"
|
|
100
|
+
}, children: [
|
|
101
|
+
title && /* @__PURE__ */ jsx(
|
|
102
|
+
Typography,
|
|
103
|
+
{
|
|
104
|
+
variant: compact ? "subtitle1" : "h6",
|
|
105
|
+
sx: {
|
|
106
|
+
color: "text.secondary",
|
|
107
|
+
fontWeight: 600,
|
|
108
|
+
...slotProps?.title
|
|
109
|
+
},
|
|
110
|
+
children: title
|
|
111
|
+
}
|
|
112
|
+
),
|
|
113
|
+
description && /* @__PURE__ */ jsx(
|
|
114
|
+
Typography,
|
|
115
|
+
{
|
|
116
|
+
variant: "body2",
|
|
117
|
+
sx: {
|
|
118
|
+
color: "text.disabled",
|
|
119
|
+
lineHeight: 1.6,
|
|
120
|
+
...slotProps?.description
|
|
121
|
+
},
|
|
122
|
+
children: description
|
|
123
|
+
}
|
|
124
|
+
)
|
|
125
|
+
] }),
|
|
126
|
+
allActions.length > 0 && /* @__PURE__ */ jsx(
|
|
127
|
+
Stack,
|
|
128
|
+
{
|
|
129
|
+
direction: "row",
|
|
130
|
+
spacing: 1,
|
|
131
|
+
sx: { mt: compact ? 0.5 : 1, flexWrap: "wrap", justifyContent: "center", ...slotProps?.actions },
|
|
132
|
+
children: allActions.map((a, i) => /* @__PURE__ */ jsx(Box, { children: a }, i))
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
)
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
function SearchEmptyContent({
|
|
142
|
+
query,
|
|
143
|
+
...props
|
|
144
|
+
}) {
|
|
145
|
+
return /* @__PURE__ */ jsx(
|
|
146
|
+
EmptyContent,
|
|
147
|
+
{
|
|
148
|
+
title: "No results found",
|
|
149
|
+
description: query ? `Your search for "${query}" did not match any results.` : "Try adjusting your search criteria.",
|
|
150
|
+
...props
|
|
151
|
+
}
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
function LoadingEmptyContent({ ...props }) {
|
|
155
|
+
return /* @__PURE__ */ jsx(
|
|
156
|
+
EmptyContent,
|
|
157
|
+
{
|
|
158
|
+
title: "Loading...",
|
|
159
|
+
illustration: /* @__PURE__ */ jsx(
|
|
160
|
+
Box,
|
|
161
|
+
{
|
|
162
|
+
sx: {
|
|
163
|
+
width: 64,
|
|
164
|
+
height: 64,
|
|
165
|
+
borderRadius: "50%",
|
|
166
|
+
border: "3px solid",
|
|
167
|
+
borderColor: "divider",
|
|
168
|
+
borderTopColor: "primary.main",
|
|
169
|
+
animation: "spin 1s linear infinite",
|
|
170
|
+
"@keyframes spin": {
|
|
171
|
+
from: { transform: "rotate(0deg)" },
|
|
172
|
+
to: { transform: "rotate(360deg)" }
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
),
|
|
177
|
+
compact: true,
|
|
178
|
+
...props
|
|
179
|
+
}
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export { EmptyContent, LoadingEmptyContent, SearchEmptyContent };
|
|
184
|
+
//# sourceMappingURL=chunk-6IANOSMD.js.map
|
|
185
|
+
//# sourceMappingURL=chunk-6IANOSMD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/empty-content/empty-content.tsx"],"names":[],"mappings":"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","file":"chunk-6IANOSMD.js","sourcesContent":["'use client';\n\n/**\n * Empty Content Component\n *\n * Universal placeholder for empty states across the application.\n * Supports icon-based illustrations, multiple action buttons,\n * filled backgrounds, and compact mode.\n *\n * @module components/empty-content\n */\n\nimport type { ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { alpha } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface EmptyContentProps {\n /** Custom illustration (SVG, image, or any ReactNode) */\n illustration?: ReactNode;\n /** Icon element — rendered inside a circular colored wrapper */\n icon?: ReactNode;\n /** Color for the icon wrapper background (palette path like 'primary.main') */\n iconColor?: string;\n /** Size of the icon wrapper (default 64) */\n iconSize?: number;\n /** Main title text */\n title?: string;\n /** Description text or ReactNode */\n description?: ReactNode;\n /** Single action button (backward compatible) */\n action?: ReactNode;\n /** Multiple action buttons rendered in a row */\n actions?: ReactNode[];\n /** Max width of the container */\n maxWidth?: number | string;\n /** Fill the entire available space (height: 100%) */\n filled?: boolean;\n /** Additional styles for root container */\n sx?: SxProps<Theme>;\n /** Illustration wrapper styles */\n illustrationSx?: SxProps<Theme>;\n /** Slot overrides */\n slotProps?: {\n title?: SxProps<Theme>;\n description?: SxProps<Theme>;\n actions?: SxProps<Theme>;\n };\n /** Compact mode — reduces spacing and font sizes */\n compact?: boolean;\n}\n\n// =============================================================================\n// DEFAULT ILLUSTRATION\n// =============================================================================\n\nfunction IconWrapper({ icon, color = 'primary.main', size = 64 }: { icon: ReactNode; color?: string; size?: number }) {\n return (\n <Box\n sx={{\n width: size,\n height: size,\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: (theme) => {\n // Resolve palette path (e.g. 'primary.main' → theme.palette.primary.main)\n const parts = color.split('.');\n let resolved: any = theme.palette;\n for (const part of parts) {\n resolved = resolved?.[part];\n }\n return typeof resolved === 'string' ? alpha(resolved, 0.08) : alpha(theme.palette.primary.main, 0.08);\n },\n }}\n >\n {icon}\n </Box>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * EmptyContent - Universal empty state placeholder.\n *\n * @example Basic\n * ```tsx\n * <EmptyContent title=\"No data found\" description=\"Try adjusting your filters\" />\n * ```\n *\n * @example With icon\n * ```tsx\n * <EmptyContent\n * icon={<ChatIcon sx={{ width: 28, height: 28, color: 'primary.main', opacity: 0.6 }} />}\n * title=\"Select a conversation\"\n * description=\"Choose a room from the sidebar\"\n * />\n * ```\n *\n * @example With multiple actions\n * ```tsx\n * <EmptyContent\n * icon={<FolderIcon sx={{ fontSize: 28, color: 'text.disabled' }} />}\n * title=\"No files yet\"\n * description=\"Upload files or create a folder to get started\"\n * actions={[\n * <Button variant=\"contained\" startIcon={<UploadIcon />}>Upload</Button>,\n * <Button variant=\"outlined\" startIcon={<FolderIcon />}>New folder</Button>,\n * ]}\n * />\n * ```\n *\n * @example Filled (full height)\n * ```tsx\n * <EmptyContent filled title=\"No messages\" compact />\n * ```\n */\nexport function EmptyContent({\n illustration,\n icon,\n iconColor = 'primary.main',\n iconSize = 64,\n title = 'No data',\n description,\n action,\n actions,\n maxWidth = 400,\n filled = false,\n sx,\n illustrationSx,\n slotProps,\n compact = false,\n}: EmptyContentProps): ReactNode {\n // Determine visual: icon > illustration > nothing (no default for clean minimal states)\n const visual = icon ? (\n <IconWrapper icon={icon} color={iconColor} size={iconSize} />\n ) : illustration ? (\n <Box sx={illustrationSx}>{illustration}</Box>\n ) : null;\n\n // Merge actions: single action + array\n const allActions = [...(actions ?? []), ...(action ? [action] : [])];\n\n return (\n <Stack\n sx={{\n alignItems: \"center\",\n justifyContent: \"center\",\n textAlign: 'center',\n py: compact ? 4 : 8,\n px: 2,\n\n // Default non-compact behavior: vertically center inside the\n // available \"main content\" area. Two complementary anchors:\n // * `flex: 1, alignSelf: 'stretch'` — when the parent IS a\n // flex column with explicit height (DashboardLayout main,\n // full-height page wrappers), EmptyContent grows to fill\n // the column and the inner `justifyContent: center` puts\n // the message in the middle of that column.\n // * `minHeight: calc(100vh - 240px)` — fallback for the\n // common case where the page wrapper is just a content-\n // sized `<Stack>` or `<Box>`. 240px is the typical\n // vertical chrome (header ~64 + breadcrumbs ~60 + page\n // padding ~80 + a small margin), so this leaves enough\n // space below the breadcrumbs for the message to sit at\n // the optical center of the visible viewport.\n //\n // `compact` keeps the inline-sized behavior for callers that\n // drop EmptyContent inside a card cell or sidebar.\n // `filled` is the explicit \"fill my parent\" mode and shares\n // the same fallback so the visual is consistent.\n ...(!compact && {\n flex: 1,\n alignSelf: 'stretch',\n minHeight: 'calc(100vh - 240px)',\n }),\n\n ...(filled && { height: '100%' }),\n ...sx\n }}>\n <Box\n sx={{\n maxWidth,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: compact ? 1.5 : 2.5,\n }}\n >\n {/* Visual (icon or illustration) */}\n {visual}\n\n {/* Text */}\n <Stack spacing={0.5} sx={{\n alignItems: \"center\"\n }}>\n {title && (\n <Typography\n variant={compact ? 'subtitle1' : 'h6'}\n sx={{\n color: \"text.secondary\",\n fontWeight: 600,\n ...slotProps?.title\n }}>\n {title}\n </Typography>\n )}\n\n {description && (\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.disabled\",\n lineHeight: 1.6,\n ...slotProps?.description\n }}>\n {description}\n </Typography>\n )}\n </Stack>\n\n {/* Actions */}\n {allActions.length > 0 && (\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ mt: compact ? 0.5 : 1, flexWrap: 'wrap', justifyContent: 'center', ...slotProps?.actions }}\n >\n {allActions.map((a, i) => (\n <Box key={i}>{a}</Box>\n ))}\n </Stack>\n )}\n </Box>\n </Stack>\n );\n}\n\n/**\n * Search Empty Content - Specialized empty state for search results.\n */\nexport function SearchEmptyContent({\n query,\n ...props\n}: Omit<EmptyContentProps, 'title' | 'description'> & { query?: string }): ReactNode {\n return (\n <EmptyContent\n title=\"No results found\"\n description={\n query ? `Your search for \"${query}\" did not match any results.` : 'Try adjusting your search criteria.'\n }\n {...props}\n />\n );\n}\n\n/**\n * Loading Empty Content - Placeholder while loading.\n */\nexport function LoadingEmptyContent({ ...props }: Omit<EmptyContentProps, 'title'>): ReactNode {\n return (\n <EmptyContent\n title=\"Loading...\"\n illustration={\n <Box\n sx={{\n width: 64,\n height: 64,\n borderRadius: '50%',\n border: '3px solid',\n borderColor: 'divider',\n borderTopColor: 'primary.main',\n animation: 'spin 1s linear infinite',\n '@keyframes spin': {\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n },\n }}\n />\n }\n compact\n {...props}\n />\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChevronDownIcon, ChevronRightIcon } from './chunk-
|
|
1
|
+
import { ChevronDownIcon, ChevronRightIcon } from './chunk-VQVVHMPG.js';
|
|
2
2
|
import { useId, useState, useRef, useEffect, useLayoutEffect } from 'react';
|
|
3
3
|
import Box from '@mui/material/Box';
|
|
4
4
|
import List from '@mui/material/List';
|
|
@@ -202,5 +202,5 @@ function SidebarLabel({ label, sx }) {
|
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
export { DocSidebar };
|
|
205
|
-
//# sourceMappingURL=chunk-
|
|
206
|
-
//# sourceMappingURL=chunk-
|
|
205
|
+
//# sourceMappingURL=chunk-7ATBURW2.js.map
|
|
206
|
+
//# sourceMappingURL=chunk-7ATBURW2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/doc-layout/doc-sidebar.tsx"],"names":[],"mappings":"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","file":"chunk-YHE7HXSG.js","sourcesContent":["'use client';\n\nimport { ChevronDownIcon, ChevronRightIcon } from '../../icons/controls.js';\n\nimport { useEffect, useId, useLayoutEffect, useRef, useState } from 'react';\nimport Box from '@mui/material/Box';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport Collapse from '@mui/material/Collapse';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { alpha } from '@mui/material/styles';\n\nexport interface DocSidebarItem {\n id: string;\n label: string;\n href?: string;\n /** Short identity displayed in a collapsed navigation rail. */\n shortLabel?: string;\n children?: DocSidebarItem[];\n}\n\ninterface DocSidebarProps {\n items: DocSidebarItem[];\n activeId?: string;\n onItemClick?: (item: DocSidebarItem) => void;\n title?: string;\n compact?: boolean;\n}\n\n/**\n * Maximum number of lines a long sidebar label may wrap onto\n * before ellipsis kicks in. 2 is the industry baseline for\n * compact navigation surfaces (Notion / Linear / Stripe).\n *\n * Bumped to 3 would help Russian compound words like\n * \"Универсальные категории\" but would noticeably loosen the\n * vertical rhythm of the sidebar.\n */\nconst MAX_LABEL_LINES = 2;\n\n// useLayoutEffect logs a warning during SSR; pick the right hook so\n// consumers rendering the sidebar in a server bundle aren't noisy.\nconst useIsoLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\nexport function DocSidebar({ items, activeId, onItemClick, title, compact = false }: DocSidebarProps) {\n const compactIndex = () => {\n const leaves = (nodes: DocSidebarItem[], path: string[] = []): { item: DocSidebarItem; path: string }[] =>\n nodes.flatMap((item) => [\n ...(item.href || !item.children?.length ? [{ item, path: [...path, item.label].join(' / ') }] : []),\n ...leaves(item.children ?? [], [...path, item.label]),\n ]);\n return (\n <List dense disablePadding aria-label={title}>\n {leaves(items).map(({ item, path }, index) => (\n <Tooltip key={item.id} title={path} placement=\"right\" disableInteractive>\n <ListItemButton\n component={item.href ? 'a' : 'button'}\n href={item.href}\n aria-label={item.label}\n aria-current={activeId === item.id ? 'page' : undefined}\n selected={activeId === item.id}\n onClick={(event: React.MouseEvent<HTMLElement>) => {\n if (\n item.href &&\n (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0)\n )\n return;\n if (item.href && onItemClick) event.preventDefault();\n onItemClick?.(item);\n }}\n sx={{\n minHeight: 40,\n width: '100%',\n px: 0.5,\n mb: 0.5,\n borderRadius: 1,\n justifyContent: 'center',\n textDecoration: 'none',\n }}\n >\n <Typography component=\"span\" variant=\"caption\" aria-hidden=\"true\" sx={{ fontWeight: 600 }}>\n {item.shortLabel ?? String(index + 1).padStart(2, '0')}\n </Typography>\n </ListItemButton>\n </Tooltip>\n ))}\n </List>\n );\n };\n return (\n <Box>\n {compact && compactIndex()}\n <Box hidden={compact}>\n {title && (\n <Typography\n variant=\"subtitle2\"\n sx={{\n px: 1.5,\n pt: 0.5,\n pb: 2,\n fontWeight: 700,\n fontSize: '0.8125rem',\n color: 'text.secondary',\n letterSpacing: '0.01em',\n }}\n >\n {title}\n </Typography>\n )}\n <List dense disablePadding>\n {items.map((item) => (\n <SidebarNode key={item.id} item={item} activeId={activeId} onItemClick={onItemClick} depth={0} />\n ))}\n </List>\n </Box>\n </Box>\n );\n}\n\nfunction SidebarNode({\n item,\n activeId,\n onItemClick,\n depth,\n}: {\n item: DocSidebarItem;\n activeId?: string;\n onItemClick?: (item: DocSidebarItem) => void;\n depth: number;\n}) {\n const hasChildren = !!item.children?.length;\n const childrenId = useId();\n const isActive = activeId === item.id;\n const [open, setOpen] = useState(true);\n const isCategory = hasChildren && !item.href;\n\n return (\n <>\n <ListItemButton\n component={item.href ? 'a' : 'button'}\n href={item.href}\n aria-current={isActive ? 'page' : undefined}\n aria-expanded={hasChildren ? open : undefined}\n aria-controls={hasChildren ? childrenId : undefined}\n selected={isActive}\n onClick={(event: React.MouseEvent<HTMLElement>) => {\n // Native links retain copy/open-in-new-tab and modified-click behaviour.\n if (item.href && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0))\n return;\n if (item.href && onItemClick) event.preventDefault();\n if (hasChildren) setOpen(!open);\n onItemClick?.(item);\n }}\n sx={{\n pl: 1.5 + depth * 1.5,\n pr: 1,\n py: isCategory ? 0.75 : 0.5,\n borderRadius: 1,\n mx: 0.5,\n mb: 0.25,\n minHeight: 0,\n alignItems: 'center',\n width: 'calc(100% - 8px)',\n textAlign: 'left',\n textDecoration: 'none',\n ...(isCategory && {\n mt: depth === 0 ? 1 : 0.5,\n }),\n ...(isActive && {\n bgcolor: (theme) => alpha(theme.palette.primary.main, 0.08),\n color: 'primary.main',\n }),\n }}\n >\n {hasChildren && (\n <Box\n component=\"span\"\n aria-hidden=\"true\"\n sx={{\n width: 20,\n height: 20,\n flexShrink: 0,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 1,\n }}\n >\n {open ? <ChevronDownIcon sx={{ fontSize: 18 }} /> : <ChevronRightIcon sx={{ fontSize: 18 }} />}\n </Box>\n )}\n <SidebarLabel\n label={item.label}\n sx={{\n fontWeight: isCategory ? 600 : isActive ? 600 : 400,\n fontSize: '0.8125rem',\n ...(isCategory && { color: 'text.primary' }),\n }}\n />\n </ListItemButton>\n {hasChildren && (\n <Collapse in={open} id={childrenId} unmountOnExit>\n <List dense disablePadding>\n {item.children!.map((child) => (\n <SidebarNode\n key={child.id}\n item={child}\n activeId={activeId}\n onItemClick={onItemClick}\n depth={depth + 1}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n );\n}\n\n/**\n * Label cell with industry-standard \"wrap up to N lines, then\n * ellipsis, then tooltip only when actually overflowing\"\n * behaviour.\n *\n * Why this pattern wins:\n * - Short labels render with NO truncation and NO tooltip —\n * hovering them never spawns a tooltip the reader doesn't need.\n * - Mid-length labels wrap to 2 lines and stay fully visible —\n * much better than premature ellipsis.\n * - Only TRULY oversized labels get the ellipsis, and only those\n * spawn a tooltip on hover so the full text is recoverable.\n *\n * Implementation:\n * - CSS `-webkit-line-clamp` is the cross-browser line-clamp\n * standard (still vendor-prefixed in spec but supported by\n * every modern engine).\n * - Overflow detection compares scrollHeight to clientHeight via\n * a ResizeObserver, so the truncation flag updates when the\n * sidebar resizes (mobile drawer width changes, font scaling,\n * etc.). Skipping `useLayoutEffect` during SSR is the\n * `useIsoLayoutEffect` indirection above.\n *\n * The Tooltip is rendered with `disableInteractive` so hover-out\n * is immediate and the tooltip doesn't block the underlying\n * click area.\n */\nfunction SidebarLabel({ label, sx }: { label: string; sx?: object }) {\n const ref = useRef<HTMLSpanElement | null>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n\n useIsoLayoutEffect(() => {\n const el = ref.current;\n if (!el) return undefined;\n const check = () => {\n // +1 px slack for sub-pixel rounding in some engines so we\n // don't flag a perfectly-fitting label as overflowing.\n setIsOverflowing(el.scrollHeight > el.clientHeight + 1);\n };\n check();\n if (typeof ResizeObserver === 'undefined') return undefined;\n const ro = new ResizeObserver(check);\n ro.observe(el);\n return () => ro.disconnect();\n }, [label]);\n\n const text = (\n <Typography\n ref={ref as unknown as React.Ref<HTMLSpanElement>}\n component=\"span\"\n variant=\"body2\"\n sx={{\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: MAX_LABEL_LINES,\n overflow: 'hidden',\n wordBreak: 'break-word',\n lineHeight: 1.35,\n // The flex parent (ListItemButton) needs `minWidth: 0`\n // on the child for the ellipsis to take effect; do it\n // here so the consumer doesn't have to reach in.\n minWidth: 0,\n flex: 1,\n ...sx,\n }}\n >\n {label}\n </Typography>\n );\n\n if (!isOverflowing) return text;\n\n return (\n <Tooltip title={label} placement=\"right\" arrow enterDelay={300} enterNextDelay={150} disableInteractive>\n {text}\n </Tooltip>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/doc-layout/doc-sidebar.tsx"],"names":[],"mappings":"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","file":"chunk-7ATBURW2.js","sourcesContent":["'use client';\n\nimport { ChevronDownIcon, ChevronRightIcon } from '../../icons/controls.js';\n\nimport { useEffect, useId, useLayoutEffect, useRef, useState } from 'react';\nimport Box from '@mui/material/Box';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport Collapse from '@mui/material/Collapse';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { alpha } from '@mui/material/styles';\n\nexport interface DocSidebarItem {\n id: string;\n label: string;\n href?: string;\n /** Short identity displayed in a collapsed navigation rail. */\n shortLabel?: string;\n children?: DocSidebarItem[];\n}\n\ninterface DocSidebarProps {\n items: DocSidebarItem[];\n activeId?: string;\n onItemClick?: (item: DocSidebarItem) => void;\n title?: string;\n compact?: boolean;\n}\n\n/**\n * Maximum number of lines a long sidebar label may wrap onto\n * before ellipsis kicks in. 2 is the industry baseline for\n * compact navigation surfaces (Notion / Linear / Stripe).\n *\n * Bumped to 3 would help Russian compound words like\n * \"Универсальные категории\" but would noticeably loosen the\n * vertical rhythm of the sidebar.\n */\nconst MAX_LABEL_LINES = 2;\n\n// useLayoutEffect logs a warning during SSR; pick the right hook so\n// consumers rendering the sidebar in a server bundle aren't noisy.\nconst useIsoLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\nexport function DocSidebar({ items, activeId, onItemClick, title, compact = false }: DocSidebarProps) {\n const compactIndex = () => {\n const leaves = (nodes: DocSidebarItem[], path: string[] = []): { item: DocSidebarItem; path: string }[] =>\n nodes.flatMap((item) => [\n ...(item.href || !item.children?.length ? [{ item, path: [...path, item.label].join(' / ') }] : []),\n ...leaves(item.children ?? [], [...path, item.label]),\n ]);\n return (\n <List dense disablePadding aria-label={title}>\n {leaves(items).map(({ item, path }, index) => (\n <Tooltip key={item.id} title={path} placement=\"right\" disableInteractive>\n <ListItemButton\n component={item.href ? 'a' : 'button'}\n href={item.href}\n aria-label={item.label}\n aria-current={activeId === item.id ? 'page' : undefined}\n selected={activeId === item.id}\n onClick={(event: React.MouseEvent<HTMLElement>) => {\n if (\n item.href &&\n (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0)\n )\n return;\n if (item.href && onItemClick) event.preventDefault();\n onItemClick?.(item);\n }}\n sx={{\n minHeight: 40,\n width: '100%',\n px: 0.5,\n mb: 0.5,\n borderRadius: 1,\n justifyContent: 'center',\n textDecoration: 'none',\n }}\n >\n <Typography component=\"span\" variant=\"caption\" aria-hidden=\"true\" sx={{ fontWeight: 600 }}>\n {item.shortLabel ?? String(index + 1).padStart(2, '0')}\n </Typography>\n </ListItemButton>\n </Tooltip>\n ))}\n </List>\n );\n };\n return (\n <Box>\n {compact && compactIndex()}\n <Box hidden={compact}>\n {title && (\n <Typography\n variant=\"subtitle2\"\n sx={{\n px: 1.5,\n pt: 0.5,\n pb: 2,\n fontWeight: 700,\n fontSize: '0.8125rem',\n color: 'text.secondary',\n letterSpacing: '0.01em',\n }}\n >\n {title}\n </Typography>\n )}\n <List dense disablePadding>\n {items.map((item) => (\n <SidebarNode key={item.id} item={item} activeId={activeId} onItemClick={onItemClick} depth={0} />\n ))}\n </List>\n </Box>\n </Box>\n );\n}\n\nfunction SidebarNode({\n item,\n activeId,\n onItemClick,\n depth,\n}: {\n item: DocSidebarItem;\n activeId?: string;\n onItemClick?: (item: DocSidebarItem) => void;\n depth: number;\n}) {\n const hasChildren = !!item.children?.length;\n const childrenId = useId();\n const isActive = activeId === item.id;\n const [open, setOpen] = useState(true);\n const isCategory = hasChildren && !item.href;\n\n return (\n <>\n <ListItemButton\n component={item.href ? 'a' : 'button'}\n href={item.href}\n aria-current={isActive ? 'page' : undefined}\n aria-expanded={hasChildren ? open : undefined}\n aria-controls={hasChildren ? childrenId : undefined}\n selected={isActive}\n onClick={(event: React.MouseEvent<HTMLElement>) => {\n // Native links retain copy/open-in-new-tab and modified-click behaviour.\n if (item.href && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0))\n return;\n if (item.href && onItemClick) event.preventDefault();\n if (hasChildren) setOpen(!open);\n onItemClick?.(item);\n }}\n sx={{\n pl: 1.5 + depth * 1.5,\n pr: 1,\n py: isCategory ? 0.75 : 0.5,\n borderRadius: 1,\n mx: 0.5,\n mb: 0.25,\n minHeight: 0,\n alignItems: 'center',\n width: 'calc(100% - 8px)',\n textAlign: 'left',\n textDecoration: 'none',\n ...(isCategory && {\n mt: depth === 0 ? 1 : 0.5,\n }),\n ...(isActive && {\n bgcolor: (theme) => alpha(theme.palette.primary.main, 0.08),\n color: 'primary.main',\n }),\n }}\n >\n {hasChildren && (\n <Box\n component=\"span\"\n aria-hidden=\"true\"\n sx={{\n width: 20,\n height: 20,\n flexShrink: 0,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 1,\n }}\n >\n {open ? <ChevronDownIcon sx={{ fontSize: 18 }} /> : <ChevronRightIcon sx={{ fontSize: 18 }} />}\n </Box>\n )}\n <SidebarLabel\n label={item.label}\n sx={{\n fontWeight: isCategory ? 600 : isActive ? 600 : 400,\n fontSize: '0.8125rem',\n ...(isCategory && { color: 'text.primary' }),\n }}\n />\n </ListItemButton>\n {hasChildren && (\n <Collapse in={open} id={childrenId} unmountOnExit>\n <List dense disablePadding>\n {item.children!.map((child) => (\n <SidebarNode\n key={child.id}\n item={child}\n activeId={activeId}\n onItemClick={onItemClick}\n depth={depth + 1}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n );\n}\n\n/**\n * Label cell with industry-standard \"wrap up to N lines, then\n * ellipsis, then tooltip only when actually overflowing\"\n * behaviour.\n *\n * Why this pattern wins:\n * - Short labels render with NO truncation and NO tooltip —\n * hovering them never spawns a tooltip the reader doesn't need.\n * - Mid-length labels wrap to 2 lines and stay fully visible —\n * much better than premature ellipsis.\n * - Only TRULY oversized labels get the ellipsis, and only those\n * spawn a tooltip on hover so the full text is recoverable.\n *\n * Implementation:\n * - CSS `-webkit-line-clamp` is the cross-browser line-clamp\n * standard (still vendor-prefixed in spec but supported by\n * every modern engine).\n * - Overflow detection compares scrollHeight to clientHeight via\n * a ResizeObserver, so the truncation flag updates when the\n * sidebar resizes (mobile drawer width changes, font scaling,\n * etc.). Skipping `useLayoutEffect` during SSR is the\n * `useIsoLayoutEffect` indirection above.\n *\n * The Tooltip is rendered with `disableInteractive` so hover-out\n * is immediate and the tooltip doesn't block the underlying\n * click area.\n */\nfunction SidebarLabel({ label, sx }: { label: string; sx?: object }) {\n const ref = useRef<HTMLSpanElement | null>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n\n useIsoLayoutEffect(() => {\n const el = ref.current;\n if (!el) return undefined;\n const check = () => {\n // +1 px slack for sub-pixel rounding in some engines so we\n // don't flag a perfectly-fitting label as overflowing.\n setIsOverflowing(el.scrollHeight > el.clientHeight + 1);\n };\n check();\n if (typeof ResizeObserver === 'undefined') return undefined;\n const ro = new ResizeObserver(check);\n ro.observe(el);\n return () => ro.disconnect();\n }, [label]);\n\n const text = (\n <Typography\n ref={ref as unknown as React.Ref<HTMLSpanElement>}\n component=\"span\"\n variant=\"body2\"\n sx={{\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: MAX_LABEL_LINES,\n overflow: 'hidden',\n wordBreak: 'break-word',\n lineHeight: 1.35,\n // The flex parent (ListItemButton) needs `minWidth: 0`\n // on the child for the ellipsis to take effect; do it\n // here so the consumer doesn't have to reach in.\n minWidth: 0,\n flex: 1,\n ...sx,\n }}\n >\n {label}\n </Typography>\n );\n\n if (!isOverflowing) return text;\n\n return (\n <Tooltip title={label} placement=\"right\" arrow enterDelay={300} enterNextDelay={150} disableInteractive>\n {text}\n </Tooltip>\n );\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { green, minimalPreset, retroPreset, midnightPreset, draculaPreset, emberPreset, arcticPreset } from './chunk-
|
|
2
|
-
import { hexToRgbChannel, generatePaletteColorWithChannels, darken, lighten } from './chunk-
|
|
1
|
+
import { green, minimalPreset, retroPreset, midnightPreset, draculaPreset, emberPreset, arcticPreset } from './chunk-RSWVYIXK.js';
|
|
2
|
+
import { hexToRgbChannel, generatePaletteColorWithChannels, darken, lighten } from './chunk-IRYU3NTG.js';
|
|
3
3
|
|
|
4
4
|
// src/theme/palette.ts
|
|
5
5
|
function generatePaletteChannel(hex) {
|
|
@@ -527,5 +527,5 @@ function injectCssVariables(vars, config) {
|
|
|
527
527
|
}
|
|
528
528
|
|
|
529
529
|
export { applyPrimaryOverride, cssVariables, defaultPreset, generateCssVariables, generatePaletteChannel, getPreset, luxuryPreset, presetNames };
|
|
530
|
-
//# sourceMappingURL=chunk-
|
|
531
|
-
//# sourceMappingURL=chunk-
|
|
530
|
+
//# sourceMappingURL=chunk-AATAOOSF.js.map
|
|
531
|
+
//# sourceMappingURL=chunk-AATAOOSF.js.map
|