@omnitron-dev/prism 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blocks/index.js +49 -9
- package/dist/blocks/index.js.map +1 -1
- package/dist/chunk-2FYNRDXR.js +192 -0
- package/dist/chunk-2FYNRDXR.js.map +1 -0
- package/dist/chunk-A2Z7NVGL.js +11496 -0
- package/dist/chunk-A2Z7NVGL.js.map +1 -0
- package/dist/{chunk-E3XANPTO.js → chunk-IZOIO7PA.js} +5 -191
- package/dist/{chunk-E3XANPTO.js.map → chunk-IZOIO7PA.js.map} +1 -1
- package/dist/{chunk-LAEY5USO.js → chunk-KTCWPGON.js} +55 -25
- package/dist/chunk-KTCWPGON.js.map +1 -0
- package/dist/{chunk-DXXZ3ITR.js → chunk-MEFT6XPH.js} +721 -455
- package/dist/chunk-MEFT6XPH.js.map +1 -0
- package/dist/{chunk-BTIT7WYH.js → chunk-SNKGGHBT.js} +2 -2
- package/dist/chunk-SNKGGHBT.js.map +1 -0
- package/dist/{chunk-UR6X3W5I.js → chunk-VAAIHNWQ.js} +3 -3
- package/dist/{chunk-UR6X3W5I.js.map → chunk-VAAIHNWQ.js.map} +1 -1
- package/dist/{chunk-GYDT5EKX.js → chunk-XQXGE2PW.js} +760 -472
- package/dist/chunk-XQXGE2PW.js.map +1 -0
- package/dist/{chunk-WC2WM2JD.js → chunk-XXP3ZGU6.js} +18 -8
- package/dist/chunk-XXP3ZGU6.js.map +1 -0
- package/dist/chunk-YJMAQL3S.js +1887 -0
- package/dist/chunk-YJMAQL3S.js.map +1 -0
- package/dist/cli/index.js +4 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/components/editor/index.d.ts +107 -0
- package/dist/components/editor/index.js +4 -0
- package/dist/components/editor/index.js.map +1 -0
- package/dist/components/index.css +131 -0
- package/dist/components/index.css.map +1 -0
- package/dist/components/index.d.ts +7073 -0
- package/dist/components/index.js +13 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components-BCGZ-Rwt.d.ts +142 -0
- package/dist/{config-BA6IeTq9.d.ts → config-Pct0n_Kq.d.ts} +2 -2
- package/dist/core/index.d.ts +20 -5
- package/dist/core/index.js +2 -2
- package/dist/hooks/index.d.ts +3 -2
- package/dist/hooks/index.js +4 -3
- package/dist/{index-odhPSv9I.d.ts → index-nmJ8Muwg.d.ts} +4 -127
- package/dist/index.d.ts +265 -6615
- package/dist/index.js +119 -11662
- package/dist/index.js.map +1 -1
- package/dist/layouts/index.js +1 -1
- package/dist/popover-Dmw7SJLR.d.ts +127 -0
- package/dist/registry/index.d.ts +2 -2
- package/dist/{registry-BrDNftd5.d.ts → registry-DQcIzW2s.d.ts} +2 -2
- package/dist/{settings-plpR26Xk.d.ts → settings-CAC0qFjS.d.ts} +2 -2
- package/dist/state/index.d.ts +2 -2
- package/dist/state/index.js +1 -1
- package/dist/text-transform-D6MzzF7V.d.ts +165 -0
- package/dist/theme/index.d.ts +2 -2
- package/dist/theme/index.js +2 -2
- package/dist/{theme-CrXLfP1c.d.ts → theme-B4Q3Bg5o.d.ts} +1 -1
- package/dist/types/index.d.ts +6 -145
- package/package.json +46 -40
- package/dist/chunk-BTIT7WYH.js.map +0 -1
- package/dist/chunk-DXXZ3ITR.js.map +0 -1
- package/dist/chunk-GYDT5EKX.js.map +0 -1
- package/dist/chunk-LAEY5USO.js.map +0 -1
- package/dist/chunk-WC2WM2JD.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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/components/admin-filters/amount-cell.tsx","../src/components/date-range-picker/use-date-range-picker.ts","../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/empty-content/empty-content.tsx","../src/components/page-content/page-content.tsx","../src/components/image/image.tsx","../src/components/label/label.tsx","../src/components/loading-screen/loading-screen.tsx","../src/components/loading-screen/splash-screen.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/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/error-boundary/error-boundary.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/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/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/editor/classes.ts","../src/components/editor/styles.tsx","../src/components/editor/presets.ts","../src/components/editor/toolbar/toolbar-item.tsx","../src/components/editor/icons/index.tsx","../src/components/editor/toolbar/heading-block.tsx","../src/components/editor/toolbar/link-block.tsx","../src/components/editor/toolbar/image-block.tsx","../src/components/editor/toolbar/use-toolbar-state.ts","../src/components/editor/toolbar/toolbar.tsx","../src/components/editor/toolbar/bubble-toolbar.tsx","../src/components/editor/toolbar/code-highlight-block.tsx","../src/components/editor/extensions/clear-format.ts","../src/components/editor/extensions/text-transform.ts","../src/components/editor/editor.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/utils/refs.ts","../src/utils/format-number.ts","../src/utils/format-date.ts","../src/utils/string.ts","../src/utils/storage.ts","../src/utils/font.ts","../src/utils/object.ts","../src/utils/rtl.ts","../src/utils/async-lock.ts","../src/utils/errors.ts","../src/utils/fetch-interceptor.ts","../src/utils/jwt.ts","../src/utils/template-resolver.ts"],"names":["jsxs","jsx","useCallback","Fragment","TextField","IconButton","useDebounce","useState","Typography","Box","Button","alpha","useMemo","Skeleton","Chip","dayjs","useRef","useEffect","styled","useTheme","Avatar","MuiBadge","Badge","forwardRef","Card","Dialog","DialogTitle","DialogContent","DialogActions","Stack","Image","Label","LinearProgress","Portal","Scrollbar","CloseIcon","SvgColor","StyledTableContainer","Paper","StyledTableHead","TableHead","StyledTableRow","TableRow","MuiTable","TableCell","TableSortLabel","TableBody","TablePagination","MuiSkeleton","formatLabel","CircularProgress","MuiCircularProgress","Children","Divider","MenuItem","ExpandMoreIcon","createContext","useContext","Tooltip","MuiTooltip","Alert","MuiAlert","SvgIcon","Drawer","MuiDrawer","ItemRoot","ItemIcon","MIN_ZOOM","MAX_ZOOM","ZOOM_STEP","ChevronLeftIcon","ChevronRightIcon","Nav","NavUl","NavLi","NavSubheader","NavItemBase","IconWrapper","NavArrow","origin","NavItem","Collapse","Popover","ButtonBase","FullscreenIcon","Menu","editor","FormHelperText","ArrowIcon","Link","NavButton","DropdownContent","SectionHeader","SubItemLink","MegaMenuList","ListItemText","MARGIN","Tag","isExternalLink","useId","ToggleButtonGroup","ToggleButton","getInitials","slugify","buildUrl"],"mappings":"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","file":"index.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\nexport type DateRangePickerProps = DialogProps &\n UseDateRangePickerReturn & {\n onSubmit?: () => void;\n variant?: 'calendar' | 'input';\n title?: string;\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 = 'Select date range',\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 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>{title}</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=\"Start date\" value={startDate} onChange={onChangeStartDate} />\n <DatePicker label=\"End date\" value={endDate} onChange={onChangeEndDate} />\n </>\n )}\n\n {error && (\n <FormHelperText error sx={{ px: 2 }}>\n End date must be later than start date\n </FormHelperText>\n )}\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"outlined\" color=\"inherit\" onClick={handleClose}>\n Cancel\n </Button>\n <Button disabled={error} variant=\"contained\" onClick={handleSubmit}>\n Apply\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';\n\nimport { useState, useCallback } 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\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}\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(start: string, end: string): 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 `From ${s.format('DD MMM YYYY')}`;\n if (e) return `To ${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}: 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 displayLabel = formatLabel(startDate, endDate);\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=\"Select dates...\"\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} 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 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 @omnitron-dev/prism/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\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}: 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 // 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 slotProps={{ select: { displayEmpty: true } }}\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\" color=\"text.secondary\">\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 renderValue: (selected: unknown) => {\n const sel = selected as string[];\n if (sel.length === 0) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\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} alignItems=\"center\">\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 variant=\"body2\" color=\"text.disabled\" sx={{ px: 0.5 }}>\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 direction=\"row\" alignItems=\"center\" flexWrap=\"wrap\" gap={1.5}>\n {filters.map(renderFilter)}\n\n {/* Active filter count + reset */}\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ ml: 'auto' }}>\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 Reset\n </Button>\n )}\n </Stack>\n </Stack>\n\n {/* Results count */}\n {total !== undefined && !compact && (\n <Typography variant=\"caption\" color=\"text.disabled\" sx={{ mt: 0.5 }}>\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 @omnitron-dev/prism/components/admin-filters\n */\n\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 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 /** 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 /** Extract unique key from row */\n rowKey?: (row: T) => string;\n /** Row click handler */\n onRowClick?: (row: T) => void;\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 /** Additional styles */\n sx?: 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 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-of-type(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// =============================================================================\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 page,\n pageSize,\n onPageChange,\n onPageSizeChange,\n sortBy,\n sortOrder = 'asc',\n onSort,\n emptyMessage = 'No data found',\n rowKey,\n onRowClick,\n pageSizeOptions = [10, 25, 50, 100],\n stickyHeader = false,\n dense = false,\n maxHeight,\n sx,\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 return String(index);\n },\n [rowKey]\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 const skeletonRows = useMemo(\n () =>\n Array.from({ length: pageSize }, (_, i) => (\n <TableRow key={`skeleton-${i}`}>\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 [pageSize, columns]\n );\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 {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 variant=\"body2\" color=\"text.disabled\">\n {emptyMessage}\n </Typography>\n </Box>\n </StyledTableContainer>\n );\n }\n\n return (\n <StyledTableContainer sx={{ maxHeight, ...sx }}>\n <TableContainer>\n <MuiTable size={dense ? 'small' : 'medium'} stickyHeader={stickyHeader}>\n <StyledTableHead>\n <TableRow>\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 <StyledTableRow\n key={getRowKey(row, index)}\n hover\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n sx={{ cursor: onRowClick ? 'pointer' : 'default' }}\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 </TableBody>\n </MuiTable>\n </TableContainer>\n\n <TablePagination\n component=\"div\"\n count={total}\n page={page}\n rowsPerPage={pageSize}\n rowsPerPageOptions={pageSizeOptions}\n onPageChange={handlePageChange}\n onRowsPerPageChange={handlePageSizeChange}\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 @omnitron-dev/prism/components/admin-filters\n */\n\nimport type { ReactNode } from 'react';\nimport Chip 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\nexport interface StatusChipProps {\n /** Status string to display */\n status: string;\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// 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, colorMap, size = 'small', sx }: StatusChipProps): ReactNode {\n const normalizedStatus = status.toLowerCase();\n const mergedMap = colorMap ? { ...DEFAULT_COLOR_MAP, ...colorMap } : DEFAULT_COLOR_MAP;\n const color: StatusColor = mergedMap[normalizedStatus] ?? 'default';\n\n // Capitalize first letter\n const displayLabel = status.charAt(0).toUpperCase() + status.slice(1).toLowerCase();\n\n return (\n <Chip\n label={displayLabel}\n size={size}\n sx={{\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.palette[color].main,\n bgcolor: (theme) => alpha(theme.palette[color].main, 0.1),\n border: (theme) => `1px solid ${alpha(theme.palette[color].main, 0.2)}`,\n }),\n ...(color === 'default' && {\n color: 'text.secondary',\n bgcolor: (theme) => alpha(theme.palette.grey[500], 0.08),\n border: (theme) => `1px solid ${alpha(theme.palette.grey[500], 0.16)}`,\n }),\n ...sx,\n }}\n />\n );\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 @omnitron-dev/prism/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\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 const fixed = 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 color=\"text.disabled\"\n sx={{\n ml: 0.5,\n fontFamily: 'inherit',\n fontSize: '0.7rem',\n fontWeight: 400,\n }}\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","/**\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 @omnitron-dev/prism/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 @omnitron-dev/prism/components/avatar\n */\n\nimport type { ReactNode, CSSProperties } from 'react';\nimport { forwardRef, 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// =============================================================================\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 const Avatar = forwardRef<HTMLDivElement, AvatarProps>(function Avatar(\n { size = 'md', shape = 'circular', name, src, alt, online, offline, badge, badgeColor, children, sx, ...other },\n ref\n) {\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 @omnitron-dev/prism/components/badge\n */\n\nimport type { ReactNode } from 'react';\nimport { forwardRef } 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// =============================================================================\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 const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { variant = 'standard', color = 'error', size = 'medium', badgeContent, children, sx, ...other },\n ref\n) {\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\nexport interface CountBadgeProps {\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 * 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}: 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 sx={{\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 ...sx,\n }}\n >\n {displayCount}\n </Box>\n );\n}\n\n// =============================================================================\n// STATUS DOT\n// =============================================================================\n\nexport type StatusDotStatus = 'online' | 'offline' | 'busy' | 'away';\n\nexport interface StatusDotProps {\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\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 }: 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 sx={{\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 ...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 @omnitron-dev/prism/components/card\n */\n\nimport type { ReactNode } from 'react';\nimport { forwardRef } 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// =============================================================================\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 const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n {\n variant = 'elevation',\n title,\n subheader,\n headerAction,\n headerSx,\n contentSx,\n actions,\n actionsSx,\n disablePadding,\n children,\n sx,\n ...other\n },\n ref\n) {\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 variant=\"subtitle1\" fontWeight={600} sx={{ mb: 1 }}>\n {title}\n </Typography>\n )}\n {description && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\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 fontWeight={600}\n color=\"text.secondary\"\n textTransform=\"uppercase\"\n letterSpacing={0.5}\n >\n {label}\n </Typography>\n <Typography variant=\"h4\" fontWeight={700} sx={{ color: `${color}.main`, mt: 0.5 }}>\n {value}\n </Typography>\n {change !== undefined && (\n <Typography\n variant=\"caption\"\n fontWeight={500}\n color={isPositive ? 'success.main' : isNegative ? 'error.main' : 'text.secondary'}\n sx={{ mt: 0.5, display: 'block' }}\n >\n {isPositive ? '+' : ''}\n {change}%\n </Typography>\n )}\n {subtitle && (\n <Typography variant=\"caption\" color=\"text.secondary\">\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 @omnitron-dev/prism/components/confirm-dialog\n */\n\nimport { useId, 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 const handleConfirm = () => {\n const result = onConfirm();\n if (result instanceof Promise) {\n result.catch(() => {\n // Error handling should be done in the parent component\n });\n }\n };\n\n return (\n <Dialog\n open={open}\n onClose={loading ? 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={loading} variant=\"outlined\">\n {cancelLabel}\n </Button>\n\n <Button onClick={handleConfirm} color={confirmColor} variant=\"contained\" loading={loading} 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","'use client';\n\n/**\n * Empty Content Component\n *\n * Universal placeholder for empty states across the application.\n * Supports icon-based illustrations, multiple action buttons,\n * filled backgrounds, and compact mode.\n *\n * @module @omnitron-dev/prism/components/empty-content\n */\n\nimport type { ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { alpha } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface EmptyContentProps {\n /** Custom illustration (SVG, image, or any ReactNode) */\n illustration?: ReactNode;\n /** Icon element — rendered inside a circular colored wrapper */\n icon?: ReactNode;\n /** Color for the icon wrapper background (palette path like 'primary.main') */\n iconColor?: string;\n /** Size of the icon wrapper (default 64) */\n iconSize?: number;\n /** Main title text */\n title?: string;\n /** Description text or ReactNode */\n description?: ReactNode;\n /** Single action button (backward compatible) */\n action?: ReactNode;\n /** Multiple action buttons rendered in a row */\n actions?: ReactNode[];\n /** Max width of the container */\n maxWidth?: number | string;\n /** Fill the entire available space (height: 100%) */\n filled?: boolean;\n /** Additional styles for root container */\n sx?: SxProps<Theme>;\n /** Illustration wrapper styles */\n illustrationSx?: SxProps<Theme>;\n /** Slot overrides */\n slotProps?: {\n title?: SxProps<Theme>;\n description?: SxProps<Theme>;\n actions?: SxProps<Theme>;\n };\n /** Compact mode — reduces spacing and font sizes */\n compact?: boolean;\n}\n\n// =============================================================================\n// DEFAULT ILLUSTRATION\n// =============================================================================\n\nfunction DefaultIllustration({ sx }: { sx?: SxProps<Theme> }) {\n return (\n <Box\n component=\"svg\"\n viewBox=\"0 0 480 360\"\n sx={{\n width: 240,\n height: 'auto',\n color: 'text.disabled',\n ...sx,\n }}\n >\n <defs>\n <linearGradient id=\"emptyGradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" style={{ stopColor: 'currentColor', stopOpacity: 0.2 }} />\n <stop offset=\"100%\" style={{ stopColor: 'currentColor', stopOpacity: 0.05 }} />\n </linearGradient>\n </defs>\n <ellipse cx=\"240\" cy=\"300\" rx=\"160\" ry=\"30\" fill=\"url(#emptyGradient)\" />\n <rect x=\"140\" y=\"120\" width=\"200\" height=\"140\" rx=\"8\" fill=\"currentColor\" opacity=\"0.08\" />\n <rect x=\"160\" y=\"140\" width=\"160\" height=\"8\" rx=\"4\" fill=\"currentColor\" opacity=\"0.12\" />\n <rect x=\"160\" y=\"160\" width=\"120\" height=\"8\" rx=\"4\" fill=\"currentColor\" opacity=\"0.12\" />\n <rect x=\"160\" y=\"180\" width=\"140\" height=\"8\" rx=\"4\" fill=\"currentColor\" opacity=\"0.12\" />\n <circle cx=\"240\" cy=\"80\" r=\"40\" fill=\"currentColor\" opacity=\"0.1\" />\n <path\n d=\"M225 75 L230 80 L255 55\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n opacity=\"0.2\"\n />\n </Box>\n );\n}\n\n// =============================================================================\n// ICON WRAPPER\n// =============================================================================\n\nfunction IconWrapper({ icon, color = 'primary.main', size = 64 }: { icon: ReactNode; color?: string; size?: number }) {\n return (\n <Box\n sx={{\n width: size,\n height: size,\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: (theme) => {\n // Resolve palette path (e.g. 'primary.main' → theme.palette.primary.main)\n const parts = color.split('.');\n let resolved: any = theme.palette;\n for (const part of parts) {\n resolved = resolved?.[part];\n }\n return typeof resolved === 'string' ? alpha(resolved, 0.08) : alpha(theme.palette.primary.main, 0.08);\n },\n }}\n >\n {icon}\n </Box>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * EmptyContent - Universal empty state placeholder.\n *\n * @example Basic\n * ```tsx\n * <EmptyContent title=\"No data found\" description=\"Try adjusting your filters\" />\n * ```\n *\n * @example With icon\n * ```tsx\n * <EmptyContent\n * icon={<ChatIcon sx={{ width: 28, height: 28, color: 'primary.main', opacity: 0.6 }} />}\n * title=\"Select a conversation\"\n * description=\"Choose a room from the sidebar\"\n * />\n * ```\n *\n * @example With multiple actions\n * ```tsx\n * <EmptyContent\n * icon={<FolderIcon sx={{ fontSize: 28, color: 'text.disabled' }} />}\n * title=\"No files yet\"\n * description=\"Upload files or create a folder to get started\"\n * actions={[\n * <Button variant=\"contained\" startIcon={<UploadIcon />}>Upload</Button>,\n * <Button variant=\"outlined\" startIcon={<FolderIcon />}>New folder</Button>,\n * ]}\n * />\n * ```\n *\n * @example Filled (full height)\n * ```tsx\n * <EmptyContent filled title=\"No messages\" compact />\n * ```\n */\nexport function EmptyContent({\n illustration,\n icon,\n iconColor = 'primary.main',\n iconSize = 64,\n title = 'No data',\n description,\n action,\n actions,\n maxWidth = 400,\n filled = false,\n sx,\n illustrationSx,\n slotProps,\n compact = false,\n}: EmptyContentProps): ReactNode {\n // Determine visual: icon > illustration > nothing (no default for clean minimal states)\n const visual = icon ? (\n <IconWrapper icon={icon} color={iconColor} size={iconSize} />\n ) : illustration ? (\n <Box sx={illustrationSx}>{illustration}</Box>\n ) : null;\n\n // Merge actions: single action + array\n const allActions = [...(actions ?? []), ...(action ? [action] : [])];\n\n return (\n <Stack\n alignItems=\"center\"\n justifyContent=\"center\"\n sx={{\n textAlign: 'center',\n py: compact ? 4 : 8,\n px: 2,\n ...(filled && { height: '100%', minHeight: 200 }),\n ...sx,\n }}\n >\n <Box\n sx={{\n maxWidth,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: compact ? 1.5 : 2.5,\n }}\n >\n {/* Visual (icon or illustration) */}\n {visual}\n\n {/* Text */}\n <Stack alignItems=\"center\" spacing={0.5}>\n {title && (\n <Typography\n variant={compact ? 'subtitle1' : 'h6'}\n color=\"text.secondary\"\n sx={{ fontWeight: 600, ...slotProps?.title }}\n >\n {title}\n </Typography>\n )}\n\n {description && (\n <Typography variant=\"body2\" color=\"text.disabled\" sx={{ lineHeight: 1.6, ...slotProps?.description }}>\n {description}\n </Typography>\n )}\n </Stack>\n\n {/* Actions */}\n {allActions.length > 0 && (\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ mt: compact ? 0.5 : 1, flexWrap: 'wrap', justifyContent: 'center', ...slotProps?.actions }}\n >\n {allActions.map((a, i) => (\n <Box key={i}>{a}</Box>\n ))}\n </Stack>\n )}\n </Box>\n </Stack>\n );\n}\n\n/**\n * Search Empty Content - Specialized empty state for search results.\n */\nexport function SearchEmptyContent({\n query,\n ...props\n}: Omit<EmptyContentProps, 'title' | 'description'> & { query?: string }): ReactNode {\n return (\n <EmptyContent\n title=\"No results found\"\n description={\n query ? `Your search for \"${query}\" did not match any results.` : 'Try adjusting your search criteria.'\n }\n {...props}\n />\n );\n}\n\n/**\n * Loading Empty Content - Placeholder while loading.\n */\nexport function LoadingEmptyContent({ ...props }: Omit<EmptyContentProps, 'title'>): ReactNode {\n return (\n <EmptyContent\n title=\"Loading...\"\n illustration={\n <Box\n sx={{\n width: 64,\n height: 64,\n borderRadius: '50%',\n border: '3px solid',\n borderColor: 'divider',\n borderTopColor: 'primary.main',\n animation: 'spin 1s linear infinite',\n '@keyframes spin': {\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n },\n }}\n />\n }\n compact\n {...props}\n />\n );\n}\n","'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 @omnitron-dev/prism/components/page-content\n */\n\nimport type { ReactNode } from 'react';\nimport { forwardRef, 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 const PageContent = forwardRef<HTMLDivElement, PageContentProps>(\n ({ children, gap = PAGE_GAP, fill, sx, ...rest }, ref) => (\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\nPageContent.displayName = 'PageContent';\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 item sized by `columns`.\n * Cards should use `height: '100%'` or be wrapped in a full-height container.\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 @omnitron-dev/prism/components/image\n */\n\nimport type { ReactNode, ImgHTMLAttributes } from 'react';\nimport { useState, useCallback, forwardRef } 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});\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 const Image = forwardRef<HTMLDivElement, ImageProps>(function Image(\n {\n 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 ...imgProps\n },\n ref\n) {\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 @omnitron-dev/prism/components/label\n */\n\nimport type { ReactNode } from 'react';\nimport { forwardRef } 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\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 const Label = forwardRef<HTMLSpanElement, LabelProps>(function Label(\n { children, color = 'default', variant = 'soft', startIcon, endIcon, sx, disabled, ...other },\n ref\n) {\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","'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 @omnitron-dev/prism/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 @omnitron-dev/prism/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 variant=\"body2\" color=\"text.secondary\" sx={{ mt: 1, textAlign: 'center' }}>\n {message}\n </Typography>\n )}\n\n {isDeterminate && (\n <Typography variant=\"caption\" color=\"text.disabled\">\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 * Scrollbar Component\n *\n * Custom scrollbar wrapper with themed styling.\n *\n * @module @omnitron-dev/prism/components/scrollbar\n */\n\nimport type { ReactNode } from 'react';\nimport { forwardRef } 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// =============================================================================\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 const Scrollbar = forwardRef<HTMLDivElement, ScrollbarProps>(function Scrollbar(\n { children, sx, fillContent = false, hideScrollbar = false, axis = 'y', maxHeight, minHeight, className, ...other },\n ref\n) {\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 @omnitron-dev/prism/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 @omnitron-dev/prism/components/svg-color\n */\n\nimport type { ReactNode } from 'react';\nimport { forwardRef } 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 const SvgColor = forwardRef<HTMLSpanElement, SvgColorProps>(function SvgColor(\n { src, color, size = 24, width, height, className, sx },\n ref\n) {\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 @omnitron-dev/prism/components/table\n */\n\nimport type { ReactNode, ChangeEvent } from 'react';\nimport { forwardRef, 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 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 /** Loading state */\n loading?: boolean;\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 */\nfunction TableInner<T>(\n {\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 dense = false,\n stickyHeader = false,\n maxHeight,\n onRowClick,\n containerSx,\n sx,\n ...other\n }: TableProps<T>,\n ref: React.Ref<HTMLTableElement>\n): 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 color=\"text.secondary\">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 {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// Type assertion to preserve generics with forwardRef\nexport const Table = forwardRef(TableInner) as <T>(\n props: TableProps<T> & { ref?: React.Ref<HTMLTableElement> }\n) => ReactNode;\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 @omnitron-dev/prism/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 @omnitron-dev/prism/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 variant=\"caption\" color=\"text.secondary\" sx={{ mt: 0.5, display: 'block', textAlign: 'center' }}>\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 variant=\"body2\" color=\"text.secondary\" sx={{ minWidth: 40 }}>\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 color=\"text.secondary\"\n sx={{ 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\" color=\"text.secondary\">\n {segment.label ?? `${segment.value}%`}\n </Typography>\n </Box>\n ))}\n </Box>\n )}\n </Box>\n );\n}\n","'use client';\n\n/**\n * Tabs Component\n *\n * Tabbed interface with panel support.\n *\n * @module @omnitron-dev/prism/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 */\nexport interface TabsProps extends Omit<ComponentProps<typeof MuiTabs>, 'onChange' | 'value'> {\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\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 ...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 return (\n <Box sx={{ width: '100%' }}>\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 {tabItems.map((tab) => {\n const isActive = tab.value === value;\n if (!isActive && !keepMounted) 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 @omnitron-dev/prism/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 component=\"span\" color=\"text.secondary\" sx={{ ml: 1 }}>\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 component=\"span\" color=\"text.secondary\" sx={{ ml: 1 }}>\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 @omnitron-dev/prism/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 variant=\"caption\" color=\"text.secondary\" sx={{ ml: 2 }}>\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 @omnitron-dev/prism/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. Triggers NProgress.done() on change. */\n pathname: 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, 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 pathname change\n useEffect(() => {\n const timeout = setTimeout(() => NProgress.done(), delay);\n return () => clearTimeout(timeout);\n }, [pathname, 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, delay = 100 }: NavigationProgressProps) {\n useEffect(() => {\n NProgress.configure({ showSpinner: false });\n return () => {\n NProgress.done();\n };\n }, []);\n\n useProgressBar(pathname, 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 @omnitron-dev/prism/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 * Error Boundary Component\n *\n * React error boundary for graceful error handling.\n * Includes stack trace parsing for improved debugging.\n *\n * @module @omnitron-dev/prism/components/error-boundary\n */\n\nimport { Component, useState, type ReactNode, type ErrorInfo } from 'react';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\nimport Collapse from '@mui/material/Collapse';\nimport IconButton from '@mui/material/IconButton';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// STACK TRACE PARSING\n// =============================================================================\n\n/**\n * Parsed stack frame information.\n */\nexport interface StackFrame {\n /** Function or method name */\n functionName: string | null;\n /** Source file path */\n filePath: string | null;\n /** Line number in the file */\n lineNumber: number | null;\n /** Column number in the file */\n columnNumber: number | null;\n /** Whether this frame is from app code (src/) vs node_modules */\n isAppCode: boolean;\n}\n\n/**\n * Parsed stack trace result.\n */\nexport interface ParsedStackTrace {\n /** Primary error location (first app code frame) */\n primary: StackFrame | null;\n /** All parsed frames */\n frames: StackFrame[];\n /** Original stack trace string */\n raw: string;\n}\n\n/**\n * Parse a single stack frame line.\n *\n * @param line - Stack trace line\n * @returns Parsed stack frame or null if couldn't parse\n */\nfunction parseStackFrame(line: string): StackFrame | null {\n // Match patterns like:\n // \"at functionName (file.tsx:123:45)\"\n // \"at Object.functionName (file.tsx:123:45)\"\n // \"at file.tsx:123:45\"\n // \"at async functionName (file.tsx:123:45)\"\n const patterns = [\n // Named function with file: at functionName (file:line:col)\n /at\\s+(?:async\\s+)?([^\\s(]+)\\s+\\((.+?):(\\d+):(\\d+)\\)/,\n // Anonymous at file: at file:line:col\n /at\\s+(.+?):(\\d+):(\\d+)/,\n // Webpack/Vite transformed: at Module.functionName (file?xxx:line:col)\n /at\\s+(?:async\\s+)?(?:Module\\.)?([^\\s(]+)\\s+\\((.+?)\\?[^:]*:(\\d+):(\\d+)\\)/,\n ];\n\n for (const pattern of patterns) {\n const match = line.match(pattern);\n if (match) {\n const [, funcOrFile, file, lineStr, colStr] = match;\n\n // Check if first capture is actually a function name or file path\n const hasFile = file !== undefined;\n const functionName = hasFile ? funcOrFile : null;\n const filePath = hasFile ? file : funcOrFile;\n const lineNumber = parseInt(hasFile ? lineStr : (file as string), 10);\n const columnNumber = parseInt(hasFile ? colStr : lineStr, 10);\n\n // Determine if this is app code vs library code\n const isAppCode = filePath.includes('/src/') || (filePath.includes('src/') && !filePath.includes('node_modules'));\n\n return {\n functionName: functionName || null,\n filePath: cleanFilePath(filePath),\n lineNumber: isNaN(lineNumber) ? null : lineNumber,\n columnNumber: isNaN(columnNumber) ? null : columnNumber,\n isAppCode,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Clean file path for display.\n */\nfunction cleanFilePath(path: string): string {\n // Remove webpack/vite query strings\n const cleaned = path.replace(/\\?.*$/, '');\n\n // Try to extract relative path from src/\n const srcIndex = cleaned.indexOf('/src/');\n if (srcIndex !== -1) {\n return cleaned.slice(srcIndex + 1);\n }\n\n // Try to get a reasonable path from the end\n const parts = cleaned.split('/');\n if (parts.length > 3) {\n return parts.slice(-3).join('/');\n }\n\n return cleaned;\n}\n\n/**\n * Parse an error stack trace into structured data.\n *\n * Extracts function names, file paths, and line numbers from stack traces.\n * Identifies app code vs library code for better debugging.\n *\n * @param stack - Error stack trace string\n * @returns Parsed stack trace with frames\n *\n * @example\n * ```tsx\n * try {\n * throw new Error('Something went wrong');\n * } catch (error) {\n * const parsed = parseStackTrace(error.stack);\n * console.log('Error in:', parsed.primary?.filePath);\n * console.log('Function:', parsed.primary?.functionName);\n * console.log('Line:', parsed.primary?.lineNumber);\n * }\n * ```\n */\nexport function parseStackTrace(stack?: string): ParsedStackTrace {\n if (!stack) {\n return { primary: null, frames: [], raw: '' };\n }\n\n const lines = stack.split('\\n');\n const frames: StackFrame[] = [];\n\n for (const line of lines) {\n const frame = parseStackFrame(line.trim());\n if (frame) {\n frames.push(frame);\n }\n }\n\n // Find the first app code frame as the primary location\n const primary = frames.find((f) => f.isAppCode) ?? frames[0] ?? null;\n\n return { primary, frames, raw: stack };\n}\n\n/**\n * Get a summary of the error location.\n *\n * @param error - Error object\n * @returns Human-readable error location\n */\nexport function getErrorLocation(error: Error): string {\n const parsed = parseStackTrace(error.stack);\n const { primary } = parsed;\n\n if (!primary) {\n return 'Unknown location';\n }\n\n const parts: string[] = [];\n\n if (primary.functionName) {\n parts.push(`in ${primary.functionName}`);\n }\n\n if (primary.filePath) {\n const location = primary.lineNumber ? `${primary.filePath}:${primary.lineNumber}` : primary.filePath;\n parts.push(`(${location})`);\n }\n\n return parts.join(' ') || 'Unknown location';\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Error fallback component props.\n */\nexport interface FallbackProps {\n /** The error that was caught */\n error: Error;\n /** Error info from React */\n errorInfo: ErrorInfo | null;\n /** Parsed stack trace for debugging */\n parsedStack: ParsedStackTrace;\n /** Reset error boundary state */\n resetErrorBoundary: () => void;\n}\n\n/**\n * Error boundary props.\n */\nexport interface ErrorBoundaryProps {\n /** Child components to render */\n children: ReactNode;\n /** Custom fallback component */\n fallback?: ReactNode | ((props: FallbackProps) => ReactNode);\n /** Callback when error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo, parsedStack: ParsedStackTrace) => void;\n /** Callback when error is reset */\n onReset?: () => void;\n /** Reset keys - boundary resets when these change */\n resetKeys?: unknown[];\n /** Custom sx props for default fallback */\n sx?: SxProps<Theme>;\n /** Show detailed stack info in default fallback (auto-detects dev mode if not set) */\n showDetails?: boolean;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\n// =============================================================================\n// DEFAULT FALLBACK\n// =============================================================================\n\ninterface DefaultFallbackProps extends FallbackProps {\n sx?: SxProps<Theme>;\n /** Show detailed stack info (auto-detected in dev) */\n showDetails?: boolean;\n}\n\nfunction DefaultErrorFallback({\n error,\n parsedStack,\n resetErrorBoundary,\n sx,\n showDetails,\n}: DefaultFallbackProps): ReactNode {\n const [expanded, setExpanded] = useState(false);\n const [copied, setCopied] = useState(false);\n\n // Auto-detect dev mode if not specified\n const shouldShowDetails = showDetails ?? (typeof process !== 'undefined' && process.env.NODE_ENV === 'development');\n\n const handleCopyStack = async () => {\n try {\n const text = [\n `Error: ${error.message}`,\n `Location: ${getErrorLocation(error)}`,\n '',\n 'Stack Trace:',\n parsedStack.raw,\n ].join('\\n');\n\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard API not available\n }\n };\n\n return (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n p: 3,\n textAlign: 'center',\n ...sx,\n }}\n >\n <Typography variant=\"h6\" color=\"error\" gutterBottom>\n Something went wrong\n </Typography>\n\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1, maxWidth: 400 }}>\n {error.message || 'An unexpected error occurred'}\n </Typography>\n\n {shouldShowDetails && parsedStack.primary && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mb: 2, fontFamily: 'monospace' }}>\n {parsedStack.primary.filePath}\n {parsedStack.primary.lineNumber && `:${parsedStack.primary.lineNumber}`}\n {parsedStack.primary.functionName && ` (${parsedStack.primary.functionName})`}\n </Typography>\n )}\n\n <Box sx={{ display: 'flex', gap: 1, mb: 2 }}>\n <Button variant=\"outlined\" onClick={resetErrorBoundary}>\n Try Again\n </Button>\n\n {shouldShowDetails && (\n <>\n <IconButton\n size=\"small\"\n onClick={() => setExpanded(!expanded)}\n sx={{\n transform: expanded ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s',\n }}\n >\n <ExpandMoreIcon />\n </IconButton>\n\n <IconButton size=\"small\" onClick={handleCopyStack} title=\"Copy error details\">\n <ContentCopyIcon fontSize=\"small\" />\n </IconButton>\n {copied && (\n <Typography variant=\"caption\" color=\"success.main\" sx={{ alignSelf: 'center' }}>\n Copied!\n </Typography>\n )}\n </>\n )}\n </Box>\n\n {shouldShowDetails && (\n <Collapse in={expanded}>\n <Box\n sx={{\n mt: 1,\n p: 2,\n bgcolor: 'grey.100',\n borderRadius: 1,\n maxWidth: 600,\n maxHeight: 300,\n overflow: 'auto',\n textAlign: 'left',\n }}\n >\n <Typography variant=\"caption\" component=\"pre\" sx={{ fontFamily: 'monospace', m: 0 }}>\n {parsedStack.frames.map((frame, i) => (\n <Box\n key={i}\n component=\"span\"\n sx={{\n display: 'block',\n color: frame.isAppCode ? 'error.main' : 'text.secondary',\n fontWeight: frame.isAppCode ? 600 : 400,\n }}\n >\n {frame.functionName || '(anonymous)'} at {frame.filePath || 'unknown'}\n {frame.lineNumber && `:${frame.lineNumber}`}\n </Box>\n ))}\n </Typography>\n </Box>\n </Collapse>\n )}\n </Box>\n );\n}\n\n// =============================================================================\n// ERROR BOUNDARY\n// =============================================================================\n\n/**\n * Error Boundary - Catches JavaScript errors in child components.\n *\n * @example\n * ```tsx\n * <ErrorBoundary\n * fallback={({ error, resetErrorBoundary }) => (\n * <div>\n * <p>Error: {error.message}</p>\n * <button onClick={resetErrorBoundary}>Retry</button>\n * </div>\n * )}\n * onError={(error, info) => logErrorToService(error, info)}\n * >\n * <MyComponent />\n * </ErrorBoundary>\n * ```\n *\n * @example\n * ```tsx\n * // With reset keys\n * <ErrorBoundary resetKeys={[userId, postId]}>\n * <UserPost userId={userId} postId={postId} />\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return {\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n const parsedStack = parseStackTrace(error.stack);\n this.setState({ errorInfo });\n this.props.onError?.(error, errorInfo, parsedStack);\n }\n\n componentDidUpdate(prevProps: ErrorBoundaryProps): void {\n const { resetKeys } = this.props;\n const { hasError } = this.state;\n\n if (hasError && resetKeys && prevProps.resetKeys) {\n // Check if any reset key has changed\n const hasKeyChanged = resetKeys.some((key, index) => key !== prevProps.resetKeys?.[index]);\n\n if (hasKeyChanged) {\n this.resetErrorBoundary();\n }\n }\n }\n\n resetErrorBoundary = (): void => {\n this.props.onReset?.();\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n });\n };\n\n render(): ReactNode {\n const { hasError, error, errorInfo } = this.state;\n const { children, fallback, sx, showDetails } = this.props;\n\n if (hasError && error) {\n const parsedStack = parseStackTrace(error.stack);\n\n const fallbackProps: FallbackProps = {\n error,\n errorInfo,\n parsedStack,\n resetErrorBoundary: this.resetErrorBoundary,\n };\n\n if (typeof fallback === 'function') {\n return fallback(fallbackProps);\n }\n\n if (fallback) {\n return fallback;\n }\n\n return <DefaultErrorFallback {...fallbackProps} sx={sx} showDetails={showDetails} />;\n }\n\n return children;\n }\n}\n\n// =============================================================================\n// HOOK FOR THROWING ERRORS\n// =============================================================================\n\n/**\n * Hook to throw errors from event handlers.\n * Useful for triggering error boundary from async code.\n *\n * @returns Function to throw an error\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const throwError = useErrorBoundary();\n *\n * const handleClick = async () => {\n * try {\n * await fetchData();\n * } catch (error) {\n * throwError(error as Error);\n * }\n * };\n *\n * return <button onClick={handleClick}>Fetch</button>;\n * }\n * ```\n */\nexport function useErrorBoundary(): (error: Error) => void {\n const [, setError] = useState<Error | null>(null);\n\n return (error: Error) => {\n setError(() => {\n throw error;\n });\n };\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 @omnitron-dev/prism/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 @omnitron-dev/prism/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\" alignItems=\"center\" spacing={2}>\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 PaperProps={{\n sx: {\n width,\n backgroundImage: 'none',\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\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\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 @omnitron-dev/prism/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 @omnitron-dev/prism/components/alert\n */\n\nimport type { ReactNode } from 'react';\nimport MuiAlert from '@mui/material/Alert';\nimport AlertTitle from '@mui/material/AlertTitle';\nimport { alpha } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\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 */\nexport interface AlertProps {\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\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}: AlertProps): ReactNode {\n // Map 'soft' variant to 'standard' with custom styling\n const muiVariant = variant === 'soft' ? 'standard' : variant;\n\n return (\n <MuiAlert\n severity={severity}\n variant={muiVariant}\n onClose={closable ? onClose : undefined}\n icon={icon}\n action={action}\n sx={{\n ...(variant === 'soft' && {\n backgroundColor: (theme) => 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 ...sx,\n }}\n >\n {title && <AlertTitle>{title}</AlertTitle>}\n {children}\n </MuiAlert>\n );\n}\n\n/**\n * Props for InlineAlert component.\n */\nexport interface InlineAlertProps {\n /** Alert severity */\n severity?: AlertSeverity;\n /** Alert message */\n message: ReactNode;\n /** Icon to display */\n icon?: ReactNode;\n}\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 }: InlineAlertProps): ReactNode {\n return (\n <MuiAlert\n severity={severity}\n icon={icon}\n sx={{\n py: 0,\n px: 1,\n '& .MuiAlert-message': {\n py: 0.5,\n },\n }}\n >\n {message}\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 @omnitron-dev/prism/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\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.primary,\n ...(disabled && {\n cursor: 'default',\n pointerEvents: 'none',\n color: theme.palette.text.disabled,\n }),\n}));\n\nconst ItemIcon = styled('span')({\n display: 'inherit',\n '& > :first-of-type:not(style):not(:first-of-type ~ *)': {\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/** List of external reference links. */\nfunction MoreLinks({ links, sx, ...other }: MoreLinksProps) {\n return (\n <MoreLinksRoot sx={sx} {...other}>\n {links?.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 * Drawer Component\n *\n * Enhanced drawer/side panel with custom styling.\n *\n * @module @omnitron-dev/prism/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 PaperProps={{\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\n {/* Content */}\n <Box\n sx={{\n flex: 1,\n overflow: 'auto',\n p: 2,\n }}\n >\n {children}\n </Box>\n\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 @omnitron-dev/prism/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 @omnitron-dev/prism/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 @omnitron-dev/prism/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 @omnitron-dev/prism/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 @omnitron-dev/prism/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 @omnitron-dev/prism/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 @omnitron-dev/prism/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 CSS Classes\n *\n * @module @omnitron-dev/prism/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 @omnitron-dev/prism/components/lightbox\n */\n\nimport type { LightboxProps, LightboxSlide } 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 sx,\n slotProps,\n className,\n ...dialogProps\n}: LightboxProps) {\n const theme = useTheme();\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 setZoomLevel((prevZoom) => {\n const newZoom = Math.max(prevZoom - ZOOM_STEP, MIN_ZOOM);\n if (newZoom === MIN_ZOOM) {\n setPosition({ x: 0, y: 0 });\n }\n return newZoom;\n });\n }, []);\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=\"Zoom out\"\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=\"Zoom in\"\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=\"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=\"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=\"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=\"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=\"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=\"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, navigation, and zoom state.\n *\n * @module @omnitron-dev/prism/components/lightbox\n */\n\n'use client';\n\nimport { useState, useCallback } from 'react';\n\nimport type { UseLightboxReturn } from './types.js';\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst MIN_ZOOM = 1;\nconst MAX_ZOOM = 4;\nconst ZOOM_STEP = 0.5;\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 const [zoomLevel, setZoomLevel] = useState(MIN_ZOOM);\n\n // Navigation\n const goTo = useCallback(\n (newIndex: number) => {\n if (totalSlides === 0) {\n setIndex(newIndex);\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 // Reset zoom when changing slides\n setZoomLevel(MIN_ZOOM);\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 setZoomLevel(MIN_ZOOM);\n setOpen(true);\n }, []);\n\n const onClose = useCallback(() => {\n setOpen(false);\n setZoomLevel(MIN_ZOOM);\n }, []);\n\n // Zoom\n const zoomIn = useCallback(() => {\n setZoomLevel((prevZoom) => Math.min(prevZoom + ZOOM_STEP, MAX_ZOOM));\n }, []);\n\n const zoomOut = useCallback(() => {\n setZoomLevel((prevZoom) => Math.max(prevZoom - ZOOM_STEP, MIN_ZOOM));\n }, []);\n\n const zoomReset = useCallback(() => {\n setZoomLevel(MIN_ZOOM);\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 zoomLevel,\n zoomIn,\n zoomOut,\n zoomReset,\n getLightboxProps,\n };\n}\n","/**\n * Carousel CSS Classes\n *\n * @module @omnitron-dev/prism/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 @omnitron-dev/prism/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 * State management hook for the Carousel component.\n * Handles navigation, autoplay, and responsive behavior.\n *\n * @module @omnitron-dev/prism/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 * @example\n * ```tsx\n * const carousel = useCarousel({\n * totalSlides: items.length,\n * slidesToShow: 3,\n * autoplay: true,\n * });\n *\n * return (\n * <Carousel ref={carousel.carouselRef}>\n * {items.map((item, i) => (\n * <CarouselSlide key={i}>{item}</CarouselSlide>\n * ))}\n * </Carousel>\n * );\n * ```\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 // 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 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(currentIndex + 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, currentIndex, 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 @omnitron-dev/prism/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\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': '8px 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 @omnitron-dev/prism/components/nav-section\n */\n\nimport { forwardRef } 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 const Nav = forwardRef<HTMLElement, NavProps>(function Nav({ className, sx, ...other }, ref) {\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 const NavUl = forwardRef<HTMLUListElement, NavUlProps>(function NavUl({ className, sx, ...other }, ref) {\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 const NavLi = forwardRef<HTMLLIElement, NavLiProps>(function NavLi({ className, ...other }, ref) {\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 const NavSubheader = forwardRef<HTMLButtonElement, NavSubheaderProps>(function NavSubheader(\n { className, open, onClick, children, ...other },\n ref\n) {\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 const NavItemBase = forwardRef<HTMLButtonElement, NavItemBaseProps>(function NavItemBase(\n { className, active, disabled, open, depth, hasChild, ...other },\n ref\n) {\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/**\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});\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});\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/**\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 @omnitron-dev/prism/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 @omnitron-dev/prism/components/nav-section\n */\n\nimport { forwardRef, useMemo } 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 const NavItem = forwardRef<HTMLButtonElement, NavItemProps>(function NavItem(props, ref) {\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// =============================================================================\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 @omnitron-dev/prism/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 @omnitron-dev/prism/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 @omnitron-dev/prism/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 @omnitron-dev/prism/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 @omnitron-dev/prism/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// Editor CSS class tokens\n// ---------------------------------------------------------------------------\n\nconst cls = (name: string) => `prism-editor-${name}`;\n\nexport const editorClasses = {\n root: cls('root'),\n toolbar: {\n root: cls('toolbar'),\n hr: cls('toolbar-hr'),\n bold: cls('toolbar-bold'),\n italic: cls('toolbar-italic'),\n underline: cls('toolbar-underline'),\n strike: cls('toolbar-strike'),\n code: cls('toolbar-code'),\n codeBlock: cls('toolbar-code-block'),\n link: cls('toolbar-link'),\n unlink: cls('toolbar-unlink'),\n image: cls('toolbar-image'),\n alignLeft: cls('toolbar-align-left'),\n alignCenter: cls('toolbar-align-center'),\n alignRight: cls('toolbar-align-right'),\n alignJustify: cls('toolbar-align-justify'),\n bulletList: cls('toolbar-bullet-list'),\n orderedList: cls('toolbar-ordered-list'),\n taskList: cls('toolbar-task-list'),\n blockquote: cls('toolbar-blockquote'),\n hardBreak: cls('toolbar-hard-break'),\n clear: cls('toolbar-clear'),\n undo: cls('toolbar-undo'),\n redo: cls('toolbar-redo'),\n fullscreen: cls('toolbar-fullscreen'),\n },\n content: {\n root: cls('content'),\n hr: cls('content-hr'),\n link: cls('content-link'),\n image: cls('content-image'),\n heading: cls('content-heading'),\n codeInline: cls('content-code-inline'),\n codeBlock: cls('content-code-block'),\n langSelect: cls('content-lang-select'),\n blockquote: cls('content-blockquote'),\n bulletList: cls('content-bullet-list'),\n orderedList: cls('content-ordered-list'),\n listItem: cls('content-list-item'),\n taskList: cls('content-task-list'),\n taskItem: cls('content-task-item'),\n placeholder: cls('content-placeholder'),\n },\n state: {\n error: cls('state-error'),\n disabled: cls('state-disabled'),\n fullscreen: cls('state-fullscreen'),\n },\n};\n","import { styled, alpha } from '@mui/material/styles';\n\nimport { editorClasses } from './classes.js';\n\nconst MARGIN = '0.75em';\n\nexport const EditorRoot = styled('div')(({ theme }) => ({\n minHeight: 240,\n display: 'flex',\n flexDirection: 'column',\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n border: `solid 1px ${alpha(theme.palette.grey[500], 0.2)}`,\n transition: theme.transitions.create(['border-color', 'box-shadow'], {\n duration: theme.transitions.duration.short,\n }),\n '&:focus-within': {\n borderColor: theme.palette.primary.main,\n boxShadow: `0 0 0 1px ${alpha(theme.palette.primary.main, 0.2)}`,\n },\n\n // ---------------------------------------------------------------------------\n // State: error\n // ---------------------------------------------------------------------------\n [`&.${editorClasses.state.error}`]: {\n borderColor: theme.palette.error.main,\n [`& .${editorClasses.content.root}`]: {\n backgroundColor: alpha(theme.palette.error.main, 0.04),\n },\n },\n\n // ---------------------------------------------------------------------------\n // State: disabled\n // ---------------------------------------------------------------------------\n [`&.${editorClasses.state.disabled}`]: {\n opacity: 0.48,\n pointerEvents: 'none',\n },\n\n // ---------------------------------------------------------------------------\n // State: fullscreen\n // ---------------------------------------------------------------------------\n [`&.${editorClasses.state.fullscreen}`]: {\n top: 16,\n left: 16,\n position: 'fixed',\n maxHeight: 'unset',\n width: 'calc(100% - 32px)',\n height: 'calc(100% - 32px)',\n zIndex: theme.zIndex.modal,\n borderRadius: Number(theme.shape.borderRadius) * 2,\n backgroundColor: theme.palette.background.default,\n boxShadow: theme.shadows[24],\n },\n\n // ---------------------------------------------------------------------------\n // Placeholder\n // ---------------------------------------------------------------------------\n [`& .${editorClasses.content.placeholder}`]: {\n '&:first-of-type::before': {\n ...theme.typography.body2,\n height: 0,\n float: 'left',\n pointerEvents: 'none',\n content: 'attr(data-placeholder)',\n color: theme.palette.text.disabled,\n },\n },\n\n // ---------------------------------------------------------------------------\n // Content area\n // ---------------------------------------------------------------------------\n [`& .${editorClasses.content.root}`]: {\n display: 'flex',\n flex: '1 1 auto',\n overflowY: 'auto',\n flexDirection: 'column',\n borderBottomLeftRadius: 'inherit',\n borderBottomRightRadius: 'inherit',\n backgroundColor: alpha(theme.palette.grey[500], 0.04),\n\n '& .tiptap': {\n '> * + *': { marginTop: 0, marginBottom: MARGIN },\n '&.ProseMirror': {\n flex: '1 1 auto',\n outline: 'none',\n padding: theme.spacing(0, 2),\n },\n\n // Headings\n h1: { ...theme.typography.h1, marginTop: 40, marginBottom: 8 },\n h2: { ...theme.typography.h2, marginTop: 40, marginBottom: 8 },\n h3: { ...theme.typography.h3, marginTop: 24, marginBottom: 8 },\n h4: { ...theme.typography.h4, marginTop: 24, marginBottom: 8 },\n h5: { ...theme.typography.h5, marginTop: 24, marginBottom: 8 },\n h6: { ...theme.typography.h6, marginTop: 24, marginBottom: 8 },\n p: { ...theme.typography.body1, marginBottom: '1.25rem' },\n\n // Link\n [`& .${editorClasses.content.link}`]: {\n color: theme.palette.primary.main,\n textDecoration: 'none',\n '&:hover': { textDecoration: 'underline' },\n },\n\n // Horizontal rule\n [`& .${editorClasses.content.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 // Image\n [`& .${editorClasses.content.image}`]: {\n width: '100%',\n height: 'auto',\n maxWidth: '100%',\n borderRadius: theme.shape.borderRadius,\n margin: 'auto auto 1.25em',\n '&.ProseMirror-selectednode': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n },\n\n // Lists\n [`& .${editorClasses.content.bulletList}`]: {\n paddingLeft: 16,\n listStyleType: 'disc',\n },\n [`& .${editorClasses.content.orderedList}`]: {\n paddingLeft: 16,\n },\n [`& .${editorClasses.content.listItem}`]: {\n lineHeight: 2,\n '& > p': { margin: 0 },\n },\n\n // Task list\n [`& .${editorClasses.content.taskList}`]: {\n listStyle: 'none',\n padding: 0,\n '& li': {\n display: 'flex',\n alignItems: 'flex-start',\n gap: theme.spacing(1),\n '& > label': {\n marginTop: 4,\n flexShrink: 0,\n },\n '& > div': { flex: 1 },\n },\n },\n\n // Blockquote\n [`& .${editorClasses.content.blockquote}`]: {\n lineHeight: 1.5,\n fontSize: '1.5em',\n margin: '24px auto',\n position: 'relative',\n fontFamily: 'Georgia, serif',\n padding: theme.spacing(3, 3, 3, 8),\n color: theme.palette.text.secondary,\n borderLeft: `solid 8px ${alpha(theme.palette.grey[500], 0.08)}`,\n [theme.breakpoints.up('md')]: { width: '100%', maxWidth: 640 },\n '& p': { margin: 0, fontSize: 'inherit', fontFamily: 'inherit' },\n '&::before': {\n left: 16,\n top: -8,\n display: 'block',\n fontSize: '3em',\n content: '\"\\\\201C\"',\n position: 'absolute',\n color: theme.palette.text.disabled,\n },\n },\n\n // Inline code\n [`& .${editorClasses.content.codeInline}`]: {\n padding: theme.spacing(0.25, 0.5),\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.16),\n fontFamily: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n\n // Code block\n [`& .${editorClasses.content.codeBlock}`]: {\n position: 'relative',\n '& pre': {\n overflowX: 'auto',\n color: theme.palette.common.white,\n padding: theme.spacing(5, 3, 3, 3),\n borderRadius: theme.shape.borderRadius,\n backgroundColor: theme.palette.grey[900],\n fontFamily: \"'JetBrains Mono', 'Fira Code', monospace\",\n '& code': { fontSize: theme.typography.body2.fontSize },\n },\n [`& .${editorClasses.content.langSelect}`]: {\n top: 8,\n right: 8,\n zIndex: 1,\n padding: 4,\n outline: 'none',\n borderRadius: 4,\n position: 'absolute',\n color: theme.palette.common.white,\n fontWeight: theme.typography.fontWeightMedium,\n borderColor: alpha(theme.palette.grey[500], 0.08),\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n },\n },\n },\n },\n}));\n","import type { ToolbarItem, ToolbarConfig, ToolbarPreset, ResolvedToolbar } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Preset definitions — which toolbar items each preset includes\n// ---------------------------------------------------------------------------\n\nconst PRESET_ITEMS: Record<ToolbarPreset, ToolbarItem[]> = {\n /**\n * Full — CMS pages, blog articles, documentation.\n * Everything enabled including headings, alignment, code blocks, images.\n */\n full: [\n 'heading',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'code',\n 'bulletList',\n 'orderedList',\n 'taskList',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'alignJustify',\n 'blockquote',\n 'codeBlock',\n 'horizontalRule',\n 'link',\n 'image',\n 'hardBreak',\n 'clearFormat',\n 'undo',\n 'redo',\n 'fullscreen',\n ],\n\n /**\n * Standard — blog posts, forum discussions, product descriptions.\n * Most formatting without advanced alignment and task lists.\n */\n standard: [\n 'heading',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n 'codeBlock',\n 'link',\n 'image',\n 'hardBreak',\n 'clearFormat',\n 'undo',\n 'redo',\n 'fullscreen',\n ],\n\n /**\n * Compact — comments, forum replies.\n * Basic formatting, links, code, no images/headings.\n */\n compact: [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'code',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n 'link',\n 'clearFormat',\n ],\n\n /**\n * Minimal — quick feedback, short messages.\n * Only essential inline formatting.\n */\n minimal: ['bold', 'italic', 'code', 'link'],\n\n /**\n * Chat — messaging system.\n * Lightweight formatting, optimized for speed.\n */\n chat: ['bold', 'italic', 'strike', 'code', 'link', 'bulletList', 'orderedList', 'codeBlock'],\n\n /**\n * Inline — single-line fields (titles, captions).\n * No toolbar, no block-level elements.\n */\n inline: [],\n};\n\n/**\n * Whether each preset shows a bubble menu by default.\n */\nconst PRESET_BUBBLE_MENU: Record<ToolbarPreset, boolean> = {\n full: true,\n standard: true,\n compact: true,\n minimal: false,\n chat: false,\n inline: false,\n};\n\n// ---------------------------------------------------------------------------\n// Resolver\n// ---------------------------------------------------------------------------\n\nexport function resolveToolbar(config: ToolbarConfig | undefined): ResolvedToolbar {\n if (!config) {\n return resolveToolbar('standard');\n }\n\n if (typeof config === 'string') {\n return {\n items: new Set(PRESET_ITEMS[config]),\n bubbleMenu: PRESET_BUBBLE_MENU[config],\n };\n }\n\n return {\n items: new Set(config.items),\n bubbleMenu: config.bubbleMenu ?? false,\n };\n}\n","import type { EditorToolbarItemProps } from '../types.js';\n\nimport SvgIcon from '@mui/material/SvgIcon';\nimport Tooltip from '@mui/material/Tooltip';\nimport { styled } from '@mui/material/styles';\nimport ButtonBase from '@mui/material/ButtonBase';\n\nexport function ToolbarItem({ sx, icon, label, active, disabled, ...other }: EditorToolbarItemProps) {\n const ariaLabel = other['aria-label'];\n\n const renderItem = () => (\n <ItemRoot disableRipple disableTouchRipple disabled={disabled} active={active} sx={sx} {...other}>\n {icon && <SvgIcon sx={{ fontSize: 18 }}>{icon}</SvgIcon>}\n {label && label}\n </ItemRoot>\n );\n\n if (ariaLabel) {\n return <Tooltip title={ariaLabel}>{renderItem()}</Tooltip>;\n }\n\n return renderItem();\n}\n\nconst ItemRoot = styled(ButtonBase, {\n shouldForwardProp: (prop: string) => !['active', 'disabled', 'sx'].includes(prop),\n})<Pick<EditorToolbarItemProps, 'active'>>(({ theme }) => ({\n ...theme.typography.body2,\n width: 28,\n height: 28,\n padding: theme.spacing(0, 0.75),\n borderRadius: Number(theme.shape.borderRadius) * 0.75,\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n variants: [\n {\n props: (props) => !!props.active,\n style: {\n backgroundColor: theme.palette.action.selected,\n border: `solid 1px ${theme.palette.action.hover}`,\n },\n },\n {\n props: (props) => !!props.disabled,\n style: {\n opacity: 0.48,\n cursor: 'default',\n pointerEvents: 'none',\n },\n },\n ],\n}));\n","/**\n * Editor toolbar icons — HugeIcons Duotone Rounded style.\n * Source: experiments/portal-old/src/components/editor/toolbar/icons\n *\n * All icons use stroke-based SVG with `currentColor` for theme integration.\n */\n\nimport SvgIcon from '@mui/material/SvgIcon';\nimport type { SvgIconProps } from '@mui/material/SvgIcon';\n\n// ---------------------------------------------------------------------------\n// Helper\n// ---------------------------------------------------------------------------\n\ntype IconComponent = (props?: SvgIconProps) => React.JSX.Element;\n\n// ---------------------------------------------------------------------------\n// Text Formatting\n// ---------------------------------------------------------------------------\n\nexport const BoldIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5 6C5 4.58579 5 3.87868 5.43934 3.43934C5.87868 3 6.58579 3 8 3H12.5789C15.0206 3 17 5.01472 17 7.5C17 9.98528 15.0206 12 12.5789 12H5V6Z\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12.4286 12H13.6667C16.0599 12 18 14.0147 18 16.5C18 18.9853 16.0599 21 13.6667 21H8C6.58579 21 5.87868 21 5.43934 20.5607C5 20.1213 5 19.4142 5 18V12\"\n />\n </SvgIcon>\n);\n\nexport const ItalicIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M12 4H19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M8 20L16 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M5 20H12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </SvgIcon>\n);\n\nexport const UnderlineIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5.5 3V11.5C5.5 15.0899 8.41015 18 12 18C15.5899 18 18.5 15.0899 18.5 11.5V3\"\n />\n <path d=\"M3 21H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </SvgIcon>\n);\n\nexport const StrikeIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M4 12H20\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n d=\"M17.5 7.66667C17.5 5.08934 15.0376 3 12 3C8.96243 3 6.5 5.08934 6.5 7.66667C6.5 8.15279 6.55336 8.59783 6.6668 9M6 16.3333C6 18.9107 8.68629 21 12 21C15.3137 21 18 19.6667 18 16.3333C18 13.9404 16.9693 12.5782 14.9079 12\"\n />\n </SvgIcon>\n);\n\nexport const InlineCodeIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M17 8L18.8398 9.85008C19.6133 10.6279 20 11.0168 20 11.5C20 11.9832 19.6133 12.3721 18.8398 13.1499L17 15\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M7 8L5.16019 9.85008C4.38673 10.6279 4 11.0168 4 11.5C4 11.9832 4.38673 12.3721 5.16019 13.1499L7 15\"\n />\n <path d=\"M14.5 4L9.5 20\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </SvgIcon>\n);\n\nexport const CodeBlockIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M16 10L17.2265 11.0572C17.7422 11.5016 18 11.7239 18 12C18 12.2761 17.7422 12.4984 17.2265 12.9428L16 14\"\n />\n <path\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M8 10L6.77346 11.0572C6.25782 11.5016 6 11.7239 6 12C6 12.2761 6.25782 12.4984 6.77346 12.9428L8 14\"\n />\n <path d=\"M13 9L11 15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n d=\"M2.5 12C2.5 7.52166 2.5 5.28249 3.89124 3.89124C5.28249 2.5 7.52166 2.5 12 2.5C16.4783 2.5 18.7175 2.5 20.1088 3.89124C21.5 5.28249 21.5 7.52166 21.5 12C21.5 16.4783 21.5 18.7175 20.1088 20.1088C18.7175 21.5 16.4783 21.5 12 21.5C7.52166 21.5 5.28249 21.5 3.89124 20.1088C2.5 18.7175 2.5 16.4783 2.5 12Z\"\n />\n </SvgIcon>\n);\n\n// ---------------------------------------------------------------------------\n// Headings\n// ---------------------------------------------------------------------------\n\nexport const H1Icon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M4 5V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M14 5V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path\n d=\"M17 19H18.5M20 19H18.5M18.5 19V11L17 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M4 12L14 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </SvgIcon>\n);\n\nexport const H2Icon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M3.5 5V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M13.5 5V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M20.5 19H16.5V18.6907C16.5 18.2521 16.5 18.0327 16.5865 17.8385C16.673 17.6443 16.836 17.4976 17.1621 17.2041L19.7671 14.8596C20.2336 14.4397 20.5 13.8416 20.5 13.214V13C20.5 11.8954 19.6046 11 18.5 11C17.3954 11 16.5 11.8954 16.5 13V13.4\"\n />\n <path d=\"M3.5 12L13.5 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </SvgIcon>\n);\n\nexport const H3Icon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M3.5 5V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M13.5 5V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M16.5 17C16.5 18.1046 17.3954 19 18.5 19C19.6046 19 20.5 18.1046 20.5 17C20.5 15.8954 19.6046 15 18.5 15C19.6046 15 20.5 14.1046 20.5 13C20.5 11.8954 19.6046 11 18.5 11C17.3954 11 16.5 11.8954 16.5 13\"\n />\n <path d=\"M3.5 12L13.5 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </SvgIcon>\n);\n\nexport const H4Icon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M3.5 5V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M13.5 5V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path\n fill=\"none\"\n d=\"M16.5 11V15H20.5M20.5 15V19M20.5 15V11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M3.5 12L13.5 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </SvgIcon>\n);\n\nexport const H5Icon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M3.5 5V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M13.5 5V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path\n fill=\"none\"\n d=\"M16.5 16.5V17C16.5 18.1046 17.3954 19 18.5 19C19.6046 19 20.5 18.1046 20.5 17V16.5C20.5 15.1193 19.3807 14 18 14H16.5V11H20.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M3.5 12L13.5 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </SvgIcon>\n);\n\nexport const H6Icon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M3.5 5V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M13.5 5V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path\n fill=\"none\"\n d=\"M16.5 17C16.5 18.1046 17.3954 19 18.5 19C19.6046 19 20.5 18.1046 20.5 17C20.5 15.8954 19.6046 15 18.5 15C17.3954 15 16.5 15.8954 16.5 17ZM16.5 17V13C16.5 11.8954 17.3954 11 18.5 11C19.6046 11 20.5 11.8954 20.5 13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M3.5 12L13.5 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </SvgIcon>\n);\n\nexport const ParagraphIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 21.001H9\" />\n <path\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n d=\"M12 3.00001V21.0008M12 3.00001C13.3874 3.00001 15.1695 3.03055 16.5884 3.17649C17.1885 3.2382 17.4886 3.26906 17.7541 3.37791C18.3066 3.60429 18.7518 4.10063 18.9194 4.67681C19 4.95382 19 5.26992 19 5.90215M12 3.00001C10.6126 3.00001 8.83047 3.03055 7.41161 3.17649C6.8115 3.2382 6.51144 3.26906 6.24586 3.37791C5.69344 3.60429 5.24816 4.10063 5.08057 4.67681C5 4.95382 5 5.26992 5 5.90215\"\n />\n </SvgIcon>\n);\n\n// ---------------------------------------------------------------------------\n// Alignment\n// ---------------------------------------------------------------------------\n\nexport const AlignLeftIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M3 3H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M3 9H11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M3 15H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M3 21H11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </SvgIcon>\n);\n\nexport const AlignCenterIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M3 3H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M8 9H16\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M3 15H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M8 21H16\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </SvgIcon>\n);\n\nexport const AlignRightIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M3 3H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M13 9H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M3 15H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M13 21H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </SvgIcon>\n);\n\nexport const AlignJustifyIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M3 3H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M3 9H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M3 15H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M3 21H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </SvgIcon>\n);\n\n// ---------------------------------------------------------------------------\n// Lists\n// ---------------------------------------------------------------------------\n\nexport const BulletListIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M11 5.5L21 5.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n d=\"M5.4 16.8926C6.46667 17.607 7 17.9642 7 18.5C7 19.0358 6.46667 19.393 5.4 20.1074C4.33333 20.8218 3.8 21.1789 3.4 20.9111C3 20.6432 3 19.9288 3 18.5C3 17.0712 3 16.3568 3.4 16.0889C3.8 15.8211 4.33333 16.1782 5.4 16.8926Z\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n d=\"M5.4 3.89263C6.46667 4.60702 7 4.96421 7 5.5C7 6.03579 6.46667 6.39298 5.4 7.10737C4.33333 7.82176 3.8 8.17895 3.4 7.91105C3 7.64316 3 6.92877 3 5.5C3 4.07123 3 3.35684 3.4 3.08895C3.8 2.82105 4.33333 3.17824 5.4 3.89263Z\"\n />\n <path d=\"M11 12L21 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M11 18.5L21 18.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </SvgIcon>\n);\n\nexport const OrderedListIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M11 6L21 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M11 12L21 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M11 18L21 18\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3 15H4.5C4.77879 15 4.91819 15 5.03411 15.0231C5.51014 15.1177 5.88225 15.4899 5.97694 15.9659C6 16.0818 6 16.2212 6 16.5C6 16.7788 6 16.9182 5.97694 17.0341C5.88225 17.5101 5.51014 17.8823 5.03411 17.9769C4.91819 18 4.77879 18 4.5 18C4.22121 18 4.08181 18 3.96589 18.0231C3.48986 18.1177 3.11775 18.4899 3.02306 18.9659C3 19.0818 3 19.2212 3 19.5V20.4C3 20.6828 3 20.8243 3.08787 20.9121C3.17574 21 3.31716 21 3.6 21H6\"\n />\n <path\n d=\"M3 3H4.2C4.36569 3 4.5 3.13431 4.5 3.3V9M4.5 9H3M4.5 9H6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </SvgIcon>\n);\n\nexport const CheckListIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M11 6L21 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M11 12L21 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M11 18L21 18\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3 7.39286C3 7.39286 4 8.04466 4.5 9C4.5 9 6 5.25 8 4\"\n />\n <path\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3 18.3929C3 18.3929 4 19.0447 4.5 20C4.5 20 6 16.25 8 15\"\n />\n </SvgIcon>\n);\n\n// ---------------------------------------------------------------------------\n// Block Elements\n// ---------------------------------------------------------------------------\n\nexport const QuoteIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n d=\"M14 16C14 14.1144 14 13.1716 14.5858 12.5858C15.1716 12 16.1144 12 18 12C19.8856 12 20.8284 12 21.4142 12.5858C22 13.1716 22 14.1144 22 16C22 17.8856 22 18.8284 21.4142 19.4142C20.8284 20 19.8856 20 18 20C16.1144 20 15.1716 20 14.5858 19.4142C14 18.8284 14 17.8856 14 16Z\"\n />\n <path\n fill=\"none\"\n d=\"M14 16V11.8626C14 8.19569 16.5157 5.08584 20 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n d=\"M2 16C2 14.1144 2 13.1716 2.58579 12.5858C3.17157 12 4.11438 12 6 12C7.88562 12 8.82843 12 9.41421 12.5858C10 13.1716 10 14.1144 10 16C10 17.8856 10 18.8284 9.41421 19.4142C8.82843 20 7.88562 20 6 20C4.11438 20 3.17157 20 2.58579 19.4142C2 18.8284 2 17.8856 2 16Z\"\n />\n <path\n fill=\"none\"\n d=\"M2 16V11.8626C2 8.19569 4.51571 5.08584 8 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </SvgIcon>\n);\n\nexport const HorizontalRuleIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M2.5 12L21.5002 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </SvgIcon>\n);\n\nexport const TableIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3.89124 20.1088C2.5 18.7175 2.5 16.4783 2.5 12C2.5 7.52166 2.5 5.28249 3.89124 3.89124C5.28249 2.5 7.52166 2.5 12 2.5C16.4783 2.5 18.7175 2.5 20.1088 3.89124C21.5 5.28249 21.5 7.52166 21.5 12C21.5 16.4783 21.5 18.7175 20.1088 20.1088C18.7175 21.5 16.4783 21.5 12 21.5C7.52166 21.5 5.28249 21.5 3.89124 20.1088Z\"\n />\n <path d=\"M2.5 9L21.5 9\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 13L21.5 13\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 17L21.5 17\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12 21.5L12 9\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </SvgIcon>\n);\n\n// ---------------------------------------------------------------------------\n// Media & Links\n// ---------------------------------------------------------------------------\n\nexport const LinkIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M9.5 14.5L14.5 9.49995\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n d=\"M16.8463 14.6095L19.4558 12C21.5147 9.94108 21.5147 6.60298 19.4558 4.54411C17.397 2.48524 14.0589 2.48524 12 4.54411L9.39045 7.15366M14.6095 16.8463L12 19.4558C9.94113 21.5147 6.60303 21.5147 4.54416 19.4558C2.48528 17.3969 2.48528 14.0588 4.54416 12L7.1537 9.39041\"\n />\n </SvgIcon>\n);\n\nexport const UnlinkIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path\n fill=\"none\"\n d=\"M16.8463 14.6095L19.4558 12C21.5147 9.94113 21.5147 6.60303 19.4558 4.54416C17.397 2.48528 14.0589 2.48528 12 4.54416L9.39045 7.1537M14.6095 16.8463L12 19.4558C9.94113 21.5147 6.60303 21.5147 4.54416 19.4558C2.48528 17.397 2.48528 14.0589 4.54416 12L7.1537 9.39045\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M22 17H19.9211M17 22L17 19.9211\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 7H4.07889M7 2L7 4.07889\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </SvgIcon>\n);\n\nexport const ImageIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <circle\n fill=\"none\"\n cx=\"7.5\"\n cy=\"7.5\"\n r=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n d=\"M2.5 12C2.5 7.52166 2.5 5.28249 3.89124 3.89124C5.28249 2.5 7.52166 2.5 12 2.5C16.4783 2.5 18.7175 2.5 20.1088 3.89124C21.5 5.28249 21.5 7.52166 21.5 12C21.5 16.4783 21.5 18.7175 20.1088 20.1088C18.7175 21.5 16.4783 21.5 12 21.5C7.52166 21.5 5.28249 21.5 3.89124 20.1088C2.5 18.7175 2.5 16.4783 2.5 12Z\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n d=\"M5 21C9.37246 15.775 14.2741 8.88406 21.4975 13.5424\"\n />\n </SvgIcon>\n);\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nexport const ClearMarksIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path d=\"M11 20.001H5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M3 3L21 21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n d=\"M19 7C19 6.36778 19 5.95381 18.9194 5.6768C18.7518 5.10062 18.3066 4.60428 17.7541 4.37789C17.4886 4.26905 17.1885 4.23819 16.5884 4.17648C15.1695 4.03054 13.3874 4 12 4H8\"\n />\n <path\n d=\"M12 4L11.2 7.20003M8 20.0008L10.4001 10.4001\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </SvgIcon>\n);\n\nexport const UndoIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path\n fill=\"none\"\n d=\"M3 12C3 16.9706 7.02944 21 12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C8.79275 3 5.97733 4.67765 4.38341 7.20327M3.29339 3.00076L3.46556 5.05452C3.58958 6.53384 3.65159 7.27349 4.13359 7.68914C4.61559 8.10479 5.32673 8.03185 6.74899 7.88595L8.79339 7.67625\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </SvgIcon>\n);\n\nexport const RedoIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C15.2073 3 18.0227 4.67765 19.6166 7.20327M20.7066 3.00076L20.5344 5.05452C20.4104 6.53384 20.3484 7.27349 19.8664 7.68914C19.3844 8.10479 18.6733 8.03185 17.251 7.88595L15.2066 7.67625\"\n />\n </SvgIcon>\n);\n\nexport const HardBreakIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13 6H8.5C6.01472 6 4 8.01472 4 10.5C4 12.9853 6.01472 15 8.5 15H20\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M17 12C17 12 20 14.2095 20 15C20 15.7906 17 18 17 18\"\n />\n </SvgIcon>\n);\n\nexport const FullscreenIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.5 21C16.8956 21 17.5933 21 18.1611 20.8278C19.4395 20.44 20.44 19.4395 20.8278 18.1611C21 17.5933 21 16.8956 21 15.5M21 8.5C21 7.10444 21 6.40666 20.8278 5.83886C20.44 4.56046 19.4395 3.56004 18.1611 3.17224C17.5933 3 16.8956 3 15.5 3M8.5 21C7.10444 21 6.40666 21 5.83886 20.8278C4.56046 20.44 3.56004 19.4395 3.17224 18.1611C3 17.5933 3 16.8956 3 15.5M3 8.5C3 7.10444 3 6.40666 3.17224 5.83886C3.56004 4.56046 4.56046 3.56004 5.83886 3.17224C6.40666 3 7.10444 3 8.5 3\"\n />\n </SvgIcon>\n);\n\nexport const ExitFullscreenIcon: IconComponent = (props) => (\n <SvgIcon {...props}>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.5 9.5L21 4M15.5 9.5V5M15.5 9.5H20M8.5 14.5L3 20M8.5 14.5V19M8.5 14.5H4\"\n />\n </SvgIcon>\n);\n","import type { Editor } from '@tiptap/react';\nimport type { TextHeadingLevel } from './use-toolbar-state.js';\n\nimport { useState, useCallback } from 'react';\n\nimport Menu from '@mui/material/Menu';\nimport { styled } from '@mui/material/styles';\nimport ButtonBase from '@mui/material/ButtonBase';\nimport { listClasses } from '@mui/material/List';\nimport { buttonBaseClasses } from '@mui/material/ButtonBase';\n\nimport { ToolbarItem } from './toolbar-item.js';\nimport { ParagraphIcon, H1Icon, H2Icon, H3Icon, H4Icon, H5Icon, H6Icon } from '../icons/index.js';\n\nconst HEADING_OPTIONS = [\n { key: 'Paragraph', level: null as TextHeadingLevel, icon: <ParagraphIcon sx={{ fontSize: 18 }} /> },\n { key: 'Heading 1', level: 1 as TextHeadingLevel, icon: <H1Icon sx={{ fontSize: 18 }} /> },\n { key: 'Heading 2', level: 2 as TextHeadingLevel, icon: <H2Icon sx={{ fontSize: 18 }} /> },\n { key: 'Heading 3', level: 3 as TextHeadingLevel, icon: <H3Icon sx={{ fontSize: 18 }} /> },\n { key: 'Heading 4', level: 4 as TextHeadingLevel, icon: <H4Icon sx={{ fontSize: 18 }} /> },\n { key: 'Heading 5', level: 5 as TextHeadingLevel, icon: <H5Icon sx={{ fontSize: 18 }} /> },\n { key: 'Heading 6', level: 6 as TextHeadingLevel, icon: <H6Icon sx={{ fontSize: 18 }} /> },\n];\n\ninterface HeadingBlockProps {\n editor: Editor;\n isActive: (value: TextHeadingLevel) => boolean;\n}\n\nexport function HeadingBlock({ editor, isActive }: HeadingBlockProps) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const handleOpen = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n }, []);\n\n const handleClose = useCallback(() => {\n setAnchorEl(null);\n }, []);\n\n const handleSelect = useCallback(\n (value: TextHeadingLevel) => {\n handleClose();\n if (value) {\n editor.chain().focus().toggleHeading({ level: value }).run();\n } else {\n editor.chain().focus().setParagraph().run();\n }\n },\n [editor, handleClose]\n );\n\n const activeIcon = (editor.isActive('heading', { level: 1 }) && <H1Icon sx={{ fontSize: 18 }} />) ||\n (editor.isActive('heading', { level: 2 }) && <H2Icon sx={{ fontSize: 18 }} />) ||\n (editor.isActive('heading', { level: 3 }) && <H3Icon sx={{ fontSize: 18 }} />) ||\n (editor.isActive('heading', { level: 4 }) && <H4Icon sx={{ fontSize: 18 }} />) ||\n (editor.isActive('heading', { level: 5 }) && <H5Icon sx={{ fontSize: 18 }} />) ||\n (editor.isActive('heading', { level: 6 }) && <H6Icon sx={{ fontSize: 18 }} />) || (\n <ParagraphIcon sx={{ fontSize: 18 }} />\n );\n\n const buttonId = 'heading-menu-button';\n const menuId = 'heading-menu';\n\n return (\n <>\n <HeadingButton\n id={buttonId}\n aria-label=\"Heading menu\"\n aria-controls={open ? menuId : undefined}\n aria-haspopup=\"true\"\n aria-expanded={open ? 'true' : undefined}\n onClick={handleOpen}\n >\n {activeIcon}\n </HeadingButton>\n\n <Menu\n id={menuId}\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n slotProps={{\n list: { 'aria-labelledby': buttonId },\n paper: {\n sx: {\n width: 42,\n [`& .${listClasses.root}`]: { gap: 0.5, display: 'flex', flexDirection: 'column' },\n [`& .${buttonBaseClasses.root}`]: {\n px: 1,\n width: 1,\n height: 34,\n borderRadius: 0.75,\n justifyContent: 'flex-start',\n '&:hover': { backgroundColor: 'action.hover' },\n },\n },\n },\n }}\n >\n {HEADING_OPTIONS.map((option) => (\n <ToolbarItem\n key={option.key}\n component=\"li\"\n aria-label={option.key}\n icon={option.icon}\n active={isActive(option.level)}\n onClick={() => handleSelect(option.level)}\n />\n ))}\n </Menu>\n </>\n );\n}\n\nconst HeadingButton = styled(ButtonBase)(({ theme }) => ({\n width: 28,\n height: 28,\n borderRadius: Number(theme.shape.borderRadius) * 0.75,\n justifyContent: 'center',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n}));\n","import type { Editor } from '@tiptap/react';\nimport type { EditorToolbarItemProps } from '../types.js';\n\nimport { useState, useCallback } from 'react';\n\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Popover from '@mui/material/Popover';\nimport TextField from '@mui/material/TextField';\nimport Typography from '@mui/material/Typography';\n\nimport { editorClasses } from '../classes.js';\nimport { ToolbarItem } from './toolbar-item.js';\n\ninterface LinkBlockProps {\n editor: Editor;\n active: boolean;\n linkIcon: EditorToolbarItemProps['icon'];\n unlinkIcon: EditorToolbarItemProps['icon'];\n}\n\nexport function LinkBlock({ editor, linkIcon, unlinkIcon, active }: LinkBlockProps) {\n const [linkUrl, setLinkUrl] = useState('');\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const handleOpen = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n const currentUrl = editor.getAttributes('link').href ?? '';\n setAnchorEl(event.currentTarget);\n setLinkUrl(currentUrl);\n },\n [editor]\n );\n\n const handleClose = useCallback(() => {\n setAnchorEl(null);\n }, []);\n\n const handleApply = useCallback(() => {\n handleClose();\n const chain = () => editor.chain().focus().extendMarkRange('link');\n if (linkUrl) {\n chain().setLink({ href: linkUrl }).run();\n } else {\n chain().unsetLink().run();\n }\n }, [editor, linkUrl, handleClose]);\n\n const popoverId = open ? 'link-popover' : undefined;\n\n return (\n <>\n <ToolbarItem\n aria-describedby={popoverId}\n aria-label=\"Insert link\"\n active={active}\n className={editorClasses.toolbar.link}\n onClick={handleOpen}\n icon={linkIcon}\n />\n\n <ToolbarItem\n aria-label=\"Remove link\"\n disabled={!active}\n className={editorClasses.toolbar.unlink}\n onClick={() => editor.chain().focus().unsetLink().run()}\n icon={unlinkIcon}\n />\n\n <Popover\n id={popoverId}\n open={open}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n slotProps={{\n paper: {\n sx: { p: 2.5, gap: 1.25, width: 1, maxWidth: 320, display: 'flex', flexDirection: 'column' },\n },\n }}\n >\n <Typography variant=\"subtitle2\">Link URL</Typography>\n <Box sx={{ gap: 1, display: 'flex', alignItems: 'center' }}>\n <TextField\n fullWidth\n size=\"small\"\n placeholder=\"https://\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleApply();\n }}\n />\n <Button variant=\"contained\" disabled={!linkUrl} onClick={handleApply}>\n Apply\n </Button>\n </Box>\n </Popover>\n </>\n );\n}\n","import type { Editor } from '@tiptap/react';\nimport type { EditorToolbarItemProps } from '../types.js';\n\nimport { useState, useCallback } from 'react';\n\nimport Button from '@mui/material/Button';\nimport Popover from '@mui/material/Popover';\nimport TextField from '@mui/material/TextField';\nimport Typography from '@mui/material/Typography';\n\nimport { editorClasses } from '../classes.js';\nimport { ToolbarItem } from './toolbar-item.js';\n\ninterface ImageBlockProps {\n editor: Editor;\n icon: EditorToolbarItemProps['icon'];\n}\n\nexport function ImageBlock({ editor, icon }: ImageBlockProps) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n const [state, setState] = useState({ imageUrl: '', altText: '' });\n\n const handleOpen = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n }, []);\n\n const handleClose = useCallback(() => {\n setAnchorEl(null);\n }, []);\n\n const handleApply = useCallback(() => {\n handleClose();\n setState({ imageUrl: '', altText: '' });\n editor.chain().focus().setImage({ src: state.imageUrl, alt: state.altText }).run();\n }, [editor, handleClose, state]);\n\n const popoverId = open ? 'image-popover' : undefined;\n\n return (\n <>\n <ToolbarItem\n aria-describedby={popoverId}\n aria-label=\"Insert image\"\n className={editorClasses.toolbar.image}\n onClick={handleOpen}\n icon={icon}\n />\n\n <Popover\n id={popoverId}\n open={open}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n slotProps={{\n paper: {\n sx: { p: 2.5, gap: 1.25, width: 1, maxWidth: 320, display: 'flex', flexDirection: 'column' },\n },\n }}\n >\n <Typography variant=\"subtitle2\">Add image</Typography>\n <TextField\n fullWidth\n size=\"small\"\n placeholder=\"Image URL\"\n value={state.imageUrl}\n onChange={(e) => setState((prev) => ({ ...prev, imageUrl: e.target.value }))}\n />\n <TextField\n fullWidth\n size=\"small\"\n placeholder=\"Alt text\"\n value={state.altText}\n onChange={(e) => setState((prev) => ({ ...prev, altText: e.target.value }))}\n />\n <Button variant=\"contained\" disabled={!state.imageUrl} onClick={handleApply} sx={{ alignSelf: 'flex-end' }}>\n Apply\n </Button>\n </Popover>\n </>\n );\n}\n","import type { Editor } from '@tiptap/react';\nimport type { TextTransformValue } from '../extensions/text-transform.js';\n\nimport { useEditorState } from '@tiptap/react';\n\nexport type TextAlignValue = 'left' | 'center' | 'right' | 'justify';\nexport type TextHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6 | null;\n\nexport interface UseToolbarStateReturn {\n isBold: boolean;\n isCode: boolean;\n isLink: boolean;\n isItalic: boolean;\n isStrike: boolean;\n isUnderline: boolean;\n isCodeBlock: boolean;\n isBulletList: boolean;\n isBlockquote: boolean;\n isOrderedList: boolean;\n isTaskList: boolean;\n isAlign: (value: TextAlignValue) => boolean;\n isTextLevel: (value: TextHeadingLevel) => boolean;\n isTextTransform: (value: TextTransformValue) => boolean;\n canUndo: boolean;\n canRedo: boolean;\n}\n\nexport function useToolbarState(editor: Editor): UseToolbarStateReturn {\n return useEditorState({\n editor,\n selector: (ctx) => {\n const canRun = ctx.editor.can().chain().focus();\n\n return {\n isBold: ctx.editor.isActive('bold'),\n isCode: ctx.editor.isActive('code'),\n isLink: ctx.editor.isActive('link'),\n isItalic: ctx.editor.isActive('italic'),\n isStrike: ctx.editor.isActive('strike'),\n isUnderline: ctx.editor.isActive('underline'),\n isCodeBlock: ctx.editor.isActive('codeBlock'),\n isBulletList: ctx.editor.isActive('bulletList'),\n isBlockquote: ctx.editor.isActive('blockquote'),\n isOrderedList: ctx.editor.isActive('orderedList'),\n isTaskList: ctx.editor.isActive('taskList'),\n isAlign: (value: TextAlignValue) => ctx.editor.isActive({ textAlign: value }),\n isTextTransform: (value: TextTransformValue) => ctx.editor.isActive('textTransform', { textTransform: value }),\n isTextLevel: (value: TextHeadingLevel) =>\n value ? ctx.editor.isActive('heading', { level: value }) : ctx.editor.isActive('paragraph'),\n canUndo: canRun.undo().run(),\n canRedo: canRun.redo().run(),\n };\n },\n });\n}\n","import type { EditorToolbarProps } from '../types.js';\n\nimport Divider from '@mui/material/Divider';\nimport { alpha, styled } from '@mui/material/styles';\n\nimport { editorClasses } from '../classes.js';\nimport { ToolbarItem } from './toolbar-item.js';\nimport { HeadingBlock } from './heading-block.js';\nimport { LinkBlock } from './link-block.js';\nimport { ImageBlock } from './image-block.js';\nimport { useToolbarState } from './use-toolbar-state.js';\nimport {\n BoldIcon,\n ItalicIcon,\n UnderlineIcon,\n StrikeIcon,\n InlineCodeIcon,\n BulletListIcon,\n OrderedListIcon,\n CheckListIcon,\n AlignLeftIcon,\n AlignCenterIcon,\n AlignRightIcon,\n AlignJustifyIcon,\n QuoteIcon,\n CodeBlockIcon,\n HorizontalRuleIcon,\n LinkIcon,\n UnlinkIcon,\n ImageIcon,\n HardBreakIcon,\n ClearMarksIcon,\n UndoIcon,\n RedoIcon,\n FullscreenIcon,\n ExitFullscreenIcon,\n} from '../icons/index.js';\n\nexport function Toolbar({ editor, toolbar, fullscreen, onToggleFullscreen }: EditorToolbarProps) {\n const state = useToolbarState(editor);\n const has = (item: string) => toolbar.items.has(item as any);\n const chain = () => editor.chain().focus();\n\n const hasAnyInGroup = (...items: string[]) => items.some(has);\n\n return (\n <ToolbarRoot className={editorClasses.toolbar.root}>\n {/* Heading selector */}\n {has('heading') && (\n <>\n <HeadingBlock editor={editor} isActive={state.isTextLevel} />\n <ToolbarDivider />\n </>\n )}\n\n {/* Text styles */}\n {hasAnyInGroup('bold', 'italic', 'underline', 'strike', 'code') && (\n <>\n <ToolbarBlock>\n {has('bold') && (\n <ToolbarItem\n aria-label=\"Bold (⌘B)\"\n active={state.isBold}\n className={editorClasses.toolbar.bold}\n onClick={() => chain().toggleBold().run()}\n icon={<BoldIcon />}\n />\n )}\n {has('italic') && (\n <ToolbarItem\n aria-label=\"Italic (⌘I)\"\n active={state.isItalic}\n className={editorClasses.toolbar.italic}\n onClick={() => chain().toggleItalic().run()}\n icon={<ItalicIcon />}\n />\n )}\n {has('underline') && (\n <ToolbarItem\n aria-label=\"Underline (⌘U)\"\n active={state.isUnderline}\n className={editorClasses.toolbar.underline}\n onClick={() => chain().toggleUnderline().run()}\n icon={<UnderlineIcon />}\n />\n )}\n {has('strike') && (\n <ToolbarItem\n aria-label=\"Strikethrough\"\n active={state.isStrike}\n className={editorClasses.toolbar.strike}\n onClick={() => chain().toggleStrike().run()}\n icon={<StrikeIcon />}\n />\n )}\n {has('code') && (\n <ToolbarItem\n aria-label=\"Inline code (⌘E)\"\n active={state.isCode}\n className={editorClasses.toolbar.code}\n onClick={() => chain().toggleCode().run()}\n icon={<InlineCodeIcon />}\n />\n )}\n </ToolbarBlock>\n <ToolbarDivider />\n </>\n )}\n\n {/* Lists */}\n {hasAnyInGroup('bulletList', 'orderedList', 'taskList') && (\n <>\n <ToolbarBlock>\n {has('bulletList') && (\n <ToolbarItem\n aria-label=\"Bullet list\"\n active={state.isBulletList}\n className={editorClasses.toolbar.bulletList}\n onClick={() => chain().toggleBulletList().run()}\n icon={<BulletListIcon />}\n />\n )}\n {has('orderedList') && (\n <ToolbarItem\n aria-label=\"Ordered list\"\n active={state.isOrderedList}\n className={editorClasses.toolbar.orderedList}\n onClick={() => chain().toggleOrderedList().run()}\n icon={<OrderedListIcon />}\n />\n )}\n {has('taskList') && (\n <ToolbarItem\n aria-label=\"Task list\"\n active={state.isTaskList}\n className={editorClasses.toolbar.taskList}\n onClick={() => chain().toggleTaskList().run()}\n icon={<CheckListIcon />}\n />\n )}\n </ToolbarBlock>\n <ToolbarDivider />\n </>\n )}\n\n {/* Alignment */}\n {hasAnyInGroup('alignLeft', 'alignCenter', 'alignRight', 'alignJustify') && (\n <>\n <ToolbarBlock>\n {has('alignLeft') && (\n <ToolbarItem\n aria-label=\"Align left\"\n active={state.isAlign('left')}\n className={editorClasses.toolbar.alignLeft}\n onClick={() => chain().setTextAlign('left').run()}\n icon={<AlignLeftIcon />}\n />\n )}\n {has('alignCenter') && (\n <ToolbarItem\n aria-label=\"Align center\"\n active={state.isAlign('center')}\n className={editorClasses.toolbar.alignCenter}\n onClick={() => chain().setTextAlign('center').run()}\n icon={<AlignCenterIcon />}\n />\n )}\n {has('alignRight') && (\n <ToolbarItem\n aria-label=\"Align right\"\n active={state.isAlign('right')}\n className={editorClasses.toolbar.alignRight}\n onClick={() => chain().setTextAlign('right').run()}\n icon={<AlignRightIcon />}\n />\n )}\n {has('alignJustify') && (\n <ToolbarItem\n aria-label=\"Align justify\"\n active={state.isAlign('justify')}\n className={editorClasses.toolbar.alignJustify}\n onClick={() => chain().setTextAlign('justify').run()}\n icon={<AlignJustifyIcon />}\n />\n )}\n </ToolbarBlock>\n <ToolbarDivider />\n </>\n )}\n\n {/* Block elements */}\n {hasAnyInGroup('blockquote', 'codeBlock', 'horizontalRule') && (\n <>\n <ToolbarBlock>\n {has('blockquote') && (\n <ToolbarItem\n aria-label=\"Blockquote\"\n active={state.isBlockquote}\n className={editorClasses.toolbar.blockquote}\n onClick={() => chain().toggleBlockquote().run()}\n icon={<QuoteIcon />}\n />\n )}\n {has('codeBlock') && (\n <ToolbarItem\n aria-label=\"Code block\"\n active={state.isCodeBlock}\n className={editorClasses.toolbar.codeBlock}\n onClick={() => chain().toggleCodeBlock().run()}\n icon={<CodeBlockIcon />}\n />\n )}\n {has('horizontalRule') && (\n <ToolbarItem\n aria-label=\"Horizontal rule\"\n className={editorClasses.toolbar.hr}\n onClick={() => chain().setHorizontalRule().run()}\n icon={<HorizontalRuleIcon />}\n />\n )}\n </ToolbarBlock>\n <ToolbarDivider />\n </>\n )}\n\n {/* Link & Image */}\n {hasAnyInGroup('link', 'image') && (\n <>\n <ToolbarBlock>\n {has('link') && (\n <LinkBlock editor={editor} active={state.isLink} linkIcon={<LinkIcon />} unlinkIcon={<UnlinkIcon />} />\n )}\n {has('image') && <ImageBlock editor={editor} icon={<ImageIcon />} />}\n </ToolbarBlock>\n <ToolbarDivider />\n </>\n )}\n\n {/* Utilities */}\n {hasAnyInGroup('hardBreak', 'clearFormat') && (\n <>\n <ToolbarBlock>\n {has('hardBreak') && (\n <ToolbarItem\n aria-label=\"Hard break\"\n className={editorClasses.toolbar.hardBreak}\n onClick={() => chain().setHardBreak().run()}\n icon={<HardBreakIcon />}\n />\n )}\n {has('clearFormat') && (\n <ToolbarItem\n aria-label=\"Clear format (⌘⇧X)\"\n className={editorClasses.toolbar.clear}\n onClick={() => chain().clearNodes().unsetAllMarks().run()}\n icon={<ClearMarksIcon />}\n />\n )}\n </ToolbarBlock>\n <ToolbarDivider />\n </>\n )}\n\n {/* Undo/Redo */}\n {hasAnyInGroup('undo', 'redo') && (\n <>\n <ToolbarBlock>\n {has('undo') && (\n <ToolbarItem\n aria-label=\"Undo (⌘Z)\"\n disabled={!state.canUndo}\n className={editorClasses.toolbar.undo}\n onClick={() => chain().undo().run()}\n icon={<UndoIcon />}\n />\n )}\n {has('redo') && (\n <ToolbarItem\n aria-label=\"Redo (⌘⇧Z)\"\n disabled={!state.canRedo}\n className={editorClasses.toolbar.redo}\n onClick={() => chain().redo().run()}\n icon={<RedoIcon />}\n />\n )}\n </ToolbarBlock>\n <ToolbarDivider />\n </>\n )}\n\n {/* Fullscreen */}\n {has('fullscreen') && (\n <ToolbarBlock>\n <ToolbarItem\n aria-label={fullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n active={fullscreen}\n className={editorClasses.toolbar.fullscreen}\n onClick={onToggleFullscreen}\n icon={fullscreen ? <ExitFullscreenIcon /> : <FullscreenIcon />}\n />\n </ToolbarBlock>\n )}\n </ToolbarRoot>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Styled\n// ---------------------------------------------------------------------------\n\nconst ToolbarRoot = styled('div')(({ theme }) => ({\n flexWrap: 'wrap',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(1),\n padding: theme.spacing(1.25),\n borderTopLeftRadius: 'inherit',\n borderTopRightRadius: 'inherit',\n backgroundColor: theme.palette.background.paper,\n borderBottom: `solid 1px ${alpha(theme.palette.grey[500], 0.2)}`,\n}));\n\nconst ToolbarBlock = styled('div')(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n}));\n\nfunction ToolbarDivider() {\n return <Divider orientation=\"vertical\" flexItem sx={{ height: 16, my: 'auto' }} />;\n}\n","import type { Editor } from '@tiptap/react';\n\nimport { BubbleMenu } from '@tiptap/react/menus';\nimport Divider from '@mui/material/Divider';\nimport { alpha, styled } from '@mui/material/styles';\n\nimport { editorClasses } from '../classes.js';\nimport { ToolbarItem } from './toolbar-item.js';\nimport { LinkBlock } from './link-block.js';\nimport { useToolbarState } from './use-toolbar-state.js';\nimport {\n BoldIcon,\n ItalicIcon,\n UnderlineIcon,\n StrikeIcon,\n LinkIcon,\n UnlinkIcon,\n ClearMarksIcon,\n} from '../icons/index.js';\n\ninterface BubbleToolbarProps {\n editor: Editor;\n}\n\nexport function BubbleToolbar({ editor }: BubbleToolbarProps) {\n const state = useToolbarState(editor);\n const chain = () => editor.chain().focus();\n\n return (\n <BubbleMenu editor={editor}>\n <BubbleRoot>\n <ToolbarItem\n aria-label=\"Bold\"\n active={state.isBold}\n className={editorClasses.toolbar.bold}\n onClick={() => chain().toggleBold().run()}\n icon={<BoldIcon />}\n />\n <ToolbarItem\n aria-label=\"Italic\"\n active={state.isItalic}\n className={editorClasses.toolbar.italic}\n onClick={() => chain().toggleItalic().run()}\n icon={<ItalicIcon />}\n />\n <ToolbarItem\n aria-label=\"Underline\"\n active={state.isUnderline}\n className={editorClasses.toolbar.underline}\n onClick={() => chain().toggleUnderline().run()}\n icon={<UnderlineIcon />}\n />\n <ToolbarItem\n aria-label=\"Strike\"\n active={state.isStrike}\n className={editorClasses.toolbar.strike}\n onClick={() => chain().toggleStrike().run()}\n icon={<StrikeIcon />}\n />\n <LinkBlock editor={editor} active={state.isLink} linkIcon={<LinkIcon />} unlinkIcon={<UnlinkIcon />} />\n <Divider orientation=\"vertical\" flexItem sx={{ height: 16, my: 'auto' }} />\n <ToolbarItem\n aria-label=\"Clear format\"\n className={editorClasses.toolbar.clear}\n onClick={() => chain().clearNodes().unsetAllMarks().run()}\n icon={<ClearMarksIcon />}\n />\n </BubbleRoot>\n </BubbleMenu>\n );\n}\n\nconst BubbleRoot = styled('div')(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(0.5),\n padding: theme.spacing(0.5),\n borderRadius: theme.shape.borderRadius,\n boxShadow: theme.shadows[8],\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.grey[500], 0.16)}`,\n}));\n","import type { ReactNodeViewProps } from '@tiptap/react';\n\nimport { useCallback } from 'react';\nimport { NodeViewContent, NodeViewWrapper } from '@tiptap/react';\n\nimport { editorClasses } from '../classes.js';\n\nexport function CodeHighlightBlock(props: ReactNodeViewProps) {\n const { node, extension, updateAttributes } = props;\n const language = node.attrs.language;\n const lowlight = extension.options.lowlight;\n\n const handleChangeLanguage = useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n updateAttributes({ language: event.target.value });\n },\n [updateAttributes]\n );\n\n return (\n <NodeViewWrapper className={editorClasses.content.codeBlock}>\n <select\n name=\"language\"\n contentEditable={false}\n value={language || 'null'}\n onChange={handleChangeLanguage}\n className={editorClasses.content.langSelect}\n >\n <option value=\"null\">auto</option>\n <option disabled>—</option>\n {lowlight.listLanguages().map((lang: string) => (\n <option key={lang} value={lang}>\n {lang}\n </option>\n ))}\n </select>\n <pre>\n <NodeViewContent<'code'> as=\"code\" />\n </pre>\n </NodeViewWrapper>\n );\n}\n","import { Extension } from '@tiptap/core';\n\nexport const ClearFormat = Extension.create({\n name: 'clearFormat',\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-X': ({ editor }) => editor.chain().focus().clearNodes().unsetAllMarks().run(),\n };\n },\n});\n","import type { CommandProps } from '@tiptap/core';\n\nimport { Mark } from '@tiptap/core';\n\nexport type TextTransformValue = 'uppercase' | 'lowercase' | 'capitalize';\n\nexport interface TextTransformOptions {\n allowedValues: TextTransformValue[];\n defaultValue?: TextTransformValue;\n}\n\nexport interface TextTransformAttributes {\n textTransform?: TextTransformValue;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n textTransform: {\n unsetTextTransform: () => ReturnType;\n setTextTransform: (value: TextTransformValue) => ReturnType;\n toggleTextTransform: (value: TextTransformValue) => ReturnType;\n };\n }\n}\n\nconst isHTMLElement = (node: unknown): node is HTMLElement => node instanceof HTMLElement;\n\nconst isValidTextTransform = (value: unknown, allowed: readonly TextTransformValue[]): value is TextTransformValue =>\n typeof value === 'string' && allowed.includes(value as TextTransformValue);\n\nexport const TextTransform = Mark.create<TextTransformOptions, TextTransformAttributes>({\n name: 'textTransform',\n\n addOptions() {\n return {\n allowedValues: ['uppercase', 'lowercase', 'capitalize'],\n defaultValue: undefined,\n };\n },\n\n addAttributes() {\n return {\n textTransform: {\n default: this.options.defaultValue,\n parseHTML: (element): TextTransformValue | undefined => {\n if (!isHTMLElement(element)) return undefined;\n const rawValue =\n element.style.textTransform || element.getAttribute('style')?.match(/text-transform:\\s*(\\w+)/)?.[1];\n return isValidTextTransform(rawValue, this.options.allowedValues) ? rawValue : undefined;\n },\n renderHTML: (attributes: TextTransformAttributes): Record<string, string> => {\n if (!attributes.textTransform) return {};\n return { style: `text-transform: ${attributes.textTransform}` };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'span[style]',\n getAttrs: (node) => {\n if (!isHTMLElement(node)) return null;\n const styleValue = node.style.textTransform;\n return isValidTextTransform(styleValue, this.options.allowedValues) ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['span', HTMLAttributes, 0];\n },\n\n addCommands() {\n return {\n setTextTransform:\n (value: TextTransformValue) =>\n ({ commands }: CommandProps): boolean => {\n if (!isValidTextTransform(value, this.options.allowedValues)) return false;\n return commands.setMark(this.name, { textTransform: value });\n },\n unsetTextTransform:\n () =>\n ({ commands }: CommandProps): boolean =>\n commands.unsetMark(this.name),\n toggleTextTransform:\n (value: TextTransformValue) =>\n ({ editor, commands }: CommandProps): boolean => {\n if (!isValidTextTransform(value, this.options.allowedValues)) return false;\n const isActive = editor.isActive(this.name, { textTransform: value });\n return isActive ? commands.unsetTextTransform() : commands.setTextTransform(value);\n },\n };\n },\n});\n","import type { EditorProps } from './types.js';\n\nimport { useMemo, useState, useEffect, useCallback } from 'react';\nimport { common, createLowlight } from 'lowlight';\nimport StarterKitExtension from '@tiptap/starter-kit';\nimport UnderlineExtension from '@tiptap/extension-underline';\nimport TextAlignExtension from '@tiptap/extension-text-align';\nimport ImageExtension from '@tiptap/extension-image';\nimport LinkExtension from '@tiptap/extension-link';\nimport PlaceholderExtension from '@tiptap/extension-placeholder';\nimport TaskListExtension from '@tiptap/extension-task-list';\nimport TaskItemExtension from '@tiptap/extension-task-item';\nimport CodeBlockLowlightExtension from '@tiptap/extension-code-block-lowlight';\nimport { useEditor, EditorContent, ReactNodeViewRenderer } from '@tiptap/react';\n\nimport Box from '@mui/material/Box';\nimport Portal from '@mui/material/Portal';\nimport Backdrop from '@mui/material/Backdrop';\nimport FormHelperText from '@mui/material/FormHelperText';\n\nimport { editorClasses } from './classes.js';\nimport { EditorRoot } from './styles.js';\nimport { resolveToolbar } from './presets.js';\nimport { Toolbar } from './toolbar/toolbar.js';\nimport { BubbleToolbar } from './toolbar/bubble-toolbar.js';\nimport { CodeHighlightBlock } from './toolbar/code-highlight-block.js';\nimport { ClearFormat } from './extensions/clear-format.js';\nimport { TextTransform } from './extensions/text-transform.js';\n\n/**\n * PrismEditor — configurable rich text editor built on TipTap.\n *\n * Use `toolbar` prop to select a preset or provide custom toolbar items:\n * - `\"full\"` — CMS pages, blog articles (all features)\n * - `\"standard\"` — blog posts, forums (default)\n * - `\"compact\"` — comments, replies\n * - `\"minimal\"` — short feedback\n * - `\"chat\"` — messaging\n * - `\"inline\"` — no toolbar (titles, captions)\n * - `{ items: [...], bubbleMenu: true }` — custom\n */\nexport function Editor({\n sx,\n error,\n onChange,\n slotProps,\n helperText,\n resetValue,\n className,\n toolbar: toolbarConfig,\n bubbleMenu: bubbleMenuProp,\n format = 'json',\n minHeight = 160,\n maxHeight,\n editable = true,\n extraExtensions,\n placeholder = 'Write something...',\n ref: contentRef,\n value: initialContent = '',\n ...other\n}: EditorProps) {\n const [fullscreen, setFullscreen] = useState(false);\n const [rerenderKey, setRerenderKey] = useState(0);\n\n const resolvedToolbar = useMemo(() => resolveToolbar(toolbarConfig), [toolbarConfig]);\n const showBubbleMenu = bubbleMenuProp ?? resolvedToolbar.bubbleMenu;\n const showToolbar = resolvedToolbar.items.size > 0;\n\n const lowlight = useMemo(() => createLowlight(common), []);\n\n // Parse initial content — if format is 'json' and value looks like JSON, parse it\n const parsedContent = useMemo(() => {\n if (!initialContent) return '';\n if (format === 'json' && initialContent.startsWith('{')) {\n try {\n return JSON.parse(initialContent);\n } catch {\n return initialContent;\n }\n }\n return initialContent;\n }, [initialContent, format]);\n\n const debouncedOnChange = useMemo(() => {\n let timer: ReturnType<typeof setTimeout>;\n return (editor: any) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n if (format === 'json') {\n onChange?.(JSON.stringify(editor.getJSON()));\n } else {\n onChange?.(editor.getHTML());\n }\n }, 200);\n };\n }, [onChange, format]);\n\n const extensions = useMemo(() => {\n const has = (item: string) => resolvedToolbar.items.has(item as any);\n const exts: any[] = [\n StarterKitExtension.configure({\n codeBlock: false,\n // Underline and Link are registered separately (below) to allow per-preset control\n underline: false,\n link: false,\n code: has('code') ? { HTMLAttributes: { class: editorClasses.content.codeInline } } : false,\n heading: has('heading') ? { HTMLAttributes: { class: editorClasses.content.heading } } : false,\n horizontalRule: has('horizontalRule') ? { HTMLAttributes: { class: editorClasses.content.hr } } : false,\n listItem: { HTMLAttributes: { class: editorClasses.content.listItem } },\n blockquote: has('blockquote') ? { HTMLAttributes: { class: editorClasses.content.blockquote } } : false,\n bulletList: has('bulletList') ? { HTMLAttributes: { class: editorClasses.content.bulletList } } : false,\n orderedList: has('orderedList') ? { HTMLAttributes: { class: editorClasses.content.orderedList } } : false,\n }),\n PlaceholderExtension.configure({\n placeholder,\n emptyEditorClass: editorClasses.content.placeholder,\n }),\n ClearFormat,\n TextTransform,\n ];\n\n if (has('underline')) {\n exts.push(UnderlineExtension);\n }\n\n if (has('alignLeft') || has('alignCenter') || has('alignRight') || has('alignJustify')) {\n exts.push(TextAlignExtension.configure({ types: ['heading', 'paragraph'] }));\n }\n\n if (has('image')) {\n exts.push(ImageExtension.configure({ HTMLAttributes: { class: editorClasses.content.image } }));\n }\n\n if (has('link')) {\n exts.push(\n LinkExtension.configure({\n openOnClick: false,\n HTMLAttributes: { class: editorClasses.content.link },\n })\n );\n }\n\n if (has('codeBlock')) {\n exts.push(\n CodeBlockLowlightExtension.extend({\n addNodeView: () => ReactNodeViewRenderer(CodeHighlightBlock),\n }).configure({ lowlight })\n );\n }\n\n if (has('taskList')) {\n exts.push(\n TaskListExtension.configure({ HTMLAttributes: { class: editorClasses.content.taskList } }),\n TaskItemExtension.configure({\n nested: true,\n HTMLAttributes: { class: editorClasses.content.taskItem },\n })\n );\n }\n\n if (extraExtensions) {\n exts.push(...extraExtensions);\n }\n\n return exts;\n }, [resolvedToolbar, placeholder, lowlight, extraExtensions]);\n\n const editor = useEditor({\n editable,\n immediatelyRender: false,\n content: parsedContent,\n shouldRerenderOnTransaction: !!rerenderKey,\n onUpdate: (ctx) => {\n debouncedOnChange(ctx.editor);\n },\n extensions,\n ...other,\n });\n\n // Fullscreen handlers\n const handleToggleFullscreen = useCallback(() => {\n editor?.unmount();\n setFullscreen((prev) => !prev);\n setRerenderKey((prev) => prev + 1);\n }, [editor]);\n\n const handleExitFullscreen = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n editor?.unmount();\n setFullscreen(false);\n setRerenderKey((prev) => prev + 1);\n }\n },\n [editor]\n );\n\n // Sync content from outside\n useEffect(() => {\n const timer = setTimeout(() => {\n if (!editor?.isDestroyed && editor?.isEmpty && parsedContent && parsedContent !== '<p></p>') {\n editor?.commands.setContent(parsedContent);\n }\n }, 200);\n return () => clearTimeout(timer);\n }, [parsedContent, editor]);\n\n // Reset support\n useEffect(() => {\n if (resetValue && !initialContent) {\n editor?.commands.clearContent();\n }\n }, [initialContent, resetValue, editor]);\n\n // Fullscreen ESC listener\n useEffect(() => {\n if (!fullscreen) return undefined;\n document.body.style.overflow = 'hidden';\n window.addEventListener('keydown', handleExitFullscreen);\n return () => {\n document.body.style.overflow = '';\n window.removeEventListener('keydown', handleExitFullscreen);\n };\n }, [fullscreen, handleExitFullscreen]);\n\n const rootClassName = [\n editorClasses.root,\n className,\n error && editorClasses.state.error,\n !editable && editorClasses.state.disabled,\n fullscreen && editorClasses.state.fullscreen,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Portal disablePortal={!fullscreen}>\n {fullscreen && <Backdrop open sx={(theme) => ({ zIndex: theme.zIndex.modal - 1 })} />}\n\n <Box\n {...slotProps?.wrapper}\n sx={[\n { display: 'flex', flexDirection: 'column' },\n ...(Array.isArray(slotProps?.wrapper?.sx) ? slotProps.wrapper.sx : [slotProps?.wrapper?.sx]),\n ]}\n >\n <EditorRoot className={rootClassName} sx={[{ minHeight }, ...(Array.isArray(sx) ? sx : [sx])]}>\n {editor && !editor.isDestroyed && (\n <>\n {showToolbar && (\n <Toolbar\n editor={editor}\n toolbar={resolvedToolbar}\n fullscreen={fullscreen}\n onToggleFullscreen={handleToggleFullscreen}\n />\n )}\n {showBubbleMenu && <BubbleToolbar editor={editor} />}\n <EditorContent\n ref={contentRef}\n spellCheck={false}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n editor={editor}\n className={editorClasses.content.root}\n style={maxHeight ? { maxHeight, overflowY: 'auto' } : undefined}\n />\n </>\n )}\n </EditorRoot>\n\n {helperText && <FormHelperText error={!!error}>{helperText}</FormHelperText>}\n </Box>\n </Portal>\n );\n}\n","/**\n * Mega Menu Styles\n *\n * CSS custom properties and class names for mega menus.\n *\n * @module @omnitron-dev/prism/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 @omnitron-dev/prism/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 @omnitron-dev/prism/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-of-type': {\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 @omnitron-dev/prism/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 { useState } from 'react';\nimport Box from '@mui/material/Box';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemText from '@mui/material/ListItemText';\nimport Collapse from '@mui/material/Collapse';\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\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 ...(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 <ListItemText\n primary={item.label}\n primaryTypographyProps={{\n variant: 'body2',\n fontWeight: isCategory ? 600 : isActive ? 600 : 400,\n fontSize: isCategory ? '0.8125rem' : '0.8125rem',\n noWrap: true,\n ...(isCategory && {\n color: 'text.primary',\n }),\n }}\n />\n </ListItemButton>\n\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","'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 codeInline: `${PREFIX}__code-inline`,\n spoiler: `${PREFIX}__spoiler`,\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 // First heading in content should not have excessive top margin\n '& > h1:first-of-type, & > h2:first-of-type, & > h3:first-of-type': {\n marginTop: 0,\n },\n h1: { ...theme.typography.h1, marginTop: 40, marginBottom: 12 },\n h2: { ...theme.typography.h2, marginTop: 40, marginBottom: 12 },\n h3: { ...theme.typography.h3, marginTop: 32, marginBottom: 8 },\n h4: { ...theme.typography.h4, marginTop: 24, marginBottom: 8 },\n h5: { ...theme.typography.h5, marginTop: 24, marginBottom: 8 },\n h6: { ...theme.typography.h6, marginTop: 24, marginBottom: 8 },\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 '& > p': {\n margin: 0,\n display: 'inline-block',\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 '& 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 // ─── Compact mode (chat messages, comments, etc.) ─────────\n [`&.${contentClasses.compact}`]: {\n '> * + *': { marginTop: 0, marginBottom: 2 },\n '& > :first-of-type:not(p)': { marginTop: 4 },\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 { type ReactNode, type ComponentType, Fragment } 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// 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// Mark rendering\n// ---------------------------------------------------------------------------\n\nfunction renderMarks(text: string, marks: TipTapMark[] = []): 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 return (\n <a href={mark.attrs?.href} target={mark.attrs?.target ?? '_blank'} rel=\"noopener noreferrer\">\n {acc}\n </a>\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 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// 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 <Fragment key={index}>{renderMarks(node.text ?? '', node.marks)}</Fragment>;\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 const 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 const language = node.attrs?.language;\n const code = node.content?.map((n) => n.text ?? '').join('\\n') ?? '';\n return (\n <div key={index} className={contentClasses.codeBlock}>\n <pre>\n <code className={language ? `language-${language}` : undefined}>{code}</code>\n </pre>\n </div>\n );\n }\n\n case 'horizontalRule':\n return <hr key={index} />;\n\n case 'image':\n return (\n <img\n key={index}\n src={node.attrs?.src}\n alt={node.attrs?.alt ?? ''}\n title={node.attrs?.title}\n className={contentClasses.image}\n />\n );\n\n case 'hardBreak':\n return <br key={index} />;\n\n // ─── Table ──────────────────────────────────────────────\n case 'table':\n return (\n <div key={index} style={{ overflowX: 'auto' }}>\n <table>{node.content?.map(renderNode)}</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 const src = node.attrs?.src;\n if (!src) return null;\n return (\n <div key={index} style={{ position: 'relative', paddingBottom: '56.25%', height: 0, marginBottom: '1.25rem' }}>\n <iframe\n src={src}\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\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\nexport function TipTapRenderer({ content, className, sx, compact }: TipTapRendererProps) {\n if (!content || !('content' in content) || !Array.isArray(content.content)) {\n return null;\n }\n\n return (\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 );\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 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\nconst defaultRehypePlugins: NonNullable<Options['rehypePlugins']> = [rehypeRaw, rehypeHighlight];\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// 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 — markdown or HTML\n if (typeof content === 'string') {\n if (!content.trim()) return null;\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 activeKey = useMemo(() => resolveActiveKey(value), [value]);\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 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 onChange(customAmount * UNIT_SECONDS[customUnit]);\n return;\n }\n const preset = PRESETS.find((p) => p.key === newKey);\n if (preset) onChange(preset.value);\n },\n [onChange, customAmount, customUnit]\n );\n\n const handleCustomAmountChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = parseInt(e.target.value, 10);\n const clamped = Number.isFinite(raw) && raw > 0 ? raw : 1;\n setCustomAmount(clamped);\n onChange(clamped * UNIT_SECONDS[customUnit]);\n },\n [onChange, customUnit]\n );\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={isCustom ? CUSTOM_KEY : 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 '&:not(:first-of-type)': {\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={customAmount}\n onChange={handleCustomAmountChange}\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\n <Card variant=\"outlined\" sx={{ p: 3 }}>\n <Stack direction=\"row\" alignItems=\"center\" spacing={1.5} sx={{ mb: 2 }}>\n <Typography variant=\"h6\" fontWeight={700}>\n {version}\n </Typography>\n {badge && <Chip label={badge} size=\"small\" color=\"primary\" variant=\"soft\" />}\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ ml: 'auto !important' }}>\n {date}\n </Typography>\n </Stack>\n\n {children}\n </Card>\n </Box>\n );\n}\n","/**\n * Ref Utilities\n *\n * Utilities for working with React refs.\n *\n * @module @omnitron-dev/prism/utils/refs\n */\n\nimport type { MutableRefObject, RefCallback, Ref } from 'react';\n\n/**\n * Supported ref types for merging.\n */\nexport type MergeableRef<T> = Ref<T> | RefCallback<T> | MutableRefObject<T> | null | undefined;\n\n/**\n * Merge multiple refs into a single callback ref.\n * Useful when you need to pass a ref to a component that also needs\n * to be used by a parent component or hook.\n *\n * @example\n * ```tsx\n * const Component = forwardRef((props, ref) => {\n * const localRef = useRef<HTMLDivElement>(null);\n * const mergedRef = mergeRefs(ref, localRef);\n * return <div ref={mergedRef} />;\n * });\n * ```\n *\n * @param refs - Array of refs to merge\n * @returns A callback ref that updates all provided refs\n */\nexport function mergeRefs<T>(...refs: MergeableRef<T>[]): RefCallback<T> {\n return (value: T | null) => {\n for (const ref of refs) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref != null) {\n (ref as MutableRefObject<T | null>).current = value;\n }\n }\n };\n}\n\n/**\n * Create a ref setter that can be used with useImperativeHandle.\n * Useful for exposing a subset of methods from a ref.\n *\n * @example\n * ```tsx\n * const Component = forwardRef<API, Props>((props, ref) => {\n * const inputRef = useRef<HTMLInputElement>(null);\n *\n * useImperativeHandle(ref, () => ({\n * focus: () => inputRef.current?.focus(),\n * clear: () => { if (inputRef.current) inputRef.current.value = ''; },\n * }), []);\n *\n * return <input ref={inputRef} />;\n * });\n * ```\n *\n * @param ref - The ref to set\n * @param value - The value to set\n */\nexport function setRef<T>(ref: MergeableRef<T>, value: T | null): void {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref != null) {\n (ref as MutableRefObject<T | null>).current = value;\n }\n}\n\n/**\n * Check if a ref has a current value.\n *\n * @param ref - The ref to check\n * @returns True if the ref has a current value\n */\nexport function hasRefValue<T>(ref: MergeableRef<T>): ref is MutableRefObject<NonNullable<T>> {\n return ref != null && typeof ref !== 'function' && ref.current != null;\n}\n","/**\n * Number Formatting Utilities\n *\n * Locale-aware number formatting utilities.\n *\n * @module @omnitron-dev/prism/utils/format-number\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface FormatNumberOptions extends Intl.NumberFormatOptions {\n /** Locale for formatting (default: 'en-US') */\n locale?: string;\n}\n\nexport interface FormatCurrencyOptions extends FormatNumberOptions {\n /** Currency code (default: 'USD') */\n currency?: string;\n}\n\n// =============================================================================\n// NUMBER FORMATTING\n// =============================================================================\n\n/**\n * Format a number with locale-aware formatting.\n *\n * @example\n * ```ts\n * fNumber(1234567.89)\n * // => \"1,234,567.89\"\n *\n * fNumber(1234567.89, { locale: 'de-DE' })\n * // => \"1.234.567,89\"\n *\n * fNumber(0.1234, { style: 'percent' })\n * // => \"12%\"\n * ```\n */\nexport function fNumber(value: number | string | null | undefined, options: FormatNumberOptions = {}): string {\n const { locale = 'en-US', ...formatOptions } = options;\n\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n return new Intl.NumberFormat(locale, formatOptions).format(num);\n}\n\n/**\n * Format a number as currency.\n *\n * @example\n * ```ts\n * fCurrency(1234.56)\n * // => \"$1,234.56\"\n *\n * fCurrency(1234.56, { currency: 'EUR', locale: 'de-DE' })\n * // => \"1.234,56 €\"\n *\n * fCurrency(1234.56, { currency: 'JPY' })\n * // => \"¥1,235\" (JPY has no decimal places)\n * ```\n */\nexport function fCurrency(value: number | string | null | undefined, options: FormatCurrencyOptions = {}): string {\n const { currency = 'USD', locale = 'en-US', ...formatOptions } = options;\n\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n ...formatOptions,\n }).format(num);\n}\n\n/**\n * Format a number as a percentage.\n *\n * @example\n * ```ts\n * fPercent(0.1234)\n * // => \"12.34%\"\n *\n * fPercent(0.1234, { maximumFractionDigits: 0 })\n * // => \"12%\"\n *\n * fPercent(1.5)\n * // => \"150%\"\n * ```\n */\nexport function fPercent(value: number | string | null | undefined, options: FormatNumberOptions = {}): string {\n const { locale = 'en-US', ...formatOptions } = options;\n\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n return new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n ...formatOptions,\n }).format(num);\n}\n\n/**\n * Shorten a large number with K, M, B suffixes.\n *\n * @example\n * ```ts\n * fShortenNumber(1234)\n * // => \"1.23K\"\n *\n * fShortenNumber(1234567)\n * // => \"1.23M\"\n *\n * fShortenNumber(1234567890)\n * // => \"1.23B\"\n *\n * fShortenNumber(1234567890000)\n * // => \"1.23T\"\n * ```\n */\nexport function fShortenNumber(value: number | string | null | undefined, decimals: number = 2): string {\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n const absNum = Math.abs(num);\n\n if (absNum >= 1e12) {\n return `${(num / 1e12).toFixed(decimals)}T`;\n }\n if (absNum >= 1e9) {\n return `${(num / 1e9).toFixed(decimals)}B`;\n }\n if (absNum >= 1e6) {\n return `${(num / 1e6).toFixed(decimals)}M`;\n }\n if (absNum >= 1e3) {\n return `${(num / 1e3).toFixed(decimals)}K`;\n }\n\n return num.toFixed(decimals);\n}\n\n/**\n * Format bytes to human-readable size.\n *\n * @example\n * ```ts\n * fBytes(1024)\n * // => \"1 KB\"\n *\n * fBytes(1048576)\n * // => \"1 MB\"\n *\n * fBytes(1073741824)\n * // => \"1 GB\"\n * ```\n */\nexport function fBytes(bytes: number | string | null | undefined, decimals: number = 2): string {\n if (bytes === null || bytes === undefined || bytes === '') {\n return '';\n }\n\n const num = typeof bytes === 'string' ? parseFloat(bytes) : bytes;\n\n if (Number.isNaN(num) || num === 0) {\n return '0 Bytes';\n }\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const i = Math.floor(Math.log(Math.abs(num)) / Math.log(k));\n\n return `${(num / Math.pow(k, i)).toFixed(decimals)} ${sizes[i]}`;\n}\n\n/**\n * Format number with ordinal suffix (1st, 2nd, 3rd, etc.)\n *\n * @example\n * ```ts\n * fOrdinal(1)\n * // => \"1st\"\n *\n * fOrdinal(22)\n * // => \"22nd\"\n *\n * fOrdinal(33)\n * // => \"33rd\"\n *\n * fOrdinal(44)\n * // => \"44th\"\n * ```\n */\nexport function fOrdinal(value: number | null | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const num = Math.abs(Math.floor(value));\n const suffixes = ['th', 'st', 'nd', 'rd'];\n const remainder = num % 100;\n\n const suffix = suffixes[(remainder - 20) % 10] || suffixes[remainder] || suffixes[0];\n\n return `${value}${suffix}`;\n}\n\n/**\n * Format a number with decimal places.\n *\n * @example\n * ```ts\n * fDecimal(1234.5678)\n * // => \"1234.57\"\n *\n * fDecimal(1234.5678, 4)\n * // => \"1234.5678\"\n *\n * fDecimal(1234)\n * // => \"1234.00\"\n * ```\n */\nexport function fDecimal(value: number | string | null | undefined, decimals: number = 2): string {\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n return num.toFixed(decimals);\n}\n\n// =============================================================================\n// PERCENTAGE CALCULATIONS (Aurora pattern)\n// =============================================================================\n\n/**\n * Calculate percentage of a value relative to a total.\n *\n * @param value - The part value\n * @param total - The total value\n * @param decimals - Decimal places (default: 0)\n * @returns Percentage number (0-100)\n *\n * @example\n * ```ts\n * getPercentage(25, 100)\n * // => 25\n *\n * getPercentage(1, 3)\n * // => 33\n *\n * getPercentage(1, 3, 2)\n * // => 33.33\n *\n * getPercentage(50, 200)\n * // => 25\n * ```\n */\nexport function getPercentage(value: number, total: number, decimals: number = 0): number {\n if (total === 0) return 0;\n const percentage = (value / total) * 100;\n return Number(percentage.toFixed(decimals));\n}\n\n/**\n * Calculate percentage change between two values.\n *\n * @param current - Current value\n * @param previous - Previous value\n * @param decimals - Decimal places (default: 0)\n * @returns Percentage change (positive = increase, negative = decrease)\n *\n * @example\n * ```ts\n * calculatePercentageChange(150, 100)\n * // => 50 (50% increase)\n *\n * calculatePercentageChange(50, 100)\n * // => -50 (50% decrease)\n *\n * calculatePercentageChange(100, 100)\n * // => 0 (no change)\n *\n * calculatePercentageChange(120, 100, 1)\n * // => 20.0\n * ```\n */\nexport function calculatePercentageChange(current: number, previous: number, decimals: number = 0): number {\n if (previous === 0) return current === 0 ? 0 : 100;\n const change = ((current - previous) / Math.abs(previous)) * 100;\n return Number(change.toFixed(decimals));\n}\n\n/**\n * Get currency symbol for a currency code.\n *\n * @param currencyCode - ISO 4217 currency code (e.g., 'USD', 'EUR')\n * @param locale - Locale for formatting (default: 'en-US')\n * @returns Currency symbol (e.g., '$', '€', '¥')\n *\n * @example\n * ```ts\n * getCurrencySymbol('USD')\n * // => \"$\"\n *\n * getCurrencySymbol('EUR')\n * // => \"€\"\n *\n * getCurrencySymbol('JPY')\n * // => \"¥\"\n *\n * getCurrencySymbol('GBP')\n * // => \"£\"\n * ```\n */\nexport function getCurrencySymbol(currencyCode: string, locale: string = 'en-US'): string {\n const parts = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n })\n .formatToParts(0)\n .find((part) => part.type === 'currency');\n\n return parts?.value ?? currencyCode;\n}\n\n/**\n * Format a number with +/- sign prefix.\n *\n * @param value - Number to format\n * @param options - Formatting options\n * @returns Formatted string with sign\n *\n * @example\n * ```ts\n * fNumberWithSign(25)\n * // => \"+25\"\n *\n * fNumberWithSign(-25)\n * // => \"-25\"\n *\n * fNumberWithSign(0)\n * // => \"0\"\n *\n * fNumberWithSign(25.5, { maximumFractionDigits: 1 })\n * // => \"+25.5\"\n * ```\n */\nexport function fNumberWithSign(value: number | string | null | undefined, options: FormatNumberOptions = {}): string {\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n const formatted = fNumber(Math.abs(num), options);\n if (num > 0) return `+${formatted}`;\n if (num < 0) return `-${formatted}`;\n return formatted;\n}\n\n/**\n * Format a number as compact notation (1K, 1M, 1B).\n * Uses Intl.NumberFormat with compact notation.\n *\n * @example\n * ```ts\n * fCompact(1234)\n * // => \"1.2K\"\n *\n * fCompact(1234567)\n * // => \"1.2M\"\n *\n * fCompact(1234567890)\n * // => \"1.2B\"\n * ```\n */\nexport function fCompact(value: number | string | null | undefined, options: FormatNumberOptions = {}): string {\n const { locale = 'en-US', ...formatOptions } = options;\n\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n compactDisplay: 'short',\n maximumFractionDigits: 1,\n ...formatOptions,\n }).format(num);\n}\n","/**\n * Date Formatting Utilities\n *\n * Locale-aware date formatting utilities using Intl.DateTimeFormat.\n * For more complex formatting, consider using dayjs or date-fns.\n *\n * @module @omnitron-dev/prism/utils/format-date\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type DateInput = Date | string | number | null | undefined;\n\nexport interface FormatDateOptions extends Intl.DateTimeFormatOptions {\n /** Locale for formatting (default: 'en-US') */\n locale?: string;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Parse various date inputs into a Date object.\n */\nfunction parseDate(input: DateInput): Date | null {\n if (input === null || input === undefined) {\n return null;\n }\n\n if (input instanceof Date) {\n return input;\n }\n\n const date = new Date(input);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\n// =============================================================================\n// DATE FORMATTING\n// =============================================================================\n\n/**\n * Format a date with locale-aware formatting.\n *\n * @example\n * ```ts\n * fDate(new Date())\n * // => \"Jan 15, 2025\"\n *\n * fDate(new Date(), { locale: 'ru-RU' })\n * // => \"15 янв. 2025 г.\"\n *\n * fDate('2025-01-15')\n * // => \"Jan 15, 2025\"\n * ```\n */\nexport function fDate(date: DateInput, options: FormatDateOptions = {}): string {\n const { locale = 'en-US', ...formatOptions } = options;\n\n const parsed = parseDate(date);\n if (!parsed) return '';\n\n return new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n ...formatOptions,\n }).format(parsed);\n}\n\n/**\n * Format a date with time.\n *\n * @example\n * ```ts\n * fDateTime(new Date())\n * // => \"Jan 15, 2025, 2:30 PM\"\n *\n * fDateTime(new Date(), { hour12: false })\n * // => \"Jan 15, 2025, 14:30\"\n * ```\n */\nexport function fDateTime(date: DateInput, options: FormatDateOptions = {}): string {\n const { locale = 'en-US', ...formatOptions } = options;\n\n const parsed = parseDate(date);\n if (!parsed) return '';\n\n return new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n ...formatOptions,\n }).format(parsed);\n}\n\n/**\n * Format time only.\n *\n * @example\n * ```ts\n * fTime(new Date())\n * // => \"2:30 PM\"\n *\n * fTime(new Date(), { hour12: false })\n * // => \"14:30\"\n *\n * fTime(new Date(), { second: 'numeric' })\n * // => \"2:30:45 PM\"\n * ```\n */\nexport function fTime(date: DateInput, options: FormatDateOptions = {}): string {\n const { locale = 'en-US', ...formatOptions } = options;\n\n const parsed = parseDate(date);\n if (!parsed) return '';\n\n return new Intl.DateTimeFormat(locale, {\n hour: 'numeric',\n minute: 'numeric',\n ...formatOptions,\n }).format(parsed);\n}\n\n/**\n * Format a date as ISO string (YYYY-MM-DD).\n *\n * @example\n * ```ts\n * fDateISO(new Date())\n * // => \"2025-01-15\"\n * ```\n */\nexport function fDateISO(date: DateInput): string {\n const parsed = parseDate(date);\n if (!parsed) return '';\n\n return parsed.toISOString().split('T')[0];\n}\n\n/**\n * Format a timestamp as relative time (e.g., \"2 hours ago\").\n *\n * @example\n * ```ts\n * fRelativeTime(new Date(Date.now() - 3600000))\n * // => \"1 hour ago\"\n *\n * fRelativeTime(new Date(Date.now() + 86400000))\n * // => \"in 1 day\"\n *\n * fRelativeTime(new Date(Date.now() - 86400000 * 7))\n * // => \"1 week ago\"\n * ```\n */\nexport function fRelativeTime(date: DateInput, options: { locale?: string } = {}): string {\n const { locale = 'en-US' } = options;\n\n const parsed = parseDate(date);\n if (!parsed) return '';\n\n const now = new Date();\n const diffMs = parsed.getTime() - now.getTime();\n const diffSeconds = Math.round(diffMs / 1000);\n const diffMinutes = Math.round(diffSeconds / 60);\n const diffHours = Math.round(diffMinutes / 60);\n const diffDays = Math.round(diffHours / 24);\n const diffWeeks = Math.round(diffDays / 7);\n const diffMonths = Math.round(diffDays / 30);\n const diffYears = Math.round(diffDays / 365);\n\n const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });\n\n if (Math.abs(diffSeconds) < 60) {\n return rtf.format(diffSeconds, 'second');\n }\n if (Math.abs(diffMinutes) < 60) {\n return rtf.format(diffMinutes, 'minute');\n }\n if (Math.abs(diffHours) < 24) {\n return rtf.format(diffHours, 'hour');\n }\n if (Math.abs(diffDays) < 7) {\n return rtf.format(diffDays, 'day');\n }\n if (Math.abs(diffWeeks) < 4) {\n return rtf.format(diffWeeks, 'week');\n }\n if (Math.abs(diffMonths) < 12) {\n return rtf.format(diffMonths, 'month');\n }\n return rtf.format(diffYears, 'year');\n}\n\n/**\n * Format a duration in milliseconds to human-readable string.\n *\n * @example\n * ```ts\n * fDuration(3661000)\n * // => \"1h 1m 1s\"\n *\n * fDuration(90000)\n * // => \"1m 30s\"\n *\n * fDuration(1000)\n * // => \"1s\"\n * ```\n */\nexport function fDuration(ms: number | null | undefined): string {\n if (ms === null || ms === undefined || ms < 0) return '';\n\n const seconds = Math.floor((ms / 1000) % 60);\n const minutes = Math.floor((ms / (1000 * 60)) % 60);\n const hours = Math.floor((ms / (1000 * 60 * 60)) % 24);\n const days = Math.floor(ms / (1000 * 60 * 60 * 24));\n\n const parts: string[] = [];\n\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (seconds > 0 || parts.length === 0) parts.push(`${seconds}s`);\n\n return parts.join(' ');\n}\n\n/**\n * Check if a date is today.\n *\n * @example\n * ```ts\n * isToday(new Date())\n * // => true\n *\n * isToday(new Date('2020-01-01'))\n * // => false\n * ```\n */\nexport function isToday(date: DateInput): boolean {\n const parsed = parseDate(date);\n if (!parsed) return false;\n\n const today = new Date();\n return (\n parsed.getDate() === today.getDate() &&\n parsed.getMonth() === today.getMonth() &&\n parsed.getFullYear() === today.getFullYear()\n );\n}\n\n/**\n * Check if a date is yesterday.\n */\nexport function isYesterday(date: DateInput): boolean {\n const parsed = parseDate(date);\n if (!parsed) return false;\n\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n\n return (\n parsed.getDate() === yesterday.getDate() &&\n parsed.getMonth() === yesterday.getMonth() &&\n parsed.getFullYear() === yesterday.getFullYear()\n );\n}\n\n/**\n * Check if a date is within the current week.\n */\nexport function isThisWeek(date: DateInput): boolean {\n const parsed = parseDate(date);\n if (!parsed) return false;\n\n const now = new Date();\n const weekStart = new Date(now);\n weekStart.setDate(now.getDate() - now.getDay());\n weekStart.setHours(0, 0, 0, 0);\n\n const weekEnd = new Date(weekStart);\n weekEnd.setDate(weekStart.getDate() + 6);\n weekEnd.setHours(23, 59, 59, 999);\n\n return parsed >= weekStart && parsed <= weekEnd;\n}\n\n/**\n * Check if a date is in the past.\n */\nexport function isPast(date: DateInput): boolean {\n const parsed = parseDate(date);\n if (!parsed) return false;\n\n return parsed.getTime() < Date.now();\n}\n\n/**\n * Check if a date is in the future.\n */\nexport function isFuture(date: DateInput): boolean {\n const parsed = parseDate(date);\n if (!parsed) return false;\n\n return parsed.getTime() > Date.now();\n}\n\n/**\n * Get the difference between two dates in days.\n */\nexport function diffInDays(date1: DateInput, date2: DateInput): number {\n const d1 = parseDate(date1);\n const d2 = parseDate(date2);\n\n if (!d1 || !d2) return 0;\n\n const diffTime = Math.abs(d2.getTime() - d1.getTime());\n return Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n}\n\n// =============================================================================\n// DATE RANGE UTILITIES (Aurora pattern)\n// =============================================================================\n\n/** One day in milliseconds */\nconst DAY_MS = 1000 * 60 * 60 * 24;\n\n/**\n * Generate an array of dates between start and end.\n *\n * @param startDate - Start date\n * @param endDate - End date\n * @param interval - Interval in milliseconds (default: 1 day)\n * @returns Array of Date objects\n *\n * @example\n * ```ts\n * const dates = getDates(\n * new Date('2025-01-01'),\n * new Date('2025-01-07')\n * );\n * // => [Date(Jan 1), Date(Jan 2), ..., Date(Jan 7)]\n *\n * // With custom interval (every 2 days)\n * const dates = getDates(\n * new Date('2025-01-01'),\n * new Date('2025-01-07'),\n * DAY_MS * 2\n * );\n * // => [Date(Jan 1), Date(Jan 3), Date(Jan 5), Date(Jan 7)]\n * ```\n */\nexport function getDates(startDate: DateInput, endDate: DateInput, interval: number = DAY_MS): Date[] {\n const start = parseDate(startDate);\n const end = parseDate(endDate);\n\n if (!start || !end) return [];\n\n const duration = +end - +start;\n const steps = Math.floor(duration / interval);\n\n return Array.from({ length: steps + 1 }, (_, i) => new Date(start.valueOf() + interval * i));\n}\n\n/**\n * Duration preset for getPastDates.\n */\nexport type DateDurationPreset = 'week' | 'month' | 'quarter' | 'year';\n\n/**\n * Get an array of dates for past duration.\n *\n * @param duration - Duration preset or number of days\n * @returns Array of Date objects from past to present\n *\n * @example\n * ```ts\n * // Last 7 days\n * const weekDates = getPastDates('week');\n *\n * // Last 30 days\n * const monthDates = getPastDates('month');\n *\n * // Last 90 days\n * const quarterDates = getPastDates('quarter');\n *\n * // Last 365 days\n * const yearDates = getPastDates('year');\n *\n * // Custom: last 14 days\n * const customDates = getPastDates(14);\n * ```\n */\nexport function getPastDates(duration: DateDurationPreset | number): Date[] {\n const durationMap: Record<DateDurationPreset, number> = {\n week: 7,\n month: 30,\n quarter: 90,\n year: 365,\n };\n\n const days = typeof duration === 'number' ? duration : durationMap[duration];\n const endDate = new Date();\n const startDate = new Date();\n startDate.setDate(endDate.getDate() - days);\n\n return getDates(startDate, endDate);\n}\n\n/**\n * Get an array of dates for future duration.\n *\n * @param duration - Duration preset or number of days\n * @returns Array of Date objects from present to future\n *\n * @example\n * ```ts\n * // Next 7 days\n * const weekDates = getFutureDates('week');\n *\n * // Next 30 days\n * const monthDates = getFutureDates('month');\n *\n * // Custom: next 14 days\n * const customDates = getFutureDates(14);\n * ```\n */\nexport function getFutureDates(duration: DateDurationPreset | number): Date[] {\n const durationMap: Record<DateDurationPreset, number> = {\n week: 7,\n month: 30,\n quarter: 90,\n year: 365,\n };\n\n const days = typeof duration === 'number' ? duration : durationMap[duration];\n const startDate = new Date();\n const endDate = new Date();\n endDate.setDate(startDate.getDate() + days);\n\n return getDates(startDate, endDate);\n}\n\n/**\n * Get start of day (midnight) for a date.\n *\n * @param date - Input date\n * @returns Date set to 00:00:00.000\n */\nexport function startOfDay(date: DateInput): Date | null {\n const parsed = parseDate(date);\n if (!parsed) return null;\n\n const result = new Date(parsed);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\n/**\n * Get end of day (23:59:59.999) for a date.\n *\n * @param date - Input date\n * @returns Date set to 23:59:59.999\n */\nexport function endOfDay(date: DateInput): Date | null {\n const parsed = parseDate(date);\n if (!parsed) return null;\n\n const result = new Date(parsed);\n result.setHours(23, 59, 59, 999);\n return result;\n}\n\n/**\n * Add days to a date.\n *\n * @param date - Input date\n * @param days - Number of days to add (can be negative)\n * @returns New date with days added\n */\nexport function addDays(date: DateInput, days: number): Date | null {\n const parsed = parseDate(date);\n if (!parsed) return null;\n\n const result = new Date(parsed);\n result.setDate(result.getDate() + days);\n return result;\n}\n\n/**\n * Add months to a date.\n *\n * @param date - Input date\n * @param months - Number of months to add (can be negative)\n * @returns New date with months added\n */\nexport function addMonths(date: DateInput, months: number): Date | null {\n const parsed = parseDate(date);\n if (!parsed) return null;\n\n const result = new Date(parsed);\n result.setMonth(result.getMonth() + months);\n return result;\n}\n","/**\n * String Utilities\n *\n * Common string manipulation utilities.\n *\n * @module @omnitron-dev/prism/utils/string\n */\n\n// =============================================================================\n// TEXT FORMATTING\n// =============================================================================\n\n/**\n * Truncate text with ellipsis.\n *\n * @example\n * ```ts\n * truncate('Hello, World!', 8)\n * // => \"Hello...\"\n *\n * truncate('Short', 10)\n * // => \"Short\"\n *\n * truncate('Hello, World!', 8, '…')\n * // => \"Hello, W…\"\n * ```\n */\nexport function truncate(text: string | null | undefined, length: number, suffix: string = '...'): string {\n if (!text) return '';\n if (text.length <= length) return text;\n\n return text.slice(0, length - suffix.length) + suffix;\n}\n\n/**\n * Get initials from a name.\n *\n * @example\n * ```ts\n * getInitials('John Doe')\n * // => \"JD\"\n *\n * getInitials('Alice Bob Charlie')\n * // => \"AC\"\n *\n * getInitials('SingleName')\n * // => \"SI\"\n * ```\n */\nexport function getInitials(name: string | null | undefined): string {\n if (!name) return '';\n\n const words = name.trim().split(/\\s+/);\n\n if (words.length === 1) {\n return words[0].slice(0, 2).toUpperCase();\n }\n\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n}\n\n/**\n * Capitalize the first letter of a string.\n *\n * @example\n * ```ts\n * capitalize('hello world')\n * // => \"Hello world\"\n * ```\n */\nexport function capitalize(text: string | null | undefined): string {\n if (!text) return '';\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/**\n * Capitalize the first letter of each word.\n *\n * @example\n * ```ts\n * titleCase('hello world')\n * // => \"Hello World\"\n *\n * titleCase('the quick brown fox')\n * // => \"The Quick Brown Fox\"\n * ```\n */\nexport function titleCase(text: string | null | undefined): string {\n if (!text) return '';\n return text.replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\n/**\n * Convert string to kebab-case.\n *\n * @example\n * ```ts\n * kebabCase('Hello World')\n * // => \"hello-world\"\n *\n * kebabCase('camelCaseString')\n * // => \"camel-case-string\"\n * ```\n */\nexport function kebabCase(text: string | null | undefined): string {\n if (!text) return '';\n\n return text\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Convert string to camelCase.\n *\n * @example\n * ```ts\n * camelCase('Hello World')\n * // => \"helloWorld\"\n *\n * camelCase('kebab-case-string')\n * // => \"kebabCaseString\"\n * ```\n */\nexport function camelCase(text: string | null | undefined): string {\n if (!text) return '';\n\n return text.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (_, char) => char.toUpperCase());\n}\n\n/**\n * Convert string to snake_case.\n *\n * @example\n * ```ts\n * snakeCase('Hello World')\n * // => \"hello_world\"\n *\n * snakeCase('camelCaseString')\n * // => \"camel_case_string\"\n * ```\n */\nexport function snakeCase(text: string | null | undefined): string {\n if (!text) return '';\n\n return text\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase();\n}\n\n// =============================================================================\n// SEARCH & HIGHLIGHT\n// =============================================================================\n\n/**\n * Highlight search query in text by wrapping matches in <mark> tags.\n *\n * @example\n * ```ts\n * highlightText('Hello World', 'wor')\n * // => \"Hello <mark>Wor</mark>ld\"\n *\n * highlightText('Test Case', 'test', '<strong>', '</strong>')\n * // => \"<strong>Test</strong> Case\"\n * ```\n */\nexport function highlightText(\n text: string | null | undefined,\n query: string | null | undefined,\n openTag: string = '<mark>',\n closeTag: string = '</mark>'\n): string {\n if (!text) return '';\n if (!query) return text;\n\n const regex = new RegExp(`(${escapeRegExp(query)})`, 'gi');\n return text.replace(regex, `${openTag}$1${closeTag}`);\n}\n\n/**\n * Escape special regex characters in a string.\n *\n * @example\n * ```ts\n * escapeRegExp('test.string+with[special]chars')\n * // => \"test\\\\.string\\\\+with\\\\[special\\\\]chars\"\n * ```\n */\nexport function escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Check if a string contains a substring (case-insensitive).\n *\n * @example\n * ```ts\n * containsIgnoreCase('Hello World', 'WORLD')\n * // => true\n *\n * containsIgnoreCase('Hello World', 'foo')\n * // => false\n * ```\n */\nexport function containsIgnoreCase(text: string | null | undefined, search: string | null | undefined): boolean {\n if (!text || !search) return false;\n return text.toLowerCase().includes(search.toLowerCase());\n}\n\n// =============================================================================\n// VALIDATION\n// =============================================================================\n\n/**\n * Check if a string is empty or whitespace only.\n *\n * @example\n * ```ts\n * isBlank('')\n * // => true\n *\n * isBlank(' ')\n * // => true\n *\n * isBlank('hello')\n * // => false\n * ```\n */\nexport function isBlank(text: string | null | undefined): boolean {\n return !text || text.trim().length === 0;\n}\n\n/**\n * Check if a string is a valid email address (basic check).\n *\n * @example\n * ```ts\n * isEmail('test@example.com')\n * // => true\n *\n * isEmail('invalid')\n * // => false\n * ```\n */\nexport function isEmail(text: string | null | undefined): boolean {\n if (!text) return false;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(text);\n}\n\n/**\n * Check if a string is a valid URL (basic check).\n *\n * @example\n * ```ts\n * isUrl('https://example.com')\n * // => true\n *\n * isUrl('not-a-url')\n * // => false\n * ```\n */\nexport function isUrl(text: string | null | undefined): boolean {\n if (!text) return false;\n try {\n new URL(text);\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// GENERATION\n// =============================================================================\n\n/**\n * Generate a random string of specified length.\n *\n * @example\n * ```ts\n * randomString(8)\n * // => \"a3Bx9kPq\"\n *\n * randomString(16, 'abc123')\n * // => \"a1b3c2a1b3c2a1b3\"\n * ```\n */\nexport function randomString(\n length: number = 8,\n chars: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n): string {\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\n/**\n * Generate a UUID v4.\n *\n * @example\n * ```ts\n * uuid()\n * // => \"550e8400-e29b-41d4-a716-446655440000\"\n * ```\n */\nexport function uuid(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Generate a slug from text.\n *\n * @example\n * ```ts\n * slugify('Hello World!')\n * // => \"hello-world\"\n *\n * slugify('This is a Test String')\n * // => \"this-is-a-test-string\"\n * ```\n */\nexport function slugify(text: string | null | undefined): string {\n if (!text) return '';\n\n return text\n .toString()\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, '-') // Replace spaces with -\n .replace(/[^\\w-]+/g, '') // Remove non-word chars\n .replace(/--+/g, '-') // Replace multiple - with single -\n .replace(/^-+/, '') // Trim - from start\n .replace(/-+$/, ''); // Trim - from end\n}\n","/**\n * LocalStorage Utilities\n *\n * SSR-safe localStorage utilities with JSON serialization support.\n * Inspired by minimal-shared/utils/local-storage pattern.\n *\n * @module @omnitron-dev/prism/utils/storage\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface StorageOptions {\n /** Storage to use (default: localStorage) */\n storage?: Storage;\n /** Serialize function (default: JSON.stringify) */\n serialize?: (value: unknown) => string;\n /** Deserialize function (default: JSON.parse) */\n deserialize?: (value: string) => unknown;\n}\n\n// =============================================================================\n// AVAILABILITY CHECK\n// =============================================================================\n\n/**\n * Check if localStorage is available in the current environment.\n * Handles SSR, private browsing, and quota exceeded scenarios.\n *\n * @example\n * ```ts\n * if (localStorageAvailable()) {\n * localStorage.setItem('key', 'value');\n * }\n * ```\n */\nexport function localStorageAvailable(): boolean {\n try {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const testKey = '__storage_test__';\n window.localStorage.setItem(testKey, testKey);\n window.localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if sessionStorage is available in the current environment.\n *\n * @example\n * ```ts\n * if (sessionStorageAvailable()) {\n * sessionStorage.setItem('key', 'value');\n * }\n * ```\n */\nexport function sessionStorageAvailable(): boolean {\n try {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const testKey = '__storage_test__';\n window.sessionStorage.setItem(testKey, testKey);\n window.sessionStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// GET STORAGE\n// =============================================================================\n\n/**\n * Get a value from localStorage with automatic JSON parsing.\n * Returns defaultValue if key doesn't exist, parsing fails, or storage is unavailable.\n *\n * @param key - Storage key\n * @param defaultValue - Value to return if key doesn't exist or parsing fails\n * @param options - Storage options\n * @returns Parsed value or defaultValue\n *\n * @example\n * ```ts\n * // Simple value\n * const count = getStorage('count', 0);\n *\n * // Object value\n * const user = getStorage<User>('user', null);\n *\n * // With sessionStorage\n * const session = getStorage('session', null, {\n * storage: sessionStorage,\n * });\n * ```\n */\nexport function getStorage<T>(key: string, defaultValue: T, options: StorageOptions = {}): T {\n const { storage = typeof window !== 'undefined' ? window.localStorage : undefined, deserialize = JSON.parse } =\n options;\n\n try {\n if (!storage) {\n return defaultValue;\n }\n\n const value = storage.getItem(key);\n\n if (value === null) {\n return defaultValue;\n }\n\n return deserialize(value) as T;\n } catch {\n return defaultValue;\n }\n}\n\n// =============================================================================\n// SET STORAGE\n// =============================================================================\n\n/**\n * Set a value in localStorage with automatic JSON serialization.\n * Silently fails if storage is unavailable.\n *\n * @param key - Storage key\n * @param value - Value to store (will be JSON serialized)\n * @param options - Storage options\n * @returns true if successful, false otherwise\n *\n * @example\n * ```ts\n * // Simple value\n * setStorage('count', 42);\n *\n * // Object value\n * setStorage('user', { id: 1, name: 'John' });\n *\n * // With sessionStorage\n * setStorage('session', sessionData, {\n * storage: sessionStorage,\n * });\n * ```\n */\nexport function setStorage<T>(key: string, value: T, options: StorageOptions = {}): boolean {\n const { storage = typeof window !== 'undefined' ? window.localStorage : undefined, serialize = JSON.stringify } =\n options;\n\n try {\n if (!storage) {\n return false;\n }\n\n storage.setItem(key, serialize(value));\n return true;\n } catch {\n // Quota exceeded or other storage error\n return false;\n }\n}\n\n// =============================================================================\n// REMOVE STORAGE\n// =============================================================================\n\n/**\n * Remove a value from localStorage.\n * Silently fails if storage is unavailable.\n *\n * @param key - Storage key to remove\n * @param options - Storage options\n * @returns true if successful, false otherwise\n *\n * @example\n * ```ts\n * removeStorage('user');\n *\n * // From sessionStorage\n * removeStorage('session', { storage: sessionStorage });\n * ```\n */\nexport function removeStorage(key: string, options: Pick<StorageOptions, 'storage'> = {}): boolean {\n const { storage = typeof window !== 'undefined' ? window.localStorage : undefined } = options;\n\n try {\n if (!storage) {\n return false;\n }\n\n storage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// CLEAR STORAGE\n// =============================================================================\n\n/**\n * Clear all items from localStorage.\n * Silently fails if storage is unavailable.\n *\n * @param options - Storage options\n * @returns true if successful, false otherwise\n *\n * @example\n * ```ts\n * clearStorage();\n *\n * // Clear sessionStorage\n * clearStorage({ storage: sessionStorage });\n * ```\n */\nexport function clearStorage(options: Pick<StorageOptions, 'storage'> = {}): boolean {\n const { storage = typeof window !== 'undefined' ? window.localStorage : undefined } = options;\n\n try {\n if (!storage) {\n return false;\n }\n\n storage.clear();\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// STORAGE KEYS\n// =============================================================================\n\n/**\n * Get all keys from localStorage.\n *\n * @param options - Storage options\n * @returns Array of storage keys\n *\n * @example\n * ```ts\n * const keys = getStorageKeys();\n * // => ['user', 'settings', 'cart']\n * ```\n */\nexport function getStorageKeys(options: Pick<StorageOptions, 'storage'> = {}): string[] {\n const { storage = typeof window !== 'undefined' ? window.localStorage : undefined } = options;\n\n try {\n if (!storage) {\n return [];\n }\n\n const keys: string[] = [];\n for (let i = 0; i < storage.length; i++) {\n const key = storage.key(i);\n if (key !== null) {\n keys.push(key);\n }\n }\n return keys;\n } catch {\n return [];\n }\n}\n\n// =============================================================================\n// STORAGE SIZE\n// =============================================================================\n\n/**\n * Get approximate size of localStorage in bytes.\n *\n * @param options - Storage options\n * @returns Size in bytes\n *\n * @example\n * ```ts\n * const sizeBytes = getStorageSize();\n * console.log(`Using ${sizeBytes} bytes of localStorage`);\n * ```\n */\nexport function getStorageSize(options: Pick<StorageOptions, 'storage'> = {}): number {\n const { storage = typeof window !== 'undefined' ? window.localStorage : undefined } = options;\n\n try {\n if (!storage) {\n return 0;\n }\n\n let total = 0;\n for (let i = 0; i < storage.length; i++) {\n const key = storage.key(i);\n if (key !== null) {\n const value = storage.getItem(key) ?? '';\n // Each character is 2 bytes in JavaScript\n total += (key.length + value.length) * 2;\n }\n }\n return total;\n } catch {\n return 0;\n }\n}\n\n// =============================================================================\n// STORAGE WITH EXPIRY\n// =============================================================================\n\nexport interface StorageWithExpiryOptions extends StorageOptions {\n /** Time to live in milliseconds */\n ttl: number;\n}\n\ninterface StoredWithExpiry<T> {\n value: T;\n expiry: number;\n}\n\n/**\n * Set a value with expiration time.\n *\n * @param key - Storage key\n * @param value - Value to store\n * @param options - Options with TTL in milliseconds\n *\n * @example\n * ```ts\n * // Store for 1 hour\n * setStorageWithExpiry('session', sessionData, {\n * ttl: 60 * 60 * 1000,\n * });\n *\n * // Store for 24 hours\n * setStorageWithExpiry('cache', cacheData, {\n * ttl: 24 * 60 * 60 * 1000,\n * });\n * ```\n */\nexport function setStorageWithExpiry<T>(key: string, value: T, options: StorageWithExpiryOptions): boolean {\n const { ttl, ...storageOptions } = options;\n\n const item: StoredWithExpiry<T> = {\n value,\n expiry: Date.now() + ttl,\n };\n\n return setStorage(key, item, storageOptions);\n}\n\n/**\n * Get a value that was stored with expiration.\n * Returns defaultValue if expired or not found.\n *\n * @param key - Storage key\n * @param defaultValue - Value to return if expired or not found\n * @param options - Storage options\n *\n * @example\n * ```ts\n * const session = getStorageWithExpiry<Session>('session', null);\n * if (!session) {\n * // Session expired or doesn't exist\n * redirectToLogin();\n * }\n * ```\n */\nexport function getStorageWithExpiry<T>(key: string, defaultValue: T, options: StorageOptions = {}): T {\n const item = getStorage<StoredWithExpiry<T> | null>(key, null, options);\n\n if (!item) {\n return defaultValue;\n }\n\n if (Date.now() > item.expiry) {\n // Expired - remove the item\n removeStorage(key, options);\n return defaultValue;\n }\n\n return item.value;\n}\n","/**\n * Font Utilities\n *\n * Font family and unit conversion helpers.\n *\n * @module @omnitron-dev/prism/utils\n */\n\n/**\n * Default system font stack.\n */\nconst DEFAULT_FONT_STACK =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\"';\n\n/**\n * Create a font family string with fallback stack.\n *\n * @param {string} [fontName] - Primary font name\n * @returns {string} Font family with fallbacks\n *\n * @example\n * ```ts\n * setFont('Inter'); // '\"Inter\", -apple-system, ...'\n * setFont(); // Default system font stack\n * ```\n */\nexport function setFont(fontName?: string): string {\n if (!fontName) {\n return DEFAULT_FONT_STACK;\n }\n\n return `\"${fontName}\", ${DEFAULT_FONT_STACK}`;\n}\n\n/**\n * Convert rem to pixels.\n *\n * @param {string | number} value - Rem value (number or string like '1rem')\n * @returns {number} Value in pixels\n *\n * @example\n * ```ts\n * remToPx(1); // 16\n * remToPx('1rem'); // 16\n * remToPx(1.5); // 24\n * ```\n */\nexport function remToPx(value: string | number): number {\n const numValue = typeof value === 'string' ? parseFloat(value) : value;\n return Math.round(numValue * 16 * 100) / 100;\n}\n\n/**\n * Convert pixels to rem.\n *\n * @param {string | number} value - Pixel value (number or string like '16px')\n * @returns {string} Value in rem with unit\n *\n * @example\n * ```ts\n * pxToRem(16); // '1rem'\n * pxToRem('16px'); // '1rem'\n * pxToRem(24); // '1.5rem'\n * ```\n */\nexport function pxToRem(value: string | number): string {\n const numValue = typeof value === 'string' ? parseFloat(value) : value;\n return `${Math.round((numValue / 16) * 10000) / 10000}rem`;\n}\n\n/**\n * Create responsive font size based on viewport.\n *\n * @param {number} minSize - Minimum font size in px\n * @param {number} maxSize - Maximum font size in px\n * @param {number} [minWidth=320] - Minimum viewport width in px\n * @param {number} [maxWidth=1200] - Maximum viewport width in px\n * @returns {string} CSS clamp() value\n *\n * @example\n * ```ts\n * responsiveFontSize(14, 18);\n * // 'clamp(0.875rem, 0.7955rem + 0.3977vw, 1.125rem)'\n * ```\n */\nexport function responsiveFontSize(minSize: number, maxSize: number, minWidth = 320, maxWidth = 1200): string {\n const minRem = pxToRem(minSize);\n const maxRem = pxToRem(maxSize);\n\n const slope = (maxSize - minSize) / (maxWidth - minWidth);\n const intercept = minSize - slope * minWidth;\n\n const slopeVw = Math.round(slope * 100 * 10000) / 10000;\n const interceptRem = pxToRem(intercept);\n\n return `clamp(${minRem}, ${interceptRem} + ${slopeVw}vw, ${maxRem})`;\n}\n","/**\n * Object Utilities\n *\n * Type-safe object manipulation helpers.\n *\n * @module @omnitron-dev/prism/utils\n */\n\n/**\n * Check if an object has specific keys.\n *\n * @template T - Object type\n * @template K - Key type\n * @param {T | null | undefined} obj - Object to check\n * @param {K[]} keys - Keys to check for\n * @returns {boolean} True if object has all specified keys\n *\n * @example\n * ```ts\n * const user = { name: 'John', email: 'john@example.com' };\n * hasKeys(user, ['name', 'email']); // true\n * hasKeys(user, ['name', 'age']); // false\n * hasKeys(null, ['name']); // false\n * hasKeys(user, []); // false\n * ```\n */\nexport function hasKeys<T extends object, K extends keyof T>(obj: T | null | undefined, keys: K[]): boolean {\n if (!obj || !keys.length || typeof obj !== 'object') {\n return false;\n }\n\n return keys.every((key) => key in obj);\n}\n\n/**\n * Omit specific keys from an object.\n *\n * @template T - Object type\n * @template K - Keys to omit\n * @param {T} obj - Source object\n * @param {K[]} keys - Keys to omit\n * @returns {Omit<T, K>} New object without specified keys\n *\n * @example\n * ```ts\n * const user = { name: 'John', email: 'john@example.com', password: '...' };\n * omit(user, ['password']); // { name: 'John', email: 'john@example.com' }\n * ```\n */\nexport function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result as Omit<T, K>;\n}\n\n/**\n * Pick specific keys from an object.\n *\n * @template T - Object type\n * @template K - Keys to pick\n * @param {T} obj - Source object\n * @param {K[]} keys - Keys to pick\n * @returns {Pick<T, K>} New object with only specified keys\n *\n * @example\n * ```ts\n * const user = { name: 'John', email: 'john@example.com', password: '...' };\n * pick(user, ['name', 'email']); // { name: 'John', email: 'john@example.com' }\n * ```\n */\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/**\n * Deep clone an object.\n *\n * @template T - Object type\n * @param {T} obj - Object to clone\n * @returns {T} Deep cloned object\n *\n * @example\n * ```ts\n * const original = { a: 1, b: { c: 2 } };\n * const cloned = deepClone(original);\n * cloned.b.c = 3; // original.b.c is still 2\n * ```\n */\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as unknown as T;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T;\n }\n\n if (obj instanceof RegExp) {\n return new RegExp(obj.source, obj.flags) as unknown as T;\n }\n\n const cloned = {} as T;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = deepClone(obj[key]);\n }\n }\n return cloned;\n}\n\n/**\n * Check if a value is empty (null, undefined, empty string, empty array, empty object).\n *\n * @param {unknown} value - Value to check\n * @returns {boolean} True if empty\n *\n * @example\n * ```ts\n * isEmpty(null); // true\n * isEmpty(''); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty('hello'); // false\n * isEmpty([1]); // false\n * ```\n */\nexport function isEmpty(value: unknown): boolean {\n if (value == null) {\n return true;\n }\n\n if (typeof value === 'string' || Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (typeof value === 'object') {\n return Object.keys(value as object).length === 0;\n }\n\n return false;\n}\n","/**\n * RTL (Right-to-Left) Utilities\n *\n * Helpers for RTL layout support and CSS transformation control.\n *\n * @module @omnitron-dev/prism/utils\n */\n\n/**\n * Prevents automatic RTL (right-to-left) flipping of a CSS declaration.\n *\n * Many CSS-in-JS libraries and RTL plugins automatically flip directional\n * CSS properties (like margin-left → margin-right) for RTL layouts.\n * Use this function to prevent that behavior for specific declarations.\n *\n * Appends the `\\/* @noflip *\\/` comment which is recognized by:\n * - stylis (used by Emotion/styled-components)\n * - rtlcss\n * - cssjanus\n *\n * @param cssValue - A CSS declaration string (e.g., \"margin-left: 10px\")\n * @returns The same declaration with `\\/* @noflip *\\/` appended\n *\n * @example\n * ```tsx\n * import { noRtlFlip } from '@omnitron-dev/prism/utils';\n *\n * // In sx prop or styled components\n * const styles = {\n * // This margin-left will stay as margin-left even in RTL\n * marginLeft: noRtlFlip('10px'),\n *\n * // Or for full declarations\n * transform: noRtlFlip('translateX(100px)'),\n * };\n *\n * // Common use case: icons that shouldn't flip\n * <ChevronIcon sx={{ transform: noRtlFlip('rotate(0deg)') }} />\n *\n * // Progress indicators that fill from left regardless of RTL\n * <ProgressBar sx={{ left: noRtlFlip('0'), right: 'auto' }} />\n * ```\n */\nexport function noRtlFlip(cssValue: unknown): string {\n if (typeof cssValue !== 'string') {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[noRtlFlip] Invalid CSS value provided:', cssValue);\n }\n return '';\n }\n\n const trimmed = cssValue.trim();\n\n if (!trimmed) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[noRtlFlip] Empty CSS value provided');\n }\n return '';\n }\n\n // Already has the noflip comment\n if (trimmed.includes('/* @noflip */')) {\n return trimmed;\n }\n\n return `${trimmed} /* @noflip */`;\n}\n\n/**\n * Check if the current document direction is RTL.\n *\n * @returns True if the document direction is RTL\n *\n * @example\n * ```tsx\n * const isRtl = isRtlDirection();\n *\n * // Conditional styling\n * const style = {\n * marginLeft: isRtl ? '0' : '10px',\n * marginRight: isRtl ? '10px' : '0',\n * };\n * ```\n */\nexport function isRtlDirection(): boolean {\n if (typeof document === 'undefined') {\n return false;\n }\n\n return (\n document.documentElement.dir === 'rtl' ||\n document.body.dir === 'rtl' ||\n document.documentElement.getAttribute('dir') === 'rtl'\n );\n}\n\n/**\n * Get the appropriate directional property name based on RTL state.\n *\n * @param property - Base property name (e.g., 'left', 'marginLeft')\n * @param isRtl - Whether the layout is RTL\n * @returns The appropriate property name\n *\n * @example\n * ```tsx\n * const prop = getDirectionalProperty('left', isRtl);\n * // Returns 'right' if isRtl, 'left' otherwise\n * ```\n */\nexport function getDirectionalProperty(\n property: 'left' | 'right' | 'marginLeft' | 'marginRight' | 'paddingLeft' | 'paddingRight',\n isRtl: boolean\n): string {\n const mappings: Record<string, string> = {\n left: isRtl ? 'right' : 'left',\n right: isRtl ? 'left' : 'right',\n marginLeft: isRtl ? 'marginRight' : 'marginLeft',\n marginRight: isRtl ? 'marginLeft' : 'marginRight',\n paddingLeft: isRtl ? 'paddingRight' : 'paddingLeft',\n paddingRight: isRtl ? 'paddingLeft' : 'paddingRight',\n };\n\n return mappings[property] ?? property;\n}\n","/**\n * AsyncLock Utility\n *\n * Prevents race conditions in async operations like token refresh.\n * Ensures only one operation runs at a time, with subsequent calls\n * waiting for and sharing the result of the in-flight operation.\n *\n * @module @omnitron-dev/prism/utils\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Options for AsyncLock.\n */\nexport interface AsyncLockOptions {\n /** Timeout in milliseconds for the lock acquisition (default: 30000) */\n timeout?: number;\n /** Custom error message for timeout */\n timeoutMessage?: string;\n}\n\n/**\n * Result from a locked operation.\n */\nexport interface AsyncLockResult<T> {\n /** The result value */\n value: T;\n /** Whether this call executed the operation (vs waiting for another) */\n wasExecutor: boolean;\n}\n\n/**\n * State of the lock.\n */\nexport type AsyncLockState = 'idle' | 'locked' | 'releasing';\n\n// =============================================================================\n// ASYNC LOCK CLASS\n// =============================================================================\n\n/**\n * AsyncLock prevents race conditions in concurrent async operations.\n *\n * Use cases:\n * - Token refresh: Multiple API calls fail simultaneously, only one should refresh\n * - Resource initialization: Expensive setup should happen once\n * - Cache population: Prevent thundering herd problem\n *\n * @example\n * ```tsx\n * import { AsyncLock } from '@omnitron-dev/prism/utils';\n *\n * const tokenRefreshLock = new AsyncLock({ timeout: 10000 });\n *\n * async function refreshToken(): Promise<string> {\n * const { value: newToken } = await tokenRefreshLock.acquire(\n * 'refresh-token',\n * async () => {\n * // This only runs once even if called concurrently\n * const response = await fetch('/auth/refresh', { method: 'POST' });\n * const data = await response.json();\n * return data.accessToken;\n * }\n * );\n * return newToken;\n * }\n *\n * // Multiple concurrent calls share the same result\n * const [token1, token2, token3] = await Promise.all([\n * refreshToken(), // Executes the actual refresh\n * refreshToken(), // Waits for first to complete\n * refreshToken(), // Waits for first to complete\n * ]);\n * // token1 === token2 === token3\n * ```\n */\nexport class AsyncLock {\n private locks: Map<string, Promise<unknown>> = new Map();\n private resolvers: Map<string, (value: unknown) => void> = new Map();\n private rejecters: Map<string, (error: unknown) => void> = new Map();\n private options: Required<AsyncLockOptions>;\n\n constructor(options: AsyncLockOptions = {}) {\n this.options = {\n timeout: options.timeout ?? 30000,\n timeoutMessage: options.timeoutMessage ?? 'Lock acquisition timed out',\n };\n }\n\n /**\n * Current state of a specific lock.\n */\n getState(key: string): AsyncLockState {\n return this.locks.has(key) ? 'locked' : 'idle';\n }\n\n /**\n * Check if a specific lock is currently held.\n */\n isLocked(key: string): boolean {\n return this.locks.has(key);\n }\n\n /**\n * Get all currently active lock keys.\n */\n getActiveLocks(): string[] {\n return Array.from(this.locks.keys());\n }\n\n /**\n * Acquire the lock and execute the operation.\n * If the lock is already held, waits for the existing operation.\n *\n * @param key - Unique identifier for this lock\n * @param operation - Async operation to execute\n * @returns Result with the value and whether this call was the executor\n */\n async acquire<T>(key: string, operation: () => Promise<T>): Promise<AsyncLockResult<T>> {\n // If lock exists, wait for it\n const existingLock = this.locks.get(key);\n if (existingLock) {\n const value = await this.waitWithTimeout(existingLock, key);\n return { value: value as T, wasExecutor: false };\n }\n\n // Create new lock\n let resolvePromise: (value: unknown) => void;\n let rejectPromise: (error: unknown) => void;\n\n const lockPromise = new Promise<unknown>((resolve, reject) => {\n resolvePromise = resolve;\n rejectPromise = reject;\n });\n\n this.locks.set(key, lockPromise);\n this.resolvers.set(key, resolvePromise!);\n this.rejecters.set(key, rejectPromise!);\n\n try {\n const result = await operation();\n\n // Resolve for all waiters\n const resolver = this.resolvers.get(key);\n if (resolver) {\n resolver(result);\n }\n\n return { value: result, wasExecutor: true };\n } catch (error) {\n // Reject for all waiters\n const rejecter = this.rejecters.get(key);\n if (rejecter) {\n rejecter(error);\n }\n\n throw error;\n } finally {\n // Clean up\n this.locks.delete(key);\n this.resolvers.delete(key);\n this.rejecters.delete(key);\n }\n }\n\n /**\n * Try to acquire the lock without waiting.\n * Returns immediately if lock is held.\n *\n * @param key - Unique identifier for this lock\n * @param operation - Async operation to execute\n * @returns Result or null if lock was already held\n */\n async tryAcquire<T>(key: string, operation: () => Promise<T>): Promise<AsyncLockResult<T> | null> {\n if (this.isLocked(key)) {\n return null;\n }\n return this.acquire(key, operation);\n }\n\n /**\n * Force release a lock (use with caution).\n * This will reject all waiters with the provided error.\n */\n forceRelease(key: string, error?: Error): void {\n const rejecter = this.rejecters.get(key);\n if (rejecter) {\n rejecter(error ?? new Error('Lock forcefully released'));\n }\n this.locks.delete(key);\n this.resolvers.delete(key);\n this.rejecters.delete(key);\n }\n\n /**\n * Clear all locks (use with caution, e.g., on logout).\n */\n clearAll(error?: Error): void {\n for (const key of this.locks.keys()) {\n this.forceRelease(key, error);\n }\n }\n\n /**\n * Wait for a promise with timeout.\n */\n private async waitWithTimeout<T>(promise: Promise<T>, key: string): Promise<T> {\n const { timeout, timeoutMessage } = this.options;\n\n if (timeout <= 0) {\n return promise;\n }\n\n return Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new AsyncLockTimeoutError(`${timeoutMessage} (key: ${key})`));\n }, timeout);\n }),\n ]);\n }\n}\n\n// =============================================================================\n// ERROR CLASSES\n// =============================================================================\n\n/**\n * Error thrown when lock acquisition times out.\n */\nexport class AsyncLockTimeoutError extends Error {\n readonly name = 'AsyncLockTimeoutError';\n\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, AsyncLockTimeoutError.prototype);\n }\n}\n\n// =============================================================================\n// FACTORY FUNCTIONS\n// =============================================================================\n\n/**\n * Create a singleton AsyncLock instance for a specific use case.\n *\n * @example\n * ```tsx\n * import { createAsyncLock } from '@omnitron-dev/prism/utils';\n *\n * // Create a singleton lock for token refresh\n * const tokenLock = createAsyncLock({ timeout: 10000 });\n *\n * // Use in multiple places - same lock instance\n * async function apiCall() {\n * if (isTokenExpired()) {\n * await tokenLock.acquire('token', refreshToken);\n * }\n * // Make API call...\n * }\n * ```\n */\nexport function createAsyncLock(options?: AsyncLockOptions): AsyncLock {\n return new AsyncLock(options);\n}\n\n/**\n * Create a pre-configured lock for token refresh operations.\n * Uses sensible defaults for auth token refresh scenarios.\n */\nexport function createTokenRefreshLock(): AsyncLock {\n return new AsyncLock({\n timeout: 15000,\n timeoutMessage: 'Token refresh timed out',\n });\n}\n\n// =============================================================================\n// UTILITY FUNCTIONS\n// =============================================================================\n\n/**\n * Execute an operation with automatic locking.\n * Convenience function for one-off locked operations.\n *\n * @example\n * ```tsx\n * import { withLock } from '@omnitron-dev/prism/utils';\n *\n * const result = await withLock('init-cache', async () => {\n * const data = await fetchData();\n * cache.set('data', data);\n * return data;\n * });\n * ```\n */\nconst globalLock = new AsyncLock();\n\nexport async function withLock<T>(key: string, operation: () => Promise<T>, options?: AsyncLockOptions): Promise<T> {\n const lock = options ? new AsyncLock(options) : globalLock;\n const { value } = await lock.acquire(key, operation);\n return value;\n}\n\n/**\n * Decorator factory for methods that should be locked.\n * Use with class methods to ensure single execution.\n *\n * @example\n * ```tsx\n * import { locked } from '@omnitron-dev/prism/utils';\n *\n * class AuthService {\n * @locked('refresh')\n * async refreshToken(): Promise<string> {\n * // Only one instance runs at a time\n * return await this.doRefresh();\n * }\n * }\n * ```\n */\nexport function locked(key: string, options?: AsyncLockOptions) {\n const lock = new AsyncLock(options);\n\n return function <T extends (...args: unknown[]) => Promise<unknown>>(\n _target: object,\n _propertyKey: string,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value;\n\n if (!originalMethod) {\n return descriptor;\n }\n\n descriptor.value = async function (this: unknown, ...args: unknown[]) {\n const { value } = await lock.acquire(key, () => originalMethod.apply(this, args));\n return value;\n } as T;\n\n return descriptor;\n };\n}\n","/**\n * Error Handling Utilities\n *\n * Comprehensive error handling with i18n support, error classification,\n * and retry logic for robust frontend applications.\n *\n * @module @omnitron-dev/prism/utils\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Error codes for classification.\n */\nexport type ErrorCode =\n // Auth errors\n | 'AUTH_REQUIRED'\n | 'AUTH_EXPIRED'\n | 'AUTH_INVALID'\n | 'AUTH_FORBIDDEN'\n | 'AUTH_MFA_REQUIRED'\n | 'AUTH_DEVICE_BLOCKED'\n // Network errors\n | 'NETWORK_ERROR'\n | 'NETWORK_TIMEOUT'\n | 'NETWORK_OFFLINE'\n // Validation errors\n | 'VALIDATION_ERROR'\n | 'VALIDATION_REQUIRED'\n | 'VALIDATION_FORMAT'\n | 'VALIDATION_RANGE'\n // Server errors\n | 'SERVER_ERROR'\n | 'SERVER_UNAVAILABLE'\n | 'SERVER_MAINTENANCE'\n // Client errors\n | 'NOT_FOUND'\n | 'CONFLICT'\n | 'RATE_LIMITED'\n | 'QUOTA_EXCEEDED'\n // Generic\n | 'UNKNOWN_ERROR'\n | string;\n\n/**\n * Severity levels for errors.\n */\nexport type ErrorSeverity = 'error' | 'warning' | 'info';\n\n/**\n * Error context for i18n.\n */\nexport interface ErrorContext {\n /** Error code for lookup */\n code: ErrorCode;\n /** HTTP status code if applicable */\n status?: number;\n /** Field name for validation errors */\n field?: string;\n /** Additional interpolation values */\n values?: Record<string, string | number>;\n /** Original error message (fallback) */\n message?: string;\n /** Retry information */\n retryAfter?: number;\n /** Severity level */\n severity?: ErrorSeverity;\n}\n\n/**\n * Translated error result.\n */\nexport interface TranslatedError {\n /** Translated title */\n title: string;\n /** Translated message */\n message: string;\n /** Error code */\n code: ErrorCode;\n /** Severity */\n severity: ErrorSeverity;\n /** Action hint (e.g., \"Please log in again\") */\n action?: string;\n /** Retry after seconds */\n retryAfter?: number;\n /** Is this a retryable error */\n canRetry: boolean;\n}\n\n/**\n * Translation function type.\n */\nexport type TranslateFn = (key: string, values?: Record<string, string | number>) => string;\n\n/**\n * Error messages dictionary type.\n */\nexport interface ErrorMessages {\n [code: string]: {\n title: string;\n message: string;\n action?: string;\n };\n}\n\n// =============================================================================\n// DEFAULT ERROR MESSAGES\n// =============================================================================\n\n/**\n * Default error messages in English.\n * Can be replaced with i18n translations.\n */\nexport const DEFAULT_ERROR_MESSAGES: ErrorMessages = {\n // Auth\n AUTH_REQUIRED: {\n title: 'Authentication Required',\n message: 'Please log in to continue.',\n action: 'Log in',\n },\n AUTH_EXPIRED: {\n title: 'Session Expired',\n message: 'Your session has expired. Please log in again.',\n action: 'Log in again',\n },\n AUTH_INVALID: {\n title: 'Invalid Credentials',\n message: 'The provided credentials are invalid.',\n action: 'Try again',\n },\n AUTH_FORBIDDEN: {\n title: 'Access Denied',\n message: \"You don't have permission to access this resource.\",\n },\n AUTH_MFA_REQUIRED: {\n title: 'Verification Required',\n message: 'Please complete two-factor authentication.',\n action: 'Verify',\n },\n AUTH_DEVICE_BLOCKED: {\n title: 'Device Blocked',\n message: 'This device has been blocked. Contact support for assistance.',\n },\n // Network\n NETWORK_ERROR: {\n title: 'Connection Error',\n message: 'Unable to connect to the server. Please check your connection.',\n action: 'Retry',\n },\n NETWORK_TIMEOUT: {\n title: 'Request Timeout',\n message: 'The request took too long. Please try again.',\n action: 'Retry',\n },\n NETWORK_OFFLINE: {\n title: 'Offline',\n message: \"You're currently offline. Please check your internet connection.\",\n },\n // Validation\n VALIDATION_ERROR: {\n title: 'Validation Error',\n message: 'Please check your input and try again.',\n },\n VALIDATION_REQUIRED: {\n title: 'Required Field',\n message: 'This field is required.',\n },\n VALIDATION_FORMAT: {\n title: 'Invalid Format',\n message: 'Please enter a valid format.',\n },\n VALIDATION_RANGE: {\n title: 'Out of Range',\n message: 'The value is out of the allowed range.',\n },\n // Server\n SERVER_ERROR: {\n title: 'Server Error',\n message: 'Something went wrong on our end. Please try again later.',\n action: 'Retry',\n },\n SERVER_UNAVAILABLE: {\n title: 'Service Unavailable',\n message: 'The service is temporarily unavailable. Please try again later.',\n action: 'Retry',\n },\n SERVER_MAINTENANCE: {\n title: 'Under Maintenance',\n message: \"We're performing maintenance. Please check back soon.\",\n },\n // Client\n NOT_FOUND: {\n title: 'Not Found',\n message: 'The requested resource could not be found.',\n },\n CONFLICT: {\n title: 'Conflict',\n message: 'The resource was modified. Please refresh and try again.',\n action: 'Refresh',\n },\n RATE_LIMITED: {\n title: 'Too Many Requests',\n message: 'Please slow down and try again later.',\n },\n QUOTA_EXCEEDED: {\n title: 'Quota Exceeded',\n message: 'You have exceeded your usage quota.',\n },\n // Generic\n UNKNOWN_ERROR: {\n title: 'Error',\n message: 'An unexpected error occurred. Please try again.',\n action: 'Retry',\n },\n};\n\n// =============================================================================\n// ERROR CLASSIFICATION\n// =============================================================================\n\n/**\n * Classify an error by HTTP status code.\n */\nexport function classifyHttpError(status: number): ErrorCode {\n switch (status) {\n case 400:\n return 'VALIDATION_ERROR';\n case 401:\n return 'AUTH_REQUIRED';\n case 403:\n return 'AUTH_FORBIDDEN';\n case 404:\n return 'NOT_FOUND';\n case 408:\n return 'NETWORK_TIMEOUT';\n case 409:\n return 'CONFLICT';\n case 429:\n return 'RATE_LIMITED';\n case 500:\n return 'SERVER_ERROR';\n case 502:\n case 503:\n case 504:\n return 'SERVER_UNAVAILABLE';\n default:\n if (status >= 400 && status < 500) return 'VALIDATION_ERROR';\n if (status >= 500) return 'SERVER_ERROR';\n return 'UNKNOWN_ERROR';\n }\n}\n\n/**\n * Check if an error is a network error.\n */\nexport function isNetworkError(error: unknown): boolean {\n if (error instanceof TypeError && error.message.includes('fetch')) {\n return true;\n }\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('network') ||\n message.includes('connection') ||\n message.includes('offline') ||\n message.includes('failed to fetch')\n );\n }\n return false;\n}\n\n/**\n * Check if an error is retryable.\n */\nexport function isRetryableError(code: ErrorCode): boolean {\n const retryableCodes: ErrorCode[] = [\n 'NETWORK_ERROR',\n 'NETWORK_TIMEOUT',\n 'SERVER_ERROR',\n 'SERVER_UNAVAILABLE',\n 'RATE_LIMITED',\n 'CONFLICT',\n ];\n return retryableCodes.includes(code);\n}\n\n/**\n * Get severity for an error code.\n */\nexport function getErrorSeverity(code: ErrorCode): ErrorSeverity {\n // Warnings (recoverable, action possible)\n const warnings: ErrorCode[] = ['AUTH_EXPIRED', 'RATE_LIMITED', 'NETWORK_OFFLINE', 'AUTH_MFA_REQUIRED'];\n\n // Info (informational, not blocking)\n const infos: ErrorCode[] = ['SERVER_MAINTENANCE'];\n\n if (warnings.includes(code)) return 'warning';\n if (infos.includes(code)) return 'info';\n return 'error';\n}\n\n// =============================================================================\n// ERROR TRANSLATION\n// =============================================================================\n\n/**\n * Create an error translator with custom messages or i18n function.\n *\n * @example\n * ```tsx\n * // With custom messages\n * const translate = createErrorTranslator({\n * messages: {\n * AUTH_REQUIRED: {\n * title: 'Необходима авторизация',\n * message: 'Пожалуйста, войдите в систему.',\n * },\n * },\n * });\n *\n * // With i18n library\n * const translate = createErrorTranslator({\n * t: (key, values) => i18n.t(key, values),\n * });\n *\n * const error = translate({ code: 'AUTH_REQUIRED', status: 401 });\n * // { title: 'Необходима авторизация', message: '...', ... }\n * ```\n */\nexport function createErrorTranslator(options: {\n messages?: ErrorMessages;\n t?: TranslateFn;\n fallbackMessages?: ErrorMessages;\n}): (context: ErrorContext) => TranslatedError {\n const { messages = {}, t, fallbackMessages = DEFAULT_ERROR_MESSAGES } = options;\n\n return (context: ErrorContext): TranslatedError => {\n const { code, values, message: originalMessage, severity, retryAfter } = context;\n\n // Try i18n translation first\n if (t) {\n const titleKey = `errors.${code}.title`;\n const messageKey = `errors.${code}.message`;\n const actionKey = `errors.${code}.action`;\n\n const title = t(titleKey, values);\n const translatedMessage = t(messageKey, values);\n const action = t(actionKey, values);\n\n // If translation was found (not equal to key)\n if (title !== titleKey) {\n return {\n title,\n message: translatedMessage !== messageKey ? translatedMessage : originalMessage || '',\n code,\n severity: severity ?? getErrorSeverity(code),\n action: action !== actionKey ? action : undefined,\n retryAfter,\n canRetry: isRetryableError(code),\n };\n }\n }\n\n // Try custom messages, then fallback\n const errorDef = messages[code] ?? fallbackMessages[code] ?? fallbackMessages.UNKNOWN_ERROR;\n\n return {\n title: errorDef.title,\n message: interpolateMessage(errorDef.message, values) || originalMessage || errorDef.message,\n code,\n severity: severity ?? getErrorSeverity(code),\n action: errorDef.action,\n retryAfter,\n canRetry: isRetryableError(code),\n };\n };\n}\n\n/**\n * Simple message interpolation.\n */\nfunction interpolateMessage(template: string, values?: Record<string, string | number>): string {\n if (!values) return template;\n return Object.entries(values).reduce(\n (msg, [key, value]) => msg.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), String(value)),\n template\n );\n}\n\n// =============================================================================\n// ERROR EXTRACTION\n// =============================================================================\n\n/**\n * Extract error context from various error types.\n *\n * @example\n * ```tsx\n * try {\n * await api.call();\n * } catch (error) {\n * const context = extractErrorContext(error);\n * const translated = translateError(context);\n * showNotification(translated);\n * }\n * ```\n */\nexport function extractErrorContext(error: unknown): ErrorContext {\n // Already an ErrorContext\n if (isErrorContext(error)) {\n return error;\n }\n\n // Response-like object (fetch Response or similar)\n if (isResponseLike(error)) {\n return {\n code: classifyHttpError(error.status),\n status: error.status,\n message: error.statusText,\n };\n }\n\n // Error with response property (axios-like)\n if (hasResponseProperty(error)) {\n const response = error.response;\n const data = response.data;\n\n // Extract typed values from response data with safe fallbacks\n const code = typeof data?.code === 'string' ? data.code : classifyHttpError(response.status);\n const message = typeof data?.message === 'string' ? data.message : response.statusText;\n const field = typeof data?.field === 'string' ? data.field : undefined;\n const values =\n data?.values !== undefined &&\n typeof data.values === 'object' &&\n data.values !== null &&\n !Array.isArray(data.values)\n ? (data.values as Record<string, string | number>)\n : undefined;\n\n return {\n code,\n status: response.status,\n message,\n values,\n field,\n };\n }\n\n // Network error\n if (isNetworkError(error)) {\n return {\n code: navigator?.onLine === false ? 'NETWORK_OFFLINE' : 'NETWORK_ERROR',\n message: error instanceof Error ? error.message : 'Network error',\n };\n }\n\n // Generic Error\n if (error instanceof Error) {\n return {\n code: 'UNKNOWN_ERROR',\n message: error.message,\n };\n }\n\n // String error\n if (typeof error === 'string') {\n return {\n code: 'UNKNOWN_ERROR',\n message: error,\n };\n }\n\n // Object with message/code\n if (error && typeof error === 'object') {\n const obj = error as Record<string, unknown>;\n return {\n code: (typeof obj.code === 'string' ? obj.code : 'UNKNOWN_ERROR') as ErrorCode,\n message: typeof obj.message === 'string' ? obj.message : undefined,\n status: typeof obj.status === 'number' ? obj.status : undefined,\n };\n }\n\n return { code: 'UNKNOWN_ERROR' };\n}\n\n// Type guards\nfunction isErrorContext(value: unknown): value is ErrorContext {\n return (\n value !== null && typeof value === 'object' && 'code' in value && typeof (value as ErrorContext).code === 'string'\n );\n}\n\nfunction isResponseLike(value: unknown): value is { status: number; statusText: string } {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'status' in value &&\n typeof (value as Record<string, unknown>).status === 'number'\n );\n}\n\nfunction hasResponseProperty(\n value: unknown\n): value is { response: { status: number; statusText: string; data?: Record<string, unknown> } } {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'response' in value &&\n isResponseLike((value as Record<string, unknown>).response)\n );\n}\n\n// =============================================================================\n// RETRY UTILITIES\n// =============================================================================\n\n/**\n * Retry configuration.\n */\nexport interface RetryConfig {\n /** Maximum number of retries */\n maxRetries?: number;\n /** Initial delay in ms */\n initialDelay?: number;\n /** Maximum delay in ms */\n maxDelay?: number;\n /** Exponential backoff factor */\n backoffFactor?: number;\n /** Add jitter to delays */\n jitter?: boolean;\n /** Custom retry condition */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n /** Called before each retry */\n onRetry?: (error: unknown, attempt: number, delay: number) => void;\n}\n\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n maxRetries: 3,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffFactor: 2,\n jitter: true,\n shouldRetry: (error) => {\n const context = extractErrorContext(error);\n return isRetryableError(context.code);\n },\n onRetry: () => {},\n};\n\n/**\n * Execute an async operation with automatic retry.\n *\n * @example\n * ```tsx\n * const result = await withRetry(\n * () => fetch('/api/data'),\n * {\n * maxRetries: 3,\n * onRetry: (error, attempt, delay) => {\n * console.log(`Retry ${attempt} after ${delay}ms`);\n * },\n * }\n * );\n * ```\n */\nexport async function withRetry<T>(operation: () => Promise<T>, config?: RetryConfig): Promise<T> {\n const opts = { ...DEFAULT_RETRY_CONFIG, ...config };\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n\n if (attempt === opts.maxRetries || !opts.shouldRetry(error, attempt)) {\n throw error;\n }\n\n const delay = calculateDelay(attempt, opts);\n opts.onRetry(error, attempt + 1, delay);\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n\n/**\n * Calculate delay with exponential backoff and optional jitter.\n */\nfunction calculateDelay(attempt: number, config: Required<RetryConfig>): number {\n let delay = config.initialDelay * Math.pow(config.backoffFactor, attempt);\n delay = Math.min(delay, config.maxDelay);\n\n if (config.jitter) {\n // Add ±25% jitter\n delay = delay * (0.75 + Math.random() * 0.5);\n }\n\n return Math.round(delay);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// =============================================================================\n// ERROR BOUNDARY HELPERS\n// =============================================================================\n\n/**\n * Check if error is a chunk load error (code splitting failure).\n */\nexport function isChunkLoadError(error: unknown): boolean {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('loading chunk') ||\n message.includes('loading css chunk') ||\n message.includes('dynamically imported module')\n );\n }\n return false;\n}\n\n/**\n * Check if error is a session expiry error.\n */\nexport function isSessionExpiredError(error: unknown): boolean {\n const context = extractErrorContext(error);\n return context.code === 'AUTH_EXPIRED' || context.code === 'AUTH_REQUIRED';\n}\n\n/**\n * Create a handler for error boundary recovery.\n */\nexport function createErrorRecoveryHandler(options: {\n onChunkError?: () => void;\n onSessionExpired?: () => void;\n onNetworkError?: () => void;\n onGenericError?: (error: unknown) => void;\n}): (error: unknown) => void {\n return (error: unknown) => {\n if (isChunkLoadError(error)) {\n options.onChunkError?.();\n return;\n }\n\n if (isSessionExpiredError(error)) {\n options.onSessionExpired?.();\n return;\n }\n\n if (isNetworkError(error)) {\n options.onNetworkError?.();\n return;\n }\n\n options.onGenericError?.(error);\n };\n}\n","/**\n * Fetch Interceptor Factory\n *\n * A flexible fetch wrapper with support for request/response interceptors,\n * automatic token refresh, and retry logic.\n *\n * Designed for production applications that need centralized HTTP handling.\n *\n * @module @omnitron-dev/prism/utils\n */\n\nimport { createAsyncLock, type AsyncLock } from './async-lock.js';\nimport { extractErrorContext, withRetry, type RetryConfig } from './errors.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Extended request init with additional options.\n */\nexport interface FetchRequestInit extends RequestInit {\n /** Skip all interceptors for this request */\n skipInterceptors?: boolean;\n /** Skip request interceptors only */\n skipRequestInterceptors?: boolean;\n /** Skip response interceptors only */\n skipResponseInterceptors?: boolean;\n /** Custom timeout in milliseconds */\n timeout?: number;\n /** Enable automatic retry on failure */\n retry?: boolean | RetryConfig;\n /** Request metadata for logging/debugging */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Request interceptor context.\n */\nexport interface RequestContext {\n url: string;\n init: FetchRequestInit;\n /** Original request info (can be string or Request) */\n input: RequestInfo | URL;\n /** Request metadata */\n metadata: Record<string, unknown>;\n}\n\n/**\n * Response interceptor context.\n */\nexport interface ResponseContext {\n response: Response;\n request: RequestContext;\n /** Time taken for the request in ms */\n duration: number;\n}\n\n/**\n * Error interceptor context.\n */\nexport interface ErrorContext {\n error: unknown;\n request: RequestContext;\n /** Time taken before error in ms */\n duration: number;\n /** Number of retry attempts made */\n retryCount: number;\n}\n\n/**\n * Request interceptor function.\n * Can modify the request or return a new one.\n */\nexport type RequestInterceptor = (ctx: RequestContext) => RequestContext | Promise<RequestContext>;\n\n/**\n * Response interceptor function.\n * Can modify the response or return a new one.\n */\nexport type ResponseInterceptor = (ctx: ResponseContext) => Response | Promise<Response>;\n\n/**\n * Error interceptor function.\n * Can handle the error, retry, or rethrow.\n */\nexport type ErrorInterceptor = (ctx: ErrorContext) => Response | Promise<Response> | never;\n\n/**\n * Interceptor configuration.\n */\nexport interface FetchInterceptorConfig {\n /** Base URL to prepend to relative paths */\n baseUrl?: string;\n /** Default headers for all requests */\n defaultHeaders?: HeadersInit;\n /** Default timeout in milliseconds (0 = no timeout) */\n defaultTimeout?: number;\n /** Request interceptors (run in order) */\n requestInterceptors?: RequestInterceptor[];\n /** Response interceptors (run in order) */\n responseInterceptors?: ResponseInterceptor[];\n /** Error interceptors (run in order, first to handle wins) */\n errorInterceptors?: ErrorInterceptor[];\n /** Default retry configuration */\n defaultRetry?: RetryConfig | false;\n /** Credentials mode for all requests */\n credentials?: RequestCredentials;\n}\n\n/**\n * Token refresh handler configuration.\n */\nexport interface TokenRefreshConfig {\n /** Check if a response indicates token expiration */\n isTokenExpired: (response: Response) => boolean;\n /** Refresh the token (called when token is expired) */\n refreshToken: () => Promise<string | null>;\n /** Get the current access token */\n getAccessToken: () => string | null;\n /** Called when refresh fails (e.g., redirect to login) */\n onRefreshFailure?: () => void;\n /** Maximum number of refresh attempts */\n maxRefreshAttempts?: number;\n}\n\n/**\n * Fetch client interface.\n */\nexport interface FetchClient {\n /** Make a fetch request */\n fetch: (input: RequestInfo | URL, init?: FetchRequestInit) => Promise<Response>;\n /** Add a request interceptor */\n addRequestInterceptor: (interceptor: RequestInterceptor) => () => void;\n /** Add a response interceptor */\n addResponseInterceptor: (interceptor: ResponseInterceptor) => () => void;\n /** Add an error interceptor */\n addErrorInterceptor: (interceptor: ErrorInterceptor) => () => void;\n /** Remove all interceptors */\n clearInterceptors: () => void;\n /** Get current configuration */\n getConfig: () => FetchInterceptorConfig;\n}\n\n// =============================================================================\n// FETCH INTERCEPTOR FACTORY\n// =============================================================================\n\n/**\n * Create a fetch client with interceptor support.\n *\n * @example\n * ```tsx\n * // Basic usage\n * const api = createFetchClient({\n * baseUrl: 'https://api.example.com',\n * defaultHeaders: { 'Content-Type': 'application/json' },\n * defaultTimeout: 30000,\n * });\n *\n * // Add auth header interceptor\n * api.addRequestInterceptor(async (ctx) => {\n * const token = getAccessToken();\n * if (token) {\n * ctx.init.headers = {\n * ...ctx.init.headers,\n * Authorization: `Bearer ${token}`,\n * };\n * }\n * return ctx;\n * });\n *\n * // Add response logging\n * api.addResponseInterceptor(async (ctx) => {\n * console.log(`${ctx.request.init.method} ${ctx.request.url} - ${ctx.response.status} (${ctx.duration}ms)`);\n * return ctx.response;\n * });\n *\n * // Make requests\n * const response = await api.fetch('/users');\n * const data = await response.json();\n * ```\n */\nexport function createFetchClient(config: FetchInterceptorConfig = {}): FetchClient {\n const requestInterceptors: RequestInterceptor[] = [...(config.requestInterceptors ?? [])];\n const responseInterceptors: ResponseInterceptor[] = [...(config.responseInterceptors ?? [])];\n const errorInterceptors: ErrorInterceptor[] = [...(config.errorInterceptors ?? [])];\n\n /**\n * Build the full URL from input.\n */\n function buildUrl(input: RequestInfo | URL): string {\n const baseUrl = config.baseUrl ?? '';\n\n if (typeof input === 'string') {\n // If input is absolute, use it as-is\n if (input.startsWith('http://') || input.startsWith('https://')) {\n return input;\n }\n // Combine with base URL\n const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const path = input.startsWith('/') ? input : `/${input}`;\n return `${base}${path}`;\n }\n\n if (input instanceof URL) {\n return input.toString();\n }\n\n // Request object\n return input.url;\n }\n\n /**\n * Merge headers from multiple sources.\n */\n function mergeHeaders(...sources: (HeadersInit | undefined)[]): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const source of sources) {\n if (!source) continue;\n\n if (source instanceof Headers) {\n source.forEach((value, key) => {\n result[key] = value;\n });\n } else if (Array.isArray(source)) {\n for (const [key, value] of source) {\n result[key] = value;\n }\n } else {\n Object.assign(result, source);\n }\n }\n\n return result;\n }\n\n /**\n * Execute fetch with timeout.\n */\n async function fetchWithTimeout(url: string, init: RequestInit, timeout: number): Promise<Response> {\n if (timeout <= 0) {\n return fetch(url, init);\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n return await fetch(url, {\n ...init,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * The main fetch function.\n */\n async function clientFetch(input: RequestInfo | URL, init: FetchRequestInit = {}): Promise<Response> {\n const startTime = Date.now();\n let retryCount = 0;\n\n // Build initial request context\n let ctx: RequestContext = {\n url: buildUrl(input),\n init: {\n ...init,\n headers: mergeHeaders(config.defaultHeaders, init.headers),\n credentials: init.credentials ?? config.credentials,\n },\n input,\n metadata: init.metadata ?? {},\n };\n\n // Run request interceptors\n if (!init.skipInterceptors && !init.skipRequestInterceptors) {\n for (const interceptor of requestInterceptors) {\n ctx = await interceptor(ctx);\n }\n }\n\n const timeout = init.timeout ?? config.defaultTimeout ?? 0;\n\n /**\n * Execute the actual request.\n */\n async function executeRequest(): Promise<Response> {\n try {\n const response = await fetchWithTimeout(ctx.url, ctx.init, timeout);\n const duration = Date.now() - startTime;\n\n // Run response interceptors\n if (!init.skipInterceptors && !init.skipResponseInterceptors) {\n let finalResponse = response;\n for (const interceptor of responseInterceptors) {\n finalResponse = await interceptor({\n response: finalResponse,\n request: ctx,\n duration,\n });\n }\n return finalResponse;\n }\n\n return response;\n } catch (error) {\n const duration = Date.now() - startTime;\n\n // Run error interceptors\n if (!init.skipInterceptors) {\n for (const interceptor of errorInterceptors) {\n try {\n const recoveredResponse = await interceptor({\n error,\n request: ctx,\n duration,\n retryCount,\n });\n // If interceptor returns a response, use it\n return recoveredResponse;\n } catch {\n // Interceptor didn't handle the error, continue to next\n }\n }\n }\n\n // No interceptor handled the error, rethrow\n throw error;\n }\n }\n\n // Handle retry logic\n const retryConfig = init.retry ?? config.defaultRetry;\n if (retryConfig) {\n const finalConfig = typeof retryConfig === 'boolean' ? {} : retryConfig;\n return withRetry(executeRequest, {\n ...finalConfig,\n onRetry: (error, attempt, delay) => {\n retryCount = attempt;\n finalConfig.onRetry?.(error, attempt, delay);\n },\n });\n }\n\n return executeRequest();\n }\n\n return {\n fetch: clientFetch,\n\n addRequestInterceptor(interceptor) {\n requestInterceptors.push(interceptor);\n return () => {\n const index = requestInterceptors.indexOf(interceptor);\n if (index !== -1) {\n requestInterceptors.splice(index, 1);\n }\n };\n },\n\n addResponseInterceptor(interceptor) {\n responseInterceptors.push(interceptor);\n return () => {\n const index = responseInterceptors.indexOf(interceptor);\n if (index !== -1) {\n responseInterceptors.splice(index, 1);\n }\n };\n },\n\n addErrorInterceptor(interceptor) {\n errorInterceptors.push(interceptor);\n return () => {\n const index = errorInterceptors.indexOf(interceptor);\n if (index !== -1) {\n errorInterceptors.splice(index, 1);\n }\n };\n },\n\n clearInterceptors() {\n requestInterceptors.length = 0;\n responseInterceptors.length = 0;\n errorInterceptors.length = 0;\n },\n\n getConfig() {\n return { ...config };\n },\n };\n}\n\n// =============================================================================\n// TOKEN REFRESH INTERCEPTOR\n// =============================================================================\n\n/**\n * Create a token refresh interceptor that automatically refreshes\n * expired tokens and retries failed requests.\n *\n * Uses AsyncLock to prevent multiple simultaneous refresh attempts.\n *\n * @example\n * ```tsx\n * const api = createFetchClient({ baseUrl: '/api' });\n *\n * const { addToClient } = createTokenRefreshInterceptor({\n * isTokenExpired: (response) => response.status === 401,\n * refreshToken: async () => {\n * const response = await fetch('/auth/refresh', { method: 'POST' });\n * const data = await response.json();\n * localStorage.setItem('token', data.accessToken);\n * return data.accessToken;\n * },\n * getAccessToken: () => localStorage.getItem('token'),\n * onRefreshFailure: () => {\n * localStorage.removeItem('token');\n * window.location.href = '/login';\n * },\n * });\n *\n * addToClient(api);\n * ```\n */\nexport function createTokenRefreshInterceptor(config: TokenRefreshConfig): {\n addToClient: (client: FetchClient) => void;\n refreshLock: AsyncLock;\n} {\n const refreshLock = createAsyncLock({ timeout: 30000 });\n let isRefreshing = false;\n let refreshAttempts = 0;\n const maxAttempts = config.maxRefreshAttempts ?? 3;\n\n const requestInterceptor: RequestInterceptor = async (ctx) => {\n // Add auth header if we have a token\n const token = config.getAccessToken();\n if (token) {\n ctx.init.headers = {\n ...(ctx.init.headers as Record<string, string>),\n Authorization: `Bearer ${token}`,\n };\n }\n return ctx;\n };\n\n const responseInterceptor: ResponseInterceptor = async (ctx) => {\n // Check if token is expired\n if (!config.isTokenExpired(ctx.response)) {\n // Reset refresh attempts on successful request\n refreshAttempts = 0;\n return ctx.response;\n }\n\n // Token expired, try to refresh\n if (refreshAttempts >= maxAttempts) {\n config.onRefreshFailure?.();\n throw new Error('Token refresh failed after maximum attempts');\n }\n\n // Use lock to prevent multiple simultaneous refresh attempts\n const lockResult = await refreshLock.acquire('token-refresh', async () => {\n // Double-check if another request already refreshed\n if (isRefreshing) {\n // Wait for the ongoing refresh to complete\n return config.getAccessToken();\n }\n\n isRefreshing = true;\n refreshAttempts++;\n\n try {\n const token = await config.refreshToken();\n if (!token) {\n config.onRefreshFailure?.();\n throw new Error('Token refresh returned null');\n }\n return token;\n } finally {\n isRefreshing = false;\n }\n });\n\n const newToken = lockResult.value;\n\n // Retry the original request with new token\n if (newToken) {\n const retryInit: RequestInit = {\n ...ctx.request.init,\n headers: {\n ...(ctx.request.init.headers as Record<string, string>),\n Authorization: `Bearer ${newToken}`,\n },\n };\n return fetch(ctx.request.url, retryInit);\n }\n\n return ctx.response;\n };\n\n return {\n addToClient(client) {\n client.addRequestInterceptor(requestInterceptor);\n client.addResponseInterceptor(responseInterceptor);\n },\n refreshLock,\n };\n}\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Create a simple JSON API client.\n *\n * @example\n * ```tsx\n * const api = createJsonApiClient({\n * baseUrl: 'https://api.example.com',\n * getAuthToken: () => localStorage.getItem('token'),\n * });\n *\n * // GET request\n * const users = await api.get<User[]>('/users');\n *\n * // POST request\n * const newUser = await api.post<User>('/users', { name: 'John' });\n *\n * // DELETE request\n * await api.delete('/users/1');\n * ```\n */\nexport function createJsonApiClient(options: {\n baseUrl?: string;\n getAuthToken?: () => string | null;\n defaultHeaders?: Record<string, string>;\n timeout?: number;\n}) {\n const client = createFetchClient({\n baseUrl: options.baseUrl,\n defaultHeaders: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...options.defaultHeaders,\n },\n defaultTimeout: options.timeout,\n credentials: 'include',\n });\n\n if (options.getAuthToken) {\n client.addRequestInterceptor(async (ctx) => {\n const token = options.getAuthToken!();\n if (token) {\n ctx.init.headers = {\n ...(ctx.init.headers as Record<string, string>),\n Authorization: `Bearer ${token}`,\n };\n }\n return ctx;\n });\n }\n\n async function request<T>(method: string, path: string, body?: unknown): Promise<T | null> {\n const response = await client.fetch(path, {\n method,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorContext = extractErrorContext(response);\n const error = new Error(errorContext.message || `HTTP ${response.status}`);\n Object.assign(error, { response, context: errorContext });\n throw error;\n }\n\n // Handle empty responses (204 No Content, non-JSON responses)\n const contentType = response.headers.get('content-type');\n if (!contentType || !contentType.includes('application/json')) {\n return null;\n }\n\n const text = await response.text();\n if (!text) {\n return null;\n }\n\n return JSON.parse(text) as T;\n }\n\n return {\n client,\n get: <T>(path: string) => request<T>('GET', path),\n post: <T>(path: string, body?: unknown) => request<T>('POST', path, body),\n put: <T>(path: string, body?: unknown) => request<T>('PUT', path, body),\n patch: <T>(path: string, body?: unknown) => request<T>('PATCH', path, body),\n delete: <T>(path: string) => request<T>('DELETE', path),\n };\n}\n","/**\n * JWT Utilities\n *\n * Client-side JWT decoding and validation utilities.\n * These utilities do NOT verify signatures - they only decode and check expiration.\n * For signature verification, use server-side libraries.\n *\n * @module @omnitron-dev/prism/utils\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Standard JWT claims.\n * @see https://datatracker.ietf.org/doc/html/rfc7519#section-4.1\n */\nexport interface JwtStandardClaims {\n /** Issuer */\n iss?: string;\n /** Subject */\n sub?: string;\n /** Audience */\n aud?: string | string[];\n /** Expiration time (Unix timestamp in seconds) */\n exp?: number;\n /** Not before (Unix timestamp in seconds) */\n nbf?: number;\n /** Issued at (Unix timestamp in seconds) */\n iat?: number;\n /** JWT ID */\n jti?: string;\n}\n\n/**\n * JWT payload with custom claims.\n * Extends standard claims with any additional properties.\n */\nexport interface JwtPayload extends JwtStandardClaims {\n /** User ID (common custom claim) */\n userId?: string;\n /** Email (common custom claim) */\n email?: string;\n /** Roles (common custom claim) */\n roles?: string[];\n /** Permissions (common custom claim) */\n permissions?: string[];\n /** Any additional custom claims */\n [key: string]: unknown;\n}\n\n/**\n * JWT validation options.\n */\nexport interface JwtValidationOptions {\n /** Clock skew tolerance in seconds (default: 60) */\n clockTolerance?: number;\n /** Require expiration claim (default: true) */\n requireExp?: boolean;\n}\n\n/**\n * JWT decode result.\n */\nexport interface JwtDecodeResult<T extends JwtPayload = JwtPayload> {\n /** Decoded header */\n header: {\n alg: string;\n typ?: string;\n [key: string]: unknown;\n };\n /** Decoded payload */\n payload: T;\n /** Original signature (base64url encoded, NOT verified) */\n signature: string;\n}\n\n// =============================================================================\n// DECODE FUNCTIONS\n// =============================================================================\n\n/**\n * Decode a base64url string to a regular string.\n * Handles URL-safe base64 encoding used in JWTs.\n */\nfunction base64UrlDecode(str: string): string {\n // Replace URL-safe characters with standard base64\n const base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n\n // Add padding if necessary\n const padding = base64.length % 4;\n const paddedBase64 = padding ? base64 + '='.repeat(4 - padding) : base64;\n\n // Decode\n try {\n return atob(paddedBase64);\n } catch {\n throw new Error('Invalid base64url encoding');\n }\n}\n\n/**\n * Decode a JWT token without verifying the signature.\n *\n * ⚠️ WARNING: This function does NOT verify the signature.\n * Only use for client-side display purposes. Never trust decoded\n * data for authorization decisions without server-side verification.\n *\n * @param token - The JWT token string\n * @returns Decoded JWT parts (header, payload, signature)\n * @throws Error if the token is malformed\n *\n * @example\n * ```tsx\n * const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';\n *\n * try {\n * const { header, payload } = jwtDecode(token);\n * console.log('Algorithm:', header.alg);\n * console.log('User ID:', payload.sub);\n * console.log('Expires:', new Date(payload.exp! * 1000));\n * } catch (error) {\n * console.error('Invalid token:', error.message);\n * }\n * ```\n */\nexport function jwtDecode<T extends JwtPayload = JwtPayload>(token: string): JwtDecodeResult<T> {\n if (!token || typeof token !== 'string') {\n throw new Error('Token must be a non-empty string');\n }\n\n const parts = token.split('.');\n\n if (parts.length !== 3) {\n throw new Error('Invalid token format: expected 3 parts separated by dots');\n }\n\n const [headerPart, payloadPart, signaturePart] = parts;\n\n try {\n const headerJson = base64UrlDecode(headerPart);\n const payloadJson = base64UrlDecode(payloadPart);\n\n const header = JSON.parse(headerJson);\n const payload = JSON.parse(payloadJson) as T;\n\n return {\n header,\n payload,\n signature: signaturePart,\n };\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error('Invalid token: malformed JSON in header or payload', { cause: error });\n }\n throw error;\n }\n}\n\n/**\n * Decode only the payload from a JWT token.\n * Convenience function when you only need the claims.\n *\n * @param token - The JWT token string\n * @returns Decoded payload\n * @throws Error if the token is malformed\n *\n * @example\n * ```tsx\n * const payload = jwtDecodePayload(token);\n * console.log('User:', payload.email);\n * ```\n */\nexport function jwtDecodePayload<T extends JwtPayload = JwtPayload>(token: string): T {\n return jwtDecode<T>(token).payload;\n}\n\n// =============================================================================\n// VALIDATION FUNCTIONS\n// =============================================================================\n\n/**\n * Check if a JWT token is expired.\n *\n * @param token - The JWT token string\n * @param options - Validation options\n * @returns true if the token is expired or invalid, false if still valid\n *\n * @example\n * ```tsx\n * if (isTokenExpired(token)) {\n * // Redirect to login or refresh token\n * refreshAccessToken();\n * }\n * ```\n */\nexport function isTokenExpired(token: string, options: JwtValidationOptions = {}): boolean {\n const { clockTolerance = 60, requireExp = true } = options;\n\n try {\n const { payload } = jwtDecode(token);\n\n // Check if exp claim exists\n if (payload.exp === undefined) {\n // If exp is not required, token is considered valid\n return requireExp;\n }\n\n // Check expiration with clock tolerance\n const currentTime = Math.floor(Date.now() / 1000);\n return payload.exp < currentTime - clockTolerance;\n } catch {\n // If token can't be decoded, consider it expired/invalid\n return true;\n }\n}\n\n/**\n * Check if a JWT token is valid (not expired, not before nbf).\n *\n * @param token - The JWT token string\n * @param options - Validation options\n * @returns true if the token is valid, false otherwise\n *\n * @example\n * ```tsx\n * function AuthProvider({ children }) {\n * const [token] = useLocalStorage('accessToken');\n *\n * if (!token || !isValidToken(token)) {\n * return <Navigate to=\"/login\" />;\n * }\n *\n * return children;\n * }\n * ```\n */\nexport function isValidToken(token: string, options: JwtValidationOptions = {}): boolean {\n const { clockTolerance = 60, requireExp = true } = options;\n\n try {\n const { payload } = jwtDecode(token);\n\n const currentTime = Math.floor(Date.now() / 1000);\n\n // Check expiration\n if (payload.exp !== undefined) {\n if (payload.exp < currentTime - clockTolerance) {\n return false;\n }\n } else if (requireExp) {\n // exp is required but missing\n return false;\n }\n\n // Check not-before\n if (payload.nbf !== undefined) {\n if (payload.nbf > currentTime + clockTolerance) {\n return false;\n }\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get time until token expires in seconds.\n * Returns 0 if token is already expired or invalid.\n *\n * @param token - The JWT token string\n * @returns Seconds until expiration, or 0 if expired/invalid\n *\n * @example\n * ```tsx\n * const secondsLeft = getTokenTimeLeft(token);\n *\n * if (secondsLeft < 300) {\n * // Less than 5 minutes left, refresh proactively\n * refreshToken();\n * }\n * ```\n */\nexport function getTokenTimeLeft(token: string): number {\n try {\n const { payload } = jwtDecode(token);\n\n if (payload.exp === undefined) {\n return Infinity;\n }\n\n const currentTime = Math.floor(Date.now() / 1000);\n const timeLeft = payload.exp - currentTime;\n\n return timeLeft > 0 ? timeLeft : 0;\n } catch {\n return 0;\n }\n}\n\n/**\n * Get expiration date from token.\n *\n * @param token - The JWT token string\n * @returns Date object for expiration, or null if no exp claim or invalid token\n *\n * @example\n * ```tsx\n * const expiresAt = getTokenExpirationDate(token);\n * if (expiresAt) {\n * console.log('Token expires:', expiresAt.toLocaleString());\n * }\n * ```\n */\nexport function getTokenExpirationDate(token: string): Date | null {\n try {\n const { payload } = jwtDecode(token);\n\n if (payload.exp === undefined) {\n return null;\n }\n\n return new Date(payload.exp * 1000);\n } catch {\n return null;\n }\n}\n\n// =============================================================================\n// CLAIM EXTRACTION HELPERS\n// =============================================================================\n\n/**\n * Safely get a claim from a token.\n *\n * @param token - The JWT token string\n * @param claim - The claim name to extract\n * @returns The claim value or undefined if not present/invalid\n *\n * @example\n * ```tsx\n * const userId = getTokenClaim(token, 'sub');\n * const roles = getTokenClaim<string[]>(token, 'roles') ?? [];\n * ```\n */\nexport function getTokenClaim<T>(token: string, claim: string): T | undefined {\n try {\n const { payload } = jwtDecode(token);\n return payload[claim] as T;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Get the subject (user identifier) from a token.\n *\n * @param token - The JWT token string\n * @returns The subject claim or undefined\n */\nexport function getTokenSubject(token: string): string | undefined {\n return getTokenClaim<string>(token, 'sub');\n}\n\n/**\n * Check if token has a specific role.\n *\n * @param token - The JWT token string\n * @param role - The role to check for\n * @param rolesKey - The key in the payload containing roles (default: 'roles')\n * @returns true if the token contains the role\n *\n * @example\n * ```tsx\n * if (tokenHasRole(token, 'admin')) {\n * // Show admin features\n * }\n * ```\n */\nexport function tokenHasRole(token: string, role: string, rolesKey = 'roles'): boolean {\n const roles = getTokenClaim<string[]>(token, rolesKey);\n return Array.isArray(roles) && roles.includes(role);\n}\n\n/**\n * Check if token has a specific permission.\n *\n * @param token - The JWT token string\n * @param permission - The permission to check for\n * @param permissionsKey - The key in the payload containing permissions (default: 'permissions')\n * @returns true if the token contains the permission\n */\nexport function tokenHasPermission(token: string, permission: string, permissionsKey = 'permissions'): boolean {\n const permissions = getTokenClaim<string[]>(token, permissionsKey);\n return Array.isArray(permissions) && permissions.includes(permission);\n}\n","/**\n * Template variable resolver.\n *\n * Replaces `{{namespace.key}}` patterns in text with values from a context map.\n * Used for injecting dynamic config values into help content at render time.\n *\n * @example\n * resolveTemplateVariables(\"Fee: {{config.sellerFee}}%\", { \"config.sellerFee\": \"5\" })\n * // => \"Fee: 5%\"\n */\nexport function resolveTemplateVariables(text: string, context: Record<string, string | number>): string {\n return text.replace(/\\{\\{([a-zA-Z0-9_.]+)\\}\\}/g, (match, key: string) => {\n const value = context[key];\n return value !== undefined ? String(value) : match;\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/refs.ts","../src/utils/format-number.ts","../src/utils/format-date.ts","../src/utils/string.ts","../src/utils/storage.ts","../src/utils/font.ts","../src/utils/object.ts","../src/utils/rtl.ts","../src/utils/async-lock.ts","../src/utils/errors.ts","../src/utils/fetch-interceptor.ts","../src/utils/jwt.ts","../src/utils/template-resolver.ts","../src/utils/i18n-text.ts","../src/utils/toast.ts","../src/utils/format-crypto.ts"],"names":["buildUrl","sonner"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Ref Utilities\n *\n * Utilities for working with React refs.\n *\n * @module @omnitron-dev/prism/utils/refs\n */\n\nimport type { MutableRefObject, RefCallback, Ref } from 'react';\n\n/**\n * Supported ref types for merging.\n */\nexport type MergeableRef<T> = Ref<T> | RefCallback<T> | MutableRefObject<T> | null | undefined;\n\n/**\n * Merge multiple refs into a single callback ref.\n * Useful when you need to pass a ref to a component that also needs\n * to be used by a parent component or hook.\n *\n * @example\n * ```tsx\n * const Component = forwardRef((props, ref) => {\n * const localRef = useRef<HTMLDivElement>(null);\n * const mergedRef = mergeRefs(ref, localRef);\n * return <div ref={mergedRef} />;\n * });\n * ```\n *\n * @param refs - Array of refs to merge\n * @returns A callback ref that updates all provided refs\n */\nexport function mergeRefs<T>(...refs: MergeableRef<T>[]): RefCallback<T> {\n return (value: T | null) => {\n for (const ref of refs) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref != null) {\n (ref as MutableRefObject<T | null>).current = value;\n }\n }\n };\n}\n\n/**\n * Create a ref setter that can be used with useImperativeHandle.\n * Useful for exposing a subset of methods from a ref.\n *\n * @example\n * ```tsx\n * const Component = forwardRef<API, Props>((props, ref) => {\n * const inputRef = useRef<HTMLInputElement>(null);\n *\n * useImperativeHandle(ref, () => ({\n * focus: () => inputRef.current?.focus(),\n * clear: () => { if (inputRef.current) inputRef.current.value = ''; },\n * }), []);\n *\n * return <input ref={inputRef} />;\n * });\n * ```\n *\n * @param ref - The ref to set\n * @param value - The value to set\n */\nexport function setRef<T>(ref: MergeableRef<T>, value: T | null): void {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref != null) {\n (ref as MutableRefObject<T | null>).current = value;\n }\n}\n\n/**\n * Check if a ref has a current value.\n *\n * @param ref - The ref to check\n * @returns True if the ref has a current value\n */\nexport function hasRefValue<T>(ref: MergeableRef<T>): ref is MutableRefObject<NonNullable<T>> {\n return ref != null && typeof ref !== 'function' && ref.current != null;\n}\n","/**\n * Number Formatting Utilities\n *\n * Locale-aware number formatting utilities.\n *\n * @module @omnitron-dev/prism/utils/format-number\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface FormatNumberOptions extends Intl.NumberFormatOptions {\n /** Locale for formatting (default: 'en-US') */\n locale?: string;\n}\n\nexport interface FormatCurrencyOptions extends FormatNumberOptions {\n /** Currency code (default: 'USD') */\n currency?: string;\n}\n\n// =============================================================================\n// NUMBER FORMATTING\n// =============================================================================\n\n/**\n * Format a number with locale-aware formatting.\n *\n * @example\n * ```ts\n * fNumber(1234567.89)\n * // => \"1,234,567.89\"\n *\n * fNumber(1234567.89, { locale: 'de-DE' })\n * // => \"1.234.567,89\"\n *\n * fNumber(0.1234, { style: 'percent' })\n * // => \"12%\"\n * ```\n */\nexport function fNumber(value: number | string | null | undefined, options: FormatNumberOptions = {}): string {\n const { locale = 'en-US', ...formatOptions } = options;\n\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n return new Intl.NumberFormat(locale, formatOptions).format(num);\n}\n\n/**\n * Format a number as currency.\n *\n * @example\n * ```ts\n * fCurrency(1234.56)\n * // => \"$1,234.56\"\n *\n * fCurrency(1234.56, { currency: 'EUR', locale: 'de-DE' })\n * // => \"1.234,56 €\"\n *\n * fCurrency(1234.56, { currency: 'JPY' })\n * // => \"¥1,235\" (JPY has no decimal places)\n * ```\n */\nexport function fCurrency(value: number | string | null | undefined, options: FormatCurrencyOptions = {}): string {\n const { currency = 'USD', locale = 'en-US', ...formatOptions } = options;\n\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n ...formatOptions,\n }).format(num);\n}\n\n/**\n * Format a number as a percentage.\n *\n * @example\n * ```ts\n * fPercent(0.1234)\n * // => \"12.34%\"\n *\n * fPercent(0.1234, { maximumFractionDigits: 0 })\n * // => \"12%\"\n *\n * fPercent(1.5)\n * // => \"150%\"\n * ```\n */\nexport function fPercent(value: number | string | null | undefined, options: FormatNumberOptions = {}): string {\n const { locale = 'en-US', ...formatOptions } = options;\n\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n return new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n ...formatOptions,\n }).format(num);\n}\n\n/**\n * Shorten a large number with K, M, B suffixes.\n *\n * @example\n * ```ts\n * fShortenNumber(1234)\n * // => \"1.23K\"\n *\n * fShortenNumber(1234567)\n * // => \"1.23M\"\n *\n * fShortenNumber(1234567890)\n * // => \"1.23B\"\n *\n * fShortenNumber(1234567890000)\n * // => \"1.23T\"\n * ```\n */\nexport function fShortenNumber(value: number | string | null | undefined, decimals: number = 2): string {\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n const absNum = Math.abs(num);\n\n if (absNum >= 1e12) {\n return `${(num / 1e12).toFixed(decimals)}T`;\n }\n if (absNum >= 1e9) {\n return `${(num / 1e9).toFixed(decimals)}B`;\n }\n if (absNum >= 1e6) {\n return `${(num / 1e6).toFixed(decimals)}M`;\n }\n if (absNum >= 1e3) {\n return `${(num / 1e3).toFixed(decimals)}K`;\n }\n\n return num.toFixed(decimals);\n}\n\n/**\n * Format bytes to human-readable size.\n *\n * @example\n * ```ts\n * fBytes(1024)\n * // => \"1 KB\"\n *\n * fBytes(1048576)\n * // => \"1 MB\"\n *\n * fBytes(1073741824)\n * // => \"1 GB\"\n * ```\n */\nexport function fBytes(bytes: number | string | null | undefined, decimals: number = 2): string {\n if (bytes === null || bytes === undefined || bytes === '') {\n return '';\n }\n\n const num = typeof bytes === 'string' ? parseFloat(bytes) : bytes;\n\n if (Number.isNaN(num) || num === 0) {\n return '0 Bytes';\n }\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const i = Math.floor(Math.log(Math.abs(num)) / Math.log(k));\n\n return `${(num / Math.pow(k, i)).toFixed(decimals)} ${sizes[i]}`;\n}\n\n/**\n * Format number with ordinal suffix (1st, 2nd, 3rd, etc.)\n *\n * @example\n * ```ts\n * fOrdinal(1)\n * // => \"1st\"\n *\n * fOrdinal(22)\n * // => \"22nd\"\n *\n * fOrdinal(33)\n * // => \"33rd\"\n *\n * fOrdinal(44)\n * // => \"44th\"\n * ```\n */\nexport function fOrdinal(value: number | null | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const num = Math.abs(Math.floor(value));\n const suffixes = ['th', 'st', 'nd', 'rd'];\n const remainder = num % 100;\n\n const suffix = suffixes[(remainder - 20) % 10] || suffixes[remainder] || suffixes[0];\n\n return `${value}${suffix}`;\n}\n\n/**\n * Format a number with decimal places.\n *\n * @example\n * ```ts\n * fDecimal(1234.5678)\n * // => \"1234.57\"\n *\n * fDecimal(1234.5678, 4)\n * // => \"1234.5678\"\n *\n * fDecimal(1234)\n * // => \"1234.00\"\n * ```\n */\nexport function fDecimal(value: number | string | null | undefined, decimals: number = 2): string {\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n return num.toFixed(decimals);\n}\n\n// =============================================================================\n// PERCENTAGE CALCULATIONS (Aurora pattern)\n// =============================================================================\n\n/**\n * Calculate percentage of a value relative to a total.\n *\n * @param value - The part value\n * @param total - The total value\n * @param decimals - Decimal places (default: 0)\n * @returns Percentage number (0-100)\n *\n * @example\n * ```ts\n * getPercentage(25, 100)\n * // => 25\n *\n * getPercentage(1, 3)\n * // => 33\n *\n * getPercentage(1, 3, 2)\n * // => 33.33\n *\n * getPercentage(50, 200)\n * // => 25\n * ```\n */\nexport function getPercentage(value: number, total: number, decimals: number = 0): number {\n if (total === 0) return 0;\n const percentage = (value / total) * 100;\n return Number(percentage.toFixed(decimals));\n}\n\n/**\n * Calculate percentage change between two values.\n *\n * @param current - Current value\n * @param previous - Previous value\n * @param decimals - Decimal places (default: 0)\n * @returns Percentage change (positive = increase, negative = decrease)\n *\n * @example\n * ```ts\n * calculatePercentageChange(150, 100)\n * // => 50 (50% increase)\n *\n * calculatePercentageChange(50, 100)\n * // => -50 (50% decrease)\n *\n * calculatePercentageChange(100, 100)\n * // => 0 (no change)\n *\n * calculatePercentageChange(120, 100, 1)\n * // => 20.0\n * ```\n */\nexport function calculatePercentageChange(current: number, previous: number, decimals: number = 0): number {\n if (previous === 0) return current === 0 ? 0 : 100;\n const change = ((current - previous) / Math.abs(previous)) * 100;\n return Number(change.toFixed(decimals));\n}\n\n/**\n * Get currency symbol for a currency code.\n *\n * @param currencyCode - ISO 4217 currency code (e.g., 'USD', 'EUR')\n * @param locale - Locale for formatting (default: 'en-US')\n * @returns Currency symbol (e.g., '$', '€', '¥')\n *\n * @example\n * ```ts\n * getCurrencySymbol('USD')\n * // => \"$\"\n *\n * getCurrencySymbol('EUR')\n * // => \"€\"\n *\n * getCurrencySymbol('JPY')\n * // => \"¥\"\n *\n * getCurrencySymbol('GBP')\n * // => \"£\"\n * ```\n */\nexport function getCurrencySymbol(currencyCode: string, locale: string = 'en-US'): string {\n const parts = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n })\n .formatToParts(0)\n .find((part) => part.type === 'currency');\n\n return parts?.value ?? currencyCode;\n}\n\n/**\n * Format a number with +/- sign prefix.\n *\n * @param value - Number to format\n * @param options - Formatting options\n * @returns Formatted string with sign\n *\n * @example\n * ```ts\n * fNumberWithSign(25)\n * // => \"+25\"\n *\n * fNumberWithSign(-25)\n * // => \"-25\"\n *\n * fNumberWithSign(0)\n * // => \"0\"\n *\n * fNumberWithSign(25.5, { maximumFractionDigits: 1 })\n * // => \"+25.5\"\n * ```\n */\nexport function fNumberWithSign(value: number | string | null | undefined, options: FormatNumberOptions = {}): string {\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n const formatted = fNumber(Math.abs(num), options);\n if (num > 0) return `+${formatted}`;\n if (num < 0) return `-${formatted}`;\n return formatted;\n}\n\n/**\n * Format a number as compact notation (1K, 1M, 1B).\n * Uses Intl.NumberFormat with compact notation.\n *\n * @example\n * ```ts\n * fCompact(1234)\n * // => \"1.2K\"\n *\n * fCompact(1234567)\n * // => \"1.2M\"\n *\n * fCompact(1234567890)\n * // => \"1.2B\"\n * ```\n */\nexport function fCompact(value: number | string | null | undefined, options: FormatNumberOptions = {}): string {\n const { locale = 'en-US', ...formatOptions } = options;\n\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n const num = typeof value === 'string' ? parseFloat(value) : value;\n\n if (Number.isNaN(num)) {\n return '';\n }\n\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n compactDisplay: 'short',\n maximumFractionDigits: 1,\n ...formatOptions,\n }).format(num);\n}\n","/**\n * Date Formatting Utilities\n *\n * Locale-aware date formatting utilities using Intl.DateTimeFormat.\n * For more complex formatting, consider using dayjs or date-fns.\n *\n * @module @omnitron-dev/prism/utils/format-date\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type DateInput = Date | string | number | null | undefined;\n\nexport interface FormatDateOptions extends Intl.DateTimeFormatOptions {\n /** Locale for formatting (default: 'en-US') */\n locale?: string;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Parse various date inputs into a Date object.\n */\nfunction parseDate(input: DateInput): Date | null {\n if (input === null || input === undefined) {\n return null;\n }\n\n if (input instanceof Date) {\n return input;\n }\n\n const date = new Date(input);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\n// =============================================================================\n// DATE FORMATTING\n// =============================================================================\n\n/**\n * Format a date with locale-aware formatting.\n *\n * @example\n * ```ts\n * fDate(new Date())\n * // => \"Jan 15, 2025\"\n *\n * fDate(new Date(), { locale: 'ru-RU' })\n * // => \"15 янв. 2025 г.\"\n *\n * fDate('2025-01-15')\n * // => \"Jan 15, 2025\"\n * ```\n */\nexport function fDate(date: DateInput, options: FormatDateOptions = {}): string {\n const { locale = 'en-US', ...formatOptions } = options;\n\n const parsed = parseDate(date);\n if (!parsed) return '';\n\n return new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n ...formatOptions,\n }).format(parsed);\n}\n\n/**\n * Format a date with time.\n *\n * @example\n * ```ts\n * fDateTime(new Date())\n * // => \"Jan 15, 2025, 2:30 PM\"\n *\n * fDateTime(new Date(), { hour12: false })\n * // => \"Jan 15, 2025, 14:30\"\n * ```\n */\nexport function fDateTime(date: DateInput, options: FormatDateOptions = {}): string {\n const { locale = 'en-US', ...formatOptions } = options;\n\n const parsed = parseDate(date);\n if (!parsed) return '';\n\n return new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n ...formatOptions,\n }).format(parsed);\n}\n\n/**\n * Format time only.\n *\n * @example\n * ```ts\n * fTime(new Date())\n * // => \"2:30 PM\"\n *\n * fTime(new Date(), { hour12: false })\n * // => \"14:30\"\n *\n * fTime(new Date(), { second: 'numeric' })\n * // => \"2:30:45 PM\"\n * ```\n */\nexport function fTime(date: DateInput, options: FormatDateOptions = {}): string {\n const { locale = 'en-US', ...formatOptions } = options;\n\n const parsed = parseDate(date);\n if (!parsed) return '';\n\n return new Intl.DateTimeFormat(locale, {\n hour: 'numeric',\n minute: 'numeric',\n ...formatOptions,\n }).format(parsed);\n}\n\n/**\n * Format a date as ISO string (YYYY-MM-DD).\n *\n * @example\n * ```ts\n * fDateISO(new Date())\n * // => \"2025-01-15\"\n * ```\n */\nexport function fDateISO(date: DateInput): string {\n const parsed = parseDate(date);\n if (!parsed) return '';\n\n return parsed.toISOString().split('T')[0];\n}\n\n/**\n * Format a timestamp as relative time (e.g., \"2 hours ago\").\n *\n * @example\n * ```ts\n * fRelativeTime(new Date(Date.now() - 3600000))\n * // => \"1 hour ago\"\n *\n * fRelativeTime(new Date(Date.now() + 86400000))\n * // => \"in 1 day\"\n *\n * fRelativeTime(new Date(Date.now() - 86400000 * 7))\n * // => \"1 week ago\"\n * ```\n */\nexport function fRelativeTime(date: DateInput, options: { locale?: string } = {}): string {\n const { locale = 'en-US' } = options;\n\n const parsed = parseDate(date);\n if (!parsed) return '';\n\n const now = new Date();\n const diffMs = parsed.getTime() - now.getTime();\n const diffSeconds = Math.round(diffMs / 1000);\n const diffMinutes = Math.round(diffSeconds / 60);\n const diffHours = Math.round(diffMinutes / 60);\n const diffDays = Math.round(diffHours / 24);\n const diffWeeks = Math.round(diffDays / 7);\n const diffMonths = Math.round(diffDays / 30);\n const diffYears = Math.round(diffDays / 365);\n\n const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });\n\n if (Math.abs(diffSeconds) < 60) {\n return rtf.format(diffSeconds, 'second');\n }\n if (Math.abs(diffMinutes) < 60) {\n return rtf.format(diffMinutes, 'minute');\n }\n if (Math.abs(diffHours) < 24) {\n return rtf.format(diffHours, 'hour');\n }\n if (Math.abs(diffDays) < 7) {\n return rtf.format(diffDays, 'day');\n }\n if (Math.abs(diffWeeks) < 4) {\n return rtf.format(diffWeeks, 'week');\n }\n if (Math.abs(diffMonths) < 12) {\n return rtf.format(diffMonths, 'month');\n }\n return rtf.format(diffYears, 'year');\n}\n\n/**\n * Format a duration in milliseconds to human-readable string.\n *\n * @example\n * ```ts\n * fDuration(3661000)\n * // => \"1h 1m 1s\"\n *\n * fDuration(90000)\n * // => \"1m 30s\"\n *\n * fDuration(1000)\n * // => \"1s\"\n * ```\n */\nexport function fDuration(ms: number | null | undefined): string {\n if (ms === null || ms === undefined || ms < 0) return '';\n\n const seconds = Math.floor((ms / 1000) % 60);\n const minutes = Math.floor((ms / (1000 * 60)) % 60);\n const hours = Math.floor((ms / (1000 * 60 * 60)) % 24);\n const days = Math.floor(ms / (1000 * 60 * 60 * 24));\n\n const parts: string[] = [];\n\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (seconds > 0 || parts.length === 0) parts.push(`${seconds}s`);\n\n return parts.join(' ');\n}\n\n/**\n * Check if a date is today.\n *\n * @example\n * ```ts\n * isToday(new Date())\n * // => true\n *\n * isToday(new Date('2020-01-01'))\n * // => false\n * ```\n */\nexport function isToday(date: DateInput): boolean {\n const parsed = parseDate(date);\n if (!parsed) return false;\n\n const today = new Date();\n return (\n parsed.getDate() === today.getDate() &&\n parsed.getMonth() === today.getMonth() &&\n parsed.getFullYear() === today.getFullYear()\n );\n}\n\n/**\n * Check if a date is yesterday.\n */\nexport function isYesterday(date: DateInput): boolean {\n const parsed = parseDate(date);\n if (!parsed) return false;\n\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n\n return (\n parsed.getDate() === yesterday.getDate() &&\n parsed.getMonth() === yesterday.getMonth() &&\n parsed.getFullYear() === yesterday.getFullYear()\n );\n}\n\n/**\n * Check if a date is within the current week.\n */\nexport function isThisWeek(date: DateInput): boolean {\n const parsed = parseDate(date);\n if (!parsed) return false;\n\n const now = new Date();\n const weekStart = new Date(now);\n weekStart.setDate(now.getDate() - now.getDay());\n weekStart.setHours(0, 0, 0, 0);\n\n const weekEnd = new Date(weekStart);\n weekEnd.setDate(weekStart.getDate() + 6);\n weekEnd.setHours(23, 59, 59, 999);\n\n return parsed >= weekStart && parsed <= weekEnd;\n}\n\n/**\n * Check if a date is in the past.\n */\nexport function isPast(date: DateInput): boolean {\n const parsed = parseDate(date);\n if (!parsed) return false;\n\n return parsed.getTime() < Date.now();\n}\n\n/**\n * Check if a date is in the future.\n */\nexport function isFuture(date: DateInput): boolean {\n const parsed = parseDate(date);\n if (!parsed) return false;\n\n return parsed.getTime() > Date.now();\n}\n\n/**\n * Get the difference between two dates in days.\n */\nexport function diffInDays(date1: DateInput, date2: DateInput): number {\n const d1 = parseDate(date1);\n const d2 = parseDate(date2);\n\n if (!d1 || !d2) return 0;\n\n const diffTime = Math.abs(d2.getTime() - d1.getTime());\n return Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n}\n\n// =============================================================================\n// DATE RANGE UTILITIES (Aurora pattern)\n// =============================================================================\n\n/** One day in milliseconds */\nconst DAY_MS = 1000 * 60 * 60 * 24;\n\n/**\n * Generate an array of dates between start and end.\n *\n * @param startDate - Start date\n * @param endDate - End date\n * @param interval - Interval in milliseconds (default: 1 day)\n * @returns Array of Date objects\n *\n * @example\n * ```ts\n * const dates = getDates(\n * new Date('2025-01-01'),\n * new Date('2025-01-07')\n * );\n * // => [Date(Jan 1), Date(Jan 2), ..., Date(Jan 7)]\n *\n * // With custom interval (every 2 days)\n * const dates = getDates(\n * new Date('2025-01-01'),\n * new Date('2025-01-07'),\n * DAY_MS * 2\n * );\n * // => [Date(Jan 1), Date(Jan 3), Date(Jan 5), Date(Jan 7)]\n * ```\n */\nexport function getDates(startDate: DateInput, endDate: DateInput, interval: number = DAY_MS): Date[] {\n const start = parseDate(startDate);\n const end = parseDate(endDate);\n\n if (!start || !end) return [];\n\n const duration = +end - +start;\n const steps = Math.floor(duration / interval);\n\n return Array.from({ length: steps + 1 }, (_, i) => new Date(start.valueOf() + interval * i));\n}\n\n/**\n * Duration preset for getPastDates.\n */\nexport type DateDurationPreset = 'week' | 'month' | 'quarter' | 'year';\n\n/**\n * Get an array of dates for past duration.\n *\n * @param duration - Duration preset or number of days\n * @returns Array of Date objects from past to present\n *\n * @example\n * ```ts\n * // Last 7 days\n * const weekDates = getPastDates('week');\n *\n * // Last 30 days\n * const monthDates = getPastDates('month');\n *\n * // Last 90 days\n * const quarterDates = getPastDates('quarter');\n *\n * // Last 365 days\n * const yearDates = getPastDates('year');\n *\n * // Custom: last 14 days\n * const customDates = getPastDates(14);\n * ```\n */\nexport function getPastDates(duration: DateDurationPreset | number): Date[] {\n const durationMap: Record<DateDurationPreset, number> = {\n week: 7,\n month: 30,\n quarter: 90,\n year: 365,\n };\n\n const days = typeof duration === 'number' ? duration : durationMap[duration];\n const endDate = new Date();\n const startDate = new Date();\n startDate.setDate(endDate.getDate() - days);\n\n return getDates(startDate, endDate);\n}\n\n/**\n * Get an array of dates for future duration.\n *\n * @param duration - Duration preset or number of days\n * @returns Array of Date objects from present to future\n *\n * @example\n * ```ts\n * // Next 7 days\n * const weekDates = getFutureDates('week');\n *\n * // Next 30 days\n * const monthDates = getFutureDates('month');\n *\n * // Custom: next 14 days\n * const customDates = getFutureDates(14);\n * ```\n */\nexport function getFutureDates(duration: DateDurationPreset | number): Date[] {\n const durationMap: Record<DateDurationPreset, number> = {\n week: 7,\n month: 30,\n quarter: 90,\n year: 365,\n };\n\n const days = typeof duration === 'number' ? duration : durationMap[duration];\n const startDate = new Date();\n const endDate = new Date();\n endDate.setDate(startDate.getDate() + days);\n\n return getDates(startDate, endDate);\n}\n\n/**\n * Get start of day (midnight) for a date.\n *\n * @param date - Input date\n * @returns Date set to 00:00:00.000\n */\nexport function startOfDay(date: DateInput): Date | null {\n const parsed = parseDate(date);\n if (!parsed) return null;\n\n const result = new Date(parsed);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\n/**\n * Get end of day (23:59:59.999) for a date.\n *\n * @param date - Input date\n * @returns Date set to 23:59:59.999\n */\nexport function endOfDay(date: DateInput): Date | null {\n const parsed = parseDate(date);\n if (!parsed) return null;\n\n const result = new Date(parsed);\n result.setHours(23, 59, 59, 999);\n return result;\n}\n\n/**\n * Add days to a date.\n *\n * @param date - Input date\n * @param days - Number of days to add (can be negative)\n * @returns New date with days added\n */\nexport function addDays(date: DateInput, days: number): Date | null {\n const parsed = parseDate(date);\n if (!parsed) return null;\n\n const result = new Date(parsed);\n result.setDate(result.getDate() + days);\n return result;\n}\n\n/**\n * Add months to a date.\n *\n * @param date - Input date\n * @param months - Number of months to add (can be negative)\n * @returns New date with months added\n */\nexport function addMonths(date: DateInput, months: number): Date | null {\n const parsed = parseDate(date);\n if (!parsed) return null;\n\n const result = new Date(parsed);\n result.setMonth(result.getMonth() + months);\n return result;\n}\n","/**\n * String Utilities\n *\n * Common string manipulation utilities.\n *\n * @module @omnitron-dev/prism/utils/string\n */\n\n// =============================================================================\n// TEXT FORMATTING\n// =============================================================================\n\n/**\n * Truncate text with ellipsis.\n *\n * @example\n * ```ts\n * truncate('Hello, World!', 8)\n * // => \"Hello...\"\n *\n * truncate('Short', 10)\n * // => \"Short\"\n *\n * truncate('Hello, World!', 8, '…')\n * // => \"Hello, W…\"\n * ```\n */\nexport function truncate(text: string | null | undefined, length: number, suffix: string = '...'): string {\n if (!text) return '';\n if (text.length <= length) return text;\n\n return text.slice(0, length - suffix.length) + suffix;\n}\n\n/**\n * Get initials from a name.\n *\n * @example\n * ```ts\n * getInitials('John Doe')\n * // => \"JD\"\n *\n * getInitials('Alice Bob Charlie')\n * // => \"AC\"\n *\n * getInitials('SingleName')\n * // => \"SI\"\n * ```\n */\nexport function getInitials(name: string | null | undefined): string {\n if (!name) return '';\n\n const words = name.trim().split(/\\s+/);\n\n if (words.length === 1) {\n return words[0].slice(0, 2).toUpperCase();\n }\n\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n}\n\n/**\n * Capitalize the first letter of a string.\n *\n * @example\n * ```ts\n * capitalize('hello world')\n * // => \"Hello world\"\n * ```\n */\nexport function capitalize(text: string | null | undefined): string {\n if (!text) return '';\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/**\n * Capitalize the first letter of each word.\n *\n * @example\n * ```ts\n * titleCase('hello world')\n * // => \"Hello World\"\n *\n * titleCase('the quick brown fox')\n * // => \"The Quick Brown Fox\"\n * ```\n */\nexport function titleCase(text: string | null | undefined): string {\n if (!text) return '';\n return text.replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\n/**\n * Convert string to kebab-case.\n *\n * @example\n * ```ts\n * kebabCase('Hello World')\n * // => \"hello-world\"\n *\n * kebabCase('camelCaseString')\n * // => \"camel-case-string\"\n * ```\n */\nexport function kebabCase(text: string | null | undefined): string {\n if (!text) return '';\n\n return text\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Convert string to camelCase.\n *\n * @example\n * ```ts\n * camelCase('Hello World')\n * // => \"helloWorld\"\n *\n * camelCase('kebab-case-string')\n * // => \"kebabCaseString\"\n * ```\n */\nexport function camelCase(text: string | null | undefined): string {\n if (!text) return '';\n\n return text.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (_, char) => char.toUpperCase());\n}\n\n/**\n * Convert string to snake_case.\n *\n * @example\n * ```ts\n * snakeCase('Hello World')\n * // => \"hello_world\"\n *\n * snakeCase('camelCaseString')\n * // => \"camel_case_string\"\n * ```\n */\nexport function snakeCase(text: string | null | undefined): string {\n if (!text) return '';\n\n return text\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase();\n}\n\n// =============================================================================\n// SEARCH & HIGHLIGHT\n// =============================================================================\n\n/**\n * Highlight search query in text by wrapping matches in <mark> tags.\n *\n * @example\n * ```ts\n * highlightText('Hello World', 'wor')\n * // => \"Hello <mark>Wor</mark>ld\"\n *\n * highlightText('Test Case', 'test', '<strong>', '</strong>')\n * // => \"<strong>Test</strong> Case\"\n * ```\n */\nexport function highlightText(\n text: string | null | undefined,\n query: string | null | undefined,\n openTag: string = '<mark>',\n closeTag: string = '</mark>'\n): string {\n if (!text) return '';\n if (!query) return text;\n\n const regex = new RegExp(`(${escapeRegExp(query)})`, 'gi');\n return text.replace(regex, `${openTag}$1${closeTag}`);\n}\n\n/**\n * Escape special regex characters in a string.\n *\n * @example\n * ```ts\n * escapeRegExp('test.string+with[special]chars')\n * // => \"test\\\\.string\\\\+with\\\\[special\\\\]chars\"\n * ```\n */\nexport function escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Check if a string contains a substring (case-insensitive).\n *\n * @example\n * ```ts\n * containsIgnoreCase('Hello World', 'WORLD')\n * // => true\n *\n * containsIgnoreCase('Hello World', 'foo')\n * // => false\n * ```\n */\nexport function containsIgnoreCase(text: string | null | undefined, search: string | null | undefined): boolean {\n if (!text || !search) return false;\n return text.toLowerCase().includes(search.toLowerCase());\n}\n\n// =============================================================================\n// VALIDATION\n// =============================================================================\n\n/**\n * Check if a string is empty or whitespace only.\n *\n * @example\n * ```ts\n * isBlank('')\n * // => true\n *\n * isBlank(' ')\n * // => true\n *\n * isBlank('hello')\n * // => false\n * ```\n */\nexport function isBlank(text: string | null | undefined): boolean {\n return !text || text.trim().length === 0;\n}\n\n/**\n * Check if a string is a valid email address (basic check).\n *\n * @example\n * ```ts\n * isEmail('test@example.com')\n * // => true\n *\n * isEmail('invalid')\n * // => false\n * ```\n */\nexport function isEmail(text: string | null | undefined): boolean {\n if (!text) return false;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(text);\n}\n\n/**\n * Check if a string is a valid URL (basic check).\n *\n * @example\n * ```ts\n * isUrl('https://example.com')\n * // => true\n *\n * isUrl('not-a-url')\n * // => false\n * ```\n */\nexport function isUrl(text: string | null | undefined): boolean {\n if (!text) return false;\n try {\n new URL(text);\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// GENERATION\n// =============================================================================\n\n/**\n * Generate a random string of specified length.\n *\n * @example\n * ```ts\n * randomString(8)\n * // => \"a3Bx9kPq\"\n *\n * randomString(16, 'abc123')\n * // => \"a1b3c2a1b3c2a1b3\"\n * ```\n */\nexport function randomString(\n length: number = 8,\n chars: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n): string {\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\n/**\n * Generate a UUID v4.\n *\n * @example\n * ```ts\n * uuid()\n * // => \"550e8400-e29b-41d4-a716-446655440000\"\n * ```\n */\nexport function uuid(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Generate a slug from text.\n *\n * @example\n * ```ts\n * slugify('Hello World!')\n * // => \"hello-world\"\n *\n * slugify('This is a Test String')\n * // => \"this-is-a-test-string\"\n * ```\n */\nexport function slugify(text: string | null | undefined): string {\n if (!text) return '';\n\n return text\n .toString()\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, '-') // Replace spaces with -\n .replace(/[^\\w-]+/g, '') // Remove non-word chars\n .replace(/--+/g, '-') // Replace multiple - with single -\n .replace(/^-+/, '') // Trim - from start\n .replace(/-+$/, ''); // Trim - from end\n}\n","/**\n * LocalStorage Utilities\n *\n * SSR-safe localStorage utilities with JSON serialization support.\n * Inspired by minimal-shared/utils/local-storage pattern.\n *\n * @module @omnitron-dev/prism/utils/storage\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface StorageOptions {\n /** Storage to use (default: localStorage) */\n storage?: Storage;\n /** Serialize function (default: JSON.stringify) */\n serialize?: (value: unknown) => string;\n /** Deserialize function (default: JSON.parse) */\n deserialize?: (value: string) => unknown;\n}\n\n// =============================================================================\n// AVAILABILITY CHECK\n// =============================================================================\n\n/**\n * Check if localStorage is available in the current environment.\n * Handles SSR, private browsing, and quota exceeded scenarios.\n *\n * @example\n * ```ts\n * if (localStorageAvailable()) {\n * localStorage.setItem('key', 'value');\n * }\n * ```\n */\nexport function localStorageAvailable(): boolean {\n try {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const testKey = '__storage_test__';\n window.localStorage.setItem(testKey, testKey);\n window.localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if sessionStorage is available in the current environment.\n *\n * @example\n * ```ts\n * if (sessionStorageAvailable()) {\n * sessionStorage.setItem('key', 'value');\n * }\n * ```\n */\nexport function sessionStorageAvailable(): boolean {\n try {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const testKey = '__storage_test__';\n window.sessionStorage.setItem(testKey, testKey);\n window.sessionStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// GET STORAGE\n// =============================================================================\n\n/**\n * Get a value from localStorage with automatic JSON parsing.\n * Returns defaultValue if key doesn't exist, parsing fails, or storage is unavailable.\n *\n * @param key - Storage key\n * @param defaultValue - Value to return if key doesn't exist or parsing fails\n * @param options - Storage options\n * @returns Parsed value or defaultValue\n *\n * @example\n * ```ts\n * // Simple value\n * const count = getStorage('count', 0);\n *\n * // Object value\n * const user = getStorage<User>('user', null);\n *\n * // With sessionStorage\n * const session = getStorage('session', null, {\n * storage: sessionStorage,\n * });\n * ```\n */\nexport function getStorage<T>(key: string, defaultValue: T, options: StorageOptions = {}): T {\n const { storage = typeof window !== 'undefined' ? window.localStorage : undefined, deserialize = JSON.parse } =\n options;\n\n try {\n if (!storage) {\n return defaultValue;\n }\n\n const value = storage.getItem(key);\n\n if (value === null) {\n return defaultValue;\n }\n\n return deserialize(value) as T;\n } catch {\n return defaultValue;\n }\n}\n\n// =============================================================================\n// SET STORAGE\n// =============================================================================\n\n/**\n * Set a value in localStorage with automatic JSON serialization.\n * Silently fails if storage is unavailable.\n *\n * @param key - Storage key\n * @param value - Value to store (will be JSON serialized)\n * @param options - Storage options\n * @returns true if successful, false otherwise\n *\n * @example\n * ```ts\n * // Simple value\n * setStorage('count', 42);\n *\n * // Object value\n * setStorage('user', { id: 1, name: 'John' });\n *\n * // With sessionStorage\n * setStorage('session', sessionData, {\n * storage: sessionStorage,\n * });\n * ```\n */\nexport function setStorage<T>(key: string, value: T, options: StorageOptions = {}): boolean {\n const { storage = typeof window !== 'undefined' ? window.localStorage : undefined, serialize = JSON.stringify } =\n options;\n\n try {\n if (!storage) {\n return false;\n }\n\n storage.setItem(key, serialize(value));\n return true;\n } catch {\n // Quota exceeded or other storage error\n return false;\n }\n}\n\n// =============================================================================\n// REMOVE STORAGE\n// =============================================================================\n\n/**\n * Remove a value from localStorage.\n * Silently fails if storage is unavailable.\n *\n * @param key - Storage key to remove\n * @param options - Storage options\n * @returns true if successful, false otherwise\n *\n * @example\n * ```ts\n * removeStorage('user');\n *\n * // From sessionStorage\n * removeStorage('session', { storage: sessionStorage });\n * ```\n */\nexport function removeStorage(key: string, options: Pick<StorageOptions, 'storage'> = {}): boolean {\n const { storage = typeof window !== 'undefined' ? window.localStorage : undefined } = options;\n\n try {\n if (!storage) {\n return false;\n }\n\n storage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// CLEAR STORAGE\n// =============================================================================\n\n/**\n * Clear all items from localStorage.\n * Silently fails if storage is unavailable.\n *\n * @param options - Storage options\n * @returns true if successful, false otherwise\n *\n * @example\n * ```ts\n * clearStorage();\n *\n * // Clear sessionStorage\n * clearStorage({ storage: sessionStorage });\n * ```\n */\nexport function clearStorage(options: Pick<StorageOptions, 'storage'> = {}): boolean {\n const { storage = typeof window !== 'undefined' ? window.localStorage : undefined } = options;\n\n try {\n if (!storage) {\n return false;\n }\n\n storage.clear();\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// STORAGE KEYS\n// =============================================================================\n\n/**\n * Get all keys from localStorage.\n *\n * @param options - Storage options\n * @returns Array of storage keys\n *\n * @example\n * ```ts\n * const keys = getStorageKeys();\n * // => ['user', 'settings', 'cart']\n * ```\n */\nexport function getStorageKeys(options: Pick<StorageOptions, 'storage'> = {}): string[] {\n const { storage = typeof window !== 'undefined' ? window.localStorage : undefined } = options;\n\n try {\n if (!storage) {\n return [];\n }\n\n const keys: string[] = [];\n for (let i = 0; i < storage.length; i++) {\n const key = storage.key(i);\n if (key !== null) {\n keys.push(key);\n }\n }\n return keys;\n } catch {\n return [];\n }\n}\n\n// =============================================================================\n// STORAGE SIZE\n// =============================================================================\n\n/**\n * Get approximate size of localStorage in bytes.\n *\n * @param options - Storage options\n * @returns Size in bytes\n *\n * @example\n * ```ts\n * const sizeBytes = getStorageSize();\n * console.log(`Using ${sizeBytes} bytes of localStorage`);\n * ```\n */\nexport function getStorageSize(options: Pick<StorageOptions, 'storage'> = {}): number {\n const { storage = typeof window !== 'undefined' ? window.localStorage : undefined } = options;\n\n try {\n if (!storage) {\n return 0;\n }\n\n let total = 0;\n for (let i = 0; i < storage.length; i++) {\n const key = storage.key(i);\n if (key !== null) {\n const value = storage.getItem(key) ?? '';\n // Each character is 2 bytes in JavaScript\n total += (key.length + value.length) * 2;\n }\n }\n return total;\n } catch {\n return 0;\n }\n}\n\n// =============================================================================\n// STORAGE WITH EXPIRY\n// =============================================================================\n\nexport interface StorageWithExpiryOptions extends StorageOptions {\n /** Time to live in milliseconds */\n ttl: number;\n}\n\ninterface StoredWithExpiry<T> {\n value: T;\n expiry: number;\n}\n\n/**\n * Set a value with expiration time.\n *\n * @param key - Storage key\n * @param value - Value to store\n * @param options - Options with TTL in milliseconds\n *\n * @example\n * ```ts\n * // Store for 1 hour\n * setStorageWithExpiry('session', sessionData, {\n * ttl: 60 * 60 * 1000,\n * });\n *\n * // Store for 24 hours\n * setStorageWithExpiry('cache', cacheData, {\n * ttl: 24 * 60 * 60 * 1000,\n * });\n * ```\n */\nexport function setStorageWithExpiry<T>(key: string, value: T, options: StorageWithExpiryOptions): boolean {\n const { ttl, ...storageOptions } = options;\n\n const item: StoredWithExpiry<T> = {\n value,\n expiry: Date.now() + ttl,\n };\n\n return setStorage(key, item, storageOptions);\n}\n\n/**\n * Get a value that was stored with expiration.\n * Returns defaultValue if expired or not found.\n *\n * @param key - Storage key\n * @param defaultValue - Value to return if expired or not found\n * @param options - Storage options\n *\n * @example\n * ```ts\n * const session = getStorageWithExpiry<Session>('session', null);\n * if (!session) {\n * // Session expired or doesn't exist\n * redirectToLogin();\n * }\n * ```\n */\nexport function getStorageWithExpiry<T>(key: string, defaultValue: T, options: StorageOptions = {}): T {\n const item = getStorage<StoredWithExpiry<T> | null>(key, null, options);\n\n if (!item) {\n return defaultValue;\n }\n\n if (Date.now() > item.expiry) {\n // Expired - remove the item\n removeStorage(key, options);\n return defaultValue;\n }\n\n return item.value;\n}\n","/**\n * Font Utilities\n *\n * Font family and unit conversion helpers.\n *\n * @module @omnitron-dev/prism/utils\n */\n\n/**\n * Default system font stack.\n */\nconst DEFAULT_FONT_STACK =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\"';\n\n/**\n * Create a font family string with fallback stack.\n *\n * @param {string} [fontName] - Primary font name\n * @returns {string} Font family with fallbacks\n *\n * @example\n * ```ts\n * setFont('Inter'); // '\"Inter\", -apple-system, ...'\n * setFont(); // Default system font stack\n * ```\n */\nexport function setFont(fontName?: string): string {\n if (!fontName) {\n return DEFAULT_FONT_STACK;\n }\n\n return `\"${fontName}\", ${DEFAULT_FONT_STACK}`;\n}\n\n/**\n * Convert rem to pixels.\n *\n * @param {string | number} value - Rem value (number or string like '1rem')\n * @returns {number} Value in pixels\n *\n * @example\n * ```ts\n * remToPx(1); // 16\n * remToPx('1rem'); // 16\n * remToPx(1.5); // 24\n * ```\n */\nexport function remToPx(value: string | number): number {\n const numValue = typeof value === 'string' ? parseFloat(value) : value;\n return Math.round(numValue * 16 * 100) / 100;\n}\n\n/**\n * Convert pixels to rem.\n *\n * @param {string | number} value - Pixel value (number or string like '16px')\n * @returns {string} Value in rem with unit\n *\n * @example\n * ```ts\n * pxToRem(16); // '1rem'\n * pxToRem('16px'); // '1rem'\n * pxToRem(24); // '1.5rem'\n * ```\n */\nexport function pxToRem(value: string | number): string {\n const numValue = typeof value === 'string' ? parseFloat(value) : value;\n return `${Math.round((numValue / 16) * 10000) / 10000}rem`;\n}\n\n/**\n * Create responsive font size based on viewport.\n *\n * @param {number} minSize - Minimum font size in px\n * @param {number} maxSize - Maximum font size in px\n * @param {number} [minWidth=320] - Minimum viewport width in px\n * @param {number} [maxWidth=1200] - Maximum viewport width in px\n * @returns {string} CSS clamp() value\n *\n * @example\n * ```ts\n * responsiveFontSize(14, 18);\n * // 'clamp(0.875rem, 0.7955rem + 0.3977vw, 1.125rem)'\n * ```\n */\nexport function responsiveFontSize(minSize: number, maxSize: number, minWidth = 320, maxWidth = 1200): string {\n const minRem = pxToRem(minSize);\n const maxRem = pxToRem(maxSize);\n\n const slope = (maxSize - minSize) / (maxWidth - minWidth);\n const intercept = minSize - slope * minWidth;\n\n const slopeVw = Math.round(slope * 100 * 10000) / 10000;\n const interceptRem = pxToRem(intercept);\n\n return `clamp(${minRem}, ${interceptRem} + ${slopeVw}vw, ${maxRem})`;\n}\n","/**\n * Object Utilities\n *\n * Type-safe object manipulation helpers.\n *\n * @module @omnitron-dev/prism/utils\n */\n\n/**\n * Check if an object has specific keys.\n *\n * Vacuously true when `keys` is empty, in line with `Array.every`\n * — \"every key in the empty set is present\" matches the standard\n * library and avoids surprising callers that pass a dynamically\n * derived list of required keys.\n *\n * @template T - Object type\n * @template K - Key type\n * @param {T | null | undefined} obj - Object to check\n * @param {K[]} keys - Keys to check for\n * @returns {boolean} True if object has all specified keys\n *\n * @example\n * ```ts\n * const user = { name: 'John', email: 'john@example.com' };\n * hasKeys(user, ['name', 'email']); // true\n * hasKeys(user, ['name', 'age']); // false\n * hasKeys(null, ['name']); // false\n * hasKeys(user, []); // true (vacuous)\n * ```\n */\nexport function hasKeys<T extends object, K extends keyof T>(obj: T | null | undefined, keys: K[]): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n return keys.every((key) => key in obj);\n}\n\n/**\n * Omit specific keys from an object.\n *\n * @template T - Object type\n * @template K - Keys to omit\n * @param {T} obj - Source object\n * @param {K[]} keys - Keys to omit\n * @returns {Omit<T, K>} New object without specified keys\n *\n * @example\n * ```ts\n * const user = { name: 'John', email: 'john@example.com', password: '...' };\n * omit(user, ['password']); // { name: 'John', email: 'john@example.com' }\n * ```\n */\nexport function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result as Omit<T, K>;\n}\n\n/**\n * Pick specific keys from an object.\n *\n * @template T - Object type\n * @template K - Keys to pick\n * @param {T} obj - Source object\n * @param {K[]} keys - Keys to pick\n * @returns {Pick<T, K>} New object with only specified keys\n *\n * @example\n * ```ts\n * const user = { name: 'John', email: 'john@example.com', password: '...' };\n * pick(user, ['name', 'email']); // { name: 'John', email: 'john@example.com' }\n * ```\n */\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/**\n * Deep clone an object.\n *\n * @template T - Object type\n * @param {T} obj - Object to clone\n * @returns {T} Deep cloned object\n *\n * @example\n * ```ts\n * const original = { a: 1, b: { c: 2 } };\n * const cloned = deepClone(original);\n * cloned.b.c = 3; // original.b.c is still 2\n * ```\n */\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as unknown as T;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T;\n }\n\n if (obj instanceof RegExp) {\n return new RegExp(obj.source, obj.flags) as unknown as T;\n }\n\n const cloned = {} as T;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = deepClone(obj[key]);\n }\n }\n return cloned;\n}\n\n/**\n * Check if a value is empty (null, undefined, empty string, empty array, empty object).\n *\n * @param {unknown} value - Value to check\n * @returns {boolean} True if empty\n *\n * @example\n * ```ts\n * isEmpty(null); // true\n * isEmpty(''); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty('hello'); // false\n * isEmpty([1]); // false\n * ```\n */\nexport function isEmpty(value: unknown): boolean {\n if (value == null) {\n return true;\n }\n\n if (typeof value === 'string' || Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (typeof value === 'object') {\n return Object.keys(value as object).length === 0;\n }\n\n return false;\n}\n","/**\n * RTL (Right-to-Left) Utilities\n *\n * Helpers for RTL layout support and CSS transformation control.\n *\n * @module @omnitron-dev/prism/utils\n */\n\n/**\n * Prevents automatic RTL (right-to-left) flipping of a CSS declaration.\n *\n * Many CSS-in-JS libraries and RTL plugins automatically flip directional\n * CSS properties (like margin-left → margin-right) for RTL layouts.\n * Use this function to prevent that behavior for specific declarations.\n *\n * Appends the `\\/* @noflip *\\/` comment which is recognized by:\n * - stylis (used by Emotion/styled-components)\n * - rtlcss\n * - cssjanus\n *\n * @param cssValue - A CSS declaration string (e.g., \"margin-left: 10px\")\n * @returns The same declaration with `\\/* @noflip *\\/` appended\n *\n * @example\n * ```tsx\n * import { noRtlFlip } from '@omnitron-dev/prism/utils';\n *\n * // In sx prop or styled components\n * const styles = {\n * // This margin-left will stay as margin-left even in RTL\n * marginLeft: noRtlFlip('10px'),\n *\n * // Or for full declarations\n * transform: noRtlFlip('translateX(100px)'),\n * };\n *\n * // Common use case: icons that shouldn't flip\n * <ChevronIcon sx={{ transform: noRtlFlip('rotate(0deg)') }} />\n *\n * // Progress indicators that fill from left regardless of RTL\n * <ProgressBar sx={{ left: noRtlFlip('0'), right: 'auto' }} />\n * ```\n */\nexport function noRtlFlip(cssValue: unknown): string {\n if (typeof cssValue !== 'string') {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[noRtlFlip] Invalid CSS value provided:', cssValue);\n }\n return '';\n }\n\n const trimmed = cssValue.trim();\n\n if (!trimmed) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[noRtlFlip] Empty CSS value provided');\n }\n return '';\n }\n\n // Already has the noflip comment\n if (trimmed.includes('/* @noflip */')) {\n return trimmed;\n }\n\n return `${trimmed} /* @noflip */`;\n}\n\n/**\n * Check if the current document direction is RTL.\n *\n * @returns True if the document direction is RTL\n *\n * @example\n * ```tsx\n * const isRtl = isRtlDirection();\n *\n * // Conditional styling\n * const style = {\n * marginLeft: isRtl ? '0' : '10px',\n * marginRight: isRtl ? '10px' : '0',\n * };\n * ```\n */\nexport function isRtlDirection(): boolean {\n if (typeof document === 'undefined') {\n return false;\n }\n\n return (\n document.documentElement.dir === 'rtl' ||\n document.body.dir === 'rtl' ||\n document.documentElement.getAttribute('dir') === 'rtl'\n );\n}\n\n/**\n * Get the appropriate directional property name based on RTL state.\n *\n * @param property - Base property name (e.g., 'left', 'marginLeft')\n * @param isRtl - Whether the layout is RTL\n * @returns The appropriate property name\n *\n * @example\n * ```tsx\n * const prop = getDirectionalProperty('left', isRtl);\n * // Returns 'right' if isRtl, 'left' otherwise\n * ```\n */\nexport function getDirectionalProperty(\n property: 'left' | 'right' | 'marginLeft' | 'marginRight' | 'paddingLeft' | 'paddingRight',\n isRtl: boolean\n): string {\n const mappings: Record<string, string> = {\n left: isRtl ? 'right' : 'left',\n right: isRtl ? 'left' : 'right',\n marginLeft: isRtl ? 'marginRight' : 'marginLeft',\n marginRight: isRtl ? 'marginLeft' : 'marginRight',\n paddingLeft: isRtl ? 'paddingRight' : 'paddingLeft',\n paddingRight: isRtl ? 'paddingLeft' : 'paddingRight',\n };\n\n return mappings[property] ?? property;\n}\n","/**\n * AsyncLock Utility\n *\n * Prevents race conditions in async operations like token refresh.\n * Ensures only one operation runs at a time, with subsequent calls\n * waiting for and sharing the result of the in-flight operation.\n *\n * @module @omnitron-dev/prism/utils\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Options for AsyncLock.\n */\nexport interface AsyncLockOptions {\n /** Timeout in milliseconds for the lock acquisition (default: 30000) */\n timeout?: number;\n /** Custom error message for timeout */\n timeoutMessage?: string;\n}\n\n/**\n * Result from a locked operation.\n */\nexport interface AsyncLockResult<T> {\n /** The result value */\n value: T;\n /** Whether this call executed the operation (vs waiting for another) */\n wasExecutor: boolean;\n}\n\n/**\n * State of the lock.\n */\nexport type AsyncLockState = 'idle' | 'locked' | 'releasing';\n\n// =============================================================================\n// ASYNC LOCK CLASS\n// =============================================================================\n\n/**\n * AsyncLock prevents race conditions in concurrent async operations.\n *\n * Use cases:\n * - Token refresh: Multiple API calls fail simultaneously, only one should refresh\n * - Resource initialization: Expensive setup should happen once\n * - Cache population: Prevent thundering herd problem\n *\n * @example\n * ```tsx\n * import { AsyncLock } from '@omnitron-dev/prism/utils';\n *\n * const tokenRefreshLock = new AsyncLock({ timeout: 10000 });\n *\n * async function refreshToken(): Promise<string> {\n * const { value: newToken } = await tokenRefreshLock.acquire(\n * 'refresh-token',\n * async () => {\n * // This only runs once even if called concurrently\n * const response = await fetch('/auth/refresh', { method: 'POST' });\n * const data = await response.json();\n * return data.accessToken;\n * }\n * );\n * return newToken;\n * }\n *\n * // Multiple concurrent calls share the same result\n * const [token1, token2, token3] = await Promise.all([\n * refreshToken(), // Executes the actual refresh\n * refreshToken(), // Waits for first to complete\n * refreshToken(), // Waits for first to complete\n * ]);\n * // token1 === token2 === token3\n * ```\n */\nexport class AsyncLock {\n private locks: Map<string, Promise<unknown>> = new Map();\n private resolvers: Map<string, (value: unknown) => void> = new Map();\n private rejecters: Map<string, (error: unknown) => void> = new Map();\n private options: Required<AsyncLockOptions>;\n\n constructor(options: AsyncLockOptions = {}) {\n this.options = {\n timeout: options.timeout ?? 30000,\n timeoutMessage: options.timeoutMessage ?? 'Lock acquisition timed out',\n };\n }\n\n /**\n * Current state of a specific lock.\n */\n getState(key: string): AsyncLockState {\n return this.locks.has(key) ? 'locked' : 'idle';\n }\n\n /**\n * Check if a specific lock is currently held.\n */\n isLocked(key: string): boolean {\n return this.locks.has(key);\n }\n\n /**\n * Get all currently active lock keys.\n */\n getActiveLocks(): string[] {\n return Array.from(this.locks.keys());\n }\n\n /**\n * Acquire the lock and execute the operation.\n * If the lock is already held, waits for the existing operation.\n *\n * @param key - Unique identifier for this lock\n * @param operation - Async operation to execute\n * @returns Result with the value and whether this call was the executor\n */\n async acquire<T>(key: string, operation: () => Promise<T>): Promise<AsyncLockResult<T>> {\n // If lock exists, wait for it\n const existingLock = this.locks.get(key);\n if (existingLock) {\n const value = await this.waitWithTimeout(existingLock, key);\n return { value: value as T, wasExecutor: false };\n }\n\n // Create new lock\n let resolvePromise: (value: unknown) => void;\n let rejectPromise: (error: unknown) => void;\n\n const lockPromise = new Promise<unknown>((resolve, reject) => {\n resolvePromise = resolve;\n rejectPromise = reject;\n });\n\n this.locks.set(key, lockPromise);\n this.resolvers.set(key, resolvePromise!);\n this.rejecters.set(key, rejectPromise!);\n\n try {\n const result = await operation();\n\n // Resolve for all waiters\n const resolver = this.resolvers.get(key);\n if (resolver) {\n resolver(result);\n }\n\n return { value: result, wasExecutor: true };\n } catch (error) {\n // Reject for all waiters\n const rejecter = this.rejecters.get(key);\n if (rejecter) {\n rejecter(error);\n }\n\n throw error;\n } finally {\n // Clean up\n this.locks.delete(key);\n this.resolvers.delete(key);\n this.rejecters.delete(key);\n }\n }\n\n /**\n * Try to acquire the lock without waiting.\n * Returns immediately if lock is held.\n *\n * @param key - Unique identifier for this lock\n * @param operation - Async operation to execute\n * @returns Result or null if lock was already held\n */\n async tryAcquire<T>(key: string, operation: () => Promise<T>): Promise<AsyncLockResult<T> | null> {\n if (this.isLocked(key)) {\n return null;\n }\n return this.acquire(key, operation);\n }\n\n /**\n * Force release a lock (use with caution).\n * This will reject all waiters with the provided error.\n */\n forceRelease(key: string, error?: Error): void {\n const rejecter = this.rejecters.get(key);\n if (rejecter) {\n rejecter(error ?? new Error('Lock forcefully released'));\n }\n this.locks.delete(key);\n this.resolvers.delete(key);\n this.rejecters.delete(key);\n }\n\n /**\n * Clear all locks (use with caution, e.g., on logout).\n */\n clearAll(error?: Error): void {\n for (const key of this.locks.keys()) {\n this.forceRelease(key, error);\n }\n }\n\n /**\n * Wait for a promise with timeout.\n */\n private async waitWithTimeout<T>(promise: Promise<T>, key: string): Promise<T> {\n const { timeout, timeoutMessage } = this.options;\n\n if (timeout <= 0) {\n return promise;\n }\n\n return Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new AsyncLockTimeoutError(`${timeoutMessage} (key: ${key})`));\n }, timeout);\n }),\n ]);\n }\n}\n\n// =============================================================================\n// ERROR CLASSES\n// =============================================================================\n\n/**\n * Error thrown when lock acquisition times out.\n */\nexport class AsyncLockTimeoutError extends Error {\n readonly name = 'AsyncLockTimeoutError';\n\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, AsyncLockTimeoutError.prototype);\n }\n}\n\n// =============================================================================\n// FACTORY FUNCTIONS\n// =============================================================================\n\n/**\n * Create a singleton AsyncLock instance for a specific use case.\n *\n * @example\n * ```tsx\n * import { createAsyncLock } from '@omnitron-dev/prism/utils';\n *\n * // Create a singleton lock for token refresh\n * const tokenLock = createAsyncLock({ timeout: 10000 });\n *\n * // Use in multiple places - same lock instance\n * async function apiCall() {\n * if (isTokenExpired()) {\n * await tokenLock.acquire('token', refreshToken);\n * }\n * // Make API call...\n * }\n * ```\n */\nexport function createAsyncLock(options?: AsyncLockOptions): AsyncLock {\n return new AsyncLock(options);\n}\n\n/**\n * Create a pre-configured lock for token refresh operations.\n * Uses sensible defaults for auth token refresh scenarios.\n */\nexport function createTokenRefreshLock(): AsyncLock {\n return new AsyncLock({\n timeout: 15000,\n timeoutMessage: 'Token refresh timed out',\n });\n}\n\n// =============================================================================\n// UTILITY FUNCTIONS\n// =============================================================================\n\n/**\n * Execute an operation with automatic locking.\n * Convenience function for one-off locked operations.\n *\n * @example\n * ```tsx\n * import { withLock } from '@omnitron-dev/prism/utils';\n *\n * const result = await withLock('init-cache', async () => {\n * const data = await fetchData();\n * cache.set('data', data);\n * return data;\n * });\n * ```\n */\nconst globalLock = new AsyncLock();\n\nexport async function withLock<T>(key: string, operation: () => Promise<T>, options?: AsyncLockOptions): Promise<T> {\n const lock = options ? new AsyncLock(options) : globalLock;\n const { value } = await lock.acquire(key, operation);\n return value;\n}\n\n/**\n * Decorator factory for methods that should be locked.\n * Use with class methods to ensure single execution.\n *\n * @example\n * ```tsx\n * import { locked } from '@omnitron-dev/prism/utils';\n *\n * class AuthService {\n * @locked('refresh')\n * async refreshToken(): Promise<string> {\n * // Only one instance runs at a time\n * return await this.doRefresh();\n * }\n * }\n * ```\n */\nexport function locked(key: string, options?: AsyncLockOptions) {\n const lock = new AsyncLock(options);\n\n return function <T extends (...args: unknown[]) => Promise<unknown>>(\n _target: object,\n _propertyKey: string,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value;\n\n if (!originalMethod) {\n return descriptor;\n }\n\n descriptor.value = async function (this: unknown, ...args: unknown[]) {\n const { value } = await lock.acquire(key, () => originalMethod.apply(this, args));\n return value;\n } as T;\n\n return descriptor;\n };\n}\n","/**\n * Error Handling Utilities\n *\n * Comprehensive error handling with i18n support, error classification,\n * and retry logic for robust frontend applications.\n *\n * @module @omnitron-dev/prism/utils\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Error codes for classification.\n */\nexport type ErrorCode =\n // Auth errors\n | 'AUTH_REQUIRED'\n | 'AUTH_EXPIRED'\n | 'AUTH_INVALID'\n | 'AUTH_FORBIDDEN'\n | 'AUTH_MFA_REQUIRED'\n | 'AUTH_DEVICE_BLOCKED'\n // Network errors\n | 'NETWORK_ERROR'\n | 'NETWORK_TIMEOUT'\n | 'NETWORK_OFFLINE'\n // Validation errors\n | 'VALIDATION_ERROR'\n | 'VALIDATION_REQUIRED'\n | 'VALIDATION_FORMAT'\n | 'VALIDATION_RANGE'\n // Server errors\n | 'SERVER_ERROR'\n | 'SERVER_UNAVAILABLE'\n | 'SERVER_MAINTENANCE'\n // Client errors\n | 'NOT_FOUND'\n | 'CONFLICT'\n | 'RATE_LIMITED'\n | 'QUOTA_EXCEEDED'\n // Generic\n | 'UNKNOWN_ERROR'\n | string;\n\n/**\n * Severity levels for errors.\n */\nexport type ErrorSeverity = 'error' | 'warning' | 'info';\n\n/**\n * Error context for i18n.\n */\nexport interface ErrorContext {\n /** Error code for lookup */\n code: ErrorCode;\n /** HTTP status code if applicable */\n status?: number;\n /** Field name for validation errors */\n field?: string;\n /** Additional interpolation values */\n values?: Record<string, string | number>;\n /** Original error message (fallback) */\n message?: string;\n /** Retry information */\n retryAfter?: number;\n /** Severity level */\n severity?: ErrorSeverity;\n}\n\n/**\n * Translated error result.\n */\nexport interface TranslatedError {\n /** Translated title */\n title: string;\n /** Translated message */\n message: string;\n /** Error code */\n code: ErrorCode;\n /** Severity */\n severity: ErrorSeverity;\n /** Action hint (e.g., \"Please log in again\") */\n action?: string;\n /** Retry after seconds */\n retryAfter?: number;\n /** Is this a retryable error */\n canRetry: boolean;\n}\n\n/**\n * Translation function type.\n */\nexport type TranslateFn = (key: string, values?: Record<string, string | number>) => string;\n\n/**\n * Error messages dictionary type.\n */\nexport interface ErrorMessages {\n [code: string]: {\n title: string;\n message: string;\n action?: string;\n };\n}\n\n// =============================================================================\n// DEFAULT ERROR MESSAGES\n// =============================================================================\n\n/**\n * Default error messages in English.\n * Can be replaced with i18n translations.\n */\nexport const DEFAULT_ERROR_MESSAGES: ErrorMessages = {\n // Auth\n AUTH_REQUIRED: {\n title: 'Authentication Required',\n message: 'Please log in to continue.',\n action: 'Log in',\n },\n AUTH_EXPIRED: {\n title: 'Session Expired',\n message: 'Your session has expired. Please log in again.',\n action: 'Log in again',\n },\n AUTH_INVALID: {\n title: 'Invalid Credentials',\n message: 'The provided credentials are invalid.',\n action: 'Try again',\n },\n AUTH_FORBIDDEN: {\n title: 'Access Denied',\n message: \"You don't have permission to access this resource.\",\n },\n AUTH_MFA_REQUIRED: {\n title: 'Verification Required',\n message: 'Please complete two-factor authentication.',\n action: 'Verify',\n },\n AUTH_DEVICE_BLOCKED: {\n title: 'Device Blocked',\n message: 'This device has been blocked. Contact support for assistance.',\n },\n // Network\n NETWORK_ERROR: {\n title: 'Connection Error',\n message: 'Unable to connect to the server. Please check your connection.',\n action: 'Retry',\n },\n NETWORK_TIMEOUT: {\n title: 'Request Timeout',\n message: 'The request took too long. Please try again.',\n action: 'Retry',\n },\n NETWORK_OFFLINE: {\n title: 'Offline',\n message: \"You're currently offline. Please check your internet connection.\",\n },\n // Validation\n VALIDATION_ERROR: {\n title: 'Validation Error',\n message: 'Please check your input and try again.',\n },\n VALIDATION_REQUIRED: {\n title: 'Required Field',\n message: 'This field is required.',\n },\n VALIDATION_FORMAT: {\n title: 'Invalid Format',\n message: 'Please enter a valid format.',\n },\n VALIDATION_RANGE: {\n title: 'Out of Range',\n message: 'The value is out of the allowed range.',\n },\n // Server\n SERVER_ERROR: {\n title: 'Server Error',\n message: 'Something went wrong on our end. Please try again later.',\n action: 'Retry',\n },\n SERVER_UNAVAILABLE: {\n title: 'Service Unavailable',\n message: 'The service is temporarily unavailable. Please try again later.',\n action: 'Retry',\n },\n SERVER_MAINTENANCE: {\n title: 'Under Maintenance',\n message: \"We're performing maintenance. Please check back soon.\",\n },\n // Client\n NOT_FOUND: {\n title: 'Not Found',\n message: 'The requested resource could not be found.',\n },\n CONFLICT: {\n title: 'Conflict',\n message: 'The resource was modified. Please refresh and try again.',\n action: 'Refresh',\n },\n RATE_LIMITED: {\n title: 'Too Many Requests',\n message: 'Please slow down and try again later.',\n },\n QUOTA_EXCEEDED: {\n title: 'Quota Exceeded',\n message: 'You have exceeded your usage quota.',\n },\n // Generic\n UNKNOWN_ERROR: {\n title: 'Error',\n message: 'An unexpected error occurred. Please try again.',\n action: 'Retry',\n },\n};\n\n// =============================================================================\n// ERROR CLASSIFICATION\n// =============================================================================\n\n/**\n * Classify an error by HTTP status code.\n */\nexport function classifyHttpError(status: number): ErrorCode {\n switch (status) {\n case 400:\n return 'VALIDATION_ERROR';\n case 401:\n return 'AUTH_REQUIRED';\n case 403:\n return 'AUTH_FORBIDDEN';\n case 404:\n return 'NOT_FOUND';\n case 408:\n return 'NETWORK_TIMEOUT';\n case 409:\n return 'CONFLICT';\n case 429:\n return 'RATE_LIMITED';\n case 500:\n return 'SERVER_ERROR';\n case 502:\n case 503:\n case 504:\n return 'SERVER_UNAVAILABLE';\n default:\n if (status >= 400 && status < 500) return 'VALIDATION_ERROR';\n if (status >= 500) return 'SERVER_ERROR';\n return 'UNKNOWN_ERROR';\n }\n}\n\n/**\n * Check if an error is a network error.\n */\nexport function isNetworkError(error: unknown): boolean {\n if (error instanceof TypeError && error.message.includes('fetch')) {\n return true;\n }\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('network') ||\n message.includes('connection') ||\n message.includes('offline') ||\n message.includes('failed to fetch')\n );\n }\n return false;\n}\n\n/**\n * Check if an error is retryable.\n */\nexport function isRetryableError(code: ErrorCode): boolean {\n const retryableCodes: ErrorCode[] = [\n 'NETWORK_ERROR',\n 'NETWORK_TIMEOUT',\n 'SERVER_ERROR',\n 'SERVER_UNAVAILABLE',\n 'RATE_LIMITED',\n 'CONFLICT',\n ];\n return retryableCodes.includes(code);\n}\n\n/**\n * Get severity for an error code.\n */\nexport function getErrorSeverity(code: ErrorCode): ErrorSeverity {\n // Warnings (recoverable, action possible)\n const warnings: ErrorCode[] = ['AUTH_EXPIRED', 'RATE_LIMITED', 'NETWORK_OFFLINE', 'AUTH_MFA_REQUIRED'];\n\n // Info (informational, not blocking)\n const infos: ErrorCode[] = ['SERVER_MAINTENANCE'];\n\n if (warnings.includes(code)) return 'warning';\n if (infos.includes(code)) return 'info';\n return 'error';\n}\n\n// =============================================================================\n// ERROR TRANSLATION\n// =============================================================================\n\n/**\n * Create an error translator with custom messages or i18n function.\n *\n * @example\n * ```tsx\n * // With custom messages\n * const translate = createErrorTranslator({\n * messages: {\n * AUTH_REQUIRED: {\n * title: 'Необходима авторизация',\n * message: 'Пожалуйста, войдите в систему.',\n * },\n * },\n * });\n *\n * // With i18n library\n * const translate = createErrorTranslator({\n * t: (key, values) => i18n.t(key, values),\n * });\n *\n * const error = translate({ code: 'AUTH_REQUIRED', status: 401 });\n * // { title: 'Необходима авторизация', message: '...', ... }\n * ```\n */\nexport function createErrorTranslator(options: {\n messages?: ErrorMessages;\n t?: TranslateFn;\n fallbackMessages?: ErrorMessages;\n}): (context: ErrorContext) => TranslatedError {\n const { messages = {}, t, fallbackMessages = DEFAULT_ERROR_MESSAGES } = options;\n\n return (context: ErrorContext): TranslatedError => {\n const { code, values, message: originalMessage, severity, retryAfter } = context;\n\n // Try i18n translation first\n if (t) {\n const titleKey = `errors.${code}.title`;\n const messageKey = `errors.${code}.message`;\n const actionKey = `errors.${code}.action`;\n\n const title = t(titleKey, values);\n const translatedMessage = t(messageKey, values);\n const action = t(actionKey, values);\n\n // If translation was found (not equal to key)\n if (title !== titleKey) {\n return {\n title,\n message: translatedMessage !== messageKey ? translatedMessage : originalMessage || '',\n code,\n severity: severity ?? getErrorSeverity(code),\n action: action !== actionKey ? action : undefined,\n retryAfter,\n canRetry: isRetryableError(code),\n };\n }\n }\n\n // Try custom messages, then fallback\n const errorDef = messages[code] ?? fallbackMessages[code] ?? fallbackMessages.UNKNOWN_ERROR;\n\n return {\n title: errorDef.title,\n message: interpolateMessage(errorDef.message, values) || originalMessage || errorDef.message,\n code,\n severity: severity ?? getErrorSeverity(code),\n action: errorDef.action,\n retryAfter,\n canRetry: isRetryableError(code),\n };\n };\n}\n\n/**\n * Simple message interpolation.\n */\nfunction interpolateMessage(template: string, values?: Record<string, string | number>): string {\n if (!values) return template;\n return Object.entries(values).reduce(\n (msg, [key, value]) => msg.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), String(value)),\n template\n );\n}\n\n// =============================================================================\n// ERROR EXTRACTION\n// =============================================================================\n\n/**\n * Extract error context from various error types.\n *\n * @example\n * ```tsx\n * try {\n * await api.call();\n * } catch (error) {\n * const context = extractErrorContext(error);\n * const translated = translateError(context);\n * showNotification(translated);\n * }\n * ```\n */\nexport function extractErrorContext(error: unknown): ErrorContext {\n // Already an ErrorContext\n if (isErrorContext(error)) {\n return error;\n }\n\n // Response-like object (fetch Response or similar)\n if (isResponseLike(error)) {\n return {\n code: classifyHttpError(error.status),\n status: error.status,\n message: error.statusText,\n };\n }\n\n // Error with response property (axios-like)\n if (hasResponseProperty(error)) {\n const response = error.response;\n const data = response.data;\n\n // Extract typed values from response data with safe fallbacks\n const code = typeof data?.code === 'string' ? data.code : classifyHttpError(response.status);\n const message = typeof data?.message === 'string' ? data.message : response.statusText;\n const field = typeof data?.field === 'string' ? data.field : undefined;\n const values =\n data?.values !== undefined &&\n typeof data.values === 'object' &&\n data.values !== null &&\n !Array.isArray(data.values)\n ? (data.values as Record<string, string | number>)\n : undefined;\n\n return {\n code,\n status: response.status,\n message,\n values,\n field,\n };\n }\n\n // Network error\n if (isNetworkError(error)) {\n return {\n code: navigator?.onLine === false ? 'NETWORK_OFFLINE' : 'NETWORK_ERROR',\n message: error instanceof Error ? error.message : 'Network error',\n };\n }\n\n // Generic Error\n if (error instanceof Error) {\n return {\n code: 'UNKNOWN_ERROR',\n message: error.message,\n };\n }\n\n // String error\n if (typeof error === 'string') {\n return {\n code: 'UNKNOWN_ERROR',\n message: error,\n };\n }\n\n // Object with message/code\n if (error && typeof error === 'object') {\n const obj = error as Record<string, unknown>;\n return {\n code: (typeof obj.code === 'string' ? obj.code : 'UNKNOWN_ERROR') as ErrorCode,\n message: typeof obj.message === 'string' ? obj.message : undefined,\n status: typeof obj.status === 'number' ? obj.status : undefined,\n };\n }\n\n return { code: 'UNKNOWN_ERROR' };\n}\n\n// Type guards\nfunction isErrorContext(value: unknown): value is ErrorContext {\n return (\n value !== null && typeof value === 'object' && 'code' in value && typeof (value as ErrorContext).code === 'string'\n );\n}\n\nfunction isResponseLike(value: unknown): value is { status: number; statusText: string } {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'status' in value &&\n typeof (value as Record<string, unknown>).status === 'number'\n );\n}\n\nfunction hasResponseProperty(\n value: unknown\n): value is { response: { status: number; statusText: string; data?: Record<string, unknown> } } {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'response' in value &&\n isResponseLike((value as Record<string, unknown>).response)\n );\n}\n\n// =============================================================================\n// RETRY UTILITIES\n// =============================================================================\n\n/**\n * Retry configuration.\n */\nexport interface RetryConfig {\n /** Maximum number of retries */\n maxRetries?: number;\n /** Initial delay in ms */\n initialDelay?: number;\n /** Maximum delay in ms */\n maxDelay?: number;\n /** Exponential backoff factor */\n backoffFactor?: number;\n /** Add jitter to delays */\n jitter?: boolean;\n /** Custom retry condition */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n /** Called before each retry */\n onRetry?: (error: unknown, attempt: number, delay: number) => void;\n}\n\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n maxRetries: 3,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffFactor: 2,\n jitter: true,\n shouldRetry: (error) => {\n const context = extractErrorContext(error);\n return isRetryableError(context.code);\n },\n onRetry: () => {},\n};\n\n/**\n * Execute an async operation with automatic retry.\n *\n * @example\n * ```tsx\n * const result = await withRetry(\n * () => fetch('/api/data'),\n * {\n * maxRetries: 3,\n * onRetry: (error, attempt, delay) => {\n * console.log(`Retry ${attempt} after ${delay}ms`);\n * },\n * }\n * );\n * ```\n */\nexport async function withRetry<T>(operation: () => Promise<T>, config?: RetryConfig): Promise<T> {\n const opts = { ...DEFAULT_RETRY_CONFIG, ...config };\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n\n if (attempt === opts.maxRetries || !opts.shouldRetry(error, attempt)) {\n throw error;\n }\n\n const delay = calculateDelay(attempt, opts);\n opts.onRetry(error, attempt + 1, delay);\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n\n/**\n * Calculate delay with exponential backoff and optional jitter.\n */\nfunction calculateDelay(attempt: number, config: Required<RetryConfig>): number {\n let delay = config.initialDelay * Math.pow(config.backoffFactor, attempt);\n delay = Math.min(delay, config.maxDelay);\n\n if (config.jitter) {\n // Add ±25% jitter\n delay = delay * (0.75 + Math.random() * 0.5);\n }\n\n return Math.round(delay);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// =============================================================================\n// ERROR BOUNDARY HELPERS\n// =============================================================================\n\n/**\n * Check if error is a chunk load error (code splitting failure).\n */\nexport function isChunkLoadError(error: unknown): boolean {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('loading chunk') ||\n message.includes('loading css chunk') ||\n message.includes('dynamically imported module')\n );\n }\n return false;\n}\n\n/**\n * Check if error is a session expiry error.\n */\nexport function isSessionExpiredError(error: unknown): boolean {\n const context = extractErrorContext(error);\n return context.code === 'AUTH_EXPIRED' || context.code === 'AUTH_REQUIRED';\n}\n\n/**\n * Create a handler for error boundary recovery.\n */\nexport function createErrorRecoveryHandler(options: {\n onChunkError?: () => void;\n onSessionExpired?: () => void;\n onNetworkError?: () => void;\n onGenericError?: (error: unknown) => void;\n}): (error: unknown) => void {\n return (error: unknown) => {\n if (isChunkLoadError(error)) {\n options.onChunkError?.();\n return;\n }\n\n if (isSessionExpiredError(error)) {\n options.onSessionExpired?.();\n return;\n }\n\n if (isNetworkError(error)) {\n options.onNetworkError?.();\n return;\n }\n\n options.onGenericError?.(error);\n };\n}\n","/**\n * Fetch Interceptor Factory\n *\n * A flexible fetch wrapper with support for request/response interceptors,\n * automatic token refresh, and retry logic.\n *\n * Designed for production applications that need centralized HTTP handling.\n *\n * @module @omnitron-dev/prism/utils\n */\n\nimport { createAsyncLock, type AsyncLock } from './async-lock.js';\nimport { extractErrorContext, withRetry, type RetryConfig } from './errors.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Extended request init with additional options.\n */\nexport interface FetchRequestInit extends RequestInit {\n /** Skip all interceptors for this request */\n skipInterceptors?: boolean;\n /** Skip request interceptors only */\n skipRequestInterceptors?: boolean;\n /** Skip response interceptors only */\n skipResponseInterceptors?: boolean;\n /** Custom timeout in milliseconds */\n timeout?: number;\n /** Enable automatic retry on failure */\n retry?: boolean | RetryConfig;\n /** Request metadata for logging/debugging */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Request interceptor context.\n */\nexport interface RequestContext {\n url: string;\n init: FetchRequestInit;\n /** Original request info (can be string or Request) */\n input: RequestInfo | URL;\n /** Request metadata */\n metadata: Record<string, unknown>;\n}\n\n/**\n * Response interceptor context.\n */\nexport interface ResponseContext {\n response: Response;\n request: RequestContext;\n /** Time taken for the request in ms */\n duration: number;\n}\n\n/**\n * Error interceptor context.\n */\nexport interface ErrorContext {\n error: unknown;\n request: RequestContext;\n /** Time taken before error in ms */\n duration: number;\n /** Number of retry attempts made */\n retryCount: number;\n}\n\n/**\n * Request interceptor function.\n * Can modify the request or return a new one.\n */\nexport type RequestInterceptor = (ctx: RequestContext) => RequestContext | Promise<RequestContext>;\n\n/**\n * Response interceptor function.\n * Can modify the response or return a new one.\n */\nexport type ResponseInterceptor = (ctx: ResponseContext) => Response | Promise<Response>;\n\n/**\n * Error interceptor function.\n * Can handle the error, retry, or rethrow.\n */\nexport type ErrorInterceptor = (ctx: ErrorContext) => Response | Promise<Response> | never;\n\n/**\n * Interceptor configuration.\n */\nexport interface FetchInterceptorConfig {\n /** Base URL to prepend to relative paths */\n baseUrl?: string;\n /** Default headers for all requests */\n defaultHeaders?: HeadersInit;\n /** Default timeout in milliseconds (0 = no timeout) */\n defaultTimeout?: number;\n /** Request interceptors (run in order) */\n requestInterceptors?: RequestInterceptor[];\n /** Response interceptors (run in order) */\n responseInterceptors?: ResponseInterceptor[];\n /** Error interceptors (run in order, first to handle wins) */\n errorInterceptors?: ErrorInterceptor[];\n /** Default retry configuration */\n defaultRetry?: RetryConfig | false;\n /** Credentials mode for all requests */\n credentials?: RequestCredentials;\n}\n\n/**\n * Token refresh handler configuration.\n */\nexport interface TokenRefreshConfig {\n /** Check if a response indicates token expiration */\n isTokenExpired: (response: Response) => boolean;\n /** Refresh the token (called when token is expired) */\n refreshToken: () => Promise<string | null>;\n /** Get the current access token */\n getAccessToken: () => string | null;\n /** Called when refresh fails (e.g., redirect to login) */\n onRefreshFailure?: () => void;\n /** Maximum number of refresh attempts */\n maxRefreshAttempts?: number;\n}\n\n/**\n * Fetch client interface.\n */\nexport interface FetchClient {\n /** Make a fetch request */\n fetch: (input: RequestInfo | URL, init?: FetchRequestInit) => Promise<Response>;\n /** Add a request interceptor */\n addRequestInterceptor: (interceptor: RequestInterceptor) => () => void;\n /** Add a response interceptor */\n addResponseInterceptor: (interceptor: ResponseInterceptor) => () => void;\n /** Add an error interceptor */\n addErrorInterceptor: (interceptor: ErrorInterceptor) => () => void;\n /** Remove all interceptors */\n clearInterceptors: () => void;\n /** Get current configuration */\n getConfig: () => FetchInterceptorConfig;\n}\n\n// =============================================================================\n// FETCH INTERCEPTOR FACTORY\n// =============================================================================\n\n/**\n * Create a fetch client with interceptor support.\n *\n * @example\n * ```tsx\n * // Basic usage\n * const api = createFetchClient({\n * baseUrl: 'https://api.example.com',\n * defaultHeaders: { 'Content-Type': 'application/json' },\n * defaultTimeout: 30000,\n * });\n *\n * // Add auth header interceptor\n * api.addRequestInterceptor(async (ctx) => {\n * const token = getAccessToken();\n * if (token) {\n * ctx.init.headers = {\n * ...ctx.init.headers,\n * Authorization: `Bearer ${token}`,\n * };\n * }\n * return ctx;\n * });\n *\n * // Add response logging\n * api.addResponseInterceptor(async (ctx) => {\n * console.log(`${ctx.request.init.method} ${ctx.request.url} - ${ctx.response.status} (${ctx.duration}ms)`);\n * return ctx.response;\n * });\n *\n * // Make requests\n * const response = await api.fetch('/users');\n * const data = await response.json();\n * ```\n */\nexport function createFetchClient(config: FetchInterceptorConfig = {}): FetchClient {\n const requestInterceptors: RequestInterceptor[] = [...(config.requestInterceptors ?? [])];\n const responseInterceptors: ResponseInterceptor[] = [...(config.responseInterceptors ?? [])];\n const errorInterceptors: ErrorInterceptor[] = [...(config.errorInterceptors ?? [])];\n\n /**\n * Build the full URL from input.\n */\n function buildUrl(input: RequestInfo | URL): string {\n const baseUrl = config.baseUrl ?? '';\n\n if (typeof input === 'string') {\n // If input is absolute, use it as-is\n if (input.startsWith('http://') || input.startsWith('https://')) {\n return input;\n }\n // Combine with base URL\n const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const path = input.startsWith('/') ? input : `/${input}`;\n return `${base}${path}`;\n }\n\n if (input instanceof URL) {\n return input.toString();\n }\n\n // Request object\n return input.url;\n }\n\n /**\n * Merge headers from multiple sources.\n */\n function mergeHeaders(...sources: (HeadersInit | undefined)[]): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const source of sources) {\n if (!source) continue;\n\n if (source instanceof Headers) {\n source.forEach((value, key) => {\n result[key] = value;\n });\n } else if (Array.isArray(source)) {\n for (const [key, value] of source) {\n result[key] = value;\n }\n } else {\n Object.assign(result, source);\n }\n }\n\n return result;\n }\n\n /**\n * Execute fetch with timeout.\n */\n async function fetchWithTimeout(url: string, init: RequestInit, timeout: number): Promise<Response> {\n if (timeout <= 0) {\n return fetch(url, init);\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n return await fetch(url, {\n ...init,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * The main fetch function.\n */\n async function clientFetch(input: RequestInfo | URL, init: FetchRequestInit = {}): Promise<Response> {\n const startTime = Date.now();\n let retryCount = 0;\n\n // Build initial request context\n let ctx: RequestContext = {\n url: buildUrl(input),\n init: {\n ...init,\n headers: mergeHeaders(config.defaultHeaders, init.headers),\n credentials: init.credentials ?? config.credentials,\n },\n input,\n metadata: init.metadata ?? {},\n };\n\n // Run request interceptors\n if (!init.skipInterceptors && !init.skipRequestInterceptors) {\n for (const interceptor of requestInterceptors) {\n ctx = await interceptor(ctx);\n }\n }\n\n const timeout = init.timeout ?? config.defaultTimeout ?? 0;\n\n /**\n * Execute the actual request.\n */\n async function executeRequest(): Promise<Response> {\n try {\n const response = await fetchWithTimeout(ctx.url, ctx.init, timeout);\n const duration = Date.now() - startTime;\n\n // Run response interceptors\n if (!init.skipInterceptors && !init.skipResponseInterceptors) {\n let finalResponse = response;\n for (const interceptor of responseInterceptors) {\n finalResponse = await interceptor({\n response: finalResponse,\n request: ctx,\n duration,\n });\n }\n return finalResponse;\n }\n\n return response;\n } catch (error) {\n const duration = Date.now() - startTime;\n\n // Run error interceptors\n if (!init.skipInterceptors) {\n for (const interceptor of errorInterceptors) {\n try {\n const recoveredResponse = await interceptor({\n error,\n request: ctx,\n duration,\n retryCount,\n });\n // If interceptor returns a response, use it\n return recoveredResponse;\n } catch {\n // Interceptor didn't handle the error, continue to next\n }\n }\n }\n\n // No interceptor handled the error, rethrow\n throw error;\n }\n }\n\n // Handle retry logic\n const retryConfig = init.retry ?? config.defaultRetry;\n if (retryConfig) {\n const finalConfig = typeof retryConfig === 'boolean' ? {} : retryConfig;\n return withRetry(executeRequest, {\n ...finalConfig,\n onRetry: (error, attempt, delay) => {\n retryCount = attempt;\n finalConfig.onRetry?.(error, attempt, delay);\n },\n });\n }\n\n return executeRequest();\n }\n\n return {\n fetch: clientFetch,\n\n addRequestInterceptor(interceptor) {\n requestInterceptors.push(interceptor);\n return () => {\n const index = requestInterceptors.indexOf(interceptor);\n if (index !== -1) {\n requestInterceptors.splice(index, 1);\n }\n };\n },\n\n addResponseInterceptor(interceptor) {\n responseInterceptors.push(interceptor);\n return () => {\n const index = responseInterceptors.indexOf(interceptor);\n if (index !== -1) {\n responseInterceptors.splice(index, 1);\n }\n };\n },\n\n addErrorInterceptor(interceptor) {\n errorInterceptors.push(interceptor);\n return () => {\n const index = errorInterceptors.indexOf(interceptor);\n if (index !== -1) {\n errorInterceptors.splice(index, 1);\n }\n };\n },\n\n clearInterceptors() {\n requestInterceptors.length = 0;\n responseInterceptors.length = 0;\n errorInterceptors.length = 0;\n },\n\n getConfig() {\n return { ...config };\n },\n };\n}\n\n// =============================================================================\n// TOKEN REFRESH INTERCEPTOR\n// =============================================================================\n\n/**\n * Create a token refresh interceptor that automatically refreshes\n * expired tokens and retries failed requests.\n *\n * Uses AsyncLock to prevent multiple simultaneous refresh attempts.\n *\n * @example\n * ```tsx\n * const api = createFetchClient({ baseUrl: '/api' });\n *\n * const { addToClient } = createTokenRefreshInterceptor({\n * isTokenExpired: (response) => response.status === 401,\n * refreshToken: async () => {\n * const response = await fetch('/auth/refresh', { method: 'POST' });\n * const data = await response.json();\n * localStorage.setItem('token', data.accessToken);\n * return data.accessToken;\n * },\n * getAccessToken: () => localStorage.getItem('token'),\n * onRefreshFailure: () => {\n * localStorage.removeItem('token');\n * window.location.href = '/login';\n * },\n * });\n *\n * addToClient(api);\n * ```\n */\nexport function createTokenRefreshInterceptor(config: TokenRefreshConfig): {\n addToClient: (client: FetchClient) => void;\n refreshLock: AsyncLock;\n} {\n const refreshLock = createAsyncLock({ timeout: 30000 });\n let isRefreshing = false;\n let refreshAttempts = 0;\n const maxAttempts = config.maxRefreshAttempts ?? 3;\n\n const requestInterceptor: RequestInterceptor = async (ctx) => {\n // Add auth header if we have a token\n const token = config.getAccessToken();\n if (token) {\n ctx.init.headers = {\n ...(ctx.init.headers as Record<string, string>),\n Authorization: `Bearer ${token}`,\n };\n }\n return ctx;\n };\n\n const responseInterceptor: ResponseInterceptor = async (ctx) => {\n // Check if token is expired\n if (!config.isTokenExpired(ctx.response)) {\n // Reset refresh attempts on successful request\n refreshAttempts = 0;\n return ctx.response;\n }\n\n // Token expired, try to refresh\n if (refreshAttempts >= maxAttempts) {\n config.onRefreshFailure?.();\n throw new Error('Token refresh failed after maximum attempts');\n }\n\n // Use lock to prevent multiple simultaneous refresh attempts\n const lockResult = await refreshLock.acquire('token-refresh', async () => {\n // Double-check if another request already refreshed\n if (isRefreshing) {\n // Wait for the ongoing refresh to complete\n return config.getAccessToken();\n }\n\n isRefreshing = true;\n refreshAttempts++;\n\n try {\n const token = await config.refreshToken();\n if (!token) {\n config.onRefreshFailure?.();\n throw new Error('Token refresh returned null');\n }\n return token;\n } finally {\n isRefreshing = false;\n }\n });\n\n const newToken = lockResult.value;\n\n // Retry the original request with new token\n if (newToken) {\n const retryInit: RequestInit = {\n ...ctx.request.init,\n headers: {\n ...(ctx.request.init.headers as Record<string, string>),\n Authorization: `Bearer ${newToken}`,\n },\n };\n return fetch(ctx.request.url, retryInit);\n }\n\n return ctx.response;\n };\n\n return {\n addToClient(client) {\n client.addRequestInterceptor(requestInterceptor);\n client.addResponseInterceptor(responseInterceptor);\n },\n refreshLock,\n };\n}\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Create a simple JSON API client.\n *\n * @example\n * ```tsx\n * const api = createJsonApiClient({\n * baseUrl: 'https://api.example.com',\n * getAuthToken: () => localStorage.getItem('token'),\n * });\n *\n * // GET request\n * const users = await api.get<User[]>('/users');\n *\n * // POST request\n * const newUser = await api.post<User>('/users', { name: 'John' });\n *\n * // DELETE request\n * await api.delete('/users/1');\n * ```\n */\nexport function createJsonApiClient(options: {\n baseUrl?: string;\n getAuthToken?: () => string | null;\n defaultHeaders?: Record<string, string>;\n timeout?: number;\n}) {\n const client = createFetchClient({\n baseUrl: options.baseUrl,\n defaultHeaders: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...options.defaultHeaders,\n },\n defaultTimeout: options.timeout,\n credentials: 'include',\n });\n\n if (options.getAuthToken) {\n client.addRequestInterceptor(async (ctx) => {\n const token = options.getAuthToken!();\n if (token) {\n ctx.init.headers = {\n ...(ctx.init.headers as Record<string, string>),\n Authorization: `Bearer ${token}`,\n };\n }\n return ctx;\n });\n }\n\n async function request<T>(method: string, path: string, body?: unknown): Promise<T | null> {\n const response = await client.fetch(path, {\n method,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorContext = extractErrorContext(response);\n const error = new Error(errorContext.message || `HTTP ${response.status}`);\n Object.assign(error, { response, context: errorContext });\n throw error;\n }\n\n // Handle empty responses (204 No Content, non-JSON responses)\n const contentType = response.headers.get('content-type');\n if (!contentType || !contentType.includes('application/json')) {\n return null;\n }\n\n const text = await response.text();\n if (!text) {\n return null;\n }\n\n return JSON.parse(text) as T;\n }\n\n return {\n client,\n get: <T>(path: string) => request<T>('GET', path),\n post: <T>(path: string, body?: unknown) => request<T>('POST', path, body),\n put: <T>(path: string, body?: unknown) => request<T>('PUT', path, body),\n patch: <T>(path: string, body?: unknown) => request<T>('PATCH', path, body),\n delete: <T>(path: string) => request<T>('DELETE', path),\n };\n}\n","/**\n * JWT Utilities\n *\n * Client-side JWT decoding and validation utilities.\n * These utilities do NOT verify signatures - they only decode and check expiration.\n * For signature verification, use server-side libraries.\n *\n * @module @omnitron-dev/prism/utils\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Standard JWT claims.\n * @see https://datatracker.ietf.org/doc/html/rfc7519#section-4.1\n */\nexport interface JwtStandardClaims {\n /** Issuer */\n iss?: string;\n /** Subject */\n sub?: string;\n /** Audience */\n aud?: string | string[];\n /** Expiration time (Unix timestamp in seconds) */\n exp?: number;\n /** Not before (Unix timestamp in seconds) */\n nbf?: number;\n /** Issued at (Unix timestamp in seconds) */\n iat?: number;\n /** JWT ID */\n jti?: string;\n}\n\n/**\n * JWT payload with custom claims.\n * Extends standard claims with any additional properties.\n */\nexport interface JwtPayload extends JwtStandardClaims {\n /** User ID (common custom claim) */\n userId?: string;\n /** Email (common custom claim) */\n email?: string;\n /** Roles (common custom claim) */\n roles?: string[];\n /** Permissions (common custom claim) */\n permissions?: string[];\n /** Any additional custom claims */\n [key: string]: unknown;\n}\n\n/**\n * JWT validation options.\n */\nexport interface JwtValidationOptions {\n /** Clock skew tolerance in seconds (default: 60) */\n clockTolerance?: number;\n /** Require expiration claim (default: true) */\n requireExp?: boolean;\n}\n\n/**\n * JWT decode result.\n */\nexport interface JwtDecodeResult<T extends JwtPayload = JwtPayload> {\n /** Decoded header */\n header: {\n alg: string;\n typ?: string;\n [key: string]: unknown;\n };\n /** Decoded payload */\n payload: T;\n /** Original signature (base64url encoded, NOT verified) */\n signature: string;\n}\n\n// =============================================================================\n// DECODE FUNCTIONS\n// =============================================================================\n\n/**\n * Decode a base64url string to a regular string.\n * Handles URL-safe base64 encoding used in JWTs.\n */\nfunction base64UrlDecode(str: string): string {\n // Replace URL-safe characters with standard base64\n const base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n\n // Add padding if necessary\n const padding = base64.length % 4;\n const paddedBase64 = padding ? base64 + '='.repeat(4 - padding) : base64;\n\n // Decode\n try {\n return atob(paddedBase64);\n } catch {\n throw new Error('Invalid base64url encoding');\n }\n}\n\n/**\n * Decode a JWT token without verifying the signature.\n *\n * ⚠️ WARNING: This function does NOT verify the signature.\n * Only use for client-side display purposes. Never trust decoded\n * data for authorization decisions without server-side verification.\n *\n * @param token - The JWT token string\n * @returns Decoded JWT parts (header, payload, signature)\n * @throws Error if the token is malformed\n *\n * @example\n * ```tsx\n * const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';\n *\n * try {\n * const { header, payload } = jwtDecode(token);\n * console.log('Algorithm:', header.alg);\n * console.log('User ID:', payload.sub);\n * console.log('Expires:', new Date(payload.exp! * 1000));\n * } catch (error) {\n * console.error('Invalid token:', error.message);\n * }\n * ```\n */\nexport function jwtDecode<T extends JwtPayload = JwtPayload>(token: string): JwtDecodeResult<T> {\n if (!token || typeof token !== 'string') {\n throw new Error('Token must be a non-empty string');\n }\n\n const parts = token.split('.');\n\n if (parts.length !== 3) {\n throw new Error('Invalid token format: expected 3 parts separated by dots');\n }\n\n const [headerPart, payloadPart, signaturePart] = parts;\n\n try {\n const headerJson = base64UrlDecode(headerPart);\n const payloadJson = base64UrlDecode(payloadPart);\n\n const header = JSON.parse(headerJson);\n const payload = JSON.parse(payloadJson) as T;\n\n return {\n header,\n payload,\n signature: signaturePart,\n };\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error('Invalid token: malformed JSON in header or payload', { cause: error });\n }\n throw error;\n }\n}\n\n/**\n * Decode only the payload from a JWT token.\n * Convenience function when you only need the claims.\n *\n * @param token - The JWT token string\n * @returns Decoded payload\n * @throws Error if the token is malformed\n *\n * @example\n * ```tsx\n * const payload = jwtDecodePayload(token);\n * console.log('User:', payload.email);\n * ```\n */\nexport function jwtDecodePayload<T extends JwtPayload = JwtPayload>(token: string): T {\n return jwtDecode<T>(token).payload;\n}\n\n// =============================================================================\n// VALIDATION FUNCTIONS\n// =============================================================================\n\n/**\n * Check if a JWT token is expired.\n *\n * @param token - The JWT token string\n * @param options - Validation options\n * @returns true if the token is expired or invalid, false if still valid\n *\n * @example\n * ```tsx\n * if (isTokenExpired(token)) {\n * // Redirect to login or refresh token\n * refreshAccessToken();\n * }\n * ```\n */\nexport function isTokenExpired(token: string, options: JwtValidationOptions = {}): boolean {\n const { clockTolerance = 60, requireExp = true } = options;\n\n try {\n const { payload } = jwtDecode(token);\n\n // Check if exp claim exists\n if (payload.exp === undefined) {\n // If exp is not required, token is considered valid\n return requireExp;\n }\n\n // Check expiration with clock tolerance\n const currentTime = Math.floor(Date.now() / 1000);\n return payload.exp < currentTime - clockTolerance;\n } catch {\n // If token can't be decoded, consider it expired/invalid\n return true;\n }\n}\n\n/**\n * Check if a JWT token is valid (not expired, not before nbf).\n *\n * @param token - The JWT token string\n * @param options - Validation options\n * @returns true if the token is valid, false otherwise\n *\n * @example\n * ```tsx\n * function AuthProvider({ children }) {\n * const [token] = useLocalStorage('accessToken');\n *\n * if (!token || !isValidToken(token)) {\n * return <Navigate to=\"/login\" />;\n * }\n *\n * return children;\n * }\n * ```\n */\nexport function isValidToken(token: string, options: JwtValidationOptions = {}): boolean {\n const { clockTolerance = 60, requireExp = true } = options;\n\n try {\n const { payload } = jwtDecode(token);\n\n const currentTime = Math.floor(Date.now() / 1000);\n\n // Check expiration\n if (payload.exp !== undefined) {\n if (payload.exp < currentTime - clockTolerance) {\n return false;\n }\n } else if (requireExp) {\n // exp is required but missing\n return false;\n }\n\n // Check not-before\n if (payload.nbf !== undefined) {\n if (payload.nbf > currentTime + clockTolerance) {\n return false;\n }\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get time until token expires in seconds.\n * Returns 0 if token is already expired or invalid.\n *\n * @param token - The JWT token string\n * @returns Seconds until expiration, or 0 if expired/invalid\n *\n * @example\n * ```tsx\n * const secondsLeft = getTokenTimeLeft(token);\n *\n * if (secondsLeft < 300) {\n * // Less than 5 minutes left, refresh proactively\n * refreshToken();\n * }\n * ```\n */\nexport function getTokenTimeLeft(token: string): number {\n try {\n const { payload } = jwtDecode(token);\n\n if (payload.exp === undefined) {\n return Infinity;\n }\n\n const currentTime = Math.floor(Date.now() / 1000);\n const timeLeft = payload.exp - currentTime;\n\n return timeLeft > 0 ? timeLeft : 0;\n } catch {\n return 0;\n }\n}\n\n/**\n * Get expiration date from token.\n *\n * @param token - The JWT token string\n * @returns Date object for expiration, or null if no exp claim or invalid token\n *\n * @example\n * ```tsx\n * const expiresAt = getTokenExpirationDate(token);\n * if (expiresAt) {\n * console.log('Token expires:', expiresAt.toLocaleString());\n * }\n * ```\n */\nexport function getTokenExpirationDate(token: string): Date | null {\n try {\n const { payload } = jwtDecode(token);\n\n if (payload.exp === undefined) {\n return null;\n }\n\n return new Date(payload.exp * 1000);\n } catch {\n return null;\n }\n}\n\n// =============================================================================\n// CLAIM EXTRACTION HELPERS\n// =============================================================================\n\n/**\n * Safely get a claim from a token.\n *\n * @param token - The JWT token string\n * @param claim - The claim name to extract\n * @returns The claim value or undefined if not present/invalid\n *\n * @example\n * ```tsx\n * const userId = getTokenClaim(token, 'sub');\n * const roles = getTokenClaim<string[]>(token, 'roles') ?? [];\n * ```\n */\nexport function getTokenClaim<T>(token: string, claim: string): T | undefined {\n try {\n const { payload } = jwtDecode(token);\n return payload[claim] as T;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Get the subject (user identifier) from a token.\n *\n * @param token - The JWT token string\n * @returns The subject claim or undefined\n */\nexport function getTokenSubject(token: string): string | undefined {\n return getTokenClaim<string>(token, 'sub');\n}\n\n/**\n * Check if token has a specific role.\n *\n * @param token - The JWT token string\n * @param role - The role to check for\n * @param rolesKey - The key in the payload containing roles (default: 'roles')\n * @returns true if the token contains the role\n *\n * @example\n * ```tsx\n * if (tokenHasRole(token, 'admin')) {\n * // Show admin features\n * }\n * ```\n */\nexport function tokenHasRole(token: string, role: string, rolesKey = 'roles'): boolean {\n const roles = getTokenClaim<string[]>(token, rolesKey);\n return Array.isArray(roles) && roles.includes(role);\n}\n\n/**\n * Check if token has a specific permission.\n *\n * @param token - The JWT token string\n * @param permission - The permission to check for\n * @param permissionsKey - The key in the payload containing permissions (default: 'permissions')\n * @returns true if the token contains the permission\n */\nexport function tokenHasPermission(token: string, permission: string, permissionsKey = 'permissions'): boolean {\n const permissions = getTokenClaim<string[]>(token, permissionsKey);\n return Array.isArray(permissions) && permissions.includes(permission);\n}\n","/**\n * Template variable resolver.\n *\n * Replaces `{{namespace.key}}` patterns in text with values from a context map.\n * Used for injecting dynamic config values into help content at render time.\n *\n * @example\n * resolveTemplateVariables(\"Fee: {{config.sellerFee}}%\", { \"config.sellerFee\": \"5\" })\n * // => \"Fee: 5%\"\n */\nexport function resolveTemplateVariables(text: string, context: Record<string, string | number>): string {\n return text.replace(/\\{\\{([a-zA-Z0-9_.]+)\\}\\}/g, (match, key: string) => {\n const value = context[key];\n return value !== undefined ? String(value) : match;\n });\n}\n","/**\n * i18n-text — generic locale resolution for bilingual / multilingual\n * JSONB payloads stored on backend DTOs.\n *\n * Design goals:\n *\n * - Zero hard-coded locale strings. Caller passes the viewer locale\n * and (optionally) a fallback order; the helper does the rest.\n * Adding a new locale to the platform is just config, not a code\n * edit in every consumer.\n * - Locale-agnostic API so it can serve marketplace categories,\n * achievement titles, paysys coin names, future post translations\n * — anywhere a `{ [lang]: string }` bag is stored.\n * - O(1) in the happy path (direct map access) with a deterministic\n * fallback walk.\n *\n * @module @omnitron-dev/prism/utils/i18n-text\n */\n\n/** A bag of language-keyed strings. Keys are RFC 5646 language codes\n * (or just `'en'`, `'ru'` for simple two-locale platforms). */\nexport type I18nText = Record<string, string | undefined>;\n\n/** Object shape that carries both a localised bag and a legacy\n * scalar field as final fallback — the canonical wire format for\n * DAOS categories, achievements etc. */\nexport interface I18nResolvable {\n /** Bilingual / multilingual bag. */\n nameI18n?: I18nText | null;\n /** Last-resort legacy fallback. The backend keeps this populated\n * even after migrating to JSONB so single-locale consumers keep\n * working without an immediate refactor. */\n name?: string | null;\n}\n\n/**\n * Resolve a `{ nameI18n, name }` object to the viewer-preferred\n * locale, walking through optional fallbacks before bottoming out\n * on the legacy scalar.\n *\n * @example\n * ```ts\n * const label = resolveI18n(category, 'ru', ['en']);\n * // → category.nameI18n.ru\n * // ?? category.nameI18n.en\n * // ?? category.name\n * // ?? ''\n * ```\n *\n * @param obj The resolvable record (e.g. a category DTO).\n * @param lang Viewer's preferred language code.\n * @param fallback Ordered list of secondary languages to try before\n * the legacy scalar. Defaults to `['en']`.\n * @param field Override the I18nText key (defaults to `nameI18n`)\n * + the legacy scalar key (defaults to `name`).\n * Useful for `descriptionI18n` / `description`.\n */\nexport function resolveI18n(\n obj: object | null | undefined,\n lang: string,\n fallback: readonly string[] = ['en'],\n field: { bag?: string; scalar?: string } = {},\n): string {\n if (!obj) return '';\n const bagKey = field.bag ?? 'nameI18n';\n const scalarKey = field.scalar ?? 'name';\n const record = obj as Record<string, unknown>;\n const bag = (record[bagKey] ?? null) as Record<string, unknown> | null;\n\n if (bag) {\n const direct = typeof bag[lang] === 'string' ? (bag[lang] as string).trim() : '';\n if (direct) return direct;\n for (const f of fallback) {\n const v = typeof bag[f] === 'string' ? (bag[f] as string).trim() : '';\n if (v) return v;\n }\n }\n\n const legacy = record[scalarKey];\n if (typeof legacy === 'string' && legacy.trim()) return legacy;\n\n return '';\n}\n\n/**\n * Build a stable searchable haystack from an i18n object — all\n * known translations concatenated lower-case so a single `.includes`\n * check matches against any locale.\n *\n * Useful inside `Autocomplete.filterOptions` to make EN-only users\n * find RU-only entries.\n */\nexport function i18nHaystack(\n bag: object | null | undefined,\n extra: readonly string[] = [],\n): string {\n if (!bag) return extra.join(' ').toLowerCase();\n const values = Object.values(bag as Record<string, unknown>)\n .filter((v): v is string => typeof v === 'string');\n return [...values, ...extra].join(' ').toLowerCase();\n}\n","/**\n * Toast wrapper with short-window deduplication.\n *\n * Problem: identical toast.error() calls fire twice in dev (React\n * StrictMode double-mounts every effect), and can also fire twice\n * in prod when a parent re-fetches mid-flight or a retry wrapper\n * surfaces the same error path. Sonner has no built-in dedupe, so\n * every duplicate landed as a separate snack-bar.\n *\n * Fix: collapse identical {method, message} calls inside a 1.5 s\n * window. The first call lands; subsequent identical calls within\n * the window are silently dropped. We DON'T forward to sonner's\n * own `id` option because then any later call with a different\n * message but the same id would *replace* the visible toast — we\n * want suppression, not replacement.\n *\n * Drop-in replacement for `import { toast } from 'sonner'`.\n * Same surface: error/success/info/warning + the passthroughs.\n *\n * Lives in prism so every UI app on the platform shares one\n * notification policy instead of each app reinventing it.\n */\nimport { toast as sonner } from 'sonner';\n\ntype ToastFn = (message: string, options?: Parameters<typeof sonner.error>[1]) => void;\n\nconst DEDUP_WINDOW_MS = 1500;\nconst recent = new Map<string, number>();\n\nfunction shouldSuppress(key: string): boolean {\n const now = Date.now();\n const last = recent.get(key);\n if (last !== undefined && now - last < DEDUP_WINDOW_MS) {\n recent.set(key, now);\n return true;\n }\n recent.set(key, now);\n // Sweep entries older than 4x the window to keep the map bounded.\n if (recent.size > 64) {\n const cutoff = now - DEDUP_WINDOW_MS * 4;\n for (const [k, t] of recent) if (t < cutoff) recent.delete(k);\n }\n return false;\n}\n\nfunction makeMethod(method: 'error' | 'success' | 'info' | 'warning'): ToastFn {\n return (message, options) => {\n const key = `${method}:${message}`;\n if (shouldSuppress(key)) return;\n sonner[method](message, options);\n };\n}\n\n// Use `typeof sonner` as the public type so we don't have to re-spell\n// every method signature (and so sonner's internal types — e.g.\n// `PromiseIExtendedResult` from `toast.promise` — don't have to be\n// re-exported from prism's DTS bundle).\nexport const toast: typeof sonner = Object.assign(\n // Allow `toast(msg)` (sonner's default = neutral toast) to work too.\n ((message: string, options?: Parameters<typeof sonner>[1]) => {\n const key = `default:${message}`;\n if (shouldSuppress(key)) return;\n sonner(message, options);\n }) as typeof sonner,\n {\n error: makeMethod('error'),\n success: makeMethod('success'),\n info: makeMethod('info'),\n warning: makeMethod('warning'),\n // Pass-through methods that don't need dedup\n loading: sonner.loading.bind(sonner),\n promise: sonner.promise.bind(sonner),\n dismiss: sonner.dismiss.bind(sonner),\n custom: sonner.custom.bind(sonner),\n message: sonner.message.bind(sonner),\n }\n) as typeof sonner;\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 * 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.\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 btc: 8,\n xmr: 8,\n});\n\n/** Default precision when the coin code isn't recognized. */\nconst FALLBACK_DECIMALS = 8;\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\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 return COIN_DISPLAY_DECIMALS[coin.toLowerCase()] ?? FALLBACK_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 * @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 */\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\n let n: number;\n if (typeof value === 'number') {\n n = value;\n } else if (typeof value === 'string' && value.trim().length > 0) {\n n = Number(value);\n } else {\n n = 0;\n }\n if (!Number.isFinite(n)) n = 0;\n\n let formatted = n.toFixed(decimals);\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"]}
|