@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.
- package/README.md +148 -0
- package/dist/blocks/index.js +3 -1
- package/dist/blocks/index.js.map +1 -1
- package/dist/{chunk-S6SEGBX6.js → chunk-472SOF76.js} +4 -4
- package/dist/{chunk-S6SEGBX6.js.map → chunk-472SOF76.js.map} +1 -1
- package/dist/{chunk-Z5OSPAOC.js → chunk-4Z5DE5GK.js} +78 -75
- package/dist/chunk-4Z5DE5GK.js.map +1 -0
- package/dist/chunk-52PQL67Q.js +559 -0
- package/dist/chunk-52PQL67Q.js.map +1 -0
- package/dist/chunk-75FQ5IW3.js +590 -0
- package/dist/chunk-75FQ5IW3.js.map +1 -0
- package/dist/{chunk-6AHI4GSV.js → chunk-7G5D5PTC.js} +4 -3
- package/dist/chunk-7G5D5PTC.js.map +1 -0
- package/dist/chunk-BJE2AKD4.js +105 -0
- package/dist/chunk-BJE2AKD4.js.map +1 -0
- package/dist/chunk-FF5RF32O.js +248 -0
- package/dist/chunk-FF5RF32O.js.map +1 -0
- package/dist/{chunk-OBJ244BO.js → chunk-GMIE6III.js} +9 -42
- package/dist/chunk-GMIE6III.js.map +1 -0
- package/dist/chunk-GUGTDURV.js +826 -0
- package/dist/chunk-GUGTDURV.js.map +1 -0
- package/dist/chunk-HOXFSQUV.js +573 -0
- package/dist/chunk-HOXFSQUV.js.map +1 -0
- package/dist/chunk-JSQTYDPG.js +3 -0
- package/dist/chunk-JSQTYDPG.js.map +1 -0
- package/dist/{chunk-ZTATTUH7.js → chunk-KQ67XB6T.js} +213 -651
- package/dist/chunk-KQ67XB6T.js.map +1 -0
- package/dist/{chunk-WFD54GQQ.js → chunk-LOY2NPCO.js} +14 -573
- package/dist/chunk-LOY2NPCO.js.map +1 -0
- package/dist/{chunk-YQW43BDH.js → chunk-LSPFFEJT.js} +240 -1824
- package/dist/chunk-LSPFFEJT.js.map +1 -0
- package/dist/{chunk-BZOL7GMU.js → chunk-OKTLA23Q.js} +4 -4
- package/dist/chunk-OKTLA23Q.js.map +1 -0
- package/dist/chunk-PFT2BNYO.js +191 -0
- package/dist/chunk-PFT2BNYO.js.map +1 -0
- package/dist/chunk-PGHEP4JD.js +106 -0
- package/dist/chunk-PGHEP4JD.js.map +1 -0
- package/dist/chunk-PXXPLHIY.js +74 -0
- package/dist/chunk-PXXPLHIY.js.map +1 -0
- package/dist/chunk-SU3LVQ7N.js +518 -0
- package/dist/chunk-SU3LVQ7N.js.map +1 -0
- package/dist/chunk-YHE7HXSG.js +206 -0
- package/dist/chunk-YHE7HXSG.js.map +1 -0
- package/dist/cli/index.js +7 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/components/accordion/accordion.d.ts.map +1 -1
- package/dist/components/admin-filters/admin-data-table.d.ts.map +1 -1
- package/dist/components/admin-filters/filter-toolbar.d.ts.map +1 -1
- package/dist/components/date-input/date-input.d.ts +27 -0
- package/dist/components/date-input/date-input.d.ts.map +1 -0
- package/dist/components/date-input/index.d.ts +4 -0
- package/dist/components/date-input/index.d.ts.map +1 -0
- package/dist/components/date-input/value.d.ts +9 -0
- package/dist/components/date-input/value.d.ts.map +1 -0
- package/dist/components/doc-layout/doc-sidebar.d.ts +4 -1
- package/dist/components/doc-layout/doc-sidebar.d.ts.map +1 -1
- package/dist/components/doc-layout/index.js +6 -0
- package/dist/components/doc-layout/index.js.map +1 -0
- package/dist/components/editor/editor.d.ts.map +1 -1
- package/dist/components/editor/icons/index.d.ts +32 -40
- package/dist/components/editor/icons/index.d.ts.map +1 -1
- package/dist/components/editor/index.js +3 -1
- package/dist/components/error-boundary/error-boundary.d.ts.map +1 -1
- package/dist/components/index.css +4 -0
- package/dist/components/index.css.map +1 -1
- package/dist/components/index.d.ts +4 -4
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +18 -8
- package/dist/components/knowledge-graph/edge-labels.d.ts +14 -0
- package/dist/components/knowledge-graph/edge-labels.d.ts.map +1 -0
- package/dist/components/knowledge-graph/graph.d.ts +56 -0
- package/dist/components/knowledge-graph/graph.d.ts.map +1 -0
- package/dist/components/knowledge-graph/index.css +176 -0
- package/dist/components/knowledge-graph/index.css.map +1 -0
- package/dist/components/knowledge-graph/index.d.ts +3 -0
- package/dist/components/knowledge-graph/index.d.ts.map +1 -0
- package/dist/components/knowledge-graph/index.js +795 -0
- package/dist/components/knowledge-graph/index.js.map +1 -0
- package/dist/components/knowledge-graph/label-layout.d.ts +28 -0
- package/dist/components/knowledge-graph/label-layout.d.ts.map +1 -0
- package/dist/components/knowledge-graph/label-store.d.ts +15 -0
- package/dist/components/knowledge-graph/label-store.d.ts.map +1 -0
- package/dist/components/knowledge-graph/model.d.ts +92 -0
- package/dist/components/knowledge-graph/model.d.ts.map +1 -0
- package/dist/components/lightbox/lightbox.d.ts.map +1 -1
- package/dist/components/map/Map.d.ts +19 -43
- package/dist/components/map/Map.d.ts.map +1 -1
- package/dist/components/map/MapCoverageLayer.d.ts +1 -1
- package/dist/components/map/MapCoverageLayer.d.ts.map +1 -1
- package/dist/components/map/MapMarker.d.ts +1 -1
- package/dist/components/map/MapMarker.d.ts.map +1 -1
- package/dist/components/map/MapPlaceSearch.d.ts +33 -0
- package/dist/components/map/MapPlaceSearch.d.ts.map +1 -0
- package/dist/components/map/MapPointPicker.d.ts +21 -12
- package/dist/components/map/MapPointPicker.d.ts.map +1 -1
- package/dist/components/map/coordinates.d.ts +10 -0
- package/dist/components/map/coordinates.d.ts.map +1 -0
- package/dist/components/map/index.css +4 -0
- package/dist/components/map/index.css.map +1 -0
- package/dist/components/map/index.d.ts +7 -2
- package/dist/components/map/index.d.ts.map +1 -1
- package/dist/components/map/index.js +3 -0
- package/dist/components/map/index.js.map +1 -0
- package/dist/components/nav-card/nav-card.d.ts.map +1 -1
- package/dist/components/rail/rail.d.ts.map +1 -1
- package/dist/components/research/diagram-image.d.ts +11 -0
- package/dist/components/research/diagram-image.d.ts.map +1 -0
- package/dist/components/research/diagram.d.ts +8 -0
- package/dist/components/research/diagram.d.ts.map +1 -0
- package/dist/components/research/document.d.ts +33 -0
- package/dist/components/research/document.d.ts.map +1 -0
- package/dist/components/research/frontmatter.d.ts +15 -0
- package/dist/components/research/frontmatter.d.ts.map +1 -0
- package/dist/components/research/index.css +51 -0
- package/dist/components/research/index.css.map +1 -0
- package/dist/components/research/index.d.ts +3 -0
- package/dist/components/research/index.d.ts.map +1 -0
- package/dist/components/research/index.js +6 -0
- package/dist/components/research/index.js.map +1 -0
- package/dist/components/research/parse.d.ts +29 -0
- package/dist/components/research/parse.d.ts.map +1 -0
- package/dist/components/research-editor/block-commands.d.ts +20 -0
- package/dist/components/research-editor/block-commands.d.ts.map +1 -0
- package/dist/components/research-editor/block-controls.d.ts +13 -0
- package/dist/components/research-editor/block-controls.d.ts.map +1 -0
- package/dist/components/research-editor/editor.d.ts +75 -0
- package/dist/components/research-editor/editor.d.ts.map +1 -0
- package/dist/components/research-editor/extensions.d.ts +14 -0
- package/dist/components/research-editor/extensions.d.ts.map +1 -0
- package/dist/components/research-editor/index.css +332 -0
- package/dist/components/research-editor/index.css.map +1 -0
- package/dist/components/research-editor/index.d.ts +5 -0
- package/dist/components/research-editor/index.d.ts.map +1 -0
- package/dist/components/research-editor/index.js +1592 -0
- package/dist/components/research-editor/index.js.map +1 -0
- package/dist/components/research-editor/math-input.d.ts +32 -0
- package/dist/components/research-editor/math-input.d.ts.map +1 -0
- package/dist/components/research-editor/math-markup.d.ts +4 -0
- package/dist/components/research-editor/math-markup.d.ts.map +1 -0
- package/dist/components/research-editor/math-navigation.d.ts +6 -0
- package/dist/components/research-editor/math-navigation.d.ts.map +1 -0
- package/dist/components/research-editor/math-node.d.ts +11 -0
- package/dist/components/research-editor/math-node.d.ts.map +1 -0
- package/dist/components/research-editor/source.d.ts +19 -0
- package/dist/components/research-editor/source.d.ts.map +1 -0
- package/dist/components/scrollbar/scrollbar.d.ts +4 -2
- package/dist/components/scrollbar/scrollbar.d.ts.map +1 -1
- package/dist/components/search-input/search-input.d.ts +0 -10
- package/dist/components/search-input/search-input.d.ts.map +1 -1
- package/dist/components/tiptap-renderer/tiptap-renderer.d.ts +4 -3
- package/dist/components/tiptap-renderer/tiptap-renderer.d.ts.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +8 -4
- package/dist/core/provider.d.ts +7 -2
- package/dist/core/provider.d.ts.map +1 -1
- package/dist/forms/schema-provider.d.ts +3 -3
- package/dist/forms/schema-utils.d.ts +3 -3
- package/dist/hooks/index.js +9 -5
- package/dist/icons/context.d.ts +17 -0
- package/dist/icons/context.d.ts.map +1 -0
- package/dist/icons/controls.d.ts +51 -0
- package/dist/icons/controls.d.ts.map +1 -0
- package/dist/icons/index.d.ts +3 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +4 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/icons/theme.d.ts +4 -0
- package/dist/icons/theme.d.ts.map +1 -0
- package/dist/index.css +4 -0
- package/dist/index.css.map +1 -1
- package/dist/index.js +24 -13
- package/dist/index.js.map +1 -1
- package/dist/layouts/core/header-section.d.ts.map +1 -1
- package/dist/layouts/dashboard/labels.d.ts +12 -0
- package/dist/layouts/dashboard/labels.d.ts.map +1 -0
- package/dist/layouts/dashboard/layout.d.ts +7 -1
- package/dist/layouts/dashboard/layout.d.ts.map +1 -1
- package/dist/layouts/dashboard/sidenav.d.ts +7 -3
- package/dist/layouts/dashboard/sidenav.d.ts.map +1 -1
- package/dist/layouts/index.d.ts +5 -0
- package/dist/layouts/index.d.ts.map +1 -1
- package/dist/layouts/index.js +6 -1
- package/dist/layouts/panel-layout.d.ts +35 -0
- package/dist/layouts/panel-layout.d.ts.map +1 -0
- package/dist/layouts/sidebar-toggle.d.ts +11 -0
- package/dist/layouts/sidebar-toggle.d.ts.map +1 -0
- package/dist/state/stores/auth.d.ts +4 -16
- package/dist/state/stores/auth.d.ts.map +1 -1
- package/dist/state/stores/ui.d.ts +7 -105
- package/dist/state/stores/ui.d.ts.map +1 -1
- package/dist/theme/components/Button.d.ts.map +1 -1
- package/dist/theme/components/FormControls.d.ts +3 -12
- package/dist/theme/components/FormControls.d.ts.map +1 -1
- package/dist/theme/components/index.d.ts.map +1 -1
- package/dist/theme/create-theme.d.ts +5 -17
- package/dist/theme/create-theme.d.ts.map +1 -1
- package/dist/theme/index.js +6 -2
- package/dist/theme/mixins.d.ts +3 -1
- package/dist/theme/mixins.d.ts.map +1 -1
- package/dist/theme/palette/overrides.d.ts +23 -0
- package/dist/theme/palette/overrides.d.ts.map +1 -0
- package/dist/ui/index.d.ts +18 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +148 -0
- package/dist/ui/index.js.map +1 -0
- package/package.json +92 -45
- package/dist/chunk-6AHI4GSV.js.map +0 -1
- package/dist/chunk-BZOL7GMU.js.map +0 -1
- package/dist/chunk-OBJ244BO.js.map +0 -1
- package/dist/chunk-WFD54GQQ.js.map +0 -1
- package/dist/chunk-YQW43BDH.js.map +0 -1
- package/dist/chunk-Z5OSPAOC.js.map +0 -1
- package/dist/chunk-ZTATTUH7.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/date-range-picker/date-range-picker.tsx","../src/components/date-range-picker/date-range-input.tsx","../src/components/admin-filters/filter-toolbar.tsx","../src/components/admin-filters/admin-data-table.tsx","../src/components/admin-filters/status-chip.tsx","../src/utils/format-crypto.ts","../src/components/admin-filters/amount-cell.tsx","../src/components/date-range-picker/use-date-range-picker.ts","../src/components/country-select/flag-icon.tsx","../src/components/country-select/country-select.tsx","../src/utils/create-classes.ts","../src/components/animate/animate-border.tsx","../src/components/animate/motion-lazy.tsx","../src/components/avatar/avatar.tsx","../src/components/badge/badge.tsx","../src/components/card/card.tsx","../src/components/confirm-dialog/confirm-dialog.tsx","../src/components/sponsored-slot/types.ts","../src/components/sponsored-slot/sponsored-slot.tsx","../src/components/page-content/page-content.tsx","../src/components/image/image.tsx","../src/components/label/label.tsx","../src/components/deadline-chip/deadline-chip.tsx","../src/components/rail/rail.tsx","../src/components/loading-screen/loading-screen.tsx","../src/components/loading-screen/splash-screen.tsx","../src/components/tag-cloud/tag-cloud.tsx","../src/components/scrollbar/scrollbar.tsx","../src/components/snackbar/snackbar.tsx","../src/components/svg-color/svg-color.tsx","../src/components/table/table.tsx","../src/components/skeleton/skeleton.tsx","../src/components/progress/progress.tsx","../src/components/progress/countdown-ring.tsx","../src/components/virtual-list/virtual-list.tsx","../src/components/command-palette/command-palette.tsx","../src/components/tabs/tabs.tsx","../src/components/accordion/accordion.tsx","../src/components/menu/menu.tsx","../src/components/navigation-progress/navigation-progress.tsx","../src/components/scroll-to-top/scroll-to-top.tsx","../src/components/settings/settings-provider.tsx","../src/components/settings/settings-drawer.tsx","../src/components/tooltip/tooltip.tsx","../src/components/alert/alert.tsx","../src/components/breadcrumbs/breadcrumbs.tsx","../src/components/nav-card/nav-card.tsx","../src/components/nav-card/nav-card-grid.tsx","../src/components/drawer/drawer.tsx","../src/components/stepper/stepper.tsx","../src/utils/cn.ts","../src/components/chart/classes.ts","../src/components/chart/components/chart-loading.tsx","../src/components/chart/components/chart-legends.tsx","../src/components/chart/chart.tsx","../src/components/chart/use-chart.ts","../src/components/lightbox/types.ts","../src/components/lightbox/classes.ts","../src/components/lightbox/lightbox.tsx","../src/components/lightbox/use-lightbox.ts","../src/components/carousel/classes.ts","../src/components/carousel/carousel.tsx","../src/components/carousel/use-carousel.ts","../src/components/nav-section/styles.ts","../src/components/nav-section/components.tsx","../src/utils/url.ts","../src/components/nav-section/nav-item.tsx","../src/components/nav-section/nav-context.tsx","../src/components/nav-section/nav-list.tsx","../src/components/nav-section/nav-section-vertical.tsx","../src/components/nav-section/nav-section-horizontal.tsx","../src/components/nav-section/nav-section-mini.tsx","../src/components/mega-menu/styles.ts","../src/components/mega-menu/mega-menu-horizontal.tsx","../src/components/mega-menu/mega-menu-vertical.tsx","../src/components/mega-menu/mega-menu-mobile.tsx","../src/components/scroll-spy/scroll-spy-provider.tsx","../src/components/scroll-spy/scroll-spy-section.tsx","../src/components/doc-layout/doc-layout.tsx","../src/components/doc-layout/doc-sidebar.tsx","../src/components/doc-layout/doc-section-nav.tsx","../src/components/content-renderer/classes.ts","../src/components/content-renderer/styles.ts","../src/components/tiptap-renderer/tiptap-renderer.tsx","../src/components/content-renderer/html-tags.ts","../src/components/content-renderer/html-to-markdown.ts","../src/components/content-renderer/remark-spoiler.ts","../src/components/content-renderer/markdown.tsx","../src/components/content-renderer/content-renderer.tsx","../src/components/duration-picker/duration-picker.tsx","../src/components/changelog/changelog-timeline.tsx","../src/components/changelog/changelog-entry.tsx","../src/components/map/Map.tsx","../src/components/map/MapMarker.tsx","../src/components/map/MapPointPicker.tsx","../src/components/map/MapCoverageLayer.tsx"],"names":["jsxs","jsx","useCallback","Fragment","TextField","IconButton","useState","useMemo","Typography","Box","Button","alpha","Skeleton","Stack","Chip","dayjs","styled","InputAdornment","useRef","useEffect","useTheme","MuiBadge","Badge","MuiCard","Dialog","DialogTitle","DialogContent","DialogActions","Card","Tooltip","Children","LinearProgress","Portal","List","Alert","CloseIcon","StyledTableContainer","Paper","StyledTableHead","TableHead","StyledTableRow","TableRow","MuiTable","TableCell","Checkbox","TableSortLabel","TableBody","TablePagination","MuiSkeleton","formatLabel","CircularProgress","MuiCircularProgress","Divider","MenuItem","ListItemText","createContext","useContext","MuiTooltip","CardContent","Drawer","MuiDrawer","ItemRoot","ItemIcon","ChevronRightIcon","ChevronLeftIcon","NavArrow","origin","Collapse","Popover","Nav","NavUl","NavLi","IconWrapper","ArrowIcon","Link","NavButton","DropdownContent","SectionHeader","SubItemLink","MegaMenuList","ListItemButton","Tabs","Tag","isExternalLink","useId","HOUR","DAY","ToggleButtonGroup","ToggleButton","Map","ReactMapGL","Marker"],"mappings":"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","file":"chunk-YQW43BDH.js","sourcesContent":["'use client';\n\n/**\n * DateRangePicker — Dialog-based date range selector.\n *\n * Responsive: shows calendar view on desktop, input fields on mobile.\n * Based on @mui/x-date-pickers DatePicker and DateCalendar.\n */\n\nimport type { DialogProps } from '@mui/material/Dialog';\nimport type { PaperProps } from '@mui/material/Paper';\nimport type { UseDateRangePickerReturn } from './use-date-range-picker.js';\n\nimport { useCallback } from 'react';\n\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker';\nimport { DateCalendar, dateCalendarClasses } from '@mui/x-date-pickers/DateCalendar';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Translatable strings rendered inside the picker dialog.\n *\n * Prism components stay framework-agnostic: we don't depend on\n * react-i18next here. Consumers pass already-translated strings via\n * this prop. Every key is optional so callers can override only the\n * ones they need; missing keys fall back to English.\n */\nexport interface DateRangePickerTranslations {\n /** Dialog title — \"Select date range\" */\n title?: string;\n /** Start-date input label (mobile/input variant) — \"Start date\" */\n startDate?: string;\n /** End-date input label (mobile/input variant) — \"End date\" */\n endDate?: string;\n /** Helper text when end < start — \"End date cannot be earlier than start date\" */\n errorRange?: string;\n /** Cancel button — \"Cancel\" */\n cancel?: string;\n /** Apply button — \"Apply\" */\n apply?: string;\n}\n\nexport type DateRangePickerProps = DialogProps &\n UseDateRangePickerReturn & {\n onSubmit?: () => void;\n variant?: 'calendar' | 'input';\n /** @deprecated Use `translations.title` instead. */\n title?: string;\n translations?: DateRangePickerTranslations;\n };\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function DateRangePicker({\n open,\n error,\n onClose,\n onSubmit,\n startDate,\n endDate,\n onChangeStartDate,\n onChangeEndDate,\n slotProps,\n variant = 'input',\n title,\n translations,\n // Exclude hook props that shouldn't go to Dialog\n selected: _selected,\n label: _label,\n shortLabel: _shortLabel,\n onOpen: _onOpen,\n onReset: _onReset,\n setStartDate: _setStartDate,\n setEndDate: _setEndDate,\n ...other\n}: DateRangePickerProps) {\n // Precedence: explicit translations > legacy `title` prop > English default.\n const txTitle = translations?.title ?? title ?? 'Select date range';\n const txStart = translations?.startDate ?? 'Start date';\n const txEnd = translations?.endDate ?? 'End date';\n // \"Later than\" overstates the rule: the guard is `isAfter`, so an equal\n // pair is a valid one-day range and the label formats it as a single date.\n const txErrorRange = translations?.errorRange ?? 'End date cannot be earlier than start date';\n const txCancel = translations?.cancel ?? 'Cancel';\n const txApply = translations?.apply ?? 'Apply';\n const mdUp = useMediaQuery((theme: any) => theme.breakpoints.up('md'));\n const isCalendarView = mdUp && variant === 'calendar';\n\n const handleSubmit = useCallback(() => {\n onClose({}, 'backdropClick');\n onSubmit?.();\n }, [onClose, onSubmit]);\n\n const handleClose = useCallback(() => {\n onClose({}, 'backdropClick');\n }, [onClose]);\n\n const dialogPaperSx = (slotProps?.paper as PaperProps)?.sx;\n\n return (\n <Dialog\n fullWidth\n open={open}\n onClose={onClose}\n maxWidth={isCalendarView ? false : 'xs'}\n slotProps={{\n ...slotProps,\n paper: {\n ...slotProps?.paper,\n sx: [\n { ...(isCalendarView && { maxWidth: 720 }) },\n ...(Array.isArray(dialogPaperSx) ? dialogPaperSx : dialogPaperSx ? [dialogPaperSx] : []),\n ],\n },\n }}\n {...other}\n >\n <DialogTitle>{txTitle}</DialogTitle>\n\n <DialogContent\n sx={[\n (theme) => ({\n gap: 3,\n display: 'flex',\n overflow: 'unset',\n flexDirection: isCalendarView ? 'row' : 'column',\n [`& .${dateCalendarClasses.root}`]: {\n borderRadius: 2,\n border: `dashed 1px ${theme.palette.divider}`,\n },\n }),\n ]}\n >\n {isCalendarView ? (\n <>\n <DateCalendar value={startDate} onChange={onChangeStartDate} />\n <DateCalendar value={endDate} onChange={onChangeEndDate} />\n </>\n ) : (\n <>\n <DatePicker label={txStart} value={startDate} onChange={onChangeStartDate} />\n <DatePicker label={txEnd} value={endDate} onChange={onChangeEndDate} />\n </>\n )}\n\n {error && (\n <FormHelperText error sx={{ px: 2 }}>\n {txErrorRange}\n </FormHelperText>\n )}\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"outlined\" color=\"inherit\" onClick={handleClose}>\n {txCancel}\n </Button>\n <Button disabled={error} variant=\"contained\" onClick={handleSubmit}>\n {txApply}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","'use client';\n\n/**\n * DateRangeInput — Compact inline date range selector for filter toolbars.\n *\n * Renders as a clickable TextField that opens a DateRangePicker dialog.\n * Shows the selected range as a short label or placeholder.\n */\n\nimport type { DateRangeValue } from './use-date-range-picker.js';\nimport type { DateRangePickerTranslations } from './date-range-picker.js';\n\nimport { useState, useCallback, useMemo } from 'react';\nimport dayjs from 'dayjs';\n\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport IconButton from '@mui/material/IconButton';\nimport { DateRangePicker } from './date-range-picker.js';\n\n// ---------------------------------------------------------------------------\n// Icons (inline to avoid external deps)\n// ---------------------------------------------------------------------------\n\nfunction CalendarIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n );\n}\n\nfunction ClearIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Translatable strings rendered around the input field.\n *\n * Stays prop-driven so prism doesn't pull in a translation library.\n * Pass already-translated strings; missing keys fall back to English.\n *\n * For the picker dialog's own strings (Cancel, Apply, etc.) see\n * `DateRangePickerTranslations` — those can be passed via\n * `pickerTranslations` and are threaded through to the dialog.\n */\nexport interface DateRangeInputTranslations {\n /** Placeholder shown when both ends are empty — \"Select dates...\" */\n placeholder?: string;\n /** Prefix for partial range with only start — \"From\" → \"From 12 Jan 2026\" */\n from?: string;\n /** Prefix for partial range with only end — \"To\" → \"To 31 Dec 2026\" */\n to?: string;\n /**\n * Accessible name for the clear button — \"Clear date range\".\n *\n * The button is an icon with no text, so this string IS its name to a\n * screen reader. Without one the control announces as \"button\".\n */\n clear?: string;\n}\n\nexport interface DateRangeInputProps {\n /** Label displayed on the field */\n label?: string;\n /** Start date as ISO string (YYYY-MM-DD) */\n startDate: string;\n /** End date as ISO string (YYYY-MM-DD) */\n endDate: string;\n /** Called when dates change */\n onChange: (startDate: string, endDate: string) => void;\n /** Minimum width */\n width?: number | string;\n /** Picker variant */\n variant?: 'calendar' | 'input';\n /** Size of the field */\n size?: 'small' | 'medium';\n /** Translations for the input field surface (placeholder, \"From\"/\"To\") */\n translations?: DateRangeInputTranslations;\n /** Translations forwarded into the embedded picker dialog */\n pickerTranslations?: DateRangePickerTranslations;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction toDayjs(value: string): DateRangeValue {\n if (!value) return null;\n const d = dayjs(value);\n return d.isValid() ? d : null;\n}\n\nfunction toIso(value: DateRangeValue): string {\n if (!value || !value.isValid()) return '';\n return value.format('YYYY-MM-DD');\n}\n\nfunction formatLabel(\n start: string,\n end: string,\n fromPrefix: string,\n toPrefix: string,\n): string {\n if (!start && !end) return '';\n const s = toDayjs(start);\n const e = toDayjs(end);\n if (s && e) {\n if (s.isSame(e, 'day')) return e.format('DD MMM YYYY');\n if (s.isSame(e, 'month')) return `${s.format('DD')} – ${e.format('DD MMM YYYY')}`;\n if (s.isSame(e, 'year')) return `${s.format('DD MMM')} – ${e.format('DD MMM YYYY')}`;\n return `${s.format('DD MMM YYYY')} – ${e.format('DD MMM YYYY')}`;\n }\n if (s) return `${fromPrefix} ${s.format('DD MMM YYYY')}`;\n if (e) return `${toPrefix} ${e.format('DD MMM YYYY')}`;\n return '';\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function DateRangeInput({\n label = 'Date range',\n startDate,\n endDate,\n onChange,\n width = 220,\n variant = 'input',\n size = 'small',\n translations,\n pickerTranslations,\n}: DateRangeInputProps) {\n const [open, setOpen] = useState(false);\n const [tempStart, setTempStart] = useState<DateRangeValue>(toDayjs(startDate));\n const [tempEnd, setTempEnd] = useState<DateRangeValue>(toDayjs(endDate));\n\n const txPlaceholder = translations?.placeholder ?? 'Select dates...';\n const txFrom = translations?.from ?? 'From';\n const txTo = translations?.to ?? 'To';\n const txClear = translations?.clear ?? 'Clear date range';\n\n const displayLabel = useMemo(\n () => formatLabel(startDate, endDate, txFrom, txTo),\n [startDate, endDate, txFrom, txTo],\n );\n const hasValue = !!startDate || !!endDate;\n\n const handleOpen = useCallback(() => {\n setTempStart(toDayjs(startDate));\n setTempEnd(toDayjs(endDate));\n setOpen(true);\n }, [startDate, endDate]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n const handleSubmit = useCallback(() => {\n onChange(toIso(tempStart), toIso(tempEnd));\n setOpen(false);\n }, [tempStart, tempEnd, onChange]);\n\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange('', '');\n },\n [onChange]\n );\n\n const error = !!(tempStart && tempEnd && tempStart.isAfter(tempEnd));\n\n return (\n <>\n <TextField\n size={size}\n label={label}\n value={displayLabel}\n placeholder={txPlaceholder}\n onClick={handleOpen}\n slotProps={{\n input: {\n readOnly: true,\n sx: { cursor: 'pointer' },\n startAdornment: (\n <InputAdornment position=\"start\" sx={{ color: 'text.disabled' }}>\n <CalendarIcon />\n </InputAdornment>\n ),\n ...(hasValue && {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton size=\"small\" onClick={handleClear} aria-label={txClear} sx={{ p: 0.25 }}>\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ),\n }),\n },\n inputLabel: { shrink: true },\n }}\n sx={{\n minWidth: width,\n '& .MuiOutlinedInput-root': { borderRadius: 1 },\n '& .MuiInputBase-input': { cursor: 'pointer' },\n }}\n />\n\n <DateRangePicker\n open={open}\n error={error}\n onClose={handleClose}\n onSubmit={handleSubmit}\n startDate={tempStart}\n endDate={tempEnd}\n onChangeStartDate={setTempStart}\n onChangeEndDate={setTempEnd}\n variant={variant}\n translations={pickerTranslations}\n selected={!!(tempStart && tempEnd)}\n label=\"\"\n shortLabel=\"\"\n onOpen={handleOpen}\n onReset={() => {\n setTempStart(null);\n setTempEnd(null);\n }}\n setStartDate={setTempStart}\n setEndDate={setTempEnd}\n />\n </>\n );\n}\n","'use client';\n\n/**\n * Filter Toolbar Component\n *\n * Declarative filter toolbar for admin sections. Renders filters based on\n * a configuration array, supporting search, select, multi-select, date ranges,\n * boolean toggles, and number ranges.\n *\n * @module components/admin-filters\n */\n\nimport type { ReactNode, ChangeEvent } from 'react';\nimport { useState, useCallback, useMemo, useRef, useEffect, useTransition } from 'react';\nimport Stack from '@mui/material/Stack';\nimport TextField from '@mui/material/TextField';\nimport Chip from '@mui/material/Chip';\nimport MenuItem from '@mui/material/MenuItem';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\nimport Badge from '@mui/material/Badge';\nimport { alpha } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { DateRangeInput } from '../date-range-picker/date-range-input.js';\nimport { SearchInput } from '../search-input/search-input.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type FilterType = 'search' | 'select' | 'multi-select' | 'date-range' | 'boolean' | 'number-range';\n\nexport interface FilterOption {\n value: string;\n label: string;\n color?: string;\n}\n\nexport interface FilterConfig {\n /** Unique key used as the property name in FilterValues */\n key: string;\n /** Type of filter to render */\n type: FilterType;\n /** Display label */\n label: string;\n /** Placeholder text */\n placeholder?: string;\n /** Options for select / multi-select filters */\n options?: FilterOption[];\n /** Width of the filter control */\n width?: number | string;\n /** Default value */\n defaultValue?: unknown;\n}\n\nexport interface FilterValues {\n [key: string]: unknown;\n search?: string;\n dateFrom?: string;\n dateTo?: string;\n}\n\nexport interface FilterToolbarProps {\n /** Filter configurations */\n filters: FilterConfig[];\n /** Current filter values */\n values: FilterValues;\n /** Called when any filter value changes */\n onChange: (values: FilterValues) => void;\n /** Called when the reset button is clicked */\n onReset?: () => void;\n /** Total count to display */\n total?: number;\n /** Debounce delay for search input in ms */\n searchDebounce?: number;\n /** Compact mode (single row) */\n compact?: boolean;\n /** Additional styles */\n sx?: SxProps<Theme>;\n /**\n * Localized label for the Reset button. Defaults to \"Reset\" so\n * existing call sites still work; pass `t('common.reset')` from\n * the host app to translate.\n */\n resetLabel?: string;\n /**\n * Formatter for the \"N results\" counter below the toolbar.\n * Defaults to English pluralisation. Pass a function from the host\n * app's i18n to get plural-aware translation, e.g.\n * (n) => t('common.resultsCount', { count: n })\n * Receives the already-formatted number string for direct use.\n */\n resultsLabel?: (count: number) => string;\n}\n\n// =============================================================================\n// SEARCH ICON (inline SVG to avoid external dependency)\n// =============================================================================\n\nfunction FilterIcon(): ReactNode {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\" />\n </svg>\n );\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction useDebounce(value: string, delay: number): string {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n\nfunction isFilterActive(config: FilterConfig, value: unknown): boolean {\n if (value === undefined || value === null || value === '') return false;\n if (Array.isArray(value) && value.length === 0) return false;\n if (config.type === 'boolean' && value === false) return false;\n if (config.type === 'select' && value === '') return false;\n return true;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * FilterToolbar - Declarative filter toolbar for admin sections.\n *\n * Renders a row of filter controls based on a configuration array.\n * Supports search (debounced), select, multi-select, date-range,\n * boolean, and number-range filters.\n *\n * @example\n * ```tsx\n * const filters: FilterConfig[] = [\n * { key: 'search', type: 'search', label: 'Search', placeholder: 'Search users...' },\n * { key: 'status', type: 'select', label: 'Status', options: [\n * { value: 'active', label: 'Active' },\n * { value: 'blocked', label: 'Blocked' },\n * ]},\n * { key: 'verified', type: 'boolean', label: 'Verified' },\n * ];\n *\n * <FilterToolbar\n * filters={filters}\n * values={filterValues}\n * onChange={setFilterValues}\n * total={245}\n * />\n * ```\n */\nexport function FilterToolbar({\n filters,\n values,\n onChange,\n onReset,\n total,\n searchDebounce = 300,\n compact = false,\n sx,\n resetLabel = 'Reset',\n resultsLabel,\n}: FilterToolbarProps): ReactNode {\n const [, startTransition] = useTransition();\n\n // Track local search text so the input feels responsive (debounce only propagates)\n const searchFilter = filters.find((f) => f.type === 'search');\n const [localSearch, setLocalSearch] = useState<string>((values[searchFilter?.key ?? 'search'] as string) ?? '');\n const debouncedSearch = useDebounce(localSearch, searchDebounce);\n const prevDebouncedRef = useRef(debouncedSearch);\n\n // Propagate debounced search to parent\n useEffect(() => {\n if (debouncedSearch !== prevDebouncedRef.current) {\n prevDebouncedRef.current = debouncedSearch;\n const key = searchFilter?.key ?? 'search';\n startTransition(() => {\n onChange({ ...values, [key]: debouncedSearch });\n });\n }\n }, [debouncedSearch, searchFilter?.key, onChange, values]);\n\n // Adopt an EXTERNAL change to the search value.\n //\n // The text box holds its own state so typing stays responsive, seeded from\n // `values` once at mount. Nothing re-seeded it, so a reset performed by the\n // parent — switching tabs, clearing filters programmatically, restoring a\n // saved view — left the box showing a term that was no longer filtering\n // anything. The operator reads a search that isn't applied.\n //\n // Only external changes are adopted: `prevDebouncedRef` holds the last\n // value this toolbar itself sent up, so a value echoed back from the parent\n // mid-typing does not overwrite what is being typed.\n const searchValue = (values[searchFilter?.key ?? 'search'] as string | undefined) ?? '';\n useEffect(() => {\n if (searchValue === prevDebouncedRef.current) return;\n prevDebouncedRef.current = searchValue;\n setLocalSearch(searchValue);\n }, [searchValue]);\n\n // Count active filters (excluding search)\n const activeCount = useMemo(\n () => filters.filter((f) => f.type !== 'search' && isFilterActive(f, values[f.key])).length,\n [filters, values]\n );\n\n const hasAnyActive = useMemo(\n () => filters.some((f) => isFilterActive(f, f.type === 'search' ? localSearch : values[f.key])),\n [filters, values, localSearch]\n );\n\n // Handlers\n const handleChange = useCallback(\n (key: string, value: unknown) => {\n startTransition(() => {\n onChange({ ...values, [key]: value });\n });\n },\n [onChange, values]\n );\n\n const handleReset = useCallback(() => {\n setLocalSearch('');\n if (onReset) {\n onReset();\n } else {\n const resetValues: FilterValues = {};\n for (const f of filters) {\n if (f.type === 'search') resetValues[f.key] = '';\n else if (f.type === 'multi-select') resetValues[f.key] = [];\n else if (f.type === 'boolean') resetValues[f.key] = false;\n else if (f.type === 'date-range') {\n resetValues[`${f.key}From`] = '';\n resetValues[`${f.key}To`] = '';\n } else if (f.type === 'number-range') {\n resetValues[`${f.key}Min`] = '';\n resetValues[`${f.key}Max`] = '';\n } else {\n resetValues[f.key] = '';\n }\n }\n onChange(resetValues);\n }\n }, [onReset, onChange, filters]);\n\n // Render individual filter\n const renderFilter = useCallback(\n (config: FilterConfig): ReactNode => {\n const { key, type, label, placeholder, options, width } = config;\n\n switch (type) {\n case 'search':\n return (\n <SearchInput\n key={key}\n value={localSearch}\n onChange={setLocalSearch}\n placeholder={placeholder ?? 'Search...'}\n fullWidth={false}\n minWidth={width ?? 220}\n />\n );\n\n case 'select':\n return (\n <TextField\n key={key}\n select\n size=\"small\"\n value={(values[key] as string) ?? ''}\n onChange={(e: ChangeEvent<HTMLInputElement>) => handleChange(key, e.target.value)}\n // The visible \"label\" is rendered as the empty-value MenuItem so\n // the control reads as a placeholder — deliberate, and it leaves\n // the field with NO accessible name. A screen-reader user hears\n // \"combo box\" with no indication of what it filters. Name it\n // explicitly rather than adding a visual label the design does\n // not want.\n slotProps={{ select: { displayEmpty: true, 'aria-label': label } }}\n sx={{\n minWidth: width ?? 150,\n '& .MuiOutlinedInput-root': { borderRadius: 1 },\n '& .MuiOutlinedInput-notchedOutline legend': { width: 0 },\n }}\n >\n <MenuItem value=\"\">\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {label}\n </Typography>\n </MenuItem>\n {options?.map((opt) => (\n <MenuItem key={opt.value} value={opt.value}>\n {opt.label}\n </MenuItem>\n ))}\n </TextField>\n );\n\n case 'multi-select': {\n const selectedValues = (values[key] as string[] | undefined) ?? [];\n return (\n <TextField\n key={key}\n select\n size=\"small\"\n value={selectedValues}\n onChange={(e: any) => handleChange(key, e.target.value)}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n // Same reason as the single select above: the label lives in\n // `renderValue` as placeholder text, leaving the control\n // without an accessible name.\n 'aria-label': label,\n renderValue: (selected: unknown) => {\n const sel = selected as string[];\n if (sel.length === 0) {\n return (\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {label}\n </Typography>\n );\n }\n return (\n <Stack direction=\"row\" spacing={0.5} sx={{ overflow: 'hidden' }}>\n {sel.map((val) => {\n const opt = options?.find((o) => o.value === val);\n return (\n <Chip\n key={val}\n label={opt?.label ?? val}\n size=\"small\"\n sx={{ height: 20, fontSize: '0.75rem' }}\n />\n );\n })}\n </Stack>\n );\n },\n },\n }}\n sx={{\n minWidth: width ?? 180,\n '& .MuiOutlinedInput-root': { borderRadius: 1 },\n '& .MuiOutlinedInput-notchedOutline legend': { width: 0 },\n }}\n >\n {options?.map((opt) => (\n <MenuItem key={opt.value} value={opt.value}>\n {opt.label}\n </MenuItem>\n ))}\n </TextField>\n );\n }\n\n case 'date-range':\n return (\n <DateRangeInput\n key={key}\n label={label}\n startDate={(values[`${key}From`] as string) ?? ''}\n endDate={(values[`${key}To`] as string) ?? ''}\n onChange={(from, to) => {\n handleChange(`${key}From`, from);\n handleChange(`${key}To`, to);\n }}\n width={width ?? 220}\n size=\"small\"\n />\n );\n\n case 'boolean':\n return (\n <Chip\n key={key}\n label={label}\n variant={values[key] ? 'filled' : 'outlined'}\n color={values[key] ? 'primary' : 'default'}\n onClick={() => handleChange(key, !values[key])}\n size=\"small\"\n sx={{\n borderRadius: 1,\n fontWeight: 500,\n height: 32,\n cursor: 'pointer',\n transition: (theme) =>\n theme.transitions.create(['background-color', 'color', 'border-color'], {\n duration: theme.transitions.duration.shorter,\n }),\n }}\n />\n );\n\n case 'number-range':\n return (\n <Stack key={key} direction=\"row\" spacing={1} sx={{\n alignItems: \"center\"\n }}>\n <TextField\n type=\"number\"\n size=\"small\"\n label={`${label} min`}\n value={(values[`${key}Min`] as string) ?? ''}\n onChange={(e: ChangeEvent<HTMLInputElement>) => handleChange(`${key}Min`, e.target.value)}\n sx={{ minWidth: width ?? 100 }}\n />\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.disabled\",\n px: 0.5\n }}>\n —\n </Typography>\n <TextField\n type=\"number\"\n size=\"small\"\n label={`${label} max`}\n value={(values[`${key}Max`] as string) ?? ''}\n onChange={(e: ChangeEvent<HTMLInputElement>) => handleChange(`${key}Max`, e.target.value)}\n sx={{ minWidth: width ?? 100 }}\n />\n </Stack>\n );\n\n default:\n return null;\n }\n },\n [localSearch, values, handleChange]\n );\n\n return (\n <Stack\n spacing={compact ? 0 : 1.5}\n sx={{\n p: 2,\n borderRadius: 1,\n border: (theme) => `1px solid ${theme.palette.divider}`,\n bgcolor: (theme) => alpha(theme.palette.background.default, 0.5),\n ...sx,\n }}\n >\n {/* Filter controls row */}\n <Stack\n direction=\"row\"\n sx={{\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: 1.5\n }}>\n {filters.map(renderFilter)}\n\n {/* Active filter count + reset */}\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{\n alignItems: \"center\",\n ml: 'auto'\n }}>\n {activeCount > 0 && (\n <Badge badgeContent={activeCount} color=\"primary\" sx={{ '& .MuiBadge-badge': { fontSize: '0.65rem' } }}>\n <Box sx={{ color: 'text.secondary', display: 'flex', alignItems: 'center' }}>\n <FilterIcon />\n </Box>\n </Badge>\n )}\n\n {hasAnyActive && (\n <Button\n size=\"small\"\n onClick={handleReset}\n sx={{\n minWidth: 0,\n px: 1.5,\n fontSize: '0.75rem',\n fontWeight: 500,\n color: 'text.secondary',\n '&:hover': { color: 'text.primary' },\n }}\n >\n {resetLabel}\n </Button>\n )}\n </Stack>\n </Stack>\n {/* Results count */}\n {total !== undefined && !compact && (\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.disabled\",\n mt: 0.5\n }}>\n {resultsLabel\n ? resultsLabel(total)\n : `${total.toLocaleString()} result${total !== 1 ? 's' : ''}`}\n </Typography>\n )}\n </Stack>\n );\n}\n","'use client';\n\n/**\n * Admin Data Table Component\n *\n * Optimized table for admin data displays with built-in sorting,\n * skeleton loading, empty states, and pagination.\n *\n * @module components/admin-filters\n */\n\nimport { Fragment } from 'react';\nimport type { ReactNode } from 'react';\nimport { useCallback, useMemo } from 'react';\nimport MuiTable from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableContainer from '@mui/material/TableContainer';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableSortLabel from '@mui/material/TableSortLabel';\nimport TablePagination from '@mui/material/TablePagination';\nimport Paper from '@mui/material/Paper';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Checkbox from '@mui/material/Checkbox';\nimport Typography from '@mui/material/Typography';\nimport Skeleton from '@mui/material/Skeleton';\nimport { styled, alpha } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ColumnDef<T> {\n /** Unique column identifier */\n key: string;\n /** Column header label */\n header: string;\n /** Column width */\n width?: number | string;\n /** Whether column is sortable */\n sortable?: boolean;\n /** Cell alignment */\n align?: 'left' | 'center' | 'right';\n /** Custom cell renderer */\n render: (row: T, index: number) => ReactNode;\n}\n\nexport interface AdminDataTableProps<T> {\n /** Column definitions */\n columns: ColumnDef<T>[];\n /** Data rows */\n data: T[];\n /** Total number of rows (for pagination) */\n total: number;\n /** Loading state */\n loading?: boolean;\n /**\n * Placeholder rows drawn while `loading`, capped by `pageSize`.\n * Defaults to 5 — see the note where they are built.\n */\n loadingRows?: number;\n /** Current page (0-indexed) */\n page: number;\n /** Rows per page */\n pageSize: number;\n /** Page change handler */\n onPageChange: (page: number) => void;\n /** Page size change handler */\n onPageSizeChange?: (size: number) => void;\n /** Current sort column key */\n sortBy?: string;\n /** Current sort direction */\n sortOrder?: 'asc' | 'desc';\n /** Sort change handler */\n onSort?: (column: string) => void;\n /** Message shown when no data */\n emptyMessage?: string;\n /**\n * Why the table has no rows, when the reason is a failure rather than an\n * absence.\n *\n * \"No data found\" and \"we could not load this\" look identical without it,\n * and the first reads as a healthy answer. That confusion is not\n * hypothetical: the omnitron console's traces page had both of its queries\n * failing against the database schema, had never returned a row, and\n * displayed \"No traces collected yet\" — a plausible answer that was not the\n * true one, for as long as the page had existed.\n *\n * When there are no rows, the empty state says the data could not be\n * loaded and shows this text as the reason, instead of `emptyMessage`.\n *\n * When there ARE rows it is a partial failure — some of the data arrived\n * and some did not — and a bar above the table says so. That case was\n * originally ignored, on the reasoning that rows on screen are their own\n * answer. They are not: a list that is short because one of its sources\n * failed looks exactly like a list that is short, which is the whole\n * defect this prop exists to remove, surviving in the case where it does\n * the most damage.\n */\n loadError?: string | null;\n /**\n * What to CALL a failed read, in the reader's language.\n *\n * `loadError` itself is a reason the caller has already translated; these\n * two are the sentences around it, and they were English literals in this\n * file. That was invisible while one consumer passed `loadError` at all —\n * and the moment four more did, four Russian screens grew an English\n * heading. Same contract as `emptyMessage` and `paginationLabels`: the\n * component states the situation, the host names it. Omitted, the English\n * defaults apply.\n */\n loadErrorLabels?: {\n /** Heading when the list is empty AND the read failed. */\n empty?: string;\n /** Heading when some rows arrived and the read still failed. */\n partial?: string;\n };\n /** Extract unique key from row */\n rowKey?: (row: T) => string;\n /** Row click handler */\n onRowClick?: (row: T) => void;\n /**\n * Per-row styling, for state a single column cannot carry.\n *\n * A disabled rule, a superseded release, a row the reader should still be\n * able to read but not act on: the signal belongs to the whole row, and\n * painting it cell by cell makes one row look like six unrelated ones.\n * Returned styles are merged over the row's own (cursor, hover, selected).\n */\n rowSx?: (row: T, index: number) => SxProps<Theme>;\n /**\n * Detail rendered in a full-width row directly under `row`, when it returns\n * something. Return `null`/`undefined` for a row that is not expanded.\n *\n * Expansion state belongs to the caller — which row is open is usually tied\n * to a URL, a keyboard handler, or a single-open-at-a-time rule this\n * component has no opinion about. Without this, a table that expands a row\n * had to be built by hand, and omnitron's console has two that still are:\n * pipeline run history and the trace list.\n */\n renderExpanded?: (row: T, index: number) => ReactNode;\n /** Page size options for the selector */\n pageSizeOptions?: number[];\n /** Sticky header */\n stickyHeader?: boolean;\n /** Dense mode (less padding) */\n dense?: boolean;\n /** Container max height */\n maxHeight?: number | string;\n /**\n * Localised labels for the underlying MUI TablePagination. When\n * omitted, the MUI defaults (English) apply — consumers that\n * need a translated UI pass the strings from their i18n layer.\n */\n paginationLabels?: {\n /** \"Rows per page:\" label next to the page-size selector */\n rowsPerPage?: string;\n /** Renderer for the \"1–10 of 42\" line. Same signature as MUI's labelDisplayedRows. */\n displayedRows?: (info: { from: number; to: number; count: number; page: number }) => React.ReactNode;\n };\n /** Additional styles */\n sx?: SxProps<Theme>;\n /**\n * Multi-select mode — adds a leading checkbox column and a header\n * checkbox that toggles all rows on the current page. Selection\n * state is controlled: pass `selectedKeys` and `onSelectionChange`.\n */\n selectable?: boolean;\n /** Currently-selected row keys (matched against `rowKey(row)`). */\n selectedKeys?: ReadonlySet<string>;\n /** Selection change handler. The new set is rebuilt every change. */\n onSelectionChange?: (keys: Set<string>) => void;\n /**\n * Render slot displayed above the table whenever `selectedKeys` is\n * non-empty — typically a row of bulk-action buttons. Receives the\n * current selection so callers can wire actions without re-tracking\n * state externally.\n */\n bulkActions?: (selected: ReadonlySet<string>) => ReactNode;\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst StyledTableContainer = styled(Paper)(({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n border: `1px solid ${theme.palette.divider}`,\n overflow: 'auto',\n}));\n\nconst StyledTableHead = styled(TableHead)(({ theme }) => ({\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n '& .MuiTableCell-head': {\n fontWeight: 600,\n fontSize: theme.typography.pxToRem(13),\n color: theme.palette.text.secondary,\n backgroundColor: 'transparent',\n whiteSpace: 'nowrap',\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n}));\n\nconst StyledTableRow = styled(TableRow)(({ theme }) => ({\n transition: theme.transitions.create('background-color', {\n duration: theme.transitions.duration.shortest,\n }),\n // `:nth-child(even)` for zebra-striping — table rows are homogeneous\n // siblings, so child-position is equivalent to of-type but doesn't\n // assume the rendered tag never changes (e.g. a row replaced by a\n // skeleton placeholder still alternates correctly).\n '&:nth-child(even)': {\n backgroundColor: alpha(theme.palette.grey[500], 0.02),\n },\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.04),\n },\n '& .MuiTableCell-body': {\n borderBottom: `1px solid ${alpha(theme.palette.divider, 0.6)}`,\n },\n}));\n\n// Single shared empty Set so default `selection` doesn't churn references\n// when `selectedKeys` is omitted.\nconst EMPTY_SELECTION: ReadonlySet<string> = new Set<string>();\n\n// =============================================================================\n// EMPTY STATE ICON\n// =============================================================================\n\nfunction EmptyIcon(): ReactNode {\n return (\n <svg\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity=\"0.3\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"9\" y1=\"15\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * AdminDataTable - Data table optimized for admin sections.\n *\n * Features skeleton loading rows, sortable column headers, empty states,\n * alternating row colors, sticky header support, and compact pagination.\n *\n * @example\n * ```tsx\n * const columns: ColumnDef<Transaction>[] = [\n * { key: 'id', header: 'ID', width: 80, render: (row) => row.id },\n * { key: 'amount', header: 'Amount', align: 'right', sortable: true,\n * render: (row) => <AmountCell amount={row.amount} currency=\"BTC\" /> },\n * { key: 'status', header: 'Status', render: (row) => <StatusChip status={row.status} /> },\n * ];\n *\n * <AdminDataTable\n * columns={columns}\n * data={transactions}\n * total={1200}\n * page={0}\n * pageSize={25}\n * onPageChange={setPage}\n * loading={isLoading}\n * sortBy=\"amount\"\n * sortOrder=\"desc\"\n * onSort={handleSort}\n * />\n * ```\n */\nexport function AdminDataTable<T>({\n columns,\n data,\n total,\n loading = false,\n loadingRows = 5,\n page,\n pageSize,\n onPageChange,\n onPageSizeChange,\n sortBy,\n sortOrder = 'asc',\n onSort,\n emptyMessage = 'No data found',\n loadError = null,\n loadErrorLabels,\n rowKey,\n onRowClick,\n rowSx,\n renderExpanded,\n pageSizeOptions = [10, 25, 50, 100],\n stickyHeader = false,\n dense = false,\n maxHeight,\n paginationLabels,\n sx,\n selectable = false,\n selectedKeys,\n onSelectionChange,\n bulkActions,\n}: AdminDataTableProps<T>): ReactNode {\n const getRowKey = useCallback(\n (row: T, index: number): string => {\n if (rowKey) return rowKey(row);\n const record = row as Record<string, unknown>;\n if (record['id'] !== undefined) return String(record['id']);\n\n // Falling back to the index is fine for React reconciliation, but it is\n // NOT an identity: sort or paginate and position N is a different\n // record. With `selectable` that turns a selection into \"rows 2 and 5\n // of whatever is currently on screen\", and a bulk action then applies\n // to records the operator never picked. Surface it in development\n // rather than let a delete find out at runtime.\n if (selectable && process.env['NODE_ENV'] !== 'production') {\n \n console.error(\n '[AdminDataTable] `selectable` is on but rows have no stable key: ' +\n 'pass `rowKey`, or give each row an `id`. Index-based keys make the ' +\n 'selection positional, so sorting or paging silently re-targets it.'\n );\n }\n return String(index);\n },\n [rowKey, selectable]\n );\n\n // Stable empty set so callers can omit `selectedKeys` without us\n // creating a fresh Set every render (which would defeat memoisation\n // downstream).\n const selection = selectedKeys ?? EMPTY_SELECTION;\n\n const pageRowKeys = useMemo(\n () => (selectable ? data.map((row, index) => getRowKey(row, index)) : []),\n [selectable, data, getRowKey]\n );\n\n const allPageSelected = pageRowKeys.length > 0 && pageRowKeys.every((k) => selection.has(k));\n const somePageSelected = !allPageSelected && pageRowKeys.some((k) => selection.has(k));\n\n const toggleAllOnPage = useCallback(() => {\n if (!onSelectionChange) return;\n const next = new Set(selection);\n if (allPageSelected) {\n pageRowKeys.forEach((k) => next.delete(k));\n } else {\n pageRowKeys.forEach((k) => next.add(k));\n }\n onSelectionChange(next);\n }, [onSelectionChange, selection, allPageSelected, pageRowKeys]);\n\n const toggleRow = useCallback(\n (key: string) => {\n if (!onSelectionChange) return;\n const next = new Set(selection);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n onSelectionChange(next);\n },\n [onSelectionChange, selection]\n );\n\n const handleSort = useCallback(\n (columnKey: string) => {\n onSort?.(columnKey);\n },\n [onSort]\n );\n\n const handlePageChange = useCallback(\n (_: unknown, newPage: number) => {\n onPageChange(newPage);\n },\n [onPageChange]\n );\n\n const handlePageSizeChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n onPageSizeChange?.(parseInt(event.target.value, 10));\n onPageChange(0);\n },\n [onPageSizeChange, onPageChange]\n );\n\n // Skeleton rows for loading state.\n //\n // Not `pageSize` of them. A page size of 25 or 100 is a ceiling on what the\n // table MAY hold, not a prediction of what is coming, so a table that\n // resolves to three rows — or to none — first drew a hundred grey bars and\n // then threw them away. Measured on omnitron's /deployments, which has no\n // deployments and flashed 25. Enough rows to read as a table, capped by the\n // page size so a deliberately small page does not overshoot.\n const skeletonRowCount = Math.max(1, Math.min(pageSize, loadingRows));\n const skeletonRows = useMemo(\n () =>\n Array.from({ length: skeletonRowCount }, (_, i) => (\n <TableRow key={`skeleton-${i}`}>\n {selectable && (\n <TableCell padding=\"checkbox\">\n <Skeleton variant=\"rectangular\" width={18} height={18} sx={{ borderRadius: 0.5 }} />\n </TableCell>\n )}\n {columns.map((col) => (\n <TableCell key={col.key} align={col.align ?? 'left'}>\n <Skeleton\n variant=\"text\"\n width={col.align === 'right' ? '60%' : '80%'}\n sx={{\n ml: col.align === 'right' ? 'auto' : 0,\n borderRadius: 0.5,\n }}\n />\n </TableCell>\n ))}\n </TableRow>\n )),\n [skeletonRowCount, columns, selectable]\n );\n\n const showBulkBar = selectable && selection.size > 0 && !!bulkActions;\n\n // Empty state\n if (!loading && data.length === 0) {\n return (\n <StyledTableContainer sx={sx}>\n <MuiTable size={dense ? 'small' : 'medium'} stickyHeader={stickyHeader}>\n <StyledTableHead>\n <TableRow>\n {selectable && <TableCell padding=\"checkbox\" />}\n {columns.map((col) => (\n <TableCell key={col.key} align={col.align ?? 'left'} style={{ width: col.width }}>\n {col.header}\n </TableCell>\n ))}\n </TableRow>\n </StyledTableHead>\n </MuiTable>\n <Box\n sx={{\n py: 6,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 1.5,\n }}\n >\n <EmptyIcon />\n <Typography\n variant=\"body2\"\n // `text.secondary` rather than `text.disabled` for a failure: a\n // reason the reader needs must not be the palette's quietest text.\n sx={{ color: loadError ? 'text.secondary' : 'text.disabled' }}\n >\n {loadError ? (loadErrorLabels?.empty ?? 'Could not load this data') : emptyMessage}\n </Typography>\n {loadError && (\n <Typography variant=\"caption\" sx={{ color: 'text.disabled', maxWidth: 420, textAlign: 'center' }}>\n {loadError}\n </Typography>\n )}\n </Box>\n </StyledTableContainer>\n );\n }\n\n return (\n <StyledTableContainer sx={{ maxHeight, ...sx }}>\n {loadError && (\n <Box\n role=\"status\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n px: 2,\n py: 1,\n borderBottom: 1,\n borderColor: 'divider',\n bgcolor: (theme) => alpha(theme.palette.warning.main, 0.12),\n }}\n >\n <Typography variant=\"body2\" sx={{ color: 'warning.dark', fontWeight: 600 }}>\n {loadErrorLabels?.partial ?? 'Some of this data could not be loaded'}\n </Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {loadError}\n </Typography>\n </Box>\n )}\n {showBulkBar && (\n <Stack\n direction=\"row\"\n spacing={2}\n sx={{\n alignItems: \"center\",\n px: 2,\n py: 1,\n borderBottom: (theme) => `1px solid ${theme.palette.divider}`,\n bgcolor: (theme) => alpha(theme.palette.primary.main, 0.06)\n }}>\n <Typography variant=\"body2\" sx={{\n fontWeight: 600\n }}>\n {selection.size} selected\n </Typography>\n <Box sx={{ flex: 1 }} />\n {bulkActions(selection)}\n </Stack>\n )}\n <TableContainer>\n <MuiTable size={dense ? 'small' : 'medium'} stickyHeader={stickyHeader}>\n <StyledTableHead>\n <TableRow>\n {selectable && (\n <TableCell padding=\"checkbox\">\n <Checkbox\n size=\"small\"\n indeterminate={somePageSelected}\n checked={allPageSelected}\n disabled={loading || pageRowKeys.length === 0}\n onChange={toggleAllOnPage}\n slotProps={{\n input: { 'aria-label': 'select all rows on page' }\n }}\n />\n </TableCell>\n )}\n {columns.map((col) => (\n <TableCell\n key={col.key}\n align={col.align ?? 'left'}\n style={{ width: col.width }}\n sortDirection={sortBy === col.key ? sortOrder : false}\n >\n {col.sortable && onSort ? (\n <TableSortLabel\n active={sortBy === col.key}\n direction={sortBy === col.key ? sortOrder : 'asc'}\n onClick={() => handleSort(col.key)}\n >\n {col.header}\n </TableSortLabel>\n ) : (\n col.header\n )}\n </TableCell>\n ))}\n </TableRow>\n </StyledTableHead>\n\n <TableBody>\n {loading\n ? skeletonRows\n : data.map((row, index) => {\n const key = getRowKey(row, index);\n const isSelected = selectable && selection.has(key);\n const body = (\n <StyledTableRow\n key={key}\n hover\n selected={isSelected}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n sx={{\n cursor: onRowClick ? 'pointer' : 'default',\n ...rowSx?.(row, index),\n }}\n >\n {selectable && (\n <TableCell\n padding=\"checkbox\"\n // Stop row-click bubbling so toggling a row's\n // checkbox doesn't also fire onRowClick.\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n size=\"small\"\n checked={isSelected}\n onChange={() => toggleRow(key)}\n slotProps={{\n input: { 'aria-label': 'select row' }\n }}\n />\n </TableCell>\n )}\n {columns.map((col) => (\n <TableCell key={col.key} align={col.align ?? 'left'}>\n {col.render(row, index)}\n </TableCell>\n ))}\n </StyledTableRow>\n );\n const detail = renderExpanded?.(row, index);\n if (detail == null) return body;\n return (\n <Fragment key={`${key}-group`}>\n {body}\n {/*\n `hover` and the row styling are deliberately absent:\n this is a continuation of the row above, not a row of\n its own, and giving it its own hover state makes the\n pair read as two records.\n */}\n <TableRow>\n <TableCell\n colSpan={columns.length + (selectable ? 1 : 0)}\n sx={{ py: 0, borderBottom: 0 }}\n >\n {detail}\n </TableCell>\n </TableRow>\n </Fragment>\n );\n })}\n </TableBody>\n </MuiTable>\n </TableContainer>\n <TablePagination\n component=\"div\"\n count={total}\n page={page}\n rowsPerPage={pageSize}\n rowsPerPageOptions={pageSizeOptions}\n onPageChange={handlePageChange}\n onRowsPerPageChange={handlePageSizeChange}\n {...(paginationLabels?.rowsPerPage != null && { labelRowsPerPage: paginationLabels.rowsPerPage })}\n {...(paginationLabels?.displayedRows != null && { labelDisplayedRows: paginationLabels.displayedRows })}\n sx={{\n borderTop: (theme) => `1px solid ${theme.palette.divider}`,\n '& .MuiTablePagination-displayedRows': {\n fontSize: '0.8rem',\n },\n '& .MuiTablePagination-selectLabel': {\n fontSize: '0.8rem',\n },\n }}\n />\n </StyledTableContainer>\n );\n}\n","'use client';\n\n/**\n * Status Chip Component\n *\n * Universal status badge with automatic color mapping.\n *\n * @module components/admin-filters\n */\n\nimport type { ReactNode, Ref } from 'react';\nimport Chip, { type ChipProps } from '@mui/material/Chip';\nimport { alpha } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type StatusColor = 'success' | 'error' | 'warning' | 'info' | 'default';\n\ninterface StatusChipOwnProps {\n /** Status string to display (drives color mapping) */\n status: string;\n /**\n * Optional display override — pass a localized label while keeping\n * `status` as the raw enum value used for color mapping. When omitted,\n * the chip falls back to the capitalized `status` string.\n */\n label?: ReactNode;\n /** Map status values to colors */\n colorMap?: Record<string, StatusColor>;\n /** Chip size */\n size?: 'small' | 'medium';\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n/**\n * The chip takes `ref` and passes everything else to MUI's `Chip`, as every\n * leaf in this library does: the portal's members tab put two of these\n * inside a `Tooltip`, which attaches its ref and its hover handlers to its\n * child — and a chip that dropped both was a tooltip that never opened.\n */\nexport type StatusChipProps = StatusChipOwnProps &\n Omit<ChipProps, keyof StatusChipOwnProps | 'ref'> & { ref?: Ref<HTMLDivElement> };\n\n// =============================================================================\n// DEFAULT COLOR MAP\n// =============================================================================\n\nconst DEFAULT_COLOR_MAP: Record<string, StatusColor> = {\n active: 'success',\n completed: 'success',\n confirmed: 'success',\n approved: 'success',\n enabled: 'success',\n online: 'success',\n paid: 'success',\n resolved: 'success',\n success: 'success',\n\n pending: 'warning',\n processing: 'warning',\n waiting: 'warning',\n review: 'warning',\n draft: 'warning',\n\n failed: 'error',\n error: 'error',\n rejected: 'error',\n blocked: 'error',\n banned: 'error',\n disabled: 'error',\n cancelled: 'error',\n expired: 'error',\n suspended: 'error',\n offline: 'error',\n\n info: 'info',\n new: 'info',\n open: 'info',\n};\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * StatusChip - Universal status badge with color mapping.\n *\n * Automatically maps common status strings to appropriate colors.\n * Provide a custom `colorMap` to override or extend the defaults.\n *\n * @example\n * ```tsx\n * <StatusChip status=\"active\" />\n * <StatusChip status=\"pending\" size=\"small\" />\n * <StatusChip\n * status=\"custom\"\n * colorMap={{ custom: 'info', special: 'success' }}\n * />\n * ```\n */\nexport function StatusChip({ status, label, colorMap, size = 'small', sx, ref, ...other }: StatusChipProps): ReactNode {\n const normalizedStatus = status.toLowerCase();\n const mergedMap = colorMap ? { ...DEFAULT_COLOR_MAP, ...colorMap } : DEFAULT_COLOR_MAP;\n // Own-property lookup only. Statuses arrive from the server, and a plain\n // object answers `map['constructor']` with a FUNCTION — which `?? 'default'`\n // accepts as a colour, sending `theme.palette[fn].main` into a TypeError\n // that takes the whole React tree down. `toString`, `valueOf` and\n // `hasOwnProperty` do the same.\n const mapped = Object.hasOwn(mergedMap, normalizedStatus) ? mergedMap[normalizedStatus] : undefined;\n const color: StatusColor = mapped ?? 'default';\n\n const displayLabel: ReactNode = label ?? status.charAt(0).toUpperCase() + status.slice(1).toLowerCase();\n\n return (\n <Chip\n ref={ref}\n {...other}\n label={displayLabel}\n size={size}\n sx={[\n {\n height: size === 'small' ? 22 : 28,\n fontSize: size === 'small' ? '0.7rem' : '0.775rem',\n fontWeight: 600,\n borderRadius: 0.75,\n letterSpacing: '0.01em',\n ...(color !== 'default' && {\n color: (theme: Theme) => theme.palette[color].main,\n bgcolor: (theme: Theme) => alpha(theme.palette[color].main, 0.1),\n border: (theme: Theme) => `1px solid ${alpha(theme.palette[color].main, 0.2)}`,\n }),\n ...(color === 'default' && {\n color: 'text.secondary',\n bgcolor: (theme: Theme) => alpha(theme.palette.grey[500], 0.08),\n border: (theme: Theme) => `1px solid ${alpha(theme.palette.grey[500], 0.16)}`,\n }),\n },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ]}\n />\n );\n}\n","/**\n * Canonical BTC / XMR amount formatter.\n *\n * Why this exists\n * ---------------\n * Pre-consolidation the platform had ~8 independent formatters,\n * each shipping its own opinion of precision:\n *\n * - `org-finances/formatBtc` → BTC 8, XMR 4\n * - `org-revenue-card` → BTC 4, XMR 4\n * - `orgs-overview/formatBtc` → tiered 8 → 4 → 2 by magnitude\n * - `shop-dashboard` → BTC 4\n * - `shop-categories` → BTC 8 with trailing-zero trim\n * - `finances/hooks` → BTC 8, XMR 8 (already canonical\n * but isolated from everyone else)\n * - `pages/finances DEFAULT_ASSETS` → XMR 12 (wire-precision leak)\n *\n * Result: a single dashboard showed BTC 4 in the KPI tile, BTC 8\n * in the Financial Overview tile, and BTC 6 in another corner —\n * three \"truths\" for the same value. This module is the single\n * source of truth from now on; all call sites import from here.\n *\n * Display vs wire precision\n * -------------------------\n * Wire precision (what the backend stores) is 8 for BTC, 12 for\n * XMR — those are the on-chain atomic units (satoshi, piconero).\n * Display precision is 8 for BOTH coins by platform convention:\n *\n * - 8 fractional digits is a satoshi-level read for BTC,\n * - 8 fractional digits for XMR is \"good enough\" for human eyes\n * and keeps the column widths symmetric. The last 4 digits of\n * XMR's wire value are dropped from display only — never from\n * storage, math, or wire transfers.\n *\n * The platform-wide symmetric formatting was a direct user-facing\n * request: the same coin column should align cleanly whether the\n * row holds BTC or XMR.\n *\n * Which way a dropped digit goes\n * ------------------------------\n * Those four dropped XMR digits are the reason this module has a\n * rounding DIRECTION and not just a scale. Display rounding used\n * to be half-up, so a balance of\n *\n * 1.586170199999 XMR (what the account holds)\n *\n * rendered as `1.58617020 XMR` — a tenth of a piconero MORE than\n * exists. A person who reads that number and types it back into a\n * withdrawal is refused for insufficient funds, by a figure the\n * platform itself put on their screen. The same arithmetic seeds\n * the \"max balance\" shortcut, so the refusal arrives from a button\n * whose entire purpose is to be correct.\n *\n * So the rule for anything rendered as money is: **the displayed\n * magnitude is never larger than the real one.** Quantization for\n * display truncates toward zero (`'down'`), at any precision, in\n * either sign. That is not a matter of taste at eight decimals\n * versus twelve — it holds whatever the scale, which is why it is\n * a separate decision from the 8-vs-12 convention above.\n *\n * Half-up remains available and remains the default for the\n * ARITHMETIC primitives (`toScaledInteger`, `sumDecimalStrings`,\n * `subtractDecimalStrings`), where the scale is the value's own\n * and the last digit is a genuine rounding rather than a\n * truncation of digits that are really there. Arithmetic on money\n * belongs at `getCoinWireDecimals(coin)`, not at display scale;\n * quantize once, at the end, downward.\n *\n * The other direction is a lie too\n * --------------------------------\n * Truncating `0.000000004916 XMR` to eight decimals gives\n * `0.00000000` — a balance that exists, shown as nothing at all.\n * `formatCoinAmount` renders that as `< 0.00000001 XMR` instead\n * (`> -0.00000001` below zero). A threshold marker is honest about\n * both the amount and the limit of the column; a flat zero is not.\n * Pass `markDust: false` where a bare numeral is required.\n *\n * If you need a *narrower* surface (a dense table, a stat-card\n * subtitle), use `{ trim: true }` to drop trailing zeros while\n * keeping the canonical precision as the cap. Don't bypass this\n * module with an ad-hoc `toFixed(N)` — that's exactly the entropy\n * we just cleaned up, and `toFixed` rounds the wrong way for money\n * on top of rounding a double.\n */\n\n/**\n * Canonical display-precision per supported coin. Use this when\n * you need the raw precision number (e.g. populating an input\n * field's `.toFixed(...)` to seed a \"max balance\" button). For\n * actual rendering of a value, prefer `formatCoinAmount`.\n */\nexport const COIN_DISPLAY_DECIMALS: Readonly<Record<string, number>> = Object.freeze(\n // Prototype-free: a plain literal answers `COIN_DISPLAY_DECIMALS['constructor']`\n // with a function, which `?? FALLBACK_DECIMALS` accepts as a precision. That\n // produced `toFixed(NaN)` — silently formatting with zero decimals instead\n // of eight, for any coin code that collides with an Object.prototype key.\n Object.assign(Object.create(null) as Record<string, number>, { btc: 8, xmr: 8 })\n);\n\n/**\n * Atomic-unit precision per coin — what the backend actually stores.\n *\n * This is NOT a display precision and must never be used as one; the\n * platform shows both coins at eight digits on purpose (see the module\n * docblock). It is the scale to do ARITHMETIC at: totalling balances,\n * subtracting a lock from a total, comparing an entered amount against\n * what is available. Doing that at display scale quantizes four XMR\n * digits away before the sum, and each quantization is a chance to\n * report a figure the ledger does not agree with.\n *\n * The authority is payments's `coins.precision` column (`BTC` 8, `XMR` 12);\n * main keeps its own copy in `billing.service.ts` as `CRYPTO_PRECISION`.\n * This is the browser's copy, because a synchronous formatter cannot\n * query a table. Three copies of one fact: when a coin is added, all\n * three change, and a mismatch here shows up as arithmetic that silently\n * drops the coin's last digits.\n */\nexport const COIN_WIRE_DECIMALS: Readonly<Record<string, number>> = Object.freeze(\n Object.assign(Object.create(null) as Record<string, number>, { btc: 8, xmr: 12 })\n);\n\n/** Default precision when the coin code isn't recognized. */\nconst FALLBACK_DECIMALS = 8;\n\n/**\n * Wire-scale fallback for an unrecognized coin.\n *\n * Deliberately the WIDEST scale this module knows rather than the\n * narrowest. An unknown coin's digits survive arithmetic done at a scale\n * too wide; at a scale too narrow they are gone before the first\n * operation, and nothing downstream can tell. The display fallback goes\n * the other way for the same reason it truncates: too few digits shown is\n * a smaller error than digits invented.\n */\nconst FALLBACK_WIRE_DECIMALS = 12;\n\n/**\n * Which way a value that does not fit the requested scale is quantized.\n *\n * `'down'` toward zero. The displayed magnitude is never larger\n * than the real one — the rule for money on a screen.\n * `'half-up'` to the nearest, ties away from zero. The rule for\n * arithmetic, where the scale is the value's own.\n */\nexport type DecimalRounding = 'down' | 'half-up';\n\n/** A plain decimal: optional sign, digits, optional fraction. No exponents. */\nconst DECIMAL = /^([+-]?)(\\d*)(?:\\.(\\d*))?$/;\n\nexport interface FormatCoinAmountOptions {\n /**\n * Append the uppercase coin symbol (`\"0.00012345 BTC\"`).\n * Default `true`. Disable for places where the symbol is\n * rendered separately (e.g. a chip beside the number).\n */\n withSymbol?: boolean;\n /**\n * Trim trailing zeros after the decimal point. Useful in dense\n * tables where `0 BTC` reads cleaner than `0.00000000 BTC`. The\n * precision cap (8) is still honoured — we just drop tail\n * zeros up to and including the decimal point. Default `false`.\n */\n trim?: boolean;\n /**\n * Override precision. ONLY use this for legacy back-compat\n * (e.g. a screen that genuinely needs to truncate at a non-\n * standard width). Prefer the default. Negative values clamp\n * to 0.\n */\n precision?: number;\n /**\n * Custom symbol override. Defaults to `coin.toUpperCase()`. Set\n * this if you need a non-standard label (e.g. \"₿\" for BTC) —\n * but be aware that mixing symbols across the platform is what\n * this module was built to prevent.\n */\n symbol?: string;\n /**\n * Which way to quantize digits that do not fit `precision`.\n * Default `'down'` — a rendered amount is never larger than the\n * amount that exists. Pass `'half-up'` only where the figure is\n * not a quantity anyone holds (a rate, an average, a chart axis).\n */\n rounding?: DecimalRounding;\n /**\n * Render a non-zero amount that vanishes at this precision as\n * `< 0.00000001` rather than `0.00000000`. Default `true`.\n * Disable where the output has to be a bare numeral.\n */\n markDust?: boolean;\n}\n\n/**\n * Resolve the canonical display precision for a coin code.\n * Case-insensitive. Unknown codes fall back to 8.\n */\nexport function getCoinDecimals(coin: string): number {\n const decimals = COIN_DISPLAY_DECIMALS[coin.toLowerCase()];\n return typeof decimals === 'number' ? decimals : FALLBACK_DECIMALS;\n}\n\n/**\n * Resolve the ATOMIC-UNIT precision for a coin code — the scale the value\n * arrived at and the scale to compute at. Case-insensitive.\n *\n * `getCoinDecimals` is for rendering; this is for `sumDecimalStrings`,\n * `subtractDecimalStrings`, and any comparison between an amount a person\n * entered and an amount the ledger holds.\n */\nexport function getCoinWireDecimals(coin: string): number {\n const decimals = COIN_WIRE_DECIMALS[coin.toLowerCase()];\n return typeof decimals === 'number' ? decimals : FALLBACK_WIRE_DECIMALS;\n}\n\n/**\n * Format a decimal STRING at a fixed scale without going through a float.\n *\n * Exported because more than one surface needs it: `formatCoinAmount` for\n * coin balances, `AmountCell` for financial tables. Anything that receives a\n * decimal string from the wire and renders it should use this rather than\n * `Number(x).toFixed(n)`.\n *\n * The docblock above promises that string input \"preserves full precision\n * end-to-end from the RPC wire\", but the implementation used to hand the\n * string straight to `Number()` — inheriting binary floating point along with\n * its rounding surprises. `'1.005'` is fractionally BELOW 1.005 as a double,\n * so `toFixed(2)` rendered `'1.00'`: a balance displayed one cent short of\n * the one actually stored.\n *\n * This is the RENDERING half of the pair, so it quantizes DOWN by default:\n * the string it returns never stands for more than the string it was given.\n * Its arithmetic counterpart `toScaledInteger` defaults to `'half-up'`;\n * the two differ on purpose and the module docblock says why.\n *\n * Unlike `formatCoinAmount` it always returns a plain parseable decimal —\n * no threshold marker, no symbol — because its callers feed the result back\n * into `Number()`.\n *\n * @returns the formatted string, or `null` when `raw` is not a plain decimal\n * (exponent notation, junk) — the caller then falls back to `Number`.\n */\nexport function formatDecimalString(\n raw: string,\n decimals: number,\n rounding: DecimalRounding = 'down'\n): string | null {\n const scaled = toScaledInteger(raw, decimals, rounding);\n return scaled === null ? null : fromScaledInteger(scaled, decimals);\n}\n\n/**\n * A decimal string as an exact integer at `decimals` scale.\n *\n * `'1.005'` at scale 2 is `101n` under the default half-up — which is the\n * whole point: as a double the same literal sits fractionally BELOW 1.005,\n * so any arithmetic that starts with `Number('1.005')` has already lost\n * before it begins.\n *\n * The default is `'half-up'` because this is the arithmetic primitive:\n * callers pass the value's own scale, where the last digit is a rounding\n * and not a truncation. Rendering goes through `formatDecimalString`, which\n * defaults to `'down'` — see the module docblock.\n *\n * @returns null when `raw` is not a plain decimal (exponent notation, junk).\n */\nexport function toScaledInteger(\n raw: string,\n decimals: number,\n rounding: DecimalRounding = 'half-up'\n): bigint | null {\n const match = DECIMAL.exec(raw.trim());\n if (!match) return null;\n\n const [, sign = '', intPart = '', fracPart = ''] = match;\n if (intPart === '' && fracPart === '') return null;\n\n const digits = `${intPart || '0'}${fracPart.slice(0, decimals).padEnd(decimals, '0')}`;\n const roundUp = rounding === 'half-up' && (fracPart[decimals] ?? '0') >= '5';\n const magnitude = BigInt(digits) + (roundUp ? 1n : 0n);\n\n return sign === '-' ? -magnitude : magnitude;\n}\n\n/** Render a scaled integer back as a decimal string. Inverse of `toScaledInteger`. */\nexport function fromScaledInteger(scaled: bigint, decimals: number): string {\n const negative = scaled < 0n;\n const asString = (negative ? -scaled : scaled).toString().padStart(decimals + 1, '0');\n const whole = asString.slice(0, asString.length - decimals) || '0';\n const fraction = decimals > 0 ? asString.slice(asString.length - decimals) : '';\n const magnitude = decimals > 0 ? `${whole}.${fraction}` : whole;\n\n // -0 is not a balance anyone holds.\n return `${negative && scaled !== 0n ? '-' : ''}${magnitude}`;\n}\n\n/**\n * Whether `raw` reads as a plain decimal that is not zero.\n *\n * Used to tell \"this is nothing\" from \"this is less than the column can\n * show\". Exponent notation reads as neither — this module refuses it\n * everywhere, so a value it cannot parse is not claimed to be dust either.\n */\nfunction isNonZeroDecimal(raw: string): boolean {\n const match = DECIMAL.exec(raw.trim());\n if (!match) return false;\n\n const [, , intPart = '', fracPart = ''] = match;\n if (intPart === '' && fracPart === '') return false;\n\n return /[1-9]/.test(intPart) || /[1-9]/.test(fracPart);\n}\n\n/**\n * Add decimal strings exactly, returning a decimal string.\n *\n * For totalling amounts that arrived from the wire as strings. Accumulating\n * them with `parseFloat` is the same mistake as formatting with it, one step\n * earlier and harder to see: `0.1 + 0.2 + 0.3` is `0.6000000000000001`, and\n * while a formatter capped at eight decimals rounds that back to `0.60000000`,\n * anything that shows the raw total — a tooltip, a CSV export, a value posted\n * back to the server — shows the artefact.\n *\n * Values that are not plain decimals are skipped rather than poisoning the\n * total with `NaN`; `null` and `undefined` count as absent, not as zero-ish\n * junk. Numbers are accepted for callers mid-migration, and go through their\n * decimal representation rather than their binary one.\n *\n * @param decimals scale to accumulate at — use the coin's WIRE precision\n * (`getCoinWireDecimals`). Accumulating at display scale quantizes\n * each value before it is added, so the total is a sum of roundings;\n * `getCoinDecimals` is for the one quantization at the end.\n * @param options.rounding how each value is quantized to `decimals`. Default\n * `'half-up'`; at wire scale nothing is dropped and it does not\n * arise. Pass `'down'` if you must accumulate at display scale and\n * the total is money — a sum of half-ups can exceed what exists.\n */\nexport function sumDecimalStrings(\n values: Iterable<string | number | null | undefined>,\n decimals: number,\n options?: { rounding?: DecimalRounding }\n): string {\n const rounding = options?.rounding ?? 'half-up';\n let total = 0n;\n\n for (const value of values) {\n if (value === null || value === undefined || value === '') continue;\n const scaled = toScaledInteger(\n typeof value === 'number' ? String(value) : value,\n decimals,\n rounding\n );\n if (scaled !== null) total += scaled;\n }\n\n return fromScaledInteger(total, decimals);\n}\n\n/**\n * Subtract decimal strings exactly, returning a decimal string.\n *\n * The companion to `sumDecimalStrings`, and the one a wallet needs more\n * often: available balance is total minus locked, and computing it with\n * `parseFloat` produces `0.19999999999999998` from `0.30000000 - 0.10000000`.\n * A formatter capped at the coin's precision rounds that back, but the raw\n * value does not always reach a formatter — a tooltip, a CSV column, a\n * \"max\" button that fills an amount field, or a value posted back to the\n * server all show it as it is. Small amounts are worse than wrong: they\n * become exponential notation, and `1.0999999999999999e-7` is not a number\n * any balance field will accept.\n *\n * Unparseable inputs are treated as absent — `null` when the minuend cannot\n * be read, since a difference from an unknown quantity is unknown, and\n * subtracting nothing when a subtrahend cannot be read.\n *\n * @param decimals scale to compute at — `getCoinWireDecimals(coin)`. At\n * display scale the minuend and the subtrahends are each quantized\n * first, and an available balance assembled from two roundings can\n * come out above the amount the ledger will actually release.\n * @param clampAtZero return '0' rather than a negative result. On for the\n * available-balance case, where a negative would be a display artefact\n * of two readings taken a moment apart, not a debt.\n * @param rounding how each operand is quantized to `decimals`. Default\n * `'half-up'`, matching `toScaledInteger`.\n */\nexport function subtractDecimalStrings(\n minuend: string | number | null | undefined,\n subtrahends: Iterable<string | number | null | undefined>,\n decimals: number,\n options?: { clampAtZero?: boolean; rounding?: DecimalRounding }\n): string | null {\n if (minuend === null || minuend === undefined || minuend === '') return null;\n\n const rounding = options?.rounding ?? 'half-up';\n let total = toScaledInteger(\n typeof minuend === 'number' ? String(minuend) : minuend,\n decimals,\n rounding\n );\n if (total === null) return null;\n\n for (const value of subtrahends) {\n if (value === null || value === undefined || value === '') continue;\n const scaled = toScaledInteger(\n typeof value === 'number' ? String(value) : value,\n decimals,\n rounding\n );\n if (scaled !== null) total -= scaled;\n }\n\n if (options?.clampAtZero && total < 0n) total = 0n;\n return fromScaledInteger(total, decimals);\n}\n\n/**\n * Format a crypto amount for display.\n *\n * Input can be a string (preferred — preserves full precision\n * end-to-end from the RPC wire) or a number. Non-finite / NaN\n * inputs render as the zero-shaped placeholder so the UI never\n * shows `NaN BTC`.\n *\n * Digits below the coin's display precision are dropped, not rounded up:\n * the string returned never stands for more coin than the argument did.\n * An amount that is real but smaller than the last displayed digit renders\n * as `< 0.00000001` rather than as a flat zero.\n *\n * @example\n * formatCoinAmount('0.001', 'BTC') // '0.00100000 BTC'\n * formatCoinAmount('0.001', 'BTC', { trim: true }) // '0.001 BTC'\n * formatCoinAmount(null, 'XMR') // '0.00000000 XMR'\n * formatCoinAmount('1.23456789', 'BTC', { withSymbol: false }) // '1.23456789'\n * formatCoinAmount('1.586170199999', 'XMR') // '1.58617019 XMR'\n * formatCoinAmount('0.000000004916', 'XMR') // '< 0.00000001 XMR'\n */\nexport function formatCoinAmount(\n value: string | number | null | undefined,\n coin: string,\n options?: FormatCoinAmountOptions,\n): string {\n const code = coin.toLowerCase();\n const symbol = options?.symbol ?? coin.toUpperCase();\n const withSymbol = options?.withSymbol !== false;\n const decimals = Math.max(0, options?.precision ?? getCoinDecimals(code));\n const trim = options?.trim === true;\n const rounding = options?.rounding ?? 'down';\n const markDust = options?.markDust !== false;\n\n // A number goes through its DECIMAL representation, not its binary one —\n // the same choice `sumDecimalStrings` makes. `String(1.586170199999)` is\n // the shortest round-tripping decimal for that double; handing the double\n // itself to `toFixed` reintroduces exactly the rounding this module\n // exists to avoid.\n const raw =\n typeof value === 'string'\n ? value.trim()\n : typeof value === 'number' && Number.isFinite(value)\n ? String(Object.is(value, -0) ? 0 : value)\n : '';\n\n let formatted = raw === '' ? null : formatDecimalString(raw, decimals, rounding);\n const exact = formatted !== null;\n\n if (formatted === null) {\n // Not a plain decimal: exponent notation, or junk. The float path stays\n // for those, because there is nothing better to do with them.\n let n = typeof value === 'number' ? value : Number(raw);\n if (!Number.isFinite(n)) n = 0;\n // `-0` formats as \"-0.00000000\" otherwise.\n if (Object.is(n, -0)) n = 0;\n formatted = n.toFixed(decimals);\n }\n\n // Real, and smaller than this column can show. A flat zero here is the\n // mirror of rounding up: it reports an amount the holder does not have.\n if (markDust && exact && !/[1-9]/.test(formatted) && isNonZeroDecimal(raw)) {\n const epsilon = fromScaledInteger(1n, decimals);\n const below = raw.startsWith('-');\n return withSymbol\n ? `${below ? '>' : '<'} ${below ? '-' : ''}${epsilon} ${symbol}`\n : `${below ? '>' : '<'} ${below ? '-' : ''}${epsilon}`;\n }\n\n if (trim && formatted.includes('.')) {\n // Drop trailing zeros and a trailing solitary decimal point.\n formatted = formatted.replace(/\\.?0+$/, '');\n if (formatted === '' || formatted === '-') formatted = '0';\n }\n\n return withSymbol ? `${formatted} ${symbol}` : formatted;\n}\n\n/**\n * Render a multi-coin total map (e.g. revenue across coins)\n * as a single inline string: `\"0.00010000 BTC · 0.00000000 XMR\"`.\n *\n * Stable ordering by lower-cased coin code so BTC always appears\n * before XMR regardless of object-property iteration quirks.\n */\nexport function formatCoinAmountList(\n totals: Partial<Record<string, string | number | null | undefined>>,\n options?: FormatCoinAmountOptions & { separator?: string },\n): string {\n const sep = options?.separator ?? ' · ';\n return Object.keys(totals)\n .sort()\n .map((coin) => formatCoinAmount(totals[coin], coin, options))\n .join(sep);\n}\n","'use client';\n\n/**\n * Amount Cell Component\n *\n * Formatted amount display for financial tables with monospace font,\n * optional sign coloring, and currency display.\n *\n * @module components/admin-filters\n */\n\nimport type { ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { formatDecimalString } from '../../utils/format-crypto.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AmountCellProps {\n /** Amount as string (to preserve precision for crypto values) */\n amount: string;\n /** Currency code (e.g. \"BTC\", \"USD\", \"XMR\") */\n currency?: string;\n /** Number of decimal places */\n decimals?: number;\n /** Show +/- sign prefix */\n showSign?: boolean;\n /** Color positive green / negative red */\n color?: boolean;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction formatAmount(amount: string, decimals?: number): string {\n const num = parseFloat(amount);\n if (Number.isNaN(num)) return amount;\n\n // Scale the DECIMAL STRING, never `Number(amount).toFixed(n)`.\n //\n // This component exists for financial tables, and its own docblock shows\n // `<AmountCell amount=\"0.00045123\" currency=\"XMR\" decimals={12} />` — a\n // precision at which a double has already lost digits. The amount arrives\n // as a string precisely so those digits survive; rounding it through a\n // float discarded them at the last step before display.\n const scaled = decimals !== undefined ? formatDecimalString(amount, decimals) : null;\n const fixed = scaled ?? (decimals !== undefined ? num.toFixed(decimals) : amount);\n const [intPart, decPart] = fixed.split('.');\n const absInt = intPart.replace('-', '');\n\n // Add thousands separators\n const formatted = absInt.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n const prefix = num < 0 ? '-' : '';\n return decPart !== undefined ? `${prefix}${formatted}.${decPart}` : `${prefix}${formatted}`;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * AmountCell - Formatted amount display for financial data.\n *\n * Uses monospace font for alignment. Supports sign display, color coding\n * (green for positive, red for negative), and currency suffixes.\n *\n * @example\n * ```tsx\n * <AmountCell amount=\"1234.56\" currency=\"BTC\" decimals={8} />\n * <AmountCell amount=\"-500.00\" currency=\"USD\" showSign color />\n * <AmountCell amount=\"0.00045123\" currency=\"XMR\" decimals={12} />\n * ```\n */\nexport function AmountCell({\n amount,\n currency,\n decimals,\n showSign = false,\n color = false,\n sx,\n}: AmountCellProps): ReactNode {\n const num = parseFloat(amount);\n const isNegative = num < 0;\n const isPositive = num > 0;\n\n const formatted = useMemo(() => formatAmount(amount, decimals), [amount, decimals]);\n\n const signPrefix = useMemo(() => {\n if (!showSign) return '';\n if (isPositive) return '+';\n return '';\n }, [showSign, isPositive]);\n\n const textColor = useMemo(() => {\n if (!color) return undefined;\n if (isPositive) return 'success.main';\n if (isNegative) return 'error.main';\n return 'text.secondary';\n }, [color, isPositive, isNegative]);\n\n return (\n <Typography\n variant=\"body2\"\n color={textColor}\n sx={{\n fontFamily: '\"JetBrains Mono\", \"Fira Code\", \"SF Mono\", \"Consolas\", monospace',\n fontVariantNumeric: 'tabular-nums',\n fontSize: '0.8rem',\n fontWeight: 500,\n whiteSpace: 'nowrap',\n textAlign: 'right',\n ...sx,\n }}\n >\n {signPrefix}\n {formatted}\n {currency && (\n <Typography\n component=\"span\"\n variant=\"caption\"\n sx={{\n color: \"text.disabled\",\n ml: 0.5,\n fontFamily: 'inherit',\n fontSize: '0.7rem',\n fontWeight: 400\n }}>\n {currency}\n </Typography>\n )}\n </Typography>\n );\n}\n","'use client';\n\nimport type { Dayjs } from 'dayjs';\n\nimport { useState, useCallback } from 'react';\nimport dayjs from 'dayjs';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type DateRangeValue = Dayjs | null;\n\nexport interface UseDateRangePickerReturn {\n startDate: DateRangeValue;\n endDate: DateRangeValue;\n onChangeStartDate: (value: DateRangeValue) => void;\n onChangeEndDate: (value: DateRangeValue) => void;\n open: boolean;\n onOpen: () => void;\n onClose: () => void;\n onReset: () => void;\n selected: boolean;\n error: boolean;\n label: string;\n shortLabel: string;\n setStartDate: React.Dispatch<React.SetStateAction<DateRangeValue>>;\n setEndDate: React.Dispatch<React.SetStateAction<DateRangeValue>>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isAfter(start: DateRangeValue, end: DateRangeValue): boolean {\n if (!start || !end) return false;\n return start.isAfter(end);\n}\n\nfunction formatRangeLabel(start: DateRangeValue, end: DateRangeValue, full?: boolean): string {\n if (!start || !end) return '';\n if (!start.isValid() || !end.isValid() || start.isAfter(end)) return '';\n\n if (full) {\n return `${start.format('DD MMM YYYY')} - ${end.format('DD MMM YYYY')}`;\n }\n\n if (start.isSame(end, 'day')) return end.format('DD MMM YYYY');\n if (start.isSame(end, 'month')) return `${start.format('DD')} - ${end.format('DD MMM YYYY')}`;\n if (start.isSame(end, 'year')) return `${start.format('DD MMM')} - ${end.format('DD MMM YYYY')}`;\n return `${start.format('DD MMM YYYY')} - ${end.format('DD MMM YYYY')}`;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useDateRangePicker(\n initialStart: DateRangeValue = null,\n initialEnd: DateRangeValue = null\n): UseDateRangePickerReturn {\n const [open, setOpen] = useState(false);\n const [startDate, setStartDate] = useState<DateRangeValue>(initialStart);\n const [endDate, setEndDate] = useState<DateRangeValue>(initialEnd);\n\n const error = isAfter(startDate, endDate);\n\n const onOpen = useCallback(() => setOpen(true), []);\n const onClose = useCallback(() => setOpen(false), []);\n\n const onChangeStartDate = useCallback((value: DateRangeValue) => {\n setStartDate(value);\n }, []);\n\n const onChangeEndDate = useCallback(\n (value: DateRangeValue) => {\n if (error) setEndDate(null);\n setEndDate(value);\n },\n [error]\n );\n\n const onReset = useCallback(() => {\n setStartDate(null);\n setEndDate(null);\n }, []);\n\n return {\n startDate,\n endDate,\n onChangeStartDate,\n onChangeEndDate,\n open,\n onOpen,\n onClose,\n onReset,\n error,\n selected: !!startDate && !!endDate,\n label: formatRangeLabel(startDate, endDate, true),\n shortLabel: formatRangeLabel(startDate, endDate),\n setStartDate,\n setEndDate,\n };\n}\n\n/**\n * Parse a YYYY-MM-DD string to Dayjs or null.\n */\nexport function parseDateString(value: string | undefined | null): DateRangeValue {\n if (!value) return null;\n const d = dayjs(value);\n return d.isValid() ? d : null;\n}\n\n/**\n * Format a Dayjs value to YYYY-MM-DD string or empty string.\n */\nexport function formatDateString(value: DateRangeValue): string {\n if (!value || !value.isValid()) return '';\n return value.format('YYYY-MM-DD');\n}\n","'use client';\n\n/**\n * FlagIcon — purely visual country-flag wrapper.\n *\n * Asset-free by design. The consumer supplies the SVG / PNG URL via\n * the `src` prop; Prism stays publishable without bundling 250+ flag\n * images. The wrapper handles the chrome — fixed aspect ratio,\n * border-radius variants (rounded / circle / square), graceful\n * fallback when `src` is missing or fails to load (an outlined\n * neutral globe glyph).\n *\n * Usage:\n * <FlagIcon src=\"/assets/countries/ru.svg\" alt=\"Russia\" />\n * <FlagIcon src={getFlagSrc('ru')} shape=\"circle\" size={20} />\n */\n\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\nimport { styled } from '@mui/material/styles';\n\nexport type FlagShape = 'rounded' | 'circle' | 'square';\n\nexport interface FlagIconProps {\n /** Flag image URL. When missing, falls back to a neutral globe glyph. */\n src?: string | null;\n /** Accessible label (country name). Falls back to `code` or empty string. */\n alt?: string;\n /** Optional ISO code — surfaced in the `aria-label` when `alt` isn't provided. */\n code?: string | null;\n /** Visual shape. Default `rounded` (4px radius); `circle` clips to a disc. */\n shape?: FlagShape;\n /**\n * Height in pixels. Width is computed at the 4:3 aspect that\n * matches the bundled SVG set; the wrapper stays square in\n * `circle` mode so the disc isn't squashed.\n */\n size?: number;\n /** Additional className. */\n className?: string;\n}\n\nexport function FlagIcon({\n src,\n alt,\n code,\n shape = 'rounded',\n size = 20,\n className,\n}: FlagIconProps): ReactNode {\n const [errored, setErrored] = useState(false);\n // Circle mode forces a 1:1 frame (otherwise the 4:3 SVG becomes an\n // oval). Other shapes keep the natural aspect ratio.\n const width = shape === 'circle' ? size : Math.round((size * 4) / 3);\n const radius = shape === 'circle' ? '50%' : shape === 'square' ? '0' : '3px';\n const accessibleLabel = alt ?? (code ? code.toUpperCase() : '');\n\n if (!src || errored) {\n return (\n <FlagFallback\n className={className}\n sx={{ width, height: size, borderRadius: radius }}\n aria-label={accessibleLabel || undefined}\n >\n {/* Inline globe glyph — cheaper than a font / emoji,\n renders identically across platforms. */}\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" width=\"60%\" height=\"60%\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M3 12h18M12 3a14 14 0 010 18M12 3a14 14 0 000 18\" />\n </svg>\n </FlagFallback>\n );\n }\n\n return (\n <FlagFrame\n className={className}\n sx={{ width, height: size, borderRadius: radius }}\n >\n <FlagImg\n src={src}\n alt={accessibleLabel}\n loading=\"lazy\"\n onError={() => setErrored(true)}\n />\n </FlagFrame>\n );\n}\n\nconst FlagFrame = styled('span')(({ theme }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n flexShrink: 0,\n // Neutral 1px outline so flags with white edges (e.g. JP, CY) stay\n // legible on light surfaces. Uses an `inset` shadow rather than a\n // border to avoid disturbing the flag's intrinsic size.\n boxShadow: `inset 0 0 0 1px ${theme.palette.divider}`,\n}));\n\nconst FlagImg = styled('img')({\n width: '100%',\n height: '100%',\n display: 'block',\n objectFit: 'cover',\n // Sharpen the rasterised SVG on Hi-DPI; no effect on vector but\n // costs nothing. Pixelated would be wrong for a flag, so the\n // browser default (auto smoothing) wins.\n});\n\nconst FlagFallback = styled('span')(({ theme }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n color: theme.palette.text.disabled,\n backgroundColor:\n theme.palette.mode === 'dark'\n ? theme.palette.action.hover\n : theme.palette.action.selected,\n boxShadow: `inset 0 0 0 1px ${theme.palette.divider}`,\n}));\n","'use client';\n\n/**\n * CountrySelect — minimalist, localised country picker.\n *\n * Asset-free design: the consumer passes a typed `options` array\n * (Prism does not bundle the ISO 3166-1 list) and a `getFlagSrc`\n * resolver (Prism does not bundle 250+ flag SVGs). The portal supplies\n * both from its own `data/countries.ts` + `assets/countries/`, so\n * `@omnitron-dev/prism` stays under its current weight.\n *\n * The picker is Autocomplete-backed:\n * - searchable by the visible label (locale-resolved), the iso2\n * code, AND the alternate-locale name — typing \"Russ\" or \"Рос\"\n * both surface the same row.\n * - keyboard-friendly (arrow keys, Enter, Esc work natively from\n * MUI Autocomplete).\n * - rounded flag in the input adornment so the chosen country\n * reads at a glance even without expanding the dropdown.\n *\n * Value contract: `value` is the lowercase iso2 code (`\"ru\"`, `\"us\"`,\n * …) or `null`. The component never returns the country object —\n * callers look up the rest from their own dictionary if needed,\n * keeping the surface narrow and JSON-serialisable for forms.\n *\n * Usage:\n * <CountrySelect\n * value={form.countryCode}\n * onChange={(iso2) => form.setField('countryCode', iso2)}\n * options={COUNTRIES}\n * getFlagSrc={(iso2) => `/assets/countries/${iso2}.svg`}\n * getOptionLabel={(c) => locale === 'ru' ? c.ru : c.en}\n * label=\"Country\"\n * />\n */\n\nimport type { ReactNode, SyntheticEvent } from 'react';\nimport { useCallback, useMemo } from 'react';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport type { TextFieldProps } from '@mui/material/TextField';\nimport type { AutocompleteProps } from '@mui/material/Autocomplete';\n\nimport { FlagIcon } from './flag-icon';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Generic shape the picker understands. The consumer's full Country\n * type can extend this — we only read what we need.\n *\n * `iso2` MUST be lowercase. Renderers compare and lookup by lowercase\n * throughout the picker; mixing case will quietly desynchronise the\n * selected state from the option list.\n */\nexport interface CountryOption {\n iso2: string;\n en: string;\n ru: string;\n /** Optional extras (iso3, phone, …) the consumer may use elsewhere. */\n [key: string]: unknown;\n}\n\nexport interface CountrySelectProps {\n /** Currently selected ISO 3166-1 alpha-2 code (lowercase) or null. */\n value: string | null;\n /** Called with the new iso2 code (lowercase) or null when cleared. */\n onChange: (iso2: string | null) => void;\n /** Full country list. Consumer owns the data; Prism does not bundle. */\n options: ReadonlyArray<CountryOption>;\n /** Flag URL resolver. Receives lowercase iso2, returns absolute or relative URL. */\n getFlagSrc?: (iso2: string) => string | null | undefined;\n /**\n * Locale-aware label resolver. Defaults to the `en` field.\n * Pass `(c) => locale === 'ru' ? c.ru : c.en` from the host app's\n * i18n hook to render in the active language.\n */\n getOptionLabel?: (c: CountryOption) => string;\n /** Field label (rendered by the underlying TextField). */\n label?: string;\n /** Placeholder text. */\n placeholder?: string;\n /** Helper text below the input. */\n helperText?: ReactNode;\n /** Error state (shows the input red, helperText switches to error.main). */\n error?: boolean;\n /** Disable the field entirely. */\n disabled?: boolean;\n /** Take full width of the container. */\n fullWidth?: boolean;\n /** Compact / dense variant. */\n size?: 'small' | 'medium';\n /** Override the underlying TextField props (variant, sx, slotProps, …). */\n textFieldProps?: Partial<TextFieldProps>;\n /** Forwarded Autocomplete props for niche tweaks (sx, ListboxProps, …). */\n autocompleteProps?: Partial<\n Omit<\n AutocompleteProps<CountryOption, false, false, false>,\n 'value' | 'onChange' | 'options' | 'renderInput' | 'getOptionLabel'\n >\n >;\n /**\n * Sentinel value emitted when the user picks the synthetic\n * \"Worldwide\" row. When set, an extra pinned row appears at the\n * top of the dropdown with a globe icon instead of a flag.\n * Use a value that cannot collide with any ISO 3166-1 alpha-2\n * code (e.g. `'world'` or `'*'`). Defaults to undefined → no row.\n */\n worldwideValue?: string;\n /**\n * Already-localised label for the worldwide row. Consumer pulls\n * this from i18n (e.g. `t('common.worldwide')`). Required when\n * `worldwideValue` is set.\n */\n worldwideLabel?: string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function CountrySelect({\n value,\n onChange,\n options,\n getFlagSrc,\n getOptionLabel,\n label,\n placeholder,\n helperText,\n error,\n disabled,\n fullWidth = true,\n size = 'small',\n textFieldProps,\n autocompleteProps,\n worldwideValue,\n worldwideLabel,\n}: CountrySelectProps): ReactNode {\n // Resolve the visible label per option. Defaults to `en` so the\n // picker still renders something sensible when the host app forgets\n // to pass `getOptionLabel`.\n const label_ = useCallback(\n (c: CountryOption) => {\n // Synthetic worldwide row carries its localised label directly\n // in the `en` field (we mirror it into `ru` too, see below).\n if (worldwideValue && c.iso2 === worldwideValue) {\n return worldwideLabel ?? c.en;\n }\n return getOptionLabel ? getOptionLabel(c) : c.en;\n },\n [getOptionLabel, worldwideValue, worldwideLabel],\n );\n\n // Build the option set. When `worldwideValue` is set, prepend a\n // synthetic row so it sits at the top of the dropdown. We use a\n // pseudo iso2 that the consumer controls (e.g. `'world'`) so it\n // never collides with real ISO codes.\n const optionsWithWorld = useMemo(() => {\n if (!worldwideValue) return options as CountryOption[];\n const synthetic: CountryOption = {\n iso2: worldwideValue,\n en: worldwideLabel ?? 'Worldwide',\n ru: worldwideLabel ?? 'Worldwide',\n };\n return [synthetic, ...options];\n }, [options, worldwideValue, worldwideLabel]);\n\n // Lookup map for O(1) value→option resolution. Recomputed when the\n // `options` reference changes — callers should memoise the array\n // so this map stays stable.\n const byIso2 = useMemo(() => {\n const map = new Map<string, CountryOption>();\n for (const o of optionsWithWorld) map.set(o.iso2.toLowerCase(), o);\n return map;\n }, [optionsWithWorld]);\n\n const selected = value ? byIso2.get(value.toLowerCase()) ?? null : null;\n const isWorld = !!(worldwideValue && selected && selected.iso2 === worldwideValue);\n\n const handleChange = useCallback(\n (_: SyntheticEvent, next: CountryOption | null) => {\n onChange(next ? next.iso2.toLowerCase() : null);\n },\n [onChange],\n );\n\n // Search filter — match against the resolved label, iso2, AND the\n // other-locale name so the user can type \"Russ\" or \"Рос\" and find\n // the same row regardless of the active UI language.\n const filterOptions = useCallback(\n (opts: CountryOption[], state: { inputValue: string }) => {\n const q = state.inputValue.trim().toLowerCase();\n if (!q) return opts;\n return opts.filter((o) => {\n if (o.iso2.toLowerCase().includes(q)) return true;\n if (label_(o).toLowerCase().includes(q)) return true;\n // Cross-locale search: always check both en and ru.\n if (o.en.toLowerCase().includes(q)) return true;\n if (o.ru.toLowerCase().includes(q)) return true;\n return false;\n });\n },\n [label_],\n );\n\n return (\n <Autocomplete<CountryOption, false, false, false>\n value={selected}\n onChange={handleChange}\n options={optionsWithWorld}\n getOptionLabel={label_}\n isOptionEqualToValue={(a, b) => a.iso2.toLowerCase() === b.iso2.toLowerCase()}\n filterOptions={filterOptions}\n disabled={disabled}\n fullWidth={fullWidth}\n size={size}\n autoHighlight\n // Keep popup snappy on long lists — virtualisation would be\n // nicer for >500 rows but 250 ISO countries paint in well\n // under one frame at the default rendering cost.\n renderOption={(props, option) => {\n const { key, ...rest } = props as React.HTMLAttributes<HTMLLIElement> & { key: string };\n const isWorldRow = worldwideValue !== undefined && option.iso2 === worldwideValue;\n const src = isWorldRow ? null : getFlagSrc?.(option.iso2.toLowerCase()) ?? null;\n return (\n <Box\n component=\"li\"\n key={key}\n {...rest}\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1.25,\n px: 1.25,\n py: 0.75,\n // Pin the worldwide row visually with a divider so the\n // user reads it as a separate semantic group.\n ...(isWorldRow && {\n borderBottom: '1px solid',\n borderColor: 'divider',\n mb: 0.5,\n }),\n }}\n >\n <FlagIcon src={src} alt={label_(option)} code={option.iso2} />\n <Typography\n variant=\"body2\"\n sx={{ flex: 1, fontWeight: isWorldRow ? 600 : 400 }}\n >\n {label_(option)}\n </Typography>\n {!isWorldRow && (\n <Typography\n variant=\"caption\"\n sx={{\n color: 'text.disabled',\n fontFamily: 'monospace',\n textTransform: 'uppercase',\n }}\n >\n {option.iso2}\n </Typography>\n )}\n </Box>\n );\n }}\n renderInput={(params) => {\n const src = !isWorld && selected && getFlagSrc\n ? getFlagSrc(selected.iso2.toLowerCase()) ?? null\n : null;\n const startAdornment = selected ? (\n <InputAdornment position=\"start\" sx={{ ml: 0.75, mr: -0.5 }}>\n <FlagIcon\n src={src}\n alt={selected ? label_(selected) : ''}\n code={isWorld ? undefined : selected?.iso2}\n />\n </InputAdornment>\n ) : null;\n\n return (\n <TextField\n {...params}\n label={label}\n placeholder={placeholder}\n helperText={helperText}\n error={error}\n {...textFieldProps}\n slotProps={{\n ...(textFieldProps?.slotProps ?? {}),\n // MUI v9 renamed Autocomplete renderInput's\n // `InputProps` / `inputProps` to `slotProps.{input,\n // htmlInput}`. Merge our flag adornment on top of the\n // input slot while keeping the chevron+clear adornments\n // that Autocomplete itself injects.\n input: {\n ...params.slotProps.input,\n ...((textFieldProps?.slotProps as { input?: object } | undefined)?.input ?? {}),\n startAdornment: startAdornment ?? params.slotProps.input.startAdornment,\n },\n htmlInput: {\n ...params.slotProps.htmlInput,\n autoComplete: 'off',\n },\n }}\n />\n );\n }}\n {...(autocompleteProps as object)}\n />\n );\n}\n","/**\n * Class Name Factory\n *\n * Creates prefixed CSS class names for consistent component styling.\n * Uses a configurable prefix to avoid collisions with other libraries.\n *\n * @module utils/create-classes\n */\n\n// =============================================================================\n// CONFIGURATION\n// =============================================================================\n\n/**\n * Default class prefix for Prism components.\n * Can be overridden via PRISM_CLASS_PREFIX environment variable.\n */\nexport const DEFAULT_CLASS_PREFIX = 'prism';\n\nlet classPrefix = DEFAULT_CLASS_PREFIX;\n\n/**\n * Set the global class prefix for all Prism components.\n *\n * @param prefix - New class prefix to use\n *\n * @example\n * ```ts\n * setClassPrefix('my-app');\n * createClasses('button__root'); // => \"my-app__button__root\"\n * ```\n */\nexport function setClassPrefix(prefix: string): void {\n classPrefix = prefix;\n}\n\n/**\n * Get the current class prefix.\n *\n * @returns Current class prefix\n */\nexport function getClassPrefix(): string {\n return classPrefix;\n}\n\n// =============================================================================\n// CLASS FACTORY\n// =============================================================================\n\n/**\n * Create a prefixed CSS class name.\n *\n * @param className - Class name suffix (e.g., \"button__root\")\n * @returns Prefixed class name (e.g., \"prism__button__root\")\n *\n * @example\n * ```ts\n * createClasses('chart__root')\n * // => \"prism__chart__root\"\n *\n * createClasses('chart__loading')\n * // => \"prism__chart__loading\"\n * ```\n */\nexport function createClasses(className: string): string {\n return `${classPrefix}__${className}`;\n}\n\n/**\n * Create multiple prefixed CSS class names.\n *\n * @param classNames - Array of class name suffixes\n * @returns Object mapping original names to prefixed names\n *\n * @example\n * ```ts\n * const classes = createClassesObject(['root', 'loading', 'label']);\n * // => { root: \"prism__root\", loading: \"prism__loading\", label: \"prism__label\" }\n * ```\n */\nexport function createClassesObject<T extends string>(classNames: readonly T[]): Record<T, string> {\n return classNames.reduce(\n (acc, name) => {\n acc[name] = createClasses(name);\n return acc;\n },\n {} as Record<T, string>\n );\n}\n\n/**\n * Create a class name factory for a specific component.\n *\n * @param componentName - Component name (e.g., \"chart\", \"button\")\n * @returns Function that creates prefixed class names for that component\n *\n * @example\n * ```ts\n * const chartClass = createComponentClasses('chart');\n * chartClass('root'); // => \"prism__chart__root\"\n * chartClass('loading'); // => \"prism__chart__loading\"\n * ```\n */\nexport function createComponentClasses(componentName: string): (suffix: string) => string;\n\n/**\n * Create a class name object for a specific component with predefined suffixes.\n *\n * @param componentName - Component name (e.g., \"chart\", \"button\")\n * @param suffixes - Array of class name suffixes\n * @returns Object mapping suffix names to prefixed class names\n *\n * @example\n * ```ts\n * const chartClasses = createComponentClasses('chart', ['root', 'loading', 'label'] as const);\n * chartClasses.root; // => \"prism__chart__root\"\n * chartClasses.loading; // => \"prism__chart__loading\"\n * ```\n */\nexport function createComponentClasses<T extends string>(\n componentName: string,\n suffixes: readonly T[]\n): Record<T, string>;\n\nexport function createComponentClasses<T extends string>(\n componentName: string,\n suffixes?: readonly T[]\n): ((suffix: string) => string) | Record<T, string> {\n if (suffixes) {\n return suffixes.reduce(\n (acc, suffix) => {\n acc[suffix] = createClasses(`${componentName}__${suffix}`);\n return acc;\n },\n {} as Record<T, string>\n );\n }\n return (suffix: string) => createClasses(`${componentName}__${suffix}`);\n}\n","import type { BoxProps } from '@mui/material/Box';\nimport type { Theme, SxProps, CSSObject } from '@mui/material/styles';\n\nimport { useRef, useState, useEffect } from 'react';\nimport { m, useTransform, useMotionValue, useAnimationFrame, useMotionTemplate } from 'framer-motion';\n\nimport Box from '@mui/material/Box';\nimport { useTheme } from '@mui/material/styles';\n\nimport { createClasses } from '../../utils/create-classes.js';\n\n// ----------------------------------------------------------------------\n\nexport const animateBorderClasses = {\n root: createClasses('animate__border__root'),\n primaryBorder: createClasses('animate__border__primary'),\n secondaryBorder: createClasses('animate__border__secondary'),\n svgWrapper: createClasses('animate__border__svg__wrapper'),\n movingShape: createClasses('animate__border__moving__shape'),\n};\n\n// ----------------------------------------------------------------------\n\n/**\n * Portal-old compatible borderGradient mixin.\n * Uses CSS mask to create a ring from the padding area.\n * `currentColor` controls the ring color when no explicit color is given.\n */\nfunction borderGradient(props?: { color?: string; padding?: string }): CSSObject {\n const { color, padding = '2px' } = props ?? {};\n\n return {\n padding,\n inset: 0,\n width: '100%',\n content: '\"\"',\n height: '100%',\n margin: 'auto',\n position: 'absolute',\n borderRadius: 'inherit',\n mask: 'linear-gradient(#FFF 0 0) content-box, linear-gradient(#FFF 0 0)',\n WebkitMask: 'linear-gradient(#FFF 0 0) content-box, linear-gradient(#FFF 0 0)',\n maskComposite: 'exclude',\n WebkitMaskComposite: 'xor',\n ...(color && { background: color }),\n };\n}\n\n// ----------------------------------------------------------------------\n\ntype BorderStyleProps = {\n /** Border stroke width as CSS string (e.g. '1px', '2px'). Default '2px'. */\n width?: string;\n /** Size (px) of the radial gradient glow that moves along the border. */\n size?: number;\n sx?: SxProps<Theme>;\n};\n\nexport type AnimateBorderProps = BoxProps & {\n /** Animation duration in seconds. Default 8. */\n duration?: number;\n slotProps?: {\n primaryBorder?: BorderStyleProps;\n secondaryBorder?: BorderStyleProps;\n /** Static outline color behind the animation. */\n outlineColor?: string | ((theme: Theme) => string);\n svgSettings?: {\n rx?: string;\n ry?: string;\n };\n };\n};\n\n// ----------------------------------------------------------------------\n\nexport function AnimateBorder({ sx, children, duration, slotProps, className, ...other }: AnimateBorderProps) {\n const theme = useTheme();\n\n const rootRef = useRef<HTMLDivElement>(null);\n const primaryBorderRef = useRef<HTMLSpanElement>(null);\n\n const [isHidden, setIsHidden] = useState(false);\n\n const secondaryBorderStyles = useComputedElementStyles(theme, primaryBorderRef);\n\n useEffect(() => {\n const handleVisibility = () => {\n if (rootRef.current) {\n const displayStyle = getComputedStyle(rootRef.current).display;\n setIsHidden(displayStyle === 'none');\n }\n };\n\n handleVisibility();\n\n window.addEventListener('resize', handleVisibility);\n\n return () => {\n window.removeEventListener('resize', handleVisibility);\n };\n }, []);\n\n const outlineColor =\n typeof slotProps?.outlineColor === 'function' ? slotProps?.outlineColor(theme) : slotProps?.outlineColor;\n\n const borderProps = {\n duration,\n isHidden,\n rx: slotProps?.svgSettings?.rx,\n ry: slotProps?.svgSettings?.ry,\n };\n\n const renderPrimaryBorder = () => (\n <MovingBorder\n {...borderProps}\n ref={primaryBorderRef}\n size={slotProps?.primaryBorder?.size}\n sx={[\n {\n ...borderGradient({ padding: slotProps?.primaryBorder?.width }),\n },\n ...(Array.isArray(slotProps?.primaryBorder?.sx)\n ? (slotProps!.primaryBorder!.sx as any[])\n : [slotProps?.primaryBorder?.sx]),\n ]}\n />\n );\n\n const renderSecondaryBorder = () =>\n slotProps?.secondaryBorder && (\n <MovingBorder\n {...borderProps}\n size={slotProps?.secondaryBorder?.size ?? slotProps?.primaryBorder?.size}\n sx={[\n {\n ...borderGradient({\n padding: slotProps?.secondaryBorder?.width ?? secondaryBorderStyles.padding,\n }),\n borderRadius: secondaryBorderStyles.borderRadius,\n transform: 'scale(-1, -1)',\n },\n ...(Array.isArray(slotProps?.secondaryBorder?.sx)\n ? (slotProps!.secondaryBorder!.sx as any[])\n : [slotProps?.secondaryBorder?.sx]),\n ]}\n />\n );\n\n return (\n <Box\n dir=\"ltr\"\n ref={rootRef}\n className={[animateBorderClasses.root, className].filter(Boolean).join(' ')}\n sx={[\n {\n minWidth: 40,\n minHeight: 40,\n overflow: 'hidden',\n position: 'relative',\n width: 'fit-content',\n '&::before': borderGradient({\n color: outlineColor,\n padding: slotProps?.primaryBorder?.width,\n }),\n ...(!!children && {\n minWidth: 'unset',\n minHeight: 'unset',\n }),\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n >\n {renderPrimaryBorder()}\n {renderSecondaryBorder()}\n {children}\n </Box>\n );\n}\n\n// ----------------------------------------------------------------------\n\ntype MovingBorderProps = BoxProps<'span'> & {\n rx?: string;\n ry?: string;\n duration?: number;\n isHidden?: boolean;\n size?: BorderStyleProps['size'];\n};\n\nfunction MovingBorder({ sx, size, isHidden, rx = '30%', ry = '30%', duration = 8, ...other }: MovingBorderProps) {\n const svgRectRef = useRef<SVGRectElement>(null);\n const progress = useMotionValue<number>(0);\n\n const updateAnimationFrame = (time: number) => {\n if (!svgRectRef.current) return;\n try {\n const pathLength = svgRectRef.current.getTotalLength();\n const pixelsPerMs = pathLength / (duration * 1000);\n progress.set((time * pixelsPerMs) % pathLength);\n } catch {\n return;\n }\n };\n\n const calculateTransform = (val: number) => {\n if (!svgRectRef.current) return { x: 0, y: 0 };\n try {\n const point = svgRectRef.current.getPointAtLength(val);\n return point ? { x: point.x, y: point.y } : { x: 0, y: 0 };\n } catch {\n return { x: 0, y: 0 };\n }\n };\n\n useAnimationFrame((time) => (!isHidden ? updateAnimationFrame(time) : undefined));\n\n const x = useTransform(progress, (val) => calculateTransform(val).x);\n const y = useTransform(progress, (val) => calculateTransform(val).y);\n const transform = useMotionTemplate`translateX(${x}px) translateY(${y}px) translateX(-50%) translateY(-50%)`;\n\n return (\n <Box component=\"span\" sx={[{ textAlign: 'initial' }, ...(Array.isArray(sx) ? sx : [sx])]} {...other}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n preserveAspectRatio=\"none\"\n width=\"100%\"\n height=\"100%\"\n className={animateBorderClasses.svgWrapper}\n style={{ position: 'absolute' }}\n >\n <rect ref={svgRectRef} fill=\"none\" width=\"100%\" height=\"100%\" rx={rx} ry={ry} />\n </svg>\n\n <Box\n component={m.span}\n style={{ transform }}\n className={animateBorderClasses.movingShape}\n sx={{\n width: size,\n height: size,\n filter: 'blur(8px)',\n position: 'absolute',\n background: 'radial-gradient(currentColor 40%, transparent 80%)',\n }}\n />\n </Box>\n );\n}\n\n// ----------------------------------------------------------------------\n\nfunction useComputedElementStyles(theme: Theme, ref: React.RefObject<HTMLSpanElement | null>) {\n const [computedStyles, setComputedStyles] = useState<CSSObject | null>(null);\n\n const isRtl = theme.direction === 'rtl';\n\n useEffect(() => {\n if (ref.current) {\n const style = getComputedStyle(ref.current);\n setComputedStyles({\n paddingTop: style.paddingBottom,\n paddingBottom: style.paddingTop,\n paddingLeft: isRtl ? style.paddingLeft : style.paddingRight,\n paddingRight: isRtl ? style.paddingRight : style.paddingLeft,\n borderTopLeftRadius: isRtl ? style.borderBottomLeftRadius : style.borderBottomRightRadius,\n borderTopRightRadius: isRtl ? style.borderBottomRightRadius : style.borderBottomLeftRadius,\n borderBottomLeftRadius: isRtl ? style.borderTopLeftRadius : style.borderTopRightRadius,\n borderBottomRightRadius: isRtl ? style.borderTopRightRadius : style.borderTopLeftRadius,\n });\n }\n }, [ref, isRtl]);\n\n return {\n padding: `${computedStyles?.paddingTop} ${computedStyles?.paddingRight} ${computedStyles?.paddingBottom} ${computedStyles?.paddingLeft}`,\n borderRadius: `${computedStyles?.borderTopLeftRadius} ${computedStyles?.borderTopRightRadius} ${computedStyles?.borderBottomRightRadius} ${computedStyles?.borderBottomLeftRadius}`,\n };\n}\n","import { domMax, LazyMotion } from 'framer-motion';\n\n// ----------------------------------------------------------------------\n\nexport type MotionLazyProps = {\n children: React.ReactNode;\n};\n\nexport function MotionLazy({ children }: MotionLazyProps) {\n return (\n <LazyMotion strict features={domMax}>\n {children}\n </LazyMotion>\n );\n}\n","'use client';\n\n/**\n * Avatar Component\n *\n * Enhanced avatar with fallback initials and group support.\n *\n * @module components/avatar\n */\n\nimport type { ReactNode, CSSProperties, Ref } from 'react';\nimport { useMemo } from 'react';\nimport MuiAvatar from '@mui/material/Avatar';\nimport AvatarGroup from '@mui/material/AvatarGroup';\nimport { styled, useTheme } from '@mui/material/styles';\nimport type { AvatarProps as MuiAvatarProps } from '@mui/material/Avatar';\nimport type { AvatarGroupProps as MuiAvatarGroupProps } from '@mui/material/AvatarGroup';\nimport type { Palette } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport type AvatarShape = 'circular' | 'rounded' | 'square';\n\nexport interface AvatarProps extends Omit<MuiAvatarProps, 'variant'> {\n /** Avatar size preset */\n size?: AvatarSize;\n /** Avatar shape */\n shape?: AvatarShape;\n /** User name for fallback initials */\n name?: string;\n /** Show online indicator */\n online?: boolean;\n /** Show offline indicator */\n offline?: boolean;\n /** Badge content (e.g., notification count) */\n badge?: ReactNode;\n /** Custom badge color */\n badgeColor?: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';\n}\n\n// =============================================================================\n// UTILS\n// =============================================================================\n\nconst SIZES: Record<AvatarSize, number> = {\n xs: 24,\n sm: 32,\n md: 40,\n lg: 56,\n xl: 80,\n};\n\nconst FONT_SIZES: Record<AvatarSize, number> = {\n xs: 10,\n sm: 12,\n md: 14,\n lg: 20,\n xl: 28,\n};\n\n/**\n * Generate initials from a name.\n */\nfunction getInitials(name: string): string {\n const words = name.trim().split(/\\s+/);\n if (words.length === 1) {\n return words[0].slice(0, 2).toUpperCase();\n }\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n}\n\n/**\n * Generate a consistent color based on a string.\n */\nfunction stringToColor(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n\n const colors = [\n '#F44336',\n '#E91E63',\n '#9C27B0',\n '#673AB7',\n '#3F51B5',\n '#2196F3',\n '#03A9F4',\n '#00BCD4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ];\n\n return colors[Math.abs(hash) % colors.length];\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\ninterface StyledAvatarProps {\n ownerState: {\n size: AvatarSize;\n shape: AvatarShape;\n hasImage: boolean;\n bgColor?: string;\n };\n}\n\nconst StyledAvatar = styled(MuiAvatar, {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<StyledAvatarProps>(({ theme, ownerState }) => {\n const { size, shape, hasImage, bgColor } = ownerState;\n const dimension = SIZES[size];\n const fontSize = FONT_SIZES[size];\n\n const borderRadius = typeof theme.shape.borderRadius === 'number' ? theme.shape.borderRadius : 4;\n\n return {\n width: dimension,\n height: dimension,\n fontSize,\n fontWeight: 600,\n ...(shape === 'rounded' && {\n borderRadius: borderRadius * 1.5,\n }),\n ...(shape === 'square' && {\n borderRadius: 0,\n }),\n ...(!hasImage &&\n bgColor && {\n backgroundColor: bgColor,\n color: theme.palette.getContrastText(bgColor),\n }),\n };\n});\n// =============================================================================\n// WRAPPER FOR BADGES\n// =============================================================================\n\ninterface AvatarWrapperProps {\n children: ReactNode;\n online?: boolean;\n offline?: boolean;\n badge?: ReactNode;\n badgeColor?: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';\n size: AvatarSize;\n}\n\nfunction AvatarWrapper({\n children,\n online,\n offline,\n badge,\n badgeColor = 'error',\n size,\n}: AvatarWrapperProps): ReactNode {\n const theme = useTheme();\n const showIndicator = online || offline;\n const indicatorSize = size === 'xs' ? 6 : size === 'sm' ? 8 : 10;\n\n if (!showIndicator && !badge) {\n return children;\n }\n\n // Get theme-aware badge color\n const getBadgeBackgroundColor = (color: keyof Palette): string => {\n const paletteColor = theme.palette[color];\n if (paletteColor && typeof paletteColor === 'object' && 'main' in paletteColor) {\n return paletteColor.main;\n }\n return theme.palette.error.main;\n };\n\n const wrapperStyle: CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n };\n\n const indicatorStyle: CSSProperties = {\n position: 'absolute',\n bottom: 0,\n right: 0,\n width: indicatorSize,\n height: indicatorSize,\n borderRadius: '50%',\n border: `2px solid ${theme.palette.background.paper}`,\n backgroundColor: online ? theme.palette.success.main : theme.palette.grey[400],\n };\n\n const badgeStyle: CSSProperties = {\n position: 'absolute',\n top: -4,\n right: -4,\n minWidth: 18,\n height: 18,\n padding: '0 4px',\n borderRadius: 9,\n fontSize: 10,\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.palette.common.white,\n backgroundColor: getBadgeBackgroundColor(badgeColor as keyof Palette),\n };\n\n return (\n <span style={wrapperStyle}>\n {children}\n {showIndicator && <span style={indicatorStyle} />}\n {badge && <span style={badgeStyle}>{badge}</span>}\n </span>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Avatar - Enhanced avatar with fallback initials.\n *\n * @example\n * ```tsx\n * // With image\n * <Avatar src=\"/avatar.jpg\" name=\"John Doe\" />\n *\n * // Fallback to initials\n * <Avatar name=\"John Doe\" />\n *\n * // With online indicator\n * <Avatar src=\"/avatar.jpg\" name=\"John Doe\" online />\n *\n * // With badge\n * <Avatar src=\"/avatar.jpg\" name=\"John Doe\" badge={3} />\n * ```\n */\nexport function Avatar({size = 'md', shape = 'circular', name, src, alt, online, offline, badge, badgeColor, children, sx, ref, ...other }: AvatarProps & { ref?: Ref<HTMLDivElement> }) {\n const initials = useMemo(() => {\n if (children) return null;\n return name ? getInitials(name) : null;\n }, [name, children]);\n\n const bgColor = useMemo(() => {\n if (src) return undefined;\n return name ? stringToColor(name) : undefined;\n }, [src, name]);\n\n const ownerState = {\n size,\n shape,\n hasImage: Boolean(src),\n bgColor,\n };\n\n const avatarContent = (\n <StyledAvatar ref={ref} src={src} alt={alt || name} ownerState={ownerState} sx={sx} {...other}>\n {children || initials}\n </StyledAvatar>\n );\n\n return (\n <AvatarWrapper online={online} offline={offline} badge={badge} badgeColor={badgeColor} size={size}>\n {avatarContent}\n </AvatarWrapper>\n );\n}\n\n// =============================================================================\n// AVATAR GROUP\n// =============================================================================\n\nexport interface CustomAvatarGroupProps extends Omit<MuiAvatarGroupProps, 'children'> {\n /** Avatar items */\n avatars: Array<{\n name?: string;\n src?: string;\n alt?: string;\n }>;\n /** Avatar size */\n size?: AvatarSize;\n /** Maximum avatars to show */\n max?: number;\n}\n\n/**\n * CustomAvatarGroup - Display multiple avatars in a group.\n *\n * @example\n * ```tsx\n * <CustomAvatarGroup\n * avatars={[\n * { name: 'John Doe', src: '/avatar1.jpg' },\n * { name: 'Jane Smith', src: '/avatar2.jpg' },\n * { name: 'Bob Wilson' },\n * ]}\n * max={3}\n * />\n * ```\n */\nexport function CustomAvatarGroup({ avatars, size = 'sm', max = 4, sx, ...other }: CustomAvatarGroupProps): ReactNode {\n return (\n <AvatarGroup max={max} sx={sx} {...other}>\n {avatars.map((avatar, index) => (\n <Avatar key={index} name={avatar.name} src={avatar.src} alt={avatar.alt || avatar.name} size={size} />\n ))}\n </AvatarGroup>\n );\n}\n","'use client';\n\n/**\n * Badge Component\n *\n * Notification badge and status indicator components.\n *\n * @module components/badge\n */\n\nimport type { ComponentPropsWithoutRef, ReactNode, Ref } from 'react';\nimport MuiBadge from '@mui/material/Badge';\nimport Box from '@mui/material/Box';\nimport { styled } from '@mui/material/styles';\nimport type { BadgeProps as MuiBadgeProps } from '@mui/material/Badge';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type BadgeSize = 'small' | 'medium' | 'large';\n\nexport type BadgeVariant = 'standard' | 'dot' | 'online' | 'offline' | 'busy';\n\nexport type BadgeColor = 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';\n\nexport interface BadgeProps extends Omit<MuiBadgeProps, 'variant' | 'color' | 'content'> {\n /** Badge variant */\n variant?: BadgeVariant;\n /** Badge color */\n color?: BadgeColor;\n /** Badge size */\n size?: BadgeSize;\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\ninterface StyledBadgeProps {\n ownerState: {\n variant: BadgeVariant;\n color: BadgeColor;\n size: BadgeSize;\n };\n}\n\nconst StyledBadge = styled(MuiBadge, {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<StyledBadgeProps>(({ theme, ownerState }) => {\n const { variant, color, size } = ownerState;\n\n // Size dimensions\n const sizeDimensions: Record<BadgeSize, { width: number; height: number; fontSize: number }> = {\n small: { width: 16, height: 16, fontSize: 10 },\n medium: { width: 20, height: 20, fontSize: 12 },\n large: { width: 24, height: 24, fontSize: 14 },\n };\n\n const { width, height, fontSize } = sizeDimensions[size];\n\n // Color mapping\n const colorMap: Record<BadgeColor, string> = {\n default: theme.palette.grey[500],\n primary: theme.palette.primary.main,\n secondary: theme.palette.secondary.main,\n success: theme.palette.success.main,\n warning: theme.palette.warning.main,\n error: theme.palette.error.main,\n info: theme.palette.info.main,\n };\n\n // Status color mapping\n const statusColors: Record<string, string> = {\n online: theme.palette.success.main,\n offline: theme.palette.grey[500],\n busy: theme.palette.error.main,\n };\n\n const isStatusVariant = variant === 'online' || variant === 'offline' || variant === 'busy';\n const isDotVariant = variant === 'dot' || isStatusVariant;\n const badgeColor = isStatusVariant ? statusColors[variant] : colorMap[color];\n\n return {\n '& .MuiBadge-badge': {\n minWidth: isDotVariant ? height / 2 : width,\n height: isDotVariant ? height / 2 : height,\n padding: isDotVariant ? 0 : '0 4px',\n fontSize,\n fontWeight: 600,\n backgroundColor: badgeColor,\n color: theme.palette.getContrastText(badgeColor),\n ...(isDotVariant && {\n borderRadius: '50%',\n }),\n // Add pulsing animation for online status\n ...(variant === 'online' && {\n '&::after': {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n animation: 'ripple 1.2s infinite ease-in-out',\n border: `1px solid ${theme.palette.success.main}`,\n content: '\"\"',\n },\n '@keyframes ripple': {\n '0%': {\n transform: 'scale(.8)',\n opacity: 1,\n },\n '100%': {\n transform: 'scale(2.4)',\n opacity: 0,\n },\n },\n }),\n },\n };\n});\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Badge - Notification badge and status indicator.\n *\n * @example\n * ```tsx\n * // Standard badge with count\n * <Badge badgeContent={4} color=\"error\">\n * <MailIcon />\n * </Badge>\n *\n * // Dot badge\n * <Badge variant=\"dot\" color=\"primary\">\n * <NotificationsIcon />\n * </Badge>\n *\n * // Online status\n * <Badge variant=\"online\">\n * <Avatar src=\"/avatar.jpg\" />\n * </Badge>\n * ```\n */\nexport function Badge({variant = 'standard', color = 'error', size = 'medium', badgeContent, children, sx, ref, ...other }: BadgeProps & { ref?: Ref<HTMLSpanElement> }) {\n const ownerState = { variant, color, size };\n\n const isStatusVariant = variant === 'online' || variant === 'offline' || variant === 'busy';\n const isDotVariant = variant === 'dot' || isStatusVariant;\n\n return (\n <StyledBadge\n ref={ref}\n ownerState={ownerState}\n badgeContent={isDotVariant ? undefined : badgeContent}\n variant={isDotVariant ? 'dot' : 'standard'}\n sx={sx}\n {...other}\n >\n {children}\n </StyledBadge>\n );\n}\n\n// =============================================================================\n// COUNT BADGE\n// =============================================================================\n\ninterface CountBadgeOwnProps {\n /** Count value */\n count: number;\n /** Maximum count before showing + */\n max?: number;\n /** Show zero count */\n showZero?: boolean;\n /** Color */\n color?: BadgeColor;\n /** Size */\n size?: BadgeSize;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n/**\n * Leaves take `ref` and pass the rest to their root span — a count or a dot\n * is exactly what gets a `Tooltip` («3 unread», «online since 14:02»), and a\n * tooltip attaches its ref and its handlers to its child.\n */\ntype SpanRest<Own> = Omit<ComponentPropsWithoutRef<'span'>, keyof Own | 'color'> & { ref?: Ref<HTMLSpanElement> };\n\nexport type CountBadgeProps = CountBadgeOwnProps & SpanRest<CountBadgeOwnProps>;\n\n/**\n * CountBadge - Standalone count badge without children.\n *\n * @example\n * ```tsx\n * <CountBadge count={42} />\n * <CountBadge count={150} max={99} /> // Shows \"99+\"\n * ```\n */\nexport function CountBadge({\n count,\n max = 99,\n showZero = false,\n color = 'error',\n size = 'medium',\n sx,\n ref,\n ...other\n}: CountBadgeProps): ReactNode {\n if (!showZero && count === 0) {\n return null;\n }\n\n const displayCount = count > max ? `${max}+` : count.toString();\n\n const sizeDimensions: Record<BadgeSize, { minWidth: number; height: number; fontSize: number }> = {\n small: { minWidth: 16, height: 16, fontSize: 10 },\n medium: { minWidth: 20, height: 20, fontSize: 12 },\n large: { minWidth: 24, height: 24, fontSize: 14 },\n };\n\n const { minWidth, height, fontSize } = sizeDimensions[size];\n\n const colorMap: Record<BadgeColor, string> = {\n default: '#9ca3af',\n primary: '#2563eb',\n secondary: '#7c3aed',\n success: '#22c55e',\n warning: '#f59e0b',\n error: '#ef4444',\n info: '#06b6d4',\n };\n\n const bgColor = colorMap[color];\n\n return (\n <Box\n component=\"span\"\n ref={ref}\n {...other}\n sx={[\n {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth,\n height,\n padding: '0 4px',\n borderRadius: height / 2,\n fontSize,\n fontWeight: 600,\n backgroundColor: bgColor,\n color: 'white',\n },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ]}\n >\n {displayCount}\n </Box>\n );\n}\n\n// =============================================================================\n// STATUS DOT\n// =============================================================================\n\nexport type StatusDotStatus = 'online' | 'offline' | 'busy' | 'away';\n\ninterface StatusDotOwnProps {\n /** Status type */\n status: StatusDotStatus;\n /** Size in pixels */\n size?: number;\n /** Show pulsing animation for online */\n pulse?: boolean;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\nexport type StatusDotProps = StatusDotOwnProps & SpanRest<StatusDotOwnProps>;\n\n/**\n * StatusDot - Standalone status indicator.\n *\n * @example\n * ```tsx\n * <StatusDot status=\"online\" />\n * <StatusDot status=\"busy\" size={12} />\n * ```\n */\nexport function StatusDot({ status, size = 8, pulse = true, sx, ref, ...other }: StatusDotProps): ReactNode {\n const statusColors: Record<StatusDotStatus, string> = {\n online: '#22c55e',\n offline: '#9ca3af',\n busy: '#ef4444',\n away: '#f59e0b',\n };\n\n const color = statusColors[status];\n\n return (\n <Box\n component=\"span\"\n ref={ref}\n {...other}\n sx={[\n {\n display: 'inline-block',\n width: size,\n height: size,\n borderRadius: '50%',\n backgroundColor: color,\n ...(pulse &&\n status === 'online' && {\n animation: 'pulse 2s infinite',\n }),\n },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ]}\n />\n );\n}\n","'use client';\n\n/**\n * Card Component\n *\n * Enhanced card component with variants and sections.\n *\n * @module components/card\n */\n\nimport type { ReactNode, Ref } from 'react';\nimport Box from '@mui/material/Box';\nimport MuiCard from '@mui/material/Card';\nimport CardHeader from '@mui/material/CardHeader';\nimport CardContent from '@mui/material/CardContent';\nimport CardActions from '@mui/material/CardActions';\nimport Typography from '@mui/material/Typography';\nimport Skeleton from '@mui/material/Skeleton';\nimport { styled, alpha } from '@mui/material/styles';\nimport type { CardProps as MuiCardProps } from '@mui/material/Card';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type CardVariant = 'elevation' | 'outlined' | 'soft';\n\nexport interface CardProps extends Omit<MuiCardProps, 'variant' | 'title'> {\n /** Card variant */\n variant?: CardVariant;\n /** Card header title */\n title?: ReactNode;\n /** Card header subtitle */\n subheader?: ReactNode;\n /** Card header action */\n headerAction?: ReactNode;\n /** Card header styles */\n headerSx?: SxProps<Theme>;\n /** Card content styles */\n contentSx?: SxProps<Theme>;\n /** Card actions */\n actions?: ReactNode;\n /** Card actions styles */\n actionsSx?: SxProps<Theme>;\n /** Disable content padding */\n disablePadding?: boolean;\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\ninterface StyledCardProps {\n ownerState: {\n variant: CardVariant;\n };\n}\n\nconst StyledCard = styled(MuiCard, {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<StyledCardProps>(({ theme, ownerState }) => {\n const { variant } = ownerState;\n\n const borderRadius = typeof theme.shape.borderRadius === 'number' ? theme.shape.borderRadius : 4;\n\n const softStyles = {\n border: 'none',\n boxShadow: 'none',\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n };\n\n return {\n position: 'relative',\n borderRadius: borderRadius * 2,\n ...(variant === 'soft' && softStyles),\n ...(variant === 'outlined' && {\n boxShadow: 'none',\n }),\n };\n});\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Card - Enhanced card component with variants.\n *\n * @example\n * ```tsx\n * <Card title=\"Card Title\" subheader=\"Subtitle\">\n * Card content goes here\n * </Card>\n * ```\n *\n * @example\n * ```tsx\n * // Soft variant\n * <Card variant=\"soft\" title=\"Settings\">\n * <TextField label=\"Name\" />\n * </Card>\n * ```\n *\n * @example\n * ```tsx\n * // With actions\n * <Card\n * title=\"Confirm Action\"\n * actions={\n * <>\n * <Button>Cancel</Button>\n * <Button variant=\"contained\">Confirm</Button>\n * </>\n * }\n * >\n * Are you sure you want to proceed?\n * </Card>\n * ```\n */\nexport function Card({variant = 'elevation',\n title,\n subheader,\n headerAction,\n headerSx,\n contentSx,\n actions,\n actionsSx,\n disablePadding,\n children,\n sx,\n ref, ...other }: CardProps & { ref?: Ref<HTMLDivElement> }) {\n const ownerState = { variant };\n\n const hasHeader = title || subheader || headerAction;\n\n return (\n <StyledCard\n ref={ref}\n ownerState={ownerState}\n variant={variant === 'outlined' ? 'outlined' : 'elevation'}\n sx={sx}\n {...other}\n >\n {hasHeader && <CardHeader title={title} subheader={subheader} action={headerAction} sx={headerSx} />}\n\n {children && (\n <CardContent\n sx={{\n ...(disablePadding && { p: 0, '&:last-child': { pb: 0 } }),\n ...contentSx,\n }}\n >\n {children}\n </CardContent>\n )}\n\n {actions && <CardActions sx={actionsSx}>{actions}</CardActions>}\n </StyledCard>\n );\n}\n\n// =============================================================================\n// CARD SECTION\n// =============================================================================\n\nexport interface CardSectionProps {\n /** Section title */\n title?: ReactNode;\n /** Section description */\n description?: ReactNode;\n /** Section content */\n children?: ReactNode;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n/**\n * CardSection - A section within a card with title and description.\n *\n * @example\n * ```tsx\n * <Card>\n * <CardSection title=\"Personal Information\">\n * <TextField label=\"Name\" />\n * <TextField label=\"Email\" />\n * </CardSection>\n * <CardSection title=\"Preferences\">\n * <Switch label=\"Notifications\" />\n * </CardSection>\n * </Card>\n * ```\n */\nexport function CardSection({ title, description, children, sx }: CardSectionProps): ReactNode {\n return (\n <Box sx={{ mb: 3, ...sx }}>\n {title && (\n <Typography\n variant=\"subtitle1\"\n sx={{\n fontWeight: 600,\n mb: 1\n }}>\n {title}\n </Typography>\n )}\n {description && (\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.secondary\",\n mb: 2\n }}>\n {description}\n </Typography>\n )}\n {children}\n </Box>\n );\n}\n\n// =============================================================================\n// STAT CARD\n// =============================================================================\n\nexport interface StatCardProps extends Omit<CardProps, 'children'> {\n /** Stat title */\n label: string;\n /** Stat value */\n value: string | number;\n /** Change percentage */\n change?: number;\n /** Icon */\n icon?: ReactNode;\n /** Color theme */\n color?: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';\n /** Loading state — shows skeletons instead of values */\n loading?: boolean;\n /** Optional subtitle below the value */\n subtitle?: string;\n}\n\n/**\n * StatCard - A card for displaying statistics.\n *\n * @example\n * ```tsx\n * <StatCard\n * label=\"Total Sales\"\n * value=\"$24,500\"\n * change={12.5}\n * icon={<TrendingUpIcon />}\n * color=\"success\"\n * />\n * ```\n */\nexport function StatCard({\n label,\n value,\n change,\n icon,\n color = 'primary',\n loading,\n subtitle,\n variant = 'outlined',\n sx,\n ...other\n}: StatCardProps): ReactNode {\n const isPositive = change && change > 0;\n const isNegative = change && change < 0;\n\n return (\n <Card variant={variant} contentSx={{ p: 2, '&:last-child': { pb: 2 } }} sx={sx} {...other}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start' }}>\n <Box>\n {loading ? (\n <>\n <Skeleton width={80} height={16} />\n <Skeleton width={50} height={32} sx={{ mt: 0.5 }} />\n </>\n ) : (\n <>\n <Typography\n variant=\"caption\"\n sx={{\n fontWeight: 600,\n color: \"text.secondary\",\n textTransform: \"uppercase\",\n letterSpacing: 0.5\n }}>\n {label}\n </Typography>\n <Typography\n variant=\"h4\"\n sx={{\n fontWeight: 700,\n color: `${color}.main`,\n mt: 0.5\n }}>\n {value}\n </Typography>\n {change !== undefined && (\n <Typography\n variant=\"caption\"\n color={isPositive ? 'success.main' : isNegative ? 'error.main' : 'text.secondary'}\n sx={{\n fontWeight: 500,\n mt: 0.5,\n display: 'block'\n }}>\n {isPositive ? '+' : ''}\n {change}%\n </Typography>\n )}\n {subtitle && (\n <Typography variant=\"caption\" sx={{\n color: \"text.secondary\"\n }}>\n {subtitle}\n </Typography>\n )}\n </>\n )}\n </Box>\n {icon && !loading && <Box sx={{ color: `${color}.main` }}>{icon}</Box>}\n </Box>\n </Card>\n );\n}\n","'use client';\n\n/**\n * Confirm Dialog Component\n *\n * Reusable confirmation dialog with customizable actions.\n * Implements WCAG 2.1 accessibility with proper ARIA attributes.\n *\n * @module components/confirm-dialog\n */\n\nimport { useId, useState, type ReactNode } from 'react';\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogContentText from '@mui/material/DialogContentText';\nimport DialogActions from '@mui/material/DialogActions';\nimport Button from '@mui/material/Button';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ConfirmDialogProps {\n /** Whether the dialog is open */\n open: boolean;\n /** Called when dialog should close */\n onClose: () => void;\n /** Called when user confirms */\n onConfirm: () => void | Promise<void>;\n /** Dialog title */\n title?: string;\n /** Dialog content/message */\n content?: ReactNode;\n /** Confirm button text */\n confirmLabel?: string;\n /** Cancel button text */\n cancelLabel?: string;\n /** Confirm button color */\n confirmColor?: 'primary' | 'secondary' | 'error' | 'warning' | 'info' | 'success';\n /** Loading state for async confirm */\n loading?: boolean;\n /** Disable confirm button */\n disabled?: boolean;\n /** Maximum width of dialog */\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false;\n /** Additional styles for dialog */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * ConfirmDialog - Reusable confirmation dialog.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = useState(false);\n *\n * <ConfirmDialog\n * open={open}\n * onClose={() => setOpen(false)}\n * onConfirm={handleDelete}\n * title=\"Delete item?\"\n * content=\"This action cannot be undone.\"\n * confirmColor=\"error\"\n * confirmLabel=\"Delete\"\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With async confirm\n * <ConfirmDialog\n * open={open}\n * onClose={() => setOpen(false)}\n * onConfirm={async () => {\n * await deleteItem();\n * setOpen(false);\n * }}\n * loading={isDeleting}\n * title=\"Confirm deletion\"\n * />\n * ```\n */\nexport function ConfirmDialog({\n open,\n onClose,\n onConfirm,\n title = 'Confirm',\n content,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n confirmColor = 'primary',\n loading = false,\n disabled = false,\n maxWidth = 'xs',\n sx,\n}: ConfirmDialogProps): ReactNode {\n const titleId = useId();\n const descriptionId = useId();\n\n // Re-entry guard for the destructive action.\n //\n // The only thing standing between a double-click and two deletions used to\n // be the caller's `loading` prop — and most callers don't thread one\n // through, because the dialog's own example doesn't. An impatient operator\n // clicking twice fired `onConfirm` twice.\n //\n // Tracked here rather than relying on the caller: this component knows when\n // the action it started is still running.\n const [confirming, setConfirming] = useState(false);\n const busy = loading || confirming;\n\n const handleConfirm = () => {\n if (busy) return;\n\n const result = onConfirm();\n if (!(result instanceof Promise)) return;\n\n setConfirming(true);\n result\n .catch(() => {\n // The parent owns error reporting; the dialog only owns the button\n // state. Swallowing here prevents an unhandled rejection, and the\n // `finally` below makes sure a failure leaves the operator able to\n // retry instead of stuck behind a spinner.\n })\n .finally(() => setConfirming(false));\n };\n\n return (\n <Dialog\n open={open}\n onClose={busy ? undefined : onClose}\n maxWidth={maxWidth}\n fullWidth\n aria-labelledby={titleId}\n aria-describedby={content ? descriptionId : undefined}\n sx={sx}\n >\n <DialogTitle id={titleId}>{title}</DialogTitle>\n\n {content && (\n <DialogContent>\n {typeof content === 'string' ? (\n <DialogContentText id={descriptionId}>{content}</DialogContentText>\n ) : (\n <div id={descriptionId}>{content}</div>\n )}\n </DialogContent>\n )}\n\n <DialogActions sx={{ px: 3, pb: 2 }}>\n <Button onClick={onClose} color=\"inherit\" disabled={busy} variant=\"outlined\">\n {cancelLabel}\n </Button>\n\n <Button onClick={handleConfirm} color={confirmColor} variant=\"contained\" loading={busy} disabled={disabled}>\n {confirmLabel}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n\n// =============================================================================\n// DELETE DIALOG\n// =============================================================================\n\nexport interface DeleteDialogProps extends Omit<ConfirmDialogProps, 'title' | 'confirmLabel' | 'confirmColor'> {\n /** Name of the item being deleted */\n itemName?: string;\n}\n\n/**\n * DeleteDialog - Specialized confirmation for delete actions.\n *\n * @example\n * ```tsx\n * <DeleteDialog\n * open={open}\n * onClose={() => setOpen(false)}\n * onConfirm={handleDelete}\n * itemName=\"Project Alpha\"\n * />\n * ```\n */\nexport function DeleteDialog({ itemName, content, ...props }: DeleteDialogProps): ReactNode {\n return (\n <ConfirmDialog\n title={itemName ? `Delete \"${itemName}\"?` : 'Delete item?'}\n content={content ?? 'This action cannot be undone. Are you sure you want to proceed?'}\n confirmLabel=\"Delete\"\n confirmColor=\"error\"\n {...props}\n />\n );\n}\n","import type { ElementType, ReactNode } from 'react';\n\n/** The words a sponsored slot says itself; every other word is the caller's content. */\nexport interface SponsoredSlotLabels {\n /** What marks the slot as advertising when no advertiser is named. */\n sponsored: string;\n}\n\nexport const DEFAULT_SPONSORED_SLOT_LABELS: SponsoredSlotLabels = {\n sponsored: 'Sponsored',\n};\n\n/** What one placement shows — already in the reader's language. */\nexport interface SponsoredSlotContent {\n title: string;\n body?: string | null;\n image?: string | null;\n /** A logo is fitted, never cropped; a cover fills its frame. */\n imageFit?: 'cover' | 'contain';\n /** «By <advertiser>» — the caller's sentence; `labels.sponsored` when absent. */\n byline?: string | null;\n /** Why it is here: the page's own context, never anything about the reader. */\n because?: string | null;\n /** The call to action, when the slot leads somewhere. */\n cta?: string | null;\n}\n\nexport interface SponsoredSlotProps {\n /** Nothing to show collapses the slot: no frame, no gap, no «empty ad». */\n content: SponsoredSlotContent | null | undefined;\n /** `tile` sits in a row of cards; `banner` takes a column's width. */\n variant?: 'tile' | 'banner';\n /**\n * The placement is still being asked for: the slot keeps its box so the page\n * does not jump when it arrives — and collapses if nothing does.\n */\n loading?: boolean;\n labels?: Partial<SponsoredSlotLabels>;\n /** The mark beside the byline; the caller's icon set. */\n icon?: ReactNode;\n /** Where the slot leads — a router link, an anchor. Absent, it is not clickable. */\n link?: { component: ElementType; props?: Record<string, unknown> };\n /** Called when the reader follows the link, after the navigation starts. */\n onOpen?: () => void;\n /** Rendered as `data-sponsored`, for the caller's own reporting and tests. */\n id?: string;\n}\n","/**\n * One advertising placement, as every page draws it.\n *\n * Always marked as advertising, by whom, and why it is here — the page's own\n * context, never anything about the reader. Its words are the caller's (it\n * knows the placement and the reader's language); the one word the slot says\n * itself comes through `labels`.\n *\n * Its geometry is fixed by its variant, so a page can reserve the box while\n * the placement is asked for (`loading`) and nothing moves when it arrives. A\n * slot with nothing to show collapses to nothing: an empty frame reads as a\n * broken page, and a placeholder «your ad here» is an ad for advertising.\n */\n\nimport Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardActionArea from '@mui/material/CardActionArea';\nimport Skeleton from '@mui/material/Skeleton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\nimport { DEFAULT_SPONSORED_SLOT_LABELS, type SponsoredSlotProps } from './types.js';\n\nconst TILE_IMAGE = { width: '100%', aspectRatio: '4 / 3' } as const;\nconst BANNER_IMAGE = { width: 160, minHeight: 120, flexShrink: 0 } as const;\n\nexport function SponsoredSlot({\n content,\n variant = 'tile',\n loading = false,\n labels: labelsProp,\n icon,\n link,\n onOpen,\n id,\n}: SponsoredSlotProps) {\n const labels = { ...DEFAULT_SPONSORED_SLOT_LABELS, ...labelsProp };\n const banner = variant === 'banner';\n const imageBox = banner ? BANNER_IMAGE : TILE_IMAGE;\n\n if (!content) {\n if (!loading) return null;\n return (\n <Card variant=\"outlined\" sx={{ height: '100%' }} data-sponsored-pending=\"\">\n <Box sx={{ display: 'flex', flexDirection: banner ? 'row' : 'column', height: '100%' }}>\n <Skeleton variant=\"rectangular\" sx={{ ...imageBox, height: banner ? undefined : 'auto' }} />\n <Box sx={{ p: 1.5, flex: 1 }}>\n <Skeleton width=\"40%\" />\n <Skeleton width=\"80%\" />\n </Box>\n </Box>\n </Card>\n );\n }\n\n const mark = (\n <Box\n component=\"span\"\n sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5, color: 'text.secondary', typography: 'caption' }}\n >\n {icon}\n {content.byline || labels.sponsored}\n </Box>\n );\n\n const body = (\n <Box sx={{ display: 'flex', flexDirection: banner ? 'row' : 'column', height: '100%' }}>\n {content.image && (\n <Box\n component=\"img\"\n src={content.image}\n alt=\"\"\n loading=\"lazy\"\n decoding=\"async\"\n sx={{\n display: 'block',\n objectFit: content.imageFit ?? 'cover',\n ...(content.imageFit === 'contain' && { p: 2, boxSizing: 'border-box' }),\n bgcolor: 'action.hover',\n ...imageBox,\n }}\n />\n )}\n <Box sx={{ p: 1.5, display: 'flex', flexDirection: 'column', gap: 0.5, minWidth: 0 }}>\n {content.because ? <Tooltip title={content.because}>{mark}</Tooltip> : mark}\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 600 }} noWrap={!banner}>\n {content.title}\n </Typography>\n {content.body && (\n <Typography variant=\"body2\" sx={{ color: 'text.secondary' }}>\n {content.body}\n </Typography>\n )}\n {link && content.cta && (\n <Typography variant=\"caption\" sx={{ color: 'primary.main', fontWeight: 600, mt: 'auto' }}>\n {content.cta}\n </Typography>\n )}\n </Box>\n </Box>\n );\n\n return (\n <Card variant=\"outlined\" sx={{ height: '100%' }} {...(id !== undefined && { 'data-sponsored': id })}>\n {link ? (\n <CardActionArea component={link.component} {...link.props} onClick={onOpen} sx={{ height: '100%' }}>\n {body}\n </CardActionArea>\n ) : (\n body\n )}\n </Card>\n );\n}\n","'use client';\n\n/**\n * PageContent — Unified page layout primitives\n *\n * Provides consistent spacing across all pages:\n * - PageContent: vertical stack with standardized gap\n * - PageContent.CardGrid: responsive grid for cards with equal height\n *\n * @example\n * <PageContent>\n * <Breadcrumbs ... />\n * <PageContent.CardGrid columns={2}>\n * <Card>...</Card>\n * <Card>...</Card>\n * </PageContent.CardGrid>\n * </PageContent>\n *\n * @module components/page-content\n */\n\nimport type { ReactNode, Ref } from 'react';\nimport { Children } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Grid from '@mui/material/Grid';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Default spacing between top-level page sections (theme spacing units) */\nconst PAGE_GAP = 3;\n\n/** Default spacing between grid items (theme spacing units) */\nconst GRID_GAP = 3;\n\n// =============================================================================\n// PageContent\n// =============================================================================\n\nexport interface PageContentProps {\n children: ReactNode;\n /** Override gap between sections. Default: 3 (24px). */\n gap?: number;\n /** Stretch to fill available height (for centered empty states). */\n fill?: boolean;\n sx?: SxProps<Theme>;\n}\n\n/**\n * Page-level vertical layout with consistent spacing.\n *\n * Wraps children in a `Stack` with standardized gap.\n * Use `fill` to stretch for empty-state centering.\n */\nexport function PageContent({\n children,\n gap = PAGE_GAP,\n fill,\n sx,\n ref,\n ...rest\n}: PageContentProps & { ref?: Ref<HTMLDivElement> }) {\n return (\n <Stack\n ref={ref}\n spacing={gap}\n sx={{ ...(fill && { flex: 1 }), ...sx as any }}\n {...rest}\n >\n {children}\n </Stack>\n );\n}\n\n// =============================================================================\n// CardGrid\n// =============================================================================\n\nexport interface CardGridProps {\n children: ReactNode;\n /** Number of columns at `md` breakpoint. Default: 2. */\n columns?: 1 | 2 | 3 | 4;\n /** Override gap between cards. Default: 3 (24px). */\n gap?: number;\n sx?: SxProps<Theme>;\n}\n\nconst COLUMN_SIZE: Record<number, { xs: number; sm?: number; md: number }> = {\n 1: { xs: 12, md: 12 },\n 2: { xs: 12, md: 6 },\n 3: { xs: 12, sm: 6, md: 4 },\n 4: { xs: 12, sm: 6, md: 3 },\n};\n\n/**\n * Responsive card grid with equal-height items.\n *\n * Each direct child is wrapped in a Grid cell sized by `columns`.\n * Cards should use `height: '100%'` or be wrapped in a full-height container.\n * (MUI v9 unified Grid — sizing is via `size={{ xs, sm, md, ... }}` rather\n * than the deprecated `<Grid item>` shorthand from v1.)\n */\nexport function CardGrid({ children, columns = 2, gap = GRID_GAP, sx }: CardGridProps) {\n const size = COLUMN_SIZE[columns] ?? COLUMN_SIZE[2];\n\n return (\n <Grid container spacing={gap} sx={sx}>\n {Children.map(children, (child) =>\n child != null ? (\n <Grid size={size} sx={{ display: 'flex' }}>\n {child}\n </Grid>\n ) : null,\n )}\n </Grid>\n );\n}\n","'use client';\n\n/**\n * Image Component\n *\n * Enhanced image component with lazy loading, aspect ratio, and fallback support.\n *\n * @module components/image\n */\n\nimport type { ReactNode, ImgHTMLAttributes, Ref } from 'react';\nimport { useState, useCallback } from 'react';\nimport Box from '@mui/material/Box';\nimport { styled, alpha } from '@mui/material/styles';\nimport type { SxProps, Theme, Breakpoint } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AspectRatio = '2/3' | '3/2' | '4/3' | '3/4' | '16/9' | '9/16' | '21/9' | '1/1' | `${number}/${number}`;\n\nexport interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'onError'> {\n /** Image source URL */\n src: string;\n /** Alt text */\n alt: string;\n /** Aspect ratio (auto-sizes based on width) */\n ratio?: AspectRatio | Partial<Record<Breakpoint, AspectRatio>>;\n /** Fallback content on error */\n fallback?: ReactNode;\n /** Fallback image URL */\n fallbackSrc?: string;\n /** Disable lazy loading */\n disableLazy?: boolean;\n /** Object fit style */\n objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n /** Show loading placeholder */\n placeholder?: boolean;\n /** Overlay content */\n overlay?: ReactNode;\n /** Additional styles */\n sx?: SxProps<Theme>;\n /** Image styles */\n imgSx?: SxProps<Theme>;\n /** Called when image loads */\n onLoad?: () => void;\n /** Called when image fails to load */\n onError?: () => void;\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\ninterface ImageRootProps {\n ownerState: {\n ratio?: AspectRatio | Partial<Record<Breakpoint, AspectRatio>>;\n hasError: boolean;\n };\n}\n\nconst ImageRoot = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<ImageRootProps>(({ theme, ownerState }) => {\n const { ratio, hasError } = ownerState;\n\n const getRatioStyles = () => {\n if (!ratio) return {};\n\n if (typeof ratio === 'string') {\n return {\n width: '100%',\n aspectRatio: ratio,\n };\n }\n\n // Responsive ratio\n const breakpointStyles: Record<string, string | Record<string, string>> = { width: '100%' };\n for (const [bp, r] of Object.entries(ratio)) {\n if (bp === 'xs') {\n breakpointStyles.aspectRatio = r;\n } else {\n breakpointStyles[theme.breakpoints.up(bp as Breakpoint)] = {\n aspectRatio: r,\n };\n }\n }\n return breakpointStyles;\n };\n\n return {\n position: 'relative',\n display: 'block',\n overflow: 'hidden',\n borderRadius: 'inherit',\n ...getRatioStyles(),\n ...(hasError && {\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n }),\n };\n});\nconst StyledImg = styled('img')(() => ({\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n}));\n\nconst PlaceholderBox = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n '&::after': {\n content: '\"\"',\n width: 32,\n height: 32,\n borderRadius: '50%',\n border: '3px solid',\n borderColor: alpha(theme.palette.grey[500], 0.16),\n borderTopColor: theme.palette.primary.main,\n animation: 'spin 1s linear infinite',\n '@keyframes spin': {\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n },\n },\n}));\n\nconst OverlayBox = styled(Box)(() => ({\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n}));\n\nconst FallbackBox = styled(Box)(({ theme }) => ({\n width: '100%',\n height: '100%',\n minHeight: 100,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.palette.text.disabled,\n}));\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Image - Enhanced image component with lazy loading and fallback.\n *\n * @example\n * ```tsx\n * <Image\n * src=\"/avatar.jpg\"\n * alt=\"User avatar\"\n * ratio=\"1/1\"\n * sx={{ width: 100, borderRadius: 1 }}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With aspect ratio\n * <Image\n * src=\"/banner.jpg\"\n * alt=\"Banner\"\n * ratio=\"16/9\"\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With fallback\n * <Image\n * src=\"/product.jpg\"\n * alt=\"Product\"\n * fallback={<ProductPlaceholder />}\n * />\n * ```\n */\nexport function Image({src,\n alt,\n ratio,\n fallback,\n fallbackSrc,\n disableLazy = false,\n objectFit = 'cover',\n placeholder = true,\n overlay,\n sx,\n imgSx,\n onLoad,\n onError,\n ref,\n ...imgProps\n }: ImageProps & { ref?: Ref<HTMLDivElement> }) {\n const [isLoaded, setIsLoaded] = useState(false);\n const [hasError, setHasError] = useState(false);\n const [currentSrc, setCurrentSrc] = useState(src);\n\n const handleLoad = useCallback(() => {\n setIsLoaded(true);\n onLoad?.();\n }, [onLoad]);\n\n const handleError = useCallback(() => {\n if (fallbackSrc && currentSrc !== fallbackSrc) {\n setCurrentSrc(fallbackSrc);\n } else {\n setHasError(true);\n }\n onError?.();\n }, [fallbackSrc, currentSrc, onError]);\n\n const ownerState = {\n ratio,\n hasError,\n };\n\n // Render fallback content on error\n if (hasError && fallback) {\n return (\n <ImageRoot ref={ref} ownerState={ownerState} sx={sx}>\n <FallbackBox>{fallback}</FallbackBox>\n </ImageRoot>\n );\n }\n\n return (\n <ImageRoot ref={ref} ownerState={ownerState} sx={sx}>\n {/* Loading placeholder */}\n {placeholder && !isLoaded && !hasError && <PlaceholderBox />}\n\n {/* Main image */}\n <StyledImg\n src={currentSrc}\n alt={alt}\n loading={disableLazy ? 'eager' : 'lazy'}\n onLoad={handleLoad}\n onError={handleError}\n sx={[\n {\n objectFit,\n opacity: isLoaded ? 1 : 0,\n transition: 'opacity 300ms ease-in-out',\n },\n ...(Array.isArray(imgSx) ? imgSx : [imgSx]),\n ]}\n {...imgProps}\n />\n\n {/* Overlay */}\n {overlay && <OverlayBox>{overlay}</OverlayBox>}\n </ImageRoot>\n );\n}\n\n// =============================================================================\n// DEFAULT FALLBACK\n// =============================================================================\n\nfunction DefaultImageIcon() {\n return (\n <Box component=\"svg\" viewBox=\"0 0 24 24\" sx={{ width: 48, height: 48, opacity: 0.5 }}>\n <path\n fill=\"currentColor\"\n d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"\n />\n </Box>\n );\n}\n\n/**\n * ImageWithDefault - Image with default fallback icon.\n */\nexport function ImageWithDefault(props: ImageProps): ReactNode {\n return <Image fallback={<DefaultImageIcon />} {...props} />;\n}\n","'use client';\n\n/**\n * Label Component\n *\n * A versatile label/badge component for status indicators, categories, and tags.\n *\n * @module components/label\n */\n\nimport type { ReactNode, Ref } from 'react';\nimport Box from '@mui/material/Box';\nimport { alpha, styled } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type LabelColor = 'default' | 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error';\n\nexport type LabelVariant = 'filled' | 'outlined' | 'soft' | 'inverted';\n\nexport interface LabelProps {\n /** Content of the label */\n children?: ReactNode;\n /** Color scheme */\n color?: LabelColor;\n /** Visual variant */\n variant?: LabelVariant;\n /** Start icon */\n startIcon?: ReactNode;\n /** End icon */\n endIcon?: ReactNode;\n /** Additional styles */\n sx?: SxProps<Theme>;\n /** Disabled state */\n disabled?: boolean;\n /**\n * Forwarded ref to the underlying span. React 19 threads `ref`\n * through props directly, so consumers pass it like any other\n * prop and no `forwardRef` wrapper is required on this side.\n */\n ref?: Ref<HTMLSpanElement>;\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\ninterface StyledLabelProps {\n ownerState: {\n color: LabelColor;\n variant: LabelVariant;\n disabled?: boolean;\n };\n}\n\nconst StyledLabel = styled('span', {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<StyledLabelProps>(({ theme, ownerState }) => {\n const isLight = theme.palette.mode === 'light';\n const { color, variant, disabled } = ownerState;\n\n // Get palette color for non-default colors (guaranteed defined when used below)\n const paletteColor = color !== 'default' ? theme.palette[color] : null;\n\n // Fallback palette for safe access (uses grey as safe default)\n const safePalette = paletteColor ?? {\n main: theme.palette.grey[500],\n light: theme.palette.grey[300],\n dark: theme.palette.grey[700],\n contrastText: theme.palette.common.white,\n };\n\n // Border radius as number for arithmetic\n const borderRadius = typeof theme.shape.borderRadius === 'number' ? theme.shape.borderRadius : 4;\n\n const baseStyles = {\n height: 24,\n minWidth: 24,\n lineHeight: 0,\n cursor: 'default',\n borderRadius: borderRadius * 0.75,\n alignItems: 'center',\n whiteSpace: 'nowrap' as const,\n display: 'inline-flex',\n justifyContent: 'center',\n textTransform: 'capitalize' as const,\n padding: theme.spacing(0, 0.75),\n fontSize: theme.typography.pxToRem(12),\n fontWeight: theme.typography.fontWeightBold,\n transition: theme.transitions.create(['all'], {\n duration: theme.transitions.duration.shorter,\n }),\n ...(disabled && {\n opacity: 0.48,\n pointerEvents: 'none' as const,\n }),\n };\n\n // Filled variant\n const filledStyles = {\n color:\n color === 'default' ? (isLight ? theme.palette.common.white : theme.palette.grey[800]) : safePalette.contrastText,\n backgroundColor: color === 'default' ? theme.palette.text.primary : safePalette.main,\n };\n\n // Outlined variant\n const outlinedStyles = {\n color: color === 'default' ? theme.palette.text.primary : safePalette.main,\n backgroundColor: 'transparent',\n border: `2px solid ${color === 'default' ? alpha(theme.palette.grey[500], 0.32) : alpha(safePalette.main, 0.48)}`,\n };\n\n // Soft variant\n const softStyles = {\n color: color === 'default' ? theme.palette.text.secondary : isLight ? safePalette.dark : safePalette.light,\n backgroundColor: color === 'default' ? alpha(theme.palette.grey[500], 0.16) : alpha(safePalette.main, 0.16),\n };\n\n // Inverted variant (white background with colored text)\n const invertedStyles = {\n color: color === 'default' ? theme.palette.text.primary : safePalette.dark,\n backgroundColor: theme.palette.common.white,\n border: `1px solid ${alpha(theme.palette.grey[500], 0.16)}`,\n ...(paletteColor && {\n boxShadow: `inset 0 0 0 1px ${alpha(paletteColor.main, 0.24)}`,\n }),\n };\n\n const variantStyles = {\n filled: filledStyles,\n outlined: outlinedStyles,\n soft: softStyles,\n inverted: invertedStyles,\n };\n\n return {\n ...baseStyles,\n ...variantStyles[variant],\n };\n});\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Label - A versatile label/badge component.\n *\n * @example\n * ```tsx\n * <Label>Default</Label>\n * <Label color=\"success\">Active</Label>\n * <Label color=\"error\" variant=\"outlined\">Failed</Label>\n * <Label color=\"warning\" variant=\"soft\">Pending</Label>\n * ```\n *\n * @example\n * ```tsx\n * // With icons\n * <Label\n * color=\"success\"\n * startIcon={<CheckIcon sx={{ width: 14, height: 14 }} />}\n * >\n * Verified\n * </Label>\n * ```\n */\nexport function Label({\n children,\n color = 'default',\n variant = 'soft',\n startIcon,\n endIcon,\n sx,\n disabled,\n ref,\n ...other\n}: LabelProps) {\n const ownerState = {\n color,\n variant,\n disabled,\n };\n\n const iconStyles = {\n width: 16,\n height: 16,\n flexShrink: 0,\n '& svg, & img': { width: '100%', height: '100%' },\n };\n\n return (\n <StyledLabel ref={ref} ownerState={ownerState} sx={sx} {...other}>\n {startIcon && <Box sx={{ mr: 0.5, ...iconStyles }}>{startIcon}</Box>}\n\n {children}\n\n {endIcon && <Box sx={{ ml: 0.5, ...iconStyles }}>{endIcon}</Box>}\n </StyledLabel>\n );\n}\n\n// =============================================================================\n// PRESET LABELS\n// =============================================================================\n\n/**\n * Status label with preset colors based on common status types.\n */\nexport function StatusLabel({\n status,\n ...props\n}: Omit<LabelProps, 'color' | 'children'> & {\n status: 'active' | 'inactive' | 'pending' | 'banned' | 'rejected';\n}): ReactNode {\n const statusConfig: Record<typeof status, { color: LabelColor; label: string }> = {\n active: { color: 'success', label: 'Active' },\n inactive: { color: 'default', label: 'Inactive' },\n pending: { color: 'warning', label: 'Pending' },\n banned: { color: 'error', label: 'Banned' },\n rejected: { color: 'error', label: 'Rejected' },\n };\n\n const config = statusConfig[status];\n\n return (\n <Label color={config.color} {...props}>\n {config.label}\n </Label>\n );\n}\n\n/**\n * Boolean label that shows Yes/No or custom text.\n */\nexport function BooleanLabel({\n value,\n trueText = 'Yes',\n falseText = 'No',\n ...props\n}: Omit<LabelProps, 'color' | 'children'> & {\n value: boolean;\n trueText?: string;\n falseText?: string;\n}): ReactNode {\n return (\n <Label color={value ? 'success' : 'error'} {...props}>\n {value ? trueText : falseText}\n </Label>\n );\n}\n","/**\n * A deadline, said as the time left — and coloured by how little.\n *\n * The downstream platform keeps a deadline in twenty-one tables: a cart's\n * quote, an escrow's auto-finalisation, a dispute's response window, a pickup\n * code… and a missed one costs money. A date says when; the chip says how\n * long, in the reader's language, and turns warning, then error, as it nears.\n * The absolute moment stays one hover away, in a `<time>` element.\n *\n * @module components/deadline-chip\n */\n\n'use client';\n\nimport { useEffect, useState, type ReactNode } from 'react';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { Label, type LabelColor, type LabelVariant } from '../label/index.js';\n\nconst MINUTE = 60_000;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\n\nexport type DeadlineUrgency = 'overdue' | 'urgent' | 'soon' | 'later';\n\nexport interface DeadlineChipProps {\n /** When it is due */\n deadline: Date | string | number;\n /** BCP 47 locale for the time left and the exact date — the application's current language */\n locale?: string | undefined;\n /** Said instead of the time since, once the deadline has passed (e.g. «просрочено») */\n overdueLabel?: string | undefined;\n /** Less time than this is urgent. Default: one hour. */\n urgentWithinMs?: number | undefined;\n /** Less time than this is soon. Default: one day. */\n soonWithinMs?: number | undefined;\n /** The clock — for tests */\n now?: (() => number) | undefined;\n sx?: SxProps<Theme> | undefined;\n}\n\n/** How near a deadline is, from the time left. */\nexport function deadlineUrgency(leftMs: number, urgentWithinMs = HOUR, soonWithinMs = DAY): DeadlineUrgency {\n if (leftMs <= 0) return 'overdue';\n if (leftMs < urgentWithinMs) return 'urgent';\n if (leftMs < soonWithinMs) return 'soon';\n return 'later';\n}\n\n/** The time left (or since, when negative) in the locale's own short words: «через 2 ч», «in 2 hr». */\nexport function relativeTimeLeft(leftMs: number, locale?: string): string {\n const words = new Intl.RelativeTimeFormat(locale, { numeric: 'always', style: 'short' });\n const size = Math.abs(leftMs);\n const sign = leftMs < 0 ? -1 : 1;\n if (size < HOUR) return words.format(sign * Math.max(1, Math.round(size / MINUTE)), 'minute');\n if (size < 2 * DAY) return words.format(sign * Math.round(size / HOUR), 'hour');\n return words.format(sign * Math.round(size / DAY), 'day');\n}\n\nconst LOOK: Record<DeadlineUrgency, { color: LabelColor; variant: LabelVariant }> = {\n overdue: { color: 'error', variant: 'filled' },\n urgent: { color: 'error', variant: 'soft' },\n soon: { color: 'warning', variant: 'soft' },\n later: { color: 'default', variant: 'soft' },\n};\n\n/**\n * @example\n * ```tsx\n * <DeadlineChip deadline={dispute.responseDeadline} locale={i18n.language} overdueLabel={t('deadline.overdue')} />\n * ```\n */\nexport function DeadlineChip({\n deadline,\n locale,\n overdueLabel,\n urgentWithinMs,\n soonWithinMs,\n now = Date.now,\n sx,\n}: DeadlineChipProps): ReactNode {\n const [at, setAt] = useState(now);\n useEffect(() => {\n const tick = setInterval(() => setAt(now()), 30_000);\n return () => clearInterval(tick);\n }, [now]);\n\n const due = new Date(deadline).getTime();\n if (Number.isNaN(due)) return null;\n\n const left = due - at;\n const urgency = deadlineUrgency(left, urgentWithinMs, soonWithinMs);\n const look = LOOK[urgency];\n const text = urgency === 'overdue' && overdueLabel ? overdueLabel : relativeTimeLeft(left, locale);\n const exact = new Intl.DateTimeFormat(locale, { dateStyle: 'medium', timeStyle: 'short' }).format(due);\n\n return (\n <Label\n color={look.color}\n variant={look.variant}\n data-urgency={urgency}\n sx={[{ fontVariantNumeric: 'tabular-nums' }, ...(Array.isArray(sx) ? sx : [sx])]}\n >\n <time dateTime={new Date(due).toISOString()} title={exact}>\n {text}\n </time>\n </Label>\n );\n}\n","/**\n * A row that scrolls: items side by side, snapped, scrolled by the browser.\n *\n * For a page reached over Tor, a slider that moves its track from script is\n * script the reader downloads and frames the page spends; a row the browser\n * scrolls is neither. Touch, trackpad, wheel and keyboard work because they\n * are the browser's own. The arrows appear only where there is somewhere to\n * go, and not at all on a screen without hover.\n *\n * @module components/rail\n */\n\n'use client';\n\nimport { Children, useCallback, useEffect, useRef, useState, type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport type { ResponsiveStyleValue } from '@mui/system';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface RailProps {\n children: ReactNode;\n /** Name of the row, for assistive technology — a scrolling region needs one */\n 'aria-label': string;\n /** Width of each item. Default: most of a phone, two on a tablet, three or four on a desktop. */\n itemWidth?: ResponsiveStyleValue<string | number> | undefined;\n /** Space between items, in theme spacing units. Default 2. */\n gap?: number | undefined;\n /** The arrows' names, translated by the caller */\n labels?: { previous?: string | undefined; next?: string | undefined } | undefined;\n sx?: SxProps<Theme> | undefined;\n}\n\nconst DEFAULT_ITEM_WIDTH = { xs: '78%', sm: '46%', md: '31%', lg: '23.5%' };\n\nfunction Chevron({ direction }: { direction: 'left' | 'right' }): ReactNode {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\">\n <polyline points={direction === 'left' ? '15 6 9 12 15 18' : '9 6 15 12 9 18'} />\n </svg>\n );\n}\n\n/**\n * @example\n * ```tsx\n * <Rail aria-label={t('home.showcase.products')}>\n * {products.map((p) => <ProductCard key={p.id} product={p} />)}\n * </Rail>\n * ```\n */\nexport function Rail({\n children,\n 'aria-label': ariaLabel,\n itemWidth = DEFAULT_ITEM_WIDTH,\n gap = 2,\n labels,\n sx,\n}: RailProps): ReactNode {\n const track = useRef<HTMLUListElement>(null);\n const [reach, setReach] = useState({ back: false, forward: false });\n\n const measure = useCallback(() => {\n const el = track.current;\n if (!el) return;\n const max = el.scrollWidth - el.clientWidth;\n setReach({ back: el.scrollLeft > 1, forward: el.scrollLeft < max - 1 });\n }, []);\n\n useEffect(() => {\n measure();\n const el = track.current;\n if (!el || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [measure]);\n\n const page = (direction: 1 | -1) => {\n const el = track.current;\n if (el) el.scrollBy({ left: direction * el.clientWidth * 0.9, behavior: 'smooth' });\n };\n\n const arrow = (direction: 1 | -1, show: boolean, label: string) =>\n show ? (\n <IconButton\n size=\"small\"\n aria-label={label}\n onClick={() => page(direction)}\n sx={{\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n [direction === 1 ? 'right' : 'left']: -8,\n zIndex: 1,\n bgcolor: 'background.paper',\n boxShadow: 2,\n '&:hover': { bgcolor: 'background.paper' },\n '@media (hover: none)': { display: 'none' },\n }}\n >\n <Chevron direction={direction === 1 ? 'right' : 'left'} />\n </IconButton>\n ) : null;\n\n return (\n <Box\n component=\"section\"\n aria-label={ariaLabel}\n data-testid=\"prism-rail\"\n sx={[{ position: 'relative' }, ...(Array.isArray(sx) ? sx : [sx])]}\n >\n {arrow(-1, reach.back, labels?.previous ?? 'Previous')}\n <Box\n component=\"ul\"\n ref={track}\n tabIndex={0}\n onScroll={measure}\n sx={{\n display: 'grid',\n gridAutoFlow: 'column',\n gridAutoColumns: itemWidth,\n gap,\n m: 0,\n p: 0,\n listStyle: 'none',\n overflowX: 'auto',\n overscrollBehaviorX: 'contain',\n scrollSnapType: 'x mandatory',\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': { display: 'none' },\n '&:focus-visible': { outline: '2px solid', outlineColor: 'primary.main', outlineOffset: 2 },\n }}\n >\n {Children.map(children, (child) =>\n child == null || child === false ? null : (\n <Box component=\"li\" sx={{ scrollSnapAlign: 'start', minWidth: 0 }}>\n {child}\n </Box>\n )\n )}\n </Box>\n {arrow(1, reach.forward, labels?.next ?? 'Next')}\n </Box>\n );\n}\n","'use client';\n\n/**\n * Loading Screen Component\n *\n * Lightweight content loading indicator with centered LinearProgress.\n * Use for lazy-loaded route content within layouts.\n *\n * @module components/loading-screen\n */\n\nimport type { ReactNode } from 'react';\nimport { Fragment } from 'react';\nimport Portal from '@mui/material/Portal';\nimport { styled } from '@mui/material/styles';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport type { LinearProgressProps } from '@mui/material/LinearProgress';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface LoadingScreenProps extends React.ComponentProps<'div'> {\n /** Render in a portal */\n portal?: boolean;\n /** Additional styles */\n sx?: SxProps<Theme>;\n /** Slot overrides */\n slots?: {\n progress?: ReactNode;\n };\n /** Slot props */\n slotProps?: {\n progress?: LinearProgressProps;\n };\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst LoadingContent = styled('div')(({ theme }) => ({\n flexGrow: 1,\n width: '100%',\n display: 'flex',\n minHeight: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n paddingLeft: theme.spacing(5),\n paddingRight: theme.spacing(5),\n}));\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * LoadingScreen - Lightweight content loading indicator.\n *\n * @example\n * ```tsx\n * <Suspense fallback={<LoadingScreen />}>\n * <Outlet />\n * </Suspense>\n * ```\n */\nexport function LoadingScreen({ portal, slots, slotProps, sx, ...other }: LoadingScreenProps): ReactNode {\n const Wrapper = portal ? Portal : Fragment;\n\n return (\n <Wrapper>\n <LoadingContent sx={sx} {...other}>\n {slots?.progress ?? (\n <LinearProgress\n color=\"inherit\"\n sx={[\n { width: 1, maxWidth: 360 },\n ...(Array.isArray(slotProps?.progress?.sx) ? slotProps.progress.sx : [slotProps?.progress?.sx]),\n ]}\n {...slotProps?.progress}\n />\n )}\n </LoadingContent>\n </Wrapper>\n );\n}\n","'use client';\n\n/**\n * Splash Screen Component\n *\n * Full-screen or contained loading states with customizable indicators.\n * Use for app-level loading (initial boot, auth checks).\n *\n * @module components/loading-screen\n */\n\nimport type { ReactNode } from 'react';\nimport { Fragment } from 'react';\nimport Box from '@mui/material/Box';\nimport Portal from '@mui/material/Portal';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport Typography from '@mui/material/Typography';\nimport { styled } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface SplashScreenProps {\n /** Loading indicator variant */\n variant?: 'circular' | 'linear';\n /** Loading message */\n message?: string;\n /** Custom loading indicator */\n indicator?: ReactNode;\n /** Render in a portal (useful for overlays) */\n portal?: boolean;\n /** Size of circular indicator */\n size?: number;\n /** Progress value (0-100) for determinate mode */\n progress?: number;\n /** Full screen overlay mode */\n fullScreen?: boolean;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst SplashContainer = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'fullScreen',\n})<{ fullScreen?: boolean }>(({ theme, fullScreen }) => ({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(2),\n padding: theme.spacing(3),\n ...(fullScreen\n ? {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: theme.zIndex.modal + 1,\n backgroundColor: theme.palette.background.default,\n }\n : {\n flexGrow: 1,\n width: '100%',\n minHeight: 200,\n }),\n}));\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * SplashScreen - Full-screen or contained loading indicator.\n *\n * @example\n * ```tsx\n * // Simple splash\n * <SplashScreen />\n * ```\n *\n * @example\n * ```tsx\n * // With message\n * <SplashScreen message=\"Loading data...\" />\n * ```\n *\n * @example\n * ```tsx\n * // Determinate progress\n * <SplashScreen\n * variant=\"linear\"\n * progress={65}\n * message=\"Uploading files...\"\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Full screen overlay\n * <SplashScreen fullScreen portal />\n * ```\n */\nexport function SplashScreen({\n variant = 'circular',\n message,\n indicator,\n portal = false,\n size = 48,\n progress,\n fullScreen = false,\n sx,\n}: SplashScreenProps): ReactNode {\n const Wrapper = portal ? Portal : Fragment;\n const isDeterminate = progress !== undefined;\n\n const renderIndicator = () => {\n if (indicator) return indicator;\n\n if (variant === 'linear') {\n return (\n <LinearProgress\n variant={isDeterminate ? 'determinate' : 'indeterminate'}\n value={progress}\n color=\"primary\"\n sx={{ width: '100%', maxWidth: 360, borderRadius: 1 }}\n />\n );\n }\n\n return (\n <CircularProgress\n variant={isDeterminate ? 'determinate' : 'indeterminate'}\n value={progress}\n size={size}\n thickness={3}\n color=\"primary\"\n />\n );\n };\n\n return (\n <Wrapper>\n <SplashContainer fullScreen={fullScreen} sx={sx}>\n {renderIndicator()}\n\n {message && (\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.secondary\",\n mt: 1,\n textAlign: 'center'\n }}>\n {message}\n </Typography>\n )}\n\n {isDeterminate && (\n <Typography variant=\"caption\" sx={{\n color: \"text.disabled\"\n }}>\n {Math.round(progress)}%\n </Typography>\n )}\n </SplashContainer>\n </Wrapper>\n );\n}\n\n// =============================================================================\n// SPINNER COMPONENT\n// =============================================================================\n\nexport interface SpinnerProps {\n /** Size of the spinner */\n size?: 'small' | 'medium' | 'large' | number;\n /** Color */\n color?: 'primary' | 'secondary' | 'inherit';\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\nconst sizeMap = {\n small: 20,\n medium: 32,\n large: 48,\n};\n\n/**\n * Spinner - Simple spinning indicator.\n *\n * @example\n * ```tsx\n * <Button disabled={loading}>\n * {loading ? <Spinner size=\"small\" /> : 'Submit'}\n * </Button>\n * ```\n */\nexport function Spinner({ size = 'medium', color = 'primary', sx }: SpinnerProps): ReactNode {\n const computedSize = typeof size === 'number' ? size : sizeMap[size];\n\n return <CircularProgress size={computedSize} color={color} thickness={3.5} sx={sx} />;\n}\n","'use client';\n\n/**\n * Tag Cloud — visualises a list of tags as either a sized chip cloud\n * (font-size proportional to popularity) or a vertical list with\n * count + description.\n *\n * Generic over `T extends TagCloudItem` so callers pass their domain\n * tag DTOs directly without mapping. Renders no domain assumptions;\n * navigation is delegated via `onTagClick`, which is the consumer's\n * job (react-router, next/link, etc.).\n *\n * Accessibility:\n * - List variant: each item is a button (MUI ListItemButton) with\n * aria-label that spells out the popularity rather than relying\n * on the visible count alone (\"4 posts\" not just \"4\").\n * - Cloud variant: chips carry an aria-label that names both the\n * tag and the relative weight, so screen readers don't see only\n * a font-size signal.\n * - Optional `trending` flag highlights a tag visually AND\n * semantically (aria-label suffix).\n *\n * @module components/tag-cloud\n */\n\nimport type { ReactNode } from 'react';\nimport Chip from '@mui/material/Chip';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemText from '@mui/material/ListItemText';\nimport Box from '@mui/material/Box';\nimport { alpha, useTheme } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface TagCloudItem {\n id: string;\n name: string;\n slug: string;\n postCount: number;\n description?: string | null;\n /** Optional badge — drives the trending highlight. */\n trending?: boolean;\n /** Optional moderation status — 'featured' adds a subtle accent. */\n status?: string;\n}\n\nexport interface TagCloudProps<T extends TagCloudItem = TagCloudItem> {\n tags: T[];\n variant?: 'cloud' | 'list';\n /** Called on activation. The consumer routes to the tag page. */\n onTagClick?: (tag: T) => void;\n /** Truncate to first N items. */\n maxItems?: number;\n /**\n * Render the right-hand stat of a list-variant row. Defaults to\n * the formatted postCount; override for custom signals\n * (e.g. follower count, freshness).\n */\n renderStat?: (tag: T) => ReactNode;\n /**\n * Optional adornment shown after the tag name on cloud variant.\n * Used to slot in a 🔥 / ⭐ icon component without bloating this\n * file with icon assets.\n */\n renderAdornment?: (tag: T) => ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/** Map a postCount to a font-size multiplier (0.75rem – 1.5rem). */\nfunction computeSize(count: number, min: number, max: number): number {\n if (max === min) return 1;\n const t = (count - min) / (max - min);\n return 0.75 + t * 0.75;\n}\n\nfunction formatShort(n: number): string {\n if (n < 1_000) return String(n);\n if (n < 1_000_000) return `${(n / 1_000).toFixed(1).replace(/\\.0$/, '')}K`;\n return `${(n / 1_000_000).toFixed(1).replace(/\\.0$/, '')}M`;\n}\n\nexport function TagCloud<T extends TagCloudItem = TagCloudItem>({\n tags,\n variant = 'cloud',\n onTagClick,\n maxItems,\n renderStat,\n renderAdornment,\n sx,\n}: TagCloudProps<T>): ReactNode {\n const theme = useTheme();\n const visible = maxItems ? tags.slice(0, maxItems) : tags;\n\n // --- List variant -----------------------------------------------------\n if (variant === 'list') {\n return (\n <List disablePadding sx={sx}>\n {visible.map((tag) => (\n <ListItemButton\n key={tag.id}\n onClick={onTagClick ? () => onTagClick(tag) : undefined}\n aria-label={`Tag ${tag.name}, ${tag.postCount} posts${tag.trending ? ', trending' : ''}`}\n sx={{\n borderRadius: 1,\n px: 1.5,\n py: 0.75,\n '&:hover': { bgcolor: alpha(theme.palette.primary.main, 0.08) },\n }}\n >\n <ListItemText\n primary={\n <Box component=\"span\" sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n <span>{`#${tag.name}`}</span>\n {tag.trending && (\n <Box\n component=\"span\"\n sx={{\n ml: 0.5,\n px: 0.75,\n py: 0.125,\n fontSize: 10,\n lineHeight: 1.4,\n fontWeight: 700,\n borderRadius: 0.75,\n color: theme.palette.warning.contrastText,\n bgcolor: theme.palette.warning.main,\n }}\n >\n TRENDING\n </Box>\n )}\n {renderAdornment?.(tag)}\n </Box>\n }\n secondary={tag.description}\n slotProps={{\n primary: { variant: 'body2', sx: { fontWeight: 500 } },\n\n secondary: {\n variant: 'caption',\n noWrap: true,\n sx: { mt: 0.25 },\n }\n }} />\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.disabled\",\n ml: 1,\n flexShrink: 0\n }}>\n {renderStat ? renderStat(tag) : formatShort(tag.postCount)}\n </Typography>\n </ListItemButton>\n ))}\n </List>\n );\n }\n\n // --- Cloud variant ---------------------------------------------------\n const counts = visible.map((t) => t.postCount);\n const min = counts.length > 0 ? Math.min(...counts) : 0;\n const max = counts.length > 0 ? Math.max(...counts) : 0;\n\n return (\n <Stack\n direction=\"row\"\n useFlexGap\n sx={[{\n flexWrap: \"wrap\",\n gap: 1,\n alignItems: \"center\"\n }, ...(Array.isArray(sx) ? sx : [sx])]}>\n {visible.map((tag) => {\n const size = computeSize(tag.postCount, min, max);\n const isFeatured = tag.status === 'featured';\n return (\n <Chip\n key={tag.id}\n label={\n <Box component=\"span\" sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n <span>{`#${tag.name}`}</span>\n {renderAdornment?.(tag)}\n </Box>\n }\n variant={tag.trending || isFeatured ? 'filled' : 'outlined'}\n color={tag.trending ? 'warning' : isFeatured ? 'primary' : 'default'}\n onClick={onTagClick ? () => onTagClick(tag) : undefined}\n aria-label={`Tag ${tag.name}, ${tag.postCount} posts${tag.trending ? ', trending' : ''}${isFeatured ? ', featured' : ''}`}\n sx={{\n height: 'auto',\n fontSize: `${size}rem`,\n fontWeight: 500,\n borderRadius: 1.5,\n cursor: onTagClick ? 'pointer' : 'default',\n transition: 'all 0.15s',\n '& .MuiChip-label': { px: 1.25, py: 0.5 },\n '&:hover': onTagClick\n ? {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: 'primary.main',\n color: 'primary.main',\n }\n : undefined,\n }}\n />\n );\n })}\n </Stack>\n );\n}\n","'use client';\n\n/**\n * Scrollbar Component\n *\n * Custom scrollbar wrapper with themed styling.\n *\n * @module components/scrollbar\n */\n\nimport type { ReactNode, Ref } from 'react';\nimport Box from '@mui/material/Box';\nimport { styled, alpha } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ScrollbarProps {\n /** Content to scroll */\n children?: ReactNode;\n /** Additional styles */\n sx?: SxProps<Theme>;\n /** Fill available content space */\n fillContent?: boolean;\n /** Hide scrollbar (content still scrollable) */\n hideScrollbar?: boolean;\n /** Scrollbar axis */\n axis?: 'x' | 'y' | 'both';\n /** Max height constraint */\n maxHeight?: number | string;\n /** Min height constraint */\n minHeight?: number | string;\n /** Additional class name */\n className?: string;\n /** Scroll event handler */\n onScroll?: React.UIEventHandler<HTMLDivElement>;\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\ninterface ScrollbarRootProps {\n ownerState: {\n fillContent: boolean;\n hideScrollbar: boolean;\n axis: 'x' | 'y' | 'both';\n };\n}\n\nconst ScrollbarRoot = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<ScrollbarRootProps>(({ theme, ownerState }) => {\n const { fillContent, hideScrollbar, axis } = ownerState;\n\n const scrollbarColor = alpha(theme.palette.text.disabled, 0.4);\n const scrollbarHoverColor = alpha(theme.palette.text.disabled, 0.6);\n const scrollbarTrackColor = alpha(theme.palette.grey[500], 0.08);\n\n const getOverflow = () => {\n if (axis === 'x') return { overflowX: 'auto', overflowY: 'hidden' } as const;\n if (axis === 'y') return { overflowX: 'hidden', overflowY: 'auto' } as const;\n return { overflow: 'auto' } as const;\n };\n\n return {\n minWidth: 0,\n minHeight: 0,\n ...getOverflow(),\n ...(fillContent && {\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n }),\n // Custom scrollbar styles\n ...(!hideScrollbar && {\n scrollbarWidth: 'thin',\n scrollbarColor: `${scrollbarColor} ${scrollbarTrackColor}`,\n // Webkit browsers\n '&::-webkit-scrollbar': {\n width: 8,\n height: 8,\n },\n '&::-webkit-scrollbar-track': {\n backgroundColor: scrollbarTrackColor,\n borderRadius: 4,\n },\n '&::-webkit-scrollbar-thumb': {\n backgroundColor: scrollbarColor,\n borderRadius: 4,\n '&:hover': {\n backgroundColor: scrollbarHoverColor,\n },\n },\n '&::-webkit-scrollbar-corner': {\n backgroundColor: 'transparent',\n },\n }),\n ...(hideScrollbar && {\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n }),\n };\n});\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Scrollbar - Custom scrollbar wrapper with themed styling.\n *\n * @example\n * ```tsx\n * <Scrollbar maxHeight={400}>\n * <List>...</List>\n * </Scrollbar>\n * ```\n *\n * @example\n * ```tsx\n * // Horizontal scrollbar\n * <Scrollbar axis=\"x\">\n * <Stack direction=\"row\" spacing={2}>...</Stack>\n * </Scrollbar>\n * ```\n *\n * @example\n * ```tsx\n * // Fill available space\n * <Scrollbar fillContent>\n * {content}\n * </Scrollbar>\n * ```\n */\nexport function Scrollbar({children, sx, fillContent = false, hideScrollbar = false, axis = 'y', maxHeight, minHeight, className, ref, ...other }: ScrollbarProps & { ref?: Ref<HTMLDivElement> }) {\n const ownerState = {\n fillContent,\n hideScrollbar,\n axis,\n };\n\n return (\n <ScrollbarRoot\n ref={ref}\n ownerState={ownerState}\n className={className}\n sx={[\n {\n ...(maxHeight !== undefined && { maxHeight }),\n ...(minHeight !== undefined && { minHeight }),\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n >\n {children}\n </ScrollbarRoot>\n );\n}\n","'use client';\n\n/**\n * Snackbar Component\n *\n * Enhanced snackbar with context-based API for easy notifications.\n *\n * @module components/snackbar\n */\n\nimport type { ReactNode } from 'react';\nimport { createContext, useContext, useState, useCallback, useMemo } from 'react';\nimport Snackbar from '@mui/material/Snackbar';\nimport Alert from '@mui/material/Alert';\nimport IconButton from '@mui/material/IconButton';\nimport CloseIcon from '@mui/icons-material/Close';\nimport type { AlertColor } from '@mui/material/Alert';\nimport type { SnackbarOrigin } from '@mui/material/Snackbar';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface SnackbarOptions {\n /** Message to display */\n message: string;\n /** Severity/type of the snackbar */\n severity?: AlertColor;\n /** Auto-hide duration in milliseconds */\n duration?: number;\n /** Position on screen */\n position?: SnackbarOrigin;\n /** Action button */\n action?: ReactNode;\n /** Unique key for the snackbar */\n key?: string | number;\n}\n\nexport interface SnackbarContextValue {\n /** Show a snackbar notification */\n show: (options: SnackbarOptions | string) => void;\n /** Show a success notification */\n success: (message: string, options?: Partial<SnackbarOptions>) => void;\n /** Show an error notification */\n error: (message: string, options?: Partial<SnackbarOptions>) => void;\n /** Show a warning notification */\n warning: (message: string, options?: Partial<SnackbarOptions>) => void;\n /** Show an info notification */\n info: (message: string, options?: Partial<SnackbarOptions>) => void;\n /** Close the current snackbar */\n close: () => void;\n}\n\nexport interface SnackbarProviderProps {\n /** Children to wrap */\n children: ReactNode;\n /** Default auto-hide duration */\n defaultDuration?: number;\n /** Default position */\n defaultPosition?: SnackbarOrigin;\n /** Maximum number of snackbars to show */\n maxSnackbars?: number;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst SnackbarContext = createContext<SnackbarContextValue | null>(null);\n\n// =============================================================================\n// HOOK\n// =============================================================================\n\n/**\n * useSnackbar - Hook for showing snackbar notifications.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const snackbar = useSnackbar();\n *\n * const handleSave = async () => {\n * try {\n * await saveData();\n * snackbar.success('Data saved successfully!');\n * } catch (err) {\n * snackbar.error('Failed to save data');\n * }\n * };\n * }\n * ```\n */\nexport function useSnackbar(): SnackbarContextValue {\n const context = useContext(SnackbarContext);\n\n if (!context) {\n throw new Error('useSnackbar must be used within a SnackbarProvider');\n }\n\n return context;\n}\n\n// =============================================================================\n// PROVIDER\n// =============================================================================\n\ninterface SnackbarState {\n open: boolean;\n message: string;\n severity: AlertColor;\n duration: number;\n position: SnackbarOrigin;\n action?: ReactNode;\n key: string | number;\n}\n\nconst defaultState: SnackbarState = {\n open: false,\n message: '',\n severity: 'info',\n duration: 5000,\n position: { vertical: 'bottom', horizontal: 'left' },\n key: 0,\n};\n\n/**\n * SnackbarProvider - Provider for snackbar notifications.\n *\n * @example\n * ```tsx\n * // Wrap your app with the provider\n * function App() {\n * return (\n * <SnackbarProvider>\n * <MyApp />\n * </SnackbarProvider>\n * );\n * }\n * ```\n */\nexport function SnackbarProvider({\n children,\n defaultDuration = 5000,\n defaultPosition = { vertical: 'bottom', horizontal: 'left' },\n sx,\n}: SnackbarProviderProps): ReactNode {\n const [state, setState] = useState<SnackbarState>({\n ...defaultState,\n duration: defaultDuration,\n position: defaultPosition,\n });\n\n const show = useCallback(\n (options: SnackbarOptions | string) => {\n const opts = typeof options === 'string' ? { message: options } : options;\n\n setState((prev) => ({\n open: true,\n message: opts.message,\n severity: opts.severity ?? 'info',\n duration: opts.duration ?? defaultDuration,\n position: opts.position ?? defaultPosition,\n action: opts.action,\n key: opts.key ?? Date.now(),\n }));\n },\n [defaultDuration, defaultPosition]\n );\n\n const success = useCallback(\n (message: string, options?: Partial<SnackbarOptions>) => {\n show({ message, severity: 'success', ...options });\n },\n [show]\n );\n\n const error = useCallback(\n (message: string, options?: Partial<SnackbarOptions>) => {\n show({ message, severity: 'error', ...options });\n },\n [show]\n );\n\n const warning = useCallback(\n (message: string, options?: Partial<SnackbarOptions>) => {\n show({ message, severity: 'warning', ...options });\n },\n [show]\n );\n\n const info = useCallback(\n (message: string, options?: Partial<SnackbarOptions>) => {\n show({ message, severity: 'info', ...options });\n },\n [show]\n );\n\n const close = useCallback(() => {\n setState((prev) => ({ ...prev, open: false }));\n }, []);\n\n const handleClose = useCallback(\n (_event?: React.SyntheticEvent | Event, reason?: string) => {\n if (reason === 'clickaway') return;\n close();\n },\n [close]\n );\n\n const value = useMemo<SnackbarContextValue>(\n () => ({\n show,\n success,\n error,\n warning,\n info,\n close,\n }),\n [show, success, error, warning, info, close]\n );\n\n return (\n <SnackbarContext.Provider value={value}>\n {children}\n\n <Snackbar\n key={state.key}\n open={state.open}\n autoHideDuration={state.duration}\n onClose={handleClose}\n anchorOrigin={state.position}\n sx={sx}\n >\n <Alert\n severity={state.severity}\n variant=\"filled\"\n onClose={handleClose}\n action={\n state.action || (\n <IconButton size=\"small\" aria-label=\"close\" color=\"inherit\" onClick={close}>\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n )\n }\n sx={{ width: '100%', alignItems: 'center' }}\n >\n {state.message}\n </Alert>\n </Snackbar>\n </SnackbarContext.Provider>\n );\n}\n\n// =============================================================================\n// STANDALONE SNACKBAR\n// =============================================================================\n\nexport interface SimpleSnackbarProps {\n /** Whether the snackbar is open */\n open: boolean;\n /** Close handler */\n onClose: () => void;\n /** Message to display */\n message: string;\n /** Severity/type */\n severity?: AlertColor;\n /** Auto-hide duration in milliseconds */\n duration?: number;\n /** Position on screen */\n position?: SnackbarOrigin;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n/**\n * SimpleSnackbar - Standalone snackbar component (without context).\n *\n * @example\n * ```tsx\n * const [open, setOpen] = useState(false);\n *\n * <SimpleSnackbar\n * open={open}\n * onClose={() => setOpen(false)}\n * message=\"Changes saved!\"\n * severity=\"success\"\n * />\n * ```\n */\nexport function SimpleSnackbar({\n open,\n onClose,\n message,\n severity = 'info',\n duration = 5000,\n position = { vertical: 'bottom', horizontal: 'left' },\n sx,\n}: SimpleSnackbarProps): ReactNode {\n const handleClose = (_event?: React.SyntheticEvent | Event, reason?: string) => {\n if (reason === 'clickaway') return;\n onClose();\n };\n\n return (\n <Snackbar open={open} autoHideDuration={duration} onClose={handleClose} anchorOrigin={position} sx={sx}>\n <Alert severity={severity} variant=\"filled\" onClose={handleClose} sx={{ width: '100%' }}>\n {message}\n </Alert>\n </Snackbar>\n );\n}\n","'use client';\n\n/**\n * SvgColor Component\n *\n * Colorable SVG icon component using CSS mask.\n *\n * @module components/svg-color\n */\n\nimport type { ReactNode, Ref } from 'react';\nimport { styled } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface SvgColorProps {\n /** SVG file URL */\n src: string;\n /** Color (uses currentColor by default, inheriting from parent) */\n color?: string;\n /** Width and height */\n size?: number | string;\n /** Width */\n width?: number | string;\n /** Height */\n height?: number | string;\n /** Additional class name */\n className?: string;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\nconst SvgRoot = styled('span')(() => ({\n flexShrink: 0,\n display: 'inline-flex',\n backgroundColor: 'currentColor',\n}));\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * SvgColor - Colorable SVG component.\n *\n * This component uses CSS mask to allow SVG icons to inherit text color.\n * The SVG file is loaded via URL and can be colored using the color prop\n * or by inheriting from parent's color/text color.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <SvgColor src=\"/icons/check.svg\" />\n * ```\n *\n * @example\n * ```tsx\n * // With custom color\n * <SvgColor\n * src=\"/icons/star.svg\"\n * color=\"primary.main\"\n * size={32}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Inherit color from parent\n * <Box color=\"error.main\">\n * <SvgColor src=\"/icons/alert.svg\" />\n * Error message\n * </Box>\n * ```\n */\nexport function SvgColor({src, color, size = 24, width, height, className, sx, ref }: SvgColorProps & { ref?: Ref<HTMLSpanElement> }) {\n const computedWidth = width ?? size;\n const computedHeight = height ?? size;\n\n return (\n <SvgRoot\n ref={ref}\n className={className}\n sx={[\n {\n width: computedWidth,\n height: computedHeight,\n mask: `url(${src}) no-repeat center / contain`,\n WebkitMask: `url(${src}) no-repeat center / contain`,\n ...(color && { color }),\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n />\n );\n}\n\n// =============================================================================\n// ICON SET COMPONENT\n// =============================================================================\n\nexport interface IconProps extends Omit<SvgColorProps, 'src'> {\n /** Icon name (without extension) */\n name: string;\n /** Base path for icons */\n basePath?: string;\n}\n\n/**\n * Creates an Icon component factory with a custom base path.\n *\n * @example\n * ```tsx\n * // Create icon component\n * const Icon = createIconComponent('/assets/icons');\n *\n * // Use it\n * <Icon name=\"home\" size={24} />\n * ```\n */\nexport function createIconComponent(basePath: string) {\n function Icon({ name, ...props }: IconProps): ReactNode {\n return <SvgColor src={`${basePath}/${name}.svg`} {...props} />;\n }\n return Icon;\n}\n","'use client';\n\n/**\n * Table Component\n *\n * Enhanced table component with sorting, selection, and pagination.\n *\n * @module components/table\n */\n\nimport type { ReactNode, ChangeEvent, Ref } from 'react';\nimport { useCallback, useState, useMemo } from 'react';\nimport MuiTable from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableSortLabel from '@mui/material/TableSortLabel';\nimport TablePagination from '@mui/material/TablePagination';\nimport Checkbox from '@mui/material/Checkbox';\nimport Skeleton from '@mui/material/Skeleton';\nimport Paper from '@mui/material/Paper';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { styled, alpha } from '@mui/material/styles';\nimport type { TableProps as MuiTableProps } from '@mui/material/Table';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type SortOrder = 'asc' | 'desc';\n\nexport interface TableColumn<T> {\n /** Unique column identifier */\n id: keyof T | string;\n /** Column header label */\n label: string;\n /** Column width */\n width?: number | string;\n /** Minimum width */\n minWidth?: number;\n /** Alignment */\n align?: 'left' | 'center' | 'right';\n /** Whether column is sortable */\n sortable?: boolean;\n /** Custom render function */\n render?: (row: T, index: number) => ReactNode;\n /** Format value for display */\n format?: (value: unknown) => string;\n}\n\nexport interface TableProps<T> extends Omit<MuiTableProps, 'children'> {\n /** Table columns configuration */\n columns: TableColumn<T>[];\n /** Data rows */\n data: T[];\n /** Row key accessor */\n rowKey?: keyof T | ((row: T) => string | number);\n /** Enable row selection */\n selectable?: boolean;\n /** Selected row keys */\n selected?: (string | number)[];\n /** Selection change handler */\n onSelectChange?: (selected: (string | number)[]) => void;\n /** Enable sorting */\n sortable?: boolean;\n /** Current sort column */\n sortBy?: string;\n /** Current sort order */\n sortOrder?: SortOrder;\n /** Sort change handler */\n onSortChange?: (column: string, order: SortOrder) => void;\n /** Enable pagination */\n paginated?: boolean;\n /** Current page (0-indexed) */\n page?: number;\n /** Rows per page */\n rowsPerPage?: number;\n /** Total row count (for server-side pagination) */\n totalRows?: number;\n /** Page change handler */\n onPageChange?: (page: number) => void;\n /** Rows per page change handler */\n onRowsPerPageChange?: (rowsPerPage: number) => void;\n /** Rows per page options */\n rowsPerPageOptions?: number[];\n /** Empty state content */\n emptyContent?: ReactNode;\n /**\n * Loading state. Renders placeholder rows in the body and suppresses the\n * empty state, so the header and column widths stay put while data arrives.\n */\n loading?: boolean;\n /** Placeholder rows drawn while `loading`. */\n loadingRows?: number;\n /** Dense padding */\n dense?: boolean;\n /** Sticky header */\n stickyHeader?: boolean;\n /** Container max height */\n maxHeight?: number | string;\n /** Row click handler */\n onRowClick?: (row: T, index: number) => void;\n /** Container styles */\n containerSx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst StyledTableContainer = styled(Paper)(({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n border: `1px solid ${theme.palette.divider}`,\n overflow: 'auto',\n}));\n\nconst StyledTableHead = styled(TableHead)(({ theme }) => ({\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n '& .MuiTableCell-head': {\n fontWeight: 600,\n backgroundColor: 'transparent',\n },\n}));\n\nconst StyledTableRow = styled(TableRow)(({ theme }) => ({\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.04),\n },\n '&.Mui-selected': {\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.12),\n },\n },\n}));\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Table - Enhanced data table with sorting, selection, and pagination.\n *\n * @example\n * ```tsx\n * const columns: TableColumn<User>[] = [\n * { id: 'name', label: 'Name', sortable: true },\n * { id: 'email', label: 'Email' },\n * { id: 'status', label: 'Status', render: (row) => <Label>{row.status}</Label> },\n * ];\n *\n * <Table\n * columns={columns}\n * data={users}\n * rowKey=\"id\"\n * selectable\n * paginated\n * />\n * ```\n */\n// React 19 forwards `ref` through props, so a generic component\n// no longer needs the `forwardRef(...) as <T>(...)` cast workaround\n// that earlier React versions required to preserve `T`. We declare\n// `ref` on the props (typed against the rendered MUI Table element)\n// and call it a day.\nexport function Table<T>({\n columns,\n data,\n rowKey = 'id' as keyof T,\n selectable = false,\n selected = [],\n onSelectChange,\n sortable = false,\n sortBy,\n sortOrder = 'asc',\n onSortChange,\n paginated = false,\n page = 0,\n rowsPerPage = 10,\n totalRows,\n onPageChange,\n onRowsPerPageChange,\n rowsPerPageOptions = [5, 10, 25, 50],\n emptyContent,\n loading = false,\n loadingRows = 5,\n dense = false,\n stickyHeader = false,\n maxHeight,\n onRowClick,\n containerSx,\n sx,\n ref,\n ...other\n }: TableProps<T> & { ref?: Ref<HTMLTableElement> }): ReactNode {\n // Get row key\n const getRowKey = useCallback(\n (row: T, index: number): string | number => {\n if (typeof rowKey === 'function') {\n return rowKey(row);\n }\n const keyValue = row[rowKey as keyof T];\n return keyValue !== undefined ? String(keyValue) : index;\n },\n [rowKey]\n );\n\n // Selection handlers\n const isAllSelected = useMemo(\n () => data.length > 0 && selected.length === data.length,\n [data.length, selected.length]\n );\n\n const isIndeterminate = useMemo(\n () => selected.length > 0 && selected.length < data.length,\n [data.length, selected.length]\n );\n\n const handleSelectAll = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.checked) {\n const allKeys = data.map((row, index) => getRowKey(row, index));\n onSelectChange?.(allKeys);\n } else {\n onSelectChange?.([]);\n }\n },\n [data, getRowKey, onSelectChange]\n );\n\n const handleSelectRow = useCallback(\n (key: string | number) => {\n const newSelected = selected.includes(key) ? selected.filter((k) => k !== key) : [...selected, key];\n onSelectChange?.(newSelected);\n },\n [selected, onSelectChange]\n );\n\n // Sort handler\n const handleSort = useCallback(\n (columnId: string) => {\n const isAsc = sortBy === columnId && sortOrder === 'asc';\n onSortChange?.(columnId, isAsc ? 'desc' : 'asc');\n },\n [sortBy, sortOrder, onSortChange]\n );\n\n // Pagination handlers\n const handlePageChange = useCallback(\n (_: unknown, newPage: number) => {\n onPageChange?.(newPage);\n },\n [onPageChange]\n );\n\n const handleRowsPerPageChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n onRowsPerPageChange?.(parseInt(event.target.value, 10));\n onPageChange?.(0);\n },\n [onRowsPerPageChange, onPageChange]\n );\n\n // Calculate total rows\n const total = totalRows ?? data.length;\n\n // Slice data for client-side pagination\n const displayData = useMemo(() => {\n if (paginated && !totalRows) {\n return data.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage);\n }\n return data;\n }, [data, paginated, page, rowsPerPage, totalRows]);\n\n // Empty state\n if (!loading && data.length === 0) {\n return (\n <StyledTableContainer sx={containerSx}>\n <Box sx={{ p: 4, textAlign: 'center' }}>\n {emptyContent || <Typography sx={{\n color: \"text.secondary\"\n }}>No data available</Typography>}\n </Box>\n </StyledTableContainer>\n );\n }\n\n return (\n <StyledTableContainer\n sx={{\n maxHeight,\n ...containerSx,\n }}\n >\n <MuiTable ref={ref} stickyHeader={stickyHeader} size={dense ? 'small' : 'medium'} sx={sx} {...other}>\n <StyledTableHead>\n <TableRow>\n {selectable && (\n <TableCell padding=\"checkbox\">\n <Checkbox indeterminate={isIndeterminate} checked={isAllSelected} onChange={handleSelectAll} />\n </TableCell>\n )}\n {columns.map((column) => (\n <TableCell\n key={String(column.id)}\n align={column.align || 'left'}\n style={{ width: column.width, minWidth: column.minWidth }}\n sortDirection={sortBy === column.id ? sortOrder : false}\n >\n {sortable && column.sortable !== false ? (\n <TableSortLabel\n active={sortBy === column.id}\n direction={sortBy === column.id ? sortOrder : 'asc'}\n onClick={() => handleSort(String(column.id))}\n >\n {column.label}\n </TableSortLabel>\n ) : (\n column.label\n )}\n </TableCell>\n ))}\n </TableRow>\n </StyledTableHead>\n\n <TableBody>\n {/*\n `loading` used to do one thing — suppress the empty state — which\n left every consumer to hand-roll its own skeleton rows, or to show\n a bare header and call it a loading state. Draw them here, inside\n the real table, so the columns do not jump when the data lands.\n */}\n {loading &&\n Array.from({ length: Math.max(1, loadingRows) }, (_, rowIndex) => (\n <TableRow key={`loading-${rowIndex}`}>\n {selectable && (\n <TableCell padding=\"checkbox\">\n <Skeleton variant=\"rectangular\" width={18} height={18} />\n </TableCell>\n )}\n {columns.map((column) => (\n <TableCell key={String(column.id)} align={column.align || 'left'}>\n <Skeleton variant=\"text\" width={column.width ?? '80%'} />\n </TableCell>\n ))}\n </TableRow>\n ))}\n {!loading &&\n displayData.map((row, index) => {\n const key = getRowKey(row, index);\n const isSelected = selected.includes(key);\n\n return (\n <StyledTableRow\n key={key}\n hover\n selected={isSelected}\n onClick={() => onRowClick?.(row, index)}\n sx={{ cursor: onRowClick ? 'pointer' : 'default' }}\n >\n {selectable && (\n <TableCell padding=\"checkbox\">\n <Checkbox\n checked={isSelected}\n onClick={(e) => e.stopPropagation()}\n onChange={() => handleSelectRow(key)}\n />\n </TableCell>\n )}\n {columns.map((column) => {\n const value = row[column.id as keyof T];\n\n return (\n <TableCell key={String(column.id)} align={column.align || 'left'}>\n {column.render\n ? column.render(row, index)\n : column.format\n ? column.format(value)\n : String(value ?? '')}\n </TableCell>\n );\n })}\n </StyledTableRow>\n );\n })}\n </TableBody>\n </MuiTable>\n\n {paginated && (\n <TablePagination\n component=\"div\"\n count={total}\n page={page}\n rowsPerPage={rowsPerPage}\n rowsPerPageOptions={rowsPerPageOptions}\n onPageChange={handlePageChange}\n onRowsPerPageChange={handleRowsPerPageChange}\n />\n )}\n </StyledTableContainer>\n );\n}\n\n\n// =============================================================================\n// USE TABLE HOOK\n// =============================================================================\n\nexport interface UseTableOptions<T> {\n /** Initial data */\n data: T[];\n /** Row key accessor */\n rowKey?: keyof T | ((row: T) => string | number);\n /** Default page */\n defaultPage?: number;\n /** Default rows per page */\n defaultRowsPerPage?: number;\n /** Default sort column */\n defaultSortBy?: string;\n /** Default sort order */\n defaultSortOrder?: SortOrder;\n}\n\nexport interface UseTableReturn<T> {\n /** Current page */\n page: number;\n /** Set page */\n setPage: (page: number) => void;\n /** Rows per page */\n rowsPerPage: number;\n /** Set rows per page */\n setRowsPerPage: (rowsPerPage: number) => void;\n /** Sort column */\n sortBy: string | undefined;\n /** Sort order */\n sortOrder: SortOrder;\n /** Sort handler */\n handleSort: (column: string, order: SortOrder) => void;\n /** Selected keys */\n selected: (string | number)[];\n /** Set selected */\n setSelected: (selected: (string | number)[]) => void;\n /** Sorted and paginated data */\n displayData: T[];\n /** Total row count */\n totalRows: number;\n /** Reset all state */\n reset: () => void;\n}\n\n/**\n * useTable - Hook for managing table state.\n *\n * @example\n * ```tsx\n * function UserTable() {\n * const table = useTable({\n * data: users,\n * rowKey: 'id',\n * defaultSortBy: 'name',\n * });\n *\n * return (\n * <Table\n * columns={columns}\n * data={table.displayData}\n * rowKey=\"id\"\n * selectable\n * selected={table.selected}\n * onSelectChange={table.setSelected}\n * sortable\n * sortBy={table.sortBy}\n * sortOrder={table.sortOrder}\n * onSortChange={table.handleSort}\n * paginated\n * page={table.page}\n * rowsPerPage={table.rowsPerPage}\n * totalRows={table.totalRows}\n * onPageChange={table.setPage}\n * onRowsPerPageChange={table.setRowsPerPage}\n * />\n * );\n * }\n * ```\n */\nexport function useTable<T>({\n data,\n defaultPage = 0,\n defaultRowsPerPage = 10,\n defaultSortBy,\n defaultSortOrder = 'asc',\n}: UseTableOptions<T>): UseTableReturn<T> {\n const [page, setPage] = useState(defaultPage);\n const [rowsPerPage, setRowsPerPage] = useState(defaultRowsPerPage);\n const [sortBy, setSortBy] = useState<string | undefined>(defaultSortBy);\n const [sortOrder, setSortOrder] = useState<SortOrder>(defaultSortOrder);\n const [selected, setSelected] = useState<(string | number)[]>([]);\n\n const handleSort = useCallback((column: string, order: SortOrder) => {\n setSortBy(column);\n setSortOrder(order);\n }, []);\n\n // Sort data\n const sortedData = useMemo(() => {\n if (!sortBy) return data;\n\n return [...data].sort((a, b) => {\n const aValue = a[sortBy as keyof T];\n const bValue = b[sortBy as keyof T];\n\n if (aValue === bValue) return 0;\n if (aValue === null || aValue === undefined) return 1;\n if (bValue === null || bValue === undefined) return -1;\n\n const comparison = aValue < bValue ? -1 : 1;\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n }, [data, sortBy, sortOrder]);\n\n // Paginate data\n const displayData = useMemo(() => {\n const start = page * rowsPerPage;\n return sortedData.slice(start, start + rowsPerPage);\n }, [sortedData, page, rowsPerPage]);\n\n const reset = useCallback(() => {\n setPage(defaultPage);\n setRowsPerPage(defaultRowsPerPage);\n setSortBy(defaultSortBy);\n setSortOrder(defaultSortOrder);\n setSelected([]);\n }, [defaultPage, defaultRowsPerPage, defaultSortBy, defaultSortOrder]);\n\n return {\n page,\n setPage,\n rowsPerPage,\n setRowsPerPage,\n sortBy,\n sortOrder,\n handleSort,\n selected,\n setSelected,\n displayData,\n totalRows: data.length,\n reset,\n };\n}\n","'use client';\n\n/**\n * Skeleton Component\n *\n * Loading placeholder with multiple variants.\n *\n * @module components/skeleton\n */\n\nimport type { ReactNode, ComponentProps } from 'react';\nimport MuiSkeleton from '@mui/material/Skeleton';\nimport Box from '@mui/material/Box';\n\n/**\n * Skeleton variant types.\n */\nexport type SkeletonVariant = 'text' | 'circular' | 'rectangular' | 'rounded';\n\n/**\n * Props for Skeleton component.\n */\nexport interface SkeletonProps extends ComponentProps<typeof MuiSkeleton> {\n /** Skeleton variant */\n variant?: SkeletonVariant;\n}\n\n/**\n * Skeleton - Loading placeholder component.\n *\n * @example\n * ```tsx\n * // Text skeleton\n * <Skeleton variant=\"text\" width={200} />\n *\n * // Circular skeleton (avatar placeholder)\n * <Skeleton variant=\"circular\" width={40} height={40} />\n *\n * // Rectangular skeleton (image placeholder)\n * <Skeleton variant=\"rectangular\" width={210} height={118} />\n * ```\n */\nexport function Skeleton({ variant = 'text', ...props }: SkeletonProps): ReactNode {\n return <MuiSkeleton variant={variant} {...props} />;\n}\n\n/**\n * Props for CardSkeleton component.\n */\nexport interface CardSkeletonProps {\n /** Show avatar placeholder */\n hasAvatar?: boolean;\n /** Number of text lines */\n lines?: number;\n /** Card width */\n width?: number | string;\n}\n\n/**\n * CardSkeleton - Pre-composed card loading skeleton.\n *\n * @example\n * ```tsx\n * <CardSkeleton hasAvatar lines={3} />\n * ```\n */\nexport function CardSkeleton({ hasAvatar = true, lines = 2, width = '100%' }: CardSkeletonProps): ReactNode {\n return (\n <Box sx={{ width, p: 2 }}>\n {hasAvatar && (\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}>\n <Skeleton variant=\"circular\" width={40} height={40} />\n <Box sx={{ ml: 1, flex: 1 }}>\n <Skeleton variant=\"text\" width=\"60%\" />\n <Skeleton variant=\"text\" width=\"40%\" />\n </Box>\n </Box>\n )}\n <Skeleton variant=\"rectangular\" width=\"100%\" height={118} sx={{ borderRadius: 1 }} />\n <Box sx={{ mt: 1 }}>\n {Array.from({ length: lines }, (_, i) => (\n <Skeleton key={i} variant=\"text\" width={i === lines - 1 ? '80%' : '100%'} />\n ))}\n </Box>\n </Box>\n );\n}\n\n/**\n * Props for TableSkeleton component.\n */\nexport interface TableSkeletonProps {\n /** Number of rows */\n rows?: number;\n /** Number of columns */\n columns?: number;\n /** Show header */\n hasHeader?: boolean;\n}\n\n/**\n * TableSkeleton - Pre-composed table loading skeleton.\n *\n * @example\n * ```tsx\n * <TableSkeleton rows={5} columns={4} />\n * ```\n */\nexport function TableSkeleton({ rows = 5, columns = 4, hasHeader = true }: TableSkeletonProps): ReactNode {\n return (\n <Box sx={{ width: '100%' }}>\n {hasHeader && (\n <Box sx={{ display: 'flex', gap: 2, mb: 1, pb: 1, borderBottom: 1, borderColor: 'divider' }}>\n {Array.from({ length: columns }, (_, i) => (\n <Skeleton key={i} variant=\"text\" sx={{ flex: 1 }} height={24} />\n ))}\n </Box>\n )}\n {Array.from({ length: rows }, (_row, rowIndex) => (\n <Box key={rowIndex} sx={{ display: 'flex', gap: 2, py: 1 }}>\n {Array.from({ length: columns }, (_col, colIndex) => (\n <Skeleton key={colIndex} variant=\"text\" sx={{ flex: 1 }} />\n ))}\n </Box>\n ))}\n </Box>\n );\n}\n","'use client';\n\n/**\n * Progress Components\n *\n * Linear and circular progress indicators.\n *\n * @module components/progress\n */\n\nimport type { ReactNode, ComponentProps } from 'react';\nimport MuiLinearProgress from '@mui/material/LinearProgress';\nimport MuiCircularProgress from '@mui/material/CircularProgress';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\n\n/**\n * Progress color variants.\n */\nexport type ProgressColor = 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info' | 'inherit';\n\n/**\n * Props for LinearProgress component.\n */\nexport interface LinearProgressProps extends Omit<ComponentProps<typeof MuiLinearProgress>, 'color'> {\n /** Progress color */\n color?: ProgressColor;\n /** Show percentage label */\n showLabel?: boolean;\n /** Label position */\n labelPosition?: 'end' | 'below';\n /** Custom label formatter */\n formatLabel?: (value: number) => string;\n}\n\n/**\n * LinearProgress - Horizontal progress indicator.\n *\n * @example\n * ```tsx\n * // Determinate\n * <LinearProgress value={75} showLabel />\n *\n * // Indeterminate (loading)\n * <LinearProgress />\n *\n * // With custom label\n * <LinearProgress\n * value={50}\n * showLabel\n * formatLabel={(v) => `${v}/100 completed`}\n * />\n * ```\n */\nexport function LinearProgress({\n color = 'primary',\n showLabel = false,\n labelPosition = 'end',\n formatLabel,\n value,\n variant = value !== undefined ? 'determinate' : 'indeterminate',\n sx,\n ...props\n}: LinearProgressProps): ReactNode {\n const label = formatLabel ? formatLabel(value ?? 0) : `${Math.round(value ?? 0)}%`;\n\n if (!showLabel) {\n return (\n <MuiLinearProgress variant={variant} value={value} color={color} sx={{ borderRadius: 1, ...sx }} {...props} />\n );\n }\n\n if (labelPosition === 'below') {\n return (\n <Box sx={{ width: '100%' }}>\n <MuiLinearProgress variant={variant} value={value} color={color} sx={{ borderRadius: 1, ...sx }} {...props} />\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n mt: 0.5,\n display: 'block',\n textAlign: 'center'\n }}>\n {label}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ flex: 1 }}>\n <MuiLinearProgress variant={variant} value={value} color={color} sx={{ borderRadius: 1, ...sx }} {...props} />\n </Box>\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.secondary\",\n minWidth: 40\n }}>\n {label}\n </Typography>\n </Box>\n );\n}\n\n/**\n * Props for CircularProgress component.\n */\nexport interface CircularProgressProps extends Omit<ComponentProps<typeof MuiCircularProgress>, 'color'> {\n /** Progress color */\n color?: ProgressColor;\n /** Show percentage label in center */\n showLabel?: boolean;\n /** Custom label formatter */\n formatLabel?: (value: number) => string;\n}\n\n/**\n * CircularProgress - Circular progress indicator.\n *\n * @example\n * ```tsx\n * // Determinate with label\n * <CircularProgress value={75} showLabel />\n *\n * // Indeterminate spinner\n * <CircularProgress />\n *\n * // Custom size\n * <CircularProgress value={50} size={80} thickness={5} showLabel />\n * ```\n */\nexport function CircularProgress({\n color = 'primary',\n showLabel = false,\n formatLabel,\n value,\n variant = value !== undefined ? 'determinate' : 'indeterminate',\n size = 40,\n ...props\n}: CircularProgressProps): ReactNode {\n if (!showLabel || variant === 'indeterminate') {\n return <MuiCircularProgress variant={variant} value={value} color={color} size={size} {...props} />;\n }\n\n const label = formatLabel ? formatLabel(value ?? 0) : `${Math.round(value ?? 0)}%`;\n\n return (\n <Box sx={{ position: 'relative', display: 'inline-flex' }}>\n <MuiCircularProgress variant={variant} value={value} color={color} size={size} {...props} />\n <Box\n sx={{\n position: 'absolute',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n fontSize: typeof size === 'number' ? size * 0.25 : undefined\n }}>\n {label}\n </Typography>\n </Box>\n </Box>\n );\n}\n\n/**\n * Props for ProgressBar component (segmented).\n */\nexport interface ProgressBarProps {\n /** Segments with value and optional color */\n segments: Array<{\n value: number;\n color?: ProgressColor;\n label?: string;\n }>;\n /** Bar height */\n height?: number;\n /** Show segment labels */\n showLabels?: boolean;\n}\n\n/**\n * ProgressBar - Segmented progress bar for multiple values.\n *\n * @example\n * ```tsx\n * <ProgressBar\n * segments={[\n * { value: 30, color: 'success', label: 'Complete' },\n * { value: 20, color: 'warning', label: 'In Progress' },\n * { value: 50, color: 'error', label: 'Failed' },\n * ]}\n * showLabels\n * />\n * ```\n */\nexport function ProgressBar({ segments, height = 8, showLabels = false }: ProgressBarProps): ReactNode {\n const colorMap: Record<ProgressColor, string> = {\n primary: 'primary.main',\n secondary: 'secondary.main',\n success: 'success.main',\n error: 'error.main',\n warning: 'warning.main',\n info: 'info.main',\n inherit: 'text.primary',\n };\n\n return (\n <Box sx={{ width: '100%' }}>\n <Box\n sx={{\n display: 'flex',\n borderRadius: 1,\n overflow: 'hidden',\n height,\n bgcolor: 'action.hover',\n }}\n >\n {segments.map((segment, index) => (\n <Box\n key={index}\n sx={{\n width: `${segment.value}%`,\n bgcolor: colorMap[segment.color ?? 'primary'],\n transition: 'width 0.3s ease-in-out',\n }}\n />\n ))}\n </Box>\n {showLabels && (\n <Box sx={{ display: 'flex', gap: 2, mt: 1 }}>\n {segments.map((segment, index) => (\n <Box key={index} sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: colorMap[segment.color ?? 'primary'],\n }}\n />\n <Typography variant=\"caption\" sx={{\n color: \"text.secondary\"\n }}>\n {segment.label ?? `${segment.value}%`}\n </Typography>\n </Box>\n ))}\n </Box>\n )}\n </Box>\n );\n}\n","/**\n * CountdownRing — circular countdown indicator that animates from\n * full to empty as a deadline approaches. Useful for time-limited\n * artifacts (quote expiry, OTP windows, session timers, signed-URL\n * lifetimes, etc.).\n *\n * Renders a CircularProgress whose `value` shrinks from 100 to 0\n * over the remaining window. The center label defaults to \"Ns\"\n * but can be customized via `formatLabel`. When the deadline has\n * passed, color flips to `error` and label switches to the\n * supplied `expiredLabel` (or \"Expired\").\n *\n * @example\n * ```tsx\n * <CountdownRing\n * deadline={quote.expiresAt}\n * totalMs={quote.ttlMs}\n * onExpire={() => setQuote(null)}\n * />\n * ```\n */\nimport { useEffect, useState, type ReactNode } from 'react';\nimport { CircularProgress, type ProgressColor } from './progress.js';\n\nexport interface CountdownRingProps {\n /** Deadline to count down to. Accepts Date or ISO string. */\n deadline: Date | string | null;\n /**\n * Total window length in ms — used as the denominator for the\n * progress percentage. If omitted, the ring is filled at mount\n * and tracks elapsed time relative to remaining.\n */\n totalMs?: number;\n /** Diameter in px. Default 40. */\n size?: number;\n /** Color while the timer is healthy. Default `primary`. */\n color?: ProgressColor;\n /** Color when remaining drops below `warningThresholdMs`. Default `warning`. */\n warningColor?: ProgressColor;\n /** Color after expiry. Default `error`. */\n expiredColor?: ProgressColor;\n /**\n * Switch to `warningColor` when remaining is below this.\n * Default 10s.\n */\n warningThresholdMs?: number;\n /** Tick interval in ms. Default 250. */\n tickIntervalMs?: number;\n /** Callback fired once when the deadline first elapses. */\n onExpire?: () => void;\n /**\n * Center-label formatter. Receives `(remainingMs, expired)` and\n * returns the string. Default: `Ns` while running, `expiredLabel`\n * after expiry.\n */\n formatLabel?: (remainingMs: number, expired: boolean) => string;\n /** Override the default expired label. */\n expiredLabel?: string;\n}\n\nexport function CountdownRing({\n deadline,\n totalMs,\n size = 40,\n color = 'primary',\n warningColor = 'warning',\n expiredColor = 'error',\n warningThresholdMs = 10_000,\n tickIntervalMs = 250,\n onExpire,\n formatLabel,\n expiredLabel = 'Expired',\n}: CountdownRingProps): ReactNode {\n const target = parseDeadline(deadline);\n const [now, setNow] = useState<number>(() => Date.now());\n\n useEffect(() => {\n if (!target) return undefined;\n const id = setInterval(() => setNow(Date.now()), tickIntervalMs);\n return () => clearInterval(id);\n }, [target, tickIntervalMs]);\n\n // Fire onExpire exactly once per deadline transition. We track the\n // previous \"expired\" status in state-derived form rather than a ref\n // to keep the hook order stable across renders.\n const remainingMs = target ? Math.max(0, target - now) : 0;\n const expired = target != null && remainingMs <= 0;\n useEffect(() => {\n if (expired && onExpire) onExpire();\n // intentional: re-fire only when transitioning from running → expired\n }, [expired, onExpire]);\n\n const denom = totalMs && totalMs > 0 ? totalMs : remainingMs > 0 ? remainingMs : 1;\n const value = expired ? 0 : Math.min(100, (remainingMs / denom) * 100);\n\n const activeColor: ProgressColor = expired\n ? expiredColor\n : remainingMs <= warningThresholdMs\n ? warningColor\n : color;\n\n const label = formatLabel\n ? formatLabel(remainingMs, expired)\n : expired\n ? expiredLabel\n : `${Math.ceil(remainingMs / 1000)}s`;\n\n return (\n <CircularProgress\n value={value}\n size={size}\n color={activeColor}\n showLabel\n formatLabel={() => label}\n />\n );\n}\n\nfunction parseDeadline(d: Date | string | null): number | null {\n if (!d) return null;\n if (d instanceof Date) return d.getTime();\n const t = Date.parse(d);\n return Number.isFinite(t) ? t : null;\n}\n","/**\n * VirtualList — windowed list for variable-height rows.\n *\n * Wraps `@tanstack/react-virtual` with the most common ergonomic\n * defaults: a scrolling viewport, dynamic height measurement (rows\n * may expand and the list rebalances), and an optional infinite-load\n * hook that fires when the user scrolls within `loadMoreThreshold`\n * px of the bottom.\n *\n * Use cases that drove the API: audit log dialogs (rows can expand\n * to reveal payloads), chat/message histories, paginated transaction\n * tables. Items are keyed by the caller-supplied `getKey` so row\n * identity survives reorder.\n *\n * @example\n * ```tsx\n * <VirtualList\n * items={trades}\n * getKey={(t) => t.id}\n * estimateSize={48}\n * maxHeight={500}\n * onEndReached={() => fetchNextPage()}\n * >\n * {(trade) => <TradeRow trade={trade} />}\n * </VirtualList>\n * ```\n */\nimport { useEffect, useRef, type ReactNode } from 'react';\nimport Box, { type BoxProps } from '@mui/material/Box';\nimport { useVirtualizer } from '@tanstack/react-virtual';\n\nexport interface VirtualListProps<T> {\n /** Source items, in render order. */\n items: readonly T[];\n /** Stable key for each row — needed for reorders and dynamic measurement. */\n getKey: (item: T, index: number) => string | number;\n /** Render a single row. */\n children: (item: T, index: number) => ReactNode;\n /**\n * Initial size estimate per row in px. The virtualizer will replace\n * this with the measured size once each row mounts.\n */\n estimateSize?: number;\n /**\n * Number of items to render outside the visible window on each\n * side. Higher values reduce blank flashes on fast scroll at the\n * cost of more DOM. Default 5.\n */\n overscan?: number;\n /**\n * Cap on the scroll viewport height. The Box auto-fills its parent\n * if not supplied — set this when the parent isn't height-bounded\n * (e.g. inside a Dialog without `fullHeight`).\n */\n maxHeight?: number | string;\n /** Fires when the user scrolls within `loadMoreThreshold` of the bottom. */\n onEndReached?: () => void;\n /** Distance from the bottom (px) at which `onEndReached` fires. Default 200. */\n loadMoreThreshold?: number;\n /** Forwarded to the outer scrolling Box for layout overrides. */\n sx?: BoxProps['sx'];\n /** Inner padding (px) — applied as content offset, not scroll padding. */\n paddingY?: number;\n}\n\nexport function VirtualList<T>({\n items,\n getKey,\n children,\n estimateSize = 48,\n overscan = 5,\n maxHeight,\n onEndReached,\n loadMoreThreshold = 200,\n sx,\n paddingY = 0,\n}: VirtualListProps<T>): ReactNode {\n const parentRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => parentRef.current,\n estimateSize: () => estimateSize,\n overscan,\n getItemKey: (index) => {\n const item = items[index];\n return item === undefined ? index : getKey(item, index);\n },\n });\n\n // Fire onEndReached when the last virtual item is within the\n // threshold of the visible area. We sample every render — cheap,\n // since virtualizer.getVirtualItems is already memoized.\n const virtualItems = virtualizer.getVirtualItems();\n const lastItem = virtualItems[virtualItems.length - 1];\n useEffect(() => {\n if (!onEndReached || !lastItem) return;\n if (lastItem.index >= items.length - 1) {\n // Already at the actual end — nothing more to load yet.\n return;\n }\n const scrollEl = parentRef.current;\n if (!scrollEl) return;\n const distanceToBottom =\n virtualizer.getTotalSize() - (scrollEl.scrollTop + scrollEl.clientHeight);\n if (distanceToBottom <= loadMoreThreshold) {\n onEndReached();\n }\n }, [lastItem, virtualizer, items.length, loadMoreThreshold, onEndReached]);\n\n return (\n <Box\n ref={parentRef}\n sx={{\n overflow: 'auto',\n contain: 'strict',\n maxHeight,\n height: maxHeight === undefined ? '100%' : undefined,\n ...sx,\n }}\n >\n <Box\n sx={{\n height: virtualizer.getTotalSize() + paddingY * 2,\n width: '100%',\n position: 'relative',\n }}\n >\n {virtualItems.map((virtualRow) => {\n const item = items[virtualRow.index];\n if (item === undefined) return null;\n return (\n <Box\n key={virtualRow.key}\n data-index={virtualRow.index}\n ref={virtualizer.measureElement}\n sx={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n transform: `translateY(${virtualRow.start + paddingY}px)`,\n }}\n >\n {children(item, virtualRow.index)}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n","/**\n * CommandPalette — keyboard-driven action launcher.\n *\n * A modal palette opened by a global shortcut (default Cmd/Ctrl+K)\n * that lets the user search and trigger any `CommandAction` in the\n * registered set. Actions can be grouped (`group`) for visual\n * separation and filtered with case-insensitive matching against\n * `title`, `subtitle`, and any `keywords`. Arrow keys move the\n * highlight, Enter selects, Escape closes.\n *\n * Use cases: app-wide navigation jumps, frequently used admin\n * actions, contextual menus that need a quick-search affordance.\n *\n * @example\n * ```tsx\n * <CommandPalette\n * actions={[\n * {\n * id: 'go-users',\n * title: 'Go to Users',\n * group: 'Navigation',\n * keywords: ['admin', 'list'],\n * onSelect: () => navigate('/admin/users'),\n * },\n * ]}\n * />\n * ```\n */\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport Dialog from '@mui/material/Dialog';\nimport DialogContent from '@mui/material/DialogContent';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport Divider from '@mui/material/Divider';\nimport Chip from '@mui/material/Chip';\nimport { alpha } from '@mui/material/styles';\n\nexport interface CommandAction {\n /** Stable action identifier — used as React key. */\n id: string;\n /** Primary text shown in the row. */\n title: string;\n /** Optional secondary text shown beside the title. */\n subtitle?: string;\n /** Group label — actions sharing a group are visually clustered. */\n group?: string;\n /** Extra search terms (synonyms, aliases). */\n keywords?: readonly string[];\n /** Optional leading icon. */\n icon?: ReactNode;\n /** Optional shortcut hint (e.g. ['⌘', 'P']) shown right-aligned. */\n shortcut?: readonly string[];\n /** Disable the action without removing it from the list. */\n disabled?: boolean;\n /** Action handler. The palette closes after `onSelect` resolves. */\n onSelect: () => void | Promise<void>;\n}\n\nexport interface CommandPaletteProps {\n /** Registered actions. Re-render to update; use a memoized array. */\n actions: readonly CommandAction[];\n /**\n * Controlled open state. If omitted, the palette opens itself when\n * `triggerKey` is pressed and closes on Escape/select.\n */\n open?: boolean;\n /** Open-state setter for the controlled mode. */\n onOpenChange?: (open: boolean) => void;\n /**\n * Global keyboard shortcut to open. Default `'k'` (paired with the\n * platform meta key — ⌘ on macOS, Ctrl elsewhere).\n */\n triggerKey?: string;\n /** Disable the global shortcut (useful in nested palettes). */\n disableShortcut?: boolean;\n /** Placeholder for the search field. */\n placeholder?: string;\n /** Empty-state copy shown when no actions match. */\n emptyMessage?: string;\n}\n\nexport function CommandPalette({\n actions,\n open: controlledOpen,\n onOpenChange,\n triggerKey = 'k',\n disableShortcut = false,\n placeholder = 'Type a command or search…',\n emptyMessage = 'No matching commands',\n}: CommandPaletteProps) {\n const [internalOpen, setInternalOpen] = useState(false);\n const open = controlledOpen ?? internalOpen;\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlledOpen === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [controlledOpen, onOpenChange],\n );\n\n const [query, setQuery] = useState('');\n const [highlight, setHighlight] = useState(0);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Global shortcut. We listen on `keydown` capture-phase so editors\n // (TipTap, Monaco, etc.) can preventDefault before us if they need\n // the same key for something — they own focus, so they get priority.\n useEffect(() => {\n if (disableShortcut) return undefined;\n const onKey = (e: KeyboardEvent) => {\n const meta = e.metaKey || e.ctrlKey;\n if (meta && e.key.toLowerCase() === triggerKey.toLowerCase() && !e.altKey && !e.shiftKey) {\n e.preventDefault();\n setOpen(!open);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [triggerKey, disableShortcut, open, setOpen]);\n\n // Reset query + highlight every time the palette opens.\n useEffect(() => {\n if (open) {\n setQuery('');\n setHighlight(0);\n // Defer focus to the next frame so the dialog's transition has\n // mounted the input.\n const id = requestAnimationFrame(() => inputRef.current?.focus());\n return () => cancelAnimationFrame(id);\n }\n return undefined;\n }, [open]);\n\n const filtered = useMemo(() => filterActions(actions, query), [actions, query]);\n\n // Re-clamp the highlight when filtering changes.\n useEffect(() => {\n if (highlight >= filtered.length) setHighlight(0);\n }, [filtered.length, highlight]);\n\n const runAction = useCallback(\n async (action: CommandAction) => {\n if (action.disabled) return;\n setOpen(false);\n try {\n await action.onSelect();\n } catch {\n // Swallow — the caller's onSelect is responsible for surfacing\n // its own errors. We just don't want a rejected promise to\n // crash the palette host.\n }\n },\n [setOpen],\n );\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setHighlight((h) => (filtered.length === 0 ? 0 : (h + 1) % filtered.length));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setHighlight((h) => (filtered.length === 0 ? 0 : (h - 1 + filtered.length) % filtered.length));\n } else if (e.key === 'Enter') {\n e.preventDefault();\n const target = filtered[highlight];\n if (target) void runAction(target);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setOpen(false);\n }\n },\n [filtered, highlight, runAction, setOpen],\n );\n\n // Group rows for rendering. Within each group we record the absolute\n // index so the highlight cursor can address rows by their position\n // in the flat filtered list.\n const grouped = useMemo(() => groupActions(filtered), [filtered]);\n\n return (\n <Dialog\n open={open}\n onClose={() => setOpen(false)}\n fullWidth\n maxWidth=\"sm\"\n slotProps={{\n paper: {\n sx: { borderRadius: 2, mt: '10vh', alignSelf: 'flex-start' },\n },\n }}\n >\n <DialogContent sx={{ p: 0 }}>\n <Box sx={{ p: 2, pb: 1 }}>\n <TextField\n inputRef={inputRef}\n fullWidth\n variant=\"standard\"\n value={query}\n onChange={(e) => {\n setQuery(e.target.value);\n setHighlight(0);\n }}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n slotProps={{\n input: {\n disableUnderline: true,\n startAdornment: (\n <InputAdornment position=\"start\" sx={{ ml: 0.5, mr: 1 }}>\n <Box component=\"span\" sx={{ fontSize: 18, opacity: 0.6 }}>\n ⌘\n </Box>\n </InputAdornment>\n ),\n },\n }}\n />\n </Box>\n <Divider />\n <Box\n sx={{\n maxHeight: 360,\n overflowY: 'auto',\n py: 0.5,\n }}\n >\n {filtered.length === 0 ? (\n <Box sx={{ p: 3, textAlign: 'center' }}>\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {emptyMessage}\n </Typography>\n </Box>\n ) : (\n grouped.map((g) => (\n <Box key={g.label ?? '__none__'}>\n {g.label ? (\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n px: 2,\n py: 0.75,\n display: 'block',\n textTransform: 'uppercase',\n letterSpacing: 0.5\n }}>\n {g.label}\n </Typography>\n ) : null}\n {g.items.map((entry) => (\n <Row\n key={entry.action.id}\n action={entry.action}\n selected={entry.flatIndex === highlight}\n onSelect={() => void runAction(entry.action)}\n onHover={() => setHighlight(entry.flatIndex)}\n />\n ))}\n </Box>\n ))\n )}\n </Box>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction Row({\n action,\n selected,\n onSelect,\n onHover,\n}: {\n action: CommandAction;\n selected: boolean;\n onSelect: () => void;\n onHover: () => void;\n}) {\n const ref = useRef<HTMLDivElement | null>(null);\n\n // Keep the highlighted row in view as the user navigates.\n useEffect(() => {\n if (selected && ref.current) {\n ref.current.scrollIntoView({ block: 'nearest' });\n }\n }, [selected]);\n\n return (\n <Box\n ref={ref}\n onMouseEnter={onHover}\n onClick={onSelect}\n sx={(theme) => ({\n px: 2,\n py: 1.25,\n display: 'flex',\n alignItems: 'center',\n gap: 1.5,\n cursor: action.disabled ? 'not-allowed' : 'pointer',\n opacity: action.disabled ? 0.5 : 1,\n bgcolor: selected ? alpha(theme.palette.primary.main, 0.12) : 'transparent',\n '&:hover': {\n bgcolor: selected\n ? alpha(theme.palette.primary.main, 0.16)\n : alpha(theme.palette.action.hover, 1),\n },\n })}\n >\n {action.icon ? (\n <Box sx={{ display: 'flex', alignItems: 'center', width: 20, opacity: 0.8 }}>\n {action.icon}\n </Box>\n ) : null}\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Stack direction=\"row\" spacing={1} sx={{\n alignItems: \"baseline\"\n }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 500 }} noWrap>\n {action.title}\n </Typography>\n {action.subtitle ? (\n <Typography variant=\"caption\" noWrap sx={{\n color: \"text.secondary\"\n }}>\n {action.subtitle}\n </Typography>\n ) : null}\n </Stack>\n </Box>\n {action.shortcut?.length ? (\n <Stack direction=\"row\" spacing={0.5}>\n {action.shortcut.map((k, i) => (\n <Chip\n key={i}\n size=\"small\"\n label={k}\n variant=\"outlined\"\n sx={{ height: 20, fontSize: 10, fontFamily: 'monospace' }}\n />\n ))}\n </Stack>\n ) : null}\n </Box>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Filtering — case-insensitive substring match across title, subtitle,\n// and any explicit keywords. We intentionally avoid full fuzzy matching\n// at this size; a substring score keeps the most-recently-typed prefix\n// at the top, which matches user mental models for command palettes.\n// ---------------------------------------------------------------------------\n\nfunction filterActions(\n actions: readonly CommandAction[],\n query: string,\n): readonly CommandAction[] {\n const q = query.trim().toLowerCase();\n if (!q) return actions;\n\n type Scored = { action: CommandAction; score: number };\n const scored: Scored[] = [];\n\n for (const action of actions) {\n const haystacks: string[] = [action.title.toLowerCase()];\n if (action.subtitle) haystacks.push(action.subtitle.toLowerCase());\n if (action.keywords?.length) {\n for (const k of action.keywords) haystacks.push(k.toLowerCase());\n }\n\n let bestScore = -1;\n for (const h of haystacks) {\n const idx = h.indexOf(q);\n if (idx === -1) continue;\n // Prefix matches outrank mid-string matches.\n const score = idx === 0 ? 1000 - h.length : 100 - idx;\n if (score > bestScore) bestScore = score;\n }\n if (bestScore >= 0) scored.push({ action, score: bestScore });\n }\n\n scored.sort((a, b) => b.score - a.score);\n return scored.map((s) => s.action);\n}\n\ninterface GroupedRow {\n label: string | undefined;\n items: { action: CommandAction; flatIndex: number }[];\n}\n\nfunction groupActions(actions: readonly CommandAction[]): GroupedRow[] {\n const out = new Map<string, GroupedRow>();\n let flatIndex = 0;\n for (const action of actions) {\n const label = action.group;\n const key = label ?? '__none__';\n let bucket = out.get(key);\n if (!bucket) {\n bucket = { label, items: [] };\n out.set(key, bucket);\n }\n bucket.items.push({ action, flatIndex });\n flatIndex += 1;\n }\n return [...out.values()];\n}\n","'use client';\n\n/**\n * Tabs Component\n *\n * Tabbed interface with panel support.\n *\n * @module components/tabs\n */\n\nimport type { ReactNode, ReactElement, SyntheticEvent, ComponentProps } from 'react';\nimport { useState, useCallback, Children, isValidElement, useMemo } from 'react';\nimport MuiTabs from '@mui/material/Tabs';\nimport MuiTab from '@mui/material/Tab';\nimport Box from '@mui/material/Box';\n\n/**\n * Tab item definition.\n */\nexport interface TabItem {\n /** Unique value for the tab */\n value: string;\n /** Tab label */\n label: string;\n /** Optional icon (must be a React element, not arbitrary ReactNode) */\n icon?: ReactElement;\n /** Tab content */\n content?: ReactNode;\n /** Disabled state */\n disabled?: boolean;\n}\n\n/**\n * Props for Tabs component.\n */\n// `action` clashes with MUI's imperative `action: Ref<TabsActions>` —\n// we're not exposing the imperative ref API (it's almost never used\n// in app code) and reclaim the name for the actions slot instead.\nexport interface TabsProps extends Omit<ComponentProps<typeof MuiTabs>, 'onChange' | 'value' | 'action'> {\n /** Tab items configuration */\n tabs?: TabItem[];\n /** Controlled value */\n value?: string;\n /** Default value (uncontrolled) */\n defaultValue?: string;\n /** Change handler */\n onChange?: (value: string) => void;\n /** Tab panel children (alternative to tabs prop) */\n children?: ReactNode;\n /** Keep unmounted tabs in DOM */\n keepMounted?: boolean;\n /**\n * Optional actions area rendered to the right of the tab strip\n * (e.g. a primary \"Create\" button). Mirrors the action slot on\n * `Breadcrumbs`. When set, the tab strip's bottom border moves\n * onto the surrounding flex row so the divider runs full-width\n * past the action area without breaking.\n */\n action?: ReactNode;\n}\n\n/**\n * Tabs - Tabbed interface component.\n *\n * @example\n * ```tsx\n * // Using tabs prop\n * <Tabs\n * tabs={[\n * { value: 'tab1', label: 'General', content: <GeneralSettings /> },\n * { value: 'tab2', label: 'Security', content: <SecuritySettings /> },\n * { value: 'tab3', label: 'Notifications', content: <NotificationSettings /> },\n * ]}\n * defaultValue=\"tab1\"\n * />\n *\n * // Using children\n * <Tabs defaultValue=\"overview\">\n * <TabPanel value=\"overview\" label=\"Overview\">\n * Overview content\n * </TabPanel>\n * <TabPanel value=\"details\" label=\"Details\">\n * Details content\n * </TabPanel>\n * </Tabs>\n * ```\n */\nexport function Tabs({\n tabs,\n value: controlledValue,\n defaultValue,\n onChange,\n children,\n keepMounted = false,\n action,\n ...muiProps\n}: TabsProps): ReactNode {\n const [internalValue, setInternalValue] = useState(defaultValue ?? tabs?.[0]?.value ?? '');\n\n const value = controlledValue ?? internalValue;\n\n const handleChange = useCallback(\n (_event: SyntheticEvent, newValue: string) => {\n if (controlledValue === undefined) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n },\n [controlledValue, onChange]\n );\n\n // Extract tab items from children if using TabPanel pattern\n const tabItems = useMemo(() => {\n if (tabs) return tabs;\n\n const items: TabItem[] = [];\n Children.forEach(children, (child) => {\n if (isValidElement(child) && child.type === TabPanel) {\n const props = child.props as TabPanelProps;\n items.push({\n value: props.value,\n label: props.label ?? props.value,\n icon: props.icon,\n content: props.children,\n disabled: props.disabled,\n });\n }\n });\n return items;\n }, [tabs, children]);\n\n // Flex wrapper exists only to host the optional action node to\n // the right of the tab strip — no bottom divider; MuiTabs keeps\n // its own active-tab indicator track and that's the only line\n // we want under the strip.\n const hasAction = action !== undefined && action !== null && action !== false;\n\n return (\n <Box sx={{ width: '100%' }}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n }}\n >\n <MuiTabs value={value} onChange={handleChange} {...muiProps}>\n {tabItems.map((tab) => (\n <MuiTab\n key={tab.value}\n value={tab.value}\n label={tab.label}\n icon={tab.icon}\n iconPosition=\"start\"\n disabled={tab.disabled}\n />\n ))}\n </MuiTabs>\n {hasAction && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n flexShrink: 0,\n }}\n >\n {action}\n </Box>\n )}\n </Box>\n {tabItems.map((tab) => {\n const isActive = tab.value === value;\n if (!isActive && !keepMounted) return null;\n // Strip-only usage (`tabs` entries without `content`):\n // the page renders its own content below the tabs and\n // just needs the navigation strip. Skipping the panel\n // box keeps the layout flush.\n if (tab.content === undefined) return null;\n\n return (\n <Box\n key={tab.value}\n role=\"tabpanel\"\n hidden={!isActive}\n id={`tabpanel-${tab.value}`}\n aria-labelledby={`tab-${tab.value}`}\n sx={{ pt: 2 }}\n >\n {tab.content}\n </Box>\n );\n })}\n </Box>\n );\n}\n\n/**\n * Props for TabPanel component.\n */\nexport interface TabPanelProps {\n /** Unique value (must match Tabs value) */\n value: string;\n /** Tab label */\n label?: string;\n /** Optional icon (must be a React element, not arbitrary ReactNode) */\n icon?: ReactElement;\n /** Panel content */\n children?: ReactNode;\n /** Disabled state */\n disabled?: boolean;\n}\n\n/**\n * TabPanel - Individual tab panel for use with Tabs children pattern.\n *\n * @example\n * ```tsx\n * <Tabs defaultValue=\"tab1\">\n * <TabPanel value=\"tab1\" label=\"First\">\n * First panel content\n * </TabPanel>\n * <TabPanel value=\"tab2\" label=\"Second\">\n * Second panel content\n * </TabPanel>\n * </Tabs>\n * ```\n */\nexport function TabPanel({ children }: TabPanelProps): ReactNode {\n // This component is only used for configuration extraction\n // The actual rendering happens in the Tabs component\n return <>{children}</>;\n}\n\n/**\n * Hook for managing tab state externally.\n */\nexport interface UseTabsOptions {\n /** Initial tab value */\n defaultValue?: string;\n /** Callback when tab changes */\n onChange?: (value: string) => void;\n}\n\nexport interface UseTabsReturn {\n /** Current tab value */\n value: string;\n /** Set the active tab */\n setValue: (value: string) => void;\n /** Props to spread on Tabs component */\n tabsProps: {\n value: string;\n onChange: (value: string) => void;\n };\n}\n\n/**\n * useTabs - Hook for external tab state management.\n *\n * Uses proper memoization to prevent unnecessary re-renders.\n *\n * @example\n * ```tsx\n * const { tabsProps, value, setValue } = useTabs({ defaultValue: 'tab1' });\n *\n * return (\n * <>\n * <button onClick={() => setValue('tab2')}>Go to Tab 2</button>\n * <Tabs {...tabsProps} tabs={tabs} />\n * </>\n * );\n * ```\n */\nexport function useTabs({ defaultValue = '', onChange }: UseTabsOptions = {}): UseTabsReturn {\n const [value, setValueInternal] = useState(defaultValue);\n\n const setValue = useCallback(\n (newValue: string) => {\n setValueInternal(newValue);\n onChange?.(newValue);\n },\n [onChange]\n );\n\n // Memoize the return value to prevent unnecessary re-renders\n return useMemo(\n () => ({\n value,\n setValue,\n tabsProps: {\n value,\n onChange: setValue,\n },\n }),\n [value, setValue]\n );\n}\n","'use client';\n\n/**\n * Accordion Component\n *\n * Expandable content panels.\n *\n * @module components/accordion\n */\n\nimport type { ReactNode, ComponentProps } from 'react';\nimport { useState, useCallback } from 'react';\nimport MuiAccordion from '@mui/material/Accordion';\nimport MuiAccordionSummary from '@mui/material/AccordionSummary';\nimport MuiAccordionDetails from '@mui/material/AccordionDetails';\nimport Typography from '@mui/material/Typography';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\n\n/**\n * Accordion item definition.\n */\nexport interface AccordionItem {\n /** Unique identifier */\n id: string;\n /** Header title */\n title: string;\n /** Optional subtitle */\n subtitle?: string;\n /** Panel content */\n content: ReactNode;\n /** Disabled state */\n disabled?: boolean;\n /** Optional icon */\n icon?: ReactNode;\n}\n\n/**\n * Props for Accordion component.\n */\nexport interface AccordionProps {\n /** Accordion items */\n items: AccordionItem[];\n /** Allow multiple panels open (default: false for single-open mode) */\n multiple?: boolean;\n /** Default expanded panel(s) */\n defaultExpanded?: string | string[];\n /** Controlled expanded state */\n expanded?: string | string[];\n /** Change handler */\n onChange?: (expanded: string[]) => void;\n /** Accordion variant */\n variant?: 'default' | 'outlined' | 'elevated';\n /** Disable gutter between panels */\n disableGutters?: boolean;\n}\n\n/**\n * Accordion - Expandable content panels.\n *\n * @example\n * ```tsx\n * // Single-open mode (default)\n * <Accordion\n * items={[\n * { id: 'panel1', title: 'Section 1', content: <Panel1Content /> },\n * { id: 'panel2', title: 'Section 2', content: <Panel2Content /> },\n * { id: 'panel3', title: 'Section 3', content: <Panel3Content /> },\n * ]}\n * defaultExpanded=\"panel1\"\n * />\n *\n * // Multiple-open mode\n * <Accordion\n * items={items}\n * multiple\n * defaultExpanded={['panel1', 'panel3']}\n * />\n * ```\n */\nexport function Accordion({\n items,\n multiple = false,\n defaultExpanded,\n expanded: controlledExpanded,\n onChange,\n variant = 'default',\n disableGutters = false,\n}: AccordionProps): ReactNode {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(() => {\n if (defaultExpanded === undefined) return [];\n return Array.isArray(defaultExpanded) ? defaultExpanded : [defaultExpanded];\n });\n\n const expanded =\n controlledExpanded !== undefined\n ? Array.isArray(controlledExpanded)\n ? controlledExpanded\n : [controlledExpanded]\n : internalExpanded;\n\n const handleChange = useCallback(\n (panelId: string) => (_event: React.SyntheticEvent, isExpanded: boolean) => {\n let newExpanded: string[];\n\n if (multiple) {\n newExpanded = isExpanded ? [...expanded, panelId] : expanded.filter((id) => id !== panelId);\n } else {\n newExpanded = isExpanded ? [panelId] : [];\n }\n\n if (controlledExpanded === undefined) {\n setInternalExpanded(newExpanded);\n }\n onChange?.(newExpanded);\n },\n [expanded, multiple, controlledExpanded, onChange]\n );\n\n const getAccordionSx = (): ComponentProps<typeof MuiAccordion>['sx'] => {\n switch (variant) {\n case 'outlined':\n return {\n border: 1,\n borderColor: 'divider',\n '&:not(:last-child)': { borderBottom: 0 },\n '&::before': { display: 'none' },\n boxShadow: 'none',\n };\n case 'elevated':\n return {\n boxShadow: 2,\n '&::before': { display: 'none' },\n mb: disableGutters ? 0 : 1,\n };\n default:\n return {};\n }\n };\n\n return (\n <>\n {items.map((item) => (\n <MuiAccordion\n key={item.id}\n expanded={expanded.includes(item.id)}\n onChange={handleChange(item.id)}\n disabled={item.disabled}\n disableGutters={disableGutters}\n sx={getAccordionSx()}\n >\n <MuiAccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls={`${item.id}-content`}\n id={`${item.id}-header`}\n >\n {item.icon && (\n <Typography component=\"span\" sx={{ mr: 1, display: 'flex', alignItems: 'center' }}>\n {item.icon}\n </Typography>\n )}\n <Typography component=\"span\" sx={{ fontWeight: 500 }}>\n {item.title}\n </Typography>\n {item.subtitle && (\n <Typography\n component=\"span\"\n sx={{\n color: \"text.secondary\",\n ml: 1\n }}>\n {item.subtitle}\n </Typography>\n )}\n </MuiAccordionSummary>\n <MuiAccordionDetails>{item.content}</MuiAccordionDetails>\n </MuiAccordion>\n ))}\n </>\n );\n}\n\n/**\n * Props for SimpleAccordion component.\n */\nexport interface SimpleAccordionProps extends Omit<ComponentProps<typeof MuiAccordion>, 'children'> {\n /** Header title */\n title: string;\n /** Optional subtitle */\n subtitle?: string;\n /** Panel content */\n children: ReactNode;\n /** Optional icon */\n icon?: ReactNode;\n}\n\n/**\n * SimpleAccordion - Single expandable panel.\n *\n * @example\n * ```tsx\n * <SimpleAccordion title=\"Advanced Settings\" defaultExpanded>\n * <AdvancedSettings />\n * </SimpleAccordion>\n * ```\n */\nexport function SimpleAccordion({ title, subtitle, children, icon, ...props }: SimpleAccordionProps): ReactNode {\n return (\n <MuiAccordion {...props}>\n <MuiAccordionSummary expandIcon={<ExpandMoreIcon />}>\n {icon && (\n <Typography component=\"span\" sx={{ mr: 1, display: 'flex', alignItems: 'center' }}>\n {icon}\n </Typography>\n )}\n <Typography component=\"span\" sx={{ fontWeight: 500 }}>\n {title}\n </Typography>\n {subtitle && (\n <Typography\n component=\"span\"\n sx={{\n color: \"text.secondary\",\n ml: 1\n }}>\n {subtitle}\n </Typography>\n )}\n </MuiAccordionSummary>\n <MuiAccordionDetails>{children}</MuiAccordionDetails>\n </MuiAccordion>\n );\n}\n\n/**\n * Hook for managing accordion state externally.\n */\nexport interface UseAccordionOptions {\n /** Allow multiple panels open */\n multiple?: boolean;\n /** Default expanded panel(s) */\n defaultExpanded?: string | string[];\n /** Callback when expanded panels change */\n onChange?: (expanded: string[]) => void;\n}\n\nexport interface UseAccordionReturn {\n /** Currently expanded panel(s) */\n expanded: string[];\n /** Check if a panel is expanded */\n isExpanded: (id: string) => boolean;\n /** Toggle a panel */\n toggle: (id: string) => void;\n /** Expand a panel */\n expand: (id: string) => void;\n /** Collapse a panel */\n collapse: (id: string) => void;\n /** Expand all panels */\n expandAll: (ids: string[]) => void;\n /** Collapse all panels */\n collapseAll: () => void;\n /** Props to spread on Accordion component */\n accordionProps: {\n expanded: string[];\n multiple: boolean;\n onChange: (expanded: string[]) => void;\n };\n}\n\n/**\n * useAccordion - Hook for external accordion state management.\n *\n * @example\n * ```tsx\n * const { accordionProps, expandAll, collapseAll } = useAccordion({\n * multiple: true,\n * defaultExpanded: ['panel1'],\n * });\n *\n * return (\n * <>\n * <button onClick={() => expandAll(['panel1', 'panel2', 'panel3'])}>\n * Expand All\n * </button>\n * <button onClick={collapseAll}>Collapse All</button>\n * <Accordion {...accordionProps} items={items} />\n * </>\n * );\n * ```\n */\nexport function useAccordion({\n multiple = false,\n defaultExpanded,\n onChange,\n}: UseAccordionOptions = {}): UseAccordionReturn {\n const [expanded, setExpanded] = useState<string[]>(() => {\n if (defaultExpanded === undefined) return [];\n return Array.isArray(defaultExpanded) ? defaultExpanded : [defaultExpanded];\n });\n\n const isExpanded = useCallback((id: string) => expanded.includes(id), [expanded]);\n\n const updateExpanded = useCallback(\n (newExpanded: string[]) => {\n setExpanded(newExpanded);\n onChange?.(newExpanded);\n },\n [onChange]\n );\n\n const toggle = useCallback(\n (id: string) => {\n if (expanded.includes(id)) {\n updateExpanded(expanded.filter((e) => e !== id));\n } else if (multiple) {\n updateExpanded([...expanded, id]);\n } else {\n updateExpanded([id]);\n }\n },\n [expanded, multiple, updateExpanded]\n );\n\n const expand = useCallback(\n (id: string) => {\n if (!expanded.includes(id)) {\n if (multiple) {\n updateExpanded([...expanded, id]);\n } else {\n updateExpanded([id]);\n }\n }\n },\n [expanded, multiple, updateExpanded]\n );\n\n const collapse = useCallback(\n (id: string) => {\n updateExpanded(expanded.filter((e) => e !== id));\n },\n [expanded, updateExpanded]\n );\n\n const expandAll = useCallback(\n (ids: string[]) => {\n if (multiple) {\n updateExpanded(ids);\n } else if (ids.length > 0) {\n updateExpanded([ids[0]]);\n }\n },\n [multiple, updateExpanded]\n );\n\n const collapseAll = useCallback(() => {\n updateExpanded([]);\n }, [updateExpanded]);\n\n return {\n expanded,\n isExpanded,\n toggle,\n expand,\n collapse,\n expandAll,\n collapseAll,\n accordionProps: {\n expanded,\n multiple,\n onChange: updateExpanded,\n },\n };\n}\n","'use client';\n\n/**\n * Menu Component\n *\n * Dropdown menu with various item types.\n *\n * @module components/menu\n */\n\nimport type { ReactNode, MouseEvent } from 'react';\nimport { useState, useCallback } from 'react';\nimport MuiMenu 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 Typography from '@mui/material/Typography';\n\n// =============================================================================\n// SHARED RENDERING\n// =============================================================================\n\n/**\n * Render menu items (shared between Menu and ContextMenu).\n *\n * @param items - Array of menu item definitions\n * @param onItemClick - Click handler for menu items\n * @returns Array of rendered menu elements\n */\nfunction renderMenuItems(items: MenuItemDef[], onItemClick: (item: MenuItemDef) => void): ReactNode[] {\n return items.map((item, index) => {\n if (item.type === 'divider') {\n return <Divider key={`divider-${index}`} sx={{ my: 0.5 }} />;\n }\n\n if (item.type === 'header') {\n return (\n <Typography\n key={`header-${index}`}\n variant=\"overline\"\n sx={{ px: 2, py: 0.5, display: 'block', color: 'text.secondary' }}\n >\n {item.label}\n </Typography>\n );\n }\n\n return (\n <MenuItem\n key={item.key ?? `item-${index}`}\n onClick={() => onItemClick(item)}\n disabled={item.disabled}\n sx={{\n color: item.danger ? 'error.main' : undefined,\n '&:hover': item.danger ? { bgcolor: 'error.lighter' } : undefined,\n }}\n >\n {item.icon && <ListItemIcon sx={{ color: item.danger ? 'error.main' : undefined }}>{item.icon}</ListItemIcon>}\n <ListItemText>{item.label}</ListItemText>\n {item.shortcut && (\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n ml: 2\n }}>\n {item.shortcut}\n </Typography>\n )}\n </MenuItem>\n );\n });\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Menu item types.\n */\nexport type MenuItemType = 'item' | 'divider' | 'header';\n\n/**\n * Menu item definition.\n */\nexport interface MenuItemDef {\n /** Item type */\n type?: MenuItemType;\n /** Unique key (required for items) */\n key?: string;\n /** Item label */\n label?: string;\n /** Optional icon */\n icon?: ReactNode;\n /** Click handler */\n onClick?: () => void;\n /** Disabled state */\n disabled?: boolean;\n /** Danger/destructive action styling */\n danger?: boolean;\n /** Shortcut hint text */\n shortcut?: string;\n}\n\n/**\n * Props for Menu component.\n */\nexport interface MenuProps {\n /** Menu items */\n items: MenuItemDef[];\n /** Anchor element */\n anchorEl: HTMLElement | null;\n /** Open state */\n open: boolean;\n /** Close handler */\n onClose: () => void;\n /** Minimum width */\n minWidth?: number;\n /** Anchor origin */\n anchorOrigin?: {\n vertical: 'top' | 'center' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n };\n /** Transform origin */\n transformOrigin?: {\n vertical: 'top' | 'center' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n };\n}\n\n/**\n * Menu - Dropdown menu component.\n *\n * @example\n * ```tsx\n * const { anchorEl, open, handleOpen, handleClose } = useMenu();\n *\n * <Button onClick={handleOpen}>Open Menu</Button>\n * <Menu\n * anchorEl={anchorEl}\n * open={open}\n * onClose={handleClose}\n * items={[\n * { key: 'edit', label: 'Edit', icon: <EditIcon /> },\n * { key: 'duplicate', label: 'Duplicate', icon: <CopyIcon /> },\n * { type: 'divider' },\n * { key: 'delete', label: 'Delete', icon: <DeleteIcon />, danger: true },\n * ]}\n * />\n * ```\n */\nexport function Menu({\n items,\n anchorEl,\n open,\n onClose,\n minWidth = 180,\n anchorOrigin = { vertical: 'bottom', horizontal: 'right' },\n transformOrigin = { vertical: 'top', horizontal: 'right' },\n}: MenuProps): ReactNode {\n const handleItemClick = useCallback(\n (item: MenuItemDef) => {\n item.onClick?.();\n onClose();\n },\n [onClose]\n );\n\n return (\n <MuiMenu\n anchorEl={anchorEl}\n open={open}\n onClose={onClose}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n slotProps={{\n paper: {\n sx: { minWidth },\n },\n }}\n >\n {renderMenuItems(items, handleItemClick)}\n </MuiMenu>\n );\n}\n\n/**\n * Return type for useMenu hook.\n */\nexport interface UseMenuReturn {\n /** Anchor element for menu positioning */\n anchorEl: HTMLElement | null;\n /** Whether menu is open */\n open: boolean;\n /** Open menu handler (pass as onClick) */\n handleOpen: (event: MouseEvent<HTMLElement>) => void;\n /** Close menu handler */\n handleClose: () => void;\n /** Toggle menu handler */\n handleToggle: (event: MouseEvent<HTMLElement>) => void;\n /** Props to spread on Menu component */\n menuProps: {\n anchorEl: HTMLElement | null;\n open: boolean;\n onClose: () => void;\n };\n}\n\n/**\n * useMenu - Hook for managing menu state.\n *\n * @example\n * ```tsx\n * const menu = useMenu();\n *\n * return (\n * <>\n * <IconButton onClick={menu.handleOpen}>\n * <MoreVertIcon />\n * </IconButton>\n * <Menu {...menu.menuProps} items={menuItems} />\n * </>\n * );\n * ```\n */\nexport function useMenu(): UseMenuReturn {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n\n const open = Boolean(anchorEl);\n\n const handleOpen = useCallback((event: MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n }, []);\n\n const handleClose = useCallback(() => {\n setAnchorEl(null);\n }, []);\n\n const handleToggle = useCallback((event: MouseEvent<HTMLElement>) => {\n setAnchorEl((prev) => (prev ? null : event.currentTarget));\n }, []);\n\n return {\n anchorEl,\n open,\n handleOpen,\n handleClose,\n handleToggle,\n menuProps: {\n anchorEl,\n open,\n onClose: handleClose,\n },\n };\n}\n\n/**\n * Props for ContextMenu component.\n */\nexport interface ContextMenuProps extends Omit<MenuProps, 'anchorEl' | 'open' | 'onClose'> {\n /** Children to wrap with context menu */\n children: ReactNode;\n}\n\n/**\n * ContextMenu - Right-click context menu wrapper.\n *\n * @example\n * ```tsx\n * <ContextMenu\n * items={[\n * { key: 'cut', label: 'Cut', shortcut: '⌘X' },\n * { key: 'copy', label: 'Copy', shortcut: '⌘C' },\n * { key: 'paste', label: 'Paste', shortcut: '⌘V' },\n * ]}\n * >\n * <div>Right-click me!</div>\n * </ContextMenu>\n * ```\n */\nexport function ContextMenu({ items, children, ...menuProps }: ContextMenuProps): ReactNode {\n const [contextMenu, setContextMenu] = useState<{\n mouseX: number;\n mouseY: number;\n } | null>(null);\n\n const handleContextMenu = useCallback((event: MouseEvent) => {\n event.preventDefault();\n setContextMenu({\n mouseX: event.clientX + 2,\n mouseY: event.clientY - 6,\n });\n }, []);\n\n const handleClose = useCallback(() => {\n setContextMenu(null);\n }, []);\n\n const handleItemClick = useCallback(\n (item: MenuItemDef) => {\n item.onClick?.();\n handleClose();\n },\n [handleClose]\n );\n\n return (\n <>\n <div onContextMenu={handleContextMenu}>{children}</div>\n <MuiMenu\n open={contextMenu !== null}\n onClose={handleClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={contextMenu !== null ? { top: contextMenu.mouseY, left: contextMenu.mouseX } : undefined}\n slotProps={{\n paper: {\n sx: { minWidth: menuProps.minWidth ?? 180 },\n },\n }}\n >\n {renderMenuItems(items, handleItemClick)}\n </MuiMenu>\n </>\n );\n}\n","'use client';\n\n/**\n * NavigationProgress\n *\n * NProgress-based top-of-page progress bar for route transitions.\n * Starts on internal anchor clicks and history changes, completes on pathname change.\n *\n * Framework-agnostic: accepts `pathname` as a prop (pass from your router).\n *\n * @module components/navigation-progress\n */\n\nimport NProgress from 'nprogress';\nimport { useRef, useEffect } from 'react';\n\n// ---------------------------------------------------------------------------\n// Styles (injected via <style> tag to avoid CSS import requirement)\n// ---------------------------------------------------------------------------\n\nconst PRIMARY = 'var(--prism-palette-primary-main, var(--palette-primary-main, #1976d2))';\n\nconst STYLES = `\n#nprogress {\n top: 0;\n left: 0;\n width: 100%;\n height: 2.5px;\n z-index: 9999;\n position: fixed;\n pointer-events: none;\n}\n#nprogress .bar {\n height: 100%;\n background-color: ${PRIMARY};\n box-shadow: 0 0 2.5px ${PRIMARY};\n}\n#nprogress .peg {\n right: 0;\n opacity: 1;\n width: 100px;\n height: 100%;\n display: block;\n position: absolute;\n transform: rotate(3deg) translate(0px, -4px);\n box-shadow:\n 0 0 10px ${PRIMARY},\n 0 0 5px ${PRIMARY};\n}\n`;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface NavigationProgressProps {\n /** Current route pathname. */\n pathname: string;\n /**\n * Current route search string (including the leading `?`, as react-router's\n * `useLocation().search` returns it). Optional for backwards compat — when\n * provided, the bar also completes on search-only navigation (e.g. tab\n * switches encoded in query params). When omitted, only pathname changes\n * trigger completion, which leaves the bar stuck on `?tab=foo` style\n * transitions.\n */\n search?: string;\n /** Completion delay in ms (avoids flashing on fast transitions). Default: 100 */\n delay?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Check if an anchor should trigger the progress bar. */\nfunction isValidAnchor(element: HTMLAnchorElement): boolean {\n const href = element.getAttribute('href')?.trim() ?? '';\n const target = element.getAttribute('target');\n return href.startsWith('/') && target !== '_blank';\n}\n\n/** Compare two URLs ignoring hash. */\nfunction isSamePath(a: string, b: string): boolean {\n try {\n const urlA = new URL(a, window.location.origin);\n const urlB = new URL(b, window.location.origin);\n return urlA.pathname === urlB.pathname && urlA.search === urlB.search;\n } catch {\n return a === b;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nfunction useProgressBar(pathname: string, search: string, delay: number) {\n const currentUrlRef = useRef('');\n\n // Initialize\n useEffect(() => {\n currentUrlRef.current = window.location.href;\n }, []);\n\n // Start on navigation\n useEffect(() => {\n const handleNavigation = (newUrl: string) => {\n if (newUrl && !isSamePath(newUrl, currentUrlRef.current)) {\n currentUrlRef.current = newUrl;\n NProgress.start();\n }\n };\n\n // Click delegation for anchor tags\n const handleClick = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n const anchor = target.closest('a[href]') as HTMLAnchorElement | null;\n if (anchor && isValidAnchor(anchor)) {\n handleNavigation(anchor.href);\n }\n };\n\n // Browser back/forward\n const handlePopState = () => {\n handleNavigation(window.location.href);\n };\n\n // Patch history methods for programmatic navigation\n const patchHistory = (method: 'pushState' | 'replaceState') => {\n const original = window.history[method];\n window.history[method] = new Proxy(original, {\n apply: (target, thisArg, args: [data: unknown, unused: string, url?: string | URL | null]) => {\n const newUrl = args[2];\n if (typeof newUrl === 'string') {\n handleNavigation(new URL(newUrl, window.location.origin).href);\n }\n return target.apply(thisArg, args);\n },\n });\n };\n\n patchHistory('pushState');\n patchHistory('replaceState');\n\n document.addEventListener('click', handleClick);\n window.addEventListener('popstate', handlePopState);\n\n return () => {\n document.removeEventListener('click', handleClick);\n window.removeEventListener('popstate', handlePopState);\n };\n }, []);\n\n // Done on full URL change.\n //\n // Pre-fix this only depended on `pathname`, so search-only navigation\n // (tab switches, filter changes, anything that updates `?…=…` while\n // staying on the same route) started the bar via `pushState` but\n // never completed it — `pathname` never changed, so the effect didn't\n // re-fire. The bar then stuck at the top of the page indefinitely.\n // Keying on `pathname + search` makes start and completion symmetric.\n useEffect(() => {\n const timeout = setTimeout(() => NProgress.done(), delay);\n return () => clearTimeout(timeout);\n }, [pathname, search, delay]);\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * NavigationProgress - Top-of-page progress bar for route transitions.\n *\n * @example\n * ```tsx\n * import { useLocation } from 'react-router-dom';\n * import { NavigationProgress } from '@omnitron-dev/prism';\n *\n * function App() {\n * const { pathname } = useLocation();\n * return (\n * <>\n * <NavigationProgress pathname={pathname} />\n * <Routes>...</Routes>\n * </>\n * );\n * }\n * ```\n */\nexport function NavigationProgress({ pathname, search = '', delay = 100 }: NavigationProgressProps) {\n useEffect(() => {\n NProgress.configure({ showSpinner: false });\n return () => {\n NProgress.done();\n };\n }, []);\n\n useProgressBar(pathname, search, delay);\n\n return <style>{STYLES}</style>;\n}\n","'use client';\n\n/**\n * ScrollToTop\n *\n * Scrolls the window to the top on pathname change.\n * Framework-agnostic: accepts `pathname` as a prop.\n *\n * @module components/scroll-to-top\n */\n\nimport { useEffect } from 'react';\n\nexport interface ScrollToTopProps {\n /** Current route pathname. Scrolls to top on change. */\n pathname: string;\n}\n\n/**\n * ScrollToTop - Restores scroll position to top on route change.\n *\n * @example\n * ```tsx\n * import { useLocation } from 'react-router-dom';\n * import { ScrollToTop } from '@omnitron-dev/prism';\n *\n * function App() {\n * const { pathname } = useLocation();\n * return (\n * <>\n * <ScrollToTop pathname={pathname} />\n * <Routes>...</Routes>\n * </>\n * );\n * }\n * ```\n */\nexport function ScrollToTop({ pathname }: ScrollToTopProps) {\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n\n return null;\n}\n","'use client';\n\n/**\n * Settings Provider\n *\n * Provides settings context and drawer state management.\n * Wraps the application to enable settings drawer access anywhere.\n *\n * @module components/settings\n */\n\nimport { createContext, useContext, useState, useCallback, useMemo, type ReactNode } from 'react';\nimport { useSettingsStore, type SettingsState, type SettingsValues } from '../../state/stores/settings.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Settings drawer state and controls.\n */\nexport interface SettingsDrawerState {\n /** Whether the drawer is open */\n open: boolean;\n /** Open the drawer */\n onOpen: () => void;\n /** Close the drawer */\n onClose: () => void;\n /** Toggle the drawer */\n onToggle: () => void;\n}\n\n/**\n * Settings context value.\n */\nexport interface SettingsContextValue {\n /** Current settings values */\n settings: SettingsValues;\n /** Settings actions */\n actions: Pick<\n SettingsState,\n | 'setMode'\n | 'toggleMode'\n | 'setPreset'\n | 'setPrimaryColor'\n | 'setContrast'\n | 'setDirection'\n | 'setFontSize'\n | 'setFontFamily'\n | 'setDensity'\n | 'setCompactSidebar'\n | 'setNavLayout'\n | 'setNavColor'\n | 'setStretch'\n | 'updateSettings'\n | 'reset'\n >;\n /** Whether settings can be reset (differ from defaults) */\n canReset: boolean;\n /** Drawer state and controls */\n drawer: SettingsDrawerState;\n}\n\n/**\n * Settings provider props.\n */\nexport interface SettingsProviderProps {\n /** Child components */\n children: ReactNode;\n /** Initial drawer open state */\n defaultOpen?: boolean;\n}\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst SettingsContext = createContext<SettingsContextValue | null>(null);\n\n// =============================================================================\n// PROVIDER\n// =============================================================================\n\n/**\n * Settings Provider - Provides settings state and drawer controls.\n *\n * @example\n * ```tsx\n * // In your app root\n * function App() {\n * return (\n * <SettingsProvider>\n * <ThemeProvider theme={theme}>\n * <MyApp />\n * <SettingsDrawer />\n * </ThemeProvider>\n * </SettingsProvider>\n * );\n * }\n *\n * // In any component\n * function Header() {\n * const { drawer } = useSettings();\n * return <IconButton onClick={drawer.onOpen}><SettingsIcon /></IconButton>;\n * }\n * ```\n */\nexport function SettingsProvider({ children, defaultOpen = false }: SettingsProviderProps): ReactNode {\n // Drawer state\n const [open, setOpen] = useState(defaultOpen);\n\n // Get store state and actions\n const store = useSettingsStore();\n\n // Drawer controls\n const onOpen = useCallback(() => setOpen(true), []);\n const onClose = useCallback(() => setOpen(false), []);\n const onToggle = useCallback(() => setOpen((prev) => !prev), []);\n\n // Extract settings values (without actions)\n const settings: SettingsValues = useMemo(\n () => ({\n mode: store.mode,\n preset: store.preset,\n primaryColor: store.primaryColor,\n contrast: store.contrast,\n direction: store.direction,\n fontSize: store.fontSize,\n fontFamily: store.fontFamily,\n density: store.density,\n compactSidebar: store.compactSidebar,\n sidebarCollapsed: store.sidebarCollapsed,\n navLayout: store.navLayout,\n navColor: store.navColor,\n stretch: store.stretch,\n tableRowsPerPage: store.tableRowsPerPage,\n }),\n [\n store.mode,\n store.preset,\n store.primaryColor,\n store.contrast,\n store.direction,\n store.fontSize,\n store.fontFamily,\n store.density,\n store.compactSidebar,\n store.sidebarCollapsed,\n store.navLayout,\n store.navColor,\n store.stretch,\n store.tableRowsPerPage,\n ]\n );\n\n // Extract actions\n const actions = useMemo(\n () => ({\n setMode: store.setMode,\n toggleMode: store.toggleMode,\n setPreset: store.setPreset,\n setPrimaryColor: store.setPrimaryColor,\n setContrast: store.setContrast,\n setDirection: store.setDirection,\n setFontSize: store.setFontSize,\n setFontFamily: store.setFontFamily,\n setDensity: store.setDensity,\n setCompactSidebar: store.setCompactSidebar,\n setNavLayout: store.setNavLayout,\n setNavColor: store.setNavColor,\n setStretch: store.setStretch,\n updateSettings: store.updateSettings,\n reset: store.reset,\n }),\n [\n store.setMode,\n store.toggleMode,\n store.setPreset,\n store.setPrimaryColor,\n store.setContrast,\n store.setDirection,\n store.setFontSize,\n store.setFontFamily,\n store.setDensity,\n store.setCompactSidebar,\n store.setNavLayout,\n store.setNavColor,\n store.setStretch,\n store.updateSettings,\n store.reset,\n ]\n );\n\n // Context value\n const value: SettingsContextValue = useMemo(\n () => ({\n settings,\n actions,\n canReset: store.canReset(),\n drawer: { open, onOpen, onClose, onToggle },\n }),\n [settings, actions, store, open, onOpen, onClose, onToggle]\n );\n\n return <SettingsContext.Provider value={value}>{children}</SettingsContext.Provider>;\n}\n\n// =============================================================================\n// HOOKS\n// =============================================================================\n\n/**\n * Hook to access settings context.\n *\n * @returns Settings context value\n * @throws If used outside of SettingsProvider\n *\n * @example\n * ```tsx\n * function ThemeToggle() {\n * const { settings, actions } = useSettings();\n * return (\n * <Switch\n * checked={settings.mode === 'dark'}\n * onChange={() => actions.toggleMode()}\n * />\n * );\n * }\n * ```\n */\nexport function useSettings(): SettingsContextValue {\n const context = useContext(SettingsContext);\n\n if (!context) {\n throw new Error('useSettings must be used within a SettingsProvider');\n }\n\n return context;\n}\n\n/**\n * Hook to access only the drawer controls.\n *\n * @returns Drawer state and controls\n * @throws If used outside of SettingsProvider\n *\n * @example\n * ```tsx\n * function SettingsButton() {\n * const drawer = useSettingsDrawer();\n * return <IconButton onClick={drawer.onOpen}><SettingsIcon /></IconButton>;\n * }\n * ```\n */\nexport function useSettingsDrawer(): SettingsDrawerState {\n const { drawer } = useSettings();\n return drawer;\n}\n","'use client';\n\n/**\n * Settings Drawer\n *\n * UI component for managing application settings.\n * Displays configurable sections for theme, layout, and preferences.\n *\n * @module components/settings\n */\n\nimport { type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Drawer from '@mui/material/Drawer';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport Button from '@mui/material/Button';\nimport Tooltip from '@mui/material/Tooltip';\nimport Stack from '@mui/material/Stack';\nimport Switch from '@mui/material/Switch';\nimport Slider from '@mui/material/Slider';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport { alpha, useTheme } from '@mui/material/styles';\n\n// Icons - using unicode/text since we don't have icon package\nconst CloseIcon = () => <span style={{ fontSize: 20 }}>✕</span>;\nconst RefreshIcon = () => <span style={{ fontSize: 16 }}>↻</span>;\nconst SunIcon = () => <span style={{ fontSize: 18 }}>☀</span>;\nconst MoonIcon = () => <span style={{ fontSize: 18 }}>☾</span>;\n\nimport { useSettings } from './settings-provider.js';\nimport type { ComponentDensity } from '../../types/theme.js';\nimport type { NavLayout } from '../../state/stores/settings.js';\nimport { PRESET_NAMES, PRESET_DISPLAY_NAMES } from '../../theme/create-theme.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Settings drawer props.\n */\nexport interface SettingsDrawerProps {\n /** Drawer width */\n width?: number;\n /** Sections to display */\n sections?: SettingsSection[];\n}\n\n/**\n * Available settings sections.\n */\nexport type SettingsSection =\n | 'mode'\n | 'contrast'\n | 'direction'\n | 'presets'\n | 'primaryColor'\n | 'fontSize'\n | 'density'\n | 'navLayout'\n | 'stretch';\n\n// =============================================================================\n// PRESET COLORS\n// =============================================================================\n\nconst PRESET_COLORS: Record<string, string> = {\n 'default-light': '#3385F0',\n 'default-dark': '#3385F0',\n luxury: '#B8860B',\n arctic: '#1E88E5',\n nature: '#22C55E',\n ember: '#FF5F11',\n dracula: '#BD93F9',\n midnight: '#6366F1',\n retro: '#F59E0B',\n minimal: '#64748B',\n};\n\n// =============================================================================\n// SECTION COMPONENTS\n// =============================================================================\n\ninterface SectionProps {\n title: string;\n children: ReactNode;\n}\n\nfunction Section({ title, children }: SectionProps): ReactNode {\n return (\n <Box sx={{ mb: 3 }}>\n <Typography\n variant=\"caption\"\n sx={{\n display: 'block',\n mb: 1.5,\n fontWeight: 600,\n color: 'text.secondary',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n }}\n >\n {title}\n </Typography>\n {children}\n </Box>\n );\n}\n\n// =============================================================================\n// MODE SECTION\n// =============================================================================\n\nfunction ModeSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Section title=\"Mode\">\n <ToggleButtonGroup\n exclusive\n fullWidth\n value={settings.mode}\n onChange={(_, value) => value && actions.setMode(value)}\n sx={{ gap: 1 }}\n >\n <ToggleButton\n value=\"light\"\n sx={{\n flex: 1,\n py: 1.5,\n gap: 1,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n <SunIcon /> Light\n </ToggleButton>\n <ToggleButton\n value=\"dark\"\n sx={{\n flex: 1,\n py: 1.5,\n gap: 1,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n <MoonIcon /> Dark\n </ToggleButton>\n </ToggleButtonGroup>\n </Section>\n );\n}\n\n// =============================================================================\n// CONTRAST SECTION\n// =============================================================================\n\nfunction ContrastSection(): ReactNode {\n const { settings, actions } = useSettings();\n\n return (\n <Section title=\"Contrast\">\n <FormControlLabel\n control={\n <Switch\n checked={settings.contrast === 'high'}\n onChange={(e) => actions.setContrast(e.target.checked ? 'high' : 'default')}\n />\n }\n label=\"High Contrast\"\n sx={{ ml: 0 }}\n />\n </Section>\n );\n}\n\n// =============================================================================\n// DIRECTION SECTION\n// =============================================================================\n\nfunction DirectionSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Section title=\"Direction\">\n <ToggleButtonGroup\n exclusive\n fullWidth\n value={settings.direction}\n onChange={(_, value) => value && actions.setDirection(value)}\n sx={{ gap: 1 }}\n >\n <ToggleButton\n value=\"ltr\"\n sx={{\n flex: 1,\n py: 1,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n LTR\n </ToggleButton>\n <ToggleButton\n value=\"rtl\"\n sx={{\n flex: 1,\n py: 1,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n RTL\n </ToggleButton>\n </ToggleButtonGroup>\n </Section>\n );\n}\n\n// =============================================================================\n// PRESETS SECTION\n// =============================================================================\n\nfunction PresetsSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Section title=\"Presets\">\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: 'repeat(5, 1fr)',\n gap: 1.5,\n }}\n >\n {PRESET_NAMES.map((preset) => {\n const isSelected = settings.preset === preset;\n const color = PRESET_COLORS[preset] || '#666';\n\n return (\n <Tooltip key={preset} title={PRESET_DISPLAY_NAMES[preset]} placement=\"top\">\n <Box\n onClick={() => actions.setPreset(preset)}\n sx={{\n width: 40,\n height: 40,\n borderRadius: '50%',\n bgcolor: color,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: isSelected ? `3px solid ${theme.palette.text.primary}` : '3px solid transparent',\n boxShadow: isSelected ? `0 0 0 2px ${color}` : 'none',\n transition: 'all 0.2s',\n '&:hover': {\n transform: 'scale(1.1)',\n },\n }}\n >\n {isSelected && (\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: 'white',\n }}\n />\n )}\n </Box>\n </Tooltip>\n );\n })}\n </Box>\n </Section>\n );\n}\n\n// =============================================================================\n// PRIMARY COLOR SECTION\n// =============================================================================\n\nconst COLOR_OPTIONS = [\n { label: 'Blue', value: '#3385F0' },\n { label: 'Green', value: '#22C55E' },\n { label: 'Purple', value: '#8B5CF6' },\n { label: 'Red', value: '#EF4444' },\n { label: 'Orange', value: '#F97316' },\n { label: 'Cyan', value: '#06B6D4' },\n { label: 'Pink', value: '#EC4899' },\n { label: 'Amber', value: '#F59E0B' },\n];\n\nfunction PrimaryColorSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Section title=\"Primary Color\">\n <Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap' }}>\n {COLOR_OPTIONS.map((option) => {\n const isSelected = settings.primaryColor === option.value;\n\n return (\n <Tooltip key={option.value} title={option.label} placement=\"top\">\n <Box\n onClick={() => actions.setPrimaryColor(option.value)}\n sx={{\n width: 32,\n height: 32,\n borderRadius: '50%',\n bgcolor: option.value,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: isSelected ? `2px solid ${theme.palette.text.primary}` : '2px solid transparent',\n transition: 'transform 0.2s',\n '&:hover': {\n transform: 'scale(1.15)',\n },\n }}\n >\n {isSelected && (\n <Box\n sx={{\n width: 6,\n height: 6,\n borderRadius: '50%',\n bgcolor: 'white',\n }}\n />\n )}\n </Box>\n </Tooltip>\n );\n })}\n {settings.primaryColor && (\n <Tooltip title=\"Reset to default\" placement=\"top\">\n <Box\n onClick={() => actions.setPrimaryColor(null)}\n sx={{\n width: 32,\n height: 32,\n borderRadius: '50%',\n border: `1px dashed ${theme.palette.divider}`,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'text.secondary',\n fontSize: 14,\n '&:hover': {\n borderColor: theme.palette.text.primary,\n },\n }}\n >\n <RefreshIcon />\n </Box>\n </Tooltip>\n )}\n </Box>\n </Section>\n );\n}\n\n// =============================================================================\n// FONT SIZE SECTION\n// =============================================================================\n\nfunction FontSizeSection(): ReactNode {\n const { settings, actions } = useSettings();\n\n return (\n <Section title=\"Font Size\">\n <Stack direction=\"row\" spacing={2} sx={{\n alignItems: \"center\"\n }}>\n <Typography variant=\"body2\" sx={{ minWidth: 24, color: 'text.secondary' }}>\n A\n </Typography>\n <Slider\n min={14}\n max={18}\n step={1}\n value={settings.fontSize}\n onChange={(_, value) => actions.setFontSize(value as number)}\n valueLabelDisplay=\"auto\"\n marks\n sx={{ flex: 1 }}\n />\n <Typography variant=\"body1\" sx={{ minWidth: 24, fontWeight: 600 }}>\n A\n </Typography>\n </Stack>\n </Section>\n );\n}\n\n// =============================================================================\n// DENSITY SECTION\n// =============================================================================\n\nfunction DensitySection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n const densityOptions: { value: ComponentDensity; label: string }[] = [\n { value: 'compact', label: 'Compact' },\n { value: 'standard', label: 'Standard' },\n { value: 'comfortable', label: 'Comfortable' },\n ];\n\n return (\n <Section title=\"Density\">\n <ToggleButtonGroup\n exclusive\n fullWidth\n value={settings.density}\n onChange={(_, value) => value && actions.setDensity(value)}\n sx={{ gap: 1 }}\n >\n {densityOptions.map((option) => (\n <ToggleButton\n key={option.value}\n value={option.value}\n sx={{\n flex: 1,\n py: 1,\n fontSize: '0.75rem',\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n {option.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n </Section>\n );\n}\n\n// =============================================================================\n// NAV LAYOUT SECTION\n// =============================================================================\n\nfunction NavLayoutSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n const layoutOptions: { value: NavLayout; label: string; icon: string }[] = [\n { value: 'vertical', label: 'Vertical', icon: '▌' },\n { value: 'horizontal', label: 'Horizontal', icon: '▬' },\n { value: 'mini', label: 'Mini', icon: '│' },\n ];\n\n return (\n <Section title=\"Navigation Layout\">\n <Box sx={{ display: 'flex', gap: 1.5 }}>\n {layoutOptions.map((option) => {\n const isSelected = settings.navLayout === option.value;\n\n return (\n <Box\n key={option.value}\n onClick={() => actions.setNavLayout(option.value)}\n sx={{\n flex: 1,\n py: 2,\n px: 1,\n borderRadius: 1,\n cursor: 'pointer',\n textAlign: 'center',\n border: `1px solid ${isSelected ? theme.palette.primary.main : theme.palette.divider}`,\n bgcolor: isSelected ? alpha(theme.palette.primary.main, 0.08) : 'transparent',\n transition: 'all 0.2s',\n '&:hover': {\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n <Typography sx={{ fontSize: 24, mb: 0.5, lineHeight: 1 }}>{option.icon}</Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {option.label}\n </Typography>\n </Box>\n );\n })}\n </Box>\n </Section>\n );\n}\n\n// =============================================================================\n// STRETCH SECTION\n// =============================================================================\n\nfunction StretchSection(): ReactNode {\n const { settings, actions } = useSettings();\n\n return (\n <Section title=\"Layout\">\n <FormControlLabel\n control={<Switch checked={settings.stretch} onChange={(e) => actions.setStretch(e.target.checked)} />}\n label=\"Stretch to full width\"\n sx={{ ml: 0 }}\n />\n </Section>\n );\n}\n\n// =============================================================================\n// SECTION MAP\n// =============================================================================\n\nconst SECTION_COMPONENTS: Record<SettingsSection, () => ReactNode> = {\n mode: ModeSection,\n contrast: ContrastSection,\n direction: DirectionSection,\n presets: PresetsSection,\n primaryColor: PrimaryColorSection,\n fontSize: FontSizeSection,\n density: DensitySection,\n navLayout: NavLayoutSection,\n stretch: StretchSection,\n};\n\nconst DEFAULT_SECTIONS: SettingsSection[] = ['mode', 'presets', 'primaryColor', 'density', 'navLayout', 'stretch'];\n\n// =============================================================================\n// SETTINGS DRAWER\n// =============================================================================\n\n/**\n * Settings Drawer - Configurable settings panel.\n *\n * @example\n * ```tsx\n * // Basic usage - must be inside SettingsProvider\n * <SettingsDrawer />\n *\n * // With custom sections\n * <SettingsDrawer\n * sections={['mode', 'presets', 'primaryColor']}\n * width={320}\n * />\n * ```\n */\nexport function SettingsDrawer({ width = 300, sections = DEFAULT_SECTIONS }: SettingsDrawerProps): ReactNode {\n const { drawer, canReset, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Drawer\n anchor=\"right\"\n open={drawer.open}\n onClose={drawer.onClose}\n slotProps={{\n paper: {\n sx: {\n width,\n backgroundImage: 'none',\n },\n }\n }}\n >\n {/* Header */}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n p: 2,\n borderBottom: `1px solid ${theme.palette.divider}`,\n }}\n >\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n Settings\n </Typography>\n <Stack direction=\"row\" spacing={0.5}>\n {canReset && (\n <Tooltip title=\"Reset to defaults\">\n <IconButton size=\"small\" onClick={actions.reset} aria-label=\"Reset settings to defaults\">\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n )}\n <IconButton size=\"small\" onClick={drawer.onClose} aria-label=\"Close settings\">\n <CloseIcon />\n </IconButton>\n </Stack>\n </Box>\n {/* Content */}\n <Box sx={{ p: 2.5, flex: 1, overflowY: 'auto' }}>\n {sections.map((section) => {\n const SectionComponent = SECTION_COMPONENTS[section];\n return SectionComponent ? <SectionComponent key={section} /> : null;\n })}\n </Box>\n {/* Footer */}\n <Box sx={{ p: 2, borderTop: `1px solid ${theme.palette.divider}` }}>\n <Button fullWidth variant=\"soft\" color=\"primary\" onClick={drawer.onClose}>\n Close\n </Button>\n </Box>\n </Drawer>\n );\n}\n","'use client';\n\n/**\n * Tooltip Component\n *\n * Enhanced tooltip with custom styling and arrow support.\n *\n * @module components/tooltip\n */\n\nimport type { ReactNode, ReactElement } from 'react';\nimport MuiTooltip from '@mui/material/Tooltip';\nimport type { TooltipProps as MuiTooltipProps } from '@mui/material/Tooltip';\n\n/**\n * Props for Tooltip component.\n */\nexport interface TooltipProps extends Omit<MuiTooltipProps, 'children'> {\n /** Tooltip content */\n title: ReactNode;\n /** Element to attach tooltip to */\n children: ReactElement;\n /** Show arrow */\n arrow?: boolean;\n /** Tooltip placement */\n placement?: MuiTooltipProps['placement'];\n /** Max width */\n maxWidth?: number | string;\n}\n\n/**\n * Tooltip - Enhanced tooltip with custom styling.\n *\n * @example\n * ```tsx\n * <Tooltip title=\"Delete item\" placement=\"top\">\n * <IconButton>\n * <DeleteIcon />\n * </IconButton>\n * </Tooltip>\n * ```\n */\nexport function Tooltip({\n title,\n children,\n arrow = true,\n placement = 'top',\n maxWidth = 300,\n ...other\n}: TooltipProps): ReactNode {\n if (!title) {\n return children;\n }\n\n return (\n <MuiTooltip\n title={title}\n arrow={arrow}\n placement={placement}\n slotProps={{\n tooltip: {\n sx: {\n maxWidth,\n },\n },\n ...other.slotProps,\n }}\n {...other}\n >\n {children}\n </MuiTooltip>\n );\n}\n","'use client';\n\n/**\n * Alert Component\n *\n * Enhanced alert with custom styling and variants.\n *\n * @module components/alert\n */\n\nimport { useEffect, useRef, type ReactNode, type Ref } from 'react';\nimport MuiAlert, { type AlertProps as MuiAlertProps } from '@mui/material/Alert';\nimport AlertTitle from '@mui/material/AlertTitle';\nimport { alpha } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { useForkRef } from '@mui/material/utils';\n\n/**\n * Every alert here takes `ref` and passes whatever else it is given to the\n * MUI root — the library's convention (see `Card`, `Avatar`, `Label`).\n *\n * These three did not, and it was measured on 2026-09-22: `Grow`, `Fade`,\n * `Zoom` and `Slide` hold their child by ref and animate it through\n * `style`, so a `<Snackbar>` (whose transition is `Grow`) around one of these\n * found no node and threw from inside MUI's `reflow` — «Cannot read\n * properties of null (reading 'scrollTop')» — taking the whole page down. The\n * console's Topology page died that way on every failed fetch. A `Tooltip`\n * around one fails quietly instead: it injects its handlers into props that\n * were thrown away.\n */\ntype MuiAlertRest<Own> = Omit<MuiAlertProps, keyof Own | 'ref'>;\n\n/** `sx` in every form MUI accepts — object, function or array — after ours. */\nfunction mergeSx(own: SxProps<Theme>, sx: SxProps<Theme> | undefined): SxProps<Theme> {\n return [own, ...(Array.isArray(sx) ? sx : sx ? [sx] : [])] as SxProps<Theme>;\n}\n\n/**\n * Alert severity levels.\n */\nexport type AlertSeverity = 'success' | 'info' | 'warning' | 'error';\n\n/**\n * Alert variants.\n */\nexport type AlertVariant = 'standard' | 'filled' | 'outlined' | 'soft';\n\n/**\n * Props for Alert component.\n */\ninterface AlertOwnProps {\n /** Alert severity */\n severity?: AlertSeverity;\n /** Alert variant */\n variant?: AlertVariant;\n /** Alert title */\n title?: ReactNode;\n /** Alert content */\n children?: ReactNode;\n /** On close handler */\n onClose?: () => void;\n /** Show close button */\n closable?: boolean;\n /** Custom icon */\n icon?: ReactNode | false;\n /** Custom action */\n action?: ReactNode;\n /** Custom sx props */\n sx?: SxProps<Theme>;\n}\n\nexport type AlertProps = AlertOwnProps & MuiAlertRest<AlertOwnProps> & { ref?: Ref<HTMLDivElement> };\n\n/**\n * Alert - Enhanced alert with custom styling.\n *\n * @example\n * ```tsx\n * <Alert severity=\"success\" title=\"Success!\">\n * Your changes have been saved.\n * </Alert>\n *\n * <Alert severity=\"error\" variant=\"filled\" closable onClose={() => {}}>\n * An error occurred.\n * </Alert>\n * ```\n */\nexport function Alert({\n severity = 'info',\n variant = 'standard',\n title,\n children,\n onClose,\n closable = false,\n icon,\n action,\n sx,\n ref,\n ...other\n}: AlertProps): ReactNode {\n // Map 'soft' variant to 'standard' with custom styling\n const muiVariant = variant === 'soft' ? 'standard' : variant;\n\n return (\n <MuiAlert\n ref={ref}\n {...other}\n severity={severity}\n variant={muiVariant}\n onClose={closable ? onClose : undefined}\n icon={icon}\n action={action}\n sx={mergeSx(\n variant === 'soft'\n ? {\n backgroundColor: (theme) =>\n alpha(theme.palette[severity].main, theme.palette.mode === 'light' ? 0.12 : 0.16),\n color: (theme) =>\n theme.palette.mode === 'light' ? theme.palette[severity].dark : theme.palette[severity].light,\n '& .MuiAlert-icon': {\n color: 'inherit',\n },\n }\n : {},\n sx,\n )}\n >\n {title && <AlertTitle>{title}</AlertTitle>}\n {children}\n </MuiAlert>\n );\n}\n\n/**\n * Props for InlineAlert component.\n */\ninterface InlineAlertOwnProps {\n /** Alert severity */\n severity?: AlertSeverity;\n /** Alert message */\n message: ReactNode;\n /** Icon to display */\n icon?: ReactNode;\n}\n\nexport type InlineAlertProps = InlineAlertOwnProps &\n MuiAlertRest<InlineAlertOwnProps> & { ref?: Ref<HTMLDivElement> };\n\n/**\n * InlineAlert - Compact inline alert for form feedback.\n *\n * @example\n * ```tsx\n * <InlineAlert severity=\"error\" message=\"This field is required\" />\n * ```\n */\nexport function InlineAlert({ severity = 'info', message, icon, sx, ref, ...other }: InlineAlertProps): ReactNode {\n return (\n <MuiAlert\n ref={ref}\n {...other}\n severity={severity}\n icon={icon}\n sx={mergeSx(\n {\n py: 0,\n px: 1,\n '& .MuiAlert-message': {\n py: 0.5,\n },\n },\n sx,\n )}\n >\n {message}\n </MuiAlert>\n );\n}\n\n/**\n * Props for FormAlert component.\n */\ninterface FormAlertOwnProps {\n /** Severity — defaults to 'error' since this primitive is most\n * commonly used to surface form submission failures. */\n severity?: AlertSeverity;\n /** Optional heading rendered above the message. Use for a short\n * categorisation (\"Couldn't save\") when the message body is a\n * detailed reason. */\n title?: ReactNode;\n /** The alert body. Pass `null` to keep the slot rendered but\n * empty — useful for conditional rendering without unmounting. */\n children?: ReactNode;\n /** Renders a close (x) icon button when provided. Should clear the\n * underlying error state in the parent. */\n onClose?: () => void;\n /** When true, scroll the alert into view on mount so the user\n * sees it even if the dialog content has been scrolled away from\n * the top. Default: true. */\n autoScroll?: boolean;\n /** Custom sx overrides for niche layouts. */\n sx?: SxProps<Theme>;\n}\n\nexport type FormAlertProps = FormAlertOwnProps & MuiAlertRest<FormAlertOwnProps> & { ref?: Ref<HTMLDivElement> };\n\n/**\n * FormAlert — the platform's canonical surface for **form-level**\n * errors inside dialogs and inline forms.\n *\n * UX policy (see CLAUDE.md \"Error UX\"):\n *\n * Form submission failure → `<FormAlert>` at the top of the form\n * Background / cross-cutting event → `toast`\n *\n * Why a dedicated primitive vs. plain `<Alert>`:\n *\n * - `role=\"alert\"` + `aria-live=\"assertive\"` so screen readers\n * immediately announce the message, not just visually-sighted\n * users.\n * - Auto-scrolls into view on mount — a form often has fields\n * below the fold; surfacing an error you can't see is a dark\n * pattern. (Disable with `autoScroll={false}` if your dialog\n * manages focus differently.)\n * - Sensible defaults: `severity='error'`, top margin baked in so\n * it sits naturally above the first field, `flex-start`\n * alignment so multi-line messages don't push the close button\n * out of place.\n *\n * @example\n * ```tsx\n * const [error, setError] = useState<string | null>(null);\n *\n * <DialogContent>\n * {error && <FormAlert onClose={() => setError(null)}>{error}</FormAlert>}\n * <TextField ... />\n * </DialogContent>\n * ```\n */\nexport function FormAlert({\n severity = 'error',\n title,\n children,\n onClose,\n autoScroll = true,\n sx,\n ref: outerRef,\n ...other\n}: FormAlertProps): ReactNode {\n const ref = useRef<HTMLDivElement>(null);\n // Its own ref (to scroll into view) and the caller's (a transition, a\n // tooltip) are the same node — both have to reach it.\n const handleRef = useForkRef(ref, outerRef);\n\n useEffect(() => {\n if (!autoScroll) return undefined;\n // Schedule after paint so we measure the alert in its final\n // position. `nearest` keeps the dialog stable instead of\n // jumping to the very top, which would feel jarring if the\n // alert is already visible.\n const id = requestAnimationFrame(() => {\n ref.current?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n });\n return () => cancelAnimationFrame(id);\n }, [autoScroll]);\n\n return (\n <MuiAlert\n ref={handleRef}\n {...other}\n severity={severity}\n onClose={onClose}\n // role/aria-live are normally set by MUI based on severity, but\n // form-level surfacing of submission errors warrants assertive\n // announcement regardless of severity. aria-atomic ensures the\n // whole alert is read together (title + body), not piecewise.\n role=\"alert\"\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n sx={mergeSx(\n {\n alignItems: 'flex-start',\n mb: 2,\n },\n sx,\n )}\n >\n {title && <AlertTitle sx={{ mb: 0.5 }}>{title}</AlertTitle>}\n {children}\n </MuiAlert>\n );\n}\n","'use client';\n\n/**\n * Custom Breadcrumbs Component\n *\n * Full-featured navigation breadcrumbs with heading, back link, action slot,\n * and more links section. Adapted from minimal-vite-ts patterns.\n *\n * @module components/breadcrumbs\n */\n\nimport type { ReactNode, ElementType } from 'react';\nimport { styled } from '@mui/material/styles';\nimport MuiBreadcrumbs from '@mui/material/Breadcrumbs';\nimport Link from '@mui/material/Link';\nimport SvgIcon from '@mui/material/SvgIcon';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport type { BreadcrumbsProps as MuiBreadcrumbsProps } from '@mui/material/Breadcrumbs';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/** Individual breadcrumb link definition. */\nexport interface BreadcrumbLinkProps {\n /** Link label */\n name?: string;\n /** Link href */\n href?: string;\n /** Link icon */\n icon?: ReactNode;\n /** Whether the link is disabled */\n disabled?: boolean;\n}\n\n/** Props for the MoreLinks sub-component. */\nexport interface MoreLinksProps extends React.ComponentProps<'ul'> {\n /** Array of external link URLs */\n links?: string[];\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n}\n\n/** Slot props for customizing sub-components. */\nexport interface BreadcrumbsSlotProps {\n breadcrumbs?: Partial<MuiBreadcrumbsProps>;\n heading?: React.ComponentProps<'h6'>;\n content?: React.ComponentProps<'div'>;\n container?: React.ComponentProps<'div'>;\n moreLinks?: Omit<MoreLinksProps, 'links'>;\n}\n\n/** Custom slot overrides. */\nexport interface BreadcrumbsSlots {\n /** Override the entire breadcrumbs section */\n breadcrumbs?: ReactNode;\n}\n\n/** Props for the Breadcrumbs component. */\nexport interface BreadcrumbsProps extends React.ComponentProps<'div'> {\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Page heading displayed above breadcrumbs */\n heading?: string;\n /** Keep the last breadcrumb link active (clickable) */\n activeLast?: boolean;\n /** Back navigation href — displays arrow icon before heading */\n backHref?: string;\n /** Action element rendered on the right side */\n action?: ReactNode;\n /** Breadcrumb link items */\n links?: BreadcrumbLinkProps[];\n /** External reference links displayed below breadcrumbs */\n moreLinks?: string[];\n /**\n * Custom link component for client-side routing (e.g. react-router's Link).\n * The component receives `to` (from href) and `children` props.\n * When provided, breadcrumb links use this instead of native `<a>` tags.\n */\n linkComponent?: ElementType;\n /** Slot overrides */\n slots?: BreadcrumbsSlots;\n /** Slot prop overrides */\n slotProps?: Partial<BreadcrumbsSlotProps>;\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst BreadcrumbsRoot = styled('div')(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n}));\n\nconst BreadcrumbsHeading = styled('h6')(({ theme }) => ({\n ...theme.typography.h4,\n margin: 0,\n padding: 0,\n display: 'inline-flex',\n}));\n\nconst BreadcrumbsContainer = styled('div')(({ theme }) => ({\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing(2),\n alignItems: 'flex-start',\n justifyContent: 'flex-end',\n}));\n\nconst BreadcrumbsContent = styled('div')(({ theme }) => ({\n display: 'flex',\n flex: '1 1 auto',\n gap: theme.spacing(2),\n flexDirection: 'column',\n}));\n\nconst BreadcrumbsSeparator = styled('span')(({ theme }) => ({\n width: 4,\n height: 4,\n borderRadius: '50%',\n backgroundColor: theme.palette.text.disabled,\n}));\n\n/**\n * Breadcrumb item base. Three visual states:\n *\n * - `clickable` (default — link with `href`) → `text.secondary`\n * so the user can distinguish \"I can navigate here\" from\n * \"you are here\" at rest, not just on hover. Pre-fix every\n * item rendered in `text.primary` and the only differentiator\n * was the link underline, which appears only on hover.\n *\n * - `disabled` (terminal / current page — the last link by\n * default) → `text.primary` and `fontWeight: 600`. The current\n * location should be the MOST prominent crumb in the trail;\n * the prior styling greyed it out, which read as \"this item is\n * unavailable\" instead of \"this is where you are\".\n */\nconst ItemRoot = styled('div', {\n shouldForwardProp: (prop: string) => prop !== 'disabled',\n})<{ disabled?: boolean }>(({ disabled, theme }) => ({\n ...theme.typography.body2,\n alignItems: 'center',\n gap: theme.spacing(0.5),\n display: 'inline-flex',\n color: theme.palette.text.secondary,\n ...(disabled && {\n cursor: 'default',\n pointerEvents: 'none',\n color: theme.palette.text.primary,\n fontWeight: 600,\n }),\n}));\n\nconst ItemIcon = styled('span')({\n display: 'inherit',\n // Constrain the icon (first real child) to 20×20. The previous\n // selector chain `:first-of-type:not(style):not(:first-of-type ~ *)`\n // was an obscure way to say \"the first child that isn't a <style>\n // tag\" — replaced with the modern `:first-child:not(style)` for\n // both readability and v9 lint compliance.\n '& > :first-child:not(style)': {\n width: 20,\n height: 20,\n },\n});\n\nconst MoreLinksRoot = styled('ul')({\n display: 'flex',\n flexDirection: 'column',\n '& > li': { display: 'flex' },\n});\n\n// =============================================================================\n// ARROW BACK ICON\n// =============================================================================\n\nfunction ArrowBackIcon() {\n return (\n <SvgIcon sx={{ fontSize: 18 }}>\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </SvgIcon>\n );\n}\n\n// =============================================================================\n// SUB-COMPONENTS\n// =============================================================================\n\n/** Back link with arrow icon for navigation. */\nfunction BackLink({\n href,\n label,\n sx,\n linkComponent,\n}: {\n href: string;\n label?: string;\n sx?: SxProps<Theme>;\n linkComponent?: ElementType;\n}) {\n const linkProps = linkComponent ? { component: linkComponent, to: href } : { href };\n\n return (\n <Link\n color=\"inherit\"\n underline=\"none\"\n sx={[\n (theme) => ({\n verticalAlign: 'middle',\n display: 'inline-flex',\n alignItems: 'center',\n '& .PrismBackLinkIcon': {\n verticalAlign: 'inherit',\n transform: 'translateY(-1px)',\n ml: { xs: '-14px', md: '-18px' },\n transition: theme.transitions.create('opacity', {\n duration: theme.transitions.duration.shorter,\n }),\n },\n '&:hover .PrismBackLinkIcon': { opacity: 0.48 },\n }),\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...linkProps}\n >\n <span className=\"PrismBackLinkIcon\">\n <ArrowBackIcon />\n </span>\n {label}\n </Link>\n );\n}\n\n/** Individual breadcrumb link with optional icon. */\nfunction BreadcrumbLink({\n href,\n icon,\n name,\n disabled,\n linkComponent,\n}: BreadcrumbLinkProps & { linkComponent?: ElementType }) {\n const content = (\n <ItemRoot disabled={disabled}>\n {icon && <ItemIcon>{icon}</ItemIcon>}\n {name}\n </ItemRoot>\n );\n\n if (href && !disabled) {\n const linkProps = linkComponent ? { component: linkComponent, to: href } : { href };\n\n return (\n <Link color=\"inherit\" sx={{ display: 'inline-flex' }} {...linkProps}>\n {content}\n </Link>\n );\n }\n\n return content;\n}\n\n/**\n * Schemes an external reference link may use.\n *\n * `moreLinks` takes raw strings and renders them as anchors. If any consumer\n * ever feeds it a value that originated server-side, `javascript:` and\n * `data:` URLs become script execution on click. The component cannot know\n * where its strings came from, so it refuses the dangerous ones outright —\n * a library should be safe by default, not safe when used carefully.\n */\nconst SAFE_LINK_SCHEMES = new Set(['http:', 'https:', 'mailto:', 'tel:']);\n\nfunction isSafeExternalLink(href: string): boolean {\n const trimmed = href.trim();\n // Relative and protocol-relative URLs carry no scheme of their own.\n if (trimmed.startsWith('/') || trimmed.startsWith('#')) return true;\n try {\n return SAFE_LINK_SCHEMES.has(new URL(trimmed, 'https://placeholder.invalid').protocol);\n } catch {\n return false;\n }\n}\n\n/** List of external reference links. */\nfunction MoreLinks({ links, sx, ...other }: MoreLinksProps) {\n return (\n <MoreLinksRoot sx={sx} {...other}>\n {links?.filter(isSafeExternalLink).map((href) => (\n <li key={href}>\n <Link href={href} variant=\"body2\" target=\"_blank\" rel=\"noopener noreferrer\">\n {href}\n </Link>\n </li>\n ))}\n </MoreLinksRoot>\n );\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * Breadcrumbs - Full-featured navigation breadcrumbs with heading, back link,\n * action slot, and more links section.\n *\n * @example\n * ```tsx\n * // Simple usage\n * <Breadcrumbs\n * heading=\"Product List\"\n * links={[\n * { name: 'Home', href: '/' },\n * { name: 'Products', href: '/products' },\n * { name: 'Electronics' },\n * ]}\n * />\n *\n * // With back link and action\n * <Breadcrumbs\n * heading=\"Edit Product\"\n * backHref=\"/products\"\n * action={<Button variant=\"contained\">Save</Button>}\n * links={[\n * { name: 'Home', href: '/' },\n * { name: 'Products', href: '/products' },\n * { name: 'Edit' },\n * ]}\n * />\n * ```\n */\nexport function Breadcrumbs({\n sx,\n action,\n backHref,\n heading,\n slots = {},\n links = [],\n moreLinks = [],\n slotProps = {},\n activeLast = false,\n linkComponent,\n ...other\n}: BreadcrumbsProps): ReactNode {\n const lastLink = links[links.length - 1]?.name;\n\n const renderHeading = () => (\n <BreadcrumbsHeading {...slotProps?.heading}>\n {backHref ? <BackLink href={backHref} label={heading} linkComponent={linkComponent} /> : heading}\n </BreadcrumbsHeading>\n );\n\n const renderLinks = () =>\n slots?.breadcrumbs ?? (\n <MuiBreadcrumbs separator={<BreadcrumbsSeparator />} {...slotProps?.breadcrumbs}>\n {links.map((link, index) => (\n <BreadcrumbLink\n key={link.name ?? index}\n icon={link.icon}\n href={link.href}\n name={link.name}\n disabled={link.name === lastLink && !activeLast}\n linkComponent={linkComponent}\n />\n ))}\n </MuiBreadcrumbs>\n );\n\n const renderMoreLinks = () => <MoreLinks links={moreLinks} {...slotProps?.moreLinks} />;\n\n return (\n <BreadcrumbsRoot sx={sx} {...other}>\n <BreadcrumbsContainer {...slotProps?.container}>\n <BreadcrumbsContent {...slotProps?.content}>\n {(heading || backHref) && renderHeading()}\n {(!!links.length || slots?.breadcrumbs) && renderLinks()}\n </BreadcrumbsContent>\n {action}\n </BreadcrumbsContainer>\n\n {!!moreLinks?.length && renderMoreLinks()}\n </BreadcrumbsRoot>\n );\n}\n","'use client';\n\n/**\n * Nav Card\n *\n * Horizontal navigation tile used on admin/dashboard overview pages:\n * colored icon on the left, title + description in the middle, and a\n * trailing chevron on the right. Renders as a router link when `to`\n * is supplied, otherwise as a button-like Card with `onClick`.\n *\n * Equal-height rows are guaranteed by `height: 100%` — pair the card\n * with a `<Grid container>` whose items share the same column span.\n *\n * @module components/nav-card\n */\n\nimport type { ElementType, ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Chip from '@mui/material/Chip';\nimport Typography from '@mui/material/Typography';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport { alpha, type SxProps, type Theme } from '@mui/material/styles';\n\nexport interface NavCardProps {\n /** Card title (rendered as subtitle1, weight 600). */\n title: ReactNode;\n /** Secondary line below the title. */\n description?: ReactNode;\n /** Icon element rendered inside a colored square on the left. */\n icon?: ReactNode;\n /**\n * `'horizontal'` (default) — icon left, text right; works well in\n * 2-column rows (`md: 6`) where each card is wide.\n * `'vertical'` — icon top, text below; required when the card lives\n * in 4-column rows (`md: 3`) or narrower, because the horizontal\n * variant runs out of room for the text and starts breaking letters.\n * Pick orientation per row, not per card.\n */\n orientation?: 'horizontal' | 'vertical';\n /**\n * Palette key for the icon background (e.g. `'primary'`, `'error'`,\n * `'warning.dark'`). Defaults to `'primary'`. The hover border picks\n * up the same color.\n */\n color?: string;\n /**\n * Optional counter shown as a small chip next to the title. Falsy\n * values (`0`, `undefined`, `null`) hide the chip.\n */\n badge?: number | string | null;\n /** Palette key for the badge chip (defaults to `'warning'`). */\n badgeColor?: 'default' | 'primary' | 'secondary' | 'error' | 'info' | 'success' | 'warning';\n /**\n * Navigate to this route. When set, the card renders as the\n * supplied `linkComponent` (e.g. `RouterLink` from react-router) and\n * the whole card becomes a real anchor — Cmd/Ctrl-click opens a new\n * tab, screen readers expose link semantics.\n */\n to?: string;\n /** Custom router link component. Required when `to` is used. */\n linkComponent?: ElementType;\n /** Click handler — used when `to` is not supplied. */\n onClick?: () => void;\n /**\n * Trailing chevron. Pass `false` to suppress, or a ReactNode to\n * substitute (e.g. a status indicator). Default `true`.\n */\n arrow?: boolean | ReactNode;\n /** Square icon size in pixels (default 48). */\n iconSize?: number;\n /** Extra styles applied to the outer Card. */\n sx?: SxProps<Theme>;\n /** Accessible label override. Defaults to `${title} — ${description}`. */\n ariaLabel?: string;\n}\n\nexport function NavCard({\n title,\n description,\n icon,\n color = 'primary',\n badge,\n badgeColor = 'warning',\n orientation = 'horizontal',\n to,\n linkComponent,\n onClick,\n arrow = true,\n iconSize = 48,\n sx,\n ariaLabel,\n}: NavCardProps) {\n const interactive = Boolean(to) || Boolean(onClick);\n const linkProps = to && linkComponent ? { component: linkComponent, to } : {};\n\n const showBadge =\n badge !== undefined && badge !== null && badge !== '' && !(typeof badge === 'number' && badge === 0);\n\n const label =\n ariaLabel ??\n (typeof title === 'string' && typeof description === 'string' ? `${title} — ${description}` : undefined);\n\n const isVertical = orientation === 'vertical';\n\n return (\n <Card\n variant=\"outlined\"\n {...linkProps}\n onClick={!to ? onClick : undefined}\n aria-label={label}\n role={interactive && !to ? 'button' : undefined}\n tabIndex={interactive && !to ? 0 : undefined}\n onKeyDown={\n interactive && !to\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n sx={{\n height: '100%',\n cursor: interactive ? 'pointer' : 'default',\n textDecoration: 'none',\n color: 'inherit',\n // Explicit elevated paper background so the card pops on both\n // light and dark themes — the default `background.paper` is\n // very close to the page background in some dark presets,\n // which made the 1px border read as a faint vertical line\n // rather than a card outline. Falls back gracefully when a\n // theme doesn't define `elevation1`.\n bgcolor: (theme) =>\n theme.palette.background?.elevation2 ??\n theme.palette.background?.neutral ??\n theme.palette.background.paper,\n // On dark themes the default outlined-Paper border (alpha\n // 0.16 on grey) is too close to both the page bg and the\n // card body — the right edge of each card ends up reading\n // as a free-floating vertical line. Use `text.primary` at\n // a small alpha so the border is unambiguously a card edge\n // regardless of theme contrast, then let hover swap to the\n // accent colour for tactile feedback.\n borderColor: (theme) =>\n alpha(theme.palette.text.primary, theme.palette.mode === 'dark' ? 0.16 : 0.12),\n // Suppress the theme-level Card box-shadow halo for the\n // outlined variant — replicates prism's `Card` wrapper logic\n // so a raw MuiCard (which NavCard uses to be a real anchor)\n // doesn't get a glow that swallows the border.\n boxShadow: 'none',\n transition: 'border-color 0.2s, transform 0.2s, background-color 0.2s',\n '&:hover': interactive\n ? {\n borderColor: `${color}.main`,\n transform: 'translateY(-2px)',\n bgcolor: (theme) =>\n theme.palette.background?.elevation2 ??\n theme.palette.background?.elevation1 ??\n theme.palette.background.paper,\n }\n : undefined,\n '&:focus-visible': {\n outline: 2,\n outlineColor: `${color}.main`,\n outlineOffset: 2,\n },\n ...sx,\n }}\n >\n <CardContent\n sx={{\n p: isVertical ? 2.5 : 3,\n '&:last-child': { pb: isVertical ? 2.5 : 3 },\n height: '100%',\n display: 'flex',\n flexDirection: isVertical ? 'column' : 'row',\n alignItems: isVertical ? 'stretch' : 'center',\n gap: isVertical ? 1.25 : 0,\n }}\n >\n {isVertical ? (\n // Vertical: icon top, title + description stacked below, no\n // chevron (the entire card is the affordance — adding an\n // arrow into a narrow tile just steals text space).\n (<>\n {icon && (\n <Box\n sx={{\n width: 40,\n height: 40,\n borderRadius: 1.5,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: `${color}.main`,\n color: `${color}.contrastText`,\n flexShrink: 0,\n }}\n >\n {icon}\n </Box>\n )}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' }}>\n <Typography\n variant=\"subtitle1\"\n sx={{\n fontWeight: 600,\n lineHeight: 1.2\n }}>\n {title}\n </Typography>\n {showBadge && (\n <Chip\n size=\"small\"\n label={badge}\n color={badgeColor}\n sx={{ height: 20, fontSize: '0.7rem', fontWeight: 700 }}\n />\n )}\n </Box>\n {description && (\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.secondary\",\n lineHeight: 1.35,\n\n // Clamp the description to 2 lines so an unusually\n // long copy doesn't push a tile out of its row.\n display: '-webkit-box',\n\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden'\n }}>\n {description}\n </Typography>\n )}\n </>)\n ) : (\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', width: '100%', gap: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, minWidth: 0 }}>\n {icon && (\n <Box\n sx={{\n width: iconSize,\n height: iconSize,\n borderRadius: 1.5,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: `${color}.main`,\n color: `${color}.contrastText`,\n flexShrink: 0,\n }}\n >\n {icon}\n </Box>\n )}\n <Box sx={{ minWidth: 0, flex: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' }}>\n <Typography\n variant=\"subtitle1\"\n sx={{\n fontWeight: 600,\n lineHeight: 1.3\n }}>\n {title}\n </Typography>\n {showBadge && (\n <Chip\n size=\"small\"\n label={badge}\n color={badgeColor}\n sx={{ height: 20, fontSize: '0.7rem', fontWeight: 700 }}\n />\n )}\n </Box>\n {description && (\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.secondary\",\n lineHeight: 1.4\n }}>\n {description}\n </Typography>\n )}\n </Box>\n </Box>\n {arrow !== false && (\n <Box sx={{ display: 'flex', alignItems: 'center', flexShrink: 0, color: 'text.secondary' }}>\n {arrow === true ? <ChevronRightIcon /> : arrow}\n </Box>\n )}\n </Box>\n )}\n </CardContent>\n </Card>\n );\n}\n","'use client';\n\n/**\n * NavCardGrid\n *\n * Canonical container for `<NavCard>` rows on admin/dashboard\n * overview pages. Replaces the ad-hoc `<Grid container spacing={3}>`\n * + `<Grid size={{md:3}}>` pattern, which has two failure modes\n * when the tile count is uneven against the column count:\n *\n * 1. The empty trailing cells visually extend the row above's\n * column borders into nothing — reading as orphan vertical\n * \"sticks\" between cards on dark themes.\n * 2. Cards across rows can end up with different heights when\n * their descriptions wrap differently.\n *\n * NavCardGrid solves both with a CSS Grid:\n *\n * - `auto-fit` (not `auto-fill`) collapses empty trailing tracks,\n * so the last row's cards expand to fill the width and their\n * right edges no longer align with the row above.\n * - `minmax(<min>, 1fr)` caps the column count on wide viewports\n * (otherwise 5+ tiny tiles can pack a row).\n * - `grid-auto-rows: 1fr` guarantees equal card height across\n * rows regardless of per-card content length.\n *\n * Use as a drop-in replacement for the Grid wrapper around NavCards\n * in admin dashboards. The contained `<NavCard>` should typically\n * use `orientation=\"vertical\"` so the tiles work at narrow widths.\n *\n * @example\n * ```tsx\n * <NavCardGrid>\n * <NavCard title=\"Users\" icon={<UsersIcon />} to=\"/admin/users\" />\n * <NavCard title=\"Shops\" icon={<ShopsIcon />} to=\"/admin/shops\" />\n * ...\n * </NavCardGrid>\n * ```\n *\n * @module components/nav-card\n */\n\nimport type { ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface NavCardGridProps {\n children: ReactNode;\n /**\n * Minimum tile width before wrap. Effectively caps the column\n * count via `minmax`. Default 260px which gives 4 columns on a\n * typical 1200px content area, 3 on tablet, 2 on small laptops,\n * and 1 on mobile.\n */\n minTileWidth?: number;\n /** Gap between tiles in spacing units. Default 3 (24px). */\n gap?: number;\n /** Custom sx overrides. */\n sx?: SxProps<Theme>;\n}\n\nexport function NavCardGrid({\n children,\n minTileWidth = 260,\n gap = 3,\n sx,\n}: NavCardGridProps) {\n return (\n <Box\n sx={{\n display: 'grid',\n gap,\n // Always 1 column on xs to avoid horizontal overflow on tiny\n // viewports; `auto-fit` from sm upward.\n gridTemplateColumns: {\n xs: '1fr',\n sm: `repeat(auto-fit, minmax(${minTileWidth}px, 1fr))`,\n },\n gridAutoRows: '1fr',\n ...sx,\n }}\n >\n {children}\n </Box>\n );\n}\n","'use client';\n\n/**\n * Drawer Component\n *\n * Enhanced drawer/side panel with custom styling.\n *\n * @module components/drawer\n */\n\nimport type { ReactNode } from 'react';\nimport MuiDrawer from '@mui/material/Drawer';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport Divider from '@mui/material/Divider';\nimport type { PaperProps } from '@mui/material/Paper';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n/**\n * Drawer anchor positions.\n */\nexport type DrawerAnchor = 'left' | 'right' | 'top' | 'bottom';\n\n/**\n * Props for Drawer component.\n */\nexport interface DrawerProps {\n /** Whether the drawer is open */\n open?: boolean;\n /** Drawer anchor position */\n anchor?: DrawerAnchor;\n /** Drawer title */\n title?: ReactNode;\n /** Drawer width (for left/right anchors) */\n width?: number | string;\n /** Drawer height (for top/bottom anchors) */\n height?: number | string;\n /** Show close button */\n showCloseButton?: boolean;\n /** Close button icon */\n closeIcon?: ReactNode;\n /** Header actions */\n headerActions?: ReactNode;\n /** Footer content */\n footer?: ReactNode;\n /** Drawer content */\n children?: ReactNode;\n /** On close handler */\n onClose?: () => void;\n /** Variant: permanent, persistent, or temporary */\n variant?: 'permanent' | 'persistent' | 'temporary';\n /** Props for the Paper component */\n PaperProps?: Partial<PaperProps>;\n /** Custom sx props */\n sx?: SxProps<Theme>;\n}\n\n/**\n * Default close icon.\n */\nfunction DefaultCloseIcon(): ReactNode {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n );\n}\n\n/**\n * Drawer - Enhanced drawer/side panel.\n *\n * @example\n * ```tsx\n * <Drawer\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"Edit Profile\"\n * anchor=\"right\"\n * width={400}\n * >\n * <ProfileForm />\n * </Drawer>\n * ```\n */\nexport function Drawer({\n open,\n anchor = 'right',\n title,\n width = 320,\n height = 'auto',\n showCloseButton = true,\n closeIcon,\n headerActions,\n footer,\n children,\n onClose,\n variant = 'temporary',\n PaperProps,\n sx,\n}: DrawerProps): ReactNode {\n const isHorizontal = anchor === 'left' || anchor === 'right';\n const drawerSize = isHorizontal ? { width } : { height };\n\n return (\n <MuiDrawer\n open={open}\n anchor={anchor}\n variant={variant}\n onClose={onClose}\n transitionDuration={{ enter: 300, exit: 250 }}\n sx={sx}\n slotProps={{\n backdrop: { sx: { backdropFilter: 'blur(2px)' } },\n\n paper: {\n sx: {\n ...drawerSize,\n display: 'flex',\n flexDirection: 'column',\n },\n ...PaperProps,\n }\n }}>\n {/* Header */}\n {(title || showCloseButton || headerActions) && (\n <>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n p: 2,\n minHeight: 64,\n }}\n >\n {title && (\n <Typography variant=\"h6\" component=\"div\">\n {title}\n </Typography>\n )}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, ml: 'auto' }}>\n {headerActions}\n {showCloseButton && onClose && (\n <IconButton onClick={onClose} edge=\"end\" size=\"small\" aria-label=\"Close drawer\">\n {closeIcon ?? <DefaultCloseIcon />}\n </IconButton>\n )}\n </Box>\n </Box>\n <Divider />\n </>\n )}\n {/* Content */}\n <Box\n sx={{\n flex: 1,\n overflow: 'auto',\n p: 2,\n }}\n >\n {children}\n </Box>\n {/* Footer */}\n {footer && (\n <>\n <Divider />\n <Box sx={{ p: 2 }}>{footer}</Box>\n </>\n )}\n </MuiDrawer>\n );\n}\n","'use client';\n\n/**\n * Stepper Component\n *\n * Multi-step wizard/stepper with custom styling.\n *\n * @module components/stepper\n */\n\nimport { useState, useCallback, type ReactNode } from 'react';\nimport MuiStepper from '@mui/material/Stepper';\nimport Step from '@mui/material/Step';\nimport StepLabel from '@mui/material/StepLabel';\nimport StepContent from '@mui/material/StepContent';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport type { StepperProps as MuiStepperProps } from '@mui/material/Stepper';\n\n/**\n * Step definition.\n */\nexport interface StepItem {\n /** Step label */\n label: string;\n /** Step description */\n description?: string;\n /** Step content */\n content?: ReactNode;\n /** Optional step (can be skipped) */\n optional?: boolean;\n /** Step icon */\n icon?: ReactNode;\n /** Step is completed */\n completed?: boolean;\n /** Step has error */\n error?: boolean;\n}\n\n/**\n * Props for Stepper component.\n */\nexport interface StepperProps extends Omit<MuiStepperProps, 'children'> {\n /** Steps to display */\n steps: StepItem[];\n /** Active step index */\n activeStep?: number;\n /** On step change */\n onStepChange?: (step: number) => void;\n /** Stepper orientation */\n orientation?: 'horizontal' | 'vertical';\n /** Allow non-linear navigation */\n nonLinear?: boolean;\n /** Alternative label placement (horizontal only) */\n alternativeLabel?: boolean;\n /** Show step content (vertical only) */\n showContent?: boolean;\n}\n\n/**\n * Stepper - Multi-step wizard/stepper.\n *\n * @example\n * ```tsx\n * <Stepper\n * steps={[\n * { label: 'Account', description: 'Create account' },\n * { label: 'Profile', description: 'Complete profile', optional: true },\n * { label: 'Verify', description: 'Verify email' },\n * ]}\n * activeStep={1}\n * onStepChange={(step) => setActiveStep(step)}\n * />\n * ```\n */\nexport function Stepper({\n steps,\n activeStep = 0,\n onStepChange,\n orientation = 'horizontal',\n nonLinear = false,\n alternativeLabel = false,\n showContent = false,\n ...other\n}: StepperProps): ReactNode {\n const handleStepClick = (index: number) => {\n if (nonLinear && onStepChange) {\n onStepChange(index);\n }\n };\n\n return (\n <MuiStepper\n activeStep={activeStep}\n orientation={orientation}\n nonLinear={nonLinear}\n alternativeLabel={alternativeLabel}\n {...other}\n >\n {steps.map((step, index) => (\n <Step key={index} completed={step.completed ?? index < activeStep}>\n <StepLabel\n optional={\n step.optional ? (\n <span style={{ fontSize: '0.75rem', color: 'text.secondary' }}>Optional</span>\n ) : step.description ? (\n <span style={{ fontSize: '0.75rem', color: 'text.secondary' }}>{step.description}</span>\n ) : undefined\n }\n error={step.error}\n icon={step.icon}\n sx={{\n cursor: nonLinear ? 'pointer' : 'default',\n }}\n onClick={() => handleStepClick(index)}\n >\n {step.label}\n </StepLabel>\n {orientation === 'vertical' && showContent && step.content && <StepContent>{step.content}</StepContent>}\n </Step>\n ))}\n </MuiStepper>\n );\n}\n\n/**\n * Return type for useStepper hook.\n */\nexport interface UseStepperReturn {\n /** Current active step */\n activeStep: number;\n /** Go to next step */\n nextStep: () => void;\n /** Go to previous step */\n prevStep: () => void;\n /** Go to specific step */\n goToStep: (step: number) => void;\n /** Reset to first step */\n reset: () => void;\n /** Is first step */\n isFirstStep: boolean;\n /** Is last step */\n isLastStep: boolean;\n /** Step is completed */\n isCompleted: boolean;\n}\n\n/**\n * Options for useStepper hook.\n */\nexport interface UseStepperOptions {\n /** Initial step */\n initialStep?: number;\n /** Total steps */\n totalSteps: number;\n /** On step change callback */\n onStepChange?: (step: number) => void;\n /** On complete callback */\n onComplete?: () => void;\n}\n\n/**\n * useStepper - Hook for managing stepper state.\n *\n * @example\n * ```tsx\n * const stepper = useStepper({\n * totalSteps: 3,\n * onComplete: () => console.log('Done!'),\n * });\n *\n * <Stepper steps={steps} activeStep={stepper.activeStep} />\n * <Button onClick={stepper.prevStep} disabled={stepper.isFirstStep}>\n * Back\n * </Button>\n * <Button onClick={stepper.nextStep}>\n * {stepper.isLastStep ? 'Finish' : 'Next'}\n * </Button>\n * ```\n */\nexport function useStepper({\n initialStep = 0,\n totalSteps,\n onStepChange,\n onComplete,\n}: UseStepperOptions): UseStepperReturn {\n const [activeStep, setActiveStep] = useState(initialStep);\n const [isCompleted, setIsCompleted] = useState(false);\n\n const goToStep = useCallback(\n (step: number) => {\n if (step >= 0 && step < totalSteps) {\n setActiveStep(step);\n onStepChange?.(step);\n }\n },\n [totalSteps, onStepChange]\n );\n\n const nextStep = useCallback(() => {\n if (activeStep === totalSteps - 1) {\n setIsCompleted(true);\n onComplete?.();\n } else {\n goToStep(activeStep + 1);\n }\n }, [activeStep, totalSteps, goToStep, onComplete]);\n\n const prevStep = useCallback(() => {\n goToStep(activeStep - 1);\n }, [activeStep, goToStep]);\n\n const reset = useCallback(() => {\n setActiveStep(0);\n setIsCompleted(false);\n onStepChange?.(0);\n }, [onStepChange]);\n\n return {\n activeStep,\n nextStep,\n prevStep,\n goToStep,\n reset,\n isFirstStep: activeStep === 0,\n isLastStep: activeStep === totalSteps - 1,\n isCompleted,\n };\n}\n\n/**\n * Props for StepperActions component.\n */\nexport interface StepperActionsProps {\n /** Stepper hook return */\n stepper: UseStepperReturn;\n /** Back button label */\n backLabel?: string;\n /** Next button label */\n nextLabel?: string;\n /** Finish button label */\n finishLabel?: string;\n /** Disable next button */\n disableNext?: boolean;\n /** Custom actions */\n actions?: ReactNode;\n}\n\n/**\n * StepperActions - Common action buttons for stepper.\n *\n * @example\n * ```tsx\n * <StepperActions stepper={stepper} />\n * ```\n */\nexport function StepperActions({\n stepper,\n backLabel = 'Back',\n nextLabel = 'Next',\n finishLabel = 'Finish',\n disableNext = false,\n actions,\n}: StepperActionsProps): ReactNode {\n return (\n <Box sx={{ display: 'flex', gap: 2, mt: 3 }}>\n <Button variant=\"outlined\" onClick={stepper.prevStep} disabled={stepper.isFirstStep}>\n {backLabel}\n </Button>\n <Box sx={{ flex: 1 }} />\n {actions}\n <Button variant=\"contained\" onClick={stepper.nextStep} disabled={disableNext}>\n {stepper.isLastStep ? finishLabel : nextLabel}\n </Button>\n </Box>\n );\n}\n","/**\n * Class Name Utility\n *\n * Combines clsx for conditional classes with optional Tailwind merge.\n * Inspired by shadcn/ui's cn() utility and minimal-shared's mergeClasses.\n *\n * @module utils/cn\n */\n\nimport { clsx, type ClassValue } from 'clsx';\n\n/**\n * Combines class names using clsx.\n *\n * This is a simplified version without tailwind-merge since Prism\n * primarily uses MUI's sx prop for styling. For Tailwind projects,\n * consider adding tailwind-merge.\n *\n * @example\n * ```tsx\n * // Basic usage\n * cn('px-4 py-2', 'bg-blue-500')\n *\n * // Conditional classes\n * cn('base-class', isActive && 'active', isDisabled && 'disabled')\n *\n * // With objects\n * cn('base', { active: isActive, disabled: isDisabled })\n *\n * // With arrays\n * cn(['class1', 'class2'], condition && 'class3')\n * ```\n */\nexport function cn(...inputs: ClassValue[]): string {\n return clsx(inputs);\n}\n\n/**\n * Type for class value inputs.\n * Re-exported for convenience.\n */\nexport type { ClassValue };\n\n// =============================================================================\n// STATE-BASED CLASS MERGING (minimal-shared pattern)\n// =============================================================================\n\n/**\n * State props for mergeClasses.\n * Values can be:\n * - boolean: includes key as class name if true\n * - undefined: excluded\n * - [boolean, string]: includes string as class name if boolean is true\n */\nexport type StateProps = {\n [key: string]: boolean | undefined | [boolean, string];\n};\n\n/**\n * Merges class names with state-based class names.\n *\n * This utility provides an alternative API for state-based class toggling,\n * particularly useful when class names differ from state keys.\n *\n * @param className - Base class name(s)\n * @param state - State object with boolean or [boolean, className] values\n * @returns Merged class names string\n *\n * @example\n * ```tsx\n * // Basic state-based merging\n * mergeClasses('item', {\n * 'item--active': isActive,\n * 'item--disabled': isDisabled,\n * });\n * // Output: 'item item--active' (if isActive is true)\n *\n * // With tuple format for different class names\n * mergeClasses('btn', {\n * primary: [isPrimary, 'btn-primary'],\n * secondary: [isSecondary, 'btn-secondary'],\n * });\n *\n * // With array of base classes\n * mergeClasses(['nav', 'nav--main'], {\n * 'nav--open': isOpen,\n * });\n * ```\n */\nexport function mergeClasses(className?: string | (string | undefined)[] | null, state?: StateProps): string {\n const classList = className ? (Array.isArray(className) ? className.filter(Boolean) : [className]) : [];\n\n if (!state) {\n return classList.join(' ');\n }\n\n const stateClasses = Object.entries(state)\n .filter(([, value]) => value !== undefined && value !== false)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return value[0] ? value[1] : '';\n }\n return value ? key : '';\n })\n .filter(Boolean);\n\n return [...classList, ...stateClasses].join(' ');\n}\n","/**\n * Chart Component CSS Classes\n *\n * @module components/chart\n */\n\nimport { createClasses } from '../../utils/create-classes.js';\n\n// =============================================================================\n// CHART CLASSES\n// =============================================================================\n\n/**\n * CSS class names for the Chart component.\n */\nexport const chartClasses = {\n root: createClasses('chart__root'),\n loading: createClasses('chart__loading'),\n legends: {\n root: createClasses('chart__legends__root'),\n item: {\n wrap: createClasses('chart__legends__item__wrap'),\n root: createClasses('chart__legends__item__root'),\n dot: createClasses('chart__legends__item__dot'),\n icon: createClasses('chart__legends__item__icon'),\n label: createClasses('chart__legends__item__label'),\n value: createClasses('chart__legends__item__value'),\n },\n },\n};\n","'use client';\n\n/**\n * Chart Loading Component\n *\n * Skeleton placeholder shown while chart is loading.\n *\n * @module components/chart\n */\n\nimport type { ChartLoadingProps, ChartType } from '../types.js';\n\nimport Box from '@mui/material/Box';\nimport Skeleton from '@mui/material/Skeleton';\n\nimport { cn } from '../../../utils/cn.js';\nimport { chartClasses } from '../classes.js';\n\n// =============================================================================\n// CIRCULAR CHART TYPES\n// =============================================================================\n\nconst CIRCULAR_TYPES: ChartType[] = ['donut', 'radialBar', 'pie', 'polarArea'];\n\n// =============================================================================\n// CHART LOADING\n// =============================================================================\n\n/**\n * Loading skeleton for charts.\n *\n * Displays a skeleton placeholder with shape appropriate for the chart type.\n *\n * @example\n * ```tsx\n * <ChartLoading type=\"pie\" />\n * <ChartLoading type=\"bar\" />\n * ```\n */\nexport function ChartLoading({ sx, className, type, ...other }: ChartLoadingProps) {\n const isCircular = type && CIRCULAR_TYPES.includes(type);\n\n return (\n <Box\n className={cn(chartClasses.loading, className)}\n sx={[\n {\n top: 0,\n left: 0,\n width: 1,\n zIndex: 9,\n height: 1,\n p: 'inherit',\n overflow: 'hidden',\n alignItems: 'center',\n position: 'absolute',\n borderRadius: 'inherit',\n justifyContent: 'center',\n display: 'flex',\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n >\n <Skeleton\n variant=\"circular\"\n sx={{\n width: 1,\n height: 1,\n borderRadius: 'inherit',\n ...(isCircular && { borderRadius: '50%' }),\n }}\n />\n </Box>\n );\n}\n","'use client';\n\n/**\n * Chart Legends Component\n *\n * Custom legend display for charts.\n *\n * @module components/chart\n */\n\nimport type { ChartLegendsProps } from '../types.js';\n\nimport { styled } from '@mui/material/styles';\n\nimport { cn } from '../../../utils/cn.js';\nimport { chartClasses } from '../classes.js';\n\n// =============================================================================\n// CHART LEGENDS\n// =============================================================================\n\n/**\n * Custom chart legends component.\n *\n * Displays chart legends with support for colors, icons, values, and sublabels.\n *\n * @example\n * ```tsx\n * <ChartLegends\n * labels={['Series A', 'Series B']}\n * colors={['#ff0000', '#00ff00']}\n * values={['100', '200']}\n * />\n * ```\n */\nexport function ChartLegends({\n sx,\n className,\n slotProps,\n icons = [],\n values = [],\n labels = [],\n colors = [],\n sublabels = [],\n ...other\n}: ChartLegendsProps) {\n return (\n <ListRoot className={cn(chartClasses.legends.root, className)} sx={sx} {...other}>\n {labels.map((series, index) => (\n <ItemWrap\n key={series}\n className={chartClasses.legends.item.wrap}\n sx={[\n {\n '--icon-color': colors[index],\n },\n ...(Array.isArray(slotProps?.wrapper?.sx) ? slotProps.wrapper.sx : [slotProps?.wrapper?.sx]),\n ]}\n {...slotProps?.wrapper}\n >\n <ItemRoot className={chartClasses.legends.item.root} {...slotProps?.root}>\n {icons.length ? (\n <ItemIcon className={chartClasses.legends.item.icon} {...slotProps?.icon}>\n {icons[index]}\n </ItemIcon>\n ) : (\n <ItemDot className={chartClasses.legends.item.dot} {...slotProps?.dot} />\n )}\n\n <ItemLabel className={chartClasses.legends.item.label} {...slotProps?.label}>\n {series}\n {!!sublabels.length && <> {` (${sublabels[index]})`}</>}\n </ItemLabel>\n </ItemRoot>\n\n {values.length > 0 && (\n <ItemValue className={chartClasses.legends.item.value} {...slotProps?.value}>\n {values[index]}\n </ItemValue>\n )}\n </ItemWrap>\n ))}\n </ListRoot>\n );\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst ListRoot = styled('ul')(({ theme }) => ({\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing(2),\n margin: 0,\n padding: 0,\n listStyle: 'none',\n}));\n\nconst ItemWrap = styled('li')({\n display: 'inline-flex',\n flexDirection: 'column',\n});\n\nconst ItemRoot = styled('div')(({ theme }) => ({\n gap: 6,\n alignItems: 'center',\n display: 'inline-flex',\n justifyContent: 'flex-start',\n fontSize: theme.typography.pxToRem(13),\n fontWeight: theme.typography.fontWeightMedium,\n}));\n\nconst ItemIcon = styled('span')({\n display: 'inline-flex',\n color: 'var(--icon-color)',\n '& > svg': {\n width: 20,\n height: 20,\n },\n});\n\nconst ItemDot = styled('span')({\n width: 12,\n height: 12,\n flexShrink: 0,\n display: 'flex',\n borderRadius: '50%',\n position: 'relative',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--icon-color)',\n backgroundColor: 'currentColor',\n});\n\nconst ItemLabel = styled('span')({\n flexShrink: 0,\n});\n\nconst ItemValue = styled('span')(({ theme }) => ({\n ...theme.typography.h6,\n marginTop: theme.spacing(1),\n}));\n","'use client';\n\n/**\n * Chart Component\n *\n * Lazy-loaded ApexCharts wrapper with theme integration and SSR support.\n *\n * @module components/chart\n */\n\nimport type { ChartProps } from './types.js';\n\nimport { lazy, Suspense, useState, useEffect, type ComponentType } from 'react';\n\nimport { styled } from '@mui/material/styles';\n\nimport { cn } from '../../utils/cn.js';\nimport { chartClasses } from './classes.js';\nimport { ChartLoading } from './components/index.js';\n\n// =============================================================================\n// LAZY LOADED APEX CHARTS\n// =============================================================================\n\n/**\n * ApexChart component props (minimal type for lazy loading).\n */\ninterface ApexChartProps {\n type?: string;\n series?: unknown;\n options?: unknown;\n width?: string | number;\n height?: string | number;\n}\n\nconst LazyApexChart = lazy(() =>\n import('react-apexcharts').then((module) => ({\n default: module.default as ComponentType<ApexChartProps>,\n }))\n);\n\n// =============================================================================\n// CHART COMPONENT\n// =============================================================================\n\n/**\n * Theme-aware chart component using ApexCharts.\n *\n * Features:\n * - Lazy loading with Suspense\n * - SSR-safe (only renders on client)\n * - Theme-integrated styles\n * - Loading skeleton placeholder\n *\n * @example\n * ```tsx\n * import { Chart, useChart } from '@omnitron-dev/prism/components';\n *\n * function MyChart() {\n * const chartOptions = useChart({\n * xaxis: { categories: ['Jan', 'Feb', 'Mar'] },\n * });\n *\n * return (\n * <Chart\n * type=\"line\"\n * series={[{ name: 'Sales', data: [10, 20, 30] }]}\n * options={chartOptions}\n * height={320}\n * />\n * );\n * }\n * ```\n */\nexport function Chart({\n type,\n series,\n options,\n width = '100%',\n height = '100%',\n slotProps,\n className,\n sx,\n ...other\n}: ChartProps) {\n const [isClient, setIsClient] = useState(false);\n\n // SSR safety: only render chart on client\n useEffect(() => {\n setIsClient(true);\n }, []);\n\n const renderFallback = () => <ChartLoading type={type} sx={slotProps?.loading} />;\n\n return (\n <ChartRoot dir=\"ltr\" className={cn(chartClasses.root, className)} sx={sx} {...other}>\n {isClient ? (\n <Suspense fallback={renderFallback()}>\n <LazyApexChart type={type} series={series} options={options} width={width} height={height} />\n </Suspense>\n ) : (\n renderFallback()\n )}\n </ChartRoot>\n );\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst ChartRoot = styled('div')(({ theme }) => ({\n width: '100%',\n flexShrink: 0,\n position: 'relative',\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n}));\n","/**\n * useChart Hook\n *\n * Creates theme-aware ApexCharts options with sensible defaults.\n * Merges custom options with base theme-integrated options.\n *\n * @module components/chart\n */\n\nimport type { Theme } from '@mui/material/styles';\nimport type { ChartOptions } from './types.js';\n\nimport { useTheme } from '@mui/material/styles';\n\n// =============================================================================\n// USE CHART HOOK\n// =============================================================================\n\n/**\n * Create theme-aware chart options.\n *\n * @param updatedOptions - Custom options to merge with base options\n * @returns Merged chart options with theme integration\n *\n * @example\n * ```tsx\n * function MyChart() {\n * const chartOptions = useChart({\n * xaxis: { categories: ['Jan', 'Feb', 'Mar'] },\n * });\n *\n * return (\n * <Chart\n * type=\"line\"\n * series={[{ name: 'Sales', data: [10, 20, 30] }]}\n * options={chartOptions}\n * />\n * );\n * }\n * ```\n */\nexport function useChart(updatedOptions?: ChartOptions): ChartOptions {\n const theme = useTheme();\n\n const baseOptions = baseChartOptions(theme) ?? {};\n\n return deepMerge(baseOptions, updatedOptions ?? {});\n}\n\n// =============================================================================\n// BASE CHART OPTIONS\n// =============================================================================\n\n/**\n * Generate base chart options from theme.\n */\nfunction baseChartOptions(theme: Theme): ChartOptions {\n // Access CSS variables safely\n const vars = theme.vars?.palette;\n const palette = theme.palette;\n\n // Label styles for donut/radialBar charts\n const LABEL_TOTAL = {\n show: true,\n label: 'Total',\n color: vars?.text.secondary ?? palette.text.secondary,\n fontSize: theme.typography.subtitle2.fontSize as string,\n fontWeight: theme.typography.subtitle2.fontWeight,\n };\n\n const LABEL_VALUE = {\n offsetY: 8,\n color: vars?.text.primary ?? palette.text.primary,\n fontSize: theme.typography.h4.fontSize as string,\n fontWeight: theme.typography.h4.fontWeight,\n };\n\n // Get grey channel for opacity calculations\n const greyChannel = getColorChannel(theme, 'grey', '500');\n const dividerColor = vars?.divider ?? palette.divider;\n const paperColor = vars?.background.paper ?? palette.background.paper;\n\n return {\n // =========================================================================\n // Chart\n // https://apexcharts.com/docs/options/chart/animations/\n // =========================================================================\n chart: {\n toolbar: { show: false },\n zoom: { enabled: false },\n parentHeightOffset: 0,\n fontFamily: theme.typography.fontFamily,\n foreColor: vars?.text.disabled ?? palette.text.disabled,\n animations: {\n enabled: true,\n speed: 360,\n animateGradually: { enabled: true, delay: 120 },\n dynamicAnimation: { enabled: true, speed: 360 },\n },\n },\n\n // =========================================================================\n // Colors\n // https://apexcharts.com/docs/options/colors/\n // =========================================================================\n colors: [\n palette.primary.main,\n palette.warning.main,\n palette.info.main,\n palette.error.main,\n palette.success.main,\n palette.warning.dark,\n palette.success.dark,\n palette.info.dark,\n palette.primary.dark,\n ],\n\n // =========================================================================\n // States\n // https://apexcharts.com/docs/options/states/\n // =========================================================================\n states: {\n hover: { filter: { type: 'darken' } },\n active: { filter: { type: 'darken' } },\n },\n\n // =========================================================================\n // Fill\n // https://apexcharts.com/docs/options/fill/\n // =========================================================================\n fill: {\n opacity: 1,\n gradient: {\n type: 'vertical',\n shadeIntensity: 0,\n opacityFrom: 0.4,\n opacityTo: 0,\n stops: [0, 100],\n },\n },\n\n // =========================================================================\n // Data Labels\n // https://apexcharts.com/docs/options/datalabels/\n // =========================================================================\n dataLabels: { enabled: false },\n\n // =========================================================================\n // Stroke\n // https://apexcharts.com/docs/options/stroke/\n // =========================================================================\n stroke: { width: 2.5, curve: 'smooth', lineCap: 'round' },\n\n // =========================================================================\n // Grid\n // https://apexcharts.com/docs/options/grid/\n // =========================================================================\n grid: {\n strokeDashArray: 3,\n borderColor: dividerColor,\n padding: { top: 0, right: 0, bottom: 0 },\n xaxis: { lines: { show: false } },\n },\n\n // =========================================================================\n // Axis\n // https://apexcharts.com/docs/options/xaxis/\n // https://apexcharts.com/docs/options/yaxis/\n // =========================================================================\n xaxis: { axisBorder: { show: false }, axisTicks: { show: false } },\n yaxis: { tickAmount: 5 },\n\n // =========================================================================\n // Markers\n // https://apexcharts.com/docs/options/markers/\n // =========================================================================\n markers: {\n size: 0,\n strokeColors: paperColor,\n },\n\n // =========================================================================\n // Tooltip\n // =========================================================================\n tooltip: { theme: 'false', fillSeriesColor: false, x: { show: true } },\n\n // =========================================================================\n // Legend\n // https://apexcharts.com/docs/options/legend/\n // =========================================================================\n legend: {\n show: false,\n position: 'top',\n fontWeight: 500,\n fontSize: '13px',\n horizontalAlign: 'right',\n markers: { shape: 'circle' },\n labels: { colors: vars?.text.primary ?? palette.text.primary },\n itemMargin: { horizontal: 8, vertical: 8 },\n },\n\n // =========================================================================\n // Plot Options\n // =========================================================================\n plotOptions: {\n // Bar charts\n // https://apexcharts.com/docs/options/plotoptions/bar/\n bar: { borderRadius: 4, columnWidth: '48%', borderRadiusApplication: 'end' },\n\n // Pie & Donut charts\n // https://apexcharts.com/docs/options/plotoptions/pie/\n pie: {\n donut: {\n labels: {\n show: true,\n value: { ...LABEL_VALUE },\n total: { ...LABEL_TOTAL },\n },\n },\n },\n\n // RadialBar charts\n // https://apexcharts.com/docs/options/plotoptions/radialbar/\n radialBar: {\n hollow: { margin: -8, size: '100%' },\n track: {\n margin: -8,\n strokeWidth: '50%',\n background: `rgba(${greyChannel} / 0.16)`,\n },\n dataLabels: { value: { ...LABEL_VALUE }, total: { ...LABEL_TOTAL } },\n },\n\n // Radar charts\n // https://apexcharts.com/docs/options/plotoptions/radar/\n radar: {\n polygons: {\n fill: { colors: ['transparent'] },\n strokeColors: dividerColor,\n connectorColors: dividerColor,\n },\n },\n\n // Polar Area charts\n // https://apexcharts.com/docs/options/plotoptions/polararea/\n polarArea: {\n rings: { strokeColor: dividerColor },\n spokes: { connectorColors: dividerColor },\n },\n\n // Heatmap charts\n // https://apexcharts.com/docs/options/plotoptions/heatmap/\n heatmap: { distributed: true },\n },\n\n // =========================================================================\n // Responsive\n // https://apexcharts.com/docs/options/responsive/\n // =========================================================================\n responsive: [\n {\n breakpoint: theme.breakpoints.values.sm,\n options: { plotOptions: { bar: { borderRadius: 3, columnWidth: '80%' } } },\n },\n {\n breakpoint: theme.breakpoints.values.md,\n options: { plotOptions: { bar: { columnWidth: '60%' } } },\n },\n ],\n };\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Get color channel from theme safely.\n */\nfunction getColorChannel(theme: Theme, color: 'grey' | 'primary' | 'secondary', shade?: string): string {\n const channelKey = shade ? `${shade}Channel` : 'mainChannel';\n const vars = theme.vars?.palette[color] as Record<string, string> | undefined;\n\n const fallbacks: Record<string, string> = {\n '500Channel': '145 158 171',\n '900Channel': '0 0 0',\n mainChannel: '51 133 240',\n };\n\n return vars?.[channelKey] ?? fallbacks[channelKey] ?? '145 158 171';\n}\n\n/**\n * Deep merge two objects.\n */\nfunction deepMerge<T extends object>(target: T, source: Partial<T>): T {\n const output = { ...target };\n\n for (const key of Object.keys(source) as Array<keyof T>) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue !== null &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n output[key] = deepMerge(targetValue as object, sourceValue as object) as T[keyof T];\n } else if (sourceValue !== undefined) {\n output[key] = sourceValue as T[keyof T];\n }\n }\n\n return output;\n}\n","/**\n * Lightbox Component Types\n *\n * Type definitions for the Lightbox component - a modal image viewer\n * with zoom, pan, and navigation capabilities.\n *\n * @module components/lightbox\n */\n\nimport type { Theme, SxProps } from '@mui/material/styles';\nimport type { DialogProps } from '@mui/material/Dialog';\n\n// =============================================================================\n// LIGHTBOX SLIDE TYPES\n// =============================================================================\n\n/**\n * Individual slide/image in the lightbox.\n */\nexport interface LightboxSlide {\n /** Image source URL */\n src: string;\n /** Alt text for accessibility */\n alt?: string;\n /** Optional title displayed below image */\n title?: string;\n /** Optional description/caption */\n description?: string;\n /** Video source (if slide is a video) */\n video?: {\n /** Video sources with type */\n sources: Array<{ src: string; type: string }>;\n /** Autoplay video */\n autoPlay?: boolean;\n /** Loop video */\n loop?: boolean;\n /** Muted by default */\n muted?: boolean;\n /** Poster image */\n poster?: string;\n };\n /** Thumbnail URL (defaults to src) */\n thumbnail?: string;\n /** Width for sizing calculations */\n width?: number;\n /** Height for sizing calculations */\n height?: number;\n /** Additional slide data */\n [key: string]: unknown;\n}\n\n// =============================================================================\n// LIGHTBOX LABELS\n// =============================================================================\n\n/**\n * Accessible names for the lightbox's controls, so a consumer can localise\n * them.\n *\n * Every one of these buttons is an icon: there is no visible text beside it,\n * so the `aria-label` is the ONLY text a screen reader has to offer. Written\n * into the component they were English on a Russian-first product — and the\n * lightbox is where a person looks at a photograph someone sent them in chat,\n * an image in a shop review, or a picture in the documentation.\n *\n * Defaults keep the previous strings verbatim, so a consumer that passes\n * nothing is unchanged.\n */\nexport interface LightboxLabels {\n zoomIn: string;\n zoomOut: string;\n download: string;\n share: string;\n close: string;\n previous: string;\n next: string;\n}\n\n/** The strings the lightbox used before `labels` existed. */\nexport const DEFAULT_LIGHTBOX_LABELS: LightboxLabels = {\n zoomIn: 'Zoom in',\n zoomOut: 'Zoom out',\n download: 'Download',\n share: 'Share',\n close: 'Close',\n previous: 'Previous',\n next: 'Next',\n};\n\n// =============================================================================\n// LIGHTBOX PROPS\n// =============================================================================\n\n/**\n * Lightbox component props.\n */\nexport interface LightboxProps extends Omit<DialogProps, 'open' | 'onClose' | 'children' | 'slotProps'> {\n /** Whether the lightbox is open */\n open: boolean;\n /** Callback when lightbox should close */\n onClose: () => void;\n /** Array of slides to display */\n slides: LightboxSlide[];\n /** Initial slide index (default: 0) */\n index?: number;\n /** Callback when slide changes */\n onIndexChange?: (index: number) => void;\n /** Show thumbnails strip */\n thumbnails?: boolean;\n /** Show zoom controls */\n zoom?: boolean;\n /** Enable fullscreen mode */\n fullscreen?: boolean;\n /** Show slide counter */\n counter?: boolean;\n /** Show download button */\n download?: boolean;\n /** Show share button */\n share?: boolean;\n /** Enable infinite loop navigation */\n loop?: boolean;\n /** Enable keyboard navigation */\n keyboard?: boolean;\n /** Enable swipe gestures */\n swipe?: boolean;\n /** Animation duration in ms */\n animation?: number;\n /** Close on backdrop click */\n closeOnBackdropClick?: boolean;\n /** Close on escape key */\n closeOnEsc?: boolean;\n /** Custom toolbar actions */\n toolbar?: {\n /** Show toolbar */\n show?: boolean;\n /** Toolbar position */\n position?: 'top' | 'bottom';\n /** Custom buttons */\n buttons?: React.ReactNode[];\n };\n /** Accessible names for the controls. Partial — anything omitted keeps\n * its English default. See {@link LightboxLabels}. */\n labels?: Partial<LightboxLabels>;\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Slot props for internal components */\n slotProps?: {\n /** Root container styles */\n root?: SxProps<Theme>;\n /** Backdrop styles */\n backdrop?: SxProps<Theme>;\n /** Image container styles */\n imageContainer?: SxProps<Theme>;\n /** Toolbar styles */\n toolbar?: SxProps<Theme>;\n /** Thumbnails container styles */\n thumbnails?: SxProps<Theme>;\n /** Navigation button styles */\n navButton?: SxProps<Theme>;\n /** Counter styles */\n counter?: SxProps<Theme>;\n };\n}\n\n// =============================================================================\n// LIGHTBOX TOOLBAR PROPS\n// =============================================================================\n\n/**\n * Lightbox toolbar props.\n */\nexport interface LightboxToolbarProps {\n /** Current slide index */\n index: number;\n /** Total number of slides */\n total: number;\n /** Current zoom level */\n zoomLevel: number;\n /** Whether fullscreen is active */\n isFullscreen: boolean;\n /** Zoom in handler */\n onZoomIn?: () => void;\n /** Zoom out handler */\n onZoomOut?: () => void;\n /** Reset zoom handler */\n onZoomReset?: () => void;\n /** Toggle fullscreen handler */\n onFullscreen?: () => void;\n /** Download handler */\n onDownload?: () => void;\n /** Share handler */\n onShare?: () => void;\n /** Close handler */\n onClose: () => void;\n /** Show zoom controls */\n showZoom?: boolean;\n /** Show fullscreen button */\n showFullscreen?: boolean;\n /** Show download button */\n showDownload?: boolean;\n /** Show share button */\n showShare?: boolean;\n /** Show counter */\n showCounter?: boolean;\n /** Custom buttons */\n customButtons?: React.ReactNode[];\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// LIGHTBOX THUMBNAILS PROPS\n// =============================================================================\n\n/**\n * Lightbox thumbnails strip props.\n */\nexport interface LightboxThumbnailsProps {\n /** Slides to show thumbnails for */\n slides: LightboxSlide[];\n /** Currently active index */\n activeIndex: number;\n /** Thumbnail click handler */\n onSelect: (index: number) => void;\n /** Thumbnail size */\n size?: 'small' | 'medium' | 'large';\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// LIGHTBOX HOOK RETURN TYPE\n// =============================================================================\n\n/**\n * Return type for useLightbox hook.\n */\nexport interface UseLightboxReturn {\n /** Whether lightbox is open */\n open: boolean;\n /** Current slide index */\n index: number;\n /** Open lightbox at specific index */\n onOpen: (index?: number) => void;\n /** Close lightbox */\n onClose: () => void;\n /** Go to specific slide */\n goTo: (index: number) => void;\n /** Go to next slide */\n next: () => void;\n /** Go to previous slide */\n prev: () => void;\n /**\n * Props to spread on the Lightbox component.\n *\n * Note what is NOT here, and was not before: zoom. `<Lightbox>` owns its\n * own zoom state and exposes no prop to drive it — `zoom` on that component\n * is a boolean that shows or hides the controls. The hook used to return\n * `zoomLevel`, `zoomIn`, `zoomOut` and `zoomReset` anyway, four exported\n * members that moved a number nothing rendered. A consumer following this\n * hook's own example would have called them and seen nothing happen.\n *\n * Adding real control means giving `LightboxProps` a controlled\n * `zoomLevel` / `onZoomChange` pair and routing the component's seven\n * internal `setZoomLevel` calls through it. Worth doing when something\n * needs it; not worth pretending until then.\n */\n getLightboxProps: () => Pick<LightboxProps, 'open' | 'onClose' | 'index' | 'onIndexChange'>;\n}\n","/**\n * Lightbox CSS Classes\n *\n * @module components/lightbox\n */\n\nimport { createClasses } from '../../utils/create-classes.js';\n\n/**\n * CSS class names for Lightbox component.\n */\nexport const lightboxClasses = {\n root: createClasses('lightbox__root'),\n backdrop: createClasses('lightbox__backdrop'),\n container: createClasses('lightbox__container'),\n slide: createClasses('lightbox__slide'),\n slideActive: createClasses('lightbox__slide--active'),\n image: createClasses('lightbox__image'),\n video: createClasses('lightbox__video'),\n caption: createClasses('lightbox__caption'),\n toolbar: createClasses('lightbox__toolbar'),\n toolbarTop: createClasses('lightbox__toolbar--top'),\n toolbarBottom: createClasses('lightbox__toolbar--bottom'),\n toolbarButton: createClasses('lightbox__toolbar__button'),\n navButton: createClasses('lightbox__nav'),\n navPrev: createClasses('lightbox__nav--prev'),\n navNext: createClasses('lightbox__nav--next'),\n counter: createClasses('lightbox__counter'),\n thumbnails: createClasses('lightbox__thumbnails'),\n thumbnail: createClasses('lightbox__thumbnail'),\n thumbnailActive: createClasses('lightbox__thumbnail--active'),\n zoom: createClasses('lightbox__zoom'),\n zoomed: createClasses('lightbox__zoomed'),\n loading: createClasses('lightbox__loading'),\n error: createClasses('lightbox__error'),\n};\n","'use client';\n\n/**\n * Lightbox Component\n *\n * Premium modal image/video viewer with smooth crossfade transitions,\n * glassmorphism UI, zoom, pan, touch gestures, and keyboard navigation.\n *\n * @module components/lightbox\n */\n\nimport type { LightboxProps, LightboxSlide } from './types.js';\nimport { DEFAULT_LIGHTBOX_LABELS } from './types.js';\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\n\nimport Box from '@mui/material/Box';\nimport Dialog from '@mui/material/Dialog';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport { styled, alpha, useTheme } from '@mui/material/styles';\n\n// MUI Icons (standard for design system components)\nimport CloseIcon from '@mui/icons-material/Close';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\nimport FullscreenIcon from '@mui/icons-material/Fullscreen';\nimport FullscreenExitIcon from '@mui/icons-material/FullscreenExit';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport ShareIcon from '@mui/icons-material/Share';\nimport PlayArrowIcon from '@mui/icons-material/PlayArrow';\n\nimport { cn } from '../../utils/cn.js';\nimport { lightboxClasses } from './classes.js';\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst MIN_ZOOM = 1;\nconst MAX_ZOOM = 4;\nconst ZOOM_STEP = 0.5;\nconst SWIPE_THRESHOLD = 60;\nconst TRANSITION_DURATION = 400;\n\n// =============================================================================\n// LIGHTBOX COMPONENT\n// =============================================================================\n\n/**\n * Full-screen modal image/video viewer with smooth crossfade transitions.\n *\n * @example\n * ```tsx\n * import { Lightbox, useLightbox } from '@omnitron-dev/prism/components';\n *\n * function Gallery() {\n * const lightbox = useLightbox({ totalSlides: images.length });\n *\n * return (\n * <>\n * <ImageList>\n * {images.map((img, i) => (\n * <ImageListItem key={i} onClick={() => lightbox.onOpen(i)}>\n * <img src={img.thumbnail} />\n * </ImageListItem>\n * ))}\n * </ImageList>\n *\n * <Lightbox\n * slides={images}\n * thumbnails\n * zoom\n * {...lightbox.getLightboxProps()}\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function Lightbox({\n open,\n onClose,\n slides,\n index: controlledIndex = 0,\n onIndexChange,\n thumbnails = false,\n zoom = true,\n fullscreen = true,\n counter = true,\n download = false,\n share = false,\n loop = false,\n keyboard = true,\n swipe = true,\n animation = TRANSITION_DURATION,\n closeOnBackdropClick = true,\n closeOnEsc = true,\n toolbar = { show: true, position: 'top' },\n labels: labelOverrides,\n sx,\n slotProps,\n className,\n ...dialogProps\n}: LightboxProps) {\n const theme = useTheme();\n\n // Merged once per identity change, so a consumer passing an inline object\n // does not rebuild the toolbar on every render.\n const labels = useMemo(\n () => ({ ...DEFAULT_LIGHTBOX_LABELS, ...labelOverrides }),\n [labelOverrides]\n );\n\n // State\n const [currentIndex, setCurrentIndex] = useState(controlledIndex);\n const [zoomLevel, setZoomLevel] = useState(MIN_ZOOM);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const [isDragging, setIsDragging] = useState(false);\n\n // Transition state: track previous index for crossfade direction\n const [transitionState, setTransitionState] = useState<'idle' | 'transitioning'>('idle');\n const [prevIndex, setPrevIndex] = useState(controlledIndex);\n const [slideDirection, setSlideDirection] = useState<'left' | 'right' | 'none'>('none');\n\n // Refs\n const containerRef = useRef<HTMLDivElement>(null);\n const dragStart = useRef({ x: 0, y: 0 });\n const touchStart = useRef({ x: 0, y: 0 });\n const thumbnailsRef = useRef<HTMLDivElement>(null);\n\n // Sync with controlled index\n useEffect(() => {\n if (controlledIndex !== currentIndex) {\n navigateToSlide(controlledIndex);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [controlledIndex]);\n\n // Reset state when opening\n useEffect(() => {\n if (open) {\n setZoomLevel(MIN_ZOOM);\n setPosition({ x: 0, y: 0 });\n setIsLoading(true);\n setTransitionState('idle');\n setSlideDirection('none');\n }\n }, [open]);\n\n // Current slide\n const currentSlide = slides[currentIndex] as LightboxSlide | undefined;\n const totalSlides = slides.length;\n const hasNext = loop || currentIndex < totalSlides - 1;\n const hasPrev = loop || currentIndex > 0;\n const isZoomed = zoomLevel > MIN_ZOOM;\n\n // Navigation with crossfade transition\n const navigateToSlide = useCallback(\n (newIndex: number) => {\n const targetIndex = loop\n ? (newIndex + totalSlides) % totalSlides\n : Math.max(0, Math.min(newIndex, totalSlides - 1));\n\n if (targetIndex === currentIndex) return;\n\n // Determine direction\n const direction = targetIndex > currentIndex ? 'left' : 'right';\n\n setPrevIndex(currentIndex);\n setSlideDirection(direction);\n setTransitionState('transitioning');\n setCurrentIndex(targetIndex);\n onIndexChange?.(targetIndex);\n setZoomLevel(MIN_ZOOM);\n setPosition({ x: 0, y: 0 });\n setIsLoading(true);\n\n // End transition after animation\n setTimeout(() => {\n setTransitionState('idle');\n setSlideDirection('none');\n }, animation);\n },\n [loop, totalSlides, currentIndex, onIndexChange, animation]\n );\n\n const next = useCallback(() => {\n if (hasNext) navigateToSlide(currentIndex + 1);\n }, [hasNext, currentIndex, navigateToSlide]);\n\n const prev = useCallback(() => {\n if (hasPrev) navigateToSlide(currentIndex - 1);\n }, [hasPrev, currentIndex, navigateToSlide]);\n\n // Direct navigation (from thumbnails — no directional slide)\n const goTo = useCallback(\n (newIndex: number) => {\n navigateToSlide(newIndex);\n },\n [navigateToSlide]\n );\n\n // Zoom handlers\n const zoomIn = useCallback(() => {\n setZoomLevel((prevZoom) => Math.min(prevZoom + ZOOM_STEP, MAX_ZOOM));\n }, []);\n\n const zoomOut = useCallback(() => {\n // The pan reset happens beside the state update, not inside its updater.\n // React may run an updater more than once — under `StrictMode` it does so\n // deliberately — and an updater that calls another setter is exactly the\n // shape that made `useCountdown` fire its completion callback four times.\n setZoomLevel((prevZoom) => Math.max(prevZoom - ZOOM_STEP, MIN_ZOOM));\n }, []);\n\n // Panning only means anything while zoomed in; recentre as soon as it is not.\n useEffect(() => {\n if (zoomLevel === MIN_ZOOM) setPosition({ x: 0, y: 0 });\n }, [zoomLevel]);\n\n const zoomReset = useCallback(() => {\n setZoomLevel(MIN_ZOOM);\n setPosition({ x: 0, y: 0 });\n }, []);\n\n // Fullscreen\n const toggleFullscreen = useCallback(async () => {\n if (!document.fullscreenElement) {\n await containerRef.current?.requestFullscreen();\n setIsFullscreen(true);\n } else {\n await document.exitFullscreen();\n setIsFullscreen(false);\n }\n }, []);\n\n // Download\n const handleDownload = useCallback(async () => {\n if (!currentSlide?.src) return;\n try {\n const response = await fetch(currentSlide.src);\n const blob = await response.blob();\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = currentSlide.title || `image-${currentIndex + 1}`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n } catch (error) {\n console.error('Download failed:', error);\n }\n }, [currentSlide, currentIndex]);\n\n // Share\n const handleShare = useCallback(async () => {\n if (!currentSlide?.src) return;\n try {\n if (navigator.share) {\n await navigator.share({\n title: currentSlide.title || 'Image',\n url: currentSlide.src,\n });\n } else {\n await navigator.clipboard.writeText(currentSlide.src);\n }\n } catch (error) {\n console.error('Share failed:', error);\n }\n }, [currentSlide]);\n\n // Keyboard navigation\n useEffect(() => {\n if (!open || !keyboard) return undefined;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowLeft':\n prev();\n break;\n case 'ArrowRight':\n next();\n break;\n case 'Escape':\n if (closeOnEsc) onClose();\n break;\n case '+':\n case '=':\n if (zoom) zoomIn();\n break;\n case '-':\n if (zoom) zoomOut();\n break;\n case '0':\n if (zoom) zoomReset();\n break;\n case 'f':\n if (fullscreen) toggleFullscreen();\n break;\n // no default\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [open, keyboard, zoom, fullscreen, closeOnEsc, prev, next, zoomIn, zoomOut, zoomReset, toggleFullscreen, onClose]);\n\n // Mouse drag for panning when zoomed\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (!isZoomed) return;\n e.preventDefault();\n setIsDragging(true);\n dragStart.current = { x: e.clientX - position.x, y: e.clientY - position.y };\n },\n [isZoomed, position]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isDragging || !isZoomed) return;\n setPosition({\n x: e.clientX - dragStart.current.x,\n y: e.clientY - dragStart.current.y,\n });\n },\n [isDragging, isZoomed]\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n // Touch swipe for navigation and panning\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (!touch) return;\n touchStart.current = { x: touch.clientX, y: touch.clientY };\n if (isZoomed) {\n setIsDragging(true);\n dragStart.current = { x: touch.clientX - position.x, y: touch.clientY - position.y };\n }\n },\n [isZoomed, position]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (!touch) return;\n if (isDragging && isZoomed) {\n setPosition({\n x: touch.clientX - dragStart.current.x,\n y: touch.clientY - dragStart.current.y,\n });\n }\n },\n [isDragging, isZoomed]\n );\n\n const handleTouchEnd = useCallback(\n (e: React.TouchEvent) => {\n if (isDragging) {\n setIsDragging(false);\n return;\n }\n\n if (!swipe || isZoomed) return;\n\n const touch = e.changedTouches[0];\n if (!touch) return;\n const deltaX = touch.clientX - touchStart.current.x;\n const deltaY = touch.clientY - touchStart.current.y;\n\n if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > SWIPE_THRESHOLD) {\n if (deltaX > 0) {\n prev();\n } else {\n next();\n }\n }\n },\n [swipe, isZoomed, isDragging, prev, next]\n );\n\n // Image load handler\n const handleImageLoad = useCallback(() => {\n setIsLoading(false);\n }, []);\n\n // Backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (closeOnBackdropClick && e.target === e.currentTarget && !isZoomed) {\n onClose();\n }\n },\n [closeOnBackdropClick, isZoomed, onClose]\n );\n\n // Double click to zoom\n const handleDoubleClick = useCallback(() => {\n if (!zoom) return;\n if (isZoomed) {\n zoomReset();\n } else {\n setZoomLevel(2);\n }\n }, [zoom, isZoomed, zoomReset]);\n\n // Scroll active thumbnail into view\n useEffect(() => {\n if (!thumbnails || !thumbnailsRef.current) return;\n const container = thumbnailsRef.current;\n const activeThumb = container.children[currentIndex] as HTMLElement | undefined;\n if (activeThumb) {\n activeThumb.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n }, [currentIndex, thumbnails]);\n\n // Previous slide data (for crossfade)\n const prevSlide = slides[prevIndex] as LightboxSlide | undefined;\n\n // Zoom percentage text\n const zoomPercent = useMemo(() => Math.round(zoomLevel * 100), [zoomLevel]);\n\n if (!currentSlide) return null;\n\n const isVideo = Boolean(currentSlide.video);\n const isPrevVideo = Boolean(prevSlide?.video);\n const transitionMs = animation;\n\n return (\n <StyledDialog\n open={open}\n onClose={onClose}\n maxWidth={false}\n fullScreen\n className={cn(lightboxClasses.root, className)}\n sx={sx}\n {...dialogProps}\n >\n <LightboxContainer ref={containerRef} className={lightboxClasses.container} sx={slotProps?.root}>\n {/* Toolbar - Top */}\n {toolbar?.show && toolbar?.position === 'top' && (\n <GlassToolbar\n className={cn(lightboxClasses.toolbar, lightboxClasses.toolbarTop)}\n placement=\"top\"\n sx={slotProps?.toolbar}\n >\n {counter && (\n <CounterChip className={lightboxClasses.counter} sx={slotProps?.counter}>\n {currentIndex + 1}\n <Typography component=\"span\" sx={{ mx: 0.5, opacity: 0.5 }}>\n /\n </Typography>\n {totalSlides}\n </CounterChip>\n )}\n\n <Box sx={{ flex: 1 }} />\n\n {/* Zoom controls with level indicator */}\n {zoom && (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.25 }}>\n <GlassButton\n onClick={zoomOut}\n disabled={zoomLevel <= MIN_ZOOM}\n aria-label={labels.zoomOut}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <ZoomOutIcon fontSize=\"small\" />\n </GlassButton>\n\n {isZoomed && (\n <Typography\n sx={{\n color: 'common.white',\n fontSize: '0.6875rem',\n fontWeight: 600,\n minWidth: 36,\n textAlign: 'center',\n opacity: 0.8,\n }}\n >\n {zoomPercent}%\n </Typography>\n )}\n\n <GlassButton\n onClick={zoomIn}\n disabled={zoomLevel >= MAX_ZOOM}\n aria-label={labels.zoomIn}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <ZoomInIcon fontSize=\"small\" />\n </GlassButton>\n </Box>\n )}\n\n {fullscreen && (\n <GlassButton\n onClick={toggleFullscreen}\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n {isFullscreen ? <FullscreenExitIcon fontSize=\"small\" /> : <FullscreenIcon fontSize=\"small\" />}\n </GlassButton>\n )}\n\n {download && (\n <GlassButton\n onClick={handleDownload}\n aria-label={labels.download}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <DownloadIcon fontSize=\"small\" />\n </GlassButton>\n )}\n\n {share && (\n <GlassButton\n onClick={handleShare}\n aria-label={labels.share}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <ShareIcon fontSize=\"small\" />\n </GlassButton>\n )}\n\n {toolbar?.buttons}\n\n <GlassButton onClick={onClose} aria-label={labels.close} className={lightboxClasses.toolbarButton} size=\"small\">\n <CloseIcon fontSize=\"small\" />\n </GlassButton>\n </GlassToolbar>\n )}\n\n {/* Main content area — layered slides for crossfade */}\n <SlideContainer\n className={cn(lightboxClasses.slide, lightboxClasses.slideActive, {\n [lightboxClasses.zoomed]: isZoomed,\n })}\n onClick={handleBackdropClick}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n onDoubleClick={handleDoubleClick}\n sx={{\n ...slotProps?.imageContainer,\n cursor: isZoomed ? (isDragging ? 'grabbing' : 'grab') : 'default',\n }}\n >\n {/* === Outgoing (previous) slide — fades out with directional shift === */}\n {transitionState === 'transitioning' && prevSlide && prevIndex !== currentIndex && (\n <SlideLayer\n sx={{\n opacity: 0,\n transform:\n slideDirection === 'left'\n ? 'translateX(-8%) scale(0.95)'\n : slideDirection === 'right'\n ? 'translateX(8%) scale(0.95)'\n : 'scale(0.95)',\n transition: `opacity ${transitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), transform ${transitionMs}ms cubic-bezier(0.4, 0, 0.2, 1)`,\n zIndex: 1,\n }}\n >\n {isPrevVideo && prevSlide.video ? (\n <StyledVideo poster={prevSlide.video.poster}>\n {prevSlide.video.sources.map((source, i) => (\n <source key={i} src={source.src} type={source.type} />\n ))}\n </StyledVideo>\n ) : (\n <StyledImage src={prevSlide.src} alt=\"\" draggable={false} />\n )}\n </SlideLayer>\n )}\n\n {/* === Current (incoming) slide — fades in with directional entrance === */}\n <SlideLayer\n sx={{\n opacity: transitionState === 'transitioning' ? 0 : 1,\n transform:\n transitionState === 'transitioning'\n ? slideDirection === 'left'\n ? 'translateX(8%) scale(0.95)'\n : slideDirection === 'right'\n ? 'translateX(-8%) scale(0.95)'\n : 'scale(0.95)'\n : 'translateX(0) scale(1)',\n transition:\n transitionState === 'idle'\n ? `opacity ${transitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), transform ${transitionMs}ms cubic-bezier(0.4, 0, 0.2, 1)`\n : 'none',\n zIndex: 2,\n // Force repaint trick: on next tick the idle state kicks in with transition\n animation:\n transitionState === 'transitioning'\n ? `lightboxSlideIn ${transitionMs}ms cubic-bezier(0.16, 1, 0.3, 1) forwards`\n : undefined,\n '@keyframes lightboxSlideIn': {\n from: {\n opacity: 0,\n transform:\n slideDirection === 'left'\n ? 'translateX(5%) scale(0.97)'\n : slideDirection === 'right'\n ? 'translateX(-5%) scale(0.97)'\n : 'scale(0.97)',\n },\n to: {\n opacity: 1,\n transform: 'translateX(0) scale(1)',\n },\n },\n }}\n >\n {/* Loading indicator */}\n {isLoading && !isVideo && (\n <LoadingOverlay className={lightboxClasses.loading}>\n <CircularProgress\n size={40}\n thickness={2.5}\n sx={{\n color: alpha(theme.palette.primary.main, 0.8),\n }}\n />\n </LoadingOverlay>\n )}\n\n {/* Image/Video content */}\n {isVideo && currentSlide.video ? (\n <VideoWrapper>\n <StyledVideo\n className={lightboxClasses.video}\n controls\n autoPlay={currentSlide.video.autoPlay}\n loop={currentSlide.video.loop}\n muted={currentSlide.video.muted}\n poster={currentSlide.video.poster}\n onLoadedData={handleImageLoad}\n style={{\n transform: `scale(${zoomLevel}) translate(${position.x / zoomLevel}px, ${position.y / zoomLevel}px)`,\n transition: isDragging ? 'none' : `transform ${animation}ms ease`,\n }}\n />\n </VideoWrapper>\n ) : (\n <StyledImage\n className={lightboxClasses.image}\n src={currentSlide.src}\n alt={currentSlide.alt || `Slide ${currentIndex + 1}`}\n onLoad={handleImageLoad}\n draggable={false}\n style={{\n transform: `scale(${zoomLevel}) translate(${position.x / zoomLevel}px, ${position.y / zoomLevel}px)`,\n transition: isDragging ? 'none' : `transform ${animation}ms ease`,\n opacity: isLoading ? 0 : 1,\n }}\n />\n )}\n </SlideLayer>\n\n {/* Caption */}\n {(currentSlide.title || currentSlide.description) && !isZoomed && (\n <GlassCaption className={lightboxClasses.caption}>\n {currentSlide.title && (\n <Typography variant=\"subtitle1\" component=\"div\" sx={{ fontWeight: 600, lineHeight: 1.3 }}>\n {currentSlide.title}\n </Typography>\n )}\n {currentSlide.description && (\n <Typography variant=\"body2\" sx={{ opacity: 0.7, mt: 0.25 }}>\n {currentSlide.description}\n </Typography>\n )}\n </GlassCaption>\n )}\n </SlideContainer>\n\n {/* Navigation arrows */}\n {hasPrev && !isZoomed && (\n <NavArrow\n className={cn(lightboxClasses.navButton, lightboxClasses.navPrev)}\n side=\"left\"\n onClick={prev}\n aria-label={labels.previous}\n sx={slotProps?.navButton}\n >\n <ChevronLeftIcon sx={{ fontSize: 28 }} />\n </NavArrow>\n )}\n\n {hasNext && !isZoomed && (\n <NavArrow\n className={cn(lightboxClasses.navButton, lightboxClasses.navNext)}\n side=\"right\"\n onClick={next}\n aria-label={labels.next}\n sx={slotProps?.navButton}\n >\n <ChevronRightIcon sx={{ fontSize: 28 }} />\n </NavArrow>\n )}\n\n {/* Thumbnails */}\n {thumbnails && !isZoomed && (\n <ThumbnailStrip ref={thumbnailsRef} className={lightboxClasses.thumbnails} sx={slotProps?.thumbnails}>\n {slides.map((slide, i) => {\n const isThumbVideo = Boolean(slide.video);\n\n return (\n <ThumbItem\n key={i}\n className={cn(lightboxClasses.thumbnail, {\n [lightboxClasses.thumbnailActive]: i === currentIndex,\n })}\n active={i === currentIndex}\n onClick={() => goTo(i)}\n >\n <img\n src={slide.thumbnail || slide.video?.poster || slide.src}\n alt={slide.alt || `Thumbnail ${i + 1}`}\n draggable={false}\n />\n {/* Video indicator on thumbnail */}\n {isThumbVideo && (\n <Box\n sx={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: alpha(theme.palette.common.black, 0.35),\n }}\n >\n <PlayArrowIcon sx={{ fontSize: 18, color: 'common.white', opacity: 0.9 }} />\n </Box>\n )}\n </ThumbItem>\n );\n })}\n </ThumbnailStrip>\n )}\n\n {/* Toolbar - Bottom */}\n {toolbar?.show && toolbar?.position === 'bottom' && (\n <GlassToolbar\n className={cn(lightboxClasses.toolbar, lightboxClasses.toolbarBottom)}\n placement=\"bottom\"\n sx={slotProps?.toolbar}\n >\n {counter && (\n <CounterChip className={lightboxClasses.counter} sx={slotProps?.counter}>\n {currentIndex + 1}\n <Typography component=\"span\" sx={{ mx: 0.5, opacity: 0.5 }}>\n /\n </Typography>\n {totalSlides}\n </CounterChip>\n )}\n <Box sx={{ flex: 1 }} />\n <GlassButton onClick={onClose} aria-label={labels.close} size=\"small\">\n <CloseIcon fontSize=\"small\" />\n </GlassButton>\n </GlassToolbar>\n )}\n </LightboxContainer>\n </StyledDialog>\n );\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst StyledDialog = styled(Dialog)(({ theme }) => ({\n '& .MuiDialog-paper': {\n backgroundColor: 'transparent',\n boxShadow: 'none',\n margin: 0,\n maxWidth: '100%',\n maxHeight: '100%',\n borderRadius: 0,\n },\n '& .MuiBackdrop-root': {\n backgroundColor: alpha(theme.palette.common.black, 0.92),\n backdropFilter: 'blur(8px)',\n },\n}));\n\nconst LightboxContainer = styled(Box)({\n display: 'flex',\n flexDirection: 'column',\n width: '100vw',\n height: '100vh',\n position: 'relative',\n overflow: 'hidden',\n userSelect: 'none',\n});\n\n// --- Glassmorphism Toolbar ---\n\nconst GlassToolbar = styled(Box)<{ placement: 'top' | 'bottom' }>(({ theme, placement }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n padding: theme.spacing(1, 1.5),\n position: 'absolute',\n left: 0,\n right: 0,\n zIndex: 10,\n ...(placement === 'top' && { top: 0 }),\n ...(placement === 'bottom' && { bottom: 0 }),\n background: `linear-gradient(${placement === 'top' ? 'to bottom' : 'to top'}, ${alpha(theme.palette.common.black, 0.55)} 0%, ${alpha(theme.palette.common.black, 0.2)} 60%, transparent 100%)`,\n transition: 'opacity 0.3s ease',\n}));\n\nconst GlassButton = styled(IconButton)(({ theme }) => ({\n color: alpha(theme.palette.common.white, 0.85),\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n padding: 6,\n transition: theme.transitions.create(['background-color', 'color', 'transform'], {\n duration: 200,\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.common.white, 0.12),\n color: theme.palette.common.white,\n transform: 'scale(1.05)',\n },\n '&:active': {\n transform: 'scale(0.95)',\n },\n '&.Mui-disabled': {\n color: alpha(theme.palette.common.white, 0.2),\n },\n}));\n\nconst CounterChip = styled(Typography)(({ theme }) => ({\n color: alpha(theme.palette.common.white, 0.9),\n fontSize: '0.75rem',\n fontWeight: 600,\n fontVariantNumeric: 'tabular-nums',\n padding: theme.spacing(0.375, 1),\n borderRadius: Number(theme.shape.borderRadius) * 2,\n backgroundColor: alpha(theme.palette.common.white, 0.1),\n backdropFilter: 'blur(12px)',\n border: `1px solid ${alpha(theme.palette.common.white, 0.08)}`,\n display: 'flex',\n alignItems: 'center',\n letterSpacing: '0.02em',\n}));\n\n// --- Slide Area ---\n\nconst SlideContainer = styled(Box)({\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n overflow: 'hidden',\n});\n\n/** Absolute layer for crossfade transitions */\nconst SlideLayer = styled(Box)({\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n willChange: 'opacity, transform',\n});\n\nconst LoadingOverlay = styled(Box)({\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 5,\n});\n\nconst StyledImage = styled('img')({\n maxWidth: '100%',\n maxHeight: '100%',\n objectFit: 'contain',\n willChange: 'transform, opacity',\n borderRadius: 2,\n});\n\nconst VideoWrapper = styled(Box)({\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n maxWidth: '100%',\n maxHeight: '100%',\n});\n\nconst StyledVideo = styled('video')(({ theme }) => ({\n maxWidth: '100%',\n maxHeight: '100%',\n objectFit: 'contain',\n willChange: 'transform',\n borderRadius: 4,\n // Custom video controls styling\n '&::-webkit-media-controls-panel': {\n backgroundColor: alpha(theme.palette.common.black, 0.6),\n backdropFilter: 'blur(8px)',\n },\n '&::-webkit-media-controls-current-time-display, &::-webkit-media-controls-time-remaining-display': {\n color: theme.palette.common.white,\n fontSize: 12,\n },\n}));\n\n// --- Caption ---\n\nconst GlassCaption = styled(Box)(({ theme }) => ({\n position: 'absolute',\n bottom: theme.spacing(2.5),\n left: '50%',\n transform: 'translateX(-50%)',\n textAlign: 'center',\n color: theme.palette.common.white,\n padding: theme.spacing(1, 2.5),\n borderRadius: Number(theme.shape.borderRadius) * 2,\n backgroundColor: alpha(theme.palette.common.black, 0.45),\n backdropFilter: 'blur(16px)',\n border: `1px solid ${alpha(theme.palette.common.white, 0.08)}`,\n maxWidth: '70%',\n zIndex: 5,\n animation: 'lightboxCaptionIn 0.3s ease-out',\n '@keyframes lightboxCaptionIn': {\n from: { opacity: 0, transform: 'translateX(-50%) translateY(8px)' },\n to: { opacity: 1, transform: 'translateX(-50%) translateY(0)' },\n },\n}));\n\n// --- Navigation Arrows ---\n\nconst NavArrow = styled(IconButton)<{ side: 'left' | 'right' }>(({ theme, side }) => ({\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n color: alpha(theme.palette.common.white, 0.85),\n zIndex: 10,\n width: 44,\n height: 44,\n borderRadius: '50%',\n backgroundColor: alpha(theme.palette.common.white, 0.08),\n backdropFilter: 'blur(12px)',\n border: `1px solid ${alpha(theme.palette.common.white, 0.06)}`,\n ...(side === 'left' && { left: theme.spacing(2) }),\n ...(side === 'right' && { right: theme.spacing(2) }),\n transition: theme.transitions.create(['background-color', 'color', 'transform', 'box-shadow'], {\n duration: 200,\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.common.white, 0.16),\n color: theme.palette.common.white,\n transform: 'translateY(-50%) scale(1.08)',\n boxShadow: `0 0 20px ${alpha(theme.palette.primary.main, 0.15)}`,\n },\n '&:active': {\n transform: 'translateY(-50%) scale(0.95)',\n },\n}));\n\n// --- Thumbnails ---\n\nconst ThumbnailStrip = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(0.75),\n padding: theme.spacing(1, 2),\n justifyContent: 'center',\n overflowX: 'auto',\n backgroundColor: alpha(theme.palette.common.black, 0.5),\n backdropFilter: 'blur(12px)',\n borderTop: `1px solid ${alpha(theme.palette.common.white, 0.06)}`,\n // Hide scrollbar\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n}));\n\nconst ThumbItem = styled(Box)<{ active: boolean }>(({ theme, active }) => ({\n flexShrink: 0,\n width: 56,\n height: 56,\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n overflow: 'hidden',\n cursor: 'pointer',\n position: 'relative',\n border: `2px solid ${active ? theme.palette.primary.main : alpha(theme.palette.common.white, 0.08)}`,\n opacity: active ? 1 : 0.55,\n transform: active ? 'scale(1)' : 'scale(0.92)',\n transition: theme.transitions.create(['border-color', 'opacity', 'transform', 'box-shadow'], {\n duration: 200,\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n }),\n ...(active && {\n boxShadow: `0 0 12px ${alpha(theme.palette.primary.main, 0.3)}`,\n }),\n '& img': {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n '&:hover': {\n opacity: 1,\n transform: 'scale(1)',\n borderColor: active ? theme.palette.primary.main : alpha(theme.palette.common.white, 0.25),\n },\n}));\n","/**\n * useLightbox Hook\n *\n * State management hook for the Lightbox component.\n * Handles open/close and navigation. Zoom belongs to `<Lightbox>` itself —\n * see `UseLightboxReturn.getLightboxProps` for why it is not here.\n *\n * @module components/lightbox\n */\n\n'use client';\n\nimport { useState, useCallback } from 'react';\n\nimport type { UseLightboxReturn } from './types.js';\n\n// =============================================================================\n// USE LIGHTBOX HOOK\n// =============================================================================\n\n/**\n * Options for useLightbox hook.\n */\nexport interface UseLightboxOptions {\n /** Initial open state */\n defaultOpen?: boolean;\n /** Initial slide index */\n defaultIndex?: number;\n /** Total number of slides (for navigation bounds) */\n totalSlides?: number;\n /** Enable infinite loop */\n loop?: boolean;\n}\n\n/**\n * Hook for managing lightbox state.\n *\n * @example\n * ```tsx\n * const lightbox = useLightbox({ totalSlides: images.length });\n *\n * return (\n * <>\n * {images.map((img, i) => (\n * <img key={i} src={img.src} onClick={() => lightbox.onOpen(i)} />\n * ))}\n * <Lightbox slides={images} {...lightbox.getLightboxProps()} />\n * </>\n * );\n * ```\n */\nexport function useLightbox(options: UseLightboxOptions = {}): UseLightboxReturn {\n const { defaultOpen = false, defaultIndex = 0, totalSlides = 0, loop = false } = options;\n\n const [open, setOpen] = useState(defaultOpen);\n const [index, setIndex] = useState(defaultIndex);\n\n // Navigation\n const goTo = useCallback(\n (newIndex: number) => {\n // `totalSlides` is optional and defaults to 0, which is how the hook is\n // constructed when a caller lets the component do its own navigation —\n // `useLightbox()` with no arguments, as the portal does. Passing the\n // requested index straight through in that state let `next()` walk the\n // index upward without bound, past the end of a slide list the hook was\n // never told about. With no slides there is no index to be at; 0 is the\n // one that cannot be out of range.\n if (totalSlides === 0) {\n setIndex(0);\n return;\n }\n\n if (loop) {\n setIndex((newIndex + totalSlides) % totalSlides);\n } else {\n setIndex(Math.max(0, Math.min(newIndex, totalSlides - 1)));\n }\n },\n [totalSlides, loop]\n );\n\n const next = useCallback(() => {\n goTo(index + 1);\n }, [index, goTo]);\n\n const prev = useCallback(() => {\n goTo(index - 1);\n }, [index, goTo]);\n\n // Open/Close\n const onOpen = useCallback((slideIndex = 0) => {\n setIndex(slideIndex);\n setOpen(true);\n }, []);\n\n const onClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n // Index change handler for Lightbox\n const onIndexChange = useCallback(\n (newIndex: number) => {\n goTo(newIndex);\n },\n [goTo]\n );\n\n // Props getter\n const getLightboxProps = useCallback(\n () => ({\n open,\n onClose,\n index,\n onIndexChange,\n }),\n [open, onClose, index, onIndexChange]\n );\n\n return {\n open,\n index,\n onOpen,\n onClose,\n goTo,\n next,\n prev,\n getLightboxProps,\n };\n}\n","/**\n * Carousel CSS Classes\n *\n * @module components/carousel\n */\n\nimport { createClasses } from '../../utils/create-classes.js';\n\n/**\n * CSS class names for Carousel component.\n */\nexport const carouselClasses = {\n root: createClasses('carousel__root'),\n container: createClasses('carousel__container'),\n track: createClasses('carousel__track'),\n slide: createClasses('carousel__slide'),\n slideActive: createClasses('carousel__slide--active'),\n slidePrev: createClasses('carousel__slide--prev'),\n slideNext: createClasses('carousel__slide--next'),\n arrow: createClasses('carousel__arrow'),\n arrowPrev: createClasses('carousel__arrow--prev'),\n arrowNext: createClasses('carousel__arrow--next'),\n arrowInside: createClasses('carousel__arrow--inside'),\n arrowOutside: createClasses('carousel__arrow--outside'),\n arrowDisabled: createClasses('carousel__arrow--disabled'),\n dots: createClasses('carousel__dots'),\n dotsTop: createClasses('carousel__dots--top'),\n dotsBottom: createClasses('carousel__dots--bottom'),\n dotsLeft: createClasses('carousel__dots--left'),\n dotsRight: createClasses('carousel__dots--right'),\n dot: createClasses('carousel__dot'),\n dotActive: createClasses('carousel__dot--active'),\n horizontal: createClasses('carousel__horizontal'),\n vertical: createClasses('carousel__vertical'),\n dragging: createClasses('carousel__dragging'),\n fade: createClasses('carousel__fade'),\n};\n","'use client';\n\n/**\n * Carousel Component\n *\n * Responsive slider with autoplay, navigation arrows, dots,\n * and touch/drag support.\n *\n * @module components/carousel\n */\n\nimport type { CarouselProps } from './types.js';\n\nimport { useState, useEffect, useCallback, useRef, Children, useMemo } from 'react';\n\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport { styled, alpha } from '@mui/material/styles';\n\n// MUI Icons\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\n\nimport { cn } from '../../utils/cn.js';\nimport { carouselClasses } from './classes.js';\n\n// =============================================================================\n// CAROUSEL COMPONENT\n// =============================================================================\n\n/**\n * Responsive carousel/slider component.\n *\n * @example\n * ```tsx\n * import { Carousel } from '@omnitron-dev/prism/components';\n *\n * function Gallery() {\n * return (\n * <Carousel\n * slidesToShow={3}\n * spacing={16}\n * autoplay\n * arrows\n * dots\n * >\n * {images.map((img, i) => (\n * <img key={i} src={img.src} alt={img.alt} />\n * ))}\n * </Carousel>\n * );\n * }\n * ```\n */\nexport function Carousel({\n children,\n slidesToShow = 1,\n slidesToScroll = 1,\n spacing = 0,\n autoplay = false,\n autoplayInterval = 4000,\n pauseOnHover = true,\n loop = false,\n draggable = true,\n speed = 400,\n direction = 'horizontal',\n arrows = true,\n dots = false,\n dotsPosition = 'bottom',\n keyboard = true,\n initialSlide = 0,\n onSlideChange,\n centerMode = false,\n fade = false,\n responsive,\n sx,\n slotProps,\n className,\n ...other\n}: CarouselProps) {\n // State\n const [currentIndex, setCurrentIndex] = useState(initialSlide);\n const [isPlaying, setIsPlaying] = useState(autoplay);\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState(0);\n const [containerWidth, setContainerWidth] = useState(0);\n\n // Refs\n const containerRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const autoplayRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const dragStartRef = useRef({ x: 0, y: 0 });\n\n // Responsive settings\n const [activeSettings, setActiveSettings] = useState({\n slidesToShow,\n slidesToScroll,\n spacing,\n arrows,\n dots,\n });\n\n // Get slides from children\n const slides = Children.toArray(children);\n const totalSlides = slides.length;\n\n // Calculate settings based on responsive breakpoints\n useEffect(() => {\n if (!responsive?.length) {\n setActiveSettings({ slidesToShow, slidesToScroll, spacing, arrows, dots });\n return undefined;\n }\n\n const handleResize = () => {\n const width = window.innerWidth;\n let newSettings = { slidesToShow, slidesToScroll, spacing, arrows, dots };\n\n // Find matching breakpoint (smallest matching)\n const sortedBreakpoints = [...responsive].sort((a, b) => a.breakpoint - b.breakpoint);\n for (const bp of sortedBreakpoints) {\n if (width <= bp.breakpoint) {\n newSettings = { ...newSettings, ...bp.settings };\n break;\n }\n }\n\n setActiveSettings(newSettings);\n };\n\n handleResize();\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [responsive, slidesToShow, slidesToScroll, spacing, arrows, dots]);\n\n // Calculate dimensions\n const maxIndex = Math.max(0, totalSlides - activeSettings.slidesToShow);\n const canPrev = loop || currentIndex > 0;\n const canNext = loop || currentIndex < maxIndex;\n const isHorizontal = direction === 'horizontal';\n\n // Calculate slide width percentage\n const slideWidth = useMemo(() => {\n if (activeSettings.slidesToShow <= 0) return 100;\n return 100 / activeSettings.slidesToShow;\n }, [activeSettings.slidesToShow]);\n\n // Track container width for drag calculations\n useEffect(() => {\n if (!containerRef.current) return undefined;\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setContainerWidth(entry.contentRect.width);\n }\n });\n\n observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, []);\n\n // Navigation\n const goTo = useCallback(\n (index: number) => {\n let newIndex = index;\n\n if (loop) {\n if (index < 0) {\n newIndex = maxIndex;\n } else if (index > maxIndex) {\n newIndex = 0;\n }\n } else {\n newIndex = Math.max(0, Math.min(index, maxIndex));\n }\n\n setCurrentIndex(newIndex);\n onSlideChange?.(newIndex);\n },\n [loop, maxIndex, onSlideChange]\n );\n\n const next = useCallback(() => {\n if (canNext) {\n goTo(currentIndex + activeSettings.slidesToScroll);\n }\n }, [canNext, currentIndex, activeSettings.slidesToScroll, goTo]);\n\n const prev = useCallback(() => {\n if (canPrev) {\n goTo(currentIndex - activeSettings.slidesToScroll);\n }\n }, [canPrev, currentIndex, activeSettings.slidesToScroll, goTo]);\n\n // Autoplay\n useEffect(() => {\n if (isPlaying && totalSlides > activeSettings.slidesToShow) {\n autoplayRef.current = setInterval(next, autoplayInterval);\n return () => {\n if (autoplayRef.current) clearInterval(autoplayRef.current);\n };\n }\n return undefined;\n }, [isPlaying, totalSlides, activeSettings.slidesToShow, autoplayInterval, next]);\n\n // Pause on hover\n const handleMouseEnter = useCallback(() => {\n if (pauseOnHover && autoplay) {\n setIsPlaying(false);\n }\n }, [pauseOnHover, autoplay]);\n\n const handleMouseLeave = useCallback(() => {\n if (pauseOnHover && autoplay) {\n setIsPlaying(true);\n }\n }, [pauseOnHover, autoplay]);\n\n // Keyboard navigation\n useEffect(() => {\n if (!keyboard) return undefined;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!containerRef.current?.contains(document.activeElement)) return;\n\n if (isHorizontal) {\n if (e.key === 'ArrowLeft') prev();\n if (e.key === 'ArrowRight') next();\n } else {\n if (e.key === 'ArrowUp') prev();\n if (e.key === 'ArrowDown') next();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [keyboard, isHorizontal, prev, next]);\n\n // Drag/Touch handlers\n const handleDragStart = useCallback(\n (clientX: number, clientY: number) => {\n if (!draggable) return;\n setIsDragging(true);\n dragStartRef.current = { x: clientX, y: clientY };\n setDragOffset(0);\n },\n [draggable]\n );\n\n const handleDragMove = useCallback(\n (clientX: number, clientY: number) => {\n if (!isDragging) return;\n const delta = isHorizontal ? clientX - dragStartRef.current.x : clientY - dragStartRef.current.y;\n setDragOffset(delta);\n },\n [isDragging, isHorizontal]\n );\n\n const handleDragEnd = useCallback(() => {\n if (!isDragging) return;\n setIsDragging(false);\n\n const threshold = containerWidth * 0.15; // 15% threshold\n if (Math.abs(dragOffset) > threshold) {\n if (dragOffset > 0) {\n prev();\n } else {\n next();\n }\n }\n\n setDragOffset(0);\n }, [isDragging, containerWidth, dragOffset, prev, next]);\n\n // Mouse handlers\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n handleDragStart(e.clientX, e.clientY);\n },\n [handleDragStart]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n handleDragMove(e.clientX, e.clientY);\n },\n [handleDragMove]\n );\n\n const handleMouseUp = useCallback(() => {\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Touch handlers\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (touch) handleDragStart(touch.clientX, touch.clientY);\n },\n [handleDragStart]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (touch) handleDragMove(touch.clientX, touch.clientY);\n },\n [handleDragMove]\n );\n\n const handleTouchEnd = useCallback(() => {\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Calculate track transform\n const trackTransform = useMemo(() => {\n const baseOffset = currentIndex * slideWidth;\n const dragPercent = containerWidth > 0 ? (dragOffset / containerWidth) * 100 : 0;\n\n if (fade) return 'none';\n\n if (isHorizontal) {\n return `translateX(calc(-${baseOffset}% + ${dragPercent}%))`;\n }\n return `translateY(calc(-${baseOffset}% + ${dragPercent}%))`;\n }, [currentIndex, slideWidth, dragOffset, containerWidth, fade, isHorizontal]);\n\n // Dots count (number of pages)\n const dotsCount = Math.ceil(totalSlides / activeSettings.slidesToScroll);\n\n return (\n <CarouselRoot\n ref={containerRef}\n className={cn(\n carouselClasses.root,\n isHorizontal ? carouselClasses.horizontal : carouselClasses.vertical,\n isDragging && carouselClasses.dragging,\n fade && carouselClasses.fade,\n className\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n tabIndex={0}\n sx={sx}\n {...other}\n >\n <CarouselContainer className={carouselClasses.container} sx={slotProps?.container}>\n <CarouselTrack\n ref={trackRef}\n className={carouselClasses.track}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n sx={{\n ...slotProps?.track,\n transform: trackTransform,\n transition: isDragging ? 'none' : `transform ${speed}ms ease`,\n flexDirection: isHorizontal ? 'row' : 'column',\n cursor: draggable ? (isDragging ? 'grabbing' : 'grab') : 'default',\n }}\n >\n {slides.map((slide, index) => (\n <CarouselSlide\n key={index}\n className={cn(carouselClasses.slide, {\n [carouselClasses.slideActive]: index === currentIndex,\n })}\n sx={{\n ...slotProps?.slide,\n width: isHorizontal ? `${slideWidth}%` : '100%',\n height: !isHorizontal ? `${slideWidth}%` : 'auto',\n padding: isHorizontal ? `0 ${activeSettings.spacing / 2}px` : `${activeSettings.spacing / 2}px 0`,\n opacity: fade ? (index === currentIndex ? 1 : 0) : 1,\n transition: fade ? `opacity ${speed}ms ease` : 'none',\n position: fade ? (index === currentIndex ? 'relative' : 'absolute') : 'relative',\n ...(fade && { top: 0, left: 0 }),\n }}\n >\n {slide}\n </CarouselSlide>\n ))}\n </CarouselTrack>\n </CarouselContainer>\n\n {/* Navigation Arrows */}\n {activeSettings.arrows && totalSlides > activeSettings.slidesToShow && (\n <>\n <ArrowButton\n className={cn(carouselClasses.arrow, carouselClasses.arrowPrev, {\n [carouselClasses.arrowDisabled]: !canPrev,\n })}\n onClick={prev}\n disabled={!canPrev}\n aria-label=\"Previous slide\"\n isHorizontal={isHorizontal}\n direction=\"prev\"\n sx={slotProps?.arrow}\n >\n {isHorizontal ? <ChevronLeftIcon /> : <KeyboardArrowUpIcon />}\n </ArrowButton>\n <ArrowButton\n className={cn(carouselClasses.arrow, carouselClasses.arrowNext, {\n [carouselClasses.arrowDisabled]: !canNext,\n })}\n onClick={next}\n disabled={!canNext}\n aria-label=\"Next slide\"\n isHorizontal={isHorizontal}\n direction=\"next\"\n sx={slotProps?.arrow}\n >\n {isHorizontal ? <ChevronRightIcon /> : <KeyboardArrowDownIcon />}\n </ArrowButton>\n </>\n )}\n\n {/* Dots Indicator */}\n {activeSettings.dots && totalSlides > activeSettings.slidesToShow && (\n <DotsContainer\n className={cn(carouselClasses.dots, {\n [carouselClasses.dotsTop]: dotsPosition === 'top',\n [carouselClasses.dotsBottom]: dotsPosition === 'bottom',\n [carouselClasses.dotsLeft]: dotsPosition === 'left',\n [carouselClasses.dotsRight]: dotsPosition === 'right',\n })}\n dotsPosition={dotsPosition}\n sx={slotProps?.dots}\n >\n {Array.from({ length: dotsCount }, (_, i) => (\n <Dot\n key={i}\n className={cn(carouselClasses.dot, {\n [carouselClasses.dotActive]: Math.floor(currentIndex / activeSettings.slidesToScroll) === i,\n })}\n active={Math.floor(currentIndex / activeSettings.slidesToScroll) === i}\n onClick={() => goTo(i * activeSettings.slidesToScroll)}\n aria-label={`Go to slide ${i + 1}`}\n sx={slotProps?.dot}\n />\n ))}\n </DotsContainer>\n )}\n </CarouselRoot>\n );\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst CarouselRoot = styled(Box)({\n position: 'relative',\n width: '100%',\n overflow: 'hidden',\n outline: 'none',\n});\n\nconst CarouselContainer = styled(Box)({\n position: 'relative',\n width: '100%',\n overflow: 'hidden',\n});\n\nconst CarouselTrack = styled(Box)({\n display: 'flex',\n width: '100%',\n willChange: 'transform',\n userSelect: 'none',\n});\n\nconst CarouselSlide = styled(Box)({\n flexShrink: 0,\n '& > *': {\n width: '100%',\n height: '100%',\n },\n});\n\nconst ArrowButton = styled(IconButton)<{ isHorizontal: boolean; direction: 'prev' | 'next' }>(\n ({ theme, isHorizontal, direction }) => ({\n position: 'absolute',\n zIndex: 10,\n backgroundColor: alpha(theme.palette.background.paper, 0.9),\n boxShadow: theme.shadows[2],\n '&:hover': {\n backgroundColor: theme.palette.background.paper,\n },\n '&.Mui-disabled': {\n backgroundColor: alpha(theme.palette.background.paper, 0.5),\n },\n ...(isHorizontal\n ? {\n top: '50%',\n transform: 'translateY(-50%)',\n ...(direction === 'prev' ? { left: 8 } : { right: 8 }),\n }\n : {\n left: '50%',\n transform: 'translateX(-50%)',\n ...(direction === 'prev' ? { top: 8 } : { bottom: 8 }),\n }),\n })\n);\n\nconst DotsContainer = styled(Box)<{ dotsPosition: 'bottom' | 'top' | 'left' | 'right' }>(({ theme, dotsPosition }) => ({\n display: 'flex',\n gap: theme.spacing(1),\n position: 'absolute',\n zIndex: 10,\n ...(dotsPosition === 'bottom' && {\n bottom: theme.spacing(2),\n left: '50%',\n transform: 'translateX(-50%)',\n flexDirection: 'row',\n }),\n ...(dotsPosition === 'top' && {\n top: theme.spacing(2),\n left: '50%',\n transform: 'translateX(-50%)',\n flexDirection: 'row',\n }),\n ...(dotsPosition === 'left' && {\n left: theme.spacing(2),\n top: '50%',\n transform: 'translateY(-50%)',\n flexDirection: 'column',\n }),\n ...(dotsPosition === 'right' && {\n right: theme.spacing(2),\n top: '50%',\n transform: 'translateY(-50%)',\n flexDirection: 'column',\n }),\n}));\n\nconst Dot = styled('button')<{ active: boolean }>(({ theme, active }) => ({\n width: 8,\n height: 8,\n padding: 0,\n border: 'none',\n borderRadius: '50%',\n cursor: 'pointer',\n backgroundColor: active ? theme.palette.primary.main : alpha(theme.palette.common.black, 0.3),\n transition: theme.transitions.create(['background-color', 'transform'], {\n duration: theme.transitions.duration.short,\n }),\n '&:hover': {\n backgroundColor: active ? theme.palette.primary.main : alpha(theme.palette.common.black, 0.5),\n transform: 'scale(1.2)',\n },\n}));\n","'use client';\n\n/**\n * useCarousel Hook\n *\n * Carousel state — index, bounds, autoplay — for a slider you render\n * yourself.\n *\n * It does NOT drive `<Carousel>`, and the two are not connected in any way.\n * That component keeps its own copy of this state and exposes no controlled\n * props: `initialSlide` seeds it and `onSlideChange` observes it, so nothing\n * a caller does with this hook can move it. The two implementations are\n * parallel, not paired.\n *\n * Said this plainly because the header used to read \"state management hook\n * for the Carousel component\" and the example below wired the two together,\n * neither of which was true.\n *\n * @module components/carousel\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\nimport type { UseCarouselReturn } from './types.js';\n\n// =============================================================================\n// USE CAROUSEL OPTIONS\n// =============================================================================\n\n/**\n * Options for useCarousel hook.\n */\nexport interface UseCarouselOptions {\n /** Total number of slides */\n totalSlides: number;\n /** Initial slide index */\n initialSlide?: number;\n /** Number of slides to show */\n slidesToShow?: number;\n /** Number of slides to scroll */\n slidesToScroll?: number;\n /** Enable infinite loop */\n loop?: boolean;\n /** Enable autoplay */\n autoplay?: boolean;\n /** Autoplay interval in ms */\n autoplayInterval?: number;\n /** Callback when slide changes */\n onSlideChange?: (index: number) => void;\n}\n\n// =============================================================================\n// USE CAROUSEL HOOK\n// =============================================================================\n\n/**\n * Hook for managing carousel state.\n *\n * The previous example here did not compile and could not have worked:\n * it rendered `<CarouselSlide>`, which this package exports as a TYPE and\n * not as a component, and passed `ref={carousel.carouselRef}` to\n * `<Carousel>`, which is a plain function component that never reads a ref.\n * Between those two and the pairing that does not exist, three claims in\n * eight lines.\n *\n * @example\n * ```tsx\n * // Your own markup — that is the point of the hook.\n * const carousel = useCarousel({ totalSlides: items.length, autoplay: true });\n *\n * return (\n * <div onMouseEnter={carousel.pause} onMouseLeave={carousel.play}>\n * {items.slice(carousel.currentIndex, carousel.currentIndex + 3).map(render)}\n * <button onClick={carousel.prev} disabled={!carousel.canPrev}>Back</button>\n * <button onClick={carousel.next} disabled={!carousel.canNext}>Next</button>\n * </div>\n * );\n * ```\n *\n * For a ready-made slider use `<Carousel>` and leave this hook alone; it\n * cannot control that component.\n */\nexport function useCarousel(options: UseCarouselOptions): UseCarouselReturn {\n const {\n totalSlides,\n initialSlide = 0,\n slidesToShow = 1,\n slidesToScroll = 1,\n loop = false,\n autoplay = false,\n autoplayInterval = 3000,\n onSlideChange,\n } = options;\n\n const [currentIndex, setCurrentIndex] = useState(initialSlide);\n const [isPlaying, setIsPlaying] = useState(autoplay);\n const carouselRef = useRef<HTMLDivElement | null>(null);\n const autoplayRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n /**\n * The current index, readable from inside the autoplay timer.\n *\n * The timer used to close over `currentIndex` and list it as an effect\n * dependency, so it advanced one slide per RE-ARM rather than per tick.\n * That is invisible while every tick is followed by a render — which is\n * the normal case — and wrong the moment two callbacks land before one:\n * a throttled background tab, a long task, a test advancing a fake clock.\n * Measured: ten 100ms ticks over three slides moved the carousel once.\n *\n * Reading the ref also takes `currentIndex` out of the effect's\n * dependencies, so the interval is no longer torn down and rebuilt on\n * every slide — which had been measuring each gap from the render rather\n * than from the previous tick.\n *\n * Written in `goTo` rather than during render, because a render is exactly\n * what a burst does not give you.\n */\n const currentIndexRef = useRef(currentIndex);\n\n // Calculate max index\n const maxIndex = Math.max(0, totalSlides - slidesToShow);\n\n // Can navigate\n const canPrev = loop || currentIndex > 0;\n const canNext = loop || currentIndex < maxIndex;\n\n // Navigation handlers\n const goTo = useCallback(\n (index: number) => {\n let newIndex = index;\n\n if (loop) {\n if (index < 0) {\n newIndex = maxIndex;\n } else if (index > maxIndex) {\n newIndex = 0;\n }\n } else {\n newIndex = Math.max(0, Math.min(index, maxIndex));\n }\n\n // Only when it moved. `onSlideChange` fired on every call, including\n // the ones clamping back to where the carousel already was — so a\n // strip parked at its last slide with autoplay on reported a slide\n // change every interval, forever, with the same index.\n if (newIndex === currentIndexRef.current) return;\n\n currentIndexRef.current = newIndex;\n setCurrentIndex(newIndex);\n onSlideChange?.(newIndex);\n },\n [loop, maxIndex, onSlideChange]\n );\n\n const next = useCallback(() => {\n if (canNext) {\n goTo(currentIndex + slidesToScroll);\n }\n }, [canNext, currentIndex, slidesToScroll, goTo]);\n\n const prev = useCallback(() => {\n if (canPrev) {\n goTo(currentIndex - slidesToScroll);\n }\n }, [canPrev, currentIndex, slidesToScroll, goTo]);\n\n // Autoplay handlers\n const pause = useCallback(() => {\n setIsPlaying(false);\n if (autoplayRef.current) {\n clearInterval(autoplayRef.current);\n autoplayRef.current = null;\n }\n }, []);\n\n const play = useCallback(() => {\n setIsPlaying(true);\n }, []);\n\n // Autoplay effect\n useEffect(() => {\n if (isPlaying && totalSlides > slidesToShow) {\n autoplayRef.current = setInterval(() => {\n goTo(currentIndexRef.current + slidesToScroll);\n }, autoplayInterval);\n\n return () => {\n if (autoplayRef.current) {\n clearInterval(autoplayRef.current);\n autoplayRef.current = null;\n }\n };\n }\n return undefined;\n }, [isPlaying, slidesToScroll, autoplayInterval, totalSlides, slidesToShow, goTo]);\n\n // Cleanup on unmount\n useEffect(\n () => () => {\n if (autoplayRef.current) {\n clearInterval(autoplayRef.current);\n }\n },\n []\n );\n\n return {\n currentIndex,\n totalSlides,\n canPrev,\n canNext,\n goTo,\n next,\n prev,\n pause,\n play,\n isPlaying,\n carouselRef,\n };\n}\n","/**\n * Navigation Section Styles\n *\n * CSS custom properties and class names for nav sections.\n *\n * @module components/nav-section\n */\n\nimport type { Theme, CSSObject } from '@mui/material/styles';\nimport type { NavVariant } from './types.js';\nimport { createComponentClasses } from '../../utils/create-classes.js';\n\n// =============================================================================\n// CLASS NAMES\n// =============================================================================\n\n/**\n * CSS class names for nav section components.\n */\nexport const navSectionClasses = createComponentClasses('nav-section', [\n 'root',\n 'vertical',\n 'horizontal',\n 'mini',\n 'ul',\n 'li',\n 'subheader',\n 'item',\n 'icon',\n 'texts',\n 'title',\n 'caption',\n 'info',\n 'arrow',\n 'active',\n 'disabled',\n 'open',\n] as const);\n\n// =============================================================================\n// CSS CUSTOM PROPERTIES\n// =============================================================================\n\n/**\n * Default CSS variables for nav sections.\n */\nexport const navSectionCssVars = {\n /**\n * Get CSS variables for vertical variant.\n */\n vertical: (theme: Theme): CSSObject => ({\n // Item spacing\n '--nav-item-gap': '4px',\n '--nav-item-padding': '4px 8px 4px 12px',\n '--nav-item-padding-top': '4px',\n '--nav-item-padding-right': '8px',\n '--nav-item-padding-bottom': '4px',\n '--nav-item-padding-left': '12px',\n '--nav-item-radius': '8px',\n '--nav-item-min-height': '44px',\n // Icon\n '--nav-icon-size': '24px',\n '--nav-icon-margin': '0 16px 0 0',\n // Text\n '--nav-item-font-size': '0.875rem',\n '--nav-item-caption-size': '0.75rem',\n // Colors - inactive\n '--nav-item-color': theme.palette.text.secondary,\n '--nav-icon-color': theme.palette.text.secondary,\n '--nav-item-bg': 'transparent',\n // Colors - hover\n '--nav-item-hover-bg': theme.palette.action.hover,\n '--nav-item-hover-color': theme.palette.text.primary,\n // Colors - active\n '--nav-item-active-bg': theme.palette.action.selected,\n '--nav-item-active-color': theme.palette.primary.main,\n '--nav-icon-active-color': theme.palette.primary.main,\n // Colors - disabled\n '--nav-item-disabled-color': theme.palette.text.disabled,\n // Subheader. Asymmetric vertical padding (top < bottom) tightens\n // the gap to the previous section's last item while preserving\n // the visual grouping with the items belonging to THIS section.\n // Pre-fix `8px 8px 8px 12px` summed with the parent `gap: 4px`\n // and the previous item's `padding-bottom: 4px` to ~16px above\n // the title, which read as a disconnect rather than a section\n // boundary.\n '--nav-subheader-font-size': '0.6875rem',\n '--nav-subheader-font-weight': '700',\n '--nav-subheader-color': theme.palette.text.disabled,\n '--nav-subheader-padding': '4px 8px 8px 12px',\n // Sub-item adjustments\n '--nav-sub-item-padding': '4px 8px 4px 12px',\n '--nav-sub-item-margin-left': '40px',\n '--nav-sub-item-radius': '8px',\n }),\n\n /**\n * Get CSS variables for horizontal variant.\n */\n horizontal: (theme: Theme): CSSObject => ({\n // Item spacing\n '--nav-item-gap': '6px',\n '--nav-item-padding': '8px 14px',\n '--nav-item-radius': '8px',\n '--nav-item-min-height': '36px',\n // Icon\n '--nav-icon-size': '22px',\n '--nav-icon-margin': '0 8px 0 0',\n // Text\n '--nav-item-font-size': '0.875rem',\n // Colors - inactive\n '--nav-item-color': theme.palette.text.primary,\n '--nav-icon-color': theme.palette.text.secondary,\n '--nav-item-bg': 'transparent',\n // Colors - hover\n '--nav-item-hover-bg': theme.palette.action.hover,\n '--nav-item-hover-color': theme.palette.text.primary,\n // Colors - active\n '--nav-item-active-bg': theme.palette.action.selected,\n '--nav-item-active-color': theme.palette.primary.main,\n '--nav-icon-active-color': theme.palette.primary.main,\n // Colors - disabled\n '--nav-item-disabled-color': theme.palette.text.disabled,\n // Dropdown\n '--nav-dropdown-paper-width': '180px',\n '--nav-dropdown-paper-radius': '8px',\n '--nav-dropdown-paper-shadow': theme.shadows[8],\n }),\n\n /**\n * Get CSS variables for mini variant.\n */\n mini: (theme: Theme): CSSObject => ({\n // Item spacing\n '--nav-item-gap': '4px',\n '--nav-item-padding': '8px',\n '--nav-item-radius': '8px',\n '--nav-item-min-height': 'auto',\n // Icon\n '--nav-icon-size': '22px',\n '--nav-icon-margin': '0',\n // Text\n '--nav-item-font-size': '0.625rem',\n // Colors - inactive\n '--nav-item-color': theme.palette.text.secondary,\n '--nav-icon-color': theme.palette.text.secondary,\n '--nav-item-bg': 'transparent',\n // Colors - hover\n '--nav-item-hover-bg': theme.palette.action.hover,\n '--nav-item-hover-color': theme.palette.text.primary,\n // Colors - active\n '--nav-item-active-bg': theme.palette.action.selected,\n '--nav-item-active-color': theme.palette.primary.main,\n '--nav-icon-active-color': theme.palette.primary.main,\n // Colors - disabled\n '--nav-item-disabled-color': theme.palette.text.disabled,\n // Tooltip/Popover\n '--nav-tooltip-paper-width': '160px',\n }),\n};\n\n/**\n * Get CSS variables for a specific nav variant.\n */\nexport function getNavCssVars(theme: Theme, variant: NavVariant): CSSObject {\n switch (variant) {\n case 'horizontal':\n return navSectionCssVars.horizontal(theme);\n case 'mini':\n return navSectionCssVars.mini(theme);\n default:\n return navSectionCssVars.vertical(theme);\n }\n}\n","'use client';\n\n/**\n * Navigation Base Components\n *\n * Foundational components for building navigation sections.\n *\n * @module components/nav-section\n */\n\nimport type { Ref } from 'react';\nimport Box from '@mui/material/Box';\nimport ButtonBase from '@mui/material/ButtonBase';\nimport { styled, alpha } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cn } from '../../utils/cn.js';\nimport { navSectionClasses } from './styles.js';\n\n// =============================================================================\n// NAV (ROOT ELEMENT)\n// =============================================================================\n\n/**\n * Props for Nav component.\n */\nexport interface NavProps extends Omit<React.ComponentPropsWithoutRef<'nav'>, 'sx'> {\n children: React.ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/**\n * Nav - Root navigation element for navigation sections.\n */\nexport function Nav({className, sx, ref, ...other }: NavProps & { ref?: Ref<HTMLElement> }) {\n return (\n <Box\n component=\"nav\"\n ref={ref}\n className={cn(navSectionClasses.root, className)}\n sx={[\n {\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n />\n );\n}\n\n// =============================================================================\n// NAV UL (UNORDERED LIST)\n// =============================================================================\n\n/**\n * Props for NavUl component.\n */\nexport interface NavUlProps extends Omit<React.ComponentPropsWithoutRef<'ul'>, 'sx'> {\n children: React.ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/**\n * NavUl - Styled unordered list for navigation.\n */\nexport function NavUl({className, sx, ref, ...other }: NavUlProps & { ref?: Ref<HTMLUListElement> }) {\n return (\n <Box\n component=\"ul\"\n ref={ref}\n className={cn(navSectionClasses.ul, className)}\n sx={[\n {\n display: 'flex',\n flexDirection: 'column',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n />\n );\n}\n\n// =============================================================================\n// NAV LI (LIST ITEM)\n// =============================================================================\n\n/**\n * Props for NavLi component.\n */\nexport interface NavLiProps extends React.ComponentPropsWithoutRef<'li'> {\n children: React.ReactNode;\n}\n\n/**\n * NavLi - Styled list item for navigation.\n */\nexport function NavLi({className, ref, ...other }: NavLiProps & { ref?: Ref<HTMLLIElement> }) {\n return (\n <Box\n component=\"li\"\n ref={ref}\n className={cn(navSectionClasses.li, className)}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n }}\n {...other}\n />\n );\n}\n\n// =============================================================================\n// NAV SUBHEADER\n// =============================================================================\n\n/**\n * Props for NavSubheader component.\n */\nexport interface NavSubheaderProps extends React.ComponentPropsWithoutRef<typeof ButtonBase> {\n /** Whether the section is open */\n open?: boolean;\n /** Click handler for toggle */\n onClick?: () => void;\n children: React.ReactNode;\n}\n\nconst StyledSubheader = styled(ButtonBase)(({ theme }) => ({\n width: '100%',\n cursor: 'pointer',\n padding: 'var(--nav-subheader-padding, 8px 8px 8px 12px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n fontSize: 'var(--nav-subheader-font-size, 0.6875rem)',\n fontWeight: 'var(--nav-subheader-font-weight, 700)',\n color: 'var(--nav-subheader-color, inherit)',\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n borderRadius: theme.shape.borderRadius,\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n },\n}));\n\nconst ArrowIcon = styled('span')<{ open?: boolean }>(({ open }) => ({\n marginLeft: 'auto',\n width: 16,\n height: 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n transform: open ? 'rotate(0deg)' : 'rotate(-90deg)',\n '&::before': {\n content: '\"\"',\n width: 6,\n height: 6,\n borderStyle: 'solid',\n borderWidth: '0 0 1.5px 1.5px',\n borderColor: 'currentColor',\n transform: 'rotate(-45deg)',\n },\n}));\n\n/**\n * NavSubheader - Section header with collapse toggle.\n */\nexport function NavSubheader({className, open, onClick, children, ref, ...other }: NavSubheaderProps & { ref?: Ref<HTMLButtonElement> }) {\n return (\n <StyledSubheader ref={ref} className={cn(navSectionClasses.subheader, className)} onClick={onClick} {...other}>\n {children}\n {onClick && <ArrowIcon open={open} />}\n </StyledSubheader>\n );\n}\n\n// =============================================================================\n// NAV ITEM (BASE)\n// =============================================================================\n\n/**\n * Props for NavItemBase component.\n */\nexport interface NavItemBaseProps extends React.ComponentPropsWithoutRef<typeof ButtonBase> {\n /** Whether the item is active */\n active?: boolean;\n /** Whether the item is disabled */\n disabled?: boolean;\n /** Whether the submenu is open */\n open?: boolean;\n /** Item depth level */\n depth?: number;\n /** Whether item has children */\n hasChild?: boolean;\n children: React.ReactNode;\n}\n\nconst StyledNavItem = styled(ButtonBase, {\n shouldForwardProp: (prop) => !['active', 'open', 'depth', 'hasChild'].includes(prop as string),\n})<{ active?: boolean; open?: boolean; depth?: number; hasChild?: boolean }>(\n ({ theme, active, open, depth = 1, hasChild }) => ({\n width: '100%',\n minHeight: 'var(--nav-item-min-height, 44px)',\n padding: depth === 1 ? 'var(--nav-item-padding)' : 'var(--nav-sub-item-padding)',\n marginLeft: depth > 1 ? `calc(var(--nav-sub-item-margin-left, 40px) * ${depth - 1})` : 0,\n borderRadius: `var(--nav-item-radius, ${theme.shape.borderRadius}px)`,\n color: 'var(--nav-item-color)',\n backgroundColor: 'var(--nav-item-bg, transparent)',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n },\n // Active state\n ...(active && {\n backgroundColor: 'var(--nav-item-active-bg)',\n color: 'var(--nav-item-active-color)',\n '& .nav-icon': {\n color: 'var(--nav-icon-active-color)',\n },\n }),\n // Open state (submenu open)\n ...(open && {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n }),\n // Disabled state\n '&.Mui-disabled': {\n color: 'var(--nav-item-disabled-color)',\n pointerEvents: 'none',\n },\n })\n);\n\n/**\n * NavItemBase - Base button component for nav items.\n */\nexport function NavItemBase({className, active, disabled, open, depth, hasChild, ref, ...other }: NavItemBaseProps & { ref?: Ref<HTMLButtonElement> }) {\n return (\n <StyledNavItem\n ref={ref}\n className={cn(\n navSectionClasses.item,\n active && navSectionClasses.active,\n disabled && navSectionClasses.disabled,\n open && navSectionClasses.open,\n className\n )}\n active={active}\n open={open}\n depth={depth}\n hasChild={hasChild}\n disabled={disabled}\n {...other}\n />\n );\n}\n\n// =============================================================================\n// NAV ICON\n// =============================================================================\n\n/**\n * Props for NavIcon component.\n */\nexport interface NavIconProps {\n /** Icon element */\n icon?: React.ReactNode;\n /** Custom className */\n className?: string;\n}\n\nconst IconWrapper = styled('span')({\n width: 'var(--nav-icon-size, 24px)',\n height: 'var(--nav-icon-size, 24px)',\n flexShrink: 0,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: 'var(--nav-icon-margin, 0 16px 0 0)',\n color: 'var(--nav-icon-color)',\n '& svg': {\n width: '100%',\n height: '100%',\n },\n});\n/**\n * NavIcon - Icon wrapper for nav items.\n */\nexport function NavIcon({ icon, className }: NavIconProps): React.ReactNode {\n if (!icon) return null;\n return <IconWrapper className={cn('nav-icon', navSectionClasses.icon, className)}>{icon}</IconWrapper>;\n}\n\n// =============================================================================\n// NAV TEXTS\n// =============================================================================\n\n/**\n * Props for NavTexts component.\n */\nexport interface NavTextsProps {\n /** Title text */\n title: string;\n /** Caption text */\n caption?: string;\n /** Custom className */\n className?: string;\n}\n\nconst TextsWrapper = styled('span')({\n flex: '1 1 auto',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n minWidth: 0,\n});\nconst Title = styled('span')({\n fontSize: 'var(--nav-item-font-size, 0.875rem)',\n fontWeight: 500,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '100%',\n lineHeight: 1.5,\n});\nconst Caption = styled('span')(({ theme }) => ({\n fontSize: 'var(--nav-item-caption-size, 0.75rem)',\n color: theme.palette.text.disabled,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '100%',\n lineHeight: 1.5,\n}));\n\n/**\n * NavTexts - Text content for nav items.\n */\nexport function NavTexts({ title, caption, className }: NavTextsProps): React.ReactNode {\n return (\n <TextsWrapper className={cn(navSectionClasses.texts, className)}>\n <Title className={navSectionClasses.title}>{title}</Title>\n {caption && <Caption className={navSectionClasses.caption}>{caption}</Caption>}\n </TextsWrapper>\n );\n}\n\n// =============================================================================\n// NAV ARROW\n// =============================================================================\n\n/**\n * Props for NavArrow component.\n */\nexport interface NavArrowProps {\n /** Whether submenu is open */\n open?: boolean;\n /** Arrow direction */\n direction?: 'down' | 'right';\n /** Custom className */\n className?: string;\n}\n\nconst ArrowWrapper = styled('span')<{ open?: boolean; direction?: 'down' | 'right' }>(\n ({ open, direction = 'right' }) => ({\n width: 16,\n height: 16,\n flexShrink: 0,\n marginLeft: 6,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n transform: open ? (direction === 'down' ? 'rotate(180deg)' : 'rotate(90deg)') : 'rotate(0deg)',\n '&::before': {\n content: '\"\"',\n width: 5,\n height: 5,\n borderStyle: 'solid',\n borderWidth: '0 1.5px 1.5px 0',\n borderColor: 'currentColor',\n transform: direction === 'down' ? 'rotate(45deg)' : 'rotate(45deg)',\n },\n })\n);\n\n/**\n * NavArrow - Arrow indicator for items with children.\n */\nexport function NavArrow({ open, direction = 'right', className }: NavArrowProps): React.ReactNode {\n return <ArrowWrapper className={cn(navSectionClasses.arrow, className)} open={open} direction={direction} />;\n}\n\n// =============================================================================\n// NAV INFO\n// =============================================================================\n\n/**\n * Props for NavInfo component.\n */\nexport interface NavInfoProps {\n /** Info content */\n info?: React.ReactNode;\n /** Custom className */\n className?: string;\n}\n\nconst InfoWrapper = styled('span')({\n marginLeft: 6,\n display: 'inline-flex',\n alignItems: 'center',\n});\n/**\n * NavInfo - Info badge/content for nav items.\n */\nexport function NavInfo({ info, className }: NavInfoProps): React.ReactNode {\n if (!info) return null;\n return <InfoWrapper className={cn(navSectionClasses.info, className)}>{info}</InfoWrapper>;\n}\n","/**\n * URL Utilities\n *\n * Safe URL handling, navigation helpers, and link utilities.\n *\n * @module utils/url\n */\n\n/**\n * Options for safe return URL validation.\n */\nexport interface SafeReturnUrlOptions {\n /** Allowed URL schemes (default: ['http:', 'https:']) */\n allowedSchemes?: string[];\n /** Allowed hosts (if empty, only relative URLs allowed) */\n allowedHosts?: string[];\n /** Whether to allow relative URLs (default: true) */\n allowRelative?: boolean;\n /** Default URL if validation fails */\n fallback?: string;\n}\n\n/**\n * Validate and sanitize a return URL to prevent open redirect vulnerabilities.\n * Only allows relative paths or URLs to explicitly allowed hosts.\n *\n * @example\n * ```tsx\n * // In a login callback\n * const returnUrl = safeReturnUrl(searchParams.get('redirect'), {\n * allowedHosts: ['app.example.com'],\n * fallback: '/dashboard',\n * });\n * router.push(returnUrl);\n * ```\n *\n * @param url - URL to validate\n * @param options - Validation options\n * @returns Safe URL or fallback\n */\nexport function safeReturnUrl(url: string | null | undefined, options: SafeReturnUrlOptions = {}): string {\n const { allowedSchemes = ['http:', 'https:'], allowedHosts = [], allowRelative = true, fallback = '/' } = options;\n\n if (!url) {\n return fallback;\n }\n\n try {\n // Handle relative URLs\n if (url.startsWith('/') && !url.startsWith('//')) {\n if (allowRelative) {\n // Ensure it's a valid path (no protocol injection)\n return sanitizePath(url);\n }\n return fallback;\n }\n\n // Parse absolute URL\n const parsed = new URL(url, 'http://dummy.local');\n\n // Check scheme\n if (!allowedSchemes.includes(parsed.protocol)) {\n return fallback;\n }\n\n // Check host (only for absolute URLs)\n if (parsed.host !== 'dummy.local' && allowedHosts.length > 0) {\n if (!allowedHosts.includes(parsed.host)) {\n return fallback;\n }\n }\n\n // If parsed from a relative URL, return the pathname\n if (parsed.host === 'dummy.local') {\n return allowRelative ? sanitizePath(parsed.pathname + parsed.search + parsed.hash) : fallback;\n }\n\n return url;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Sanitize a URL path to prevent injection attacks.\n *\n * @param path - Path to sanitize\n * @returns Sanitized path\n */\nfunction sanitizePath(path: string): string {\n let sanitized = path;\n\n // Iteratively strip protocol-like patterns (handles javascript:javascript:... nesting)\n let prev = '';\n while (prev !== sanitized) {\n prev = sanitized;\n sanitized = sanitized.replace(/^[a-z]+:/gi, '');\n // Also strip whitespace/control chars that could bypass regex (e.g. java\\x00script:)\n // eslint-disable-next-line no-control-regex\n sanitized = sanitized.replace(/^[\\s\\x00-\\x1f]+/, '');\n }\n\n // Remove double slashes that could be interpreted as protocol-relative URLs\n sanitized = sanitized.replace(/^\\/\\/+/, '/');\n\n // Ensure it starts with a single slash\n if (!sanitized.startsWith('/')) {\n sanitized = '/' + sanitized;\n }\n\n return sanitized;\n}\n\n/**\n * Check if a navigation link is currently active.\n *\n * Features:\n * - Removes trailing slashes and query parameters before comparison\n * - Ignores external links (https://...) and hash links (#section)\n * - Supports deep matching for nested routes\n * - Handles query parameter paths correctly\n *\n * @example\n * ```tsx\n * // Basic usage\n * isActiveLink('/dashboard', '/dashboard/user/list'); // true (deep match)\n * isActiveLink('/dashboard', '/dashboard/user/list', false); // false (exact match)\n *\n * // Query parameters\n * isActiveLink('/users', '/users?page=1'); // true\n *\n * // Hash links and external links\n * isActiveLink('/home', '#section'); // false\n * isActiveLink('/home', 'https://example.com'); // false\n *\n * // Navigation items\n * const navItems = [\n * { path: '/dashboard', label: 'Dashboard', exact: true },\n * { path: '/users', label: 'Users' },\n * { path: '/settings', label: 'Settings' },\n * ];\n *\n * navItems.map(item => (\n * <NavItem\n * key={item.path}\n * active={isActiveLink(location.pathname, item.path, !item.exact)}\n * >\n * {item.label}\n * </NavItem>\n * ));\n * ```\n *\n * @param currentPathname - Current location pathname\n * @param targetPath - The link's target path (can include query parameters)\n * @param deep - Whether to perform deep matching for nested routes (default: true)\n * @returns True if the link is active\n */\nexport function isActiveLink(currentPathname: string, targetPath: string, deep: boolean = true): boolean {\n // Validate inputs\n if (!currentPathname || !targetPath) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[isActiveLink] currentPathname or targetPath is empty');\n }\n return false;\n }\n\n // Ignore hash links and external links\n if (targetPath.startsWith('#') || isExternalLink(targetPath)) {\n return false;\n }\n\n // Normalize paths: remove trailing slashes and query parameters\n const pathname = removeLastSlash(currentPathname);\n const cleanedTargetPath = removeLastSlash(removeParams(targetPath));\n\n // If target has query params, always do deep matching\n const shouldDeepMatch = deep || hasParams(targetPath);\n\n // Root path special case\n if (cleanedTargetPath === '/') {\n return pathname === '/';\n }\n\n // Deep match: current path starts with target path\n if (shouldDeepMatch) {\n return pathname === cleanedTargetPath || pathname.startsWith(`${cleanedTargetPath}/`);\n }\n\n // Exact match\n return pathname === cleanedTargetPath;\n}\n\n/**\n * Check if a URL is external (different origin).\n *\n * @param url - URL to check\n * @param currentOrigin - Current page origin (default: window.location.origin)\n * @returns True if the URL is external\n */\nexport function isExternalUrl(url: string, currentOrigin?: string): boolean {\n try {\n // Relative URLs are internal\n if (url.startsWith('/') && !url.startsWith('//')) {\n return false;\n }\n\n // Protocol-relative URLs\n if (url.startsWith('//')) {\n const origin = currentOrigin ?? (typeof window !== 'undefined' ? window.location.origin : '');\n const currentHost = new URL(origin).host;\n const urlHost = url.slice(2).split('/')[0];\n return urlHost !== currentHost;\n }\n\n // Absolute URLs\n const origin = currentOrigin ?? (typeof window !== 'undefined' ? window.location.origin : '');\n const urlOrigin = new URL(url).origin;\n return urlOrigin !== origin;\n } catch {\n return false;\n }\n}\n\n/**\n * Build a URL with query parameters.\n *\n * @example\n * ```tsx\n * const url = buildUrl('/search', {\n * q: 'hello world',\n * page: 1,\n * filter: ['active', 'recent'],\n * });\n * // Returns: '/search?q=hello+world&page=1&filter=active&filter=recent'\n * ```\n *\n * @param base - Base URL path\n * @param params - Query parameters\n * @returns URL with query string\n */\nexport function buildUrl(\n base: string,\n params: Record<string, string | number | boolean | (string | number | boolean)[] | null | undefined>\n): string {\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === null || value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n searchParams.append(key, String(item));\n }\n } else {\n searchParams.set(key, String(value));\n }\n }\n\n const queryString = searchParams.toString();\n if (!queryString) {\n return base;\n }\n\n const separator = base.includes('?') ? '&' : '?';\n return base + separator + queryString;\n}\n\n/**\n * Parse query parameters from a URL string.\n *\n * @param url - URL or query string\n * @returns Parsed parameters\n */\nexport function parseQueryParams(url: string): Record<string, string | string[]> {\n const queryString = url.includes('?') ? url.split('?')[1] : url;\n const params = new URLSearchParams(queryString);\n const result: Record<string, string | string[]> = {};\n\n for (const [key, value] of params.entries()) {\n const existing = result[key];\n if (existing) {\n result[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Get a single query parameter value.\n *\n * @param url - URL or query string\n * @param key - Parameter key\n * @returns Parameter value or undefined\n */\nexport function getQueryParam(url: string, key: string): string | undefined {\n const params = parseQueryParams(url);\n const value = params[key];\n return Array.isArray(value) ? value[0] : value;\n}\n\n/**\n * Check if a URL has query parameters.\n *\n * @param url - URL to check\n * @returns True if URL has query parameters\n *\n * @example\n * ```ts\n * hasParams('/search?q=hello'); // true\n * hasParams('/search'); // false\n * ```\n */\nexport function hasParams(url: string): boolean {\n return url.includes('?') && url.split('?')[1]?.length > 0;\n}\n\n/**\n * Remove query parameters from a URL.\n *\n * @param url - URL to process\n * @returns URL without query parameters\n *\n * @example\n * ```ts\n * removeParams('/search?q=hello'); // '/search'\n * removeParams('/search'); // '/search'\n * ```\n */\nexport function removeParams(url: string): string {\n const index = url.indexOf('?');\n return index === -1 ? url : url.slice(0, index);\n}\n\n/**\n * Remove trailing slash from a path.\n *\n * @param pathname - Path to process\n * @returns Path without trailing slash\n *\n * @example\n * ```ts\n * removeLastSlash('/users/'); // '/users'\n * removeLastSlash('/users'); // '/users'\n * removeLastSlash('/'); // '/'\n * ```\n */\nexport function removeLastSlash(pathname: string): string {\n if (pathname === '/') {\n return pathname;\n }\n return pathname.endsWith('/') ? pathname.slice(0, -1) : pathname;\n}\n\n/**\n * Check if a URL is an external link (starts with http:// or https://).\n *\n * @param url - URL to check\n * @returns True if external link\n *\n * @example\n * ```ts\n * isExternalLink('https://example.com'); // true\n * isExternalLink('/about'); // false\n * isExternalLink('#section'); // false\n * ```\n */\nexport function isExternalLink(url: string): boolean {\n return /^https?:\\/\\//.test(url);\n}\n\n/**\n * Compare two paths for equality (ignoring trailing slashes and query params).\n *\n * @param targetUrl - Target URL\n * @param currentUrl - Current URL\n * @param options - Comparison options\n * @returns True if paths are equal\n *\n * @example\n * ```ts\n * isEqualPath('/users/', '/users'); // true\n * isEqualPath('/users?page=1', '/users'); // true\n * isEqualPath('/users', '/users/1', { deep: true }); // false\n * ```\n */\nexport function isEqualPath(targetUrl: string, currentUrl: string, options: { deep?: boolean } = {}): boolean {\n const { deep = false } = options;\n\n // Normalize both paths\n const target = removeLastSlash(removeParams(targetUrl));\n const current = removeLastSlash(removeParams(currentUrl));\n\n if (deep) {\n return current === target || current.startsWith(target + '/');\n }\n\n return target === current;\n}\n","'use client';\n\n/**\n * Navigation Item Component\n *\n * Individual navigation item with icon, text, and optional children indicator.\n *\n * @module components/nav-section\n */\n\nimport { useMemo } from 'react';\nimport type { Ref } from 'react';\nimport Box from '@mui/material/Box';\nimport Tooltip from '@mui/material/Tooltip';\n\nimport type { NavItemProps, NavItemRenderProps } from './types.js';\nimport { NavItemBase, NavIcon, NavTexts, NavArrow, NavInfo } from './components.js';\nimport { isExternalLink } from '../../utils/url.js';\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Resolve icon from render props or direct node.\n */\nfunction resolveIcon(\n icon: string | React.ReactNode | undefined,\n render?: NavItemRenderProps\n): React.ReactNode | undefined {\n if (!icon) return undefined;\n if (typeof icon === 'string' && render?.navIcon) {\n return render.navIcon[icon];\n }\n return icon as React.ReactNode;\n}\n\n/**\n * Resolve info from render props or direct node.\n */\nfunction resolveInfo(\n info: string[] | React.ReactNode | undefined,\n render?: NavItemRenderProps\n): React.ReactNode | undefined {\n if (!info) return undefined;\n if (Array.isArray(info) && render?.navInfo) {\n const infoComponents = info.map((key) => render.navInfo?.(key));\n return (\n <>\n {infoComponents.map((comp, idx) => (\n <Box key={idx} component=\"span\">\n {comp && Object.values(comp)[0]}\n </Box>\n ))}\n </>\n );\n }\n return info as React.ReactNode;\n}\n\n// =============================================================================\n// NAV ITEM COMPONENT\n// =============================================================================\n\n/**\n * NavItem - Individual navigation item.\n *\n * @example\n * ```tsx\n * <NavItem\n * title=\"Dashboard\"\n * path=\"/dashboard\"\n * icon={<DashboardIcon />}\n * active={pathname === '/dashboard'}\n * />\n * ```\n */\nexport function NavItem(props: NavItemProps & { ref?: Ref<HTMLButtonElement> }) {\n const { ref } = props;\n const {\n // Data props\n path,\n title,\n icon,\n info,\n caption,\n disabled,\n children,\n // State props\n open,\n active,\n // Options\n depth = 1,\n hasChild,\n externalLink,\n enabledRootRedirect,\n render,\n slotProps,\n // ButtonBase props\n onClick,\n ...other\n } = props;\n\n // Resolve icon and info from render props\n const resolvedIcon = useMemo(() => resolveIcon(icon, render), [icon, render]);\n const resolvedInfo = useMemo(() => resolveInfo(info, render), [info, render]);\n\n // Check if external link\n const isExternal = externalLink ?? isExternalLink(path);\n\n // Determine if item should be clickable\n const isClickable = !disabled && (enabledRootRedirect || !hasChild || depth > 1);\n\n // Build anchor props for external links\n const linkProps = isExternal\n ? {\n component: 'a' as const,\n href: path,\n target: '_blank',\n rel: 'noopener noreferrer',\n }\n : {};\n\n const content = (\n <NavItemBase\n ref={ref}\n active={active}\n disabled={disabled}\n open={open}\n depth={depth}\n hasChild={hasChild}\n onClick={isClickable ? onClick : undefined}\n sx={slotProps?.sx}\n {...linkProps}\n {...other}\n >\n <NavIcon icon={resolvedIcon} className={slotProps?.icon as string} />\n <NavTexts title={title} caption={caption} className={slotProps?.texts as string} />\n {resolvedInfo && <NavInfo info={resolvedInfo} className={slotProps?.info as string} />}\n {hasChild && <NavArrow open={open} className={slotProps?.arrow as string} />}\n </NavItemBase>\n );\n\n // Wrap with tooltip for caption in mini mode or when needed\n if (caption && depth === 1) {\n return (\n <Tooltip title={caption} placement=\"right\" arrow>\n {content}\n </Tooltip>\n );\n }\n\n return content;\n}\n// =============================================================================\n// NAV ITEM EXPORTS\n// =============================================================================\n\nexport type { NavItemProps };\n","'use client';\n\n/**\n * Navigation Context\n *\n * Context for managing navigation state (pathname, router).\n *\n * @module components/nav-section\n */\n\nimport { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Router functions for navigation.\n */\nexport interface NavRouter {\n /** Navigate to a path */\n push: (path: string) => void;\n /** Replace current path */\n replace?: (path: string) => void;\n}\n\n/**\n * Navigation context value.\n */\nexport interface NavContextValue {\n /** Current pathname */\n pathname: string;\n /** Optional router */\n router?: NavRouter;\n}\n\n/**\n * Props for NavProvider.\n */\nexport interface NavProviderProps {\n /** Current pathname */\n pathname: string;\n /** Optional router */\n router?: NavRouter;\n children: ReactNode;\n}\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst NavContext = createContext<NavContextValue | undefined>(undefined);\n\n/**\n * NavProvider - Provides navigation context to nav components.\n *\n * @example\n * ```tsx\n * // With Next.js\n * import { usePathname, useRouter } from 'next/navigation';\n *\n * function App() {\n * const pathname = usePathname();\n * const router = useRouter();\n *\n * return (\n * <NavProvider pathname={pathname} router={router}>\n * <NavSection data={navConfig} />\n * </NavProvider>\n * );\n * }\n *\n * // With React Router\n * import { useLocation, useNavigate } from 'react-router-dom';\n *\n * function App() {\n * const { pathname } = useLocation();\n * const navigate = useNavigate();\n *\n * return (\n * <NavProvider pathname={pathname} router={{ push: navigate }}>\n * <NavSection data={navConfig} />\n * </NavProvider>\n * );\n * }\n * ```\n */\nexport function NavProvider({ pathname, router, children }: NavProviderProps): ReactNode {\n const value = useMemo(() => ({ pathname, router }), [pathname, router]);\n\n return <NavContext.Provider value={value}>{children}</NavContext.Provider>;\n}\n\n/**\n * useNav - Hook to access navigation context.\n */\nexport function useNav(): NavContextValue {\n const context = useContext(NavContext);\n if (context === undefined) {\n throw new Error('useNav must be used within a NavProvider');\n }\n return context;\n}\n\n/**\n * useNavPathname - Hook to get current pathname with fallback.\n *\n * Returns pathname from context if available, otherwise returns '/'.\n * This allows components to work without NavProvider for simpler use cases.\n */\nexport function useNavPathname(): string {\n const context = useContext(NavContext);\n return context?.pathname ?? '/';\n}\n\n/**\n * useNavRouter - Hook to get router from context.\n */\nexport function useNavRouter(): NavRouter | undefined {\n const context = useContext(NavContext);\n return context?.router;\n}\n","'use client';\n\n/**\n * Navigation List Component\n *\n * Renders a navigation item with its children, handling collapse and active states.\n *\n * @module components/nav-section\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport Collapse from '@mui/material/Collapse';\n\nimport type { NavListProps, NavSubListProps, NavItemDataProps } from './types.js';\nimport { NavUl, NavLi } from './components.js';\nimport { NavItem } from './nav-item.js';\nimport { useNavPathname } from './nav-context.js';\nimport { isActiveLink } from '../../utils/url.js';\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Check if any child route is active.\n */\nfunction hasActiveChild(data: NavItemDataProps, currentPath: string, deepMatch = false): boolean {\n if (!data.children?.length) return false;\n\n return data.children.some((child) => {\n const childActive = deepMatch ? isActiveLink(currentPath, child.path, true) : currentPath === child.path;\n\n if (childActive) return true;\n if (child.children?.length) {\n return hasActiveChild(child, currentPath, deepMatch);\n }\n return false;\n });\n}\n\n// =============================================================================\n// NAV LIST COMPONENT\n// =============================================================================\n\n/**\n * NavList - Renders a navigation item with its children.\n *\n * @example\n * ```tsx\n * <NavList\n * data={{\n * title: 'Users',\n * path: '/users',\n * children: [\n * { title: 'List', path: '/users/list' },\n * { title: 'Create', path: '/users/create' },\n * ],\n * }}\n * depth={1}\n * />\n * ```\n */\nexport function NavList({\n data,\n depth = 1,\n render,\n slotProps,\n cssVars,\n checkPermissions,\n enabledRootRedirect,\n}: NavListProps): React.ReactNode {\n const pathname = useNavPathname();\n\n // Check if this item is active\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n // Check if any child is active\n const hasChild = Boolean(data.children?.length);\n const childActive = useMemo(\n () => hasChild && hasActiveChild(data, pathname, data.deepMatch),\n [data, pathname, hasChild]\n );\n\n // Open state for collapse (default open if child is active)\n const [open, setOpen] = useState(childActive);\n\n // Update open state when child becomes active\n useEffect(() => {\n if (childActive) {\n setOpen(true);\n }\n }, [childActive]);\n\n // Toggle collapse\n const handleToggle = useCallback(() => {\n if (hasChild) {\n setOpen((prev) => !prev);\n }\n }, [hasChild]);\n\n // Handle navigation click\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n if (hasChild && !enabledRootRedirect) {\n event.preventDefault();\n handleToggle();\n }\n },\n [hasChild, enabledRootRedirect, handleToggle]\n );\n\n // Check permissions\n if (checkPermissions && data.allowedRoles) {\n const hasPermission = checkPermissions(data.allowedRoles);\n if (!hasPermission) return null;\n }\n\n return (\n <NavLi>\n <NavItem\n // Data\n path={data.path}\n title={data.title}\n icon={data.icon}\n info={data.info}\n caption={data.caption}\n disabled={data.disabled}\n // State\n active={isActive || childActive}\n open={open}\n // Options\n depth={depth}\n hasChild={hasChild}\n enabledRootRedirect={enabledRootRedirect}\n render={render}\n slotProps={depth === 1 ? slotProps?.rootItem : slotProps?.subItem}\n // Events\n onClick={handleClick}\n />\n\n {hasChild && (\n <Collapse in={open} unmountOnExit>\n <NavSubList\n data={data.children!}\n depth={depth + 1}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n </Collapse>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// NAV SUB LIST COMPONENT\n// =============================================================================\n\n/**\n * NavSubList - Renders a list of child navigation items.\n */\nexport function NavSubList({\n data,\n depth,\n render,\n slotProps,\n cssVars,\n checkPermissions,\n enabledRootRedirect,\n}: NavSubListProps): React.ReactNode {\n return (\n <NavUl sx={{ gap: 'var(--nav-item-gap)' }}>\n {data.map((item) => (\n <NavList\n key={item.title}\n data={item}\n depth={depth}\n render={render}\n slotProps={slotProps}\n cssVars={cssVars}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n );\n}\n","'use client';\n\n/**\n * Vertical Navigation Section\n *\n * Collapsible navigation groups for sidebar layouts.\n *\n * @module components/nav-section\n */\n\nimport { useTheme } from '@mui/material/styles';\nimport Collapse from '@mui/material/Collapse';\n\nimport type { NavGroupProps, NavSectionProps } from './types.js';\nimport { Nav, NavUl, NavLi, NavSubheader } from './components.js';\nimport { NavList } from './nav-list.js';\nimport { navSectionClasses, navSectionCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { useBoolean } from '../../core/index.js';\n\n// =============================================================================\n// NAV GROUP COMPONENT\n// =============================================================================\n\n/**\n * NavGroup - A collapsible group of navigation items with optional subheader.\n */\nfunction NavGroup({\n items,\n render,\n subheader,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: NavGroupProps): React.ReactNode {\n const groupOpen = useBoolean(true);\n\n const renderContent = () => (\n <NavUl sx={{ gap: 'var(--nav-item-gap)' }}>\n {items.map((list) => (\n <NavList\n key={list.title}\n data={list}\n render={render}\n depth={1}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n );\n\n return (\n <NavLi>\n {subheader ? (\n <>\n <NavSubheader\n data-title={subheader}\n open={groupOpen.value}\n onClick={groupOpen.onToggle}\n sx={slotProps?.subheader}\n >\n {subheader}\n </NavSubheader>\n\n <Collapse in={groupOpen.value}>{renderContent()}</Collapse>\n </>\n ) : (\n renderContent()\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// NAV SECTION VERTICAL\n// =============================================================================\n\n/**\n * NavSectionVertical - Vertical navigation section for sidebar layouts.\n *\n * @example\n * ```tsx\n * const navConfig = [\n * {\n * subheader: 'Overview',\n * items: [\n * { title: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> },\n * { title: 'Analytics', path: '/analytics', icon: <ChartIcon /> },\n * ],\n * },\n * {\n * subheader: 'Management',\n * items: [\n * {\n * title: 'Users',\n * path: '/users',\n * icon: <UsersIcon />,\n * children: [\n * { title: 'List', path: '/users/list' },\n * { title: 'Create', path: '/users/create' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <NavProvider pathname={pathname}>\n * <NavSectionVertical data={navConfig} />\n * </NavProvider>\n * ```\n */\nexport function NavSectionVertical({\n sx,\n data,\n render,\n className,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: NavSectionProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...navSectionCssVars.vertical(theme), ...overridesVars };\n\n return (\n <Nav\n className={cn(navSectionClasses.root, navSectionClasses.vertical, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl sx={{ flex: '1 1 auto', gap: 'var(--nav-item-gap)' }}>\n {data.map((group) => (\n <NavGroup\n key={group.subheader ?? group.items[0]?.title}\n subheader={group.subheader}\n items={group.items}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\n/**\n * Horizontal Navigation Section\n *\n * Horizontal navigation for header/top bar layouts.\n *\n * @module components/nav-section\n */\n\nimport { useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport { useTheme } from '@mui/material/styles';\nimport Popover from '@mui/material/Popover';\nimport Paper from '@mui/material/Paper';\n\nimport type { NavItemDataProps, NavListProps, NavSectionProps } from './types.js';\nimport { Nav, NavUl, NavLi } from './components.js';\nimport { NavItem } from './nav-item.js';\nimport { useNavPathname } from './nav-context.js';\nimport { navSectionClasses, navSectionCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink } from '../../utils/url.js';\n\n// =============================================================================\n// HORIZONTAL NAV LIST\n// =============================================================================\n\n/**\n * HorizontalNavList - Navigation item with dropdown for horizontal layout.\n */\nfunction HorizontalNavList({\n data,\n render,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: NavListProps): React.ReactNode {\n const pathname = useNavPathname();\n const anchorRef = useRef<HTMLButtonElement>(null);\n\n // Check if this item is active\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n // Check if any child is active\n const hasChild = Boolean(data.children?.length);\n const childActive = useMemo(() => {\n if (!hasChild) return false;\n return data.children!.some((child) => isActiveLink(pathname, child.path, child.deepMatch));\n }, [data.children, pathname, hasChild]);\n\n // Popover state\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n if (hasChild) {\n setOpen(true);\n }\n }, [hasChild]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n // Close on route change\n useEffect(() => {\n handleClose();\n }, [pathname, handleClose]);\n\n // Check permissions\n if (checkPermissions && data.allowedRoles) {\n const hasPermission = checkPermissions(data.allowedRoles);\n if (!hasPermission) return null;\n }\n\n return (\n <NavLi>\n <NavItem\n ref={anchorRef}\n // Data\n path={data.path}\n title={data.title}\n icon={data.icon}\n info={data.info}\n caption={data.caption}\n disabled={data.disabled}\n // State\n active={isActive || childActive}\n open={open}\n // Options\n depth={1}\n hasChild={hasChild}\n enabledRootRedirect={enabledRootRedirect}\n render={render}\n slotProps={slotProps?.rootItem}\n // Events\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n />\n\n {hasChild && (\n <Popover\n open={open}\n anchorEl={anchorRef.current}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n onMouseEnter: handleOpen,\n onMouseLeave: handleClose,\n sx: {\n pointerEvents: 'auto',\n minWidth: 'var(--nav-dropdown-paper-width, 180px)',\n borderRadius: 'var(--nav-dropdown-paper-radius, 8px)',\n boxShadow: 'var(--nav-dropdown-paper-shadow)',\n ...slotProps?.dropdown?.paper,\n },\n },\n }}\n sx={{\n pointerEvents: 'none',\n }}\n disableRestoreFocus\n >\n <HorizontalDropdown\n data={data.children!}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n </Popover>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// HORIZONTAL DROPDOWN\n// =============================================================================\n\ninterface HorizontalDropdownProps {\n data: NavItemDataProps[];\n render?: NavListProps['render'];\n slotProps?: NavListProps['slotProps'];\n checkPermissions?: NavListProps['checkPermissions'];\n enabledRootRedirect?: boolean;\n}\n\n/**\n * HorizontalDropdown - Dropdown content for horizontal nav items.\n */\nfunction HorizontalDropdown({\n data,\n render,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: HorizontalDropdownProps): React.ReactNode {\n const pathname = useNavPathname();\n\n return (\n <Paper elevation={0} sx={{ p: 1 }}>\n <NavUl sx={{ gap: 0.5 }}>\n {data.map((item) => {\n // Check permissions\n if (checkPermissions && item.allowedRoles) {\n const hasPermission = checkPermissions(item.allowedRoles);\n if (!hasPermission) return null;\n }\n\n const isActive = isActiveLink(pathname, item.path, item.deepMatch);\n\n return (\n <NavLi key={item.title}>\n <NavItem\n path={item.path}\n title={item.title}\n icon={item.icon}\n disabled={item.disabled}\n active={isActive}\n depth={2}\n render={render}\n slotProps={slotProps?.subItem}\n enabledRootRedirect={enabledRootRedirect}\n />\n </NavLi>\n );\n })}\n </NavUl>\n </Paper>\n );\n}\n\n// =============================================================================\n// NAV SECTION HORIZONTAL\n// =============================================================================\n\n/**\n * NavSectionHorizontal - Horizontal navigation section for header layouts.\n *\n * @example\n * ```tsx\n * const navConfig = [\n * {\n * items: [\n * { title: 'Home', path: '/', icon: <HomeIcon /> },\n * {\n * title: 'Products',\n * path: '/products',\n * children: [\n * { title: 'All', path: '/products' },\n * { title: 'New', path: '/products/new' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <NavProvider pathname={pathname}>\n * <NavSectionHorizontal data={navConfig} />\n * </NavProvider>\n * ```\n */\nexport function NavSectionHorizontal({\n sx,\n data,\n render,\n className,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: NavSectionProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...navSectionCssVars.horizontal(theme), ...overridesVars };\n\n // Flatten all items from all groups\n const items = useMemo(() => data.flatMap((group) => group.items), [data]);\n\n return (\n <Nav\n className={cn(navSectionClasses.root, navSectionClasses.horizontal, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl sx={{ flexDirection: 'row', gap: 'var(--nav-item-gap)' }}>\n {items.map((item) => (\n <HorizontalNavList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\n/**\n * Mini Navigation Section\n *\n * Compact icon-only navigation for collapsed sidebars.\n *\n * @module components/nav-section\n */\n\nimport { useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport { useTheme, styled } from '@mui/material/styles';\nimport Popover from '@mui/material/Popover';\nimport Paper from '@mui/material/Paper';\nimport Tooltip from '@mui/material/Tooltip';\n\nimport type { NavItemDataProps, NavListProps, NavSectionProps } from './types.js';\nimport { Nav, NavUl, NavLi, NavItemBase, NavIcon } from './components.js';\nimport { NavItem } from './nav-item.js';\nimport { useNavPathname } from './nav-context.js';\nimport { navSectionClasses, navSectionCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink } from '../../utils/url.js';\n\n// =============================================================================\n// MINI NAV ITEM\n// =============================================================================\n\nconst MiniNavButton = styled(NavItemBase)(({ theme }) => ({\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n textAlign: 'center',\n padding: 'var(--nav-item-padding, 8px)',\n gap: 4,\n}));\n\nconst MiniTitle = styled('span')({\n fontSize: 'var(--nav-item-font-size, 0.625rem)',\n fontWeight: 500,\n lineHeight: 1.5,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '100%',\n});\n\n// =============================================================================\n// MINI NAV LIST\n// =============================================================================\n\n/**\n * MiniNavList - Navigation item for mini layout with tooltip popover.\n */\nfunction MiniNavList({\n data,\n render,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: NavListProps): React.ReactNode {\n const pathname = useNavPathname();\n const anchorRef = useRef<HTMLButtonElement>(null);\n\n // Check if this item is active\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n // Check if any child is active\n const hasChild = Boolean(data.children?.length);\n const childActive = useMemo(() => {\n if (!hasChild) return false;\n return data.children!.some((child) => isActiveLink(pathname, child.path, child.deepMatch));\n }, [data.children, pathname, hasChild]);\n\n // Popover state\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n if (hasChild) {\n setOpen(true);\n }\n }, [hasChild]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n // Close on route change\n useEffect(() => {\n handleClose();\n }, [pathname, handleClose]);\n\n // Check permissions\n if (checkPermissions && data.allowedRoles) {\n const hasPermission = checkPermissions(data.allowedRoles);\n if (!hasPermission) return null;\n }\n\n // Resolve icon\n const icon = typeof data.icon === 'string' && render?.navIcon ? render.navIcon[data.icon] : data.icon;\n\n const content = (\n <MiniNavButton\n ref={anchorRef}\n active={isActive || childActive}\n disabled={data.disabled}\n open={open}\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n sx={slotProps?.rootItem?.sx}\n >\n <NavIcon icon={icon} className={slotProps?.rootItem?.icon as string} />\n <MiniTitle>{data.title}</MiniTitle>\n </MiniNavButton>\n );\n\n return (\n <NavLi>\n {hasChild ? (\n <>\n {content}\n <Popover\n open={open}\n anchorEl={anchorRef.current}\n anchorOrigin={{\n vertical: 'center',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'center',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n onMouseEnter: handleOpen,\n onMouseLeave: handleClose,\n sx: {\n pointerEvents: 'auto',\n ml: 1,\n minWidth: 'var(--nav-tooltip-paper-width, 160px)',\n borderRadius: 1,\n ...slotProps?.dropdown?.paper,\n },\n },\n }}\n sx={{\n pointerEvents: 'none',\n }}\n disableRestoreFocus\n >\n <MiniDropdown\n data={data.children!}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n </Popover>\n </>\n ) : (\n <Tooltip title={data.title} placement=\"right\" arrow>\n {content}\n </Tooltip>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// MINI DROPDOWN\n// =============================================================================\n\ninterface MiniDropdownProps {\n data: NavItemDataProps[];\n render?: NavListProps['render'];\n slotProps?: NavListProps['slotProps'];\n checkPermissions?: NavListProps['checkPermissions'];\n enabledRootRedirect?: boolean;\n}\n\n/**\n * MiniDropdown - Dropdown content for mini nav items.\n */\nfunction MiniDropdown({\n data,\n render,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: MiniDropdownProps): React.ReactNode {\n const pathname = useNavPathname();\n\n return (\n <Paper elevation={0} sx={{ p: 1 }}>\n <NavUl sx={{ gap: 0.5 }}>\n {data.map((item) => {\n // Check permissions\n if (checkPermissions && item.allowedRoles) {\n const hasPermission = checkPermissions(item.allowedRoles);\n if (!hasPermission) return null;\n }\n\n const isActive = isActiveLink(pathname, item.path, item.deepMatch);\n\n return (\n <NavLi key={item.title}>\n <NavItem\n path={item.path}\n title={item.title}\n icon={item.icon}\n disabled={item.disabled}\n active={isActive}\n depth={2}\n render={render}\n slotProps={slotProps?.subItem}\n enabledRootRedirect={enabledRootRedirect}\n />\n </NavLi>\n );\n })}\n </NavUl>\n </Paper>\n );\n}\n\n// =============================================================================\n// NAV SECTION MINI\n// =============================================================================\n\n/**\n * NavSectionMini - Compact navigation for collapsed sidebars.\n *\n * @example\n * ```tsx\n * const navConfig = [\n * {\n * items: [\n * { title: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> },\n * {\n * title: 'Users',\n * path: '/users',\n * icon: <UsersIcon />,\n * children: [\n * { title: 'List', path: '/users/list' },\n * { title: 'Create', path: '/users/create' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <NavProvider pathname={pathname}>\n * <NavSectionMini data={navConfig} />\n * </NavProvider>\n * ```\n */\nexport function NavSectionMini({\n sx,\n data,\n render,\n className,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: NavSectionProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...navSectionCssVars.mini(theme), ...overridesVars };\n\n // Flatten all items from all groups\n const items = useMemo(() => data.flatMap((group) => group.items), [data]);\n\n return (\n <Nav\n className={cn(navSectionClasses.root, navSectionClasses.mini, className)}\n sx={[\n {\n ...cssVars,\n alignItems: 'center',\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n >\n <NavUl sx={{ gap: 'var(--nav-item-gap)', alignItems: 'center' }}>\n {items.map((item) => (\n <MiniNavList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","/**\n * Mega Menu Styles\n *\n * CSS custom properties and class names for mega menus.\n *\n * @module components/mega-menu\n */\n\nimport type { Theme, CSSObject } from '@mui/material/styles';\nimport type { MegaMenuVariant } from './types.js';\nimport { createComponentClasses } from '../../utils/create-classes.js';\n\n// =============================================================================\n// CLASS NAMES\n// =============================================================================\n\n/**\n * CSS class names for mega menu components.\n */\nexport const megaMenuClasses = createComponentClasses('mega-menu', [\n 'root',\n 'horizontal',\n 'vertical',\n 'mobile',\n 'ul',\n 'li',\n 'item',\n 'icon',\n 'title',\n 'info',\n 'arrow',\n 'dropdown',\n 'subheader',\n 'subItem',\n 'tags',\n 'moreLink',\n 'slide',\n 'active',\n 'disabled',\n 'open',\n] as const);\n\n// =============================================================================\n// CSS CUSTOM PROPERTIES\n// =============================================================================\n\n/**\n * Get CSS variables for mega menu based on variant.\n */\nexport function megaMenuCssVars(theme: Theme, variant: MegaMenuVariant): CSSObject {\n const commonVars: CSSObject = {\n // Item spacing\n '--nav-item-gap': '6px',\n '--nav-item-radius': '8px',\n // Icon\n '--nav-icon-size': '22px',\n '--nav-icon-margin': '0 8px 0 0',\n // Text\n '--nav-item-font-size': '0.875rem',\n '--nav-subheader-font-size': '0.6875rem',\n '--nav-subheader-font-weight': '700',\n // Colors - inactive\n '--nav-item-color': theme.palette.text.primary,\n '--nav-icon-color': theme.palette.text.secondary,\n '--nav-item-bg': 'transparent',\n // Colors - hover\n '--nav-item-hover-bg': theme.palette.action.hover,\n '--nav-item-hover-color': theme.palette.text.primary,\n // Colors - active\n '--nav-item-active-bg': theme.palette.action.selected,\n '--nav-item-active-color': theme.palette.primary.main,\n '--nav-icon-active-color': theme.palette.primary.main,\n // Colors - disabled\n '--nav-item-disabled-color': theme.palette.text.disabled,\n };\n\n switch (variant) {\n case 'horizontal':\n return {\n ...commonVars,\n '--nav-item-padding': '8px 14px',\n '--nav-item-min-height': '36px',\n // Dropdown\n '--nav-dropdown-width': '800px',\n '--nav-dropdown-max-height': '400px',\n '--nav-dropdown-radius': '12px',\n '--nav-dropdown-shadow': theme.shadows[20],\n '--nav-dropdown-padding': '24px',\n };\n\n case 'vertical':\n return {\n ...commonVars,\n '--nav-item-padding': '8px 12px',\n '--nav-item-min-height': '40px',\n // Dropdown\n '--nav-dropdown-width': '280px',\n '--nav-dropdown-max-height': '350px',\n '--nav-dropdown-radius': '10px',\n '--nav-dropdown-shadow': theme.shadows[16],\n '--nav-dropdown-padding': '16px',\n };\n\n case 'mobile':\n return {\n ...commonVars,\n '--nav-item-padding': '12px 16px',\n '--nav-item-min-height': '44px',\n // No dropdown for mobile - uses accordion style\n };\n\n default:\n return commonVars;\n }\n}\n","'use client';\n\n/**\n * Horizontal Mega Menu\n *\n * Rich dropdown navigation for header layouts.\n *\n * @module components/mega-menu\n */\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport Box from '@mui/material/Box';\nimport { useNavPathname } from '../nav-section/nav-context.js';\nimport Link from '@mui/material/Link';\nimport Paper from '@mui/material/Paper';\nimport Popover from '@mui/material/Popover';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { styled, useTheme, alpha } from '@mui/material/styles';\n\nimport type { MegaMenuProps, MegaMenuListProps } from './types.js';\nimport { megaMenuClasses, megaMenuCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink, isExternalLink } from '../../utils/url.js';\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst Nav = styled('nav')({\n display: 'flex',\n flexShrink: 0,\n});\n\nconst NavUl = styled('ul')({\n display: 'flex',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n});\n\nconst NavLi = styled('li')({\n display: 'flex',\n});\n\nconst NavButton = styled('button')<{ active?: boolean; open?: boolean }>(({ theme, active, open }) => ({\n all: 'unset',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n padding: 'var(--nav-item-padding)',\n minHeight: 'var(--nav-item-min-height)',\n borderRadius: 'var(--nav-item-radius)',\n fontSize: 'var(--nav-item-font-size)',\n fontWeight: 500,\n color: 'var(--nav-item-color)',\n backgroundColor: 'var(--nav-item-bg)',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n },\n ...(active && {\n backgroundColor: 'var(--nav-item-active-bg)',\n color: 'var(--nav-item-active-color)',\n }),\n ...(open && {\n backgroundColor: 'var(--nav-item-hover-bg)',\n }),\n '&:disabled': {\n color: 'var(--nav-item-disabled-color)',\n cursor: 'not-allowed',\n },\n}));\n\nconst IconWrapper = styled('span')({\n width: 'var(--nav-icon-size)',\n height: 'var(--nav-icon-size)',\n marginRight: 8,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--nav-icon-color)',\n '& svg': {\n width: '100%',\n height: '100%',\n },\n});\n\nconst ArrowIcon = styled('span')<{ open?: boolean }>(({ open }) => ({\n marginLeft: 6,\n width: 16,\n height: 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n '&::before': {\n content: '\"\"',\n width: 6,\n height: 6,\n borderStyle: 'solid',\n borderWidth: '0 0 1.5px 1.5px',\n borderColor: 'currentColor',\n transform: 'rotate(-45deg)',\n },\n}));\n\nconst DropdownContent = styled(Paper)(({ theme }) => ({\n width: 'var(--nav-dropdown-width)',\n maxHeight: 'var(--nav-dropdown-max-height)',\n borderRadius: 'var(--nav-dropdown-radius)',\n padding: 'var(--nav-dropdown-padding)',\n overflow: 'auto',\n display: 'flex',\n gap: 24,\n}));\n\nconst SectionColumn = styled('div')({\n flex: 1,\n minWidth: 0,\n});\n\nconst SectionHeader = styled(Typography)(({ theme }) => ({\n fontSize: 'var(--nav-subheader-font-size)',\n fontWeight: 'var(--nav-subheader-font-weight)',\n color: theme.palette.text.disabled,\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n marginBottom: 12,\n}));\n\nconst SubItemLink = styled(Link, {\n shouldForwardProp: (prop) => prop !== 'active',\n})<{ active?: boolean }>(({ theme, active }) => ({\n display: 'block',\n padding: '6px 0',\n fontSize: '0.875rem',\n color: active ? theme.palette.primary.main : theme.palette.text.secondary,\n textDecoration: 'none',\n transition: theme.transitions.create('color', {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n color: theme.palette.text.primary,\n },\n}));\n\nconst TagsContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n marginTop: 16,\n}));\n\nconst Tag = styled(Link)(({ theme }) => ({\n display: 'inline-flex',\n padding: '4px 10px',\n fontSize: '0.75rem',\n fontWeight: 500,\n color: theme.palette.text.secondary,\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n borderRadius: 6,\n textDecoration: 'none',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.grey[500], 0.16),\n color: theme.palette.text.primary,\n },\n}));\n\nconst MoreLink = styled(Link)(({ theme }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n padding: '8px 0',\n fontSize: '0.875rem',\n fontWeight: 600,\n color: theme.palette.primary.main,\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n '&::after': {\n content: '\"→\"',\n marginLeft: 4,\n },\n}));\n\n// =============================================================================\n// MEGA MENU LIST\n// =============================================================================\n\nfunction MegaMenuList({ data, render, slotProps, slots, enabledRootRedirect }: MegaMenuListProps): React.ReactNode {\n const pathname = useNavPathname();\n const anchorRef = useRef<HTMLButtonElement>(null);\n\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n const hasChild = Boolean(data.children?.length || data.tags?.length || data.slides?.length);\n\n const childActive = useMemo(() => {\n if (!data.children?.length) return false;\n return data.children.some((section) => section.items.some((item) => isActiveLink(pathname, item.path)));\n }, [data.children, pathname]);\n\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n if (hasChild) {\n setOpen(true);\n }\n }, [hasChild]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n useEffect(() => {\n handleClose();\n }, [pathname, handleClose]);\n\n // Resolve icon\n const icon = typeof data.icon === 'string' && render?.navIcon ? render.navIcon[data.icon] : data.icon;\n\n return (\n <NavLi className={megaMenuClasses.li}>\n <NavButton\n ref={anchorRef}\n className={cn(\n megaMenuClasses.item,\n (isActive || childActive) && megaMenuClasses.active,\n open && megaMenuClasses.open\n )}\n active={isActive || childActive}\n open={open}\n disabled={data.disabled}\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n >\n {icon && <IconWrapper className={megaMenuClasses.icon}>{icon}</IconWrapper>}\n <span className={megaMenuClasses.title}>{data.title}</span>\n {hasChild && <ArrowIcon open={open} className={megaMenuClasses.arrow} />}\n </NavButton>\n\n {hasChild && (\n <Popover\n open={open}\n anchorEl={anchorRef.current}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n onMouseEnter: handleOpen,\n onMouseLeave: handleClose,\n sx: {\n pointerEvents: 'auto',\n ...slotProps?.dropdown,\n },\n },\n }}\n sx={{\n pointerEvents: 'none',\n }}\n disableRestoreFocus\n >\n {slots?.topArea}\n\n <DropdownContent elevation={0} className={megaMenuClasses.dropdown}>\n {/* Child sections */}\n {data.children?.map((section, idx) => (\n <SectionColumn key={section.subheader ?? idx}>\n {section.subheader && (\n <SectionHeader className={megaMenuClasses.subheader}>{section.subheader}</SectionHeader>\n )}\n <Stack spacing={0.5}>\n {section.items.map((item) => {\n const itemActive = isActiveLink(pathname, item.path);\n const isExternal = isExternalLink(item.path);\n\n return (\n <SubItemLink\n key={item.title}\n href={item.path}\n active={itemActive}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n className={cn(megaMenuClasses.subItem, itemActive && megaMenuClasses.active)}\n sx={slotProps?.subItem}\n >\n {item.title}\n </SubItemLink>\n );\n })}\n </Stack>\n\n {/* More link at bottom of section */}\n {idx === 0 && data.moreLink && (\n <Box sx={{ mt: 2 }}>\n <MoreLink href={data.moreLink.path} className={megaMenuClasses.moreLink} sx={slotProps?.moreLink}>\n {data.moreLink.title}\n </MoreLink>\n </Box>\n )}\n </SectionColumn>\n ))}\n </DropdownContent>\n\n {/* Tags */}\n {data.tags && data.tags.length > 0 && (\n <Box sx={{ px: 'var(--nav-dropdown-padding)', pb: 'var(--nav-dropdown-padding)' }}>\n <TagsContainer className={megaMenuClasses.tags} sx={slotProps?.tags}>\n {data.tags.map((tag) => (\n <Tag key={tag.title} href={tag.path}>\n {tag.title}\n </Tag>\n ))}\n </TagsContainer>\n </Box>\n )}\n\n {slots?.bottomArea}\n </Popover>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// MEGA MENU HORIZONTAL\n// =============================================================================\n\n/**\n * MegaMenuHorizontal - Rich dropdown navigation for header layouts.\n *\n * @example\n * ```tsx\n * const menuData = [\n * {\n * title: 'Products',\n * path: '/products',\n * icon: <ProductsIcon />,\n * children: [\n * {\n * subheader: 'Categories',\n * items: [\n * { title: 'Electronics', path: '/products/electronics' },\n * { title: 'Clothing', path: '/products/clothing' },\n * ],\n * },\n * {\n * subheader: 'Featured',\n * items: [\n * { title: 'New Arrivals', path: '/products/new' },\n * { title: 'Best Sellers', path: '/products/best' },\n * ],\n * },\n * ],\n * tags: [\n * { title: 'Sale', path: '/products?filter=sale' },\n * { title: 'Trending', path: '/products?filter=trending' },\n * ],\n * moreLink: { title: 'View All Products', path: '/products' },\n * },\n * { title: 'About', path: '/about' },\n * ];\n *\n * <MegaMenuHorizontal data={menuData} />\n * ```\n */\nexport function MegaMenuHorizontal({\n sx,\n data,\n render,\n slotProps,\n slots,\n className,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: MegaMenuProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...megaMenuCssVars(theme, 'horizontal'), ...overridesVars };\n\n return (\n <Nav\n className={cn(megaMenuClasses.root, megaMenuClasses.horizontal, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl className={megaMenuClasses.ul} sx={{ gap: 'var(--nav-item-gap)' }}>\n {data.map((item) => (\n <MegaMenuList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n slots={slots}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\n/**\n * Vertical Mega Menu\n *\n * Rich dropdown navigation for sidebar layouts.\n *\n * @module components/mega-menu\n */\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport Box from '@mui/material/Box';\nimport { useNavPathname } from '../nav-section/nav-context.js';\nimport Link from '@mui/material/Link';\nimport Paper from '@mui/material/Paper';\nimport Popover from '@mui/material/Popover';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { styled, useTheme } from '@mui/material/styles';\n\nimport type { MegaMenuProps, MegaMenuListProps } from './types.js';\nimport { megaMenuClasses, megaMenuCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink, isExternalLink } from '../../utils/url.js';\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst Nav = styled('nav')({\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n});\n\nconst NavUl = styled('ul')({\n display: 'flex',\n flexDirection: 'column',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n});\n\nconst NavLi = styled('li')({\n display: 'flex',\n flexDirection: 'column',\n});\n\nconst NavButton = styled('button')<{ active?: boolean; open?: boolean }>(({ theme, active, open }) => ({\n all: 'unset',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n padding: 'var(--nav-item-padding)',\n minHeight: 'var(--nav-item-min-height)',\n borderRadius: 'var(--nav-item-radius)',\n fontSize: 'var(--nav-item-font-size)',\n fontWeight: 500,\n color: 'var(--nav-item-color)',\n backgroundColor: 'var(--nav-item-bg)',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n },\n ...(active && {\n backgroundColor: 'var(--nav-item-active-bg)',\n color: 'var(--nav-item-active-color)',\n }),\n ...(open && {\n backgroundColor: 'var(--nav-item-hover-bg)',\n }),\n '&:disabled': {\n color: 'var(--nav-item-disabled-color)',\n cursor: 'not-allowed',\n },\n}));\n\nconst IconWrapper = styled('span')({\n width: 'var(--nav-icon-size)',\n height: 'var(--nav-icon-size)',\n marginRight: 12,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--nav-icon-color)',\n '& svg': {\n width: '100%',\n height: '100%',\n },\n});\n\nconst ArrowIcon = styled('span')<{ open?: boolean }>(({ open }) => ({\n marginLeft: 'auto',\n width: 16,\n height: 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n '&::before': {\n content: '\"\"',\n width: 5,\n height: 5,\n borderStyle: 'solid',\n borderWidth: '0 1.5px 1.5px 0',\n borderColor: 'currentColor',\n transform: 'rotate(-45deg)',\n },\n}));\n\nconst DropdownContent = styled(Paper)(({ theme }) => ({\n width: 'var(--nav-dropdown-width)',\n maxHeight: 'var(--nav-dropdown-max-height)',\n borderRadius: 'var(--nav-dropdown-radius)',\n padding: 'var(--nav-dropdown-padding)',\n overflow: 'auto',\n}));\n\nconst SectionHeader = styled(Typography)(({ theme }) => ({\n fontSize: 'var(--nav-subheader-font-size)',\n fontWeight: 'var(--nav-subheader-font-weight)',\n color: theme.palette.text.disabled,\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n marginBottom: 8,\n marginTop: 16,\n // `:first-child` — homogeneous list of subheaders; child-position\n // selector is equivalent to of-type but doesn't tie correctness\n // to tag-name uniqueness.\n '&:first-child': {\n marginTop: 0,\n },\n}));\n\nconst SubItemLink = styled(Link, {\n shouldForwardProp: (prop) => prop !== 'active',\n})<{ active?: boolean }>(({ theme, active }) => ({\n display: 'block',\n padding: '6px 0',\n fontSize: '0.875rem',\n color: active ? theme.palette.primary.main : theme.palette.text.secondary,\n textDecoration: 'none',\n transition: theme.transitions.create('color', {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n color: theme.palette.text.primary,\n },\n}));\n\n// =============================================================================\n// MEGA MENU LIST\n// =============================================================================\n\nfunction MegaMenuList({ data, render, slotProps, slots, enabledRootRedirect }: MegaMenuListProps): React.ReactNode {\n const pathname = useNavPathname();\n const anchorRef = useRef<HTMLButtonElement>(null);\n\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n const hasChild = Boolean(data.children?.length);\n\n const childActive = useMemo(() => {\n if (!data.children?.length) return false;\n return data.children.some((section) => section.items.some((item) => isActiveLink(pathname, item.path)));\n }, [data.children, pathname]);\n\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n if (hasChild) {\n setOpen(true);\n }\n }, [hasChild]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n useEffect(() => {\n handleClose();\n }, [pathname, handleClose]);\n\n // Resolve icon\n const icon = typeof data.icon === 'string' && render?.navIcon ? render.navIcon[data.icon] : data.icon;\n\n return (\n <NavLi className={megaMenuClasses.li}>\n <NavButton\n ref={anchorRef}\n className={cn(\n megaMenuClasses.item,\n (isActive || childActive) && megaMenuClasses.active,\n open && megaMenuClasses.open\n )}\n active={isActive || childActive}\n open={open}\n disabled={data.disabled}\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n >\n {icon && <IconWrapper className={megaMenuClasses.icon}>{icon}</IconWrapper>}\n <span className={megaMenuClasses.title}>{data.title}</span>\n {hasChild && <ArrowIcon open={open} className={megaMenuClasses.arrow} />}\n </NavButton>\n\n {hasChild && (\n <Popover\n open={open}\n anchorEl={anchorRef.current}\n anchorOrigin={{\n vertical: 'center',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'center',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n onMouseEnter: handleOpen,\n onMouseLeave: handleClose,\n sx: {\n pointerEvents: 'auto',\n ml: 1,\n ...slotProps?.dropdown,\n },\n },\n }}\n sx={{\n pointerEvents: 'none',\n }}\n disableRestoreFocus\n >\n {slots?.topArea}\n\n <DropdownContent elevation={0} className={megaMenuClasses.dropdown}>\n {data.children?.map((section, idx) => (\n <Box key={section.subheader ?? idx}>\n {section.subheader && (\n <SectionHeader className={megaMenuClasses.subheader}>{section.subheader}</SectionHeader>\n )}\n <Stack spacing={0.5}>\n {section.items.map((item) => {\n const itemActive = isActiveLink(pathname, item.path);\n const isExternal = isExternalLink(item.path);\n\n return (\n <SubItemLink\n key={item.title}\n href={item.path}\n active={itemActive}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n className={cn(megaMenuClasses.subItem, itemActive && megaMenuClasses.active)}\n sx={slotProps?.subItem}\n >\n {item.title}\n </SubItemLink>\n );\n })}\n </Stack>\n </Box>\n ))}\n </DropdownContent>\n\n {slots?.bottomArea}\n </Popover>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// MEGA MENU VERTICAL\n// =============================================================================\n\n/**\n * MegaMenuVertical - Rich dropdown navigation for sidebar layouts.\n *\n * @example\n * ```tsx\n * const menuData = [\n * {\n * title: 'Products',\n * path: '/products',\n * icon: <ProductsIcon />,\n * children: [\n * {\n * subheader: 'Categories',\n * items: [\n * { title: 'Electronics', path: '/products/electronics' },\n * { title: 'Clothing', path: '/products/clothing' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <MegaMenuVertical data={menuData} />\n * ```\n */\nexport function MegaMenuVertical({\n sx,\n data,\n render,\n slotProps,\n slots,\n className,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: MegaMenuProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...megaMenuCssVars(theme, 'vertical'), ...overridesVars };\n\n return (\n <Nav\n className={cn(megaMenuClasses.root, megaMenuClasses.vertical, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl className={megaMenuClasses.ul} sx={{ gap: 'var(--nav-item-gap)' }}>\n {data.map((item) => (\n <MegaMenuList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n slots={slots}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\n/**\n * Mobile Mega Menu\n *\n * Accordion-style navigation for mobile layouts.\n *\n * @module components/mega-menu\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport Box from '@mui/material/Box';\nimport { useNavPathname } from '../nav-section/nav-context.js';\nimport Link from '@mui/material/Link';\nimport Collapse from '@mui/material/Collapse';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { styled, useTheme, type Theme } from '@mui/material/styles';\n\nimport type { MegaMenuProps, MegaMenuListProps } from './types.js';\nimport { megaMenuClasses, megaMenuCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink, isExternalLink } from '../../utils/url.js';\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst Nav = styled('nav')({\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n width: '100%',\n});\n\nconst NavUl = styled('ul')({\n display: 'flex',\n flexDirection: 'column',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n width: '100%',\n});\n\nconst NavLi = styled('li')({\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n});\n\nconst navItemStyles = (theme: Theme, active?: boolean) => ({\n all: 'unset' as const,\n boxSizing: 'border-box' as const,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n padding: 'var(--nav-item-padding)',\n minHeight: 'var(--nav-item-min-height)',\n fontSize: 'var(--nav-item-font-size)',\n fontWeight: 500,\n color: 'var(--nav-item-color)',\n borderBottom: `1px solid ${theme.palette.divider}`,\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n },\n ...(active && {\n color: 'var(--nav-item-active-color)',\n }),\n});\n\nconst NavButton = styled('button')<{ active?: boolean; open?: boolean }>(({ theme, active }) => ({\n ...navItemStyles(theme, active),\n '&:disabled': {\n color: 'var(--nav-item-disabled-color)',\n cursor: 'not-allowed',\n },\n}));\n\nconst NavLink = styled('a')<{ active?: boolean }>(({ theme, active }) => navItemStyles(theme, active));\n\nconst IconWrapper = styled('span')({\n width: 'var(--nav-icon-size)',\n height: 'var(--nav-icon-size)',\n marginRight: 12,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--nav-icon-color)',\n '& svg': {\n width: '100%',\n height: '100%',\n },\n});\n\nconst ArrowIcon = styled('span')<{ open?: boolean }>(({ open }) => ({\n marginLeft: 'auto',\n width: 20,\n height: 20,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n '&::before': {\n content: '\"\"',\n width: 6,\n height: 6,\n borderStyle: 'solid',\n borderWidth: '0 0 2px 2px',\n borderColor: 'currentColor',\n transform: 'rotate(-45deg)',\n },\n}));\n\nconst CollapseContent = styled(Box)(({ theme }) => ({\n padding: '8px 0',\n paddingLeft: 40,\n backgroundColor: theme.palette.background.neutral,\n}));\n\nconst SectionHeader = styled(Typography)(({ theme }) => ({\n fontSize: 'var(--nav-subheader-font-size)',\n fontWeight: 'var(--nav-subheader-font-weight)',\n color: theme.palette.text.disabled,\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n padding: '12px 16px 8px',\n}));\n\nconst SubItemLink = styled(Link, {\n shouldForwardProp: (prop) => prop !== 'active',\n})<{ active?: boolean }>(({ theme, active }) => ({\n display: 'block',\n padding: '10px 16px',\n fontSize: '0.875rem',\n color: active ? theme.palette.primary.main : theme.palette.text.secondary,\n textDecoration: 'none',\n transition: theme.transitions.create('color', {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n color: theme.palette.text.primary,\n },\n}));\n\n// =============================================================================\n// MEGA MENU LIST\n// =============================================================================\n\nfunction MegaMenuList({ data, render, slotProps, enabledRootRedirect }: MegaMenuListProps): React.ReactNode {\n const pathname = useNavPathname();\n\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n const hasChild = Boolean(data.children?.length);\n\n const childActive = useMemo(() => {\n if (!data.children?.length) return false;\n return data.children.some((section) => section.items.some((item) => isActiveLink(pathname, item.path)));\n }, [data.children, pathname]);\n\n // Start open if child is active\n const [open, setOpen] = useState(childActive);\n\n const handleToggle = useCallback(() => {\n if (hasChild) {\n setOpen((prev) => !prev);\n }\n }, [hasChild]);\n\n // Resolve icon\n const icon = typeof data.icon === 'string' && render?.navIcon ? render.navIcon[data.icon] : data.icon;\n\n // Simple link for items without children\n if (!hasChild) {\n const isExternal = isExternalLink(data.path);\n return (\n <NavLi className={megaMenuClasses.li}>\n <NavLink\n href={data.path}\n className={cn(megaMenuClasses.item, isActive && megaMenuClasses.active)}\n active={isActive}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n >\n {icon && <IconWrapper className={megaMenuClasses.icon}>{icon}</IconWrapper>}\n <span className={megaMenuClasses.title}>{data.title}</span>\n </NavLink>\n </NavLi>\n );\n }\n\n return (\n <NavLi className={megaMenuClasses.li}>\n <NavButton\n className={cn(\n megaMenuClasses.item,\n (isActive || childActive) && megaMenuClasses.active,\n open && megaMenuClasses.open\n )}\n active={isActive || childActive}\n open={open}\n disabled={data.disabled}\n onClick={handleToggle}\n >\n {icon && <IconWrapper className={megaMenuClasses.icon}>{icon}</IconWrapper>}\n <span className={megaMenuClasses.title}>{data.title}</span>\n <ArrowIcon open={open} className={megaMenuClasses.arrow} />\n </NavButton>\n\n <Collapse in={open} unmountOnExit>\n <CollapseContent>\n {data.children?.map((section, idx) => (\n <Box key={section.subheader ?? idx}>\n {section.subheader && (\n <SectionHeader className={megaMenuClasses.subheader}>{section.subheader}</SectionHeader>\n )}\n <Stack>\n {section.items.map((item) => {\n const itemActive = isActiveLink(pathname, item.path);\n const isExternal = isExternalLink(item.path);\n\n return (\n <SubItemLink\n key={item.title}\n href={item.path}\n active={itemActive}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n className={cn(megaMenuClasses.subItem, itemActive && megaMenuClasses.active)}\n sx={slotProps?.subItem}\n >\n {item.title}\n </SubItemLink>\n );\n })}\n </Stack>\n </Box>\n ))}\n </CollapseContent>\n </Collapse>\n </NavLi>\n );\n}\n\n// =============================================================================\n// MEGA MENU MOBILE\n// =============================================================================\n\n/**\n * MegaMenuMobile - Accordion-style navigation for mobile layouts.\n *\n * @example\n * ```tsx\n * const menuData = [\n * {\n * title: 'Products',\n * path: '/products',\n * icon: <ProductsIcon />,\n * children: [\n * {\n * subheader: 'Categories',\n * items: [\n * { title: 'Electronics', path: '/products/electronics' },\n * { title: 'Clothing', path: '/products/clothing' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <MegaMenuMobile data={menuData} />\n * ```\n */\nexport function MegaMenuMobile({\n sx,\n data,\n render,\n slotProps,\n className,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: MegaMenuProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...megaMenuCssVars(theme, 'mobile'), ...overridesVars };\n\n return (\n <Nav\n className={cn(megaMenuClasses.root, megaMenuClasses.mobile, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl className={megaMenuClasses.ul}>\n {data.map((item) => (\n <MegaMenuList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\nimport { createContext, useContext, useState, useEffect, useRef, useCallback, type ReactNode } from 'react';\n\ninterface ScrollSpyContextValue {\n activeId: string | null;\n registerSection: (id: string, element: HTMLElement) => void;\n unregisterSection: (id: string) => void;\n}\n\nconst ScrollSpyContext = createContext<ScrollSpyContextValue>({\n activeId: null,\n registerSection: () => {},\n unregisterSection: () => {},\n});\n\nexport function useScrollSpy() {\n return useContext(ScrollSpyContext);\n}\n\ninterface ScrollSpyProviderProps {\n children: ReactNode;\n /** Offset from top in pixels for activation threshold */\n offset?: number;\n /** Root element to observe (defaults to viewport) */\n root?: HTMLElement | null;\n /**\n * CSS selector for heading elements to auto-observe.\n * When set, headings matching this selector inside the container\n * are automatically registered (no need for ScrollSpySection wrappers).\n * @default 'h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]'\n */\n headingSelector?: string;\n /** Ref to the container to scan for headings. Defaults to document. */\n containerRef?: React.RefObject<HTMLElement | null>;\n}\n\nexport function ScrollSpyProvider({\n children,\n offset = 80,\n root = null,\n headingSelector = 'h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]',\n containerRef,\n}: ScrollSpyProviderProps) {\n const [activeId, setActiveId] = useState<string | null>(null);\n const sectionsRef = useRef<Map<string, HTMLElement>>(new Map());\n const observerRef = useRef<IntersectionObserver | null>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n // Create IntersectionObserver\n const createObserver = useCallback(() => {\n observerRef.current?.disconnect();\n\n const observer = new IntersectionObserver(\n (entries) => {\n // Find the topmost visible entry\n const visible = entries\n .filter((e) => e.isIntersecting)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);\n\n if (visible.length > 0) {\n setActiveId(visible[0].target.id);\n }\n },\n {\n root,\n rootMargin: `-${offset}px 0px -60% 0px`,\n threshold: 0,\n }\n );\n\n sectionsRef.current.forEach((element) => observer.observe(element));\n observerRef.current = observer;\n }, [offset, root]);\n\n // Auto-scan for headings with IDs\n useEffect(() => {\n if (!headingSelector) return undefined;\n\n // Wait a tick for content to render\n const timer = setTimeout(() => {\n const container = containerRef?.current ?? wrapperRef.current;\n if (!container) return;\n\n const headings = container.querySelectorAll<HTMLElement>(headingSelector);\n headings.forEach((heading) => {\n if (heading.id) {\n sectionsRef.current.set(heading.id, heading);\n }\n });\n\n createObserver();\n }, 100);\n\n return () => {\n clearTimeout(timer);\n observerRef.current?.disconnect();\n };\n }, [headingSelector, containerRef, createObserver]);\n\n // Also observe via MutationObserver to catch dynamically added headings\n useEffect(() => {\n if (!headingSelector) return undefined;\n\n const container = containerRef?.current ?? wrapperRef.current;\n if (!container) return undefined;\n\n const mutationObserver = new MutationObserver(() => {\n const headings = container.querySelectorAll<HTMLElement>(headingSelector);\n let changed = false;\n\n headings.forEach((heading) => {\n if (heading.id && !sectionsRef.current.has(heading.id)) {\n sectionsRef.current.set(heading.id, heading);\n changed = true;\n }\n });\n\n if (changed) {\n createObserver();\n }\n });\n\n mutationObserver.observe(container, { childList: true, subtree: true });\n\n return () => mutationObserver.disconnect();\n }, [headingSelector, containerRef, createObserver]);\n\n const registerSection = useCallback((id: string, element: HTMLElement) => {\n sectionsRef.current.set(id, element);\n observerRef.current?.observe(element);\n }, []);\n\n const unregisterSection = useCallback((id: string) => {\n const element = sectionsRef.current.get(id);\n if (element) observerRef.current?.unobserve(element);\n sectionsRef.current.delete(id);\n }, []);\n\n return (\n <ScrollSpyContext.Provider value={{ activeId, registerSection, unregisterSection }}>\n <div ref={wrapperRef}>{children}</div>\n </ScrollSpyContext.Provider>\n );\n}\n","'use client';\n\nimport { useEffect, useRef, type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { useScrollSpy } from './scroll-spy-provider';\n\ninterface ScrollSpySectionProps {\n id: string;\n children: ReactNode;\n sx?: SxProps<Theme>;\n}\n\nexport function ScrollSpySection({ id, children, sx }: ScrollSpySectionProps) {\n const ref = useRef<HTMLDivElement>(null);\n const { registerSection, unregisterSection } = useScrollSpy();\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return undefined;\n registerSection(id, element);\n return () => unregisterSection(id);\n }, [id, registerSection, unregisterSection]);\n\n return (\n <Box ref={ref} id={id} sx={sx}>\n {children}\n </Box>\n );\n}\n","'use client';\n\nimport { type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\ninterface DocLayoutProps {\n sidebar?: ReactNode;\n sectionNav?: ReactNode;\n children: ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/**\n * 3-column responsive documentation layout.\n * - Left: sidebar (collapsible tree nav)\n * - Center: content (fills available width)\n * - Right: section nav (ToC from headings)\n */\nexport function DocLayout({ sidebar, sectionNav, children, sx }: DocLayoutProps) {\n return (\n <Box\n sx={{\n display: 'flex',\n width: '100%',\n ...(sx as any),\n }}\n >\n {sidebar && (\n <Box\n component=\"nav\"\n sx={{\n width: 272,\n flexShrink: 0,\n display: { xs: 'none', md: 'block' },\n position: 'sticky',\n top: 80,\n alignSelf: 'flex-start',\n maxHeight: 'calc(100vh - 100px)',\n overflowY: 'auto',\n pr: 3,\n borderRight: 1,\n borderColor: 'divider',\n }}\n >\n {sidebar}\n </Box>\n )}\n\n <Box\n component=\"main\"\n sx={{\n flex: 1,\n minWidth: 0,\n px: { xs: 2, md: 4 },\n }}\n >\n {children}\n </Box>\n\n {sectionNav && (\n <Box\n component=\"aside\"\n sx={{\n width: 240,\n flexShrink: 0,\n display: { xs: 'none', lg: 'block' },\n position: 'sticky',\n top: 80,\n alignSelf: 'flex-start',\n maxHeight: 'calc(100vh - 100px)',\n overflowY: 'auto',\n pl: 3,\n }}\n >\n {sectionNav}\n </Box>\n )}\n </Box>\n );\n}\n","'use client';\n\nimport { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport Box from '@mui/material/Box';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport Collapse from '@mui/material/Collapse';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { alpha } from '@mui/material/styles';\n\nexport interface DocSidebarItem {\n id: string;\n label: string;\n href?: string;\n children?: DocSidebarItem[];\n}\n\ninterface DocSidebarProps {\n items: DocSidebarItem[];\n activeId?: string;\n onItemClick?: (item: DocSidebarItem) => void;\n title?: string;\n}\n\n/**\n * Maximum number of lines a long sidebar label may wrap onto\n * before ellipsis kicks in. 2 is the industry baseline for\n * compact navigation surfaces (Notion / Linear / Stripe).\n *\n * Bumped to 3 would help Russian compound words like\n * \"Универсальные категории\" but would noticeably loosen the\n * vertical rhythm of the sidebar.\n */\nconst MAX_LABEL_LINES = 2;\n\n// useLayoutEffect logs a warning during SSR; pick the right hook so\n// consumers rendering the sidebar in a server bundle aren't noisy.\nconst useIsoLayoutEffect =\n typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\nexport function DocSidebar({ items, activeId, onItemClick, title }: DocSidebarProps) {\n return (\n <Box>\n {title && (\n <Typography\n variant=\"subtitle2\"\n sx={{\n px: 1.5,\n pt: 0.5,\n pb: 2,\n fontWeight: 700,\n fontSize: '0.8125rem',\n color: 'text.secondary',\n letterSpacing: '0.01em',\n }}\n >\n {title}\n </Typography>\n )}\n <List dense disablePadding>\n {items.map((item) => (\n <SidebarNode key={item.id} item={item} activeId={activeId} onItemClick={onItemClick} depth={0} />\n ))}\n </List>\n </Box>\n );\n}\n\nfunction SidebarNode({\n item,\n activeId,\n onItemClick,\n depth,\n}: {\n item: DocSidebarItem;\n activeId?: string;\n onItemClick?: (item: DocSidebarItem) => void;\n depth: number;\n}) {\n const hasChildren = item.children && item.children.length > 0;\n const isActive = activeId === item.id;\n const [open, setOpen] = useState(true);\n const isCategory = hasChildren && !item.href;\n\n return (\n <>\n <ListItemButton\n selected={isActive}\n onClick={() => {\n if (hasChildren) setOpen(!open);\n onItemClick?.(item);\n }}\n sx={{\n pl: 1.5 + depth * 1.5,\n pr: 1,\n py: isCategory ? 0.75 : 0.5,\n borderRadius: 1,\n mx: 0.5,\n mb: 0.25,\n minHeight: 0,\n alignItems: 'flex-start',\n ...(isCategory && {\n mt: depth === 0 ? 1 : 0.5,\n }),\n ...(isActive && {\n bgcolor: (theme) => alpha(theme.palette.primary.main, 0.08),\n color: 'primary.main',\n }),\n }}\n >\n <SidebarLabel\n label={item.label}\n sx={{\n fontWeight: isCategory ? 600 : isActive ? 600 : 400,\n fontSize: '0.8125rem',\n ...(isCategory && { color: 'text.primary' }),\n }}\n />\n </ListItemButton>\n {hasChildren && (\n <Collapse in={open}>\n <List dense disablePadding>\n {item.children!.map((child) => (\n <SidebarNode\n key={child.id}\n item={child}\n activeId={activeId}\n onItemClick={onItemClick}\n depth={depth + 1}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n );\n}\n\n/**\n * Label cell with industry-standard \"wrap up to N lines, then\n * ellipsis, then tooltip only when actually overflowing\"\n * behaviour.\n *\n * Why this pattern wins:\n * - Short labels render with NO truncation and NO tooltip —\n * hovering them never spawns a tooltip the reader doesn't need.\n * - Mid-length labels wrap to 2 lines and stay fully visible —\n * much better than premature ellipsis.\n * - Only TRULY oversized labels get the ellipsis, and only those\n * spawn a tooltip on hover so the full text is recoverable.\n *\n * Implementation:\n * - CSS `-webkit-line-clamp` is the cross-browser line-clamp\n * standard (still vendor-prefixed in spec but supported by\n * every modern engine).\n * - Overflow detection compares scrollHeight to clientHeight via\n * a ResizeObserver, so the truncation flag updates when the\n * sidebar resizes (mobile drawer width changes, font scaling,\n * etc.). Skipping `useLayoutEffect` during SSR is the\n * `useIsoLayoutEffect` indirection above.\n *\n * The Tooltip is rendered with `disableInteractive` so hover-out\n * is immediate and the tooltip doesn't block the underlying\n * click area.\n */\nfunction SidebarLabel({ label, sx }: { label: string; sx?: object }) {\n const ref = useRef<HTMLSpanElement | null>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n\n useIsoLayoutEffect(() => {\n const el = ref.current;\n if (!el) return undefined;\n const check = () => {\n // +1 px slack for sub-pixel rounding in some engines so we\n // don't flag a perfectly-fitting label as overflowing.\n setIsOverflowing(el.scrollHeight > el.clientHeight + 1);\n };\n check();\n if (typeof ResizeObserver === 'undefined') return undefined;\n const ro = new ResizeObserver(check);\n ro.observe(el);\n return () => ro.disconnect();\n }, [label]);\n\n const text = (\n <Typography\n ref={ref as unknown as React.Ref<HTMLSpanElement>}\n component=\"span\"\n variant=\"body2\"\n sx={{\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: MAX_LABEL_LINES,\n overflow: 'hidden',\n wordBreak: 'break-word',\n lineHeight: 1.35,\n // The flex parent (ListItemButton) needs `minWidth: 0`\n // on the child for the ellipsis to take effect; do it\n // here so the consumer doesn't have to reach in.\n minWidth: 0,\n flex: 1,\n ...sx,\n }}\n >\n {label}\n </Typography>\n );\n\n if (!isOverflowing) return text;\n\n return (\n <Tooltip\n title={label}\n placement=\"right\"\n arrow\n enterDelay={300}\n enterNextDelay={150}\n disableInteractive\n >\n {text}\n </Tooltip>\n );\n}\n","'use client';\n\nimport { useCallback } from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { alpha } from '@mui/material/styles';\nimport { useScrollSpy } from '../scroll-spy/index.js';\n\nexport interface DocHeading {\n id: string;\n text: string;\n level: number;\n}\n\ninterface DocSectionNavProps {\n headings: DocHeading[];\n title?: string;\n}\n\n/**\n * Right-side table of contents connected to ScrollSpy.\n * Highlights the currently visible section with a smooth indicator.\n */\nexport function DocSectionNav({ headings, title = 'On this page' }: DocSectionNavProps) {\n const { activeId } = useScrollSpy();\n\n const handleClick = useCallback((e: React.MouseEvent<HTMLAnchorElement>, id: string) => {\n e.preventDefault();\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n window.history.replaceState(null, '', `#${id}`);\n }\n }, []);\n\n if (headings.length === 0) return null;\n\n return (\n <Box>\n <Typography\n variant=\"overline\"\n sx={{\n display: 'block',\n mb: 2,\n color: 'text.secondary',\n fontSize: '0.6875rem',\n fontWeight: 700,\n letterSpacing: '0.08em',\n }}\n >\n {title}\n </Typography>\n\n <Box\n component=\"nav\"\n sx={{\n position: 'relative',\n borderLeft: 1,\n borderColor: 'divider',\n }}\n >\n {headings.map((heading) => {\n const isActive = activeId === heading.id;\n const indent = (heading.level - 2) * 1.5;\n return (\n <Box\n key={heading.id}\n component=\"a\"\n href={`#${heading.id}`}\n onClick={(e: React.MouseEvent<HTMLAnchorElement>) => handleClick(e, heading.id)}\n sx={{\n display: 'block',\n py: 0.75,\n pl: indent + 2,\n pr: 1,\n ml: '-1px',\n fontSize: '0.8125rem',\n lineHeight: 1.5,\n textDecoration: 'none',\n color: isActive ? 'primary.main' : 'text.disabled',\n fontWeight: isActive ? 600 : 400,\n borderLeft: 2,\n borderColor: isActive ? 'primary.main' : 'transparent',\n transition: 'color 0.2s ease, border-color 0.2s ease',\n cursor: 'pointer',\n '&:hover': {\n color: isActive ? 'primary.main' : 'text.primary',\n backgroundColor: (theme) => alpha(theme.palette.action.hover, 0.04),\n borderRadius: '0 6px 6px 0',\n },\n }}\n >\n {heading.text}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n","// ---------------------------------------------------------------------------\n// CSS class names for content renderer components\n// ---------------------------------------------------------------------------\n\nconst PREFIX = 'prism-content';\n\nexport const contentClasses = {\n root: `${PREFIX}__root`,\n compact: `${PREFIX}__compact`,\n tiptap: `${PREFIX}__tiptap`,\n markdown: `${PREFIX}__markdown`,\n image: `${PREFIX}__image`,\n link: `${PREFIX}__link`,\n checkbox: `${PREFIX}__checkbox`,\n codeBlock: `${PREFIX}__code-block`,\n codeBlockTitle: `${PREFIX}__code-block-title`,\n codeBlockCopy: `${PREFIX}__code-block-copy`,\n codeBlockHighlight: `${PREFIX}__code-block-highlight`,\n codeInline: `${PREFIX}__code-inline`,\n spoiler: `${PREFIX}__spoiler`,\n admonition: `${PREFIX}__admonition`,\n admonitionNote: `${PREFIX}__admonition-note`,\n admonitionTip: `${PREFIX}__admonition-tip`,\n admonitionWarning: `${PREFIX}__admonition-warning`,\n admonitionDanger: `${PREFIX}__admonition-danger`,\n admonitionInfo: `${PREFIX}__admonition-info`,\n admonitionCaution: `${PREFIX}__admonition-caution`,\n admonitionTitle: `${PREFIX}__admonition-title`,\n admonitionContent: `${PREFIX}__admonition-content`,\n tabs: `${PREFIX}__tabs`,\n tabsHeader: `${PREFIX}__tabs-header`,\n tabsTab: `${PREFIX}__tabs-tab`,\n tabsTabActive: `${PREFIX}__tabs-tab-active`,\n tabsPanel: `${PREFIX}__tabs-panel`,\n figure: `${PREFIX}__figure`,\n figcaption: `${PREFIX}__figcaption`,\n kbd: `${PREFIX}__kbd`,\n};\n","'use client';\n\nimport { styled, alpha } from '@mui/material/styles';\nimport { contentClasses } from './classes.js';\n\n// ---------------------------------------------------------------------------\n// Shared content root — applies rich typography and element styling.\n// Used by both TipTapRenderer (for TipTap JSON) and Markdown (for MD strings).\n// ---------------------------------------------------------------------------\n\nconst MARGIN = '0.75em';\nconst CODE_FONT = \"'JetBrains Mono', 'Fira Code', 'Cascadia Code', Menlo, Monaco, 'Courier New', monospace\";\n\nexport const ContentRoot = styled('div')(({ theme }) => ({\n // General spacing between adjacent elements\n '> * + *': {\n marginTop: 0,\n marginBottom: MARGIN,\n },\n\n // ─── Headings ───────────────────────────────────────────────\n '& h1, & h2, & h3, & h4, & h5, & h6': {\n scrollMarginTop: 100, // Account for sticky header on anchor jump\n },\n // Heading margins. Top margins are applied via the adjacent-sibling\n // combinator (`* + hN`) rather than a `:first-child` reset: a heading\n // takes its top margin ONLY when it follows another element, so a\n // heading at the very top of its container carries none. This is\n // SSR-safe (avoids Emotion's `:first-child` warning) and yields the\n // same result the previous `& > :first-child:is(h1,h2,h3)` reset did.\n h1: { ...theme.typography.h1, marginTop: 0, marginBottom: 12 },\n h2: { ...theme.typography.h2, marginTop: 0, marginBottom: 12 },\n h3: { ...theme.typography.h3, marginTop: 0, marginBottom: 8 },\n h4: { ...theme.typography.h4, marginTop: 0, marginBottom: 8 },\n h5: { ...theme.typography.h5, marginTop: 0, marginBottom: 8 },\n h6: { ...theme.typography.h6, marginTop: 0, marginBottom: 8 },\n '& * + h1, & * + h2': { marginTop: 40 },\n '& * + h3': { marginTop: 32 },\n '& * + h4, & * + h5, & * + h6': { marginTop: 24 },\n\n // ─── Paragraph ──────────────────────────────────────────────\n p: {\n ...theme.typography.body1,\n marginBottom: '1.25rem',\n lineHeight: 1.8,\n },\n\n // ─── Horizontal rule ───────────────────────────────────────\n hr: {\n flexShrink: 0,\n borderWidth: 0,\n margin: '2em 0',\n borderStyle: 'solid',\n borderBottomWidth: 'thin',\n borderColor: theme.palette.divider,\n },\n\n // ─── Images ─────────────────────────────────────────────────\n [`& .${contentClasses.image}`]: {\n width: '100%',\n height: 'auto',\n maxWidth: '100%',\n margin: 'auto auto 1.25em',\n borderRadius: Number(theme.shape.borderRadius) * 2,\n },\n // Plain img fallback\n '& img:not([class])': {\n maxWidth: '100%',\n height: 'auto',\n borderRadius: Number(theme.shape.borderRadius) * 2,\n marginBottom: '1.25em',\n },\n\n // ─── Links ──────────────────────────────────────────────────\n '& a': {\n color: theme.palette.primary.main,\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n },\n\n // ─── Lists ──────────────────────────────────────────────────\n '& ul': {\n listStyleType: 'disc',\n },\n '& ul, & ol': {\n paddingLeft: 24,\n marginBottom: '1.25rem',\n '& > li': {\n lineHeight: 2,\n // Markdown wraps every list-item body in a `<p>`. With\n // `display: inline-block` (the previous setting), Chromium\n // refuses to render the `<li>`'s ::marker at all — the\n // disc/decimal vanishes and the list looks like a series of\n // bullet-less paragraphs. `display: inline` collapses the\n // `<p>` into inline flow so the marker positions normally;\n // `margin: 0` keeps the LI height tight against the marker\n // baseline. Multi-paragraph list items (rare here, but\n // possible) still render — subsequent `<p>` siblings get a\n // line break by the inline-flow rules.\n '& > p': {\n margin: 0,\n display: 'inline',\n },\n },\n },\n // Nested lists\n '& ul ul, & ol ol, & ul ol, & ol ul': {\n marginBottom: 0,\n },\n\n // ─── Task list (TipTap taskList / GFM checkboxes) ──────────\n '& ul[data-type=\"taskList\"]': {\n listStyle: 'none',\n paddingLeft: 4,\n '& li': {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 8,\n '& > label': {\n marginTop: 4,\n },\n },\n },\n\n // ─── Blockquote ─────────────────────────────────────────────\n '& blockquote': {\n lineHeight: 1.6,\n fontSize: '1em',\n margin: '24px 0',\n position: 'relative',\n padding: theme.spacing(2.5, 3, 2.5, 7),\n color: theme.palette.text.secondary,\n borderLeft: `4px solid ${theme.palette.primary.main}`,\n borderRadius: Number(theme.shape.borderRadius) * 2,\n backgroundColor: alpha(theme.palette.primary.main, 0.04),\n '& p': {\n margin: 0,\n fontSize: 'inherit',\n },\n '& p + p': {\n marginTop: 8,\n },\n '&::before': {\n left: 16,\n top: 8,\n display: 'block',\n fontSize: '2.5em',\n content: '\"\\\\201C\"',\n position: 'absolute',\n color: alpha(theme.palette.primary.main, 0.3),\n lineHeight: 1,\n },\n },\n\n // ─── Inline code ────────────────────────────────────────────\n [`& .${contentClasses.codeInline}`]: {\n padding: theme.spacing(0.25, 0.75),\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n borderRadius: Number(theme.shape.borderRadius) / 2,\n backgroundColor: alpha(theme.palette.grey[500], 0.2),\n fontFamily: CODE_FONT,\n },\n // Fallback for code not inside pre\n '& :not(pre) > code:not([class])': {\n padding: theme.spacing(0.25, 0.75),\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n borderRadius: Number(theme.shape.borderRadius) / 2,\n backgroundColor: alpha(theme.palette.grey[500], 0.2),\n fontFamily: CODE_FONT,\n },\n\n // ─── Code block ─────────────────────────────────────────────\n [`& .${contentClasses.codeBlock}`]: {\n position: 'relative',\n marginBottom: '1.25rem',\n '& pre': {\n overflowX: 'auto',\n padding: theme.spacing(3),\n color: theme.palette.common.white,\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n fontFamily: CODE_FONT,\n fontSize: theme.typography.body2.fontSize,\n lineHeight: 1.7,\n backgroundColor: theme.palette.grey[900],\n ...(theme.palette.mode === 'dark' && {\n backgroundColor: alpha(theme.palette.grey[800], 0.9),\n }),\n '& code': {\n fontSize: 'inherit',\n fontFamily: 'inherit',\n backgroundColor: 'transparent',\n padding: 0,\n borderRadius: 0,\n color: 'inherit',\n },\n },\n },\n // Fallback for bare pre blocks\n '& pre:not([class])': {\n overflowX: 'auto',\n padding: theme.spacing(3),\n color: theme.palette.common.white,\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n fontFamily: CODE_FONT,\n fontSize: theme.typography.body2.fontSize,\n lineHeight: 1.7,\n backgroundColor: theme.palette.grey[900],\n marginBottom: '1.25rem',\n ...(theme.palette.mode === 'dark' && {\n backgroundColor: alpha(theme.palette.grey[800], 0.9),\n }),\n '& code': {\n fontSize: 'inherit',\n fontFamily: 'inherit',\n backgroundColor: 'transparent',\n padding: 0,\n color: 'inherit',\n },\n },\n\n // ─── Table ──────────────────────────────────────────────────\n '& table': {\n width: '100%',\n borderCollapse: 'collapse',\n fontSize: theme.typography.body2.fontSize,\n border: `1px solid ${theme.palette.divider}`,\n marginBottom: '1.25rem',\n '& th, & td': {\n padding: theme.spacing(1, 1.5),\n border: `1px solid ${theme.palette.divider}`,\n verticalAlign: 'top',\n },\n '& th': {\n fontWeight: 700,\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n },\n // Zebra rows. `:nth-of-type` (not `:nth-child`) is SSR-safe and\n // exactly equivalent here — a `<tbody>` contains only `<tr>`\n // children, so type-position and child-position coincide.\n '& tbody tr:nth-of-type(odd)': {\n backgroundColor: alpha(theme.palette.grey[500], 0.04),\n },\n },\n\n // ─── Checkbox (GFM task lists) ──────────────────────────────\n [`& .${contentClasses.checkbox}`]: {\n cursor: 'pointer',\n position: 'relative',\n '&:before': {\n content: '\"\"',\n top: -2,\n left: -2,\n width: 17,\n height: 17,\n borderRadius: 3,\n position: 'absolute',\n backgroundColor: theme.palette.grey[300],\n ...(theme.palette.mode === 'dark' && {\n backgroundColor: theme.palette.grey[700],\n }),\n },\n '&:checked': {\n '&:before': {\n backgroundColor: theme.palette.primary.main,\n },\n '&:after': {\n top: 1,\n left: 5,\n width: 4,\n height: 9,\n content: '\"\"',\n position: 'absolute',\n borderStyle: 'solid',\n transform: 'rotate(45deg)',\n borderWidth: '0 2px 2px 0',\n borderColor: theme.palette.common.white,\n },\n },\n },\n\n // ─── Details / Summary ──────────────────────────────────────\n '& details': {\n marginBottom: '1rem',\n '& summary': {\n cursor: 'pointer',\n fontWeight: 600,\n marginBottom: 8,\n },\n },\n\n // ─── Definition list ────────────────────────────────────────\n '& dl': {\n marginBottom: '1.25rem',\n '& dt': {\n fontWeight: 700,\n marginTop: 12,\n },\n '& dd': {\n marginLeft: 24,\n marginBottom: 4,\n },\n },\n\n // ─── Kbd (keyboard shortcut) ────────────────────────────────\n '& kbd': {\n display: 'inline-block',\n padding: theme.spacing(0.25, 0.5),\n fontSize: '0.8em',\n fontFamily: CODE_FONT,\n borderRadius: 4,\n border: `1px solid ${theme.palette.divider}`,\n boxShadow: `0 1px 0 ${alpha(theme.palette.grey[500], 0.1)}`,\n backgroundColor: alpha(theme.palette.grey[500], 0.06),\n },\n\n // ─── Mark (highlight) ──────────────────────────────────────\n '& mark': {\n padding: theme.spacing(0, 0.5),\n borderRadius: 2,\n backgroundColor: alpha(theme.palette.warning.main, 0.3),\n },\n\n // ─── Sup / Sub ──────────────────────────────────────────────\n '& sup, & sub': {\n fontSize: '0.75em',\n },\n\n // ─── Spoiler (||hidden text||) ────────────────────────────\n [`& .${contentClasses.spoiler}`]: {\n backgroundColor: theme.palette.text.primary,\n color: theme.palette.text.primary,\n borderRadius: 4,\n padding: theme.spacing(0, 0.5),\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n userSelect: 'none',\n '&:hover, &[data-revealed=\"true\"]': {\n backgroundColor: 'transparent',\n color: 'inherit',\n userSelect: 'auto',\n },\n },\n\n // ─── Admonition (callout) ─────────────────────────────────\n [`& .${contentClasses.admonition}`]: {\n margin: theme.spacing(2, 0),\n padding: theme.spacing(1.5, 2),\n borderRadius: theme.shape.borderRadius,\n borderLeft: `4px solid ${theme.palette.divider}`,\n backgroundColor: alpha(theme.palette.text.primary, 0.04),\n '& > :last-child': { marginBottom: 0 },\n },\n [`& .${contentClasses.admonitionTitle}`]: {\n fontWeight: 600,\n textTransform: 'uppercase',\n fontSize: '0.75rem',\n letterSpacing: '0.05em',\n marginBottom: theme.spacing(0.75),\n opacity: 0.85,\n },\n [`& .${contentClasses.admonitionContent}`]: {\n '& p:last-child': { marginBottom: 0 },\n },\n [`& .${contentClasses.admonitionNote}`]: {\n borderLeftColor: theme.palette.text.secondary,\n backgroundColor: alpha(theme.palette.text.primary, 0.04),\n },\n [`& .${contentClasses.admonitionTip}`]: {\n borderLeftColor: theme.palette.success.main,\n backgroundColor: alpha(theme.palette.success.main, 0.08),\n },\n [`& .${contentClasses.admonitionWarning}`]: {\n borderLeftColor: theme.palette.warning.main,\n backgroundColor: alpha(theme.palette.warning.main, 0.08),\n },\n [`& .${contentClasses.admonitionDanger}`]: {\n borderLeftColor: theme.palette.error.main,\n backgroundColor: alpha(theme.palette.error.main, 0.08),\n },\n [`& .${contentClasses.admonitionInfo}`]: {\n borderLeftColor: theme.palette.info.main,\n backgroundColor: alpha(theme.palette.info.main, 0.08),\n },\n [`& .${contentClasses.admonitionCaution}`]: {\n borderLeftColor: theme.palette.warning.dark,\n backgroundColor: alpha(theme.palette.warning.dark, 0.08),\n },\n\n // ─── Tabs ───────────────────────────────────────────────────\n [`& .${contentClasses.tabs}`]: {\n margin: theme.spacing(2, 0),\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n overflow: 'hidden',\n },\n [`& .${contentClasses.tabsHeader}`]: {\n display: 'flex',\n gap: 0,\n borderBottom: `1px solid ${theme.palette.divider}`,\n backgroundColor: alpha(theme.palette.text.primary, 0.03),\n },\n [`& .${contentClasses.tabsTab}`]: {\n appearance: 'none',\n background: 'transparent',\n border: 'none',\n padding: theme.spacing(1, 2),\n fontFamily: 'inherit',\n fontSize: '0.8125rem',\n fontWeight: 500,\n color: theme.palette.text.secondary,\n cursor: 'pointer',\n borderBottom: '2px solid transparent',\n transition: 'all 0.15s ease',\n '&:hover': { color: theme.palette.text.primary },\n },\n [`& .${contentClasses.tabsTabActive}`]: {\n color: theme.palette.text.primary,\n borderBottomColor: theme.palette.primary.main,\n },\n [`& .${contentClasses.tabsPanel}`]: {\n padding: theme.spacing(2),\n // No `:first-child` reset needed: headings only take a top margin\n // when preceded by a sibling (see heading rules above) and\n // paragraphs carry only a bottom margin, so the panel's first\n // child never has an excess top margin. (SSR-safe.)\n '& > :last-child': { marginBottom: 0 },\n },\n\n // ─── Code block — title + copy button ───────────────────────\n [`& .${contentClasses.codeBlockTitle}`]: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(1),\n padding: theme.spacing(0.75, 1.5),\n fontSize: '0.75rem',\n fontFamily: 'ui-monospace, \"SF Mono\", Menlo, Consolas, monospace',\n color: theme.palette.text.secondary,\n backgroundColor: alpha(theme.palette.text.primary, 0.06),\n borderTopLeftRadius: theme.shape.borderRadius,\n borderTopRightRadius: theme.shape.borderRadius,\n },\n [`& .${contentClasses.codeBlockCopy}`]: {\n appearance: 'none',\n background: 'transparent',\n border: 'none',\n color: 'inherit',\n cursor: 'pointer',\n padding: theme.spacing(0.25, 0.75),\n fontSize: '0.875rem',\n borderRadius: theme.shape.borderRadius,\n '&:hover': { backgroundColor: alpha(theme.palette.text.primary, 0.08) },\n },\n\n // ─── Figure ─────────────────────────────────────────────────\n [`& .${contentClasses.figure}`]: {\n margin: theme.spacing(2, 0),\n textAlign: 'center',\n },\n [`& .${contentClasses.figcaption}`]: {\n fontSize: '0.8125rem',\n color: theme.palette.text.secondary,\n marginTop: theme.spacing(0.75),\n },\n\n // ─── kbd ────────────────────────────────────────────────────\n [`& .${contentClasses.kbd}`]: {\n display: 'inline-block',\n padding: theme.spacing(0, 0.5),\n fontFamily: 'ui-monospace, \"SF Mono\", Menlo, Consolas, monospace',\n fontSize: '0.8em',\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.divider}`,\n borderBottomWidth: 2,\n borderRadius: 4,\n backgroundColor: alpha(theme.palette.text.primary, 0.04),\n boxShadow: `0 1px 0 ${alpha(theme.palette.text.primary, 0.15)}`,\n minWidth: '1.5em',\n textAlign: 'center',\n },\n\n // ─── Compact mode (chat messages, comments, etc.) ─────────\n [`&.${contentClasses.compact}`]: {\n '> * + *': { marginTop: 0, marginBottom: 2 },\n // (Dropped an SSR-unsafe `& > :first-child:not(p)` 4px top-margin\n // tweak — cosmetically negligible in compact mode, and `:first-child`\n // triggered Emotion's SSR warning.)\n '& h1, & h2, & h3, & h4, & h5, & h6': { marginTop: 0, marginBottom: 2 },\n h1: { fontSize: '1.25rem', fontWeight: 600, marginTop: 0, marginBottom: 2 },\n h2: { fontSize: '1.125rem', fontWeight: 600, marginTop: 0, marginBottom: 2 },\n h3: { fontSize: '1rem', fontWeight: 600, marginTop: 0, marginBottom: 2 },\n 'h4, h5, h6': { fontSize: '0.875rem', fontWeight: 600, marginTop: 0, marginBottom: 2 },\n p: {\n fontSize: '0.8125rem',\n lineHeight: 1.5,\n marginBottom: 2,\n '&:last-child': { marginBottom: 0 },\n },\n hr: { margin: '4px 0' },\n '& blockquote': {\n margin: '4px 0',\n padding: theme.spacing(0.5, 0, 0.5, 1.5),\n borderRadius: 0,\n backgroundColor: 'transparent',\n '&::before': { display: 'none' },\n },\n '& ul, & ol': {\n paddingLeft: 20,\n marginBottom: 2,\n '& > li': { lineHeight: 1.5, fontSize: '0.8125rem' },\n },\n '& img:not([class])': { marginBottom: 4 },\n [`& .${contentClasses.codeBlock}`]: { marginBottom: 4 },\n [`& .${contentClasses.codeBlock} pre, & pre:not([class])`]: {\n padding: theme.spacing(1.5),\n fontSize: '0.75rem',\n lineHeight: 1.5,\n marginBottom: 4,\n },\n [`& .${contentClasses.codeInline}, & :not(pre) > code:not([class])`]: {\n fontSize: '0.75rem',\n },\n '& table': {\n fontSize: '0.75rem',\n marginBottom: 4,\n },\n },\n}));\n","'use client';\n\nimport {\n type ReactNode,\n type ComponentType,\n type ElementType,\n Fragment,\n useState,\n useCallback,\n createContext,\n useContext,\n} from 'react';\nimport { ContentRoot } from '../content-renderer/styles.js';\nimport { contentClasses } from '../content-renderer/classes.js';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// ---------------------------------------------------------------------------\n// URL safety (XSS hardening, T#347)\n// ---------------------------------------------------------------------------\n//\n// Every URL that lands in an `href`, `src`, or other navigable attribute\n// MUST be schema-validated. Cookie-mode auth makes any rendered\n// javascript:/data:/vbscript:/blob: URI catastrophic — an attacker who\n// crafts a TipTap document with a `link` mark or `image` node carrying\n// a `javascript:alert(...)` href gets full session control on click.\n// These guards are intentionally conservative: anything that isn't\n// unambiguously a same-origin path or an http(s) URL collapses to a\n// safe sentinel (`#` for links, undefined for image src so the <img>\n// renders nothing rather than load a hostile resource).\n\nfunction isSafeHref(url: unknown): url is string {\n if (typeof url !== 'string' || url.length === 0) return false;\n // Written as escapes, not as the literal bytes: the source used to hold\n // real control characters, so this read as `/[ -]/` — \"a space or a\n // dash\" — in every editor and diff. What it actually rejects is the\n // C0 range plus DEL, which is what makes `java\\tscript:` and friends\n // parse as `javascript:` in some URL parsers.\n // eslint-disable-next-line no-control-regex -- rejecting control characters is the point\n if (/[\\x00-\\x1f\\x7f]/.test(url)) return false;\n if (url.startsWith('/') && !url.startsWith('//') && !url.startsWith('/\\\\')) return true;\n const lower = url.toLowerCase().trimStart();\n return lower.startsWith('http://') || lower.startsWith('https://');\n}\n\n/** Return the URL if safe to interpolate into href/src; otherwise undefined. */\nexport function sanitizeHref(url: unknown): string | undefined {\n return isSafeHref(url) ? (url as string) : undefined;\n}\n\n/**\n * Restrictive iframe-src validator for embed nodes (youtube et al.).\n * Accepts only https://www.youtube.com / https://www.youtube-nocookie.com.\n * Anything else collapses to undefined so the iframe doesn't render.\n */\nfunction sanitizeEmbedSrc(url: unknown): string | undefined {\n if (typeof url !== 'string') return undefined;\n if (!isSafeHref(url)) return undefined;\n const lower = url.toLowerCase();\n if (\n lower.startsWith('https://www.youtube.com/') ||\n lower.startsWith('https://www.youtube-nocookie.com/')\n ) {\n return url;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TipTapMark {\n type: string;\n attrs?: Record<string, any>;\n}\n\nexport interface TipTapNode {\n type: string;\n content?: TipTapNode[];\n text?: string;\n marks?: TipTapMark[];\n attrs?: Record<string, any>;\n}\n\nexport interface TipTapDoc {\n type: 'doc';\n content: TipTapNode[];\n}\n\n// ---------------------------------------------------------------------------\n// Custom node registry\n// ---------------------------------------------------------------------------\n\ntype CustomNodeRenderer = ComponentType<{ node: TipTapNode }>;\nconst customNodeRegistry = new Map<string, CustomNodeRenderer>();\n\nexport function registerTipTapNode(type: string, component: CustomNodeRenderer) {\n customNodeRegistry.set(type, component);\n}\n\n// ---------------------------------------------------------------------------\n// Render context\n//\n// Lets the host app inject:\n// - `linkComponent`: a router-aware Link (e.g. react-router-dom's Link)\n// used by the `internalLink` mark to avoid full-page reloads.\n// ---------------------------------------------------------------------------\n\ninterface TipTapRenderContext {\n linkComponent?: ElementType<{ to: string; children?: ReactNode; className?: string }>;\n}\n\nconst TipTapContext = createContext<TipTapRenderContext>({});\n\n// ---------------------------------------------------------------------------\n// Mark rendering\n// ---------------------------------------------------------------------------\n\nfunction renderMarks(text: string, marks: TipTapMark[] = [], ctx?: TipTapRenderContext): ReactNode {\n return marks.reduce<ReactNode>((acc, mark) => {\n switch (mark.type) {\n case 'bold':\n return <strong>{acc}</strong>;\n case 'italic':\n return <em>{acc}</em>;\n case 'code':\n return <code className={contentClasses.codeInline}>{acc}</code>;\n case 'underline':\n return <u>{acc}</u>;\n case 'strike':\n return <s>{acc}</s>;\n case 'link': {\n // T#347 — href is attacker-controlled (post author chose it).\n // sanitizeHref rejects javascript:/data:/vbscript:/etc. — falls\n // back to `#` so the link is inert rather than dangerous.\n const safeHref = sanitizeHref(mark.attrs?.href) ?? '#';\n // Same-origin paths route through the host app's Link (router-\n // aware) so cross-doc navigation doesn't full-reload. External\n // http(s) URLs keep <a target=\"_blank\"> behaviour.\n const Link = ctx?.linkComponent;\n if (Link && safeHref.startsWith('/') && !safeHref.startsWith('//')) {\n return (\n <Link to={safeHref} className={contentClasses.link}>\n {acc}\n </Link>\n );\n }\n return (\n <a href={safeHref} target={mark.attrs?.target ?? '_blank'} rel=\"noopener noreferrer\">\n {acc}\n </a>\n );\n }\n case 'internalLink': {\n const to = String(mark.attrs?.to ?? mark.attrs?.href ?? '#');\n const Link = ctx?.linkComponent;\n return Link ? (\n <Link to={to} className={contentClasses.link}>\n {acc}\n </Link>\n ) : (\n <a href={to}>{acc}</a>\n );\n }\n case 'highlight':\n return <mark style={mark.attrs?.color ? { backgroundColor: mark.attrs.color } : undefined}>{acc}</mark>;\n case 'subscript':\n return <sub>{acc}</sub>;\n case 'superscript':\n return <sup>{acc}</sup>;\n case 'textStyle':\n return <span style={{ color: mark.attrs?.color }}>{acc}</span>;\n case 'kbd':\n return <kbd className={contentClasses.kbd}>{acc}</kbd>;\n default:\n return acc;\n }\n }, text);\n}\n\n// ---------------------------------------------------------------------------\n// Slug generation for heading anchors\n// ---------------------------------------------------------------------------\n\nfunction slugify(nodes?: TipTapNode[]): string | undefined {\n if (!nodes) return undefined;\n const text = nodes.map((n) => n.text ?? '').join('');\n if (!text) return undefined;\n return text\n .toLowerCase()\n .replace(/[^a-z0-9а-яё]+/gi, '-')\n .replace(/^-|-$/g, '');\n}\n\n// ---------------------------------------------------------------------------\n// Code block — pre-rendered HTML support + copy button\n// ---------------------------------------------------------------------------\n\nfunction CodeBlock({ node }: { node: TipTapNode }) {\n const language = node.attrs?.language as string | null | undefined;\n const title = node.attrs?.title as string | undefined;\n // T#347 — XSS hardening: the prior implementation read `node.attrs.html`\n // and injected it via dangerouslySetInnerHTML on the premise that it was\n // \"Shiki-rendered HTML pre-sanitised at build time\". That premise is\n // false in the portal context: `node.attrs` come from a TipTap document\n // authored at runtime by an arbitrary user. An attacker who can post a\n // codeBlock could set `attrs.html` to a script-carrying payload and\n // achieve stored XSS. We drop the html-attr path entirely; if syntax\n // highlighting is needed, the consumer can pass a custom CodeBlock via\n // the customNodeRegistry that highlights from the trusted text content.\n const code = node.content?.map((n) => n.text ?? '').join('\\n') ?? '';\n const [copied, setCopied] = useState(false);\n\n const onCopy = useCallback(() => {\n navigator.clipboard?.writeText(code).then(\n () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n },\n () => {\n // Clipboard API unavailable (insecure context). Silently no-op.\n },\n );\n }, [code]);\n\n return (\n <div className={contentClasses.codeBlock} data-language={language ?? undefined}>\n {(title || language) && (\n <div className={contentClasses.codeBlockTitle}>\n <span>{title ?? language}</span>\n <button type=\"button\" onClick={onCopy} className={contentClasses.codeBlockCopy} aria-label=\"Copy code\">\n {copied ? '✓' : '⧉'}\n </button>\n </div>\n )}\n <pre>\n <code className={language ? `language-${language}` : undefined}>{code}</code>\n </pre>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Admonition (callout)\n// ---------------------------------------------------------------------------\n\nconst ADMONITION_LABEL: Record<string, string> = {\n note: 'Note',\n tip: 'Tip',\n warning: 'Warning',\n danger: 'Danger',\n info: 'Info',\n caution: 'Caution',\n};\n\nconst ADMONITION_CLASS: Record<string, string> = {\n note: contentClasses.admonitionNote,\n tip: contentClasses.admonitionTip,\n warning: contentClasses.admonitionWarning,\n danger: contentClasses.admonitionDanger,\n info: contentClasses.admonitionInfo,\n caution: contentClasses.admonitionCaution,\n};\n\nfunction Admonition({ node }: { node: TipTapNode }) {\n const kind = String(node.attrs?.kind ?? 'note');\n const title = (node.attrs?.title as string | undefined) ?? ADMONITION_LABEL[kind] ?? kind;\n const variantClass = ADMONITION_CLASS[kind] ?? contentClasses.admonitionNote;\n return (\n <aside className={`${contentClasses.admonition} ${variantClass}`} data-kind={kind}>\n <div className={contentClasses.admonitionTitle}>{title}</div>\n <div className={contentClasses.admonitionContent}>{node.content?.map(renderNode)}</div>\n </aside>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Tabs\n// ---------------------------------------------------------------------------\n\nfunction Tabs({ node }: { node: TipTapNode }) {\n const items = (node.content ?? []).filter((c) => c.type === 'tabItem');\n const [active, setActive] = useState(0);\n if (items.length === 0) return null;\n\n const safeActive = Math.min(active, items.length - 1);\n\n return (\n <div className={contentClasses.tabs}>\n <div className={contentClasses.tabsHeader} role=\"tablist\">\n {items.map((item, i) => {\n const label = item.attrs?.label ?? item.attrs?.value ?? `Tab ${i + 1}`;\n const isActive = i === safeActive;\n return (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n className={`${contentClasses.tabsTab} ${isActive ? contentClasses.tabsTabActive : ''}`}\n onClick={() => setActive(i)}\n >\n {label}\n </button>\n );\n })}\n </div>\n <div className={contentClasses.tabsPanel} role=\"tabpanel\">\n {items[safeActive]?.content?.map(renderNode)}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Node rendering\n// ---------------------------------------------------------------------------\n\nfunction renderNode(node: TipTapNode, index: number): ReactNode {\n // Custom registry first\n const CustomRenderer = customNodeRegistry.get(node.type);\n if (CustomRenderer) return <CustomRenderer key={index} node={node} />;\n\n switch (node.type) {\n case 'text':\n return <TextNode key={index} node={node} />;\n\n case 'paragraph':\n return <p key={index}>{node.content?.map(renderNode)}</p>;\n\n case 'heading': {\n const level = Math.min(Math.max(node.attrs?.level ?? 2, 1), 6);\n const Tag = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n // Prefer the build-time-supplied id (kept consistent with the engine's\n // slugifyHeading); fall back to runtime slugification for legacy content.\n const id = node.attrs?.id ?? slugify(node.content);\n return (\n <Tag key={index} id={id}>\n {node.content?.map(renderNode)}\n </Tag>\n );\n }\n\n case 'bulletList':\n return <ul key={index}>{node.content?.map(renderNode)}</ul>;\n\n case 'orderedList':\n return (\n <ol key={index} start={node.attrs?.start ?? 1}>\n {node.content?.map(renderNode)}\n </ol>\n );\n\n case 'listItem':\n return <li key={index}>{node.content?.map(renderNode)}</li>;\n\n case 'taskList':\n return (\n <ul key={index} data-type=\"taskList\">\n {node.content?.map(renderNode)}\n </ul>\n );\n\n case 'taskItem': {\n const checked = node.attrs?.checked ?? false;\n return (\n <li key={index} data-type=\"taskItem\" data-checked={checked}>\n <label>\n <input type=\"checkbox\" checked={checked} readOnly className={contentClasses.checkbox} />\n </label>\n <div>{node.content?.map(renderNode)}</div>\n </li>\n );\n }\n\n case 'blockquote':\n return <blockquote key={index}>{node.content?.map(renderNode)}</blockquote>;\n\n case 'codeBlock':\n return <CodeBlock key={index} node={node} />;\n\n case 'horizontalRule':\n return <hr key={index} />;\n\n case 'image': {\n // T#347 — XSS hardening: image src in a TipTap doc is post-author\n // controlled. A `data:text/html` URL would let the browser load\n // a script-bearing document under the portal's origin. Reject\n // anything that isn't a same-origin path or http(s) URL — the\n // image silently doesn't render if the src is unsafe.\n const safeSrc = sanitizeHref(node.attrs?.src);\n if (!safeSrc) return null;\n return (\n <img\n key={index}\n src={safeSrc}\n alt={node.attrs?.alt ?? ''}\n title={node.attrs?.title}\n className={contentClasses.image}\n loading=\"lazy\"\n />\n );\n }\n\n case 'figure':\n return (\n <figure key={index} className={contentClasses.figure}>\n {node.content?.map(renderNode)}\n </figure>\n );\n\n case 'figcaption':\n return (\n <figcaption key={index} className={contentClasses.figcaption}>\n {node.content?.map(renderNode)}\n </figcaption>\n );\n\n case 'hardBreak':\n return <br key={index} />;\n\n // ─── Admonition / Tabs ──────────────────────────────────\n case 'admonition':\n return <Admonition key={index} node={node} />;\n\n case 'tabs':\n return <Tabs key={index} node={node} />;\n\n case 'tabItem':\n // tabItem is rendered by Tabs; if it appears outside, fall back to a\n // plain section so the content isn't lost.\n return (\n <section key={index} data-type=\"tabItem\">\n {node.content?.map(renderNode)}\n </section>\n );\n\n // ─── Table ──────────────────────────────────────────────\n case 'table':\n return (\n <div key={index} style={{ overflowX: 'auto' }}>\n <table>\n <tbody>{node.content?.map(renderNode)}</tbody>\n </table>\n </div>\n );\n\n case 'tableRow':\n return <tr key={index}>{node.content?.map(renderNode)}</tr>;\n\n case 'tableCell':\n return (\n <td key={index} colSpan={node.attrs?.colspan ?? 1} rowSpan={node.attrs?.rowspan ?? 1}>\n {node.content?.map(renderNode)}\n </td>\n );\n\n case 'tableHeader':\n return (\n <th key={index} colSpan={node.attrs?.colspan ?? 1} rowSpan={node.attrs?.rowspan ?? 1}>\n {node.content?.map(renderNode)}\n </th>\n );\n\n // ─── Details / Summary (collapsible) ────────────────────\n case 'details':\n return (\n <details key={index} open={node.attrs?.open}>\n {node.content?.map(renderNode)}\n </details>\n );\n\n case 'detailsSummary':\n return <summary key={index}>{node.content?.map(renderNode)}</summary>;\n\n case 'detailsContent':\n return <div key={index}>{node.content?.map(renderNode)}</div>;\n\n // ─── YouTube embed ──────────────────────────────────────\n case 'youtube': {\n // T#347 — XSS hardening: iframes are powerful (can frame any URL\n // the host allows X-Frame'ing). Restrict src to the YouTube\n // origins we actually want — anything else collapses to null\n // and the iframe doesn't render. Without this, a post author\n // could embed an arbitrary attacker-controlled page in an\n // iframe with autoplay + fullscreen permissions.\n const safeSrc = sanitizeEmbedSrc(node.attrs?.src);\n if (!safeSrc) return null;\n return (\n <div key={index} style={{ position: 'relative', paddingBottom: '56.25%', height: 0, marginBottom: '1.25rem' }}>\n <iframe\n src={safeSrc}\n title=\"YouTube video\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n border: 'none',\n borderRadius: 8,\n }}\n />\n </div>\n );\n }\n\n default:\n // Fallback: render children if present\n if (node.content) {\n return <Fragment key={index}>{node.content.map(renderNode)}</Fragment>;\n }\n return null;\n }\n}\n\nfunction TextNode({ node }: { node: TipTapNode }) {\n const ctx = useContext(TipTapContext);\n return <Fragment>{renderMarks(node.text ?? '', node.marks, ctx)}</Fragment>;\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface TipTapRendererProps {\n /** TipTap JSON document */\n content: TipTapDoc | Record<string, unknown> | null;\n /** Additional CSS class */\n className?: string;\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Compact mode for chat messages, comments, etc. */\n compact?: boolean;\n /**\n * Component used to render `internalLink` marks. Pass a router-aware\n * component (e.g. `Link` from react-router-dom) to avoid full reloads.\n */\n linkComponent?: ElementType<{ to: string; children?: ReactNode; className?: string }>;\n}\n\nexport function TipTapRenderer({ content, className, sx, compact, linkComponent }: TipTapRendererProps) {\n if (!content || !('content' in content) || !Array.isArray(content.content)) {\n return null;\n }\n\n const ctxValue: TipTapRenderContext = linkComponent ? { linkComponent } : {};\n\n return (\n <TipTapContext.Provider value={ctxValue}>\n <ContentRoot\n className={[contentClasses.root, contentClasses.tiptap, compact && contentClasses.compact, className]\n .filter(Boolean)\n .join(' ')}\n sx={sx}\n >\n {(content as TipTapDoc).content.map(renderNode)}\n </ContentRoot>\n </TipTapContext.Provider>\n );\n}\n","/**\n * All HTML tags — used by Turndown to decide which elements to keep as HTML.\n * Source: https://github.com/harrysolovay/all-html-tags\n */\nexport const htmlTags = [\n 'a',\n 'abbr',\n 'acronym',\n 'address',\n 'applet',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'base',\n 'basefont',\n 'bdi',\n 'bdo',\n 'bgsound',\n 'big',\n 'blink',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'center',\n 'circle',\n 'cite',\n 'clipPath',\n 'code',\n 'col',\n 'colgroup',\n 'command',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'defs',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'ellipse',\n 'em',\n 'embed',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'foreignObject',\n 'form',\n 'frame',\n 'frameset',\n 'g',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'iframe',\n 'image',\n 'img',\n 'input',\n 'ins',\n 'isindex',\n 'kbd',\n 'keygen',\n 'label',\n 'legend',\n 'li',\n 'line',\n 'linearGradient',\n 'link',\n 'listing',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'mask',\n 'math',\n 'menu',\n 'menuitem',\n 'meta',\n 'meter',\n 'multicol',\n 'nav',\n 'nextid',\n 'nobr',\n 'noembed',\n 'noframes',\n 'noscript',\n 'object',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'param',\n 'path',\n 'pattern',\n 'picture',\n 'plaintext',\n 'polygon',\n 'polyline',\n 'pre',\n 'progress',\n 'q',\n 'radialGradient',\n 'rb',\n 'rbc',\n 'rect',\n 'rp',\n 'rt',\n 'rtc',\n 'ruby',\n 's',\n 'samp',\n 'script',\n 'section',\n 'select',\n 'shadow',\n 'slot',\n 'small',\n 'source',\n 'spacer',\n 'span',\n 'stop',\n 'strike',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'svg',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'text',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'title',\n 'tr',\n 'track',\n 'tspan',\n 'tt',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr',\n 'xmp',\n];\n","import type { Node, Filter } from 'turndown';\nimport TurndownService from 'turndown';\nimport { htmlTags } from './html-tags.js';\n\n// ---------------------------------------------------------------------------\n// Turndown service — converts HTML strings to Markdown\n// ---------------------------------------------------------------------------\n\ntype INode = HTMLElement & { isBlock: boolean };\n\nconst excludeTags = ['pre', 'code'];\nconst filterTags = htmlTags.filter((t) => !excludeTags.includes(t)) as Filter;\n\nconst turndownService = new TurndownService({ codeBlockStyle: 'fenced', fence: '```' });\n\n// Keep all HTML tags that aren't code-related\nturndownService.addRule('keep', {\n filter: filterTags,\n replacement(content: string, node: Node) {\n const { isBlock, outerHTML } = node as INode;\n return node && isBlock ? `\\n\\n${outerHTML}\\n\\n` : outerHTML;\n },\n});\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function htmlToMarkdown(html: string): string {\n return turndownService.turndown(html);\n}\n\n/**\n * Detect whether content is already Markdown or raw HTML.\n * Checks for common Markdown syntax patterns.\n */\nexport function isMarkdownContent(content: string): boolean {\n const patterns = [\n /^#+\\s/m, // Heading\n /^(\\*|-|\\d+\\.)\\s/m, // List item\n /^```/m, // Code block\n /^\\|/m, // Table\n /!\\[.*?\\]\\(.*?\\)/, // Image\n /\\[.*?\\]\\(.*?\\)/, // Link\n ];\n return patterns.some((p) => p.test(content));\n}\n","/**\n * Remark plugin for spoiler syntax: ||hidden text||\n *\n * Transforms `||spoiler text||` into `<span class=\"...\">spoiler text</span>`\n * in the markdown AST. Works with rehype-raw to render the HTML.\n */\n\nimport { contentClasses } from './classes.js';\n\nconst SPOILER_RE = /\\|\\|(.+?)\\|\\|/g;\n\nfunction remarkSpoiler(): (tree: any) => void {\n return (tree) => {\n visitNode(tree);\n };\n}\n\nfunction visitNode(node: any): void {\n if (!node.children) return;\n\n const newChildren: any[] = [];\n let changed = false;\n\n for (const child of node.children) {\n if (child.type === 'text' && typeof child.value === 'string') {\n if (SPOILER_RE.test(child.value)) {\n changed = true;\n let lastIndex = 0;\n SPOILER_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = SPOILER_RE.exec(child.value)) !== null) {\n if (match.index > lastIndex) {\n newChildren.push({ type: 'text', value: child.value.slice(lastIndex, match.index) });\n }\n newChildren.push({\n type: 'html',\n value: `<span class=\"${contentClasses.spoiler}\">${escapeHtml(match[1])}</span>`,\n });\n lastIndex = match.index + match[0].length;\n }\n if (lastIndex < child.value.length) {\n newChildren.push({ type: 'text', value: child.value.slice(lastIndex) });\n }\n continue;\n }\n } else {\n visitNode(child);\n }\n newChildren.push(child);\n }\n\n if (changed) {\n node.children = newChildren;\n }\n}\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nexport { remarkSpoiler };\n","'use client';\n\nimport './code-highlight.css';\n\nimport type { Options } from 'react-markdown';\nimport { useId, useMemo } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeSanitize, { defaultSchema } from 'rehype-sanitize';\nimport rehypeHighlight from 'rehype-highlight';\nimport remarkGfm from 'remark-gfm';\n\nimport Link from '@mui/material/Link';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { ContentRoot } from './styles.js';\nimport { contentClasses } from './classes.js';\nimport { htmlToMarkdown, isMarkdownContent } from './html-to-markdown.js';\nimport { remarkSpoiler } from './remark-spoiler.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MarkdownProps = {\n /** Markdown or HTML string content */\n children: string;\n /** Additional CSS class */\n className?: string;\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Compact mode for chat messages, comments, etc. */\n compact?: boolean;\n /** Custom react-markdown component overrides */\n components?: Options['components'];\n /** Additional rehype plugins */\n rehypePlugins?: Options['rehypePlugins'];\n /** Additional remark plugins */\n remarkPlugins?: Options['remarkPlugins'];\n /** Link component for internal navigation (e.g. react-router Link) */\n routerLinkComponent?: React.ElementType;\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isExternalLink(href: string): boolean {\n return /^https?:\\/\\//.test(href) || href.startsWith('//');\n}\n\n// ---------------------------------------------------------------------------\n// Default plugins\n// ---------------------------------------------------------------------------\n\n// T#347 — XSS hardening: the spoiler remark plugin emits raw HTML\n// (`<span class=\"…\">…</span>`) which rehype-raw then re-parses into the\n// DOM tree. Without rehype-sanitize, ANY raw HTML the user types into\n// markdown (`<img src=x onerror=alert(...)>`) would also pass through —\n// catastrophic under cookie-mode auth because the inline script runs\n// in the portal origin with access to the non-HttpOnly CSRF cookie.\n//\n// We extend hast-util-sanitize's defaultSchema (which already strips\n// <script>, on* handlers, javascript:/data: URIs, etc.) to allow the\n// one tag the spoiler plugin emits: `<span class=\"<spoiler-class>\">`.\n// Order matters: rehypeRaw → rehypeSanitize → rehypeHighlight, so the\n// sanitizer sees the fully-expanded tree before highlighting decorates\n// trusted code-fence children with extra <span class=\"hljs-…\"> wrappers.\nconst SAFE_CLASS_RE = /^(prism-content__[a-z0-9_-]+|hljs(-[a-z0-9-]+)?|language-[a-z0-9+#-]+)$/i;\nconst spoilerSanitizeSchema = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n span: [...(defaultSchema.attributes?.['span'] ?? []), ['className', SAFE_CLASS_RE]],\n code: [...(defaultSchema.attributes?.['code'] ?? []), ['className', SAFE_CLASS_RE]],\n div: [...(defaultSchema.attributes?.['div'] ?? []), ['className', SAFE_CLASS_RE]],\n },\n};\n\nconst defaultRehypePlugins: NonNullable<Options['rehypePlugins']> = [\n rehypeRaw,\n [rehypeSanitize, spoilerSanitizeSchema],\n rehypeHighlight,\n];\n\nconst defaultRemarkPlugins: NonNullable<Options['remarkPlugins']> = [\n [remarkGfm, { singleTilde: false }],\n remarkSpoiler,\n];\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function Markdown({\n children,\n className,\n sx,\n compact,\n components,\n rehypePlugins,\n remarkPlugins,\n routerLinkComponent,\n}: MarkdownProps) {\n const content = useMemo(() => {\n const cleaned = String(children).trim();\n return isMarkdownContent(cleaned) ? cleaned : htmlToMarkdown(cleaned);\n }, [children]);\n\n const allRehypePlugins = useMemo(() => [...defaultRehypePlugins, ...(rehypePlugins ?? [])], [rehypePlugins]);\n\n const allRemarkPlugins = useMemo(() => [...defaultRemarkPlugins, ...(remarkPlugins ?? [])], [remarkPlugins]);\n\n const defaultComponents = useMemo(\n (): NonNullable<Options['components']> => ({\n img: ({ node: _n, ...other }) => <img className={contentClasses.image} {...other} />,\n a: ({ href = '', children: linkChildren, node: _n, ...other }) => {\n if (isExternalLink(href)) {\n return (\n <Link href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={contentClasses.link} {...other}>\n {linkChildren}\n </Link>\n );\n }\n if (routerLinkComponent) {\n return (\n <Link component={routerLinkComponent} href={href} className={contentClasses.link} {...other}>\n {linkChildren}\n </Link>\n );\n }\n return (\n <Link href={href} className={contentClasses.link} {...other}>\n {linkChildren}\n </Link>\n );\n },\n pre: ({ children: preChildren }) => (\n <div className={contentClasses.codeBlock}>\n <pre>{preChildren}</pre>\n </div>\n ),\n code: ({ className: codeClassName = '', children: codeChildren, node: _n, ...other }) => {\n const hasLanguage = /language-\\w+/.test(codeClassName);\n return (\n <code className={hasLanguage ? codeClassName : contentClasses.codeInline} {...other}>\n {codeChildren}\n </code>\n );\n },\n input: ({ type, node: _n, ...other }) =>\n type === 'checkbox' ? (\n <CheckboxInput className={contentClasses.checkbox} {...other} />\n ) : (\n <input type={type} {...other} />\n ),\n }),\n [routerLinkComponent]\n );\n\n return (\n <ContentRoot\n className={[contentClasses.root, contentClasses.markdown, compact && contentClasses.compact, className]\n .filter(Boolean)\n .join(' ')}\n sx={sx}\n >\n <ReactMarkdown\n components={{ ...defaultComponents, ...components }}\n rehypePlugins={allRehypePlugins}\n remarkPlugins={allRemarkPlugins}\n >\n {content}\n </ReactMarkdown>\n </ContentRoot>\n );\n}\n\nfunction CheckboxInput(props: React.ComponentProps<'input'>) {\n const uniqueId = useId();\n return <input type=\"checkbox\" id={uniqueId} {...props} />;\n}\n","'use client';\n\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport type { Options } from 'react-markdown';\n\nimport { TipTapRenderer } from '../tiptap-renderer/tiptap-renderer.js';\nimport type { TipTapDoc } from '../tiptap-renderer/tiptap-renderer.js';\nimport { Markdown } from './markdown.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Content can be:\n * - TipTap JSON document (object with `type: 'doc'` and `content` array)\n * - Markdown string\n * - HTML string (auto-converted to markdown)\n * - null/undefined (renders nothing)\n */\nexport type ContentValue = TipTapDoc | Record<string, unknown> | string | null | undefined;\n\nexport interface ContentRendererProps {\n /** The content to render — TipTap JSON, markdown string, or HTML string */\n content: ContentValue;\n /** Additional CSS class */\n className?: string;\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Compact mode for chat messages, comments, etc. */\n compact?: boolean;\n /** Custom react-markdown component overrides (only applies to markdown/HTML content) */\n markdownComponents?: Options['components'];\n /** Link component for internal navigation (e.g. react-router Link) */\n routerLinkComponent?: React.ElementType;\n}\n\n// ---------------------------------------------------------------------------\n// Detection\n// ---------------------------------------------------------------------------\n\nfunction isTipTapDoc(value: unknown): value is TipTapDoc {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as any).type === 'doc' &&\n 'content' in value &&\n Array.isArray((value as any).content)\n );\n}\n\n/**\n * Detect a string that is a JSON-serialised TipTap doc. The\n * comments composer saves the editor state via `editor.getJSON()`\n * then `JSON.stringify(...)`; without this hop the string ends\n * up in the markdown branch and the page prints the raw JSON\n * literal (`{\"type\":\"doc\",\"content\":[...]}`) instead of the\n * formatted comment body. Cheap-first check on the prefix so we\n * don't `JSON.parse` every markdown comment.\n */\nfunction tryParseTipTapJson(value: string): TipTapDoc | null {\n const trimmed = value.trimStart();\n if (!trimmed.startsWith('{')) return null;\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return isTipTapDoc(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Unified content renderer that auto-detects the content format and delegates\n * to the appropriate renderer:\n *\n * - **TipTap JSON** → TipTapRenderer (recursive node-to-HTML mapping)\n * - **Markdown / HTML string** → Markdown (react-markdown with rehype-highlight)\n *\n * Both renderers share the same styled container (`ContentRoot`) ensuring\n * consistent typography, code highlighting, table styling, and dark mode support.\n */\nexport function ContentRenderer({\n content,\n className,\n sx,\n compact,\n markdownComponents,\n routerLinkComponent,\n}: ContentRendererProps) {\n if (content == null) return null;\n\n // TipTap JSON document\n if (typeof content === 'object') {\n if (isTipTapDoc(content)) {\n return <TipTapRenderer content={content} className={className} sx={sx} compact={compact} />;\n }\n // Unknown object — try as TipTap anyway\n return <TipTapRenderer content={content as any} className={className} sx={sx} compact={compact} />;\n }\n\n // String content — TipTap-JSON / markdown / HTML\n if (typeof content === 'string') {\n if (!content.trim()) return null;\n // Comments composer persists TipTap state as `JSON.stringify\n // (editor.getJSON())`, so string-typed content may actually\n // be a serialised TipTap doc. Try the JSON path first;\n // markdown is the fallback for plain text.\n const docFromJson = tryParseTipTapJson(content);\n if (docFromJson) {\n return <TipTapRenderer content={docFromJson} className={className} sx={sx} compact={compact} />;\n }\n return (\n <Markdown\n className={className}\n sx={sx}\n compact={compact}\n components={markdownComponents}\n routerLinkComponent={routerLinkComponent}\n >\n {content}\n </Markdown>\n );\n }\n\n return null;\n}\n","'use client';\n\n/**\n * DurationPicker — Compact duration selector with presets and custom input.\n *\n * Designed for moderation actions (ban/mute) in dialogs or menus.\n * Value is in seconds; `null` represents permanent/indefinite duration.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport Box from '@mui/material/Box';\nimport MenuItem from '@mui/material/MenuItem';\nimport Select from '@mui/material/Select';\nimport TextField from '@mui/material/TextField';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport Typography from '@mui/material/Typography';\nimport { alpha, useTheme } from '@mui/material/styles';\n\nimport type { SelectChangeEvent } from '@mui/material/Select';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst HOUR = 3600;\nconst DAY = 86400;\nconst WEEK = 604800;\n\ntype TimeUnit = 'hours' | 'days' | 'weeks';\n\ninterface Preset {\n label: string;\n value: number | null; // seconds, null = permanent\n key: string;\n}\n\nconst PRESETS: Preset[] = [\n { label: '1h', value: HOUR, key: '1h' },\n { label: '6h', value: 6 * HOUR, key: '6h' },\n { label: '1d', value: DAY, key: '1d' },\n { label: '7d', value: 7 * DAY, key: '7d' },\n { label: '30d', value: 30 * DAY, key: '30d' },\n { label: '\\u221E', value: null, key: 'permanent' },\n];\n\nconst UNIT_SECONDS: Record<TimeUnit, number> = {\n hours: HOUR,\n days: DAY,\n weeks: WEEK,\n};\n\nconst CUSTOM_KEY = 'custom';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DurationPickerLabels {\n /** Title label. @default 'Duration' */\n title?: string;\n /** Custom button label. @default 'Custom' */\n custom?: string;\n /** Time unit labels. */\n hours?: string;\n days?: string;\n weeks?: string;\n}\n\nexport interface DurationPickerProps {\n /** Duration in seconds. `null` = permanent/indefinite. */\n value: number | null;\n /** Called when duration changes. */\n onChange: (seconds: number | null) => void;\n /** Component size. @default 'small' */\n size?: 'small' | 'medium';\n /** Disable all interactions. */\n disabled?: boolean;\n /** Override default English labels for i18n. */\n labels?: DurationPickerLabels;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Find which preset key matches the current value, or 'custom' if none. */\nfunction resolveActiveKey(value: number | null): string {\n const match = PRESETS.find((p) => p.value === value);\n return match ? match.key : CUSTOM_KEY;\n}\n\n/** Decompose seconds into a human-friendly { amount, unit } pair. */\nfunction decomposeSeconds(seconds: number): { amount: number; unit: TimeUnit } {\n if (seconds > 0 && seconds % WEEK === 0) return { amount: seconds / WEEK, unit: 'weeks' };\n if (seconds > 0 && seconds % DAY === 0) return { amount: seconds / DAY, unit: 'days' };\n return { amount: Math.max(1, Math.round(seconds / HOUR)), unit: 'hours' };\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function DurationPicker({ value, onChange, size = 'small', disabled = false, labels }: DurationPickerProps) {\n const theme = useTheme();\n\n const presetKey = useMemo(() => resolveActiveKey(value), [value]);\n\n /**\n * Whether the operator chose \"Custom\", as opposed to landing on a value\n * that happens not to match a preset.\n *\n * It has to be remembered rather than derived, because the two are not the\n * same question and the value cannot answer the first one. Deriving it made\n * the Custom button unusable in its default state: clicking it emitted\n * 1 hour, 1 hour IS the `1h` preset, so the very next render resolved the\n * mode back to `1h` and the custom row never appeared. The same collision\n * swallowed \"24 hours\", \"1 week\" and \"7 days\".\n */\n const [customChosen, setCustomChosen] = useState(() => presetKey === CUSTOM_KEY);\n\n // A value outside every preset is custom whoever set it — including a\n // parent that set it directly.\n const activeKey = customChosen || presetKey === CUSTOM_KEY ? CUSTOM_KEY : presetKey;\n\n // Local state for custom input — only used when custom is active\n const [customAmount, setCustomAmount] = useState<number>(() => {\n if (activeKey === CUSTOM_KEY && value !== null && value > 0) {\n return decomposeSeconds(value).amount;\n }\n return 1;\n });\n const [customUnit, setCustomUnit] = useState<TimeUnit>(() => {\n if (activeKey === CUSTOM_KEY && value !== null && value > 0) {\n return decomposeSeconds(value).unit;\n }\n return 'hours';\n });\n\n /**\n * What the amount field currently shows, which is not always a number.\n *\n * Deriving the field's contents from the numeric amount meant an empty\n * field was impossible: clearing it parsed as NaN, fell back to 1, and\n * re-rendered as \"1\" — so typing \"3\" produced \"13\" and typing \"24\"\n * produced \"124\". Replacing the amount required selecting it first, which\n * nothing tells the operator to do. The text is held separately so the\n * field can be transiently empty; only a positive number is emitted.\n */\n const [customText, setCustomText] = useState<string>(() => String(customAmount));\n\n const isCustom = activeKey === CUSTOM_KEY;\n\n // ------- Handlers -------\n\n const handlePresetChange = useCallback(\n (_: React.MouseEvent<HTMLElement>, newKey: string | null) => {\n if (newKey === null) return; // MUI fires null on deselect — ignore\n if (newKey === CUSTOM_KEY) {\n // Switch to custom — emit current custom values\n setCustomChosen(true);\n onChange(customAmount * UNIT_SECONDS[customUnit]);\n return;\n }\n const preset = PRESETS.find((p) => p.key === newKey);\n if (preset) {\n setCustomChosen(false);\n onChange(preset.value);\n }\n },\n [onChange, customAmount, customUnit]\n );\n\n const handleCustomAmountChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const text = e.target.value;\n setCustomText(text);\n\n const parsed = parseInt(text, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) return; // not a duration yet\n setCustomAmount(parsed);\n onChange(parsed * UNIT_SECONDS[customUnit]);\n },\n [onChange, customUnit]\n );\n\n /** Put a readable number back once the operator leaves an empty field. */\n const handleCustomAmountBlur = useCallback(() => {\n setCustomText(String(customAmount));\n }, [customAmount]);\n\n const handleCustomUnitChange = useCallback(\n (e: SelectChangeEvent<TimeUnit>) => {\n const unit = e.target.value as TimeUnit;\n setCustomUnit(unit);\n onChange(customAmount * UNIT_SECONDS[unit]);\n },\n [onChange, customAmount]\n );\n\n // ------- Styles -------\n\n const toggleSx = {\n '& .MuiToggleButton-root': {\n px: size === 'small' ? 1.25 : 1.75,\n py: size === 'small' ? 0.5 : 0.75,\n fontSize: size === 'small' ? '0.8125rem' : '0.875rem',\n fontWeight: 600,\n lineHeight: 1.5,\n borderColor: alpha(theme.palette.divider, 0.2),\n color: theme.palette.text.secondary,\n textTransform: 'none' as const,\n '&.Mui-selected': {\n color: theme.palette.primary.main,\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: alpha(theme.palette.primary.main, 0.3),\n '&:hover': {\n bgcolor: alpha(theme.palette.primary.main, 0.16),\n },\n },\n '&.Mui-disabled': {\n color: theme.palette.text.disabled,\n },\n },\n };\n\n return (\n <Box>\n <Typography\n variant=\"caption\"\n sx={{\n mb: 0.75,\n display: 'block',\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {labels?.title ?? 'Duration'}\n </Typography>\n\n <ToggleButtonGroup\n exclusive\n value={activeKey}\n onChange={handlePresetChange}\n size={size}\n disabled={disabled}\n sx={{\n ...toggleSx,\n flexWrap: 'wrap',\n gap: 0.5,\n '& .MuiToggleButtonGroup-grouped': {\n border: '1px solid',\n borderRadius: '8px !important',\n borderColor: alpha(theme.palette.divider, 0.2),\n // Position-class selectors replace the deprecated\n // `:not(:first-of-type)` sibling pattern (MUI v9 tags\n // children with firstButton/middleButton/lastButton via\n // ToggleButtonGroupButtonContext). gap:0.5 above means\n // we want INDEPENDENT borders on every button (no\n // overlap/collapse), so restore left border + zero out\n // MUI's default `margin-left: -1px` on middle/last.\n '&.MuiToggleButtonGroup-middleButton, &.MuiToggleButtonGroup-lastButton': {\n borderLeft: '1px solid',\n borderColor: alpha(theme.palette.divider, 0.2),\n marginLeft: 0,\n },\n },\n }}\n >\n {PRESETS.map((preset) => (\n <ToggleButton key={preset.key} value={preset.key}>\n {preset.label}\n </ToggleButton>\n ))}\n <ToggleButton value={CUSTOM_KEY}>{labels?.custom ?? 'Custom'}</ToggleButton>\n </ToggleButtonGroup>\n\n {/* Custom duration input row */}\n {isCustom && (\n <Box\n sx={{\n mt: 1.25,\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n }}\n >\n <TextField\n type=\"number\"\n value={customText}\n onChange={handleCustomAmountChange}\n onBlur={handleCustomAmountBlur}\n disabled={disabled}\n size={size}\n slotProps={{\n htmlInput: { min: 1, max: 9999, style: { textAlign: 'center' } },\n }}\n sx={{ width: 80 }}\n />\n <Select<TimeUnit>\n value={customUnit}\n onChange={handleCustomUnitChange}\n disabled={disabled}\n size={size}\n sx={{ minWidth: 100 }}\n >\n <MenuItem value=\"hours\">{labels?.hours ?? 'hours'}</MenuItem>\n <MenuItem value=\"days\">{labels?.days ?? 'days'}</MenuItem>\n <MenuItem value=\"weeks\">{labels?.weeks ?? 'weeks'}</MenuItem>\n </Select>\n </Box>\n )}\n </Box>\n );\n}\n","'use client';\n\nimport { type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\ninterface ChangelogTimelineProps {\n children: ReactNode;\n sx?: SxProps<Theme>;\n}\n\nexport function ChangelogTimeline({ children, sx }: ChangelogTimelineProps) {\n return (\n <Box\n sx={{\n position: 'relative',\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: { xs: 16, sm: 24 },\n top: 0,\n bottom: 0,\n width: 2,\n bgcolor: 'divider',\n },\n ...(sx as any),\n }}\n >\n {children}\n </Box>\n );\n}\n","'use client';\n\nimport { type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport Typography from '@mui/material/Typography';\nimport Chip from '@mui/material/Chip';\nimport Stack from '@mui/material/Stack';\n\ninterface ChangelogEntryProps {\n version: string;\n date: string;\n badge?: string | null;\n children: ReactNode;\n}\n\nexport function ChangelogEntry({ version, date, badge, children }: ChangelogEntryProps) {\n return (\n <Box sx={{ position: 'relative', pl: { xs: 5, sm: 7 }, pb: 4 }}>\n {/* Timeline dot */}\n <Box\n sx={{\n position: 'absolute',\n left: { xs: 10, sm: 18 },\n top: 8,\n width: 14,\n height: 14,\n borderRadius: '50%',\n bgcolor: 'primary.main',\n border: 3,\n borderColor: 'background.paper',\n zIndex: 1,\n }}\n />\n <Card variant=\"outlined\" sx={{ p: 3 }}>\n <Stack\n direction=\"row\"\n spacing={1.5}\n sx={{\n alignItems: \"center\",\n mb: 2\n }}>\n <Typography variant=\"h6\" sx={{\n fontWeight: 700\n }}>\n {version}\n </Typography>\n {badge && <Chip label={badge} size=\"small\" color=\"primary\" variant=\"soft\" />}\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n ml: 'auto !important'\n }}>\n {date}\n </Typography>\n </Stack>\n\n {children}\n </Card>\n </Box>\n );\n}\n","'use client';\n\n/**\n * Map Component\n *\n * Thin wrapper around `react-map-gl/maplibre` that picks up the\n * prism theme (light/dark) and ships sensible defaults\n * (NavigationControl, ScaleControl, attribution). All app-level\n * map UIs build on top of this — see `<MapMarker>`,\n * `<MapPointPicker>`, `<MapCoverageLayer>`.\n *\n * Tile source:\n * - `styleUrl` prop OR\n * - `MAP_STYLE_URL` browser-side env var injected by host app\n *\n * The downstream platform is closed and Tor-friendly, so the tile\n * source MUST be self-hosted (no maptiler/mapbox CDN that would\n * leak user IPs). A fallback in-component style renders a flat\n * neutral background so the map UI is visible during local dev\n * before tile infra is set up.\n *\n * @module components/map\n */\n\nimport 'maplibre-gl/dist/maplibre-gl.css';\n\nimport { forwardRef, useEffect, useMemo } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { Map as ReactMapGL, NavigationControl, ScaleControl } from 'react-map-gl/maplibre';\nimport type { MapRef, ViewState, ViewStateChangeEvent } from 'react-map-gl/maplibre';\n// maplibre-gl 6 dropped the default export; every entry point is a named one.\nimport { addProtocol } from 'maplibre-gl';\nimport type { StyleSpecification } from 'maplibre-gl';\nimport { Protocol } from 'pmtiles';\nimport { useTheme } from '@mui/material/styles';\n\n// Register the `pmtiles://` URL scheme once per page load. The\n// scheme lets a MapLibre style point at a `.pmtiles` file via\n// HTTP range requests instead of a per-tile endpoint — no tile\n// server process needed, the static file IS the tile server.\nlet pmtilesProtocolRegistered = false;\nfunction ensurePmtilesProtocol() {\n if (pmtilesProtocolRegistered) return;\n const protocol = new Protocol();\n addProtocol('pmtiles', protocol.tile);\n pmtilesProtocolRegistered = true;\n}\n\nexport interface MapViewport {\n longitude: number;\n latitude: number;\n zoom: number;\n bearing?: number;\n pitch?: number;\n}\n\nexport interface MapProps {\n /** Style JSON URL (vector tile server) or inline StyleSpecification. */\n styleUrl?: string | StyleSpecification;\n /** Controlled viewport (camera). Pair with `onViewportChange` for two-way sync. */\n viewport?: Partial<MapViewport>;\n /** Defaults when `viewport` is uncontrolled or partially specified. */\n initialViewport?: Partial<MapViewport>;\n /** Callback for every camera change (drag/zoom/rotate). */\n onViewportChange?: (next: MapViewport) => void;\n /** Show NavigationControl (zoom + compass). Default: true. */\n showNavigation?: boolean;\n /** Show ScaleControl. Default: true. */\n showScale?: boolean;\n /** Show attribution. Default: true. */\n showAttribution?: boolean;\n /** Container style — pass `height` here. Default 400px height. */\n style?: CSSProperties;\n /** Cursor while idle. */\n cursor?: 'grab' | 'pointer' | 'crosshair' | string;\n /** Click handler on the map canvas. */\n onClick?: (event: { lngLat: { lng: number; lat: number } }) => void;\n /** Layer/marker children rendered inside the MapLibre canvas. */\n children?: ReactNode;\n}\n\n// Default viewport centred on Moscow at country-overview zoom —\n// the platform's primary geography.\nconst DEFAULT_VIEWPORT: MapViewport = {\n longitude: 37.6173,\n latitude: 55.7558,\n zoom: 4,\n bearing: 0,\n pitch: 0,\n};\n\n// Minimal valid MapLibre style — solid background. Used as\n// last-resort fallback so the map widget renders SOMETHING even\n// when no styleUrl is configured (e.g. local dev before the tile\n// server is provisioned). The fallback is deliberately ugly so\n// it's obvious the tile source isn't wired up.\nconst FALLBACK_STYLE: StyleSpecification = {\n version: 8,\n sources: {},\n layers: [\n {\n id: 'background',\n type: 'background',\n paint: { 'background-color': '#e0e0e0' },\n },\n ],\n};\n\nexport const Map = forwardRef<MapRef, MapProps>(function MapView(\n {\n styleUrl,\n viewport,\n initialViewport,\n onViewportChange,\n showNavigation = true,\n showScale = true,\n showAttribution = true,\n style,\n cursor = 'grab',\n onClick,\n children,\n },\n ref,\n) {\n const theme = useTheme();\n\n // Register pmtiles:// protocol handler on first mount.\n useEffect(() => {\n ensurePmtilesProtocol();\n }, []);\n\n // Resolve style: explicit prop > env var (host app injects) > fallback.\n const mapStyle = useMemo<string | StyleSpecification>(() => {\n if (styleUrl) return styleUrl;\n const envUrl =\n typeof window !== 'undefined' &&\n (window as unknown as { __MAP_STYLE_URL__?: string }).__MAP_STYLE_URL__;\n if (typeof envUrl === 'string' && envUrl.length > 0) return envUrl;\n return FALLBACK_STYLE;\n }, [styleUrl]);\n\n const initial = useMemo<MapViewport>(\n () => ({ ...DEFAULT_VIEWPORT, ...initialViewport }),\n [initialViewport],\n );\n\n const handleMove = onViewportChange\n ? (e: ViewStateChangeEvent) => {\n const v: ViewState = e.viewState;\n onViewportChange({\n longitude: v.longitude,\n latitude: v.latitude,\n zoom: v.zoom,\n bearing: v.bearing,\n pitch: v.pitch,\n });\n }\n : undefined;\n\n const containerStyle: CSSProperties = {\n width: '100%',\n height: 400,\n borderRadius: theme.shape.borderRadius,\n overflow: 'hidden',\n ...style,\n };\n\n return (\n <div style={containerStyle}>\n <ReactMapGL\n ref={ref}\n mapStyle={mapStyle}\n {...(viewport\n ? {\n longitude: viewport.longitude ?? initial.longitude,\n latitude: viewport.latitude ?? initial.latitude,\n zoom: viewport.zoom ?? initial.zoom,\n bearing: viewport.bearing ?? initial.bearing,\n pitch: viewport.pitch ?? initial.pitch,\n }\n : {\n initialViewState: initial,\n })}\n onMove={handleMove}\n onClick={onClick ? (e) => onClick({ lngLat: e.lngLat }) : undefined}\n cursor={cursor}\n attributionControl={showAttribution ? {} : false}\n style={{ width: '100%', height: '100%' }}\n >\n {showNavigation && <NavigationControl position=\"top-right\" />}\n {showScale && <ScaleControl position=\"bottom-left\" />}\n {children}\n </ReactMapGL>\n </div>\n );\n});\n\n// The render function is `MapView` so it does not shadow the export it is\n// assigned to; the name DevTools shows stays `Map`.\nMap.displayName = 'Map';\n","'use client';\n\n/**\n * MapMarker Component\n *\n * Decorative marker pinned at `[longitude, latitude]` on the\n * parent `<Map>`. Renders a HugeIcons-styled pin by default;\n * pass `children` for a fully custom marker DOM. Optional\n * `popup` opens a Popup on click.\n *\n * @module components/map\n */\n\nimport { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Marker, Popup } from 'react-map-gl/maplibre';\nimport { useTheme } from '@mui/material/styles';\n\nexport interface MapMarkerProps {\n longitude: number;\n latitude: number;\n /** Marker fill colour. Defaults to theme primary. */\n color?: string;\n /** Custom DOM (overrides the default pin icon). */\n children?: ReactNode;\n /** Popup body shown on click. */\n popup?: ReactNode;\n /** Anchor side. Defaults to bottom (pin tip at coordinate). */\n anchor?: 'center' | 'top' | 'bottom' | 'left' | 'right';\n /** Click-through handler. */\n onClick?: () => void;\n}\n\nexport function MapMarker({\n longitude,\n latitude,\n color,\n children,\n popup,\n anchor = 'bottom',\n onClick,\n}: MapMarkerProps) {\n const theme = useTheme();\n const [open, setOpen] = useState(false);\n const fill = color ?? theme.palette.primary.main;\n\n const handleClick = (e: { originalEvent?: { stopPropagation?: () => void } }) => {\n e.originalEvent?.stopPropagation?.();\n if (popup) setOpen((v) => !v);\n onClick?.();\n };\n\n return (\n <>\n <Marker\n longitude={longitude}\n latitude={latitude}\n anchor={anchor}\n onClick={handleClick}\n >\n {children ?? (\n <svg width=\"24\" height=\"32\" viewBox=\"0 0 24 32\" aria-hidden style={{ display: 'block' }}>\n <path\n d=\"M12 0C5.4 0 0 5.4 0 12c0 9 12 20 12 20s12-11 12-20C24 5.4 18.6 0 12 0z\"\n fill={fill}\n />\n <circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"#fff\" />\n </svg>\n )}\n </Marker>\n {popup && open && (\n <Popup\n longitude={longitude}\n latitude={latitude}\n anchor=\"top\"\n offset={[0, -32]}\n closeOnClick={false}\n onClose={() => setOpen(false)}\n >\n {popup}\n </Popup>\n )}\n </>\n );\n}\n","'use client';\n\n/**\n * MapPointPicker Component\n *\n * Controlled \"click to choose a coordinate\" widget. Renders a\n * `<Map>` with click handler that emits `{lng, lat}` and shows\n * a draggable `<MapMarker>` at the current value. Reverse-\n * geocoding is the host app's job (it knows which RPC client to\n * call) — pass `geocodeResult` + `geocodeLoading` from your\n * useQuery and we render them in the side panel.\n *\n * The component stays UI-only / backend-agnostic so prism has no\n * dependency on any specific RPC client. Apps wire\n * `Geocoding.reverse` to `value` changes via TanStack Query.\n *\n * @module components/map\n */\n\nimport { useCallback } from 'react';\nimport type { ReactNode } from 'react';\nimport { Marker } from 'react-map-gl/maplibre';\nimport type { MarkerDragEvent } from 'react-map-gl/maplibre';\nimport { Stack, Paper, Typography, CircularProgress, Box } from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\nimport { Map } from './Map.js';\nimport type { MapProps, MapViewport } from './Map.js';\n\nexport interface MapPointPickerValue {\n lng: number;\n lat: number;\n}\n\nexport interface MapPointPickerProps {\n /** Currently picked point, or null if nothing yet. */\n value: MapPointPickerValue | null;\n /** Called on click and on marker drag-end. */\n onChange: (next: MapPointPickerValue) => void;\n /** Initial map viewport. Default Moscow at zoom 4. */\n initialViewport?: Partial<MapViewport>;\n /** Override map tile style. */\n styleUrl?: MapProps['styleUrl'];\n /** Container height (passed to inner Map). */\n height?: number;\n /** Reverse-geocode response to display in the side panel. */\n geocodeResult?: ReactNode;\n /** Show a spinner in the side panel while host RPC is in flight. */\n geocodeLoading?: boolean;\n /** Hint text shown when value is null. */\n placeholder?: string;\n}\n\nexport function MapPointPicker({\n value,\n onChange,\n initialViewport,\n styleUrl,\n height = 480,\n geocodeResult,\n geocodeLoading = false,\n placeholder = 'Кликните по карте, чтобы выбрать точку',\n}: MapPointPickerProps) {\n const theme = useTheme();\n\n const handleClick = useCallback<NonNullable<MapProps['onClick']>>(\n (e) => onChange({ lng: e.lngLat.lng, lat: e.lngLat.lat }),\n [onChange],\n );\n\n const handleDragEnd = useCallback(\n (e: MarkerDragEvent) => {\n onChange({ lng: e.lngLat.lng, lat: e.lngLat.lat });\n },\n [onChange],\n );\n\n return (\n <Stack direction={{ xs: 'column', md: 'row' }} spacing={2} sx={{ width: '100%' }}>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Map\n styleUrl={styleUrl}\n initialViewport={initialViewport}\n cursor=\"crosshair\"\n onClick={handleClick}\n style={{ height }}\n >\n {value && (\n <Marker\n longitude={value.lng}\n latitude={value.lat}\n anchor=\"bottom\"\n draggable\n onDragEnd={handleDragEnd}\n >\n <svg width=\"24\" height=\"32\" viewBox=\"0 0 24 32\" aria-hidden style={{ display: 'block' }}>\n <path\n d=\"M12 0C5.4 0 0 5.4 0 12c0 9 12 20 12 20s12-11 12-20C24 5.4 18.6 0 12 0z\"\n fill={theme.palette.error.main}\n />\n <circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"#fff\" />\n </svg>\n </Marker>\n )}\n </Map>\n </Box>\n <Paper\n variant=\"outlined\"\n sx={{\n width: { xs: '100%', md: 320 },\n p: 2,\n borderColor: theme.palette.divider,\n bgcolor: theme.palette.background.default,\n }}\n >\n {value ? (\n <Stack spacing={1.5}>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Координаты\n </Typography>\n <Typography variant=\"body2\" sx={{ fontVariantNumeric: 'tabular-nums' }}>\n {value.lat.toFixed(5)}, {value.lng.toFixed(5)}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Распознанное место\n </Typography>\n {geocodeLoading ? (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <CircularProgress size={16} />\n <Typography variant=\"body2\" color=\"text.secondary\">\n Геокодирование…\n </Typography>\n </Box>\n ) : geocodeResult ? (\n <Box>{geocodeResult}</Box>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Нет данных\n </Typography>\n )}\n </Stack>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {placeholder}\n </Typography>\n )}\n </Paper>\n </Stack>\n );\n}\n","'use client';\n\n/**\n * MapCoverageLayer Component\n *\n * Renders an array of typed points on the parent `<Map>` as\n * colour-coded circles. Designed for \"coverage\" use cases\n * (dead-drops by status, pickup points by enabled/disabled,\n * shops by tier). Uses a single MapLibre symbol layer driven by\n * an in-memory GeoJSON source so rendering scales to a few\n * thousand points without DOM thrash.\n *\n * For < ~200 points, prefer composing `<MapMarker>` directly —\n * it gives you click + popup affordances per marker. This layer\n * is for the \"show me the whole network\" view.\n *\n * @module components/map\n */\n\nimport { useMemo } from 'react';\nimport { Source, Layer } from 'react-map-gl/maplibre';\nimport { useTheme } from '@mui/material/styles';\n\nexport interface CoveragePoint {\n /** Unique id within the layer; used as feature id for clicks. */\n id: string;\n longitude: number;\n latitude: number;\n /** Free-form bucket; the layer maps it to a colour via\n * the `colorByStatus` prop. Default mapping covers the\n * generic 'active'/'pending'/'expired'/'disabled' buckets. */\n status?: string;\n /** Optional label shown next to the point when zoomed in. */\n label?: string;\n}\n\nexport interface MapCoverageLayerProps {\n id: string;\n points: CoveragePoint[];\n /** Map of status → colour. Override to project custom domain\n * semantics. Default uses theme palette. */\n colorByStatus?: Record<string, string>;\n /** Marker radius in pixels (zoom-stable). Default 6. */\n radius?: number;\n /** Show label text alongside each marker (zoom 12+). */\n showLabels?: boolean;\n}\n\nexport function MapCoverageLayer({\n id,\n points,\n colorByStatus,\n radius = 6,\n showLabels = false,\n}: MapCoverageLayerProps) {\n const theme = useTheme();\n\n const palette = useMemo<Record<string, string>>(\n () => ({\n active: theme.palette.success.main,\n pending: theme.palette.warning.main,\n expired: theme.palette.text.disabled,\n disabled: theme.palette.text.disabled,\n retired: theme.palette.text.disabled,\n ...(colorByStatus ?? {}),\n }),\n [theme, colorByStatus],\n );\n\n const geojson = useMemo(\n () => ({\n type: 'FeatureCollection' as const,\n features: points.map((p) => ({\n type: 'Feature' as const,\n id: p.id,\n geometry: {\n type: 'Point' as const,\n coordinates: [p.longitude, p.latitude],\n },\n properties: {\n status: p.status ?? 'active',\n label: p.label ?? '',\n color: palette[p.status ?? 'active'] ?? theme.palette.primary.main,\n },\n })),\n }),\n [points, palette, theme],\n );\n\n return (\n <Source id={id} type=\"geojson\" data={geojson}>\n <Layer\n id={`${id}-circles`}\n type=\"circle\"\n paint={{\n 'circle-radius': radius,\n 'circle-color': ['get', 'color'],\n 'circle-stroke-color': theme.palette.background.paper,\n 'circle-stroke-width': 1.5,\n }}\n />\n {showLabels && (\n <Layer\n id={`${id}-labels`}\n type=\"symbol\"\n minzoom={11}\n layout={{\n 'text-field': ['get', 'label'],\n 'text-size': 11,\n 'text-offset': [0, 1.2],\n 'text-anchor': 'top',\n 'text-font': ['Noto Sans Regular'],\n }}\n paint={{\n 'text-color': theme.palette.text.primary,\n 'text-halo-color': theme.palette.background.paper,\n 'text-halo-width': 1,\n }}\n />\n )}\n </Source>\n );\n}\n"]}
|