@omnitron-dev/prism 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +148 -0
  2. package/dist/blocks/index.js +3 -1
  3. package/dist/blocks/index.js.map +1 -1
  4. package/dist/{chunk-S6SEGBX6.js → chunk-472SOF76.js} +4 -4
  5. package/dist/{chunk-S6SEGBX6.js.map → chunk-472SOF76.js.map} +1 -1
  6. package/dist/{chunk-Z5OSPAOC.js → chunk-4Z5DE5GK.js} +78 -75
  7. package/dist/chunk-4Z5DE5GK.js.map +1 -0
  8. package/dist/chunk-52PQL67Q.js +559 -0
  9. package/dist/chunk-52PQL67Q.js.map +1 -0
  10. package/dist/chunk-75FQ5IW3.js +590 -0
  11. package/dist/chunk-75FQ5IW3.js.map +1 -0
  12. package/dist/{chunk-6AHI4GSV.js → chunk-7G5D5PTC.js} +4 -3
  13. package/dist/chunk-7G5D5PTC.js.map +1 -0
  14. package/dist/chunk-BJE2AKD4.js +105 -0
  15. package/dist/chunk-BJE2AKD4.js.map +1 -0
  16. package/dist/chunk-FF5RF32O.js +248 -0
  17. package/dist/chunk-FF5RF32O.js.map +1 -0
  18. package/dist/{chunk-OBJ244BO.js → chunk-GMIE6III.js} +9 -42
  19. package/dist/chunk-GMIE6III.js.map +1 -0
  20. package/dist/chunk-GUGTDURV.js +826 -0
  21. package/dist/chunk-GUGTDURV.js.map +1 -0
  22. package/dist/chunk-HOXFSQUV.js +573 -0
  23. package/dist/chunk-HOXFSQUV.js.map +1 -0
  24. package/dist/chunk-JSQTYDPG.js +3 -0
  25. package/dist/chunk-JSQTYDPG.js.map +1 -0
  26. package/dist/{chunk-ZTATTUH7.js → chunk-KQ67XB6T.js} +213 -651
  27. package/dist/chunk-KQ67XB6T.js.map +1 -0
  28. package/dist/{chunk-WFD54GQQ.js → chunk-LOY2NPCO.js} +14 -573
  29. package/dist/chunk-LOY2NPCO.js.map +1 -0
  30. package/dist/{chunk-YQW43BDH.js → chunk-LSPFFEJT.js} +240 -1824
  31. package/dist/chunk-LSPFFEJT.js.map +1 -0
  32. package/dist/{chunk-BZOL7GMU.js → chunk-OKTLA23Q.js} +4 -4
  33. package/dist/chunk-OKTLA23Q.js.map +1 -0
  34. package/dist/chunk-PFT2BNYO.js +191 -0
  35. package/dist/chunk-PFT2BNYO.js.map +1 -0
  36. package/dist/chunk-PGHEP4JD.js +106 -0
  37. package/dist/chunk-PGHEP4JD.js.map +1 -0
  38. package/dist/chunk-PXXPLHIY.js +74 -0
  39. package/dist/chunk-PXXPLHIY.js.map +1 -0
  40. package/dist/chunk-SU3LVQ7N.js +518 -0
  41. package/dist/chunk-SU3LVQ7N.js.map +1 -0
  42. package/dist/chunk-YHE7HXSG.js +206 -0
  43. package/dist/chunk-YHE7HXSG.js.map +1 -0
  44. package/dist/cli/index.js +7 -2
  45. package/dist/cli/index.js.map +1 -1
  46. package/dist/components/accordion/accordion.d.ts.map +1 -1
  47. package/dist/components/admin-filters/admin-data-table.d.ts.map +1 -1
  48. package/dist/components/admin-filters/filter-toolbar.d.ts.map +1 -1
  49. package/dist/components/date-input/date-input.d.ts +27 -0
  50. package/dist/components/date-input/date-input.d.ts.map +1 -0
  51. package/dist/components/date-input/index.d.ts +4 -0
  52. package/dist/components/date-input/index.d.ts.map +1 -0
  53. package/dist/components/date-input/value.d.ts +9 -0
  54. package/dist/components/date-input/value.d.ts.map +1 -0
  55. package/dist/components/doc-layout/doc-sidebar.d.ts +4 -1
  56. package/dist/components/doc-layout/doc-sidebar.d.ts.map +1 -1
  57. package/dist/components/doc-layout/index.js +6 -0
  58. package/dist/components/doc-layout/index.js.map +1 -0
  59. package/dist/components/editor/editor.d.ts.map +1 -1
  60. package/dist/components/editor/icons/index.d.ts +32 -40
  61. package/dist/components/editor/icons/index.d.ts.map +1 -1
  62. package/dist/components/editor/index.js +3 -1
  63. package/dist/components/error-boundary/error-boundary.d.ts.map +1 -1
  64. package/dist/components/index.css +4 -0
  65. package/dist/components/index.css.map +1 -1
  66. package/dist/components/index.d.ts +4 -4
  67. package/dist/components/index.d.ts.map +1 -1
  68. package/dist/components/index.js +18 -8
  69. package/dist/components/knowledge-graph/edge-labels.d.ts +14 -0
  70. package/dist/components/knowledge-graph/edge-labels.d.ts.map +1 -0
  71. package/dist/components/knowledge-graph/graph.d.ts +56 -0
  72. package/dist/components/knowledge-graph/graph.d.ts.map +1 -0
  73. package/dist/components/knowledge-graph/index.css +176 -0
  74. package/dist/components/knowledge-graph/index.css.map +1 -0
  75. package/dist/components/knowledge-graph/index.d.ts +3 -0
  76. package/dist/components/knowledge-graph/index.d.ts.map +1 -0
  77. package/dist/components/knowledge-graph/index.js +795 -0
  78. package/dist/components/knowledge-graph/index.js.map +1 -0
  79. package/dist/components/knowledge-graph/label-layout.d.ts +28 -0
  80. package/dist/components/knowledge-graph/label-layout.d.ts.map +1 -0
  81. package/dist/components/knowledge-graph/label-store.d.ts +15 -0
  82. package/dist/components/knowledge-graph/label-store.d.ts.map +1 -0
  83. package/dist/components/knowledge-graph/model.d.ts +92 -0
  84. package/dist/components/knowledge-graph/model.d.ts.map +1 -0
  85. package/dist/components/lightbox/lightbox.d.ts.map +1 -1
  86. package/dist/components/map/Map.d.ts +19 -43
  87. package/dist/components/map/Map.d.ts.map +1 -1
  88. package/dist/components/map/MapCoverageLayer.d.ts +1 -1
  89. package/dist/components/map/MapCoverageLayer.d.ts.map +1 -1
  90. package/dist/components/map/MapMarker.d.ts +1 -1
  91. package/dist/components/map/MapMarker.d.ts.map +1 -1
  92. package/dist/components/map/MapPlaceSearch.d.ts +33 -0
  93. package/dist/components/map/MapPlaceSearch.d.ts.map +1 -0
  94. package/dist/components/map/MapPointPicker.d.ts +21 -12
  95. package/dist/components/map/MapPointPicker.d.ts.map +1 -1
  96. package/dist/components/map/coordinates.d.ts +10 -0
  97. package/dist/components/map/coordinates.d.ts.map +1 -0
  98. package/dist/components/map/index.css +4 -0
  99. package/dist/components/map/index.css.map +1 -0
  100. package/dist/components/map/index.d.ts +7 -2
  101. package/dist/components/map/index.d.ts.map +1 -1
  102. package/dist/components/map/index.js +3 -0
  103. package/dist/components/map/index.js.map +1 -0
  104. package/dist/components/nav-card/nav-card.d.ts.map +1 -1
  105. package/dist/components/rail/rail.d.ts.map +1 -1
  106. package/dist/components/research/diagram-image.d.ts +11 -0
  107. package/dist/components/research/diagram-image.d.ts.map +1 -0
  108. package/dist/components/research/diagram.d.ts +8 -0
  109. package/dist/components/research/diagram.d.ts.map +1 -0
  110. package/dist/components/research/document.d.ts +33 -0
  111. package/dist/components/research/document.d.ts.map +1 -0
  112. package/dist/components/research/frontmatter.d.ts +15 -0
  113. package/dist/components/research/frontmatter.d.ts.map +1 -0
  114. package/dist/components/research/index.css +51 -0
  115. package/dist/components/research/index.css.map +1 -0
  116. package/dist/components/research/index.d.ts +3 -0
  117. package/dist/components/research/index.d.ts.map +1 -0
  118. package/dist/components/research/index.js +6 -0
  119. package/dist/components/research/index.js.map +1 -0
  120. package/dist/components/research/parse.d.ts +29 -0
  121. package/dist/components/research/parse.d.ts.map +1 -0
  122. package/dist/components/research-editor/block-commands.d.ts +20 -0
  123. package/dist/components/research-editor/block-commands.d.ts.map +1 -0
  124. package/dist/components/research-editor/block-controls.d.ts +13 -0
  125. package/dist/components/research-editor/block-controls.d.ts.map +1 -0
  126. package/dist/components/research-editor/editor.d.ts +75 -0
  127. package/dist/components/research-editor/editor.d.ts.map +1 -0
  128. package/dist/components/research-editor/extensions.d.ts +14 -0
  129. package/dist/components/research-editor/extensions.d.ts.map +1 -0
  130. package/dist/components/research-editor/index.css +332 -0
  131. package/dist/components/research-editor/index.css.map +1 -0
  132. package/dist/components/research-editor/index.d.ts +5 -0
  133. package/dist/components/research-editor/index.d.ts.map +1 -0
  134. package/dist/components/research-editor/index.js +1592 -0
  135. package/dist/components/research-editor/index.js.map +1 -0
  136. package/dist/components/research-editor/math-input.d.ts +32 -0
  137. package/dist/components/research-editor/math-input.d.ts.map +1 -0
  138. package/dist/components/research-editor/math-markup.d.ts +4 -0
  139. package/dist/components/research-editor/math-markup.d.ts.map +1 -0
  140. package/dist/components/research-editor/math-navigation.d.ts +6 -0
  141. package/dist/components/research-editor/math-navigation.d.ts.map +1 -0
  142. package/dist/components/research-editor/math-node.d.ts +11 -0
  143. package/dist/components/research-editor/math-node.d.ts.map +1 -0
  144. package/dist/components/research-editor/source.d.ts +19 -0
  145. package/dist/components/research-editor/source.d.ts.map +1 -0
  146. package/dist/components/scrollbar/scrollbar.d.ts +4 -2
  147. package/dist/components/scrollbar/scrollbar.d.ts.map +1 -1
  148. package/dist/components/search-input/search-input.d.ts +0 -10
  149. package/dist/components/search-input/search-input.d.ts.map +1 -1
  150. package/dist/components/tiptap-renderer/tiptap-renderer.d.ts +4 -3
  151. package/dist/components/tiptap-renderer/tiptap-renderer.d.ts.map +1 -1
  152. package/dist/core/index.d.ts +1 -1
  153. package/dist/core/index.d.ts.map +1 -1
  154. package/dist/core/index.js +8 -4
  155. package/dist/core/provider.d.ts +7 -2
  156. package/dist/core/provider.d.ts.map +1 -1
  157. package/dist/forms/schema-provider.d.ts +3 -3
  158. package/dist/forms/schema-utils.d.ts +3 -3
  159. package/dist/hooks/index.js +9 -5
  160. package/dist/icons/context.d.ts +17 -0
  161. package/dist/icons/context.d.ts.map +1 -0
  162. package/dist/icons/controls.d.ts +51 -0
  163. package/dist/icons/controls.d.ts.map +1 -0
  164. package/dist/icons/index.d.ts +3 -0
  165. package/dist/icons/index.d.ts.map +1 -0
  166. package/dist/icons/index.js +4 -0
  167. package/dist/icons/index.js.map +1 -0
  168. package/dist/icons/theme.d.ts +4 -0
  169. package/dist/icons/theme.d.ts.map +1 -0
  170. package/dist/index.css +4 -0
  171. package/dist/index.css.map +1 -1
  172. package/dist/index.js +24 -13
  173. package/dist/index.js.map +1 -1
  174. package/dist/layouts/core/header-section.d.ts.map +1 -1
  175. package/dist/layouts/dashboard/labels.d.ts +12 -0
  176. package/dist/layouts/dashboard/labels.d.ts.map +1 -0
  177. package/dist/layouts/dashboard/layout.d.ts +7 -1
  178. package/dist/layouts/dashboard/layout.d.ts.map +1 -1
  179. package/dist/layouts/dashboard/sidenav.d.ts +7 -3
  180. package/dist/layouts/dashboard/sidenav.d.ts.map +1 -1
  181. package/dist/layouts/index.d.ts +5 -0
  182. package/dist/layouts/index.d.ts.map +1 -1
  183. package/dist/layouts/index.js +6 -1
  184. package/dist/layouts/panel-layout.d.ts +35 -0
  185. package/dist/layouts/panel-layout.d.ts.map +1 -0
  186. package/dist/layouts/sidebar-toggle.d.ts +11 -0
  187. package/dist/layouts/sidebar-toggle.d.ts.map +1 -0
  188. package/dist/state/stores/auth.d.ts +4 -16
  189. package/dist/state/stores/auth.d.ts.map +1 -1
  190. package/dist/state/stores/ui.d.ts +7 -105
  191. package/dist/state/stores/ui.d.ts.map +1 -1
  192. package/dist/theme/components/Button.d.ts.map +1 -1
  193. package/dist/theme/components/FormControls.d.ts +3 -12
  194. package/dist/theme/components/FormControls.d.ts.map +1 -1
  195. package/dist/theme/components/index.d.ts.map +1 -1
  196. package/dist/theme/create-theme.d.ts +5 -17
  197. package/dist/theme/create-theme.d.ts.map +1 -1
  198. package/dist/theme/index.js +6 -2
  199. package/dist/theme/mixins.d.ts +3 -1
  200. package/dist/theme/mixins.d.ts.map +1 -1
  201. package/dist/theme/palette/overrides.d.ts +23 -0
  202. package/dist/theme/palette/overrides.d.ts.map +1 -0
  203. package/dist/ui/index.d.ts +18 -0
  204. package/dist/ui/index.d.ts.map +1 -0
  205. package/dist/ui/index.js +148 -0
  206. package/dist/ui/index.js.map +1 -0
  207. package/package.json +92 -45
  208. package/dist/chunk-6AHI4GSV.js.map +0 -1
  209. package/dist/chunk-BZOL7GMU.js.map +0 -1
  210. package/dist/chunk-OBJ244BO.js.map +0 -1
  211. package/dist/chunk-WFD54GQQ.js.map +0 -1
  212. package/dist/chunk-YQW43BDH.js.map +0 -1
  213. package/dist/chunk-Z5OSPAOC.js.map +0 -1
  214. package/dist/chunk-ZTATTUH7.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/blocks/dashboard-block/dashboard-block.tsx","../../src/blocks/dashboard-block/use-dashboard-block.ts","../../src/blocks/auth-block/auth-block.tsx","../../src/blocks/auth-block/guards.tsx","../../src/blocks/data-grid-block/data-grid-block.tsx"],"names":["Box","Typography","IconButton","Button","useCallback","useMemo","jsxs","jsx","useState","Fragment","Divider","useEffect","createContext","useContext","useRef","EmptyState","ErrorState","Paper"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Dashboard Block Component\n *\n * Reusable dashboard widget/card block with header, content, and footer slots.\n * Supports loading, error states, and collapsible behavior.\n *\n * @module blocks/dashboard-block\n */\n\n'use client';\n\nimport { type ReactNode, createContext, useContext, useMemo, useCallback } from 'react';\nimport Box from '@mui/material/Box';\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\nimport IconButton from '@mui/material/IconButton';\nimport Collapse from '@mui/material/Collapse';\nimport Divider from '@mui/material/Divider';\nimport Skeleton from '@mui/material/Skeleton';\nimport Button from '@mui/material/Button';\nimport { useBoolean } from '../../core/hooks/use-boolean.js';\nimport { ErrorBoundary } from '../../components/error-boundary/index.js';\nimport { EmptyContent } from '../../components/empty-content/index.js';\nimport type {\n DashboardBlockProps,\n DashboardBlockContextValue,\n DashboardBlockHeaderProps,\n DashboardBlockContentProps,\n DashboardBlockFooterProps,\n DashboardBlockLabels,\n EmptyConfig,\n} from './types.js';\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\n/** Stable no-op for non-collapsible blocks */\nconst collapseNoop = () => {};\n\n/** Stable default: no translated strings, the block's English fallbacks apply */\nconst NO_LABELS: DashboardBlockLabels = {};\n\nconst DashboardBlockContext = createContext<DashboardBlockContextValue | null>(null);\n\n/**\n * Hook to access dashboard block context.\n */\nexport function useDashboardBlockContext(): DashboardBlockContextValue {\n const context = useContext(DashboardBlockContext);\n if (!context) {\n throw new Error('useDashboardBlockContext must be used within DashboardBlock');\n }\n return context;\n}\n\n// =============================================================================\n// SIZE CONFIGS\n// =============================================================================\n\nconst sizeConfig = {\n small: {\n headerPx: 2,\n headerPy: 1.5,\n contentPx: 2,\n contentPy: 1.5,\n titleVariant: 'subtitle1' as const,\n subtitleVariant: 'caption' as const,\n },\n medium: {\n headerPx: 2.5,\n headerPy: 2,\n contentPx: 2.5,\n contentPy: 2,\n titleVariant: 'h6' as const,\n subtitleVariant: 'body2' as const,\n },\n large: {\n headerPx: 3,\n headerPy: 2.5,\n contentPx: 3,\n contentPy: 2.5,\n titleVariant: 'h5' as const,\n subtitleVariant: 'body1' as const,\n },\n};\n\n// =============================================================================\n// SUB-COMPONENTS\n// =============================================================================\n\n/**\n * Dashboard block header component.\n */\nexport function DashboardBlockHeader({ title, subtitle, icon, actions, sx }: DashboardBlockHeaderProps): ReactNode {\n const { collapsed, toggleCollapse, variant, size, labels } = useDashboardBlockContext();\n const config = sizeConfig[size];\n\n return (\n <Box\n data-testid=\"prism-dashboard-block-header\"\n sx={[\n {\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 2,\n px: config.headerPx,\n py: config.headerPy,\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n >\n <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 1.5, flex: 1, minWidth: 0 }}>\n {icon && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n mt: 0.25,\n color: 'primary.main',\n }}\n >\n {icon}\n </Box>\n )}\n <Box sx={{ flex: 1, minWidth: 0 }}>\n {/*\n * Two lines, then an ellipsis — not one. On a phone the header\n * shares its row with the block's actions, and «Лента сообществ»\n * beside «Вся лента →» was cut to «Лента сообще…» with the second\n * line empty below it.\n */}\n <Typography\n variant={config.titleVariant}\n component=\"h3\"\n sx={{\n fontWeight: 600,\n lineHeight: 1.4,\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: 2,\n overflow: 'hidden',\n overflowWrap: 'anywhere',\n }}\n >\n {title}\n </Typography>\n {subtitle && (\n <Typography\n variant={config.subtitleVariant}\n sx={{\n color: \"text.secondary\",\n mt: 0.25\n }}>\n {subtitle}\n </Typography>\n )}\n </Box>\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5, flexShrink: 0 }}>\n {actions}\n {collapsed !== undefined && (\n <IconButton\n size=\"small\"\n onClick={toggleCollapse}\n aria-expanded={!collapsed}\n aria-label={collapsed ? (labels.expand ?? 'Expand block') : (labels.collapse ?? 'Collapse block')}\n data-testid=\"prism-dashboard-block-collapse\"\n >\n <ChevronIcon direction={collapsed ? 'down' : 'up'} />\n </IconButton>\n )}\n </Box>\n </Box>\n );\n}\n\n/**\n * Dashboard block content component.\n */\nexport function DashboardBlockContent({ children, disablePadding = false, sx }: DashboardBlockContentProps): ReactNode {\n const { collapsed, loading, error, size } = useDashboardBlockContext();\n const config = sizeConfig[size];\n\n return (\n <Collapse in={!collapsed} timeout=\"auto\">\n <Box\n data-testid=\"prism-dashboard-block-content\"\n sx={[\n {\n ...(!disablePadding && {\n px: config.contentPx,\n py: config.contentPy,\n }),\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n >\n {children}\n </Box>\n </Collapse>\n );\n}\n\n/**\n * Dashboard block footer component.\n */\nexport function DashboardBlockFooter({ children, divider = true, sx }: DashboardBlockFooterProps): ReactNode {\n const { collapsed, size } = useDashboardBlockContext();\n const config = sizeConfig[size];\n\n if (collapsed) return null;\n\n return (\n <>\n {divider && <Divider />}\n <Box\n data-testid=\"prism-dashboard-block-footer\"\n sx={[\n {\n px: config.contentPx,\n py: 1.5,\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n >\n {children}\n </Box>\n </>\n );\n}\n\n// =============================================================================\n// LOADING & ERROR STATES\n// =============================================================================\n\ninterface LoadingStateProps {\n rows?: number;\n size: 'small' | 'medium' | 'large';\n}\n\nfunction LoadingState({ rows = 3, size }: LoadingStateProps): ReactNode {\n const config = sizeConfig[size];\n return (\n <Box sx={{ px: config.contentPx, py: config.contentPy }}>\n {Array.from({ length: rows }).map((_, i) => (\n <Skeleton key={i} variant=\"text\" animation=\"wave\" sx={{ height: 20, mb: 1 }} />\n ))}\n </Box>\n );\n}\n\ninterface ErrorStateProps {\n message?: string | undefined;\n retryLabel?: string | undefined;\n onRetry?: (() => void) | undefined;\n size: 'small' | 'medium' | 'large';\n}\n\nfunction ErrorState({ message = 'Failed to load data', retryLabel = 'Retry', onRetry, size }: ErrorStateProps): ReactNode {\n const config = sizeConfig[size];\n return (\n <Box\n sx={{\n px: config.contentPx,\n py: config.contentPy,\n textAlign: 'center',\n }}\n >\n <Typography color=\"error\" variant=\"body2\" sx={{ mb: onRetry ? 1.5 : 0 }}>\n {message}\n </Typography>\n {onRetry && (\n <Button size=\"small\" onClick={onRetry}>\n {retryLabel}\n </Button>\n )}\n </Box>\n );\n}\n\ninterface EmptyStateProps {\n config: EmptyConfig | undefined;\n size: 'small' | 'medium' | 'large';\n}\n\nfunction EmptyState({ config, size }: EmptyStateProps): ReactNode {\n const pad = sizeConfig[size];\n if (config?.emptyComponent) return config.emptyComponent;\n return (\n <Box data-testid=\"prism-dashboard-block-empty\" sx={{ px: pad.contentPx, py: pad.contentPy }}>\n {/*\n * `compact`: a block is always a card. Without it EmptyContent centres\n * itself in the VIEWPORT (`minHeight: calc(100vh - 240px)`, `flex: 1`),\n * and every empty module on the portal's home page stood about 400 px\n * tall — the page came out 4060 px at 1440×1000, most of it nothing.\n */}\n <EmptyContent\n compact\n icon={config?.icon}\n iconSize={48}\n title={config?.title}\n description={config?.description}\n action={config?.action}\n />\n </Box>\n );\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * Dashboard Block - Reusable dashboard widget/card.\n *\n * Features:\n * - Header with title, subtitle, icon, and actions\n * - Content area with optional padding\n * - Footer slot with optional divider\n * - Loading and error states\n * - Collapsible behavior (controlled or uncontrolled)\n * - Three size presets (small, medium, large)\n * - Three variants (default, outlined, filled)\n *\n * @example\n * ```tsx\n * <DashboardBlock\n * title=\"Revenue Overview\"\n * subtitle=\"Last 30 days\"\n * icon={<BarChartIcon />}\n * actions={<IconButton><MoreIcon /></IconButton>}\n * collapsible\n * >\n * <RevenueChart />\n * </DashboardBlock>\n * ```\n */\nexport function DashboardBlock({\n title,\n subtitle,\n icon,\n actions,\n children,\n footer,\n variant = 'default',\n size = 'medium',\n loading = false,\n loadingConfig,\n error = false,\n errorConfig,\n empty = false,\n emptyConfig,\n labels = NO_LABELS,\n catchErrors = true,\n collapsible = false,\n defaultCollapsed = false,\n collapsed: controlledCollapsed,\n onCollapseChange,\n disablePadding = false,\n footerDivider = true,\n sx,\n slotProps,\n}: DashboardBlockProps): ReactNode {\n // Collapse state (controlled or uncontrolled)\n const uncontrolledCollapse = useBoolean(defaultCollapsed);\n const isControlled = controlledCollapsed !== undefined;\n const collapsed = isControlled ? controlledCollapsed : uncontrolledCollapse.value;\n\n const handleToggleCollapse = useCallback(() => {\n if (isControlled) {\n onCollapseChange?.(!controlledCollapsed);\n } else {\n uncontrolledCollapse.onToggle();\n }\n }, [isControlled, controlledCollapsed, onCollapseChange, uncontrolledCollapse]);\n\n const handleSetCollapsed = useCallback(\n (value: boolean) => {\n if (isControlled) {\n onCollapseChange?.(value);\n } else {\n uncontrolledCollapse.setValue(value);\n }\n },\n [isControlled, onCollapseChange, uncontrolledCollapse]\n );\n\n // Context value\n const contextValue = useMemo<DashboardBlockContextValue>(\n () => ({\n collapsed: collapsible ? collapsed : false,\n toggleCollapse: collapsible ? handleToggleCollapse : collapseNoop,\n setCollapsed: collapsible ? handleSetCollapsed : collapseNoop,\n loading,\n error,\n variant,\n size,\n labels,\n }),\n [collapsed, collapsible, handleToggleCollapse, handleSetCollapsed, loading, error, variant, size, labels]\n );\n\n const errorMessage = errorConfig?.message ?? labels.error;\n // Loading, then error, then empty, then the content — an error is never\n // drawn as «nothing here».\n const body = loading ? (\n (loadingConfig?.loadingComponent ?? <LoadingState rows={loadingConfig?.skeletonRows ?? 3} size={size} />)\n ) : error ? (\n (errorConfig?.errorComponent ?? (\n <ErrorState message={errorMessage} retryLabel={labels.retry} onRetry={errorConfig?.onRetry} size={size} />\n ))\n ) : empty ? (\n <EmptyState config={emptyConfig} size={size} />\n ) : children ? (\n <DashboardBlockContent disablePadding={disablePadding} {...slotProps?.content}>\n {children}\n </DashboardBlockContent>\n ) : null;\n\n // Paper variant based on block variant\n const paperVariant = variant === 'outlined' ? 'outlined' : 'elevation';\n const paperElevation = variant === 'default' ? 1 : 0;\n\n return (\n <DashboardBlockContext.Provider value={contextValue}>\n <Paper\n data-testid=\"prism-dashboard-block\"\n variant={paperVariant}\n elevation={paperElevation}\n sx={[\n {\n overflow: 'hidden',\n ...(variant === 'filled' && {\n bgcolor: 'action.hover',\n }),\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n >\n {/* Header */}\n {title && (\n <DashboardBlockHeader\n title={title}\n subtitle={subtitle}\n icon={icon}\n actions={actions}\n {...slotProps?.header}\n />\n )}\n\n {/* Divider after header */}\n {title && <Divider />}\n\n {/* Content */}\n <Box aria-live=\"polite\" aria-busy={loading}>\n {catchErrors ? (\n <ErrorBoundary\n resetKeys={[loading, error, empty]}\n fallback={({ resetErrorBoundary }) => (\n <ErrorState\n message={labels.error}\n retryLabel={labels.retry}\n onRetry={() => {\n resetErrorBoundary();\n errorConfig?.onRetry?.();\n }}\n size={size}\n />\n )}\n >\n {body}\n </ErrorBoundary>\n ) : (\n body\n )}\n </Box>\n\n {/* Footer */}\n {footer && !loading && !error && (\n <DashboardBlockFooter divider={footerDivider} {...slotProps?.footer}>\n {footer}\n </DashboardBlockFooter>\n )}\n </Paper>\n </DashboardBlockContext.Provider>\n );\n}\n\n// =============================================================================\n// CHEVRON ICON\n// =============================================================================\n\ninterface ChevronIconProps {\n direction: 'up' | 'down';\n}\n\nfunction ChevronIcon({ direction }: ChevronIconProps): ReactNode {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n style={{\n transform: direction === 'up' ? 'rotate(180deg)' : undefined,\n transition: 'transform 0.2s ease',\n }}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n","/**\n * Dashboard Block Hook\n *\n * Hook for managing dashboard block state and behavior.\n *\n * @module blocks/dashboard-block/use-dashboard-block\n */\n\n'use client';\n\nimport { useState, useCallback, useMemo } from 'react';\nimport type { DashboardBlockProps } from './types.js';\n\n/**\n * Dashboard block state.\n */\nexport interface DashboardBlockState {\n /** Current collapsed state */\n collapsed: boolean;\n /** Current loading state */\n loading: boolean;\n /** Current error state */\n error: boolean;\n /** Error message */\n errorMessage?: string;\n}\n\n/**\n * Dashboard block actions.\n */\nexport interface DashboardBlockActions {\n /** Toggle collapse state */\n toggleCollapse: () => void;\n /** Set collapsed state */\n setCollapsed: (collapsed: boolean) => void;\n /** Expand block */\n expand: () => void;\n /** Collapse block */\n collapse: () => void;\n /** Set loading state */\n setLoading: (loading: boolean) => void;\n /** Set error state */\n setError: (error: boolean, message?: string) => void;\n /** Clear error state */\n clearError: () => void;\n /** Reset to initial state */\n reset: () => void;\n}\n\n/**\n * Dashboard block hook return value.\n */\nexport interface UseDashboardBlockReturn {\n /** Current state */\n state: DashboardBlockState;\n /** Actions to modify state */\n actions: DashboardBlockActions;\n /** Props to spread on DashboardBlock */\n blockProps: Pick<DashboardBlockProps, 'collapsed' | 'onCollapseChange' | 'loading' | 'error' | 'errorConfig'>;\n}\n\n/**\n * Options for useDashboardBlock hook.\n */\nexport interface UseDashboardBlockOptions {\n /** Initial collapsed state */\n defaultCollapsed?: boolean;\n /** Initial loading state */\n defaultLoading?: boolean;\n /** Retry callback for error state */\n onRetry?: () => void;\n}\n\n/**\n * Hook for managing dashboard block state.\n *\n * Provides controlled state management for DashboardBlock component,\n * including collapse, loading, and error states.\n *\n * @example\n * ```tsx\n * function MyWidget() {\n * const { state, actions, blockProps } = useDashboardBlock({\n * defaultCollapsed: false,\n * onRetry: () => fetchData(),\n * });\n *\n * useEffect(() => {\n * actions.setLoading(true);\n * fetchData()\n * .then(() => actions.setLoading(false))\n * .catch((err) => actions.setError(true, err.message));\n * }, []);\n *\n * return (\n * <DashboardBlock title=\"My Widget\" {...blockProps}>\n * <Content />\n * </DashboardBlock>\n * );\n * }\n * ```\n */\nexport function useDashboardBlock(options: UseDashboardBlockOptions = {}): UseDashboardBlockReturn {\n const { defaultCollapsed = false, defaultLoading = false, onRetry } = options;\n\n const [state, setState] = useState<DashboardBlockState>({\n collapsed: defaultCollapsed,\n loading: defaultLoading,\n error: false,\n errorMessage: undefined,\n });\n\n const toggleCollapse = useCallback(() => {\n setState((prev) => ({ ...prev, collapsed: !prev.collapsed }));\n }, []);\n\n const setCollapsed = useCallback((collapsed: boolean) => {\n setState((prev) => ({ ...prev, collapsed }));\n }, []);\n\n const expand = useCallback(() => {\n setState((prev) => ({ ...prev, collapsed: false }));\n }, []);\n\n const collapse = useCallback(() => {\n setState((prev) => ({ ...prev, collapsed: true }));\n }, []);\n\n const setLoading = useCallback((loading: boolean) => {\n setState((prev) => ({ ...prev, loading }));\n }, []);\n\n const setError = useCallback((error: boolean, errorMessage?: string) => {\n setState((prev) => ({ ...prev, error, errorMessage, loading: false }));\n }, []);\n\n const clearError = useCallback(() => {\n setState((prev) => ({ ...prev, error: false, errorMessage: undefined }));\n }, []);\n\n const reset = useCallback(() => {\n setState({\n collapsed: defaultCollapsed,\n loading: defaultLoading,\n error: false,\n errorMessage: undefined,\n });\n }, [defaultCollapsed, defaultLoading]);\n\n const actions = useMemo<DashboardBlockActions>(\n () => ({\n toggleCollapse,\n setCollapsed,\n expand,\n collapse,\n setLoading,\n setError,\n clearError,\n reset,\n }),\n [toggleCollapse, setCollapsed, expand, collapse, setLoading, setError, clearError, reset]\n );\n\n const blockProps = useMemo(\n () => ({\n collapsed: state.collapsed,\n onCollapseChange: setCollapsed,\n loading: state.loading,\n error: state.error,\n errorConfig: state.error\n ? {\n message: state.errorMessage,\n onRetry,\n }\n : undefined,\n }),\n [state.collapsed, state.loading, state.error, state.errorMessage, setCollapsed, onRetry]\n );\n\n return {\n state,\n actions,\n blockProps,\n };\n}\n","'use client';\n\n/**\n * Auth Block Component\n *\n * Reusable authentication forms: login, register, forgot password, etc.\n * Integrates with React Hook Form and Zod for validation.\n *\n * @module blocks/auth-block\n */\n\nimport type { ReactNode } from 'react';\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useForm, FormProvider, type Resolver } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\nimport Link from '@mui/material/Link';\nimport Divider from '@mui/material/Divider';\nimport Alert from '@mui/material/Alert';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport IconButton from '@mui/material/IconButton';\nimport { Field } from '../../components/field/index.js';\nimport type {\n LoginFormProps,\n LoginFormData,\n RegisterFormProps,\n RegisterFormData,\n ForgotPasswordFormProps,\n ForgotPasswordFormData,\n ResetPasswordFormProps,\n ResetPasswordFormData,\n VerifyCodeFormProps,\n VerifyCodeFormData,\n} from './types.js';\n\n// =============================================================================\n// ICONS (inline SVG to avoid dependencies)\n// =============================================================================\n\nfunction EyeIcon(): ReactNode {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nfunction EyeOffIcon(): ReactNode {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n );\n}\n\n// =============================================================================\n// ERROR SANITIZATION\n// =============================================================================\n\n/**\n * Patterns that indicate a server-internal error message that should not\n * be shown to the user (e.g., stack traces, connection strings, file paths).\n *\n * The last group matches a leaked secret *value*, not the words that name one.\n * Matching the words themselves cost more than it bought: measured against the\n * 50 authentication messages the downstream and Omnitron auth services actually\n * throw, `/password|secret|token|key/i` replaced 20 of them with the generic\n * fallback — including every password-policy rule (\"Password must contain at\n * least 2 digits\") and every expiry notice (\"Refresh token expired\"), which\n * are precisely the messages the user needs in order to succeed on the next\n * attempt. The patterns below flag 0 of those 50 and still catch all of:\n * `password=hunter2`, `postgres://user:pw@host`, a JWT, a bearer header, a\n * vendor-prefixed API key, a raw hex or base64 blob, and `JWT_SECRET`.\n */\nconst UNSAFE_ERROR_PATTERNS = [\n /at\\s+\\w+\\s*\\(/i, // stack trace frames\n /\\b(ECONNREFUSED|ETIMEDOUT|ENOTFOUND)\\b/, // Node.js system errors\n /\\b(SELECT|INSERT|UPDATE|DELETE)\\b.*\\bFROM\\b/i, // SQL fragments\n /\\/[a-z_-]+\\/[a-z_-]+\\//i, // Unix file paths\n /[A-Z]:\\\\[^\\s]+/, // Windows file paths\n\n // A secret assigned to a name — `password=hunter2`, `token: eyJ...`. The\n // value must carry a digit or symbol, which is what separates a credential\n // from the English word that follows a colon in \"Password: too short\".\n /\\b(password|passwd|pwd|secret|token|api[-_]?key|private[-_]?key|credentials?)\\b\\s*[:=]\\s*[\"']?(?=[^\\s\"']{6,})[A-Za-z]*[0-9+/=_\\-.]/i,\n /\\b[a-z][a-z0-9+.-]*:\\/\\/[^\\s/@]*:[^\\s/@]+@/i, // credentials inside a connection URL\n /\\bbearer\\s+\\S{8,}/i, // Authorization header\n /\\beyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}/, // JWT\n /\\b(sk|pk|rk)[-_](live|test|ant|proj)[-_]\\w{8,}/i, // vendor-prefixed API keys\n /\\b[A-Fa-f0-9]{32,}\\b/, // raw hex blob — never meaningful to a reader\n /\\b[A-Za-z0-9+/]{40,}={0,2}\\b/, // raw base64 blob\n /\\b[A-Z][A-Z0-9]*_(SECRET|KEY|TOKEN|PASSWORD|PASSWD|CREDENTIALS?)\\b/, // server env var names\n];\n\nconst DEFAULT_AUTH_ERROR = 'An error occurred. Please try again.';\n\n/**\n * Sanitize error messages to prevent information disclosure.\n * Passes through safe, user-facing messages while replacing\n * server-internal details with a generic fallback.\n *\n * Exported for its own tests: the cost of this function getting it wrong is\n * silent — the user is shown a message that says nothing, and no log records\n * that a specific one was suppressed.\n */\nexport function sanitizeErrorMessage(err: unknown, fallback: string = DEFAULT_AUTH_ERROR): string {\n if (!(err instanceof Error)) return fallback;\n\n const message = err.message;\n\n // Reject messages that look like internal server errors\n for (const pattern of UNSAFE_ERROR_PATTERNS) {\n if (pattern.test(message)) return fallback;\n }\n\n // Reject overly long messages (likely stack traces or debug info)\n if (message.length > 200) return fallback;\n\n return message;\n}\n\n// =============================================================================\n// DEFAULT SCHEMAS\n// =============================================================================\n\nconst defaultLoginSchema = z.object({\n email: z.string().email('Please enter a valid email'),\n password: z.string().min(1, 'Password is required'),\n rememberMe: z.boolean().optional(),\n});\n\nconst createRegisterSchema = (minPasswordLength: number = 8, requireTerms: boolean = true) =>\n z\n .object({\n email: z.string().email('Please enter a valid email'),\n password: z.string().min(minPasswordLength, `Password must be at least ${minPasswordLength} characters`),\n confirmPassword: z.string(),\n firstName: z.string().optional(),\n lastName: z.string().optional(),\n acceptTerms: requireTerms\n ? z.boolean().refine((val) => val === true, { message: 'You must accept the terms' })\n : z.boolean().optional(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: 'Passwords do not match',\n path: ['confirmPassword'],\n });\n\nconst defaultForgotPasswordSchema = z.object({\n email: z.string().email('Please enter a valid email'),\n});\n\nconst createResetPasswordSchema = (minPasswordLength: number = 8) =>\n z\n .object({\n password: z.string().min(minPasswordLength, `Password must be at least ${minPasswordLength} characters`),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: 'Passwords do not match',\n path: ['confirmPassword'],\n });\n\nconst createVerifyCodeSchema = (codeLength: number = 6) =>\n z.object({\n code: z.string().length(codeLength, `Code must be ${codeLength} digits`),\n });\n\n// =============================================================================\n// LOGIN FORM\n// =============================================================================\n\n/**\n * Login form component with email/password authentication.\n *\n * @example\n * ```tsx\n * <LoginForm\n * onSubmit={async (data) => {\n * await signIn(data.email, data.password);\n * }}\n * showRememberMe\n * showForgotPassword\n * onForgotPassword={() => navigate('/forgot-password')}\n * />\n * ```\n */\nexport function LoginForm({\n onSubmit,\n loading = false,\n disabled = false,\n showRememberMe = true,\n showForgotPassword = true,\n onForgotPassword,\n showSocialLogin = false,\n socialProviders = [],\n schema,\n labels = {},\n sx,\n slotProps,\n}: LoginFormProps): ReactNode {\n const [showPassword, setShowPassword] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const methods = useForm<LoginFormData>({\n resolver: zodResolver(schema ?? (defaultLoginSchema as any)) as Resolver<LoginFormData>,\n defaultValues: {\n email: '',\n password: '',\n rememberMe: false,\n },\n });\n\n // `loading` is a prop, so a caller that does not track its own pending state\n // leaves every control enabled for the whole of an in-flight submit — two\n // clicks on \"Sign In\" send two logins, and this component is the one that\n // opened the async boundary. react-hook-form already knows its handler is\n // running; `busy` is the disjunction, so a caller that drives `loading`\n // keeps control and one that does not still gets a form that locks itself.\n const busy = loading || methods.formState.isSubmitting;\n\n const handleSubmit = methods.handleSubmit(async (data: LoginFormData) => {\n setError(null);\n try {\n await onSubmit(data);\n } catch (err) {\n setError(sanitizeErrorMessage(err));\n }\n });\n\n return (\n <FormProvider {...methods}>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={[{ display: 'flex', flexDirection: 'column', gap: 2.5 }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...slotProps?.wrapper}\n >\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n <Field.Text\n name=\"email\"\n label={labels.email ?? 'Email'}\n type=\"email\"\n autoComplete=\"email\"\n disabled={disabled || busy}\n {...slotProps?.textField}\n />\n\n <Field.Text\n name=\"password\"\n label={labels.password ?? 'Password'}\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"current-password\"\n disabled={disabled || busy}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => setShowPassword(!showPassword)}\n edge=\"end\"\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n >\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n {...slotProps?.textField}\n />\n\n {(showRememberMe || showForgotPassword) && (\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n {showRememberMe && (\n <Field.Checkbox\n name=\"rememberMe\"\n label={labels.rememberMe ?? 'Remember me'}\n disabled={disabled || busy}\n />\n )}\n {showForgotPassword && (\n <Link\n component=\"button\"\n type=\"button\"\n variant=\"body2\"\n onClick={onForgotPassword}\n sx={{ textDecoration: 'none' }}\n >\n {labels.forgotPassword ?? 'Forgot password?'}\n </Link>\n )}\n </Box>\n )}\n\n <Button\n type=\"submit\"\n variant=\"contained\"\n size=\"large\"\n fullWidth\n disabled={disabled || busy}\n {...slotProps?.submitButton}\n >\n {busy ? <CircularProgress size={24} color=\"inherit\" /> : (labels.submit ?? 'Sign In')}\n </Button>\n\n {showSocialLogin && socialProviders.length > 0 && (\n <>\n <Divider>\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {labels.socialDivider ?? 'or continue with'}\n </Typography>\n </Divider>\n <Box sx={{ display: 'flex', gap: 1.5, justifyContent: 'center' }}>\n {socialProviders.map((provider) => (\n <IconButton\n key={provider.id}\n onClick={provider.onClick}\n disabled={disabled || busy}\n sx={{\n border: 1,\n borderColor: 'divider',\n borderRadius: 1,\n p: 1,\n }}\n aria-label={`Sign in with ${provider.name}`}\n >\n {provider.icon}\n </IconButton>\n ))}\n </Box>\n </>\n )}\n </Box>\n </FormProvider>\n );\n}\n\n// =============================================================================\n// REGISTER FORM\n// =============================================================================\n\n/**\n * Registration form component.\n *\n * @example\n * ```tsx\n * <RegisterForm\n * onSubmit={async (data) => {\n * await signUp(data);\n * }}\n * showNameFields\n * requireTerms\n * onTermsClick={() => window.open('/terms')}\n * />\n * ```\n */\nexport function RegisterForm({\n onSubmit,\n loading = false,\n disabled = false,\n showNameFields = false,\n requireTerms = true,\n onTermsClick,\n onPrivacyClick,\n minPasswordLength = 8,\n schema,\n labels = {},\n sx,\n slotProps,\n}: RegisterFormProps): ReactNode {\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const methods = useForm<RegisterFormData>({\n resolver: zodResolver(\n schema ?? (createRegisterSchema(minPasswordLength, requireTerms) as any)\n ) as Resolver<RegisterFormData>,\n defaultValues: {\n email: '',\n password: '',\n confirmPassword: '',\n firstName: '',\n lastName: '',\n acceptTerms: false,\n },\n });\n\n const busy = loading || methods.formState.isSubmitting;\n\n const handleSubmit = methods.handleSubmit(async (data: RegisterFormData) => {\n setError(null);\n try {\n await onSubmit(data);\n } catch (err) {\n setError(sanitizeErrorMessage(err));\n }\n });\n\n return (\n <FormProvider {...methods}>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={[{ display: 'flex', flexDirection: 'column', gap: 2.5 }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...slotProps?.wrapper}\n >\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n {showNameFields && (\n <Box sx={{ display: 'flex', gap: 2 }}>\n <Field.Text\n name=\"firstName\"\n label={labels.firstName ?? 'First Name'}\n autoComplete=\"given-name\"\n disabled={disabled || busy}\n {...slotProps?.textField}\n />\n <Field.Text\n name=\"lastName\"\n label={labels.lastName ?? 'Last Name'}\n autoComplete=\"family-name\"\n disabled={disabled || busy}\n {...slotProps?.textField}\n />\n </Box>\n )}\n\n <Field.Text\n name=\"email\"\n label={labels.email ?? 'Email'}\n type=\"email\"\n autoComplete=\"email\"\n disabled={disabled || busy}\n {...slotProps?.textField}\n />\n\n <Field.Text\n name=\"password\"\n label={labels.password ?? 'Password'}\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"new-password\"\n disabled={disabled || busy}\n helperText={`At least ${minPasswordLength} characters`}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => setShowPassword(!showPassword)}\n edge=\"end\"\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n >\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n {...slotProps?.textField}\n />\n\n <Field.Text\n name=\"confirmPassword\"\n label={labels.confirmPassword ?? 'Confirm Password'}\n type={showConfirmPassword ? 'text' : 'password'}\n autoComplete=\"new-password\"\n disabled={disabled || busy}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n edge=\"end\"\n aria-label={showConfirmPassword ? 'Hide password' : 'Show password'}\n >\n {showConfirmPassword ? <EyeOffIcon /> : <EyeIcon />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n {...slotProps?.textField}\n />\n\n {requireTerms && (\n <Field.Checkbox\n name=\"acceptTerms\"\n disabled={disabled || busy}\n label={\n <Typography variant=\"body2\" component=\"span\">\n {labels.acceptTerms ?? 'I agree to the '}\n <Link component=\"button\" type=\"button\" onClick={onTermsClick}>\n {labels.termsLink ?? 'Terms of Service'}\n </Link>\n {' and '}\n <Link component=\"button\" type=\"button\" onClick={onPrivacyClick}>\n {labels.privacyLink ?? 'Privacy Policy'}\n </Link>\n </Typography>\n }\n />\n )}\n\n <Button\n type=\"submit\"\n variant=\"contained\"\n size=\"large\"\n fullWidth\n disabled={disabled || busy}\n {...slotProps?.submitButton}\n >\n {busy ? <CircularProgress size={24} color=\"inherit\" /> : (labels.submit ?? 'Create Account')}\n </Button>\n </Box>\n </FormProvider>\n );\n}\n\n// =============================================================================\n// FORGOT PASSWORD FORM\n// =============================================================================\n\n/**\n * Forgot password form component.\n *\n * @example\n * ```tsx\n * <ForgotPasswordForm\n * onSubmit={async (data) => {\n * await sendPasswordResetEmail(data.email);\n * }}\n * onBackToLogin={() => navigate('/login')}\n * />\n * ```\n */\nexport function ForgotPasswordForm({\n onSubmit,\n loading = false,\n disabled = false,\n onBackToLogin,\n schema,\n labels = {},\n sx,\n slotProps,\n}: ForgotPasswordFormProps): ReactNode {\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n\n const methods = useForm<ForgotPasswordFormData>({\n resolver: zodResolver(schema ?? (defaultForgotPasswordSchema as any)) as Resolver<ForgotPasswordFormData>,\n defaultValues: {\n email: '',\n },\n });\n\n const busy = loading || methods.formState.isSubmitting;\n\n const handleSubmit = methods.handleSubmit(async (data: ForgotPasswordFormData) => {\n setError(null);\n try {\n await onSubmit(data);\n setSuccess(true);\n } catch (err) {\n setError(sanitizeErrorMessage(err));\n }\n });\n\n if (success) {\n return (\n <Box sx={{ textAlign: 'center' }}>\n <Typography variant=\"h6\" gutterBottom>\n Check your email\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.secondary\",\n mb: 3\n }}>\n We sent a password reset link to your email address.\n </Typography>\n {onBackToLogin && (\n <Button variant=\"text\" onClick={onBackToLogin}>\n {labels.backToLogin ?? 'Back to login'}\n </Button>\n )}\n </Box>\n );\n }\n\n return (\n <FormProvider {...methods}>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={[{ display: 'flex', flexDirection: 'column', gap: 2.5 }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...slotProps?.wrapper}\n >\n <Box sx={{ textAlign: 'center', mb: 1 }}>\n <Typography variant=\"h6\" gutterBottom>\n {labels.title ?? 'Forgot password?'}\n </Typography>\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {labels.description ?? \"Enter your email and we'll send you a reset link.\"}\n </Typography>\n </Box>\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n <Field.Text\n name=\"email\"\n label={labels.email ?? 'Email'}\n type=\"email\"\n autoComplete=\"email\"\n disabled={disabled || busy}\n {...slotProps?.textField}\n />\n\n <Button\n type=\"submit\"\n variant=\"contained\"\n size=\"large\"\n fullWidth\n disabled={disabled || busy}\n {...slotProps?.submitButton}\n >\n {busy ? <CircularProgress size={24} color=\"inherit\" /> : (labels.submit ?? 'Send Reset Link')}\n </Button>\n\n {onBackToLogin && (\n <Button variant=\"text\" onClick={onBackToLogin} disabled={loading}>\n {labels.backToLogin ?? 'Back to login'}\n </Button>\n )}\n </Box>\n </FormProvider>\n );\n}\n\n// =============================================================================\n// RESET PASSWORD FORM\n// =============================================================================\n\n/**\n * Reset password form component.\n *\n * @example\n * ```tsx\n * <ResetPasswordForm\n * onSubmit={async (data) => {\n * await resetPassword(token, data.password);\n * }}\n * />\n * ```\n */\nexport function ResetPasswordForm({\n onSubmit,\n loading = false,\n disabled = false,\n minPasswordLength = 8,\n schema,\n labels = {},\n sx,\n slotProps,\n}: ResetPasswordFormProps): ReactNode {\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const methods = useForm<ResetPasswordFormData>({\n resolver: zodResolver(\n schema ?? (createResetPasswordSchema(minPasswordLength) as any)\n ) as Resolver<ResetPasswordFormData>,\n defaultValues: {\n password: '',\n confirmPassword: '',\n },\n });\n\n const busy = loading || methods.formState.isSubmitting;\n\n const handleSubmit = methods.handleSubmit(async (data: ResetPasswordFormData) => {\n setError(null);\n try {\n await onSubmit(data);\n } catch (err) {\n setError(sanitizeErrorMessage(err));\n }\n });\n\n return (\n <FormProvider {...methods}>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={[{ display: 'flex', flexDirection: 'column', gap: 2.5 }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...slotProps?.wrapper}\n >\n <Box sx={{ textAlign: 'center', mb: 1 }}>\n <Typography variant=\"h6\" gutterBottom>\n {labels.title ?? 'Set new password'}\n </Typography>\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {labels.description ?? 'Create a new password for your account.'}\n </Typography>\n </Box>\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n <Field.Text\n name=\"password\"\n label={labels.password ?? 'New Password'}\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"new-password\"\n disabled={disabled || busy}\n helperText={`At least ${minPasswordLength} characters`}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => setShowPassword(!showPassword)}\n edge=\"end\"\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n >\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n {...slotProps?.textField}\n />\n\n <Field.Text\n name=\"confirmPassword\"\n label={labels.confirmPassword ?? 'Confirm Password'}\n type={showConfirmPassword ? 'text' : 'password'}\n autoComplete=\"new-password\"\n disabled={disabled || busy}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n edge=\"end\"\n aria-label={showConfirmPassword ? 'Hide password' : 'Show password'}\n >\n {showConfirmPassword ? <EyeOffIcon /> : <EyeIcon />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n {...slotProps?.textField}\n />\n\n <Button\n type=\"submit\"\n variant=\"contained\"\n size=\"large\"\n fullWidth\n disabled={disabled || busy}\n {...slotProps?.submitButton}\n >\n {busy ? <CircularProgress size={24} color=\"inherit\" /> : (labels.submit ?? 'Reset Password')}\n </Button>\n </Box>\n </FormProvider>\n );\n}\n\n// =============================================================================\n// VERIFY CODE FORM\n// =============================================================================\n\n/**\n * Verify code form component (OTP verification).\n *\n * @example\n * ```tsx\n * <VerifyCodeForm\n * onSubmit={async (data) => {\n * await verifyCode(data.code);\n * }}\n * onResendCode={async () => {\n * await resendVerificationCode();\n * }}\n * resendCooldown={60}\n * />\n * ```\n */\nexport function VerifyCodeForm({\n onSubmit,\n loading = false,\n disabled = false,\n codeLength = 6,\n onResendCode,\n resendCooldown = 60,\n schema,\n labels = {},\n sx,\n slotProps,\n}: VerifyCodeFormProps): ReactNode {\n const [error, setError] = useState<string | null>(null);\n const [cooldown, setCooldown] = useState(0);\n const [resending, setResending] = useState(false);\n const resendingRef = useRef(false);\n\n const methods = useForm<VerifyCodeFormData>({\n resolver: zodResolver(schema ?? (createVerifyCodeSchema(codeLength) as any)) as Resolver<VerifyCodeFormData>,\n defaultValues: {\n code: '',\n },\n });\n\n const busy = loading || methods.formState.isSubmitting;\n\n // Cooldown timer\n useEffect(() => {\n if (cooldown > 0) {\n const timer = setTimeout(() => setCooldown(cooldown - 1), 1000);\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [cooldown]);\n\n const handleResendCode = useCallback(async () => {\n // `cooldown` is set after the await, so it gates the caller that arrives\n // once the first request has returned — not the one that arrives while it\n // is still open. Two clicks a moment apart therefore both got through and\n // sent two codes, which on a rate-limited endpoint locks the user out of\n // the flow they are trying to finish. The ref is what closes that window:\n // `resending` state is committed a render too late to guard anything, and\n // exists only to disable the link.\n if (cooldown > 0 || resendingRef.current || !onResendCode) return;\n resendingRef.current = true;\n setResending(true);\n // A resend that fails and is then retried successfully used to leave the\n // failure on screen: the user reads \"Failed to resend code\" with the code\n // already in their inbox.\n setError(null);\n try {\n await onResendCode();\n setCooldown(resendCooldown);\n } catch (err) {\n setError(sanitizeErrorMessage(err, 'Failed to resend code'));\n } finally {\n resendingRef.current = false;\n setResending(false);\n }\n }, [cooldown, onResendCode, resendCooldown]);\n\n const handleSubmit = methods.handleSubmit(async (data: VerifyCodeFormData) => {\n setError(null);\n try {\n await onSubmit(data);\n } catch (err) {\n setError(sanitizeErrorMessage(err));\n }\n });\n\n return (\n <FormProvider {...methods}>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={[\n { display: 'flex', flexDirection: 'column', gap: 2.5, alignItems: 'center' },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...slotProps?.wrapper}\n >\n <Box sx={{ textAlign: 'center', mb: 1 }}>\n <Typography variant=\"h6\" gutterBottom>\n {labels.title ?? 'Enter verification code'}\n </Typography>\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {labels.description ?? 'We sent a verification code to your email.'}\n </Typography>\n </Box>\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)} sx={{ width: '100%' }}>\n {error}\n </Alert>\n )}\n\n <Field.Code name=\"code\" length={codeLength} autoFocus disabled={disabled || busy} />\n\n <Button\n type=\"submit\"\n variant=\"contained\"\n size=\"large\"\n fullWidth\n disabled={disabled || busy}\n {...slotProps?.submitButton}\n >\n {busy ? <CircularProgress size={24} color=\"inherit\" /> : (labels.submit ?? 'Verify')}\n </Button>\n\n {onResendCode && (\n <Box sx={{ textAlign: 'center' }}>\n {cooldown > 0 ? (\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {labels.resendIn ?? 'Resend code in'} {cooldown}s\n </Typography>\n ) : (\n <Link\n component=\"button\"\n type=\"button\"\n variant=\"body2\"\n onClick={handleResendCode}\n disabled={disabled || busy || resending}\n >\n {labels.resendCode ?? \"Didn't receive the code? Resend\"}\n </Link>\n )}\n </Box>\n )}\n </Box>\n </FormProvider>\n );\n}\n\n// =============================================================================\n// EXPORTS\n// =============================================================================\n\n/**\n * AuthBlock namespace for auth-related forms.\n */\nexport const AuthBlock = {\n Login: LoginForm,\n Register: RegisterForm,\n ForgotPassword: ForgotPasswordForm,\n ResetPassword: ResetPasswordForm,\n VerifyCode: VerifyCodeForm,\n} as const;\n","'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 (user must have ALL) */\n permissions?: Permission[];\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 requireEmailVerified = false,\n roleMatchStrategy = 'any',\n loadingComponent = null,\n onAccessDenied,\n accessDeniedComponent = null,\n}: RoleBasedGuardProps): ReactNode {\n const { isAuthenticated, isLoading, user } = useAuth();\n const [checked, setChecked] = useState(false);\n const [accessGranted, setAccessGranted] = useState(false);\n\n useEffect(() => {\n if (!isLoading) {\n // Check authentication\n if (!isAuthenticated || !user) {\n onAccessDenied?.('not_authenticated');\n setAccessGranted(false);\n setChecked(true);\n return;\n }\n\n // Check email verification\n if (requireEmailVerified && !user.emailVerified) {\n onAccessDenied?.('email_not_verified');\n setAccessGranted(false);\n setChecked(true);\n return;\n }\n\n // Check roles\n if (roles.length > 0) {\n const userRoles = user.roles ?? [];\n const hasRequiredRole =\n roleMatchStrategy === 'all'\n ? roles.every((role) => userRoles.includes(role))\n : roles.some((role) => userRoles.includes(role));\n\n if (!hasRequiredRole) {\n onAccessDenied?.('missing_role');\n setAccessGranted(false);\n setChecked(true);\n return;\n }\n }\n\n // Check permissions (always ALL)\n if (permissions.length > 0) {\n const userPermissions = user.permissions ?? [];\n const hasAllPermissions = permissions.every((perm) => userPermissions.includes(perm));\n\n if (!hasAllPermissions) {\n onAccessDenied?.('missing_permission');\n setAccessGranted(false);\n setChecked(true);\n return;\n }\n }\n\n // Access granted\n setAccessGranted(true);\n setChecked(true);\n }\n }, [isAuthenticated, isLoading, user, roles, permissions, requireEmailVerified, roleMatchStrategy, onAccessDenied]);\n\n if (isLoading || !checked) {\n return loadingComponent;\n }\n\n if (!accessGranted) {\n return accessDeniedComponent;\n }\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","/**\n * DataGrid Block Component\n *\n * Advanced data table block with toolbar, pagination, sorting, filtering,\n * row actions, and server-side data support.\n *\n * @module blocks/data-grid-block\n */\n\n'use client';\n\nimport {\n type ReactNode,\n type MouseEvent,\n createContext,\n useContext,\n useMemo,\n useState,\n useCallback,\n useRef,\n useEffect,\n} from 'react';\nimport Box from '@mui/material/Box';\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Divider from '@mui/material/Divider';\nimport Tooltip from '@mui/material/Tooltip';\nimport { SearchInput } from '../../components/search-input/search-input.js';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport {\n DataGrid,\n type GridColDef,\n type GridRenderCellParams,\n type GridPaginationModel,\n type GridSortModel,\n type GridFilterModel,\n type GridRowSelectionModel,\n type GridCallbackDetails,\n type GridDensity,\n type GridRowId,\n GridToolbarContainer,\n GridToolbarColumnsButton,\n GridToolbarDensitySelector,\n GridToolbarExport,\n} from '@mui/x-data-grid';\nimport type {\n DataGridBlockProps,\n DataGridBlockContextValue,\n DataGridRowAction,\n UseDataGridBlockOptions,\n UseDataGridBlockReturn,\n DataGridFetchParams,\n} from './types.js';\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst DataGridBlockContext = createContext<DataGridBlockContextValue | null>(null);\n\n/**\n * Hook to access data grid block context.\n */\nexport function useDataGridBlockContext(): DataGridBlockContextValue {\n const context = useContext(DataGridBlockContext);\n if (!context) {\n throw new Error('useDataGridBlockContext must be used within DataGridBlock');\n }\n return context;\n}\n\n// =============================================================================\n// ICONS\n// =============================================================================\n\nfunction MoreVertIcon(): ReactNode {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n </svg>\n );\n}\n\nfunction EmptyIcon(): ReactNode {\n return (\n <svg\n width=\"64\"\n height=\"64\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n style={{ opacity: 0.4 }}\n >\n <path d=\"M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z\" />\n <polyline points=\"13 2 13 9 20 9\" />\n <line x1=\"10\" y1=\"12\" x2=\"10\" y2=\"18\" />\n <line x1=\"14\" y1=\"12\" x2=\"14\" y2=\"18\" />\n <line x1=\"10\" y1=\"15\" x2=\"14\" y2=\"15\" />\n </svg>\n );\n}\n\n// =============================================================================\n// CUSTOM TOOLBAR\n// =============================================================================\n\ninterface CustomToolbarProps {\n quickFilter?: {\n enabled?: boolean;\n placeholder?: string;\n debounceMs?: number;\n };\n exportConfig?: {\n csv?: boolean;\n excel?: boolean;\n print?: boolean;\n };\n showColumnSelector?: boolean;\n showDensitySelector?: boolean;\n startContent?: ReactNode;\n endContent?: ReactNode;\n actions?: ReactNode;\n onQuickFilterChange?: (value: string) => void;\n}\n\nfunction CustomToolbar({\n quickFilter,\n exportConfig,\n showColumnSelector = true,\n showDensitySelector = true,\n startContent,\n endContent,\n actions,\n onQuickFilterChange,\n}: CustomToolbarProps): ReactNode {\n const [searchValue, setSearchValue] = useState('');\n const debounceRef = useRef<NodeJS.Timeout | null>(null);\n\n // Cleanup debounce timer on unmount\n useEffect(\n () => () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n },\n []\n );\n\n const handleSearchChange = useCallback(\n (value: string) => {\n setSearchValue(value);\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n debounceRef.current = setTimeout(() => {\n onQuickFilterChange?.(value);\n }, quickFilter?.debounceMs ?? 300);\n },\n [onQuickFilterChange, quickFilter?.debounceMs]\n );\n\n return (\n <GridToolbarContainer\n sx={{\n gap: 1.5,\n p: 2,\n borderBottom: 1,\n borderColor: 'divider',\n }}\n >\n {startContent}\n\n {quickFilter?.enabled !== false && (\n <SearchInput\n value={searchValue}\n onChange={handleSearchChange}\n placeholder={quickFilter?.placeholder ?? 'Search...'}\n fullWidth={false}\n minWidth={200}\n />\n )}\n\n <Box sx={{ flex: 1 }} />\n\n {showColumnSelector && <GridToolbarColumnsButton />}\n {showDensitySelector && <GridToolbarDensitySelector />}\n\n {(exportConfig?.csv !== false || exportConfig?.print !== false) && (\n <GridToolbarExport\n printOptions={exportConfig?.print === false ? { disableToolbarButton: true } : undefined}\n csvOptions={exportConfig?.csv === false ? { disableToolbarButton: true } : undefined}\n />\n )}\n\n {actions}\n {endContent}\n </GridToolbarContainer>\n );\n}\n\n// =============================================================================\n// ROW ACTIONS CELL\n// =============================================================================\n\ninterface RowActionsCellProps<R> {\n row: R;\n actions: DataGridRowAction<R>[];\n}\n\nfunction RowActionsCell<R extends Record<string, unknown>>({ row, actions }: RowActionsCellProps<R>): ReactNode {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const handleClick = useCallback((event: MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n }, []);\n\n const handleClose = useCallback(() => {\n setAnchorEl(null);\n }, []);\n\n const handleAction = useCallback(\n (action: DataGridRowAction<R>, event: MouseEvent<HTMLElement>) => {\n setAnchorEl(null);\n action.onClick(row, event);\n },\n [row]\n );\n\n const visibleActions = actions.filter((action) => {\n if (typeof action.hidden === 'function') {\n return !action.hidden(row);\n }\n return !action.hidden;\n });\n\n if (visibleActions.length === 0) {\n return null;\n }\n\n // If only 1-2 actions, show inline buttons\n if (visibleActions.length <= 2) {\n return (\n <Box sx={{ display: 'flex', gap: 0.5 }}>\n {visibleActions.map((action) => {\n const isDisabled = typeof action.disabled === 'function' ? action.disabled(row) : action.disabled;\n\n return (\n <Tooltip key={action.key} title={action.label}>\n <span>\n <IconButton\n size=\"small\"\n color={action.color ?? 'default'}\n disabled={isDisabled}\n onClick={(e) => handleAction(action, e)}\n aria-label={action.label}\n >\n {action.icon ?? action.label.charAt(0)}\n </IconButton>\n </span>\n </Tooltip>\n );\n })}\n </Box>\n );\n }\n\n // More than 2 actions, show menu\n return (\n <>\n <IconButton\n size=\"small\"\n onClick={handleClick}\n aria-label=\"Row actions\"\n aria-controls={open ? 'row-actions-menu' : undefined}\n aria-haspopup=\"true\"\n aria-expanded={open ? 'true' : undefined}\n >\n <MoreVertIcon />\n </IconButton>\n <Menu\n id=\"row-actions-menu\"\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n onClick={(e) => e.stopPropagation()}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n {visibleActions.map((action, index) => {\n const isDisabled = typeof action.disabled === 'function' ? action.disabled(row) : action.disabled;\n\n return [\n <MenuItem key={action.key} disabled={isDisabled} onClick={(e) => handleAction(action, e)}>\n {action.icon && <ListItemIcon>{action.icon}</ListItemIcon>}\n <ListItemText primary={action.label} sx={{ color: action.color ? `${action.color}.main` : undefined }} />\n </MenuItem>,\n action.divider && index < visibleActions.length - 1 && <Divider key={`${action.key}-divider`} />,\n ];\n })}\n </Menu>\n </>\n );\n}\n\n// =============================================================================\n// EMPTY STATE\n// =============================================================================\n\ninterface EmptyStateProps {\n icon?: ReactNode;\n title?: string;\n description?: string;\n action?: {\n label: string;\n onClick: () => void;\n };\n component?: ReactNode;\n}\n\nfunction EmptyState({\n icon,\n title = 'No data',\n description = 'No records to display.',\n action,\n component,\n}: EmptyStateProps): ReactNode {\n if (component) {\n return <>{component}</>;\n }\n\n return (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n py: 8,\n px: 3,\n textAlign: 'center',\n }}\n >\n <Box sx={{ mb: 2, color: 'text.disabled' }}>{icon ?? <EmptyIcon />}</Box>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.secondary\",\n mb: action ? 2 : 0\n }}>\n {description}\n </Typography>\n {action && (\n <Button variant=\"contained\" size=\"small\" onClick={action.onClick}>\n {action.label}\n </Button>\n )}\n </Box>\n );\n}\n\n// =============================================================================\n// ERROR STATE\n// =============================================================================\n\ninterface ErrorStateProps {\n message?: string;\n onRetry?: () => void;\n}\n\nfunction ErrorState({ message = 'Failed to load data', onRetry }: ErrorStateProps): ReactNode {\n return (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n py: 8,\n px: 3,\n textAlign: 'center',\n }}\n >\n <Typography color=\"error\" variant=\"body1\" gutterBottom>\n {message}\n </Typography>\n {onRetry && (\n <Button variant=\"outlined\" size=\"small\" onClick={onRetry} sx={{ mt: 1 }}>\n Retry\n </Button>\n )}\n </Box>\n );\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * DataGridBlock - Advanced data table with common patterns.\n *\n * Features:\n * - Custom toolbar with search, filters, export, and column visibility\n * - Row actions column (inline or dropdown menu)\n * - Server-side pagination, sorting, and filtering support\n * - Custom empty state\n * - Loading and error states\n * - Selection handling\n * - Density customization\n *\n * @example\n * ```tsx\n * <DataGridBlock\n * columns={[\n * { field: 'name', headerName: 'Name', flex: 1 },\n * { field: 'email', headerName: 'Email', flex: 1 },\n * { field: 'status', headerName: 'Status', width: 120 },\n * ]}\n * rows={users}\n * loading={isLoading}\n * rowActions={[\n * { key: 'edit', label: 'Edit', icon: <EditIcon />, onClick: handleEdit },\n * { key: 'delete', label: 'Delete', icon: <DeleteIcon />, color: 'error', onClick: handleDelete },\n * ]}\n * toolbar={{\n * quickFilter: { placeholder: 'Search users...' },\n * export: { csv: true },\n * }}\n * pagination={{\n * mode: 'server',\n * rowCount: totalCount,\n * }}\n * onPaginationChange={handlePaginationChange}\n * />\n * ```\n */\nexport function DataGridBlock<R extends Record<string, unknown> = Record<string, unknown>>({\n columns,\n rows,\n loading = false,\n error = false,\n errorMessage,\n onRetry,\n rowActions,\n rowActionsWidth = 80,\n toolbar,\n pagination,\n selection,\n empty,\n density: defaultDensity = 'standard',\n autoHeight = false,\n height = 500,\n hideFooter = false,\n rowHeight,\n getRowId,\n onRowClick,\n onRowDoubleClick,\n onSelectionChange,\n onPaginationChange,\n onSortChange,\n onFilterChange,\n paginationModel: controlledPaginationModel,\n sortModel: controlledSortModel,\n filterModel: controlledFilterModel,\n selectionModel: controlledSelectionModel,\n columnVisibilityModel,\n onColumnVisibilityChange,\n slots,\n slotProps,\n disableColumnMenu = false,\n disableColumnFilter = false,\n disableColumnSelector = false,\n disableRowSelectionOnClick = true,\n disableVirtualization = false,\n sx,\n}: DataGridBlockProps<R>): ReactNode {\n const [density, setDensity] = useState<GridDensity>(defaultDensity);\n const [internalPaginationModel, setInternalPaginationModel] = useState<GridPaginationModel>({\n page: 0,\n pageSize: pagination?.defaultPageSize ?? 25,\n });\n const [internalSortModel, setInternalSortModel] = useState<GridSortModel>([]);\n const [internalFilterModel, setInternalFilterModel] = useState<GridFilterModel>({ items: [] });\n const [internalSelectionModel, setInternalSelectionModel] = useState<GridRowSelectionModel>({\n type: 'include',\n ids: new Set<GridRowId>(),\n });\n const [quickFilterValue, setQuickFilterValue] = useState('');\n\n // Use controlled or internal state\n const paginationModel = controlledPaginationModel ?? internalPaginationModel;\n const sortModel = controlledSortModel ?? internalSortModel;\n const filterModel = controlledFilterModel ?? internalFilterModel;\n const selectionModelValue = controlledSelectionModel ?? internalSelectionModel;\n\n // Build columns with row actions\n const finalColumns = useMemo<GridColDef<R>[]>(() => {\n if (!rowActions || rowActions.length === 0) {\n return columns;\n }\n\n const actionsColumn: GridColDef<R> = {\n field: '__actions__',\n headerName: '',\n width: rowActionsWidth,\n sortable: false,\n filterable: false,\n disableColumnMenu: true,\n disableReorder: true,\n renderCell: (params: GridRenderCellParams<R>) => <RowActionsCell row={params.row} actions={rowActions} />,\n };\n\n return [...columns, actionsColumn];\n }, [columns, rowActions, rowActionsWidth]);\n\n // Handlers\n const handlePaginationChange = useCallback(\n (model: GridPaginationModel, details: GridCallbackDetails) => {\n if (!controlledPaginationModel) {\n setInternalPaginationModel(model);\n }\n onPaginationChange?.(model);\n },\n [controlledPaginationModel, onPaginationChange]\n );\n\n const handleSortChange = useCallback(\n (model: GridSortModel, details: GridCallbackDetails) => {\n if (!controlledSortModel) {\n setInternalSortModel(model);\n }\n onSortChange?.(model);\n },\n [controlledSortModel, onSortChange]\n );\n\n const handleFilterChange = useCallback(\n (model: GridFilterModel, details: GridCallbackDetails) => {\n if (!controlledFilterModel) {\n setInternalFilterModel(model);\n }\n onFilterChange?.(model);\n },\n [controlledFilterModel, onFilterChange]\n );\n\n const handleSelectionChange = useCallback(\n (model: GridRowSelectionModel, details: GridCallbackDetails) => {\n if (!controlledSelectionModel) {\n setInternalSelectionModel(model);\n }\n onSelectionChange?.(model);\n },\n [controlledSelectionModel, onSelectionChange]\n );\n\n // Context value\n const contextValue = useMemo<DataGridBlockContextValue>(\n () => ({\n loading,\n error,\n density,\n setDensity,\n rowCount: rows.length,\n selectedCount: selectionModelValue.ids.size,\n refresh: onRetry,\n }),\n [loading, error, density, rows.length, selectionModelValue, onRetry]\n );\n\n // Determine row count for pagination\n const rowCount = pagination?.mode === 'server' ? (pagination.rowCount ?? 0) : rows.length;\n\n // Custom toolbar slot\n const toolbarSlot = useMemo(() => {\n if (toolbar?.show === false) {\n return undefined;\n }\n\n return () => (\n <CustomToolbar\n quickFilter={toolbar?.quickFilter}\n exportConfig={toolbar?.export}\n showColumnSelector={toolbar?.columnVisibility?.enabled !== false}\n showDensitySelector={toolbar?.densitySelector !== false}\n startContent={toolbar?.startContent}\n endContent={toolbar?.endContent}\n actions={toolbar?.actions}\n onQuickFilterChange={setQuickFilterValue}\n />\n );\n }, [toolbar]);\n\n // No data overlay\n const noRowsOverlay = useMemo(() => {\n if (error) {\n return () => <ErrorState message={errorMessage} onRetry={onRetry} />;\n }\n return () => (\n <EmptyState\n icon={empty?.icon}\n title={empty?.title}\n description={empty?.description}\n action={empty?.action}\n component={empty?.component}\n />\n );\n }, [error, errorMessage, onRetry, empty]);\n\n return (\n <DataGridBlockContext.Provider value={contextValue}>\n <Paper\n data-testid=\"prism-data-grid-block\"\n variant=\"outlined\"\n sx={[\n {\n width: '100%',\n overflow: 'hidden',\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n >\n <Box sx={{ width: '100%', height: autoHeight ? 'auto' : height }}>\n <DataGrid\n rows={rows}\n columns={finalColumns}\n loading={loading}\n density={density}\n autoHeight={autoHeight}\n rowHeight={rowHeight}\n getRowId={getRowId}\n onRowClick={onRowClick}\n onRowDoubleClick={onRowDoubleClick}\n // Pagination\n paginationMode={pagination?.mode ?? 'client'}\n paginationModel={paginationModel}\n onPaginationModelChange={handlePaginationChange}\n pageSizeOptions={pagination?.pageSizeOptions ?? [10, 25, 50, 100]}\n rowCount={rowCount}\n // Sorting\n sortingMode={pagination?.mode === 'server' ? 'server' : 'client'}\n sortModel={sortModel}\n onSortModelChange={handleSortChange}\n // Filtering\n filterMode={pagination?.mode === 'server' ? 'server' : 'client'}\n filterModel={filterModel}\n onFilterModelChange={handleFilterChange}\n // Selection\n checkboxSelection={selection?.checkboxSelection ?? false}\n rowSelectionModel={selectionModelValue}\n onRowSelectionModelChange={handleSelectionChange}\n disableRowSelectionOnClick={selection?.disableSelectionOnClick ?? disableRowSelectionOnClick}\n disableMultipleRowSelection={selection?.mode === 'single'}\n keepNonExistentRowsSelected={selection?.keepNonExistentRowsSelected}\n // Column visibility\n columnVisibilityModel={columnVisibilityModel}\n onColumnVisibilityModelChange={onColumnVisibilityChange}\n // Features\n disableColumnMenu={disableColumnMenu}\n disableColumnFilter={disableColumnFilter}\n disableColumnSelector={disableColumnSelector}\n disableVirtualization={disableVirtualization}\n hideFooter={hideFooter || pagination?.hide}\n // Slots\n slots={{\n toolbar: toolbarSlot,\n noRowsOverlay,\n loadingOverlay: () => <LinearProgress sx={{ position: 'absolute', top: 0, left: 0, right: 0 }} />,\n ...slots,\n }}\n slotProps={slotProps}\n sx={{\n border: 0,\n '& .MuiDataGrid-columnHeaders': {\n bgcolor: 'action.hover',\n },\n '& .MuiDataGrid-cell:focus': {\n outline: 'none',\n },\n '& .MuiDataGrid-row:hover': {\n bgcolor: 'action.hover',\n },\n }}\n />\n </Box>\n </Paper>\n </DataGridBlockContext.Provider>\n );\n}\n\n// =============================================================================\n// USE DATA GRID BLOCK HOOK\n// =============================================================================\n\n/**\n * Hook for managing DataGridBlock with server-side data fetching.\n *\n * @example\n * ```tsx\n * const { rows, loading, error, total, paginationModel, onPaginationChange, refresh } =\n * useDataGridBlock({\n * fetcher: async ({ page, pageSize, sortModel, filterModel }) => {\n * const response = await api.getUsers({ page, pageSize, sort: sortModel[0] });\n * return { rows: response.data, total: response.total };\n * },\n * });\n *\n * return (\n * <DataGridBlock\n * columns={columns}\n * rows={rows}\n * loading={loading}\n * error={!!error}\n * pagination={{ mode: 'server', rowCount: total }}\n * paginationModel={paginationModel}\n * onPaginationChange={onPaginationChange}\n * />\n * );\n * ```\n */\nexport function useDataGridBlock<R extends Record<string, unknown> = Record<string, unknown>>(\n options: UseDataGridBlockOptions<R>\n): UseDataGridBlockReturn<R> {\n const {\n fetcher,\n initialPageSize = 25,\n initialSortModel = [],\n initialFilterModel = { items: [] },\n autoFetch = true,\n keepPreviousData = true,\n } = options;\n\n const [rows, setRows] = useState<R[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [total, setTotal] = useState(0);\n\n const [paginationModel, setPaginationModel] = useState<GridPaginationModel>({\n page: 0,\n pageSize: initialPageSize,\n });\n const [sortModel, setSortModel] = useState<GridSortModel>(initialSortModel);\n const [filterModel, setFilterModel] = useState<GridFilterModel>(initialFilterModel);\n\n const isMountedRef = useRef(true);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const fetchData = useCallback(\n async (params: DataGridFetchParams) => {\n // Cancel previous request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n setLoading(true);\n setError(null);\n\n try {\n const result = await fetcher(params);\n if (isMountedRef.current) {\n setRows(result.rows);\n setTotal(result.total);\n }\n } catch (err) {\n if (isMountedRef.current && err instanceof Error && err.name !== 'AbortError') {\n setError(err);\n if (!keepPreviousData) {\n setRows([]);\n }\n }\n } finally {\n if (isMountedRef.current) {\n setLoading(false);\n }\n }\n },\n [fetcher, keepPreviousData]\n );\n\n const refresh = useCallback(() => {\n fetchData({\n page: paginationModel.page,\n pageSize: paginationModel.pageSize,\n sortModel,\n filterModel,\n });\n }, [fetchData, paginationModel, sortModel, filterModel]);\n\n const reset = useCallback(() => {\n setPaginationModel({ page: 0, pageSize: initialPageSize });\n setSortModel(initialSortModel);\n setFilterModel(initialFilterModel);\n }, [initialPageSize, initialSortModel, initialFilterModel]);\n\n // Fetch on params change\n useEffect(() => {\n if (autoFetch) {\n fetchData({\n page: paginationModel.page,\n pageSize: paginationModel.pageSize,\n sortModel,\n filterModel,\n });\n }\n }, [fetchData, paginationModel, sortModel, filterModel, autoFetch]);\n\n // Cleanup on unmount\n useEffect(\n () => () => {\n isMountedRef.current = false;\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n },\n []\n );\n\n const handlePaginationChange = useCallback((model: GridPaginationModel, _details: GridCallbackDetails) => {\n setPaginationModel(model);\n }, []);\n\n const handleSortChange = useCallback((model: GridSortModel, _details: GridCallbackDetails) => {\n setSortModel(model);\n // Reset to first page on sort change\n setPaginationModel((prev) => ({ ...prev, page: 0 }));\n }, []);\n\n const handleFilterChange = useCallback((model: GridFilterModel, _details: GridCallbackDetails) => {\n setFilterModel(model);\n // Reset to first page on filter change\n setPaginationModel((prev) => ({ ...prev, page: 0 }));\n }, []);\n\n return {\n rows,\n loading,\n error,\n total,\n paginationModel,\n sortModel,\n filterModel,\n onPaginationChange: handlePaginationChange,\n onSortChange: handleSortChange,\n onFilterChange: handleFilterChange,\n refresh,\n reset,\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/blocks/dashboard-block/dashboard-block.tsx","../../src/blocks/dashboard-block/use-dashboard-block.ts","../../src/blocks/auth-block/auth-block.tsx","../../src/blocks/auth-block/guards.tsx","../../src/blocks/data-grid-block/data-grid-block.tsx"],"names":["Box","Typography","IconButton","Button","useCallback","useMemo","jsxs","jsx","useState","Fragment","Divider","useEffect","createContext","useContext","useRef","EmptyState","ErrorState","Paper"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Dashboard Block Component\n *\n * Reusable dashboard widget/card block with header, content, and footer slots.\n * Supports loading, error states, and collapsible behavior.\n *\n * @module blocks/dashboard-block\n */\n\n'use client';\n\nimport { type ReactNode, createContext, useContext, useMemo, useCallback } from 'react';\nimport Box from '@mui/material/Box';\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\nimport IconButton from '@mui/material/IconButton';\nimport Collapse from '@mui/material/Collapse';\nimport Divider from '@mui/material/Divider';\nimport Skeleton from '@mui/material/Skeleton';\nimport Button from '@mui/material/Button';\nimport { useBoolean } from '../../core/hooks/use-boolean.js';\nimport { ErrorBoundary } from '../../components/error-boundary/index.js';\nimport { EmptyContent } from '../../components/empty-content/index.js';\nimport type {\n DashboardBlockProps,\n DashboardBlockContextValue,\n DashboardBlockHeaderProps,\n DashboardBlockContentProps,\n DashboardBlockFooterProps,\n DashboardBlockLabels,\n EmptyConfig,\n} from './types.js';\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\n/** Stable no-op for non-collapsible blocks */\nconst collapseNoop = () => {};\n\n/** Stable default: no translated strings, the block's English fallbacks apply */\nconst NO_LABELS: DashboardBlockLabels = {};\n\nconst DashboardBlockContext = createContext<DashboardBlockContextValue | null>(null);\n\n/**\n * Hook to access dashboard block context.\n */\nexport function useDashboardBlockContext(): DashboardBlockContextValue {\n const context = useContext(DashboardBlockContext);\n if (!context) {\n throw new Error('useDashboardBlockContext must be used within DashboardBlock');\n }\n return context;\n}\n\n// =============================================================================\n// SIZE CONFIGS\n// =============================================================================\n\nconst sizeConfig = {\n small: {\n headerPx: 2,\n headerPy: 1.5,\n contentPx: 2,\n contentPy: 1.5,\n titleVariant: 'subtitle1' as const,\n subtitleVariant: 'caption' as const,\n },\n medium: {\n headerPx: 2.5,\n headerPy: 2,\n contentPx: 2.5,\n contentPy: 2,\n titleVariant: 'h6' as const,\n subtitleVariant: 'body2' as const,\n },\n large: {\n headerPx: 3,\n headerPy: 2.5,\n contentPx: 3,\n contentPy: 2.5,\n titleVariant: 'h5' as const,\n subtitleVariant: 'body1' as const,\n },\n};\n\n// =============================================================================\n// SUB-COMPONENTS\n// =============================================================================\n\n/**\n * Dashboard block header component.\n */\nexport function DashboardBlockHeader({ title, subtitle, icon, actions, sx }: DashboardBlockHeaderProps): ReactNode {\n const { collapsed, toggleCollapse, variant, size, labels } = useDashboardBlockContext();\n const config = sizeConfig[size];\n\n return (\n <Box\n data-testid=\"prism-dashboard-block-header\"\n sx={[\n {\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 2,\n px: config.headerPx,\n py: config.headerPy,\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n >\n <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 1.5, flex: 1, minWidth: 0 }}>\n {icon && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n mt: 0.25,\n color: 'primary.main',\n }}\n >\n {icon}\n </Box>\n )}\n <Box sx={{ flex: 1, minWidth: 0 }}>\n {/*\n * Two lines, then an ellipsis — not one. On a phone the header\n * shares its row with the block's actions, and «Лента сообществ»\n * beside «Вся лента →» was cut to «Лента сообще…» with the second\n * line empty below it.\n */}\n <Typography\n variant={config.titleVariant}\n component=\"h3\"\n sx={{\n fontWeight: 600,\n lineHeight: 1.4,\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: 2,\n overflow: 'hidden',\n overflowWrap: 'anywhere',\n }}\n >\n {title}\n </Typography>\n {subtitle && (\n <Typography\n variant={config.subtitleVariant}\n sx={{\n color: \"text.secondary\",\n mt: 0.25\n }}>\n {subtitle}\n </Typography>\n )}\n </Box>\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5, flexShrink: 0 }}>\n {actions}\n {collapsed !== undefined && (\n <IconButton\n size=\"small\"\n onClick={toggleCollapse}\n aria-expanded={!collapsed}\n aria-label={collapsed ? (labels.expand ?? 'Expand block') : (labels.collapse ?? 'Collapse block')}\n data-testid=\"prism-dashboard-block-collapse\"\n >\n <ChevronIcon direction={collapsed ? 'down' : 'up'} />\n </IconButton>\n )}\n </Box>\n </Box>\n );\n}\n\n/**\n * Dashboard block content component.\n */\nexport function DashboardBlockContent({ children, disablePadding = false, sx }: DashboardBlockContentProps): ReactNode {\n const { collapsed, loading, error, size } = useDashboardBlockContext();\n const config = sizeConfig[size];\n\n return (\n <Collapse in={!collapsed} timeout=\"auto\">\n <Box\n data-testid=\"prism-dashboard-block-content\"\n sx={[\n {\n ...(!disablePadding && {\n px: config.contentPx,\n py: config.contentPy,\n }),\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n >\n {children}\n </Box>\n </Collapse>\n );\n}\n\n/**\n * Dashboard block footer component.\n */\nexport function DashboardBlockFooter({ children, divider = true, sx }: DashboardBlockFooterProps): ReactNode {\n const { collapsed, size } = useDashboardBlockContext();\n const config = sizeConfig[size];\n\n if (collapsed) return null;\n\n return (\n <>\n {divider && <Divider />}\n <Box\n data-testid=\"prism-dashboard-block-footer\"\n sx={[\n {\n px: config.contentPx,\n py: 1.5,\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n >\n {children}\n </Box>\n </>\n );\n}\n\n// =============================================================================\n// LOADING & ERROR STATES\n// =============================================================================\n\ninterface LoadingStateProps {\n rows?: number;\n size: 'small' | 'medium' | 'large';\n}\n\nfunction LoadingState({ rows = 3, size }: LoadingStateProps): ReactNode {\n const config = sizeConfig[size];\n return (\n <Box sx={{ px: config.contentPx, py: config.contentPy }}>\n {Array.from({ length: rows }).map((_, i) => (\n <Skeleton key={i} variant=\"text\" animation=\"wave\" sx={{ height: 20, mb: 1 }} />\n ))}\n </Box>\n );\n}\n\ninterface ErrorStateProps {\n message?: string | undefined;\n retryLabel?: string | undefined;\n onRetry?: (() => void) | undefined;\n size: 'small' | 'medium' | 'large';\n}\n\nfunction ErrorState({ message = 'Failed to load data', retryLabel = 'Retry', onRetry, size }: ErrorStateProps): ReactNode {\n const config = sizeConfig[size];\n return (\n <Box\n sx={{\n px: config.contentPx,\n py: config.contentPy,\n textAlign: 'center',\n }}\n >\n <Typography color=\"error\" variant=\"body2\" sx={{ mb: onRetry ? 1.5 : 0 }}>\n {message}\n </Typography>\n {onRetry && (\n <Button size=\"small\" onClick={onRetry}>\n {retryLabel}\n </Button>\n )}\n </Box>\n );\n}\n\ninterface EmptyStateProps {\n config: EmptyConfig | undefined;\n size: 'small' | 'medium' | 'large';\n}\n\nfunction EmptyState({ config, size }: EmptyStateProps): ReactNode {\n const pad = sizeConfig[size];\n if (config?.emptyComponent) return config.emptyComponent;\n return (\n <Box data-testid=\"prism-dashboard-block-empty\" sx={{ px: pad.contentPx, py: pad.contentPy }}>\n {/*\n * `compact`: a block is always a card. Without it EmptyContent centres\n * itself in the VIEWPORT (`minHeight: calc(100vh - 240px)`, `flex: 1`),\n * and every empty module on the portal's home page stood about 400 px\n * tall — the page came out 4060 px at 1440×1000, most of it nothing.\n */}\n <EmptyContent\n compact\n icon={config?.icon}\n iconSize={48}\n title={config?.title}\n description={config?.description}\n action={config?.action}\n />\n </Box>\n );\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * Dashboard Block - Reusable dashboard widget/card.\n *\n * Features:\n * - Header with title, subtitle, icon, and actions\n * - Content area with optional padding\n * - Footer slot with optional divider\n * - Loading and error states\n * - Collapsible behavior (controlled or uncontrolled)\n * - Three size presets (small, medium, large)\n * - Three variants (default, outlined, filled)\n *\n * @example\n * ```tsx\n * <DashboardBlock\n * title=\"Revenue Overview\"\n * subtitle=\"Last 30 days\"\n * icon={<BarChartIcon />}\n * actions={<IconButton><MoreIcon /></IconButton>}\n * collapsible\n * >\n * <RevenueChart />\n * </DashboardBlock>\n * ```\n */\nexport function DashboardBlock({\n title,\n subtitle,\n icon,\n actions,\n children,\n footer,\n variant = 'default',\n size = 'medium',\n loading = false,\n loadingConfig,\n error = false,\n errorConfig,\n empty = false,\n emptyConfig,\n labels = NO_LABELS,\n catchErrors = true,\n collapsible = false,\n defaultCollapsed = false,\n collapsed: controlledCollapsed,\n onCollapseChange,\n disablePadding = false,\n footerDivider = true,\n sx,\n slotProps,\n}: DashboardBlockProps): ReactNode {\n // Collapse state (controlled or uncontrolled)\n const uncontrolledCollapse = useBoolean(defaultCollapsed);\n const isControlled = controlledCollapsed !== undefined;\n const collapsed = isControlled ? controlledCollapsed : uncontrolledCollapse.value;\n\n const handleToggleCollapse = useCallback(() => {\n if (isControlled) {\n onCollapseChange?.(!controlledCollapsed);\n } else {\n uncontrolledCollapse.onToggle();\n }\n }, [isControlled, controlledCollapsed, onCollapseChange, uncontrolledCollapse]);\n\n const handleSetCollapsed = useCallback(\n (value: boolean) => {\n if (isControlled) {\n onCollapseChange?.(value);\n } else {\n uncontrolledCollapse.setValue(value);\n }\n },\n [isControlled, onCollapseChange, uncontrolledCollapse]\n );\n\n // Context value\n const contextValue = useMemo<DashboardBlockContextValue>(\n () => ({\n collapsed: collapsible ? collapsed : false,\n toggleCollapse: collapsible ? handleToggleCollapse : collapseNoop,\n setCollapsed: collapsible ? handleSetCollapsed : collapseNoop,\n loading,\n error,\n variant,\n size,\n labels,\n }),\n [collapsed, collapsible, handleToggleCollapse, handleSetCollapsed, loading, error, variant, size, labels]\n );\n\n const errorMessage = errorConfig?.message ?? labels.error;\n // Loading, then error, then empty, then the content — an error is never\n // drawn as «nothing here».\n const body = loading ? (\n (loadingConfig?.loadingComponent ?? <LoadingState rows={loadingConfig?.skeletonRows ?? 3} size={size} />)\n ) : error ? (\n (errorConfig?.errorComponent ?? (\n <ErrorState message={errorMessage} retryLabel={labels.retry} onRetry={errorConfig?.onRetry} size={size} />\n ))\n ) : empty ? (\n <EmptyState config={emptyConfig} size={size} />\n ) : children ? (\n <DashboardBlockContent disablePadding={disablePadding} {...slotProps?.content}>\n {children}\n </DashboardBlockContent>\n ) : null;\n\n // Paper variant based on block variant\n const paperVariant = variant === 'outlined' ? 'outlined' : 'elevation';\n const paperElevation = variant === 'default' ? 1 : 0;\n\n return (\n <DashboardBlockContext.Provider value={contextValue}>\n <Paper\n data-testid=\"prism-dashboard-block\"\n variant={paperVariant}\n elevation={paperElevation}\n sx={[\n {\n overflow: 'hidden',\n ...(variant === 'filled' && {\n bgcolor: 'action.hover',\n }),\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n >\n {/* Header */}\n {title && (\n <DashboardBlockHeader\n title={title}\n subtitle={subtitle}\n icon={icon}\n actions={actions}\n {...slotProps?.header}\n />\n )}\n\n {/* Divider after header */}\n {title && <Divider />}\n\n {/* Content */}\n <Box aria-live=\"polite\" aria-busy={loading}>\n {catchErrors ? (\n <ErrorBoundary\n resetKeys={[loading, error, empty]}\n fallback={({ resetErrorBoundary }) => (\n <ErrorState\n message={labels.error}\n retryLabel={labels.retry}\n onRetry={() => {\n resetErrorBoundary();\n errorConfig?.onRetry?.();\n }}\n size={size}\n />\n )}\n >\n {body}\n </ErrorBoundary>\n ) : (\n body\n )}\n </Box>\n\n {/* Footer */}\n {footer && !loading && !error && (\n <DashboardBlockFooter divider={footerDivider} {...slotProps?.footer}>\n {footer}\n </DashboardBlockFooter>\n )}\n </Paper>\n </DashboardBlockContext.Provider>\n );\n}\n\n// =============================================================================\n// CHEVRON ICON\n// =============================================================================\n\ninterface ChevronIconProps {\n direction: 'up' | 'down';\n}\n\nfunction ChevronIcon({ direction }: ChevronIconProps): ReactNode {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n style={{\n transform: direction === 'up' ? 'rotate(180deg)' : undefined,\n transition: 'transform 0.2s ease',\n }}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n","/**\n * Dashboard Block Hook\n *\n * Hook for managing dashboard block state and behavior.\n *\n * @module blocks/dashboard-block/use-dashboard-block\n */\n\n'use client';\n\nimport { useState, useCallback, useMemo } from 'react';\nimport type { DashboardBlockProps } from './types.js';\n\n/**\n * Dashboard block state.\n */\nexport interface DashboardBlockState {\n /** Current collapsed state */\n collapsed: boolean;\n /** Current loading state */\n loading: boolean;\n /** Current error state */\n error: boolean;\n /** Error message */\n errorMessage?: string;\n}\n\n/**\n * Dashboard block actions.\n */\nexport interface DashboardBlockActions {\n /** Toggle collapse state */\n toggleCollapse: () => void;\n /** Set collapsed state */\n setCollapsed: (collapsed: boolean) => void;\n /** Expand block */\n expand: () => void;\n /** Collapse block */\n collapse: () => void;\n /** Set loading state */\n setLoading: (loading: boolean) => void;\n /** Set error state */\n setError: (error: boolean, message?: string) => void;\n /** Clear error state */\n clearError: () => void;\n /** Reset to initial state */\n reset: () => void;\n}\n\n/**\n * Dashboard block hook return value.\n */\nexport interface UseDashboardBlockReturn {\n /** Current state */\n state: DashboardBlockState;\n /** Actions to modify state */\n actions: DashboardBlockActions;\n /** Props to spread on DashboardBlock */\n blockProps: Pick<DashboardBlockProps, 'collapsed' | 'onCollapseChange' | 'loading' | 'error' | 'errorConfig'>;\n}\n\n/**\n * Options for useDashboardBlock hook.\n */\nexport interface UseDashboardBlockOptions {\n /** Initial collapsed state */\n defaultCollapsed?: boolean;\n /** Initial loading state */\n defaultLoading?: boolean;\n /** Retry callback for error state */\n onRetry?: () => void;\n}\n\n/**\n * Hook for managing dashboard block state.\n *\n * Provides controlled state management for DashboardBlock component,\n * including collapse, loading, and error states.\n *\n * @example\n * ```tsx\n * function MyWidget() {\n * const { state, actions, blockProps } = useDashboardBlock({\n * defaultCollapsed: false,\n * onRetry: () => fetchData(),\n * });\n *\n * useEffect(() => {\n * actions.setLoading(true);\n * fetchData()\n * .then(() => actions.setLoading(false))\n * .catch((err) => actions.setError(true, err.message));\n * }, []);\n *\n * return (\n * <DashboardBlock title=\"My Widget\" {...blockProps}>\n * <Content />\n * </DashboardBlock>\n * );\n * }\n * ```\n */\nexport function useDashboardBlock(options: UseDashboardBlockOptions = {}): UseDashboardBlockReturn {\n const { defaultCollapsed = false, defaultLoading = false, onRetry } = options;\n\n const [state, setState] = useState<DashboardBlockState>({\n collapsed: defaultCollapsed,\n loading: defaultLoading,\n error: false,\n errorMessage: undefined,\n });\n\n const toggleCollapse = useCallback(() => {\n setState((prev) => ({ ...prev, collapsed: !prev.collapsed }));\n }, []);\n\n const setCollapsed = useCallback((collapsed: boolean) => {\n setState((prev) => ({ ...prev, collapsed }));\n }, []);\n\n const expand = useCallback(() => {\n setState((prev) => ({ ...prev, collapsed: false }));\n }, []);\n\n const collapse = useCallback(() => {\n setState((prev) => ({ ...prev, collapsed: true }));\n }, []);\n\n const setLoading = useCallback((loading: boolean) => {\n setState((prev) => ({ ...prev, loading }));\n }, []);\n\n const setError = useCallback((error: boolean, errorMessage?: string) => {\n setState((prev) => ({ ...prev, error, errorMessage, loading: false }));\n }, []);\n\n const clearError = useCallback(() => {\n setState((prev) => ({ ...prev, error: false, errorMessage: undefined }));\n }, []);\n\n const reset = useCallback(() => {\n setState({\n collapsed: defaultCollapsed,\n loading: defaultLoading,\n error: false,\n errorMessage: undefined,\n });\n }, [defaultCollapsed, defaultLoading]);\n\n const actions = useMemo<DashboardBlockActions>(\n () => ({\n toggleCollapse,\n setCollapsed,\n expand,\n collapse,\n setLoading,\n setError,\n clearError,\n reset,\n }),\n [toggleCollapse, setCollapsed, expand, collapse, setLoading, setError, clearError, reset]\n );\n\n const blockProps = useMemo(\n () => ({\n collapsed: state.collapsed,\n onCollapseChange: setCollapsed,\n loading: state.loading,\n error: state.error,\n errorConfig: state.error\n ? {\n message: state.errorMessage,\n onRetry,\n }\n : undefined,\n }),\n [state.collapsed, state.loading, state.error, state.errorMessage, setCollapsed, onRetry]\n );\n\n return {\n state,\n actions,\n blockProps,\n };\n}\n","'use client';\n\n/**\n * Auth Block Component\n *\n * Reusable authentication forms: login, register, forgot password, etc.\n * Integrates with React Hook Form and Zod for validation.\n *\n * @module blocks/auth-block\n */\n\nimport type { ReactNode } from 'react';\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useForm, FormProvider, type Resolver } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\nimport Link from '@mui/material/Link';\nimport Divider from '@mui/material/Divider';\nimport Alert from '@mui/material/Alert';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport IconButton from '@mui/material/IconButton';\nimport { Field } from '../../components/field/index.js';\nimport type {\n LoginFormProps,\n LoginFormData,\n RegisterFormProps,\n RegisterFormData,\n ForgotPasswordFormProps,\n ForgotPasswordFormData,\n ResetPasswordFormProps,\n ResetPasswordFormData,\n VerifyCodeFormProps,\n VerifyCodeFormData,\n} from './types.js';\n\n// =============================================================================\n// ICONS (inline SVG to avoid dependencies)\n// =============================================================================\n\nfunction EyeIcon(): ReactNode {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nfunction EyeOffIcon(): ReactNode {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n );\n}\n\n// =============================================================================\n// ERROR SANITIZATION\n// =============================================================================\n\n/**\n * Patterns that indicate a server-internal error message that should not\n * be shown to the user (e.g., stack traces, connection strings, file paths).\n *\n * The last group matches a leaked secret *value*, not the words that name one.\n * Matching the words themselves cost more than it bought: measured against the\n * 50 authentication messages the downstream and Omnitron auth services actually\n * throw, `/password|secret|token|key/i` replaced 20 of them with the generic\n * fallback — including every password-policy rule (\"Password must contain at\n * least 2 digits\") and every expiry notice (\"Refresh token expired\"), which\n * are precisely the messages the user needs in order to succeed on the next\n * attempt. The patterns below flag 0 of those 50 and still catch all of:\n * `password=hunter2`, `postgres://user:pw@host`, a JWT, a bearer header, a\n * vendor-prefixed API key, a raw hex or base64 blob, and `JWT_SECRET`.\n */\nconst UNSAFE_ERROR_PATTERNS = [\n /at\\s+\\w+\\s*\\(/i, // stack trace frames\n /\\b(ECONNREFUSED|ETIMEDOUT|ENOTFOUND)\\b/, // Node.js system errors\n /\\b(SELECT|INSERT|UPDATE|DELETE)\\b.*\\bFROM\\b/i, // SQL fragments\n /\\/[a-z_-]+\\/[a-z_-]+\\//i, // Unix file paths\n /[A-Z]:\\\\[^\\s]+/, // Windows file paths\n\n // A secret assigned to a name — `password=hunter2`, `token: eyJ...`. The\n // value must carry a digit or symbol, which is what separates a credential\n // from the English word that follows a colon in \"Password: too short\".\n /\\b(password|passwd|pwd|secret|token|api[-_]?key|private[-_]?key|credentials?)\\b\\s*[:=]\\s*[\"']?(?=[^\\s\"']{6,})[A-Za-z]*[0-9+/=_\\-.]/i,\n /\\b[a-z][a-z0-9+.-]*:\\/\\/[^\\s/@]*:[^\\s/@]+@/i, // credentials inside a connection URL\n /\\bbearer\\s+\\S{8,}/i, // Authorization header\n /\\beyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}/, // JWT\n /\\b(sk|pk|rk)[-_](live|test|ant|proj)[-_]\\w{8,}/i, // vendor-prefixed API keys\n /\\b[A-Fa-f0-9]{32,}\\b/, // raw hex blob — never meaningful to a reader\n /\\b[A-Za-z0-9+/]{40,}={0,2}\\b/, // raw base64 blob\n /\\b[A-Z][A-Z0-9]*_(SECRET|KEY|TOKEN|PASSWORD|PASSWD|CREDENTIALS?)\\b/, // server env var names\n];\n\nconst DEFAULT_AUTH_ERROR = 'An error occurred. Please try again.';\n\n/**\n * Sanitize error messages to prevent information disclosure.\n * Passes through safe, user-facing messages while replacing\n * server-internal details with a generic fallback.\n *\n * Exported for its own tests: the cost of this function getting it wrong is\n * silent — the user is shown a message that says nothing, and no log records\n * that a specific one was suppressed.\n */\nexport function sanitizeErrorMessage(err: unknown, fallback: string = DEFAULT_AUTH_ERROR): string {\n if (!(err instanceof Error)) return fallback;\n\n const message = err.message;\n\n // Reject messages that look like internal server errors\n for (const pattern of UNSAFE_ERROR_PATTERNS) {\n if (pattern.test(message)) return fallback;\n }\n\n // Reject overly long messages (likely stack traces or debug info)\n if (message.length > 200) return fallback;\n\n return message;\n}\n\n// =============================================================================\n// DEFAULT SCHEMAS\n// =============================================================================\n\nconst defaultLoginSchema = z.object({\n email: z.string().email('Please enter a valid email'),\n password: z.string().min(1, 'Password is required'),\n rememberMe: z.boolean().optional(),\n});\n\nconst createRegisterSchema = (minPasswordLength: number = 8, requireTerms: boolean = true) =>\n z\n .object({\n email: z.string().email('Please enter a valid email'),\n password: z.string().min(minPasswordLength, `Password must be at least ${minPasswordLength} characters`),\n confirmPassword: z.string(),\n firstName: z.string().optional(),\n lastName: z.string().optional(),\n acceptTerms: requireTerms\n ? z.boolean().refine((val) => val === true, { message: 'You must accept the terms' })\n : z.boolean().optional(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: 'Passwords do not match',\n path: ['confirmPassword'],\n });\n\nconst defaultForgotPasswordSchema = z.object({\n email: z.string().email('Please enter a valid email'),\n});\n\nconst createResetPasswordSchema = (minPasswordLength: number = 8) =>\n z\n .object({\n password: z.string().min(minPasswordLength, `Password must be at least ${minPasswordLength} characters`),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: 'Passwords do not match',\n path: ['confirmPassword'],\n });\n\nconst createVerifyCodeSchema = (codeLength: number = 6) =>\n z.object({\n code: z.string().length(codeLength, `Code must be ${codeLength} digits`),\n });\n\n// =============================================================================\n// LOGIN FORM\n// =============================================================================\n\n/**\n * Login form component with email/password authentication.\n *\n * @example\n * ```tsx\n * <LoginForm\n * onSubmit={async (data) => {\n * await signIn(data.email, data.password);\n * }}\n * showRememberMe\n * showForgotPassword\n * onForgotPassword={() => navigate('/forgot-password')}\n * />\n * ```\n */\nexport function LoginForm({\n onSubmit,\n loading = false,\n disabled = false,\n showRememberMe = true,\n showForgotPassword = true,\n onForgotPassword,\n showSocialLogin = false,\n socialProviders = [],\n schema,\n labels = {},\n sx,\n slotProps,\n}: LoginFormProps): ReactNode {\n const [showPassword, setShowPassword] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const methods = useForm<LoginFormData>({\n resolver: zodResolver(schema ?? (defaultLoginSchema as any)) as Resolver<LoginFormData>,\n defaultValues: {\n email: '',\n password: '',\n rememberMe: false,\n },\n });\n\n // `loading` is a prop, so a caller that does not track its own pending state\n // leaves every control enabled for the whole of an in-flight submit — two\n // clicks on \"Sign In\" send two logins, and this component is the one that\n // opened the async boundary. react-hook-form already knows its handler is\n // running; `busy` is the disjunction, so a caller that drives `loading`\n // keeps control and one that does not still gets a form that locks itself.\n const busy = loading || methods.formState.isSubmitting;\n\n const handleSubmit = methods.handleSubmit(async (data: LoginFormData) => {\n setError(null);\n try {\n await onSubmit(data);\n } catch (err) {\n setError(sanitizeErrorMessage(err));\n }\n });\n\n return (\n <FormProvider {...methods}>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={[{ display: 'flex', flexDirection: 'column', gap: 2.5 }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...slotProps?.wrapper}\n >\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n <Field.Text\n name=\"email\"\n label={labels.email ?? 'Email'}\n type=\"email\"\n autoComplete=\"email\"\n disabled={disabled || busy}\n {...slotProps?.textField}\n />\n\n <Field.Text\n name=\"password\"\n label={labels.password ?? 'Password'}\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"current-password\"\n disabled={disabled || busy}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => setShowPassword(!showPassword)}\n edge=\"end\"\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n >\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n {...slotProps?.textField}\n />\n\n {(showRememberMe || showForgotPassword) && (\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n {showRememberMe && (\n <Field.Checkbox\n name=\"rememberMe\"\n label={labels.rememberMe ?? 'Remember me'}\n disabled={disabled || busy}\n />\n )}\n {showForgotPassword && (\n <Link\n component=\"button\"\n type=\"button\"\n variant=\"body2\"\n onClick={onForgotPassword}\n sx={{ textDecoration: 'none' }}\n >\n {labels.forgotPassword ?? 'Forgot password?'}\n </Link>\n )}\n </Box>\n )}\n\n <Button\n type=\"submit\"\n variant=\"contained\"\n size=\"large\"\n fullWidth\n disabled={disabled || busy}\n {...slotProps?.submitButton}\n >\n {busy ? <CircularProgress size={24} color=\"inherit\" /> : (labels.submit ?? 'Sign In')}\n </Button>\n\n {showSocialLogin && socialProviders.length > 0 && (\n <>\n <Divider>\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {labels.socialDivider ?? 'or continue with'}\n </Typography>\n </Divider>\n <Box sx={{ display: 'flex', gap: 1.5, justifyContent: 'center' }}>\n {socialProviders.map((provider) => (\n <IconButton\n key={provider.id}\n onClick={provider.onClick}\n disabled={disabled || busy}\n sx={{\n border: 1,\n borderColor: 'divider',\n borderRadius: 1,\n p: 1,\n }}\n aria-label={`Sign in with ${provider.name}`}\n >\n {provider.icon}\n </IconButton>\n ))}\n </Box>\n </>\n )}\n </Box>\n </FormProvider>\n );\n}\n\n// =============================================================================\n// REGISTER FORM\n// =============================================================================\n\n/**\n * Registration form component.\n *\n * @example\n * ```tsx\n * <RegisterForm\n * onSubmit={async (data) => {\n * await signUp(data);\n * }}\n * showNameFields\n * requireTerms\n * onTermsClick={() => window.open('/terms')}\n * />\n * ```\n */\nexport function RegisterForm({\n onSubmit,\n loading = false,\n disabled = false,\n showNameFields = false,\n requireTerms = true,\n onTermsClick,\n onPrivacyClick,\n minPasswordLength = 8,\n schema,\n labels = {},\n sx,\n slotProps,\n}: RegisterFormProps): ReactNode {\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const methods = useForm<RegisterFormData>({\n resolver: zodResolver(\n schema ?? (createRegisterSchema(minPasswordLength, requireTerms) as any)\n ) as Resolver<RegisterFormData>,\n defaultValues: {\n email: '',\n password: '',\n confirmPassword: '',\n firstName: '',\n lastName: '',\n acceptTerms: false,\n },\n });\n\n const busy = loading || methods.formState.isSubmitting;\n\n const handleSubmit = methods.handleSubmit(async (data: RegisterFormData) => {\n setError(null);\n try {\n await onSubmit(data);\n } catch (err) {\n setError(sanitizeErrorMessage(err));\n }\n });\n\n return (\n <FormProvider {...methods}>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={[{ display: 'flex', flexDirection: 'column', gap: 2.5 }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...slotProps?.wrapper}\n >\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n {showNameFields && (\n <Box sx={{ display: 'flex', gap: 2 }}>\n <Field.Text\n name=\"firstName\"\n label={labels.firstName ?? 'First Name'}\n autoComplete=\"given-name\"\n disabled={disabled || busy}\n {...slotProps?.textField}\n />\n <Field.Text\n name=\"lastName\"\n label={labels.lastName ?? 'Last Name'}\n autoComplete=\"family-name\"\n disabled={disabled || busy}\n {...slotProps?.textField}\n />\n </Box>\n )}\n\n <Field.Text\n name=\"email\"\n label={labels.email ?? 'Email'}\n type=\"email\"\n autoComplete=\"email\"\n disabled={disabled || busy}\n {...slotProps?.textField}\n />\n\n <Field.Text\n name=\"password\"\n label={labels.password ?? 'Password'}\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"new-password\"\n disabled={disabled || busy}\n helperText={`At least ${minPasswordLength} characters`}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => setShowPassword(!showPassword)}\n edge=\"end\"\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n >\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n {...slotProps?.textField}\n />\n\n <Field.Text\n name=\"confirmPassword\"\n label={labels.confirmPassword ?? 'Confirm Password'}\n type={showConfirmPassword ? 'text' : 'password'}\n autoComplete=\"new-password\"\n disabled={disabled || busy}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n edge=\"end\"\n aria-label={showConfirmPassword ? 'Hide password' : 'Show password'}\n >\n {showConfirmPassword ? <EyeOffIcon /> : <EyeIcon />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n {...slotProps?.textField}\n />\n\n {requireTerms && (\n <Field.Checkbox\n name=\"acceptTerms\"\n disabled={disabled || busy}\n label={\n <Typography variant=\"body2\" component=\"span\">\n {labels.acceptTerms ?? 'I agree to the '}\n <Link component=\"button\" type=\"button\" onClick={onTermsClick}>\n {labels.termsLink ?? 'Terms of Service'}\n </Link>\n {' and '}\n <Link component=\"button\" type=\"button\" onClick={onPrivacyClick}>\n {labels.privacyLink ?? 'Privacy Policy'}\n </Link>\n </Typography>\n }\n />\n )}\n\n <Button\n type=\"submit\"\n variant=\"contained\"\n size=\"large\"\n fullWidth\n disabled={disabled || busy}\n {...slotProps?.submitButton}\n >\n {busy ? <CircularProgress size={24} color=\"inherit\" /> : (labels.submit ?? 'Create Account')}\n </Button>\n </Box>\n </FormProvider>\n );\n}\n\n// =============================================================================\n// FORGOT PASSWORD FORM\n// =============================================================================\n\n/**\n * Forgot password form component.\n *\n * @example\n * ```tsx\n * <ForgotPasswordForm\n * onSubmit={async (data) => {\n * await sendPasswordResetEmail(data.email);\n * }}\n * onBackToLogin={() => navigate('/login')}\n * />\n * ```\n */\nexport function ForgotPasswordForm({\n onSubmit,\n loading = false,\n disabled = false,\n onBackToLogin,\n schema,\n labels = {},\n sx,\n slotProps,\n}: ForgotPasswordFormProps): ReactNode {\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n\n const methods = useForm<ForgotPasswordFormData>({\n resolver: zodResolver(schema ?? (defaultForgotPasswordSchema as any)) as Resolver<ForgotPasswordFormData>,\n defaultValues: {\n email: '',\n },\n });\n\n const busy = loading || methods.formState.isSubmitting;\n\n const handleSubmit = methods.handleSubmit(async (data: ForgotPasswordFormData) => {\n setError(null);\n try {\n await onSubmit(data);\n setSuccess(true);\n } catch (err) {\n setError(sanitizeErrorMessage(err));\n }\n });\n\n if (success) {\n return (\n <Box sx={{ textAlign: 'center' }}>\n <Typography variant=\"h6\" gutterBottom>\n Check your email\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.secondary\",\n mb: 3\n }}>\n We sent a password reset link to your email address.\n </Typography>\n {onBackToLogin && (\n <Button variant=\"text\" onClick={onBackToLogin}>\n {labels.backToLogin ?? 'Back to login'}\n </Button>\n )}\n </Box>\n );\n }\n\n return (\n <FormProvider {...methods}>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={[{ display: 'flex', flexDirection: 'column', gap: 2.5 }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...slotProps?.wrapper}\n >\n <Box sx={{ textAlign: 'center', mb: 1 }}>\n <Typography variant=\"h6\" gutterBottom>\n {labels.title ?? 'Forgot password?'}\n </Typography>\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {labels.description ?? \"Enter your email and we'll send you a reset link.\"}\n </Typography>\n </Box>\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n <Field.Text\n name=\"email\"\n label={labels.email ?? 'Email'}\n type=\"email\"\n autoComplete=\"email\"\n disabled={disabled || busy}\n {...slotProps?.textField}\n />\n\n <Button\n type=\"submit\"\n variant=\"contained\"\n size=\"large\"\n fullWidth\n disabled={disabled || busy}\n {...slotProps?.submitButton}\n >\n {busy ? <CircularProgress size={24} color=\"inherit\" /> : (labels.submit ?? 'Send Reset Link')}\n </Button>\n\n {onBackToLogin && (\n <Button variant=\"text\" onClick={onBackToLogin} disabled={loading}>\n {labels.backToLogin ?? 'Back to login'}\n </Button>\n )}\n </Box>\n </FormProvider>\n );\n}\n\n// =============================================================================\n// RESET PASSWORD FORM\n// =============================================================================\n\n/**\n * Reset password form component.\n *\n * @example\n * ```tsx\n * <ResetPasswordForm\n * onSubmit={async (data) => {\n * await resetPassword(token, data.password);\n * }}\n * />\n * ```\n */\nexport function ResetPasswordForm({\n onSubmit,\n loading = false,\n disabled = false,\n minPasswordLength = 8,\n schema,\n labels = {},\n sx,\n slotProps,\n}: ResetPasswordFormProps): ReactNode {\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const methods = useForm<ResetPasswordFormData>({\n resolver: zodResolver(\n schema ?? (createResetPasswordSchema(minPasswordLength) as any)\n ) as Resolver<ResetPasswordFormData>,\n defaultValues: {\n password: '',\n confirmPassword: '',\n },\n });\n\n const busy = loading || methods.formState.isSubmitting;\n\n const handleSubmit = methods.handleSubmit(async (data: ResetPasswordFormData) => {\n setError(null);\n try {\n await onSubmit(data);\n } catch (err) {\n setError(sanitizeErrorMessage(err));\n }\n });\n\n return (\n <FormProvider {...methods}>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={[{ display: 'flex', flexDirection: 'column', gap: 2.5 }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...slotProps?.wrapper}\n >\n <Box sx={{ textAlign: 'center', mb: 1 }}>\n <Typography variant=\"h6\" gutterBottom>\n {labels.title ?? 'Set new password'}\n </Typography>\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {labels.description ?? 'Create a new password for your account.'}\n </Typography>\n </Box>\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n <Field.Text\n name=\"password\"\n label={labels.password ?? 'New Password'}\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"new-password\"\n disabled={disabled || busy}\n helperText={`At least ${minPasswordLength} characters`}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => setShowPassword(!showPassword)}\n edge=\"end\"\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n >\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n {...slotProps?.textField}\n />\n\n <Field.Text\n name=\"confirmPassword\"\n label={labels.confirmPassword ?? 'Confirm Password'}\n type={showConfirmPassword ? 'text' : 'password'}\n autoComplete=\"new-password\"\n disabled={disabled || busy}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n edge=\"end\"\n aria-label={showConfirmPassword ? 'Hide password' : 'Show password'}\n >\n {showConfirmPassword ? <EyeOffIcon /> : <EyeIcon />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n {...slotProps?.textField}\n />\n\n <Button\n type=\"submit\"\n variant=\"contained\"\n size=\"large\"\n fullWidth\n disabled={disabled || busy}\n {...slotProps?.submitButton}\n >\n {busy ? <CircularProgress size={24} color=\"inherit\" /> : (labels.submit ?? 'Reset Password')}\n </Button>\n </Box>\n </FormProvider>\n );\n}\n\n// =============================================================================\n// VERIFY CODE FORM\n// =============================================================================\n\n/**\n * Verify code form component (OTP verification).\n *\n * @example\n * ```tsx\n * <VerifyCodeForm\n * onSubmit={async (data) => {\n * await verifyCode(data.code);\n * }}\n * onResendCode={async () => {\n * await resendVerificationCode();\n * }}\n * resendCooldown={60}\n * />\n * ```\n */\nexport function VerifyCodeForm({\n onSubmit,\n loading = false,\n disabled = false,\n codeLength = 6,\n onResendCode,\n resendCooldown = 60,\n schema,\n labels = {},\n sx,\n slotProps,\n}: VerifyCodeFormProps): ReactNode {\n const [error, setError] = useState<string | null>(null);\n const [cooldown, setCooldown] = useState(0);\n const [resending, setResending] = useState(false);\n const resendingRef = useRef(false);\n\n const methods = useForm<VerifyCodeFormData>({\n resolver: zodResolver(schema ?? (createVerifyCodeSchema(codeLength) as any)) as Resolver<VerifyCodeFormData>,\n defaultValues: {\n code: '',\n },\n });\n\n const busy = loading || methods.formState.isSubmitting;\n\n // Cooldown timer\n useEffect(() => {\n if (cooldown > 0) {\n const timer = setTimeout(() => setCooldown(cooldown - 1), 1000);\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [cooldown]);\n\n const handleResendCode = useCallback(async () => {\n // `cooldown` is set after the await, so it gates the caller that arrives\n // once the first request has returned — not the one that arrives while it\n // is still open. Two clicks a moment apart therefore both got through and\n // sent two codes, which on a rate-limited endpoint locks the user out of\n // the flow they are trying to finish. The ref is what closes that window:\n // `resending` state is committed a render too late to guard anything, and\n // exists only to disable the link.\n if (cooldown > 0 || resendingRef.current || !onResendCode) return;\n resendingRef.current = true;\n setResending(true);\n // A resend that fails and is then retried successfully used to leave the\n // failure on screen: the user reads \"Failed to resend code\" with the code\n // already in their inbox.\n setError(null);\n try {\n await onResendCode();\n setCooldown(resendCooldown);\n } catch (err) {\n setError(sanitizeErrorMessage(err, 'Failed to resend code'));\n } finally {\n resendingRef.current = false;\n setResending(false);\n }\n }, [cooldown, onResendCode, resendCooldown]);\n\n const handleSubmit = methods.handleSubmit(async (data: VerifyCodeFormData) => {\n setError(null);\n try {\n await onSubmit(data);\n } catch (err) {\n setError(sanitizeErrorMessage(err));\n }\n });\n\n return (\n <FormProvider {...methods}>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={[\n { display: 'flex', flexDirection: 'column', gap: 2.5, alignItems: 'center' },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...slotProps?.wrapper}\n >\n <Box sx={{ textAlign: 'center', mb: 1 }}>\n <Typography variant=\"h6\" gutterBottom>\n {labels.title ?? 'Enter verification code'}\n </Typography>\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {labels.description ?? 'We sent a verification code to your email.'}\n </Typography>\n </Box>\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)} sx={{ width: '100%' }}>\n {error}\n </Alert>\n )}\n\n <Field.Code name=\"code\" length={codeLength} autoFocus disabled={disabled || busy} />\n\n <Button\n type=\"submit\"\n variant=\"contained\"\n size=\"large\"\n fullWidth\n disabled={disabled || busy}\n {...slotProps?.submitButton}\n >\n {busy ? <CircularProgress size={24} color=\"inherit\" /> : (labels.submit ?? 'Verify')}\n </Button>\n\n {onResendCode && (\n <Box sx={{ textAlign: 'center' }}>\n {cooldown > 0 ? (\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {labels.resendIn ?? 'Resend code in'} {cooldown}s\n </Typography>\n ) : (\n <Link\n component=\"button\"\n type=\"button\"\n variant=\"body2\"\n onClick={handleResendCode}\n disabled={disabled || busy || resending}\n >\n {labels.resendCode ?? \"Didn't receive the code? Resend\"}\n </Link>\n )}\n </Box>\n )}\n </Box>\n </FormProvider>\n );\n}\n\n// =============================================================================\n// EXPORTS\n// =============================================================================\n\n/**\n * AuthBlock namespace for auth-related forms.\n */\nexport const AuthBlock = {\n Login: LoginForm,\n Register: RegisterForm,\n ForgotPassword: ForgotPasswordForm,\n ResetPassword: ResetPasswordForm,\n VerifyCode: VerifyCodeForm,\n} as const;\n","'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 (user must have ALL) */\n permissions?: Permission[];\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 requireEmailVerified = false,\n roleMatchStrategy = 'any',\n loadingComponent = null,\n onAccessDenied,\n accessDeniedComponent = null,\n}: RoleBasedGuardProps): ReactNode {\n const { isAuthenticated, isLoading, user } = useAuth();\n const [checked, setChecked] = useState(false);\n const [accessGranted, setAccessGranted] = useState(false);\n\n useEffect(() => {\n if (!isLoading) {\n // Check authentication\n if (!isAuthenticated || !user) {\n onAccessDenied?.('not_authenticated');\n setAccessGranted(false);\n setChecked(true);\n return;\n }\n\n // Check email verification\n if (requireEmailVerified && !user.emailVerified) {\n onAccessDenied?.('email_not_verified');\n setAccessGranted(false);\n setChecked(true);\n return;\n }\n\n // Check roles\n if (roles.length > 0) {\n const userRoles = user.roles ?? [];\n const hasRequiredRole =\n roleMatchStrategy === 'all'\n ? roles.every((role) => userRoles.includes(role))\n : roles.some((role) => userRoles.includes(role));\n\n if (!hasRequiredRole) {\n onAccessDenied?.('missing_role');\n setAccessGranted(false);\n setChecked(true);\n return;\n }\n }\n\n // Check permissions (always ALL)\n if (permissions.length > 0) {\n const userPermissions = user.permissions ?? [];\n const hasAllPermissions = permissions.every((perm) => userPermissions.includes(perm));\n\n if (!hasAllPermissions) {\n onAccessDenied?.('missing_permission');\n setAccessGranted(false);\n setChecked(true);\n return;\n }\n }\n\n // Access granted\n setAccessGranted(true);\n setChecked(true);\n }\n }, [isAuthenticated, isLoading, user, roles, permissions, requireEmailVerified, roleMatchStrategy, onAccessDenied]);\n\n if (isLoading || !checked) {\n return loadingComponent;\n }\n\n if (!accessGranted) {\n return accessDeniedComponent;\n }\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","/**\n * DataGrid Block Component\n *\n * Advanced data table block with toolbar, pagination, sorting, filtering,\n * row actions, and server-side data support.\n *\n * @module blocks/data-grid-block\n */\n\n'use client';\n\nimport {\n type ReactNode,\n type MouseEvent,\n createContext,\n useContext,\n useMemo,\n useState,\n useCallback,\n useRef,\n useEffect,\n} from 'react';\nimport Box from '@mui/material/Box';\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Divider from '@mui/material/Divider';\nimport Tooltip from '@mui/material/Tooltip';\nimport { SearchInput } from '../../components/search-input/search-input.js';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport {\n DataGrid,\n type GridColDef,\n type GridRenderCellParams,\n type GridPaginationModel,\n type GridSortModel,\n type GridFilterModel,\n type GridRowSelectionModel,\n type GridCallbackDetails,\n type GridDensity,\n type GridRowId,\n GridToolbarContainer,\n GridToolbarColumnsButton,\n GridToolbarDensitySelector,\n GridToolbarExport,\n} from '@mui/x-data-grid';\nimport type {\n DataGridBlockProps,\n DataGridBlockContextValue,\n DataGridRowAction,\n UseDataGridBlockOptions,\n UseDataGridBlockReturn,\n DataGridFetchParams,\n} from './types.js';\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst DataGridBlockContext = createContext<DataGridBlockContextValue | null>(null);\n\n/**\n * Hook to access data grid block context.\n */\nexport function useDataGridBlockContext(): DataGridBlockContextValue {\n const context = useContext(DataGridBlockContext);\n if (!context) {\n throw new Error('useDataGridBlockContext must be used within DataGridBlock');\n }\n return context;\n}\n\n// =============================================================================\n// ICONS\n// =============================================================================\n\nfunction MoreVertIcon(): ReactNode {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n </svg>\n );\n}\n\nfunction EmptyIcon(): ReactNode {\n return (\n <svg\n width=\"64\"\n height=\"64\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n style={{ opacity: 0.4 }}\n >\n <path d=\"M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z\" />\n <polyline points=\"13 2 13 9 20 9\" />\n <line x1=\"10\" y1=\"12\" x2=\"10\" y2=\"18\" />\n <line x1=\"14\" y1=\"12\" x2=\"14\" y2=\"18\" />\n <line x1=\"10\" y1=\"15\" x2=\"14\" y2=\"15\" />\n </svg>\n );\n}\n\n// =============================================================================\n// CUSTOM TOOLBAR\n// =============================================================================\n\ninterface CustomToolbarProps {\n quickFilter?: {\n enabled?: boolean;\n placeholder?: string;\n debounceMs?: number;\n };\n exportConfig?: {\n csv?: boolean;\n excel?: boolean;\n print?: boolean;\n };\n showColumnSelector?: boolean;\n showDensitySelector?: boolean;\n startContent?: ReactNode;\n endContent?: ReactNode;\n actions?: ReactNode;\n onQuickFilterChange?: (value: string) => void;\n}\n\nfunction CustomToolbar({\n quickFilter,\n exportConfig,\n showColumnSelector = true,\n showDensitySelector = true,\n startContent,\n endContent,\n actions,\n onQuickFilterChange,\n}: CustomToolbarProps): ReactNode {\n const [searchValue, setSearchValue] = useState('');\n const debounceRef = useRef<NodeJS.Timeout | null>(null);\n\n // Cleanup debounce timer on unmount\n useEffect(\n () => () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n },\n []\n );\n\n const handleSearchChange = useCallback(\n (value: string) => {\n setSearchValue(value);\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n debounceRef.current = setTimeout(() => {\n onQuickFilterChange?.(value);\n }, quickFilter?.debounceMs ?? 300);\n },\n [onQuickFilterChange, quickFilter?.debounceMs]\n );\n\n return (\n <GridToolbarContainer\n sx={{\n gap: 1.5,\n p: 2,\n borderBottom: 1,\n borderColor: 'divider',\n }}\n >\n {startContent}\n\n {quickFilter?.enabled !== false && (\n <SearchInput\n value={searchValue}\n onChange={handleSearchChange}\n placeholder={quickFilter?.placeholder ?? 'Search...'}\n fullWidth={false}\n minWidth={200}\n />\n )}\n\n <Box sx={{ flex: 1 }} />\n\n {showColumnSelector && <GridToolbarColumnsButton />}\n {showDensitySelector && <GridToolbarDensitySelector />}\n\n {(exportConfig?.csv !== false || exportConfig?.print !== false) && (\n <GridToolbarExport\n printOptions={exportConfig?.print === false ? { disableToolbarButton: true } : undefined}\n csvOptions={exportConfig?.csv === false ? { disableToolbarButton: true } : undefined}\n />\n )}\n\n {actions}\n {endContent}\n </GridToolbarContainer>\n );\n}\n\n// =============================================================================\n// ROW ACTIONS CELL\n// =============================================================================\n\ninterface RowActionsCellProps<R> {\n row: R;\n actions: DataGridRowAction<R>[];\n}\n\nfunction RowActionsCell<R extends Record<string, unknown>>({ row, actions }: RowActionsCellProps<R>): ReactNode {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const handleClick = useCallback((event: MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n }, []);\n\n const handleClose = useCallback(() => {\n setAnchorEl(null);\n }, []);\n\n const handleAction = useCallback(\n (action: DataGridRowAction<R>, event: MouseEvent<HTMLElement>) => {\n setAnchorEl(null);\n action.onClick(row, event);\n },\n [row]\n );\n\n const visibleActions = actions.filter((action) => {\n if (typeof action.hidden === 'function') {\n return !action.hidden(row);\n }\n return !action.hidden;\n });\n\n if (visibleActions.length === 0) {\n return null;\n }\n\n // If only 1-2 actions, show inline buttons\n if (visibleActions.length <= 2) {\n return (\n <Box sx={{ display: 'flex', gap: 0.5 }}>\n {visibleActions.map((action) => {\n const isDisabled = typeof action.disabled === 'function' ? action.disabled(row) : action.disabled;\n\n return (\n <Tooltip key={action.key} title={action.label}>\n <span>\n <IconButton\n size=\"small\"\n color={action.color ?? 'default'}\n disabled={isDisabled}\n onClick={(e) => handleAction(action, e)}\n aria-label={action.label}\n >\n {action.icon ?? action.label.charAt(0)}\n </IconButton>\n </span>\n </Tooltip>\n );\n })}\n </Box>\n );\n }\n\n // More than 2 actions, show menu\n return (\n <>\n <IconButton\n size=\"small\"\n onClick={handleClick}\n aria-label=\"Row actions\"\n aria-controls={open ? 'row-actions-menu' : undefined}\n aria-haspopup=\"true\"\n aria-expanded={open ? 'true' : undefined}\n >\n <MoreVertIcon />\n </IconButton>\n <Menu\n id=\"row-actions-menu\"\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n onClick={(e) => e.stopPropagation()}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n {visibleActions.map((action, index) => {\n const isDisabled = typeof action.disabled === 'function' ? action.disabled(row) : action.disabled;\n\n return [\n <MenuItem key={action.key} disabled={isDisabled} onClick={(e) => handleAction(action, e)}>\n {action.icon && <ListItemIcon>{action.icon}</ListItemIcon>}\n <ListItemText primary={action.label} sx={{ color: action.color ? `${action.color}.main` : undefined }} />\n </MenuItem>,\n action.divider && index < visibleActions.length - 1 && <Divider key={`${action.key}-divider`} />,\n ];\n })}\n </Menu>\n </>\n );\n}\n\n// =============================================================================\n// EMPTY STATE\n// =============================================================================\n\ninterface EmptyStateProps {\n icon?: ReactNode;\n title?: string;\n description?: string;\n action?: {\n label: string;\n onClick: () => void;\n };\n component?: ReactNode;\n}\n\nfunction EmptyState({\n icon,\n title = 'No data',\n description = 'No records to display.',\n action,\n component,\n}: EmptyStateProps): ReactNode {\n if (component) {\n return <>{component}</>;\n }\n\n return (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n py: 8,\n px: 3,\n textAlign: 'center',\n }}\n >\n <Box sx={{ mb: 2, color: 'text.disabled' }}>{icon ?? <EmptyIcon />}</Box>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.secondary\",\n mb: action ? 2 : 0\n }}>\n {description}\n </Typography>\n {action && (\n <Button variant=\"contained\" size=\"small\" onClick={action.onClick}>\n {action.label}\n </Button>\n )}\n </Box>\n );\n}\n\n// =============================================================================\n// ERROR STATE\n// =============================================================================\n\ninterface ErrorStateProps {\n message?: string;\n onRetry?: () => void;\n}\n\nfunction ErrorState({ message = 'Failed to load data', onRetry }: ErrorStateProps): ReactNode {\n return (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n py: 8,\n px: 3,\n textAlign: 'center',\n }}\n >\n <Typography color=\"error\" variant=\"body1\" gutterBottom>\n {message}\n </Typography>\n {onRetry && (\n <Button variant=\"outlined\" size=\"small\" onClick={onRetry} sx={{ mt: 1 }}>\n Retry\n </Button>\n )}\n </Box>\n );\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * DataGridBlock - Advanced data table with common patterns.\n *\n * Features:\n * - Custom toolbar with search, filters, export, and column visibility\n * - Row actions column (inline or dropdown menu)\n * - Server-side pagination, sorting, and filtering support\n * - Custom empty state\n * - Loading and error states\n * - Selection handling\n * - Density customization\n *\n * @example\n * ```tsx\n * <DataGridBlock\n * columns={[\n * { field: 'name', headerName: 'Name', flex: 1 },\n * { field: 'email', headerName: 'Email', flex: 1 },\n * { field: 'status', headerName: 'Status', width: 120 },\n * ]}\n * rows={users}\n * loading={isLoading}\n * rowActions={[\n * { key: 'edit', label: 'Edit', icon: <EditIcon />, onClick: handleEdit },\n * { key: 'delete', label: 'Delete', icon: <DeleteIcon />, color: 'error', onClick: handleDelete },\n * ]}\n * toolbar={{\n * quickFilter: { placeholder: 'Search users...' },\n * export: { csv: true },\n * }}\n * pagination={{\n * mode: 'server',\n * rowCount: totalCount,\n * }}\n * onPaginationChange={handlePaginationChange}\n * />\n * ```\n */\nexport function DataGridBlock<R extends Record<string, unknown> = Record<string, unknown>>({\n columns,\n rows,\n loading = false,\n error = false,\n errorMessage,\n onRetry,\n rowActions,\n rowActionsWidth = 80,\n toolbar,\n pagination,\n selection,\n empty,\n density: defaultDensity = 'standard',\n autoHeight = false,\n height = 500,\n hideFooter = false,\n rowHeight,\n getRowId,\n onRowClick,\n onRowDoubleClick,\n onSelectionChange,\n onPaginationChange,\n onSortChange,\n onFilterChange,\n paginationModel: controlledPaginationModel,\n sortModel: controlledSortModel,\n filterModel: controlledFilterModel,\n selectionModel: controlledSelectionModel,\n columnVisibilityModel,\n onColumnVisibilityChange,\n slots,\n slotProps,\n disableColumnMenu = false,\n disableColumnFilter = false,\n disableColumnSelector = false,\n disableRowSelectionOnClick = true,\n disableVirtualization = false,\n sx,\n}: DataGridBlockProps<R>): ReactNode {\n const [density, setDensity] = useState<GridDensity>(defaultDensity);\n const [internalPaginationModel, setInternalPaginationModel] = useState<GridPaginationModel>({\n page: 0,\n pageSize: pagination?.defaultPageSize ?? 25,\n });\n const [internalSortModel, setInternalSortModel] = useState<GridSortModel>([]);\n const [internalFilterModel, setInternalFilterModel] = useState<GridFilterModel>({ items: [] });\n const [internalSelectionModel, setInternalSelectionModel] = useState<GridRowSelectionModel>({\n type: 'include',\n ids: new Set<GridRowId>(),\n });\n const [quickFilterValue, setQuickFilterValue] = useState('');\n\n // Use controlled or internal state\n const paginationModel = controlledPaginationModel ?? internalPaginationModel;\n const sortModel = controlledSortModel ?? internalSortModel;\n const filterModel = controlledFilterModel ?? internalFilterModel;\n const selectionModelValue = controlledSelectionModel ?? internalSelectionModel;\n\n // Build columns with row actions\n const finalColumns = useMemo<GridColDef<R>[]>(() => {\n if (!rowActions || rowActions.length === 0) {\n return columns;\n }\n\n const actionsColumn: GridColDef<R> = {\n field: '__actions__',\n headerName: '',\n width: rowActionsWidth,\n sortable: false,\n filterable: false,\n disableColumnMenu: true,\n disableReorder: true,\n renderCell: (params: GridRenderCellParams<R>) => <RowActionsCell row={params.row} actions={rowActions} />,\n };\n\n return [...columns, actionsColumn];\n }, [columns, rowActions, rowActionsWidth]);\n\n // Handlers\n const handlePaginationChange = useCallback(\n (model: GridPaginationModel, details: GridCallbackDetails) => {\n if (!controlledPaginationModel) {\n setInternalPaginationModel(model);\n }\n onPaginationChange?.(model);\n },\n [controlledPaginationModel, onPaginationChange]\n );\n\n const handleSortChange = useCallback(\n (model: GridSortModel, details: GridCallbackDetails) => {\n if (!controlledSortModel) {\n setInternalSortModel(model);\n }\n onSortChange?.(model);\n },\n [controlledSortModel, onSortChange]\n );\n\n const handleFilterChange = useCallback(\n (model: GridFilterModel, details: GridCallbackDetails) => {\n if (!controlledFilterModel) {\n setInternalFilterModel(model);\n }\n onFilterChange?.(model);\n },\n [controlledFilterModel, onFilterChange]\n );\n\n const handleSelectionChange = useCallback(\n (model: GridRowSelectionModel, details: GridCallbackDetails) => {\n if (!controlledSelectionModel) {\n setInternalSelectionModel(model);\n }\n onSelectionChange?.(model);\n },\n [controlledSelectionModel, onSelectionChange]\n );\n\n // Context value\n const contextValue = useMemo<DataGridBlockContextValue>(\n () => ({\n loading,\n error,\n density,\n setDensity,\n rowCount: rows.length,\n selectedCount: selectionModelValue.ids.size,\n refresh: onRetry,\n }),\n [loading, error, density, rows.length, selectionModelValue, onRetry]\n );\n\n // Determine row count for pagination\n const rowCount = pagination?.mode === 'server' ? (pagination.rowCount ?? 0) : rows.length;\n\n // Custom toolbar slot\n const toolbarSlot = useMemo(() => {\n if (toolbar?.show === false) {\n return undefined;\n }\n\n return () => (\n <CustomToolbar\n quickFilter={toolbar?.quickFilter}\n exportConfig={toolbar?.export}\n showColumnSelector={toolbar?.columnVisibility?.enabled !== false}\n showDensitySelector={toolbar?.densitySelector !== false}\n startContent={toolbar?.startContent}\n endContent={toolbar?.endContent}\n actions={toolbar?.actions}\n onQuickFilterChange={setQuickFilterValue}\n />\n );\n }, [toolbar]);\n\n // No data overlay\n const noRowsOverlay = useMemo(() => {\n if (error) {\n return () => <ErrorState message={errorMessage} onRetry={onRetry} />;\n }\n return () => (\n <EmptyState\n icon={empty?.icon}\n title={empty?.title}\n description={empty?.description}\n action={empty?.action}\n component={empty?.component}\n />\n );\n }, [error, errorMessage, onRetry, empty]);\n\n return (\n <DataGridBlockContext.Provider value={contextValue}>\n <Paper\n data-testid=\"prism-data-grid-block\"\n variant=\"outlined\"\n sx={[\n {\n width: '100%',\n overflow: 'hidden',\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n >\n <Box sx={{ width: '100%', height: autoHeight ? 'auto' : height }}>\n <DataGrid\n rows={rows}\n columns={finalColumns}\n loading={loading}\n density={density}\n autoHeight={autoHeight}\n rowHeight={rowHeight}\n getRowId={getRowId}\n onRowClick={onRowClick}\n onRowDoubleClick={onRowDoubleClick}\n // Pagination\n paginationMode={pagination?.mode ?? 'client'}\n paginationModel={paginationModel}\n onPaginationModelChange={handlePaginationChange}\n pageSizeOptions={pagination?.pageSizeOptions ?? [10, 25, 50, 100]}\n rowCount={rowCount}\n // Sorting\n sortingMode={pagination?.mode === 'server' ? 'server' : 'client'}\n sortModel={sortModel}\n onSortModelChange={handleSortChange}\n // Filtering\n filterMode={pagination?.mode === 'server' ? 'server' : 'client'}\n filterModel={filterModel}\n onFilterModelChange={handleFilterChange}\n // Selection\n checkboxSelection={selection?.checkboxSelection ?? false}\n rowSelectionModel={selectionModelValue}\n onRowSelectionModelChange={handleSelectionChange}\n disableRowSelectionOnClick={selection?.disableSelectionOnClick ?? disableRowSelectionOnClick}\n disableMultipleRowSelection={selection?.mode === 'single'}\n keepNonExistentRowsSelected={selection?.keepNonExistentRowsSelected}\n // Column visibility\n columnVisibilityModel={columnVisibilityModel}\n onColumnVisibilityModelChange={onColumnVisibilityChange}\n // Features\n disableColumnMenu={disableColumnMenu}\n disableColumnFilter={disableColumnFilter}\n disableColumnSelector={disableColumnSelector}\n disableVirtualization={disableVirtualization}\n hideFooter={hideFooter || pagination?.hide}\n // Slots\n slots={{\n toolbar: toolbarSlot,\n noRowsOverlay,\n loadingOverlay: () => <LinearProgress sx={{ position: 'absolute', top: 0, left: 0, right: 0 }} />,\n ...slots,\n }}\n slotProps={slotProps}\n sx={{\n border: 0,\n '& .MuiDataGrid-columnHeaders': {\n bgcolor: 'action.hover',\n },\n '& .MuiDataGrid-cell:focus': {\n outline: 'none',\n },\n '& .MuiDataGrid-row:hover': {\n bgcolor: 'action.hover',\n },\n }}\n />\n </Box>\n </Paper>\n </DataGridBlockContext.Provider>\n );\n}\n\n// =============================================================================\n// USE DATA GRID BLOCK HOOK\n// =============================================================================\n\n/**\n * Hook for managing DataGridBlock with server-side data fetching.\n *\n * @example\n * ```tsx\n * const { rows, loading, error, total, paginationModel, onPaginationChange, refresh } =\n * useDataGridBlock({\n * fetcher: async ({ page, pageSize, sortModel, filterModel }) => {\n * const response = await api.getUsers({ page, pageSize, sort: sortModel[0] });\n * return { rows: response.data, total: response.total };\n * },\n * });\n *\n * return (\n * <DataGridBlock\n * columns={columns}\n * rows={rows}\n * loading={loading}\n * error={!!error}\n * pagination={{ mode: 'server', rowCount: total }}\n * paginationModel={paginationModel}\n * onPaginationChange={onPaginationChange}\n * />\n * );\n * ```\n */\nexport function useDataGridBlock<R extends Record<string, unknown> = Record<string, unknown>>(\n options: UseDataGridBlockOptions<R>\n): UseDataGridBlockReturn<R> {\n const {\n fetcher,\n initialPageSize = 25,\n initialSortModel = [],\n initialFilterModel = { items: [] },\n autoFetch = true,\n keepPreviousData = true,\n } = options;\n\n const [rows, setRows] = useState<R[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [total, setTotal] = useState(0);\n\n const [paginationModel, setPaginationModel] = useState<GridPaginationModel>({\n page: 0,\n pageSize: initialPageSize,\n });\n const [sortModel, setSortModel] = useState<GridSortModel>(initialSortModel);\n const [filterModel, setFilterModel] = useState<GridFilterModel>(initialFilterModel);\n\n const isMountedRef = useRef(true);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const fetchData = useCallback(\n async (params: DataGridFetchParams) => {\n // Cancel previous request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n setLoading(true);\n setError(null);\n\n try {\n const result = await fetcher(params);\n if (isMountedRef.current) {\n setRows(result.rows);\n setTotal(result.total);\n }\n } catch (err) {\n if (isMountedRef.current && err instanceof Error && err.name !== 'AbortError') {\n setError(err);\n if (!keepPreviousData) {\n setRows([]);\n }\n }\n } finally {\n if (isMountedRef.current) {\n setLoading(false);\n }\n }\n },\n [fetcher, keepPreviousData]\n );\n\n const refresh = useCallback(() => {\n fetchData({\n page: paginationModel.page,\n pageSize: paginationModel.pageSize,\n sortModel,\n filterModel,\n });\n }, [fetchData, paginationModel, sortModel, filterModel]);\n\n const reset = useCallback(() => {\n setPaginationModel({ page: 0, pageSize: initialPageSize });\n setSortModel(initialSortModel);\n setFilterModel(initialFilterModel);\n }, [initialPageSize, initialSortModel, initialFilterModel]);\n\n // Fetch on params change\n useEffect(() => {\n if (autoFetch) {\n fetchData({\n page: paginationModel.page,\n pageSize: paginationModel.pageSize,\n sortModel,\n filterModel,\n });\n }\n }, [fetchData, paginationModel, sortModel, filterModel, autoFetch]);\n\n // Cleanup on unmount\n useEffect(\n () => () => {\n isMountedRef.current = false;\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n },\n []\n );\n\n const handlePaginationChange = useCallback((model: GridPaginationModel, _details: GridCallbackDetails) => {\n setPaginationModel(model);\n }, []);\n\n const handleSortChange = useCallback((model: GridSortModel, _details: GridCallbackDetails) => {\n setSortModel(model);\n // Reset to first page on sort change\n setPaginationModel((prev) => ({ ...prev, page: 0 }));\n }, []);\n\n const handleFilterChange = useCallback((model: GridFilterModel, _details: GridCallbackDetails) => {\n setFilterModel(model);\n // Reset to first page on filter change\n setPaginationModel((prev) => ({ ...prev, page: 0 }));\n }, []);\n\n return {\n rows,\n loading,\n error,\n total,\n paginationModel,\n sortModel,\n filterModel,\n onPaginationChange: handlePaginationChange,\n onSortChange: handleSortChange,\n onFilterChange: handleFilterChange,\n refresh,\n reset,\n };\n}\n"]}