@omnitron-dev/prism 0.3.3 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/{chunk-DHTYHUYI.js → chunk-74TJGLFR.js} +4 -4
  2. package/dist/{chunk-DHTYHUYI.js.map → chunk-74TJGLFR.js.map} +1 -1
  3. package/dist/{chunk-D4GFAJAZ.js → chunk-FADV3QAS.js} +4 -4
  4. package/dist/{chunk-D4GFAJAZ.js.map → chunk-FADV3QAS.js.map} +1 -1
  5. package/dist/chunk-GCXRYSWU.js +132 -0
  6. package/dist/chunk-GCXRYSWU.js.map +1 -0
  7. package/dist/{chunk-UEINJFLS.js → chunk-HCADZXAK.js} +19 -10
  8. package/dist/chunk-HCADZXAK.js.map +1 -0
  9. package/dist/{chunk-RSWVYIXK.js → chunk-KOOKHWTH.js} +6 -133
  10. package/dist/chunk-KOOKHWTH.js.map +1 -0
  11. package/dist/{chunk-F6RZ7LW6.js → chunk-SPK7E7BD.js} +3 -3
  12. package/dist/{chunk-F6RZ7LW6.js.map → chunk-SPK7E7BD.js.map} +1 -1
  13. package/dist/{chunk-AATAOOSF.js → chunk-UWYLMSIQ.js} +3 -3
  14. package/dist/{chunk-AATAOOSF.js.map → chunk-UWYLMSIQ.js.map} +1 -1
  15. package/dist/{chunk-NSNM53WI.js → chunk-YYQWPEOP.js} +12 -11
  16. package/dist/chunk-YYQWPEOP.js.map +1 -0
  17. package/dist/components/admin-filters/index.js +2 -2
  18. package/dist/components/index.js +13 -12
  19. package/dist/core/index.js +4 -3
  20. package/dist/core/provider.d.ts +10 -4
  21. package/dist/core/provider.d.ts.map +1 -1
  22. package/dist/hooks/index.js +5 -4
  23. package/dist/identity/geometry.d.ts +25 -0
  24. package/dist/identity/geometry.d.ts.map +1 -0
  25. package/dist/identity/index.d.ts +6 -0
  26. package/dist/identity/index.d.ts.map +1 -0
  27. package/dist/identity/index.js +278 -0
  28. package/dist/identity/index.js.map +1 -0
  29. package/dist/identity/omnitron-mark.d.ts +14 -0
  30. package/dist/identity/omnitron-mark.d.ts.map +1 -0
  31. package/dist/identity/omnitron-splash.d.ts +15 -0
  32. package/dist/identity/omnitron-splash.d.ts.map +1 -0
  33. package/dist/identity/theme.d.ts +7 -0
  34. package/dist/identity/theme.d.ts.map +1 -0
  35. package/dist/identity/tokens.d.ts +46 -0
  36. package/dist/identity/tokens.d.ts.map +1 -0
  37. package/dist/index.js +16 -15
  38. package/dist/index.js.map +1 -1
  39. package/dist/layouts/dashboard/sidenav.d.ts.map +1 -1
  40. package/dist/layouts/index.js +1 -1
  41. package/dist/theme/components/DataGrid.d.ts +0 -1
  42. package/dist/theme/components/DataGrid.d.ts.map +1 -1
  43. package/dist/theme/index.js +3 -2
  44. package/package.json +8 -4
  45. package/dist/chunk-NSNM53WI.js.map +0 -1
  46. package/dist/chunk-RSWVYIXK.js.map +0 -1
  47. package/dist/chunk-UEINJFLS.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/date-range-picker/use-date-range-picker.ts","../src/components/country-select/flag-icon.tsx","../src/components/country-select/country-select.tsx","../src/components/avatar/avatar.tsx","../src/components/badge/badge.tsx","../src/components/sponsored-slot/types.ts","../src/components/sponsored-slot/sponsored-slot.tsx","../src/components/image/image.tsx","../src/components/deadline-chip/deadline-chip.tsx","../src/components/rail/rail.tsx","../src/components/tag-cloud/tag-cloud.tsx","../src/components/svg-color/svg-color.tsx","../src/components/progress/progress.tsx","../src/components/progress/countdown-ring.tsx","../src/components/virtual-list/virtual-list.tsx","../src/components/accordion/accordion.tsx","../src/components/menu/menu.tsx","../src/components/settings/settings-provider.tsx","../src/components/settings/settings-drawer.tsx","../src/components/tooltip/tooltip.tsx","../src/components/nav-card/nav-card.tsx","../src/components/nav-card/nav-card-grid.tsx","../src/components/drawer/drawer.tsx","../src/components/lightbox/types.ts","../src/components/lightbox/classes.ts","../src/components/lightbox/lightbox.tsx","../src/components/lightbox/use-lightbox.ts","../src/components/carousel/classes.ts","../src/components/carousel/carousel.tsx","../src/components/carousel/use-carousel.ts","../src/components/nav-section/styles.ts","../src/components/nav-section/components.tsx","../src/utils/url.ts","../src/components/nav-section/nav-item.tsx","../src/components/nav-section/nav-context.tsx","../src/components/nav-section/nav-list.tsx","../src/components/nav-section/nav-section-vertical.tsx","../src/components/nav-section/nav-section-horizontal.tsx","../src/components/nav-section/nav-section-mini.tsx","../src/components/mega-menu/styles.ts","../src/components/mega-menu/mega-menu-horizontal.tsx","../src/components/mega-menu/mega-menu-vertical.tsx","../src/components/mega-menu/mega-menu-mobile.tsx","../src/components/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"],"names":["useState","useCallback","jsx","jsxs","Box","Typography","styled","useMemo","Tooltip","useEffect","IconButton","useTheme","alpha","Stack","Chip","useRef","Divider","MenuItem","ListItemText","Fragment","CloseIcon","MuiTooltip","Card","Drawer","MuiDrawer","CircularProgress","Children","NavArrow","origin","createContext","useContext","Collapse","Popover","Paper","Nav","NavUl","NavLi","IconWrapper","ArrowIcon","NavButton","DropdownContent","SectionHeader","SubItemLink","Link","MegaMenuList","isExternalLink","HOUR","DAY","ToggleButtonGroup","ToggleButton","TextField"],"mappings":"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","file":"chunk-D4GFAJAZ.js","sourcesContent":["'use client';\n\nimport type { Dayjs } from 'dayjs';\n\nimport { useState, useCallback } from 'react';\nimport dayjs from 'dayjs';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type DateRangeValue = Dayjs | null;\n\nexport interface UseDateRangePickerReturn {\n startDate: DateRangeValue;\n endDate: DateRangeValue;\n onChangeStartDate: (value: DateRangeValue) => void;\n onChangeEndDate: (value: DateRangeValue) => void;\n open: boolean;\n onOpen: () => void;\n onClose: () => void;\n onReset: () => void;\n selected: boolean;\n error: boolean;\n label: string;\n shortLabel: string;\n setStartDate: React.Dispatch<React.SetStateAction<DateRangeValue>>;\n setEndDate: React.Dispatch<React.SetStateAction<DateRangeValue>>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isAfter(start: DateRangeValue, end: DateRangeValue): boolean {\n if (!start || !end) return false;\n return start.isAfter(end);\n}\n\nfunction formatRangeLabel(start: DateRangeValue, end: DateRangeValue, full?: boolean): string {\n if (!start || !end) return '';\n if (!start.isValid() || !end.isValid() || start.isAfter(end)) return '';\n\n if (full) {\n return `${start.format('DD MMM YYYY')} - ${end.format('DD MMM YYYY')}`;\n }\n\n if (start.isSame(end, 'day')) return end.format('DD MMM YYYY');\n if (start.isSame(end, 'month')) return `${start.format('DD')} - ${end.format('DD MMM YYYY')}`;\n if (start.isSame(end, 'year')) return `${start.format('DD MMM')} - ${end.format('DD MMM YYYY')}`;\n return `${start.format('DD MMM YYYY')} - ${end.format('DD MMM YYYY')}`;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useDateRangePicker(\n initialStart: DateRangeValue = null,\n initialEnd: DateRangeValue = null\n): UseDateRangePickerReturn {\n const [open, setOpen] = useState(false);\n const [startDate, setStartDate] = useState<DateRangeValue>(initialStart);\n const [endDate, setEndDate] = useState<DateRangeValue>(initialEnd);\n\n const error = isAfter(startDate, endDate);\n\n const onOpen = useCallback(() => setOpen(true), []);\n const onClose = useCallback(() => setOpen(false), []);\n\n const onChangeStartDate = useCallback((value: DateRangeValue) => {\n setStartDate(value);\n }, []);\n\n const onChangeEndDate = useCallback(\n (value: DateRangeValue) => {\n if (error) setEndDate(null);\n setEndDate(value);\n },\n [error]\n );\n\n const onReset = useCallback(() => {\n setStartDate(null);\n setEndDate(null);\n }, []);\n\n return {\n startDate,\n endDate,\n onChangeStartDate,\n onChangeEndDate,\n open,\n onOpen,\n onClose,\n onReset,\n error,\n selected: !!startDate && !!endDate,\n label: formatRangeLabel(startDate, endDate, true),\n shortLabel: formatRangeLabel(startDate, endDate),\n setStartDate,\n setEndDate,\n };\n}\n\n/**\n * Parse a YYYY-MM-DD string to Dayjs or null.\n */\nexport function parseDateString(value: string | undefined | null): DateRangeValue {\n if (!value) return null;\n const d = dayjs(value);\n return d.isValid() ? d : null;\n}\n\n/**\n * Format a Dayjs value to YYYY-MM-DD string or empty string.\n */\nexport function formatDateString(value: DateRangeValue): string {\n if (!value || !value.isValid()) return '';\n return value.format('YYYY-MM-DD');\n}\n","'use client';\n\n/**\n * FlagIcon — purely visual country-flag wrapper.\n *\n * Asset-free by design. The consumer supplies the SVG / PNG URL via\n * the `src` prop; Prism stays publishable without bundling 250+ flag\n * images. The wrapper handles the chrome — fixed aspect ratio,\n * border-radius variants (rounded / circle / square), graceful\n * fallback when `src` is missing or fails to load (an outlined\n * neutral globe glyph).\n *\n * Usage:\n * <FlagIcon src=\"/assets/countries/ru.svg\" alt=\"Russia\" />\n * <FlagIcon src={getFlagSrc('ru')} shape=\"circle\" size={20} />\n */\n\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\nimport { styled } from '@mui/material/styles';\n\nexport type FlagShape = 'rounded' | 'circle' | 'square';\n\nexport interface FlagIconProps {\n /** Flag image URL. When missing, falls back to a neutral globe glyph. */\n src?: string | null;\n /** Accessible label (country name). Falls back to `code` or empty string. */\n alt?: string;\n /** Optional ISO code — surfaced in the `aria-label` when `alt` isn't provided. */\n code?: string | null;\n /** Visual shape. Default `rounded` (4px radius); `circle` clips to a disc. */\n shape?: FlagShape;\n /**\n * Height in pixels. Width is computed at the 4:3 aspect that\n * matches the bundled SVG set; the wrapper stays square in\n * `circle` mode so the disc isn't squashed.\n */\n size?: number;\n /** Additional className. */\n className?: string;\n}\n\nexport function FlagIcon({\n src,\n alt,\n code,\n shape = 'rounded',\n size = 20,\n className,\n}: FlagIconProps): ReactNode {\n const [errored, setErrored] = useState(false);\n // Circle mode forces a 1:1 frame (otherwise the 4:3 SVG becomes an\n // oval). Other shapes keep the natural aspect ratio.\n const width = shape === 'circle' ? size : Math.round((size * 4) / 3);\n const radius = shape === 'circle' ? '50%' : shape === 'square' ? '0' : '3px';\n const accessibleLabel = alt ?? (code ? code.toUpperCase() : '');\n\n if (!src || errored) {\n return (\n <FlagFallback\n className={className}\n sx={{ width, height: size, borderRadius: radius }}\n aria-label={accessibleLabel || undefined}\n >\n {/* Inline globe glyph — cheaper than a font / emoji,\n renders identically across platforms. */}\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" width=\"60%\" height=\"60%\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M3 12h18M12 3a14 14 0 010 18M12 3a14 14 0 000 18\" />\n </svg>\n </FlagFallback>\n );\n }\n\n return (\n <FlagFrame\n className={className}\n sx={{ width, height: size, borderRadius: radius }}\n >\n <FlagImg\n src={src}\n alt={accessibleLabel}\n loading=\"lazy\"\n onError={() => setErrored(true)}\n />\n </FlagFrame>\n );\n}\n\nconst FlagFrame = styled('span')(({ theme }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n flexShrink: 0,\n // Neutral 1px outline so flags with white edges (e.g. JP, CY) stay\n // legible on light surfaces. Uses an `inset` shadow rather than a\n // border to avoid disturbing the flag's intrinsic size.\n boxShadow: `inset 0 0 0 1px ${theme.palette.divider}`,\n}));\n\nconst FlagImg = styled('img')({\n width: '100%',\n height: '100%',\n display: 'block',\n objectFit: 'cover',\n // Sharpen the rasterised SVG on Hi-DPI; no effect on vector but\n // costs nothing. Pixelated would be wrong for a flag, so the\n // browser default (auto smoothing) wins.\n});\n\nconst FlagFallback = styled('span')(({ theme }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n color: theme.palette.text.disabled,\n backgroundColor:\n theme.palette.mode === 'dark'\n ? theme.palette.action.hover\n : theme.palette.action.selected,\n boxShadow: `inset 0 0 0 1px ${theme.palette.divider}`,\n}));\n","'use client';\n\n/**\n * CountrySelect — minimalist, localised country picker.\n *\n * Asset-free design: the consumer passes a typed `options` array\n * (Prism does not bundle the ISO 3166-1 list) and a `getFlagSrc`\n * resolver (Prism does not bundle 250+ flag SVGs). The portal supplies\n * both from its own `data/countries.ts` + `assets/countries/`, so\n * `@omnitron-dev/prism` stays under its current weight.\n *\n * The picker is Autocomplete-backed:\n * - searchable by the visible label (locale-resolved), the iso2\n * code, AND the alternate-locale name — typing \"Russ\" or \"Рос\"\n * both surface the same row.\n * - keyboard-friendly (arrow keys, Enter, Esc work natively from\n * MUI Autocomplete).\n * - rounded flag in the input adornment so the chosen country\n * reads at a glance even without expanding the dropdown.\n *\n * Value contract: `value` is the lowercase iso2 code (`\"ru\"`, `\"us\"`,\n * …) or `null`. The component never returns the country object —\n * callers look up the rest from their own dictionary if needed,\n * keeping the surface narrow and JSON-serialisable for forms.\n *\n * Usage:\n * <CountrySelect\n * value={form.countryCode}\n * onChange={(iso2) => form.setField('countryCode', iso2)}\n * options={COUNTRIES}\n * getFlagSrc={(iso2) => `/assets/countries/${iso2}.svg`}\n * getOptionLabel={(c) => locale === 'ru' ? c.ru : c.en}\n * label=\"Country\"\n * />\n */\n\nimport type { ReactNode, SyntheticEvent } from 'react';\nimport { useCallback, useMemo } from 'react';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport type { TextFieldProps } from '@mui/material/TextField';\nimport type { AutocompleteProps } from '@mui/material/Autocomplete';\n\nimport { FlagIcon } from './flag-icon';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Generic shape the picker understands. The consumer's full Country\n * type can extend this — we only read what we need.\n *\n * `iso2` MUST be lowercase. Renderers compare and lookup by lowercase\n * throughout the picker; mixing case will quietly desynchronise the\n * selected state from the option list.\n */\nexport interface CountryOption {\n iso2: string;\n en: string;\n ru: string;\n /** Optional extras (iso3, phone, …) the consumer may use elsewhere. */\n [key: string]: unknown;\n}\n\nexport interface CountrySelectProps {\n /** Currently selected ISO 3166-1 alpha-2 code (lowercase) or null. */\n value: string | null;\n /** Called with the new iso2 code (lowercase) or null when cleared. */\n onChange: (iso2: string | null) => void;\n /** Full country list. Consumer owns the data; Prism does not bundle. */\n options: ReadonlyArray<CountryOption>;\n /** Flag URL resolver. Receives lowercase iso2, returns absolute or relative URL. */\n getFlagSrc?: (iso2: string) => string | null | undefined;\n /**\n * Locale-aware label resolver. Defaults to the `en` field.\n * Pass `(c) => locale === 'ru' ? c.ru : c.en` from the host app's\n * i18n hook to render in the active language.\n */\n getOptionLabel?: (c: CountryOption) => string;\n /** Field label (rendered by the underlying TextField). */\n label?: string;\n /** Placeholder text. */\n placeholder?: string;\n /** Helper text below the input. */\n helperText?: ReactNode;\n /** Error state (shows the input red, helperText switches to error.main). */\n error?: boolean;\n /** Disable the field entirely. */\n disabled?: boolean;\n /** Take full width of the container. */\n fullWidth?: boolean;\n /** Compact / dense variant. */\n size?: 'small' | 'medium';\n /** Override the underlying TextField props (variant, sx, slotProps, …). */\n textFieldProps?: Partial<TextFieldProps>;\n /** Forwarded Autocomplete props for niche tweaks (sx, ListboxProps, …). */\n autocompleteProps?: Partial<\n Omit<\n AutocompleteProps<CountryOption, false, false, false>,\n 'value' | 'onChange' | 'options' | 'renderInput' | 'getOptionLabel'\n >\n >;\n /**\n * Sentinel value emitted when the user picks the synthetic\n * \"Worldwide\" row. When set, an extra pinned row appears at the\n * top of the dropdown with a globe icon instead of a flag.\n * Use a value that cannot collide with any ISO 3166-1 alpha-2\n * code (e.g. `'world'` or `'*'`). Defaults to undefined → no row.\n */\n worldwideValue?: string;\n /**\n * Already-localised label for the worldwide row. Consumer pulls\n * this from i18n (e.g. `t('common.worldwide')`). Required when\n * `worldwideValue` is set.\n */\n worldwideLabel?: string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function CountrySelect({\n value,\n onChange,\n options,\n getFlagSrc,\n getOptionLabel,\n label,\n placeholder,\n helperText,\n error,\n disabled,\n fullWidth = true,\n size = 'small',\n textFieldProps,\n autocompleteProps,\n worldwideValue,\n worldwideLabel,\n}: CountrySelectProps): ReactNode {\n // Resolve the visible label per option. Defaults to `en` so the\n // picker still renders something sensible when the host app forgets\n // to pass `getOptionLabel`.\n const label_ = useCallback(\n (c: CountryOption) => {\n // Synthetic worldwide row carries its localised label directly\n // in the `en` field (we mirror it into `ru` too, see below).\n if (worldwideValue && c.iso2 === worldwideValue) {\n return worldwideLabel ?? c.en;\n }\n return getOptionLabel ? getOptionLabel(c) : c.en;\n },\n [getOptionLabel, worldwideValue, worldwideLabel],\n );\n\n // Build the option set. When `worldwideValue` is set, prepend a\n // synthetic row so it sits at the top of the dropdown. We use a\n // pseudo iso2 that the consumer controls (e.g. `'world'`) so it\n // never collides with real ISO codes.\n const optionsWithWorld = useMemo(() => {\n if (!worldwideValue) return options as CountryOption[];\n const synthetic: CountryOption = {\n iso2: worldwideValue,\n en: worldwideLabel ?? 'Worldwide',\n ru: worldwideLabel ?? 'Worldwide',\n };\n return [synthetic, ...options];\n }, [options, worldwideValue, worldwideLabel]);\n\n // Lookup map for O(1) value→option resolution. Recomputed when the\n // `options` reference changes — callers should memoise the array\n // so this map stays stable.\n const byIso2 = useMemo(() => {\n const map = new Map<string, CountryOption>();\n for (const o of optionsWithWorld) map.set(o.iso2.toLowerCase(), o);\n return map;\n }, [optionsWithWorld]);\n\n const selected = value ? byIso2.get(value.toLowerCase()) ?? null : null;\n const isWorld = !!(worldwideValue && selected && selected.iso2 === worldwideValue);\n\n const handleChange = useCallback(\n (_: SyntheticEvent, next: CountryOption | null) => {\n onChange(next ? next.iso2.toLowerCase() : null);\n },\n [onChange],\n );\n\n // Search filter — match against the resolved label, iso2, AND the\n // other-locale name so the user can type \"Russ\" or \"Рос\" and find\n // the same row regardless of the active UI language.\n const filterOptions = useCallback(\n (opts: CountryOption[], state: { inputValue: string }) => {\n const q = state.inputValue.trim().toLowerCase();\n if (!q) return opts;\n return opts.filter((o) => {\n if (o.iso2.toLowerCase().includes(q)) return true;\n if (label_(o).toLowerCase().includes(q)) return true;\n // Cross-locale search: always check both en and ru.\n if (o.en.toLowerCase().includes(q)) return true;\n if (o.ru.toLowerCase().includes(q)) return true;\n return false;\n });\n },\n [label_],\n );\n\n return (\n <Autocomplete<CountryOption, false, false, false>\n value={selected}\n onChange={handleChange}\n options={optionsWithWorld}\n getOptionLabel={label_}\n isOptionEqualToValue={(a, b) => a.iso2.toLowerCase() === b.iso2.toLowerCase()}\n filterOptions={filterOptions}\n disabled={disabled}\n fullWidth={fullWidth}\n size={size}\n autoHighlight\n // Keep popup snappy on long lists — virtualisation would be\n // nicer for >500 rows but 250 ISO countries paint in well\n // under one frame at the default rendering cost.\n renderOption={(props, option) => {\n const { key, ...rest } = props as React.HTMLAttributes<HTMLLIElement> & { key: string };\n const isWorldRow = worldwideValue !== undefined && option.iso2 === worldwideValue;\n const src = isWorldRow ? null : getFlagSrc?.(option.iso2.toLowerCase()) ?? null;\n return (\n <Box\n component=\"li\"\n key={key}\n {...rest}\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1.25,\n px: 1.25,\n py: 0.75,\n // Pin the worldwide row visually with a divider so the\n // user reads it as a separate semantic group.\n ...(isWorldRow && {\n borderBottom: '1px solid',\n borderColor: 'divider',\n mb: 0.5,\n }),\n }}\n >\n <FlagIcon src={src} alt={label_(option)} code={option.iso2} />\n <Typography\n variant=\"body2\"\n sx={{ flex: 1, fontWeight: isWorldRow ? 600 : 400 }}\n >\n {label_(option)}\n </Typography>\n {!isWorldRow && (\n <Typography\n variant=\"caption\"\n sx={{\n color: 'text.disabled',\n fontFamily: 'monospace',\n textTransform: 'uppercase',\n }}\n >\n {option.iso2}\n </Typography>\n )}\n </Box>\n );\n }}\n renderInput={(params) => {\n const src = !isWorld && selected && getFlagSrc\n ? getFlagSrc(selected.iso2.toLowerCase()) ?? null\n : null;\n const startAdornment = selected ? (\n <InputAdornment position=\"start\" sx={{ ml: 0.75, mr: -0.5 }}>\n <FlagIcon\n src={src}\n alt={selected ? label_(selected) : ''}\n code={isWorld ? undefined : selected?.iso2}\n />\n </InputAdornment>\n ) : null;\n\n return (\n <TextField\n {...params}\n label={label}\n placeholder={placeholder}\n helperText={helperText}\n error={error}\n {...textFieldProps}\n slotProps={{\n ...(textFieldProps?.slotProps ?? {}),\n // MUI v9 renamed Autocomplete renderInput's\n // `InputProps` / `inputProps` to `slotProps.{input,\n // htmlInput}`. Merge our flag adornment on top of the\n // input slot while keeping the chevron+clear adornments\n // that Autocomplete itself injects.\n input: {\n ...params.slotProps.input,\n ...((textFieldProps?.slotProps as { input?: object } | undefined)?.input ?? {}),\n startAdornment: startAdornment ?? params.slotProps.input.startAdornment,\n },\n htmlInput: {\n ...params.slotProps.htmlInput,\n autoComplete: 'off',\n },\n }}\n />\n );\n }}\n {...(autocompleteProps as object)}\n />\n );\n}\n","'use client';\n\n/**\n * Avatar Component\n *\n * Enhanced avatar with fallback initials and group support.\n *\n * @module components/avatar\n */\n\nimport type { ReactNode, CSSProperties, Ref } from 'react';\nimport { useMemo } from 'react';\nimport MuiAvatar from '@mui/material/Avatar';\nimport AvatarGroup from '@mui/material/AvatarGroup';\nimport { styled, useTheme } from '@mui/material/styles';\nimport type { AvatarProps as MuiAvatarProps } from '@mui/material/Avatar';\nimport type { AvatarGroupProps as MuiAvatarGroupProps } from '@mui/material/AvatarGroup';\nimport type { Palette } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport type AvatarShape = 'circular' | 'rounded' | 'square';\n\nexport interface AvatarProps extends Omit<MuiAvatarProps, 'variant'> {\n /** Avatar size preset */\n size?: AvatarSize;\n /** Avatar shape */\n shape?: AvatarShape;\n /** User name for fallback initials */\n name?: string;\n /** Show online indicator */\n online?: boolean;\n /** Show offline indicator */\n offline?: boolean;\n /** Badge content (e.g., notification count) */\n badge?: ReactNode;\n /** Custom badge color */\n badgeColor?: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';\n}\n\n// =============================================================================\n// UTILS\n// =============================================================================\n\nconst SIZES: Record<AvatarSize, number> = {\n xs: 24,\n sm: 32,\n md: 40,\n lg: 56,\n xl: 80,\n};\n\nconst FONT_SIZES: Record<AvatarSize, number> = {\n xs: 10,\n sm: 12,\n md: 14,\n lg: 20,\n xl: 28,\n};\n\n/**\n * Generate initials from a name.\n */\nfunction getInitials(name: string): string {\n const words = name.trim().split(/\\s+/);\n if (words.length === 1) {\n return words[0].slice(0, 2).toUpperCase();\n }\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n}\n\n/**\n * Generate a consistent color based on a string.\n */\nfunction stringToColor(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n\n const colors = [\n '#F44336',\n '#E91E63',\n '#9C27B0',\n '#673AB7',\n '#3F51B5',\n '#2196F3',\n '#03A9F4',\n '#00BCD4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ];\n\n return colors[Math.abs(hash) % colors.length];\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\ninterface StyledAvatarProps {\n ownerState: {\n size: AvatarSize;\n shape: AvatarShape;\n hasImage: boolean;\n bgColor?: string;\n };\n}\n\nconst StyledAvatar = styled(MuiAvatar, {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<StyledAvatarProps>(({ theme, ownerState }) => {\n const { size, shape, hasImage, bgColor } = ownerState;\n const dimension = SIZES[size];\n const fontSize = FONT_SIZES[size];\n\n const borderRadius = typeof theme.shape.borderRadius === 'number' ? theme.shape.borderRadius : 4;\n\n return {\n width: dimension,\n height: dimension,\n fontSize,\n fontWeight: 600,\n ...(shape === 'rounded' && {\n borderRadius: borderRadius * 1.5,\n }),\n ...(shape === 'square' && {\n borderRadius: 0,\n }),\n ...(!hasImage &&\n bgColor && {\n backgroundColor: bgColor,\n color: theme.palette.getContrastText(bgColor),\n }),\n };\n});\n// =============================================================================\n// WRAPPER FOR BADGES\n// =============================================================================\n\ninterface AvatarWrapperProps {\n children: ReactNode;\n online?: boolean;\n offline?: boolean;\n badge?: ReactNode;\n badgeColor?: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';\n size: AvatarSize;\n}\n\nfunction AvatarWrapper({\n children,\n online,\n offline,\n badge,\n badgeColor = 'error',\n size,\n}: AvatarWrapperProps): ReactNode {\n const theme = useTheme();\n const showIndicator = online || offline;\n const indicatorSize = size === 'xs' ? 6 : size === 'sm' ? 8 : 10;\n\n if (!showIndicator && !badge) {\n return children;\n }\n\n // Get theme-aware badge color\n const getBadgeBackgroundColor = (color: keyof Palette): string => {\n const paletteColor = theme.palette[color];\n if (paletteColor && typeof paletteColor === 'object' && 'main' in paletteColor) {\n return paletteColor.main;\n }\n return theme.palette.error.main;\n };\n\n const wrapperStyle: CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n };\n\n const indicatorStyle: CSSProperties = {\n position: 'absolute',\n bottom: 0,\n right: 0,\n width: indicatorSize,\n height: indicatorSize,\n borderRadius: '50%',\n border: `2px solid ${theme.palette.background.paper}`,\n backgroundColor: online ? theme.palette.success.main : theme.palette.grey[400],\n };\n\n const badgeStyle: CSSProperties = {\n position: 'absolute',\n top: -4,\n right: -4,\n minWidth: 18,\n height: 18,\n padding: '0 4px',\n borderRadius: 9,\n fontSize: 10,\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.palette.common.white,\n backgroundColor: getBadgeBackgroundColor(badgeColor as keyof Palette),\n };\n\n return (\n <span style={wrapperStyle}>\n {children}\n {showIndicator && <span style={indicatorStyle} />}\n {badge && <span style={badgeStyle}>{badge}</span>}\n </span>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Avatar - Enhanced avatar with fallback initials.\n *\n * @example\n * ```tsx\n * // With image\n * <Avatar src=\"/avatar.jpg\" name=\"John Doe\" />\n *\n * // Fallback to initials\n * <Avatar name=\"John Doe\" />\n *\n * // With online indicator\n * <Avatar src=\"/avatar.jpg\" name=\"John Doe\" online />\n *\n * // With badge\n * <Avatar src=\"/avatar.jpg\" name=\"John Doe\" badge={3} />\n * ```\n */\nexport function Avatar({size = 'md', shape = 'circular', name, src, alt, online, offline, badge, badgeColor, children, sx, ref, ...other }: AvatarProps & { ref?: Ref<HTMLDivElement> }) {\n const initials = useMemo(() => {\n if (children) return null;\n return name ? getInitials(name) : null;\n }, [name, children]);\n\n const bgColor = useMemo(() => {\n if (src) return undefined;\n return name ? stringToColor(name) : undefined;\n }, [src, name]);\n\n const ownerState = {\n size,\n shape,\n hasImage: Boolean(src),\n bgColor,\n };\n\n const avatarContent = (\n <StyledAvatar ref={ref} src={src} alt={alt || name} ownerState={ownerState} sx={sx} {...other}>\n {children || initials}\n </StyledAvatar>\n );\n\n return (\n <AvatarWrapper online={online} offline={offline} badge={badge} badgeColor={badgeColor} size={size}>\n {avatarContent}\n </AvatarWrapper>\n );\n}\n\n// =============================================================================\n// AVATAR GROUP\n// =============================================================================\n\nexport interface CustomAvatarGroupProps extends Omit<MuiAvatarGroupProps, 'children'> {\n /** Avatar items */\n avatars: Array<{\n name?: string;\n src?: string;\n alt?: string;\n }>;\n /** Avatar size */\n size?: AvatarSize;\n /** Maximum avatars to show */\n max?: number;\n}\n\n/**\n * CustomAvatarGroup - Display multiple avatars in a group.\n *\n * @example\n * ```tsx\n * <CustomAvatarGroup\n * avatars={[\n * { name: 'John Doe', src: '/avatar1.jpg' },\n * { name: 'Jane Smith', src: '/avatar2.jpg' },\n * { name: 'Bob Wilson' },\n * ]}\n * max={3}\n * />\n * ```\n */\nexport function CustomAvatarGroup({ avatars, size = 'sm', max = 4, sx, ...other }: CustomAvatarGroupProps): ReactNode {\n return (\n <AvatarGroup max={max} sx={sx} {...other}>\n {avatars.map((avatar, index) => (\n <Avatar key={index} name={avatar.name} src={avatar.src} alt={avatar.alt || avatar.name} size={size} />\n ))}\n </AvatarGroup>\n );\n}\n","'use client';\n\n/**\n * Badge Component\n *\n * Notification badge and status indicator components.\n *\n * @module components/badge\n */\n\nimport type { ComponentPropsWithoutRef, ReactNode, Ref } from 'react';\nimport MuiBadge from '@mui/material/Badge';\nimport Box from '@mui/material/Box';\nimport { styled } from '@mui/material/styles';\nimport type { BadgeProps as MuiBadgeProps } from '@mui/material/Badge';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type BadgeSize = 'small' | 'medium' | 'large';\n\nexport type BadgeVariant = 'standard' | 'dot' | 'online' | 'offline' | 'busy';\n\nexport type BadgeColor = 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';\n\nexport interface BadgeProps extends Omit<MuiBadgeProps, 'variant' | 'color' | 'content'> {\n /** Badge variant */\n variant?: BadgeVariant;\n /** Badge color */\n color?: BadgeColor;\n /** Badge size */\n size?: BadgeSize;\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\ninterface StyledBadgeProps {\n ownerState: {\n variant: BadgeVariant;\n color: BadgeColor;\n size: BadgeSize;\n };\n}\n\nconst StyledBadge = styled(MuiBadge, {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<StyledBadgeProps>(({ theme, ownerState }) => {\n const { variant, color, size } = ownerState;\n\n // Size dimensions\n const sizeDimensions: Record<BadgeSize, { width: number; height: number; fontSize: number }> = {\n small: { width: 16, height: 16, fontSize: 10 },\n medium: { width: 20, height: 20, fontSize: 12 },\n large: { width: 24, height: 24, fontSize: 14 },\n };\n\n const { width, height, fontSize } = sizeDimensions[size];\n\n // Color mapping\n const colorMap: Record<BadgeColor, string> = {\n default: theme.palette.grey[500],\n primary: theme.palette.primary.main,\n secondary: theme.palette.secondary.main,\n success: theme.palette.success.main,\n warning: theme.palette.warning.main,\n error: theme.palette.error.main,\n info: theme.palette.info.main,\n };\n\n // Status color mapping\n const statusColors: Record<string, string> = {\n online: theme.palette.success.main,\n offline: theme.palette.grey[500],\n busy: theme.palette.error.main,\n };\n\n const isStatusVariant = variant === 'online' || variant === 'offline' || variant === 'busy';\n const isDotVariant = variant === 'dot' || isStatusVariant;\n const badgeColor = isStatusVariant ? statusColors[variant] : colorMap[color];\n\n return {\n '& .MuiBadge-badge': {\n minWidth: isDotVariant ? height / 2 : width,\n height: isDotVariant ? height / 2 : height,\n padding: isDotVariant ? 0 : '0 4px',\n fontSize,\n fontWeight: 600,\n backgroundColor: badgeColor,\n color: theme.palette.getContrastText(badgeColor),\n ...(isDotVariant && {\n borderRadius: '50%',\n }),\n // Add pulsing animation for online status\n ...(variant === 'online' && {\n '&::after': {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n animation: 'ripple 1.2s infinite ease-in-out',\n border: `1px solid ${theme.palette.success.main}`,\n content: '\"\"',\n },\n '@keyframes ripple': {\n '0%': {\n transform: 'scale(.8)',\n opacity: 1,\n },\n '100%': {\n transform: 'scale(2.4)',\n opacity: 0,\n },\n },\n }),\n },\n };\n});\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Badge - Notification badge and status indicator.\n *\n * @example\n * ```tsx\n * // Standard badge with count\n * <Badge badgeContent={4} color=\"error\">\n * <MailIcon />\n * </Badge>\n *\n * // Dot badge\n * <Badge variant=\"dot\" color=\"primary\">\n * <NotificationsIcon />\n * </Badge>\n *\n * // Online status\n * <Badge variant=\"online\">\n * <Avatar src=\"/avatar.jpg\" />\n * </Badge>\n * ```\n */\nexport function Badge({variant = 'standard', color = 'error', size = 'medium', badgeContent, children, sx, ref, ...other }: BadgeProps & { ref?: Ref<HTMLSpanElement> }) {\n const ownerState = { variant, color, size };\n\n const isStatusVariant = variant === 'online' || variant === 'offline' || variant === 'busy';\n const isDotVariant = variant === 'dot' || isStatusVariant;\n\n return (\n <StyledBadge\n ref={ref}\n ownerState={ownerState}\n badgeContent={isDotVariant ? undefined : badgeContent}\n variant={isDotVariant ? 'dot' : 'standard'}\n sx={sx}\n {...other}\n >\n {children}\n </StyledBadge>\n );\n}\n\n// =============================================================================\n// COUNT BADGE\n// =============================================================================\n\ninterface CountBadgeOwnProps {\n /** Count value */\n count: number;\n /** Maximum count before showing + */\n max?: number;\n /** Show zero count */\n showZero?: boolean;\n /** Color */\n color?: BadgeColor;\n /** Size */\n size?: BadgeSize;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n/**\n * Leaves take `ref` and pass the rest to their root span — a count or a dot\n * is exactly what gets a `Tooltip` («3 unread», «online since 14:02»), and a\n * tooltip attaches its ref and its handlers to its child.\n */\ntype SpanRest<Own> = Omit<ComponentPropsWithoutRef<'span'>, keyof Own | 'color'> & { ref?: Ref<HTMLSpanElement> };\n\nexport type CountBadgeProps = CountBadgeOwnProps & SpanRest<CountBadgeOwnProps>;\n\n/**\n * CountBadge - Standalone count badge without children.\n *\n * @example\n * ```tsx\n * <CountBadge count={42} />\n * <CountBadge count={150} max={99} /> // Shows \"99+\"\n * ```\n */\nexport function CountBadge({\n count,\n max = 99,\n showZero = false,\n color = 'error',\n size = 'medium',\n sx,\n ref,\n ...other\n}: CountBadgeProps): ReactNode {\n if (!showZero && count === 0) {\n return null;\n }\n\n const displayCount = count > max ? `${max}+` : count.toString();\n\n const sizeDimensions: Record<BadgeSize, { minWidth: number; height: number; fontSize: number }> = {\n small: { minWidth: 16, height: 16, fontSize: 10 },\n medium: { minWidth: 20, height: 20, fontSize: 12 },\n large: { minWidth: 24, height: 24, fontSize: 14 },\n };\n\n const { minWidth, height, fontSize } = sizeDimensions[size];\n\n const colorMap: Record<BadgeColor, string> = {\n default: '#9ca3af',\n primary: '#2563eb',\n secondary: '#7c3aed',\n success: '#22c55e',\n warning: '#f59e0b',\n error: '#ef4444',\n info: '#06b6d4',\n };\n\n const bgColor = colorMap[color];\n\n return (\n <Box\n component=\"span\"\n ref={ref}\n {...other}\n sx={[\n {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth,\n height,\n padding: '0 4px',\n borderRadius: height / 2,\n fontSize,\n fontWeight: 600,\n backgroundColor: bgColor,\n color: 'white',\n },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ]}\n >\n {displayCount}\n </Box>\n );\n}\n\n// =============================================================================\n// STATUS DOT\n// =============================================================================\n\nexport type StatusDotStatus = 'online' | 'offline' | 'busy' | 'away';\n\ninterface StatusDotOwnProps {\n /** Status type */\n status: StatusDotStatus;\n /** Size in pixels */\n size?: number;\n /** Show pulsing animation for online */\n pulse?: boolean;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\nexport type StatusDotProps = StatusDotOwnProps & SpanRest<StatusDotOwnProps>;\n\n/**\n * StatusDot - Standalone status indicator.\n *\n * @example\n * ```tsx\n * <StatusDot status=\"online\" />\n * <StatusDot status=\"busy\" size={12} />\n * ```\n */\nexport function StatusDot({ status, size = 8, pulse = true, sx, ref, ...other }: StatusDotProps): ReactNode {\n const statusColors: Record<StatusDotStatus, string> = {\n online: '#22c55e',\n offline: '#9ca3af',\n busy: '#ef4444',\n away: '#f59e0b',\n };\n\n const color = statusColors[status];\n\n return (\n <Box\n component=\"span\"\n ref={ref}\n {...other}\n sx={[\n {\n display: 'inline-block',\n width: size,\n height: size,\n borderRadius: '50%',\n backgroundColor: color,\n ...(pulse &&\n status === 'online' && {\n animation: 'pulse 2s infinite',\n }),\n },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ]}\n />\n );\n}\n","import type { ElementType, ReactNode } from 'react';\n\n/** The words a sponsored slot says itself; every other word is the caller's content. */\nexport interface SponsoredSlotLabels {\n /** What marks the slot as advertising when no advertiser is named. */\n sponsored: string;\n}\n\nexport const DEFAULT_SPONSORED_SLOT_LABELS: SponsoredSlotLabels = {\n sponsored: 'Sponsored',\n};\n\n/** What one placement shows — already in the reader's language. */\nexport interface SponsoredSlotContent {\n title: string;\n body?: string | null;\n image?: string | null;\n /** A logo is fitted, never cropped; a cover fills its frame. */\n imageFit?: 'cover' | 'contain';\n /** «By <advertiser>» — the caller's sentence; `labels.sponsored` when absent. */\n byline?: string | null;\n /** Why it is here: the page's own context, never anything about the reader. */\n because?: string | null;\n /** The call to action, when the slot leads somewhere. */\n cta?: string | null;\n}\n\nexport interface SponsoredSlotProps {\n /** Nothing to show collapses the slot: no frame, no gap, no «empty ad». */\n content: SponsoredSlotContent | null | undefined;\n /** `tile` sits in a row of cards; `banner` takes a column's width. */\n variant?: 'tile' | 'banner';\n /**\n * The placement is still being asked for: the slot keeps its box so the page\n * does not jump when it arrives — and collapses if nothing does.\n */\n loading?: boolean;\n labels?: Partial<SponsoredSlotLabels>;\n /** The mark beside the byline; the caller's icon set. */\n icon?: ReactNode;\n /** Where the slot leads — a router link, an anchor. Absent, it is not clickable. */\n link?: { component: ElementType; props?: Record<string, unknown> };\n /** Called when the reader follows the link, after the navigation starts. */\n onOpen?: () => void;\n /** Rendered as `data-sponsored`, for the caller's own reporting and tests. */\n id?: string;\n}\n","/**\n * One advertising placement, as every page draws it.\n *\n * Always marked as advertising, by whom, and why it is here — the page's own\n * context, never anything about the reader. Its words are the caller's (it\n * knows the placement and the reader's language); the one word the slot says\n * itself comes through `labels`.\n *\n * Its geometry is fixed by its variant, so a page can reserve the box while\n * the placement is asked for (`loading`) and nothing moves when it arrives. A\n * slot with nothing to show collapses to nothing: an empty frame reads as a\n * broken page, and a placeholder «your ad here» is an ad for advertising.\n */\n\nimport Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardActionArea from '@mui/material/CardActionArea';\nimport Skeleton from '@mui/material/Skeleton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\nimport { DEFAULT_SPONSORED_SLOT_LABELS, type SponsoredSlotProps } from './types.js';\n\nconst TILE_IMAGE = { width: '100%', aspectRatio: '4 / 3' } as const;\nconst BANNER_IMAGE = { width: 160, minHeight: 120, flexShrink: 0 } as const;\n\nexport function SponsoredSlot({\n content,\n variant = 'tile',\n loading = false,\n labels: labelsProp,\n icon,\n link,\n onOpen,\n id,\n}: SponsoredSlotProps) {\n const labels = { ...DEFAULT_SPONSORED_SLOT_LABELS, ...labelsProp };\n const banner = variant === 'banner';\n const imageBox = banner ? BANNER_IMAGE : TILE_IMAGE;\n\n if (!content) {\n if (!loading) return null;\n return (\n <Card variant=\"outlined\" sx={{ height: '100%' }} data-sponsored-pending=\"\">\n <Box sx={{ display: 'flex', flexDirection: banner ? 'row' : 'column', height: '100%' }}>\n <Skeleton variant=\"rectangular\" sx={{ ...imageBox, height: banner ? undefined : 'auto' }} />\n <Box sx={{ p: 1.5, flex: 1 }}>\n <Skeleton width=\"40%\" />\n <Skeleton width=\"80%\" />\n </Box>\n </Box>\n </Card>\n );\n }\n\n const mark = (\n <Box\n component=\"span\"\n sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5, color: 'text.secondary', typography: 'caption' }}\n >\n {icon}\n {content.byline || labels.sponsored}\n </Box>\n );\n\n const body = (\n <Box sx={{ display: 'flex', flexDirection: banner ? 'row' : 'column', height: '100%' }}>\n {content.image && (\n <Box\n component=\"img\"\n src={content.image}\n alt=\"\"\n loading=\"lazy\"\n decoding=\"async\"\n sx={{\n display: 'block',\n objectFit: content.imageFit ?? 'cover',\n ...(content.imageFit === 'contain' && { p: 2, boxSizing: 'border-box' }),\n bgcolor: 'action.hover',\n ...imageBox,\n }}\n />\n )}\n <Box sx={{ p: 1.5, display: 'flex', flexDirection: 'column', gap: 0.5, minWidth: 0 }}>\n {content.because ? <Tooltip title={content.because}>{mark}</Tooltip> : mark}\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 600 }} noWrap={!banner}>\n {content.title}\n </Typography>\n {content.body && (\n <Typography variant=\"body2\" sx={{ color: 'text.secondary' }}>\n {content.body}\n </Typography>\n )}\n {link && content.cta && (\n <Typography variant=\"caption\" sx={{ color: 'primary.main', fontWeight: 600, mt: 'auto' }}>\n {content.cta}\n </Typography>\n )}\n </Box>\n </Box>\n );\n\n return (\n <Card variant=\"outlined\" sx={{ height: '100%' }} {...(id !== undefined && { 'data-sponsored': id })}>\n {link ? (\n <CardActionArea component={link.component} {...link.props} onClick={onOpen} sx={{ height: '100%' }}>\n {body}\n </CardActionArea>\n ) : (\n body\n )}\n </Card>\n );\n}\n","'use client';\n\n/**\n * Image Component\n *\n * Enhanced image component with lazy loading, aspect ratio, and fallback support.\n *\n * @module components/image\n */\n\nimport type { ReactNode, ImgHTMLAttributes, Ref } from 'react';\nimport { useState, useCallback } from 'react';\nimport Box from '@mui/material/Box';\nimport { styled, alpha } from '@mui/material/styles';\nimport type { SxProps, Theme, Breakpoint } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AspectRatio = '2/3' | '3/2' | '4/3' | '3/4' | '16/9' | '9/16' | '21/9' | '1/1' | `${number}/${number}`;\n\nexport interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'onError'> {\n /** Image source URL */\n src: string;\n /** Alt text */\n alt: string;\n /** Aspect ratio (auto-sizes based on width) */\n ratio?: AspectRatio | Partial<Record<Breakpoint, AspectRatio>>;\n /** Fallback content on error */\n fallback?: ReactNode;\n /** Fallback image URL */\n fallbackSrc?: string;\n /** Disable lazy loading */\n disableLazy?: boolean;\n /** Object fit style */\n objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n /** Show loading placeholder */\n placeholder?: boolean;\n /** Overlay content */\n overlay?: ReactNode;\n /** Additional styles */\n sx?: SxProps<Theme>;\n /** Image styles */\n imgSx?: SxProps<Theme>;\n /** Called when image loads */\n onLoad?: () => void;\n /** Called when image fails to load */\n onError?: () => void;\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\ninterface ImageRootProps {\n ownerState: {\n ratio?: AspectRatio | Partial<Record<Breakpoint, AspectRatio>>;\n hasError: boolean;\n };\n}\n\nconst ImageRoot = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<ImageRootProps>(({ theme, ownerState }) => {\n const { ratio, hasError } = ownerState;\n\n const getRatioStyles = () => {\n if (!ratio) return {};\n\n if (typeof ratio === 'string') {\n return {\n width: '100%',\n aspectRatio: ratio,\n };\n }\n\n // Responsive ratio\n const breakpointStyles: Record<string, string | Record<string, string>> = { width: '100%' };\n for (const [bp, r] of Object.entries(ratio)) {\n if (bp === 'xs') {\n breakpointStyles.aspectRatio = r;\n } else {\n breakpointStyles[theme.breakpoints.up(bp as Breakpoint)] = {\n aspectRatio: r,\n };\n }\n }\n return breakpointStyles;\n };\n\n return {\n position: 'relative',\n display: 'block',\n overflow: 'hidden',\n borderRadius: 'inherit',\n ...getRatioStyles(),\n ...(hasError && {\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n }),\n };\n});\nconst StyledImg = styled('img')(() => ({\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n}));\n\nconst PlaceholderBox = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n '&::after': {\n content: '\"\"',\n width: 32,\n height: 32,\n borderRadius: '50%',\n border: '3px solid',\n borderColor: alpha(theme.palette.grey[500], 0.16),\n borderTopColor: theme.palette.primary.main,\n animation: 'spin 1s linear infinite',\n '@keyframes spin': {\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n },\n },\n}));\n\nconst OverlayBox = styled(Box)(() => ({\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n}));\n\nconst FallbackBox = styled(Box)(({ theme }) => ({\n width: '100%',\n height: '100%',\n minHeight: 100,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.palette.text.disabled,\n}));\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Image - Enhanced image component with lazy loading and fallback.\n *\n * @example\n * ```tsx\n * <Image\n * src=\"/avatar.jpg\"\n * alt=\"User avatar\"\n * ratio=\"1/1\"\n * sx={{ width: 100, borderRadius: 1 }}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With aspect ratio\n * <Image\n * src=\"/banner.jpg\"\n * alt=\"Banner\"\n * ratio=\"16/9\"\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With fallback\n * <Image\n * src=\"/product.jpg\"\n * alt=\"Product\"\n * fallback={<ProductPlaceholder />}\n * />\n * ```\n */\nexport function Image({src,\n alt,\n ratio,\n fallback,\n fallbackSrc,\n disableLazy = false,\n objectFit = 'cover',\n placeholder = true,\n overlay,\n sx,\n imgSx,\n onLoad,\n onError,\n ref,\n ...imgProps\n }: ImageProps & { ref?: Ref<HTMLDivElement> }) {\n const [isLoaded, setIsLoaded] = useState(false);\n const [hasError, setHasError] = useState(false);\n const [currentSrc, setCurrentSrc] = useState(src);\n\n const handleLoad = useCallback(() => {\n setIsLoaded(true);\n onLoad?.();\n }, [onLoad]);\n\n const handleError = useCallback(() => {\n if (fallbackSrc && currentSrc !== fallbackSrc) {\n setCurrentSrc(fallbackSrc);\n } else {\n setHasError(true);\n }\n onError?.();\n }, [fallbackSrc, currentSrc, onError]);\n\n const ownerState = {\n ratio,\n hasError,\n };\n\n // Render fallback content on error\n if (hasError && fallback) {\n return (\n <ImageRoot ref={ref} ownerState={ownerState} sx={sx}>\n <FallbackBox>{fallback}</FallbackBox>\n </ImageRoot>\n );\n }\n\n return (\n <ImageRoot ref={ref} ownerState={ownerState} sx={sx}>\n {/* Loading placeholder */}\n {placeholder && !isLoaded && !hasError && <PlaceholderBox />}\n\n {/* Main image */}\n <StyledImg\n src={currentSrc}\n alt={alt}\n loading={disableLazy ? 'eager' : 'lazy'}\n onLoad={handleLoad}\n onError={handleError}\n sx={[\n {\n objectFit,\n opacity: isLoaded ? 1 : 0,\n transition: 'opacity 300ms ease-in-out',\n },\n ...(Array.isArray(imgSx) ? imgSx : [imgSx]),\n ]}\n {...imgProps}\n />\n\n {/* Overlay */}\n {overlay && <OverlayBox>{overlay}</OverlayBox>}\n </ImageRoot>\n );\n}\n\n// =============================================================================\n// DEFAULT FALLBACK\n// =============================================================================\n\nfunction DefaultImageIcon() {\n return (\n <Box component=\"svg\" viewBox=\"0 0 24 24\" sx={{ width: 48, height: 48, opacity: 0.5 }}>\n <path\n fill=\"currentColor\"\n d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"\n />\n </Box>\n );\n}\n\n/**\n * ImageWithDefault - Image with default fallback icon.\n */\nexport function ImageWithDefault(props: ImageProps): ReactNode {\n return <Image fallback={<DefaultImageIcon />} {...props} />;\n}\n","/**\n * A deadline, said as the time left — and coloured by how little.\n *\n * The downstream platform keeps a deadline in twenty-one tables: a cart's\n * quote, an escrow's auto-finalisation, a dispute's response window, a pickup\n * code… and a missed one costs money. A date says when; the chip says how\n * long, in the reader's language, and turns warning, then error, as it nears.\n * The absolute moment stays one hover away, in a `<time>` element.\n *\n * @module components/deadline-chip\n */\n\n'use client';\n\nimport { useEffect, useState, type ReactNode } from 'react';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { Label, type LabelColor, type LabelVariant } from '../label/index.js';\n\nconst MINUTE = 60_000;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\n\nexport type DeadlineUrgency = 'overdue' | 'urgent' | 'soon' | 'later';\n\nexport interface DeadlineChipProps {\n /** When it is due */\n deadline: Date | string | number;\n /** BCP 47 locale for the time left and the exact date — the application's current language */\n locale?: string | undefined;\n /** Said instead of the time since, once the deadline has passed (e.g. «просрочено») */\n overdueLabel?: string | undefined;\n /** Less time than this is urgent. Default: one hour. */\n urgentWithinMs?: number | undefined;\n /** Less time than this is soon. Default: one day. */\n soonWithinMs?: number | undefined;\n /** The clock — for tests */\n now?: (() => number) | undefined;\n sx?: SxProps<Theme> | undefined;\n}\n\n/** How near a deadline is, from the time left. */\nexport function deadlineUrgency(leftMs: number, urgentWithinMs = HOUR, soonWithinMs = DAY): DeadlineUrgency {\n if (leftMs <= 0) return 'overdue';\n if (leftMs < urgentWithinMs) return 'urgent';\n if (leftMs < soonWithinMs) return 'soon';\n return 'later';\n}\n\n/** The time left (or since, when negative) in the locale's own short words: «через 2 ч», «in 2 hr». */\nexport function relativeTimeLeft(leftMs: number, locale?: string): string {\n const words = new Intl.RelativeTimeFormat(locale, { numeric: 'always', style: 'short' });\n const size = Math.abs(leftMs);\n const sign = leftMs < 0 ? -1 : 1;\n if (size < HOUR) return words.format(sign * Math.max(1, Math.round(size / MINUTE)), 'minute');\n if (size < 2 * DAY) return words.format(sign * Math.round(size / HOUR), 'hour');\n return words.format(sign * Math.round(size / DAY), 'day');\n}\n\nconst LOOK: Record<DeadlineUrgency, { color: LabelColor; variant: LabelVariant }> = {\n overdue: { color: 'error', variant: 'filled' },\n urgent: { color: 'error', variant: 'soft' },\n soon: { color: 'warning', variant: 'soft' },\n later: { color: 'default', variant: 'soft' },\n};\n\n/**\n * @example\n * ```tsx\n * <DeadlineChip deadline={dispute.responseDeadline} locale={i18n.language} overdueLabel={t('deadline.overdue')} />\n * ```\n */\nexport function DeadlineChip({\n deadline,\n locale,\n overdueLabel,\n urgentWithinMs,\n soonWithinMs,\n now = Date.now,\n sx,\n}: DeadlineChipProps): ReactNode {\n const [at, setAt] = useState(now);\n useEffect(() => {\n const tick = setInterval(() => setAt(now()), 30_000);\n return () => clearInterval(tick);\n }, [now]);\n\n const due = new Date(deadline).getTime();\n if (Number.isNaN(due)) return null;\n\n const left = due - at;\n const urgency = deadlineUrgency(left, urgentWithinMs, soonWithinMs);\n const look = LOOK[urgency];\n const text = urgency === 'overdue' && overdueLabel ? overdueLabel : relativeTimeLeft(left, locale);\n const exact = new Intl.DateTimeFormat(locale, { dateStyle: 'medium', timeStyle: 'short' }).format(due);\n\n return (\n <Label\n color={look.color}\n variant={look.variant}\n data-urgency={urgency}\n sx={[{ fontVariantNumeric: 'tabular-nums' }, ...(Array.isArray(sx) ? sx : [sx])]}\n >\n <time dateTime={new Date(due).toISOString()} title={exact}>\n {text}\n </time>\n </Label>\n );\n}\n","'use client';\n\nimport { ChevronLeftIcon, ChevronRightIcon } from '../../icons/controls.js';\n/**\n * A row that scrolls: items side by side, snapped, scrolled by the browser.\n *\n * For a page reached over Tor, a slider that moves its track from script is\n * script the reader downloads and frames the page spends; a row the browser\n * scrolls is neither. Touch, trackpad, wheel and keyboard work because they\n * are the browser's own. The arrows appear only where there is somewhere to\n * go, and not at all on a screen without hover.\n *\n * @module components/rail\n */\n\nimport { Children, useCallback, useEffect, useRef, useState, type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport type { ResponsiveStyleValue } from '@mui/system';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface RailProps {\n children: ReactNode;\n /** Name of the row, for assistive technology — a scrolling region needs one */\n 'aria-label': string;\n /** Width of each item. Default: most of a phone, two on a tablet, three or four on a desktop. */\n itemWidth?: ResponsiveStyleValue<string | number> | undefined;\n /** Space between items, in theme spacing units. Default 2. */\n gap?: number | undefined;\n /** The arrows' names, translated by the caller */\n labels?: { previous?: string | undefined; next?: string | undefined } | undefined;\n sx?: SxProps<Theme> | undefined;\n}\n\nconst DEFAULT_ITEM_WIDTH = { xs: '78%', sm: '46%', md: '31%', lg: '23.5%' };\n\nfunction Chevron({ direction }: { direction: 'left' | 'right' }): ReactNode {\n return direction === 'left' ? <ChevronLeftIcon fontSize=\"small\" /> : <ChevronRightIcon fontSize=\"small\" />;\n}\n\n/**\n * @example\n * ```tsx\n * <Rail aria-label={t('home.showcase.products')}>\n * {products.map((p) => <ProductCard key={p.id} product={p} />)}\n * </Rail>\n * ```\n */\nexport function Rail({\n children,\n 'aria-label': ariaLabel,\n itemWidth = DEFAULT_ITEM_WIDTH,\n gap = 2,\n labels,\n sx,\n}: RailProps): ReactNode {\n const track = useRef<HTMLUListElement>(null);\n const [reach, setReach] = useState({ back: false, forward: false });\n\n const measure = useCallback(() => {\n const el = track.current;\n if (!el) return;\n const max = el.scrollWidth - el.clientWidth;\n setReach({ back: el.scrollLeft > 1, forward: el.scrollLeft < max - 1 });\n }, []);\n\n useEffect(() => {\n measure();\n const el = track.current;\n if (!el || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [measure]);\n\n const page = (direction: 1 | -1) => {\n const el = track.current;\n if (el) el.scrollBy({ left: direction * el.clientWidth * 0.9, behavior: 'smooth' });\n };\n\n const arrow = (direction: 1 | -1, show: boolean, label: string) =>\n show ? (\n <IconButton\n size=\"small\"\n aria-label={label}\n onClick={() => page(direction)}\n sx={{\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n [direction === 1 ? 'right' : 'left']: -8,\n zIndex: 1,\n bgcolor: 'background.paper',\n boxShadow: 2,\n '&:hover': { bgcolor: 'background.paper' },\n '@media (hover: none)': { display: 'none' },\n }}\n >\n <Chevron direction={direction === 1 ? 'right' : 'left'} />\n </IconButton>\n ) : null;\n\n return (\n <Box\n component=\"section\"\n aria-label={ariaLabel}\n data-testid=\"prism-rail\"\n sx={[{ position: 'relative' }, ...(Array.isArray(sx) ? sx : [sx])]}\n >\n {arrow(-1, reach.back, labels?.previous ?? 'Previous')}\n <Box\n component=\"ul\"\n ref={track}\n tabIndex={0}\n onScroll={measure}\n sx={{\n display: 'grid',\n gridAutoFlow: 'column',\n gridAutoColumns: itemWidth,\n gap,\n m: 0,\n p: 0,\n listStyle: 'none',\n overflowX: 'auto',\n overscrollBehaviorX: 'contain',\n scrollSnapType: 'x mandatory',\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': { display: 'none' },\n '&:focus-visible': { outline: '2px solid', outlineColor: 'primary.main', outlineOffset: 2 },\n }}\n >\n {Children.map(children, (child) =>\n child == null || child === false ? null : (\n <Box component=\"li\" sx={{ scrollSnapAlign: 'start', minWidth: 0 }}>\n {child}\n </Box>\n )\n )}\n </Box>\n {arrow(1, reach.forward, labels?.next ?? 'Next')}\n </Box>\n );\n}\n","'use client';\n\n/**\n * Tag Cloud — visualises a list of tags as either a sized chip cloud\n * (font-size proportional to popularity) or a vertical list with\n * count + description.\n *\n * Generic over `T extends TagCloudItem` so callers pass their domain\n * tag DTOs directly without mapping. Renders no domain assumptions;\n * navigation is delegated via `onTagClick`, which is the consumer's\n * job (react-router, next/link, etc.).\n *\n * Accessibility:\n * - List variant: each item is a button (MUI ListItemButton) with\n * aria-label that spells out the popularity rather than relying\n * on the visible count alone (\"4 posts\" not just \"4\").\n * - Cloud variant: chips carry an aria-label that names both the\n * tag and the relative weight, so screen readers don't see only\n * a font-size signal.\n * - Optional `trending` flag highlights a tag visually AND\n * semantically (aria-label suffix).\n *\n * @module components/tag-cloud\n */\n\nimport type { ReactNode } from 'react';\nimport Chip from '@mui/material/Chip';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemText from '@mui/material/ListItemText';\nimport Box from '@mui/material/Box';\nimport { alpha, useTheme } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface TagCloudItem {\n id: string;\n name: string;\n slug: string;\n postCount: number;\n description?: string | null;\n /** Optional badge — drives the trending highlight. */\n trending?: boolean;\n /** Optional moderation status — 'featured' adds a subtle accent. */\n status?: string;\n}\n\nexport interface TagCloudProps<T extends TagCloudItem = TagCloudItem> {\n tags: T[];\n variant?: 'cloud' | 'list';\n /** Called on activation. The consumer routes to the tag page. */\n onTagClick?: (tag: T) => void;\n /** Truncate to first N items. */\n maxItems?: number;\n /**\n * Render the right-hand stat of a list-variant row. Defaults to\n * the formatted postCount; override for custom signals\n * (e.g. follower count, freshness).\n */\n renderStat?: (tag: T) => ReactNode;\n /**\n * Optional adornment shown after the tag name on cloud variant.\n * Used to slot in a 🔥 / ⭐ icon component without bloating this\n * file with icon assets.\n */\n renderAdornment?: (tag: T) => ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/** Map a postCount to a font-size multiplier (0.75rem – 1.5rem). */\nfunction computeSize(count: number, min: number, max: number): number {\n if (max === min) return 1;\n const t = (count - min) / (max - min);\n return 0.75 + t * 0.75;\n}\n\nfunction formatShort(n: number): string {\n if (n < 1_000) return String(n);\n if (n < 1_000_000) return `${(n / 1_000).toFixed(1).replace(/\\.0$/, '')}K`;\n return `${(n / 1_000_000).toFixed(1).replace(/\\.0$/, '')}M`;\n}\n\nexport function TagCloud<T extends TagCloudItem = TagCloudItem>({\n tags,\n variant = 'cloud',\n onTagClick,\n maxItems,\n renderStat,\n renderAdornment,\n sx,\n}: TagCloudProps<T>): ReactNode {\n const theme = useTheme();\n const visible = maxItems ? tags.slice(0, maxItems) : tags;\n\n // --- List variant -----------------------------------------------------\n if (variant === 'list') {\n return (\n <List disablePadding sx={sx}>\n {visible.map((tag) => (\n <ListItemButton\n key={tag.id}\n onClick={onTagClick ? () => onTagClick(tag) : undefined}\n aria-label={`Tag ${tag.name}, ${tag.postCount} posts${tag.trending ? ', trending' : ''}`}\n sx={{\n borderRadius: 1,\n px: 1.5,\n py: 0.75,\n '&:hover': { bgcolor: alpha(theme.palette.primary.main, 0.08) },\n }}\n >\n <ListItemText\n primary={\n <Box component=\"span\" sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n <span>{`#${tag.name}`}</span>\n {tag.trending && (\n <Box\n component=\"span\"\n sx={{\n ml: 0.5,\n px: 0.75,\n py: 0.125,\n fontSize: 10,\n lineHeight: 1.4,\n fontWeight: 700,\n borderRadius: 0.75,\n color: theme.palette.warning.contrastText,\n bgcolor: theme.palette.warning.main,\n }}\n >\n TRENDING\n </Box>\n )}\n {renderAdornment?.(tag)}\n </Box>\n }\n secondary={tag.description}\n slotProps={{\n primary: { variant: 'body2', sx: { fontWeight: 500 } },\n\n secondary: {\n variant: 'caption',\n noWrap: true,\n sx: { mt: 0.25 },\n }\n }} />\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.disabled\",\n ml: 1,\n flexShrink: 0\n }}>\n {renderStat ? renderStat(tag) : formatShort(tag.postCount)}\n </Typography>\n </ListItemButton>\n ))}\n </List>\n );\n }\n\n // --- Cloud variant ---------------------------------------------------\n const counts = visible.map((t) => t.postCount);\n const min = counts.length > 0 ? Math.min(...counts) : 0;\n const max = counts.length > 0 ? Math.max(...counts) : 0;\n\n return (\n <Stack\n direction=\"row\"\n useFlexGap\n sx={[{\n flexWrap: \"wrap\",\n gap: 1,\n alignItems: \"center\"\n }, ...(Array.isArray(sx) ? sx : [sx])]}>\n {visible.map((tag) => {\n const size = computeSize(tag.postCount, min, max);\n const isFeatured = tag.status === 'featured';\n return (\n <Chip\n key={tag.id}\n label={\n <Box component=\"span\" sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n <span>{`#${tag.name}`}</span>\n {renderAdornment?.(tag)}\n </Box>\n }\n variant={tag.trending || isFeatured ? 'filled' : 'outlined'}\n color={tag.trending ? 'warning' : isFeatured ? 'primary' : 'default'}\n onClick={onTagClick ? () => onTagClick(tag) : undefined}\n aria-label={`Tag ${tag.name}, ${tag.postCount} posts${tag.trending ? ', trending' : ''}${isFeatured ? ', featured' : ''}`}\n sx={{\n height: 'auto',\n fontSize: `${size}rem`,\n fontWeight: 500,\n borderRadius: 1.5,\n cursor: onTagClick ? 'pointer' : 'default',\n transition: 'all 0.15s',\n '& .MuiChip-label': { px: 1.25, py: 0.5 },\n '&:hover': onTagClick\n ? {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: 'primary.main',\n color: 'primary.main',\n }\n : undefined,\n }}\n />\n );\n })}\n </Stack>\n );\n}\n","'use client';\n\n/**\n * SvgColor Component\n *\n * Colorable SVG icon component using CSS mask.\n *\n * @module components/svg-color\n */\n\nimport type { ReactNode, Ref } from 'react';\nimport { styled } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface SvgColorProps {\n /** SVG file URL */\n src: string;\n /** Color (uses currentColor by default, inheriting from parent) */\n color?: string;\n /** Width and height */\n size?: number | string;\n /** Width */\n width?: number | string;\n /** Height */\n height?: number | string;\n /** Additional class name */\n className?: string;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\nconst SvgRoot = styled('span')(() => ({\n flexShrink: 0,\n display: 'inline-flex',\n backgroundColor: 'currentColor',\n}));\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * SvgColor - Colorable SVG component.\n *\n * This component uses CSS mask to allow SVG icons to inherit text color.\n * The SVG file is loaded via URL and can be colored using the color prop\n * or by inheriting from parent's color/text color.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <SvgColor src=\"/icons/check.svg\" />\n * ```\n *\n * @example\n * ```tsx\n * // With custom color\n * <SvgColor\n * src=\"/icons/star.svg\"\n * color=\"primary.main\"\n * size={32}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Inherit color from parent\n * <Box color=\"error.main\">\n * <SvgColor src=\"/icons/alert.svg\" />\n * Error message\n * </Box>\n * ```\n */\nexport function SvgColor({src, color, size = 24, width, height, className, sx, ref }: SvgColorProps & { ref?: Ref<HTMLSpanElement> }) {\n const computedWidth = width ?? size;\n const computedHeight = height ?? size;\n\n return (\n <SvgRoot\n ref={ref}\n className={className}\n sx={[\n {\n width: computedWidth,\n height: computedHeight,\n mask: `url(${src}) no-repeat center / contain`,\n WebkitMask: `url(${src}) no-repeat center / contain`,\n ...(color && { color }),\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n />\n );\n}\n\n// =============================================================================\n// ICON SET COMPONENT\n// =============================================================================\n\nexport interface IconProps extends Omit<SvgColorProps, 'src'> {\n /** Icon name (without extension) */\n name: string;\n /** Base path for icons */\n basePath?: string;\n}\n\n/**\n * Creates an Icon component factory with a custom base path.\n *\n * @example\n * ```tsx\n * // Create icon component\n * const Icon = createIconComponent('/assets/icons');\n *\n * // Use it\n * <Icon name=\"home\" size={24} />\n * ```\n */\nexport function createIconComponent(basePath: string) {\n function Icon({ name, ...props }: IconProps): ReactNode {\n return <SvgColor src={`${basePath}/${name}.svg`} {...props} />;\n }\n return Icon;\n}\n","'use client';\n\n/**\n * Progress Components\n *\n * Linear and circular progress indicators.\n *\n * @module components/progress\n */\n\nimport type { ReactNode, ComponentProps } from 'react';\nimport MuiLinearProgress from '@mui/material/LinearProgress';\nimport MuiCircularProgress from '@mui/material/CircularProgress';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\n\n/**\n * Progress color variants.\n */\nexport type ProgressColor = 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info' | 'inherit';\n\n/**\n * Props for LinearProgress component.\n */\nexport interface LinearProgressProps extends Omit<ComponentProps<typeof MuiLinearProgress>, 'color'> {\n /** Progress color */\n color?: ProgressColor;\n /** Show percentage label */\n showLabel?: boolean;\n /** Label position */\n labelPosition?: 'end' | 'below';\n /** Custom label formatter */\n formatLabel?: (value: number) => string;\n}\n\n/**\n * LinearProgress - Horizontal progress indicator.\n *\n * @example\n * ```tsx\n * // Determinate\n * <LinearProgress value={75} showLabel />\n *\n * // Indeterminate (loading)\n * <LinearProgress />\n *\n * // With custom label\n * <LinearProgress\n * value={50}\n * showLabel\n * formatLabel={(v) => `${v}/100 completed`}\n * />\n * ```\n */\nexport function LinearProgress({\n color = 'primary',\n showLabel = false,\n labelPosition = 'end',\n formatLabel,\n value,\n variant = value !== undefined ? 'determinate' : 'indeterminate',\n sx,\n ...props\n}: LinearProgressProps): ReactNode {\n const label = formatLabel ? formatLabel(value ?? 0) : `${Math.round(value ?? 0)}%`;\n\n if (!showLabel) {\n return (\n <MuiLinearProgress variant={variant} value={value} color={color} sx={{ borderRadius: 1, ...sx }} {...props} />\n );\n }\n\n if (labelPosition === 'below') {\n return (\n <Box sx={{ width: '100%' }}>\n <MuiLinearProgress variant={variant} value={value} color={color} sx={{ borderRadius: 1, ...sx }} {...props} />\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n mt: 0.5,\n display: 'block',\n textAlign: 'center'\n }}>\n {label}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ flex: 1 }}>\n <MuiLinearProgress variant={variant} value={value} color={color} sx={{ borderRadius: 1, ...sx }} {...props} />\n </Box>\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.secondary\",\n minWidth: 40\n }}>\n {label}\n </Typography>\n </Box>\n );\n}\n\n/**\n * Props for CircularProgress component.\n */\nexport interface CircularProgressProps extends Omit<ComponentProps<typeof MuiCircularProgress>, 'color'> {\n /** Progress color */\n color?: ProgressColor;\n /** Show percentage label in center */\n showLabel?: boolean;\n /** Custom label formatter */\n formatLabel?: (value: number) => string;\n}\n\n/**\n * CircularProgress - Circular progress indicator.\n *\n * @example\n * ```tsx\n * // Determinate with label\n * <CircularProgress value={75} showLabel />\n *\n * // Indeterminate spinner\n * <CircularProgress />\n *\n * // Custom size\n * <CircularProgress value={50} size={80} thickness={5} showLabel />\n * ```\n */\nexport function CircularProgress({\n color = 'primary',\n showLabel = false,\n formatLabel,\n value,\n variant = value !== undefined ? 'determinate' : 'indeterminate',\n size = 40,\n ...props\n}: CircularProgressProps): ReactNode {\n if (!showLabel || variant === 'indeterminate') {\n return <MuiCircularProgress variant={variant} value={value} color={color} size={size} {...props} />;\n }\n\n const label = formatLabel ? formatLabel(value ?? 0) : `${Math.round(value ?? 0)}%`;\n\n return (\n <Box sx={{ position: 'relative', display: 'inline-flex' }}>\n <MuiCircularProgress variant={variant} value={value} color={color} size={size} {...props} />\n <Box\n sx={{\n position: 'absolute',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n fontSize: typeof size === 'number' ? size * 0.25 : undefined\n }}>\n {label}\n </Typography>\n </Box>\n </Box>\n );\n}\n\n/**\n * Props for ProgressBar component (segmented).\n */\nexport interface ProgressBarProps {\n /** Segments with value and optional color */\n segments: Array<{\n value: number;\n color?: ProgressColor;\n label?: string;\n }>;\n /** Bar height */\n height?: number;\n /** Show segment labels */\n showLabels?: boolean;\n}\n\n/**\n * ProgressBar - Segmented progress bar for multiple values.\n *\n * @example\n * ```tsx\n * <ProgressBar\n * segments={[\n * { value: 30, color: 'success', label: 'Complete' },\n * { value: 20, color: 'warning', label: 'In Progress' },\n * { value: 50, color: 'error', label: 'Failed' },\n * ]}\n * showLabels\n * />\n * ```\n */\nexport function ProgressBar({ segments, height = 8, showLabels = false }: ProgressBarProps): ReactNode {\n const colorMap: Record<ProgressColor, string> = {\n primary: 'primary.main',\n secondary: 'secondary.main',\n success: 'success.main',\n error: 'error.main',\n warning: 'warning.main',\n info: 'info.main',\n inherit: 'text.primary',\n };\n\n return (\n <Box sx={{ width: '100%' }}>\n <Box\n sx={{\n display: 'flex',\n borderRadius: 1,\n overflow: 'hidden',\n height,\n bgcolor: 'action.hover',\n }}\n >\n {segments.map((segment, index) => (\n <Box\n key={index}\n sx={{\n width: `${segment.value}%`,\n bgcolor: colorMap[segment.color ?? 'primary'],\n transition: 'width 0.3s ease-in-out',\n }}\n />\n ))}\n </Box>\n {showLabels && (\n <Box sx={{ display: 'flex', gap: 2, mt: 1 }}>\n {segments.map((segment, index) => (\n <Box key={index} sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: colorMap[segment.color ?? 'primary'],\n }}\n />\n <Typography variant=\"caption\" sx={{\n color: \"text.secondary\"\n }}>\n {segment.label ?? `${segment.value}%`}\n </Typography>\n </Box>\n ))}\n </Box>\n )}\n </Box>\n );\n}\n","/**\n * CountdownRing — circular countdown indicator that animates from\n * full to empty as a deadline approaches. Useful for time-limited\n * artifacts (quote expiry, OTP windows, session timers, signed-URL\n * lifetimes, etc.).\n *\n * Renders a CircularProgress whose `value` shrinks from 100 to 0\n * over the remaining window. The center label defaults to \"Ns\"\n * but can be customized via `formatLabel`. When the deadline has\n * passed, color flips to `error` and label switches to the\n * supplied `expiredLabel` (or \"Expired\").\n *\n * @example\n * ```tsx\n * <CountdownRing\n * deadline={quote.expiresAt}\n * totalMs={quote.ttlMs}\n * onExpire={() => setQuote(null)}\n * />\n * ```\n */\nimport { useEffect, useState, type ReactNode } from 'react';\nimport { CircularProgress, type ProgressColor } from './progress.js';\n\nexport interface CountdownRingProps {\n /** Deadline to count down to. Accepts Date or ISO string. */\n deadline: Date | string | null;\n /**\n * Total window length in ms — used as the denominator for the\n * progress percentage. If omitted, the ring is filled at mount\n * and tracks elapsed time relative to remaining.\n */\n totalMs?: number;\n /** Diameter in px. Default 40. */\n size?: number;\n /** Color while the timer is healthy. Default `primary`. */\n color?: ProgressColor;\n /** Color when remaining drops below `warningThresholdMs`. Default `warning`. */\n warningColor?: ProgressColor;\n /** Color after expiry. Default `error`. */\n expiredColor?: ProgressColor;\n /**\n * Switch to `warningColor` when remaining is below this.\n * Default 10s.\n */\n warningThresholdMs?: number;\n /** Tick interval in ms. Default 250. */\n tickIntervalMs?: number;\n /** Callback fired once when the deadline first elapses. */\n onExpire?: () => void;\n /**\n * Center-label formatter. Receives `(remainingMs, expired)` and\n * returns the string. Default: `Ns` while running, `expiredLabel`\n * after expiry.\n */\n formatLabel?: (remainingMs: number, expired: boolean) => string;\n /** Override the default expired label. */\n expiredLabel?: string;\n}\n\nexport function CountdownRing({\n deadline,\n totalMs,\n size = 40,\n color = 'primary',\n warningColor = 'warning',\n expiredColor = 'error',\n warningThresholdMs = 10_000,\n tickIntervalMs = 250,\n onExpire,\n formatLabel,\n expiredLabel = 'Expired',\n}: CountdownRingProps): ReactNode {\n const target = parseDeadline(deadline);\n const [now, setNow] = useState<number>(() => Date.now());\n\n useEffect(() => {\n if (!target) return undefined;\n const id = setInterval(() => setNow(Date.now()), tickIntervalMs);\n return () => clearInterval(id);\n }, [target, tickIntervalMs]);\n\n // Fire onExpire exactly once per deadline transition. We track the\n // previous \"expired\" status in state-derived form rather than a ref\n // to keep the hook order stable across renders.\n const remainingMs = target ? Math.max(0, target - now) : 0;\n const expired = target != null && remainingMs <= 0;\n useEffect(() => {\n if (expired && onExpire) onExpire();\n // intentional: re-fire only when transitioning from running → expired\n }, [expired, onExpire]);\n\n const denom = totalMs && totalMs > 0 ? totalMs : remainingMs > 0 ? remainingMs : 1;\n const value = expired ? 0 : Math.min(100, (remainingMs / denom) * 100);\n\n const activeColor: ProgressColor = expired\n ? expiredColor\n : remainingMs <= warningThresholdMs\n ? warningColor\n : color;\n\n const label = formatLabel\n ? formatLabel(remainingMs, expired)\n : expired\n ? expiredLabel\n : `${Math.ceil(remainingMs / 1000)}s`;\n\n return (\n <CircularProgress\n value={value}\n size={size}\n color={activeColor}\n showLabel\n formatLabel={() => label}\n />\n );\n}\n\nfunction parseDeadline(d: Date | string | null): number | null {\n if (!d) return null;\n if (d instanceof Date) return d.getTime();\n const t = Date.parse(d);\n return Number.isFinite(t) ? t : null;\n}\n","/**\n * VirtualList — windowed list for variable-height rows.\n *\n * Wraps `@tanstack/react-virtual` with the most common ergonomic\n * defaults: a scrolling viewport, dynamic height measurement (rows\n * may expand and the list rebalances), and an optional infinite-load\n * hook that fires when the user scrolls within `loadMoreThreshold`\n * px of the bottom.\n *\n * Use cases that drove the API: audit log dialogs (rows can expand\n * to reveal payloads), chat/message histories, paginated transaction\n * tables. Items are keyed by the caller-supplied `getKey` so row\n * identity survives reorder.\n *\n * @example\n * ```tsx\n * <VirtualList\n * items={trades}\n * getKey={(t) => t.id}\n * estimateSize={48}\n * maxHeight={500}\n * onEndReached={() => fetchNextPage()}\n * >\n * {(trade) => <TradeRow trade={trade} />}\n * </VirtualList>\n * ```\n */\nimport { useEffect, useRef, type ReactNode } from 'react';\nimport Box, { type BoxProps } from '@mui/material/Box';\nimport { useVirtualizer } from '@tanstack/react-virtual';\n\nexport interface VirtualListProps<T> {\n /** Source items, in render order. */\n items: readonly T[];\n /** Stable key for each row — needed for reorders and dynamic measurement. */\n getKey: (item: T, index: number) => string | number;\n /** Render a single row. */\n children: (item: T, index: number) => ReactNode;\n /**\n * Initial size estimate per row in px. The virtualizer will replace\n * this with the measured size once each row mounts.\n */\n estimateSize?: number;\n /**\n * Number of items to render outside the visible window on each\n * side. Higher values reduce blank flashes on fast scroll at the\n * cost of more DOM. Default 5.\n */\n overscan?: number;\n /**\n * Cap on the scroll viewport height. The Box auto-fills its parent\n * if not supplied — set this when the parent isn't height-bounded\n * (e.g. inside a Dialog without `fullHeight`).\n */\n maxHeight?: number | string;\n /** Fires when the user scrolls within `loadMoreThreshold` of the bottom. */\n onEndReached?: () => void;\n /** Distance from the bottom (px) at which `onEndReached` fires. Default 200. */\n loadMoreThreshold?: number;\n /** Forwarded to the outer scrolling Box for layout overrides. */\n sx?: BoxProps['sx'];\n /** Inner padding (px) — applied as content offset, not scroll padding. */\n paddingY?: number;\n}\n\nexport function VirtualList<T>({\n items,\n getKey,\n children,\n estimateSize = 48,\n overscan = 5,\n maxHeight,\n onEndReached,\n loadMoreThreshold = 200,\n sx,\n paddingY = 0,\n}: VirtualListProps<T>): ReactNode {\n const parentRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => parentRef.current,\n estimateSize: () => estimateSize,\n overscan,\n getItemKey: (index) => {\n const item = items[index];\n return item === undefined ? index : getKey(item, index);\n },\n });\n\n // Fire onEndReached when the last virtual item is within the\n // threshold of the visible area. We sample every render — cheap,\n // since virtualizer.getVirtualItems is already memoized.\n const virtualItems = virtualizer.getVirtualItems();\n const lastItem = virtualItems[virtualItems.length - 1];\n useEffect(() => {\n if (!onEndReached || !lastItem) return;\n if (lastItem.index >= items.length - 1) {\n // Already at the actual end — nothing more to load yet.\n return;\n }\n const scrollEl = parentRef.current;\n if (!scrollEl) return;\n const distanceToBottom =\n virtualizer.getTotalSize() - (scrollEl.scrollTop + scrollEl.clientHeight);\n if (distanceToBottom <= loadMoreThreshold) {\n onEndReached();\n }\n }, [lastItem, virtualizer, items.length, loadMoreThreshold, onEndReached]);\n\n return (\n <Box\n ref={parentRef}\n sx={{\n overflow: 'auto',\n contain: 'strict',\n maxHeight,\n height: maxHeight === undefined ? '100%' : undefined,\n ...sx,\n }}\n >\n <Box\n sx={{\n height: virtualizer.getTotalSize() + paddingY * 2,\n width: '100%',\n position: 'relative',\n }}\n >\n {virtualItems.map((virtualRow) => {\n const item = items[virtualRow.index];\n if (item === undefined) return null;\n return (\n <Box\n key={virtualRow.key}\n data-index={virtualRow.index}\n ref={virtualizer.measureElement}\n sx={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n transform: `translateY(${virtualRow.start + paddingY}px)`,\n }}\n >\n {children(item, virtualRow.index)}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n","'use client';\n\n/**\n * Accordion Component\n *\n * Expandable content panels.\n *\n * @module components/accordion\n */\n\nimport type { ReactNode, ComponentProps } from 'react';\nimport { useState, useCallback, useMemo } 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 { ChevronDownIcon as ExpandMoreIcon } from '../../icons/controls.js';\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 = useMemo(() =>\n controlledExpanded !== undefined\n ? Array.isArray(controlledExpanded)\n ? controlledExpanded\n : [controlledExpanded]\n : internalExpanded, [controlledExpanded, 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 '&::before': { display: 'none' },\n boxShadow: 'none',\n };\n case 'elevated':\n return {\n boxShadow: 2,\n '&::before': { display: 'none' },\n mb: disableGutters ? 0 : 1,\n };\n default:\n return {};\n }\n };\n\n return (\n <>\n {items.map((item) => (\n <MuiAccordion\n key={item.id}\n expanded={expanded.includes(item.id)}\n onChange={handleChange(item.id)}\n disabled={item.disabled}\n disableGutters={disableGutters}\n sx={getAccordionSx()}\n >\n <MuiAccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls={`${item.id}-content`}\n id={`${item.id}-header`}\n >\n {item.icon && (\n <Typography component=\"span\" sx={{ mr: 1, display: 'flex', alignItems: 'center' }}>\n {item.icon}\n </Typography>\n )}\n <Typography component=\"span\" sx={{ fontWeight: 500 }}>\n {item.title}\n </Typography>\n {item.subtitle && (\n <Typography\n component=\"span\"\n sx={{\n color: 'text.secondary',\n ml: 1,\n }}\n >\n {item.subtitle}\n </Typography>\n )}\n </MuiAccordionSummary>\n <MuiAccordionDetails>{item.content}</MuiAccordionDetails>\n </MuiAccordion>\n ))}\n </>\n );\n}\n\n/**\n * Props for SimpleAccordion component.\n */\nexport interface SimpleAccordionProps extends Omit<ComponentProps<typeof MuiAccordion>, 'children'> {\n /** Header title */\n title: string;\n /** Optional subtitle */\n subtitle?: string;\n /** Panel content */\n children: ReactNode;\n /** Optional icon */\n icon?: ReactNode;\n}\n\n/**\n * SimpleAccordion - Single expandable panel.\n *\n * @example\n * ```tsx\n * <SimpleAccordion title=\"Advanced Settings\" defaultExpanded>\n * <AdvancedSettings />\n * </SimpleAccordion>\n * ```\n */\nexport function SimpleAccordion({ title, subtitle, children, icon, ...props }: SimpleAccordionProps): ReactNode {\n return (\n <MuiAccordion {...props}>\n <MuiAccordionSummary expandIcon={<ExpandMoreIcon />}>\n {icon && (\n <Typography component=\"span\" sx={{ mr: 1, display: 'flex', alignItems: 'center' }}>\n {icon}\n </Typography>\n )}\n <Typography component=\"span\" sx={{ fontWeight: 500 }}>\n {title}\n </Typography>\n {subtitle && (\n <Typography\n component=\"span\"\n sx={{\n color: 'text.secondary',\n ml: 1,\n }}\n >\n {subtitle}\n </Typography>\n )}\n </MuiAccordionSummary>\n <MuiAccordionDetails>{children}</MuiAccordionDetails>\n </MuiAccordion>\n );\n}\n\n/**\n * Hook for managing accordion state externally.\n */\nexport interface UseAccordionOptions {\n /** Allow multiple panels open */\n multiple?: boolean;\n /** Default expanded panel(s) */\n defaultExpanded?: string | string[];\n /** Callback when expanded panels change */\n onChange?: (expanded: string[]) => void;\n}\n\nexport interface UseAccordionReturn {\n /** Currently expanded panel(s) */\n expanded: string[];\n /** Check if a panel is expanded */\n isExpanded: (id: string) => boolean;\n /** Toggle a panel */\n toggle: (id: string) => void;\n /** Expand a panel */\n expand: (id: string) => void;\n /** Collapse a panel */\n collapse: (id: string) => void;\n /** Expand all panels */\n expandAll: (ids: string[]) => void;\n /** Collapse all panels */\n collapseAll: () => void;\n /** Props to spread on Accordion component */\n accordionProps: {\n expanded: string[];\n multiple: boolean;\n onChange: (expanded: string[]) => void;\n };\n}\n\n/**\n * useAccordion - Hook for external accordion state management.\n *\n * @example\n * ```tsx\n * const { accordionProps, expandAll, collapseAll } = useAccordion({\n * multiple: true,\n * defaultExpanded: ['panel1'],\n * });\n *\n * return (\n * <>\n * <button onClick={() => expandAll(['panel1', 'panel2', 'panel3'])}>\n * Expand All\n * </button>\n * <button onClick={collapseAll}>Collapse All</button>\n * <Accordion {...accordionProps} items={items} />\n * </>\n * );\n * ```\n */\nexport function useAccordion({\n multiple = false,\n defaultExpanded,\n onChange,\n}: UseAccordionOptions = {}): UseAccordionReturn {\n const [expanded, setExpanded] = useState<string[]>(() => {\n if (defaultExpanded === undefined) return [];\n return Array.isArray(defaultExpanded) ? defaultExpanded : [defaultExpanded];\n });\n\n const isExpanded = useCallback((id: string) => expanded.includes(id), [expanded]);\n\n const updateExpanded = useCallback(\n (newExpanded: string[]) => {\n setExpanded(newExpanded);\n onChange?.(newExpanded);\n },\n [onChange]\n );\n\n const toggle = useCallback(\n (id: string) => {\n if (expanded.includes(id)) {\n updateExpanded(expanded.filter((e) => e !== id));\n } else if (multiple) {\n updateExpanded([...expanded, id]);\n } else {\n updateExpanded([id]);\n }\n },\n [expanded, multiple, updateExpanded]\n );\n\n const expand = useCallback(\n (id: string) => {\n if (!expanded.includes(id)) {\n if (multiple) {\n updateExpanded([...expanded, id]);\n } else {\n updateExpanded([id]);\n }\n }\n },\n [expanded, multiple, updateExpanded]\n );\n\n const collapse = useCallback(\n (id: string) => {\n updateExpanded(expanded.filter((e) => e !== id));\n },\n [expanded, updateExpanded]\n );\n\n const expandAll = useCallback(\n (ids: string[]) => {\n if (multiple) {\n updateExpanded(ids);\n } else if (ids.length > 0) {\n updateExpanded([ids[0]]);\n }\n },\n [multiple, updateExpanded]\n );\n\n const collapseAll = useCallback(() => {\n updateExpanded([]);\n }, [updateExpanded]);\n\n return {\n expanded,\n isExpanded,\n toggle,\n expand,\n collapse,\n expandAll,\n collapseAll,\n accordionProps: {\n expanded,\n multiple,\n onChange: updateExpanded,\n },\n };\n}\n","'use client';\n\n/**\n * Menu Component\n *\n * Dropdown menu with various item types.\n *\n * @module components/menu\n */\n\nimport type { ReactNode, MouseEvent } from 'react';\nimport { useState, useCallback } from 'react';\nimport MuiMenu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Divider from '@mui/material/Divider';\nimport Typography from '@mui/material/Typography';\n\n// =============================================================================\n// SHARED RENDERING\n// =============================================================================\n\n/**\n * Render menu items (shared between Menu and ContextMenu).\n *\n * @param items - Array of menu item definitions\n * @param onItemClick - Click handler for menu items\n * @returns Array of rendered menu elements\n */\nfunction renderMenuItems(items: MenuItemDef[], onItemClick: (item: MenuItemDef) => void): ReactNode[] {\n return items.map((item, index) => {\n if (item.type === 'divider') {\n return <Divider key={`divider-${index}`} sx={{ my: 0.5 }} />;\n }\n\n if (item.type === 'header') {\n return (\n <Typography\n key={`header-${index}`}\n variant=\"overline\"\n sx={{ px: 2, py: 0.5, display: 'block', color: 'text.secondary' }}\n >\n {item.label}\n </Typography>\n );\n }\n\n return (\n <MenuItem\n key={item.key ?? `item-${index}`}\n onClick={() => onItemClick(item)}\n disabled={item.disabled}\n sx={{\n color: item.danger ? 'error.main' : undefined,\n '&:hover': item.danger ? { bgcolor: 'error.lighter' } : undefined,\n }}\n >\n {item.icon && <ListItemIcon sx={{ color: item.danger ? 'error.main' : undefined }}>{item.icon}</ListItemIcon>}\n <ListItemText>{item.label}</ListItemText>\n {item.shortcut && (\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n ml: 2\n }}>\n {item.shortcut}\n </Typography>\n )}\n </MenuItem>\n );\n });\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Menu item types.\n */\nexport type MenuItemType = 'item' | 'divider' | 'header';\n\n/**\n * Menu item definition.\n */\nexport interface MenuItemDef {\n /** Item type */\n type?: MenuItemType;\n /** Unique key (required for items) */\n key?: string;\n /** Item label */\n label?: string;\n /** Optional icon */\n icon?: ReactNode;\n /** Click handler */\n onClick?: () => void;\n /** Disabled state */\n disabled?: boolean;\n /** Danger/destructive action styling */\n danger?: boolean;\n /** Shortcut hint text */\n shortcut?: string;\n}\n\n/**\n * Props for Menu component.\n */\nexport interface MenuProps {\n /** Menu items */\n items: MenuItemDef[];\n /** Anchor element */\n anchorEl: HTMLElement | null;\n /** Open state */\n open: boolean;\n /** Close handler */\n onClose: () => void;\n /** Minimum width */\n minWidth?: number;\n /** Anchor origin */\n anchorOrigin?: {\n vertical: 'top' | 'center' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n };\n /** Transform origin */\n transformOrigin?: {\n vertical: 'top' | 'center' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n };\n}\n\n/**\n * Menu - Dropdown menu component.\n *\n * @example\n * ```tsx\n * const { anchorEl, open, handleOpen, handleClose } = useMenu();\n *\n * <Button onClick={handleOpen}>Open Menu</Button>\n * <Menu\n * anchorEl={anchorEl}\n * open={open}\n * onClose={handleClose}\n * items={[\n * { key: 'edit', label: 'Edit', icon: <EditIcon /> },\n * { key: 'duplicate', label: 'Duplicate', icon: <CopyIcon /> },\n * { type: 'divider' },\n * { key: 'delete', label: 'Delete', icon: <DeleteIcon />, danger: true },\n * ]}\n * />\n * ```\n */\nexport function Menu({\n items,\n anchorEl,\n open,\n onClose,\n minWidth = 180,\n anchorOrigin = { vertical: 'bottom', horizontal: 'right' },\n transformOrigin = { vertical: 'top', horizontal: 'right' },\n}: MenuProps): ReactNode {\n const handleItemClick = useCallback(\n (item: MenuItemDef) => {\n item.onClick?.();\n onClose();\n },\n [onClose]\n );\n\n return (\n <MuiMenu\n anchorEl={anchorEl}\n open={open}\n onClose={onClose}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n slotProps={{\n paper: {\n sx: { minWidth },\n },\n }}\n >\n {renderMenuItems(items, handleItemClick)}\n </MuiMenu>\n );\n}\n\n/**\n * Return type for useMenu hook.\n */\nexport interface UseMenuReturn {\n /** Anchor element for menu positioning */\n anchorEl: HTMLElement | null;\n /** Whether menu is open */\n open: boolean;\n /** Open menu handler (pass as onClick) */\n handleOpen: (event: MouseEvent<HTMLElement>) => void;\n /** Close menu handler */\n handleClose: () => void;\n /** Toggle menu handler */\n handleToggle: (event: MouseEvent<HTMLElement>) => void;\n /** Props to spread on Menu component */\n menuProps: {\n anchorEl: HTMLElement | null;\n open: boolean;\n onClose: () => void;\n };\n}\n\n/**\n * useMenu - Hook for managing menu state.\n *\n * @example\n * ```tsx\n * const menu = useMenu();\n *\n * return (\n * <>\n * <IconButton onClick={menu.handleOpen}>\n * <MoreVertIcon />\n * </IconButton>\n * <Menu {...menu.menuProps} items={menuItems} />\n * </>\n * );\n * ```\n */\nexport function useMenu(): UseMenuReturn {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n\n const open = Boolean(anchorEl);\n\n const handleOpen = useCallback((event: MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n }, []);\n\n const handleClose = useCallback(() => {\n setAnchorEl(null);\n }, []);\n\n const handleToggle = useCallback((event: MouseEvent<HTMLElement>) => {\n setAnchorEl((prev) => (prev ? null : event.currentTarget));\n }, []);\n\n return {\n anchorEl,\n open,\n handleOpen,\n handleClose,\n handleToggle,\n menuProps: {\n anchorEl,\n open,\n onClose: handleClose,\n },\n };\n}\n\n/**\n * Props for ContextMenu component.\n */\nexport interface ContextMenuProps extends Omit<MenuProps, 'anchorEl' | 'open' | 'onClose'> {\n /** Children to wrap with context menu */\n children: ReactNode;\n}\n\n/**\n * ContextMenu - Right-click context menu wrapper.\n *\n * @example\n * ```tsx\n * <ContextMenu\n * items={[\n * { key: 'cut', label: 'Cut', shortcut: '⌘X' },\n * { key: 'copy', label: 'Copy', shortcut: '⌘C' },\n * { key: 'paste', label: 'Paste', shortcut: '⌘V' },\n * ]}\n * >\n * <div>Right-click me!</div>\n * </ContextMenu>\n * ```\n */\nexport function ContextMenu({ items, children, ...menuProps }: ContextMenuProps): ReactNode {\n const [contextMenu, setContextMenu] = useState<{\n mouseX: number;\n mouseY: number;\n } | null>(null);\n\n const handleContextMenu = useCallback((event: MouseEvent) => {\n event.preventDefault();\n setContextMenu({\n mouseX: event.clientX + 2,\n mouseY: event.clientY - 6,\n });\n }, []);\n\n const handleClose = useCallback(() => {\n setContextMenu(null);\n }, []);\n\n const handleItemClick = useCallback(\n (item: MenuItemDef) => {\n item.onClick?.();\n handleClose();\n },\n [handleClose]\n );\n\n return (\n <>\n <div onContextMenu={handleContextMenu}>{children}</div>\n <MuiMenu\n open={contextMenu !== null}\n onClose={handleClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={contextMenu !== null ? { top: contextMenu.mouseY, left: contextMenu.mouseX } : undefined}\n slotProps={{\n paper: {\n sx: { minWidth: menuProps.minWidth ?? 180 },\n },\n }}\n >\n {renderMenuItems(items, handleItemClick)}\n </MuiMenu>\n </>\n );\n}\n","'use client';\n\n/**\n * Settings Provider\n *\n * Provides settings context and drawer state management.\n * Wraps the application to enable settings drawer access anywhere.\n *\n * @module components/settings\n */\n\nimport { createContext, useContext, useState, useCallback, useMemo, type ReactNode } from 'react';\nimport { useSettingsStore, type SettingsState, type SettingsValues } from '../../state/stores/settings.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Settings drawer state and controls.\n */\nexport interface SettingsDrawerState {\n /** Whether the drawer is open */\n open: boolean;\n /** Open the drawer */\n onOpen: () => void;\n /** Close the drawer */\n onClose: () => void;\n /** Toggle the drawer */\n onToggle: () => void;\n}\n\n/**\n * Settings context value.\n */\nexport interface SettingsContextValue {\n /** Current settings values */\n settings: SettingsValues;\n /** Settings actions */\n actions: Pick<\n SettingsState,\n | 'setMode'\n | 'toggleMode'\n | 'setPreset'\n | 'setPrimaryColor'\n | 'setContrast'\n | 'setDirection'\n | 'setFontSize'\n | 'setFontFamily'\n | 'setDensity'\n | 'setCompactSidebar'\n | 'setNavLayout'\n | 'setNavColor'\n | 'setStretch'\n | 'updateSettings'\n | 'reset'\n >;\n /** Whether settings can be reset (differ from defaults) */\n canReset: boolean;\n /** Drawer state and controls */\n drawer: SettingsDrawerState;\n}\n\n/**\n * Settings provider props.\n */\nexport interface SettingsProviderProps {\n /** Child components */\n children: ReactNode;\n /** Initial drawer open state */\n defaultOpen?: boolean;\n}\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst SettingsContext = createContext<SettingsContextValue | null>(null);\n\n// =============================================================================\n// PROVIDER\n// =============================================================================\n\n/**\n * Settings Provider - Provides settings state and drawer controls.\n *\n * @example\n * ```tsx\n * // In your app root\n * function App() {\n * return (\n * <SettingsProvider>\n * <ThemeProvider theme={theme}>\n * <MyApp />\n * <SettingsDrawer />\n * </ThemeProvider>\n * </SettingsProvider>\n * );\n * }\n *\n * // In any component\n * function Header() {\n * const { drawer } = useSettings();\n * return <IconButton onClick={drawer.onOpen}><SettingsIcon /></IconButton>;\n * }\n * ```\n */\nexport function SettingsProvider({ children, defaultOpen = false }: SettingsProviderProps): ReactNode {\n // Drawer state\n const [open, setOpen] = useState(defaultOpen);\n\n // Get store state and actions\n const store = useSettingsStore();\n\n // Drawer controls\n const onOpen = useCallback(() => setOpen(true), []);\n const onClose = useCallback(() => setOpen(false), []);\n const onToggle = useCallback(() => setOpen((prev) => !prev), []);\n\n // Extract settings values (without actions)\n const settings: SettingsValues = useMemo(\n () => ({\n mode: store.mode,\n preset: store.preset,\n primaryColor: store.primaryColor,\n contrast: store.contrast,\n direction: store.direction,\n fontSize: store.fontSize,\n fontFamily: store.fontFamily,\n density: store.density,\n compactSidebar: store.compactSidebar,\n sidebarCollapsed: store.sidebarCollapsed,\n navLayout: store.navLayout,\n navColor: store.navColor,\n stretch: store.stretch,\n tableRowsPerPage: store.tableRowsPerPage,\n }),\n [\n store.mode,\n store.preset,\n store.primaryColor,\n store.contrast,\n store.direction,\n store.fontSize,\n store.fontFamily,\n store.density,\n store.compactSidebar,\n store.sidebarCollapsed,\n store.navLayout,\n store.navColor,\n store.stretch,\n store.tableRowsPerPage,\n ]\n );\n\n // Extract actions\n const actions = useMemo(\n () => ({\n setMode: store.setMode,\n toggleMode: store.toggleMode,\n setPreset: store.setPreset,\n setPrimaryColor: store.setPrimaryColor,\n setContrast: store.setContrast,\n setDirection: store.setDirection,\n setFontSize: store.setFontSize,\n setFontFamily: store.setFontFamily,\n setDensity: store.setDensity,\n setCompactSidebar: store.setCompactSidebar,\n setNavLayout: store.setNavLayout,\n setNavColor: store.setNavColor,\n setStretch: store.setStretch,\n updateSettings: store.updateSettings,\n reset: store.reset,\n }),\n [\n store.setMode,\n store.toggleMode,\n store.setPreset,\n store.setPrimaryColor,\n store.setContrast,\n store.setDirection,\n store.setFontSize,\n store.setFontFamily,\n store.setDensity,\n store.setCompactSidebar,\n store.setNavLayout,\n store.setNavColor,\n store.setStretch,\n store.updateSettings,\n store.reset,\n ]\n );\n\n // Context value\n const value: SettingsContextValue = useMemo(\n () => ({\n settings,\n actions,\n canReset: store.canReset(),\n drawer: { open, onOpen, onClose, onToggle },\n }),\n [settings, actions, store, open, onOpen, onClose, onToggle]\n );\n\n return <SettingsContext.Provider value={value}>{children}</SettingsContext.Provider>;\n}\n\n// =============================================================================\n// HOOKS\n// =============================================================================\n\n/**\n * Hook to access settings context.\n *\n * @returns Settings context value\n * @throws If used outside of SettingsProvider\n *\n * @example\n * ```tsx\n * function ThemeToggle() {\n * const { settings, actions } = useSettings();\n * return (\n * <Switch\n * checked={settings.mode === 'dark'}\n * onChange={() => actions.toggleMode()}\n * />\n * );\n * }\n * ```\n */\nexport function useSettings(): SettingsContextValue {\n const context = useContext(SettingsContext);\n\n if (!context) {\n throw new Error('useSettings must be used within a SettingsProvider');\n }\n\n return context;\n}\n\n/**\n * Hook to access only the drawer controls.\n *\n * @returns Drawer state and controls\n * @throws If used outside of SettingsProvider\n *\n * @example\n * ```tsx\n * function SettingsButton() {\n * const drawer = useSettingsDrawer();\n * return <IconButton onClick={drawer.onOpen}><SettingsIcon /></IconButton>;\n * }\n * ```\n */\nexport function useSettingsDrawer(): SettingsDrawerState {\n const { drawer } = useSettings();\n return drawer;\n}\n","'use client';\n\n/**\n * Settings Drawer\n *\n * UI component for managing application settings.\n * Displays configurable sections for theme, layout, and preferences.\n *\n * @module components/settings\n */\n\nimport { type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Drawer from '@mui/material/Drawer';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport Button from '@mui/material/Button';\nimport Tooltip from '@mui/material/Tooltip';\nimport Stack from '@mui/material/Stack';\nimport Switch from '@mui/material/Switch';\nimport Slider from '@mui/material/Slider';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport { alpha, useTheme } from '@mui/material/styles';\n\n// Icons - using unicode/text since we don't have icon package\nconst CloseIcon = () => <span style={{ fontSize: 20 }}>✕</span>;\nconst RefreshIcon = () => <span style={{ fontSize: 16 }}>↻</span>;\nconst SunIcon = () => <span style={{ fontSize: 18 }}>☀</span>;\nconst MoonIcon = () => <span style={{ fontSize: 18 }}>☾</span>;\n\nimport { useSettings } from './settings-provider.js';\nimport type { ComponentDensity } from '../../types/theme.js';\nimport type { NavLayout } from '../../state/stores/settings.js';\nimport { PRESET_NAMES, PRESET_DISPLAY_NAMES } from '../../theme/create-theme.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Settings drawer props.\n */\nexport interface SettingsDrawerProps {\n /** Drawer width */\n width?: number;\n /** Sections to display */\n sections?: SettingsSection[];\n}\n\n/**\n * Available settings sections.\n */\nexport type SettingsSection =\n | 'mode'\n | 'contrast'\n | 'direction'\n | 'presets'\n | 'primaryColor'\n | 'fontSize'\n | 'density'\n | 'navLayout'\n | 'stretch';\n\n// =============================================================================\n// PRESET COLORS\n// =============================================================================\n\nconst PRESET_COLORS: Record<string, string> = {\n 'default-light': '#3385F0',\n 'default-dark': '#3385F0',\n luxury: '#B8860B',\n arctic: '#1E88E5',\n nature: '#22C55E',\n ember: '#FF5F11',\n dracula: '#BD93F9',\n midnight: '#6366F1',\n retro: '#F59E0B',\n minimal: '#64748B',\n};\n\n// =============================================================================\n// SECTION COMPONENTS\n// =============================================================================\n\ninterface SectionProps {\n title: string;\n children: ReactNode;\n}\n\nfunction Section({ title, children }: SectionProps): ReactNode {\n return (\n <Box sx={{ mb: 3 }}>\n <Typography\n variant=\"caption\"\n sx={{\n display: 'block',\n mb: 1.5,\n fontWeight: 600,\n color: 'text.secondary',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n }}\n >\n {title}\n </Typography>\n {children}\n </Box>\n );\n}\n\n// =============================================================================\n// MODE SECTION\n// =============================================================================\n\nfunction ModeSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Section title=\"Mode\">\n <ToggleButtonGroup\n exclusive\n fullWidth\n value={settings.mode}\n onChange={(_, value) => value && actions.setMode(value)}\n sx={{ gap: 1 }}\n >\n <ToggleButton\n value=\"light\"\n sx={{\n flex: 1,\n py: 1.5,\n gap: 1,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n <SunIcon /> Light\n </ToggleButton>\n <ToggleButton\n value=\"dark\"\n sx={{\n flex: 1,\n py: 1.5,\n gap: 1,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n <MoonIcon /> Dark\n </ToggleButton>\n </ToggleButtonGroup>\n </Section>\n );\n}\n\n// =============================================================================\n// CONTRAST SECTION\n// =============================================================================\n\nfunction ContrastSection(): ReactNode {\n const { settings, actions } = useSettings();\n\n return (\n <Section title=\"Contrast\">\n <FormControlLabel\n control={\n <Switch\n checked={settings.contrast === 'high'}\n onChange={(e) => actions.setContrast(e.target.checked ? 'high' : 'default')}\n />\n }\n label=\"High Contrast\"\n sx={{ ml: 0 }}\n />\n </Section>\n );\n}\n\n// =============================================================================\n// DIRECTION SECTION\n// =============================================================================\n\nfunction DirectionSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Section title=\"Direction\">\n <ToggleButtonGroup\n exclusive\n fullWidth\n value={settings.direction}\n onChange={(_, value) => value && actions.setDirection(value)}\n sx={{ gap: 1 }}\n >\n <ToggleButton\n value=\"ltr\"\n sx={{\n flex: 1,\n py: 1,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n LTR\n </ToggleButton>\n <ToggleButton\n value=\"rtl\"\n sx={{\n flex: 1,\n py: 1,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n RTL\n </ToggleButton>\n </ToggleButtonGroup>\n </Section>\n );\n}\n\n// =============================================================================\n// PRESETS SECTION\n// =============================================================================\n\nfunction PresetsSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Section title=\"Presets\">\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: 'repeat(5, 1fr)',\n gap: 1.5,\n }}\n >\n {PRESET_NAMES.map((preset) => {\n const isSelected = settings.preset === preset;\n const color = PRESET_COLORS[preset] || '#666';\n\n return (\n <Tooltip key={preset} title={PRESET_DISPLAY_NAMES[preset]} placement=\"top\">\n <Box\n onClick={() => actions.setPreset(preset)}\n sx={{\n width: 40,\n height: 40,\n borderRadius: '50%',\n bgcolor: color,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: isSelected ? `3px solid ${theme.palette.text.primary}` : '3px solid transparent',\n boxShadow: isSelected ? `0 0 0 2px ${color}` : 'none',\n transition: 'all 0.2s',\n '&:hover': {\n transform: 'scale(1.1)',\n },\n }}\n >\n {isSelected && (\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: 'white',\n }}\n />\n )}\n </Box>\n </Tooltip>\n );\n })}\n </Box>\n </Section>\n );\n}\n\n// =============================================================================\n// PRIMARY COLOR SECTION\n// =============================================================================\n\nconst COLOR_OPTIONS = [\n { label: 'Blue', value: '#3385F0' },\n { label: 'Green', value: '#22C55E' },\n { label: 'Purple', value: '#8B5CF6' },\n { label: 'Red', value: '#EF4444' },\n { label: 'Orange', value: '#F97316' },\n { label: 'Cyan', value: '#06B6D4' },\n { label: 'Pink', value: '#EC4899' },\n { label: 'Amber', value: '#F59E0B' },\n];\n\nfunction PrimaryColorSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Section title=\"Primary Color\">\n <Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap' }}>\n {COLOR_OPTIONS.map((option) => {\n const isSelected = settings.primaryColor === option.value;\n\n return (\n <Tooltip key={option.value} title={option.label} placement=\"top\">\n <Box\n onClick={() => actions.setPrimaryColor(option.value)}\n sx={{\n width: 32,\n height: 32,\n borderRadius: '50%',\n bgcolor: option.value,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: isSelected ? `2px solid ${theme.palette.text.primary}` : '2px solid transparent',\n transition: 'transform 0.2s',\n '&:hover': {\n transform: 'scale(1.15)',\n },\n }}\n >\n {isSelected && (\n <Box\n sx={{\n width: 6,\n height: 6,\n borderRadius: '50%',\n bgcolor: 'white',\n }}\n />\n )}\n </Box>\n </Tooltip>\n );\n })}\n {settings.primaryColor && (\n <Tooltip title=\"Reset to default\" placement=\"top\">\n <Box\n onClick={() => actions.setPrimaryColor(null)}\n sx={{\n width: 32,\n height: 32,\n borderRadius: '50%',\n border: `1px dashed ${theme.palette.divider}`,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'text.secondary',\n fontSize: 14,\n '&:hover': {\n borderColor: theme.palette.text.primary,\n },\n }}\n >\n <RefreshIcon />\n </Box>\n </Tooltip>\n )}\n </Box>\n </Section>\n );\n}\n\n// =============================================================================\n// FONT SIZE SECTION\n// =============================================================================\n\nfunction FontSizeSection(): ReactNode {\n const { settings, actions } = useSettings();\n\n return (\n <Section title=\"Font Size\">\n <Stack direction=\"row\" spacing={2} sx={{\n alignItems: \"center\"\n }}>\n <Typography variant=\"body2\" sx={{ minWidth: 24, color: 'text.secondary' }}>\n A\n </Typography>\n <Slider\n min={14}\n max={18}\n step={1}\n value={settings.fontSize}\n onChange={(_, value) => actions.setFontSize(value as number)}\n valueLabelDisplay=\"auto\"\n marks\n sx={{ flex: 1 }}\n />\n <Typography variant=\"body1\" sx={{ minWidth: 24, fontWeight: 600 }}>\n A\n </Typography>\n </Stack>\n </Section>\n );\n}\n\n// =============================================================================\n// DENSITY SECTION\n// =============================================================================\n\nfunction DensitySection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n const densityOptions: { value: ComponentDensity; label: string }[] = [\n { value: 'compact', label: 'Compact' },\n { value: 'standard', label: 'Standard' },\n { value: 'comfortable', label: 'Comfortable' },\n ];\n\n return (\n <Section title=\"Density\">\n <ToggleButtonGroup\n exclusive\n fullWidth\n value={settings.density}\n onChange={(_, value) => value && actions.setDensity(value)}\n sx={{ gap: 1 }}\n >\n {densityOptions.map((option) => (\n <ToggleButton\n key={option.value}\n value={option.value}\n sx={{\n flex: 1,\n py: 1,\n fontSize: '0.75rem',\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n {option.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n </Section>\n );\n}\n\n// =============================================================================\n// NAV LAYOUT SECTION\n// =============================================================================\n\nfunction NavLayoutSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n const layoutOptions: { value: NavLayout; label: string; icon: string }[] = [\n { value: 'vertical', label: 'Vertical', icon: '▌' },\n { value: 'horizontal', label: 'Horizontal', icon: '▬' },\n { value: 'mini', label: 'Mini', icon: '│' },\n ];\n\n return (\n <Section title=\"Navigation Layout\">\n <Box sx={{ display: 'flex', gap: 1.5 }}>\n {layoutOptions.map((option) => {\n const isSelected = settings.navLayout === option.value;\n\n return (\n <Box\n key={option.value}\n onClick={() => actions.setNavLayout(option.value)}\n sx={{\n flex: 1,\n py: 2,\n px: 1,\n borderRadius: 1,\n cursor: 'pointer',\n textAlign: 'center',\n border: `1px solid ${isSelected ? theme.palette.primary.main : theme.palette.divider}`,\n bgcolor: isSelected ? alpha(theme.palette.primary.main, 0.08) : 'transparent',\n transition: 'all 0.2s',\n '&:hover': {\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n <Typography sx={{ fontSize: 24, mb: 0.5, lineHeight: 1 }}>{option.icon}</Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {option.label}\n </Typography>\n </Box>\n );\n })}\n </Box>\n </Section>\n );\n}\n\n// =============================================================================\n// STRETCH SECTION\n// =============================================================================\n\nfunction StretchSection(): ReactNode {\n const { settings, actions } = useSettings();\n\n return (\n <Section title=\"Layout\">\n <FormControlLabel\n control={<Switch checked={settings.stretch} onChange={(e) => actions.setStretch(e.target.checked)} />}\n label=\"Stretch to full width\"\n sx={{ ml: 0 }}\n />\n </Section>\n );\n}\n\n// =============================================================================\n// SECTION MAP\n// =============================================================================\n\nconst SECTION_COMPONENTS: Record<SettingsSection, () => ReactNode> = {\n mode: ModeSection,\n contrast: ContrastSection,\n direction: DirectionSection,\n presets: PresetsSection,\n primaryColor: PrimaryColorSection,\n fontSize: FontSizeSection,\n density: DensitySection,\n navLayout: NavLayoutSection,\n stretch: StretchSection,\n};\n\nconst DEFAULT_SECTIONS: SettingsSection[] = ['mode', 'presets', 'primaryColor', 'density', 'navLayout', 'stretch'];\n\n// =============================================================================\n// SETTINGS DRAWER\n// =============================================================================\n\n/**\n * Settings Drawer - Configurable settings panel.\n *\n * @example\n * ```tsx\n * // Basic usage - must be inside SettingsProvider\n * <SettingsDrawer />\n *\n * // With custom sections\n * <SettingsDrawer\n * sections={['mode', 'presets', 'primaryColor']}\n * width={320}\n * />\n * ```\n */\nexport function SettingsDrawer({ width = 300, sections = DEFAULT_SECTIONS }: SettingsDrawerProps): ReactNode {\n const { drawer, canReset, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Drawer\n anchor=\"right\"\n open={drawer.open}\n onClose={drawer.onClose}\n slotProps={{\n paper: {\n sx: {\n width,\n backgroundImage: 'none',\n },\n }\n }}\n >\n {/* Header */}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n p: 2,\n borderBottom: `1px solid ${theme.palette.divider}`,\n }}\n >\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n Settings\n </Typography>\n <Stack direction=\"row\" spacing={0.5}>\n {canReset && (\n <Tooltip title=\"Reset to defaults\">\n <IconButton size=\"small\" onClick={actions.reset} aria-label=\"Reset settings to defaults\">\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n )}\n <IconButton size=\"small\" onClick={drawer.onClose} aria-label=\"Close settings\">\n <CloseIcon />\n </IconButton>\n </Stack>\n </Box>\n {/* Content */}\n <Box sx={{ p: 2.5, flex: 1, overflowY: 'auto' }}>\n {sections.map((section) => {\n const SectionComponent = SECTION_COMPONENTS[section];\n return SectionComponent ? <SectionComponent key={section} /> : null;\n })}\n </Box>\n {/* Footer */}\n <Box sx={{ p: 2, borderTop: `1px solid ${theme.palette.divider}` }}>\n <Button fullWidth variant=\"soft\" color=\"primary\" onClick={drawer.onClose}>\n Close\n </Button>\n </Box>\n </Drawer>\n );\n}\n","'use client';\n\n/**\n * Tooltip Component\n *\n * Enhanced tooltip with custom styling and arrow support.\n *\n * @module components/tooltip\n */\n\nimport type { ReactNode, ReactElement } from 'react';\nimport MuiTooltip from '@mui/material/Tooltip';\nimport type { TooltipProps as MuiTooltipProps } from '@mui/material/Tooltip';\n\n/**\n * Props for Tooltip component.\n */\nexport interface TooltipProps extends Omit<MuiTooltipProps, 'children'> {\n /** Tooltip content */\n title: ReactNode;\n /** Element to attach tooltip to */\n children: ReactElement;\n /** Show arrow */\n arrow?: boolean;\n /** Tooltip placement */\n placement?: MuiTooltipProps['placement'];\n /** Max width */\n maxWidth?: number | string;\n}\n\n/**\n * Tooltip - Enhanced tooltip with custom styling.\n *\n * @example\n * ```tsx\n * <Tooltip title=\"Delete item\" placement=\"top\">\n * <IconButton>\n * <DeleteIcon />\n * </IconButton>\n * </Tooltip>\n * ```\n */\nexport function Tooltip({\n title,\n children,\n arrow = true,\n placement = 'top',\n maxWidth = 300,\n ...other\n}: TooltipProps): ReactNode {\n if (!title) {\n return children;\n }\n\n return (\n <MuiTooltip\n title={title}\n arrow={arrow}\n placement={placement}\n slotProps={{\n tooltip: {\n sx: {\n maxWidth,\n },\n },\n ...other.slotProps,\n }}\n {...other}\n >\n {children}\n </MuiTooltip>\n );\n}\n","'use client';\n\n/**\n * Nav Card\n *\n * Horizontal navigation tile used on admin/dashboard overview pages:\n * colored icon on the left, title + description in the middle, and a\n * trailing chevron on the right. Renders as a router link when `to`\n * is supplied, otherwise as a button-like Card with `onClick`.\n *\n * Equal-height rows are guaranteed by `height: 100%` — pair the card\n * with a `<Grid container>` whose items share the same column span.\n *\n * @module components/nav-card\n */\n\nimport type { ElementType, ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Chip from '@mui/material/Chip';\nimport Typography from '@mui/material/Typography';\nimport { ChevronRightIcon } from '../../icons/controls.js';\nimport { alpha, type SxProps, type Theme } from '@mui/material/styles';\n\nexport interface NavCardProps {\n /** Card title (rendered as subtitle1, weight 600). */\n title: ReactNode;\n /** Secondary line below the title. */\n description?: ReactNode;\n /** Icon element rendered inside a colored square on the left. */\n icon?: ReactNode;\n /**\n * `'horizontal'` (default) — icon left, text right; works well in\n * 2-column rows (`md: 6`) where each card is wide.\n * `'vertical'` — icon top, text below; required when the card lives\n * in 4-column rows (`md: 3`) or narrower, because the horizontal\n * variant runs out of room for the text and starts breaking letters.\n * Pick orientation per row, not per card.\n */\n orientation?: 'horizontal' | 'vertical';\n /**\n * Palette key for the icon background (e.g. `'primary'`, `'error'`,\n * `'warning.dark'`). Defaults to `'primary'`. The hover border picks\n * up the same color.\n */\n color?: string;\n /**\n * Optional counter shown as a small chip next to the title. Falsy\n * values (`0`, `undefined`, `null`) hide the chip.\n */\n badge?: number | string | null;\n /** Palette key for the badge chip (defaults to `'warning'`). */\n badgeColor?: 'default' | 'primary' | 'secondary' | 'error' | 'info' | 'success' | 'warning';\n /**\n * Navigate to this route. When set, the card renders as the\n * supplied `linkComponent` (e.g. `RouterLink` from react-router) and\n * the whole card becomes a real anchor — Cmd/Ctrl-click opens a new\n * tab, screen readers expose link semantics.\n */\n to?: string;\n /** Custom router link component. Required when `to` is used. */\n linkComponent?: ElementType;\n /** Click handler — used when `to` is not supplied. */\n onClick?: () => void;\n /**\n * Trailing chevron. Pass `false` to suppress, or a ReactNode to\n * substitute (e.g. a status indicator). Default `true`.\n */\n arrow?: boolean | ReactNode;\n /** Square icon size in pixels (default 48). */\n iconSize?: number;\n /** Extra styles applied to the outer Card. */\n sx?: SxProps<Theme>;\n /** Accessible label override. Defaults to `${title} — ${description}`. */\n ariaLabel?: string;\n}\n\nexport function NavCard({\n title,\n description,\n icon,\n color = 'primary',\n badge,\n badgeColor = 'warning',\n orientation = 'horizontal',\n to,\n linkComponent,\n onClick,\n arrow = true,\n iconSize = 48,\n sx,\n ariaLabel,\n}: NavCardProps) {\n const interactive = Boolean(to) || Boolean(onClick);\n const linkProps = to && linkComponent ? { component: linkComponent, to } : {};\n\n const showBadge =\n badge !== undefined && badge !== null && badge !== '' && !(typeof badge === 'number' && badge === 0);\n\n const label =\n ariaLabel ??\n (typeof title === 'string' && typeof description === 'string' ? `${title} — ${description}` : undefined);\n\n const isVertical = orientation === 'vertical';\n\n return (\n <Card\n variant=\"outlined\"\n {...linkProps}\n onClick={!to ? onClick : undefined}\n aria-label={label}\n role={interactive && !to ? 'button' : undefined}\n tabIndex={interactive && !to ? 0 : undefined}\n onKeyDown={\n interactive && !to\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n sx={{\n height: '100%',\n cursor: interactive ? 'pointer' : 'default',\n textDecoration: 'none',\n color: 'inherit',\n // Explicit elevated paper background so the card pops on both\n // light and dark themes — the default `background.paper` is\n // very close to the page background in some dark presets,\n // which made the 1px border read as a faint vertical line\n // rather than a card outline. Falls back gracefully when a\n // theme doesn't define `elevation1`.\n bgcolor: (theme) =>\n theme.palette.background?.elevation2 ?? theme.palette.background?.neutral ?? theme.palette.background.paper,\n // On dark themes the default outlined-Paper border (alpha\n // 0.16 on grey) is too close to both the page bg and the\n // card body — the right edge of each card ends up reading\n // as a free-floating vertical line. Use `text.primary` at\n // a small alpha so the border is unambiguously a card edge\n // regardless of theme contrast, then let hover swap to the\n // accent colour for tactile feedback.\n borderColor: (theme) => alpha(theme.palette.text.primary, theme.palette.mode === 'dark' ? 0.16 : 0.12),\n // Suppress the theme-level Card box-shadow halo for the\n // outlined variant — replicates prism's `Card` wrapper logic\n // so a raw MuiCard (which NavCard uses to be a real anchor)\n // doesn't get a glow that swallows the border.\n boxShadow: 'none',\n transition: 'border-color 0.2s, transform 0.2s, background-color 0.2s',\n '&:hover': interactive\n ? {\n borderColor: `${color}.main`,\n transform: 'translateY(-2px)',\n bgcolor: (theme) =>\n theme.palette.background?.elevation2 ??\n theme.palette.background?.elevation1 ??\n theme.palette.background.paper,\n }\n : undefined,\n '&:focus-visible': {\n outline: 2,\n outlineColor: `${color}.main`,\n outlineOffset: 2,\n },\n ...sx,\n }}\n >\n <CardContent\n sx={{\n p: isVertical ? 2.5 : 3,\n '&:last-child': { pb: isVertical ? 2.5 : 3 },\n height: '100%',\n display: 'flex',\n flexDirection: isVertical ? 'column' : 'row',\n alignItems: isVertical ? 'stretch' : 'center',\n gap: isVertical ? 1.25 : 0,\n }}\n >\n {isVertical ? (\n // Vertical: icon top, title + description stacked below, no\n // chevron (the entire card is the affordance — adding an\n // arrow into a narrow tile just steals text space).\n <>\n {icon && (\n <Box\n sx={{\n width: 40,\n height: 40,\n borderRadius: 1.5,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: `${color}.main`,\n color: `${color}.contrastText`,\n flexShrink: 0,\n }}\n >\n {icon}\n </Box>\n )}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' }}>\n <Typography\n variant=\"subtitle1\"\n sx={{\n fontWeight: 600,\n lineHeight: 1.2,\n }}\n >\n {title}\n </Typography>\n {showBadge && (\n <Chip\n size=\"small\"\n label={badge}\n color={badgeColor}\n sx={{ height: 20, fontSize: '0.7rem', fontWeight: 700 }}\n />\n )}\n </Box>\n {description && (\n <Typography\n variant=\"body2\"\n sx={{\n color: 'text.secondary',\n lineHeight: 1.35,\n\n // Clamp the description to 2 lines so an unusually\n // long copy doesn't push a tile out of its row.\n display: '-webkit-box',\n\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {description}\n </Typography>\n )}\n </>\n ) : (\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', width: '100%', gap: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, minWidth: 0 }}>\n {icon && (\n <Box\n sx={{\n width: iconSize,\n height: iconSize,\n borderRadius: 1.5,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: `${color}.main`,\n color: `${color}.contrastText`,\n flexShrink: 0,\n }}\n >\n {icon}\n </Box>\n )}\n <Box sx={{ minWidth: 0, flex: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' }}>\n <Typography\n variant=\"subtitle1\"\n sx={{\n fontWeight: 600,\n lineHeight: 1.3,\n }}\n >\n {title}\n </Typography>\n {showBadge && (\n <Chip\n size=\"small\"\n label={badge}\n color={badgeColor}\n sx={{ height: 20, fontSize: '0.7rem', fontWeight: 700 }}\n />\n )}\n </Box>\n {description && (\n <Typography\n variant=\"body2\"\n sx={{\n color: 'text.secondary',\n lineHeight: 1.4,\n }}\n >\n {description}\n </Typography>\n )}\n </Box>\n </Box>\n {arrow !== false && (\n <Box sx={{ display: 'flex', alignItems: 'center', flexShrink: 0, color: 'text.secondary' }}>\n {arrow === true ? <ChevronRightIcon /> : arrow}\n </Box>\n )}\n </Box>\n )}\n </CardContent>\n </Card>\n );\n}\n","'use client';\n\n/**\n * NavCardGrid\n *\n * Canonical container for `<NavCard>` rows on admin/dashboard\n * overview pages. Replaces the ad-hoc `<Grid container spacing={3}>`\n * + `<Grid size={{md:3}}>` pattern, which has two failure modes\n * when the tile count is uneven against the column count:\n *\n * 1. The empty trailing cells visually extend the row above's\n * column borders into nothing — reading as orphan vertical\n * \"sticks\" between cards on dark themes.\n * 2. Cards across rows can end up with different heights when\n * their descriptions wrap differently.\n *\n * NavCardGrid solves both with a CSS Grid:\n *\n * - `auto-fit` (not `auto-fill`) collapses empty trailing tracks,\n * so the last row's cards expand to fill the width and their\n * right edges no longer align with the row above.\n * - `minmax(<min>, 1fr)` caps the column count on wide viewports\n * (otherwise 5+ tiny tiles can pack a row).\n * - `grid-auto-rows: 1fr` guarantees equal card height across\n * rows regardless of per-card content length.\n *\n * Use as a drop-in replacement for the Grid wrapper around NavCards\n * in admin dashboards. The contained `<NavCard>` should typically\n * use `orientation=\"vertical\"` so the tiles work at narrow widths.\n *\n * @example\n * ```tsx\n * <NavCardGrid>\n * <NavCard title=\"Users\" icon={<UsersIcon />} to=\"/admin/users\" />\n * <NavCard title=\"Shops\" icon={<ShopsIcon />} to=\"/admin/shops\" />\n * ...\n * </NavCardGrid>\n * ```\n *\n * @module components/nav-card\n */\n\nimport type { ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface NavCardGridProps {\n children: ReactNode;\n /**\n * Minimum tile width before wrap. Effectively caps the column\n * count via `minmax`. Default 260px which gives 4 columns on a\n * typical 1200px content area, 3 on tablet, 2 on small laptops,\n * and 1 on mobile.\n */\n minTileWidth?: number;\n /** Gap between tiles in spacing units. Default 3 (24px). */\n gap?: number;\n /** Custom sx overrides. */\n sx?: SxProps<Theme>;\n}\n\nexport function NavCardGrid({\n children,\n minTileWidth = 260,\n gap = 3,\n sx,\n}: NavCardGridProps) {\n return (\n <Box\n sx={{\n display: 'grid',\n gap,\n // Always 1 column on xs to avoid horizontal overflow on tiny\n // viewports; `auto-fit` from sm upward.\n gridTemplateColumns: {\n xs: '1fr',\n sm: `repeat(auto-fit, minmax(${minTileWidth}px, 1fr))`,\n },\n gridAutoRows: '1fr',\n ...sx,\n }}\n >\n {children}\n </Box>\n );\n}\n","'use client';\n\n/**\n * Drawer Component\n *\n * Enhanced drawer/side panel with custom styling.\n *\n * @module components/drawer\n */\n\nimport type { ReactNode } from 'react';\nimport MuiDrawer from '@mui/material/Drawer';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport Divider from '@mui/material/Divider';\nimport type { PaperProps } from '@mui/material/Paper';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n/**\n * Drawer anchor positions.\n */\nexport type DrawerAnchor = 'left' | 'right' | 'top' | 'bottom';\n\n/**\n * Props for Drawer component.\n */\nexport interface DrawerProps {\n /** Whether the drawer is open */\n open?: boolean;\n /** Drawer anchor position */\n anchor?: DrawerAnchor;\n /** Drawer title */\n title?: ReactNode;\n /** Drawer width (for left/right anchors) */\n width?: number | string;\n /** Drawer height (for top/bottom anchors) */\n height?: number | string;\n /** Show close button */\n showCloseButton?: boolean;\n /** Close button icon */\n closeIcon?: ReactNode;\n /** Header actions */\n headerActions?: ReactNode;\n /** Footer content */\n footer?: ReactNode;\n /** Drawer content */\n children?: ReactNode;\n /** On close handler */\n onClose?: () => void;\n /** Variant: permanent, persistent, or temporary */\n variant?: 'permanent' | 'persistent' | 'temporary';\n /** Props for the Paper component */\n PaperProps?: Partial<PaperProps>;\n /** Custom sx props */\n sx?: SxProps<Theme>;\n}\n\n/**\n * Default close icon.\n */\nfunction DefaultCloseIcon(): ReactNode {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n );\n}\n\n/**\n * Drawer - Enhanced drawer/side panel.\n *\n * @example\n * ```tsx\n * <Drawer\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"Edit Profile\"\n * anchor=\"right\"\n * width={400}\n * >\n * <ProfileForm />\n * </Drawer>\n * ```\n */\nexport function Drawer({\n open,\n anchor = 'right',\n title,\n width = 320,\n height = 'auto',\n showCloseButton = true,\n closeIcon,\n headerActions,\n footer,\n children,\n onClose,\n variant = 'temporary',\n PaperProps,\n sx,\n}: DrawerProps): ReactNode {\n const isHorizontal = anchor === 'left' || anchor === 'right';\n const drawerSize = isHorizontal ? { width } : { height };\n\n return (\n <MuiDrawer\n open={open}\n anchor={anchor}\n variant={variant}\n onClose={onClose}\n transitionDuration={{ enter: 300, exit: 250 }}\n sx={sx}\n slotProps={{\n backdrop: { sx: { backdropFilter: 'blur(2px)' } },\n\n paper: {\n sx: {\n ...drawerSize,\n display: 'flex',\n flexDirection: 'column',\n },\n ...PaperProps,\n }\n }}>\n {/* Header */}\n {(title || showCloseButton || headerActions) && (\n <>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n p: 2,\n minHeight: 64,\n }}\n >\n {title && (\n <Typography variant=\"h6\" component=\"div\">\n {title}\n </Typography>\n )}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, ml: 'auto' }}>\n {headerActions}\n {showCloseButton && onClose && (\n <IconButton onClick={onClose} edge=\"end\" size=\"small\" aria-label=\"Close drawer\">\n {closeIcon ?? <DefaultCloseIcon />}\n </IconButton>\n )}\n </Box>\n </Box>\n <Divider />\n </>\n )}\n {/* Content */}\n <Box\n sx={{\n flex: 1,\n overflow: 'auto',\n p: 2,\n }}\n >\n {children}\n </Box>\n {/* Footer */}\n {footer && (\n <>\n <Divider />\n <Box sx={{ p: 2 }}>{footer}</Box>\n </>\n )}\n </MuiDrawer>\n );\n}\n","/**\n * Lightbox Component Types\n *\n * Type definitions for the Lightbox component - a modal image viewer\n * with zoom, pan, and navigation capabilities.\n *\n * @module components/lightbox\n */\n\nimport type { Theme, SxProps } from '@mui/material/styles';\nimport type { DialogProps } from '@mui/material/Dialog';\n\n// =============================================================================\n// LIGHTBOX SLIDE TYPES\n// =============================================================================\n\n/**\n * Individual slide/image in the lightbox.\n */\nexport interface LightboxSlide {\n /** Image source URL */\n src: string;\n /** Alt text for accessibility */\n alt?: string;\n /** Optional title displayed below image */\n title?: string;\n /** Optional description/caption */\n description?: string;\n /** Video source (if slide is a video) */\n video?: {\n /** Video sources with type */\n sources: Array<{ src: string; type: string }>;\n /** Autoplay video */\n autoPlay?: boolean;\n /** Loop video */\n loop?: boolean;\n /** Muted by default */\n muted?: boolean;\n /** Poster image */\n poster?: string;\n };\n /** Thumbnail URL (defaults to src) */\n thumbnail?: string;\n /** Width for sizing calculations */\n width?: number;\n /** Height for sizing calculations */\n height?: number;\n /** Additional slide data */\n [key: string]: unknown;\n}\n\n// =============================================================================\n// LIGHTBOX LABELS\n// =============================================================================\n\n/**\n * Accessible names for the lightbox's controls, so a consumer can localise\n * them.\n *\n * Every one of these buttons is an icon: there is no visible text beside it,\n * so the `aria-label` is the ONLY text a screen reader has to offer. Written\n * into the component they were English on a Russian-first product — and the\n * lightbox is where a person looks at a photograph someone sent them in chat,\n * an image in a shop review, or a picture in the documentation.\n *\n * Defaults keep the previous strings verbatim, so a consumer that passes\n * nothing is unchanged.\n */\nexport interface LightboxLabels {\n zoomIn: string;\n zoomOut: string;\n download: string;\n share: string;\n close: string;\n previous: string;\n next: string;\n}\n\n/** The strings the lightbox used before `labels` existed. */\nexport const DEFAULT_LIGHTBOX_LABELS: LightboxLabels = {\n zoomIn: 'Zoom in',\n zoomOut: 'Zoom out',\n download: 'Download',\n share: 'Share',\n close: 'Close',\n previous: 'Previous',\n next: 'Next',\n};\n\n// =============================================================================\n// LIGHTBOX PROPS\n// =============================================================================\n\n/**\n * Lightbox component props.\n */\nexport interface LightboxProps extends Omit<DialogProps, 'open' | 'onClose' | 'children' | 'slotProps'> {\n /** Whether the lightbox is open */\n open: boolean;\n /** Callback when lightbox should close */\n onClose: () => void;\n /** Array of slides to display */\n slides: LightboxSlide[];\n /** Initial slide index (default: 0) */\n index?: number;\n /** Callback when slide changes */\n onIndexChange?: (index: number) => void;\n /** Show thumbnails strip */\n thumbnails?: boolean;\n /** Show zoom controls */\n zoom?: boolean;\n /** Enable fullscreen mode */\n fullscreen?: boolean;\n /** Show slide counter */\n counter?: boolean;\n /** Show download button */\n download?: boolean;\n /** Show share button */\n share?: boolean;\n /** Enable infinite loop navigation */\n loop?: boolean;\n /** Enable keyboard navigation */\n keyboard?: boolean;\n /** Enable swipe gestures */\n swipe?: boolean;\n /** Animation duration in ms */\n animation?: number;\n /** Close on backdrop click */\n closeOnBackdropClick?: boolean;\n /** Close on escape key */\n closeOnEsc?: boolean;\n /** Custom toolbar actions */\n toolbar?: {\n /** Show toolbar */\n show?: boolean;\n /** Toolbar position */\n position?: 'top' | 'bottom';\n /** Custom buttons */\n buttons?: React.ReactNode[];\n };\n /** Accessible names for the controls. Partial — anything omitted keeps\n * its English default. See {@link LightboxLabels}. */\n labels?: Partial<LightboxLabels>;\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Slot props for internal components */\n slotProps?: {\n /** Root container styles */\n root?: SxProps<Theme>;\n /** Backdrop styles */\n backdrop?: SxProps<Theme>;\n /** Image container styles */\n imageContainer?: SxProps<Theme>;\n /** Toolbar styles */\n toolbar?: SxProps<Theme>;\n /** Thumbnails container styles */\n thumbnails?: SxProps<Theme>;\n /** Navigation button styles */\n navButton?: SxProps<Theme>;\n /** Counter styles */\n counter?: SxProps<Theme>;\n };\n}\n\n// =============================================================================\n// LIGHTBOX TOOLBAR PROPS\n// =============================================================================\n\n/**\n * Lightbox toolbar props.\n */\nexport interface LightboxToolbarProps {\n /** Current slide index */\n index: number;\n /** Total number of slides */\n total: number;\n /** Current zoom level */\n zoomLevel: number;\n /** Whether fullscreen is active */\n isFullscreen: boolean;\n /** Zoom in handler */\n onZoomIn?: () => void;\n /** Zoom out handler */\n onZoomOut?: () => void;\n /** Reset zoom handler */\n onZoomReset?: () => void;\n /** Toggle fullscreen handler */\n onFullscreen?: () => void;\n /** Download handler */\n onDownload?: () => void;\n /** Share handler */\n onShare?: () => void;\n /** Close handler */\n onClose: () => void;\n /** Show zoom controls */\n showZoom?: boolean;\n /** Show fullscreen button */\n showFullscreen?: boolean;\n /** Show download button */\n showDownload?: boolean;\n /** Show share button */\n showShare?: boolean;\n /** Show counter */\n showCounter?: boolean;\n /** Custom buttons */\n customButtons?: React.ReactNode[];\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// LIGHTBOX THUMBNAILS PROPS\n// =============================================================================\n\n/**\n * Lightbox thumbnails strip props.\n */\nexport interface LightboxThumbnailsProps {\n /** Slides to show thumbnails for */\n slides: LightboxSlide[];\n /** Currently active index */\n activeIndex: number;\n /** Thumbnail click handler */\n onSelect: (index: number) => void;\n /** Thumbnail size */\n size?: 'small' | 'medium' | 'large';\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// LIGHTBOX HOOK RETURN TYPE\n// =============================================================================\n\n/**\n * Return type for useLightbox hook.\n */\nexport interface UseLightboxReturn {\n /** Whether lightbox is open */\n open: boolean;\n /** Current slide index */\n index: number;\n /** Open lightbox at specific index */\n onOpen: (index?: number) => void;\n /** Close lightbox */\n onClose: () => void;\n /** Go to specific slide */\n goTo: (index: number) => void;\n /** Go to next slide */\n next: () => void;\n /** Go to previous slide */\n prev: () => void;\n /**\n * Props to spread on the Lightbox component.\n *\n * Note what is NOT here, and was not before: zoom. `<Lightbox>` owns its\n * own zoom state and exposes no prop to drive it — `zoom` on that component\n * is a boolean that shows or hides the controls. The hook used to return\n * `zoomLevel`, `zoomIn`, `zoomOut` and `zoomReset` anyway, four exported\n * members that moved a number nothing rendered. A consumer following this\n * hook's own example would have called them and seen nothing happen.\n *\n * Adding real control means giving `LightboxProps` a controlled\n * `zoomLevel` / `onZoomChange` pair and routing the component's seven\n * internal `setZoomLevel` calls through it. Worth doing when something\n * needs it; not worth pretending until then.\n */\n getLightboxProps: () => Pick<LightboxProps, 'open' | 'onClose' | 'index' | 'onIndexChange'>;\n}\n","/**\n * Lightbox CSS Classes\n *\n * @module components/lightbox\n */\n\nimport { createClasses } from '../../utils/create-classes.js';\n\n/**\n * CSS class names for Lightbox component.\n */\nexport const lightboxClasses = {\n root: createClasses('lightbox__root'),\n backdrop: createClasses('lightbox__backdrop'),\n container: createClasses('lightbox__container'),\n slide: createClasses('lightbox__slide'),\n slideActive: createClasses('lightbox__slide--active'),\n image: createClasses('lightbox__image'),\n video: createClasses('lightbox__video'),\n caption: createClasses('lightbox__caption'),\n toolbar: createClasses('lightbox__toolbar'),\n toolbarTop: createClasses('lightbox__toolbar--top'),\n toolbarBottom: createClasses('lightbox__toolbar--bottom'),\n toolbarButton: createClasses('lightbox__toolbar__button'),\n navButton: createClasses('lightbox__nav'),\n navPrev: createClasses('lightbox__nav--prev'),\n navNext: createClasses('lightbox__nav--next'),\n counter: createClasses('lightbox__counter'),\n thumbnails: createClasses('lightbox__thumbnails'),\n thumbnail: createClasses('lightbox__thumbnail'),\n thumbnailActive: createClasses('lightbox__thumbnail--active'),\n zoom: createClasses('lightbox__zoom'),\n zoomed: createClasses('lightbox__zoomed'),\n loading: createClasses('lightbox__loading'),\n error: createClasses('lightbox__error'),\n};\n","'use client';\n\n/**\n * Lightbox Component\n *\n * Premium modal image/video viewer with smooth crossfade transitions,\n * glassmorphism UI, zoom, pan, touch gestures, and keyboard navigation.\n *\n * @module components/lightbox\n */\n\nimport type { LightboxProps, LightboxSlide } from './types.js';\nimport { DEFAULT_LIGHTBOX_LABELS } from './types.js';\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\n\nimport Box from '@mui/material/Box';\nimport Dialog from '@mui/material/Dialog';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport { styled, alpha, useTheme } from '@mui/material/styles';\n\n// MUI Icons (standard for design system components)\nimport { CloseIcon } from '../../icons/controls.js';\nimport { ChevronLeftIcon } from '../../icons/controls.js';\nimport { ChevronRightIcon } from '../../icons/controls.js';\nimport { ZoomInIcon } from '../../icons/controls.js';\nimport { ZoomOutIcon } from '../../icons/controls.js';\nimport { FullscreenIcon } from '../../icons/controls.js';\nimport { FullscreenExitIcon } from '../../icons/controls.js';\nimport { DownloadIcon } from '../../icons/controls.js';\nimport { ShareIcon } from '../../icons/controls.js';\nimport { PlayIcon as PlayArrowIcon } from '../../icons/controls.js';\n\nimport { cn } from '../../utils/cn.js';\nimport { lightboxClasses } from './classes.js';\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst MIN_ZOOM = 1;\nconst MAX_ZOOM = 4;\nconst ZOOM_STEP = 0.5;\nconst SWIPE_THRESHOLD = 60;\nconst TRANSITION_DURATION = 400;\n\n// =============================================================================\n// LIGHTBOX COMPONENT\n// =============================================================================\n\n/**\n * Full-screen modal image/video viewer with smooth crossfade transitions.\n *\n * @example\n * ```tsx\n * import { Lightbox, useLightbox } from '@omnitron-dev/prism/components';\n *\n * function Gallery() {\n * const lightbox = useLightbox({ totalSlides: images.length });\n *\n * return (\n * <>\n * <ImageList>\n * {images.map((img, i) => (\n * <ImageListItem key={i} onClick={() => lightbox.onOpen(i)}>\n * <img src={img.thumbnail} />\n * </ImageListItem>\n * ))}\n * </ImageList>\n *\n * <Lightbox\n * slides={images}\n * thumbnails\n * zoom\n * {...lightbox.getLightboxProps()}\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function Lightbox({\n open,\n onClose,\n slides,\n index: controlledIndex = 0,\n onIndexChange,\n thumbnails = false,\n zoom = true,\n fullscreen = true,\n counter = true,\n download = false,\n share = false,\n loop = false,\n keyboard = true,\n swipe = true,\n animation = TRANSITION_DURATION,\n closeOnBackdropClick = true,\n closeOnEsc = true,\n toolbar = { show: true, position: 'top' },\n labels: labelOverrides,\n sx,\n slotProps,\n className,\n ...dialogProps\n}: LightboxProps) {\n const theme = useTheme();\n\n // Merged once per identity change, so a consumer passing an inline object\n // does not rebuild the toolbar on every render.\n const labels = useMemo(() => ({ ...DEFAULT_LIGHTBOX_LABELS, ...labelOverrides }), [labelOverrides]);\n\n // State\n const [currentIndex, setCurrentIndex] = useState(controlledIndex);\n const [zoomLevel, setZoomLevel] = useState(MIN_ZOOM);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const [isDragging, setIsDragging] = useState(false);\n\n // Transition state: track previous index for crossfade direction\n const [transitionState, setTransitionState] = useState<'idle' | 'transitioning'>('idle');\n const [prevIndex, setPrevIndex] = useState(controlledIndex);\n const [slideDirection, setSlideDirection] = useState<'left' | 'right' | 'none'>('none');\n\n // Refs\n const containerRef = useRef<HTMLDivElement>(null);\n const dragStart = useRef({ x: 0, y: 0 });\n const touchStart = useRef({ x: 0, y: 0 });\n const thumbnailsRef = useRef<HTMLDivElement>(null);\n\n // Sync with controlled index\n useEffect(() => {\n if (controlledIndex !== currentIndex) {\n navigateToSlide(controlledIndex);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [controlledIndex]);\n\n // Reset state when opening\n useEffect(() => {\n if (open) {\n setZoomLevel(MIN_ZOOM);\n setPosition({ x: 0, y: 0 });\n setIsLoading(true);\n setTransitionState('idle');\n setSlideDirection('none');\n }\n }, [open]);\n\n // Current slide\n const currentSlide = slides[currentIndex] as LightboxSlide | undefined;\n const totalSlides = slides.length;\n const hasNext = loop || currentIndex < totalSlides - 1;\n const hasPrev = loop || currentIndex > 0;\n const isZoomed = zoomLevel > MIN_ZOOM;\n\n // Navigation with crossfade transition\n const navigateToSlide = useCallback(\n (newIndex: number) => {\n const targetIndex = loop\n ? (newIndex + totalSlides) % totalSlides\n : Math.max(0, Math.min(newIndex, totalSlides - 1));\n\n if (targetIndex === currentIndex) return;\n\n // Determine direction\n const direction = targetIndex > currentIndex ? 'left' : 'right';\n\n setPrevIndex(currentIndex);\n setSlideDirection(direction);\n setTransitionState('transitioning');\n setCurrentIndex(targetIndex);\n onIndexChange?.(targetIndex);\n setZoomLevel(MIN_ZOOM);\n setPosition({ x: 0, y: 0 });\n setIsLoading(true);\n\n // End transition after animation\n setTimeout(() => {\n setTransitionState('idle');\n setSlideDirection('none');\n }, animation);\n },\n [loop, totalSlides, currentIndex, onIndexChange, animation]\n );\n\n const next = useCallback(() => {\n if (hasNext) navigateToSlide(currentIndex + 1);\n }, [hasNext, currentIndex, navigateToSlide]);\n\n const prev = useCallback(() => {\n if (hasPrev) navigateToSlide(currentIndex - 1);\n }, [hasPrev, currentIndex, navigateToSlide]);\n\n // Direct navigation (from thumbnails — no directional slide)\n const goTo = useCallback(\n (newIndex: number) => {\n navigateToSlide(newIndex);\n },\n [navigateToSlide]\n );\n\n // Zoom handlers\n const zoomIn = useCallback(() => {\n setZoomLevel((prevZoom) => Math.min(prevZoom + ZOOM_STEP, MAX_ZOOM));\n }, []);\n\n const zoomOut = useCallback(() => {\n // The pan reset happens beside the state update, not inside its updater.\n // React may run an updater more than once — under `StrictMode` it does so\n // deliberately — and an updater that calls another setter is exactly the\n // shape that made `useCountdown` fire its completion callback four times.\n setZoomLevel((prevZoom) => Math.max(prevZoom - ZOOM_STEP, MIN_ZOOM));\n }, []);\n\n // Panning only means anything while zoomed in; recentre as soon as it is not.\n useEffect(() => {\n if (zoomLevel === MIN_ZOOM) setPosition({ x: 0, y: 0 });\n }, [zoomLevel]);\n\n const zoomReset = useCallback(() => {\n setZoomLevel(MIN_ZOOM);\n setPosition({ x: 0, y: 0 });\n }, []);\n\n // Fullscreen\n const toggleFullscreen = useCallback(async () => {\n if (!document.fullscreenElement) {\n await containerRef.current?.requestFullscreen();\n setIsFullscreen(true);\n } else {\n await document.exitFullscreen();\n setIsFullscreen(false);\n }\n }, []);\n\n // Download\n const handleDownload = useCallback(async () => {\n if (!currentSlide?.src) return;\n try {\n const response = await fetch(currentSlide.src);\n const blob = await response.blob();\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = currentSlide.title || `image-${currentIndex + 1}`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n } catch (error) {\n console.error('Download failed:', error);\n }\n }, [currentSlide, currentIndex]);\n\n // Share\n const handleShare = useCallback(async () => {\n if (!currentSlide?.src) return;\n try {\n if (navigator.share) {\n await navigator.share({\n title: currentSlide.title || 'Image',\n url: currentSlide.src,\n });\n } else {\n await navigator.clipboard.writeText(currentSlide.src);\n }\n } catch (error) {\n console.error('Share failed:', error);\n }\n }, [currentSlide]);\n\n // Keyboard navigation\n useEffect(() => {\n if (!open || !keyboard) return undefined;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowLeft':\n prev();\n break;\n case 'ArrowRight':\n next();\n break;\n case 'Escape':\n if (closeOnEsc) onClose();\n break;\n case '+':\n case '=':\n if (zoom) zoomIn();\n break;\n case '-':\n if (zoom) zoomOut();\n break;\n case '0':\n if (zoom) zoomReset();\n break;\n case 'f':\n if (fullscreen) toggleFullscreen();\n break;\n // no default\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [open, keyboard, zoom, fullscreen, closeOnEsc, prev, next, zoomIn, zoomOut, zoomReset, toggleFullscreen, onClose]);\n\n // Mouse drag for panning when zoomed\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (!isZoomed) return;\n e.preventDefault();\n setIsDragging(true);\n dragStart.current = { x: e.clientX - position.x, y: e.clientY - position.y };\n },\n [isZoomed, position]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isDragging || !isZoomed) return;\n setPosition({\n x: e.clientX - dragStart.current.x,\n y: e.clientY - dragStart.current.y,\n });\n },\n [isDragging, isZoomed]\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n // Touch swipe for navigation and panning\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (!touch) return;\n touchStart.current = { x: touch.clientX, y: touch.clientY };\n if (isZoomed) {\n setIsDragging(true);\n dragStart.current = { x: touch.clientX - position.x, y: touch.clientY - position.y };\n }\n },\n [isZoomed, position]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (!touch) return;\n if (isDragging && isZoomed) {\n setPosition({\n x: touch.clientX - dragStart.current.x,\n y: touch.clientY - dragStart.current.y,\n });\n }\n },\n [isDragging, isZoomed]\n );\n\n const handleTouchEnd = useCallback(\n (e: React.TouchEvent) => {\n if (isDragging) {\n setIsDragging(false);\n return;\n }\n\n if (!swipe || isZoomed) return;\n\n const touch = e.changedTouches[0];\n if (!touch) return;\n const deltaX = touch.clientX - touchStart.current.x;\n const deltaY = touch.clientY - touchStart.current.y;\n\n if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > SWIPE_THRESHOLD) {\n if (deltaX > 0) {\n prev();\n } else {\n next();\n }\n }\n },\n [swipe, isZoomed, isDragging, prev, next]\n );\n\n // Image load handler\n const handleImageLoad = useCallback(() => {\n setIsLoading(false);\n }, []);\n\n // Backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (closeOnBackdropClick && e.target === e.currentTarget && !isZoomed) {\n onClose();\n }\n },\n [closeOnBackdropClick, isZoomed, onClose]\n );\n\n // Double click to zoom\n const handleDoubleClick = useCallback(() => {\n if (!zoom) return;\n if (isZoomed) {\n zoomReset();\n } else {\n setZoomLevel(2);\n }\n }, [zoom, isZoomed, zoomReset]);\n\n // Scroll active thumbnail into view\n useEffect(() => {\n if (!thumbnails || !thumbnailsRef.current) return;\n const container = thumbnailsRef.current;\n const activeThumb = container.children[currentIndex] as HTMLElement | undefined;\n if (activeThumb) {\n activeThumb.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n }, [currentIndex, thumbnails]);\n\n // Previous slide data (for crossfade)\n const prevSlide = slides[prevIndex] as LightboxSlide | undefined;\n\n // Zoom percentage text\n const zoomPercent = useMemo(() => Math.round(zoomLevel * 100), [zoomLevel]);\n\n if (!currentSlide) return null;\n\n const isVideo = Boolean(currentSlide.video);\n const isPrevVideo = Boolean(prevSlide?.video);\n const transitionMs = animation;\n\n return (\n <StyledDialog\n open={open}\n onClose={onClose}\n maxWidth={false}\n fullScreen\n className={cn(lightboxClasses.root, className)}\n sx={sx}\n {...dialogProps}\n >\n <LightboxContainer ref={containerRef} className={lightboxClasses.container} sx={slotProps?.root}>\n {/* Toolbar - Top */}\n {toolbar?.show && toolbar?.position === 'top' && (\n <GlassToolbar\n className={cn(lightboxClasses.toolbar, lightboxClasses.toolbarTop)}\n placement=\"top\"\n sx={slotProps?.toolbar}\n >\n {counter && (\n <CounterChip className={lightboxClasses.counter} sx={slotProps?.counter}>\n {currentIndex + 1}\n <Typography component=\"span\" sx={{ mx: 0.5, opacity: 0.5 }}>\n /\n </Typography>\n {totalSlides}\n </CounterChip>\n )}\n\n <Box sx={{ flex: 1 }} />\n\n {/* Zoom controls with level indicator */}\n {zoom && (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.25 }}>\n <GlassButton\n onClick={zoomOut}\n disabled={zoomLevel <= MIN_ZOOM}\n aria-label={labels.zoomOut}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <ZoomOutIcon fontSize=\"small\" />\n </GlassButton>\n\n {isZoomed && (\n <Typography\n sx={{\n color: 'common.white',\n fontSize: '0.6875rem',\n fontWeight: 600,\n minWidth: 36,\n textAlign: 'center',\n opacity: 0.8,\n }}\n >\n {zoomPercent}%\n </Typography>\n )}\n\n <GlassButton\n onClick={zoomIn}\n disabled={zoomLevel >= MAX_ZOOM}\n aria-label={labels.zoomIn}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <ZoomInIcon fontSize=\"small\" />\n </GlassButton>\n </Box>\n )}\n\n {fullscreen && (\n <GlassButton\n onClick={toggleFullscreen}\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n {isFullscreen ? <FullscreenExitIcon fontSize=\"small\" /> : <FullscreenIcon fontSize=\"small\" />}\n </GlassButton>\n )}\n\n {download && (\n <GlassButton\n onClick={handleDownload}\n aria-label={labels.download}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <DownloadIcon fontSize=\"small\" />\n </GlassButton>\n )}\n\n {share && (\n <GlassButton\n onClick={handleShare}\n aria-label={labels.share}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <ShareIcon fontSize=\"small\" />\n </GlassButton>\n )}\n\n {toolbar?.buttons}\n\n <GlassButton\n onClick={onClose}\n aria-label={labels.close}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <CloseIcon fontSize=\"small\" />\n </GlassButton>\n </GlassToolbar>\n )}\n\n {/* Main content area — layered slides for crossfade */}\n <SlideContainer\n className={cn(lightboxClasses.slide, lightboxClasses.slideActive, {\n [lightboxClasses.zoomed]: isZoomed,\n })}\n onClick={handleBackdropClick}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n onDoubleClick={handleDoubleClick}\n sx={{\n ...slotProps?.imageContainer,\n cursor: isZoomed ? (isDragging ? 'grabbing' : 'grab') : 'default',\n }}\n >\n {/* === Outgoing (previous) slide — fades out with directional shift === */}\n {transitionState === 'transitioning' && prevSlide && prevIndex !== currentIndex && (\n <SlideLayer\n sx={{\n opacity: 0,\n transform:\n slideDirection === 'left'\n ? 'translateX(-8%) scale(0.95)'\n : slideDirection === 'right'\n ? 'translateX(8%) scale(0.95)'\n : 'scale(0.95)',\n transition: `opacity ${transitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), transform ${transitionMs}ms cubic-bezier(0.4, 0, 0.2, 1)`,\n zIndex: 1,\n }}\n >\n {isPrevVideo && prevSlide.video ? (\n <StyledVideo poster={prevSlide.video.poster}>\n {prevSlide.video.sources.map((source, i) => (\n <source key={i} src={source.src} type={source.type} />\n ))}\n </StyledVideo>\n ) : (\n <StyledImage src={prevSlide.src} alt=\"\" draggable={false} />\n )}\n </SlideLayer>\n )}\n\n {/* === Current (incoming) slide — fades in with directional entrance === */}\n <SlideLayer\n sx={{\n opacity: transitionState === 'transitioning' ? 0 : 1,\n transform:\n transitionState === 'transitioning'\n ? slideDirection === 'left'\n ? 'translateX(8%) scale(0.95)'\n : slideDirection === 'right'\n ? 'translateX(-8%) scale(0.95)'\n : 'scale(0.95)'\n : 'translateX(0) scale(1)',\n transition:\n transitionState === 'idle'\n ? `opacity ${transitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), transform ${transitionMs}ms cubic-bezier(0.4, 0, 0.2, 1)`\n : 'none',\n zIndex: 2,\n // Force repaint trick: on next tick the idle state kicks in with transition\n animation:\n transitionState === 'transitioning'\n ? `lightboxSlideIn ${transitionMs}ms cubic-bezier(0.16, 1, 0.3, 1) forwards`\n : undefined,\n '@keyframes lightboxSlideIn': {\n from: {\n opacity: 0,\n transform:\n slideDirection === 'left'\n ? 'translateX(5%) scale(0.97)'\n : slideDirection === 'right'\n ? 'translateX(-5%) scale(0.97)'\n : 'scale(0.97)',\n },\n to: {\n opacity: 1,\n transform: 'translateX(0) scale(1)',\n },\n },\n }}\n >\n {/* Loading indicator */}\n {isLoading && !isVideo && (\n <LoadingOverlay className={lightboxClasses.loading}>\n <CircularProgress\n size={40}\n thickness={2.5}\n sx={{\n color: alpha(theme.palette.primary.main, 0.8),\n }}\n />\n </LoadingOverlay>\n )}\n\n {/* Image/Video content */}\n {isVideo && currentSlide.video ? (\n <VideoWrapper>\n <StyledVideo\n className={lightboxClasses.video}\n controls\n autoPlay={currentSlide.video.autoPlay}\n loop={currentSlide.video.loop}\n muted={currentSlide.video.muted}\n poster={currentSlide.video.poster}\n onLoadedData={handleImageLoad}\n style={{\n transform: `scale(${zoomLevel}) translate(${position.x / zoomLevel}px, ${position.y / zoomLevel}px)`,\n transition: isDragging ? 'none' : `transform ${animation}ms ease`,\n }}\n />\n </VideoWrapper>\n ) : (\n <StyledImage\n className={lightboxClasses.image}\n src={currentSlide.src}\n alt={currentSlide.alt || `Slide ${currentIndex + 1}`}\n onLoad={handleImageLoad}\n draggable={false}\n style={{\n transform: `scale(${zoomLevel}) translate(${position.x / zoomLevel}px, ${position.y / zoomLevel}px)`,\n transition: isDragging ? 'none' : `transform ${animation}ms ease`,\n opacity: isLoading ? 0 : 1,\n }}\n />\n )}\n </SlideLayer>\n\n {/* Caption */}\n {(currentSlide.title || currentSlide.description) && !isZoomed && (\n <GlassCaption className={lightboxClasses.caption}>\n {currentSlide.title && (\n <Typography variant=\"subtitle1\" component=\"div\" sx={{ fontWeight: 600, lineHeight: 1.3 }}>\n {currentSlide.title}\n </Typography>\n )}\n {currentSlide.description && (\n <Typography variant=\"body2\" sx={{ opacity: 0.7, mt: 0.25 }}>\n {currentSlide.description}\n </Typography>\n )}\n </GlassCaption>\n )}\n </SlideContainer>\n\n {/* Navigation arrows */}\n {hasPrev && !isZoomed && (\n <NavArrow\n className={cn(lightboxClasses.navButton, lightboxClasses.navPrev)}\n side=\"left\"\n onClick={prev}\n aria-label={labels.previous}\n sx={slotProps?.navButton}\n >\n <ChevronLeftIcon sx={{ fontSize: 28 }} />\n </NavArrow>\n )}\n\n {hasNext && !isZoomed && (\n <NavArrow\n className={cn(lightboxClasses.navButton, lightboxClasses.navNext)}\n side=\"right\"\n onClick={next}\n aria-label={labels.next}\n sx={slotProps?.navButton}\n >\n <ChevronRightIcon sx={{ fontSize: 28 }} />\n </NavArrow>\n )}\n\n {/* Thumbnails */}\n {thumbnails && !isZoomed && (\n <ThumbnailStrip ref={thumbnailsRef} className={lightboxClasses.thumbnails} sx={slotProps?.thumbnails}>\n {slides.map((slide, i) => {\n const isThumbVideo = Boolean(slide.video);\n\n return (\n <ThumbItem\n key={i}\n className={cn(lightboxClasses.thumbnail, {\n [lightboxClasses.thumbnailActive]: i === currentIndex,\n })}\n active={i === currentIndex}\n onClick={() => goTo(i)}\n >\n <img\n src={slide.thumbnail || slide.video?.poster || slide.src}\n alt={slide.alt || `Thumbnail ${i + 1}`}\n draggable={false}\n />\n {/* Video indicator on thumbnail */}\n {isThumbVideo && (\n <Box\n sx={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: alpha(theme.palette.common.black, 0.35),\n }}\n >\n <PlayArrowIcon sx={{ fontSize: 18, color: 'common.white', opacity: 0.9 }} />\n </Box>\n )}\n </ThumbItem>\n );\n })}\n </ThumbnailStrip>\n )}\n\n {/* Toolbar - Bottom */}\n {toolbar?.show && toolbar?.position === 'bottom' && (\n <GlassToolbar\n className={cn(lightboxClasses.toolbar, lightboxClasses.toolbarBottom)}\n placement=\"bottom\"\n sx={slotProps?.toolbar}\n >\n {counter && (\n <CounterChip className={lightboxClasses.counter} sx={slotProps?.counter}>\n {currentIndex + 1}\n <Typography component=\"span\" sx={{ mx: 0.5, opacity: 0.5 }}>\n /\n </Typography>\n {totalSlides}\n </CounterChip>\n )}\n <Box sx={{ flex: 1 }} />\n <GlassButton onClick={onClose} aria-label={labels.close} size=\"small\">\n <CloseIcon fontSize=\"small\" />\n </GlassButton>\n </GlassToolbar>\n )}\n </LightboxContainer>\n </StyledDialog>\n );\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst StyledDialog = styled(Dialog)(({ theme }) => ({\n '& .MuiDialog-paper': {\n backgroundColor: 'transparent',\n boxShadow: 'none',\n margin: 0,\n maxWidth: '100%',\n maxHeight: '100%',\n borderRadius: 0,\n },\n '& .MuiBackdrop-root': {\n backgroundColor: alpha(theme.palette.common.black, 0.92),\n backdropFilter: 'blur(8px)',\n },\n}));\n\nconst LightboxContainer = styled(Box)({\n display: 'flex',\n flexDirection: 'column',\n width: '100vw',\n height: '100vh',\n position: 'relative',\n overflow: 'hidden',\n userSelect: 'none',\n});\n\n// --- Glassmorphism Toolbar ---\n\nconst GlassToolbar = styled(Box)<{ placement: 'top' | 'bottom' }>(({ theme, placement }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n padding: theme.spacing(1, 1.5),\n position: 'absolute',\n left: 0,\n right: 0,\n zIndex: 10,\n ...(placement === 'top' && { top: 0 }),\n ...(placement === 'bottom' && { bottom: 0 }),\n background: `linear-gradient(${placement === 'top' ? 'to bottom' : 'to top'}, ${alpha(theme.palette.common.black, 0.55)} 0%, ${alpha(theme.palette.common.black, 0.2)} 60%, transparent 100%)`,\n transition: 'opacity 0.3s ease',\n}));\n\nconst GlassButton = styled(IconButton)(({ theme }) => ({\n color: alpha(theme.palette.common.white, 0.85),\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n padding: 6,\n transition: theme.transitions.create(['background-color', 'color', 'transform'], {\n duration: 200,\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.common.white, 0.12),\n color: theme.palette.common.white,\n transform: 'scale(1.05)',\n },\n '&:active': {\n transform: 'scale(0.95)',\n },\n '&.Mui-disabled': {\n color: alpha(theme.palette.common.white, 0.2),\n },\n}));\n\nconst CounterChip = styled(Typography)(({ theme }) => ({\n color: alpha(theme.palette.common.white, 0.9),\n fontSize: '0.75rem',\n fontWeight: 600,\n fontVariantNumeric: 'tabular-nums',\n padding: theme.spacing(0.375, 1),\n borderRadius: Number(theme.shape.borderRadius) * 2,\n backgroundColor: alpha(theme.palette.common.white, 0.1),\n backdropFilter: 'blur(12px)',\n border: `1px solid ${alpha(theme.palette.common.white, 0.08)}`,\n display: 'flex',\n alignItems: 'center',\n letterSpacing: '0.02em',\n}));\n\n// --- Slide Area ---\n\nconst SlideContainer = styled(Box)({\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n overflow: 'hidden',\n});\n\n/** Absolute layer for crossfade transitions */\nconst SlideLayer = styled(Box)({\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n willChange: 'opacity, transform',\n});\n\nconst LoadingOverlay = styled(Box)({\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 5,\n});\n\nconst StyledImage = styled('img')({\n maxWidth: '100%',\n maxHeight: '100%',\n objectFit: 'contain',\n willChange: 'transform, opacity',\n borderRadius: 2,\n});\n\nconst VideoWrapper = styled(Box)({\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n maxWidth: '100%',\n maxHeight: '100%',\n});\n\nconst StyledVideo = styled('video')(({ theme }) => ({\n maxWidth: '100%',\n maxHeight: '100%',\n objectFit: 'contain',\n willChange: 'transform',\n borderRadius: 4,\n // Custom video controls styling\n '&::-webkit-media-controls-panel': {\n backgroundColor: alpha(theme.palette.common.black, 0.6),\n backdropFilter: 'blur(8px)',\n },\n '&::-webkit-media-controls-current-time-display, &::-webkit-media-controls-time-remaining-display': {\n color: theme.palette.common.white,\n fontSize: 12,\n },\n}));\n\n// --- Caption ---\n\nconst GlassCaption = styled(Box)(({ theme }) => ({\n position: 'absolute',\n bottom: theme.spacing(2.5),\n left: '50%',\n transform: 'translateX(-50%)',\n textAlign: 'center',\n color: theme.palette.common.white,\n padding: theme.spacing(1, 2.5),\n borderRadius: Number(theme.shape.borderRadius) * 2,\n backgroundColor: alpha(theme.palette.common.black, 0.45),\n backdropFilter: 'blur(16px)',\n border: `1px solid ${alpha(theme.palette.common.white, 0.08)}`,\n maxWidth: '70%',\n zIndex: 5,\n animation: 'lightboxCaptionIn 0.3s ease-out',\n '@keyframes lightboxCaptionIn': {\n from: { opacity: 0, transform: 'translateX(-50%) translateY(8px)' },\n to: { opacity: 1, transform: 'translateX(-50%) translateY(0)' },\n },\n}));\n\n// --- Navigation Arrows ---\n\nconst NavArrow = styled(IconButton)<{ side: 'left' | 'right' }>(({ theme, side }) => ({\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n color: alpha(theme.palette.common.white, 0.85),\n zIndex: 10,\n width: 44,\n height: 44,\n borderRadius: '50%',\n backgroundColor: alpha(theme.palette.common.white, 0.08),\n backdropFilter: 'blur(12px)',\n border: `1px solid ${alpha(theme.palette.common.white, 0.06)}`,\n ...(side === 'left' && { left: theme.spacing(2) }),\n ...(side === 'right' && { right: theme.spacing(2) }),\n transition: theme.transitions.create(['background-color', 'color', 'transform', 'box-shadow'], {\n duration: 200,\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.common.white, 0.16),\n color: theme.palette.common.white,\n transform: 'translateY(-50%) scale(1.08)',\n boxShadow: `0 0 20px ${alpha(theme.palette.primary.main, 0.15)}`,\n },\n '&:active': {\n transform: 'translateY(-50%) scale(0.95)',\n },\n}));\n\n// --- Thumbnails ---\n\nconst ThumbnailStrip = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(0.75),\n padding: theme.spacing(1, 2),\n justifyContent: 'center',\n overflowX: 'auto',\n backgroundColor: alpha(theme.palette.common.black, 0.5),\n backdropFilter: 'blur(12px)',\n borderTop: `1px solid ${alpha(theme.palette.common.white, 0.06)}`,\n // Hide scrollbar\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n}));\n\nconst ThumbItem = styled(Box)<{ active: boolean }>(({ theme, active }) => ({\n flexShrink: 0,\n width: 56,\n height: 56,\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n overflow: 'hidden',\n cursor: 'pointer',\n position: 'relative',\n border: `2px solid ${active ? theme.palette.primary.main : alpha(theme.palette.common.white, 0.08)}`,\n opacity: active ? 1 : 0.55,\n transform: active ? 'scale(1)' : 'scale(0.92)',\n transition: theme.transitions.create(['border-color', 'opacity', 'transform', 'box-shadow'], {\n duration: 200,\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n }),\n ...(active && {\n boxShadow: `0 0 12px ${alpha(theme.palette.primary.main, 0.3)}`,\n }),\n '& img': {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n '&:hover': {\n opacity: 1,\n transform: 'scale(1)',\n borderColor: active ? theme.palette.primary.main : alpha(theme.palette.common.white, 0.25),\n },\n}));\n","/**\n * useLightbox Hook\n *\n * State management hook for the Lightbox component.\n * Handles open/close and navigation. Zoom belongs to `<Lightbox>` itself —\n * see `UseLightboxReturn.getLightboxProps` for why it is not here.\n *\n * @module components/lightbox\n */\n\n'use client';\n\nimport { useState, useCallback } from 'react';\n\nimport type { UseLightboxReturn } from './types.js';\n\n// =============================================================================\n// USE LIGHTBOX HOOK\n// =============================================================================\n\n/**\n * Options for useLightbox hook.\n */\nexport interface UseLightboxOptions {\n /** Initial open state */\n defaultOpen?: boolean;\n /** Initial slide index */\n defaultIndex?: number;\n /** Total number of slides (for navigation bounds) */\n totalSlides?: number;\n /** Enable infinite loop */\n loop?: boolean;\n}\n\n/**\n * Hook for managing lightbox state.\n *\n * @example\n * ```tsx\n * const lightbox = useLightbox({ totalSlides: images.length });\n *\n * return (\n * <>\n * {images.map((img, i) => (\n * <img key={i} src={img.src} onClick={() => lightbox.onOpen(i)} />\n * ))}\n * <Lightbox slides={images} {...lightbox.getLightboxProps()} />\n * </>\n * );\n * ```\n */\nexport function useLightbox(options: UseLightboxOptions = {}): UseLightboxReturn {\n const { defaultOpen = false, defaultIndex = 0, totalSlides = 0, loop = false } = options;\n\n const [open, setOpen] = useState(defaultOpen);\n const [index, setIndex] = useState(defaultIndex);\n\n // Navigation\n const goTo = useCallback(\n (newIndex: number) => {\n // `totalSlides` is optional and defaults to 0, which is how the hook is\n // constructed when a caller lets the component do its own navigation —\n // `useLightbox()` with no arguments, as the portal does. Passing the\n // requested index straight through in that state let `next()` walk the\n // index upward without bound, past the end of a slide list the hook was\n // never told about. With no slides there is no index to be at; 0 is the\n // one that cannot be out of range.\n if (totalSlides === 0) {\n setIndex(0);\n return;\n }\n\n if (loop) {\n setIndex((newIndex + totalSlides) % totalSlides);\n } else {\n setIndex(Math.max(0, Math.min(newIndex, totalSlides - 1)));\n }\n },\n [totalSlides, loop]\n );\n\n const next = useCallback(() => {\n goTo(index + 1);\n }, [index, goTo]);\n\n const prev = useCallback(() => {\n goTo(index - 1);\n }, [index, goTo]);\n\n // Open/Close\n const onOpen = useCallback((slideIndex = 0) => {\n setIndex(slideIndex);\n setOpen(true);\n }, []);\n\n const onClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n // Index change handler for Lightbox\n const onIndexChange = useCallback(\n (newIndex: number) => {\n goTo(newIndex);\n },\n [goTo]\n );\n\n // Props getter\n const getLightboxProps = useCallback(\n () => ({\n open,\n onClose,\n index,\n onIndexChange,\n }),\n [open, onClose, index, onIndexChange]\n );\n\n return {\n open,\n index,\n onOpen,\n onClose,\n goTo,\n next,\n prev,\n getLightboxProps,\n };\n}\n","/**\n * Carousel CSS Classes\n *\n * @module components/carousel\n */\n\nimport { createClasses } from '../../utils/create-classes.js';\n\n/**\n * CSS class names for Carousel component.\n */\nexport const carouselClasses = {\n root: createClasses('carousel__root'),\n container: createClasses('carousel__container'),\n track: createClasses('carousel__track'),\n slide: createClasses('carousel__slide'),\n slideActive: createClasses('carousel__slide--active'),\n slidePrev: createClasses('carousel__slide--prev'),\n slideNext: createClasses('carousel__slide--next'),\n arrow: createClasses('carousel__arrow'),\n arrowPrev: createClasses('carousel__arrow--prev'),\n arrowNext: createClasses('carousel__arrow--next'),\n arrowInside: createClasses('carousel__arrow--inside'),\n arrowOutside: createClasses('carousel__arrow--outside'),\n arrowDisabled: createClasses('carousel__arrow--disabled'),\n dots: createClasses('carousel__dots'),\n dotsTop: createClasses('carousel__dots--top'),\n dotsBottom: createClasses('carousel__dots--bottom'),\n dotsLeft: createClasses('carousel__dots--left'),\n dotsRight: createClasses('carousel__dots--right'),\n dot: createClasses('carousel__dot'),\n dotActive: createClasses('carousel__dot--active'),\n horizontal: createClasses('carousel__horizontal'),\n vertical: createClasses('carousel__vertical'),\n dragging: createClasses('carousel__dragging'),\n fade: createClasses('carousel__fade'),\n};\n","'use client';\n\n/**\n * Carousel Component\n *\n * Responsive slider with autoplay, navigation arrows, dots,\n * and touch/drag support.\n *\n * @module components/carousel\n */\n\nimport type { CarouselProps } from './types.js';\n\nimport { useState, useEffect, useCallback, useRef, Children, useMemo } from 'react';\n\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport { styled, alpha } from '@mui/material/styles';\n\n// MUI Icons\nimport { ChevronLeftIcon } from '../../icons/controls.js';\nimport { ChevronRightIcon } from '../../icons/controls.js';\nimport { ChevronUpIcon as KeyboardArrowUpIcon } from '../../icons/controls.js';\nimport { ChevronDownIcon as KeyboardArrowDownIcon } from '../../icons/controls.js';\n\nimport { cn } from '../../utils/cn.js';\nimport { carouselClasses } from './classes.js';\n\n// =============================================================================\n// CAROUSEL COMPONENT\n// =============================================================================\n\n/**\n * Responsive carousel/slider component.\n *\n * @example\n * ```tsx\n * import { Carousel } from '@omnitron-dev/prism/components';\n *\n * function Gallery() {\n * return (\n * <Carousel\n * slidesToShow={3}\n * spacing={16}\n * autoplay\n * arrows\n * dots\n * >\n * {images.map((img, i) => (\n * <img key={i} src={img.src} alt={img.alt} />\n * ))}\n * </Carousel>\n * );\n * }\n * ```\n */\nexport function Carousel({\n children,\n slidesToShow = 1,\n slidesToScroll = 1,\n spacing = 0,\n autoplay = false,\n autoplayInterval = 4000,\n pauseOnHover = true,\n loop = false,\n draggable = true,\n speed = 400,\n direction = 'horizontal',\n arrows = true,\n dots = false,\n dotsPosition = 'bottom',\n keyboard = true,\n initialSlide = 0,\n onSlideChange,\n centerMode = false,\n fade = false,\n responsive,\n sx,\n slotProps,\n className,\n ...other\n}: CarouselProps) {\n // State\n const [currentIndex, setCurrentIndex] = useState(initialSlide);\n const [isPlaying, setIsPlaying] = useState(autoplay);\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState(0);\n const [containerWidth, setContainerWidth] = useState(0);\n\n // Refs\n const containerRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const autoplayRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const dragStartRef = useRef({ x: 0, y: 0 });\n\n // Responsive settings\n const [activeSettings, setActiveSettings] = useState({\n slidesToShow,\n slidesToScroll,\n spacing,\n arrows,\n dots,\n });\n\n // Get slides from children\n const slides = Children.toArray(children);\n const totalSlides = slides.length;\n\n // Calculate settings based on responsive breakpoints\n useEffect(() => {\n if (!responsive?.length) {\n setActiveSettings({ slidesToShow, slidesToScroll, spacing, arrows, dots });\n return undefined;\n }\n\n const handleResize = () => {\n const width = window.innerWidth;\n let newSettings = { slidesToShow, slidesToScroll, spacing, arrows, dots };\n\n // Find matching breakpoint (smallest matching)\n const sortedBreakpoints = [...responsive].sort((a, b) => a.breakpoint - b.breakpoint);\n for (const bp of sortedBreakpoints) {\n if (width <= bp.breakpoint) {\n newSettings = { ...newSettings, ...bp.settings };\n break;\n }\n }\n\n setActiveSettings(newSettings);\n };\n\n handleResize();\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [responsive, slidesToShow, slidesToScroll, spacing, arrows, dots]);\n\n // Calculate dimensions\n const maxIndex = Math.max(0, totalSlides - activeSettings.slidesToShow);\n const canPrev = loop || currentIndex > 0;\n const canNext = loop || currentIndex < maxIndex;\n const isHorizontal = direction === 'horizontal';\n\n // Calculate slide width percentage\n const slideWidth = useMemo(() => {\n if (activeSettings.slidesToShow <= 0) return 100;\n return 100 / activeSettings.slidesToShow;\n }, [activeSettings.slidesToShow]);\n\n // Track container width for drag calculations\n useEffect(() => {\n if (!containerRef.current) return undefined;\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setContainerWidth(entry.contentRect.width);\n }\n });\n\n observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, []);\n\n // Navigation\n const goTo = useCallback(\n (index: number) => {\n let newIndex = index;\n\n if (loop) {\n if (index < 0) {\n newIndex = maxIndex;\n } else if (index > maxIndex) {\n newIndex = 0;\n }\n } else {\n newIndex = Math.max(0, Math.min(index, maxIndex));\n }\n\n setCurrentIndex(newIndex);\n onSlideChange?.(newIndex);\n },\n [loop, maxIndex, onSlideChange]\n );\n\n const next = useCallback(() => {\n if (canNext) {\n goTo(currentIndex + activeSettings.slidesToScroll);\n }\n }, [canNext, currentIndex, activeSettings.slidesToScroll, goTo]);\n\n const prev = useCallback(() => {\n if (canPrev) {\n goTo(currentIndex - activeSettings.slidesToScroll);\n }\n }, [canPrev, currentIndex, activeSettings.slidesToScroll, goTo]);\n\n // Autoplay\n useEffect(() => {\n if (isPlaying && totalSlides > activeSettings.slidesToShow) {\n autoplayRef.current = setInterval(next, autoplayInterval);\n return () => {\n if (autoplayRef.current) clearInterval(autoplayRef.current);\n };\n }\n return undefined;\n }, [isPlaying, totalSlides, activeSettings.slidesToShow, autoplayInterval, next]);\n\n // Pause on hover\n const handleMouseEnter = useCallback(() => {\n if (pauseOnHover && autoplay) {\n setIsPlaying(false);\n }\n }, [pauseOnHover, autoplay]);\n\n const handleMouseLeave = useCallback(() => {\n if (pauseOnHover && autoplay) {\n setIsPlaying(true);\n }\n }, [pauseOnHover, autoplay]);\n\n // Keyboard navigation\n useEffect(() => {\n if (!keyboard) return undefined;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!containerRef.current?.contains(document.activeElement)) return;\n\n if (isHorizontal) {\n if (e.key === 'ArrowLeft') prev();\n if (e.key === 'ArrowRight') next();\n } else {\n if (e.key === 'ArrowUp') prev();\n if (e.key === 'ArrowDown') next();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [keyboard, isHorizontal, prev, next]);\n\n // Drag/Touch handlers\n const handleDragStart = useCallback(\n (clientX: number, clientY: number) => {\n if (!draggable) return;\n setIsDragging(true);\n dragStartRef.current = { x: clientX, y: clientY };\n setDragOffset(0);\n },\n [draggable]\n );\n\n const handleDragMove = useCallback(\n (clientX: number, clientY: number) => {\n if (!isDragging) return;\n const delta = isHorizontal ? clientX - dragStartRef.current.x : clientY - dragStartRef.current.y;\n setDragOffset(delta);\n },\n [isDragging, isHorizontal]\n );\n\n const handleDragEnd = useCallback(() => {\n if (!isDragging) return;\n setIsDragging(false);\n\n const threshold = containerWidth * 0.15; // 15% threshold\n if (Math.abs(dragOffset) > threshold) {\n if (dragOffset > 0) {\n prev();\n } else {\n next();\n }\n }\n\n setDragOffset(0);\n }, [isDragging, containerWidth, dragOffset, prev, next]);\n\n // Mouse handlers\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n handleDragStart(e.clientX, e.clientY);\n },\n [handleDragStart]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n handleDragMove(e.clientX, e.clientY);\n },\n [handleDragMove]\n );\n\n const handleMouseUp = useCallback(() => {\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Touch handlers\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (touch) handleDragStart(touch.clientX, touch.clientY);\n },\n [handleDragStart]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (touch) handleDragMove(touch.clientX, touch.clientY);\n },\n [handleDragMove]\n );\n\n const handleTouchEnd = useCallback(() => {\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Calculate track transform\n const trackTransform = useMemo(() => {\n const baseOffset = currentIndex * slideWidth;\n const dragPercent = containerWidth > 0 ? (dragOffset / containerWidth) * 100 : 0;\n\n if (fade) return 'none';\n\n if (isHorizontal) {\n return `translateX(calc(-${baseOffset}% + ${dragPercent}%))`;\n }\n return `translateY(calc(-${baseOffset}% + ${dragPercent}%))`;\n }, [currentIndex, slideWidth, dragOffset, containerWidth, fade, isHorizontal]);\n\n // Dots count (number of pages)\n const dotsCount = Math.ceil(totalSlides / activeSettings.slidesToScroll);\n\n return (\n <CarouselRoot\n ref={containerRef}\n className={cn(\n carouselClasses.root,\n isHorizontal ? carouselClasses.horizontal : carouselClasses.vertical,\n isDragging && carouselClasses.dragging,\n fade && carouselClasses.fade,\n className\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n tabIndex={0}\n sx={sx}\n {...other}\n >\n <CarouselContainer className={carouselClasses.container} sx={slotProps?.container}>\n <CarouselTrack\n ref={trackRef}\n className={carouselClasses.track}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n sx={{\n ...slotProps?.track,\n transform: trackTransform,\n transition: isDragging ? 'none' : `transform ${speed}ms ease`,\n flexDirection: isHorizontal ? 'row' : 'column',\n cursor: draggable ? (isDragging ? 'grabbing' : 'grab') : 'default',\n }}\n >\n {slides.map((slide, index) => (\n <CarouselSlide\n key={index}\n className={cn(carouselClasses.slide, {\n [carouselClasses.slideActive]: index === currentIndex,\n })}\n sx={{\n ...slotProps?.slide,\n width: isHorizontal ? `${slideWidth}%` : '100%',\n height: !isHorizontal ? `${slideWidth}%` : 'auto',\n padding: isHorizontal ? `0 ${activeSettings.spacing / 2}px` : `${activeSettings.spacing / 2}px 0`,\n opacity: fade ? (index === currentIndex ? 1 : 0) : 1,\n transition: fade ? `opacity ${speed}ms ease` : 'none',\n position: fade ? (index === currentIndex ? 'relative' : 'absolute') : 'relative',\n ...(fade && { top: 0, left: 0 }),\n }}\n >\n {slide}\n </CarouselSlide>\n ))}\n </CarouselTrack>\n </CarouselContainer>\n\n {/* Navigation Arrows */}\n {activeSettings.arrows && totalSlides > activeSettings.slidesToShow && (\n <>\n <ArrowButton\n className={cn(carouselClasses.arrow, carouselClasses.arrowPrev, {\n [carouselClasses.arrowDisabled]: !canPrev,\n })}\n onClick={prev}\n disabled={!canPrev}\n aria-label=\"Previous slide\"\n isHorizontal={isHorizontal}\n direction=\"prev\"\n sx={slotProps?.arrow}\n >\n {isHorizontal ? <ChevronLeftIcon /> : <KeyboardArrowUpIcon />}\n </ArrowButton>\n <ArrowButton\n className={cn(carouselClasses.arrow, carouselClasses.arrowNext, {\n [carouselClasses.arrowDisabled]: !canNext,\n })}\n onClick={next}\n disabled={!canNext}\n aria-label=\"Next slide\"\n isHorizontal={isHorizontal}\n direction=\"next\"\n sx={slotProps?.arrow}\n >\n {isHorizontal ? <ChevronRightIcon /> : <KeyboardArrowDownIcon />}\n </ArrowButton>\n </>\n )}\n\n {/* Dots Indicator */}\n {activeSettings.dots && totalSlides > activeSettings.slidesToShow && (\n <DotsContainer\n className={cn(carouselClasses.dots, {\n [carouselClasses.dotsTop]: dotsPosition === 'top',\n [carouselClasses.dotsBottom]: dotsPosition === 'bottom',\n [carouselClasses.dotsLeft]: dotsPosition === 'left',\n [carouselClasses.dotsRight]: dotsPosition === 'right',\n })}\n dotsPosition={dotsPosition}\n sx={slotProps?.dots}\n >\n {Array.from({ length: dotsCount }, (_, i) => (\n <Dot\n key={i}\n className={cn(carouselClasses.dot, {\n [carouselClasses.dotActive]: Math.floor(currentIndex / activeSettings.slidesToScroll) === i,\n })}\n active={Math.floor(currentIndex / activeSettings.slidesToScroll) === i}\n onClick={() => goTo(i * activeSettings.slidesToScroll)}\n aria-label={`Go to slide ${i + 1}`}\n sx={slotProps?.dot}\n />\n ))}\n </DotsContainer>\n )}\n </CarouselRoot>\n );\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst CarouselRoot = styled(Box)({\n position: 'relative',\n width: '100%',\n overflow: 'hidden',\n outline: 'none',\n});\n\nconst CarouselContainer = styled(Box)({\n position: 'relative',\n width: '100%',\n overflow: 'hidden',\n});\n\nconst CarouselTrack = styled(Box)({\n display: 'flex',\n width: '100%',\n willChange: 'transform',\n userSelect: 'none',\n});\n\nconst CarouselSlide = styled(Box)({\n flexShrink: 0,\n '& > *': {\n width: '100%',\n height: '100%',\n },\n});\n\nconst ArrowButton = styled(IconButton)<{ isHorizontal: boolean; direction: 'prev' | 'next' }>(\n ({ theme, isHorizontal, direction }) => ({\n position: 'absolute',\n zIndex: 10,\n backgroundColor: alpha(theme.palette.background.paper, 0.9),\n boxShadow: theme.shadows[2],\n '&:hover': {\n backgroundColor: theme.palette.background.paper,\n },\n '&.Mui-disabled': {\n backgroundColor: alpha(theme.palette.background.paper, 0.5),\n },\n ...(isHorizontal\n ? {\n top: '50%',\n transform: 'translateY(-50%)',\n ...(direction === 'prev' ? { left: 8 } : { right: 8 }),\n }\n : {\n left: '50%',\n transform: 'translateX(-50%)',\n ...(direction === 'prev' ? { top: 8 } : { bottom: 8 }),\n }),\n })\n);\n\nconst DotsContainer = styled(Box)<{ dotsPosition: 'bottom' | 'top' | 'left' | 'right' }>(({ theme, dotsPosition }) => ({\n display: 'flex',\n gap: theme.spacing(1),\n position: 'absolute',\n zIndex: 10,\n ...(dotsPosition === 'bottom' && {\n bottom: theme.spacing(2),\n left: '50%',\n transform: 'translateX(-50%)',\n flexDirection: 'row',\n }),\n ...(dotsPosition === 'top' && {\n top: theme.spacing(2),\n left: '50%',\n transform: 'translateX(-50%)',\n flexDirection: 'row',\n }),\n ...(dotsPosition === 'left' && {\n left: theme.spacing(2),\n top: '50%',\n transform: 'translateY(-50%)',\n flexDirection: 'column',\n }),\n ...(dotsPosition === 'right' && {\n right: theme.spacing(2),\n top: '50%',\n transform: 'translateY(-50%)',\n flexDirection: 'column',\n }),\n}));\n\nconst Dot = styled('button')<{ active: boolean }>(({ theme, active }) => ({\n width: 8,\n height: 8,\n padding: 0,\n border: 'none',\n borderRadius: '50%',\n cursor: 'pointer',\n backgroundColor: active ? theme.palette.primary.main : alpha(theme.palette.common.black, 0.3),\n transition: theme.transitions.create(['background-color', 'transform'], {\n duration: theme.transitions.duration.short,\n }),\n '&:hover': {\n backgroundColor: active ? theme.palette.primary.main : alpha(theme.palette.common.black, 0.5),\n transform: 'scale(1.2)',\n },\n}));\n","'use client';\n\n/**\n * useCarousel Hook\n *\n * Carousel state — index, bounds, autoplay — for a slider you render\n * yourself.\n *\n * It does NOT drive `<Carousel>`, and the two are not connected in any way.\n * That component keeps its own copy of this state and exposes no controlled\n * props: `initialSlide` seeds it and `onSlideChange` observes it, so nothing\n * a caller does with this hook can move it. The two implementations are\n * parallel, not paired.\n *\n * Said this plainly because the header used to read \"state management hook\n * for the Carousel component\" and the example below wired the two together,\n * neither of which was true.\n *\n * @module components/carousel\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\nimport type { UseCarouselReturn } from './types.js';\n\n// =============================================================================\n// USE CAROUSEL OPTIONS\n// =============================================================================\n\n/**\n * Options for useCarousel hook.\n */\nexport interface UseCarouselOptions {\n /** Total number of slides */\n totalSlides: number;\n /** Initial slide index */\n initialSlide?: number;\n /** Number of slides to show */\n slidesToShow?: number;\n /** Number of slides to scroll */\n slidesToScroll?: number;\n /** Enable infinite loop */\n loop?: boolean;\n /** Enable autoplay */\n autoplay?: boolean;\n /** Autoplay interval in ms */\n autoplayInterval?: number;\n /** Callback when slide changes */\n onSlideChange?: (index: number) => void;\n}\n\n// =============================================================================\n// USE CAROUSEL HOOK\n// =============================================================================\n\n/**\n * Hook for managing carousel state.\n *\n * The previous example here did not compile and could not have worked:\n * it rendered `<CarouselSlide>`, which this package exports as a TYPE and\n * not as a component, and passed `ref={carousel.carouselRef}` to\n * `<Carousel>`, which is a plain function component that never reads a ref.\n * Between those two and the pairing that does not exist, three claims in\n * eight lines.\n *\n * @example\n * ```tsx\n * // Your own markup — that is the point of the hook.\n * const carousel = useCarousel({ totalSlides: items.length, autoplay: true });\n *\n * return (\n * <div onMouseEnter={carousel.pause} onMouseLeave={carousel.play}>\n * {items.slice(carousel.currentIndex, carousel.currentIndex + 3).map(render)}\n * <button onClick={carousel.prev} disabled={!carousel.canPrev}>Back</button>\n * <button onClick={carousel.next} disabled={!carousel.canNext}>Next</button>\n * </div>\n * );\n * ```\n *\n * For a ready-made slider use `<Carousel>` and leave this hook alone; it\n * cannot control that component.\n */\nexport function useCarousel(options: UseCarouselOptions): UseCarouselReturn {\n const {\n totalSlides,\n initialSlide = 0,\n slidesToShow = 1,\n slidesToScroll = 1,\n loop = false,\n autoplay = false,\n autoplayInterval = 3000,\n onSlideChange,\n } = options;\n\n const [currentIndex, setCurrentIndex] = useState(initialSlide);\n const [isPlaying, setIsPlaying] = useState(autoplay);\n const carouselRef = useRef<HTMLDivElement | null>(null);\n const autoplayRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n /**\n * The current index, readable from inside the autoplay timer.\n *\n * The timer used to close over `currentIndex` and list it as an effect\n * dependency, so it advanced one slide per RE-ARM rather than per tick.\n * That is invisible while every tick is followed by a render — which is\n * the normal case — and wrong the moment two callbacks land before one:\n * a throttled background tab, a long task, a test advancing a fake clock.\n * Measured: ten 100ms ticks over three slides moved the carousel once.\n *\n * Reading the ref also takes `currentIndex` out of the effect's\n * dependencies, so the interval is no longer torn down and rebuilt on\n * every slide — which had been measuring each gap from the render rather\n * than from the previous tick.\n *\n * Written in `goTo` rather than during render, because a render is exactly\n * what a burst does not give you.\n */\n const currentIndexRef = useRef(currentIndex);\n\n // Calculate max index\n const maxIndex = Math.max(0, totalSlides - slidesToShow);\n\n // Can navigate\n const canPrev = loop || currentIndex > 0;\n const canNext = loop || currentIndex < maxIndex;\n\n // Navigation handlers\n const goTo = useCallback(\n (index: number) => {\n let newIndex = index;\n\n if (loop) {\n if (index < 0) {\n newIndex = maxIndex;\n } else if (index > maxIndex) {\n newIndex = 0;\n }\n } else {\n newIndex = Math.max(0, Math.min(index, maxIndex));\n }\n\n // Only when it moved. `onSlideChange` fired on every call, including\n // the ones clamping back to where the carousel already was — so a\n // strip parked at its last slide with autoplay on reported a slide\n // change every interval, forever, with the same index.\n if (newIndex === currentIndexRef.current) return;\n\n currentIndexRef.current = newIndex;\n setCurrentIndex(newIndex);\n onSlideChange?.(newIndex);\n },\n [loop, maxIndex, onSlideChange]\n );\n\n const next = useCallback(() => {\n if (canNext) {\n goTo(currentIndex + slidesToScroll);\n }\n }, [canNext, currentIndex, slidesToScroll, goTo]);\n\n const prev = useCallback(() => {\n if (canPrev) {\n goTo(currentIndex - slidesToScroll);\n }\n }, [canPrev, currentIndex, slidesToScroll, goTo]);\n\n // Autoplay handlers\n const pause = useCallback(() => {\n setIsPlaying(false);\n if (autoplayRef.current) {\n clearInterval(autoplayRef.current);\n autoplayRef.current = null;\n }\n }, []);\n\n const play = useCallback(() => {\n setIsPlaying(true);\n }, []);\n\n // Autoplay effect\n useEffect(() => {\n if (isPlaying && totalSlides > slidesToShow) {\n autoplayRef.current = setInterval(() => {\n goTo(currentIndexRef.current + slidesToScroll);\n }, autoplayInterval);\n\n return () => {\n if (autoplayRef.current) {\n clearInterval(autoplayRef.current);\n autoplayRef.current = null;\n }\n };\n }\n return undefined;\n }, [isPlaying, slidesToScroll, autoplayInterval, totalSlides, slidesToShow, goTo]);\n\n // Cleanup on unmount\n useEffect(\n () => () => {\n if (autoplayRef.current) {\n clearInterval(autoplayRef.current);\n }\n },\n []\n );\n\n return {\n currentIndex,\n totalSlides,\n canPrev,\n canNext,\n goTo,\n next,\n prev,\n pause,\n play,\n isPlaying,\n carouselRef,\n };\n}\n","/**\n * Navigation Section Styles\n *\n * CSS custom properties and class names for nav sections.\n *\n * @module components/nav-section\n */\n\nimport type { Theme, CSSObject } from '@mui/material/styles';\nimport type { NavVariant } from './types.js';\nimport { createComponentClasses } from '../../utils/create-classes.js';\n\n// =============================================================================\n// CLASS NAMES\n// =============================================================================\n\n/**\n * CSS class names for nav section components.\n */\nexport const navSectionClasses = createComponentClasses('nav-section', [\n 'root',\n 'vertical',\n 'horizontal',\n 'mini',\n 'ul',\n 'li',\n 'subheader',\n 'item',\n 'icon',\n 'texts',\n 'title',\n 'caption',\n 'info',\n 'arrow',\n 'active',\n 'disabled',\n 'open',\n] as const);\n\n// =============================================================================\n// CSS CUSTOM PROPERTIES\n// =============================================================================\n\n/**\n * Default CSS variables for nav sections.\n */\nexport const navSectionCssVars = {\n /**\n * Get CSS variables for vertical variant.\n */\n vertical: (theme: Theme): CSSObject => ({\n // Item spacing\n '--nav-item-gap': '4px',\n '--nav-item-padding': '4px 8px 4px 12px',\n '--nav-item-padding-top': '4px',\n '--nav-item-padding-right': '8px',\n '--nav-item-padding-bottom': '4px',\n '--nav-item-padding-left': '12px',\n '--nav-item-radius': '8px',\n '--nav-item-min-height': '44px',\n // Icon\n '--nav-icon-size': '24px',\n '--nav-icon-margin': '0 16px 0 0',\n // Text\n '--nav-item-font-size': '0.875rem',\n '--nav-item-caption-size': '0.75rem',\n // Colors - inactive\n '--nav-item-color': theme.palette.text.secondary,\n '--nav-icon-color': theme.palette.text.secondary,\n '--nav-item-bg': 'transparent',\n // Colors - hover\n '--nav-item-hover-bg': theme.palette.action.hover,\n '--nav-item-hover-color': theme.palette.text.primary,\n // Colors - active\n '--nav-item-active-bg': theme.palette.action.selected,\n '--nav-item-active-color': theme.palette.primary.main,\n '--nav-icon-active-color': theme.palette.primary.main,\n // Colors - disabled\n '--nav-item-disabled-color': theme.palette.text.disabled,\n // Subheader. Asymmetric vertical padding (top < bottom) tightens\n // the gap to the previous section's last item while preserving\n // the visual grouping with the items belonging to THIS section.\n // Pre-fix `8px 8px 8px 12px` summed with the parent `gap: 4px`\n // and the previous item's `padding-bottom: 4px` to ~16px above\n // the title, which read as a disconnect rather than a section\n // boundary.\n '--nav-subheader-font-size': '0.6875rem',\n '--nav-subheader-font-weight': '700',\n '--nav-subheader-color': theme.palette.text.disabled,\n '--nav-subheader-padding': '4px 8px 8px 12px',\n // Sub-item adjustments\n '--nav-sub-item-padding': '4px 8px 4px 12px',\n '--nav-sub-item-margin-left': '40px',\n '--nav-sub-item-radius': '8px',\n }),\n\n /**\n * Get CSS variables for horizontal variant.\n */\n horizontal: (theme: Theme): CSSObject => ({\n // Item spacing\n '--nav-item-gap': '6px',\n '--nav-item-padding': '8px 14px',\n '--nav-item-radius': '8px',\n '--nav-item-min-height': '36px',\n // Icon\n '--nav-icon-size': '22px',\n '--nav-icon-margin': '0 8px 0 0',\n // Text\n '--nav-item-font-size': '0.875rem',\n // Colors - inactive\n '--nav-item-color': theme.palette.text.primary,\n '--nav-icon-color': theme.palette.text.secondary,\n '--nav-item-bg': 'transparent',\n // Colors - hover\n '--nav-item-hover-bg': theme.palette.action.hover,\n '--nav-item-hover-color': theme.palette.text.primary,\n // Colors - active\n '--nav-item-active-bg': theme.palette.action.selected,\n '--nav-item-active-color': theme.palette.primary.main,\n '--nav-icon-active-color': theme.palette.primary.main,\n // Colors - disabled\n '--nav-item-disabled-color': theme.palette.text.disabled,\n // Dropdown\n '--nav-dropdown-paper-width': '180px',\n '--nav-dropdown-paper-radius': '8px',\n '--nav-dropdown-paper-shadow': theme.shadows[8],\n }),\n\n /**\n * Get CSS variables for mini variant.\n */\n mini: (theme: Theme): CSSObject => ({\n // Item spacing\n '--nav-item-gap': '4px',\n '--nav-item-padding': '8px',\n '--nav-item-radius': '8px',\n '--nav-item-min-height': 'auto',\n // Icon\n '--nav-icon-size': '22px',\n '--nav-icon-margin': '0',\n // Text\n '--nav-item-font-size': '0.625rem',\n // Colors - inactive\n '--nav-item-color': theme.palette.text.secondary,\n '--nav-icon-color': theme.palette.text.secondary,\n '--nav-item-bg': 'transparent',\n // Colors - hover\n '--nav-item-hover-bg': theme.palette.action.hover,\n '--nav-item-hover-color': theme.palette.text.primary,\n // Colors - active\n '--nav-item-active-bg': theme.palette.action.selected,\n '--nav-item-active-color': theme.palette.primary.main,\n '--nav-icon-active-color': theme.palette.primary.main,\n // Colors - disabled\n '--nav-item-disabled-color': theme.palette.text.disabled,\n // Tooltip/Popover\n '--nav-tooltip-paper-width': '160px',\n }),\n};\n\n/**\n * Get CSS variables for a specific nav variant.\n */\nexport function getNavCssVars(theme: Theme, variant: NavVariant): CSSObject {\n switch (variant) {\n case 'horizontal':\n return navSectionCssVars.horizontal(theme);\n case 'mini':\n return navSectionCssVars.mini(theme);\n default:\n return navSectionCssVars.vertical(theme);\n }\n}\n","'use client';\n\n/**\n * Navigation Base Components\n *\n * Foundational components for building navigation sections.\n *\n * @module components/nav-section\n */\n\nimport type { Ref } from 'react';\nimport Box from '@mui/material/Box';\nimport ButtonBase from '@mui/material/ButtonBase';\nimport { styled, alpha } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cn } from '../../utils/cn.js';\nimport { navSectionClasses } from './styles.js';\n\n// =============================================================================\n// NAV (ROOT ELEMENT)\n// =============================================================================\n\n/**\n * Props for Nav component.\n */\nexport interface NavProps extends Omit<React.ComponentPropsWithoutRef<'nav'>, 'sx'> {\n children: React.ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/**\n * Nav - Root navigation element for navigation sections.\n */\nexport function Nav({className, sx, ref, ...other }: NavProps & { ref?: Ref<HTMLElement> }) {\n return (\n <Box\n component=\"nav\"\n ref={ref}\n className={cn(navSectionClasses.root, className)}\n sx={[\n {\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n />\n );\n}\n\n// =============================================================================\n// NAV UL (UNORDERED LIST)\n// =============================================================================\n\n/**\n * Props for NavUl component.\n */\nexport interface NavUlProps extends Omit<React.ComponentPropsWithoutRef<'ul'>, 'sx'> {\n children: React.ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/**\n * NavUl - Styled unordered list for navigation.\n */\nexport function NavUl({className, sx, ref, ...other }: NavUlProps & { ref?: Ref<HTMLUListElement> }) {\n return (\n <Box\n component=\"ul\"\n ref={ref}\n className={cn(navSectionClasses.ul, className)}\n sx={[\n {\n display: 'flex',\n flexDirection: 'column',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n />\n );\n}\n\n// =============================================================================\n// NAV LI (LIST ITEM)\n// =============================================================================\n\n/**\n * Props for NavLi component.\n */\nexport interface NavLiProps extends React.ComponentPropsWithoutRef<'li'> {\n children: React.ReactNode;\n}\n\n/**\n * NavLi - Styled list item for navigation.\n */\nexport function NavLi({className, ref, ...other }: NavLiProps & { ref?: Ref<HTMLLIElement> }) {\n return (\n <Box\n component=\"li\"\n ref={ref}\n className={cn(navSectionClasses.li, className)}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n }}\n {...other}\n />\n );\n}\n\n// =============================================================================\n// NAV SUBHEADER\n// =============================================================================\n\n/**\n * Props for NavSubheader component.\n */\nexport interface NavSubheaderProps extends React.ComponentPropsWithoutRef<typeof ButtonBase> {\n /** Whether the section is open */\n open?: boolean;\n /** Click handler for toggle */\n onClick?: () => void;\n children: React.ReactNode;\n}\n\nconst StyledSubheader = styled(ButtonBase)(({ theme }) => ({\n width: '100%',\n cursor: 'pointer',\n padding: 'var(--nav-subheader-padding, 8px 8px 8px 12px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n fontSize: 'var(--nav-subheader-font-size, 0.6875rem)',\n fontWeight: 'var(--nav-subheader-font-weight, 700)',\n color: 'var(--nav-subheader-color, inherit)',\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n borderRadius: theme.shape.borderRadius,\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n },\n}));\n\nconst ArrowIcon = styled('span')<{ open?: boolean }>(({ open }) => ({\n marginLeft: 'auto',\n width: 16,\n height: 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n transform: open ? 'rotate(0deg)' : 'rotate(-90deg)',\n '&::before': {\n content: '\"\"',\n width: 6,\n height: 6,\n borderStyle: 'solid',\n borderWidth: '0 0 1.5px 1.5px',\n borderColor: 'currentColor',\n transform: 'rotate(-45deg)',\n },\n}));\n\n/**\n * NavSubheader - Section header with collapse toggle.\n */\nexport function NavSubheader({className, open, onClick, children, ref, ...other }: NavSubheaderProps & { ref?: Ref<HTMLButtonElement> }) {\n return (\n <StyledSubheader ref={ref} className={cn(navSectionClasses.subheader, className)} onClick={onClick} {...other}>\n {children}\n {onClick && <ArrowIcon open={open} />}\n </StyledSubheader>\n );\n}\n\n// =============================================================================\n// NAV ITEM (BASE)\n// =============================================================================\n\n/**\n * Props for NavItemBase component.\n */\nexport interface NavItemBaseProps extends React.ComponentPropsWithoutRef<typeof ButtonBase> {\n /** Whether the item is active */\n active?: boolean;\n /** Whether the item is disabled */\n disabled?: boolean;\n /** Whether the submenu is open */\n open?: boolean;\n /** Item depth level */\n depth?: number;\n /** Whether item has children */\n hasChild?: boolean;\n children: React.ReactNode;\n}\n\nconst StyledNavItem = styled(ButtonBase, {\n shouldForwardProp: (prop) => !['active', 'open', 'depth', 'hasChild'].includes(prop as string),\n})<{ active?: boolean; open?: boolean; depth?: number; hasChild?: boolean }>(\n ({ theme, active, open, depth = 1, hasChild }) => ({\n width: '100%',\n minHeight: 'var(--nav-item-min-height, 44px)',\n padding: depth === 1 ? 'var(--nav-item-padding)' : 'var(--nav-sub-item-padding)',\n marginLeft: depth > 1 ? `calc(var(--nav-sub-item-margin-left, 40px) * ${depth - 1})` : 0,\n borderRadius: `var(--nav-item-radius, ${theme.shape.borderRadius}px)`,\n color: 'var(--nav-item-color)',\n backgroundColor: 'var(--nav-item-bg, transparent)',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n },\n // Active state\n ...(active && {\n backgroundColor: 'var(--nav-item-active-bg)',\n color: 'var(--nav-item-active-color)',\n '& .nav-icon': {\n color: 'var(--nav-icon-active-color)',\n },\n }),\n // Open state (submenu open)\n ...(open && {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n }),\n // Disabled state\n '&.Mui-disabled': {\n color: 'var(--nav-item-disabled-color)',\n pointerEvents: 'none',\n },\n })\n);\n\n/**\n * NavItemBase - Base button component for nav items.\n */\nexport function NavItemBase({className, active, disabled, open, depth, hasChild, ref, ...other }: NavItemBaseProps & { ref?: Ref<HTMLButtonElement> }) {\n return (\n <StyledNavItem\n ref={ref}\n className={cn(\n navSectionClasses.item,\n active && navSectionClasses.active,\n disabled && navSectionClasses.disabled,\n open && navSectionClasses.open,\n className\n )}\n active={active}\n open={open}\n depth={depth}\n hasChild={hasChild}\n disabled={disabled}\n {...other}\n />\n );\n}\n\n// =============================================================================\n// NAV ICON\n// =============================================================================\n\n/**\n * Props for NavIcon component.\n */\nexport interface NavIconProps {\n /** Icon element */\n icon?: React.ReactNode;\n /** Custom className */\n className?: string;\n}\n\nconst IconWrapper = styled('span')({\n width: 'var(--nav-icon-size, 24px)',\n height: 'var(--nav-icon-size, 24px)',\n flexShrink: 0,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: 'var(--nav-icon-margin, 0 16px 0 0)',\n color: 'var(--nav-icon-color)',\n '& svg': {\n width: '100%',\n height: '100%',\n },\n});\n/**\n * NavIcon - Icon wrapper for nav items.\n */\nexport function NavIcon({ icon, className }: NavIconProps): React.ReactNode {\n if (!icon) return null;\n return <IconWrapper className={cn('nav-icon', navSectionClasses.icon, className)}>{icon}</IconWrapper>;\n}\n\n// =============================================================================\n// NAV TEXTS\n// =============================================================================\n\n/**\n * Props for NavTexts component.\n */\nexport interface NavTextsProps {\n /** Title text */\n title: string;\n /** Caption text */\n caption?: string;\n /** Custom className */\n className?: string;\n}\n\nconst TextsWrapper = styled('span')({\n flex: '1 1 auto',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n minWidth: 0,\n});\nconst Title = styled('span')({\n fontSize: 'var(--nav-item-font-size, 0.875rem)',\n fontWeight: 500,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '100%',\n lineHeight: 1.5,\n});\nconst Caption = styled('span')(({ theme }) => ({\n fontSize: 'var(--nav-item-caption-size, 0.75rem)',\n color: theme.palette.text.disabled,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '100%',\n lineHeight: 1.5,\n}));\n\n/**\n * NavTexts - Text content for nav items.\n */\nexport function NavTexts({ title, caption, className }: NavTextsProps): React.ReactNode {\n return (\n <TextsWrapper className={cn(navSectionClasses.texts, className)}>\n <Title className={navSectionClasses.title}>{title}</Title>\n {caption && <Caption className={navSectionClasses.caption}>{caption}</Caption>}\n </TextsWrapper>\n );\n}\n\n// =============================================================================\n// NAV ARROW\n// =============================================================================\n\n/**\n * Props for NavArrow component.\n */\nexport interface NavArrowProps {\n /** Whether submenu is open */\n open?: boolean;\n /** Arrow direction */\n direction?: 'down' | 'right';\n /** Custom className */\n className?: string;\n}\n\nconst ArrowWrapper = styled('span')<{ open?: boolean; direction?: 'down' | 'right' }>(\n ({ open, direction = 'right' }) => ({\n width: 16,\n height: 16,\n flexShrink: 0,\n marginLeft: 6,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n transform: open ? (direction === 'down' ? 'rotate(180deg)' : 'rotate(90deg)') : 'rotate(0deg)',\n '&::before': {\n content: '\"\"',\n width: 5,\n height: 5,\n borderStyle: 'solid',\n borderWidth: '0 1.5px 1.5px 0',\n borderColor: 'currentColor',\n transform: direction === 'down' ? 'rotate(45deg)' : 'rotate(45deg)',\n },\n })\n);\n\n/**\n * NavArrow - Arrow indicator for items with children.\n */\nexport function NavArrow({ open, direction = 'right', className }: NavArrowProps): React.ReactNode {\n return <ArrowWrapper className={cn(navSectionClasses.arrow, className)} open={open} direction={direction} />;\n}\n\n// =============================================================================\n// NAV INFO\n// =============================================================================\n\n/**\n * Props for NavInfo component.\n */\nexport interface NavInfoProps {\n /** Info content */\n info?: React.ReactNode;\n /** Custom className */\n className?: string;\n}\n\nconst InfoWrapper = styled('span')({\n marginLeft: 6,\n display: 'inline-flex',\n alignItems: 'center',\n});\n/**\n * NavInfo - Info badge/content for nav items.\n */\nexport function NavInfo({ info, className }: NavInfoProps): React.ReactNode {\n if (!info) return null;\n return <InfoWrapper className={cn(navSectionClasses.info, className)}>{info}</InfoWrapper>;\n}\n","/**\n * URL Utilities\n *\n * Safe URL handling, navigation helpers, and link utilities.\n *\n * @module utils/url\n */\n\n/**\n * Options for safe return URL validation.\n */\nexport interface SafeReturnUrlOptions {\n /** Allowed URL schemes (default: ['http:', 'https:']) */\n allowedSchemes?: string[];\n /** Allowed hosts (if empty, only relative URLs allowed) */\n allowedHosts?: string[];\n /** Whether to allow relative URLs (default: true) */\n allowRelative?: boolean;\n /** Default URL if validation fails */\n fallback?: string;\n}\n\n/**\n * Validate and sanitize a return URL to prevent open redirect vulnerabilities.\n * Only allows relative paths or URLs to explicitly allowed hosts.\n *\n * @example\n * ```tsx\n * // In a login callback\n * const returnUrl = safeReturnUrl(searchParams.get('redirect'), {\n * allowedHosts: ['app.example.com'],\n * fallback: '/dashboard',\n * });\n * router.push(returnUrl);\n * ```\n *\n * @param url - URL to validate\n * @param options - Validation options\n * @returns Safe URL or fallback\n */\nexport function safeReturnUrl(url: string | null | undefined, options: SafeReturnUrlOptions = {}): string {\n const { allowedSchemes = ['http:', 'https:'], allowedHosts = [], allowRelative = true, fallback = '/' } = options;\n\n if (!url) {\n return fallback;\n }\n\n try {\n // Handle relative URLs\n if (url.startsWith('/') && !url.startsWith('//')) {\n if (allowRelative) {\n // Ensure it's a valid path (no protocol injection)\n return sanitizePath(url);\n }\n return fallback;\n }\n\n // Parse absolute URL\n const parsed = new URL(url, 'http://dummy.local');\n\n // Check scheme\n if (!allowedSchemes.includes(parsed.protocol)) {\n return fallback;\n }\n\n // Check host (only for absolute URLs)\n if (parsed.host !== 'dummy.local' && allowedHosts.length > 0) {\n if (!allowedHosts.includes(parsed.host)) {\n return fallback;\n }\n }\n\n // If parsed from a relative URL, return the pathname\n if (parsed.host === 'dummy.local') {\n return allowRelative ? sanitizePath(parsed.pathname + parsed.search + parsed.hash) : fallback;\n }\n\n return url;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Sanitize a URL path to prevent injection attacks.\n *\n * @param path - Path to sanitize\n * @returns Sanitized path\n */\nfunction sanitizePath(path: string): string {\n let sanitized = path;\n\n // Iteratively strip protocol-like patterns (handles javascript:javascript:... nesting)\n let prev = '';\n while (prev !== sanitized) {\n prev = sanitized;\n sanitized = sanitized.replace(/^[a-z]+:/gi, '');\n // Also strip whitespace/control chars that could bypass regex (e.g. java\\x00script:)\n // eslint-disable-next-line no-control-regex\n sanitized = sanitized.replace(/^[\\s\\x00-\\x1f]+/, '');\n }\n\n // Remove double slashes that could be interpreted as protocol-relative URLs\n sanitized = sanitized.replace(/^\\/\\/+/, '/');\n\n // Ensure it starts with a single slash\n if (!sanitized.startsWith('/')) {\n sanitized = '/' + sanitized;\n }\n\n return sanitized;\n}\n\n/**\n * Check if a navigation link is currently active.\n *\n * Features:\n * - Removes trailing slashes and query parameters before comparison\n * - Ignores external links (https://...) and hash links (#section)\n * - Supports deep matching for nested routes\n * - Handles query parameter paths correctly\n *\n * @example\n * ```tsx\n * // Basic usage\n * isActiveLink('/dashboard', '/dashboard/user/list'); // true (deep match)\n * isActiveLink('/dashboard', '/dashboard/user/list', false); // false (exact match)\n *\n * // Query parameters\n * isActiveLink('/users', '/users?page=1'); // true\n *\n * // Hash links and external links\n * isActiveLink('/home', '#section'); // false\n * isActiveLink('/home', 'https://example.com'); // false\n *\n * // Navigation items\n * const navItems = [\n * { path: '/dashboard', label: 'Dashboard', exact: true },\n * { path: '/users', label: 'Users' },\n * { path: '/settings', label: 'Settings' },\n * ];\n *\n * navItems.map(item => (\n * <NavItem\n * key={item.path}\n * active={isActiveLink(location.pathname, item.path, !item.exact)}\n * >\n * {item.label}\n * </NavItem>\n * ));\n * ```\n *\n * @param currentPathname - Current location pathname\n * @param targetPath - The link's target path (can include query parameters)\n * @param deep - Whether to perform deep matching for nested routes (default: true)\n * @returns True if the link is active\n */\nexport function isActiveLink(currentPathname: string, targetPath: string, deep: boolean = true): boolean {\n // Validate inputs\n if (!currentPathname || !targetPath) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[isActiveLink] currentPathname or targetPath is empty');\n }\n return false;\n }\n\n // Ignore hash links and external links\n if (targetPath.startsWith('#') || isExternalLink(targetPath)) {\n return false;\n }\n\n // Normalize paths: remove trailing slashes and query parameters\n const pathname = removeLastSlash(currentPathname);\n const cleanedTargetPath = removeLastSlash(removeParams(targetPath));\n\n // If target has query params, always do deep matching\n const shouldDeepMatch = deep || hasParams(targetPath);\n\n // Root path special case\n if (cleanedTargetPath === '/') {\n return pathname === '/';\n }\n\n // Deep match: current path starts with target path\n if (shouldDeepMatch) {\n return pathname === cleanedTargetPath || pathname.startsWith(`${cleanedTargetPath}/`);\n }\n\n // Exact match\n return pathname === cleanedTargetPath;\n}\n\n/**\n * Check if a URL is external (different origin).\n *\n * @param url - URL to check\n * @param currentOrigin - Current page origin (default: window.location.origin)\n * @returns True if the URL is external\n */\nexport function isExternalUrl(url: string, currentOrigin?: string): boolean {\n try {\n // Relative URLs are internal\n if (url.startsWith('/') && !url.startsWith('//')) {\n return false;\n }\n\n // Protocol-relative URLs\n if (url.startsWith('//')) {\n const origin = currentOrigin ?? (typeof window !== 'undefined' ? window.location.origin : '');\n const currentHost = new URL(origin).host;\n const urlHost = url.slice(2).split('/')[0];\n return urlHost !== currentHost;\n }\n\n // Absolute URLs\n const origin = currentOrigin ?? (typeof window !== 'undefined' ? window.location.origin : '');\n const urlOrigin = new URL(url).origin;\n return urlOrigin !== origin;\n } catch {\n return false;\n }\n}\n\n/**\n * Build a URL with query parameters.\n *\n * @example\n * ```tsx\n * const url = buildUrl('/search', {\n * q: 'hello world',\n * page: 1,\n * filter: ['active', 'recent'],\n * });\n * // Returns: '/search?q=hello+world&page=1&filter=active&filter=recent'\n * ```\n *\n * @param base - Base URL path\n * @param params - Query parameters\n * @returns URL with query string\n */\nexport function buildUrl(\n base: string,\n params: Record<string, string | number | boolean | (string | number | boolean)[] | null | undefined>\n): string {\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === null || value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n searchParams.append(key, String(item));\n }\n } else {\n searchParams.set(key, String(value));\n }\n }\n\n const queryString = searchParams.toString();\n if (!queryString) {\n return base;\n }\n\n const separator = base.includes('?') ? '&' : '?';\n return base + separator + queryString;\n}\n\n/**\n * Parse query parameters from a URL string.\n *\n * @param url - URL or query string\n * @returns Parsed parameters\n */\nexport function parseQueryParams(url: string): Record<string, string | string[]> {\n const queryString = url.includes('?') ? url.split('?')[1] : url;\n const params = new URLSearchParams(queryString);\n const result: Record<string, string | string[]> = {};\n\n for (const [key, value] of params.entries()) {\n const existing = result[key];\n if (existing) {\n result[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Get a single query parameter value.\n *\n * @param url - URL or query string\n * @param key - Parameter key\n * @returns Parameter value or undefined\n */\nexport function getQueryParam(url: string, key: string): string | undefined {\n const params = parseQueryParams(url);\n const value = params[key];\n return Array.isArray(value) ? value[0] : value;\n}\n\n/**\n * Check if a URL has query parameters.\n *\n * @param url - URL to check\n * @returns True if URL has query parameters\n *\n * @example\n * ```ts\n * hasParams('/search?q=hello'); // true\n * hasParams('/search'); // false\n * ```\n */\nexport function hasParams(url: string): boolean {\n return url.includes('?') && url.split('?')[1]?.length > 0;\n}\n\n/**\n * Remove query parameters from a URL.\n *\n * @param url - URL to process\n * @returns URL without query parameters\n *\n * @example\n * ```ts\n * removeParams('/search?q=hello'); // '/search'\n * removeParams('/search'); // '/search'\n * ```\n */\nexport function removeParams(url: string): string {\n const index = url.indexOf('?');\n return index === -1 ? url : url.slice(0, index);\n}\n\n/**\n * Remove trailing slash from a path.\n *\n * @param pathname - Path to process\n * @returns Path without trailing slash\n *\n * @example\n * ```ts\n * removeLastSlash('/users/'); // '/users'\n * removeLastSlash('/users'); // '/users'\n * removeLastSlash('/'); // '/'\n * ```\n */\nexport function removeLastSlash(pathname: string): string {\n if (pathname === '/') {\n return pathname;\n }\n return pathname.endsWith('/') ? pathname.slice(0, -1) : pathname;\n}\n\n/**\n * Check if a URL is an external link (starts with http:// or https://).\n *\n * @param url - URL to check\n * @returns True if external link\n *\n * @example\n * ```ts\n * isExternalLink('https://example.com'); // true\n * isExternalLink('/about'); // false\n * isExternalLink('#section'); // false\n * ```\n */\nexport function isExternalLink(url: string): boolean {\n return /^https?:\\/\\//.test(url);\n}\n\n/**\n * Compare two paths for equality (ignoring trailing slashes and query params).\n *\n * @param targetUrl - Target URL\n * @param currentUrl - Current URL\n * @param options - Comparison options\n * @returns True if paths are equal\n *\n * @example\n * ```ts\n * isEqualPath('/users/', '/users'); // true\n * isEqualPath('/users?page=1', '/users'); // true\n * isEqualPath('/users', '/users/1', { deep: true }); // false\n * ```\n */\nexport function isEqualPath(targetUrl: string, currentUrl: string, options: { deep?: boolean } = {}): boolean {\n const { deep = false } = options;\n\n // Normalize both paths\n const target = removeLastSlash(removeParams(targetUrl));\n const current = removeLastSlash(removeParams(currentUrl));\n\n if (deep) {\n return current === target || current.startsWith(target + '/');\n }\n\n return target === current;\n}\n","'use client';\n\n/**\n * Navigation Item Component\n *\n * Individual navigation item with icon, text, and optional children indicator.\n *\n * @module components/nav-section\n */\n\nimport { useMemo } from 'react';\nimport type { Ref } from 'react';\nimport Box from '@mui/material/Box';\nimport Tooltip from '@mui/material/Tooltip';\n\nimport type { NavItemProps, NavItemRenderProps } from './types.js';\nimport { NavItemBase, NavIcon, NavTexts, NavArrow, NavInfo } from './components.js';\nimport { isExternalLink } from '../../utils/url.js';\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Resolve icon from render props or direct node.\n */\nfunction resolveIcon(\n icon: string | React.ReactNode | undefined,\n render?: NavItemRenderProps\n): React.ReactNode | undefined {\n if (!icon) return undefined;\n if (typeof icon === 'string' && render?.navIcon) {\n return render.navIcon[icon];\n }\n return icon as React.ReactNode;\n}\n\n/**\n * Resolve info from render props or direct node.\n */\nfunction resolveInfo(\n info: string[] | React.ReactNode | undefined,\n render?: NavItemRenderProps\n): React.ReactNode | undefined {\n if (!info) return undefined;\n if (Array.isArray(info) && render?.navInfo) {\n const infoComponents = info.map((key) => render.navInfo?.(key));\n return (\n <>\n {infoComponents.map((comp, idx) => (\n <Box key={idx} component=\"span\">\n {comp && Object.values(comp)[0]}\n </Box>\n ))}\n </>\n );\n }\n return info as React.ReactNode;\n}\n\n// =============================================================================\n// NAV ITEM COMPONENT\n// =============================================================================\n\n/**\n * NavItem - Individual navigation item.\n *\n * @example\n * ```tsx\n * <NavItem\n * title=\"Dashboard\"\n * path=\"/dashboard\"\n * icon={<DashboardIcon />}\n * active={pathname === '/dashboard'}\n * />\n * ```\n */\nexport function NavItem(props: NavItemProps & { ref?: Ref<HTMLButtonElement> }) {\n const { ref } = props;\n const {\n // Data props\n path,\n title,\n icon,\n info,\n caption,\n disabled,\n children: _children,\n // State props\n open,\n active,\n // Options\n depth = 1,\n hasChild,\n externalLink,\n enabledRootRedirect,\n render,\n slotProps,\n // ButtonBase props\n onClick,\n ...other\n } = props;\n\n // Resolve icon and info from render props\n const resolvedIcon = useMemo(() => resolveIcon(icon, render), [icon, render]);\n const resolvedInfo = useMemo(() => resolveInfo(info, render), [info, render]);\n\n // Check if external link\n const isExternal = externalLink ?? isExternalLink(path);\n\n // Determine if item should be clickable\n const isClickable = !disabled && (enabledRootRedirect || !hasChild || depth > 1);\n\n // Build anchor props for external links\n const linkProps = isExternal\n ? {\n component: 'a' as const,\n href: path,\n target: '_blank',\n rel: 'noopener noreferrer',\n }\n : {};\n\n const content = (\n <NavItemBase\n ref={ref}\n active={active}\n disabled={disabled}\n open={open}\n depth={depth}\n hasChild={hasChild}\n onClick={isClickable ? onClick : undefined}\n sx={slotProps?.sx}\n {...linkProps}\n {...other}\n >\n <NavIcon icon={resolvedIcon} className={slotProps?.icon as string} />\n <NavTexts title={title} caption={caption} className={slotProps?.texts as string} />\n {resolvedInfo && <NavInfo info={resolvedInfo} className={slotProps?.info as string} />}\n {hasChild && <NavArrow open={open} className={slotProps?.arrow as string} />}\n </NavItemBase>\n );\n\n // Wrap with tooltip for caption in mini mode or when needed\n if (caption && depth === 1) {\n return (\n <Tooltip title={caption} placement=\"right\" arrow>\n {content}\n </Tooltip>\n );\n }\n\n return content;\n}\n// =============================================================================\n// NAV ITEM EXPORTS\n// =============================================================================\n\nexport type { NavItemProps };\n","'use client';\n\n/**\n * Navigation Context\n *\n * Context for managing navigation state (pathname, router).\n *\n * @module components/nav-section\n */\n\nimport { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Router functions for navigation.\n */\nexport interface NavRouter {\n /** Navigate to a path */\n push: (path: string) => void;\n /** Replace current path */\n replace?: (path: string) => void;\n}\n\n/**\n * Navigation context value.\n */\nexport interface NavContextValue {\n /** Current pathname */\n pathname: string;\n /** Optional router */\n router?: NavRouter;\n}\n\n/**\n * Props for NavProvider.\n */\nexport interface NavProviderProps {\n /** Current pathname */\n pathname: string;\n /** Optional router */\n router?: NavRouter;\n children: ReactNode;\n}\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst NavContext = createContext<NavContextValue | undefined>(undefined);\n\n/**\n * NavProvider - Provides navigation context to nav components.\n *\n * @example\n * ```tsx\n * // With Next.js\n * import { usePathname, useRouter } from 'next/navigation';\n *\n * function App() {\n * const pathname = usePathname();\n * const router = useRouter();\n *\n * return (\n * <NavProvider pathname={pathname} router={router}>\n * <NavSection data={navConfig} />\n * </NavProvider>\n * );\n * }\n *\n * // With React Router\n * import { useLocation, useNavigate } from 'react-router-dom';\n *\n * function App() {\n * const { pathname } = useLocation();\n * const navigate = useNavigate();\n *\n * return (\n * <NavProvider pathname={pathname} router={{ push: navigate }}>\n * <NavSection data={navConfig} />\n * </NavProvider>\n * );\n * }\n * ```\n */\nexport function NavProvider({ pathname, router, children }: NavProviderProps): ReactNode {\n const value = useMemo(() => ({ pathname, router }), [pathname, router]);\n\n return <NavContext.Provider value={value}>{children}</NavContext.Provider>;\n}\n\n/**\n * useNav - Hook to access navigation context.\n */\nexport function useNav(): NavContextValue {\n const context = useContext(NavContext);\n if (context === undefined) {\n throw new Error('useNav must be used within a NavProvider');\n }\n return context;\n}\n\n/**\n * useNavPathname - Hook to get current pathname with fallback.\n *\n * Returns pathname from context if available, otherwise returns '/'.\n * This allows components to work without NavProvider for simpler use cases.\n */\nexport function useNavPathname(): string {\n const context = useContext(NavContext);\n return context?.pathname ?? '/';\n}\n\n/**\n * useNavRouter - Hook to get router from context.\n */\nexport function useNavRouter(): NavRouter | undefined {\n const context = useContext(NavContext);\n return context?.router;\n}\n","'use client';\n\n/**\n * Navigation List Component\n *\n * Renders a navigation item with its children, handling collapse and active states.\n *\n * @module components/nav-section\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport Collapse from '@mui/material/Collapse';\n\nimport type { NavListProps, NavSubListProps, NavItemDataProps } from './types.js';\nimport { NavUl, NavLi } from './components.js';\nimport { NavItem } from './nav-item.js';\nimport { useNavPathname } from './nav-context.js';\nimport { isActiveLink } from '../../utils/url.js';\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Check if any child route is active.\n */\nfunction hasActiveChild(data: NavItemDataProps, currentPath: string, deepMatch = false): boolean {\n if (!data.children?.length) return false;\n\n return data.children.some((child) => {\n const childActive = deepMatch ? isActiveLink(currentPath, child.path, true) : currentPath === child.path;\n\n if (childActive) return true;\n if (child.children?.length) {\n return hasActiveChild(child, currentPath, deepMatch);\n }\n return false;\n });\n}\n\n// =============================================================================\n// NAV LIST COMPONENT\n// =============================================================================\n\n/**\n * NavList - Renders a navigation item with its children.\n *\n * @example\n * ```tsx\n * <NavList\n * data={{\n * title: 'Users',\n * path: '/users',\n * children: [\n * { title: 'List', path: '/users/list' },\n * { title: 'Create', path: '/users/create' },\n * ],\n * }}\n * depth={1}\n * />\n * ```\n */\nexport function NavList({\n data,\n depth = 1,\n render,\n slotProps,\n cssVars,\n checkPermissions,\n enabledRootRedirect,\n}: NavListProps): React.ReactNode {\n const pathname = useNavPathname();\n\n // Check if this item is active\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n // Check if any child is active\n const hasChild = Boolean(data.children?.length);\n const childActive = useMemo(\n () => hasChild && hasActiveChild(data, pathname, data.deepMatch),\n [data, pathname, hasChild]\n );\n\n // Open state for collapse (default open if child is active)\n const [open, setOpen] = useState(childActive);\n\n // Update open state when child becomes active\n useEffect(() => {\n if (childActive) {\n setOpen(true);\n }\n }, [childActive]);\n\n // Toggle collapse\n const handleToggle = useCallback(() => {\n if (hasChild) {\n setOpen((prev) => !prev);\n }\n }, [hasChild]);\n\n // Handle navigation click\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n if (hasChild && !enabledRootRedirect) {\n event.preventDefault();\n handleToggle();\n }\n },\n [hasChild, enabledRootRedirect, handleToggle]\n );\n\n // Check permissions\n if (checkPermissions && data.allowedRoles) {\n const hasPermission = checkPermissions(data.allowedRoles);\n if (!hasPermission) return null;\n }\n\n return (\n <NavLi>\n <NavItem\n // Data\n path={data.path}\n title={data.title}\n icon={data.icon}\n info={data.info}\n caption={data.caption}\n disabled={data.disabled}\n // State\n active={isActive || childActive}\n open={open}\n // Options\n depth={depth}\n hasChild={hasChild}\n enabledRootRedirect={enabledRootRedirect}\n render={render}\n slotProps={depth === 1 ? slotProps?.rootItem : slotProps?.subItem}\n // Events\n onClick={handleClick}\n />\n\n {hasChild && (\n <Collapse in={open} unmountOnExit>\n <NavSubList\n data={data.children!}\n depth={depth + 1}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n </Collapse>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// NAV SUB LIST COMPONENT\n// =============================================================================\n\n/**\n * NavSubList - Renders a list of child navigation items.\n */\nexport function NavSubList({\n data,\n depth,\n render,\n slotProps,\n cssVars,\n checkPermissions,\n enabledRootRedirect,\n}: NavSubListProps): React.ReactNode {\n return (\n <NavUl sx={{ gap: 'var(--nav-item-gap)' }}>\n {data.map((item) => (\n <NavList\n key={item.title}\n data={item}\n depth={depth}\n render={render}\n slotProps={slotProps}\n cssVars={cssVars}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n );\n}\n","'use client';\n\n/**\n * Vertical Navigation Section\n *\n * Collapsible navigation groups for sidebar layouts.\n *\n * @module components/nav-section\n */\n\nimport { useTheme } from '@mui/material/styles';\nimport Collapse from '@mui/material/Collapse';\n\nimport type { NavGroupProps, NavSectionProps } from './types.js';\nimport { Nav, NavUl, NavLi, NavSubheader } from './components.js';\nimport { NavList } from './nav-list.js';\nimport { navSectionClasses, navSectionCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { useBoolean } from '../../core/index.js';\n\n// =============================================================================\n// NAV GROUP COMPONENT\n// =============================================================================\n\n/**\n * NavGroup - A collapsible group of navigation items with optional subheader.\n */\nfunction NavGroup({\n items,\n render,\n subheader,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: NavGroupProps): React.ReactNode {\n const groupOpen = useBoolean(true);\n\n const renderContent = () => (\n <NavUl sx={{ gap: 'var(--nav-item-gap)' }}>\n {items.map((list) => (\n <NavList\n key={list.title}\n data={list}\n render={render}\n depth={1}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n );\n\n return (\n <NavLi>\n {subheader ? (\n <>\n <NavSubheader\n data-title={subheader}\n open={groupOpen.value}\n onClick={groupOpen.onToggle}\n sx={slotProps?.subheader}\n >\n {subheader}\n </NavSubheader>\n\n <Collapse in={groupOpen.value}>{renderContent()}</Collapse>\n </>\n ) : (\n renderContent()\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// NAV SECTION VERTICAL\n// =============================================================================\n\n/**\n * NavSectionVertical - Vertical navigation section for sidebar layouts.\n *\n * @example\n * ```tsx\n * const navConfig = [\n * {\n * subheader: 'Overview',\n * items: [\n * { title: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> },\n * { title: 'Analytics', path: '/analytics', icon: <ChartIcon /> },\n * ],\n * },\n * {\n * subheader: 'Management',\n * items: [\n * {\n * title: 'Users',\n * path: '/users',\n * icon: <UsersIcon />,\n * children: [\n * { title: 'List', path: '/users/list' },\n * { title: 'Create', path: '/users/create' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <NavProvider pathname={pathname}>\n * <NavSectionVertical data={navConfig} />\n * </NavProvider>\n * ```\n */\nexport function NavSectionVertical({\n sx,\n data,\n render,\n className,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: NavSectionProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...navSectionCssVars.vertical(theme), ...overridesVars };\n\n return (\n <Nav\n className={cn(navSectionClasses.root, navSectionClasses.vertical, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl sx={{ flex: '1 1 auto', gap: 'var(--nav-item-gap)' }}>\n {data.map((group) => (\n <NavGroup\n key={group.subheader ?? group.items[0]?.title}\n subheader={group.subheader}\n items={group.items}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\n/**\n * Horizontal Navigation Section\n *\n * Horizontal navigation for header/top bar layouts.\n *\n * @module components/nav-section\n */\n\nimport { useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport { useTheme } from '@mui/material/styles';\nimport Popover from '@mui/material/Popover';\nimport Paper from '@mui/material/Paper';\n\nimport type { NavItemDataProps, NavListProps, NavSectionProps } from './types.js';\nimport { Nav, NavUl, NavLi } from './components.js';\nimport { NavItem } from './nav-item.js';\nimport { useNavPathname } from './nav-context.js';\nimport { navSectionClasses, navSectionCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink } from '../../utils/url.js';\n\n// =============================================================================\n// HORIZONTAL NAV LIST\n// =============================================================================\n\n/**\n * HorizontalNavList - Navigation item with dropdown for horizontal layout.\n */\nfunction HorizontalNavList({\n data,\n render,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: NavListProps): React.ReactNode {\n const pathname = useNavPathname();\n const anchorRef = useRef<HTMLButtonElement>(null);\n\n // Check if this item is active\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n // Check if any child is active\n const hasChild = Boolean(data.children?.length);\n const childActive = useMemo(() => {\n if (!hasChild) return false;\n return data.children!.some((child) => isActiveLink(pathname, child.path, child.deepMatch));\n }, [data.children, pathname, hasChild]);\n\n // Popover state\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n if (hasChild) {\n setOpen(true);\n }\n }, [hasChild]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n // Close on route change\n useEffect(() => {\n handleClose();\n }, [pathname, handleClose]);\n\n // Check permissions\n if (checkPermissions && data.allowedRoles) {\n const hasPermission = checkPermissions(data.allowedRoles);\n if (!hasPermission) return null;\n }\n\n return (\n <NavLi>\n <NavItem\n ref={anchorRef}\n // Data\n path={data.path}\n title={data.title}\n icon={data.icon}\n info={data.info}\n caption={data.caption}\n disabled={data.disabled}\n // State\n active={isActive || childActive}\n open={open}\n // Options\n depth={1}\n hasChild={hasChild}\n enabledRootRedirect={enabledRootRedirect}\n render={render}\n slotProps={slotProps?.rootItem}\n // Events\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n />\n\n {hasChild && (\n <Popover\n open={open}\n anchorEl={anchorRef.current}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n onMouseEnter: handleOpen,\n onMouseLeave: handleClose,\n sx: {\n pointerEvents: 'auto',\n minWidth: 'var(--nav-dropdown-paper-width, 180px)',\n borderRadius: 'var(--nav-dropdown-paper-radius, 8px)',\n boxShadow: 'var(--nav-dropdown-paper-shadow)',\n ...slotProps?.dropdown?.paper,\n },\n },\n }}\n sx={{\n pointerEvents: 'none',\n }}\n disableRestoreFocus\n >\n <HorizontalDropdown\n data={data.children!}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n </Popover>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// HORIZONTAL DROPDOWN\n// =============================================================================\n\ninterface HorizontalDropdownProps {\n data: NavItemDataProps[];\n render?: NavListProps['render'];\n slotProps?: NavListProps['slotProps'];\n checkPermissions?: NavListProps['checkPermissions'];\n enabledRootRedirect?: boolean;\n}\n\n/**\n * HorizontalDropdown - Dropdown content for horizontal nav items.\n */\nfunction HorizontalDropdown({\n data,\n render,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: HorizontalDropdownProps): React.ReactNode {\n const pathname = useNavPathname();\n\n return (\n <Paper elevation={0} sx={{ p: 1 }}>\n <NavUl sx={{ gap: 0.5 }}>\n {data.map((item) => {\n // Check permissions\n if (checkPermissions && item.allowedRoles) {\n const hasPermission = checkPermissions(item.allowedRoles);\n if (!hasPermission) return null;\n }\n\n const isActive = isActiveLink(pathname, item.path, item.deepMatch);\n\n return (\n <NavLi key={item.title}>\n <NavItem\n path={item.path}\n title={item.title}\n icon={item.icon}\n disabled={item.disabled}\n active={isActive}\n depth={2}\n render={render}\n slotProps={slotProps?.subItem}\n enabledRootRedirect={enabledRootRedirect}\n />\n </NavLi>\n );\n })}\n </NavUl>\n </Paper>\n );\n}\n\n// =============================================================================\n// NAV SECTION HORIZONTAL\n// =============================================================================\n\n/**\n * NavSectionHorizontal - Horizontal navigation section for header layouts.\n *\n * @example\n * ```tsx\n * const navConfig = [\n * {\n * items: [\n * { title: 'Home', path: '/', icon: <HomeIcon /> },\n * {\n * title: 'Products',\n * path: '/products',\n * children: [\n * { title: 'All', path: '/products' },\n * { title: 'New', path: '/products/new' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <NavProvider pathname={pathname}>\n * <NavSectionHorizontal data={navConfig} />\n * </NavProvider>\n * ```\n */\nexport function NavSectionHorizontal({\n sx,\n data,\n render,\n className,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: NavSectionProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...navSectionCssVars.horizontal(theme), ...overridesVars };\n\n // Flatten all items from all groups\n const items = useMemo(() => data.flatMap((group) => group.items), [data]);\n\n return (\n <Nav\n className={cn(navSectionClasses.root, navSectionClasses.horizontal, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl sx={{ flexDirection: 'row', gap: 'var(--nav-item-gap)' }}>\n {items.map((item) => (\n <HorizontalNavList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\n/**\n * Mini Navigation Section\n *\n * Compact icon-only navigation for collapsed sidebars.\n *\n * @module components/nav-section\n */\n\nimport { useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport { useTheme, styled } from '@mui/material/styles';\nimport Popover from '@mui/material/Popover';\nimport Paper from '@mui/material/Paper';\nimport Tooltip from '@mui/material/Tooltip';\n\nimport type { NavItemDataProps, NavListProps, NavSectionProps } from './types.js';\nimport { Nav, NavUl, NavLi, NavItemBase, NavIcon } from './components.js';\nimport { NavItem } from './nav-item.js';\nimport { useNavPathname } from './nav-context.js';\nimport { navSectionClasses, navSectionCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink } from '../../utils/url.js';\n\n// =============================================================================\n// MINI NAV ITEM\n// =============================================================================\n\nconst MiniNavButton = styled(NavItemBase)(({ theme }) => ({\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n textAlign: 'center',\n padding: 'var(--nav-item-padding, 8px)',\n gap: 4,\n}));\n\nconst MiniTitle = styled('span')({\n fontSize: 'var(--nav-item-font-size, 0.625rem)',\n fontWeight: 500,\n lineHeight: 1.5,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '100%',\n});\n\n// =============================================================================\n// MINI NAV LIST\n// =============================================================================\n\n/**\n * MiniNavList - Navigation item for mini layout with tooltip popover.\n */\nfunction MiniNavList({\n data,\n render,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: NavListProps): React.ReactNode {\n const pathname = useNavPathname();\n const anchorRef = useRef<HTMLButtonElement>(null);\n\n // Check if this item is active\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n // Check if any child is active\n const hasChild = Boolean(data.children?.length);\n const childActive = useMemo(() => {\n if (!hasChild) return false;\n return data.children!.some((child) => isActiveLink(pathname, child.path, child.deepMatch));\n }, [data.children, pathname, hasChild]);\n\n // Popover state\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n if (hasChild) {\n setOpen(true);\n }\n }, [hasChild]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n // Close on route change\n useEffect(() => {\n handleClose();\n }, [pathname, handleClose]);\n\n // Check permissions\n if (checkPermissions && data.allowedRoles) {\n const hasPermission = checkPermissions(data.allowedRoles);\n if (!hasPermission) return null;\n }\n\n // Resolve icon\n const icon = typeof data.icon === 'string' && render?.navIcon ? render.navIcon[data.icon] : data.icon;\n\n const content = (\n <MiniNavButton\n ref={anchorRef}\n active={isActive || childActive}\n disabled={data.disabled}\n open={open}\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n sx={slotProps?.rootItem?.sx}\n >\n <NavIcon icon={icon} className={slotProps?.rootItem?.icon as string} />\n <MiniTitle>{data.title}</MiniTitle>\n </MiniNavButton>\n );\n\n return (\n <NavLi>\n {hasChild ? (\n <>\n {content}\n <Popover\n open={open}\n anchorEl={anchorRef.current}\n anchorOrigin={{\n vertical: 'center',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'center',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n onMouseEnter: handleOpen,\n onMouseLeave: handleClose,\n sx: {\n pointerEvents: 'auto',\n ml: 1,\n minWidth: 'var(--nav-tooltip-paper-width, 160px)',\n borderRadius: 1,\n ...slotProps?.dropdown?.paper,\n },\n },\n }}\n sx={{\n pointerEvents: 'none',\n }}\n disableRestoreFocus\n >\n <MiniDropdown\n data={data.children!}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n </Popover>\n </>\n ) : (\n <Tooltip title={data.title} placement=\"right\" arrow>\n {content}\n </Tooltip>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// MINI DROPDOWN\n// =============================================================================\n\ninterface MiniDropdownProps {\n data: NavItemDataProps[];\n render?: NavListProps['render'];\n slotProps?: NavListProps['slotProps'];\n checkPermissions?: NavListProps['checkPermissions'];\n enabledRootRedirect?: boolean;\n}\n\n/**\n * MiniDropdown - Dropdown content for mini nav items.\n */\nfunction MiniDropdown({\n data,\n render,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: MiniDropdownProps): React.ReactNode {\n const pathname = useNavPathname();\n\n return (\n <Paper elevation={0} sx={{ p: 1 }}>\n <NavUl sx={{ gap: 0.5 }}>\n {data.map((item) => {\n // Check permissions\n if (checkPermissions && item.allowedRoles) {\n const hasPermission = checkPermissions(item.allowedRoles);\n if (!hasPermission) return null;\n }\n\n const isActive = isActiveLink(pathname, item.path, item.deepMatch);\n\n return (\n <NavLi key={item.title}>\n <NavItem\n path={item.path}\n title={item.title}\n icon={item.icon}\n disabled={item.disabled}\n active={isActive}\n depth={2}\n render={render}\n slotProps={slotProps?.subItem}\n enabledRootRedirect={enabledRootRedirect}\n />\n </NavLi>\n );\n })}\n </NavUl>\n </Paper>\n );\n}\n\n// =============================================================================\n// NAV SECTION MINI\n// =============================================================================\n\n/**\n * NavSectionMini - Compact navigation for collapsed sidebars.\n *\n * @example\n * ```tsx\n * const navConfig = [\n * {\n * items: [\n * { title: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> },\n * {\n * title: 'Users',\n * path: '/users',\n * icon: <UsersIcon />,\n * children: [\n * { title: 'List', path: '/users/list' },\n * { title: 'Create', path: '/users/create' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <NavProvider pathname={pathname}>\n * <NavSectionMini data={navConfig} />\n * </NavProvider>\n * ```\n */\nexport function NavSectionMini({\n sx,\n data,\n render,\n className,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: NavSectionProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...navSectionCssVars.mini(theme), ...overridesVars };\n\n // Flatten all items from all groups\n const items = useMemo(() => data.flatMap((group) => group.items), [data]);\n\n return (\n <Nav\n className={cn(navSectionClasses.root, navSectionClasses.mini, className)}\n sx={[\n {\n ...cssVars,\n alignItems: 'center',\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n >\n <NavUl sx={{ gap: 'var(--nav-item-gap)', alignItems: 'center' }}>\n {items.map((item) => (\n <MiniNavList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","/**\n * Mega Menu Styles\n *\n * CSS custom properties and class names for mega menus.\n *\n * @module components/mega-menu\n */\n\nimport type { Theme, CSSObject } from '@mui/material/styles';\nimport type { MegaMenuVariant } from './types.js';\nimport { createComponentClasses } from '../../utils/create-classes.js';\n\n// =============================================================================\n// CLASS NAMES\n// =============================================================================\n\n/**\n * CSS class names for mega menu components.\n */\nexport const megaMenuClasses = createComponentClasses('mega-menu', [\n 'root',\n 'horizontal',\n 'vertical',\n 'mobile',\n 'ul',\n 'li',\n 'item',\n 'icon',\n 'title',\n 'info',\n 'arrow',\n 'dropdown',\n 'subheader',\n 'subItem',\n 'tags',\n 'moreLink',\n 'slide',\n 'active',\n 'disabled',\n 'open',\n] as const);\n\n// =============================================================================\n// CSS CUSTOM PROPERTIES\n// =============================================================================\n\n/**\n * Get CSS variables for mega menu based on variant.\n */\nexport function megaMenuCssVars(theme: Theme, variant: MegaMenuVariant): CSSObject {\n const commonVars: CSSObject = {\n // Item spacing\n '--nav-item-gap': '6px',\n '--nav-item-radius': '8px',\n // Icon\n '--nav-icon-size': '22px',\n '--nav-icon-margin': '0 8px 0 0',\n // Text\n '--nav-item-font-size': '0.875rem',\n '--nav-subheader-font-size': '0.6875rem',\n '--nav-subheader-font-weight': '700',\n // Colors - inactive\n '--nav-item-color': theme.palette.text.primary,\n '--nav-icon-color': theme.palette.text.secondary,\n '--nav-item-bg': 'transparent',\n // Colors - hover\n '--nav-item-hover-bg': theme.palette.action.hover,\n '--nav-item-hover-color': theme.palette.text.primary,\n // Colors - active\n '--nav-item-active-bg': theme.palette.action.selected,\n '--nav-item-active-color': theme.palette.primary.main,\n '--nav-icon-active-color': theme.palette.primary.main,\n // Colors - disabled\n '--nav-item-disabled-color': theme.palette.text.disabled,\n };\n\n switch (variant) {\n case 'horizontal':\n return {\n ...commonVars,\n '--nav-item-padding': '8px 14px',\n '--nav-item-min-height': '36px',\n // Dropdown\n '--nav-dropdown-width': '800px',\n '--nav-dropdown-max-height': '400px',\n '--nav-dropdown-radius': '12px',\n '--nav-dropdown-shadow': theme.shadows[20],\n '--nav-dropdown-padding': '24px',\n };\n\n case 'vertical':\n return {\n ...commonVars,\n '--nav-item-padding': '8px 12px',\n '--nav-item-min-height': '40px',\n // Dropdown\n '--nav-dropdown-width': '280px',\n '--nav-dropdown-max-height': '350px',\n '--nav-dropdown-radius': '10px',\n '--nav-dropdown-shadow': theme.shadows[16],\n '--nav-dropdown-padding': '16px',\n };\n\n case 'mobile':\n return {\n ...commonVars,\n '--nav-item-padding': '12px 16px',\n '--nav-item-min-height': '44px',\n // No dropdown for mobile - uses accordion style\n };\n\n default:\n return commonVars;\n }\n}\n","'use client';\n\n/**\n * Horizontal Mega Menu\n *\n * Rich dropdown navigation for header layouts.\n *\n * @module components/mega-menu\n */\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport Box from '@mui/material/Box';\nimport { useNavPathname } from '../nav-section/nav-context.js';\nimport Link from '@mui/material/Link';\nimport Paper from '@mui/material/Paper';\nimport Popover from '@mui/material/Popover';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { styled, useTheme, alpha } from '@mui/material/styles';\n\nimport type { MegaMenuProps, MegaMenuListProps } from './types.js';\nimport { megaMenuClasses, megaMenuCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink, isExternalLink } from '../../utils/url.js';\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst Nav = styled('nav')({\n display: 'flex',\n flexShrink: 0,\n});\n\nconst NavUl = styled('ul')({\n display: 'flex',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n});\n\nconst NavLi = styled('li')({\n display: 'flex',\n});\n\nconst NavButton = styled('button')<{ active?: boolean; open?: boolean }>(({ theme, active, open }) => ({\n all: 'unset',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n padding: 'var(--nav-item-padding)',\n minHeight: 'var(--nav-item-min-height)',\n borderRadius: 'var(--nav-item-radius)',\n fontSize: 'var(--nav-item-font-size)',\n fontWeight: 500,\n color: 'var(--nav-item-color)',\n backgroundColor: 'var(--nav-item-bg)',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n },\n ...(active && {\n backgroundColor: 'var(--nav-item-active-bg)',\n color: 'var(--nav-item-active-color)',\n }),\n ...(open && {\n backgroundColor: 'var(--nav-item-hover-bg)',\n }),\n '&:disabled': {\n color: 'var(--nav-item-disabled-color)',\n cursor: 'not-allowed',\n },\n}));\n\nconst IconWrapper = styled('span')({\n width: 'var(--nav-icon-size)',\n height: 'var(--nav-icon-size)',\n marginRight: 8,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--nav-icon-color)',\n '& svg': {\n width: '100%',\n height: '100%',\n },\n});\n\nconst ArrowIcon = styled('span')<{ open?: boolean }>(({ open }) => ({\n marginLeft: 6,\n width: 16,\n height: 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n '&::before': {\n content: '\"\"',\n width: 6,\n height: 6,\n borderStyle: 'solid',\n borderWidth: '0 0 1.5px 1.5px',\n borderColor: 'currentColor',\n transform: 'rotate(-45deg)',\n },\n}));\n\nconst DropdownContent = styled(Paper)(({ theme }) => ({\n width: 'var(--nav-dropdown-width)',\n maxHeight: 'var(--nav-dropdown-max-height)',\n borderRadius: 'var(--nav-dropdown-radius)',\n padding: 'var(--nav-dropdown-padding)',\n overflow: 'auto',\n display: 'flex',\n gap: 24,\n}));\n\nconst SectionColumn = styled('div')({\n flex: 1,\n minWidth: 0,\n});\n\nconst SectionHeader = styled(Typography)(({ theme }) => ({\n fontSize: 'var(--nav-subheader-font-size)',\n fontWeight: 'var(--nav-subheader-font-weight)',\n color: theme.palette.text.disabled,\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n marginBottom: 12,\n}));\n\nconst SubItemLink = styled(Link, {\n shouldForwardProp: (prop) => prop !== 'active',\n})<{ active?: boolean }>(({ theme, active }) => ({\n display: 'block',\n padding: '6px 0',\n fontSize: '0.875rem',\n color: active ? theme.palette.primary.main : theme.palette.text.secondary,\n textDecoration: 'none',\n transition: theme.transitions.create('color', {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n color: theme.palette.text.primary,\n },\n}));\n\nconst TagsContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n marginTop: 16,\n}));\n\nconst Tag = styled(Link)(({ theme }) => ({\n display: 'inline-flex',\n padding: '4px 10px',\n fontSize: '0.75rem',\n fontWeight: 500,\n color: theme.palette.text.secondary,\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n borderRadius: 6,\n textDecoration: 'none',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.grey[500], 0.16),\n color: theme.palette.text.primary,\n },\n}));\n\nconst MoreLink = styled(Link)(({ theme }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n padding: '8px 0',\n fontSize: '0.875rem',\n fontWeight: 600,\n color: theme.palette.primary.main,\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n '&::after': {\n content: '\"→\"',\n marginLeft: 4,\n },\n}));\n\n// =============================================================================\n// MEGA MENU LIST\n// =============================================================================\n\nfunction MegaMenuList({ data, render, slotProps, slots, enabledRootRedirect }: MegaMenuListProps): React.ReactNode {\n const pathname = useNavPathname();\n const anchorRef = useRef<HTMLButtonElement>(null);\n\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n const hasChild = Boolean(data.children?.length || data.tags?.length || data.slides?.length);\n\n const childActive = useMemo(() => {\n if (!data.children?.length) return false;\n return data.children.some((section) => section.items.some((item) => isActiveLink(pathname, item.path)));\n }, [data.children, pathname]);\n\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n if (hasChild) {\n setOpen(true);\n }\n }, [hasChild]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n useEffect(() => {\n handleClose();\n }, [pathname, handleClose]);\n\n // Resolve icon\n const icon = typeof data.icon === 'string' && render?.navIcon ? render.navIcon[data.icon] : data.icon;\n\n return (\n <NavLi className={megaMenuClasses.li}>\n <NavButton\n ref={anchorRef}\n className={cn(\n megaMenuClasses.item,\n (isActive || childActive) && megaMenuClasses.active,\n open && megaMenuClasses.open\n )}\n active={isActive || childActive}\n open={open}\n disabled={data.disabled}\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n >\n {icon && <IconWrapper className={megaMenuClasses.icon}>{icon}</IconWrapper>}\n <span className={megaMenuClasses.title}>{data.title}</span>\n {hasChild && <ArrowIcon open={open} className={megaMenuClasses.arrow} />}\n </NavButton>\n\n {hasChild && (\n <Popover\n open={open}\n anchorEl={anchorRef.current}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n onMouseEnter: handleOpen,\n onMouseLeave: handleClose,\n sx: {\n pointerEvents: 'auto',\n ...slotProps?.dropdown,\n },\n },\n }}\n sx={{\n pointerEvents: 'none',\n }}\n disableRestoreFocus\n >\n {slots?.topArea}\n\n <DropdownContent elevation={0} className={megaMenuClasses.dropdown}>\n {/* Child sections */}\n {data.children?.map((section, idx) => (\n <SectionColumn key={section.subheader ?? idx}>\n {section.subheader && (\n <SectionHeader className={megaMenuClasses.subheader}>{section.subheader}</SectionHeader>\n )}\n <Stack spacing={0.5}>\n {section.items.map((item) => {\n const itemActive = isActiveLink(pathname, item.path);\n const isExternal = isExternalLink(item.path);\n\n return (\n <SubItemLink\n key={item.title}\n href={item.path}\n active={itemActive}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n className={cn(megaMenuClasses.subItem, itemActive && megaMenuClasses.active)}\n sx={slotProps?.subItem}\n >\n {item.title}\n </SubItemLink>\n );\n })}\n </Stack>\n\n {/* More link at bottom of section */}\n {idx === 0 && data.moreLink && (\n <Box sx={{ mt: 2 }}>\n <MoreLink href={data.moreLink.path} className={megaMenuClasses.moreLink} sx={slotProps?.moreLink}>\n {data.moreLink.title}\n </MoreLink>\n </Box>\n )}\n </SectionColumn>\n ))}\n </DropdownContent>\n\n {/* Tags */}\n {data.tags && data.tags.length > 0 && (\n <Box sx={{ px: 'var(--nav-dropdown-padding)', pb: 'var(--nav-dropdown-padding)' }}>\n <TagsContainer className={megaMenuClasses.tags} sx={slotProps?.tags}>\n {data.tags.map((tag) => (\n <Tag key={tag.title} href={tag.path}>\n {tag.title}\n </Tag>\n ))}\n </TagsContainer>\n </Box>\n )}\n\n {slots?.bottomArea}\n </Popover>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// MEGA MENU HORIZONTAL\n// =============================================================================\n\n/**\n * MegaMenuHorizontal - Rich dropdown navigation for header layouts.\n *\n * @example\n * ```tsx\n * const menuData = [\n * {\n * title: 'Products',\n * path: '/products',\n * icon: <ProductsIcon />,\n * children: [\n * {\n * subheader: 'Categories',\n * items: [\n * { title: 'Electronics', path: '/products/electronics' },\n * { title: 'Clothing', path: '/products/clothing' },\n * ],\n * },\n * {\n * subheader: 'Featured',\n * items: [\n * { title: 'New Arrivals', path: '/products/new' },\n * { title: 'Best Sellers', path: '/products/best' },\n * ],\n * },\n * ],\n * tags: [\n * { title: 'Sale', path: '/products?filter=sale' },\n * { title: 'Trending', path: '/products?filter=trending' },\n * ],\n * moreLink: { title: 'View All Products', path: '/products' },\n * },\n * { title: 'About', path: '/about' },\n * ];\n *\n * <MegaMenuHorizontal data={menuData} />\n * ```\n */\nexport function MegaMenuHorizontal({\n sx,\n data,\n render,\n slotProps,\n slots,\n className,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: MegaMenuProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...megaMenuCssVars(theme, 'horizontal'), ...overridesVars };\n\n return (\n <Nav\n className={cn(megaMenuClasses.root, megaMenuClasses.horizontal, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl className={megaMenuClasses.ul} sx={{ gap: 'var(--nav-item-gap)' }}>\n {data.map((item) => (\n <MegaMenuList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n slots={slots}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\n/**\n * Vertical Mega Menu\n *\n * Rich dropdown navigation for sidebar layouts.\n *\n * @module components/mega-menu\n */\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport Box from '@mui/material/Box';\nimport { useNavPathname } from '../nav-section/nav-context.js';\nimport Link from '@mui/material/Link';\nimport Paper from '@mui/material/Paper';\nimport Popover from '@mui/material/Popover';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { styled, useTheme } from '@mui/material/styles';\n\nimport type { MegaMenuProps, MegaMenuListProps } from './types.js';\nimport { megaMenuClasses, megaMenuCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink, isExternalLink } from '../../utils/url.js';\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst Nav = styled('nav')({\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n});\n\nconst NavUl = styled('ul')({\n display: 'flex',\n flexDirection: 'column',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n});\n\nconst NavLi = styled('li')({\n display: 'flex',\n flexDirection: 'column',\n});\n\nconst NavButton = styled('button')<{ active?: boolean; open?: boolean }>(({ theme, active, open }) => ({\n all: 'unset',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n padding: 'var(--nav-item-padding)',\n minHeight: 'var(--nav-item-min-height)',\n borderRadius: 'var(--nav-item-radius)',\n fontSize: 'var(--nav-item-font-size)',\n fontWeight: 500,\n color: 'var(--nav-item-color)',\n backgroundColor: 'var(--nav-item-bg)',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n },\n ...(active && {\n backgroundColor: 'var(--nav-item-active-bg)',\n color: 'var(--nav-item-active-color)',\n }),\n ...(open && {\n backgroundColor: 'var(--nav-item-hover-bg)',\n }),\n '&:disabled': {\n color: 'var(--nav-item-disabled-color)',\n cursor: 'not-allowed',\n },\n}));\n\nconst IconWrapper = styled('span')({\n width: 'var(--nav-icon-size)',\n height: 'var(--nav-icon-size)',\n marginRight: 12,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--nav-icon-color)',\n '& svg': {\n width: '100%',\n height: '100%',\n },\n});\n\nconst ArrowIcon = styled('span')<{ open?: boolean }>(({ open }) => ({\n marginLeft: 'auto',\n width: 16,\n height: 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n '&::before': {\n content: '\"\"',\n width: 5,\n height: 5,\n borderStyle: 'solid',\n borderWidth: '0 1.5px 1.5px 0',\n borderColor: 'currentColor',\n transform: 'rotate(-45deg)',\n },\n}));\n\nconst DropdownContent = styled(Paper)(({ theme }) => ({\n width: 'var(--nav-dropdown-width)',\n maxHeight: 'var(--nav-dropdown-max-height)',\n borderRadius: 'var(--nav-dropdown-radius)',\n padding: 'var(--nav-dropdown-padding)',\n overflow: 'auto',\n}));\n\nconst SectionHeader = styled(Typography)(({ theme }) => ({\n fontSize: 'var(--nav-subheader-font-size)',\n fontWeight: 'var(--nav-subheader-font-weight)',\n color: theme.palette.text.disabled,\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n marginBottom: 8,\n marginTop: 16,\n // `:first-child` — homogeneous list of subheaders; child-position\n // selector is equivalent to of-type but doesn't tie correctness\n // to tag-name uniqueness.\n '&:first-child': {\n marginTop: 0,\n },\n}));\n\nconst SubItemLink = styled(Link, {\n shouldForwardProp: (prop) => prop !== 'active',\n})<{ active?: boolean }>(({ theme, active }) => ({\n display: 'block',\n padding: '6px 0',\n fontSize: '0.875rem',\n color: active ? theme.palette.primary.main : theme.palette.text.secondary,\n textDecoration: 'none',\n transition: theme.transitions.create('color', {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n color: theme.palette.text.primary,\n },\n}));\n\n// =============================================================================\n// MEGA MENU LIST\n// =============================================================================\n\nfunction MegaMenuList({ data, render, slotProps, slots, enabledRootRedirect }: MegaMenuListProps): React.ReactNode {\n const pathname = useNavPathname();\n const anchorRef = useRef<HTMLButtonElement>(null);\n\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n const hasChild = Boolean(data.children?.length);\n\n const childActive = useMemo(() => {\n if (!data.children?.length) return false;\n return data.children.some((section) => section.items.some((item) => isActiveLink(pathname, item.path)));\n }, [data.children, pathname]);\n\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n if (hasChild) {\n setOpen(true);\n }\n }, [hasChild]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n useEffect(() => {\n handleClose();\n }, [pathname, handleClose]);\n\n // Resolve icon\n const icon = typeof data.icon === 'string' && render?.navIcon ? render.navIcon[data.icon] : data.icon;\n\n return (\n <NavLi className={megaMenuClasses.li}>\n <NavButton\n ref={anchorRef}\n className={cn(\n megaMenuClasses.item,\n (isActive || childActive) && megaMenuClasses.active,\n open && megaMenuClasses.open\n )}\n active={isActive || childActive}\n open={open}\n disabled={data.disabled}\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n >\n {icon && <IconWrapper className={megaMenuClasses.icon}>{icon}</IconWrapper>}\n <span className={megaMenuClasses.title}>{data.title}</span>\n {hasChild && <ArrowIcon open={open} className={megaMenuClasses.arrow} />}\n </NavButton>\n\n {hasChild && (\n <Popover\n open={open}\n anchorEl={anchorRef.current}\n anchorOrigin={{\n vertical: 'center',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'center',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n onMouseEnter: handleOpen,\n onMouseLeave: handleClose,\n sx: {\n pointerEvents: 'auto',\n ml: 1,\n ...slotProps?.dropdown,\n },\n },\n }}\n sx={{\n pointerEvents: 'none',\n }}\n disableRestoreFocus\n >\n {slots?.topArea}\n\n <DropdownContent elevation={0} className={megaMenuClasses.dropdown}>\n {data.children?.map((section, idx) => (\n <Box key={section.subheader ?? idx}>\n {section.subheader && (\n <SectionHeader className={megaMenuClasses.subheader}>{section.subheader}</SectionHeader>\n )}\n <Stack spacing={0.5}>\n {section.items.map((item) => {\n const itemActive = isActiveLink(pathname, item.path);\n const isExternal = isExternalLink(item.path);\n\n return (\n <SubItemLink\n key={item.title}\n href={item.path}\n active={itemActive}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n className={cn(megaMenuClasses.subItem, itemActive && megaMenuClasses.active)}\n sx={slotProps?.subItem}\n >\n {item.title}\n </SubItemLink>\n );\n })}\n </Stack>\n </Box>\n ))}\n </DropdownContent>\n\n {slots?.bottomArea}\n </Popover>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// MEGA MENU VERTICAL\n// =============================================================================\n\n/**\n * MegaMenuVertical - Rich dropdown navigation for sidebar layouts.\n *\n * @example\n * ```tsx\n * const menuData = [\n * {\n * title: 'Products',\n * path: '/products',\n * icon: <ProductsIcon />,\n * children: [\n * {\n * subheader: 'Categories',\n * items: [\n * { title: 'Electronics', path: '/products/electronics' },\n * { title: 'Clothing', path: '/products/clothing' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <MegaMenuVertical data={menuData} />\n * ```\n */\nexport function MegaMenuVertical({\n sx,\n data,\n render,\n slotProps,\n slots,\n className,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: MegaMenuProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...megaMenuCssVars(theme, 'vertical'), ...overridesVars };\n\n return (\n <Nav\n className={cn(megaMenuClasses.root, megaMenuClasses.vertical, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl className={megaMenuClasses.ul} sx={{ gap: 'var(--nav-item-gap)' }}>\n {data.map((item) => (\n <MegaMenuList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n slots={slots}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\n/**\n * Mobile Mega Menu\n *\n * Accordion-style navigation for mobile layouts.\n *\n * @module components/mega-menu\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport Box from '@mui/material/Box';\nimport { useNavPathname } from '../nav-section/nav-context.js';\nimport Link from '@mui/material/Link';\nimport Collapse from '@mui/material/Collapse';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { styled, useTheme, type Theme } from '@mui/material/styles';\n\nimport type { MegaMenuProps, MegaMenuListProps } from './types.js';\nimport { megaMenuClasses, megaMenuCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink, isExternalLink } from '../../utils/url.js';\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst Nav = styled('nav')({\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n width: '100%',\n});\n\nconst NavUl = styled('ul')({\n display: 'flex',\n flexDirection: 'column',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n width: '100%',\n});\n\nconst NavLi = styled('li')({\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n});\n\nconst navItemStyles = (theme: Theme, active?: boolean) => ({\n all: 'unset' as const,\n boxSizing: 'border-box' as const,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n padding: 'var(--nav-item-padding)',\n minHeight: 'var(--nav-item-min-height)',\n fontSize: 'var(--nav-item-font-size)',\n fontWeight: 500,\n color: 'var(--nav-item-color)',\n borderBottom: `1px solid ${theme.palette.divider}`,\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n },\n ...(active && {\n color: 'var(--nav-item-active-color)',\n }),\n});\n\nconst NavButton = styled('button')<{ active?: boolean; open?: boolean }>(({ theme, active }) => ({\n ...navItemStyles(theme, active),\n '&:disabled': {\n color: 'var(--nav-item-disabled-color)',\n cursor: 'not-allowed',\n },\n}));\n\nconst NavLink = styled('a')<{ active?: boolean }>(({ theme, active }) => navItemStyles(theme, active));\n\nconst IconWrapper = styled('span')({\n width: 'var(--nav-icon-size)',\n height: 'var(--nav-icon-size)',\n marginRight: 12,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--nav-icon-color)',\n '& svg': {\n width: '100%',\n height: '100%',\n },\n});\n\nconst ArrowIcon = styled('span')<{ open?: boolean }>(({ open }) => ({\n marginLeft: 'auto',\n width: 20,\n height: 20,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n '&::before': {\n content: '\"\"',\n width: 6,\n height: 6,\n borderStyle: 'solid',\n borderWidth: '0 0 2px 2px',\n borderColor: 'currentColor',\n transform: 'rotate(-45deg)',\n },\n}));\n\nconst CollapseContent = styled(Box)(({ theme }) => ({\n padding: '8px 0',\n paddingLeft: 40,\n backgroundColor: theme.palette.background.neutral,\n}));\n\nconst SectionHeader = styled(Typography)(({ theme }) => ({\n fontSize: 'var(--nav-subheader-font-size)',\n fontWeight: 'var(--nav-subheader-font-weight)',\n color: theme.palette.text.disabled,\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n padding: '12px 16px 8px',\n}));\n\nconst SubItemLink = styled(Link, {\n shouldForwardProp: (prop) => prop !== 'active',\n})<{ active?: boolean }>(({ theme, active }) => ({\n display: 'block',\n padding: '10px 16px',\n fontSize: '0.875rem',\n color: active ? theme.palette.primary.main : theme.palette.text.secondary,\n textDecoration: 'none',\n transition: theme.transitions.create('color', {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n color: theme.palette.text.primary,\n },\n}));\n\n// =============================================================================\n// MEGA MENU LIST\n// =============================================================================\n\nfunction MegaMenuList({ data, render, slotProps, enabledRootRedirect }: MegaMenuListProps): React.ReactNode {\n const pathname = useNavPathname();\n\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n const hasChild = Boolean(data.children?.length);\n\n const childActive = useMemo(() => {\n if (!data.children?.length) return false;\n return data.children.some((section) => section.items.some((item) => isActiveLink(pathname, item.path)));\n }, [data.children, pathname]);\n\n // Start open if child is active\n const [open, setOpen] = useState(childActive);\n\n const handleToggle = useCallback(() => {\n if (hasChild) {\n setOpen((prev) => !prev);\n }\n }, [hasChild]);\n\n // Resolve icon\n const icon = typeof data.icon === 'string' && render?.navIcon ? render.navIcon[data.icon] : data.icon;\n\n // Simple link for items without children\n if (!hasChild) {\n const isExternal = isExternalLink(data.path);\n return (\n <NavLi className={megaMenuClasses.li}>\n <NavLink\n href={data.path}\n className={cn(megaMenuClasses.item, isActive && megaMenuClasses.active)}\n active={isActive}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n >\n {icon && <IconWrapper className={megaMenuClasses.icon}>{icon}</IconWrapper>}\n <span className={megaMenuClasses.title}>{data.title}</span>\n </NavLink>\n </NavLi>\n );\n }\n\n return (\n <NavLi className={megaMenuClasses.li}>\n <NavButton\n className={cn(\n megaMenuClasses.item,\n (isActive || childActive) && megaMenuClasses.active,\n open && megaMenuClasses.open\n )}\n active={isActive || childActive}\n open={open}\n disabled={data.disabled}\n onClick={handleToggle}\n >\n {icon && <IconWrapper className={megaMenuClasses.icon}>{icon}</IconWrapper>}\n <span className={megaMenuClasses.title}>{data.title}</span>\n <ArrowIcon open={open} className={megaMenuClasses.arrow} />\n </NavButton>\n\n <Collapse in={open} unmountOnExit>\n <CollapseContent>\n {data.children?.map((section, idx) => (\n <Box key={section.subheader ?? idx}>\n {section.subheader && (\n <SectionHeader className={megaMenuClasses.subheader}>{section.subheader}</SectionHeader>\n )}\n <Stack>\n {section.items.map((item) => {\n const itemActive = isActiveLink(pathname, item.path);\n const isExternal = isExternalLink(item.path);\n\n return (\n <SubItemLink\n key={item.title}\n href={item.path}\n active={itemActive}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n className={cn(megaMenuClasses.subItem, itemActive && megaMenuClasses.active)}\n sx={slotProps?.subItem}\n >\n {item.title}\n </SubItemLink>\n );\n })}\n </Stack>\n </Box>\n ))}\n </CollapseContent>\n </Collapse>\n </NavLi>\n );\n}\n\n// =============================================================================\n// MEGA MENU MOBILE\n// =============================================================================\n\n/**\n * MegaMenuMobile - Accordion-style navigation for mobile layouts.\n *\n * @example\n * ```tsx\n * const menuData = [\n * {\n * title: 'Products',\n * path: '/products',\n * icon: <ProductsIcon />,\n * children: [\n * {\n * subheader: 'Categories',\n * items: [\n * { title: 'Electronics', path: '/products/electronics' },\n * { title: 'Clothing', path: '/products/clothing' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <MegaMenuMobile data={menuData} />\n * ```\n */\nexport function MegaMenuMobile({\n sx,\n data,\n render,\n slotProps,\n className,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: MegaMenuProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...megaMenuCssVars(theme, 'mobile'), ...overridesVars };\n\n return (\n <Nav\n className={cn(megaMenuClasses.root, megaMenuClasses.mobile, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl className={megaMenuClasses.ul}>\n {data.map((item) => (\n <MegaMenuList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","/**\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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nexport { remarkSpoiler };\n","'use client';\n\nimport './code-highlight.css';\n\nimport type { Options } from 'react-markdown';\nimport { useId, useMemo } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeSanitize, { defaultSchema } from 'rehype-sanitize';\nimport rehypeHighlight from 'rehype-highlight';\nimport remarkGfm from 'remark-gfm';\n\nimport Link from '@mui/material/Link';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { ContentRoot } from './styles.js';\nimport { contentClasses } from './classes.js';\nimport { htmlToMarkdown, isMarkdownContent } from './html-to-markdown.js';\nimport { remarkSpoiler } from './remark-spoiler.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MarkdownProps = {\n /** Markdown or HTML string content */\n children: string;\n /** Additional CSS class */\n className?: string;\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Compact mode for chat messages, comments, etc. */\n compact?: boolean;\n /** Custom react-markdown component overrides */\n components?: Options['components'];\n /** Additional rehype plugins */\n rehypePlugins?: Options['rehypePlugins'];\n /** Additional remark plugins */\n remarkPlugins?: Options['remarkPlugins'];\n /** Link component for internal navigation (e.g. react-router Link) */\n routerLinkComponent?: React.ElementType;\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isExternalLink(href: string): boolean {\n return /^https?:\\/\\//.test(href) || href.startsWith('//');\n}\n\n// ---------------------------------------------------------------------------\n// Default plugins\n// ---------------------------------------------------------------------------\n\n// T#347 — XSS hardening: the spoiler remark plugin emits raw HTML\n// (`<span class=\"…\">…</span>`) which rehype-raw then re-parses into the\n// DOM tree. Without rehype-sanitize, ANY raw HTML the user types into\n// markdown (`<img src=x onerror=alert(...)>`) would also pass through —\n// catastrophic under cookie-mode auth because the inline script runs\n// in the portal origin with access to the non-HttpOnly CSRF cookie.\n//\n// We extend hast-util-sanitize's defaultSchema (which already strips\n// <script>, on* handlers, javascript:/data: URIs, etc.) to allow the\n// one tag the spoiler plugin emits: `<span class=\"<spoiler-class>\">`.\n// Order matters: rehypeRaw → rehypeSanitize → rehypeHighlight, so the\n// sanitizer sees the fully-expanded tree before highlighting decorates\n// trusted code-fence children with extra <span class=\"hljs-…\"> wrappers.\nconst SAFE_CLASS_RE = /^(prism-content__[a-z0-9_-]+|hljs(-[a-z0-9-]+)?|language-[a-z0-9+#-]+)$/i;\nconst spoilerSanitizeSchema = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n span: [...(defaultSchema.attributes?.['span'] ?? []), ['className', SAFE_CLASS_RE]],\n code: [...(defaultSchema.attributes?.['code'] ?? []), ['className', SAFE_CLASS_RE]],\n div: [...(defaultSchema.attributes?.['div'] ?? []), ['className', SAFE_CLASS_RE]],\n },\n};\n\nconst defaultRehypePlugins: NonNullable<Options['rehypePlugins']> = [\n rehypeRaw,\n [rehypeSanitize, spoilerSanitizeSchema],\n rehypeHighlight,\n];\n\nconst defaultRemarkPlugins: NonNullable<Options['remarkPlugins']> = [\n [remarkGfm, { singleTilde: false }],\n remarkSpoiler,\n];\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function Markdown({\n children,\n className,\n sx,\n compact,\n components,\n rehypePlugins,\n remarkPlugins,\n routerLinkComponent,\n}: MarkdownProps) {\n const content = useMemo(() => {\n const cleaned = String(children).trim();\n return isMarkdownContent(cleaned) ? cleaned : htmlToMarkdown(cleaned);\n }, [children]);\n\n const allRehypePlugins = useMemo(() => [...defaultRehypePlugins, ...(rehypePlugins ?? [])], [rehypePlugins]);\n\n const allRemarkPlugins = useMemo(() => [...defaultRemarkPlugins, ...(remarkPlugins ?? [])], [remarkPlugins]);\n\n const defaultComponents = useMemo(\n (): NonNullable<Options['components']> => ({\n img: ({ node: _n, ...other }) => <img className={contentClasses.image} {...other} />,\n a: ({ href = '', children: linkChildren, node: _n, ...other }) => {\n if (isExternalLink(href)) {\n return (\n <Link href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={contentClasses.link} {...other}>\n {linkChildren}\n </Link>\n );\n }\n if (routerLinkComponent) {\n return (\n <Link component={routerLinkComponent} href={href} className={contentClasses.link} {...other}>\n {linkChildren}\n </Link>\n );\n }\n return (\n <Link href={href} className={contentClasses.link} {...other}>\n {linkChildren}\n </Link>\n );\n },\n pre: ({ children: preChildren }) => (\n <div className={contentClasses.codeBlock}>\n <pre>{preChildren}</pre>\n </div>\n ),\n code: ({ className: codeClassName = '', children: codeChildren, node: _n, ...other }) => {\n const hasLanguage = /language-\\w+/.test(codeClassName);\n return (\n <code className={hasLanguage ? codeClassName : contentClasses.codeInline} {...other}>\n {codeChildren}\n </code>\n );\n },\n input: ({ type, node: _n, ...other }) =>\n type === 'checkbox' ? (\n <CheckboxInput className={contentClasses.checkbox} {...other} />\n ) : (\n <input type={type} {...other} />\n ),\n }),\n [routerLinkComponent]\n );\n\n return (\n <ContentRoot\n className={[contentClasses.root, contentClasses.markdown, compact && contentClasses.compact, className]\n .filter(Boolean)\n .join(' ')}\n sx={sx}\n >\n <ReactMarkdown\n components={{ ...defaultComponents, ...components }}\n rehypePlugins={allRehypePlugins}\n remarkPlugins={allRemarkPlugins}\n >\n {content}\n </ReactMarkdown>\n </ContentRoot>\n );\n}\n\nfunction CheckboxInput(props: React.ComponentProps<'input'>) {\n const uniqueId = useId();\n return <input type=\"checkbox\" id={uniqueId} {...props} />;\n}\n","'use client';\n\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport type { Options } from 'react-markdown';\n\nimport { TipTapRenderer } from '../tiptap-renderer/tiptap-renderer.js';\nimport type { TipTapDoc } from '../tiptap-renderer/tiptap-renderer.js';\nimport { Markdown } from './markdown.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Content can be:\n * - TipTap JSON document (object with `type: 'doc'` and `content` array)\n * - Markdown string\n * - HTML string (auto-converted to markdown)\n * - null/undefined (renders nothing)\n */\nexport type ContentValue = TipTapDoc | Record<string, unknown> | string | null | undefined;\n\nexport interface ContentRendererProps {\n /** The content to render — TipTap JSON, markdown string, or HTML string */\n content: ContentValue;\n /** Additional CSS class */\n className?: string;\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Compact mode for chat messages, comments, etc. */\n compact?: boolean;\n /** Custom react-markdown component overrides (only applies to markdown/HTML content) */\n markdownComponents?: Options['components'];\n /** Link component for internal navigation (e.g. react-router Link) */\n routerLinkComponent?: React.ElementType;\n}\n\n// ---------------------------------------------------------------------------\n// Detection\n// ---------------------------------------------------------------------------\n\nfunction isTipTapDoc(value: unknown): value is TipTapDoc {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as any).type === 'doc' &&\n 'content' in value &&\n Array.isArray((value as any).content)\n );\n}\n\n/**\n * Detect a string that is a JSON-serialised TipTap doc. The\n * comments composer saves the editor state via `editor.getJSON()`\n * then `JSON.stringify(...)`; without this hop the string ends\n * up in the markdown branch and the page prints the raw JSON\n * literal (`{\"type\":\"doc\",\"content\":[...]}`) instead of the\n * formatted comment body. Cheap-first check on the prefix so we\n * don't `JSON.parse` every markdown comment.\n */\nfunction tryParseTipTapJson(value: string): TipTapDoc | null {\n const trimmed = value.trimStart();\n if (!trimmed.startsWith('{')) return null;\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return isTipTapDoc(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Unified content renderer that auto-detects the content format and delegates\n * to the appropriate renderer:\n *\n * - **TipTap JSON** → TipTapRenderer (recursive node-to-HTML mapping)\n * - **Markdown / HTML string** → Markdown (react-markdown with rehype-highlight)\n *\n * Both renderers share the same styled container (`ContentRoot`) ensuring\n * consistent typography, code highlighting, table styling, and dark mode support.\n */\nexport function ContentRenderer({\n content,\n className,\n sx,\n compact,\n markdownComponents,\n routerLinkComponent,\n}: ContentRendererProps) {\n if (content == null) return null;\n\n // TipTap JSON document\n if (typeof content === 'object') {\n if (isTipTapDoc(content)) {\n return <TipTapRenderer content={content} className={className} sx={sx} compact={compact} />;\n }\n // Unknown object — try as TipTap anyway\n return <TipTapRenderer content={content as any} className={className} sx={sx} compact={compact} />;\n }\n\n // String content — TipTap-JSON / markdown / HTML\n if (typeof content === 'string') {\n if (!content.trim()) return null;\n // Comments composer persists TipTap state as `JSON.stringify\n // (editor.getJSON())`, so string-typed content may actually\n // be a serialised TipTap doc. Try the JSON path first;\n // markdown is the fallback for plain text.\n const docFromJson = tryParseTipTapJson(content);\n if (docFromJson) {\n return <TipTapRenderer content={docFromJson} className={className} sx={sx} compact={compact} />;\n }\n return (\n <Markdown\n className={className}\n sx={sx}\n compact={compact}\n components={markdownComponents}\n routerLinkComponent={routerLinkComponent}\n >\n {content}\n </Markdown>\n );\n }\n\n return null;\n}\n","'use client';\n\n/**\n * DurationPicker — Compact duration selector with presets and custom input.\n *\n * Designed for moderation actions (ban/mute) in dialogs or menus.\n * Value is in seconds; `null` represents permanent/indefinite duration.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport Box from '@mui/material/Box';\nimport MenuItem from '@mui/material/MenuItem';\nimport Select from '@mui/material/Select';\nimport TextField from '@mui/material/TextField';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport Typography from '@mui/material/Typography';\nimport { alpha, useTheme } from '@mui/material/styles';\n\nimport type { SelectChangeEvent } from '@mui/material/Select';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst HOUR = 3600;\nconst DAY = 86400;\nconst WEEK = 604800;\n\ntype TimeUnit = 'hours' | 'days' | 'weeks';\n\ninterface Preset {\n label: string;\n value: number | null; // seconds, null = permanent\n key: string;\n}\n\nconst PRESETS: Preset[] = [\n { label: '1h', value: HOUR, key: '1h' },\n { label: '6h', value: 6 * HOUR, key: '6h' },\n { label: '1d', value: DAY, key: '1d' },\n { label: '7d', value: 7 * DAY, key: '7d' },\n { label: '30d', value: 30 * DAY, key: '30d' },\n { label: '\\u221E', value: null, key: 'permanent' },\n];\n\nconst UNIT_SECONDS: Record<TimeUnit, number> = {\n hours: HOUR,\n days: DAY,\n weeks: WEEK,\n};\n\nconst CUSTOM_KEY = 'custom';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DurationPickerLabels {\n /** Title label. @default 'Duration' */\n title?: string;\n /** Custom button label. @default 'Custom' */\n custom?: string;\n /** Time unit labels. */\n hours?: string;\n days?: string;\n weeks?: string;\n}\n\nexport interface DurationPickerProps {\n /** Duration in seconds. `null` = permanent/indefinite. */\n value: number | null;\n /** Called when duration changes. */\n onChange: (seconds: number | null) => void;\n /** Component size. @default 'small' */\n size?: 'small' | 'medium';\n /** Disable all interactions. */\n disabled?: boolean;\n /** Override default English labels for i18n. */\n labels?: DurationPickerLabels;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Find which preset key matches the current value, or 'custom' if none. */\nfunction resolveActiveKey(value: number | null): string {\n const match = PRESETS.find((p) => p.value === value);\n return match ? match.key : CUSTOM_KEY;\n}\n\n/** Decompose seconds into a human-friendly { amount, unit } pair. */\nfunction decomposeSeconds(seconds: number): { amount: number; unit: TimeUnit } {\n if (seconds > 0 && seconds % WEEK === 0) return { amount: seconds / WEEK, unit: 'weeks' };\n if (seconds > 0 && seconds % DAY === 0) return { amount: seconds / DAY, unit: 'days' };\n return { amount: Math.max(1, Math.round(seconds / HOUR)), unit: 'hours' };\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function DurationPicker({ value, onChange, size = 'small', disabled = false, labels }: DurationPickerProps) {\n const theme = useTheme();\n\n const presetKey = useMemo(() => resolveActiveKey(value), [value]);\n\n /**\n * Whether the operator chose \"Custom\", as opposed to landing on a value\n * that happens not to match a preset.\n *\n * It has to be remembered rather than derived, because the two are not the\n * same question and the value cannot answer the first one. Deriving it made\n * the Custom button unusable in its default state: clicking it emitted\n * 1 hour, 1 hour IS the `1h` preset, so the very next render resolved the\n * mode back to `1h` and the custom row never appeared. The same collision\n * swallowed \"24 hours\", \"1 week\" and \"7 days\".\n */\n const [customChosen, setCustomChosen] = useState(() => presetKey === CUSTOM_KEY);\n\n // A value outside every preset is custom whoever set it — including a\n // parent that set it directly.\n const activeKey = customChosen || presetKey === CUSTOM_KEY ? CUSTOM_KEY : presetKey;\n\n // Local state for custom input — only used when custom is active\n const [customAmount, setCustomAmount] = useState<number>(() => {\n if (activeKey === CUSTOM_KEY && value !== null && value > 0) {\n return decomposeSeconds(value).amount;\n }\n return 1;\n });\n const [customUnit, setCustomUnit] = useState<TimeUnit>(() => {\n if (activeKey === CUSTOM_KEY && value !== null && value > 0) {\n return decomposeSeconds(value).unit;\n }\n return 'hours';\n });\n\n /**\n * What the amount field currently shows, which is not always a number.\n *\n * Deriving the field's contents from the numeric amount meant an empty\n * field was impossible: clearing it parsed as NaN, fell back to 1, and\n * re-rendered as \"1\" — so typing \"3\" produced \"13\" and typing \"24\"\n * produced \"124\". Replacing the amount required selecting it first, which\n * nothing tells the operator to do. The text is held separately so the\n * field can be transiently empty; only a positive number is emitted.\n */\n const [customText, setCustomText] = useState<string>(() => String(customAmount));\n\n const isCustom = activeKey === CUSTOM_KEY;\n\n // ------- Handlers -------\n\n const handlePresetChange = useCallback(\n (_: React.MouseEvent<HTMLElement>, newKey: string | null) => {\n if (newKey === null) return; // MUI fires null on deselect — ignore\n if (newKey === CUSTOM_KEY) {\n // Switch to custom — emit current custom values\n setCustomChosen(true);\n onChange(customAmount * UNIT_SECONDS[customUnit]);\n return;\n }\n const preset = PRESETS.find((p) => p.key === newKey);\n if (preset) {\n setCustomChosen(false);\n onChange(preset.value);\n }\n },\n [onChange, customAmount, customUnit]\n );\n\n const handleCustomAmountChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const text = e.target.value;\n setCustomText(text);\n\n const parsed = parseInt(text, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) return; // not a duration yet\n setCustomAmount(parsed);\n onChange(parsed * UNIT_SECONDS[customUnit]);\n },\n [onChange, customUnit]\n );\n\n /** Put a readable number back once the operator leaves an empty field. */\n const handleCustomAmountBlur = useCallback(() => {\n setCustomText(String(customAmount));\n }, [customAmount]);\n\n const handleCustomUnitChange = useCallback(\n (e: SelectChangeEvent<TimeUnit>) => {\n const unit = e.target.value as TimeUnit;\n setCustomUnit(unit);\n onChange(customAmount * UNIT_SECONDS[unit]);\n },\n [onChange, customAmount]\n );\n\n // ------- Styles -------\n\n const toggleSx = {\n '& .MuiToggleButton-root': {\n px: size === 'small' ? 1.25 : 1.75,\n py: size === 'small' ? 0.5 : 0.75,\n fontSize: size === 'small' ? '0.8125rem' : '0.875rem',\n fontWeight: 600,\n lineHeight: 1.5,\n borderColor: alpha(theme.palette.divider, 0.2),\n color: theme.palette.text.secondary,\n textTransform: 'none' as const,\n '&.Mui-selected': {\n color: theme.palette.primary.main,\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: alpha(theme.palette.primary.main, 0.3),\n '&:hover': {\n bgcolor: alpha(theme.palette.primary.main, 0.16),\n },\n },\n '&.Mui-disabled': {\n color: theme.palette.text.disabled,\n },\n },\n };\n\n return (\n <Box>\n <Typography\n variant=\"caption\"\n sx={{\n mb: 0.75,\n display: 'block',\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {labels?.title ?? 'Duration'}\n </Typography>\n\n <ToggleButtonGroup\n exclusive\n value={activeKey}\n onChange={handlePresetChange}\n size={size}\n disabled={disabled}\n sx={{\n ...toggleSx,\n flexWrap: 'wrap',\n gap: 0.5,\n '& .MuiToggleButtonGroup-grouped': {\n border: '1px solid',\n borderRadius: '8px !important',\n borderColor: alpha(theme.palette.divider, 0.2),\n // Position-class selectors replace the deprecated\n // `:not(:first-of-type)` sibling pattern (MUI v9 tags\n // children with firstButton/middleButton/lastButton via\n // ToggleButtonGroupButtonContext). gap:0.5 above means\n // we want INDEPENDENT borders on every button (no\n // overlap/collapse), so restore left border + zero out\n // MUI's default `margin-left: -1px` on middle/last.\n '&.MuiToggleButtonGroup-middleButton, &.MuiToggleButtonGroup-lastButton': {\n borderLeft: '1px solid',\n borderColor: alpha(theme.palette.divider, 0.2),\n marginLeft: 0,\n },\n },\n }}\n >\n {PRESETS.map((preset) => (\n <ToggleButton key={preset.key} value={preset.key}>\n {preset.label}\n </ToggleButton>\n ))}\n <ToggleButton value={CUSTOM_KEY}>{labels?.custom ?? 'Custom'}</ToggleButton>\n </ToggleButtonGroup>\n\n {/* Custom duration input row */}\n {isCustom && (\n <Box\n sx={{\n mt: 1.25,\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n }}\n >\n <TextField\n type=\"number\"\n value={customText}\n onChange={handleCustomAmountChange}\n onBlur={handleCustomAmountBlur}\n disabled={disabled}\n size={size}\n slotProps={{\n htmlInput: { min: 1, max: 9999, style: { textAlign: 'center' } },\n }}\n sx={{ width: 80 }}\n />\n <Select<TimeUnit>\n value={customUnit}\n onChange={handleCustomUnitChange}\n disabled={disabled}\n size={size}\n sx={{ minWidth: 100 }}\n >\n <MenuItem value=\"hours\">{labels?.hours ?? 'hours'}</MenuItem>\n <MenuItem value=\"days\">{labels?.days ?? 'days'}</MenuItem>\n <MenuItem value=\"weeks\">{labels?.weeks ?? 'weeks'}</MenuItem>\n </Select>\n </Box>\n )}\n </Box>\n );\n}\n","'use client';\n\nimport { type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\ninterface ChangelogTimelineProps {\n children: ReactNode;\n sx?: SxProps<Theme>;\n}\n\nexport function ChangelogTimeline({ children, sx }: ChangelogTimelineProps) {\n return (\n <Box\n sx={{\n position: 'relative',\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: { xs: 16, sm: 24 },\n top: 0,\n bottom: 0,\n width: 2,\n bgcolor: 'divider',\n },\n ...(sx as any),\n }}\n >\n {children}\n </Box>\n );\n}\n","'use client';\n\nimport { type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport Typography from '@mui/material/Typography';\nimport Chip from '@mui/material/Chip';\nimport Stack from '@mui/material/Stack';\n\ninterface ChangelogEntryProps {\n version: string;\n date: string;\n badge?: string | null;\n children: ReactNode;\n}\n\nexport function ChangelogEntry({ version, date, badge, children }: ChangelogEntryProps) {\n return (\n <Box sx={{ position: 'relative', pl: { xs: 5, sm: 7 }, pb: 4 }}>\n {/* Timeline dot */}\n <Box\n sx={{\n position: 'absolute',\n left: { xs: 10, sm: 18 },\n top: 8,\n width: 14,\n height: 14,\n borderRadius: '50%',\n bgcolor: 'primary.main',\n border: 3,\n borderColor: 'background.paper',\n zIndex: 1,\n }}\n />\n <Card variant=\"outlined\" sx={{ p: 3 }}>\n <Stack\n direction=\"row\"\n spacing={1.5}\n sx={{\n alignItems: \"center\",\n mb: 2\n }}>\n <Typography variant=\"h6\" sx={{\n fontWeight: 700\n }}>\n {version}\n </Typography>\n {badge && <Chip label={badge} size=\"small\" color=\"primary\" variant=\"soft\" />}\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n ml: 'auto !important'\n }}>\n {date}\n </Typography>\n </Stack>\n\n {children}\n </Card>\n </Box>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/date-range-picker/use-date-range-picker.ts","../src/components/country-select/flag-icon.tsx","../src/components/country-select/country-select.tsx","../src/components/avatar/avatar.tsx","../src/components/badge/badge.tsx","../src/components/sponsored-slot/types.ts","../src/components/sponsored-slot/sponsored-slot.tsx","../src/components/image/image.tsx","../src/components/deadline-chip/deadline-chip.tsx","../src/components/rail/rail.tsx","../src/components/tag-cloud/tag-cloud.tsx","../src/components/svg-color/svg-color.tsx","../src/components/progress/progress.tsx","../src/components/progress/countdown-ring.tsx","../src/components/virtual-list/virtual-list.tsx","../src/components/accordion/accordion.tsx","../src/components/menu/menu.tsx","../src/components/settings/settings-provider.tsx","../src/components/settings/settings-drawer.tsx","../src/components/tooltip/tooltip.tsx","../src/components/nav-card/nav-card.tsx","../src/components/nav-card/nav-card-grid.tsx","../src/components/drawer/drawer.tsx","../src/components/lightbox/types.ts","../src/components/lightbox/classes.ts","../src/components/lightbox/lightbox.tsx","../src/components/lightbox/use-lightbox.ts","../src/components/carousel/classes.ts","../src/components/carousel/carousel.tsx","../src/components/carousel/use-carousel.ts","../src/components/nav-section/styles.ts","../src/components/nav-section/components.tsx","../src/utils/url.ts","../src/components/nav-section/nav-item.tsx","../src/components/nav-section/nav-context.tsx","../src/components/nav-section/nav-list.tsx","../src/components/nav-section/nav-section-vertical.tsx","../src/components/nav-section/nav-section-horizontal.tsx","../src/components/nav-section/nav-section-mini.tsx","../src/components/mega-menu/styles.ts","../src/components/mega-menu/mega-menu-horizontal.tsx","../src/components/mega-menu/mega-menu-vertical.tsx","../src/components/mega-menu/mega-menu-mobile.tsx","../src/components/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"],"names":["useState","useCallback","jsx","jsxs","Box","Typography","styled","useMemo","Tooltip","useEffect","IconButton","useTheme","alpha","Stack","Chip","useRef","Divider","MenuItem","ListItemText","Fragment","CloseIcon","MuiTooltip","Card","Drawer","MuiDrawer","CircularProgress","Children","NavArrow","origin","createContext","useContext","Collapse","Popover","Paper","Nav","NavUl","NavLi","IconWrapper","ArrowIcon","NavButton","DropdownContent","SectionHeader","SubItemLink","Link","MegaMenuList","isExternalLink","HOUR","DAY","ToggleButtonGroup","ToggleButton","TextField"],"mappings":"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","file":"chunk-FADV3QAS.js","sourcesContent":["'use client';\n\nimport type { Dayjs } from 'dayjs';\n\nimport { useState, useCallback } from 'react';\nimport dayjs from 'dayjs';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type DateRangeValue = Dayjs | null;\n\nexport interface UseDateRangePickerReturn {\n startDate: DateRangeValue;\n endDate: DateRangeValue;\n onChangeStartDate: (value: DateRangeValue) => void;\n onChangeEndDate: (value: DateRangeValue) => void;\n open: boolean;\n onOpen: () => void;\n onClose: () => void;\n onReset: () => void;\n selected: boolean;\n error: boolean;\n label: string;\n shortLabel: string;\n setStartDate: React.Dispatch<React.SetStateAction<DateRangeValue>>;\n setEndDate: React.Dispatch<React.SetStateAction<DateRangeValue>>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isAfter(start: DateRangeValue, end: DateRangeValue): boolean {\n if (!start || !end) return false;\n return start.isAfter(end);\n}\n\nfunction formatRangeLabel(start: DateRangeValue, end: DateRangeValue, full?: boolean): string {\n if (!start || !end) return '';\n if (!start.isValid() || !end.isValid() || start.isAfter(end)) return '';\n\n if (full) {\n return `${start.format('DD MMM YYYY')} - ${end.format('DD MMM YYYY')}`;\n }\n\n if (start.isSame(end, 'day')) return end.format('DD MMM YYYY');\n if (start.isSame(end, 'month')) return `${start.format('DD')} - ${end.format('DD MMM YYYY')}`;\n if (start.isSame(end, 'year')) return `${start.format('DD MMM')} - ${end.format('DD MMM YYYY')}`;\n return `${start.format('DD MMM YYYY')} - ${end.format('DD MMM YYYY')}`;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useDateRangePicker(\n initialStart: DateRangeValue = null,\n initialEnd: DateRangeValue = null\n): UseDateRangePickerReturn {\n const [open, setOpen] = useState(false);\n const [startDate, setStartDate] = useState<DateRangeValue>(initialStart);\n const [endDate, setEndDate] = useState<DateRangeValue>(initialEnd);\n\n const error = isAfter(startDate, endDate);\n\n const onOpen = useCallback(() => setOpen(true), []);\n const onClose = useCallback(() => setOpen(false), []);\n\n const onChangeStartDate = useCallback((value: DateRangeValue) => {\n setStartDate(value);\n }, []);\n\n const onChangeEndDate = useCallback(\n (value: DateRangeValue) => {\n if (error) setEndDate(null);\n setEndDate(value);\n },\n [error]\n );\n\n const onReset = useCallback(() => {\n setStartDate(null);\n setEndDate(null);\n }, []);\n\n return {\n startDate,\n endDate,\n onChangeStartDate,\n onChangeEndDate,\n open,\n onOpen,\n onClose,\n onReset,\n error,\n selected: !!startDate && !!endDate,\n label: formatRangeLabel(startDate, endDate, true),\n shortLabel: formatRangeLabel(startDate, endDate),\n setStartDate,\n setEndDate,\n };\n}\n\n/**\n * Parse a YYYY-MM-DD string to Dayjs or null.\n */\nexport function parseDateString(value: string | undefined | null): DateRangeValue {\n if (!value) return null;\n const d = dayjs(value);\n return d.isValid() ? d : null;\n}\n\n/**\n * Format a Dayjs value to YYYY-MM-DD string or empty string.\n */\nexport function formatDateString(value: DateRangeValue): string {\n if (!value || !value.isValid()) return '';\n return value.format('YYYY-MM-DD');\n}\n","'use client';\n\n/**\n * FlagIcon — purely visual country-flag wrapper.\n *\n * Asset-free by design. The consumer supplies the SVG / PNG URL via\n * the `src` prop; Prism stays publishable without bundling 250+ flag\n * images. The wrapper handles the chrome — fixed aspect ratio,\n * border-radius variants (rounded / circle / square), graceful\n * fallback when `src` is missing or fails to load (an outlined\n * neutral globe glyph).\n *\n * Usage:\n * <FlagIcon src=\"/assets/countries/ru.svg\" alt=\"Russia\" />\n * <FlagIcon src={getFlagSrc('ru')} shape=\"circle\" size={20} />\n */\n\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\nimport { styled } from '@mui/material/styles';\n\nexport type FlagShape = 'rounded' | 'circle' | 'square';\n\nexport interface FlagIconProps {\n /** Flag image URL. When missing, falls back to a neutral globe glyph. */\n src?: string | null;\n /** Accessible label (country name). Falls back to `code` or empty string. */\n alt?: string;\n /** Optional ISO code — surfaced in the `aria-label` when `alt` isn't provided. */\n code?: string | null;\n /** Visual shape. Default `rounded` (4px radius); `circle` clips to a disc. */\n shape?: FlagShape;\n /**\n * Height in pixels. Width is computed at the 4:3 aspect that\n * matches the bundled SVG set; the wrapper stays square in\n * `circle` mode so the disc isn't squashed.\n */\n size?: number;\n /** Additional className. */\n className?: string;\n}\n\nexport function FlagIcon({\n src,\n alt,\n code,\n shape = 'rounded',\n size = 20,\n className,\n}: FlagIconProps): ReactNode {\n const [errored, setErrored] = useState(false);\n // Circle mode forces a 1:1 frame (otherwise the 4:3 SVG becomes an\n // oval). Other shapes keep the natural aspect ratio.\n const width = shape === 'circle' ? size : Math.round((size * 4) / 3);\n const radius = shape === 'circle' ? '50%' : shape === 'square' ? '0' : '3px';\n const accessibleLabel = alt ?? (code ? code.toUpperCase() : '');\n\n if (!src || errored) {\n return (\n <FlagFallback\n className={className}\n sx={{ width, height: size, borderRadius: radius }}\n aria-label={accessibleLabel || undefined}\n >\n {/* Inline globe glyph — cheaper than a font / emoji,\n renders identically across platforms. */}\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" width=\"60%\" height=\"60%\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M3 12h18M12 3a14 14 0 010 18M12 3a14 14 0 000 18\" />\n </svg>\n </FlagFallback>\n );\n }\n\n return (\n <FlagFrame\n className={className}\n sx={{ width, height: size, borderRadius: radius }}\n >\n <FlagImg\n src={src}\n alt={accessibleLabel}\n loading=\"lazy\"\n onError={() => setErrored(true)}\n />\n </FlagFrame>\n );\n}\n\nconst FlagFrame = styled('span')(({ theme }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n flexShrink: 0,\n // Neutral 1px outline so flags with white edges (e.g. JP, CY) stay\n // legible on light surfaces. Uses an `inset` shadow rather than a\n // border to avoid disturbing the flag's intrinsic size.\n boxShadow: `inset 0 0 0 1px ${theme.palette.divider}`,\n}));\n\nconst FlagImg = styled('img')({\n width: '100%',\n height: '100%',\n display: 'block',\n objectFit: 'cover',\n // Sharpen the rasterised SVG on Hi-DPI; no effect on vector but\n // costs nothing. Pixelated would be wrong for a flag, so the\n // browser default (auto smoothing) wins.\n});\n\nconst FlagFallback = styled('span')(({ theme }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n color: theme.palette.text.disabled,\n backgroundColor:\n theme.palette.mode === 'dark'\n ? theme.palette.action.hover\n : theme.palette.action.selected,\n boxShadow: `inset 0 0 0 1px ${theme.palette.divider}`,\n}));\n","'use client';\n\n/**\n * CountrySelect — minimalist, localised country picker.\n *\n * Asset-free design: the consumer passes a typed `options` array\n * (Prism does not bundle the ISO 3166-1 list) and a `getFlagSrc`\n * resolver (Prism does not bundle 250+ flag SVGs). The portal supplies\n * both from its own `data/countries.ts` + `assets/countries/`, so\n * `@omnitron-dev/prism` stays under its current weight.\n *\n * The picker is Autocomplete-backed:\n * - searchable by the visible label (locale-resolved), the iso2\n * code, AND the alternate-locale name — typing \"Russ\" or \"Рос\"\n * both surface the same row.\n * - keyboard-friendly (arrow keys, Enter, Esc work natively from\n * MUI Autocomplete).\n * - rounded flag in the input adornment so the chosen country\n * reads at a glance even without expanding the dropdown.\n *\n * Value contract: `value` is the lowercase iso2 code (`\"ru\"`, `\"us\"`,\n * …) or `null`. The component never returns the country object —\n * callers look up the rest from their own dictionary if needed,\n * keeping the surface narrow and JSON-serialisable for forms.\n *\n * Usage:\n * <CountrySelect\n * value={form.countryCode}\n * onChange={(iso2) => form.setField('countryCode', iso2)}\n * options={COUNTRIES}\n * getFlagSrc={(iso2) => `/assets/countries/${iso2}.svg`}\n * getOptionLabel={(c) => locale === 'ru' ? c.ru : c.en}\n * label=\"Country\"\n * />\n */\n\nimport type { ReactNode, SyntheticEvent } from 'react';\nimport { useCallback, useMemo } from 'react';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport type { TextFieldProps } from '@mui/material/TextField';\nimport type { AutocompleteProps } from '@mui/material/Autocomplete';\n\nimport { FlagIcon } from './flag-icon';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Generic shape the picker understands. The consumer's full Country\n * type can extend this — we only read what we need.\n *\n * `iso2` MUST be lowercase. Renderers compare and lookup by lowercase\n * throughout the picker; mixing case will quietly desynchronise the\n * selected state from the option list.\n */\nexport interface CountryOption {\n iso2: string;\n en: string;\n ru: string;\n /** Optional extras (iso3, phone, …) the consumer may use elsewhere. */\n [key: string]: unknown;\n}\n\nexport interface CountrySelectProps {\n /** Currently selected ISO 3166-1 alpha-2 code (lowercase) or null. */\n value: string | null;\n /** Called with the new iso2 code (lowercase) or null when cleared. */\n onChange: (iso2: string | null) => void;\n /** Full country list. Consumer owns the data; Prism does not bundle. */\n options: ReadonlyArray<CountryOption>;\n /** Flag URL resolver. Receives lowercase iso2, returns absolute or relative URL. */\n getFlagSrc?: (iso2: string) => string | null | undefined;\n /**\n * Locale-aware label resolver. Defaults to the `en` field.\n * Pass `(c) => locale === 'ru' ? c.ru : c.en` from the host app's\n * i18n hook to render in the active language.\n */\n getOptionLabel?: (c: CountryOption) => string;\n /** Field label (rendered by the underlying TextField). */\n label?: string;\n /** Placeholder text. */\n placeholder?: string;\n /** Helper text below the input. */\n helperText?: ReactNode;\n /** Error state (shows the input red, helperText switches to error.main). */\n error?: boolean;\n /** Disable the field entirely. */\n disabled?: boolean;\n /** Take full width of the container. */\n fullWidth?: boolean;\n /** Compact / dense variant. */\n size?: 'small' | 'medium';\n /** Override the underlying TextField props (variant, sx, slotProps, …). */\n textFieldProps?: Partial<TextFieldProps>;\n /** Forwarded Autocomplete props for niche tweaks (sx, ListboxProps, …). */\n autocompleteProps?: Partial<\n Omit<\n AutocompleteProps<CountryOption, false, false, false>,\n 'value' | 'onChange' | 'options' | 'renderInput' | 'getOptionLabel'\n >\n >;\n /**\n * Sentinel value emitted when the user picks the synthetic\n * \"Worldwide\" row. When set, an extra pinned row appears at the\n * top of the dropdown with a globe icon instead of a flag.\n * Use a value that cannot collide with any ISO 3166-1 alpha-2\n * code (e.g. `'world'` or `'*'`). Defaults to undefined → no row.\n */\n worldwideValue?: string;\n /**\n * Already-localised label for the worldwide row. Consumer pulls\n * this from i18n (e.g. `t('common.worldwide')`). Required when\n * `worldwideValue` is set.\n */\n worldwideLabel?: string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function CountrySelect({\n value,\n onChange,\n options,\n getFlagSrc,\n getOptionLabel,\n label,\n placeholder,\n helperText,\n error,\n disabled,\n fullWidth = true,\n size = 'small',\n textFieldProps,\n autocompleteProps,\n worldwideValue,\n worldwideLabel,\n}: CountrySelectProps): ReactNode {\n // Resolve the visible label per option. Defaults to `en` so the\n // picker still renders something sensible when the host app forgets\n // to pass `getOptionLabel`.\n const label_ = useCallback(\n (c: CountryOption) => {\n // Synthetic worldwide row carries its localised label directly\n // in the `en` field (we mirror it into `ru` too, see below).\n if (worldwideValue && c.iso2 === worldwideValue) {\n return worldwideLabel ?? c.en;\n }\n return getOptionLabel ? getOptionLabel(c) : c.en;\n },\n [getOptionLabel, worldwideValue, worldwideLabel],\n );\n\n // Build the option set. When `worldwideValue` is set, prepend a\n // synthetic row so it sits at the top of the dropdown. We use a\n // pseudo iso2 that the consumer controls (e.g. `'world'`) so it\n // never collides with real ISO codes.\n const optionsWithWorld = useMemo(() => {\n if (!worldwideValue) return options as CountryOption[];\n const synthetic: CountryOption = {\n iso2: worldwideValue,\n en: worldwideLabel ?? 'Worldwide',\n ru: worldwideLabel ?? 'Worldwide',\n };\n return [synthetic, ...options];\n }, [options, worldwideValue, worldwideLabel]);\n\n // Lookup map for O(1) value→option resolution. Recomputed when the\n // `options` reference changes — callers should memoise the array\n // so this map stays stable.\n const byIso2 = useMemo(() => {\n const map = new Map<string, CountryOption>();\n for (const o of optionsWithWorld) map.set(o.iso2.toLowerCase(), o);\n return map;\n }, [optionsWithWorld]);\n\n const selected = value ? byIso2.get(value.toLowerCase()) ?? null : null;\n const isWorld = !!(worldwideValue && selected && selected.iso2 === worldwideValue);\n\n const handleChange = useCallback(\n (_: SyntheticEvent, next: CountryOption | null) => {\n onChange(next ? next.iso2.toLowerCase() : null);\n },\n [onChange],\n );\n\n // Search filter — match against the resolved label, iso2, AND the\n // other-locale name so the user can type \"Russ\" or \"Рос\" and find\n // the same row regardless of the active UI language.\n const filterOptions = useCallback(\n (opts: CountryOption[], state: { inputValue: string }) => {\n const q = state.inputValue.trim().toLowerCase();\n if (!q) return opts;\n return opts.filter((o) => {\n if (o.iso2.toLowerCase().includes(q)) return true;\n if (label_(o).toLowerCase().includes(q)) return true;\n // Cross-locale search: always check both en and ru.\n if (o.en.toLowerCase().includes(q)) return true;\n if (o.ru.toLowerCase().includes(q)) return true;\n return false;\n });\n },\n [label_],\n );\n\n return (\n <Autocomplete<CountryOption, false, false, false>\n value={selected}\n onChange={handleChange}\n options={optionsWithWorld}\n getOptionLabel={label_}\n isOptionEqualToValue={(a, b) => a.iso2.toLowerCase() === b.iso2.toLowerCase()}\n filterOptions={filterOptions}\n disabled={disabled}\n fullWidth={fullWidth}\n size={size}\n autoHighlight\n // Keep popup snappy on long lists — virtualisation would be\n // nicer for >500 rows but 250 ISO countries paint in well\n // under one frame at the default rendering cost.\n renderOption={(props, option) => {\n const { key, ...rest } = props as React.HTMLAttributes<HTMLLIElement> & { key: string };\n const isWorldRow = worldwideValue !== undefined && option.iso2 === worldwideValue;\n const src = isWorldRow ? null : getFlagSrc?.(option.iso2.toLowerCase()) ?? null;\n return (\n <Box\n component=\"li\"\n key={key}\n {...rest}\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1.25,\n px: 1.25,\n py: 0.75,\n // Pin the worldwide row visually with a divider so the\n // user reads it as a separate semantic group.\n ...(isWorldRow && {\n borderBottom: '1px solid',\n borderColor: 'divider',\n mb: 0.5,\n }),\n }}\n >\n <FlagIcon src={src} alt={label_(option)} code={option.iso2} />\n <Typography\n variant=\"body2\"\n sx={{ flex: 1, fontWeight: isWorldRow ? 600 : 400 }}\n >\n {label_(option)}\n </Typography>\n {!isWorldRow && (\n <Typography\n variant=\"caption\"\n sx={{\n color: 'text.disabled',\n fontFamily: 'monospace',\n textTransform: 'uppercase',\n }}\n >\n {option.iso2}\n </Typography>\n )}\n </Box>\n );\n }}\n renderInput={(params) => {\n const src = !isWorld && selected && getFlagSrc\n ? getFlagSrc(selected.iso2.toLowerCase()) ?? null\n : null;\n const startAdornment = selected ? (\n <InputAdornment position=\"start\" sx={{ ml: 0.75, mr: -0.5 }}>\n <FlagIcon\n src={src}\n alt={selected ? label_(selected) : ''}\n code={isWorld ? undefined : selected?.iso2}\n />\n </InputAdornment>\n ) : null;\n\n return (\n <TextField\n {...params}\n label={label}\n placeholder={placeholder}\n helperText={helperText}\n error={error}\n {...textFieldProps}\n slotProps={{\n ...(textFieldProps?.slotProps ?? {}),\n // MUI v9 renamed Autocomplete renderInput's\n // `InputProps` / `inputProps` to `slotProps.{input,\n // htmlInput}`. Merge our flag adornment on top of the\n // input slot while keeping the chevron+clear adornments\n // that Autocomplete itself injects.\n input: {\n ...params.slotProps.input,\n ...((textFieldProps?.slotProps as { input?: object } | undefined)?.input ?? {}),\n startAdornment: startAdornment ?? params.slotProps.input.startAdornment,\n },\n htmlInput: {\n ...params.slotProps.htmlInput,\n autoComplete: 'off',\n },\n }}\n />\n );\n }}\n {...(autocompleteProps as object)}\n />\n );\n}\n","'use client';\n\n/**\n * Avatar Component\n *\n * Enhanced avatar with fallback initials and group support.\n *\n * @module components/avatar\n */\n\nimport type { ReactNode, CSSProperties, Ref } from 'react';\nimport { useMemo } from 'react';\nimport MuiAvatar from '@mui/material/Avatar';\nimport AvatarGroup from '@mui/material/AvatarGroup';\nimport { styled, useTheme } from '@mui/material/styles';\nimport type { AvatarProps as MuiAvatarProps } from '@mui/material/Avatar';\nimport type { AvatarGroupProps as MuiAvatarGroupProps } from '@mui/material/AvatarGroup';\nimport type { Palette } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport type AvatarShape = 'circular' | 'rounded' | 'square';\n\nexport interface AvatarProps extends Omit<MuiAvatarProps, 'variant'> {\n /** Avatar size preset */\n size?: AvatarSize;\n /** Avatar shape */\n shape?: AvatarShape;\n /** User name for fallback initials */\n name?: string;\n /** Show online indicator */\n online?: boolean;\n /** Show offline indicator */\n offline?: boolean;\n /** Badge content (e.g., notification count) */\n badge?: ReactNode;\n /** Custom badge color */\n badgeColor?: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';\n}\n\n// =============================================================================\n// UTILS\n// =============================================================================\n\nconst SIZES: Record<AvatarSize, number> = {\n xs: 24,\n sm: 32,\n md: 40,\n lg: 56,\n xl: 80,\n};\n\nconst FONT_SIZES: Record<AvatarSize, number> = {\n xs: 10,\n sm: 12,\n md: 14,\n lg: 20,\n xl: 28,\n};\n\n/**\n * Generate initials from a name.\n */\nfunction getInitials(name: string): string {\n const words = name.trim().split(/\\s+/);\n if (words.length === 1) {\n return words[0].slice(0, 2).toUpperCase();\n }\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n}\n\n/**\n * Generate a consistent color based on a string.\n */\nfunction stringToColor(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n\n const colors = [\n '#F44336',\n '#E91E63',\n '#9C27B0',\n '#673AB7',\n '#3F51B5',\n '#2196F3',\n '#03A9F4',\n '#00BCD4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ];\n\n return colors[Math.abs(hash) % colors.length];\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\ninterface StyledAvatarProps {\n ownerState: {\n size: AvatarSize;\n shape: AvatarShape;\n hasImage: boolean;\n bgColor?: string;\n };\n}\n\nconst StyledAvatar = styled(MuiAvatar, {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<StyledAvatarProps>(({ theme, ownerState }) => {\n const { size, shape, hasImage, bgColor } = ownerState;\n const dimension = SIZES[size];\n const fontSize = FONT_SIZES[size];\n\n const borderRadius = typeof theme.shape.borderRadius === 'number' ? theme.shape.borderRadius : 4;\n\n return {\n width: dimension,\n height: dimension,\n fontSize,\n fontWeight: 600,\n ...(shape === 'rounded' && {\n borderRadius: borderRadius * 1.5,\n }),\n ...(shape === 'square' && {\n borderRadius: 0,\n }),\n ...(!hasImage &&\n bgColor && {\n backgroundColor: bgColor,\n color: theme.palette.getContrastText(bgColor),\n }),\n };\n});\n// =============================================================================\n// WRAPPER FOR BADGES\n// =============================================================================\n\ninterface AvatarWrapperProps {\n children: ReactNode;\n online?: boolean;\n offline?: boolean;\n badge?: ReactNode;\n badgeColor?: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';\n size: AvatarSize;\n}\n\nfunction AvatarWrapper({\n children,\n online,\n offline,\n badge,\n badgeColor = 'error',\n size,\n}: AvatarWrapperProps): ReactNode {\n const theme = useTheme();\n const showIndicator = online || offline;\n const indicatorSize = size === 'xs' ? 6 : size === 'sm' ? 8 : 10;\n\n if (!showIndicator && !badge) {\n return children;\n }\n\n // Get theme-aware badge color\n const getBadgeBackgroundColor = (color: keyof Palette): string => {\n const paletteColor = theme.palette[color];\n if (paletteColor && typeof paletteColor === 'object' && 'main' in paletteColor) {\n return paletteColor.main;\n }\n return theme.palette.error.main;\n };\n\n const wrapperStyle: CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n };\n\n const indicatorStyle: CSSProperties = {\n position: 'absolute',\n bottom: 0,\n right: 0,\n width: indicatorSize,\n height: indicatorSize,\n borderRadius: '50%',\n border: `2px solid ${theme.palette.background.paper}`,\n backgroundColor: online ? theme.palette.success.main : theme.palette.grey[400],\n };\n\n const badgeStyle: CSSProperties = {\n position: 'absolute',\n top: -4,\n right: -4,\n minWidth: 18,\n height: 18,\n padding: '0 4px',\n borderRadius: 9,\n fontSize: 10,\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.palette.common.white,\n backgroundColor: getBadgeBackgroundColor(badgeColor as keyof Palette),\n };\n\n return (\n <span style={wrapperStyle}>\n {children}\n {showIndicator && <span style={indicatorStyle} />}\n {badge && <span style={badgeStyle}>{badge}</span>}\n </span>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Avatar - Enhanced avatar with fallback initials.\n *\n * @example\n * ```tsx\n * // With image\n * <Avatar src=\"/avatar.jpg\" name=\"John Doe\" />\n *\n * // Fallback to initials\n * <Avatar name=\"John Doe\" />\n *\n * // With online indicator\n * <Avatar src=\"/avatar.jpg\" name=\"John Doe\" online />\n *\n * // With badge\n * <Avatar src=\"/avatar.jpg\" name=\"John Doe\" badge={3} />\n * ```\n */\nexport function Avatar({size = 'md', shape = 'circular', name, src, alt, online, offline, badge, badgeColor, children, sx, ref, ...other }: AvatarProps & { ref?: Ref<HTMLDivElement> }) {\n const initials = useMemo(() => {\n if (children) return null;\n return name ? getInitials(name) : null;\n }, [name, children]);\n\n const bgColor = useMemo(() => {\n if (src) return undefined;\n return name ? stringToColor(name) : undefined;\n }, [src, name]);\n\n const ownerState = {\n size,\n shape,\n hasImage: Boolean(src),\n bgColor,\n };\n\n const avatarContent = (\n <StyledAvatar ref={ref} src={src} alt={alt || name} ownerState={ownerState} sx={sx} {...other}>\n {children || initials}\n </StyledAvatar>\n );\n\n return (\n <AvatarWrapper online={online} offline={offline} badge={badge} badgeColor={badgeColor} size={size}>\n {avatarContent}\n </AvatarWrapper>\n );\n}\n\n// =============================================================================\n// AVATAR GROUP\n// =============================================================================\n\nexport interface CustomAvatarGroupProps extends Omit<MuiAvatarGroupProps, 'children'> {\n /** Avatar items */\n avatars: Array<{\n name?: string;\n src?: string;\n alt?: string;\n }>;\n /** Avatar size */\n size?: AvatarSize;\n /** Maximum avatars to show */\n max?: number;\n}\n\n/**\n * CustomAvatarGroup - Display multiple avatars in a group.\n *\n * @example\n * ```tsx\n * <CustomAvatarGroup\n * avatars={[\n * { name: 'John Doe', src: '/avatar1.jpg' },\n * { name: 'Jane Smith', src: '/avatar2.jpg' },\n * { name: 'Bob Wilson' },\n * ]}\n * max={3}\n * />\n * ```\n */\nexport function CustomAvatarGroup({ avatars, size = 'sm', max = 4, sx, ...other }: CustomAvatarGroupProps): ReactNode {\n return (\n <AvatarGroup max={max} sx={sx} {...other}>\n {avatars.map((avatar, index) => (\n <Avatar key={index} name={avatar.name} src={avatar.src} alt={avatar.alt || avatar.name} size={size} />\n ))}\n </AvatarGroup>\n );\n}\n","'use client';\n\n/**\n * Badge Component\n *\n * Notification badge and status indicator components.\n *\n * @module components/badge\n */\n\nimport type { ComponentPropsWithoutRef, ReactNode, Ref } from 'react';\nimport MuiBadge from '@mui/material/Badge';\nimport Box from '@mui/material/Box';\nimport { styled } from '@mui/material/styles';\nimport type { BadgeProps as MuiBadgeProps } from '@mui/material/Badge';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type BadgeSize = 'small' | 'medium' | 'large';\n\nexport type BadgeVariant = 'standard' | 'dot' | 'online' | 'offline' | 'busy';\n\nexport type BadgeColor = 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';\n\nexport interface BadgeProps extends Omit<MuiBadgeProps, 'variant' | 'color' | 'content'> {\n /** Badge variant */\n variant?: BadgeVariant;\n /** Badge color */\n color?: BadgeColor;\n /** Badge size */\n size?: BadgeSize;\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\ninterface StyledBadgeProps {\n ownerState: {\n variant: BadgeVariant;\n color: BadgeColor;\n size: BadgeSize;\n };\n}\n\nconst StyledBadge = styled(MuiBadge, {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<StyledBadgeProps>(({ theme, ownerState }) => {\n const { variant, color, size } = ownerState;\n\n // Size dimensions\n const sizeDimensions: Record<BadgeSize, { width: number; height: number; fontSize: number }> = {\n small: { width: 16, height: 16, fontSize: 10 },\n medium: { width: 20, height: 20, fontSize: 12 },\n large: { width: 24, height: 24, fontSize: 14 },\n };\n\n const { width, height, fontSize } = sizeDimensions[size];\n\n // Color mapping\n const colorMap: Record<BadgeColor, string> = {\n default: theme.palette.grey[500],\n primary: theme.palette.primary.main,\n secondary: theme.palette.secondary.main,\n success: theme.palette.success.main,\n warning: theme.palette.warning.main,\n error: theme.palette.error.main,\n info: theme.palette.info.main,\n };\n\n // Status color mapping\n const statusColors: Record<string, string> = {\n online: theme.palette.success.main,\n offline: theme.palette.grey[500],\n busy: theme.palette.error.main,\n };\n\n const isStatusVariant = variant === 'online' || variant === 'offline' || variant === 'busy';\n const isDotVariant = variant === 'dot' || isStatusVariant;\n const badgeColor = isStatusVariant ? statusColors[variant] : colorMap[color];\n\n return {\n '& .MuiBadge-badge': {\n minWidth: isDotVariant ? height / 2 : width,\n height: isDotVariant ? height / 2 : height,\n padding: isDotVariant ? 0 : '0 4px',\n fontSize,\n fontWeight: 600,\n backgroundColor: badgeColor,\n color: theme.palette.getContrastText(badgeColor),\n ...(isDotVariant && {\n borderRadius: '50%',\n }),\n // Add pulsing animation for online status\n ...(variant === 'online' && {\n '&::after': {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n animation: 'ripple 1.2s infinite ease-in-out',\n border: `1px solid ${theme.palette.success.main}`,\n content: '\"\"',\n },\n '@keyframes ripple': {\n '0%': {\n transform: 'scale(.8)',\n opacity: 1,\n },\n '100%': {\n transform: 'scale(2.4)',\n opacity: 0,\n },\n },\n }),\n },\n };\n});\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Badge - Notification badge and status indicator.\n *\n * @example\n * ```tsx\n * // Standard badge with count\n * <Badge badgeContent={4} color=\"error\">\n * <MailIcon />\n * </Badge>\n *\n * // Dot badge\n * <Badge variant=\"dot\" color=\"primary\">\n * <NotificationsIcon />\n * </Badge>\n *\n * // Online status\n * <Badge variant=\"online\">\n * <Avatar src=\"/avatar.jpg\" />\n * </Badge>\n * ```\n */\nexport function Badge({variant = 'standard', color = 'error', size = 'medium', badgeContent, children, sx, ref, ...other }: BadgeProps & { ref?: Ref<HTMLSpanElement> }) {\n const ownerState = { variant, color, size };\n\n const isStatusVariant = variant === 'online' || variant === 'offline' || variant === 'busy';\n const isDotVariant = variant === 'dot' || isStatusVariant;\n\n return (\n <StyledBadge\n ref={ref}\n ownerState={ownerState}\n badgeContent={isDotVariant ? undefined : badgeContent}\n variant={isDotVariant ? 'dot' : 'standard'}\n sx={sx}\n {...other}\n >\n {children}\n </StyledBadge>\n );\n}\n\n// =============================================================================\n// COUNT BADGE\n// =============================================================================\n\ninterface CountBadgeOwnProps {\n /** Count value */\n count: number;\n /** Maximum count before showing + */\n max?: number;\n /** Show zero count */\n showZero?: boolean;\n /** Color */\n color?: BadgeColor;\n /** Size */\n size?: BadgeSize;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n/**\n * Leaves take `ref` and pass the rest to their root span — a count or a dot\n * is exactly what gets a `Tooltip` («3 unread», «online since 14:02»), and a\n * tooltip attaches its ref and its handlers to its child.\n */\ntype SpanRest<Own> = Omit<ComponentPropsWithoutRef<'span'>, keyof Own | 'color'> & { ref?: Ref<HTMLSpanElement> };\n\nexport type CountBadgeProps = CountBadgeOwnProps & SpanRest<CountBadgeOwnProps>;\n\n/**\n * CountBadge - Standalone count badge without children.\n *\n * @example\n * ```tsx\n * <CountBadge count={42} />\n * <CountBadge count={150} max={99} /> // Shows \"99+\"\n * ```\n */\nexport function CountBadge({\n count,\n max = 99,\n showZero = false,\n color = 'error',\n size = 'medium',\n sx,\n ref,\n ...other\n}: CountBadgeProps): ReactNode {\n if (!showZero && count === 0) {\n return null;\n }\n\n const displayCount = count > max ? `${max}+` : count.toString();\n\n const sizeDimensions: Record<BadgeSize, { minWidth: number; height: number; fontSize: number }> = {\n small: { minWidth: 16, height: 16, fontSize: 10 },\n medium: { minWidth: 20, height: 20, fontSize: 12 },\n large: { minWidth: 24, height: 24, fontSize: 14 },\n };\n\n const { minWidth, height, fontSize } = sizeDimensions[size];\n\n const colorMap: Record<BadgeColor, string> = {\n default: '#9ca3af',\n primary: '#2563eb',\n secondary: '#7c3aed',\n success: '#22c55e',\n warning: '#f59e0b',\n error: '#ef4444',\n info: '#06b6d4',\n };\n\n const bgColor = colorMap[color];\n\n return (\n <Box\n component=\"span\"\n ref={ref}\n {...other}\n sx={[\n {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth,\n height,\n padding: '0 4px',\n borderRadius: height / 2,\n fontSize,\n fontWeight: 600,\n backgroundColor: bgColor,\n color: 'white',\n },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ]}\n >\n {displayCount}\n </Box>\n );\n}\n\n// =============================================================================\n// STATUS DOT\n// =============================================================================\n\nexport type StatusDotStatus = 'online' | 'offline' | 'busy' | 'away';\n\ninterface StatusDotOwnProps {\n /** Status type */\n status: StatusDotStatus;\n /** Size in pixels */\n size?: number;\n /** Show pulsing animation for online */\n pulse?: boolean;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\nexport type StatusDotProps = StatusDotOwnProps & SpanRest<StatusDotOwnProps>;\n\n/**\n * StatusDot - Standalone status indicator.\n *\n * @example\n * ```tsx\n * <StatusDot status=\"online\" />\n * <StatusDot status=\"busy\" size={12} />\n * ```\n */\nexport function StatusDot({ status, size = 8, pulse = true, sx, ref, ...other }: StatusDotProps): ReactNode {\n const statusColors: Record<StatusDotStatus, string> = {\n online: '#22c55e',\n offline: '#9ca3af',\n busy: '#ef4444',\n away: '#f59e0b',\n };\n\n const color = statusColors[status];\n\n return (\n <Box\n component=\"span\"\n ref={ref}\n {...other}\n sx={[\n {\n display: 'inline-block',\n width: size,\n height: size,\n borderRadius: '50%',\n backgroundColor: color,\n ...(pulse &&\n status === 'online' && {\n animation: 'pulse 2s infinite',\n }),\n },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ]}\n />\n );\n}\n","import type { ElementType, ReactNode } from 'react';\n\n/** The words a sponsored slot says itself; every other word is the caller's content. */\nexport interface SponsoredSlotLabels {\n /** What marks the slot as advertising when no advertiser is named. */\n sponsored: string;\n}\n\nexport const DEFAULT_SPONSORED_SLOT_LABELS: SponsoredSlotLabels = {\n sponsored: 'Sponsored',\n};\n\n/** What one placement shows — already in the reader's language. */\nexport interface SponsoredSlotContent {\n title: string;\n body?: string | null;\n image?: string | null;\n /** A logo is fitted, never cropped; a cover fills its frame. */\n imageFit?: 'cover' | 'contain';\n /** «By <advertiser>» — the caller's sentence; `labels.sponsored` when absent. */\n byline?: string | null;\n /** Why it is here: the page's own context, never anything about the reader. */\n because?: string | null;\n /** The call to action, when the slot leads somewhere. */\n cta?: string | null;\n}\n\nexport interface SponsoredSlotProps {\n /** Nothing to show collapses the slot: no frame, no gap, no «empty ad». */\n content: SponsoredSlotContent | null | undefined;\n /** `tile` sits in a row of cards; `banner` takes a column's width. */\n variant?: 'tile' | 'banner';\n /**\n * The placement is still being asked for: the slot keeps its box so the page\n * does not jump when it arrives — and collapses if nothing does.\n */\n loading?: boolean;\n labels?: Partial<SponsoredSlotLabels>;\n /** The mark beside the byline; the caller's icon set. */\n icon?: ReactNode;\n /** Where the slot leads — a router link, an anchor. Absent, it is not clickable. */\n link?: { component: ElementType; props?: Record<string, unknown> };\n /** Called when the reader follows the link, after the navigation starts. */\n onOpen?: () => void;\n /** Rendered as `data-sponsored`, for the caller's own reporting and tests. */\n id?: string;\n}\n","/**\n * One advertising placement, as every page draws it.\n *\n * Always marked as advertising, by whom, and why it is here — the page's own\n * context, never anything about the reader. Its words are the caller's (it\n * knows the placement and the reader's language); the one word the slot says\n * itself comes through `labels`.\n *\n * Its geometry is fixed by its variant, so a page can reserve the box while\n * the placement is asked for (`loading`) and nothing moves when it arrives. A\n * slot with nothing to show collapses to nothing: an empty frame reads as a\n * broken page, and a placeholder «your ad here» is an ad for advertising.\n */\n\nimport Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardActionArea from '@mui/material/CardActionArea';\nimport Skeleton from '@mui/material/Skeleton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\nimport { DEFAULT_SPONSORED_SLOT_LABELS, type SponsoredSlotProps } from './types.js';\n\nconst TILE_IMAGE = { width: '100%', aspectRatio: '4 / 3' } as const;\nconst BANNER_IMAGE = { width: 160, minHeight: 120, flexShrink: 0 } as const;\n\nexport function SponsoredSlot({\n content,\n variant = 'tile',\n loading = false,\n labels: labelsProp,\n icon,\n link,\n onOpen,\n id,\n}: SponsoredSlotProps) {\n const labels = { ...DEFAULT_SPONSORED_SLOT_LABELS, ...labelsProp };\n const banner = variant === 'banner';\n const imageBox = banner ? BANNER_IMAGE : TILE_IMAGE;\n\n if (!content) {\n if (!loading) return null;\n return (\n <Card variant=\"outlined\" sx={{ height: '100%' }} data-sponsored-pending=\"\">\n <Box sx={{ display: 'flex', flexDirection: banner ? 'row' : 'column', height: '100%' }}>\n <Skeleton variant=\"rectangular\" sx={{ ...imageBox, height: banner ? undefined : 'auto' }} />\n <Box sx={{ p: 1.5, flex: 1 }}>\n <Skeleton width=\"40%\" />\n <Skeleton width=\"80%\" />\n </Box>\n </Box>\n </Card>\n );\n }\n\n const mark = (\n <Box\n component=\"span\"\n sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5, color: 'text.secondary', typography: 'caption' }}\n >\n {icon}\n {content.byline || labels.sponsored}\n </Box>\n );\n\n const body = (\n <Box sx={{ display: 'flex', flexDirection: banner ? 'row' : 'column', height: '100%' }}>\n {content.image && (\n <Box\n component=\"img\"\n src={content.image}\n alt=\"\"\n loading=\"lazy\"\n decoding=\"async\"\n sx={{\n display: 'block',\n objectFit: content.imageFit ?? 'cover',\n ...(content.imageFit === 'contain' && { p: 2, boxSizing: 'border-box' }),\n bgcolor: 'action.hover',\n ...imageBox,\n }}\n />\n )}\n <Box sx={{ p: 1.5, display: 'flex', flexDirection: 'column', gap: 0.5, minWidth: 0 }}>\n {content.because ? <Tooltip title={content.because}>{mark}</Tooltip> : mark}\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 600 }} noWrap={!banner}>\n {content.title}\n </Typography>\n {content.body && (\n <Typography variant=\"body2\" sx={{ color: 'text.secondary' }}>\n {content.body}\n </Typography>\n )}\n {link && content.cta && (\n <Typography variant=\"caption\" sx={{ color: 'primary.main', fontWeight: 600, mt: 'auto' }}>\n {content.cta}\n </Typography>\n )}\n </Box>\n </Box>\n );\n\n return (\n <Card variant=\"outlined\" sx={{ height: '100%' }} {...(id !== undefined && { 'data-sponsored': id })}>\n {link ? (\n <CardActionArea component={link.component} {...link.props} onClick={onOpen} sx={{ height: '100%' }}>\n {body}\n </CardActionArea>\n ) : (\n body\n )}\n </Card>\n );\n}\n","'use client';\n\n/**\n * Image Component\n *\n * Enhanced image component with lazy loading, aspect ratio, and fallback support.\n *\n * @module components/image\n */\n\nimport type { ReactNode, ImgHTMLAttributes, Ref } from 'react';\nimport { useState, useCallback } from 'react';\nimport Box from '@mui/material/Box';\nimport { styled, alpha } from '@mui/material/styles';\nimport type { SxProps, Theme, Breakpoint } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AspectRatio = '2/3' | '3/2' | '4/3' | '3/4' | '16/9' | '9/16' | '21/9' | '1/1' | `${number}/${number}`;\n\nexport interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'onError'> {\n /** Image source URL */\n src: string;\n /** Alt text */\n alt: string;\n /** Aspect ratio (auto-sizes based on width) */\n ratio?: AspectRatio | Partial<Record<Breakpoint, AspectRatio>>;\n /** Fallback content on error */\n fallback?: ReactNode;\n /** Fallback image URL */\n fallbackSrc?: string;\n /** Disable lazy loading */\n disableLazy?: boolean;\n /** Object fit style */\n objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n /** Show loading placeholder */\n placeholder?: boolean;\n /** Overlay content */\n overlay?: ReactNode;\n /** Additional styles */\n sx?: SxProps<Theme>;\n /** Image styles */\n imgSx?: SxProps<Theme>;\n /** Called when image loads */\n onLoad?: () => void;\n /** Called when image fails to load */\n onError?: () => void;\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\ninterface ImageRootProps {\n ownerState: {\n ratio?: AspectRatio | Partial<Record<Breakpoint, AspectRatio>>;\n hasError: boolean;\n };\n}\n\nconst ImageRoot = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'ownerState',\n})<ImageRootProps>(({ theme, ownerState }) => {\n const { ratio, hasError } = ownerState;\n\n const getRatioStyles = () => {\n if (!ratio) return {};\n\n if (typeof ratio === 'string') {\n return {\n width: '100%',\n aspectRatio: ratio,\n };\n }\n\n // Responsive ratio\n const breakpointStyles: Record<string, string | Record<string, string>> = { width: '100%' };\n for (const [bp, r] of Object.entries(ratio)) {\n if (bp === 'xs') {\n breakpointStyles.aspectRatio = r;\n } else {\n breakpointStyles[theme.breakpoints.up(bp as Breakpoint)] = {\n aspectRatio: r,\n };\n }\n }\n return breakpointStyles;\n };\n\n return {\n position: 'relative',\n display: 'block',\n overflow: 'hidden',\n borderRadius: 'inherit',\n ...getRatioStyles(),\n ...(hasError && {\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n }),\n };\n});\nconst StyledImg = styled('img')(() => ({\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n}));\n\nconst PlaceholderBox = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n '&::after': {\n content: '\"\"',\n width: 32,\n height: 32,\n borderRadius: '50%',\n border: '3px solid',\n borderColor: alpha(theme.palette.grey[500], 0.16),\n borderTopColor: theme.palette.primary.main,\n animation: 'spin 1s linear infinite',\n '@keyframes spin': {\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n },\n },\n}));\n\nconst OverlayBox = styled(Box)(() => ({\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n}));\n\nconst FallbackBox = styled(Box)(({ theme }) => ({\n width: '100%',\n height: '100%',\n minHeight: 100,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.palette.text.disabled,\n}));\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Image - Enhanced image component with lazy loading and fallback.\n *\n * @example\n * ```tsx\n * <Image\n * src=\"/avatar.jpg\"\n * alt=\"User avatar\"\n * ratio=\"1/1\"\n * sx={{ width: 100, borderRadius: 1 }}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With aspect ratio\n * <Image\n * src=\"/banner.jpg\"\n * alt=\"Banner\"\n * ratio=\"16/9\"\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With fallback\n * <Image\n * src=\"/product.jpg\"\n * alt=\"Product\"\n * fallback={<ProductPlaceholder />}\n * />\n * ```\n */\nexport function Image({src,\n alt,\n ratio,\n fallback,\n fallbackSrc,\n disableLazy = false,\n objectFit = 'cover',\n placeholder = true,\n overlay,\n sx,\n imgSx,\n onLoad,\n onError,\n ref,\n ...imgProps\n }: ImageProps & { ref?: Ref<HTMLDivElement> }) {\n const [isLoaded, setIsLoaded] = useState(false);\n const [hasError, setHasError] = useState(false);\n const [currentSrc, setCurrentSrc] = useState(src);\n\n const handleLoad = useCallback(() => {\n setIsLoaded(true);\n onLoad?.();\n }, [onLoad]);\n\n const handleError = useCallback(() => {\n if (fallbackSrc && currentSrc !== fallbackSrc) {\n setCurrentSrc(fallbackSrc);\n } else {\n setHasError(true);\n }\n onError?.();\n }, [fallbackSrc, currentSrc, onError]);\n\n const ownerState = {\n ratio,\n hasError,\n };\n\n // Render fallback content on error\n if (hasError && fallback) {\n return (\n <ImageRoot ref={ref} ownerState={ownerState} sx={sx}>\n <FallbackBox>{fallback}</FallbackBox>\n </ImageRoot>\n );\n }\n\n return (\n <ImageRoot ref={ref} ownerState={ownerState} sx={sx}>\n {/* Loading placeholder */}\n {placeholder && !isLoaded && !hasError && <PlaceholderBox />}\n\n {/* Main image */}\n <StyledImg\n src={currentSrc}\n alt={alt}\n loading={disableLazy ? 'eager' : 'lazy'}\n onLoad={handleLoad}\n onError={handleError}\n sx={[\n {\n objectFit,\n opacity: isLoaded ? 1 : 0,\n transition: 'opacity 300ms ease-in-out',\n },\n ...(Array.isArray(imgSx) ? imgSx : [imgSx]),\n ]}\n {...imgProps}\n />\n\n {/* Overlay */}\n {overlay && <OverlayBox>{overlay}</OverlayBox>}\n </ImageRoot>\n );\n}\n\n// =============================================================================\n// DEFAULT FALLBACK\n// =============================================================================\n\nfunction DefaultImageIcon() {\n return (\n <Box component=\"svg\" viewBox=\"0 0 24 24\" sx={{ width: 48, height: 48, opacity: 0.5 }}>\n <path\n fill=\"currentColor\"\n d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"\n />\n </Box>\n );\n}\n\n/**\n * ImageWithDefault - Image with default fallback icon.\n */\nexport function ImageWithDefault(props: ImageProps): ReactNode {\n return <Image fallback={<DefaultImageIcon />} {...props} />;\n}\n","/**\n * A deadline, said as the time left — and coloured by how little.\n *\n * The downstream platform keeps a deadline in twenty-one tables: a cart's\n * quote, an escrow's auto-finalisation, a dispute's response window, a pickup\n * code… and a missed one costs money. A date says when; the chip says how\n * long, in the reader's language, and turns warning, then error, as it nears.\n * The absolute moment stays one hover away, in a `<time>` element.\n *\n * @module components/deadline-chip\n */\n\n'use client';\n\nimport { useEffect, useState, type ReactNode } from 'react';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { Label, type LabelColor, type LabelVariant } from '../label/index.js';\n\nconst MINUTE = 60_000;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\n\nexport type DeadlineUrgency = 'overdue' | 'urgent' | 'soon' | 'later';\n\nexport interface DeadlineChipProps {\n /** When it is due */\n deadline: Date | string | number;\n /** BCP 47 locale for the time left and the exact date — the application's current language */\n locale?: string | undefined;\n /** Said instead of the time since, once the deadline has passed (e.g. «просрочено») */\n overdueLabel?: string | undefined;\n /** Less time than this is urgent. Default: one hour. */\n urgentWithinMs?: number | undefined;\n /** Less time than this is soon. Default: one day. */\n soonWithinMs?: number | undefined;\n /** The clock — for tests */\n now?: (() => number) | undefined;\n sx?: SxProps<Theme> | undefined;\n}\n\n/** How near a deadline is, from the time left. */\nexport function deadlineUrgency(leftMs: number, urgentWithinMs = HOUR, soonWithinMs = DAY): DeadlineUrgency {\n if (leftMs <= 0) return 'overdue';\n if (leftMs < urgentWithinMs) return 'urgent';\n if (leftMs < soonWithinMs) return 'soon';\n return 'later';\n}\n\n/** The time left (or since, when negative) in the locale's own short words: «через 2 ч», «in 2 hr». */\nexport function relativeTimeLeft(leftMs: number, locale?: string): string {\n const words = new Intl.RelativeTimeFormat(locale, { numeric: 'always', style: 'short' });\n const size = Math.abs(leftMs);\n const sign = leftMs < 0 ? -1 : 1;\n if (size < HOUR) return words.format(sign * Math.max(1, Math.round(size / MINUTE)), 'minute');\n if (size < 2 * DAY) return words.format(sign * Math.round(size / HOUR), 'hour');\n return words.format(sign * Math.round(size / DAY), 'day');\n}\n\nconst LOOK: Record<DeadlineUrgency, { color: LabelColor; variant: LabelVariant }> = {\n overdue: { color: 'error', variant: 'filled' },\n urgent: { color: 'error', variant: 'soft' },\n soon: { color: 'warning', variant: 'soft' },\n later: { color: 'default', variant: 'soft' },\n};\n\n/**\n * @example\n * ```tsx\n * <DeadlineChip deadline={dispute.responseDeadline} locale={i18n.language} overdueLabel={t('deadline.overdue')} />\n * ```\n */\nexport function DeadlineChip({\n deadline,\n locale,\n overdueLabel,\n urgentWithinMs,\n soonWithinMs,\n now = Date.now,\n sx,\n}: DeadlineChipProps): ReactNode {\n const [at, setAt] = useState(now);\n useEffect(() => {\n const tick = setInterval(() => setAt(now()), 30_000);\n return () => clearInterval(tick);\n }, [now]);\n\n const due = new Date(deadline).getTime();\n if (Number.isNaN(due)) return null;\n\n const left = due - at;\n const urgency = deadlineUrgency(left, urgentWithinMs, soonWithinMs);\n const look = LOOK[urgency];\n const text = urgency === 'overdue' && overdueLabel ? overdueLabel : relativeTimeLeft(left, locale);\n const exact = new Intl.DateTimeFormat(locale, { dateStyle: 'medium', timeStyle: 'short' }).format(due);\n\n return (\n <Label\n color={look.color}\n variant={look.variant}\n data-urgency={urgency}\n sx={[{ fontVariantNumeric: 'tabular-nums' }, ...(Array.isArray(sx) ? sx : [sx])]}\n >\n <time dateTime={new Date(due).toISOString()} title={exact}>\n {text}\n </time>\n </Label>\n );\n}\n","'use client';\n\nimport { ChevronLeftIcon, ChevronRightIcon } from '../../icons/controls.js';\n/**\n * A row that scrolls: items side by side, snapped, scrolled by the browser.\n *\n * For a page reached over Tor, a slider that moves its track from script is\n * script the reader downloads and frames the page spends; a row the browser\n * scrolls is neither. Touch, trackpad, wheel and keyboard work because they\n * are the browser's own. The arrows appear only where there is somewhere to\n * go, and not at all on a screen without hover.\n *\n * @module components/rail\n */\n\nimport { Children, useCallback, useEffect, useRef, useState, type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport type { ResponsiveStyleValue } from '@mui/system';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface RailProps {\n children: ReactNode;\n /** Name of the row, for assistive technology — a scrolling region needs one */\n 'aria-label': string;\n /** Width of each item. Default: most of a phone, two on a tablet, three or four on a desktop. */\n itemWidth?: ResponsiveStyleValue<string | number> | undefined;\n /** Space between items, in theme spacing units. Default 2. */\n gap?: number | undefined;\n /** The arrows' names, translated by the caller */\n labels?: { previous?: string | undefined; next?: string | undefined } | undefined;\n sx?: SxProps<Theme> | undefined;\n}\n\nconst DEFAULT_ITEM_WIDTH = { xs: '78%', sm: '46%', md: '31%', lg: '23.5%' };\n\nfunction Chevron({ direction }: { direction: 'left' | 'right' }): ReactNode {\n return direction === 'left' ? <ChevronLeftIcon fontSize=\"small\" /> : <ChevronRightIcon fontSize=\"small\" />;\n}\n\n/**\n * @example\n * ```tsx\n * <Rail aria-label={t('home.showcase.products')}>\n * {products.map((p) => <ProductCard key={p.id} product={p} />)}\n * </Rail>\n * ```\n */\nexport function Rail({\n children,\n 'aria-label': ariaLabel,\n itemWidth = DEFAULT_ITEM_WIDTH,\n gap = 2,\n labels,\n sx,\n}: RailProps): ReactNode {\n const track = useRef<HTMLUListElement>(null);\n const [reach, setReach] = useState({ back: false, forward: false });\n\n const measure = useCallback(() => {\n const el = track.current;\n if (!el) return;\n const max = el.scrollWidth - el.clientWidth;\n setReach({ back: el.scrollLeft > 1, forward: el.scrollLeft < max - 1 });\n }, []);\n\n useEffect(() => {\n measure();\n const el = track.current;\n if (!el || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [measure]);\n\n const page = (direction: 1 | -1) => {\n const el = track.current;\n if (el) el.scrollBy({ left: direction * el.clientWidth * 0.9, behavior: 'smooth' });\n };\n\n const arrow = (direction: 1 | -1, show: boolean, label: string) =>\n show ? (\n <IconButton\n size=\"small\"\n aria-label={label}\n onClick={() => page(direction)}\n sx={{\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n [direction === 1 ? 'right' : 'left']: -8,\n zIndex: 1,\n bgcolor: 'background.paper',\n boxShadow: 2,\n '&:hover': { bgcolor: 'background.paper' },\n '@media (hover: none)': { display: 'none' },\n }}\n >\n <Chevron direction={direction === 1 ? 'right' : 'left'} />\n </IconButton>\n ) : null;\n\n return (\n <Box\n component=\"section\"\n aria-label={ariaLabel}\n data-testid=\"prism-rail\"\n sx={[{ position: 'relative' }, ...(Array.isArray(sx) ? sx : [sx])]}\n >\n {arrow(-1, reach.back, labels?.previous ?? 'Previous')}\n <Box\n component=\"ul\"\n ref={track}\n tabIndex={0}\n onScroll={measure}\n sx={{\n display: 'grid',\n gridAutoFlow: 'column',\n gridAutoColumns: itemWidth,\n gap,\n m: 0,\n p: 0,\n listStyle: 'none',\n overflowX: 'auto',\n overscrollBehaviorX: 'contain',\n scrollSnapType: 'x mandatory',\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': { display: 'none' },\n '&:focus-visible': { outline: '2px solid', outlineColor: 'primary.main', outlineOffset: 2 },\n }}\n >\n {Children.map(children, (child) =>\n child == null || child === false ? null : (\n <Box component=\"li\" sx={{ scrollSnapAlign: 'start', minWidth: 0 }}>\n {child}\n </Box>\n )\n )}\n </Box>\n {arrow(1, reach.forward, labels?.next ?? 'Next')}\n </Box>\n );\n}\n","'use client';\n\n/**\n * Tag Cloud — visualises a list of tags as either a sized chip cloud\n * (font-size proportional to popularity) or a vertical list with\n * count + description.\n *\n * Generic over `T extends TagCloudItem` so callers pass their domain\n * tag DTOs directly without mapping. Renders no domain assumptions;\n * navigation is delegated via `onTagClick`, which is the consumer's\n * job (react-router, next/link, etc.).\n *\n * Accessibility:\n * - List variant: each item is a button (MUI ListItemButton) with\n * aria-label that spells out the popularity rather than relying\n * on the visible count alone (\"4 posts\" not just \"4\").\n * - Cloud variant: chips carry an aria-label that names both the\n * tag and the relative weight, so screen readers don't see only\n * a font-size signal.\n * - Optional `trending` flag highlights a tag visually AND\n * semantically (aria-label suffix).\n *\n * @module components/tag-cloud\n */\n\nimport type { ReactNode } from 'react';\nimport Chip from '@mui/material/Chip';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemText from '@mui/material/ListItemText';\nimport Box from '@mui/material/Box';\nimport { alpha, useTheme } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface TagCloudItem {\n id: string;\n name: string;\n slug: string;\n postCount: number;\n description?: string | null;\n /** Optional badge — drives the trending highlight. */\n trending?: boolean;\n /** Optional moderation status — 'featured' adds a subtle accent. */\n status?: string;\n}\n\nexport interface TagCloudProps<T extends TagCloudItem = TagCloudItem> {\n tags: T[];\n variant?: 'cloud' | 'list';\n /** Called on activation. The consumer routes to the tag page. */\n onTagClick?: (tag: T) => void;\n /** Truncate to first N items. */\n maxItems?: number;\n /**\n * Render the right-hand stat of a list-variant row. Defaults to\n * the formatted postCount; override for custom signals\n * (e.g. follower count, freshness).\n */\n renderStat?: (tag: T) => ReactNode;\n /**\n * Optional adornment shown after the tag name on cloud variant.\n * Used to slot in a 🔥 / ⭐ icon component without bloating this\n * file with icon assets.\n */\n renderAdornment?: (tag: T) => ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/** Map a postCount to a font-size multiplier (0.75rem – 1.5rem). */\nfunction computeSize(count: number, min: number, max: number): number {\n if (max === min) return 1;\n const t = (count - min) / (max - min);\n return 0.75 + t * 0.75;\n}\n\nfunction formatShort(n: number): string {\n if (n < 1_000) return String(n);\n if (n < 1_000_000) return `${(n / 1_000).toFixed(1).replace(/\\.0$/, '')}K`;\n return `${(n / 1_000_000).toFixed(1).replace(/\\.0$/, '')}M`;\n}\n\nexport function TagCloud<T extends TagCloudItem = TagCloudItem>({\n tags,\n variant = 'cloud',\n onTagClick,\n maxItems,\n renderStat,\n renderAdornment,\n sx,\n}: TagCloudProps<T>): ReactNode {\n const theme = useTheme();\n const visible = maxItems ? tags.slice(0, maxItems) : tags;\n\n // --- List variant -----------------------------------------------------\n if (variant === 'list') {\n return (\n <List disablePadding sx={sx}>\n {visible.map((tag) => (\n <ListItemButton\n key={tag.id}\n onClick={onTagClick ? () => onTagClick(tag) : undefined}\n aria-label={`Tag ${tag.name}, ${tag.postCount} posts${tag.trending ? ', trending' : ''}`}\n sx={{\n borderRadius: 1,\n px: 1.5,\n py: 0.75,\n '&:hover': { bgcolor: alpha(theme.palette.primary.main, 0.08) },\n }}\n >\n <ListItemText\n primary={\n <Box component=\"span\" sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n <span>{`#${tag.name}`}</span>\n {tag.trending && (\n <Box\n component=\"span\"\n sx={{\n ml: 0.5,\n px: 0.75,\n py: 0.125,\n fontSize: 10,\n lineHeight: 1.4,\n fontWeight: 700,\n borderRadius: 0.75,\n color: theme.palette.warning.contrastText,\n bgcolor: theme.palette.warning.main,\n }}\n >\n TRENDING\n </Box>\n )}\n {renderAdornment?.(tag)}\n </Box>\n }\n secondary={tag.description}\n slotProps={{\n primary: { variant: 'body2', sx: { fontWeight: 500 } },\n\n secondary: {\n variant: 'caption',\n noWrap: true,\n sx: { mt: 0.25 },\n }\n }} />\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.disabled\",\n ml: 1,\n flexShrink: 0\n }}>\n {renderStat ? renderStat(tag) : formatShort(tag.postCount)}\n </Typography>\n </ListItemButton>\n ))}\n </List>\n );\n }\n\n // --- Cloud variant ---------------------------------------------------\n const counts = visible.map((t) => t.postCount);\n const min = counts.length > 0 ? Math.min(...counts) : 0;\n const max = counts.length > 0 ? Math.max(...counts) : 0;\n\n return (\n <Stack\n direction=\"row\"\n useFlexGap\n sx={[{\n flexWrap: \"wrap\",\n gap: 1,\n alignItems: \"center\"\n }, ...(Array.isArray(sx) ? sx : [sx])]}>\n {visible.map((tag) => {\n const size = computeSize(tag.postCount, min, max);\n const isFeatured = tag.status === 'featured';\n return (\n <Chip\n key={tag.id}\n label={\n <Box component=\"span\" sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n <span>{`#${tag.name}`}</span>\n {renderAdornment?.(tag)}\n </Box>\n }\n variant={tag.trending || isFeatured ? 'filled' : 'outlined'}\n color={tag.trending ? 'warning' : isFeatured ? 'primary' : 'default'}\n onClick={onTagClick ? () => onTagClick(tag) : undefined}\n aria-label={`Tag ${tag.name}, ${tag.postCount} posts${tag.trending ? ', trending' : ''}${isFeatured ? ', featured' : ''}`}\n sx={{\n height: 'auto',\n fontSize: `${size}rem`,\n fontWeight: 500,\n borderRadius: 1.5,\n cursor: onTagClick ? 'pointer' : 'default',\n transition: 'all 0.15s',\n '& .MuiChip-label': { px: 1.25, py: 0.5 },\n '&:hover': onTagClick\n ? {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: 'primary.main',\n color: 'primary.main',\n }\n : undefined,\n }}\n />\n );\n })}\n </Stack>\n );\n}\n","'use client';\n\n/**\n * SvgColor Component\n *\n * Colorable SVG icon component using CSS mask.\n *\n * @module components/svg-color\n */\n\nimport type { ReactNode, Ref } from 'react';\nimport { styled } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface SvgColorProps {\n /** SVG file URL */\n src: string;\n /** Color (uses currentColor by default, inheriting from parent) */\n color?: string;\n /** Width and height */\n size?: number | string;\n /** Width */\n width?: number | string;\n /** Height */\n height?: number | string;\n /** Additional class name */\n className?: string;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// STYLED COMPONENT\n// =============================================================================\n\nconst SvgRoot = styled('span')(() => ({\n flexShrink: 0,\n display: 'inline-flex',\n backgroundColor: 'currentColor',\n}));\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * SvgColor - Colorable SVG component.\n *\n * This component uses CSS mask to allow SVG icons to inherit text color.\n * The SVG file is loaded via URL and can be colored using the color prop\n * or by inheriting from parent's color/text color.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <SvgColor src=\"/icons/check.svg\" />\n * ```\n *\n * @example\n * ```tsx\n * // With custom color\n * <SvgColor\n * src=\"/icons/star.svg\"\n * color=\"primary.main\"\n * size={32}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Inherit color from parent\n * <Box color=\"error.main\">\n * <SvgColor src=\"/icons/alert.svg\" />\n * Error message\n * </Box>\n * ```\n */\nexport function SvgColor({src, color, size = 24, width, height, className, sx, ref }: SvgColorProps & { ref?: Ref<HTMLSpanElement> }) {\n const computedWidth = width ?? size;\n const computedHeight = height ?? size;\n\n return (\n <SvgRoot\n ref={ref}\n className={className}\n sx={[\n {\n width: computedWidth,\n height: computedHeight,\n mask: `url(${src}) no-repeat center / contain`,\n WebkitMask: `url(${src}) no-repeat center / contain`,\n ...(color && { color }),\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n />\n );\n}\n\n// =============================================================================\n// ICON SET COMPONENT\n// =============================================================================\n\nexport interface IconProps extends Omit<SvgColorProps, 'src'> {\n /** Icon name (without extension) */\n name: string;\n /** Base path for icons */\n basePath?: string;\n}\n\n/**\n * Creates an Icon component factory with a custom base path.\n *\n * @example\n * ```tsx\n * // Create icon component\n * const Icon = createIconComponent('/assets/icons');\n *\n * // Use it\n * <Icon name=\"home\" size={24} />\n * ```\n */\nexport function createIconComponent(basePath: string) {\n function Icon({ name, ...props }: IconProps): ReactNode {\n return <SvgColor src={`${basePath}/${name}.svg`} {...props} />;\n }\n return Icon;\n}\n","'use client';\n\n/**\n * Progress Components\n *\n * Linear and circular progress indicators.\n *\n * @module components/progress\n */\n\nimport type { ReactNode, ComponentProps } from 'react';\nimport MuiLinearProgress from '@mui/material/LinearProgress';\nimport MuiCircularProgress from '@mui/material/CircularProgress';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\n\n/**\n * Progress color variants.\n */\nexport type ProgressColor = 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info' | 'inherit';\n\n/**\n * Props for LinearProgress component.\n */\nexport interface LinearProgressProps extends Omit<ComponentProps<typeof MuiLinearProgress>, 'color'> {\n /** Progress color */\n color?: ProgressColor;\n /** Show percentage label */\n showLabel?: boolean;\n /** Label position */\n labelPosition?: 'end' | 'below';\n /** Custom label formatter */\n formatLabel?: (value: number) => string;\n}\n\n/**\n * LinearProgress - Horizontal progress indicator.\n *\n * @example\n * ```tsx\n * // Determinate\n * <LinearProgress value={75} showLabel />\n *\n * // Indeterminate (loading)\n * <LinearProgress />\n *\n * // With custom label\n * <LinearProgress\n * value={50}\n * showLabel\n * formatLabel={(v) => `${v}/100 completed`}\n * />\n * ```\n */\nexport function LinearProgress({\n color = 'primary',\n showLabel = false,\n labelPosition = 'end',\n formatLabel,\n value,\n variant = value !== undefined ? 'determinate' : 'indeterminate',\n sx,\n ...props\n}: LinearProgressProps): ReactNode {\n const label = formatLabel ? formatLabel(value ?? 0) : `${Math.round(value ?? 0)}%`;\n\n if (!showLabel) {\n return (\n <MuiLinearProgress variant={variant} value={value} color={color} sx={{ borderRadius: 1, ...sx }} {...props} />\n );\n }\n\n if (labelPosition === 'below') {\n return (\n <Box sx={{ width: '100%' }}>\n <MuiLinearProgress variant={variant} value={value} color={color} sx={{ borderRadius: 1, ...sx }} {...props} />\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n mt: 0.5,\n display: 'block',\n textAlign: 'center'\n }}>\n {label}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ flex: 1 }}>\n <MuiLinearProgress variant={variant} value={value} color={color} sx={{ borderRadius: 1, ...sx }} {...props} />\n </Box>\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.secondary\",\n minWidth: 40\n }}>\n {label}\n </Typography>\n </Box>\n );\n}\n\n/**\n * Props for CircularProgress component.\n */\nexport interface CircularProgressProps extends Omit<ComponentProps<typeof MuiCircularProgress>, 'color'> {\n /** Progress color */\n color?: ProgressColor;\n /** Show percentage label in center */\n showLabel?: boolean;\n /** Custom label formatter */\n formatLabel?: (value: number) => string;\n}\n\n/**\n * CircularProgress - Circular progress indicator.\n *\n * @example\n * ```tsx\n * // Determinate with label\n * <CircularProgress value={75} showLabel />\n *\n * // Indeterminate spinner\n * <CircularProgress />\n *\n * // Custom size\n * <CircularProgress value={50} size={80} thickness={5} showLabel />\n * ```\n */\nexport function CircularProgress({\n color = 'primary',\n showLabel = false,\n formatLabel,\n value,\n variant = value !== undefined ? 'determinate' : 'indeterminate',\n size = 40,\n ...props\n}: CircularProgressProps): ReactNode {\n if (!showLabel || variant === 'indeterminate') {\n return <MuiCircularProgress variant={variant} value={value} color={color} size={size} {...props} />;\n }\n\n const label = formatLabel ? formatLabel(value ?? 0) : `${Math.round(value ?? 0)}%`;\n\n return (\n <Box sx={{ position: 'relative', display: 'inline-flex' }}>\n <MuiCircularProgress variant={variant} value={value} color={color} size={size} {...props} />\n <Box\n sx={{\n position: 'absolute',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n fontSize: typeof size === 'number' ? size * 0.25 : undefined\n }}>\n {label}\n </Typography>\n </Box>\n </Box>\n );\n}\n\n/**\n * Props for ProgressBar component (segmented).\n */\nexport interface ProgressBarProps {\n /** Segments with value and optional color */\n segments: Array<{\n value: number;\n color?: ProgressColor;\n label?: string;\n }>;\n /** Bar height */\n height?: number;\n /** Show segment labels */\n showLabels?: boolean;\n}\n\n/**\n * ProgressBar - Segmented progress bar for multiple values.\n *\n * @example\n * ```tsx\n * <ProgressBar\n * segments={[\n * { value: 30, color: 'success', label: 'Complete' },\n * { value: 20, color: 'warning', label: 'In Progress' },\n * { value: 50, color: 'error', label: 'Failed' },\n * ]}\n * showLabels\n * />\n * ```\n */\nexport function ProgressBar({ segments, height = 8, showLabels = false }: ProgressBarProps): ReactNode {\n const colorMap: Record<ProgressColor, string> = {\n primary: 'primary.main',\n secondary: 'secondary.main',\n success: 'success.main',\n error: 'error.main',\n warning: 'warning.main',\n info: 'info.main',\n inherit: 'text.primary',\n };\n\n return (\n <Box sx={{ width: '100%' }}>\n <Box\n sx={{\n display: 'flex',\n borderRadius: 1,\n overflow: 'hidden',\n height,\n bgcolor: 'action.hover',\n }}\n >\n {segments.map((segment, index) => (\n <Box\n key={index}\n sx={{\n width: `${segment.value}%`,\n bgcolor: colorMap[segment.color ?? 'primary'],\n transition: 'width 0.3s ease-in-out',\n }}\n />\n ))}\n </Box>\n {showLabels && (\n <Box sx={{ display: 'flex', gap: 2, mt: 1 }}>\n {segments.map((segment, index) => (\n <Box key={index} sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: colorMap[segment.color ?? 'primary'],\n }}\n />\n <Typography variant=\"caption\" sx={{\n color: \"text.secondary\"\n }}>\n {segment.label ?? `${segment.value}%`}\n </Typography>\n </Box>\n ))}\n </Box>\n )}\n </Box>\n );\n}\n","/**\n * CountdownRing — circular countdown indicator that animates from\n * full to empty as a deadline approaches. Useful for time-limited\n * artifacts (quote expiry, OTP windows, session timers, signed-URL\n * lifetimes, etc.).\n *\n * Renders a CircularProgress whose `value` shrinks from 100 to 0\n * over the remaining window. The center label defaults to \"Ns\"\n * but can be customized via `formatLabel`. When the deadline has\n * passed, color flips to `error` and label switches to the\n * supplied `expiredLabel` (or \"Expired\").\n *\n * @example\n * ```tsx\n * <CountdownRing\n * deadline={quote.expiresAt}\n * totalMs={quote.ttlMs}\n * onExpire={() => setQuote(null)}\n * />\n * ```\n */\nimport { useEffect, useState, type ReactNode } from 'react';\nimport { CircularProgress, type ProgressColor } from './progress.js';\n\nexport interface CountdownRingProps {\n /** Deadline to count down to. Accepts Date or ISO string. */\n deadline: Date | string | null;\n /**\n * Total window length in ms — used as the denominator for the\n * progress percentage. If omitted, the ring is filled at mount\n * and tracks elapsed time relative to remaining.\n */\n totalMs?: number;\n /** Diameter in px. Default 40. */\n size?: number;\n /** Color while the timer is healthy. Default `primary`. */\n color?: ProgressColor;\n /** Color when remaining drops below `warningThresholdMs`. Default `warning`. */\n warningColor?: ProgressColor;\n /** Color after expiry. Default `error`. */\n expiredColor?: ProgressColor;\n /**\n * Switch to `warningColor` when remaining is below this.\n * Default 10s.\n */\n warningThresholdMs?: number;\n /** Tick interval in ms. Default 250. */\n tickIntervalMs?: number;\n /** Callback fired once when the deadline first elapses. */\n onExpire?: () => void;\n /**\n * Center-label formatter. Receives `(remainingMs, expired)` and\n * returns the string. Default: `Ns` while running, `expiredLabel`\n * after expiry.\n */\n formatLabel?: (remainingMs: number, expired: boolean) => string;\n /** Override the default expired label. */\n expiredLabel?: string;\n}\n\nexport function CountdownRing({\n deadline,\n totalMs,\n size = 40,\n color = 'primary',\n warningColor = 'warning',\n expiredColor = 'error',\n warningThresholdMs = 10_000,\n tickIntervalMs = 250,\n onExpire,\n formatLabel,\n expiredLabel = 'Expired',\n}: CountdownRingProps): ReactNode {\n const target = parseDeadline(deadline);\n const [now, setNow] = useState<number>(() => Date.now());\n\n useEffect(() => {\n if (!target) return undefined;\n const id = setInterval(() => setNow(Date.now()), tickIntervalMs);\n return () => clearInterval(id);\n }, [target, tickIntervalMs]);\n\n // Fire onExpire exactly once per deadline transition. We track the\n // previous \"expired\" status in state-derived form rather than a ref\n // to keep the hook order stable across renders.\n const remainingMs = target ? Math.max(0, target - now) : 0;\n const expired = target != null && remainingMs <= 0;\n useEffect(() => {\n if (expired && onExpire) onExpire();\n // intentional: re-fire only when transitioning from running → expired\n }, [expired, onExpire]);\n\n const denom = totalMs && totalMs > 0 ? totalMs : remainingMs > 0 ? remainingMs : 1;\n const value = expired ? 0 : Math.min(100, (remainingMs / denom) * 100);\n\n const activeColor: ProgressColor = expired\n ? expiredColor\n : remainingMs <= warningThresholdMs\n ? warningColor\n : color;\n\n const label = formatLabel\n ? formatLabel(remainingMs, expired)\n : expired\n ? expiredLabel\n : `${Math.ceil(remainingMs / 1000)}s`;\n\n return (\n <CircularProgress\n value={value}\n size={size}\n color={activeColor}\n showLabel\n formatLabel={() => label}\n />\n );\n}\n\nfunction parseDeadline(d: Date | string | null): number | null {\n if (!d) return null;\n if (d instanceof Date) return d.getTime();\n const t = Date.parse(d);\n return Number.isFinite(t) ? t : null;\n}\n","/**\n * VirtualList — windowed list for variable-height rows.\n *\n * Wraps `@tanstack/react-virtual` with the most common ergonomic\n * defaults: a scrolling viewport, dynamic height measurement (rows\n * may expand and the list rebalances), and an optional infinite-load\n * hook that fires when the user scrolls within `loadMoreThreshold`\n * px of the bottom.\n *\n * Use cases that drove the API: audit log dialogs (rows can expand\n * to reveal payloads), chat/message histories, paginated transaction\n * tables. Items are keyed by the caller-supplied `getKey` so row\n * identity survives reorder.\n *\n * @example\n * ```tsx\n * <VirtualList\n * items={trades}\n * getKey={(t) => t.id}\n * estimateSize={48}\n * maxHeight={500}\n * onEndReached={() => fetchNextPage()}\n * >\n * {(trade) => <TradeRow trade={trade} />}\n * </VirtualList>\n * ```\n */\nimport { useEffect, useRef, type ReactNode } from 'react';\nimport Box, { type BoxProps } from '@mui/material/Box';\nimport { useVirtualizer } from '@tanstack/react-virtual';\n\nexport interface VirtualListProps<T> {\n /** Source items, in render order. */\n items: readonly T[];\n /** Stable key for each row — needed for reorders and dynamic measurement. */\n getKey: (item: T, index: number) => string | number;\n /** Render a single row. */\n children: (item: T, index: number) => ReactNode;\n /**\n * Initial size estimate per row in px. The virtualizer will replace\n * this with the measured size once each row mounts.\n */\n estimateSize?: number;\n /**\n * Number of items to render outside the visible window on each\n * side. Higher values reduce blank flashes on fast scroll at the\n * cost of more DOM. Default 5.\n */\n overscan?: number;\n /**\n * Cap on the scroll viewport height. The Box auto-fills its parent\n * if not supplied — set this when the parent isn't height-bounded\n * (e.g. inside a Dialog without `fullHeight`).\n */\n maxHeight?: number | string;\n /** Fires when the user scrolls within `loadMoreThreshold` of the bottom. */\n onEndReached?: () => void;\n /** Distance from the bottom (px) at which `onEndReached` fires. Default 200. */\n loadMoreThreshold?: number;\n /** Forwarded to the outer scrolling Box for layout overrides. */\n sx?: BoxProps['sx'];\n /** Inner padding (px) — applied as content offset, not scroll padding. */\n paddingY?: number;\n}\n\nexport function VirtualList<T>({\n items,\n getKey,\n children,\n estimateSize = 48,\n overscan = 5,\n maxHeight,\n onEndReached,\n loadMoreThreshold = 200,\n sx,\n paddingY = 0,\n}: VirtualListProps<T>): ReactNode {\n const parentRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => parentRef.current,\n estimateSize: () => estimateSize,\n overscan,\n getItemKey: (index) => {\n const item = items[index];\n return item === undefined ? index : getKey(item, index);\n },\n });\n\n // Fire onEndReached when the last virtual item is within the\n // threshold of the visible area. We sample every render — cheap,\n // since virtualizer.getVirtualItems is already memoized.\n const virtualItems = virtualizer.getVirtualItems();\n const lastItem = virtualItems[virtualItems.length - 1];\n useEffect(() => {\n if (!onEndReached || !lastItem) return;\n if (lastItem.index >= items.length - 1) {\n // Already at the actual end — nothing more to load yet.\n return;\n }\n const scrollEl = parentRef.current;\n if (!scrollEl) return;\n const distanceToBottom =\n virtualizer.getTotalSize() - (scrollEl.scrollTop + scrollEl.clientHeight);\n if (distanceToBottom <= loadMoreThreshold) {\n onEndReached();\n }\n }, [lastItem, virtualizer, items.length, loadMoreThreshold, onEndReached]);\n\n return (\n <Box\n ref={parentRef}\n sx={{\n overflow: 'auto',\n contain: 'strict',\n maxHeight,\n height: maxHeight === undefined ? '100%' : undefined,\n ...sx,\n }}\n >\n <Box\n sx={{\n height: virtualizer.getTotalSize() + paddingY * 2,\n width: '100%',\n position: 'relative',\n }}\n >\n {virtualItems.map((virtualRow) => {\n const item = items[virtualRow.index];\n if (item === undefined) return null;\n return (\n <Box\n key={virtualRow.key}\n data-index={virtualRow.index}\n ref={virtualizer.measureElement}\n sx={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n transform: `translateY(${virtualRow.start + paddingY}px)`,\n }}\n >\n {children(item, virtualRow.index)}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n","'use client';\n\n/**\n * Accordion Component\n *\n * Expandable content panels.\n *\n * @module components/accordion\n */\n\nimport type { ReactNode, ComponentProps } from 'react';\nimport { useState, useCallback, useMemo } 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 { ChevronDownIcon as ExpandMoreIcon } from '../../icons/controls.js';\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 = useMemo(() =>\n controlledExpanded !== undefined\n ? Array.isArray(controlledExpanded)\n ? controlledExpanded\n : [controlledExpanded]\n : internalExpanded, [controlledExpanded, 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 '&::before': { display: 'none' },\n boxShadow: 'none',\n };\n case 'elevated':\n return {\n boxShadow: 2,\n '&::before': { display: 'none' },\n mb: disableGutters ? 0 : 1,\n };\n default:\n return {};\n }\n };\n\n return (\n <>\n {items.map((item) => (\n <MuiAccordion\n key={item.id}\n expanded={expanded.includes(item.id)}\n onChange={handleChange(item.id)}\n disabled={item.disabled}\n disableGutters={disableGutters}\n sx={getAccordionSx()}\n >\n <MuiAccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls={`${item.id}-content`}\n id={`${item.id}-header`}\n >\n {item.icon && (\n <Typography component=\"span\" sx={{ mr: 1, display: 'flex', alignItems: 'center' }}>\n {item.icon}\n </Typography>\n )}\n <Typography component=\"span\" sx={{ fontWeight: 500 }}>\n {item.title}\n </Typography>\n {item.subtitle && (\n <Typography\n component=\"span\"\n sx={{\n color: 'text.secondary',\n ml: 1,\n }}\n >\n {item.subtitle}\n </Typography>\n )}\n </MuiAccordionSummary>\n <MuiAccordionDetails>{item.content}</MuiAccordionDetails>\n </MuiAccordion>\n ))}\n </>\n );\n}\n\n/**\n * Props for SimpleAccordion component.\n */\nexport interface SimpleAccordionProps extends Omit<ComponentProps<typeof MuiAccordion>, 'children'> {\n /** Header title */\n title: string;\n /** Optional subtitle */\n subtitle?: string;\n /** Panel content */\n children: ReactNode;\n /** Optional icon */\n icon?: ReactNode;\n}\n\n/**\n * SimpleAccordion - Single expandable panel.\n *\n * @example\n * ```tsx\n * <SimpleAccordion title=\"Advanced Settings\" defaultExpanded>\n * <AdvancedSettings />\n * </SimpleAccordion>\n * ```\n */\nexport function SimpleAccordion({ title, subtitle, children, icon, ...props }: SimpleAccordionProps): ReactNode {\n return (\n <MuiAccordion {...props}>\n <MuiAccordionSummary expandIcon={<ExpandMoreIcon />}>\n {icon && (\n <Typography component=\"span\" sx={{ mr: 1, display: 'flex', alignItems: 'center' }}>\n {icon}\n </Typography>\n )}\n <Typography component=\"span\" sx={{ fontWeight: 500 }}>\n {title}\n </Typography>\n {subtitle && (\n <Typography\n component=\"span\"\n sx={{\n color: 'text.secondary',\n ml: 1,\n }}\n >\n {subtitle}\n </Typography>\n )}\n </MuiAccordionSummary>\n <MuiAccordionDetails>{children}</MuiAccordionDetails>\n </MuiAccordion>\n );\n}\n\n/**\n * Hook for managing accordion state externally.\n */\nexport interface UseAccordionOptions {\n /** Allow multiple panels open */\n multiple?: boolean;\n /** Default expanded panel(s) */\n defaultExpanded?: string | string[];\n /** Callback when expanded panels change */\n onChange?: (expanded: string[]) => void;\n}\n\nexport interface UseAccordionReturn {\n /** Currently expanded panel(s) */\n expanded: string[];\n /** Check if a panel is expanded */\n isExpanded: (id: string) => boolean;\n /** Toggle a panel */\n toggle: (id: string) => void;\n /** Expand a panel */\n expand: (id: string) => void;\n /** Collapse a panel */\n collapse: (id: string) => void;\n /** Expand all panels */\n expandAll: (ids: string[]) => void;\n /** Collapse all panels */\n collapseAll: () => void;\n /** Props to spread on Accordion component */\n accordionProps: {\n expanded: string[];\n multiple: boolean;\n onChange: (expanded: string[]) => void;\n };\n}\n\n/**\n * useAccordion - Hook for external accordion state management.\n *\n * @example\n * ```tsx\n * const { accordionProps, expandAll, collapseAll } = useAccordion({\n * multiple: true,\n * defaultExpanded: ['panel1'],\n * });\n *\n * return (\n * <>\n * <button onClick={() => expandAll(['panel1', 'panel2', 'panel3'])}>\n * Expand All\n * </button>\n * <button onClick={collapseAll}>Collapse All</button>\n * <Accordion {...accordionProps} items={items} />\n * </>\n * );\n * ```\n */\nexport function useAccordion({\n multiple = false,\n defaultExpanded,\n onChange,\n}: UseAccordionOptions = {}): UseAccordionReturn {\n const [expanded, setExpanded] = useState<string[]>(() => {\n if (defaultExpanded === undefined) return [];\n return Array.isArray(defaultExpanded) ? defaultExpanded : [defaultExpanded];\n });\n\n const isExpanded = useCallback((id: string) => expanded.includes(id), [expanded]);\n\n const updateExpanded = useCallback(\n (newExpanded: string[]) => {\n setExpanded(newExpanded);\n onChange?.(newExpanded);\n },\n [onChange]\n );\n\n const toggle = useCallback(\n (id: string) => {\n if (expanded.includes(id)) {\n updateExpanded(expanded.filter((e) => e !== id));\n } else if (multiple) {\n updateExpanded([...expanded, id]);\n } else {\n updateExpanded([id]);\n }\n },\n [expanded, multiple, updateExpanded]\n );\n\n const expand = useCallback(\n (id: string) => {\n if (!expanded.includes(id)) {\n if (multiple) {\n updateExpanded([...expanded, id]);\n } else {\n updateExpanded([id]);\n }\n }\n },\n [expanded, multiple, updateExpanded]\n );\n\n const collapse = useCallback(\n (id: string) => {\n updateExpanded(expanded.filter((e) => e !== id));\n },\n [expanded, updateExpanded]\n );\n\n const expandAll = useCallback(\n (ids: string[]) => {\n if (multiple) {\n updateExpanded(ids);\n } else if (ids.length > 0) {\n updateExpanded([ids[0]]);\n }\n },\n [multiple, updateExpanded]\n );\n\n const collapseAll = useCallback(() => {\n updateExpanded([]);\n }, [updateExpanded]);\n\n return {\n expanded,\n isExpanded,\n toggle,\n expand,\n collapse,\n expandAll,\n collapseAll,\n accordionProps: {\n expanded,\n multiple,\n onChange: updateExpanded,\n },\n };\n}\n","'use client';\n\n/**\n * Menu Component\n *\n * Dropdown menu with various item types.\n *\n * @module components/menu\n */\n\nimport type { ReactNode, MouseEvent } from 'react';\nimport { useState, useCallback } from 'react';\nimport MuiMenu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Divider from '@mui/material/Divider';\nimport Typography from '@mui/material/Typography';\n\n// =============================================================================\n// SHARED RENDERING\n// =============================================================================\n\n/**\n * Render menu items (shared between Menu and ContextMenu).\n *\n * @param items - Array of menu item definitions\n * @param onItemClick - Click handler for menu items\n * @returns Array of rendered menu elements\n */\nfunction renderMenuItems(items: MenuItemDef[], onItemClick: (item: MenuItemDef) => void): ReactNode[] {\n return items.map((item, index) => {\n if (item.type === 'divider') {\n return <Divider key={`divider-${index}`} sx={{ my: 0.5 }} />;\n }\n\n if (item.type === 'header') {\n return (\n <Typography\n key={`header-${index}`}\n variant=\"overline\"\n sx={{ px: 2, py: 0.5, display: 'block', color: 'text.secondary' }}\n >\n {item.label}\n </Typography>\n );\n }\n\n return (\n <MenuItem\n key={item.key ?? `item-${index}`}\n onClick={() => onItemClick(item)}\n disabled={item.disabled}\n sx={{\n color: item.danger ? 'error.main' : undefined,\n '&:hover': item.danger ? { bgcolor: 'error.lighter' } : undefined,\n }}\n >\n {item.icon && <ListItemIcon sx={{ color: item.danger ? 'error.main' : undefined }}>{item.icon}</ListItemIcon>}\n <ListItemText>{item.label}</ListItemText>\n {item.shortcut && (\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n ml: 2\n }}>\n {item.shortcut}\n </Typography>\n )}\n </MenuItem>\n );\n });\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Menu item types.\n */\nexport type MenuItemType = 'item' | 'divider' | 'header';\n\n/**\n * Menu item definition.\n */\nexport interface MenuItemDef {\n /** Item type */\n type?: MenuItemType;\n /** Unique key (required for items) */\n key?: string;\n /** Item label */\n label?: string;\n /** Optional icon */\n icon?: ReactNode;\n /** Click handler */\n onClick?: () => void;\n /** Disabled state */\n disabled?: boolean;\n /** Danger/destructive action styling */\n danger?: boolean;\n /** Shortcut hint text */\n shortcut?: string;\n}\n\n/**\n * Props for Menu component.\n */\nexport interface MenuProps {\n /** Menu items */\n items: MenuItemDef[];\n /** Anchor element */\n anchorEl: HTMLElement | null;\n /** Open state */\n open: boolean;\n /** Close handler */\n onClose: () => void;\n /** Minimum width */\n minWidth?: number;\n /** Anchor origin */\n anchorOrigin?: {\n vertical: 'top' | 'center' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n };\n /** Transform origin */\n transformOrigin?: {\n vertical: 'top' | 'center' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n };\n}\n\n/**\n * Menu - Dropdown menu component.\n *\n * @example\n * ```tsx\n * const { anchorEl, open, handleOpen, handleClose } = useMenu();\n *\n * <Button onClick={handleOpen}>Open Menu</Button>\n * <Menu\n * anchorEl={anchorEl}\n * open={open}\n * onClose={handleClose}\n * items={[\n * { key: 'edit', label: 'Edit', icon: <EditIcon /> },\n * { key: 'duplicate', label: 'Duplicate', icon: <CopyIcon /> },\n * { type: 'divider' },\n * { key: 'delete', label: 'Delete', icon: <DeleteIcon />, danger: true },\n * ]}\n * />\n * ```\n */\nexport function Menu({\n items,\n anchorEl,\n open,\n onClose,\n minWidth = 180,\n anchorOrigin = { vertical: 'bottom', horizontal: 'right' },\n transformOrigin = { vertical: 'top', horizontal: 'right' },\n}: MenuProps): ReactNode {\n const handleItemClick = useCallback(\n (item: MenuItemDef) => {\n item.onClick?.();\n onClose();\n },\n [onClose]\n );\n\n return (\n <MuiMenu\n anchorEl={anchorEl}\n open={open}\n onClose={onClose}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n slotProps={{\n paper: {\n sx: { minWidth },\n },\n }}\n >\n {renderMenuItems(items, handleItemClick)}\n </MuiMenu>\n );\n}\n\n/**\n * Return type for useMenu hook.\n */\nexport interface UseMenuReturn {\n /** Anchor element for menu positioning */\n anchorEl: HTMLElement | null;\n /** Whether menu is open */\n open: boolean;\n /** Open menu handler (pass as onClick) */\n handleOpen: (event: MouseEvent<HTMLElement>) => void;\n /** Close menu handler */\n handleClose: () => void;\n /** Toggle menu handler */\n handleToggle: (event: MouseEvent<HTMLElement>) => void;\n /** Props to spread on Menu component */\n menuProps: {\n anchorEl: HTMLElement | null;\n open: boolean;\n onClose: () => void;\n };\n}\n\n/**\n * useMenu - Hook for managing menu state.\n *\n * @example\n * ```tsx\n * const menu = useMenu();\n *\n * return (\n * <>\n * <IconButton onClick={menu.handleOpen}>\n * <MoreVertIcon />\n * </IconButton>\n * <Menu {...menu.menuProps} items={menuItems} />\n * </>\n * );\n * ```\n */\nexport function useMenu(): UseMenuReturn {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n\n const open = Boolean(anchorEl);\n\n const handleOpen = useCallback((event: MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n }, []);\n\n const handleClose = useCallback(() => {\n setAnchorEl(null);\n }, []);\n\n const handleToggle = useCallback((event: MouseEvent<HTMLElement>) => {\n setAnchorEl((prev) => (prev ? null : event.currentTarget));\n }, []);\n\n return {\n anchorEl,\n open,\n handleOpen,\n handleClose,\n handleToggle,\n menuProps: {\n anchorEl,\n open,\n onClose: handleClose,\n },\n };\n}\n\n/**\n * Props for ContextMenu component.\n */\nexport interface ContextMenuProps extends Omit<MenuProps, 'anchorEl' | 'open' | 'onClose'> {\n /** Children to wrap with context menu */\n children: ReactNode;\n}\n\n/**\n * ContextMenu - Right-click context menu wrapper.\n *\n * @example\n * ```tsx\n * <ContextMenu\n * items={[\n * { key: 'cut', label: 'Cut', shortcut: '⌘X' },\n * { key: 'copy', label: 'Copy', shortcut: '⌘C' },\n * { key: 'paste', label: 'Paste', shortcut: '⌘V' },\n * ]}\n * >\n * <div>Right-click me!</div>\n * </ContextMenu>\n * ```\n */\nexport function ContextMenu({ items, children, ...menuProps }: ContextMenuProps): ReactNode {\n const [contextMenu, setContextMenu] = useState<{\n mouseX: number;\n mouseY: number;\n } | null>(null);\n\n const handleContextMenu = useCallback((event: MouseEvent) => {\n event.preventDefault();\n setContextMenu({\n mouseX: event.clientX + 2,\n mouseY: event.clientY - 6,\n });\n }, []);\n\n const handleClose = useCallback(() => {\n setContextMenu(null);\n }, []);\n\n const handleItemClick = useCallback(\n (item: MenuItemDef) => {\n item.onClick?.();\n handleClose();\n },\n [handleClose]\n );\n\n return (\n <>\n <div onContextMenu={handleContextMenu}>{children}</div>\n <MuiMenu\n open={contextMenu !== null}\n onClose={handleClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={contextMenu !== null ? { top: contextMenu.mouseY, left: contextMenu.mouseX } : undefined}\n slotProps={{\n paper: {\n sx: { minWidth: menuProps.minWidth ?? 180 },\n },\n }}\n >\n {renderMenuItems(items, handleItemClick)}\n </MuiMenu>\n </>\n );\n}\n","'use client';\n\n/**\n * Settings Provider\n *\n * Provides settings context and drawer state management.\n * Wraps the application to enable settings drawer access anywhere.\n *\n * @module components/settings\n */\n\nimport { createContext, useContext, useState, useCallback, useMemo, type ReactNode } from 'react';\nimport { useSettingsStore, type SettingsState, type SettingsValues } from '../../state/stores/settings.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Settings drawer state and controls.\n */\nexport interface SettingsDrawerState {\n /** Whether the drawer is open */\n open: boolean;\n /** Open the drawer */\n onOpen: () => void;\n /** Close the drawer */\n onClose: () => void;\n /** Toggle the drawer */\n onToggle: () => void;\n}\n\n/**\n * Settings context value.\n */\nexport interface SettingsContextValue {\n /** Current settings values */\n settings: SettingsValues;\n /** Settings actions */\n actions: Pick<\n SettingsState,\n | 'setMode'\n | 'toggleMode'\n | 'setPreset'\n | 'setPrimaryColor'\n | 'setContrast'\n | 'setDirection'\n | 'setFontSize'\n | 'setFontFamily'\n | 'setDensity'\n | 'setCompactSidebar'\n | 'setNavLayout'\n | 'setNavColor'\n | 'setStretch'\n | 'updateSettings'\n | 'reset'\n >;\n /** Whether settings can be reset (differ from defaults) */\n canReset: boolean;\n /** Drawer state and controls */\n drawer: SettingsDrawerState;\n}\n\n/**\n * Settings provider props.\n */\nexport interface SettingsProviderProps {\n /** Child components */\n children: ReactNode;\n /** Initial drawer open state */\n defaultOpen?: boolean;\n}\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst SettingsContext = createContext<SettingsContextValue | null>(null);\n\n// =============================================================================\n// PROVIDER\n// =============================================================================\n\n/**\n * Settings Provider - Provides settings state and drawer controls.\n *\n * @example\n * ```tsx\n * // In your app root\n * function App() {\n * return (\n * <SettingsProvider>\n * <ThemeProvider theme={theme}>\n * <MyApp />\n * <SettingsDrawer />\n * </ThemeProvider>\n * </SettingsProvider>\n * );\n * }\n *\n * // In any component\n * function Header() {\n * const { drawer } = useSettings();\n * return <IconButton onClick={drawer.onOpen}><SettingsIcon /></IconButton>;\n * }\n * ```\n */\nexport function SettingsProvider({ children, defaultOpen = false }: SettingsProviderProps): ReactNode {\n // Drawer state\n const [open, setOpen] = useState(defaultOpen);\n\n // Get store state and actions\n const store = useSettingsStore();\n\n // Drawer controls\n const onOpen = useCallback(() => setOpen(true), []);\n const onClose = useCallback(() => setOpen(false), []);\n const onToggle = useCallback(() => setOpen((prev) => !prev), []);\n\n // Extract settings values (without actions)\n const settings: SettingsValues = useMemo(\n () => ({\n mode: store.mode,\n preset: store.preset,\n primaryColor: store.primaryColor,\n contrast: store.contrast,\n direction: store.direction,\n fontSize: store.fontSize,\n fontFamily: store.fontFamily,\n density: store.density,\n compactSidebar: store.compactSidebar,\n sidebarCollapsed: store.sidebarCollapsed,\n navLayout: store.navLayout,\n navColor: store.navColor,\n stretch: store.stretch,\n tableRowsPerPage: store.tableRowsPerPage,\n }),\n [\n store.mode,\n store.preset,\n store.primaryColor,\n store.contrast,\n store.direction,\n store.fontSize,\n store.fontFamily,\n store.density,\n store.compactSidebar,\n store.sidebarCollapsed,\n store.navLayout,\n store.navColor,\n store.stretch,\n store.tableRowsPerPage,\n ]\n );\n\n // Extract actions\n const actions = useMemo(\n () => ({\n setMode: store.setMode,\n toggleMode: store.toggleMode,\n setPreset: store.setPreset,\n setPrimaryColor: store.setPrimaryColor,\n setContrast: store.setContrast,\n setDirection: store.setDirection,\n setFontSize: store.setFontSize,\n setFontFamily: store.setFontFamily,\n setDensity: store.setDensity,\n setCompactSidebar: store.setCompactSidebar,\n setNavLayout: store.setNavLayout,\n setNavColor: store.setNavColor,\n setStretch: store.setStretch,\n updateSettings: store.updateSettings,\n reset: store.reset,\n }),\n [\n store.setMode,\n store.toggleMode,\n store.setPreset,\n store.setPrimaryColor,\n store.setContrast,\n store.setDirection,\n store.setFontSize,\n store.setFontFamily,\n store.setDensity,\n store.setCompactSidebar,\n store.setNavLayout,\n store.setNavColor,\n store.setStretch,\n store.updateSettings,\n store.reset,\n ]\n );\n\n // Context value\n const value: SettingsContextValue = useMemo(\n () => ({\n settings,\n actions,\n canReset: store.canReset(),\n drawer: { open, onOpen, onClose, onToggle },\n }),\n [settings, actions, store, open, onOpen, onClose, onToggle]\n );\n\n return <SettingsContext.Provider value={value}>{children}</SettingsContext.Provider>;\n}\n\n// =============================================================================\n// HOOKS\n// =============================================================================\n\n/**\n * Hook to access settings context.\n *\n * @returns Settings context value\n * @throws If used outside of SettingsProvider\n *\n * @example\n * ```tsx\n * function ThemeToggle() {\n * const { settings, actions } = useSettings();\n * return (\n * <Switch\n * checked={settings.mode === 'dark'}\n * onChange={() => actions.toggleMode()}\n * />\n * );\n * }\n * ```\n */\nexport function useSettings(): SettingsContextValue {\n const context = useContext(SettingsContext);\n\n if (!context) {\n throw new Error('useSettings must be used within a SettingsProvider');\n }\n\n return context;\n}\n\n/**\n * Hook to access only the drawer controls.\n *\n * @returns Drawer state and controls\n * @throws If used outside of SettingsProvider\n *\n * @example\n * ```tsx\n * function SettingsButton() {\n * const drawer = useSettingsDrawer();\n * return <IconButton onClick={drawer.onOpen}><SettingsIcon /></IconButton>;\n * }\n * ```\n */\nexport function useSettingsDrawer(): SettingsDrawerState {\n const { drawer } = useSettings();\n return drawer;\n}\n","'use client';\n\n/**\n * Settings Drawer\n *\n * UI component for managing application settings.\n * Displays configurable sections for theme, layout, and preferences.\n *\n * @module components/settings\n */\n\nimport { type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Drawer from '@mui/material/Drawer';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport Button from '@mui/material/Button';\nimport Tooltip from '@mui/material/Tooltip';\nimport Stack from '@mui/material/Stack';\nimport Switch from '@mui/material/Switch';\nimport Slider from '@mui/material/Slider';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport { alpha, useTheme } from '@mui/material/styles';\n\n// Icons - using unicode/text since we don't have icon package\nconst CloseIcon = () => <span style={{ fontSize: 20 }}>✕</span>;\nconst RefreshIcon = () => <span style={{ fontSize: 16 }}>↻</span>;\nconst SunIcon = () => <span style={{ fontSize: 18 }}>☀</span>;\nconst MoonIcon = () => <span style={{ fontSize: 18 }}>☾</span>;\n\nimport { useSettings } from './settings-provider.js';\nimport type { ComponentDensity } from '../../types/theme.js';\nimport type { NavLayout } from '../../state/stores/settings.js';\nimport { PRESET_NAMES, PRESET_DISPLAY_NAMES } from '../../theme/create-theme.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Settings drawer props.\n */\nexport interface SettingsDrawerProps {\n /** Drawer width */\n width?: number;\n /** Sections to display */\n sections?: SettingsSection[];\n}\n\n/**\n * Available settings sections.\n */\nexport type SettingsSection =\n | 'mode'\n | 'contrast'\n | 'direction'\n | 'presets'\n | 'primaryColor'\n | 'fontSize'\n | 'density'\n | 'navLayout'\n | 'stretch';\n\n// =============================================================================\n// PRESET COLORS\n// =============================================================================\n\nconst PRESET_COLORS: Record<string, string> = {\n 'default-light': '#3385F0',\n 'default-dark': '#3385F0',\n luxury: '#B8860B',\n arctic: '#1E88E5',\n nature: '#22C55E',\n ember: '#FF5F11',\n dracula: '#BD93F9',\n midnight: '#6366F1',\n retro: '#F59E0B',\n minimal: '#64748B',\n};\n\n// =============================================================================\n// SECTION COMPONENTS\n// =============================================================================\n\ninterface SectionProps {\n title: string;\n children: ReactNode;\n}\n\nfunction Section({ title, children }: SectionProps): ReactNode {\n return (\n <Box sx={{ mb: 3 }}>\n <Typography\n variant=\"caption\"\n sx={{\n display: 'block',\n mb: 1.5,\n fontWeight: 600,\n color: 'text.secondary',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n }}\n >\n {title}\n </Typography>\n {children}\n </Box>\n );\n}\n\n// =============================================================================\n// MODE SECTION\n// =============================================================================\n\nfunction ModeSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Section title=\"Mode\">\n <ToggleButtonGroup\n exclusive\n fullWidth\n value={settings.mode}\n onChange={(_, value) => value && actions.setMode(value)}\n sx={{ gap: 1 }}\n >\n <ToggleButton\n value=\"light\"\n sx={{\n flex: 1,\n py: 1.5,\n gap: 1,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n <SunIcon /> Light\n </ToggleButton>\n <ToggleButton\n value=\"dark\"\n sx={{\n flex: 1,\n py: 1.5,\n gap: 1,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n <MoonIcon /> Dark\n </ToggleButton>\n </ToggleButtonGroup>\n </Section>\n );\n}\n\n// =============================================================================\n// CONTRAST SECTION\n// =============================================================================\n\nfunction ContrastSection(): ReactNode {\n const { settings, actions } = useSettings();\n\n return (\n <Section title=\"Contrast\">\n <FormControlLabel\n control={\n <Switch\n checked={settings.contrast === 'high'}\n onChange={(e) => actions.setContrast(e.target.checked ? 'high' : 'default')}\n />\n }\n label=\"High Contrast\"\n sx={{ ml: 0 }}\n />\n </Section>\n );\n}\n\n// =============================================================================\n// DIRECTION SECTION\n// =============================================================================\n\nfunction DirectionSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Section title=\"Direction\">\n <ToggleButtonGroup\n exclusive\n fullWidth\n value={settings.direction}\n onChange={(_, value) => value && actions.setDirection(value)}\n sx={{ gap: 1 }}\n >\n <ToggleButton\n value=\"ltr\"\n sx={{\n flex: 1,\n py: 1,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n LTR\n </ToggleButton>\n <ToggleButton\n value=\"rtl\"\n sx={{\n flex: 1,\n py: 1,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n RTL\n </ToggleButton>\n </ToggleButtonGroup>\n </Section>\n );\n}\n\n// =============================================================================\n// PRESETS SECTION\n// =============================================================================\n\nfunction PresetsSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Section title=\"Presets\">\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: 'repeat(5, 1fr)',\n gap: 1.5,\n }}\n >\n {PRESET_NAMES.map((preset) => {\n const isSelected = settings.preset === preset;\n const color = PRESET_COLORS[preset] || '#666';\n\n return (\n <Tooltip key={preset} title={PRESET_DISPLAY_NAMES[preset]} placement=\"top\">\n <Box\n onClick={() => actions.setPreset(preset)}\n sx={{\n width: 40,\n height: 40,\n borderRadius: '50%',\n bgcolor: color,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: isSelected ? `3px solid ${theme.palette.text.primary}` : '3px solid transparent',\n boxShadow: isSelected ? `0 0 0 2px ${color}` : 'none',\n transition: 'all 0.2s',\n '&:hover': {\n transform: 'scale(1.1)',\n },\n }}\n >\n {isSelected && (\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: 'white',\n }}\n />\n )}\n </Box>\n </Tooltip>\n );\n })}\n </Box>\n </Section>\n );\n}\n\n// =============================================================================\n// PRIMARY COLOR SECTION\n// =============================================================================\n\nconst COLOR_OPTIONS = [\n { label: 'Blue', value: '#3385F0' },\n { label: 'Green', value: '#22C55E' },\n { label: 'Purple', value: '#8B5CF6' },\n { label: 'Red', value: '#EF4444' },\n { label: 'Orange', value: '#F97316' },\n { label: 'Cyan', value: '#06B6D4' },\n { label: 'Pink', value: '#EC4899' },\n { label: 'Amber', value: '#F59E0B' },\n];\n\nfunction PrimaryColorSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Section title=\"Primary Color\">\n <Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap' }}>\n {COLOR_OPTIONS.map((option) => {\n const isSelected = settings.primaryColor === option.value;\n\n return (\n <Tooltip key={option.value} title={option.label} placement=\"top\">\n <Box\n onClick={() => actions.setPrimaryColor(option.value)}\n sx={{\n width: 32,\n height: 32,\n borderRadius: '50%',\n bgcolor: option.value,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: isSelected ? `2px solid ${theme.palette.text.primary}` : '2px solid transparent',\n transition: 'transform 0.2s',\n '&:hover': {\n transform: 'scale(1.15)',\n },\n }}\n >\n {isSelected && (\n <Box\n sx={{\n width: 6,\n height: 6,\n borderRadius: '50%',\n bgcolor: 'white',\n }}\n />\n )}\n </Box>\n </Tooltip>\n );\n })}\n {settings.primaryColor && (\n <Tooltip title=\"Reset to default\" placement=\"top\">\n <Box\n onClick={() => actions.setPrimaryColor(null)}\n sx={{\n width: 32,\n height: 32,\n borderRadius: '50%',\n border: `1px dashed ${theme.palette.divider}`,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'text.secondary',\n fontSize: 14,\n '&:hover': {\n borderColor: theme.palette.text.primary,\n },\n }}\n >\n <RefreshIcon />\n </Box>\n </Tooltip>\n )}\n </Box>\n </Section>\n );\n}\n\n// =============================================================================\n// FONT SIZE SECTION\n// =============================================================================\n\nfunction FontSizeSection(): ReactNode {\n const { settings, actions } = useSettings();\n\n return (\n <Section title=\"Font Size\">\n <Stack direction=\"row\" spacing={2} sx={{\n alignItems: \"center\"\n }}>\n <Typography variant=\"body2\" sx={{ minWidth: 24, color: 'text.secondary' }}>\n A\n </Typography>\n <Slider\n min={14}\n max={18}\n step={1}\n value={settings.fontSize}\n onChange={(_, value) => actions.setFontSize(value as number)}\n valueLabelDisplay=\"auto\"\n marks\n sx={{ flex: 1 }}\n />\n <Typography variant=\"body1\" sx={{ minWidth: 24, fontWeight: 600 }}>\n A\n </Typography>\n </Stack>\n </Section>\n );\n}\n\n// =============================================================================\n// DENSITY SECTION\n// =============================================================================\n\nfunction DensitySection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n const densityOptions: { value: ComponentDensity; label: string }[] = [\n { value: 'compact', label: 'Compact' },\n { value: 'standard', label: 'Standard' },\n { value: 'comfortable', label: 'Comfortable' },\n ];\n\n return (\n <Section title=\"Density\">\n <ToggleButtonGroup\n exclusive\n fullWidth\n value={settings.density}\n onChange={(_, value) => value && actions.setDensity(value)}\n sx={{ gap: 1 }}\n >\n {densityOptions.map((option) => (\n <ToggleButton\n key={option.value}\n value={option.value}\n sx={{\n flex: 1,\n py: 1,\n fontSize: '0.75rem',\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': {\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n {option.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n </Section>\n );\n}\n\n// =============================================================================\n// NAV LAYOUT SECTION\n// =============================================================================\n\nfunction NavLayoutSection(): ReactNode {\n const { settings, actions } = useSettings();\n const theme = useTheme();\n\n const layoutOptions: { value: NavLayout; label: string; icon: string }[] = [\n { value: 'vertical', label: 'Vertical', icon: '▌' },\n { value: 'horizontal', label: 'Horizontal', icon: '▬' },\n { value: 'mini', label: 'Mini', icon: '│' },\n ];\n\n return (\n <Section title=\"Navigation Layout\">\n <Box sx={{ display: 'flex', gap: 1.5 }}>\n {layoutOptions.map((option) => {\n const isSelected = settings.navLayout === option.value;\n\n return (\n <Box\n key={option.value}\n onClick={() => actions.setNavLayout(option.value)}\n sx={{\n flex: 1,\n py: 2,\n px: 1,\n borderRadius: 1,\n cursor: 'pointer',\n textAlign: 'center',\n border: `1px solid ${isSelected ? theme.palette.primary.main : theme.palette.divider}`,\n bgcolor: isSelected ? alpha(theme.palette.primary.main, 0.08) : 'transparent',\n transition: 'all 0.2s',\n '&:hover': {\n borderColor: theme.palette.primary.main,\n },\n }}\n >\n <Typography sx={{ fontSize: 24, mb: 0.5, lineHeight: 1 }}>{option.icon}</Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {option.label}\n </Typography>\n </Box>\n );\n })}\n </Box>\n </Section>\n );\n}\n\n// =============================================================================\n// STRETCH SECTION\n// =============================================================================\n\nfunction StretchSection(): ReactNode {\n const { settings, actions } = useSettings();\n\n return (\n <Section title=\"Layout\">\n <FormControlLabel\n control={<Switch checked={settings.stretch} onChange={(e) => actions.setStretch(e.target.checked)} />}\n label=\"Stretch to full width\"\n sx={{ ml: 0 }}\n />\n </Section>\n );\n}\n\n// =============================================================================\n// SECTION MAP\n// =============================================================================\n\nconst SECTION_COMPONENTS: Record<SettingsSection, () => ReactNode> = {\n mode: ModeSection,\n contrast: ContrastSection,\n direction: DirectionSection,\n presets: PresetsSection,\n primaryColor: PrimaryColorSection,\n fontSize: FontSizeSection,\n density: DensitySection,\n navLayout: NavLayoutSection,\n stretch: StretchSection,\n};\n\nconst DEFAULT_SECTIONS: SettingsSection[] = ['mode', 'presets', 'primaryColor', 'density', 'navLayout', 'stretch'];\n\n// =============================================================================\n// SETTINGS DRAWER\n// =============================================================================\n\n/**\n * Settings Drawer - Configurable settings panel.\n *\n * @example\n * ```tsx\n * // Basic usage - must be inside SettingsProvider\n * <SettingsDrawer />\n *\n * // With custom sections\n * <SettingsDrawer\n * sections={['mode', 'presets', 'primaryColor']}\n * width={320}\n * />\n * ```\n */\nexport function SettingsDrawer({ width = 300, sections = DEFAULT_SECTIONS }: SettingsDrawerProps): ReactNode {\n const { drawer, canReset, actions } = useSettings();\n const theme = useTheme();\n\n return (\n <Drawer\n anchor=\"right\"\n open={drawer.open}\n onClose={drawer.onClose}\n slotProps={{\n paper: {\n sx: {\n width,\n backgroundImage: 'none',\n },\n }\n }}\n >\n {/* Header */}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n p: 2,\n borderBottom: `1px solid ${theme.palette.divider}`,\n }}\n >\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n Settings\n </Typography>\n <Stack direction=\"row\" spacing={0.5}>\n {canReset && (\n <Tooltip title=\"Reset to defaults\">\n <IconButton size=\"small\" onClick={actions.reset} aria-label=\"Reset settings to defaults\">\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n )}\n <IconButton size=\"small\" onClick={drawer.onClose} aria-label=\"Close settings\">\n <CloseIcon />\n </IconButton>\n </Stack>\n </Box>\n {/* Content */}\n <Box sx={{ p: 2.5, flex: 1, overflowY: 'auto' }}>\n {sections.map((section) => {\n const SectionComponent = SECTION_COMPONENTS[section];\n return SectionComponent ? <SectionComponent key={section} /> : null;\n })}\n </Box>\n {/* Footer */}\n <Box sx={{ p: 2, borderTop: `1px solid ${theme.palette.divider}` }}>\n <Button fullWidth variant=\"soft\" color=\"primary\" onClick={drawer.onClose}>\n Close\n </Button>\n </Box>\n </Drawer>\n );\n}\n","'use client';\n\n/**\n * Tooltip Component\n *\n * Enhanced tooltip with custom styling and arrow support.\n *\n * @module components/tooltip\n */\n\nimport type { ReactNode, ReactElement } from 'react';\nimport MuiTooltip from '@mui/material/Tooltip';\nimport type { TooltipProps as MuiTooltipProps } from '@mui/material/Tooltip';\n\n/**\n * Props for Tooltip component.\n */\nexport interface TooltipProps extends Omit<MuiTooltipProps, 'children'> {\n /** Tooltip content */\n title: ReactNode;\n /** Element to attach tooltip to */\n children: ReactElement;\n /** Show arrow */\n arrow?: boolean;\n /** Tooltip placement */\n placement?: MuiTooltipProps['placement'];\n /** Max width */\n maxWidth?: number | string;\n}\n\n/**\n * Tooltip - Enhanced tooltip with custom styling.\n *\n * @example\n * ```tsx\n * <Tooltip title=\"Delete item\" placement=\"top\">\n * <IconButton>\n * <DeleteIcon />\n * </IconButton>\n * </Tooltip>\n * ```\n */\nexport function Tooltip({\n title,\n children,\n arrow = true,\n placement = 'top',\n maxWidth = 300,\n ...other\n}: TooltipProps): ReactNode {\n if (!title) {\n return children;\n }\n\n return (\n <MuiTooltip\n title={title}\n arrow={arrow}\n placement={placement}\n slotProps={{\n tooltip: {\n sx: {\n maxWidth,\n },\n },\n ...other.slotProps,\n }}\n {...other}\n >\n {children}\n </MuiTooltip>\n );\n}\n","'use client';\n\n/**\n * Nav Card\n *\n * Horizontal navigation tile used on admin/dashboard overview pages:\n * colored icon on the left, title + description in the middle, and a\n * trailing chevron on the right. Renders as a router link when `to`\n * is supplied, otherwise as a button-like Card with `onClick`.\n *\n * Equal-height rows are guaranteed by `height: 100%` — pair the card\n * with a `<Grid container>` whose items share the same column span.\n *\n * @module components/nav-card\n */\n\nimport type { ElementType, ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Chip from '@mui/material/Chip';\nimport Typography from '@mui/material/Typography';\nimport { ChevronRightIcon } from '../../icons/controls.js';\nimport { alpha, type SxProps, type Theme } from '@mui/material/styles';\n\nexport interface NavCardProps {\n /** Card title (rendered as subtitle1, weight 600). */\n title: ReactNode;\n /** Secondary line below the title. */\n description?: ReactNode;\n /** Icon element rendered inside a colored square on the left. */\n icon?: ReactNode;\n /**\n * `'horizontal'` (default) — icon left, text right; works well in\n * 2-column rows (`md: 6`) where each card is wide.\n * `'vertical'` — icon top, text below; required when the card lives\n * in 4-column rows (`md: 3`) or narrower, because the horizontal\n * variant runs out of room for the text and starts breaking letters.\n * Pick orientation per row, not per card.\n */\n orientation?: 'horizontal' | 'vertical';\n /**\n * Palette key for the icon background (e.g. `'primary'`, `'error'`,\n * `'warning.dark'`). Defaults to `'primary'`. The hover border picks\n * up the same color.\n */\n color?: string;\n /**\n * Optional counter shown as a small chip next to the title. Falsy\n * values (`0`, `undefined`, `null`) hide the chip.\n */\n badge?: number | string | null;\n /** Palette key for the badge chip (defaults to `'warning'`). */\n badgeColor?: 'default' | 'primary' | 'secondary' | 'error' | 'info' | 'success' | 'warning';\n /**\n * Navigate to this route. When set, the card renders as the\n * supplied `linkComponent` (e.g. `RouterLink` from react-router) and\n * the whole card becomes a real anchor — Cmd/Ctrl-click opens a new\n * tab, screen readers expose link semantics.\n */\n to?: string;\n /** Custom router link component. Required when `to` is used. */\n linkComponent?: ElementType;\n /** Click handler — used when `to` is not supplied. */\n onClick?: () => void;\n /**\n * Trailing chevron. Pass `false` to suppress, or a ReactNode to\n * substitute (e.g. a status indicator). Default `true`.\n */\n arrow?: boolean | ReactNode;\n /** Square icon size in pixels (default 48). */\n iconSize?: number;\n /** Extra styles applied to the outer Card. */\n sx?: SxProps<Theme>;\n /** Accessible label override. Defaults to `${title} — ${description}`. */\n ariaLabel?: string;\n}\n\nexport function NavCard({\n title,\n description,\n icon,\n color = 'primary',\n badge,\n badgeColor = 'warning',\n orientation = 'horizontal',\n to,\n linkComponent,\n onClick,\n arrow = true,\n iconSize = 48,\n sx,\n ariaLabel,\n}: NavCardProps) {\n const interactive = Boolean(to) || Boolean(onClick);\n const linkProps = to && linkComponent ? { component: linkComponent, to } : {};\n\n const showBadge =\n badge !== undefined && badge !== null && badge !== '' && !(typeof badge === 'number' && badge === 0);\n\n const label =\n ariaLabel ??\n (typeof title === 'string' && typeof description === 'string' ? `${title} — ${description}` : undefined);\n\n const isVertical = orientation === 'vertical';\n\n return (\n <Card\n variant=\"outlined\"\n {...linkProps}\n onClick={!to ? onClick : undefined}\n aria-label={label}\n role={interactive && !to ? 'button' : undefined}\n tabIndex={interactive && !to ? 0 : undefined}\n onKeyDown={\n interactive && !to\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n sx={{\n height: '100%',\n cursor: interactive ? 'pointer' : 'default',\n textDecoration: 'none',\n color: 'inherit',\n // Explicit elevated paper background so the card pops on both\n // light and dark themes — the default `background.paper` is\n // very close to the page background in some dark presets,\n // which made the 1px border read as a faint vertical line\n // rather than a card outline. Falls back gracefully when a\n // theme doesn't define `elevation1`.\n bgcolor: (theme) =>\n theme.palette.background?.elevation2 ?? theme.palette.background?.neutral ?? theme.palette.background.paper,\n // On dark themes the default outlined-Paper border (alpha\n // 0.16 on grey) is too close to both the page bg and the\n // card body — the right edge of each card ends up reading\n // as a free-floating vertical line. Use `text.primary` at\n // a small alpha so the border is unambiguously a card edge\n // regardless of theme contrast, then let hover swap to the\n // accent colour for tactile feedback.\n borderColor: (theme) => alpha(theme.palette.text.primary, theme.palette.mode === 'dark' ? 0.16 : 0.12),\n // Suppress the theme-level Card box-shadow halo for the\n // outlined variant — replicates prism's `Card` wrapper logic\n // so a raw MuiCard (which NavCard uses to be a real anchor)\n // doesn't get a glow that swallows the border.\n boxShadow: 'none',\n transition: 'border-color 0.2s, transform 0.2s, background-color 0.2s',\n '&:hover': interactive\n ? {\n borderColor: `${color}.main`,\n transform: 'translateY(-2px)',\n bgcolor: (theme) =>\n theme.palette.background?.elevation2 ??\n theme.palette.background?.elevation1 ??\n theme.palette.background.paper,\n }\n : undefined,\n '&:focus-visible': {\n outline: 2,\n outlineColor: `${color}.main`,\n outlineOffset: 2,\n },\n ...sx,\n }}\n >\n <CardContent\n sx={{\n p: isVertical ? 2.5 : 3,\n '&:last-child': { pb: isVertical ? 2.5 : 3 },\n height: '100%',\n display: 'flex',\n flexDirection: isVertical ? 'column' : 'row',\n alignItems: isVertical ? 'stretch' : 'center',\n gap: isVertical ? 1.25 : 0,\n }}\n >\n {isVertical ? (\n // Vertical: icon top, title + description stacked below, no\n // chevron (the entire card is the affordance — adding an\n // arrow into a narrow tile just steals text space).\n <>\n {icon && (\n <Box\n sx={{\n width: 40,\n height: 40,\n borderRadius: 1.5,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: `${color}.main`,\n color: `${color}.contrastText`,\n flexShrink: 0,\n }}\n >\n {icon}\n </Box>\n )}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' }}>\n <Typography\n variant=\"subtitle1\"\n sx={{\n fontWeight: 600,\n lineHeight: 1.2,\n }}\n >\n {title}\n </Typography>\n {showBadge && (\n <Chip\n size=\"small\"\n label={badge}\n color={badgeColor}\n sx={{ height: 20, fontSize: '0.7rem', fontWeight: 700 }}\n />\n )}\n </Box>\n {description && (\n <Typography\n variant=\"body2\"\n sx={{\n color: 'text.secondary',\n lineHeight: 1.35,\n\n // Clamp the description to 2 lines so an unusually\n // long copy doesn't push a tile out of its row.\n display: '-webkit-box',\n\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {description}\n </Typography>\n )}\n </>\n ) : (\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', width: '100%', gap: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, minWidth: 0 }}>\n {icon && (\n <Box\n sx={{\n width: iconSize,\n height: iconSize,\n borderRadius: 1.5,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: `${color}.main`,\n color: `${color}.contrastText`,\n flexShrink: 0,\n }}\n >\n {icon}\n </Box>\n )}\n <Box sx={{ minWidth: 0, flex: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' }}>\n <Typography\n variant=\"subtitle1\"\n sx={{\n fontWeight: 600,\n lineHeight: 1.3,\n }}\n >\n {title}\n </Typography>\n {showBadge && (\n <Chip\n size=\"small\"\n label={badge}\n color={badgeColor}\n sx={{ height: 20, fontSize: '0.7rem', fontWeight: 700 }}\n />\n )}\n </Box>\n {description && (\n <Typography\n variant=\"body2\"\n sx={{\n color: 'text.secondary',\n lineHeight: 1.4,\n }}\n >\n {description}\n </Typography>\n )}\n </Box>\n </Box>\n {arrow !== false && (\n <Box sx={{ display: 'flex', alignItems: 'center', flexShrink: 0, color: 'text.secondary' }}>\n {arrow === true ? <ChevronRightIcon /> : arrow}\n </Box>\n )}\n </Box>\n )}\n </CardContent>\n </Card>\n );\n}\n","'use client';\n\n/**\n * NavCardGrid\n *\n * Canonical container for `<NavCard>` rows on admin/dashboard\n * overview pages. Replaces the ad-hoc `<Grid container spacing={3}>`\n * + `<Grid size={{md:3}}>` pattern, which has two failure modes\n * when the tile count is uneven against the column count:\n *\n * 1. The empty trailing cells visually extend the row above's\n * column borders into nothing — reading as orphan vertical\n * \"sticks\" between cards on dark themes.\n * 2. Cards across rows can end up with different heights when\n * their descriptions wrap differently.\n *\n * NavCardGrid solves both with a CSS Grid:\n *\n * - `auto-fit` (not `auto-fill`) collapses empty trailing tracks,\n * so the last row's cards expand to fill the width and their\n * right edges no longer align with the row above.\n * - `minmax(<min>, 1fr)` caps the column count on wide viewports\n * (otherwise 5+ tiny tiles can pack a row).\n * - `grid-auto-rows: 1fr` guarantees equal card height across\n * rows regardless of per-card content length.\n *\n * Use as a drop-in replacement for the Grid wrapper around NavCards\n * in admin dashboards. The contained `<NavCard>` should typically\n * use `orientation=\"vertical\"` so the tiles work at narrow widths.\n *\n * @example\n * ```tsx\n * <NavCardGrid>\n * <NavCard title=\"Users\" icon={<UsersIcon />} to=\"/admin/users\" />\n * <NavCard title=\"Shops\" icon={<ShopsIcon />} to=\"/admin/shops\" />\n * ...\n * </NavCardGrid>\n * ```\n *\n * @module components/nav-card\n */\n\nimport type { ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface NavCardGridProps {\n children: ReactNode;\n /**\n * Minimum tile width before wrap. Effectively caps the column\n * count via `minmax`. Default 260px which gives 4 columns on a\n * typical 1200px content area, 3 on tablet, 2 on small laptops,\n * and 1 on mobile.\n */\n minTileWidth?: number;\n /** Gap between tiles in spacing units. Default 3 (24px). */\n gap?: number;\n /** Custom sx overrides. */\n sx?: SxProps<Theme>;\n}\n\nexport function NavCardGrid({\n children,\n minTileWidth = 260,\n gap = 3,\n sx,\n}: NavCardGridProps) {\n return (\n <Box\n sx={{\n display: 'grid',\n gap,\n // Always 1 column on xs to avoid horizontal overflow on tiny\n // viewports; `auto-fit` from sm upward.\n gridTemplateColumns: {\n xs: '1fr',\n sm: `repeat(auto-fit, minmax(${minTileWidth}px, 1fr))`,\n },\n gridAutoRows: '1fr',\n ...sx,\n }}\n >\n {children}\n </Box>\n );\n}\n","'use client';\n\n/**\n * Drawer Component\n *\n * Enhanced drawer/side panel with custom styling.\n *\n * @module components/drawer\n */\n\nimport type { ReactNode } from 'react';\nimport MuiDrawer from '@mui/material/Drawer';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport Divider from '@mui/material/Divider';\nimport type { PaperProps } from '@mui/material/Paper';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n/**\n * Drawer anchor positions.\n */\nexport type DrawerAnchor = 'left' | 'right' | 'top' | 'bottom';\n\n/**\n * Props for Drawer component.\n */\nexport interface DrawerProps {\n /** Whether the drawer is open */\n open?: boolean;\n /** Drawer anchor position */\n anchor?: DrawerAnchor;\n /** Drawer title */\n title?: ReactNode;\n /** Drawer width (for left/right anchors) */\n width?: number | string;\n /** Drawer height (for top/bottom anchors) */\n height?: number | string;\n /** Show close button */\n showCloseButton?: boolean;\n /** Close button icon */\n closeIcon?: ReactNode;\n /** Header actions */\n headerActions?: ReactNode;\n /** Footer content */\n footer?: ReactNode;\n /** Drawer content */\n children?: ReactNode;\n /** On close handler */\n onClose?: () => void;\n /** Variant: permanent, persistent, or temporary */\n variant?: 'permanent' | 'persistent' | 'temporary';\n /** Props for the Paper component */\n PaperProps?: Partial<PaperProps>;\n /** Custom sx props */\n sx?: SxProps<Theme>;\n}\n\n/**\n * Default close icon.\n */\nfunction DefaultCloseIcon(): ReactNode {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n );\n}\n\n/**\n * Drawer - Enhanced drawer/side panel.\n *\n * @example\n * ```tsx\n * <Drawer\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"Edit Profile\"\n * anchor=\"right\"\n * width={400}\n * >\n * <ProfileForm />\n * </Drawer>\n * ```\n */\nexport function Drawer({\n open,\n anchor = 'right',\n title,\n width = 320,\n height = 'auto',\n showCloseButton = true,\n closeIcon,\n headerActions,\n footer,\n children,\n onClose,\n variant = 'temporary',\n PaperProps,\n sx,\n}: DrawerProps): ReactNode {\n const isHorizontal = anchor === 'left' || anchor === 'right';\n const drawerSize = isHorizontal ? { width } : { height };\n\n return (\n <MuiDrawer\n open={open}\n anchor={anchor}\n variant={variant}\n onClose={onClose}\n transitionDuration={{ enter: 300, exit: 250 }}\n sx={sx}\n slotProps={{\n backdrop: { sx: { backdropFilter: 'blur(2px)' } },\n\n paper: {\n sx: {\n ...drawerSize,\n display: 'flex',\n flexDirection: 'column',\n },\n ...PaperProps,\n }\n }}>\n {/* Header */}\n {(title || showCloseButton || headerActions) && (\n <>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n p: 2,\n minHeight: 64,\n }}\n >\n {title && (\n <Typography variant=\"h6\" component=\"div\">\n {title}\n </Typography>\n )}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, ml: 'auto' }}>\n {headerActions}\n {showCloseButton && onClose && (\n <IconButton onClick={onClose} edge=\"end\" size=\"small\" aria-label=\"Close drawer\">\n {closeIcon ?? <DefaultCloseIcon />}\n </IconButton>\n )}\n </Box>\n </Box>\n <Divider />\n </>\n )}\n {/* Content */}\n <Box\n sx={{\n flex: 1,\n overflow: 'auto',\n p: 2,\n }}\n >\n {children}\n </Box>\n {/* Footer */}\n {footer && (\n <>\n <Divider />\n <Box sx={{ p: 2 }}>{footer}</Box>\n </>\n )}\n </MuiDrawer>\n );\n}\n","/**\n * Lightbox Component Types\n *\n * Type definitions for the Lightbox component - a modal image viewer\n * with zoom, pan, and navigation capabilities.\n *\n * @module components/lightbox\n */\n\nimport type { Theme, SxProps } from '@mui/material/styles';\nimport type { DialogProps } from '@mui/material/Dialog';\n\n// =============================================================================\n// LIGHTBOX SLIDE TYPES\n// =============================================================================\n\n/**\n * Individual slide/image in the lightbox.\n */\nexport interface LightboxSlide {\n /** Image source URL */\n src: string;\n /** Alt text for accessibility */\n alt?: string;\n /** Optional title displayed below image */\n title?: string;\n /** Optional description/caption */\n description?: string;\n /** Video source (if slide is a video) */\n video?: {\n /** Video sources with type */\n sources: Array<{ src: string; type: string }>;\n /** Autoplay video */\n autoPlay?: boolean;\n /** Loop video */\n loop?: boolean;\n /** Muted by default */\n muted?: boolean;\n /** Poster image */\n poster?: string;\n };\n /** Thumbnail URL (defaults to src) */\n thumbnail?: string;\n /** Width for sizing calculations */\n width?: number;\n /** Height for sizing calculations */\n height?: number;\n /** Additional slide data */\n [key: string]: unknown;\n}\n\n// =============================================================================\n// LIGHTBOX LABELS\n// =============================================================================\n\n/**\n * Accessible names for the lightbox's controls, so a consumer can localise\n * them.\n *\n * Every one of these buttons is an icon: there is no visible text beside it,\n * so the `aria-label` is the ONLY text a screen reader has to offer. Written\n * into the component they were English on a Russian-first product — and the\n * lightbox is where a person looks at a photograph someone sent them in chat,\n * an image in a shop review, or a picture in the documentation.\n *\n * Defaults keep the previous strings verbatim, so a consumer that passes\n * nothing is unchanged.\n */\nexport interface LightboxLabels {\n zoomIn: string;\n zoomOut: string;\n download: string;\n share: string;\n close: string;\n previous: string;\n next: string;\n}\n\n/** The strings the lightbox used before `labels` existed. */\nexport const DEFAULT_LIGHTBOX_LABELS: LightboxLabels = {\n zoomIn: 'Zoom in',\n zoomOut: 'Zoom out',\n download: 'Download',\n share: 'Share',\n close: 'Close',\n previous: 'Previous',\n next: 'Next',\n};\n\n// =============================================================================\n// LIGHTBOX PROPS\n// =============================================================================\n\n/**\n * Lightbox component props.\n */\nexport interface LightboxProps extends Omit<DialogProps, 'open' | 'onClose' | 'children' | 'slotProps'> {\n /** Whether the lightbox is open */\n open: boolean;\n /** Callback when lightbox should close */\n onClose: () => void;\n /** Array of slides to display */\n slides: LightboxSlide[];\n /** Initial slide index (default: 0) */\n index?: number;\n /** Callback when slide changes */\n onIndexChange?: (index: number) => void;\n /** Show thumbnails strip */\n thumbnails?: boolean;\n /** Show zoom controls */\n zoom?: boolean;\n /** Enable fullscreen mode */\n fullscreen?: boolean;\n /** Show slide counter */\n counter?: boolean;\n /** Show download button */\n download?: boolean;\n /** Show share button */\n share?: boolean;\n /** Enable infinite loop navigation */\n loop?: boolean;\n /** Enable keyboard navigation */\n keyboard?: boolean;\n /** Enable swipe gestures */\n swipe?: boolean;\n /** Animation duration in ms */\n animation?: number;\n /** Close on backdrop click */\n closeOnBackdropClick?: boolean;\n /** Close on escape key */\n closeOnEsc?: boolean;\n /** Custom toolbar actions */\n toolbar?: {\n /** Show toolbar */\n show?: boolean;\n /** Toolbar position */\n position?: 'top' | 'bottom';\n /** Custom buttons */\n buttons?: React.ReactNode[];\n };\n /** Accessible names for the controls. Partial — anything omitted keeps\n * its English default. See {@link LightboxLabels}. */\n labels?: Partial<LightboxLabels>;\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Slot props for internal components */\n slotProps?: {\n /** Root container styles */\n root?: SxProps<Theme>;\n /** Backdrop styles */\n backdrop?: SxProps<Theme>;\n /** Image container styles */\n imageContainer?: SxProps<Theme>;\n /** Toolbar styles */\n toolbar?: SxProps<Theme>;\n /** Thumbnails container styles */\n thumbnails?: SxProps<Theme>;\n /** Navigation button styles */\n navButton?: SxProps<Theme>;\n /** Counter styles */\n counter?: SxProps<Theme>;\n };\n}\n\n// =============================================================================\n// LIGHTBOX TOOLBAR PROPS\n// =============================================================================\n\n/**\n * Lightbox toolbar props.\n */\nexport interface LightboxToolbarProps {\n /** Current slide index */\n index: number;\n /** Total number of slides */\n total: number;\n /** Current zoom level */\n zoomLevel: number;\n /** Whether fullscreen is active */\n isFullscreen: boolean;\n /** Zoom in handler */\n onZoomIn?: () => void;\n /** Zoom out handler */\n onZoomOut?: () => void;\n /** Reset zoom handler */\n onZoomReset?: () => void;\n /** Toggle fullscreen handler */\n onFullscreen?: () => void;\n /** Download handler */\n onDownload?: () => void;\n /** Share handler */\n onShare?: () => void;\n /** Close handler */\n onClose: () => void;\n /** Show zoom controls */\n showZoom?: boolean;\n /** Show fullscreen button */\n showFullscreen?: boolean;\n /** Show download button */\n showDownload?: boolean;\n /** Show share button */\n showShare?: boolean;\n /** Show counter */\n showCounter?: boolean;\n /** Custom buttons */\n customButtons?: React.ReactNode[];\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// LIGHTBOX THUMBNAILS PROPS\n// =============================================================================\n\n/**\n * Lightbox thumbnails strip props.\n */\nexport interface LightboxThumbnailsProps {\n /** Slides to show thumbnails for */\n slides: LightboxSlide[];\n /** Currently active index */\n activeIndex: number;\n /** Thumbnail click handler */\n onSelect: (index: number) => void;\n /** Thumbnail size */\n size?: 'small' | 'medium' | 'large';\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// LIGHTBOX HOOK RETURN TYPE\n// =============================================================================\n\n/**\n * Return type for useLightbox hook.\n */\nexport interface UseLightboxReturn {\n /** Whether lightbox is open */\n open: boolean;\n /** Current slide index */\n index: number;\n /** Open lightbox at specific index */\n onOpen: (index?: number) => void;\n /** Close lightbox */\n onClose: () => void;\n /** Go to specific slide */\n goTo: (index: number) => void;\n /** Go to next slide */\n next: () => void;\n /** Go to previous slide */\n prev: () => void;\n /**\n * Props to spread on the Lightbox component.\n *\n * Note what is NOT here, and was not before: zoom. `<Lightbox>` owns its\n * own zoom state and exposes no prop to drive it — `zoom` on that component\n * is a boolean that shows or hides the controls. The hook used to return\n * `zoomLevel`, `zoomIn`, `zoomOut` and `zoomReset` anyway, four exported\n * members that moved a number nothing rendered. A consumer following this\n * hook's own example would have called them and seen nothing happen.\n *\n * Adding real control means giving `LightboxProps` a controlled\n * `zoomLevel` / `onZoomChange` pair and routing the component's seven\n * internal `setZoomLevel` calls through it. Worth doing when something\n * needs it; not worth pretending until then.\n */\n getLightboxProps: () => Pick<LightboxProps, 'open' | 'onClose' | 'index' | 'onIndexChange'>;\n}\n","/**\n * Lightbox CSS Classes\n *\n * @module components/lightbox\n */\n\nimport { createClasses } from '../../utils/create-classes.js';\n\n/**\n * CSS class names for Lightbox component.\n */\nexport const lightboxClasses = {\n root: createClasses('lightbox__root'),\n backdrop: createClasses('lightbox__backdrop'),\n container: createClasses('lightbox__container'),\n slide: createClasses('lightbox__slide'),\n slideActive: createClasses('lightbox__slide--active'),\n image: createClasses('lightbox__image'),\n video: createClasses('lightbox__video'),\n caption: createClasses('lightbox__caption'),\n toolbar: createClasses('lightbox__toolbar'),\n toolbarTop: createClasses('lightbox__toolbar--top'),\n toolbarBottom: createClasses('lightbox__toolbar--bottom'),\n toolbarButton: createClasses('lightbox__toolbar__button'),\n navButton: createClasses('lightbox__nav'),\n navPrev: createClasses('lightbox__nav--prev'),\n navNext: createClasses('lightbox__nav--next'),\n counter: createClasses('lightbox__counter'),\n thumbnails: createClasses('lightbox__thumbnails'),\n thumbnail: createClasses('lightbox__thumbnail'),\n thumbnailActive: createClasses('lightbox__thumbnail--active'),\n zoom: createClasses('lightbox__zoom'),\n zoomed: createClasses('lightbox__zoomed'),\n loading: createClasses('lightbox__loading'),\n error: createClasses('lightbox__error'),\n};\n","'use client';\n\n/**\n * Lightbox Component\n *\n * Premium modal image/video viewer with smooth crossfade transitions,\n * glassmorphism UI, zoom, pan, touch gestures, and keyboard navigation.\n *\n * @module components/lightbox\n */\n\nimport type { LightboxProps, LightboxSlide } from './types.js';\nimport { DEFAULT_LIGHTBOX_LABELS } from './types.js';\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\n\nimport Box from '@mui/material/Box';\nimport Dialog from '@mui/material/Dialog';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport { styled, alpha, useTheme } from '@mui/material/styles';\n\n// MUI Icons (standard for design system components)\nimport { CloseIcon } from '../../icons/controls.js';\nimport { ChevronLeftIcon } from '../../icons/controls.js';\nimport { ChevronRightIcon } from '../../icons/controls.js';\nimport { ZoomInIcon } from '../../icons/controls.js';\nimport { ZoomOutIcon } from '../../icons/controls.js';\nimport { FullscreenIcon } from '../../icons/controls.js';\nimport { FullscreenExitIcon } from '../../icons/controls.js';\nimport { DownloadIcon } from '../../icons/controls.js';\nimport { ShareIcon } from '../../icons/controls.js';\nimport { PlayIcon as PlayArrowIcon } from '../../icons/controls.js';\n\nimport { cn } from '../../utils/cn.js';\nimport { lightboxClasses } from './classes.js';\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst MIN_ZOOM = 1;\nconst MAX_ZOOM = 4;\nconst ZOOM_STEP = 0.5;\nconst SWIPE_THRESHOLD = 60;\nconst TRANSITION_DURATION = 400;\n\n// =============================================================================\n// LIGHTBOX COMPONENT\n// =============================================================================\n\n/**\n * Full-screen modal image/video viewer with smooth crossfade transitions.\n *\n * @example\n * ```tsx\n * import { Lightbox, useLightbox } from '@omnitron-dev/prism/components';\n *\n * function Gallery() {\n * const lightbox = useLightbox({ totalSlides: images.length });\n *\n * return (\n * <>\n * <ImageList>\n * {images.map((img, i) => (\n * <ImageListItem key={i} onClick={() => lightbox.onOpen(i)}>\n * <img src={img.thumbnail} />\n * </ImageListItem>\n * ))}\n * </ImageList>\n *\n * <Lightbox\n * slides={images}\n * thumbnails\n * zoom\n * {...lightbox.getLightboxProps()}\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function Lightbox({\n open,\n onClose,\n slides,\n index: controlledIndex = 0,\n onIndexChange,\n thumbnails = false,\n zoom = true,\n fullscreen = true,\n counter = true,\n download = false,\n share = false,\n loop = false,\n keyboard = true,\n swipe = true,\n animation = TRANSITION_DURATION,\n closeOnBackdropClick = true,\n closeOnEsc = true,\n toolbar = { show: true, position: 'top' },\n labels: labelOverrides,\n sx,\n slotProps,\n className,\n ...dialogProps\n}: LightboxProps) {\n const theme = useTheme();\n\n // Merged once per identity change, so a consumer passing an inline object\n // does not rebuild the toolbar on every render.\n const labels = useMemo(() => ({ ...DEFAULT_LIGHTBOX_LABELS, ...labelOverrides }), [labelOverrides]);\n\n // State\n const [currentIndex, setCurrentIndex] = useState(controlledIndex);\n const [zoomLevel, setZoomLevel] = useState(MIN_ZOOM);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const [isDragging, setIsDragging] = useState(false);\n\n // Transition state: track previous index for crossfade direction\n const [transitionState, setTransitionState] = useState<'idle' | 'transitioning'>('idle');\n const [prevIndex, setPrevIndex] = useState(controlledIndex);\n const [slideDirection, setSlideDirection] = useState<'left' | 'right' | 'none'>('none');\n\n // Refs\n const containerRef = useRef<HTMLDivElement>(null);\n const dragStart = useRef({ x: 0, y: 0 });\n const touchStart = useRef({ x: 0, y: 0 });\n const thumbnailsRef = useRef<HTMLDivElement>(null);\n\n // Sync with controlled index\n useEffect(() => {\n if (controlledIndex !== currentIndex) {\n navigateToSlide(controlledIndex);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [controlledIndex]);\n\n // Reset state when opening\n useEffect(() => {\n if (open) {\n setZoomLevel(MIN_ZOOM);\n setPosition({ x: 0, y: 0 });\n setIsLoading(true);\n setTransitionState('idle');\n setSlideDirection('none');\n }\n }, [open]);\n\n // Current slide\n const currentSlide = slides[currentIndex] as LightboxSlide | undefined;\n const totalSlides = slides.length;\n const hasNext = loop || currentIndex < totalSlides - 1;\n const hasPrev = loop || currentIndex > 0;\n const isZoomed = zoomLevel > MIN_ZOOM;\n\n // Navigation with crossfade transition\n const navigateToSlide = useCallback(\n (newIndex: number) => {\n const targetIndex = loop\n ? (newIndex + totalSlides) % totalSlides\n : Math.max(0, Math.min(newIndex, totalSlides - 1));\n\n if (targetIndex === currentIndex) return;\n\n // Determine direction\n const direction = targetIndex > currentIndex ? 'left' : 'right';\n\n setPrevIndex(currentIndex);\n setSlideDirection(direction);\n setTransitionState('transitioning');\n setCurrentIndex(targetIndex);\n onIndexChange?.(targetIndex);\n setZoomLevel(MIN_ZOOM);\n setPosition({ x: 0, y: 0 });\n setIsLoading(true);\n\n // End transition after animation\n setTimeout(() => {\n setTransitionState('idle');\n setSlideDirection('none');\n }, animation);\n },\n [loop, totalSlides, currentIndex, onIndexChange, animation]\n );\n\n const next = useCallback(() => {\n if (hasNext) navigateToSlide(currentIndex + 1);\n }, [hasNext, currentIndex, navigateToSlide]);\n\n const prev = useCallback(() => {\n if (hasPrev) navigateToSlide(currentIndex - 1);\n }, [hasPrev, currentIndex, navigateToSlide]);\n\n // Direct navigation (from thumbnails — no directional slide)\n const goTo = useCallback(\n (newIndex: number) => {\n navigateToSlide(newIndex);\n },\n [navigateToSlide]\n );\n\n // Zoom handlers\n const zoomIn = useCallback(() => {\n setZoomLevel((prevZoom) => Math.min(prevZoom + ZOOM_STEP, MAX_ZOOM));\n }, []);\n\n const zoomOut = useCallback(() => {\n // The pan reset happens beside the state update, not inside its updater.\n // React may run an updater more than once — under `StrictMode` it does so\n // deliberately — and an updater that calls another setter is exactly the\n // shape that made `useCountdown` fire its completion callback four times.\n setZoomLevel((prevZoom) => Math.max(prevZoom - ZOOM_STEP, MIN_ZOOM));\n }, []);\n\n // Panning only means anything while zoomed in; recentre as soon as it is not.\n useEffect(() => {\n if (zoomLevel === MIN_ZOOM) setPosition({ x: 0, y: 0 });\n }, [zoomLevel]);\n\n const zoomReset = useCallback(() => {\n setZoomLevel(MIN_ZOOM);\n setPosition({ x: 0, y: 0 });\n }, []);\n\n // Fullscreen\n const toggleFullscreen = useCallback(async () => {\n if (!document.fullscreenElement) {\n await containerRef.current?.requestFullscreen();\n setIsFullscreen(true);\n } else {\n await document.exitFullscreen();\n setIsFullscreen(false);\n }\n }, []);\n\n // Download\n const handleDownload = useCallback(async () => {\n if (!currentSlide?.src) return;\n try {\n const response = await fetch(currentSlide.src);\n const blob = await response.blob();\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = currentSlide.title || `image-${currentIndex + 1}`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n } catch (error) {\n console.error('Download failed:', error);\n }\n }, [currentSlide, currentIndex]);\n\n // Share\n const handleShare = useCallback(async () => {\n if (!currentSlide?.src) return;\n try {\n if (navigator.share) {\n await navigator.share({\n title: currentSlide.title || 'Image',\n url: currentSlide.src,\n });\n } else {\n await navigator.clipboard.writeText(currentSlide.src);\n }\n } catch (error) {\n console.error('Share failed:', error);\n }\n }, [currentSlide]);\n\n // Keyboard navigation\n useEffect(() => {\n if (!open || !keyboard) return undefined;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowLeft':\n prev();\n break;\n case 'ArrowRight':\n next();\n break;\n case 'Escape':\n if (closeOnEsc) onClose();\n break;\n case '+':\n case '=':\n if (zoom) zoomIn();\n break;\n case '-':\n if (zoom) zoomOut();\n break;\n case '0':\n if (zoom) zoomReset();\n break;\n case 'f':\n if (fullscreen) toggleFullscreen();\n break;\n // no default\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [open, keyboard, zoom, fullscreen, closeOnEsc, prev, next, zoomIn, zoomOut, zoomReset, toggleFullscreen, onClose]);\n\n // Mouse drag for panning when zoomed\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (!isZoomed) return;\n e.preventDefault();\n setIsDragging(true);\n dragStart.current = { x: e.clientX - position.x, y: e.clientY - position.y };\n },\n [isZoomed, position]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isDragging || !isZoomed) return;\n setPosition({\n x: e.clientX - dragStart.current.x,\n y: e.clientY - dragStart.current.y,\n });\n },\n [isDragging, isZoomed]\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n // Touch swipe for navigation and panning\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (!touch) return;\n touchStart.current = { x: touch.clientX, y: touch.clientY };\n if (isZoomed) {\n setIsDragging(true);\n dragStart.current = { x: touch.clientX - position.x, y: touch.clientY - position.y };\n }\n },\n [isZoomed, position]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (!touch) return;\n if (isDragging && isZoomed) {\n setPosition({\n x: touch.clientX - dragStart.current.x,\n y: touch.clientY - dragStart.current.y,\n });\n }\n },\n [isDragging, isZoomed]\n );\n\n const handleTouchEnd = useCallback(\n (e: React.TouchEvent) => {\n if (isDragging) {\n setIsDragging(false);\n return;\n }\n\n if (!swipe || isZoomed) return;\n\n const touch = e.changedTouches[0];\n if (!touch) return;\n const deltaX = touch.clientX - touchStart.current.x;\n const deltaY = touch.clientY - touchStart.current.y;\n\n if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > SWIPE_THRESHOLD) {\n if (deltaX > 0) {\n prev();\n } else {\n next();\n }\n }\n },\n [swipe, isZoomed, isDragging, prev, next]\n );\n\n // Image load handler\n const handleImageLoad = useCallback(() => {\n setIsLoading(false);\n }, []);\n\n // Backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (closeOnBackdropClick && e.target === e.currentTarget && !isZoomed) {\n onClose();\n }\n },\n [closeOnBackdropClick, isZoomed, onClose]\n );\n\n // Double click to zoom\n const handleDoubleClick = useCallback(() => {\n if (!zoom) return;\n if (isZoomed) {\n zoomReset();\n } else {\n setZoomLevel(2);\n }\n }, [zoom, isZoomed, zoomReset]);\n\n // Scroll active thumbnail into view\n useEffect(() => {\n if (!thumbnails || !thumbnailsRef.current) return;\n const container = thumbnailsRef.current;\n const activeThumb = container.children[currentIndex] as HTMLElement | undefined;\n if (activeThumb) {\n activeThumb.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n }, [currentIndex, thumbnails]);\n\n // Previous slide data (for crossfade)\n const prevSlide = slides[prevIndex] as LightboxSlide | undefined;\n\n // Zoom percentage text\n const zoomPercent = useMemo(() => Math.round(zoomLevel * 100), [zoomLevel]);\n\n if (!currentSlide) return null;\n\n const isVideo = Boolean(currentSlide.video);\n const isPrevVideo = Boolean(prevSlide?.video);\n const transitionMs = animation;\n\n return (\n <StyledDialog\n open={open}\n onClose={onClose}\n maxWidth={false}\n fullScreen\n className={cn(lightboxClasses.root, className)}\n sx={sx}\n {...dialogProps}\n >\n <LightboxContainer ref={containerRef} className={lightboxClasses.container} sx={slotProps?.root}>\n {/* Toolbar - Top */}\n {toolbar?.show && toolbar?.position === 'top' && (\n <GlassToolbar\n className={cn(lightboxClasses.toolbar, lightboxClasses.toolbarTop)}\n placement=\"top\"\n sx={slotProps?.toolbar}\n >\n {counter && (\n <CounterChip className={lightboxClasses.counter} sx={slotProps?.counter}>\n {currentIndex + 1}\n <Typography component=\"span\" sx={{ mx: 0.5, opacity: 0.5 }}>\n /\n </Typography>\n {totalSlides}\n </CounterChip>\n )}\n\n <Box sx={{ flex: 1 }} />\n\n {/* Zoom controls with level indicator */}\n {zoom && (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.25 }}>\n <GlassButton\n onClick={zoomOut}\n disabled={zoomLevel <= MIN_ZOOM}\n aria-label={labels.zoomOut}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <ZoomOutIcon fontSize=\"small\" />\n </GlassButton>\n\n {isZoomed && (\n <Typography\n sx={{\n color: 'common.white',\n fontSize: '0.6875rem',\n fontWeight: 600,\n minWidth: 36,\n textAlign: 'center',\n opacity: 0.8,\n }}\n >\n {zoomPercent}%\n </Typography>\n )}\n\n <GlassButton\n onClick={zoomIn}\n disabled={zoomLevel >= MAX_ZOOM}\n aria-label={labels.zoomIn}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <ZoomInIcon fontSize=\"small\" />\n </GlassButton>\n </Box>\n )}\n\n {fullscreen && (\n <GlassButton\n onClick={toggleFullscreen}\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n {isFullscreen ? <FullscreenExitIcon fontSize=\"small\" /> : <FullscreenIcon fontSize=\"small\" />}\n </GlassButton>\n )}\n\n {download && (\n <GlassButton\n onClick={handleDownload}\n aria-label={labels.download}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <DownloadIcon fontSize=\"small\" />\n </GlassButton>\n )}\n\n {share && (\n <GlassButton\n onClick={handleShare}\n aria-label={labels.share}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <ShareIcon fontSize=\"small\" />\n </GlassButton>\n )}\n\n {toolbar?.buttons}\n\n <GlassButton\n onClick={onClose}\n aria-label={labels.close}\n className={lightboxClasses.toolbarButton}\n size=\"small\"\n >\n <CloseIcon fontSize=\"small\" />\n </GlassButton>\n </GlassToolbar>\n )}\n\n {/* Main content area — layered slides for crossfade */}\n <SlideContainer\n className={cn(lightboxClasses.slide, lightboxClasses.slideActive, {\n [lightboxClasses.zoomed]: isZoomed,\n })}\n onClick={handleBackdropClick}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n onDoubleClick={handleDoubleClick}\n sx={{\n ...slotProps?.imageContainer,\n cursor: isZoomed ? (isDragging ? 'grabbing' : 'grab') : 'default',\n }}\n >\n {/* === Outgoing (previous) slide — fades out with directional shift === */}\n {transitionState === 'transitioning' && prevSlide && prevIndex !== currentIndex && (\n <SlideLayer\n sx={{\n opacity: 0,\n transform:\n slideDirection === 'left'\n ? 'translateX(-8%) scale(0.95)'\n : slideDirection === 'right'\n ? 'translateX(8%) scale(0.95)'\n : 'scale(0.95)',\n transition: `opacity ${transitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), transform ${transitionMs}ms cubic-bezier(0.4, 0, 0.2, 1)`,\n zIndex: 1,\n }}\n >\n {isPrevVideo && prevSlide.video ? (\n <StyledVideo poster={prevSlide.video.poster}>\n {prevSlide.video.sources.map((source, i) => (\n <source key={i} src={source.src} type={source.type} />\n ))}\n </StyledVideo>\n ) : (\n <StyledImage src={prevSlide.src} alt=\"\" draggable={false} />\n )}\n </SlideLayer>\n )}\n\n {/* === Current (incoming) slide — fades in with directional entrance === */}\n <SlideLayer\n sx={{\n opacity: transitionState === 'transitioning' ? 0 : 1,\n transform:\n transitionState === 'transitioning'\n ? slideDirection === 'left'\n ? 'translateX(8%) scale(0.95)'\n : slideDirection === 'right'\n ? 'translateX(-8%) scale(0.95)'\n : 'scale(0.95)'\n : 'translateX(0) scale(1)',\n transition:\n transitionState === 'idle'\n ? `opacity ${transitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), transform ${transitionMs}ms cubic-bezier(0.4, 0, 0.2, 1)`\n : 'none',\n zIndex: 2,\n // Force repaint trick: on next tick the idle state kicks in with transition\n animation:\n transitionState === 'transitioning'\n ? `lightboxSlideIn ${transitionMs}ms cubic-bezier(0.16, 1, 0.3, 1) forwards`\n : undefined,\n '@keyframes lightboxSlideIn': {\n from: {\n opacity: 0,\n transform:\n slideDirection === 'left'\n ? 'translateX(5%) scale(0.97)'\n : slideDirection === 'right'\n ? 'translateX(-5%) scale(0.97)'\n : 'scale(0.97)',\n },\n to: {\n opacity: 1,\n transform: 'translateX(0) scale(1)',\n },\n },\n }}\n >\n {/* Loading indicator */}\n {isLoading && !isVideo && (\n <LoadingOverlay className={lightboxClasses.loading}>\n <CircularProgress\n size={40}\n thickness={2.5}\n sx={{\n color: alpha(theme.palette.primary.main, 0.8),\n }}\n />\n </LoadingOverlay>\n )}\n\n {/* Image/Video content */}\n {isVideo && currentSlide.video ? (\n <VideoWrapper>\n <StyledVideo\n className={lightboxClasses.video}\n controls\n autoPlay={currentSlide.video.autoPlay}\n loop={currentSlide.video.loop}\n muted={currentSlide.video.muted}\n poster={currentSlide.video.poster}\n onLoadedData={handleImageLoad}\n style={{\n transform: `scale(${zoomLevel}) translate(${position.x / zoomLevel}px, ${position.y / zoomLevel}px)`,\n transition: isDragging ? 'none' : `transform ${animation}ms ease`,\n }}\n />\n </VideoWrapper>\n ) : (\n <StyledImage\n className={lightboxClasses.image}\n src={currentSlide.src}\n alt={currentSlide.alt || `Slide ${currentIndex + 1}`}\n onLoad={handleImageLoad}\n draggable={false}\n style={{\n transform: `scale(${zoomLevel}) translate(${position.x / zoomLevel}px, ${position.y / zoomLevel}px)`,\n transition: isDragging ? 'none' : `transform ${animation}ms ease`,\n opacity: isLoading ? 0 : 1,\n }}\n />\n )}\n </SlideLayer>\n\n {/* Caption */}\n {(currentSlide.title || currentSlide.description) && !isZoomed && (\n <GlassCaption className={lightboxClasses.caption}>\n {currentSlide.title && (\n <Typography variant=\"subtitle1\" component=\"div\" sx={{ fontWeight: 600, lineHeight: 1.3 }}>\n {currentSlide.title}\n </Typography>\n )}\n {currentSlide.description && (\n <Typography variant=\"body2\" sx={{ opacity: 0.7, mt: 0.25 }}>\n {currentSlide.description}\n </Typography>\n )}\n </GlassCaption>\n )}\n </SlideContainer>\n\n {/* Navigation arrows */}\n {hasPrev && !isZoomed && (\n <NavArrow\n className={cn(lightboxClasses.navButton, lightboxClasses.navPrev)}\n side=\"left\"\n onClick={prev}\n aria-label={labels.previous}\n sx={slotProps?.navButton}\n >\n <ChevronLeftIcon sx={{ fontSize: 28 }} />\n </NavArrow>\n )}\n\n {hasNext && !isZoomed && (\n <NavArrow\n className={cn(lightboxClasses.navButton, lightboxClasses.navNext)}\n side=\"right\"\n onClick={next}\n aria-label={labels.next}\n sx={slotProps?.navButton}\n >\n <ChevronRightIcon sx={{ fontSize: 28 }} />\n </NavArrow>\n )}\n\n {/* Thumbnails */}\n {thumbnails && !isZoomed && (\n <ThumbnailStrip ref={thumbnailsRef} className={lightboxClasses.thumbnails} sx={slotProps?.thumbnails}>\n {slides.map((slide, i) => {\n const isThumbVideo = Boolean(slide.video);\n\n return (\n <ThumbItem\n key={i}\n className={cn(lightboxClasses.thumbnail, {\n [lightboxClasses.thumbnailActive]: i === currentIndex,\n })}\n active={i === currentIndex}\n onClick={() => goTo(i)}\n >\n <img\n src={slide.thumbnail || slide.video?.poster || slide.src}\n alt={slide.alt || `Thumbnail ${i + 1}`}\n draggable={false}\n />\n {/* Video indicator on thumbnail */}\n {isThumbVideo && (\n <Box\n sx={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: alpha(theme.palette.common.black, 0.35),\n }}\n >\n <PlayArrowIcon sx={{ fontSize: 18, color: 'common.white', opacity: 0.9 }} />\n </Box>\n )}\n </ThumbItem>\n );\n })}\n </ThumbnailStrip>\n )}\n\n {/* Toolbar - Bottom */}\n {toolbar?.show && toolbar?.position === 'bottom' && (\n <GlassToolbar\n className={cn(lightboxClasses.toolbar, lightboxClasses.toolbarBottom)}\n placement=\"bottom\"\n sx={slotProps?.toolbar}\n >\n {counter && (\n <CounterChip className={lightboxClasses.counter} sx={slotProps?.counter}>\n {currentIndex + 1}\n <Typography component=\"span\" sx={{ mx: 0.5, opacity: 0.5 }}>\n /\n </Typography>\n {totalSlides}\n </CounterChip>\n )}\n <Box sx={{ flex: 1 }} />\n <GlassButton onClick={onClose} aria-label={labels.close} size=\"small\">\n <CloseIcon fontSize=\"small\" />\n </GlassButton>\n </GlassToolbar>\n )}\n </LightboxContainer>\n </StyledDialog>\n );\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst StyledDialog = styled(Dialog)(({ theme }) => ({\n '& .MuiDialog-paper': {\n backgroundColor: 'transparent',\n boxShadow: 'none',\n margin: 0,\n maxWidth: '100%',\n maxHeight: '100%',\n borderRadius: 0,\n },\n '& .MuiBackdrop-root': {\n backgroundColor: alpha(theme.palette.common.black, 0.92),\n backdropFilter: 'blur(8px)',\n },\n}));\n\nconst LightboxContainer = styled(Box)({\n display: 'flex',\n flexDirection: 'column',\n width: '100vw',\n height: '100vh',\n position: 'relative',\n overflow: 'hidden',\n userSelect: 'none',\n});\n\n// --- Glassmorphism Toolbar ---\n\nconst GlassToolbar = styled(Box)<{ placement: 'top' | 'bottom' }>(({ theme, placement }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n padding: theme.spacing(1, 1.5),\n position: 'absolute',\n left: 0,\n right: 0,\n zIndex: 10,\n ...(placement === 'top' && { top: 0 }),\n ...(placement === 'bottom' && { bottom: 0 }),\n background: `linear-gradient(${placement === 'top' ? 'to bottom' : 'to top'}, ${alpha(theme.palette.common.black, 0.55)} 0%, ${alpha(theme.palette.common.black, 0.2)} 60%, transparent 100%)`,\n transition: 'opacity 0.3s ease',\n}));\n\nconst GlassButton = styled(IconButton)(({ theme }) => ({\n color: alpha(theme.palette.common.white, 0.85),\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n padding: 6,\n transition: theme.transitions.create(['background-color', 'color', 'transform'], {\n duration: 200,\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.common.white, 0.12),\n color: theme.palette.common.white,\n transform: 'scale(1.05)',\n },\n '&:active': {\n transform: 'scale(0.95)',\n },\n '&.Mui-disabled': {\n color: alpha(theme.palette.common.white, 0.2),\n },\n}));\n\nconst CounterChip = styled(Typography)(({ theme }) => ({\n color: alpha(theme.palette.common.white, 0.9),\n fontSize: '0.75rem',\n fontWeight: 600,\n fontVariantNumeric: 'tabular-nums',\n padding: theme.spacing(0.375, 1),\n borderRadius: Number(theme.shape.borderRadius) * 2,\n backgroundColor: alpha(theme.palette.common.white, 0.1),\n backdropFilter: 'blur(12px)',\n border: `1px solid ${alpha(theme.palette.common.white, 0.08)}`,\n display: 'flex',\n alignItems: 'center',\n letterSpacing: '0.02em',\n}));\n\n// --- Slide Area ---\n\nconst SlideContainer = styled(Box)({\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n overflow: 'hidden',\n});\n\n/** Absolute layer for crossfade transitions */\nconst SlideLayer = styled(Box)({\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n willChange: 'opacity, transform',\n});\n\nconst LoadingOverlay = styled(Box)({\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 5,\n});\n\nconst StyledImage = styled('img')({\n maxWidth: '100%',\n maxHeight: '100%',\n objectFit: 'contain',\n willChange: 'transform, opacity',\n borderRadius: 2,\n});\n\nconst VideoWrapper = styled(Box)({\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n maxWidth: '100%',\n maxHeight: '100%',\n});\n\nconst StyledVideo = styled('video')(({ theme }) => ({\n maxWidth: '100%',\n maxHeight: '100%',\n objectFit: 'contain',\n willChange: 'transform',\n borderRadius: 4,\n // Custom video controls styling\n '&::-webkit-media-controls-panel': {\n backgroundColor: alpha(theme.palette.common.black, 0.6),\n backdropFilter: 'blur(8px)',\n },\n '&::-webkit-media-controls-current-time-display, &::-webkit-media-controls-time-remaining-display': {\n color: theme.palette.common.white,\n fontSize: 12,\n },\n}));\n\n// --- Caption ---\n\nconst GlassCaption = styled(Box)(({ theme }) => ({\n position: 'absolute',\n bottom: theme.spacing(2.5),\n left: '50%',\n transform: 'translateX(-50%)',\n textAlign: 'center',\n color: theme.palette.common.white,\n padding: theme.spacing(1, 2.5),\n borderRadius: Number(theme.shape.borderRadius) * 2,\n backgroundColor: alpha(theme.palette.common.black, 0.45),\n backdropFilter: 'blur(16px)',\n border: `1px solid ${alpha(theme.palette.common.white, 0.08)}`,\n maxWidth: '70%',\n zIndex: 5,\n animation: 'lightboxCaptionIn 0.3s ease-out',\n '@keyframes lightboxCaptionIn': {\n from: { opacity: 0, transform: 'translateX(-50%) translateY(8px)' },\n to: { opacity: 1, transform: 'translateX(-50%) translateY(0)' },\n },\n}));\n\n// --- Navigation Arrows ---\n\nconst NavArrow = styled(IconButton)<{ side: 'left' | 'right' }>(({ theme, side }) => ({\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n color: alpha(theme.palette.common.white, 0.85),\n zIndex: 10,\n width: 44,\n height: 44,\n borderRadius: '50%',\n backgroundColor: alpha(theme.palette.common.white, 0.08),\n backdropFilter: 'blur(12px)',\n border: `1px solid ${alpha(theme.palette.common.white, 0.06)}`,\n ...(side === 'left' && { left: theme.spacing(2) }),\n ...(side === 'right' && { right: theme.spacing(2) }),\n transition: theme.transitions.create(['background-color', 'color', 'transform', 'box-shadow'], {\n duration: 200,\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.common.white, 0.16),\n color: theme.palette.common.white,\n transform: 'translateY(-50%) scale(1.08)',\n boxShadow: `0 0 20px ${alpha(theme.palette.primary.main, 0.15)}`,\n },\n '&:active': {\n transform: 'translateY(-50%) scale(0.95)',\n },\n}));\n\n// --- Thumbnails ---\n\nconst ThumbnailStrip = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(0.75),\n padding: theme.spacing(1, 2),\n justifyContent: 'center',\n overflowX: 'auto',\n backgroundColor: alpha(theme.palette.common.black, 0.5),\n backdropFilter: 'blur(12px)',\n borderTop: `1px solid ${alpha(theme.palette.common.white, 0.06)}`,\n // Hide scrollbar\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n}));\n\nconst ThumbItem = styled(Box)<{ active: boolean }>(({ theme, active }) => ({\n flexShrink: 0,\n width: 56,\n height: 56,\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n overflow: 'hidden',\n cursor: 'pointer',\n position: 'relative',\n border: `2px solid ${active ? theme.palette.primary.main : alpha(theme.palette.common.white, 0.08)}`,\n opacity: active ? 1 : 0.55,\n transform: active ? 'scale(1)' : 'scale(0.92)',\n transition: theme.transitions.create(['border-color', 'opacity', 'transform', 'box-shadow'], {\n duration: 200,\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n }),\n ...(active && {\n boxShadow: `0 0 12px ${alpha(theme.palette.primary.main, 0.3)}`,\n }),\n '& img': {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n '&:hover': {\n opacity: 1,\n transform: 'scale(1)',\n borderColor: active ? theme.palette.primary.main : alpha(theme.palette.common.white, 0.25),\n },\n}));\n","/**\n * useLightbox Hook\n *\n * State management hook for the Lightbox component.\n * Handles open/close and navigation. Zoom belongs to `<Lightbox>` itself —\n * see `UseLightboxReturn.getLightboxProps` for why it is not here.\n *\n * @module components/lightbox\n */\n\n'use client';\n\nimport { useState, useCallback } from 'react';\n\nimport type { UseLightboxReturn } from './types.js';\n\n// =============================================================================\n// USE LIGHTBOX HOOK\n// =============================================================================\n\n/**\n * Options for useLightbox hook.\n */\nexport interface UseLightboxOptions {\n /** Initial open state */\n defaultOpen?: boolean;\n /** Initial slide index */\n defaultIndex?: number;\n /** Total number of slides (for navigation bounds) */\n totalSlides?: number;\n /** Enable infinite loop */\n loop?: boolean;\n}\n\n/**\n * Hook for managing lightbox state.\n *\n * @example\n * ```tsx\n * const lightbox = useLightbox({ totalSlides: images.length });\n *\n * return (\n * <>\n * {images.map((img, i) => (\n * <img key={i} src={img.src} onClick={() => lightbox.onOpen(i)} />\n * ))}\n * <Lightbox slides={images} {...lightbox.getLightboxProps()} />\n * </>\n * );\n * ```\n */\nexport function useLightbox(options: UseLightboxOptions = {}): UseLightboxReturn {\n const { defaultOpen = false, defaultIndex = 0, totalSlides = 0, loop = false } = options;\n\n const [open, setOpen] = useState(defaultOpen);\n const [index, setIndex] = useState(defaultIndex);\n\n // Navigation\n const goTo = useCallback(\n (newIndex: number) => {\n // `totalSlides` is optional and defaults to 0, which is how the hook is\n // constructed when a caller lets the component do its own navigation —\n // `useLightbox()` with no arguments, as the portal does. Passing the\n // requested index straight through in that state let `next()` walk the\n // index upward without bound, past the end of a slide list the hook was\n // never told about. With no slides there is no index to be at; 0 is the\n // one that cannot be out of range.\n if (totalSlides === 0) {\n setIndex(0);\n return;\n }\n\n if (loop) {\n setIndex((newIndex + totalSlides) % totalSlides);\n } else {\n setIndex(Math.max(0, Math.min(newIndex, totalSlides - 1)));\n }\n },\n [totalSlides, loop]\n );\n\n const next = useCallback(() => {\n goTo(index + 1);\n }, [index, goTo]);\n\n const prev = useCallback(() => {\n goTo(index - 1);\n }, [index, goTo]);\n\n // Open/Close\n const onOpen = useCallback((slideIndex = 0) => {\n setIndex(slideIndex);\n setOpen(true);\n }, []);\n\n const onClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n // Index change handler for Lightbox\n const onIndexChange = useCallback(\n (newIndex: number) => {\n goTo(newIndex);\n },\n [goTo]\n );\n\n // Props getter\n const getLightboxProps = useCallback(\n () => ({\n open,\n onClose,\n index,\n onIndexChange,\n }),\n [open, onClose, index, onIndexChange]\n );\n\n return {\n open,\n index,\n onOpen,\n onClose,\n goTo,\n next,\n prev,\n getLightboxProps,\n };\n}\n","/**\n * Carousel CSS Classes\n *\n * @module components/carousel\n */\n\nimport { createClasses } from '../../utils/create-classes.js';\n\n/**\n * CSS class names for Carousel component.\n */\nexport const carouselClasses = {\n root: createClasses('carousel__root'),\n container: createClasses('carousel__container'),\n track: createClasses('carousel__track'),\n slide: createClasses('carousel__slide'),\n slideActive: createClasses('carousel__slide--active'),\n slidePrev: createClasses('carousel__slide--prev'),\n slideNext: createClasses('carousel__slide--next'),\n arrow: createClasses('carousel__arrow'),\n arrowPrev: createClasses('carousel__arrow--prev'),\n arrowNext: createClasses('carousel__arrow--next'),\n arrowInside: createClasses('carousel__arrow--inside'),\n arrowOutside: createClasses('carousel__arrow--outside'),\n arrowDisabled: createClasses('carousel__arrow--disabled'),\n dots: createClasses('carousel__dots'),\n dotsTop: createClasses('carousel__dots--top'),\n dotsBottom: createClasses('carousel__dots--bottom'),\n dotsLeft: createClasses('carousel__dots--left'),\n dotsRight: createClasses('carousel__dots--right'),\n dot: createClasses('carousel__dot'),\n dotActive: createClasses('carousel__dot--active'),\n horizontal: createClasses('carousel__horizontal'),\n vertical: createClasses('carousel__vertical'),\n dragging: createClasses('carousel__dragging'),\n fade: createClasses('carousel__fade'),\n};\n","'use client';\n\n/**\n * Carousel Component\n *\n * Responsive slider with autoplay, navigation arrows, dots,\n * and touch/drag support.\n *\n * @module components/carousel\n */\n\nimport type { CarouselProps } from './types.js';\n\nimport { useState, useEffect, useCallback, useRef, Children, useMemo } from 'react';\n\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport { styled, alpha } from '@mui/material/styles';\n\n// MUI Icons\nimport { ChevronLeftIcon } from '../../icons/controls.js';\nimport { ChevronRightIcon } from '../../icons/controls.js';\nimport { ChevronUpIcon as KeyboardArrowUpIcon } from '../../icons/controls.js';\nimport { ChevronDownIcon as KeyboardArrowDownIcon } from '../../icons/controls.js';\n\nimport { cn } from '../../utils/cn.js';\nimport { carouselClasses } from './classes.js';\n\n// =============================================================================\n// CAROUSEL COMPONENT\n// =============================================================================\n\n/**\n * Responsive carousel/slider component.\n *\n * @example\n * ```tsx\n * import { Carousel } from '@omnitron-dev/prism/components';\n *\n * function Gallery() {\n * return (\n * <Carousel\n * slidesToShow={3}\n * spacing={16}\n * autoplay\n * arrows\n * dots\n * >\n * {images.map((img, i) => (\n * <img key={i} src={img.src} alt={img.alt} />\n * ))}\n * </Carousel>\n * );\n * }\n * ```\n */\nexport function Carousel({\n children,\n slidesToShow = 1,\n slidesToScroll = 1,\n spacing = 0,\n autoplay = false,\n autoplayInterval = 4000,\n pauseOnHover = true,\n loop = false,\n draggable = true,\n speed = 400,\n direction = 'horizontal',\n arrows = true,\n dots = false,\n dotsPosition = 'bottom',\n keyboard = true,\n initialSlide = 0,\n onSlideChange,\n centerMode = false,\n fade = false,\n responsive,\n sx,\n slotProps,\n className,\n ...other\n}: CarouselProps) {\n // State\n const [currentIndex, setCurrentIndex] = useState(initialSlide);\n const [isPlaying, setIsPlaying] = useState(autoplay);\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState(0);\n const [containerWidth, setContainerWidth] = useState(0);\n\n // Refs\n const containerRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const autoplayRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const dragStartRef = useRef({ x: 0, y: 0 });\n\n // Responsive settings\n const [activeSettings, setActiveSettings] = useState({\n slidesToShow,\n slidesToScroll,\n spacing,\n arrows,\n dots,\n });\n\n // Get slides from children\n const slides = Children.toArray(children);\n const totalSlides = slides.length;\n\n // Calculate settings based on responsive breakpoints\n useEffect(() => {\n if (!responsive?.length) {\n setActiveSettings({ slidesToShow, slidesToScroll, spacing, arrows, dots });\n return undefined;\n }\n\n const handleResize = () => {\n const width = window.innerWidth;\n let newSettings = { slidesToShow, slidesToScroll, spacing, arrows, dots };\n\n // Find matching breakpoint (smallest matching)\n const sortedBreakpoints = [...responsive].sort((a, b) => a.breakpoint - b.breakpoint);\n for (const bp of sortedBreakpoints) {\n if (width <= bp.breakpoint) {\n newSettings = { ...newSettings, ...bp.settings };\n break;\n }\n }\n\n setActiveSettings(newSettings);\n };\n\n handleResize();\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [responsive, slidesToShow, slidesToScroll, spacing, arrows, dots]);\n\n // Calculate dimensions\n const maxIndex = Math.max(0, totalSlides - activeSettings.slidesToShow);\n const canPrev = loop || currentIndex > 0;\n const canNext = loop || currentIndex < maxIndex;\n const isHorizontal = direction === 'horizontal';\n\n // Calculate slide width percentage\n const slideWidth = useMemo(() => {\n if (activeSettings.slidesToShow <= 0) return 100;\n return 100 / activeSettings.slidesToShow;\n }, [activeSettings.slidesToShow]);\n\n // Track container width for drag calculations\n useEffect(() => {\n if (!containerRef.current) return undefined;\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setContainerWidth(entry.contentRect.width);\n }\n });\n\n observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, []);\n\n // Navigation\n const goTo = useCallback(\n (index: number) => {\n let newIndex = index;\n\n if (loop) {\n if (index < 0) {\n newIndex = maxIndex;\n } else if (index > maxIndex) {\n newIndex = 0;\n }\n } else {\n newIndex = Math.max(0, Math.min(index, maxIndex));\n }\n\n setCurrentIndex(newIndex);\n onSlideChange?.(newIndex);\n },\n [loop, maxIndex, onSlideChange]\n );\n\n const next = useCallback(() => {\n if (canNext) {\n goTo(currentIndex + activeSettings.slidesToScroll);\n }\n }, [canNext, currentIndex, activeSettings.slidesToScroll, goTo]);\n\n const prev = useCallback(() => {\n if (canPrev) {\n goTo(currentIndex - activeSettings.slidesToScroll);\n }\n }, [canPrev, currentIndex, activeSettings.slidesToScroll, goTo]);\n\n // Autoplay\n useEffect(() => {\n if (isPlaying && totalSlides > activeSettings.slidesToShow) {\n autoplayRef.current = setInterval(next, autoplayInterval);\n return () => {\n if (autoplayRef.current) clearInterval(autoplayRef.current);\n };\n }\n return undefined;\n }, [isPlaying, totalSlides, activeSettings.slidesToShow, autoplayInterval, next]);\n\n // Pause on hover\n const handleMouseEnter = useCallback(() => {\n if (pauseOnHover && autoplay) {\n setIsPlaying(false);\n }\n }, [pauseOnHover, autoplay]);\n\n const handleMouseLeave = useCallback(() => {\n if (pauseOnHover && autoplay) {\n setIsPlaying(true);\n }\n }, [pauseOnHover, autoplay]);\n\n // Keyboard navigation\n useEffect(() => {\n if (!keyboard) return undefined;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!containerRef.current?.contains(document.activeElement)) return;\n\n if (isHorizontal) {\n if (e.key === 'ArrowLeft') prev();\n if (e.key === 'ArrowRight') next();\n } else {\n if (e.key === 'ArrowUp') prev();\n if (e.key === 'ArrowDown') next();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [keyboard, isHorizontal, prev, next]);\n\n // Drag/Touch handlers\n const handleDragStart = useCallback(\n (clientX: number, clientY: number) => {\n if (!draggable) return;\n setIsDragging(true);\n dragStartRef.current = { x: clientX, y: clientY };\n setDragOffset(0);\n },\n [draggable]\n );\n\n const handleDragMove = useCallback(\n (clientX: number, clientY: number) => {\n if (!isDragging) return;\n const delta = isHorizontal ? clientX - dragStartRef.current.x : clientY - dragStartRef.current.y;\n setDragOffset(delta);\n },\n [isDragging, isHorizontal]\n );\n\n const handleDragEnd = useCallback(() => {\n if (!isDragging) return;\n setIsDragging(false);\n\n const threshold = containerWidth * 0.15; // 15% threshold\n if (Math.abs(dragOffset) > threshold) {\n if (dragOffset > 0) {\n prev();\n } else {\n next();\n }\n }\n\n setDragOffset(0);\n }, [isDragging, containerWidth, dragOffset, prev, next]);\n\n // Mouse handlers\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n handleDragStart(e.clientX, e.clientY);\n },\n [handleDragStart]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n handleDragMove(e.clientX, e.clientY);\n },\n [handleDragMove]\n );\n\n const handleMouseUp = useCallback(() => {\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Touch handlers\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (touch) handleDragStart(touch.clientX, touch.clientY);\n },\n [handleDragStart]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (touch) handleDragMove(touch.clientX, touch.clientY);\n },\n [handleDragMove]\n );\n\n const handleTouchEnd = useCallback(() => {\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Calculate track transform\n const trackTransform = useMemo(() => {\n const baseOffset = currentIndex * slideWidth;\n const dragPercent = containerWidth > 0 ? (dragOffset / containerWidth) * 100 : 0;\n\n if (fade) return 'none';\n\n if (isHorizontal) {\n return `translateX(calc(-${baseOffset}% + ${dragPercent}%))`;\n }\n return `translateY(calc(-${baseOffset}% + ${dragPercent}%))`;\n }, [currentIndex, slideWidth, dragOffset, containerWidth, fade, isHorizontal]);\n\n // Dots count (number of pages)\n const dotsCount = Math.ceil(totalSlides / activeSettings.slidesToScroll);\n\n return (\n <CarouselRoot\n ref={containerRef}\n className={cn(\n carouselClasses.root,\n isHorizontal ? carouselClasses.horizontal : carouselClasses.vertical,\n isDragging && carouselClasses.dragging,\n fade && carouselClasses.fade,\n className\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n tabIndex={0}\n sx={sx}\n {...other}\n >\n <CarouselContainer className={carouselClasses.container} sx={slotProps?.container}>\n <CarouselTrack\n ref={trackRef}\n className={carouselClasses.track}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n sx={{\n ...slotProps?.track,\n transform: trackTransform,\n transition: isDragging ? 'none' : `transform ${speed}ms ease`,\n flexDirection: isHorizontal ? 'row' : 'column',\n cursor: draggable ? (isDragging ? 'grabbing' : 'grab') : 'default',\n }}\n >\n {slides.map((slide, index) => (\n <CarouselSlide\n key={index}\n className={cn(carouselClasses.slide, {\n [carouselClasses.slideActive]: index === currentIndex,\n })}\n sx={{\n ...slotProps?.slide,\n width: isHorizontal ? `${slideWidth}%` : '100%',\n height: !isHorizontal ? `${slideWidth}%` : 'auto',\n padding: isHorizontal ? `0 ${activeSettings.spacing / 2}px` : `${activeSettings.spacing / 2}px 0`,\n opacity: fade ? (index === currentIndex ? 1 : 0) : 1,\n transition: fade ? `opacity ${speed}ms ease` : 'none',\n position: fade ? (index === currentIndex ? 'relative' : 'absolute') : 'relative',\n ...(fade && { top: 0, left: 0 }),\n }}\n >\n {slide}\n </CarouselSlide>\n ))}\n </CarouselTrack>\n </CarouselContainer>\n\n {/* Navigation Arrows */}\n {activeSettings.arrows && totalSlides > activeSettings.slidesToShow && (\n <>\n <ArrowButton\n className={cn(carouselClasses.arrow, carouselClasses.arrowPrev, {\n [carouselClasses.arrowDisabled]: !canPrev,\n })}\n onClick={prev}\n disabled={!canPrev}\n aria-label=\"Previous slide\"\n isHorizontal={isHorizontal}\n direction=\"prev\"\n sx={slotProps?.arrow}\n >\n {isHorizontal ? <ChevronLeftIcon /> : <KeyboardArrowUpIcon />}\n </ArrowButton>\n <ArrowButton\n className={cn(carouselClasses.arrow, carouselClasses.arrowNext, {\n [carouselClasses.arrowDisabled]: !canNext,\n })}\n onClick={next}\n disabled={!canNext}\n aria-label=\"Next slide\"\n isHorizontal={isHorizontal}\n direction=\"next\"\n sx={slotProps?.arrow}\n >\n {isHorizontal ? <ChevronRightIcon /> : <KeyboardArrowDownIcon />}\n </ArrowButton>\n </>\n )}\n\n {/* Dots Indicator */}\n {activeSettings.dots && totalSlides > activeSettings.slidesToShow && (\n <DotsContainer\n className={cn(carouselClasses.dots, {\n [carouselClasses.dotsTop]: dotsPosition === 'top',\n [carouselClasses.dotsBottom]: dotsPosition === 'bottom',\n [carouselClasses.dotsLeft]: dotsPosition === 'left',\n [carouselClasses.dotsRight]: dotsPosition === 'right',\n })}\n dotsPosition={dotsPosition}\n sx={slotProps?.dots}\n >\n {Array.from({ length: dotsCount }, (_, i) => (\n <Dot\n key={i}\n className={cn(carouselClasses.dot, {\n [carouselClasses.dotActive]: Math.floor(currentIndex / activeSettings.slidesToScroll) === i,\n })}\n active={Math.floor(currentIndex / activeSettings.slidesToScroll) === i}\n onClick={() => goTo(i * activeSettings.slidesToScroll)}\n aria-label={`Go to slide ${i + 1}`}\n sx={slotProps?.dot}\n />\n ))}\n </DotsContainer>\n )}\n </CarouselRoot>\n );\n}\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst CarouselRoot = styled(Box)({\n position: 'relative',\n width: '100%',\n overflow: 'hidden',\n outline: 'none',\n});\n\nconst CarouselContainer = styled(Box)({\n position: 'relative',\n width: '100%',\n overflow: 'hidden',\n});\n\nconst CarouselTrack = styled(Box)({\n display: 'flex',\n width: '100%',\n willChange: 'transform',\n userSelect: 'none',\n});\n\nconst CarouselSlide = styled(Box)({\n flexShrink: 0,\n '& > *': {\n width: '100%',\n height: '100%',\n },\n});\n\nconst ArrowButton = styled(IconButton)<{ isHorizontal: boolean; direction: 'prev' | 'next' }>(\n ({ theme, isHorizontal, direction }) => ({\n position: 'absolute',\n zIndex: 10,\n backgroundColor: alpha(theme.palette.background.paper, 0.9),\n boxShadow: theme.shadows[2],\n '&:hover': {\n backgroundColor: theme.palette.background.paper,\n },\n '&.Mui-disabled': {\n backgroundColor: alpha(theme.palette.background.paper, 0.5),\n },\n ...(isHorizontal\n ? {\n top: '50%',\n transform: 'translateY(-50%)',\n ...(direction === 'prev' ? { left: 8 } : { right: 8 }),\n }\n : {\n left: '50%',\n transform: 'translateX(-50%)',\n ...(direction === 'prev' ? { top: 8 } : { bottom: 8 }),\n }),\n })\n);\n\nconst DotsContainer = styled(Box)<{ dotsPosition: 'bottom' | 'top' | 'left' | 'right' }>(({ theme, dotsPosition }) => ({\n display: 'flex',\n gap: theme.spacing(1),\n position: 'absolute',\n zIndex: 10,\n ...(dotsPosition === 'bottom' && {\n bottom: theme.spacing(2),\n left: '50%',\n transform: 'translateX(-50%)',\n flexDirection: 'row',\n }),\n ...(dotsPosition === 'top' && {\n top: theme.spacing(2),\n left: '50%',\n transform: 'translateX(-50%)',\n flexDirection: 'row',\n }),\n ...(dotsPosition === 'left' && {\n left: theme.spacing(2),\n top: '50%',\n transform: 'translateY(-50%)',\n flexDirection: 'column',\n }),\n ...(dotsPosition === 'right' && {\n right: theme.spacing(2),\n top: '50%',\n transform: 'translateY(-50%)',\n flexDirection: 'column',\n }),\n}));\n\nconst Dot = styled('button')<{ active: boolean }>(({ theme, active }) => ({\n width: 8,\n height: 8,\n padding: 0,\n border: 'none',\n borderRadius: '50%',\n cursor: 'pointer',\n backgroundColor: active ? theme.palette.primary.main : alpha(theme.palette.common.black, 0.3),\n transition: theme.transitions.create(['background-color', 'transform'], {\n duration: theme.transitions.duration.short,\n }),\n '&:hover': {\n backgroundColor: active ? theme.palette.primary.main : alpha(theme.palette.common.black, 0.5),\n transform: 'scale(1.2)',\n },\n}));\n","'use client';\n\n/**\n * useCarousel Hook\n *\n * Carousel state — index, bounds, autoplay — for a slider you render\n * yourself.\n *\n * It does NOT drive `<Carousel>`, and the two are not connected in any way.\n * That component keeps its own copy of this state and exposes no controlled\n * props: `initialSlide` seeds it and `onSlideChange` observes it, so nothing\n * a caller does with this hook can move it. The two implementations are\n * parallel, not paired.\n *\n * Said this plainly because the header used to read \"state management hook\n * for the Carousel component\" and the example below wired the two together,\n * neither of which was true.\n *\n * @module components/carousel\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\nimport type { UseCarouselReturn } from './types.js';\n\n// =============================================================================\n// USE CAROUSEL OPTIONS\n// =============================================================================\n\n/**\n * Options for useCarousel hook.\n */\nexport interface UseCarouselOptions {\n /** Total number of slides */\n totalSlides: number;\n /** Initial slide index */\n initialSlide?: number;\n /** Number of slides to show */\n slidesToShow?: number;\n /** Number of slides to scroll */\n slidesToScroll?: number;\n /** Enable infinite loop */\n loop?: boolean;\n /** Enable autoplay */\n autoplay?: boolean;\n /** Autoplay interval in ms */\n autoplayInterval?: number;\n /** Callback when slide changes */\n onSlideChange?: (index: number) => void;\n}\n\n// =============================================================================\n// USE CAROUSEL HOOK\n// =============================================================================\n\n/**\n * Hook for managing carousel state.\n *\n * The previous example here did not compile and could not have worked:\n * it rendered `<CarouselSlide>`, which this package exports as a TYPE and\n * not as a component, and passed `ref={carousel.carouselRef}` to\n * `<Carousel>`, which is a plain function component that never reads a ref.\n * Between those two and the pairing that does not exist, three claims in\n * eight lines.\n *\n * @example\n * ```tsx\n * // Your own markup — that is the point of the hook.\n * const carousel = useCarousel({ totalSlides: items.length, autoplay: true });\n *\n * return (\n * <div onMouseEnter={carousel.pause} onMouseLeave={carousel.play}>\n * {items.slice(carousel.currentIndex, carousel.currentIndex + 3).map(render)}\n * <button onClick={carousel.prev} disabled={!carousel.canPrev}>Back</button>\n * <button onClick={carousel.next} disabled={!carousel.canNext}>Next</button>\n * </div>\n * );\n * ```\n *\n * For a ready-made slider use `<Carousel>` and leave this hook alone; it\n * cannot control that component.\n */\nexport function useCarousel(options: UseCarouselOptions): UseCarouselReturn {\n const {\n totalSlides,\n initialSlide = 0,\n slidesToShow = 1,\n slidesToScroll = 1,\n loop = false,\n autoplay = false,\n autoplayInterval = 3000,\n onSlideChange,\n } = options;\n\n const [currentIndex, setCurrentIndex] = useState(initialSlide);\n const [isPlaying, setIsPlaying] = useState(autoplay);\n const carouselRef = useRef<HTMLDivElement | null>(null);\n const autoplayRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n /**\n * The current index, readable from inside the autoplay timer.\n *\n * The timer used to close over `currentIndex` and list it as an effect\n * dependency, so it advanced one slide per RE-ARM rather than per tick.\n * That is invisible while every tick is followed by a render — which is\n * the normal case — and wrong the moment two callbacks land before one:\n * a throttled background tab, a long task, a test advancing a fake clock.\n * Measured: ten 100ms ticks over three slides moved the carousel once.\n *\n * Reading the ref also takes `currentIndex` out of the effect's\n * dependencies, so the interval is no longer torn down and rebuilt on\n * every slide — which had been measuring each gap from the render rather\n * than from the previous tick.\n *\n * Written in `goTo` rather than during render, because a render is exactly\n * what a burst does not give you.\n */\n const currentIndexRef = useRef(currentIndex);\n\n // Calculate max index\n const maxIndex = Math.max(0, totalSlides - slidesToShow);\n\n // Can navigate\n const canPrev = loop || currentIndex > 0;\n const canNext = loop || currentIndex < maxIndex;\n\n // Navigation handlers\n const goTo = useCallback(\n (index: number) => {\n let newIndex = index;\n\n if (loop) {\n if (index < 0) {\n newIndex = maxIndex;\n } else if (index > maxIndex) {\n newIndex = 0;\n }\n } else {\n newIndex = Math.max(0, Math.min(index, maxIndex));\n }\n\n // Only when it moved. `onSlideChange` fired on every call, including\n // the ones clamping back to where the carousel already was — so a\n // strip parked at its last slide with autoplay on reported a slide\n // change every interval, forever, with the same index.\n if (newIndex === currentIndexRef.current) return;\n\n currentIndexRef.current = newIndex;\n setCurrentIndex(newIndex);\n onSlideChange?.(newIndex);\n },\n [loop, maxIndex, onSlideChange]\n );\n\n const next = useCallback(() => {\n if (canNext) {\n goTo(currentIndex + slidesToScroll);\n }\n }, [canNext, currentIndex, slidesToScroll, goTo]);\n\n const prev = useCallback(() => {\n if (canPrev) {\n goTo(currentIndex - slidesToScroll);\n }\n }, [canPrev, currentIndex, slidesToScroll, goTo]);\n\n // Autoplay handlers\n const pause = useCallback(() => {\n setIsPlaying(false);\n if (autoplayRef.current) {\n clearInterval(autoplayRef.current);\n autoplayRef.current = null;\n }\n }, []);\n\n const play = useCallback(() => {\n setIsPlaying(true);\n }, []);\n\n // Autoplay effect\n useEffect(() => {\n if (isPlaying && totalSlides > slidesToShow) {\n autoplayRef.current = setInterval(() => {\n goTo(currentIndexRef.current + slidesToScroll);\n }, autoplayInterval);\n\n return () => {\n if (autoplayRef.current) {\n clearInterval(autoplayRef.current);\n autoplayRef.current = null;\n }\n };\n }\n return undefined;\n }, [isPlaying, slidesToScroll, autoplayInterval, totalSlides, slidesToShow, goTo]);\n\n // Cleanup on unmount\n useEffect(\n () => () => {\n if (autoplayRef.current) {\n clearInterval(autoplayRef.current);\n }\n },\n []\n );\n\n return {\n currentIndex,\n totalSlides,\n canPrev,\n canNext,\n goTo,\n next,\n prev,\n pause,\n play,\n isPlaying,\n carouselRef,\n };\n}\n","/**\n * Navigation Section Styles\n *\n * CSS custom properties and class names for nav sections.\n *\n * @module components/nav-section\n */\n\nimport type { Theme, CSSObject } from '@mui/material/styles';\nimport type { NavVariant } from './types.js';\nimport { createComponentClasses } from '../../utils/create-classes.js';\n\n// =============================================================================\n// CLASS NAMES\n// =============================================================================\n\n/**\n * CSS class names for nav section components.\n */\nexport const navSectionClasses = createComponentClasses('nav-section', [\n 'root',\n 'vertical',\n 'horizontal',\n 'mini',\n 'ul',\n 'li',\n 'subheader',\n 'item',\n 'icon',\n 'texts',\n 'title',\n 'caption',\n 'info',\n 'arrow',\n 'active',\n 'disabled',\n 'open',\n] as const);\n\n// =============================================================================\n// CSS CUSTOM PROPERTIES\n// =============================================================================\n\n/**\n * Default CSS variables for nav sections.\n */\nexport const navSectionCssVars = {\n /**\n * Get CSS variables for vertical variant.\n */\n vertical: (theme: Theme): CSSObject => ({\n // Item spacing\n '--nav-item-gap': '4px',\n '--nav-item-padding': '4px 8px 4px 12px',\n '--nav-item-padding-top': '4px',\n '--nav-item-padding-right': '8px',\n '--nav-item-padding-bottom': '4px',\n '--nav-item-padding-left': '12px',\n '--nav-item-radius': '8px',\n '--nav-item-min-height': '44px',\n // Icon\n '--nav-icon-size': '24px',\n '--nav-icon-margin': '0 16px 0 0',\n // Text\n '--nav-item-font-size': '0.875rem',\n '--nav-item-caption-size': '0.75rem',\n // Colors - inactive\n '--nav-item-color': theme.palette.text.secondary,\n '--nav-icon-color': theme.palette.text.secondary,\n '--nav-item-bg': 'transparent',\n // Colors - hover\n '--nav-item-hover-bg': theme.palette.action.hover,\n '--nav-item-hover-color': theme.palette.text.primary,\n // Colors - active\n '--nav-item-active-bg': theme.palette.action.selected,\n '--nav-item-active-color': theme.palette.primary.main,\n '--nav-icon-active-color': theme.palette.primary.main,\n // Colors - disabled\n '--nav-item-disabled-color': theme.palette.text.disabled,\n // Subheader. Asymmetric vertical padding (top < bottom) tightens\n // the gap to the previous section's last item while preserving\n // the visual grouping with the items belonging to THIS section.\n // Pre-fix `8px 8px 8px 12px` summed with the parent `gap: 4px`\n // and the previous item's `padding-bottom: 4px` to ~16px above\n // the title, which read as a disconnect rather than a section\n // boundary.\n '--nav-subheader-font-size': '0.6875rem',\n '--nav-subheader-font-weight': '700',\n '--nav-subheader-color': theme.palette.text.disabled,\n '--nav-subheader-padding': '4px 8px 8px 12px',\n // Sub-item adjustments\n '--nav-sub-item-padding': '4px 8px 4px 12px',\n '--nav-sub-item-margin-left': '40px',\n '--nav-sub-item-radius': '8px',\n }),\n\n /**\n * Get CSS variables for horizontal variant.\n */\n horizontal: (theme: Theme): CSSObject => ({\n // Item spacing\n '--nav-item-gap': '6px',\n '--nav-item-padding': '8px 14px',\n '--nav-item-radius': '8px',\n '--nav-item-min-height': '36px',\n // Icon\n '--nav-icon-size': '22px',\n '--nav-icon-margin': '0 8px 0 0',\n // Text\n '--nav-item-font-size': '0.875rem',\n // Colors - inactive\n '--nav-item-color': theme.palette.text.primary,\n '--nav-icon-color': theme.palette.text.secondary,\n '--nav-item-bg': 'transparent',\n // Colors - hover\n '--nav-item-hover-bg': theme.palette.action.hover,\n '--nav-item-hover-color': theme.palette.text.primary,\n // Colors - active\n '--nav-item-active-bg': theme.palette.action.selected,\n '--nav-item-active-color': theme.palette.primary.main,\n '--nav-icon-active-color': theme.palette.primary.main,\n // Colors - disabled\n '--nav-item-disabled-color': theme.palette.text.disabled,\n // Dropdown\n '--nav-dropdown-paper-width': '180px',\n '--nav-dropdown-paper-radius': '8px',\n '--nav-dropdown-paper-shadow': theme.shadows[8],\n }),\n\n /**\n * Get CSS variables for mini variant.\n */\n mini: (theme: Theme): CSSObject => ({\n // Item spacing\n '--nav-item-gap': '4px',\n '--nav-item-padding': '8px',\n '--nav-item-radius': '8px',\n '--nav-item-min-height': 'auto',\n // Icon\n '--nav-icon-size': '22px',\n '--nav-icon-margin': '0',\n // Text\n '--nav-item-font-size': '0.625rem',\n // Colors - inactive\n '--nav-item-color': theme.palette.text.secondary,\n '--nav-icon-color': theme.palette.text.secondary,\n '--nav-item-bg': 'transparent',\n // Colors - hover\n '--nav-item-hover-bg': theme.palette.action.hover,\n '--nav-item-hover-color': theme.palette.text.primary,\n // Colors - active\n '--nav-item-active-bg': theme.palette.action.selected,\n '--nav-item-active-color': theme.palette.primary.main,\n '--nav-icon-active-color': theme.palette.primary.main,\n // Colors - disabled\n '--nav-item-disabled-color': theme.palette.text.disabled,\n // Tooltip/Popover\n '--nav-tooltip-paper-width': '160px',\n }),\n};\n\n/**\n * Get CSS variables for a specific nav variant.\n */\nexport function getNavCssVars(theme: Theme, variant: NavVariant): CSSObject {\n switch (variant) {\n case 'horizontal':\n return navSectionCssVars.horizontal(theme);\n case 'mini':\n return navSectionCssVars.mini(theme);\n default:\n return navSectionCssVars.vertical(theme);\n }\n}\n","'use client';\n\n/**\n * Navigation Base Components\n *\n * Foundational components for building navigation sections.\n *\n * @module components/nav-section\n */\n\nimport type { Ref } from 'react';\nimport Box from '@mui/material/Box';\nimport ButtonBase from '@mui/material/ButtonBase';\nimport { styled, alpha } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cn } from '../../utils/cn.js';\nimport { navSectionClasses } from './styles.js';\n\n// =============================================================================\n// NAV (ROOT ELEMENT)\n// =============================================================================\n\n/**\n * Props for Nav component.\n */\nexport interface NavProps extends Omit<React.ComponentPropsWithoutRef<'nav'>, 'sx'> {\n children: React.ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/**\n * Nav - Root navigation element for navigation sections.\n */\nexport function Nav({className, sx, ref, ...other }: NavProps & { ref?: Ref<HTMLElement> }) {\n return (\n <Box\n component=\"nav\"\n ref={ref}\n className={cn(navSectionClasses.root, className)}\n sx={[\n {\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n />\n );\n}\n\n// =============================================================================\n// NAV UL (UNORDERED LIST)\n// =============================================================================\n\n/**\n * Props for NavUl component.\n */\nexport interface NavUlProps extends Omit<React.ComponentPropsWithoutRef<'ul'>, 'sx'> {\n children: React.ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/**\n * NavUl - Styled unordered list for navigation.\n */\nexport function NavUl({className, sx, ref, ...other }: NavUlProps & { ref?: Ref<HTMLUListElement> }) {\n return (\n <Box\n component=\"ul\"\n ref={ref}\n className={cn(navSectionClasses.ul, className)}\n sx={[\n {\n display: 'flex',\n flexDirection: 'column',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n />\n );\n}\n\n// =============================================================================\n// NAV LI (LIST ITEM)\n// =============================================================================\n\n/**\n * Props for NavLi component.\n */\nexport interface NavLiProps extends React.ComponentPropsWithoutRef<'li'> {\n children: React.ReactNode;\n}\n\n/**\n * NavLi - Styled list item for navigation.\n */\nexport function NavLi({className, ref, ...other }: NavLiProps & { ref?: Ref<HTMLLIElement> }) {\n return (\n <Box\n component=\"li\"\n ref={ref}\n className={cn(navSectionClasses.li, className)}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n }}\n {...other}\n />\n );\n}\n\n// =============================================================================\n// NAV SUBHEADER\n// =============================================================================\n\n/**\n * Props for NavSubheader component.\n */\nexport interface NavSubheaderProps extends React.ComponentPropsWithoutRef<typeof ButtonBase> {\n /** Whether the section is open */\n open?: boolean;\n /** Click handler for toggle */\n onClick?: () => void;\n children: React.ReactNode;\n}\n\nconst StyledSubheader = styled(ButtonBase)(({ theme }) => ({\n width: '100%',\n cursor: 'pointer',\n padding: 'var(--nav-subheader-padding, 8px 8px 8px 12px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n fontSize: 'var(--nav-subheader-font-size, 0.6875rem)',\n fontWeight: 'var(--nav-subheader-font-weight, 700)',\n color: 'var(--nav-subheader-color, inherit)',\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n borderRadius: theme.shape.borderRadius,\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n },\n}));\n\nconst ArrowIcon = styled('span')<{ open?: boolean }>(({ open }) => ({\n marginLeft: 'auto',\n width: 16,\n height: 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n transform: open ? 'rotate(0deg)' : 'rotate(-90deg)',\n '&::before': {\n content: '\"\"',\n width: 6,\n height: 6,\n borderStyle: 'solid',\n borderWidth: '0 0 1.5px 1.5px',\n borderColor: 'currentColor',\n transform: 'rotate(-45deg)',\n },\n}));\n\n/**\n * NavSubheader - Section header with collapse toggle.\n */\nexport function NavSubheader({className, open, onClick, children, ref, ...other }: NavSubheaderProps & { ref?: Ref<HTMLButtonElement> }) {\n return (\n <StyledSubheader ref={ref} className={cn(navSectionClasses.subheader, className)} onClick={onClick} {...other}>\n {children}\n {onClick && <ArrowIcon open={open} />}\n </StyledSubheader>\n );\n}\n\n// =============================================================================\n// NAV ITEM (BASE)\n// =============================================================================\n\n/**\n * Props for NavItemBase component.\n */\nexport interface NavItemBaseProps extends React.ComponentPropsWithoutRef<typeof ButtonBase> {\n /** Whether the item is active */\n active?: boolean;\n /** Whether the item is disabled */\n disabled?: boolean;\n /** Whether the submenu is open */\n open?: boolean;\n /** Item depth level */\n depth?: number;\n /** Whether item has children */\n hasChild?: boolean;\n children: React.ReactNode;\n}\n\nconst StyledNavItem = styled(ButtonBase, {\n shouldForwardProp: (prop) => !['active', 'open', 'depth', 'hasChild'].includes(prop as string),\n})<{ active?: boolean; open?: boolean; depth?: number; hasChild?: boolean }>(\n ({ theme, active, open, depth = 1, hasChild }) => ({\n width: '100%',\n minHeight: 'var(--nav-item-min-height, 44px)',\n padding: depth === 1 ? 'var(--nav-item-padding)' : 'var(--nav-sub-item-padding)',\n marginLeft: depth > 1 ? `calc(var(--nav-sub-item-margin-left, 40px) * ${depth - 1})` : 0,\n borderRadius: `var(--nav-item-radius, ${theme.shape.borderRadius}px)`,\n color: 'var(--nav-item-color)',\n backgroundColor: 'var(--nav-item-bg, transparent)',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n },\n // Active state\n ...(active && {\n backgroundColor: 'var(--nav-item-active-bg)',\n color: 'var(--nav-item-active-color)',\n '& .nav-icon': {\n color: 'var(--nav-icon-active-color)',\n },\n }),\n // Open state (submenu open)\n ...(open && {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n }),\n // Disabled state\n '&.Mui-disabled': {\n color: 'var(--nav-item-disabled-color)',\n pointerEvents: 'none',\n },\n })\n);\n\n/**\n * NavItemBase - Base button component for nav items.\n */\nexport function NavItemBase({className, active, disabled, open, depth, hasChild, ref, ...other }: NavItemBaseProps & { ref?: Ref<HTMLButtonElement> }) {\n return (\n <StyledNavItem\n ref={ref}\n className={cn(\n navSectionClasses.item,\n active && navSectionClasses.active,\n disabled && navSectionClasses.disabled,\n open && navSectionClasses.open,\n className\n )}\n active={active}\n open={open}\n depth={depth}\n hasChild={hasChild}\n disabled={disabled}\n {...other}\n />\n );\n}\n\n// =============================================================================\n// NAV ICON\n// =============================================================================\n\n/**\n * Props for NavIcon component.\n */\nexport interface NavIconProps {\n /** Icon element */\n icon?: React.ReactNode;\n /** Custom className */\n className?: string;\n}\n\nconst IconWrapper = styled('span')({\n width: 'var(--nav-icon-size, 24px)',\n height: 'var(--nav-icon-size, 24px)',\n flexShrink: 0,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: 'var(--nav-icon-margin, 0 16px 0 0)',\n color: 'var(--nav-icon-color)',\n '& svg': {\n width: '100%',\n height: '100%',\n },\n});\n/**\n * NavIcon - Icon wrapper for nav items.\n */\nexport function NavIcon({ icon, className }: NavIconProps): React.ReactNode {\n if (!icon) return null;\n return <IconWrapper className={cn('nav-icon', navSectionClasses.icon, className)}>{icon}</IconWrapper>;\n}\n\n// =============================================================================\n// NAV TEXTS\n// =============================================================================\n\n/**\n * Props for NavTexts component.\n */\nexport interface NavTextsProps {\n /** Title text */\n title: string;\n /** Caption text */\n caption?: string;\n /** Custom className */\n className?: string;\n}\n\nconst TextsWrapper = styled('span')({\n flex: '1 1 auto',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n minWidth: 0,\n});\nconst Title = styled('span')({\n fontSize: 'var(--nav-item-font-size, 0.875rem)',\n fontWeight: 500,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '100%',\n lineHeight: 1.5,\n});\nconst Caption = styled('span')(({ theme }) => ({\n fontSize: 'var(--nav-item-caption-size, 0.75rem)',\n color: theme.palette.text.disabled,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '100%',\n lineHeight: 1.5,\n}));\n\n/**\n * NavTexts - Text content for nav items.\n */\nexport function NavTexts({ title, caption, className }: NavTextsProps): React.ReactNode {\n return (\n <TextsWrapper className={cn(navSectionClasses.texts, className)}>\n <Title className={navSectionClasses.title}>{title}</Title>\n {caption && <Caption className={navSectionClasses.caption}>{caption}</Caption>}\n </TextsWrapper>\n );\n}\n\n// =============================================================================\n// NAV ARROW\n// =============================================================================\n\n/**\n * Props for NavArrow component.\n */\nexport interface NavArrowProps {\n /** Whether submenu is open */\n open?: boolean;\n /** Arrow direction */\n direction?: 'down' | 'right';\n /** Custom className */\n className?: string;\n}\n\nconst ArrowWrapper = styled('span')<{ open?: boolean; direction?: 'down' | 'right' }>(\n ({ open, direction = 'right' }) => ({\n width: 16,\n height: 16,\n flexShrink: 0,\n marginLeft: 6,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n transform: open ? (direction === 'down' ? 'rotate(180deg)' : 'rotate(90deg)') : 'rotate(0deg)',\n '&::before': {\n content: '\"\"',\n width: 5,\n height: 5,\n borderStyle: 'solid',\n borderWidth: '0 1.5px 1.5px 0',\n borderColor: 'currentColor',\n transform: direction === 'down' ? 'rotate(45deg)' : 'rotate(45deg)',\n },\n })\n);\n\n/**\n * NavArrow - Arrow indicator for items with children.\n */\nexport function NavArrow({ open, direction = 'right', className }: NavArrowProps): React.ReactNode {\n return <ArrowWrapper className={cn(navSectionClasses.arrow, className)} open={open} direction={direction} />;\n}\n\n// =============================================================================\n// NAV INFO\n// =============================================================================\n\n/**\n * Props for NavInfo component.\n */\nexport interface NavInfoProps {\n /** Info content */\n info?: React.ReactNode;\n /** Custom className */\n className?: string;\n}\n\nconst InfoWrapper = styled('span')({\n marginLeft: 6,\n display: 'inline-flex',\n alignItems: 'center',\n});\n/**\n * NavInfo - Info badge/content for nav items.\n */\nexport function NavInfo({ info, className }: NavInfoProps): React.ReactNode {\n if (!info) return null;\n return <InfoWrapper className={cn(navSectionClasses.info, className)}>{info}</InfoWrapper>;\n}\n","/**\n * URL Utilities\n *\n * Safe URL handling, navigation helpers, and link utilities.\n *\n * @module utils/url\n */\n\n/**\n * Options for safe return URL validation.\n */\nexport interface SafeReturnUrlOptions {\n /** Allowed URL schemes (default: ['http:', 'https:']) */\n allowedSchemes?: string[];\n /** Allowed hosts (if empty, only relative URLs allowed) */\n allowedHosts?: string[];\n /** Whether to allow relative URLs (default: true) */\n allowRelative?: boolean;\n /** Default URL if validation fails */\n fallback?: string;\n}\n\n/**\n * Validate and sanitize a return URL to prevent open redirect vulnerabilities.\n * Only allows relative paths or URLs to explicitly allowed hosts.\n *\n * @example\n * ```tsx\n * // In a login callback\n * const returnUrl = safeReturnUrl(searchParams.get('redirect'), {\n * allowedHosts: ['app.example.com'],\n * fallback: '/dashboard',\n * });\n * router.push(returnUrl);\n * ```\n *\n * @param url - URL to validate\n * @param options - Validation options\n * @returns Safe URL or fallback\n */\nexport function safeReturnUrl(url: string | null | undefined, options: SafeReturnUrlOptions = {}): string {\n const { allowedSchemes = ['http:', 'https:'], allowedHosts = [], allowRelative = true, fallback = '/' } = options;\n\n if (!url) {\n return fallback;\n }\n\n try {\n // Handle relative URLs\n if (url.startsWith('/') && !url.startsWith('//')) {\n if (allowRelative) {\n // Ensure it's a valid path (no protocol injection)\n return sanitizePath(url);\n }\n return fallback;\n }\n\n // Parse absolute URL\n const parsed = new URL(url, 'http://dummy.local');\n\n // Check scheme\n if (!allowedSchemes.includes(parsed.protocol)) {\n return fallback;\n }\n\n // Check host (only for absolute URLs)\n if (parsed.host !== 'dummy.local' && allowedHosts.length > 0) {\n if (!allowedHosts.includes(parsed.host)) {\n return fallback;\n }\n }\n\n // If parsed from a relative URL, return the pathname\n if (parsed.host === 'dummy.local') {\n return allowRelative ? sanitizePath(parsed.pathname + parsed.search + parsed.hash) : fallback;\n }\n\n return url;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Sanitize a URL path to prevent injection attacks.\n *\n * @param path - Path to sanitize\n * @returns Sanitized path\n */\nfunction sanitizePath(path: string): string {\n let sanitized = path;\n\n // Iteratively strip protocol-like patterns (handles javascript:javascript:... nesting)\n let prev = '';\n while (prev !== sanitized) {\n prev = sanitized;\n sanitized = sanitized.replace(/^[a-z]+:/gi, '');\n // Also strip whitespace/control chars that could bypass regex (e.g. java\\x00script:)\n // eslint-disable-next-line no-control-regex\n sanitized = sanitized.replace(/^[\\s\\x00-\\x1f]+/, '');\n }\n\n // Remove double slashes that could be interpreted as protocol-relative URLs\n sanitized = sanitized.replace(/^\\/\\/+/, '/');\n\n // Ensure it starts with a single slash\n if (!sanitized.startsWith('/')) {\n sanitized = '/' + sanitized;\n }\n\n return sanitized;\n}\n\n/**\n * Check if a navigation link is currently active.\n *\n * Features:\n * - Removes trailing slashes and query parameters before comparison\n * - Ignores external links (https://...) and hash links (#section)\n * - Supports deep matching for nested routes\n * - Handles query parameter paths correctly\n *\n * @example\n * ```tsx\n * // Basic usage\n * isActiveLink('/dashboard', '/dashboard/user/list'); // true (deep match)\n * isActiveLink('/dashboard', '/dashboard/user/list', false); // false (exact match)\n *\n * // Query parameters\n * isActiveLink('/users', '/users?page=1'); // true\n *\n * // Hash links and external links\n * isActiveLink('/home', '#section'); // false\n * isActiveLink('/home', 'https://example.com'); // false\n *\n * // Navigation items\n * const navItems = [\n * { path: '/dashboard', label: 'Dashboard', exact: true },\n * { path: '/users', label: 'Users' },\n * { path: '/settings', label: 'Settings' },\n * ];\n *\n * navItems.map(item => (\n * <NavItem\n * key={item.path}\n * active={isActiveLink(location.pathname, item.path, !item.exact)}\n * >\n * {item.label}\n * </NavItem>\n * ));\n * ```\n *\n * @param currentPathname - Current location pathname\n * @param targetPath - The link's target path (can include query parameters)\n * @param deep - Whether to perform deep matching for nested routes (default: true)\n * @returns True if the link is active\n */\nexport function isActiveLink(currentPathname: string, targetPath: string, deep: boolean = true): boolean {\n // Validate inputs\n if (!currentPathname || !targetPath) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[isActiveLink] currentPathname or targetPath is empty');\n }\n return false;\n }\n\n // Ignore hash links and external links\n if (targetPath.startsWith('#') || isExternalLink(targetPath)) {\n return false;\n }\n\n // Normalize paths: remove trailing slashes and query parameters\n const pathname = removeLastSlash(currentPathname);\n const cleanedTargetPath = removeLastSlash(removeParams(targetPath));\n\n // If target has query params, always do deep matching\n const shouldDeepMatch = deep || hasParams(targetPath);\n\n // Root path special case\n if (cleanedTargetPath === '/') {\n return pathname === '/';\n }\n\n // Deep match: current path starts with target path\n if (shouldDeepMatch) {\n return pathname === cleanedTargetPath || pathname.startsWith(`${cleanedTargetPath}/`);\n }\n\n // Exact match\n return pathname === cleanedTargetPath;\n}\n\n/**\n * Check if a URL is external (different origin).\n *\n * @param url - URL to check\n * @param currentOrigin - Current page origin (default: window.location.origin)\n * @returns True if the URL is external\n */\nexport function isExternalUrl(url: string, currentOrigin?: string): boolean {\n try {\n // Relative URLs are internal\n if (url.startsWith('/') && !url.startsWith('//')) {\n return false;\n }\n\n // Protocol-relative URLs\n if (url.startsWith('//')) {\n const origin = currentOrigin ?? (typeof window !== 'undefined' ? window.location.origin : '');\n const currentHost = new URL(origin).host;\n const urlHost = url.slice(2).split('/')[0];\n return urlHost !== currentHost;\n }\n\n // Absolute URLs\n const origin = currentOrigin ?? (typeof window !== 'undefined' ? window.location.origin : '');\n const urlOrigin = new URL(url).origin;\n return urlOrigin !== origin;\n } catch {\n return false;\n }\n}\n\n/**\n * Build a URL with query parameters.\n *\n * @example\n * ```tsx\n * const url = buildUrl('/search', {\n * q: 'hello world',\n * page: 1,\n * filter: ['active', 'recent'],\n * });\n * // Returns: '/search?q=hello+world&page=1&filter=active&filter=recent'\n * ```\n *\n * @param base - Base URL path\n * @param params - Query parameters\n * @returns URL with query string\n */\nexport function buildUrl(\n base: string,\n params: Record<string, string | number | boolean | (string | number | boolean)[] | null | undefined>\n): string {\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === null || value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n searchParams.append(key, String(item));\n }\n } else {\n searchParams.set(key, String(value));\n }\n }\n\n const queryString = searchParams.toString();\n if (!queryString) {\n return base;\n }\n\n const separator = base.includes('?') ? '&' : '?';\n return base + separator + queryString;\n}\n\n/**\n * Parse query parameters from a URL string.\n *\n * @param url - URL or query string\n * @returns Parsed parameters\n */\nexport function parseQueryParams(url: string): Record<string, string | string[]> {\n const queryString = url.includes('?') ? url.split('?')[1] : url;\n const params = new URLSearchParams(queryString);\n const result: Record<string, string | string[]> = {};\n\n for (const [key, value] of params.entries()) {\n const existing = result[key];\n if (existing) {\n result[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Get a single query parameter value.\n *\n * @param url - URL or query string\n * @param key - Parameter key\n * @returns Parameter value or undefined\n */\nexport function getQueryParam(url: string, key: string): string | undefined {\n const params = parseQueryParams(url);\n const value = params[key];\n return Array.isArray(value) ? value[0] : value;\n}\n\n/**\n * Check if a URL has query parameters.\n *\n * @param url - URL to check\n * @returns True if URL has query parameters\n *\n * @example\n * ```ts\n * hasParams('/search?q=hello'); // true\n * hasParams('/search'); // false\n * ```\n */\nexport function hasParams(url: string): boolean {\n return url.includes('?') && url.split('?')[1]?.length > 0;\n}\n\n/**\n * Remove query parameters from a URL.\n *\n * @param url - URL to process\n * @returns URL without query parameters\n *\n * @example\n * ```ts\n * removeParams('/search?q=hello'); // '/search'\n * removeParams('/search'); // '/search'\n * ```\n */\nexport function removeParams(url: string): string {\n const index = url.indexOf('?');\n return index === -1 ? url : url.slice(0, index);\n}\n\n/**\n * Remove trailing slash from a path.\n *\n * @param pathname - Path to process\n * @returns Path without trailing slash\n *\n * @example\n * ```ts\n * removeLastSlash('/users/'); // '/users'\n * removeLastSlash('/users'); // '/users'\n * removeLastSlash('/'); // '/'\n * ```\n */\nexport function removeLastSlash(pathname: string): string {\n if (pathname === '/') {\n return pathname;\n }\n return pathname.endsWith('/') ? pathname.slice(0, -1) : pathname;\n}\n\n/**\n * Check if a URL is an external link (starts with http:// or https://).\n *\n * @param url - URL to check\n * @returns True if external link\n *\n * @example\n * ```ts\n * isExternalLink('https://example.com'); // true\n * isExternalLink('/about'); // false\n * isExternalLink('#section'); // false\n * ```\n */\nexport function isExternalLink(url: string): boolean {\n return /^https?:\\/\\//.test(url);\n}\n\n/**\n * Compare two paths for equality (ignoring trailing slashes and query params).\n *\n * @param targetUrl - Target URL\n * @param currentUrl - Current URL\n * @param options - Comparison options\n * @returns True if paths are equal\n *\n * @example\n * ```ts\n * isEqualPath('/users/', '/users'); // true\n * isEqualPath('/users?page=1', '/users'); // true\n * isEqualPath('/users', '/users/1', { deep: true }); // false\n * ```\n */\nexport function isEqualPath(targetUrl: string, currentUrl: string, options: { deep?: boolean } = {}): boolean {\n const { deep = false } = options;\n\n // Normalize both paths\n const target = removeLastSlash(removeParams(targetUrl));\n const current = removeLastSlash(removeParams(currentUrl));\n\n if (deep) {\n return current === target || current.startsWith(target + '/');\n }\n\n return target === current;\n}\n","'use client';\n\n/**\n * Navigation Item Component\n *\n * Individual navigation item with icon, text, and optional children indicator.\n *\n * @module components/nav-section\n */\n\nimport { useMemo } from 'react';\nimport type { Ref } from 'react';\nimport Box from '@mui/material/Box';\nimport Tooltip from '@mui/material/Tooltip';\n\nimport type { NavItemProps, NavItemRenderProps } from './types.js';\nimport { NavItemBase, NavIcon, NavTexts, NavArrow, NavInfo } from './components.js';\nimport { isExternalLink } from '../../utils/url.js';\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Resolve icon from render props or direct node.\n */\nfunction resolveIcon(\n icon: string | React.ReactNode | undefined,\n render?: NavItemRenderProps\n): React.ReactNode | undefined {\n if (!icon) return undefined;\n if (typeof icon === 'string' && render?.navIcon) {\n return render.navIcon[icon];\n }\n return icon as React.ReactNode;\n}\n\n/**\n * Resolve info from render props or direct node.\n */\nfunction resolveInfo(\n info: string[] | React.ReactNode | undefined,\n render?: NavItemRenderProps\n): React.ReactNode | undefined {\n if (!info) return undefined;\n if (Array.isArray(info) && render?.navInfo) {\n const infoComponents = info.map((key) => render.navInfo?.(key));\n return (\n <>\n {infoComponents.map((comp, idx) => (\n <Box key={idx} component=\"span\">\n {comp && Object.values(comp)[0]}\n </Box>\n ))}\n </>\n );\n }\n return info as React.ReactNode;\n}\n\n// =============================================================================\n// NAV ITEM COMPONENT\n// =============================================================================\n\n/**\n * NavItem - Individual navigation item.\n *\n * @example\n * ```tsx\n * <NavItem\n * title=\"Dashboard\"\n * path=\"/dashboard\"\n * icon={<DashboardIcon />}\n * active={pathname === '/dashboard'}\n * />\n * ```\n */\nexport function NavItem(props: NavItemProps & { ref?: Ref<HTMLButtonElement> }) {\n const { ref } = props;\n const {\n // Data props\n path,\n title,\n icon,\n info,\n caption,\n disabled,\n children: _children,\n // State props\n open,\n active,\n // Options\n depth = 1,\n hasChild,\n externalLink,\n enabledRootRedirect,\n render,\n slotProps,\n // ButtonBase props\n onClick,\n ...other\n } = props;\n\n // Resolve icon and info from render props\n const resolvedIcon = useMemo(() => resolveIcon(icon, render), [icon, render]);\n const resolvedInfo = useMemo(() => resolveInfo(info, render), [info, render]);\n\n // Check if external link\n const isExternal = externalLink ?? isExternalLink(path);\n\n // Determine if item should be clickable\n const isClickable = !disabled && (enabledRootRedirect || !hasChild || depth > 1);\n\n // Build anchor props for external links\n const linkProps = isExternal\n ? {\n component: 'a' as const,\n href: path,\n target: '_blank',\n rel: 'noopener noreferrer',\n }\n : {};\n\n const content = (\n <NavItemBase\n ref={ref}\n active={active}\n disabled={disabled}\n open={open}\n depth={depth}\n hasChild={hasChild}\n onClick={isClickable ? onClick : undefined}\n sx={slotProps?.sx}\n {...linkProps}\n {...other}\n >\n <NavIcon icon={resolvedIcon} className={slotProps?.icon as string} />\n <NavTexts title={title} caption={caption} className={slotProps?.texts as string} />\n {resolvedInfo && <NavInfo info={resolvedInfo} className={slotProps?.info as string} />}\n {hasChild && <NavArrow open={open} className={slotProps?.arrow as string} />}\n </NavItemBase>\n );\n\n // Wrap with tooltip for caption in mini mode or when needed\n if (caption && depth === 1) {\n return (\n <Tooltip title={caption} placement=\"right\" arrow>\n {content}\n </Tooltip>\n );\n }\n\n return content;\n}\n// =============================================================================\n// NAV ITEM EXPORTS\n// =============================================================================\n\nexport type { NavItemProps };\n","'use client';\n\n/**\n * Navigation Context\n *\n * Context for managing navigation state (pathname, router).\n *\n * @module components/nav-section\n */\n\nimport { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Router functions for navigation.\n */\nexport interface NavRouter {\n /** Navigate to a path */\n push: (path: string) => void;\n /** Replace current path */\n replace?: (path: string) => void;\n}\n\n/**\n * Navigation context value.\n */\nexport interface NavContextValue {\n /** Current pathname */\n pathname: string;\n /** Optional router */\n router?: NavRouter;\n}\n\n/**\n * Props for NavProvider.\n */\nexport interface NavProviderProps {\n /** Current pathname */\n pathname: string;\n /** Optional router */\n router?: NavRouter;\n children: ReactNode;\n}\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst NavContext = createContext<NavContextValue | undefined>(undefined);\n\n/**\n * NavProvider - Provides navigation context to nav components.\n *\n * @example\n * ```tsx\n * // With Next.js\n * import { usePathname, useRouter } from 'next/navigation';\n *\n * function App() {\n * const pathname = usePathname();\n * const router = useRouter();\n *\n * return (\n * <NavProvider pathname={pathname} router={router}>\n * <NavSection data={navConfig} />\n * </NavProvider>\n * );\n * }\n *\n * // With React Router\n * import { useLocation, useNavigate } from 'react-router-dom';\n *\n * function App() {\n * const { pathname } = useLocation();\n * const navigate = useNavigate();\n *\n * return (\n * <NavProvider pathname={pathname} router={{ push: navigate }}>\n * <NavSection data={navConfig} />\n * </NavProvider>\n * );\n * }\n * ```\n */\nexport function NavProvider({ pathname, router, children }: NavProviderProps): ReactNode {\n const value = useMemo(() => ({ pathname, router }), [pathname, router]);\n\n return <NavContext.Provider value={value}>{children}</NavContext.Provider>;\n}\n\n/**\n * useNav - Hook to access navigation context.\n */\nexport function useNav(): NavContextValue {\n const context = useContext(NavContext);\n if (context === undefined) {\n throw new Error('useNav must be used within a NavProvider');\n }\n return context;\n}\n\n/**\n * useNavPathname - Hook to get current pathname with fallback.\n *\n * Returns pathname from context if available, otherwise returns '/'.\n * This allows components to work without NavProvider for simpler use cases.\n */\nexport function useNavPathname(): string {\n const context = useContext(NavContext);\n return context?.pathname ?? '/';\n}\n\n/**\n * useNavRouter - Hook to get router from context.\n */\nexport function useNavRouter(): NavRouter | undefined {\n const context = useContext(NavContext);\n return context?.router;\n}\n","'use client';\n\n/**\n * Navigation List Component\n *\n * Renders a navigation item with its children, handling collapse and active states.\n *\n * @module components/nav-section\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport Collapse from '@mui/material/Collapse';\n\nimport type { NavListProps, NavSubListProps, NavItemDataProps } from './types.js';\nimport { NavUl, NavLi } from './components.js';\nimport { NavItem } from './nav-item.js';\nimport { useNavPathname } from './nav-context.js';\nimport { isActiveLink } from '../../utils/url.js';\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Check if any child route is active.\n */\nfunction hasActiveChild(data: NavItemDataProps, currentPath: string, deepMatch = false): boolean {\n if (!data.children?.length) return false;\n\n return data.children.some((child) => {\n const childActive = deepMatch ? isActiveLink(currentPath, child.path, true) : currentPath === child.path;\n\n if (childActive) return true;\n if (child.children?.length) {\n return hasActiveChild(child, currentPath, deepMatch);\n }\n return false;\n });\n}\n\n// =============================================================================\n// NAV LIST COMPONENT\n// =============================================================================\n\n/**\n * NavList - Renders a navigation item with its children.\n *\n * @example\n * ```tsx\n * <NavList\n * data={{\n * title: 'Users',\n * path: '/users',\n * children: [\n * { title: 'List', path: '/users/list' },\n * { title: 'Create', path: '/users/create' },\n * ],\n * }}\n * depth={1}\n * />\n * ```\n */\nexport function NavList({\n data,\n depth = 1,\n render,\n slotProps,\n cssVars,\n checkPermissions,\n enabledRootRedirect,\n}: NavListProps): React.ReactNode {\n const pathname = useNavPathname();\n\n // Check if this item is active\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n // Check if any child is active\n const hasChild = Boolean(data.children?.length);\n const childActive = useMemo(\n () => hasChild && hasActiveChild(data, pathname, data.deepMatch),\n [data, pathname, hasChild]\n );\n\n // Open state for collapse (default open if child is active)\n const [open, setOpen] = useState(childActive);\n\n // Update open state when child becomes active\n useEffect(() => {\n if (childActive) {\n setOpen(true);\n }\n }, [childActive]);\n\n // Toggle collapse\n const handleToggle = useCallback(() => {\n if (hasChild) {\n setOpen((prev) => !prev);\n }\n }, [hasChild]);\n\n // Handle navigation click\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n if (hasChild && !enabledRootRedirect) {\n event.preventDefault();\n handleToggle();\n }\n },\n [hasChild, enabledRootRedirect, handleToggle]\n );\n\n // Check permissions\n if (checkPermissions && data.allowedRoles) {\n const hasPermission = checkPermissions(data.allowedRoles);\n if (!hasPermission) return null;\n }\n\n return (\n <NavLi>\n <NavItem\n // Data\n path={data.path}\n title={data.title}\n icon={data.icon}\n info={data.info}\n caption={data.caption}\n disabled={data.disabled}\n // State\n active={isActive || childActive}\n open={open}\n // Options\n depth={depth}\n hasChild={hasChild}\n enabledRootRedirect={enabledRootRedirect}\n render={render}\n slotProps={depth === 1 ? slotProps?.rootItem : slotProps?.subItem}\n // Events\n onClick={handleClick}\n />\n\n {hasChild && (\n <Collapse in={open} unmountOnExit>\n <NavSubList\n data={data.children!}\n depth={depth + 1}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n </Collapse>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// NAV SUB LIST COMPONENT\n// =============================================================================\n\n/**\n * NavSubList - Renders a list of child navigation items.\n */\nexport function NavSubList({\n data,\n depth,\n render,\n slotProps,\n cssVars,\n checkPermissions,\n enabledRootRedirect,\n}: NavSubListProps): React.ReactNode {\n return (\n <NavUl sx={{ gap: 'var(--nav-item-gap)' }}>\n {data.map((item) => (\n <NavList\n key={item.title}\n data={item}\n depth={depth}\n render={render}\n slotProps={slotProps}\n cssVars={cssVars}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n );\n}\n","'use client';\n\n/**\n * Vertical Navigation Section\n *\n * Collapsible navigation groups for sidebar layouts.\n *\n * @module components/nav-section\n */\n\nimport { useTheme } from '@mui/material/styles';\nimport Collapse from '@mui/material/Collapse';\n\nimport type { NavGroupProps, NavSectionProps } from './types.js';\nimport { Nav, NavUl, NavLi, NavSubheader } from './components.js';\nimport { NavList } from './nav-list.js';\nimport { navSectionClasses, navSectionCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { useBoolean } from '../../core/index.js';\n\n// =============================================================================\n// NAV GROUP COMPONENT\n// =============================================================================\n\n/**\n * NavGroup - A collapsible group of navigation items with optional subheader.\n */\nfunction NavGroup({\n items,\n render,\n subheader,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: NavGroupProps): React.ReactNode {\n const groupOpen = useBoolean(true);\n\n const renderContent = () => (\n <NavUl sx={{ gap: 'var(--nav-item-gap)' }}>\n {items.map((list) => (\n <NavList\n key={list.title}\n data={list}\n render={render}\n depth={1}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n );\n\n return (\n <NavLi>\n {subheader ? (\n <>\n <NavSubheader\n data-title={subheader}\n open={groupOpen.value}\n onClick={groupOpen.onToggle}\n sx={slotProps?.subheader}\n >\n {subheader}\n </NavSubheader>\n\n <Collapse in={groupOpen.value}>{renderContent()}</Collapse>\n </>\n ) : (\n renderContent()\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// NAV SECTION VERTICAL\n// =============================================================================\n\n/**\n * NavSectionVertical - Vertical navigation section for sidebar layouts.\n *\n * @example\n * ```tsx\n * const navConfig = [\n * {\n * subheader: 'Overview',\n * items: [\n * { title: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> },\n * { title: 'Analytics', path: '/analytics', icon: <ChartIcon /> },\n * ],\n * },\n * {\n * subheader: 'Management',\n * items: [\n * {\n * title: 'Users',\n * path: '/users',\n * icon: <UsersIcon />,\n * children: [\n * { title: 'List', path: '/users/list' },\n * { title: 'Create', path: '/users/create' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <NavProvider pathname={pathname}>\n * <NavSectionVertical data={navConfig} />\n * </NavProvider>\n * ```\n */\nexport function NavSectionVertical({\n sx,\n data,\n render,\n className,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: NavSectionProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...navSectionCssVars.vertical(theme), ...overridesVars };\n\n return (\n <Nav\n className={cn(navSectionClasses.root, navSectionClasses.vertical, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl sx={{ flex: '1 1 auto', gap: 'var(--nav-item-gap)' }}>\n {data.map((group) => (\n <NavGroup\n key={group.subheader ?? group.items[0]?.title}\n subheader={group.subheader}\n items={group.items}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\n/**\n * Horizontal Navigation Section\n *\n * Horizontal navigation for header/top bar layouts.\n *\n * @module components/nav-section\n */\n\nimport { useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport { useTheme } from '@mui/material/styles';\nimport Popover from '@mui/material/Popover';\nimport Paper from '@mui/material/Paper';\n\nimport type { NavItemDataProps, NavListProps, NavSectionProps } from './types.js';\nimport { Nav, NavUl, NavLi } from './components.js';\nimport { NavItem } from './nav-item.js';\nimport { useNavPathname } from './nav-context.js';\nimport { navSectionClasses, navSectionCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink } from '../../utils/url.js';\n\n// =============================================================================\n// HORIZONTAL NAV LIST\n// =============================================================================\n\n/**\n * HorizontalNavList - Navigation item with dropdown for horizontal layout.\n */\nfunction HorizontalNavList({\n data,\n render,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: NavListProps): React.ReactNode {\n const pathname = useNavPathname();\n const anchorRef = useRef<HTMLButtonElement>(null);\n\n // Check if this item is active\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n // Check if any child is active\n const hasChild = Boolean(data.children?.length);\n const childActive = useMemo(() => {\n if (!hasChild) return false;\n return data.children!.some((child) => isActiveLink(pathname, child.path, child.deepMatch));\n }, [data.children, pathname, hasChild]);\n\n // Popover state\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n if (hasChild) {\n setOpen(true);\n }\n }, [hasChild]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n // Close on route change\n useEffect(() => {\n handleClose();\n }, [pathname, handleClose]);\n\n // Check permissions\n if (checkPermissions && data.allowedRoles) {\n const hasPermission = checkPermissions(data.allowedRoles);\n if (!hasPermission) return null;\n }\n\n return (\n <NavLi>\n <NavItem\n ref={anchorRef}\n // Data\n path={data.path}\n title={data.title}\n icon={data.icon}\n info={data.info}\n caption={data.caption}\n disabled={data.disabled}\n // State\n active={isActive || childActive}\n open={open}\n // Options\n depth={1}\n hasChild={hasChild}\n enabledRootRedirect={enabledRootRedirect}\n render={render}\n slotProps={slotProps?.rootItem}\n // Events\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n />\n\n {hasChild && (\n <Popover\n open={open}\n anchorEl={anchorRef.current}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n onMouseEnter: handleOpen,\n onMouseLeave: handleClose,\n sx: {\n pointerEvents: 'auto',\n minWidth: 'var(--nav-dropdown-paper-width, 180px)',\n borderRadius: 'var(--nav-dropdown-paper-radius, 8px)',\n boxShadow: 'var(--nav-dropdown-paper-shadow)',\n ...slotProps?.dropdown?.paper,\n },\n },\n }}\n sx={{\n pointerEvents: 'none',\n }}\n disableRestoreFocus\n >\n <HorizontalDropdown\n data={data.children!}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n </Popover>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// HORIZONTAL DROPDOWN\n// =============================================================================\n\ninterface HorizontalDropdownProps {\n data: NavItemDataProps[];\n render?: NavListProps['render'];\n slotProps?: NavListProps['slotProps'];\n checkPermissions?: NavListProps['checkPermissions'];\n enabledRootRedirect?: boolean;\n}\n\n/**\n * HorizontalDropdown - Dropdown content for horizontal nav items.\n */\nfunction HorizontalDropdown({\n data,\n render,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: HorizontalDropdownProps): React.ReactNode {\n const pathname = useNavPathname();\n\n return (\n <Paper elevation={0} sx={{ p: 1 }}>\n <NavUl sx={{ gap: 0.5 }}>\n {data.map((item) => {\n // Check permissions\n if (checkPermissions && item.allowedRoles) {\n const hasPermission = checkPermissions(item.allowedRoles);\n if (!hasPermission) return null;\n }\n\n const isActive = isActiveLink(pathname, item.path, item.deepMatch);\n\n return (\n <NavLi key={item.title}>\n <NavItem\n path={item.path}\n title={item.title}\n icon={item.icon}\n disabled={item.disabled}\n active={isActive}\n depth={2}\n render={render}\n slotProps={slotProps?.subItem}\n enabledRootRedirect={enabledRootRedirect}\n />\n </NavLi>\n );\n })}\n </NavUl>\n </Paper>\n );\n}\n\n// =============================================================================\n// NAV SECTION HORIZONTAL\n// =============================================================================\n\n/**\n * NavSectionHorizontal - Horizontal navigation section for header layouts.\n *\n * @example\n * ```tsx\n * const navConfig = [\n * {\n * items: [\n * { title: 'Home', path: '/', icon: <HomeIcon /> },\n * {\n * title: 'Products',\n * path: '/products',\n * children: [\n * { title: 'All', path: '/products' },\n * { title: 'New', path: '/products/new' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <NavProvider pathname={pathname}>\n * <NavSectionHorizontal data={navConfig} />\n * </NavProvider>\n * ```\n */\nexport function NavSectionHorizontal({\n sx,\n data,\n render,\n className,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: NavSectionProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...navSectionCssVars.horizontal(theme), ...overridesVars };\n\n // Flatten all items from all groups\n const items = useMemo(() => data.flatMap((group) => group.items), [data]);\n\n return (\n <Nav\n className={cn(navSectionClasses.root, navSectionClasses.horizontal, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl sx={{ flexDirection: 'row', gap: 'var(--nav-item-gap)' }}>\n {items.map((item) => (\n <HorizontalNavList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\n/**\n * Mini Navigation Section\n *\n * Compact icon-only navigation for collapsed sidebars.\n *\n * @module components/nav-section\n */\n\nimport { useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport { useTheme, styled } from '@mui/material/styles';\nimport Popover from '@mui/material/Popover';\nimport Paper from '@mui/material/Paper';\nimport Tooltip from '@mui/material/Tooltip';\n\nimport type { NavItemDataProps, NavListProps, NavSectionProps } from './types.js';\nimport { Nav, NavUl, NavLi, NavItemBase, NavIcon } from './components.js';\nimport { NavItem } from './nav-item.js';\nimport { useNavPathname } from './nav-context.js';\nimport { navSectionClasses, navSectionCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink } from '../../utils/url.js';\n\n// =============================================================================\n// MINI NAV ITEM\n// =============================================================================\n\nconst MiniNavButton = styled(NavItemBase)(({ theme }) => ({\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n textAlign: 'center',\n padding: 'var(--nav-item-padding, 8px)',\n gap: 4,\n}));\n\nconst MiniTitle = styled('span')({\n fontSize: 'var(--nav-item-font-size, 0.625rem)',\n fontWeight: 500,\n lineHeight: 1.5,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '100%',\n});\n\n// =============================================================================\n// MINI NAV LIST\n// =============================================================================\n\n/**\n * MiniNavList - Navigation item for mini layout with tooltip popover.\n */\nfunction MiniNavList({\n data,\n render,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: NavListProps): React.ReactNode {\n const pathname = useNavPathname();\n const anchorRef = useRef<HTMLButtonElement>(null);\n\n // Check if this item is active\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n // Check if any child is active\n const hasChild = Boolean(data.children?.length);\n const childActive = useMemo(() => {\n if (!hasChild) return false;\n return data.children!.some((child) => isActiveLink(pathname, child.path, child.deepMatch));\n }, [data.children, pathname, hasChild]);\n\n // Popover state\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n if (hasChild) {\n setOpen(true);\n }\n }, [hasChild]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n // Close on route change\n useEffect(() => {\n handleClose();\n }, [pathname, handleClose]);\n\n // Check permissions\n if (checkPermissions && data.allowedRoles) {\n const hasPermission = checkPermissions(data.allowedRoles);\n if (!hasPermission) return null;\n }\n\n // Resolve icon\n const icon = typeof data.icon === 'string' && render?.navIcon ? render.navIcon[data.icon] : data.icon;\n\n const content = (\n <MiniNavButton\n ref={anchorRef}\n active={isActive || childActive}\n disabled={data.disabled}\n open={open}\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n sx={slotProps?.rootItem?.sx}\n >\n <NavIcon icon={icon} className={slotProps?.rootItem?.icon as string} />\n <MiniTitle>{data.title}</MiniTitle>\n </MiniNavButton>\n );\n\n return (\n <NavLi>\n {hasChild ? (\n <>\n {content}\n <Popover\n open={open}\n anchorEl={anchorRef.current}\n anchorOrigin={{\n vertical: 'center',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'center',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n onMouseEnter: handleOpen,\n onMouseLeave: handleClose,\n sx: {\n pointerEvents: 'auto',\n ml: 1,\n minWidth: 'var(--nav-tooltip-paper-width, 160px)',\n borderRadius: 1,\n ...slotProps?.dropdown?.paper,\n },\n },\n }}\n sx={{\n pointerEvents: 'none',\n }}\n disableRestoreFocus\n >\n <MiniDropdown\n data={data.children!}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n </Popover>\n </>\n ) : (\n <Tooltip title={data.title} placement=\"right\" arrow>\n {content}\n </Tooltip>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// MINI DROPDOWN\n// =============================================================================\n\ninterface MiniDropdownProps {\n data: NavItemDataProps[];\n render?: NavListProps['render'];\n slotProps?: NavListProps['slotProps'];\n checkPermissions?: NavListProps['checkPermissions'];\n enabledRootRedirect?: boolean;\n}\n\n/**\n * MiniDropdown - Dropdown content for mini nav items.\n */\nfunction MiniDropdown({\n data,\n render,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n}: MiniDropdownProps): React.ReactNode {\n const pathname = useNavPathname();\n\n return (\n <Paper elevation={0} sx={{ p: 1 }}>\n <NavUl sx={{ gap: 0.5 }}>\n {data.map((item) => {\n // Check permissions\n if (checkPermissions && item.allowedRoles) {\n const hasPermission = checkPermissions(item.allowedRoles);\n if (!hasPermission) return null;\n }\n\n const isActive = isActiveLink(pathname, item.path, item.deepMatch);\n\n return (\n <NavLi key={item.title}>\n <NavItem\n path={item.path}\n title={item.title}\n icon={item.icon}\n disabled={item.disabled}\n active={isActive}\n depth={2}\n render={render}\n slotProps={slotProps?.subItem}\n enabledRootRedirect={enabledRootRedirect}\n />\n </NavLi>\n );\n })}\n </NavUl>\n </Paper>\n );\n}\n\n// =============================================================================\n// NAV SECTION MINI\n// =============================================================================\n\n/**\n * NavSectionMini - Compact navigation for collapsed sidebars.\n *\n * @example\n * ```tsx\n * const navConfig = [\n * {\n * items: [\n * { title: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> },\n * {\n * title: 'Users',\n * path: '/users',\n * icon: <UsersIcon />,\n * children: [\n * { title: 'List', path: '/users/list' },\n * { title: 'Create', path: '/users/create' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <NavProvider pathname={pathname}>\n * <NavSectionMini data={navConfig} />\n * </NavProvider>\n * ```\n */\nexport function NavSectionMini({\n sx,\n data,\n render,\n className,\n slotProps,\n checkPermissions,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: NavSectionProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...navSectionCssVars.mini(theme), ...overridesVars };\n\n // Flatten all items from all groups\n const items = useMemo(() => data.flatMap((group) => group.items), [data]);\n\n return (\n <Nav\n className={cn(navSectionClasses.root, navSectionClasses.mini, className)}\n sx={[\n {\n ...cssVars,\n alignItems: 'center',\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...other}\n >\n <NavUl sx={{ gap: 'var(--nav-item-gap)', alignItems: 'center' }}>\n {items.map((item) => (\n <MiniNavList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n checkPermissions={checkPermissions}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","/**\n * Mega Menu Styles\n *\n * CSS custom properties and class names for mega menus.\n *\n * @module components/mega-menu\n */\n\nimport type { Theme, CSSObject } from '@mui/material/styles';\nimport type { MegaMenuVariant } from './types.js';\nimport { createComponentClasses } from '../../utils/create-classes.js';\n\n// =============================================================================\n// CLASS NAMES\n// =============================================================================\n\n/**\n * CSS class names for mega menu components.\n */\nexport const megaMenuClasses = createComponentClasses('mega-menu', [\n 'root',\n 'horizontal',\n 'vertical',\n 'mobile',\n 'ul',\n 'li',\n 'item',\n 'icon',\n 'title',\n 'info',\n 'arrow',\n 'dropdown',\n 'subheader',\n 'subItem',\n 'tags',\n 'moreLink',\n 'slide',\n 'active',\n 'disabled',\n 'open',\n] as const);\n\n// =============================================================================\n// CSS CUSTOM PROPERTIES\n// =============================================================================\n\n/**\n * Get CSS variables for mega menu based on variant.\n */\nexport function megaMenuCssVars(theme: Theme, variant: MegaMenuVariant): CSSObject {\n const commonVars: CSSObject = {\n // Item spacing\n '--nav-item-gap': '6px',\n '--nav-item-radius': '8px',\n // Icon\n '--nav-icon-size': '22px',\n '--nav-icon-margin': '0 8px 0 0',\n // Text\n '--nav-item-font-size': '0.875rem',\n '--nav-subheader-font-size': '0.6875rem',\n '--nav-subheader-font-weight': '700',\n // Colors - inactive\n '--nav-item-color': theme.palette.text.primary,\n '--nav-icon-color': theme.palette.text.secondary,\n '--nav-item-bg': 'transparent',\n // Colors - hover\n '--nav-item-hover-bg': theme.palette.action.hover,\n '--nav-item-hover-color': theme.palette.text.primary,\n // Colors - active\n '--nav-item-active-bg': theme.palette.action.selected,\n '--nav-item-active-color': theme.palette.primary.main,\n '--nav-icon-active-color': theme.palette.primary.main,\n // Colors - disabled\n '--nav-item-disabled-color': theme.palette.text.disabled,\n };\n\n switch (variant) {\n case 'horizontal':\n return {\n ...commonVars,\n '--nav-item-padding': '8px 14px',\n '--nav-item-min-height': '36px',\n // Dropdown\n '--nav-dropdown-width': '800px',\n '--nav-dropdown-max-height': '400px',\n '--nav-dropdown-radius': '12px',\n '--nav-dropdown-shadow': theme.shadows[20],\n '--nav-dropdown-padding': '24px',\n };\n\n case 'vertical':\n return {\n ...commonVars,\n '--nav-item-padding': '8px 12px',\n '--nav-item-min-height': '40px',\n // Dropdown\n '--nav-dropdown-width': '280px',\n '--nav-dropdown-max-height': '350px',\n '--nav-dropdown-radius': '10px',\n '--nav-dropdown-shadow': theme.shadows[16],\n '--nav-dropdown-padding': '16px',\n };\n\n case 'mobile':\n return {\n ...commonVars,\n '--nav-item-padding': '12px 16px',\n '--nav-item-min-height': '44px',\n // No dropdown for mobile - uses accordion style\n };\n\n default:\n return commonVars;\n }\n}\n","'use client';\n\n/**\n * Horizontal Mega Menu\n *\n * Rich dropdown navigation for header layouts.\n *\n * @module components/mega-menu\n */\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport Box from '@mui/material/Box';\nimport { useNavPathname } from '../nav-section/nav-context.js';\nimport Link from '@mui/material/Link';\nimport Paper from '@mui/material/Paper';\nimport Popover from '@mui/material/Popover';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { styled, useTheme, alpha } from '@mui/material/styles';\n\nimport type { MegaMenuProps, MegaMenuListProps } from './types.js';\nimport { megaMenuClasses, megaMenuCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink, isExternalLink } from '../../utils/url.js';\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst Nav = styled('nav')({\n display: 'flex',\n flexShrink: 0,\n});\n\nconst NavUl = styled('ul')({\n display: 'flex',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n});\n\nconst NavLi = styled('li')({\n display: 'flex',\n});\n\nconst NavButton = styled('button')<{ active?: boolean; open?: boolean }>(({ theme, active, open }) => ({\n all: 'unset',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n padding: 'var(--nav-item-padding)',\n minHeight: 'var(--nav-item-min-height)',\n borderRadius: 'var(--nav-item-radius)',\n fontSize: 'var(--nav-item-font-size)',\n fontWeight: 500,\n color: 'var(--nav-item-color)',\n backgroundColor: 'var(--nav-item-bg)',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n },\n ...(active && {\n backgroundColor: 'var(--nav-item-active-bg)',\n color: 'var(--nav-item-active-color)',\n }),\n ...(open && {\n backgroundColor: 'var(--nav-item-hover-bg)',\n }),\n '&:disabled': {\n color: 'var(--nav-item-disabled-color)',\n cursor: 'not-allowed',\n },\n}));\n\nconst IconWrapper = styled('span')({\n width: 'var(--nav-icon-size)',\n height: 'var(--nav-icon-size)',\n marginRight: 8,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--nav-icon-color)',\n '& svg': {\n width: '100%',\n height: '100%',\n },\n});\n\nconst ArrowIcon = styled('span')<{ open?: boolean }>(({ open }) => ({\n marginLeft: 6,\n width: 16,\n height: 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n '&::before': {\n content: '\"\"',\n width: 6,\n height: 6,\n borderStyle: 'solid',\n borderWidth: '0 0 1.5px 1.5px',\n borderColor: 'currentColor',\n transform: 'rotate(-45deg)',\n },\n}));\n\nconst DropdownContent = styled(Paper)(({ theme }) => ({\n width: 'var(--nav-dropdown-width)',\n maxHeight: 'var(--nav-dropdown-max-height)',\n borderRadius: 'var(--nav-dropdown-radius)',\n padding: 'var(--nav-dropdown-padding)',\n overflow: 'auto',\n display: 'flex',\n gap: 24,\n}));\n\nconst SectionColumn = styled('div')({\n flex: 1,\n minWidth: 0,\n});\n\nconst SectionHeader = styled(Typography)(({ theme }) => ({\n fontSize: 'var(--nav-subheader-font-size)',\n fontWeight: 'var(--nav-subheader-font-weight)',\n color: theme.palette.text.disabled,\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n marginBottom: 12,\n}));\n\nconst SubItemLink = styled(Link, {\n shouldForwardProp: (prop) => prop !== 'active',\n})<{ active?: boolean }>(({ theme, active }) => ({\n display: 'block',\n padding: '6px 0',\n fontSize: '0.875rem',\n color: active ? theme.palette.primary.main : theme.palette.text.secondary,\n textDecoration: 'none',\n transition: theme.transitions.create('color', {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n color: theme.palette.text.primary,\n },\n}));\n\nconst TagsContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n marginTop: 16,\n}));\n\nconst Tag = styled(Link)(({ theme }) => ({\n display: 'inline-flex',\n padding: '4px 10px',\n fontSize: '0.75rem',\n fontWeight: 500,\n color: theme.palette.text.secondary,\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n borderRadius: 6,\n textDecoration: 'none',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.grey[500], 0.16),\n color: theme.palette.text.primary,\n },\n}));\n\nconst MoreLink = styled(Link)(({ theme }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n padding: '8px 0',\n fontSize: '0.875rem',\n fontWeight: 600,\n color: theme.palette.primary.main,\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n '&::after': {\n content: '\"→\"',\n marginLeft: 4,\n },\n}));\n\n// =============================================================================\n// MEGA MENU LIST\n// =============================================================================\n\nfunction MegaMenuList({ data, render, slotProps, slots, enabledRootRedirect }: MegaMenuListProps): React.ReactNode {\n const pathname = useNavPathname();\n const anchorRef = useRef<HTMLButtonElement>(null);\n\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n const hasChild = Boolean(data.children?.length || data.tags?.length || data.slides?.length);\n\n const childActive = useMemo(() => {\n if (!data.children?.length) return false;\n return data.children.some((section) => section.items.some((item) => isActiveLink(pathname, item.path)));\n }, [data.children, pathname]);\n\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n if (hasChild) {\n setOpen(true);\n }\n }, [hasChild]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n useEffect(() => {\n handleClose();\n }, [pathname, handleClose]);\n\n // Resolve icon\n const icon = typeof data.icon === 'string' && render?.navIcon ? render.navIcon[data.icon] : data.icon;\n\n return (\n <NavLi className={megaMenuClasses.li}>\n <NavButton\n ref={anchorRef}\n className={cn(\n megaMenuClasses.item,\n (isActive || childActive) && megaMenuClasses.active,\n open && megaMenuClasses.open\n )}\n active={isActive || childActive}\n open={open}\n disabled={data.disabled}\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n >\n {icon && <IconWrapper className={megaMenuClasses.icon}>{icon}</IconWrapper>}\n <span className={megaMenuClasses.title}>{data.title}</span>\n {hasChild && <ArrowIcon open={open} className={megaMenuClasses.arrow} />}\n </NavButton>\n\n {hasChild && (\n <Popover\n open={open}\n anchorEl={anchorRef.current}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n onMouseEnter: handleOpen,\n onMouseLeave: handleClose,\n sx: {\n pointerEvents: 'auto',\n ...slotProps?.dropdown,\n },\n },\n }}\n sx={{\n pointerEvents: 'none',\n }}\n disableRestoreFocus\n >\n {slots?.topArea}\n\n <DropdownContent elevation={0} className={megaMenuClasses.dropdown}>\n {/* Child sections */}\n {data.children?.map((section, idx) => (\n <SectionColumn key={section.subheader ?? idx}>\n {section.subheader && (\n <SectionHeader className={megaMenuClasses.subheader}>{section.subheader}</SectionHeader>\n )}\n <Stack spacing={0.5}>\n {section.items.map((item) => {\n const itemActive = isActiveLink(pathname, item.path);\n const isExternal = isExternalLink(item.path);\n\n return (\n <SubItemLink\n key={item.title}\n href={item.path}\n active={itemActive}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n className={cn(megaMenuClasses.subItem, itemActive && megaMenuClasses.active)}\n sx={slotProps?.subItem}\n >\n {item.title}\n </SubItemLink>\n );\n })}\n </Stack>\n\n {/* More link at bottom of section */}\n {idx === 0 && data.moreLink && (\n <Box sx={{ mt: 2 }}>\n <MoreLink href={data.moreLink.path} className={megaMenuClasses.moreLink} sx={slotProps?.moreLink}>\n {data.moreLink.title}\n </MoreLink>\n </Box>\n )}\n </SectionColumn>\n ))}\n </DropdownContent>\n\n {/* Tags */}\n {data.tags && data.tags.length > 0 && (\n <Box sx={{ px: 'var(--nav-dropdown-padding)', pb: 'var(--nav-dropdown-padding)' }}>\n <TagsContainer className={megaMenuClasses.tags} sx={slotProps?.tags}>\n {data.tags.map((tag) => (\n <Tag key={tag.title} href={tag.path}>\n {tag.title}\n </Tag>\n ))}\n </TagsContainer>\n </Box>\n )}\n\n {slots?.bottomArea}\n </Popover>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// MEGA MENU HORIZONTAL\n// =============================================================================\n\n/**\n * MegaMenuHorizontal - Rich dropdown navigation for header layouts.\n *\n * @example\n * ```tsx\n * const menuData = [\n * {\n * title: 'Products',\n * path: '/products',\n * icon: <ProductsIcon />,\n * children: [\n * {\n * subheader: 'Categories',\n * items: [\n * { title: 'Electronics', path: '/products/electronics' },\n * { title: 'Clothing', path: '/products/clothing' },\n * ],\n * },\n * {\n * subheader: 'Featured',\n * items: [\n * { title: 'New Arrivals', path: '/products/new' },\n * { title: 'Best Sellers', path: '/products/best' },\n * ],\n * },\n * ],\n * tags: [\n * { title: 'Sale', path: '/products?filter=sale' },\n * { title: 'Trending', path: '/products?filter=trending' },\n * ],\n * moreLink: { title: 'View All Products', path: '/products' },\n * },\n * { title: 'About', path: '/about' },\n * ];\n *\n * <MegaMenuHorizontal data={menuData} />\n * ```\n */\nexport function MegaMenuHorizontal({\n sx,\n data,\n render,\n slotProps,\n slots,\n className,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: MegaMenuProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...megaMenuCssVars(theme, 'horizontal'), ...overridesVars };\n\n return (\n <Nav\n className={cn(megaMenuClasses.root, megaMenuClasses.horizontal, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl className={megaMenuClasses.ul} sx={{ gap: 'var(--nav-item-gap)' }}>\n {data.map((item) => (\n <MegaMenuList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n slots={slots}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\n/**\n * Vertical Mega Menu\n *\n * Rich dropdown navigation for sidebar layouts.\n *\n * @module components/mega-menu\n */\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport Box from '@mui/material/Box';\nimport { useNavPathname } from '../nav-section/nav-context.js';\nimport Link from '@mui/material/Link';\nimport Paper from '@mui/material/Paper';\nimport Popover from '@mui/material/Popover';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { styled, useTheme } from '@mui/material/styles';\n\nimport type { MegaMenuProps, MegaMenuListProps } from './types.js';\nimport { megaMenuClasses, megaMenuCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink, isExternalLink } from '../../utils/url.js';\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst Nav = styled('nav')({\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n});\n\nconst NavUl = styled('ul')({\n display: 'flex',\n flexDirection: 'column',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n});\n\nconst NavLi = styled('li')({\n display: 'flex',\n flexDirection: 'column',\n});\n\nconst NavButton = styled('button')<{ active?: boolean; open?: boolean }>(({ theme, active, open }) => ({\n all: 'unset',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n padding: 'var(--nav-item-padding)',\n minHeight: 'var(--nav-item-min-height)',\n borderRadius: 'var(--nav-item-radius)',\n fontSize: 'var(--nav-item-font-size)',\n fontWeight: 500,\n color: 'var(--nav-item-color)',\n backgroundColor: 'var(--nav-item-bg)',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n },\n ...(active && {\n backgroundColor: 'var(--nav-item-active-bg)',\n color: 'var(--nav-item-active-color)',\n }),\n ...(open && {\n backgroundColor: 'var(--nav-item-hover-bg)',\n }),\n '&:disabled': {\n color: 'var(--nav-item-disabled-color)',\n cursor: 'not-allowed',\n },\n}));\n\nconst IconWrapper = styled('span')({\n width: 'var(--nav-icon-size)',\n height: 'var(--nav-icon-size)',\n marginRight: 12,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--nav-icon-color)',\n '& svg': {\n width: '100%',\n height: '100%',\n },\n});\n\nconst ArrowIcon = styled('span')<{ open?: boolean }>(({ open }) => ({\n marginLeft: 'auto',\n width: 16,\n height: 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n '&::before': {\n content: '\"\"',\n width: 5,\n height: 5,\n borderStyle: 'solid',\n borderWidth: '0 1.5px 1.5px 0',\n borderColor: 'currentColor',\n transform: 'rotate(-45deg)',\n },\n}));\n\nconst DropdownContent = styled(Paper)(({ theme }) => ({\n width: 'var(--nav-dropdown-width)',\n maxHeight: 'var(--nav-dropdown-max-height)',\n borderRadius: 'var(--nav-dropdown-radius)',\n padding: 'var(--nav-dropdown-padding)',\n overflow: 'auto',\n}));\n\nconst SectionHeader = styled(Typography)(({ theme }) => ({\n fontSize: 'var(--nav-subheader-font-size)',\n fontWeight: 'var(--nav-subheader-font-weight)',\n color: theme.palette.text.disabled,\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n marginBottom: 8,\n marginTop: 16,\n // `:first-child` — homogeneous list of subheaders; child-position\n // selector is equivalent to of-type but doesn't tie correctness\n // to tag-name uniqueness.\n '&:first-child': {\n marginTop: 0,\n },\n}));\n\nconst SubItemLink = styled(Link, {\n shouldForwardProp: (prop) => prop !== 'active',\n})<{ active?: boolean }>(({ theme, active }) => ({\n display: 'block',\n padding: '6px 0',\n fontSize: '0.875rem',\n color: active ? theme.palette.primary.main : theme.palette.text.secondary,\n textDecoration: 'none',\n transition: theme.transitions.create('color', {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n color: theme.palette.text.primary,\n },\n}));\n\n// =============================================================================\n// MEGA MENU LIST\n// =============================================================================\n\nfunction MegaMenuList({ data, render, slotProps, slots, enabledRootRedirect }: MegaMenuListProps): React.ReactNode {\n const pathname = useNavPathname();\n const anchorRef = useRef<HTMLButtonElement>(null);\n\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n const hasChild = Boolean(data.children?.length);\n\n const childActive = useMemo(() => {\n if (!data.children?.length) return false;\n return data.children.some((section) => section.items.some((item) => isActiveLink(pathname, item.path)));\n }, [data.children, pathname]);\n\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n if (hasChild) {\n setOpen(true);\n }\n }, [hasChild]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, []);\n\n useEffect(() => {\n handleClose();\n }, [pathname, handleClose]);\n\n // Resolve icon\n const icon = typeof data.icon === 'string' && render?.navIcon ? render.navIcon[data.icon] : data.icon;\n\n return (\n <NavLi className={megaMenuClasses.li}>\n <NavButton\n ref={anchorRef}\n className={cn(\n megaMenuClasses.item,\n (isActive || childActive) && megaMenuClasses.active,\n open && megaMenuClasses.open\n )}\n active={isActive || childActive}\n open={open}\n disabled={data.disabled}\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n >\n {icon && <IconWrapper className={megaMenuClasses.icon}>{icon}</IconWrapper>}\n <span className={megaMenuClasses.title}>{data.title}</span>\n {hasChild && <ArrowIcon open={open} className={megaMenuClasses.arrow} />}\n </NavButton>\n\n {hasChild && (\n <Popover\n open={open}\n anchorEl={anchorRef.current}\n anchorOrigin={{\n vertical: 'center',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'center',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n onMouseEnter: handleOpen,\n onMouseLeave: handleClose,\n sx: {\n pointerEvents: 'auto',\n ml: 1,\n ...slotProps?.dropdown,\n },\n },\n }}\n sx={{\n pointerEvents: 'none',\n }}\n disableRestoreFocus\n >\n {slots?.topArea}\n\n <DropdownContent elevation={0} className={megaMenuClasses.dropdown}>\n {data.children?.map((section, idx) => (\n <Box key={section.subheader ?? idx}>\n {section.subheader && (\n <SectionHeader className={megaMenuClasses.subheader}>{section.subheader}</SectionHeader>\n )}\n <Stack spacing={0.5}>\n {section.items.map((item) => {\n const itemActive = isActiveLink(pathname, item.path);\n const isExternal = isExternalLink(item.path);\n\n return (\n <SubItemLink\n key={item.title}\n href={item.path}\n active={itemActive}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n className={cn(megaMenuClasses.subItem, itemActive && megaMenuClasses.active)}\n sx={slotProps?.subItem}\n >\n {item.title}\n </SubItemLink>\n );\n })}\n </Stack>\n </Box>\n ))}\n </DropdownContent>\n\n {slots?.bottomArea}\n </Popover>\n )}\n </NavLi>\n );\n}\n\n// =============================================================================\n// MEGA MENU VERTICAL\n// =============================================================================\n\n/**\n * MegaMenuVertical - Rich dropdown navigation for sidebar layouts.\n *\n * @example\n * ```tsx\n * const menuData = [\n * {\n * title: 'Products',\n * path: '/products',\n * icon: <ProductsIcon />,\n * children: [\n * {\n * subheader: 'Categories',\n * items: [\n * { title: 'Electronics', path: '/products/electronics' },\n * { title: 'Clothing', path: '/products/clothing' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <MegaMenuVertical data={menuData} />\n * ```\n */\nexport function MegaMenuVertical({\n sx,\n data,\n render,\n slotProps,\n slots,\n className,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: MegaMenuProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...megaMenuCssVars(theme, 'vertical'), ...overridesVars };\n\n return (\n <Nav\n className={cn(megaMenuClasses.root, megaMenuClasses.vertical, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl className={megaMenuClasses.ul} sx={{ gap: 'var(--nav-item-gap)' }}>\n {data.map((item) => (\n <MegaMenuList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n slots={slots}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","'use client';\n\n/**\n * Mobile Mega Menu\n *\n * Accordion-style navigation for mobile layouts.\n *\n * @module components/mega-menu\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport Box from '@mui/material/Box';\nimport { useNavPathname } from '../nav-section/nav-context.js';\nimport Link from '@mui/material/Link';\nimport Collapse from '@mui/material/Collapse';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { styled, useTheme, type Theme } from '@mui/material/styles';\n\nimport type { MegaMenuProps, MegaMenuListProps } from './types.js';\nimport { megaMenuClasses, megaMenuCssVars } from './styles.js';\nimport { cn } from '../../utils/cn.js';\nimport { isActiveLink, isExternalLink } from '../../utils/url.js';\n\n// =============================================================================\n// STYLED COMPONENTS\n// =============================================================================\n\nconst Nav = styled('nav')({\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n width: '100%',\n});\n\nconst NavUl = styled('ul')({\n display: 'flex',\n flexDirection: 'column',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n width: '100%',\n});\n\nconst NavLi = styled('li')({\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n});\n\nconst navItemStyles = (theme: Theme, active?: boolean) => ({\n all: 'unset' as const,\n boxSizing: 'border-box' as const,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n padding: 'var(--nav-item-padding)',\n minHeight: 'var(--nav-item-min-height)',\n fontSize: 'var(--nav-item-font-size)',\n fontWeight: 500,\n color: 'var(--nav-item-color)',\n borderBottom: `1px solid ${theme.palette.divider}`,\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n backgroundColor: 'var(--nav-item-hover-bg)',\n color: 'var(--nav-item-hover-color)',\n },\n ...(active && {\n color: 'var(--nav-item-active-color)',\n }),\n});\n\nconst NavButton = styled('button')<{ active?: boolean; open?: boolean }>(({ theme, active }) => ({\n ...navItemStyles(theme, active),\n '&:disabled': {\n color: 'var(--nav-item-disabled-color)',\n cursor: 'not-allowed',\n },\n}));\n\nconst NavLink = styled('a')<{ active?: boolean }>(({ theme, active }) => navItemStyles(theme, active));\n\nconst IconWrapper = styled('span')({\n width: 'var(--nav-icon-size)',\n height: 'var(--nav-icon-size)',\n marginRight: 12,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--nav-icon-color)',\n '& svg': {\n width: '100%',\n height: '100%',\n },\n});\n\nconst ArrowIcon = styled('span')<{ open?: boolean }>(({ open }) => ({\n marginLeft: 'auto',\n width: 20,\n height: 20,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s',\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n '&::before': {\n content: '\"\"',\n width: 6,\n height: 6,\n borderStyle: 'solid',\n borderWidth: '0 0 2px 2px',\n borderColor: 'currentColor',\n transform: 'rotate(-45deg)',\n },\n}));\n\nconst CollapseContent = styled(Box)(({ theme }) => ({\n padding: '8px 0',\n paddingLeft: 40,\n backgroundColor: theme.palette.background.neutral,\n}));\n\nconst SectionHeader = styled(Typography)(({ theme }) => ({\n fontSize: 'var(--nav-subheader-font-size)',\n fontWeight: 'var(--nav-subheader-font-weight)',\n color: theme.palette.text.disabled,\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n padding: '12px 16px 8px',\n}));\n\nconst SubItemLink = styled(Link, {\n shouldForwardProp: (prop) => prop !== 'active',\n})<{ active?: boolean }>(({ theme, active }) => ({\n display: 'block',\n padding: '10px 16px',\n fontSize: '0.875rem',\n color: active ? theme.palette.primary.main : theme.palette.text.secondary,\n textDecoration: 'none',\n transition: theme.transitions.create('color', {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n color: theme.palette.text.primary,\n },\n}));\n\n// =============================================================================\n// MEGA MENU LIST\n// =============================================================================\n\nfunction MegaMenuList({ data, render, slotProps, enabledRootRedirect }: MegaMenuListProps): React.ReactNode {\n const pathname = useNavPathname();\n\n const isActive = useMemo(\n () => isActiveLink(pathname, data.path, data.deepMatch),\n [pathname, data.path, data.deepMatch]\n );\n\n const hasChild = Boolean(data.children?.length);\n\n const childActive = useMemo(() => {\n if (!data.children?.length) return false;\n return data.children.some((section) => section.items.some((item) => isActiveLink(pathname, item.path)));\n }, [data.children, pathname]);\n\n // Start open if child is active\n const [open, setOpen] = useState(childActive);\n\n const handleToggle = useCallback(() => {\n if (hasChild) {\n setOpen((prev) => !prev);\n }\n }, [hasChild]);\n\n // Resolve icon\n const icon = typeof data.icon === 'string' && render?.navIcon ? render.navIcon[data.icon] : data.icon;\n\n // Simple link for items without children\n if (!hasChild) {\n const isExternal = isExternalLink(data.path);\n return (\n <NavLi className={megaMenuClasses.li}>\n <NavLink\n href={data.path}\n className={cn(megaMenuClasses.item, isActive && megaMenuClasses.active)}\n active={isActive}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n >\n {icon && <IconWrapper className={megaMenuClasses.icon}>{icon}</IconWrapper>}\n <span className={megaMenuClasses.title}>{data.title}</span>\n </NavLink>\n </NavLi>\n );\n }\n\n return (\n <NavLi className={megaMenuClasses.li}>\n <NavButton\n className={cn(\n megaMenuClasses.item,\n (isActive || childActive) && megaMenuClasses.active,\n open && megaMenuClasses.open\n )}\n active={isActive || childActive}\n open={open}\n disabled={data.disabled}\n onClick={handleToggle}\n >\n {icon && <IconWrapper className={megaMenuClasses.icon}>{icon}</IconWrapper>}\n <span className={megaMenuClasses.title}>{data.title}</span>\n <ArrowIcon open={open} className={megaMenuClasses.arrow} />\n </NavButton>\n\n <Collapse in={open} unmountOnExit>\n <CollapseContent>\n {data.children?.map((section, idx) => (\n <Box key={section.subheader ?? idx}>\n {section.subheader && (\n <SectionHeader className={megaMenuClasses.subheader}>{section.subheader}</SectionHeader>\n )}\n <Stack>\n {section.items.map((item) => {\n const itemActive = isActiveLink(pathname, item.path);\n const isExternal = isExternalLink(item.path);\n\n return (\n <SubItemLink\n key={item.title}\n href={item.path}\n active={itemActive}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n className={cn(megaMenuClasses.subItem, itemActive && megaMenuClasses.active)}\n sx={slotProps?.subItem}\n >\n {item.title}\n </SubItemLink>\n );\n })}\n </Stack>\n </Box>\n ))}\n </CollapseContent>\n </Collapse>\n </NavLi>\n );\n}\n\n// =============================================================================\n// MEGA MENU MOBILE\n// =============================================================================\n\n/**\n * MegaMenuMobile - Accordion-style navigation for mobile layouts.\n *\n * @example\n * ```tsx\n * const menuData = [\n * {\n * title: 'Products',\n * path: '/products',\n * icon: <ProductsIcon />,\n * children: [\n * {\n * subheader: 'Categories',\n * items: [\n * { title: 'Electronics', path: '/products/electronics' },\n * { title: 'Clothing', path: '/products/clothing' },\n * ],\n * },\n * ],\n * },\n * ];\n *\n * <MegaMenuMobile data={menuData} />\n * ```\n */\nexport function MegaMenuMobile({\n sx,\n data,\n render,\n slotProps,\n className,\n enabledRootRedirect,\n cssVars: overridesVars,\n ...other\n}: MegaMenuProps): React.ReactNode {\n const theme = useTheme();\n\n const cssVars = { ...megaMenuCssVars(theme, 'mobile'), ...overridesVars };\n\n return (\n <Nav\n className={cn(megaMenuClasses.root, megaMenuClasses.mobile, className)}\n sx={[{ ...cssVars }, ...(Array.isArray(sx) ? sx : [sx])]}\n {...other}\n >\n <NavUl className={megaMenuClasses.ul}>\n {data.map((item) => (\n <MegaMenuList\n key={item.title}\n data={item}\n render={render}\n slotProps={slotProps}\n enabledRootRedirect={enabledRootRedirect}\n />\n ))}\n </NavUl>\n </Nav>\n );\n}\n","/**\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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nexport { remarkSpoiler };\n","'use client';\n\nimport './code-highlight.css';\n\nimport type { Options } from 'react-markdown';\nimport { useId, useMemo } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeSanitize, { defaultSchema } from 'rehype-sanitize';\nimport rehypeHighlight from 'rehype-highlight';\nimport remarkGfm from 'remark-gfm';\n\nimport Link from '@mui/material/Link';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { ContentRoot } from './styles.js';\nimport { contentClasses } from './classes.js';\nimport { htmlToMarkdown, isMarkdownContent } from './html-to-markdown.js';\nimport { remarkSpoiler } from './remark-spoiler.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MarkdownProps = {\n /** Markdown or HTML string content */\n children: string;\n /** Additional CSS class */\n className?: string;\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Compact mode for chat messages, comments, etc. */\n compact?: boolean;\n /** Custom react-markdown component overrides */\n components?: Options['components'];\n /** Additional rehype plugins */\n rehypePlugins?: Options['rehypePlugins'];\n /** Additional remark plugins */\n remarkPlugins?: Options['remarkPlugins'];\n /** Link component for internal navigation (e.g. react-router Link) */\n routerLinkComponent?: React.ElementType;\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isExternalLink(href: string): boolean {\n return /^https?:\\/\\//.test(href) || href.startsWith('//');\n}\n\n// ---------------------------------------------------------------------------\n// Default plugins\n// ---------------------------------------------------------------------------\n\n// T#347 — XSS hardening: the spoiler remark plugin emits raw HTML\n// (`<span class=\"…\">…</span>`) which rehype-raw then re-parses into the\n// DOM tree. Without rehype-sanitize, ANY raw HTML the user types into\n// markdown (`<img src=x onerror=alert(...)>`) would also pass through —\n// catastrophic under cookie-mode auth because the inline script runs\n// in the portal origin with access to the non-HttpOnly CSRF cookie.\n//\n// We extend hast-util-sanitize's defaultSchema (which already strips\n// <script>, on* handlers, javascript:/data: URIs, etc.) to allow the\n// one tag the spoiler plugin emits: `<span class=\"<spoiler-class>\">`.\n// Order matters: rehypeRaw → rehypeSanitize → rehypeHighlight, so the\n// sanitizer sees the fully-expanded tree before highlighting decorates\n// trusted code-fence children with extra <span class=\"hljs-…\"> wrappers.\nconst SAFE_CLASS_RE = /^(prism-content__[a-z0-9_-]+|hljs(-[a-z0-9-]+)?|language-[a-z0-9+#-]+)$/i;\nconst spoilerSanitizeSchema = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n span: [...(defaultSchema.attributes?.['span'] ?? []), ['className', SAFE_CLASS_RE]],\n code: [...(defaultSchema.attributes?.['code'] ?? []), ['className', SAFE_CLASS_RE]],\n div: [...(defaultSchema.attributes?.['div'] ?? []), ['className', SAFE_CLASS_RE]],\n },\n};\n\nconst defaultRehypePlugins: NonNullable<Options['rehypePlugins']> = [\n rehypeRaw,\n [rehypeSanitize, spoilerSanitizeSchema],\n rehypeHighlight,\n];\n\nconst defaultRemarkPlugins: NonNullable<Options['remarkPlugins']> = [\n [remarkGfm, { singleTilde: false }],\n remarkSpoiler,\n];\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function Markdown({\n children,\n className,\n sx,\n compact,\n components,\n rehypePlugins,\n remarkPlugins,\n routerLinkComponent,\n}: MarkdownProps) {\n const content = useMemo(() => {\n const cleaned = String(children).trim();\n return isMarkdownContent(cleaned) ? cleaned : htmlToMarkdown(cleaned);\n }, [children]);\n\n const allRehypePlugins = useMemo(() => [...defaultRehypePlugins, ...(rehypePlugins ?? [])], [rehypePlugins]);\n\n const allRemarkPlugins = useMemo(() => [...defaultRemarkPlugins, ...(remarkPlugins ?? [])], [remarkPlugins]);\n\n const defaultComponents = useMemo(\n (): NonNullable<Options['components']> => ({\n img: ({ node: _n, ...other }) => <img className={contentClasses.image} {...other} />,\n a: ({ href = '', children: linkChildren, node: _n, ...other }) => {\n if (isExternalLink(href)) {\n return (\n <Link href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={contentClasses.link} {...other}>\n {linkChildren}\n </Link>\n );\n }\n if (routerLinkComponent) {\n return (\n <Link component={routerLinkComponent} href={href} className={contentClasses.link} {...other}>\n {linkChildren}\n </Link>\n );\n }\n return (\n <Link href={href} className={contentClasses.link} {...other}>\n {linkChildren}\n </Link>\n );\n },\n pre: ({ children: preChildren }) => (\n <div className={contentClasses.codeBlock}>\n <pre>{preChildren}</pre>\n </div>\n ),\n code: ({ className: codeClassName = '', children: codeChildren, node: _n, ...other }) => {\n const hasLanguage = /language-\\w+/.test(codeClassName);\n return (\n <code className={hasLanguage ? codeClassName : contentClasses.codeInline} {...other}>\n {codeChildren}\n </code>\n );\n },\n input: ({ type, node: _n, ...other }) =>\n type === 'checkbox' ? (\n <CheckboxInput className={contentClasses.checkbox} {...other} />\n ) : (\n <input type={type} {...other} />\n ),\n }),\n [routerLinkComponent]\n );\n\n return (\n <ContentRoot\n className={[contentClasses.root, contentClasses.markdown, compact && contentClasses.compact, className]\n .filter(Boolean)\n .join(' ')}\n sx={sx}\n >\n <ReactMarkdown\n components={{ ...defaultComponents, ...components }}\n rehypePlugins={allRehypePlugins}\n remarkPlugins={allRemarkPlugins}\n >\n {content}\n </ReactMarkdown>\n </ContentRoot>\n );\n}\n\nfunction CheckboxInput(props: React.ComponentProps<'input'>) {\n const uniqueId = useId();\n return <input type=\"checkbox\" id={uniqueId} {...props} />;\n}\n","'use client';\n\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport type { Options } from 'react-markdown';\n\nimport { TipTapRenderer } from '../tiptap-renderer/tiptap-renderer.js';\nimport type { TipTapDoc } from '../tiptap-renderer/tiptap-renderer.js';\nimport { Markdown } from './markdown.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Content can be:\n * - TipTap JSON document (object with `type: 'doc'` and `content` array)\n * - Markdown string\n * - HTML string (auto-converted to markdown)\n * - null/undefined (renders nothing)\n */\nexport type ContentValue = TipTapDoc | Record<string, unknown> | string | null | undefined;\n\nexport interface ContentRendererProps {\n /** The content to render — TipTap JSON, markdown string, or HTML string */\n content: ContentValue;\n /** Additional CSS class */\n className?: string;\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Compact mode for chat messages, comments, etc. */\n compact?: boolean;\n /** Custom react-markdown component overrides (only applies to markdown/HTML content) */\n markdownComponents?: Options['components'];\n /** Link component for internal navigation (e.g. react-router Link) */\n routerLinkComponent?: React.ElementType;\n}\n\n// ---------------------------------------------------------------------------\n// Detection\n// ---------------------------------------------------------------------------\n\nfunction isTipTapDoc(value: unknown): value is TipTapDoc {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as any).type === 'doc' &&\n 'content' in value &&\n Array.isArray((value as any).content)\n );\n}\n\n/**\n * Detect a string that is a JSON-serialised TipTap doc. The\n * comments composer saves the editor state via `editor.getJSON()`\n * then `JSON.stringify(...)`; without this hop the string ends\n * up in the markdown branch and the page prints the raw JSON\n * literal (`{\"type\":\"doc\",\"content\":[...]}`) instead of the\n * formatted comment body. Cheap-first check on the prefix so we\n * don't `JSON.parse` every markdown comment.\n */\nfunction tryParseTipTapJson(value: string): TipTapDoc | null {\n const trimmed = value.trimStart();\n if (!trimmed.startsWith('{')) return null;\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return isTipTapDoc(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Unified content renderer that auto-detects the content format and delegates\n * to the appropriate renderer:\n *\n * - **TipTap JSON** → TipTapRenderer (recursive node-to-HTML mapping)\n * - **Markdown / HTML string** → Markdown (react-markdown with rehype-highlight)\n *\n * Both renderers share the same styled container (`ContentRoot`) ensuring\n * consistent typography, code highlighting, table styling, and dark mode support.\n */\nexport function ContentRenderer({\n content,\n className,\n sx,\n compact,\n markdownComponents,\n routerLinkComponent,\n}: ContentRendererProps) {\n if (content == null) return null;\n\n // TipTap JSON document\n if (typeof content === 'object') {\n if (isTipTapDoc(content)) {\n return <TipTapRenderer content={content} className={className} sx={sx} compact={compact} />;\n }\n // Unknown object — try as TipTap anyway\n return <TipTapRenderer content={content as any} className={className} sx={sx} compact={compact} />;\n }\n\n // String content — TipTap-JSON / markdown / HTML\n if (typeof content === 'string') {\n if (!content.trim()) return null;\n // Comments composer persists TipTap state as `JSON.stringify\n // (editor.getJSON())`, so string-typed content may actually\n // be a serialised TipTap doc. Try the JSON path first;\n // markdown is the fallback for plain text.\n const docFromJson = tryParseTipTapJson(content);\n if (docFromJson) {\n return <TipTapRenderer content={docFromJson} className={className} sx={sx} compact={compact} />;\n }\n return (\n <Markdown\n className={className}\n sx={sx}\n compact={compact}\n components={markdownComponents}\n routerLinkComponent={routerLinkComponent}\n >\n {content}\n </Markdown>\n );\n }\n\n return null;\n}\n","'use client';\n\n/**\n * DurationPicker — Compact duration selector with presets and custom input.\n *\n * Designed for moderation actions (ban/mute) in dialogs or menus.\n * Value is in seconds; `null` represents permanent/indefinite duration.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport Box from '@mui/material/Box';\nimport MenuItem from '@mui/material/MenuItem';\nimport Select from '@mui/material/Select';\nimport TextField from '@mui/material/TextField';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport Typography from '@mui/material/Typography';\nimport { alpha, useTheme } from '@mui/material/styles';\n\nimport type { SelectChangeEvent } from '@mui/material/Select';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst HOUR = 3600;\nconst DAY = 86400;\nconst WEEK = 604800;\n\ntype TimeUnit = 'hours' | 'days' | 'weeks';\n\ninterface Preset {\n label: string;\n value: number | null; // seconds, null = permanent\n key: string;\n}\n\nconst PRESETS: Preset[] = [\n { label: '1h', value: HOUR, key: '1h' },\n { label: '6h', value: 6 * HOUR, key: '6h' },\n { label: '1d', value: DAY, key: '1d' },\n { label: '7d', value: 7 * DAY, key: '7d' },\n { label: '30d', value: 30 * DAY, key: '30d' },\n { label: '\\u221E', value: null, key: 'permanent' },\n];\n\nconst UNIT_SECONDS: Record<TimeUnit, number> = {\n hours: HOUR,\n days: DAY,\n weeks: WEEK,\n};\n\nconst CUSTOM_KEY = 'custom';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DurationPickerLabels {\n /** Title label. @default 'Duration' */\n title?: string;\n /** Custom button label. @default 'Custom' */\n custom?: string;\n /** Time unit labels. */\n hours?: string;\n days?: string;\n weeks?: string;\n}\n\nexport interface DurationPickerProps {\n /** Duration in seconds. `null` = permanent/indefinite. */\n value: number | null;\n /** Called when duration changes. */\n onChange: (seconds: number | null) => void;\n /** Component size. @default 'small' */\n size?: 'small' | 'medium';\n /** Disable all interactions. */\n disabled?: boolean;\n /** Override default English labels for i18n. */\n labels?: DurationPickerLabels;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Find which preset key matches the current value, or 'custom' if none. */\nfunction resolveActiveKey(value: number | null): string {\n const match = PRESETS.find((p) => p.value === value);\n return match ? match.key : CUSTOM_KEY;\n}\n\n/** Decompose seconds into a human-friendly { amount, unit } pair. */\nfunction decomposeSeconds(seconds: number): { amount: number; unit: TimeUnit } {\n if (seconds > 0 && seconds % WEEK === 0) return { amount: seconds / WEEK, unit: 'weeks' };\n if (seconds > 0 && seconds % DAY === 0) return { amount: seconds / DAY, unit: 'days' };\n return { amount: Math.max(1, Math.round(seconds / HOUR)), unit: 'hours' };\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function DurationPicker({ value, onChange, size = 'small', disabled = false, labels }: DurationPickerProps) {\n const theme = useTheme();\n\n const presetKey = useMemo(() => resolveActiveKey(value), [value]);\n\n /**\n * Whether the operator chose \"Custom\", as opposed to landing on a value\n * that happens not to match a preset.\n *\n * It has to be remembered rather than derived, because the two are not the\n * same question and the value cannot answer the first one. Deriving it made\n * the Custom button unusable in its default state: clicking it emitted\n * 1 hour, 1 hour IS the `1h` preset, so the very next render resolved the\n * mode back to `1h` and the custom row never appeared. The same collision\n * swallowed \"24 hours\", \"1 week\" and \"7 days\".\n */\n const [customChosen, setCustomChosen] = useState(() => presetKey === CUSTOM_KEY);\n\n // A value outside every preset is custom whoever set it — including a\n // parent that set it directly.\n const activeKey = customChosen || presetKey === CUSTOM_KEY ? CUSTOM_KEY : presetKey;\n\n // Local state for custom input — only used when custom is active\n const [customAmount, setCustomAmount] = useState<number>(() => {\n if (activeKey === CUSTOM_KEY && value !== null && value > 0) {\n return decomposeSeconds(value).amount;\n }\n return 1;\n });\n const [customUnit, setCustomUnit] = useState<TimeUnit>(() => {\n if (activeKey === CUSTOM_KEY && value !== null && value > 0) {\n return decomposeSeconds(value).unit;\n }\n return 'hours';\n });\n\n /**\n * What the amount field currently shows, which is not always a number.\n *\n * Deriving the field's contents from the numeric amount meant an empty\n * field was impossible: clearing it parsed as NaN, fell back to 1, and\n * re-rendered as \"1\" — so typing \"3\" produced \"13\" and typing \"24\"\n * produced \"124\". Replacing the amount required selecting it first, which\n * nothing tells the operator to do. The text is held separately so the\n * field can be transiently empty; only a positive number is emitted.\n */\n const [customText, setCustomText] = useState<string>(() => String(customAmount));\n\n const isCustom = activeKey === CUSTOM_KEY;\n\n // ------- Handlers -------\n\n const handlePresetChange = useCallback(\n (_: React.MouseEvent<HTMLElement>, newKey: string | null) => {\n if (newKey === null) return; // MUI fires null on deselect — ignore\n if (newKey === CUSTOM_KEY) {\n // Switch to custom — emit current custom values\n setCustomChosen(true);\n onChange(customAmount * UNIT_SECONDS[customUnit]);\n return;\n }\n const preset = PRESETS.find((p) => p.key === newKey);\n if (preset) {\n setCustomChosen(false);\n onChange(preset.value);\n }\n },\n [onChange, customAmount, customUnit]\n );\n\n const handleCustomAmountChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const text = e.target.value;\n setCustomText(text);\n\n const parsed = parseInt(text, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) return; // not a duration yet\n setCustomAmount(parsed);\n onChange(parsed * UNIT_SECONDS[customUnit]);\n },\n [onChange, customUnit]\n );\n\n /** Put a readable number back once the operator leaves an empty field. */\n const handleCustomAmountBlur = useCallback(() => {\n setCustomText(String(customAmount));\n }, [customAmount]);\n\n const handleCustomUnitChange = useCallback(\n (e: SelectChangeEvent<TimeUnit>) => {\n const unit = e.target.value as TimeUnit;\n setCustomUnit(unit);\n onChange(customAmount * UNIT_SECONDS[unit]);\n },\n [onChange, customAmount]\n );\n\n // ------- Styles -------\n\n const toggleSx = {\n '& .MuiToggleButton-root': {\n px: size === 'small' ? 1.25 : 1.75,\n py: size === 'small' ? 0.5 : 0.75,\n fontSize: size === 'small' ? '0.8125rem' : '0.875rem',\n fontWeight: 600,\n lineHeight: 1.5,\n borderColor: alpha(theme.palette.divider, 0.2),\n color: theme.palette.text.secondary,\n textTransform: 'none' as const,\n '&.Mui-selected': {\n color: theme.palette.primary.main,\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n borderColor: alpha(theme.palette.primary.main, 0.3),\n '&:hover': {\n bgcolor: alpha(theme.palette.primary.main, 0.16),\n },\n },\n '&.Mui-disabled': {\n color: theme.palette.text.disabled,\n },\n },\n };\n\n return (\n <Box>\n <Typography\n variant=\"caption\"\n sx={{\n mb: 0.75,\n display: 'block',\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {labels?.title ?? 'Duration'}\n </Typography>\n\n <ToggleButtonGroup\n exclusive\n value={activeKey}\n onChange={handlePresetChange}\n size={size}\n disabled={disabled}\n sx={{\n ...toggleSx,\n flexWrap: 'wrap',\n gap: 0.5,\n '& .MuiToggleButtonGroup-grouped': {\n border: '1px solid',\n borderRadius: '8px !important',\n borderColor: alpha(theme.palette.divider, 0.2),\n // Position-class selectors replace the deprecated\n // `:not(:first-of-type)` sibling pattern (MUI v9 tags\n // children with firstButton/middleButton/lastButton via\n // ToggleButtonGroupButtonContext). gap:0.5 above means\n // we want INDEPENDENT borders on every button (no\n // overlap/collapse), so restore left border + zero out\n // MUI's default `margin-left: -1px` on middle/last.\n '&.MuiToggleButtonGroup-middleButton, &.MuiToggleButtonGroup-lastButton': {\n borderLeft: '1px solid',\n borderColor: alpha(theme.palette.divider, 0.2),\n marginLeft: 0,\n },\n },\n }}\n >\n {PRESETS.map((preset) => (\n <ToggleButton key={preset.key} value={preset.key}>\n {preset.label}\n </ToggleButton>\n ))}\n <ToggleButton value={CUSTOM_KEY}>{labels?.custom ?? 'Custom'}</ToggleButton>\n </ToggleButtonGroup>\n\n {/* Custom duration input row */}\n {isCustom && (\n <Box\n sx={{\n mt: 1.25,\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n }}\n >\n <TextField\n type=\"number\"\n value={customText}\n onChange={handleCustomAmountChange}\n onBlur={handleCustomAmountBlur}\n disabled={disabled}\n size={size}\n slotProps={{\n htmlInput: { min: 1, max: 9999, style: { textAlign: 'center' } },\n }}\n sx={{ width: 80 }}\n />\n <Select<TimeUnit>\n value={customUnit}\n onChange={handleCustomUnitChange}\n disabled={disabled}\n size={size}\n sx={{ minWidth: 100 }}\n >\n <MenuItem value=\"hours\">{labels?.hours ?? 'hours'}</MenuItem>\n <MenuItem value=\"days\">{labels?.days ?? 'days'}</MenuItem>\n <MenuItem value=\"weeks\">{labels?.weeks ?? 'weeks'}</MenuItem>\n </Select>\n </Box>\n )}\n </Box>\n );\n}\n","'use client';\n\nimport { type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\ninterface ChangelogTimelineProps {\n children: ReactNode;\n sx?: SxProps<Theme>;\n}\n\nexport function ChangelogTimeline({ children, sx }: ChangelogTimelineProps) {\n return (\n <Box\n sx={{\n position: 'relative',\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: { xs: 16, sm: 24 },\n top: 0,\n bottom: 0,\n width: 2,\n bgcolor: 'divider',\n },\n ...(sx as any),\n }}\n >\n {children}\n </Box>\n );\n}\n","'use client';\n\nimport { type ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport Typography from '@mui/material/Typography';\nimport Chip from '@mui/material/Chip';\nimport Stack from '@mui/material/Stack';\n\ninterface ChangelogEntryProps {\n version: string;\n date: string;\n badge?: string | null;\n children: ReactNode;\n}\n\nexport function ChangelogEntry({ version, date, badge, children }: ChangelogEntryProps) {\n return (\n <Box sx={{ position: 'relative', pl: { xs: 5, sm: 7 }, pb: 4 }}>\n {/* Timeline dot */}\n <Box\n sx={{\n position: 'absolute',\n left: { xs: 10, sm: 18 },\n top: 8,\n width: 14,\n height: 14,\n borderRadius: '50%',\n bgcolor: 'primary.main',\n border: 3,\n borderColor: 'background.paper',\n zIndex: 1,\n }}\n />\n <Card variant=\"outlined\" sx={{ p: 3 }}>\n <Stack\n direction=\"row\"\n spacing={1.5}\n sx={{\n alignItems: \"center\",\n mb: 2\n }}>\n <Typography variant=\"h6\" sx={{\n fontWeight: 700\n }}>\n {version}\n </Typography>\n {badge && <Chip label={badge} size=\"small\" color=\"primary\" variant=\"soft\" />}\n <Typography\n variant=\"caption\"\n sx={{\n color: \"text.secondary\",\n ml: 'auto !important'\n }}>\n {date}\n </Typography>\n </Stack>\n\n {children}\n </Card>\n </Box>\n );\n}\n"]}