@omnitron-dev/prism 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -2
- package/THIRD-PARTY-NOTICES.txt +26 -0
- package/dist/accessibility/index.js +2 -0
- package/dist/accessibility/index.js.map +1 -1
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/blocks/auth-block/guards.d.ts +3 -2
- package/dist/blocks/auth-block/guards.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/dashboard-block.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/types.d.ts +4 -2
- package/dist/blocks/dashboard-block/types.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/use-dashboard-block.d.ts +2 -2
- package/dist/blocks/dashboard-block/use-dashboard-block.d.ts.map +1 -1
- package/dist/blocks/data-grid-block/data-grid-block.d.ts.map +1 -1
- package/dist/blocks/data-grid-block/types.d.ts +3 -0
- package/dist/blocks/data-grid-block/types.d.ts.map +1 -1
- package/dist/blocks/index.js +80 -255
- package/dist/blocks/index.js.map +1 -1
- package/dist/chunk-2AB7VGPW.js +447 -0
- package/dist/chunk-2AB7VGPW.js.map +1 -0
- package/dist/{chunk-LOY2NPCO.js → chunk-2E67PQ4T.js} +3 -3
- package/dist/{chunk-LOY2NPCO.js.map → chunk-2E67PQ4T.js.map} +1 -1
- package/dist/chunk-2KG2NI73.js +84 -0
- package/dist/chunk-2KG2NI73.js.map +1 -0
- package/dist/chunk-2UYRW6X3.js +44 -0
- package/dist/chunk-2UYRW6X3.js.map +1 -0
- package/dist/chunk-36C5H56C.js +208 -0
- package/dist/chunk-36C5H56C.js.map +1 -0
- package/dist/chunk-36FOXX25.js +73 -0
- package/dist/chunk-36FOXX25.js.map +1 -0
- package/dist/{chunk-52PQL67Q.js → chunk-3VSM7NZG.js} +18 -15
- package/dist/chunk-3VSM7NZG.js.map +1 -0
- package/dist/{chunk-GUGTDURV.js → chunk-4B2LTPK2.js} +2 -2
- package/dist/{chunk-GUGTDURV.js.map → chunk-4B2LTPK2.js.map} +1 -1
- package/dist/chunk-4HUGZJKU.js +108 -0
- package/dist/chunk-4HUGZJKU.js.map +1 -0
- package/dist/{chunk-PXXPLHIY.js → chunk-4Q5L7LDG.js} +3 -3
- package/dist/{chunk-PXXPLHIY.js.map → chunk-4Q5L7LDG.js.map} +1 -1
- package/dist/{chunk-BRDWQVRT.js → chunk-4R7EZ7GQ.js} +3 -2
- package/dist/chunk-4R7EZ7GQ.js.map +1 -0
- package/dist/chunk-6IANOSMD.js +185 -0
- package/dist/chunk-6IANOSMD.js.map +1 -0
- package/dist/{chunk-YHE7HXSG.js → chunk-7ATBURW2.js} +3 -3
- package/dist/{chunk-YHE7HXSG.js.map → chunk-7ATBURW2.js.map} +1 -1
- package/dist/{chunk-7G5D5PTC.js → chunk-AATAOOSF.js} +4 -4
- package/dist/{chunk-7G5D5PTC.js.map → chunk-AATAOOSF.js.map} +1 -1
- package/dist/chunk-AKLRKCYH.js +128 -0
- package/dist/chunk-AKLRKCYH.js.map +1 -0
- package/dist/chunk-CT46KJOR.js +133 -0
- package/dist/chunk-CT46KJOR.js.map +1 -0
- package/dist/{chunk-LSPFFEJT.js → chunk-D4GFAJAZ.js} +298 -3900
- package/dist/chunk-D4GFAJAZ.js.map +1 -0
- package/dist/{chunk-BJE2AKD4.js → chunk-D5J3KW6Q.js} +3 -2
- package/dist/chunk-D5J3KW6Q.js.map +1 -0
- package/dist/chunk-DEPJRTVT.js +3 -0
- package/dist/{chunk-FU52GL2E.js.map → chunk-DEPJRTVT.js.map} +1 -1
- package/dist/{chunk-472SOF76.js → chunk-DHTYHUYI.js} +85 -107
- package/dist/chunk-DHTYHUYI.js.map +1 -0
- package/dist/{chunk-FF5RF32O.js → chunk-E7WM2RXA.js} +3 -2
- package/dist/chunk-E7WM2RXA.js.map +1 -0
- package/dist/chunk-F6RZ7LW6.js +1271 -0
- package/dist/chunk-F6RZ7LW6.js.map +1 -0
- package/dist/chunk-FOGY3HA4.js +217 -0
- package/dist/chunk-FOGY3HA4.js.map +1 -0
- package/dist/chunk-G2GANYMW.js +139 -0
- package/dist/chunk-G2GANYMW.js.map +1 -0
- package/dist/chunk-I6DILPFE.js +293 -0
- package/dist/chunk-I6DILPFE.js.map +1 -0
- package/dist/{chunk-HOXFSQUV.js → chunk-IRYU3NTG.js} +2 -2
- package/dist/{chunk-HOXFSQUV.js.map → chunk-IRYU3NTG.js.map} +1 -1
- package/dist/chunk-JTIUGPW5.js +284 -0
- package/dist/chunk-JTIUGPW5.js.map +1 -0
- package/dist/{chunk-GUFHFEPZ.js → chunk-JZBSPDED.js} +2 -2
- package/dist/{chunk-GUFHFEPZ.js.map → chunk-JZBSPDED.js.map} +1 -1
- package/dist/{chunk-PFT2BNYO.js → chunk-KPY7TA4D.js} +5 -5
- package/dist/{chunk-PFT2BNYO.js.map → chunk-KPY7TA4D.js.map} +1 -1
- package/dist/{chunk-GMIE6III.js → chunk-LFWKGNCX.js} +50 -623
- package/dist/chunk-LFWKGNCX.js.map +1 -0
- package/dist/chunk-LH4ZZZYB.js +37 -0
- package/dist/chunk-LH4ZZZYB.js.map +1 -0
- package/dist/chunk-NFJ7CPG3.js +13 -0
- package/dist/chunk-NFJ7CPG3.js.map +1 -0
- package/dist/chunk-NFPOIHD4.js +3 -0
- package/dist/{chunk-JSQTYDPG.js.map → chunk-NFPOIHD4.js.map} +1 -1
- package/dist/{chunk-XIXSSI3B.js → chunk-NJM5AVBM.js} +3 -2
- package/dist/chunk-NJM5AVBM.js.map +1 -0
- package/dist/{chunk-4Z5DE5GK.js → chunk-NSNM53WI.js} +133 -115
- package/dist/chunk-NSNM53WI.js.map +1 -0
- package/dist/chunk-NTREGTG7.js +31 -0
- package/dist/chunk-NTREGTG7.js.map +1 -0
- package/dist/{chunk-ADG4HZEP.js → chunk-OKJA6SJM.js} +4 -4
- package/dist/chunk-OKJA6SJM.js.map +1 -0
- package/dist/{chunk-SU3LVQ7N.js → chunk-Q6JDNFSG.js} +11 -226
- package/dist/chunk-Q6JDNFSG.js.map +1 -0
- package/dist/chunk-RPOGINR5.js +115 -0
- package/dist/chunk-RPOGINR5.js.map +1 -0
- package/dist/{chunk-KQ67XB6T.js → chunk-RSWVYIXK.js} +151 -114
- package/dist/chunk-RSWVYIXK.js.map +1 -0
- package/dist/chunk-SSEHL5VP.js +110 -0
- package/dist/chunk-SSEHL5VP.js.map +1 -0
- package/dist/chunk-TEIGUOWN.js +523 -0
- package/dist/chunk-TEIGUOWN.js.map +1 -0
- package/dist/{chunk-AYYFMTMI.js → chunk-TJ7DHXUX.js} +2 -2
- package/dist/{chunk-AYYFMTMI.js.map → chunk-TJ7DHXUX.js.map} +1 -1
- package/dist/{chunk-75FQ5IW3.js → chunk-TZHWYT34.js} +3 -3
- package/dist/{chunk-75FQ5IW3.js.map → chunk-TZHWYT34.js.map} +1 -1
- package/dist/chunk-TZWHELY4.js +45 -0
- package/dist/chunk-TZWHELY4.js.map +1 -0
- package/dist/{chunk-OKTLA23Q.js → chunk-UEINJFLS.js} +6 -6
- package/dist/chunk-UEINJFLS.js.map +1 -0
- package/dist/chunk-URFQX3I6.js +129 -0
- package/dist/chunk-URFQX3I6.js.map +1 -0
- package/dist/chunk-VG6FOMOH.js +187 -0
- package/dist/chunk-VG6FOMOH.js.map +1 -0
- package/dist/{chunk-PGHEP4JD.js → chunk-VQVVHMPG.js} +3 -3
- package/dist/{chunk-PGHEP4JD.js.map → chunk-VQVVHMPG.js.map} +1 -1
- package/dist/{chunk-DRFNMZLG.js → chunk-VUKOT432.js} +3 -2
- package/dist/chunk-VUKOT432.js.map +1 -0
- package/dist/chunk-WD4N72DL.js +315 -0
- package/dist/chunk-WD4N72DL.js.map +1 -0
- package/dist/chunk-XBYMG4QK.js +119 -0
- package/dist/chunk-XBYMG4QK.js.map +1 -0
- package/dist/chunk-YHM6GIHV.js +3 -0
- package/dist/chunk-YHM6GIHV.js.map +1 -0
- package/dist/{chunk-SNZK5X6F.js → chunk-Z2AN43YU.js} +4 -2
- package/dist/chunk-Z2AN43YU.js.map +1 -0
- package/dist/chunk-ZNWHMQRM.js +171 -0
- package/dist/chunk-ZNWHMQRM.js.map +1 -0
- package/dist/{chunk-YSIG2XYH.js → chunk-ZRJYQN6Y.js} +2 -2
- package/dist/{chunk-YSIG2XYH.js.map → chunk-ZRJYQN6Y.js.map} +1 -1
- package/dist/{chunk-AD4W7HYC.js → chunk-ZYI3MHLE.js} +3 -2
- package/dist/chunk-ZYI3MHLE.js.map +1 -0
- package/dist/cli/index.js +59 -421
- package/dist/cli/index.js.map +1 -1
- package/dist/components/admin-filters/admin-data-table.d.ts +7 -1
- package/dist/components/admin-filters/admin-data-table.d.ts.map +1 -1
- package/dist/components/admin-filters/filter-toolbar.d.ts.map +1 -1
- package/dist/components/admin-filters/index.js +8 -0
- package/dist/components/admin-filters/index.js.map +1 -0
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/index.js +5 -0
- package/dist/components/alert/index.js.map +1 -0
- package/dist/components/animate/index.js +5 -0
- package/dist/components/animate/index.js.map +1 -0
- package/dist/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
- package/dist/components/breadcrumbs/index.js +4 -0
- package/dist/components/breadcrumbs/index.js.map +1 -0
- package/dist/components/card/index.js +4 -0
- package/dist/components/card/index.js.map +1 -0
- package/dist/components/chart/chart.d.ts.map +1 -1
- package/dist/components/chart/index.css +52 -0
- package/dist/components/chart/index.css.map +1 -0
- package/dist/components/chart/index.js +5 -0
- package/dist/components/chart/index.js.map +1 -0
- package/dist/components/chart/types.d.ts +3 -1
- package/dist/components/chart/types.d.ts.map +1 -1
- package/dist/components/chart/use-chart.d.ts.map +1 -1
- package/dist/components/command-palette/command-palette.d.ts +3 -1
- package/dist/components/command-palette/command-palette.d.ts.map +1 -1
- package/dist/components/command-palette/index.js +4 -0
- package/dist/components/command-palette/index.js.map +1 -0
- package/dist/components/confirm-dialog/index.js +4 -0
- package/dist/components/confirm-dialog/index.js.map +1 -0
- package/dist/components/date-input/date-input.d.ts +1 -0
- package/dist/components/date-input/date-input.d.ts.map +1 -1
- package/dist/components/date-input/index.d.ts +0 -1
- package/dist/components/date-input/index.d.ts.map +1 -1
- package/dist/components/doc-layout/index.js +5 -4
- package/dist/components/doc-layout/index.js.map +1 -1
- package/dist/components/editor/index.js +4 -3
- package/dist/components/editor/index.js.map +1 -1
- package/dist/components/emoji-picker/index.js +2 -1
- package/dist/components/emoji-picker/index.js.map +1 -1
- package/dist/components/empty-content/empty-content.d.ts.map +1 -1
- package/dist/components/empty-content/index.js +4 -0
- package/dist/components/empty-content/index.js.map +1 -0
- package/dist/components/error-boundary/index.js +6 -0
- package/dist/components/error-boundary/index.js.map +1 -0
- package/dist/components/index.css +13 -10
- package/dist/components/index.css.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +47 -21
- package/dist/components/index.js.map +1 -1
- package/dist/components/knowledge-graph/edge-labels.d.ts.map +1 -1
- package/dist/components/knowledge-graph/index.js +18 -16
- package/dist/components/knowledge-graph/index.js.map +1 -1
- package/dist/components/label/index.js +5 -0
- package/dist/components/label/index.js.map +1 -0
- package/dist/components/label/label.d.ts.map +1 -1
- package/dist/components/loading-screen/index.js +4 -0
- package/dist/components/loading-screen/index.js.map +1 -0
- package/dist/components/map/MapPointPicker.d.ts.map +1 -1
- package/dist/components/map/index.js +2 -1
- package/dist/components/map/index.js.map +1 -1
- package/dist/components/navigation-progress/index.js +4 -0
- package/dist/components/navigation-progress/index.js.map +1 -0
- package/dist/components/page-content/index.js +4 -0
- package/dist/components/page-content/index.js.map +1 -0
- package/dist/components/popover/index.js +4 -0
- package/dist/components/popover/index.js.map +1 -0
- package/dist/components/research/diagram.d.ts.map +1 -1
- package/dist/components/research/index.js +6 -4
- package/dist/components/research/index.js.map +1 -1
- package/dist/components/research-editor/extensions.d.ts +1 -1
- package/dist/components/research-editor/index.js +11 -10
- package/dist/components/research-editor/index.js.map +1 -1
- package/dist/components/research-editor/math-navigation.d.ts +2 -2
- package/dist/components/research-editor/math-navigation.d.ts.map +1 -1
- package/dist/components/scroll-to-top/index.js +4 -0
- package/dist/components/scroll-to-top/index.js.map +1 -0
- package/dist/components/search-input/index.js +7 -0
- package/dist/components/search-input/index.js.map +1 -0
- package/dist/components/search-input/search-input.d.ts +3 -1
- package/dist/components/search-input/search-input.d.ts.map +1 -1
- package/dist/components/skeleton/index.js +4 -0
- package/dist/components/skeleton/index.js.map +1 -0
- package/dist/components/snackbar/index.js +6 -0
- package/dist/components/snackbar/index.js.map +1 -0
- package/dist/components/stepper/index.js +4 -0
- package/dist/components/stepper/index.js.map +1 -0
- package/dist/components/table/index.d.ts +1 -0
- package/dist/components/table/index.d.ts.map +1 -1
- package/dist/components/table/index.js +5 -0
- package/dist/components/table/index.js.map +1 -0
- package/dist/components/table/table-viewport.d.ts +13 -0
- package/dist/components/table/table-viewport.d.ts.map +1 -0
- package/dist/components/table/table.d.ts +3 -1
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/tabs/index.js +6 -0
- package/dist/components/tabs/index.js.map +1 -0
- package/dist/components/tabs/tabs.d.ts +12 -1
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/core/index.js +12 -10
- package/dist/core/index.js.map +1 -1
- package/dist/forms/index.js +2 -0
- package/dist/forms/index.js.map +1 -1
- package/dist/hooks/index.js +14 -12
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-config-from-query.d.ts +2 -0
- package/dist/hooks/use-config-from-query.d.ts.map +1 -1
- package/dist/hooks/use-image-dimensions.d.ts.map +1 -1
- package/dist/hooks/use-keyboard-shortcut.d.ts.map +1 -1
- package/dist/hooks/use-scroll-position.d.ts.map +1 -1
- package/dist/hooks/use-window-size.d.ts.map +1 -1
- package/dist/icons/context.d.ts.map +1 -1
- package/dist/icons/index.js +3 -2
- package/dist/icons/index.js.map +1 -1
- package/dist/index.css +13 -10
- package/dist/index.css.map +1 -1
- package/dist/index.js +57 -31
- package/dist/index.js.map +1 -1
- package/dist/internal/research-parser.js +3 -0
- package/dist/internal/research-parser.js.map +1 -0
- package/dist/layouts/core/header-section.d.ts +1 -0
- package/dist/layouts/core/header-section.d.ts.map +1 -1
- package/dist/layouts/dashboard/layout.d.ts +3 -1
- package/dist/layouts/dashboard/layout.d.ts.map +1 -1
- package/dist/layouts/dashboard/sidenav.d.ts.map +1 -1
- package/dist/layouts/index.js +9 -8
- package/dist/layouts/index.js.map +1 -1
- package/dist/netron/index.js +2 -1
- package/dist/netron/index.js.map +1 -1
- package/dist/registry/index.js +1 -1
- package/dist/state/create-store.d.ts.map +1 -1
- package/dist/state/index.js +3 -2
- package/dist/state/index.js.map +1 -1
- package/dist/state/settings-version.d.ts.map +1 -1
- package/dist/theme/components/Chip.d.ts.map +1 -1
- package/dist/theme/components/Dialog.d.ts.map +1 -1
- package/dist/theme/components/TextField.d.ts.map +1 -1
- package/dist/theme/components/index.d.ts.map +1 -1
- package/dist/theme/components/theme-utils.d.ts +2 -2
- package/dist/theme/components/theme-utils.d.ts.map +1 -1
- package/dist/theme/index.js +8 -6
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/palette/overrides.d.ts +1 -0
- package/dist/theme/palette/overrides.d.ts.map +1 -1
- package/dist/theme/semantic-surface.d.ts +8 -0
- package/dist/theme/semantic-surface.d.ts.map +1 -0
- package/dist/types/index.js +2 -2
- package/dist/ui/index.js +6 -5
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/async-lock.d.ts.map +1 -1
- package/package.json +143 -37
- package/dist/chunk-472SOF76.js.map +0 -1
- package/dist/chunk-4Z5DE5GK.js.map +0 -1
- package/dist/chunk-52PQL67Q.js.map +0 -1
- package/dist/chunk-AD4W7HYC.js.map +0 -1
- package/dist/chunk-ADG4HZEP.js.map +0 -1
- package/dist/chunk-BJE2AKD4.js.map +0 -1
- package/dist/chunk-BRDWQVRT.js.map +0 -1
- package/dist/chunk-DRFNMZLG.js.map +0 -1
- package/dist/chunk-FF5RF32O.js.map +0 -1
- package/dist/chunk-FU52GL2E.js +0 -3
- package/dist/chunk-GMIE6III.js.map +0 -1
- package/dist/chunk-JSQTYDPG.js +0 -3
- package/dist/chunk-KQ67XB6T.js.map +0 -1
- package/dist/chunk-LSPFFEJT.js.map +0 -1
- package/dist/chunk-OKTLA23Q.js.map +0 -1
- package/dist/chunk-SNZK5X6F.js.map +0 -1
- package/dist/chunk-SU3LVQ7N.js.map +0 -1
- package/dist/chunk-XIXSSI3B.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/search-input/search-input.tsx","../src/components/empty-content/empty-content.tsx","../src/components/field/field-text.tsx","../src/components/field/field-select.tsx","../src/components/field/field-checkbox.tsx","../src/components/field/field-switch.tsx","../src/utils/transform-number.ts","../src/components/field/field-number.tsx","../src/components/field/field-radio.tsx","../src/components/field/field-autocomplete.tsx","../src/components/field/field-multi-select.tsx","../src/components/field/field-rating.tsx","../src/components/field/field-slider.tsx","../src/components/field/field-date-picker.tsx","../src/components/field/field-time-picker.tsx","../src/components/field/field-datetime-picker.tsx","../src/components/field/field-multi-checkbox.tsx","../src/components/field/field-multi-switch.tsx","../src/components/field/field-code.tsx","../src/components/field/field-upload.tsx","../src/components/field/field-phone.tsx","../src/components/field/field-country-select.tsx","../src/components/field/field-editor.tsx","../src/components/field/index.ts","../src/components/error-boundary/error-boundary.tsx"],"names":["SearchIcon","Box","jsx","alpha","Typography","useFormContext","useId","Controller","jsxs","TextField","FormControl","FormHelperText","FormControlLabel","num","useState","useRef","useEffect","FormLabel","Autocomplete","parsed","normalizeValue","dayjs","Checkbox","FormGroup","Switch","useCallback","useTheme","Stack","IconButton","useMemo","Fragment","InputAdornment","MenuItem","DEFAULT_COUNTRIES"],"mappings":"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","file":"chunk-GMIE6III.js","sourcesContent":["import { SearchIcon as SearchGlyph, CloseIcon } from '../../icons/controls.js';\n/**\n * SearchInput — Unified search field for the entire platform.\n *\n * Features:\n * - Consistent styling (filled appearance, no outline notch issues)\n * - Built-in search icon (left) and clear button (right)\n * - Optional debounce for expensive filters\n * - Compact mode for sidebars (smaller padding)\n * - Works standalone or controlled\n */\n\nimport { useState, useEffect, useRef, type ChangeEvent, type ReactNode } from 'react';\nimport type { Ref } from 'react';\nimport InputBase from '@mui/material/InputBase';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Tooltip from '@mui/material/Tooltip';\nimport Box from '@mui/material/Box';\nimport { alpha, useTheme, type SxProps, type Theme } from '@mui/material/styles';\n\n// ---------------------------------------------------------------------------\n// Icons (inline SVG — no external dependency)\n// ---------------------------------------------------------------------------\n\nfunction SearchIcon({ size = 18 }: { size?: number }): ReactNode {\n return <SearchGlyph sx={{ fontSize: size }} />;\n}\n\nfunction ClearIcon(): ReactNode {\n return <CloseIcon sx={{ fontSize: 16 }} />;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SearchInputProps {\n /** Current value (controlled). */\n value?: string;\n /** Change handler. Receives the raw string (or debounced string if `debounce` > 0). */\n onChange?: (value: string) => void;\n /** Placeholder text. */\n placeholder?: string;\n /** Debounce delay in ms. 0 = no debounce (default). */\n debounce?: number;\n /** Compact mode — smaller padding, for sidebars and tight spaces. */\n compact?: boolean;\n /** Full width. Default true. */\n fullWidth?: boolean;\n /** Fixed or min width. */\n width?: number | string;\n /** Min width. */\n minWidth?: number | string;\n /** Clear button tooltip text. */\n clearTooltip?: string;\n /** Autofocus on mount. */\n autoFocus?: boolean;\n /** Focus handler. */\n onFocus?: () => void;\n /** Blur handler. */\n onBlur?: () => void;\n /** Keyboard handler. */\n onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n /** Custom sx overrides. */\n sx?: SxProps<Theme>;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SearchInput({\n value: controlledValue,\n onChange,\n placeholder = 'Search...',\n debounce = 0,\n compact = false,\n fullWidth = true,\n width,\n minWidth,\n clearTooltip = 'Clear',\n autoFocus,\n onFocus,\n onBlur,\n onKeyDown,\n sx,\n ref,\n}: SearchInputProps & { ref?: Ref<HTMLInputElement> }) {\n const theme = useTheme();\n\n // Internal state for debounced mode or uncontrolled usage\n const [localValue, setLocalValue] = useState(controlledValue ?? '');\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n // Sync internal state when controlled value changes externally\n useEffect(() => {\n if (controlledValue !== undefined) {\n setLocalValue(controlledValue);\n }\n }, [controlledValue]);\n\n const displayValue = controlledValue !== undefined && debounce === 0 ? controlledValue : localValue;\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setLocalValue(val);\n\n if (debounce > 0) {\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => onChange?.(val), debounce);\n } else {\n onChange?.(val);\n }\n };\n\n const handleClear = () => {\n setLocalValue('');\n clearTimeout(timerRef.current);\n onChange?.('');\n };\n\n // Cleanup timer\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n const py = compact ? 0.625 : 0.75;\n const px = compact ? 1.25 : 1.5;\n const inputPy = compact ? '3px' : '4px';\n\n return (\n <InputBase\n ref={ref}\n fullWidth={fullWidth}\n placeholder={placeholder}\n value={displayValue}\n onChange={handleChange}\n autoFocus={autoFocus}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n startAdornment={\n <InputAdornment position=\"start\" sx={{ color: 'text.disabled', mr: compact ? 0.75 : 1 }}>\n <SearchIcon size={compact ? 16 : 18} />\n </InputAdornment>\n }\n endAdornment={\n displayValue ? (\n <InputAdornment position=\"end\">\n <Tooltip title={clearTooltip}>\n <Box\n component=\"button\"\n type=\"button\"\n onClick={handleClear}\n sx={{\n p: 0.25,\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n color: 'text.disabled',\n display: 'flex',\n alignItems: 'center',\n borderRadius: '50%',\n '&:hover': { color: 'text.secondary' },\n }}\n >\n <ClearIcon />\n </Box>\n </Tooltip>\n </InputAdornment>\n ) : null\n }\n sx={{\n px,\n py,\n borderRadius: 1,\n fontSize: '0.875rem',\n bgcolor: alpha(theme.palette.grey[500], 0.08),\n transition: theme.transitions.create(['background-color'], {\n duration: theme.transitions.duration.shorter,\n }),\n '&:hover': {\n bgcolor: alpha(theme.palette.grey[500], 0.12),\n },\n '&.Mui-focused': {\n bgcolor: alpha(theme.palette.grey[500], 0.16),\n },\n '& .MuiInputBase-input': {\n py: inputPy,\n px: 0,\n overflow: 'visible',\n '&::placeholder': {\n opacity: 0.64,\n },\n },\n ...(width != null && { width }),\n ...(minWidth != null && { minWidth }),\n ...(!fullWidth && { width: width ?? 'auto' }),\n ...(Array.isArray(sx) ? Object.assign({}, ...sx) : sx),\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Empty Content Component\n *\n * Universal placeholder for empty states across the application.\n * Supports icon-based illustrations, multiple action buttons,\n * filled backgrounds, and compact mode.\n *\n * @module components/empty-content\n */\n\nimport type { ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { alpha } from '@mui/material/styles';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface EmptyContentProps {\n /** Custom illustration (SVG, image, or any ReactNode) */\n illustration?: ReactNode;\n /** Icon element — rendered inside a circular colored wrapper */\n icon?: ReactNode;\n /** Color for the icon wrapper background (palette path like 'primary.main') */\n iconColor?: string;\n /** Size of the icon wrapper (default 64) */\n iconSize?: number;\n /** Main title text */\n title?: string;\n /** Description text or ReactNode */\n description?: ReactNode;\n /** Single action button (backward compatible) */\n action?: ReactNode;\n /** Multiple action buttons rendered in a row */\n actions?: ReactNode[];\n /** Max width of the container */\n maxWidth?: number | string;\n /** Fill the entire available space (height: 100%) */\n filled?: boolean;\n /** Additional styles for root container */\n sx?: SxProps<Theme>;\n /** Illustration wrapper styles */\n illustrationSx?: SxProps<Theme>;\n /** Slot overrides */\n slotProps?: {\n title?: SxProps<Theme>;\n description?: SxProps<Theme>;\n actions?: SxProps<Theme>;\n };\n /** Compact mode — reduces spacing and font sizes */\n compact?: boolean;\n}\n\n// =============================================================================\n// DEFAULT ILLUSTRATION\n// =============================================================================\n\nfunction DefaultIllustration({ sx }: { sx?: SxProps<Theme> }) {\n return (\n <Box\n component=\"svg\"\n viewBox=\"0 0 480 360\"\n sx={{\n width: 240,\n height: 'auto',\n color: 'text.disabled',\n ...sx,\n }}\n >\n <defs>\n <linearGradient id=\"emptyGradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" style={{ stopColor: 'currentColor', stopOpacity: 0.2 }} />\n <stop offset=\"100%\" style={{ stopColor: 'currentColor', stopOpacity: 0.05 }} />\n </linearGradient>\n </defs>\n <ellipse cx=\"240\" cy=\"300\" rx=\"160\" ry=\"30\" fill=\"url(#emptyGradient)\" />\n <rect x=\"140\" y=\"120\" width=\"200\" height=\"140\" rx=\"8\" fill=\"currentColor\" opacity=\"0.08\" />\n <rect x=\"160\" y=\"140\" width=\"160\" height=\"8\" rx=\"4\" fill=\"currentColor\" opacity=\"0.12\" />\n <rect x=\"160\" y=\"160\" width=\"120\" height=\"8\" rx=\"4\" fill=\"currentColor\" opacity=\"0.12\" />\n <rect x=\"160\" y=\"180\" width=\"140\" height=\"8\" rx=\"4\" fill=\"currentColor\" opacity=\"0.12\" />\n <circle cx=\"240\" cy=\"80\" r=\"40\" fill=\"currentColor\" opacity=\"0.1\" />\n <path\n d=\"M225 75 L230 80 L255 55\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n opacity=\"0.2\"\n />\n </Box>\n );\n}\n\n// =============================================================================\n// ICON WRAPPER\n// =============================================================================\n\nfunction IconWrapper({ icon, color = 'primary.main', size = 64 }: { icon: ReactNode; color?: string; size?: number }) {\n return (\n <Box\n sx={{\n width: size,\n height: size,\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: (theme) => {\n // Resolve palette path (e.g. 'primary.main' → theme.palette.primary.main)\n const parts = color.split('.');\n let resolved: any = theme.palette;\n for (const part of parts) {\n resolved = resolved?.[part];\n }\n return typeof resolved === 'string' ? alpha(resolved, 0.08) : alpha(theme.palette.primary.main, 0.08);\n },\n }}\n >\n {icon}\n </Box>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * EmptyContent - Universal empty state placeholder.\n *\n * @example Basic\n * ```tsx\n * <EmptyContent title=\"No data found\" description=\"Try adjusting your filters\" />\n * ```\n *\n * @example With icon\n * ```tsx\n * <EmptyContent\n * icon={<ChatIcon sx={{ width: 28, height: 28, color: 'primary.main', opacity: 0.6 }} />}\n * title=\"Select a conversation\"\n * description=\"Choose a room from the sidebar\"\n * />\n * ```\n *\n * @example With multiple actions\n * ```tsx\n * <EmptyContent\n * icon={<FolderIcon sx={{ fontSize: 28, color: 'text.disabled' }} />}\n * title=\"No files yet\"\n * description=\"Upload files or create a folder to get started\"\n * actions={[\n * <Button variant=\"contained\" startIcon={<UploadIcon />}>Upload</Button>,\n * <Button variant=\"outlined\" startIcon={<FolderIcon />}>New folder</Button>,\n * ]}\n * />\n * ```\n *\n * @example Filled (full height)\n * ```tsx\n * <EmptyContent filled title=\"No messages\" compact />\n * ```\n */\nexport function EmptyContent({\n illustration,\n icon,\n iconColor = 'primary.main',\n iconSize = 64,\n title = 'No data',\n description,\n action,\n actions,\n maxWidth = 400,\n filled = false,\n sx,\n illustrationSx,\n slotProps,\n compact = false,\n}: EmptyContentProps): ReactNode {\n // Determine visual: icon > illustration > nothing (no default for clean minimal states)\n const visual = icon ? (\n <IconWrapper icon={icon} color={iconColor} size={iconSize} />\n ) : illustration ? (\n <Box sx={illustrationSx}>{illustration}</Box>\n ) : null;\n\n // Merge actions: single action + array\n const allActions = [...(actions ?? []), ...(action ? [action] : [])];\n\n return (\n <Stack\n sx={{\n alignItems: \"center\",\n justifyContent: \"center\",\n textAlign: 'center',\n py: compact ? 4 : 8,\n px: 2,\n\n // Default non-compact behavior: vertically center inside the\n // available \"main content\" area. Two complementary anchors:\n // * `flex: 1, alignSelf: 'stretch'` — when the parent IS a\n // flex column with explicit height (DashboardLayout main,\n // full-height page wrappers), EmptyContent grows to fill\n // the column and the inner `justifyContent: center` puts\n // the message in the middle of that column.\n // * `minHeight: calc(100vh - 240px)` — fallback for the\n // common case where the page wrapper is just a content-\n // sized `<Stack>` or `<Box>`. 240px is the typical\n // vertical chrome (header ~64 + breadcrumbs ~60 + page\n // padding ~80 + a small margin), so this leaves enough\n // space below the breadcrumbs for the message to sit at\n // the optical center of the visible viewport.\n //\n // `compact` keeps the inline-sized behavior for callers that\n // drop EmptyContent inside a card cell or sidebar.\n // `filled` is the explicit \"fill my parent\" mode and shares\n // the same fallback so the visual is consistent.\n ...(!compact && {\n flex: 1,\n alignSelf: 'stretch',\n minHeight: 'calc(100vh - 240px)',\n }),\n\n ...(filled && { height: '100%' }),\n ...sx\n }}>\n <Box\n sx={{\n maxWidth,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: compact ? 1.5 : 2.5,\n }}\n >\n {/* Visual (icon or illustration) */}\n {visual}\n\n {/* Text */}\n <Stack spacing={0.5} sx={{\n alignItems: \"center\"\n }}>\n {title && (\n <Typography\n variant={compact ? 'subtitle1' : 'h6'}\n sx={{\n color: \"text.secondary\",\n fontWeight: 600,\n ...slotProps?.title\n }}>\n {title}\n </Typography>\n )}\n\n {description && (\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.disabled\",\n lineHeight: 1.6,\n ...slotProps?.description\n }}>\n {description}\n </Typography>\n )}\n </Stack>\n\n {/* Actions */}\n {allActions.length > 0 && (\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ mt: compact ? 0.5 : 1, flexWrap: 'wrap', justifyContent: 'center', ...slotProps?.actions }}\n >\n {allActions.map((a, i) => (\n <Box key={i}>{a}</Box>\n ))}\n </Stack>\n )}\n </Box>\n </Stack>\n );\n}\n\n/**\n * Search Empty Content - Specialized empty state for search results.\n */\nexport function SearchEmptyContent({\n query,\n ...props\n}: Omit<EmptyContentProps, 'title' | 'description'> & { query?: string }): ReactNode {\n return (\n <EmptyContent\n title=\"No results found\"\n description={\n query ? `Your search for \"${query}\" did not match any results.` : 'Try adjusting your search criteria.'\n }\n {...props}\n />\n );\n}\n\n/**\n * Loading Empty Content - Placeholder while loading.\n */\nexport function LoadingEmptyContent({ ...props }: Omit<EmptyContentProps, 'title'>): ReactNode {\n return (\n <EmptyContent\n title=\"Loading...\"\n illustration={\n <Box\n sx={{\n width: 64,\n height: 64,\n borderRadius: '50%',\n border: '3px solid',\n borderColor: 'divider',\n borderTopColor: 'primary.main',\n animation: 'spin 1s linear infinite',\n '@keyframes spin': {\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n },\n }}\n />\n }\n compact\n {...props}\n />\n );\n}\n","'use client';\n\n/**\n * Field.Text Component\n *\n * React Hook Form integrated text field with full accessibility support.\n *\n * @module components/field\n */\n\nimport type { ReactNode, ComponentProps } from 'react';\nimport { useId } from 'react';\nimport { Controller, useFormContext, type RegisterOptions } from 'react-hook-form';\nimport TextField from '@mui/material/TextField';\n\n/**\n * Props for Field.Text component.\n */\nexport interface FieldTextProps extends Omit<ComponentProps<typeof TextField>, 'name'> {\n /** Field name in the form */\n name: string;\n /** Validation rules for react-hook-form */\n rules?: RegisterOptions;\n}\n\n/**\n * Field.Text - Text input with React Hook Form integration.\n *\n * Includes comprehensive accessibility attributes:\n * - aria-describedby for helper text and error messages\n * - aria-invalid for error states\n * - aria-required for required fields\n * - Proper label associations via htmlFor\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.Text name=\"email\" label=\"Email\" type=\"email\" />\n * <Field.Text name=\"password\" label=\"Password\" type=\"password\" />\n * </FormProvider>\n * ```\n */\nexport function FieldText({\n name,\n helperText,\n rules,\n required,\n slotProps,\n multiline,\n ...other\n}: FieldTextProps): ReactNode {\n const { control } = useFormContext();\n const id = useId();\n const inputId = `field-text-${id}`;\n const helperId = `field-text-helper-${id}`;\n\n return (\n <Controller\n name={name}\n control={control}\n rules={rules}\n render={({ field, fieldState: { error } }) => (\n <TextField\n {...field}\n id={inputId}\n fullWidth\n multiline={multiline}\n value={field.value ?? ''}\n error={!!error}\n helperText={error?.message ?? helperText}\n required={required}\n slotProps={{\n // Shrink label for multiline fields to prevent overlap with textarea content\n ...(multiline ? { inputLabel: { shrink: true } } : {}),\n ...slotProps,\n formHelperText: {\n id: helperId,\n ...slotProps?.formHelperText,\n },\n // Merged, not overwritten: spreading the caller's `slotProps` last\n // replaced `htmlInput` wholesale, so passing any input prop\n // silently stripped every aria attribute below.\n htmlInput: {\n 'aria-describedby': error?.message || helperText ? helperId : undefined,\n 'aria-invalid': !!error,\n 'aria-required': required,\n ...(slotProps?.htmlInput as object | undefined),\n },\n }}\n {...other}\n />\n )}\n />\n );\n}\n","'use client';\n\n/**\n * Field.Select Component\n *\n * React Hook Form integrated select field with full accessibility support.\n *\n * @module components/field\n */\n\nimport type { ReactNode, ComponentProps } from 'react';\nimport { useId } from 'react';\nimport { Controller, useFormContext, type RegisterOptions } from 'react-hook-form';\nimport TextField from '@mui/material/TextField';\nimport MenuItem from '@mui/material/MenuItem';\nimport type { SelectOption } from '../../types/components.js';\n\n/**\n * Props for Field.Select component.\n */\nexport interface FieldSelectProps extends Omit<ComponentProps<typeof TextField>, 'name' | 'select'> {\n /** Field name in the form */\n name: string;\n /** Select options */\n options: SelectOption<string | number>[];\n /** Placeholder text */\n placeholder?: string;\n /** Validation rules for react-hook-form */\n rules?: RegisterOptions;\n}\n\n/**\n * Field.Select - Select input with React Hook Form integration.\n *\n * Includes comprehensive accessibility attributes:\n * - aria-describedby for helper text and error messages\n * - aria-invalid for error states\n * - aria-required for required fields\n * - Proper listbox role for dropdown\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.Select\n * name=\"country\"\n * label=\"Country\"\n * options={[\n * { value: 'us', label: 'United States' },\n * { value: 'uk', label: 'United Kingdom' },\n * { value: 'ca', label: 'Canada' },\n * ]}\n * />\n * </FormProvider>\n * ```\n */\nexport function FieldSelect({\n name,\n options,\n helperText,\n placeholder,\n rules,\n required,\n slotProps,\n ...other\n}: FieldSelectProps): ReactNode {\n const { control } = useFormContext();\n const id = useId();\n const inputId = `field-select-${id}`;\n const helperId = `field-select-helper-${id}`;\n\n return (\n <Controller\n name={name}\n control={control}\n rules={rules}\n render={({ field, fieldState: { error } }) => (\n <TextField\n {...field}\n id={inputId}\n select\n fullWidth\n value={field.value ?? ''}\n error={!!error}\n helperText={error?.message ?? helperText}\n required={required}\n slotProps={{\n ...slotProps,\n formHelperText: {\n id: helperId,\n ...slotProps?.formHelperText,\n },\n // Merged, not overwritten — see field-text for the same fix.\n select: {\n 'aria-describedby': error?.message || helperText ? helperId : undefined,\n 'aria-invalid': !!error,\n 'aria-required': required,\n ...(slotProps?.select as object | undefined),\n },\n }}\n {...other}\n >\n {placeholder && (\n <MenuItem value=\"\" disabled aria-hidden=\"true\">\n {placeholder}\n </MenuItem>\n )}\n {options.map((option) => (\n <MenuItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n aria-disabled={option.disabled}\n >\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n )}\n />\n );\n}\n","'use client';\n\n/**\n * Field.Checkbox Component\n *\n * React Hook Form integrated checkbox field with full accessibility support.\n *\n * @module components/field\n */\n\nimport type { ReactNode, ComponentProps } from 'react';\nimport { useId } from 'react';\nimport { Controller, useFormContext, type RegisterOptions } from 'react-hook-form';\nimport Checkbox from '@mui/material/Checkbox';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport FormControl from '@mui/material/FormControl';\nimport FormHelperText from '@mui/material/FormHelperText';\n\n/**\n * Props for Field.Checkbox component.\n */\nexport interface FieldCheckboxProps extends Omit<ComponentProps<typeof Checkbox>, 'name'> {\n /** Field name in the form */\n name: string;\n /** Checkbox label */\n label?: ReactNode;\n /** Helper text */\n helperText?: string;\n /** Validation rules for react-hook-form */\n rules?: RegisterOptions;\n}\n\n/**\n * Field.Checkbox - Checkbox with React Hook Form integration.\n *\n * Includes comprehensive accessibility attributes:\n * - aria-describedby for helper text and error messages\n * - aria-invalid for error states\n * - aria-required for required fields\n * - Proper label associations\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.Checkbox name=\"terms\" label=\"I agree to the terms\" />\n * <Field.Checkbox name=\"newsletter\" label=\"Subscribe to newsletter\" />\n * </FormProvider>\n * ```\n */\nexport function FieldCheckbox({\n name,\n label,\n helperText,\n rules,\n required,\n indeterminate,\n ...other\n}: FieldCheckboxProps): ReactNode {\n const { control } = useFormContext();\n const id = useId();\n const inputId = `field-checkbox-${id}`;\n const helperId = `field-checkbox-helper-${id}`;\n\n return (\n <Controller\n name={name}\n control={control}\n rules={rules}\n render={({ field, fieldState: { error } }) => (\n <FormControl error={!!error} required={required}>\n <FormControlLabel\n control={\n <Checkbox\n {...field}\n id={inputId}\n checked={!!field.value}\n indeterminate={indeterminate}\n {...other}\n slotProps={{\n input: {\n 'aria-describedby': error?.message || helperText ? helperId : undefined,\n 'aria-invalid': !!error,\n 'aria-required': required,\n ...(indeterminate && { 'aria-checked': 'mixed' as const }),\n }\n }} />\n }\n label={label}\n htmlFor={inputId}\n />\n {(error?.message || helperText) && (\n <FormHelperText id={helperId}>{error?.message ?? helperText}</FormHelperText>\n )}\n </FormControl>\n )}\n />\n );\n}\n","'use client';\n\n/**\n * Field.Switch Component\n *\n * React Hook Form integrated switch field with full accessibility support.\n *\n * @module components/field\n */\n\nimport type { ReactNode, ComponentProps } from 'react';\nimport { useId } from 'react';\nimport { Controller, useFormContext, type RegisterOptions } from 'react-hook-form';\nimport Switch from '@mui/material/Switch';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport FormControl from '@mui/material/FormControl';\nimport FormHelperText from '@mui/material/FormHelperText';\n\n/**\n * Props for Field.Switch component.\n */\nexport interface FieldSwitchProps extends Omit<ComponentProps<typeof Switch>, 'name'> {\n /** Field name in the form */\n name: string;\n /** Switch label */\n label?: ReactNode;\n /** Helper text */\n helperText?: string;\n /** Label placement */\n labelPlacement?: 'end' | 'start' | 'top' | 'bottom';\n /** Validation rules for react-hook-form */\n rules?: RegisterOptions;\n}\n\n/**\n * Field.Switch - Switch with React Hook Form integration.\n *\n * Includes comprehensive accessibility attributes:\n * - aria-describedby for helper text and error messages\n * - aria-invalid for error states\n * - aria-required for required fields\n * - Proper label associations\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.Switch name=\"notifications\" label=\"Enable notifications\" />\n * <Field.Switch name=\"darkMode\" label=\"Dark mode\" labelPlacement=\"start\" />\n * </FormProvider>\n * ```\n */\nexport function FieldSwitch({\n name,\n label,\n helperText,\n labelPlacement = 'end',\n rules,\n required,\n ...other\n}: FieldSwitchProps): ReactNode {\n const { control } = useFormContext();\n const id = useId();\n const inputId = `field-switch-${id}`;\n const helperId = `field-switch-helper-${id}`;\n\n return (\n <Controller\n name={name}\n control={control}\n rules={rules}\n render={({ field, fieldState: { error } }) => (\n <FormControl error={!!error} required={required}>\n <FormControlLabel\n control={\n <Switch\n {...field}\n id={inputId}\n checked={!!field.value}\n {...other}\n slotProps={{\n input: {\n 'aria-describedby': error?.message || helperText ? helperId : undefined,\n 'aria-invalid': !!error,\n 'aria-required': required,\n }\n }} />\n }\n label={label}\n labelPlacement={labelPlacement}\n htmlFor={inputId}\n />\n {(error?.message || helperText) && (\n <FormHelperText id={helperId}>{error?.message ?? helperText}</FormHelperText>\n )}\n </FormControl>\n )}\n />\n );\n}\n","/**\n * Number Input Transform Utilities\n *\n * Three-phase number input handling for controlled inputs.\n * Allows users to type freely while maintaining valid numeric state.\n *\n * @module utils/transform-number\n */\n\n/**\n * Options for number transformation.\n */\nexport interface TransformNumberOptions {\n /** Minimum allowed value */\n min?: number;\n /** Maximum allowed value */\n max?: number;\n /** Decimal places to allow */\n decimals?: number;\n /** Allow negative numbers */\n allowNegative?: boolean;\n /** Default value when input is empty or invalid */\n defaultValue?: number;\n}\n\n/**\n * Parse a string to a number, handling edge cases.\n *\n * @param value - String value to parse\n * @param options - Transformation options\n * @returns Parsed number or undefined if invalid\n */\nexport function parseNumber(value: string, options: TransformNumberOptions = {}): number | undefined {\n const { allowNegative = true } = options;\n\n // Handle empty or whitespace-only strings\n const trimmed = value.trim();\n if (trimmed === '' || trimmed === '-' || trimmed === '.') {\n return undefined;\n }\n\n // Handle negative sign\n if (!allowNegative && trimmed.startsWith('-')) {\n return undefined;\n }\n\n const num = parseFloat(trimmed);\n return Number.isNaN(num) ? undefined : num;\n}\n\n/**\n * Clamp a number to min/max bounds.\n *\n * @param value - Value to clamp\n * @param options - Options with min/max\n * @returns Clamped value\n */\nexport function clampNumber(value: number, options: TransformNumberOptions = {}): number {\n const { min, max } = options;\n let result = value;\n\n if (min !== undefined && result < min) {\n result = min;\n }\n if (max !== undefined && result > max) {\n result = max;\n }\n\n return result;\n}\n\n/**\n * Round a number to specified decimal places.\n *\n * @param value - Value to round\n * @param decimals - Number of decimal places\n * @returns Rounded value\n */\nexport function roundToDecimals(value: number, decimals: number): number {\n const factor = Math.pow(10, decimals);\n return Math.round(value * factor) / factor;\n}\n\n/**\n * Transform value during onChange (while typing).\n * Allows intermediate states like empty string, single minus, or trailing decimal.\n *\n * @param value - Current input value\n * @param options - Transformation options\n * @returns Transformed string value (may include intermediate states)\n */\nexport function transformOnChange(value: string, options: TransformNumberOptions = {}): string {\n const { allowNegative = true, decimals } = options;\n\n // Allow empty string for clearing\n if (value === '') return '';\n\n // Allow single minus at start (user is typing negative number)\n if (allowNegative && value === '-') return '-';\n\n // Allow trailing decimal point (user is typing decimal)\n if (value.endsWith('.') && decimals !== 0) {\n const withoutDot = value.slice(0, -1);\n const num = parseNumber(withoutDot, options);\n if (num !== undefined) return value;\n }\n\n // Allow trailing zeros after decimal (e.g., \"1.50\" while typing \"1.500\")\n if (decimals !== 0 && value.includes('.')) {\n const parts = value.split('.');\n if (parts.length === 2 && /^0*$/.test(parts[1])) {\n const num = parseNumber(parts[0], options);\n if (num !== undefined) return value;\n }\n }\n\n // Parse and validate\n const num = parseNumber(value, options);\n if (num === undefined) {\n // Invalid input, return empty to trigger validation\n return '';\n }\n\n // Keep the original string representation to preserve user formatting\n return value;\n}\n\n/**\n * Transform value during onBlur (when input loses focus).\n * Finalizes the value with proper formatting and validation.\n *\n * @param value - Current input value\n * @param options - Transformation options\n * @returns Finalized numeric value\n */\nexport function transformOnBlur(value: string, options: TransformNumberOptions = {}): number {\n const { min, max, decimals, defaultValue = 0 } = options;\n\n const num = parseNumber(value, options);\n if (num === undefined) {\n return defaultValue;\n }\n\n let result = num;\n\n // Apply decimal rounding\n if (decimals !== undefined) {\n result = roundToDecimals(result, decimals);\n }\n\n // Apply min/max clamping\n result = clampNumber(result, { min, max });\n\n return result;\n}\n\n/**\n * Transform a number for display in an input.\n * Converts number back to string representation.\n *\n * @param value - Numeric value\n * @param options - Transformation options\n * @returns String representation for input value\n */\nexport function transformForDisplay(value: number | null | undefined, options: TransformNumberOptions = {}): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const { decimals } = options;\n\n if (decimals !== undefined) {\n return value.toFixed(decimals);\n }\n\n return String(value);\n}\n\n/**\n * Create a complete number input handler.\n * Returns handlers for onChange, onBlur, and value display.\n *\n * @example\n * ```tsx\n * const [price, setPrice] = useState(0);\n * const handlers = createNumberInputHandlers({\n * value: price,\n * onChange: setPrice,\n * min: 0,\n * decimals: 2,\n * });\n *\n * <TextField\n * value={handlers.displayValue}\n * onChange={(e) => handlers.handleChange(e.target.value)}\n * onBlur={handlers.handleBlur}\n * />\n * ```\n *\n * @param config - Handler configuration\n * @returns Object with handlers and display value\n */\nexport function createNumberInputHandlers(config: {\n value: number;\n onChange: (value: number) => void;\n options?: TransformNumberOptions;\n}): {\n displayValue: string;\n handleChange: (value: string) => void;\n handleBlur: () => void;\n} {\n const { value, onChange, options = {} } = config;\n let intermediateValue: string | null = null;\n\n return {\n displayValue: intermediateValue ?? transformForDisplay(value, options),\n\n handleChange: (newValue: string) => {\n const transformed = transformOnChange(newValue, options);\n intermediateValue = transformed;\n\n // Try to parse for immediate feedback\n const num = parseNumber(transformed, options);\n if (num !== undefined) {\n onChange(num);\n }\n },\n\n handleBlur: () => {\n const finalValue = transformOnBlur(intermediateValue ?? String(value), options);\n intermediateValue = null;\n onChange(finalValue);\n },\n };\n}\n","'use client';\n\n/**\n * Field.Number Component\n *\n * React Hook Form integrated number field with proper numeric handling\n * and full accessibility support.\n *\n * @module components/field\n */\n\nimport type { ReactNode, ComponentProps } from 'react';\nimport { useCallback, useState, useEffect, useId, useMemo, useRef } from 'react';\nimport {\n Controller,\n useFormContext,\n type RegisterOptions,\n type ControllerRenderProps,\n type FieldValues,\n type FieldError,\n} from 'react-hook-form';\nimport TextField from '@mui/material/TextField';\nimport type { TransformNumberOptions } from '../../utils/transform-number.js';\nimport { transformOnChange, transformOnBlur, transformForDisplay } from '../../utils/transform-number.js';\n\n/**\n * Props for Field.Number component.\n */\nexport interface FieldNumberProps extends Omit<ComponentProps<typeof TextField>, 'name' | 'type'> {\n /** Field name in the form */\n name: string;\n /** Minimum allowed value */\n min?: number;\n /** Maximum allowed value */\n max?: number;\n /** Decimal places to allow */\n decimals?: number;\n /** Allow negative numbers */\n allowNegative?: boolean;\n /** Default value when input is empty */\n defaultValue?: number;\n /** Validation rules for react-hook-form */\n rules?: RegisterOptions;\n}\n\n/**\n * Internal props for the number input renderer.\n * Excludes 'error' from FieldNumberProps because TextField's error is boolean,\n * but we need FieldError from react-hook-form.\n */\ninterface NumberInputProps extends Omit<FieldNumberProps, 'name' | 'rules' | 'error'> {\n field: ControllerRenderProps<FieldValues, string>;\n error?: FieldError;\n options: TransformNumberOptions;\n inputId: string;\n helperId: string;\n}\n\n/**\n * Internal component that handles the number input rendering.\n * Extracted to comply with Rules of Hooks - hooks must be called at top level.\n *\n * Includes comprehensive accessibility attributes:\n * - aria-describedby for helper text and error messages\n * - aria-invalid for error states\n * - aria-valuemin/max for range constraints\n * - Proper inputMode for numeric keyboard\n */\nfunction NumberInput({\n field,\n error,\n options,\n helperText,\n inputId,\n helperId,\n required,\n slotProps,\n ...other\n}: NumberInputProps): ReactNode {\n const [displayValue, setDisplayValue] = useState<string>(() =>\n transformForDisplay(field.value ?? options.defaultValue ?? 0, options)\n );\n\n // The last value this input pushed into the form. Anything else arriving in\n // `field.value` came from outside (a reset, a setValue, a server default).\n const committedRef = useRef<unknown>(field.value);\n\n // Re-render the box from the form value ONLY when the form value changed\n // externally.\n //\n // This effect used to run on every render and unconditionally overwrite the\n // display. Two consequences, both user-visible: a decimal separator could\n // never be typed (mid-entry \"1.\" parses to 1 and formats back to \"1\", so the\n // character vanished as it was typed), and any unrelated parent re-render —\n // form validation, a sibling field updating — reformatted whatever was\n // half-typed. `options` was rebuilt on every render too, so the dependency\n // array never held it still.\n useEffect(() => {\n if (Object.is(field.value, committedRef.current)) return;\n committedRef.current = field.value;\n setDisplayValue(transformForDisplay(field.value ?? options.defaultValue ?? 0, options));\n }, [field.value, options]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const transformed = transformOnChange(e.target.value, options);\n setDisplayValue(transformed);\n\n // Update form value if we have a valid number\n const num = parseFloat(transformed);\n if (!isNaN(num)) {\n committedRef.current = num;\n field.onChange(num);\n } else if (transformed === '' || transformed === '-') {\n // Intermediate states ('' while clearing, '-' before the digits) are\n // kept in the display and reported as `undefined` rather than being\n // silently replaced with the default. Substituting the default here\n // meant the box could not be emptied — it refilled with 0 — and a\n // `required` rule could never fire, because the form always held a\n // number.\n committedRef.current = undefined;\n field.onChange(undefined);\n }\n },\n [field, options]\n );\n\n const handleBlur = useCallback(() => {\n const finalValue = transformOnBlur(displayValue || String(field.value ?? options.defaultValue ?? 0), options);\n committedRef.current = finalValue;\n field.onChange(finalValue);\n setDisplayValue(transformForDisplay(finalValue, options));\n field.onBlur();\n }, [displayValue, field, options]);\n\n return (\n <TextField\n {...other}\n id={inputId}\n fullWidth\n value={displayValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={!!error}\n helperText={error?.message ?? helperText}\n required={required}\n slotProps={{\n ...slotProps,\n formHelperText: {\n id: helperId,\n ...slotProps?.formHelperText,\n },\n // Merged, not overwritten: spreading the caller's `slotProps` last\n // replaced `htmlInput` wholesale, so passing any input prop silently\n // stripped every aria attribute below.\n htmlInput: {\n inputMode: options.decimals === 0 ? 'numeric' : 'decimal',\n 'aria-describedby': error?.message || helperText ? helperId : undefined,\n 'aria-invalid': !!error,\n 'aria-required': required,\n 'aria-valuemin': options.min,\n 'aria-valuemax': options.max,\n 'aria-valuenow': field.value ?? options.defaultValue ?? 0,\n ...(slotProps?.htmlInput as object | undefined),\n },\n }}\n />\n );\n}\n\n/**\n * Field.Number - Number input with proper numeric handling.\n * Uses transformNumber utilities for three-phase input handling.\n *\n * Includes comprehensive accessibility attributes:\n * - aria-describedby for helper text and error messages\n * - aria-invalid for error states\n * - aria-valuemin/max for range constraints\n * - Proper inputMode for numeric keyboard\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.Number name=\"quantity\" label=\"Quantity\" min={1} max={100} />\n * <Field.Number name=\"price\" label=\"Price\" decimals={2} min={0} />\n * </FormProvider>\n * ```\n */\nexport function FieldNumber({\n name,\n min,\n max,\n decimals,\n allowNegative = true,\n defaultValue = 0,\n rules,\n\n error: _error,\n ...other\n}: FieldNumberProps): ReactNode {\n const { control } = useFormContext();\n const id = useId();\n const inputId = `field-number-${id}`;\n const helperId = `field-number-helper-${id}`;\n\n // Memoised on the primitives: rebuilding this object every render made it a\n // new dependency each time for the effect and callbacks inside NumberInput.\n const options: TransformNumberOptions = useMemo(\n () => ({ min, max, decimals, allowNegative, defaultValue }),\n [min, max, decimals, allowNegative, defaultValue]\n );\n\n return (\n <Controller\n name={name}\n control={control}\n rules={rules}\n render={({ field, fieldState: { error } }) => (\n <NumberInput field={field} error={error} options={options} inputId={inputId} helperId={helperId} {...other} />\n )}\n />\n );\n}\n","'use client';\n\n/**\n * Field.Radio Component\n *\n * React Hook Form integrated radio group with full accessibility support.\n *\n * @module components/field\n */\n\nimport type { ReactNode } from 'react';\nimport { useId } from 'react';\nimport { Controller, useFormContext, type RegisterOptions } from 'react-hook-form';\nimport FormControl from '@mui/material/FormControl';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport FormLabel from '@mui/material/FormLabel';\nimport Radio from '@mui/material/Radio';\nimport RadioGroup from '@mui/material/RadioGroup';\nimport type { FormControlProps } from '@mui/material/FormControl';\n\n/**\n * Option for radio group.\n */\nexport interface RadioOption {\n /** Option value */\n value: string | number;\n /** Display label */\n label: string;\n /** Disabled state */\n disabled?: boolean;\n}\n\n/**\n * Props for Field.Radio component.\n */\nexport interface FieldRadioProps extends Omit<FormControlProps, 'name'> {\n /** Field name in the form */\n name: string;\n /** Radio options */\n options: RadioOption[];\n /** Label for the radio group */\n label?: string;\n /** Helper text */\n helperText?: string;\n /** Layout direction */\n row?: boolean;\n /** Validation rules for react-hook-form */\n rules?: RegisterOptions;\n}\n\n/**\n * Field.Radio - Radio group with React Hook Form integration.\n *\n * Includes comprehensive accessibility attributes:\n * - aria-describedby for helper text and error messages\n * - aria-invalid for error states\n * - aria-required for required fields\n * - Proper radiogroup role and label association\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.Radio\n * name=\"gender\"\n * label=\"Gender\"\n * options={[\n * { value: 'male', label: 'Male' },\n * { value: 'female', label: 'Female' },\n * { value: 'other', label: 'Other' },\n * ]}\n * />\n * </FormProvider>\n * ```\n */\nexport function FieldRadio({\n name,\n options,\n label,\n helperText,\n row = false,\n rules,\n required,\n ...other\n}: FieldRadioProps): ReactNode {\n const { control } = useFormContext();\n const id = useId();\n const groupId = `field-radio-${id}`;\n const labelId = `field-radio-label-${id}`;\n const helperId = `field-radio-helper-${id}`;\n\n return (\n <Controller\n name={name}\n control={control}\n rules={rules}\n render={({ field, fieldState: { error } }) => (\n <FormControl error={!!error} required={required} {...other}>\n {label && (\n <FormLabel id={labelId} htmlFor={groupId}>\n {label}\n </FormLabel>\n )}\n <RadioGroup\n {...field}\n id={groupId}\n row={row}\n value={field.value ?? ''}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={error?.message || helperText ? helperId : undefined}\n aria-invalid={!!error}\n aria-required={required}\n >\n {options.map((option, index) => (\n <FormControlLabel\n key={String(option.value)}\n value={option.value}\n control={\n <Radio\n id={`${groupId}-option-${index}`}\n slotProps={{\n input: {\n 'aria-label': option.label,\n }\n }}\n />\n }\n label={option.label}\n disabled={option.disabled}\n />\n ))}\n </RadioGroup>\n {(error?.message || helperText) && (\n <FormHelperText id={helperId}>{error?.message ?? helperText}</FormHelperText>\n )}\n </FormControl>\n )}\n />\n );\n}\n","'use client';\n\n/**\n * Field.Autocomplete Component\n *\n * React Hook Form integrated autocomplete with search.\n *\n * @module components/field\n */\n\nimport type { ReactNode, SyntheticEvent } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\nimport type { TextFieldProps } from '@mui/material/TextField';\n\n/**\n * Option for autocomplete.\n */\nexport interface AutocompleteOption {\n /** Option value */\n value: string | number;\n /** Display label */\n label: string;\n /** Optional group */\n group?: string;\n /** Disabled state */\n disabled?: boolean;\n}\n\n/**\n * Props for Field.Autocomplete component.\n */\nexport interface FieldAutocompleteProps {\n /** Field name in the form */\n name: string;\n /** Autocomplete options */\n options: AutocompleteOption[];\n /** Field label */\n label?: string;\n /** Placeholder text */\n placeholder?: string;\n /** Helper text */\n helperText?: string;\n /** Props passed to TextField */\n textFieldProps?: Partial<TextFieldProps>;\n /** Disable clearable */\n disableClearable?: boolean;\n /** Disable close on select */\n disableCloseOnSelect?: boolean;\n /** Loading state */\n loading?: boolean;\n /** Loading text */\n loadingText?: ReactNode;\n /** No options text */\n noOptionsText?: ReactNode;\n /** Disabled state */\n disabled?: boolean;\n /** Read only state */\n readOnly?: boolean;\n /** Full width */\n fullWidth?: boolean;\n /** Size */\n size?: 'small' | 'medium';\n}\n\n/**\n * Field.Autocomplete - Autocomplete with React Hook Form integration.\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.Autocomplete\n * name=\"country\"\n * label=\"Country\"\n * options={countries}\n * placeholder=\"Select a country...\"\n * />\n * </FormProvider>\n * ```\n */\nexport function FieldAutocomplete({\n name,\n options,\n label,\n placeholder,\n helperText,\n textFieldProps,\n disableClearable,\n disableCloseOnSelect,\n loading,\n loadingText,\n noOptionsText,\n disabled,\n readOnly,\n fullWidth = true,\n size,\n}: FieldAutocompleteProps): ReactNode {\n const { control, setValue } = useFormContext();\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n // Find selected option\n const selectedOption = options.find((opt) => opt.value === field.value) ?? null;\n\n return (\n <Autocomplete\n options={options}\n value={selectedOption}\n disableClearable={disableClearable}\n disableCloseOnSelect={disableCloseOnSelect}\n loading={loading}\n loadingText={loadingText}\n noOptionsText={noOptionsText}\n disabled={disabled}\n readOnly={readOnly}\n fullWidth={fullWidth}\n size={size}\n getOptionLabel={(option) => option.label}\n getOptionDisabled={(option) => !!option.disabled}\n isOptionEqualToValue={(option, value) => option.value === value.value}\n groupBy={options.some((opt) => opt.group) ? (option) => option.group ?? '' : undefined}\n onChange={(_event: SyntheticEvent, newValue: AutocompleteOption | null) => {\n setValue(name, newValue?.value ?? '', { shouldValidate: true });\n }}\n renderInput={(params) => (\n <TextField\n {...params}\n label={label}\n placeholder={placeholder}\n error={!!error}\n helperText={error?.message ?? helperText}\n {...textFieldProps}\n />\n )}\n />\n );\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Field.MultiSelect Component\n *\n * React Hook Form integrated multi-select with chips.\n *\n * @module components/field\n */\n\nimport type { ReactNode, SyntheticEvent } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\nimport Chip from '@mui/material/Chip';\nimport type { TextFieldProps } from '@mui/material/TextField';\n\n/**\n * Option for multi-select.\n */\nexport interface MultiSelectOption {\n /** Option value */\n value: string | number;\n /** Display label */\n label: string;\n /** Optional group */\n group?: string;\n /** Disabled state */\n disabled?: boolean;\n}\n\n/**\n * Props for Field.MultiSelect component.\n */\nexport interface FieldMultiSelectProps {\n /** Field name in the form */\n name: string;\n /** Select options */\n options: MultiSelectOption[];\n /** Field label */\n label?: string;\n /** Placeholder text */\n placeholder?: string;\n /** Helper text */\n helperText?: string;\n /** Props passed to TextField */\n textFieldProps?: Partial<TextFieldProps>;\n /** Maximum number of selections */\n maxSelections?: number;\n /** Chip variant */\n chipVariant?: 'filled' | 'outlined' | 'soft';\n /** Chip color */\n chipColor?: 'default' | 'primary' | 'secondary' | 'error' | 'info' | 'success' | 'warning';\n /** Disable clearable */\n disableClearable?: boolean;\n /** Disable close on select */\n disableCloseOnSelect?: boolean;\n /** Loading state */\n loading?: boolean;\n /** Loading text */\n loadingText?: ReactNode;\n /** No options text */\n noOptionsText?: ReactNode;\n /** Disabled state */\n disabled?: boolean;\n /** Read only state */\n readOnly?: boolean;\n /** Full width */\n fullWidth?: boolean;\n /** Size */\n size?: 'small' | 'medium';\n /** Limit number of visible tags */\n limitTags?: number;\n}\n\n/**\n * Field.MultiSelect - Multiple selection with React Hook Form integration.\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.MultiSelect\n * name=\"tags\"\n * label=\"Tags\"\n * options={[\n * { value: 'react', label: 'React' },\n * { value: 'typescript', label: 'TypeScript' },\n * { value: 'nodejs', label: 'Node.js' },\n * ]}\n * />\n * </FormProvider>\n * ```\n */\nexport function FieldMultiSelect({\n name,\n options,\n label,\n placeholder,\n helperText,\n textFieldProps,\n maxSelections,\n chipVariant = 'filled',\n chipColor = 'primary',\n disableClearable,\n disableCloseOnSelect,\n loading,\n loadingText,\n noOptionsText,\n disabled,\n readOnly,\n fullWidth = true,\n size,\n limitTags,\n}: FieldMultiSelectProps): ReactNode {\n const { control, setValue } = useFormContext();\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n // Convert array of values to array of options\n const values = (field.value as (string | number)[] | undefined) ?? [];\n const selectedOptions = values\n .map((val) => options.find((opt) => opt.value === val))\n .filter((opt): opt is MultiSelectOption => opt !== undefined);\n\n const isMaxReached = maxSelections !== undefined && selectedOptions.length >= maxSelections;\n\n return (\n <Autocomplete\n multiple\n options={options}\n value={selectedOptions}\n disableClearable={disableClearable}\n disableCloseOnSelect={disableCloseOnSelect}\n loading={loading}\n loadingText={loadingText}\n noOptionsText={noOptionsText}\n disabled={disabled}\n readOnly={readOnly}\n fullWidth={fullWidth}\n size={size}\n limitTags={limitTags}\n getOptionLabel={(option) => option.label}\n getOptionDisabled={(option) => {\n if (option.disabled) return true;\n // Disable all options if max reached and option not already selected\n if (isMaxReached) {\n const isSelected = selectedOptions.some((sel) => sel.value === option.value);\n return !isSelected;\n }\n return false;\n }}\n isOptionEqualToValue={(option, value) => option.value === value.value}\n groupBy={options.some((opt) => opt.group) ? (option) => option.group ?? '' : undefined}\n onChange={(_event: SyntheticEvent, newValue: MultiSelectOption[]) => {\n const newValues = newValue.map((item) => item.value);\n setValue(name, newValues, { shouldValidate: true });\n }}\n renderValue={(value, getItemProps) =>\n value.map((option, index) => {\n const { key, ...tagProps } = getItemProps({ index });\n return (\n <Chip\n key={key}\n label={option.label}\n variant={chipVariant as 'filled' | 'outlined'}\n color={chipColor}\n size=\"small\"\n {...tagProps}\n />\n );\n })\n }\n renderInput={(params) => (\n <TextField\n {...params}\n label={label}\n placeholder={selectedOptions.length === 0 ? placeholder : undefined}\n error={!!error}\n helperText={\n error?.message ??\n (maxSelections\n ? `${selectedOptions.length}/${maxSelections} selected${helperText ? ` - ${helperText}` : ''}`\n : helperText)\n }\n {...textFieldProps}\n />\n )}\n />\n );\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Field.Rating Component\n *\n * React Hook Form integrated star rating.\n *\n * @module components/field\n */\n\nimport { useId, type ReactNode } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport Box from '@mui/material/Box';\nimport FormControl from '@mui/material/FormControl';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport FormLabel from '@mui/material/FormLabel';\nimport Rating from '@mui/material/Rating';\nimport type { RatingProps } from '@mui/material/Rating';\nimport type { FormControlProps } from '@mui/material/FormControl';\n\n/**\n * Props for Field.Rating component.\n */\nexport interface FieldRatingProps extends Omit<RatingProps, 'name' | 'value' | 'onChange'> {\n /** Field name in the form */\n name: string;\n /** Field label */\n label?: string;\n /** Helper text */\n helperText?: string;\n /** Props passed to FormControl */\n formControlProps?: FormControlProps;\n /** Show numeric value next to rating */\n showValue?: boolean;\n}\n\n/**\n * Field.Rating - Star rating with React Hook Form integration.\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.Rating\n * name=\"rating\"\n * label=\"How would you rate this?\"\n * max={5}\n * precision={0.5}\n * showValue\n * />\n * </FormProvider>\n * ```\n */\nexport function FieldRating({\n name,\n label,\n helperText,\n formControlProps,\n showValue = false,\n max = 5,\n precision = 1,\n size = 'medium',\n ...other\n}: FieldRatingProps): ReactNode {\n const { control } = useFormContext();\n const id = useId();\n const helperId = `field-rating-helper-${id}`;\n const labelId = `field-rating-label-${id}`;\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n const hasHelper = !!(error?.message || helperText);\n return (\n <FormControl error={!!error} {...formControlProps}>\n {label && (\n <FormLabel id={labelId} sx={{ mb: 1 }}>\n {label}\n </FormLabel>\n )}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Rating\n {...other}\n {...field}\n value={field.value ?? 0}\n max={max}\n precision={precision}\n size={size}\n onChange={(_event, newValue) => {\n field.onChange(newValue);\n }}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={hasHelper ? helperId : undefined}\n aria-invalid={!!error}\n />\n {showValue && (\n <Box\n component=\"span\"\n sx={{\n color: 'text.secondary',\n fontSize: size === 'small' ? '0.75rem' : size === 'large' ? '1rem' : '0.875rem',\n }}\n >\n {field.value ?? 0}/{max}\n </Box>\n )}\n </Box>\n {hasHelper && <FormHelperText id={helperId}>{error?.message ?? helperText}</FormHelperText>}\n </FormControl>\n );\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Field.Slider Component\n *\n * React Hook Form integrated slider.\n *\n * @module components/field\n */\n\nimport { useId, type ReactNode } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport Box from '@mui/material/Box';\nimport FormControl from '@mui/material/FormControl';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport FormLabel from '@mui/material/FormLabel';\nimport Slider from '@mui/material/Slider';\nimport Typography from '@mui/material/Typography';\nimport type { SliderProps } from '@mui/material/Slider';\nimport type { FormControlProps } from '@mui/material/FormControl';\n\n/**\n * Props for Field.Slider component.\n */\nexport interface FieldSliderProps extends Omit<SliderProps, 'name' | 'value' | 'onChange'> {\n /** Field name in the form */\n name: string;\n /** Field label */\n label?: string;\n /** Helper text */\n helperText?: string;\n /** Props passed to FormControl */\n formControlProps?: FormControlProps;\n /** Show current value */\n showValue?: boolean;\n /** Format value display */\n formatValue?: (value: number | number[]) => string;\n /** Unit suffix (e.g., '%', 'px', 'MB') */\n unit?: string;\n}\n\n/**\n * Field.Slider - Slider with React Hook Form integration.\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.Slider\n * name=\"volume\"\n * label=\"Volume\"\n * min={0}\n * max={100}\n * unit=\"%\"\n * showValue\n * />\n * <Field.Slider\n * name=\"priceRange\"\n * label=\"Price Range\"\n * min={0}\n * max={1000}\n * formatValue={(val) => `$${val[0]} - $${val[1]}`}\n * showValue\n * />\n * </FormProvider>\n * ```\n */\nexport function FieldSlider({\n name,\n label,\n helperText,\n formControlProps,\n showValue = false,\n formatValue,\n unit,\n min = 0,\n max = 100,\n step = 1,\n ...other\n}: FieldSliderProps): ReactNode {\n const { control } = useFormContext();\n const id = useId();\n const helperId = `field-slider-helper-${id}`;\n const labelId = `field-slider-label-${id}`;\n\n const defaultFormatValue = (value: number | number[]): string => {\n if (Array.isArray(value)) {\n return `${value[0]}${unit ?? ''} - ${value[1]}${unit ?? ''}`;\n }\n return `${value}${unit ?? ''}`;\n };\n\n const displayValue = formatValue ?? defaultFormatValue;\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n const hasHelper = !!(error?.message || helperText);\n return (\n <FormControl error={!!error} fullWidth {...formControlProps}>\n {(label || showValue) && (\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\n {label && <FormLabel id={labelId}>{label}</FormLabel>}\n {showValue && (\n <Typography variant=\"body2\" sx={{\n color: \"text.secondary\"\n }}>\n {displayValue(field.value ?? (Array.isArray(other.defaultValue) ? [min, max] : min))}\n </Typography>\n )}\n </Box>\n )}\n <Slider\n {...other}\n {...field}\n value={field.value ?? (Array.isArray(other.defaultValue) ? [min, max] : min)}\n min={min}\n max={max}\n step={step}\n onChange={(_event, newValue) => {\n field.onChange(newValue);\n }}\n valueLabelDisplay={other.valueLabelDisplay ?? 'auto'}\n valueLabelFormat={(value) => `${value}${unit ?? ''}`}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={hasHelper ? helperId : undefined}\n aria-invalid={!!error}\n />\n {hasHelper && <FormHelperText id={helperId}>{error?.message ?? helperText}</FormHelperText>}\n </FormControl>\n );\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Field.DatePicker Component\n *\n * React Hook Form integrated date picker using MUI X DatePickers.\n * Consistent with Field.DateTimePicker and Field.TimePicker.\n *\n * @module components/field\n */\n\nimport type { ReactNode } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker';\nimport type { TextFieldProps } from '@mui/material/TextField';\nimport dayjs from 'dayjs';\nimport type { Dayjs } from 'dayjs';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ntype DateValue = Dayjs | Date | string | number | null | undefined;\n\n/**\n * Props for Field.DatePicker component.\n */\nexport interface FieldDatePickerProps {\n /** Field name in the form */\n name: string;\n /** Field label */\n label?: ReactNode;\n /** Helper text shown below the field */\n helperText?: ReactNode;\n /** TextField props for customization */\n textFieldProps?: Partial<TextFieldProps>;\n /** Disable the field */\n disabled?: boolean;\n /** Read-only mode */\n readOnly?: boolean;\n /** Minimum selectable date */\n minDate?: Dayjs;\n /** Maximum selectable date */\n maxDate?: Dayjs;\n /** Disable past dates */\n disablePast?: boolean;\n /** Disable future dates */\n disableFuture?: boolean;\n /** Views to display */\n views?: Array<'year' | 'month' | 'day'>;\n /** Open picker to specific view */\n openTo?: 'year' | 'month' | 'day';\n /** Format for display */\n format?: string;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction normalizeValue(value: DateValue): Dayjs | null {\n if (value === null || value === undefined || value === '') return null;\n if (dayjs.isDayjs(value)) return value.isValid() ? value : null;\n if (value instanceof Date) {\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed : null;\n }\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed : null;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Field.DatePicker - Date picker with React Hook Form integration.\n *\n * Uses @mui/x-date-pickers DatePicker for a polished calendar UI.\n * Stores value as ISO string for serialization compatibility.\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.DatePicker name=\"birthDate\" label=\"Birth Date\" />\n * <Field.DatePicker name=\"deadline\" label=\"Deadline\" disablePast />\n * </FormProvider>\n * ```\n */\nexport function FieldDatePicker({\n name,\n label,\n helperText,\n textFieldProps,\n disabled,\n readOnly,\n minDate,\n maxDate,\n disablePast,\n disableFuture,\n views,\n openTo,\n format,\n}: FieldDatePickerProps): ReactNode {\n const { control } = useFormContext();\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n const normalizedValue = normalizeValue(field.value);\n\n return (\n <DatePicker\n label={label}\n value={normalizedValue}\n onChange={(newValue: Dayjs | null) => {\n field.onChange(newValue?.toISOString() ?? null);\n }}\n disabled={disabled}\n readOnly={readOnly}\n minDate={minDate}\n maxDate={maxDate}\n disablePast={disablePast}\n disableFuture={disableFuture}\n views={views}\n openTo={openTo}\n format={format}\n slotProps={{\n // MUI v9 x-date-pickers' default textField slot is the new\n // PickersTextField (separate from the MUI TextField). The\n // shape is structurally compatible for our use (fullWidth,\n // error, helperText, sx, label) but TS's strict slot typing\n // refuses to merge with our caller-supplied TextFieldProps.\n // Cast silences the union mismatch without losing runtime\n // behaviour — the picker forwards every prop through to\n // the underlying input.\n textField: {\n fullWidth: true,\n error: !!error,\n helperText: error?.message ?? helperText,\n ...textFieldProps,\n } as never,\n }}\n />\n );\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Field.TimePicker Component\n *\n * React Hook Form integrated time picker using MUI X DatePickers.\n * Provides a professional time selection experience with dayjs integration.\n *\n * @module components/field\n */\n\nimport type { ReactNode } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport { TimePicker } from '@mui/x-date-pickers/TimePicker';\nimport type { TextFieldProps } from '@mui/material/TextField';\nimport dayjs from 'dayjs';\nimport type { Dayjs } from 'dayjs';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Value types that can be normalized to Dayjs\n */\ntype DateValue = Dayjs | Date | string | number | null | undefined;\n\n/**\n * Props for Field.TimePicker component.\n */\nexport interface FieldTimePickerProps {\n /** Field name in the form */\n name: string;\n /** Field label */\n label?: ReactNode;\n /** Helper text shown below the field */\n helperText?: ReactNode;\n /** TextField props for customization */\n textFieldProps?: Partial<TextFieldProps>;\n /** Disable the field */\n disabled?: boolean;\n /** Read-only mode */\n readOnly?: boolean;\n /** Minutes step for time selection */\n minutesStep?: number;\n /** Use 12-hour format with AM/PM */\n ampm?: boolean;\n /** Minimum selectable time */\n minTime?: Dayjs;\n /** Maximum selectable time */\n maxTime?: Dayjs;\n /** Time views to display */\n views?: Array<'hours' | 'minutes' | 'seconds'>;\n /** Open picker to specific view */\n openTo?: 'hours' | 'minutes' | 'seconds';\n /** Format for display */\n format?: string;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Normalize various date value types to Dayjs or null.\n * Handles Dayjs, Date, string, number, null, and undefined.\n */\nfunction normalizeValue(value: DateValue): Dayjs | null {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n // Already Dayjs\n if (dayjs.isDayjs(value)) {\n return value.isValid() ? value : null;\n }\n\n // Date object\n if (value instanceof Date) {\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed : null;\n }\n\n // String or number\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed : null;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Field.TimePicker - Time picker with React Hook Form integration.\n *\n * Uses @mui/x-date-pickers TimePicker for a professional time selection experience.\n * Automatically normalizes various date/time value types to Dayjs.\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.TimePicker\n * name=\"startTime\"\n * label=\"Start Time\"\n * />\n * <Field.TimePicker\n * name=\"endTime\"\n * label=\"End Time\"\n * ampm={false}\n * minutesStep={15}\n * />\n * </FormProvider>\n * ```\n *\n * @example\n * ```tsx\n * // With custom text field props\n * <Field.TimePicker\n * name=\"meetingTime\"\n * label=\"Meeting Time\"\n * textFieldProps={{\n * variant: 'filled',\n * size: 'small',\n * }}\n * />\n * ```\n */\nexport function FieldTimePicker({\n name,\n label,\n helperText,\n textFieldProps,\n disabled,\n readOnly,\n minutesStep,\n ampm,\n minTime,\n maxTime,\n views,\n openTo,\n format,\n}: FieldTimePickerProps): ReactNode {\n const { control } = useFormContext();\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n const normalizedValue = normalizeValue(field.value);\n\n return (\n <TimePicker\n label={label}\n value={normalizedValue}\n onChange={(newValue: Dayjs | null) => {\n // Store as ISO string for serialization compatibility\n field.onChange(newValue?.toISOString() ?? null);\n }}\n disabled={disabled}\n readOnly={readOnly}\n minutesStep={minutesStep}\n ampm={ampm}\n minTime={minTime}\n maxTime={maxTime}\n views={views}\n openTo={openTo}\n format={format}\n slotProps={{\n textField: {\n fullWidth: true,\n error: !!error,\n helperText: error?.message ?? helperText,\n ...textFieldProps,\n } as never,\n }}\n />\n );\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Field.DateTimePicker Component\n *\n * React Hook Form integrated date-time picker using MUI X DatePickers.\n * Combines date and time selection in a single component.\n *\n * @module components/field\n */\n\nimport type { ReactNode } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker';\nimport type { TextFieldProps } from '@mui/material/TextField';\nimport dayjs from 'dayjs';\nimport type { Dayjs } from 'dayjs';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Value types that can be normalized to Dayjs\n */\ntype DateValue = Dayjs | Date | string | number | null | undefined;\n\n/**\n * Props for Field.DateTimePicker component.\n */\nexport interface FieldDateTimePickerProps {\n /** Field name in the form */\n name: string;\n /** Field label */\n label?: ReactNode;\n /** Helper text shown below the field */\n helperText?: ReactNode;\n /** TextField props for customization */\n textFieldProps?: Partial<TextFieldProps>;\n /** Disable the field */\n disabled?: boolean;\n /** Read-only mode */\n readOnly?: boolean;\n /** Minutes step for time selection */\n minutesStep?: number;\n /** Use 12-hour format with AM/PM */\n ampm?: boolean;\n /** Minimum selectable datetime */\n minDateTime?: Dayjs;\n /** Maximum selectable datetime */\n maxDateTime?: Dayjs;\n /** Disable past dates */\n disablePast?: boolean;\n /** Disable future dates */\n disableFuture?: boolean;\n /** Views to display */\n views?: Array<'year' | 'month' | 'day' | 'hours' | 'minutes' | 'seconds'>;\n /** Open picker to specific view */\n openTo?: 'year' | 'month' | 'day' | 'hours' | 'minutes' | 'seconds';\n /** Format for display */\n format?: string;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Normalize various date value types to Dayjs or null.\n * Handles Dayjs, Date, string, number, null, and undefined.\n */\nfunction normalizeValue(value: DateValue): Dayjs | null {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n // Already Dayjs\n if (dayjs.isDayjs(value)) {\n return value.isValid() ? value : null;\n }\n\n // Date object\n if (value instanceof Date) {\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed : null;\n }\n\n // String or number\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed : null;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Field.DateTimePicker - Combined date and time picker with React Hook Form integration.\n *\n * Uses @mui/x-date-pickers DateTimePicker for comprehensive date-time selection.\n * Automatically normalizes various date/time value types to Dayjs.\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.DateTimePicker\n * name=\"eventStart\"\n * label=\"Event Start\"\n * />\n * <Field.DateTimePicker\n * name=\"eventEnd\"\n * label=\"Event End\"\n * ampm={false}\n * minutesStep={15}\n * />\n * </FormProvider>\n * ```\n *\n * @example\n * ```tsx\n * // With date constraints\n * <Field.DateTimePicker\n * name=\"appointment\"\n * label=\"Appointment\"\n * minDateTime={dayjs()}\n * maxDateTime={dayjs().add(30, 'day')}\n * disablePast\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With custom views\n * <Field.DateTimePicker\n * name=\"scheduledAt\"\n * label=\"Schedule\"\n * views={['year', 'month', 'day', 'hours', 'minutes']}\n * textFieldProps={{\n * variant: 'filled',\n * size: 'small',\n * }}\n * />\n * ```\n */\nexport function FieldDateTimePicker({\n name,\n label,\n helperText,\n textFieldProps,\n disabled,\n readOnly,\n minutesStep,\n ampm,\n minDateTime,\n maxDateTime,\n disablePast,\n disableFuture,\n views,\n openTo,\n format,\n}: FieldDateTimePickerProps): ReactNode {\n const { control } = useFormContext();\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n const normalizedValue = normalizeValue(field.value);\n\n return (\n <DateTimePicker\n label={label}\n value={normalizedValue}\n onChange={(newValue: Dayjs | null) => {\n // Store as ISO string for serialization compatibility\n field.onChange(newValue?.toISOString() ?? null);\n }}\n disabled={disabled}\n readOnly={readOnly}\n minutesStep={minutesStep}\n ampm={ampm}\n minDateTime={minDateTime}\n maxDateTime={maxDateTime}\n disablePast={disablePast}\n disableFuture={disableFuture}\n views={views}\n openTo={openTo}\n format={format}\n slotProps={{\n textField: {\n fullWidth: true,\n error: !!error,\n helperText: error?.message ?? helperText,\n ...textFieldProps,\n } as never,\n }}\n />\n );\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Field.MultiCheckbox Component\n *\n * React Hook Form integrated multiple checkbox group.\n * Manages array values for multi-select scenarios.\n *\n * @module components/field\n */\n\nimport { useId, type ReactNode } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport Box from '@mui/material/Box';\nimport Checkbox from '@mui/material/Checkbox';\nimport FormControl from '@mui/material/FormControl';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport FormGroup from '@mui/material/FormGroup';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport FormLabel from '@mui/material/FormLabel';\nimport type { BoxProps } from '@mui/material/Box';\nimport type { CheckboxProps } from '@mui/material/Checkbox';\nimport type { FormControlProps } from '@mui/material/FormControl';\nimport type { FormGroupProps } from '@mui/material/FormGroup';\nimport type { FormHelperTextProps } from '@mui/material/FormHelperText';\nimport type { FormLabelProps } from '@mui/material/FormLabel';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Option for multi-checkbox selection\n */\nexport interface MultiCheckboxOption {\n /** Display label */\n label: string;\n /** Value stored when selected */\n value: string;\n /** Disable this option */\n disabled?: boolean;\n}\n\n/**\n * Props for Field.MultiCheckbox component.\n */\nexport interface FieldMultiCheckboxProps extends Omit<FormGroupProps, 'onChange'> {\n /** Field name in the form */\n name: string;\n /** Label for the checkbox group */\n label?: string;\n /** Available options */\n options: MultiCheckboxOption[];\n /** Helper text shown below the group */\n helperText?: ReactNode;\n /** Slot props for nested components */\n slotProps?: {\n /** Wrapper FormControl props */\n wrapper?: Partial<FormControlProps>;\n /** Individual Checkbox props */\n checkbox?: Partial<CheckboxProps>;\n /** FormLabel props */\n formLabel?: Partial<FormLabelProps>;\n /** FormHelperText props */\n helperText?: Partial<FormHelperTextProps>;\n /** Container Box props */\n container?: Partial<BoxProps>;\n };\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Field.MultiCheckbox - Multiple checkbox group with React Hook Form integration.\n *\n * Stores selected values as an array. Toggle logic automatically adds/removes\n * values when checkboxes are clicked.\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.MultiCheckbox\n * name=\"interests\"\n * label=\"Select your interests\"\n * options={[\n * { label: 'Technology', value: 'tech' },\n * { label: 'Sports', value: 'sports' },\n * { label: 'Music', value: 'music' },\n * { label: 'Art', value: 'art' },\n * ]}\n * />\n * </FormProvider>\n * ```\n *\n * @example\n * ```tsx\n * // Horizontal layout\n * <Field.MultiCheckbox\n * name=\"features\"\n * label=\"Enable features\"\n * row\n * options={[\n * { label: 'Dark Mode', value: 'dark' },\n * { label: 'Notifications', value: 'notify' },\n * { label: 'Auto-save', value: 'autosave', disabled: true },\n * ]}\n * />\n * ```\n */\nexport function FieldMultiCheckbox({\n name,\n label,\n options,\n helperText,\n slotProps,\n row,\n ...other\n}: FieldMultiCheckboxProps): ReactNode {\n const { control } = useFormContext();\n const id = useId();\n const helperId = `field-multi-checkbox-helper-${id}`;\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n const selectedValues: string[] = Array.isArray(field.value) ? field.value : [];\n const hasHelper = !!(error?.message || helperText);\n\n const handleToggle = (optionValue: string) => {\n const isSelected = selectedValues.includes(optionValue);\n const newValues = isSelected\n ? selectedValues.filter((v) => v !== optionValue)\n : [...selectedValues, optionValue];\n field.onChange(newValues);\n };\n\n return (\n <FormControl\n component=\"fieldset\"\n error={!!error}\n aria-describedby={hasHelper ? helperId : undefined}\n {...slotProps?.wrapper}\n >\n {label && (\n <FormLabel\n component=\"legend\"\n {...slotProps?.formLabel}\n sx={{\n mb: 1,\n ...slotProps?.formLabel?.sx,\n }}\n >\n {label}\n </FormLabel>\n )}\n\n <Box {...slotProps?.container}>\n <FormGroup row={row} {...other}>\n {options.map((option) => (\n <FormControlLabel\n key={option.value}\n label={option.label}\n disabled={option.disabled}\n control={\n <Checkbox\n checked={selectedValues.includes(option.value)}\n onChange={() => handleToggle(option.value)}\n {...slotProps?.checkbox}\n />\n }\n />\n ))}\n </FormGroup>\n </Box>\n\n {hasHelper && (\n <FormHelperText id={helperId} error={!!error} {...slotProps?.helperText}>\n {error?.message ?? helperText}\n </FormHelperText>\n )}\n </FormControl>\n );\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Field.MultiSwitch Component\n *\n * React Hook Form integrated multiple switch group.\n * Manages array values for multi-toggle scenarios.\n *\n * @module components/field\n */\n\nimport { useId, type ReactNode } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport Box from '@mui/material/Box';\nimport Switch from '@mui/material/Switch';\nimport FormControl from '@mui/material/FormControl';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport FormGroup from '@mui/material/FormGroup';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport FormLabel from '@mui/material/FormLabel';\nimport type { BoxProps } from '@mui/material/Box';\nimport type { SwitchProps } from '@mui/material/Switch';\nimport type { FormControlProps } from '@mui/material/FormControl';\nimport type { FormGroupProps } from '@mui/material/FormGroup';\nimport type { FormHelperTextProps } from '@mui/material/FormHelperText';\nimport type { FormLabelProps } from '@mui/material/FormLabel';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Option for multi-switch selection\n */\nexport interface MultiSwitchOption {\n /** Display label */\n label: string;\n /** Value stored when enabled */\n value: string;\n /** Disable this option */\n disabled?: boolean;\n}\n\n/**\n * Props for Field.MultiSwitch component.\n */\nexport interface FieldMultiSwitchProps extends Omit<FormGroupProps, 'onChange'> {\n /** Field name in the form */\n name: string;\n /** Label for the switch group */\n label?: string;\n /** Available options */\n options: MultiSwitchOption[];\n /** Helper text shown below the group */\n helperText?: ReactNode;\n /** Slot props for nested components */\n slotProps?: {\n /** Wrapper FormControl props */\n wrapper?: Partial<FormControlProps>;\n /** Individual Switch props */\n switch?: Partial<SwitchProps>;\n /** FormLabel props */\n formLabel?: Partial<FormLabelProps>;\n /** FormHelperText props */\n helperText?: Partial<FormHelperTextProps>;\n /** Container Box props */\n container?: Partial<BoxProps>;\n };\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Field.MultiSwitch - Multiple switch group with React Hook Form integration.\n *\n * Stores enabled values as an array. Toggle logic automatically adds/removes\n * values when switches are toggled.\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.MultiSwitch\n * name=\"notifications\"\n * label=\"Notification Settings\"\n * options={[\n * { label: 'Email notifications', value: 'email' },\n * { label: 'Push notifications', value: 'push' },\n * { label: 'SMS notifications', value: 'sms' },\n * ]}\n * />\n * </FormProvider>\n * ```\n *\n * @example\n * ```tsx\n * // Horizontal layout with custom styling\n * <Field.MultiSwitch\n * name=\"features\"\n * label=\"Feature Toggles\"\n * row\n * options={[\n * { label: 'Beta Features', value: 'beta' },\n * { label: 'Analytics', value: 'analytics' },\n * { label: 'Debug Mode', value: 'debug', disabled: true },\n * ]}\n * slotProps={{\n * switch: { color: 'success' },\n * }}\n * />\n * ```\n */\nexport function FieldMultiSwitch({\n name,\n label,\n options,\n helperText,\n slotProps,\n row,\n ...other\n}: FieldMultiSwitchProps): ReactNode {\n const { control } = useFormContext();\n const id = useId();\n const helperId = `field-multi-switch-helper-${id}`;\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n const selectedValues: string[] = Array.isArray(field.value) ? field.value : [];\n const hasHelper = !!(error?.message || helperText);\n\n const handleToggle = (optionValue: string) => {\n const isSelected = selectedValues.includes(optionValue);\n const newValues = isSelected\n ? selectedValues.filter((v) => v !== optionValue)\n : [...selectedValues, optionValue];\n field.onChange(newValues);\n };\n\n return (\n <FormControl\n component=\"fieldset\"\n error={!!error}\n aria-describedby={hasHelper ? helperId : undefined}\n {...slotProps?.wrapper}\n >\n {label && (\n <FormLabel\n component=\"legend\"\n {...slotProps?.formLabel}\n sx={{\n mb: 1,\n ...slotProps?.formLabel?.sx,\n }}\n >\n {label}\n </FormLabel>\n )}\n\n <Box {...slotProps?.container}>\n <FormGroup row={row} {...other}>\n {options.map((option) => (\n <FormControlLabel\n key={option.value}\n label={option.label}\n disabled={option.disabled}\n control={\n <Switch\n checked={selectedValues.includes(option.value)}\n onChange={() => handleToggle(option.value)}\n {...slotProps?.switch}\n />\n }\n />\n ))}\n </FormGroup>\n </Box>\n\n {hasHelper && (\n <FormHelperText id={helperId} error={!!error} {...slotProps?.helperText}>\n {error?.message ?? helperText}\n </FormHelperText>\n )}\n </FormControl>\n );\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Field.Code Component\n *\n * React Hook Form integrated OTP (One-Time Password) input.\n * Provides a professional code/PIN entry experience.\n *\n * @module components/field\n */\n\nimport type { ReactNode, ChangeEvent, KeyboardEvent, ClipboardEvent } from 'react';\nimport { useRef, useCallback, useId } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport Box from '@mui/material/Box';\nimport TextField from '@mui/material/TextField';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport type { BoxProps } from '@mui/material/Box';\nimport type { TextFieldProps } from '@mui/material/TextField';\nimport type { FormHelperTextProps } from '@mui/material/FormHelperText';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Props for Field.Code component.\n */\nexport interface FieldCodeProps {\n /** Field name in the form */\n name: string;\n /** Number of code digits (default: 6) */\n length?: number;\n /** Placeholder character (default: '-') */\n placeholder?: string;\n /** Helper text shown below the input */\n helperText?: ReactNode;\n /** Auto-focus the first input on mount */\n autoFocus?: boolean;\n /** Disable all inputs */\n disabled?: boolean;\n /** Input type: text, number, or password */\n type?: 'text' | 'number' | 'password';\n /** Gap between inputs (CSS value) */\n gap?: number | string;\n /** Width of each input field (CSS value) */\n inputWidth?: number | string;\n /** Slot props for nested components */\n slotProps?: {\n /** Wrapper Box props */\n wrapper?: Partial<BoxProps>;\n /** Individual TextField props */\n textField?: Partial<TextFieldProps>;\n /** FormHelperText props */\n helperText?: Partial<FormHelperTextProps>;\n };\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Field.Code - OTP/PIN code input with React Hook Form integration.\n *\n * Features:\n * - Automatic focus navigation between digits\n * - Paste support for full codes\n * - Backspace navigation\n * - Configurable length and styling\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.Code\n * name=\"verificationCode\"\n * autoFocus\n * />\n * </FormProvider>\n * ```\n *\n * @example\n * ```tsx\n * // With custom styling\n * <Field.Code\n * name=\"pin\"\n * length={4}\n * type=\"password\"\n * inputWidth={56}\n * gap={2}\n * slotProps={{\n * textField: { variant: 'filled' },\n * }}\n * />\n * ```\n */\nexport function FieldCode({\n name,\n length = 6,\n placeholder = '-',\n helperText,\n autoFocus = false,\n disabled = false,\n type = 'text',\n gap = 1.5,\n inputWidth = 48,\n slotProps,\n}: FieldCodeProps): ReactNode {\n const { control } = useFormContext();\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n const id = useId();\n const helperId = `field-code-helper-${id}`;\n\n const focusInput = useCallback((index: number) => {\n const input = inputRefs.current[index];\n if (input) {\n input.focus();\n input.select();\n }\n }, []);\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n // Ensure value is a string of correct length\n const valueString = String(field.value ?? '').slice(0, length);\n const digits = Array.from({ length }, (_, i) => valueString[i] ?? '');\n\n const updateValue = (newDigits: string[]) => {\n const newValue = newDigits.join('');\n field.onChange(newValue);\n };\n\n const handleChange = (index: number) => (e: ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n\n // Handle single character input\n if (inputValue.length <= 1) {\n const newDigits = [...digits];\n newDigits[index] = inputValue;\n updateValue(newDigits);\n\n // Move to next input if character was entered\n if (inputValue && index < length - 1) {\n focusInput(index + 1);\n }\n }\n };\n\n const handleKeyDown = (index: number) => (e: KeyboardEvent<HTMLInputElement>) => {\n const key = e.key;\n\n // Backspace: clear current or go to previous\n if (key === 'Backspace') {\n e.preventDefault();\n const newDigits = [...digits];\n\n if (digits[index]) {\n // Clear current digit\n newDigits[index] = '';\n updateValue(newDigits);\n } else if (index > 0) {\n // Move to previous and clear it\n newDigits[index - 1] = '';\n updateValue(newDigits);\n focusInput(index - 1);\n }\n }\n\n // Arrow keys navigation\n if (key === 'ArrowLeft' && index > 0) {\n e.preventDefault();\n focusInput(index - 1);\n }\n if (key === 'ArrowRight' && index < length - 1) {\n e.preventDefault();\n focusInput(index + 1);\n }\n\n // Delete: clear current\n if (key === 'Delete') {\n e.preventDefault();\n const newDigits = [...digits];\n newDigits[index] = '';\n updateValue(newDigits);\n }\n };\n\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pastedData = e.clipboardData.getData('text').slice(0, length);\n\n // Only allow valid characters based on type\n const validChars = type === 'number' ? pastedData.replace(/\\D/g, '') : pastedData;\n\n if (validChars) {\n const newDigits = Array.from({ length }, (_, i) => validChars[i] ?? '');\n updateValue(newDigits);\n\n // Focus the input after the last pasted character\n const focusIndex = Math.min(validChars.length, length - 1);\n focusInput(focusIndex);\n }\n };\n\n const hasHelper = !!(error?.message || helperText);\n\n return (\n <Box role=\"group\" aria-label={`${name} code input`} {...slotProps?.wrapper}>\n <Box\n sx={{\n display: 'flex',\n gap,\n justifyContent: 'center',\n }}\n >\n {digits.map((digit, index) => (\n <TextField\n key={index}\n inputRef={(el) => {\n inputRefs.current[index] = el;\n }}\n value={digit}\n onChange={handleChange(index)}\n onKeyDown={handleKeyDown(index)}\n onPaste={handlePaste}\n onFocus={(e) => e.target.select()}\n disabled={disabled}\n error={!!error}\n autoFocus={autoFocus && index === 0}\n placeholder={placeholder}\n slotProps={{\n htmlInput: {\n maxLength: 1,\n 'aria-label': `Digit ${index + 1} of ${length}`,\n 'aria-describedby': hasHelper ? helperId : undefined,\n 'aria-invalid': !!error,\n style: {\n textAlign: 'center',\n fontSize: '1.25rem',\n fontWeight: 600,\n padding: '12px 0',\n },\n inputMode: type === 'number' ? 'numeric' : 'text',\n autoComplete: 'one-time-code',\n },\n }}\n sx={{\n width: inputWidth,\n '& .MuiInputBase-input': {\n p: 0,\n height: inputWidth,\n },\n }}\n {...slotProps?.textField}\n />\n ))}\n </Box>\n\n {hasHelper && (\n <FormHelperText\n id={helperId}\n error={!!error}\n sx={{ textAlign: 'center', mt: 1 }}\n {...slotProps?.helperText}\n >\n {error?.message ?? helperText}\n </FormHelperText>\n )}\n </Box>\n );\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Field.Upload Component Suite\n *\n * React Hook Form integrated file upload components using react-dropzone.\n * Includes Upload, UploadBox, and UploadAvatar variants.\n *\n * @module components/field\n */\n\nimport type { ReactNode } from 'react';\nimport { useState, useCallback, useMemo } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport { useDropzone } from 'react-dropzone';\nimport type { DropzoneOptions, FileRejection } from 'react-dropzone';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport IconButton from '@mui/material/IconButton';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport Avatar from '@mui/material/Avatar';\nimport { alpha, useTheme } from '@mui/material/styles';\nimport type { BoxProps } from '@mui/material/Box';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/** File value can be File object or URL string */\nexport type FileValue = File | string;\n\n/** Single or multiple file values */\nexport type UploadValue = FileValue | FileValue[] | null;\n\n/**\n * Base props shared by all upload variants\n */\nexport interface UploadBaseProps extends Omit<DropzoneOptions, 'onDrop'> {\n /** Field name in the form */\n name: string;\n /** Error state */\n error?: boolean;\n /** Disable upload */\n disabled?: boolean;\n /** Helper text shown below */\n helperText?: ReactNode;\n /** Custom placeholder content */\n placeholder?: ReactNode;\n /** Custom styles */\n sx?: SxProps<Theme>;\n}\n\n/**\n * Props for Field.Upload component\n */\nexport interface FieldUploadProps extends UploadBaseProps {\n /** Enable multiple file selection */\n multiple?: boolean;\n /** Show thumbnail previews */\n thumbnail?: boolean;\n /** Callback when files are removed */\n onRemove?: (file: FileValue) => void;\n /** Callback to remove all files */\n onRemoveAll?: () => void;\n /** Slot props for nested components */\n slotProps?: {\n wrapper?: Partial<BoxProps>;\n };\n}\n\n/**\n * Props for Field.UploadBox component\n */\nexport interface FieldUploadBoxProps extends UploadBaseProps {\n /** Box size in pixels */\n size?: number;\n}\n\n/**\n * Props for Field.UploadAvatar component\n */\nexport interface FieldUploadAvatarProps extends UploadBaseProps {\n /** Avatar size in pixels */\n size?: number;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Format file size for display\n */\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\n/**\n * Get preview URL for a file\n */\nfunction getPreviewUrl(file: FileValue): string | null {\n if (typeof file === 'string') return file;\n if (file instanceof File && file.type.startsWith('image/')) {\n return URL.createObjectURL(file);\n }\n return null;\n}\n\n/**\n * Get file name for display\n */\nfunction getFileName(file: FileValue): string {\n if (typeof file === 'string') {\n return file.split('/').pop() ?? 'file';\n }\n return file.name;\n}\n\n// =============================================================================\n// UPLOAD PLACEHOLDER\n// =============================================================================\n\ninterface PlaceholderProps {\n isDragActive: boolean;\n disabled?: boolean;\n}\n\nfunction UploadPlaceholder({ isDragActive, disabled }: PlaceholderProps): ReactNode {\n const theme = useTheme();\n\n return (\n <Stack\n spacing={1}\n sx={{\n alignItems: \"center\",\n justifyContent: \"center\",\n p: 3,\n textAlign: 'center',\n color: disabled ? 'text.disabled' : 'text.secondary'\n }}>\n <Box\n component=\"span\"\n sx={{\n width: 48,\n height: 48,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n bgcolor: alpha(theme.palette.primary.main, 0.08),\n color: 'primary.main',\n fontSize: 24,\n }}\n >\n 📁\n </Box>\n <Typography variant=\"body2\" component=\"span\">\n {isDragActive ? (\n 'Drop files here'\n ) : (\n <>\n Drag & drop files here, or{' '}\n <Typography component=\"span\" variant=\"body2\" sx={{ color: 'primary.main', textDecoration: 'underline' }}>\n browse\n </Typography>\n </>\n )}\n </Typography>\n </Stack>\n );\n}\n\n// =============================================================================\n// FILE PREVIEW\n// =============================================================================\n\ninterface FilePreviewProps {\n files: FileValue[];\n thumbnail?: boolean;\n onRemove?: (file: FileValue) => void;\n}\n\nfunction FilePreview({ files, thumbnail, onRemove }: FilePreviewProps): ReactNode {\n if (files.length === 0) return null;\n\n return (\n <Stack spacing={1} sx={{ mt: 2 }}>\n {files.map((file, index) => {\n const previewUrl = thumbnail ? getPreviewUrl(file) : null;\n const fileName = getFileName(file);\n const fileSize = file instanceof File ? formatFileSize(file.size) : '';\n\n return (\n <Box\n key={`${fileName}-${index}`}\n sx={{\n p: 1,\n display: 'flex',\n alignItems: 'center',\n gap: 1.5,\n borderRadius: 1,\n bgcolor: 'background.neutral',\n border: '1px solid',\n borderColor: 'divider',\n }}\n >\n {previewUrl && (\n <Box\n component=\"img\"\n src={previewUrl}\n alt={fileName}\n sx={{\n width: 40,\n height: 40,\n borderRadius: 0.5,\n objectFit: 'cover',\n flexShrink: 0,\n }}\n />\n )}\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\n <Typography variant=\"body2\" noWrap>\n {fileName}\n </Typography>\n {fileSize && (\n <Typography variant=\"caption\" sx={{\n color: \"text.secondary\"\n }}>\n {fileSize}\n </Typography>\n )}\n </Box>\n {onRemove && (\n <IconButton\n size=\"small\"\n onClick={() => onRemove(file)}\n // The glyph IS the accessible name without this: a screen\n // reader announces the button as \"multiplication x\".\n aria-label={`Remove ${fileName}`}\n sx={{ flexShrink: 0 }}\n >\n ✕\n </IconButton>\n )}\n </Box>\n );\n })}\n </Stack>\n );\n}\n\n// =============================================================================\n// REJECTION FILES\n// =============================================================================\n\ninterface RejectionFilesProps {\n rejections: FileRejection[];\n}\n\nfunction RejectionFiles({ rejections }: RejectionFilesProps): ReactNode {\n if (rejections.length === 0) return null;\n\n return (\n <Box sx={{ mt: 2 }}>\n {rejections.map(({ file, errors }) => (\n <Box\n key={file.name}\n sx={{\n p: 1,\n mb: 1,\n borderRadius: 1,\n bgcolor: 'error.lighter',\n border: '1px solid',\n borderColor: 'error.light',\n }}\n >\n <Typography variant=\"body2\" color=\"error\">\n {file.name}\n </Typography>\n {errors.map((error) => (\n <Typography key={error.code} variant=\"caption\" color=\"error\">\n {error.message}\n </Typography>\n ))}\n </Box>\n ))}\n </Box>\n );\n}\n\n// =============================================================================\n// FIELD.UPLOAD INNER COMPONENT\n// =============================================================================\n\ninterface FieldUploadInnerProps {\n value: UploadValue;\n error?: { message?: string };\n multiple: boolean;\n thumbnail: boolean;\n disabled?: boolean;\n helperText?: ReactNode;\n placeholder?: ReactNode;\n onRemove?: (file: FileValue) => void;\n onRemoveAll?: () => void;\n slotProps?: FieldUploadProps['slotProps'];\n sx?: SxProps<Theme>;\n dropzoneOptions: Omit<DropzoneOptions, 'onDrop'>;\n setValue: (name: string, value: UploadValue, options?: { shouldValidate?: boolean }) => void;\n name: string;\n}\n\n/**\n * Inner component for FieldUpload to properly use hooks.\n * Extracted to comply with Rules of Hooks.\n */\nfunction FieldUploadInner({\n value,\n error,\n multiple,\n thumbnail,\n disabled,\n helperText,\n placeholder,\n onRemove,\n onRemoveAll,\n slotProps,\n sx,\n dropzoneOptions,\n setValue,\n name,\n}: FieldUploadInnerProps): ReactNode {\n const theme = useTheme();\n const [rejections, setRejections] = useState<FileRejection[]>([]);\n\n const files: FileValue[] = useMemo(() => {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n }, [value]);\n\n const onDrop = useCallback(\n (acceptedFiles: File[], fileRejections: FileRejection[]) => {\n setRejections(fileRejections);\n\n if (acceptedFiles.length === 0) return;\n\n if (multiple) {\n setValue(name, [...files, ...acceptedFiles], { shouldValidate: true });\n } else {\n setValue(name, acceptedFiles[0], { shouldValidate: true });\n }\n },\n [files, multiple, name, setValue]\n );\n\n const handleRemove = useCallback(\n (file: FileValue) => {\n const newFiles = files.filter((f) => f !== file);\n setValue(name, multiple ? newFiles : null, { shouldValidate: true });\n onRemove?.(file);\n },\n [files, multiple, name, onRemove, setValue]\n );\n\n const handleRemoveAll = useCallback(() => {\n setValue(name, multiple ? [] : null, { shouldValidate: true });\n onRemoveAll?.();\n }, [multiple, name, onRemoveAll, setValue]);\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n ...dropzoneOptions,\n multiple,\n disabled,\n onDrop,\n });\n\n const hasError = !!error;\n const hasFiles = files.length > 0;\n\n return (\n <Box {...slotProps?.wrapper}>\n <Box\n {...getRootProps()}\n sx={{\n p: 0,\n outline: 'none',\n borderRadius: 1,\n cursor: disabled ? 'default' : 'pointer',\n overflow: 'hidden',\n border: '1px dashed',\n borderColor: hasError ? 'error.main' : isDragActive ? 'primary.main' : 'divider',\n bgcolor: isDragActive ? alpha(theme.palette.primary.main, 0.08) : 'background.paper',\n transition: theme.transitions.create(['border-color', 'background-color']),\n '&:hover': {\n borderColor: disabled ? 'divider' : 'primary.main',\n bgcolor: disabled ? 'background.paper' : alpha(theme.palette.primary.main, 0.04),\n },\n ...sx,\n }}\n >\n <input {...getInputProps()} />\n {placeholder ?? <UploadPlaceholder isDragActive={isDragActive} disabled={disabled} />}\n </Box>\n\n <RejectionFiles rejections={rejections} />\n\n <FilePreview files={files} thumbnail={thumbnail} onRemove={handleRemove} />\n\n {hasFiles && multiple && onRemoveAll && (\n <Box sx={{ mt: 1, textAlign: 'right' }}>\n <Typography\n component=\"button\"\n variant=\"caption\"\n onClick={handleRemoveAll}\n sx={{\n color: 'error.main',\n cursor: 'pointer',\n border: 'none',\n bgcolor: 'transparent',\n '&:hover': { textDecoration: 'underline' },\n }}\n >\n Remove all\n </Typography>\n </Box>\n )}\n\n {(error?.message || helperText) && (\n <FormHelperText error={hasError} sx={{ mt: 1 }}>\n {error?.message ?? helperText}\n </FormHelperText>\n )}\n </Box>\n );\n}\n\n// =============================================================================\n// FIELD.UPLOAD\n// =============================================================================\n\n/**\n * Field.Upload - File upload with drag & drop and React Hook Form integration.\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.Upload\n * name=\"documents\"\n * multiple\n * accept={{ 'application/pdf': ['.pdf'] }}\n * maxSize={5 * 1024 * 1024}\n * />\n * </FormProvider>\n * ```\n *\n * @example\n * ```tsx\n * // With thumbnail previews\n * <Field.Upload\n * name=\"images\"\n * multiple\n * thumbnail\n * accept={{ 'image/*': [] }}\n * onRemove={(file) => console.log('Removed:', file)}\n * />\n * ```\n */\nexport function FieldUpload({\n name,\n multiple = false,\n thumbnail = false,\n disabled,\n helperText,\n placeholder,\n onRemove,\n onRemoveAll,\n slotProps,\n sx,\n ...dropzoneOptions\n}: FieldUploadProps): ReactNode {\n const { control, setValue } = useFormContext();\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => (\n <FieldUploadInner\n value={field.value}\n error={error}\n multiple={multiple}\n thumbnail={thumbnail}\n disabled={disabled}\n helperText={helperText}\n placeholder={placeholder}\n onRemove={onRemove}\n onRemoveAll={onRemoveAll}\n slotProps={slotProps}\n sx={sx}\n dropzoneOptions={dropzoneOptions}\n setValue={setValue}\n name={name}\n />\n )}\n />\n );\n}\n\n// =============================================================================\n// FIELD.UPLOAD BOX INNER\n// =============================================================================\n\ninterface FieldUploadBoxInnerProps {\n value: FileValue | null;\n error?: { message?: string };\n size: number;\n disabled?: boolean;\n helperText?: ReactNode;\n sx?: SxProps<Theme>;\n dropzoneOptions: Omit<DropzoneOptions, 'onDrop'>;\n setValue: (name: string, value: UploadValue, options?: { shouldValidate?: boolean }) => void;\n name: string;\n}\n\nfunction FieldUploadBoxInner({\n value,\n error,\n size,\n disabled,\n helperText,\n sx,\n dropzoneOptions,\n setValue,\n name,\n}: FieldUploadBoxInnerProps): ReactNode {\n const theme = useTheme();\n\n const onDrop = useCallback(\n (acceptedFiles: File[]) => {\n if (acceptedFiles.length > 0) {\n setValue(name, acceptedFiles[0], { shouldValidate: true });\n }\n },\n [name, setValue]\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n ...dropzoneOptions,\n multiple: false,\n disabled,\n onDrop,\n });\n\n const previewUrl = value ? getPreviewUrl(value) : null;\n const hasError = !!error;\n\n return (\n <Box>\n <Box\n {...getRootProps()}\n sx={{\n width: size,\n height: size,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 1,\n cursor: disabled ? 'default' : 'pointer',\n border: '1px dashed',\n borderColor: hasError ? 'error.main' : isDragActive ? 'primary.main' : 'divider',\n bgcolor: isDragActive ? alpha(theme.palette.primary.main, 0.08) : 'background.paper',\n backgroundImage: previewUrl ? `url(${previewUrl})` : 'none',\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n transition: theme.transitions.create(['border-color', 'background-color']),\n '&:hover': {\n borderColor: disabled ? 'divider' : 'primary.main',\n },\n ...sx,\n }}\n >\n <input {...getInputProps()} />\n {!previewUrl && (\n <Typography\n sx={{\n fontSize: size / 3,\n color: isDragActive ? 'primary.main' : 'text.disabled',\n }}\n >\n +\n </Typography>\n )}\n </Box>\n\n {(error?.message || helperText) && (\n <FormHelperText error={hasError} sx={{ mt: 0.5 }}>\n {error?.message ?? helperText}\n </FormHelperText>\n )}\n </Box>\n );\n}\n\n// =============================================================================\n// FIELD.UPLOAD BOX\n// =============================================================================\n\n/**\n * Field.UploadBox - Compact square upload box for minimal UI.\n *\n * @example\n * ```tsx\n * <Field.UploadBox\n * name=\"thumbnail\"\n * size={80}\n * accept={{ 'image/*': [] }}\n * />\n * ```\n */\nexport function FieldUploadBox({\n name,\n size = 64,\n disabled,\n helperText,\n sx,\n ...dropzoneOptions\n}: FieldUploadBoxProps): ReactNode {\n const { control, setValue } = useFormContext();\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => (\n <FieldUploadBoxInner\n value={field.value}\n error={error}\n size={size}\n disabled={disabled}\n helperText={helperText}\n sx={sx}\n dropzoneOptions={dropzoneOptions}\n setValue={setValue}\n name={name}\n />\n )}\n />\n );\n}\n\n// =============================================================================\n// FIELD.UPLOAD AVATAR INNER\n// =============================================================================\n\ninterface FieldUploadAvatarInnerProps {\n value: FileValue | null;\n error?: { message?: string };\n size: number;\n disabled?: boolean;\n helperText?: ReactNode;\n sx?: SxProps<Theme>;\n dropzoneOptions: Omit<DropzoneOptions, 'onDrop'>;\n setValue: (name: string, value: UploadValue, options?: { shouldValidate?: boolean }) => void;\n name: string;\n}\n\nfunction FieldUploadAvatarInner({\n value,\n error,\n size,\n disabled,\n helperText,\n sx,\n dropzoneOptions,\n setValue,\n name,\n}: FieldUploadAvatarInnerProps): ReactNode {\n const theme = useTheme();\n\n const onDrop = useCallback(\n (acceptedFiles: File[]) => {\n if (acceptedFiles.length > 0) {\n setValue(name, acceptedFiles[0], { shouldValidate: true });\n }\n },\n [name, setValue]\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n ...dropzoneOptions,\n multiple: false,\n disabled,\n accept: dropzoneOptions.accept ?? { 'image/*': [] },\n onDrop,\n });\n\n const previewUrl = value ? getPreviewUrl(value) : null;\n const hasError = !!error;\n\n return (\n <Box sx={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center' }}>\n <Box\n {...getRootProps()}\n sx={{\n width: size,\n height: size,\n borderRadius: '50%',\n cursor: disabled ? 'default' : 'pointer',\n position: 'relative',\n overflow: 'hidden',\n border: '1px dashed',\n borderColor: hasError ? 'error.main' : isDragActive ? 'primary.main' : 'divider',\n transition: theme.transitions.create(['border-color']),\n '&:hover .upload-overlay': {\n opacity: disabled ? 0 : 1,\n },\n ...sx,\n }}\n >\n <input {...getInputProps()} />\n\n <Avatar\n src={previewUrl ?? undefined}\n sx={{\n width: '100%',\n height: '100%',\n bgcolor: 'background.neutral',\n }}\n >\n {!previewUrl && <Typography sx={{ fontSize: size / 4, color: 'text.disabled' }}>📷</Typography>}\n </Avatar>\n\n {/* Hover overlay */}\n <Box\n className=\"upload-overlay\"\n sx={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: alpha(theme.palette.grey[900], 0.64),\n color: 'common.white',\n opacity: isDragActive ? 1 : 0,\n transition: theme.transitions.create('opacity'),\n }}\n >\n <Typography sx={{ fontSize: size / 6 }}>📷</Typography>\n <Typography variant=\"caption\">{previewUrl ? 'Update' : 'Upload'}</Typography>\n </Box>\n </Box>\n\n {(error?.message || helperText) && (\n <FormHelperText error={hasError} sx={{ mt: 1, textAlign: 'center' }}>\n {error?.message ?? helperText}\n </FormHelperText>\n )}\n </Box>\n );\n}\n\n// =============================================================================\n// FIELD.UPLOAD AVATAR\n// =============================================================================\n\n/**\n * Field.UploadAvatar - Circular avatar upload with preview.\n *\n * @example\n * ```tsx\n * <Field.UploadAvatar\n * name=\"avatar\"\n * size={120}\n * accept={{ 'image/*': [] }}\n * maxSize={3 * 1024 * 1024}\n * />\n * ```\n */\nexport function FieldUploadAvatar({\n name,\n size = 144,\n disabled,\n helperText,\n sx,\n ...dropzoneOptions\n}: FieldUploadAvatarProps): ReactNode {\n const { control, setValue } = useFormContext();\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => (\n <FieldUploadAvatarInner\n value={field.value}\n error={error}\n size={size}\n disabled={disabled}\n helperText={helperText}\n sx={sx}\n dropzoneOptions={dropzoneOptions}\n setValue={setValue}\n name={name}\n />\n )}\n />\n );\n}\n","'use client';\n\n/**\n * Field.Phone Component\n *\n * React Hook Form integrated international phone number input.\n * Provides country selection with flag display and validation.\n *\n * @module components/field\n */\n\nimport type { ReactNode, ChangeEvent } from 'react';\nimport { useState, useCallback, useMemo, useRef } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport IconButton from '@mui/material/IconButton';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport type { TextFieldProps } from '@mui/material/TextField';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Country data structure\n */\nexport interface CountryData {\n /** ISO 3166-1 alpha-2 code */\n code: string;\n /** Country name */\n name: string;\n /** Dial code with + prefix */\n dialCode: string;\n /** Flag emoji */\n flag: string;\n}\n\n/**\n * Props for Field.Phone component.\n */\nexport interface FieldPhoneProps extends Omit<TextFieldProps, 'name' | 'value' | 'onChange'> {\n /** Field name in the form */\n name: string;\n /** Default country code (e.g., 'US') */\n defaultCountry?: string;\n /** Preferred countries shown at top of list */\n preferredCountries?: string[];\n /** Hide country selector */\n hideCountrySelect?: boolean;\n /** Custom countries data (overrides default) */\n countries?: CountryData[];\n}\n\n// =============================================================================\n// DEFAULT COUNTRIES DATA\n// =============================================================================\n\nconst DEFAULT_COUNTRIES: CountryData[] = [\n { code: 'US', name: 'United States', dialCode: '+1', flag: '🇺🇸' },\n { code: 'GB', name: 'United Kingdom', dialCode: '+44', flag: '🇬🇧' },\n { code: 'CA', name: 'Canada', dialCode: '+1', flag: '🇨🇦' },\n { code: 'AU', name: 'Australia', dialCode: '+61', flag: '🇦🇺' },\n { code: 'DE', name: 'Germany', dialCode: '+49', flag: '🇩🇪' },\n { code: 'FR', name: 'France', dialCode: '+33', flag: '🇫🇷' },\n { code: 'IT', name: 'Italy', dialCode: '+39', flag: '🇮🇹' },\n { code: 'ES', name: 'Spain', dialCode: '+34', flag: '🇪🇸' },\n { code: 'JP', name: 'Japan', dialCode: '+81', flag: '🇯🇵' },\n { code: 'CN', name: 'China', dialCode: '+86', flag: '🇨🇳' },\n { code: 'KR', name: 'South Korea', dialCode: '+82', flag: '🇰🇷' },\n { code: 'IN', name: 'India', dialCode: '+91', flag: '🇮🇳' },\n { code: 'BR', name: 'Brazil', dialCode: '+55', flag: '🇧🇷' },\n { code: 'MX', name: 'Mexico', dialCode: '+52', flag: '🇲🇽' },\n { code: 'RU', name: 'Russia', dialCode: '+7', flag: '🇷🇺' },\n { code: 'NL', name: 'Netherlands', dialCode: '+31', flag: '🇳🇱' },\n { code: 'BE', name: 'Belgium', dialCode: '+32', flag: '🇧🇪' },\n { code: 'CH', name: 'Switzerland', dialCode: '+41', flag: '🇨🇭' },\n { code: 'AT', name: 'Austria', dialCode: '+43', flag: '🇦🇹' },\n { code: 'SE', name: 'Sweden', dialCode: '+46', flag: '🇸🇪' },\n { code: 'NO', name: 'Norway', dialCode: '+47', flag: '🇳🇴' },\n { code: 'DK', name: 'Denmark', dialCode: '+45', flag: '🇩🇰' },\n { code: 'FI', name: 'Finland', dialCode: '+358', flag: '🇫🇮' },\n { code: 'PL', name: 'Poland', dialCode: '+48', flag: '🇵🇱' },\n { code: 'PT', name: 'Portugal', dialCode: '+351', flag: '🇵🇹' },\n { code: 'GR', name: 'Greece', dialCode: '+30', flag: '🇬🇷' },\n { code: 'IE', name: 'Ireland', dialCode: '+353', flag: '🇮🇪' },\n { code: 'NZ', name: 'New Zealand', dialCode: '+64', flag: '🇳🇿' },\n { code: 'SG', name: 'Singapore', dialCode: '+65', flag: '🇸🇬' },\n { code: 'HK', name: 'Hong Kong', dialCode: '+852', flag: '🇭🇰' },\n { code: 'AE', name: 'UAE', dialCode: '+971', flag: '🇦🇪' },\n { code: 'SA', name: 'Saudi Arabia', dialCode: '+966', flag: '🇸🇦' },\n { code: 'IL', name: 'Israel', dialCode: '+972', flag: '🇮🇱' },\n { code: 'TR', name: 'Turkey', dialCode: '+90', flag: '🇹🇷' },\n { code: 'ZA', name: 'South Africa', dialCode: '+27', flag: '🇿🇦' },\n { code: 'EG', name: 'Egypt', dialCode: '+20', flag: '🇪🇬' },\n { code: 'NG', name: 'Nigeria', dialCode: '+234', flag: '🇳🇬' },\n { code: 'KE', name: 'Kenya', dialCode: '+254', flag: '🇰🇪' },\n { code: 'AR', name: 'Argentina', dialCode: '+54', flag: '🇦🇷' },\n { code: 'CL', name: 'Chile', dialCode: '+56', flag: '🇨🇱' },\n { code: 'CO', name: 'Colombia', dialCode: '+57', flag: '🇨🇴' },\n { code: 'PE', name: 'Peru', dialCode: '+51', flag: '🇵🇪' },\n { code: 'VE', name: 'Venezuela', dialCode: '+58', flag: '🇻🇪' },\n { code: 'TH', name: 'Thailand', dialCode: '+66', flag: '🇹🇭' },\n { code: 'VN', name: 'Vietnam', dialCode: '+84', flag: '🇻🇳' },\n { code: 'MY', name: 'Malaysia', dialCode: '+60', flag: '🇲🇾' },\n { code: 'ID', name: 'Indonesia', dialCode: '+62', flag: '🇮🇩' },\n { code: 'PH', name: 'Philippines', dialCode: '+63', flag: '🇵🇭' },\n { code: 'PK', name: 'Pakistan', dialCode: '+92', flag: '🇵🇰' },\n { code: 'BD', name: 'Bangladesh', dialCode: '+880', flag: '🇧🇩' },\n { code: 'UA', name: 'Ukraine', dialCode: '+380', flag: '🇺🇦' },\n { code: 'CZ', name: 'Czech Republic', dialCode: '+420', flag: '🇨🇿' },\n { code: 'RO', name: 'Romania', dialCode: '+40', flag: '🇷🇴' },\n { code: 'HU', name: 'Hungary', dialCode: '+36', flag: '🇭🇺' },\n];\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Format phone number by removing non-digit characters except +\n */\nfunction formatPhoneNumber(value: string): string {\n return value.replace(/[^\\d+]/g, '');\n}\n\n/**\n * Detect country from phone number based on dial code\n */\nfunction detectCountryFromNumber(phoneNumber: string, countries: CountryData[]): CountryData | null {\n if (!phoneNumber.startsWith('+')) return null;\n\n // Sort by dial code length (longer first) for more specific matching\n const sortedCountries = [...countries].sort((a, b) => b.dialCode.length - a.dialCode.length);\n\n for (const country of sortedCountries) {\n if (phoneNumber.startsWith(country.dialCode)) {\n return country;\n }\n }\n\n return null;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Field.Phone - International phone input with React Hook Form integration.\n *\n * Features:\n * - Country selector with flags\n * - Automatic country detection from dial code\n * - Preferred countries list\n * - Phone number formatting\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.Phone\n * name=\"phone\"\n * label=\"Phone Number\"\n * defaultCountry=\"US\"\n * />\n * </FormProvider>\n * ```\n *\n * @example\n * ```tsx\n * // With preferred countries\n * <Field.Phone\n * name=\"mobile\"\n * label=\"Mobile\"\n * defaultCountry=\"GB\"\n * preferredCountries={['GB', 'US', 'DE', 'FR']}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Hide country selector\n * <Field.Phone\n * name=\"phone\"\n * label=\"Phone\"\n * hideCountrySelect\n * defaultCountry=\"US\"\n * />\n * ```\n */\nexport function FieldPhone({\n name,\n label,\n helperText,\n defaultCountry = 'US',\n preferredCountries = [],\n hideCountrySelect = false,\n countries: customCountries,\n disabled,\n ...other\n}: FieldPhoneProps): ReactNode {\n const { control } = useFormContext();\n const countries = customCountries ?? DEFAULT_COUNTRIES;\n const anchorRef = useRef<HTMLButtonElement>(null);\n const [menuOpen, setMenuOpen] = useState(false);\n\n // Get default country data\n const defaultCountryData = useMemo(\n () => countries.find((c) => c.code === defaultCountry) ?? countries[0],\n [countries, defaultCountry]\n );\n\n // Sort countries with preferred at top\n const sortedCountries = useMemo(() => {\n if (preferredCountries.length === 0) return countries;\n\n const preferred = preferredCountries\n .map((code) => countries.find((c) => c.code === code))\n .filter(Boolean) as CountryData[];\n\n const rest = countries.filter((c) => !preferredCountries.includes(c.code));\n\n return [...preferred, ...rest];\n }, [countries, preferredCountries]);\n\n const handleOpenMenu = useCallback(() => {\n if (!disabled) {\n setMenuOpen(true);\n }\n }, [disabled]);\n\n const handleCloseMenu = useCallback(() => {\n setMenuOpen(false);\n }, []);\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n // Detect country from current value\n const detectedCountry = field.value ? detectCountryFromNumber(field.value, countries) : null;\n const selectedCountry = detectedCountry ?? defaultCountryData;\n\n const handleCountrySelect = (country: CountryData) => {\n // Update value with new dial code\n const currentNumber = field.value ?? '';\n const numberWithoutCode = currentNumber.replace(/^\\+\\d+\\s*/, '');\n field.onChange(`${country.dialCode}${numberWithoutCode}`);\n handleCloseMenu();\n };\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n const rawValue = e.target.value;\n const formatted = formatPhoneNumber(rawValue);\n\n // If user starts typing without +, prepend country code\n if (formatted && !formatted.startsWith('+')) {\n field.onChange(`${selectedCountry.dialCode}${formatted}`);\n } else {\n field.onChange(formatted);\n }\n };\n\n // Display value: show number without leading dial code for cleaner UI\n const displayValue = field.value ?? '';\n\n return (\n <>\n <TextField\n {...other}\n label={label}\n value={displayValue}\n onChange={handleInputChange}\n disabled={disabled}\n error={!!error}\n helperText={error?.message ?? helperText}\n fullWidth\n slotProps={{\n input: {\n startAdornment: !hideCountrySelect && (\n <InputAdornment position=\"start\">\n <IconButton\n ref={anchorRef}\n onClick={handleOpenMenu}\n disabled={disabled}\n size=\"small\"\n edge=\"start\"\n aria-label={`Select country, current: ${selectedCountry.name}`}\n aria-haspopup=\"listbox\"\n aria-expanded={menuOpen}\n sx={{ mr: -0.5 }}\n >\n <Box\n component=\"span\"\n sx={{\n fontSize: '1.25rem',\n lineHeight: 1,\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {selectedCountry.flag}\n </Box>\n </IconButton>\n <Typography\n variant=\"body2\"\n sx={{\n color: \"text.secondary\",\n mr: 0.5,\n minWidth: 40\n }}>\n {selectedCountry.dialCode}\n </Typography>\n </InputAdornment>\n ),\n },\n htmlInput: {\n inputMode: 'tel',\n autoComplete: 'tel',\n },\n }}\n />\n <Menu\n anchorEl={anchorRef.current}\n open={menuOpen}\n onClose={handleCloseMenu}\n slotProps={{\n paper: {\n sx: {\n maxHeight: 300,\n minWidth: 280,\n },\n },\n }}\n >\n {sortedCountries.map((country, index) => (\n <MenuItem\n key={country.code}\n selected={country.code === selectedCountry.code}\n onClick={() => handleCountrySelect(country)}\n divider={preferredCountries.length > 0 && index === preferredCountries.length - 1}\n >\n <ListItemIcon sx={{ fontSize: '1.25rem', minWidth: 36 }}>{country.flag}</ListItemIcon>\n <ListItemText primary={country.name} secondary={country.dialCode} />\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Field.CountrySelect Component\n *\n * React Hook Form integrated country selector with flag icons.\n * Provides searchable country selection with ISO code support.\n *\n * @module components/field\n */\n\nimport type { ReactNode, SyntheticEvent } from 'react';\nimport { useMemo } from 'react';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\nimport Box from '@mui/material/Box';\nimport type { AutocompleteProps } from '@mui/material/Autocomplete';\nimport type { TextFieldProps } from '@mui/material/TextField';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Country data structure\n */\nexport interface Country {\n /** ISO 3166-1 alpha-2 code */\n code: string;\n /** Country name */\n label: string;\n /** Dial code with + prefix */\n phone: string;\n /** Flag emoji */\n flag: string;\n}\n\n/**\n * Props for Field.CountrySelect component.\n */\nexport interface FieldCountrySelectProps extends Omit<\n AutocompleteProps<Country, boolean, boolean, false>,\n 'options' | 'renderInput' | 'value' | 'onChange' | 'getOptionLabel' | 'isOptionEqualToValue'\n> {\n /** Field name in the form */\n name: string;\n /** Field label */\n label?: string;\n /** Placeholder text */\n placeholder?: string;\n /** Helper text shown below the field */\n helperText?: ReactNode;\n /** Return value type: 'code' returns ISO code, 'label' returns country name */\n getValue?: 'code' | 'label' | 'full';\n /** Custom countries data (overrides default) */\n countries?: Country[];\n /** TextField props for customization */\n textFieldProps?: Partial<TextFieldProps>;\n}\n\n// =============================================================================\n// DEFAULT COUNTRIES DATA\n// =============================================================================\n\nconst DEFAULT_COUNTRIES: Country[] = [\n { code: 'AD', label: 'Andorra', phone: '+376', flag: '🇦🇩' },\n { code: 'AE', label: 'United Arab Emirates', phone: '+971', flag: '🇦🇪' },\n { code: 'AF', label: 'Afghanistan', phone: '+93', flag: '🇦🇫' },\n { code: 'AG', label: 'Antigua and Barbuda', phone: '+1-268', flag: '🇦🇬' },\n { code: 'AI', label: 'Anguilla', phone: '+1-264', flag: '🇦🇮' },\n { code: 'AL', label: 'Albania', phone: '+355', flag: '🇦🇱' },\n { code: 'AM', label: 'Armenia', phone: '+374', flag: '🇦🇲' },\n { code: 'AO', label: 'Angola', phone: '+244', flag: '🇦🇴' },\n { code: 'AR', label: 'Argentina', phone: '+54', flag: '🇦🇷' },\n { code: 'AT', label: 'Austria', phone: '+43', flag: '🇦🇹' },\n { code: 'AU', label: 'Australia', phone: '+61', flag: '🇦🇺' },\n { code: 'AZ', label: 'Azerbaijan', phone: '+994', flag: '🇦🇿' },\n { code: 'BA', label: 'Bosnia and Herzegovina', phone: '+387', flag: '🇧🇦' },\n { code: 'BB', label: 'Barbados', phone: '+1-246', flag: '🇧🇧' },\n { code: 'BD', label: 'Bangladesh', phone: '+880', flag: '🇧🇩' },\n { code: 'BE', label: 'Belgium', phone: '+32', flag: '🇧🇪' },\n { code: 'BF', label: 'Burkina Faso', phone: '+226', flag: '🇧🇫' },\n { code: 'BG', label: 'Bulgaria', phone: '+359', flag: '🇧🇬' },\n { code: 'BH', label: 'Bahrain', phone: '+973', flag: '🇧🇭' },\n { code: 'BI', label: 'Burundi', phone: '+257', flag: '🇧🇮' },\n { code: 'BJ', label: 'Benin', phone: '+229', flag: '🇧🇯' },\n { code: 'BN', label: 'Brunei', phone: '+673', flag: '🇧🇳' },\n { code: 'BO', label: 'Bolivia', phone: '+591', flag: '🇧🇴' },\n { code: 'BR', label: 'Brazil', phone: '+55', flag: '🇧🇷' },\n { code: 'BS', label: 'Bahamas', phone: '+1-242', flag: '🇧🇸' },\n { code: 'BT', label: 'Bhutan', phone: '+975', flag: '🇧🇹' },\n { code: 'BW', label: 'Botswana', phone: '+267', flag: '🇧🇼' },\n { code: 'BY', label: 'Belarus', phone: '+375', flag: '🇧🇾' },\n { code: 'BZ', label: 'Belize', phone: '+501', flag: '🇧🇿' },\n { code: 'CA', label: 'Canada', phone: '+1', flag: '🇨🇦' },\n { code: 'CH', label: 'Switzerland', phone: '+41', flag: '🇨🇭' },\n { code: 'CL', label: 'Chile', phone: '+56', flag: '🇨🇱' },\n { code: 'CN', label: 'China', phone: '+86', flag: '🇨🇳' },\n { code: 'CO', label: 'Colombia', phone: '+57', flag: '🇨🇴' },\n { code: 'CR', label: 'Costa Rica', phone: '+506', flag: '🇨🇷' },\n { code: 'CU', label: 'Cuba', phone: '+53', flag: '🇨🇺' },\n { code: 'CY', label: 'Cyprus', phone: '+357', flag: '🇨🇾' },\n { code: 'CZ', label: 'Czech Republic', phone: '+420', flag: '🇨🇿' },\n { code: 'DE', label: 'Germany', phone: '+49', flag: '🇩🇪' },\n { code: 'DJ', label: 'Djibouti', phone: '+253', flag: '🇩🇯' },\n { code: 'DK', label: 'Denmark', phone: '+45', flag: '🇩🇰' },\n { code: 'DM', label: 'Dominica', phone: '+1-767', flag: '🇩🇲' },\n { code: 'DO', label: 'Dominican Republic', phone: '+1-809', flag: '🇩🇴' },\n { code: 'DZ', label: 'Algeria', phone: '+213', flag: '🇩🇿' },\n { code: 'EC', label: 'Ecuador', phone: '+593', flag: '🇪🇨' },\n { code: 'EE', label: 'Estonia', phone: '+372', flag: '🇪🇪' },\n { code: 'EG', label: 'Egypt', phone: '+20', flag: '🇪🇬' },\n { code: 'ES', label: 'Spain', phone: '+34', flag: '🇪🇸' },\n { code: 'ET', label: 'Ethiopia', phone: '+251', flag: '🇪🇹' },\n { code: 'FI', label: 'Finland', phone: '+358', flag: '🇫🇮' },\n { code: 'FJ', label: 'Fiji', phone: '+679', flag: '🇫🇯' },\n { code: 'FR', label: 'France', phone: '+33', flag: '🇫🇷' },\n { code: 'GA', label: 'Gabon', phone: '+241', flag: '🇬🇦' },\n { code: 'GB', label: 'United Kingdom', phone: '+44', flag: '🇬🇧' },\n { code: 'GE', label: 'Georgia', phone: '+995', flag: '🇬🇪' },\n { code: 'GH', label: 'Ghana', phone: '+233', flag: '🇬🇭' },\n { code: 'GR', label: 'Greece', phone: '+30', flag: '🇬🇷' },\n { code: 'GT', label: 'Guatemala', phone: '+502', flag: '🇬🇹' },\n { code: 'GY', label: 'Guyana', phone: '+592', flag: '🇬🇾' },\n { code: 'HK', label: 'Hong Kong', phone: '+852', flag: '🇭🇰' },\n { code: 'HN', label: 'Honduras', phone: '+504', flag: '🇭🇳' },\n { code: 'HR', label: 'Croatia', phone: '+385', flag: '🇭🇷' },\n { code: 'HT', label: 'Haiti', phone: '+509', flag: '🇭🇹' },\n { code: 'HU', label: 'Hungary', phone: '+36', flag: '🇭🇺' },\n { code: 'ID', label: 'Indonesia', phone: '+62', flag: '🇮🇩' },\n { code: 'IE', label: 'Ireland', phone: '+353', flag: '🇮🇪' },\n { code: 'IL', label: 'Israel', phone: '+972', flag: '🇮🇱' },\n { code: 'IN', label: 'India', phone: '+91', flag: '🇮🇳' },\n { code: 'IQ', label: 'Iraq', phone: '+964', flag: '🇮🇶' },\n { code: 'IR', label: 'Iran', phone: '+98', flag: '🇮🇷' },\n { code: 'IS', label: 'Iceland', phone: '+354', flag: '🇮🇸' },\n { code: 'IT', label: 'Italy', phone: '+39', flag: '🇮🇹' },\n { code: 'JM', label: 'Jamaica', phone: '+1-876', flag: '🇯🇲' },\n { code: 'JO', label: 'Jordan', phone: '+962', flag: '🇯🇴' },\n { code: 'JP', label: 'Japan', phone: '+81', flag: '🇯🇵' },\n { code: 'KE', label: 'Kenya', phone: '+254', flag: '🇰🇪' },\n { code: 'KG', label: 'Kyrgyzstan', phone: '+996', flag: '🇰🇬' },\n { code: 'KH', label: 'Cambodia', phone: '+855', flag: '🇰🇭' },\n { code: 'KR', label: 'South Korea', phone: '+82', flag: '🇰🇷' },\n { code: 'KW', label: 'Kuwait', phone: '+965', flag: '🇰🇼' },\n { code: 'KZ', label: 'Kazakhstan', phone: '+7', flag: '🇰🇿' },\n { code: 'LA', label: 'Laos', phone: '+856', flag: '🇱🇦' },\n { code: 'LB', label: 'Lebanon', phone: '+961', flag: '🇱🇧' },\n { code: 'LK', label: 'Sri Lanka', phone: '+94', flag: '🇱🇰' },\n { code: 'LR', label: 'Liberia', phone: '+231', flag: '🇱🇷' },\n { code: 'LT', label: 'Lithuania', phone: '+370', flag: '🇱🇹' },\n { code: 'LU', label: 'Luxembourg', phone: '+352', flag: '🇱🇺' },\n { code: 'LV', label: 'Latvia', phone: '+371', flag: '🇱🇻' },\n { code: 'LY', label: 'Libya', phone: '+218', flag: '🇱🇾' },\n { code: 'MA', label: 'Morocco', phone: '+212', flag: '🇲🇦' },\n { code: 'MC', label: 'Monaco', phone: '+377', flag: '🇲🇨' },\n { code: 'MD', label: 'Moldova', phone: '+373', flag: '🇲🇩' },\n { code: 'ME', label: 'Montenegro', phone: '+382', flag: '🇲🇪' },\n { code: 'MG', label: 'Madagascar', phone: '+261', flag: '🇲🇬' },\n { code: 'MK', label: 'North Macedonia', phone: '+389', flag: '🇲🇰' },\n { code: 'ML', label: 'Mali', phone: '+223', flag: '🇲🇱' },\n { code: 'MM', label: 'Myanmar', phone: '+95', flag: '🇲🇲' },\n { code: 'MN', label: 'Mongolia', phone: '+976', flag: '🇲🇳' },\n { code: 'MO', label: 'Macau', phone: '+853', flag: '🇲🇴' },\n { code: 'MT', label: 'Malta', phone: '+356', flag: '🇲🇹' },\n { code: 'MU', label: 'Mauritius', phone: '+230', flag: '🇲🇺' },\n { code: 'MV', label: 'Maldives', phone: '+960', flag: '🇲🇻' },\n { code: 'MW', label: 'Malawi', phone: '+265', flag: '🇲🇼' },\n { code: 'MX', label: 'Mexico', phone: '+52', flag: '🇲🇽' },\n { code: 'MY', label: 'Malaysia', phone: '+60', flag: '🇲🇾' },\n { code: 'MZ', label: 'Mozambique', phone: '+258', flag: '🇲🇿' },\n { code: 'NA', label: 'Namibia', phone: '+264', flag: '🇳🇦' },\n { code: 'NE', label: 'Niger', phone: '+227', flag: '🇳🇪' },\n { code: 'NG', label: 'Nigeria', phone: '+234', flag: '🇳🇬' },\n { code: 'NI', label: 'Nicaragua', phone: '+505', flag: '🇳🇮' },\n { code: 'NL', label: 'Netherlands', phone: '+31', flag: '🇳🇱' },\n { code: 'NO', label: 'Norway', phone: '+47', flag: '🇳🇴' },\n { code: 'NP', label: 'Nepal', phone: '+977', flag: '🇳🇵' },\n { code: 'NZ', label: 'New Zealand', phone: '+64', flag: '🇳🇿' },\n { code: 'OM', label: 'Oman', phone: '+968', flag: '🇴🇲' },\n { code: 'PA', label: 'Panama', phone: '+507', flag: '🇵🇦' },\n { code: 'PE', label: 'Peru', phone: '+51', flag: '🇵🇪' },\n { code: 'PG', label: 'Papua New Guinea', phone: '+675', flag: '🇵🇬' },\n { code: 'PH', label: 'Philippines', phone: '+63', flag: '🇵🇭' },\n { code: 'PK', label: 'Pakistan', phone: '+92', flag: '🇵🇰' },\n { code: 'PL', label: 'Poland', phone: '+48', flag: '🇵🇱' },\n { code: 'PT', label: 'Portugal', phone: '+351', flag: '🇵🇹' },\n { code: 'PY', label: 'Paraguay', phone: '+595', flag: '🇵🇾' },\n { code: 'QA', label: 'Qatar', phone: '+974', flag: '🇶🇦' },\n { code: 'RO', label: 'Romania', phone: '+40', flag: '🇷🇴' },\n { code: 'RS', label: 'Serbia', phone: '+381', flag: '🇷🇸' },\n { code: 'RU', label: 'Russia', phone: '+7', flag: '🇷🇺' },\n { code: 'RW', label: 'Rwanda', phone: '+250', flag: '🇷🇼' },\n { code: 'SA', label: 'Saudi Arabia', phone: '+966', flag: '🇸🇦' },\n { code: 'SD', label: 'Sudan', phone: '+249', flag: '🇸🇩' },\n { code: 'SE', label: 'Sweden', phone: '+46', flag: '🇸🇪' },\n { code: 'SG', label: 'Singapore', phone: '+65', flag: '🇸🇬' },\n { code: 'SI', label: 'Slovenia', phone: '+386', flag: '🇸🇮' },\n { code: 'SK', label: 'Slovakia', phone: '+421', flag: '🇸🇰' },\n { code: 'SL', label: 'Sierra Leone', phone: '+232', flag: '🇸🇱' },\n { code: 'SN', label: 'Senegal', phone: '+221', flag: '🇸🇳' },\n { code: 'SO', label: 'Somalia', phone: '+252', flag: '🇸🇴' },\n { code: 'SR', label: 'Suriname', phone: '+597', flag: '🇸🇷' },\n { code: 'SV', label: 'El Salvador', phone: '+503', flag: '🇸🇻' },\n { code: 'SY', label: 'Syria', phone: '+963', flag: '🇸🇾' },\n { code: 'TH', label: 'Thailand', phone: '+66', flag: '🇹🇭' },\n { code: 'TJ', label: 'Tajikistan', phone: '+992', flag: '🇹🇯' },\n { code: 'TM', label: 'Turkmenistan', phone: '+993', flag: '🇹🇲' },\n { code: 'TN', label: 'Tunisia', phone: '+216', flag: '🇹🇳' },\n { code: 'TR', label: 'Turkey', phone: '+90', flag: '🇹🇷' },\n { code: 'TT', label: 'Trinidad and Tobago', phone: '+1-868', flag: '🇹🇹' },\n { code: 'TW', label: 'Taiwan', phone: '+886', flag: '🇹🇼' },\n { code: 'TZ', label: 'Tanzania', phone: '+255', flag: '🇹🇿' },\n { code: 'UA', label: 'Ukraine', phone: '+380', flag: '🇺🇦' },\n { code: 'UG', label: 'Uganda', phone: '+256', flag: '🇺🇬' },\n { code: 'US', label: 'United States', phone: '+1', flag: '🇺🇸' },\n { code: 'UY', label: 'Uruguay', phone: '+598', flag: '🇺🇾' },\n { code: 'UZ', label: 'Uzbekistan', phone: '+998', flag: '🇺🇿' },\n { code: 'VE', label: 'Venezuela', phone: '+58', flag: '🇻🇪' },\n { code: 'VN', label: 'Vietnam', phone: '+84', flag: '🇻🇳' },\n { code: 'YE', label: 'Yemen', phone: '+967', flag: '🇾🇪' },\n { code: 'ZA', label: 'South Africa', phone: '+27', flag: '🇿🇦' },\n { code: 'ZM', label: 'Zambia', phone: '+260', flag: '🇿🇲' },\n { code: 'ZW', label: 'Zimbabwe', phone: '+263', flag: '🇿🇼' },\n];\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Field.CountrySelect - Country selector with React Hook Form integration.\n *\n * Features:\n * - Searchable country list with flag icons\n * - Return ISO code, country name, or full object\n * - Custom country data support\n *\n * @example\n * ```tsx\n * <FormProvider {...methods}>\n * <Field.CountrySelect\n * name=\"country\"\n * label=\"Country\"\n * />\n * </FormProvider>\n * ```\n *\n * @example\n * ```tsx\n * // Return ISO code instead of full object\n * <Field.CountrySelect\n * name=\"countryCode\"\n * label=\"Country\"\n * getValue=\"code\"\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Multiple selection\n * <Field.CountrySelect\n * name=\"visitedCountries\"\n * label=\"Countries Visited\"\n * multiple\n * getValue=\"code\"\n * />\n * ```\n */\nexport function FieldCountrySelect({\n name,\n label,\n placeholder,\n helperText,\n getValue = 'full',\n countries: customCountries,\n textFieldProps,\n multiple,\n disabled,\n ...other\n}: FieldCountrySelectProps): ReactNode {\n const { control } = useFormContext();\n const countries = customCountries ?? DEFAULT_COUNTRIES;\n\n // Create a lookup map for finding country by code or label\n const countryMap = useMemo(() => {\n const byCode = new Map<string, Country>();\n const byLabel = new Map<string, Country>();\n for (const country of countries) {\n byCode.set(country.code, country);\n byLabel.set(country.label, country);\n }\n return { byCode, byLabel };\n }, [countries]);\n\n // Find country by code or label\n const findCountry = (v: unknown): Country | null => {\n if (v === null || v === undefined) return null;\n if (typeof v === 'object' && v !== null && 'code' in v) {\n return v as Country;\n }\n if (typeof v === 'string') {\n return countryMap.byCode.get(v) ?? countryMap.byLabel.get(v) ?? null;\n }\n return null;\n };\n\n // Convert stored value back to Country object(s)\n const valueToCountry = (value: unknown): Country | Country[] | null => {\n if (value === null || value === undefined) {\n return multiple ? [] : null;\n }\n\n if (multiple) {\n const values = Array.isArray(value) ? value : [value];\n return values.map(findCountry).filter((c): c is Country => c !== null);\n }\n\n return findCountry(value);\n };\n\n // Convert Country object(s) to storage format\n const countryToValue = (country: Country | Country[] | null): unknown => {\n if (country === null) {\n return multiple ? [] : null;\n }\n\n if (multiple && Array.isArray(country)) {\n if (getValue === 'code') return country.map((c) => c.code);\n if (getValue === 'label') return country.map((c) => c.label);\n return country;\n }\n\n if (!Array.isArray(country)) {\n if (getValue === 'code') return country.code;\n if (getValue === 'label') return country.label;\n return country;\n }\n\n return null;\n };\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n const currentValue = valueToCountry(field.value);\n\n return (\n <Autocomplete\n {...other}\n multiple={multiple}\n disabled={disabled}\n options={countries}\n value={currentValue}\n onChange={(_event: SyntheticEvent, newValue: Country | Country[] | null) => {\n field.onChange(countryToValue(newValue));\n }}\n getOptionLabel={(option: Country) => option.label}\n isOptionEqualToValue={(option: Country, value: Country) => option.code === value.code}\n renderOption={(props, option: Country) => {\n const { key, ...optionProps } = props;\n return (\n <Box key={key} component=\"li\" sx={{ '& > span': { mr: 1.5, flexShrink: 0 } }} {...optionProps}>\n <span style={{ fontSize: '1.25rem' }}>{option.flag}</span>\n {option.label} ({option.code})\n </Box>\n );\n }}\n renderInput={(params) => (\n <TextField\n {...params}\n {...textFieldProps}\n label={label}\n placeholder={placeholder}\n error={!!error}\n helperText={error?.message ?? helperText}\n slotProps={{\n ...params.slotProps,\n ...textFieldProps?.slotProps,\n\n htmlInput: {\n ...params.slotProps.htmlInput,\n autoComplete: 'country-name',\n }\n }}\n />\n )}\n />\n );\n }}\n />\n );\n}\n","'use client';\n\n/**\n * Field.Editor Component\n *\n * Rich text editor with React Hook Form integration.\n * Provides both a basic textarea fallback and a headless API for custom editors (TipTap, etc.)\n *\n * @module components/field\n */\n\nimport type { ReactNode, ComponentProps, ReactElement } from 'react';\nimport { Controller, useFormContext, type RegisterOptions } from 'react-hook-form';\nimport TextField from '@mui/material/TextField';\nimport Box from '@mui/material/Box';\nimport FormControl from '@mui/material/FormControl';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport FormLabel from '@mui/material/FormLabel';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Toolbar configuration for the editor.\n */\nexport interface EditorToolbarConfig {\n /** Enable bold formatting */\n bold?: boolean;\n /** Enable italic formatting */\n italic?: boolean;\n /** Enable underline formatting */\n underline?: boolean;\n /** Enable strikethrough formatting */\n strikethrough?: boolean;\n /** Enable heading levels */\n headings?: boolean | number[];\n /** Enable bullet list */\n bulletList?: boolean;\n /** Enable numbered list */\n orderedList?: boolean;\n /** Enable blockquote */\n blockquote?: boolean;\n /** Enable code block */\n codeBlock?: boolean;\n /** Enable link insertion */\n link?: boolean;\n /** Enable image insertion */\n image?: boolean;\n /** Enable text alignment */\n align?: boolean;\n /** Enable undo/redo */\n history?: boolean;\n}\n\n/**\n * Props passed to custom editor render function.\n */\nexport interface EditorRenderProps {\n /** Current HTML content */\n value: string;\n /** Update handler - call with new HTML content */\n onChange: (html: string) => void;\n /** Blur handler for form validation */\n onBlur: () => void;\n /** Error state */\n error: boolean;\n /** Field name */\n name: string;\n /** Disabled state */\n disabled?: boolean;\n /** Read-only state */\n readOnly?: boolean;\n /** Placeholder text */\n placeholder?: string;\n /** Toolbar configuration */\n toolbar?: EditorToolbarConfig;\n /** Minimum height */\n minHeight?: number | string;\n /** Maximum height */\n maxHeight?: number | string;\n /** Custom CSS class */\n className?: string;\n /** Aria label for accessibility */\n 'aria-label'?: string;\n /** Aria described-by for error messages */\n 'aria-describedby'?: string;\n}\n\n/**\n * Props for Field.Editor component.\n */\nexport interface FieldEditorProps {\n /** Field name in the form */\n name: string;\n /** Field label */\n label?: string;\n /** Helper text displayed below the editor */\n helperText?: ReactNode;\n /** Validation rules for react-hook-form */\n rules?: RegisterOptions;\n /** Placeholder text */\n placeholder?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Read-only state */\n readOnly?: boolean;\n /** Toolbar configuration */\n toolbar?: EditorToolbarConfig;\n /** Minimum height */\n minHeight?: number | string;\n /** Maximum height */\n maxHeight?: number | string;\n /** Required field indicator */\n required?: boolean;\n /** Full width */\n fullWidth?: boolean;\n /** Custom editor render function (for TipTap, etc.) */\n renderEditor?: (props: EditorRenderProps) => ReactElement;\n /** Additional props for the wrapper Box */\n sx?: ComponentProps<typeof Box>['sx'];\n /** Aria label for accessibility */\n 'aria-label'?: string;\n}\n\n/**\n * Default toolbar configuration.\n */\nexport const DEFAULT_EDITOR_TOOLBAR: EditorToolbarConfig = {\n bold: true,\n italic: true,\n underline: true,\n headings: [1, 2, 3],\n bulletList: true,\n orderedList: true,\n link: true,\n history: true,\n};\n\n// =============================================================================\n// BASIC EDITOR (FALLBACK)\n// =============================================================================\n\n/**\n * Basic textarea-based editor as fallback.\n */\nfunction BasicEditor({\n value,\n onChange,\n onBlur,\n error,\n name,\n disabled,\n readOnly,\n placeholder,\n minHeight = 200,\n maxHeight,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n}: EditorRenderProps): ReactNode {\n return (\n <TextField\n multiline\n fullWidth\n minRows={6}\n maxRows={maxHeight ? 20 : undefined}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n error={error}\n disabled={disabled}\n slotProps={{\n input: {\n readOnly,\n },\n htmlInput: {\n 'aria-label': ariaLabel || name,\n 'aria-describedby': ariaDescribedBy,\n },\n }}\n placeholder={placeholder}\n sx={{\n '& .MuiOutlinedInput-root': {\n minHeight,\n maxHeight,\n alignItems: 'flex-start',\n },\n '& .MuiInputBase-input': {\n resize: 'vertical',\n },\n }}\n />\n );\n}\n\n// =============================================================================\n// FIELD.EDITOR COMPONENT\n// =============================================================================\n\n/**\n * Field.Editor - Rich text editor with React Hook Form integration.\n *\n * Supports both a basic textarea fallback and custom editor implementations.\n *\n * @example\n * ```tsx\n * // Basic usage (textarea fallback)\n * <FormProvider {...methods}>\n * <Field.Editor\n * name=\"content\"\n * label=\"Article Content\"\n * placeholder=\"Write your article...\"\n * minHeight={300}\n * />\n * </FormProvider>\n *\n * // With custom TipTap editor\n * <Field.Editor\n * name=\"content\"\n * label=\"Article Content\"\n * renderEditor={({ value, onChange, onBlur, error }) => (\n * <TipTapEditor\n * content={value}\n * onUpdate={({ editor }) => onChange(editor.getHTML())}\n * onBlur={onBlur}\n * editorProps={{\n * attributes: {\n * class: error ? 'editor-error' : '',\n * },\n * }}\n * />\n * )}\n * />\n * ```\n */\nexport function FieldEditor({\n name,\n label,\n helperText,\n rules,\n placeholder,\n disabled,\n readOnly,\n toolbar = DEFAULT_EDITOR_TOOLBAR,\n minHeight = 200,\n maxHeight,\n required,\n fullWidth = true,\n renderEditor,\n sx,\n 'aria-label': ariaLabel,\n}: FieldEditorProps): ReactNode {\n const { control } = useFormContext();\n const errorId = `${name}-error`;\n const helperId = `${name}-helper`;\n const describedBy = [helperText ? helperId : null, errorId].filter(Boolean).join(' ') || undefined;\n\n return (\n <Controller\n name={name}\n control={control}\n rules={rules}\n render={({ field, fieldState: { error } }) => (\n <FormControl fullWidth={fullWidth} error={!!error} disabled={disabled} required={required} sx={sx}>\n {label && (\n <FormLabel htmlFor={name} sx={{ mb: 1, fontWeight: 500 }}>\n {label}\n </FormLabel>\n )}\n\n {renderEditor ? (\n // Custom editor implementation\n (renderEditor({\n value: field.value ?? '',\n onChange: field.onChange,\n onBlur: field.onBlur,\n error: !!error,\n name,\n disabled,\n readOnly,\n placeholder,\n toolbar,\n minHeight,\n maxHeight,\n 'aria-label': ariaLabel || label || name,\n 'aria-describedby': describedBy,\n }))\n ) : (\n // Basic textarea fallback\n (<BasicEditor\n value={field.value ?? ''}\n onChange={field.onChange}\n onBlur={field.onBlur}\n error={!!error}\n name={name}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n toolbar={toolbar}\n minHeight={minHeight}\n maxHeight={maxHeight}\n aria-label={ariaLabel || label || name}\n aria-describedby={describedBy}\n />)\n )}\n\n {(error?.message || helperText) && (\n <FormHelperText id={error ? errorId : helperId} error={!!error}>\n {error?.message ?? helperText}\n </FormHelperText>\n )}\n </FormControl>\n )}\n />\n );\n}\n\n// =============================================================================\n// FIELD.CUSTOM EDITOR (RENDER PROP PATTERN)\n// =============================================================================\n\n/**\n * Props for Field.CustomEditor component.\n */\nexport interface FieldCustomEditorProps {\n /** Field name in the form */\n name: string;\n /** Field label */\n label?: string;\n /** Helper text displayed below the editor */\n helperText?: ReactNode;\n /** Validation rules for react-hook-form */\n rules?: RegisterOptions;\n /** Required field indicator */\n required?: boolean;\n /** Full width */\n fullWidth?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Additional props for the wrapper Box */\n sx?: ComponentProps<typeof Box>['sx'];\n /** Render function for custom editor */\n children: (props: {\n value: string;\n onChange: (value: string) => void;\n onBlur: () => void;\n error: boolean;\n errorMessage?: string;\n name: string;\n disabled?: boolean;\n }) => ReactElement;\n}\n\n/**\n * Field.CustomEditor - Headless editor field with render prop pattern.\n *\n * Provides maximum flexibility for integrating any editor library.\n *\n * @example\n * ```tsx\n * import { useEditor, EditorContent } from '@tiptap/react';\n * import StarterKit from '@tiptap/starter-kit';\n *\n * function ArticleForm() {\n * return (\n * <FormProvider {...methods}>\n * <Field.CustomEditor name=\"content\" label=\"Content\" required>\n * {({ value, onChange, onBlur, error }) => {\n * const editor = useEditor({\n * extensions: [StarterKit],\n * content: value,\n * onUpdate: ({ editor }) => onChange(editor.getHTML()),\n * onBlur: () => onBlur(),\n * });\n *\n * return (\n * <Box sx={{ border: error ? '1px solid red' : '1px solid gray' }}>\n * <EditorContent editor={editor} />\n * </Box>\n * );\n * }}\n * </Field.CustomEditor>\n * </FormProvider>\n * );\n * }\n * ```\n */\nexport function FieldCustomEditor({\n name,\n label,\n helperText,\n rules,\n required,\n fullWidth = true,\n disabled,\n sx,\n children,\n}: FieldCustomEditorProps): ReactNode {\n const { control } = useFormContext();\n const errorId = `${name}-error`;\n\n return (\n <Controller\n name={name}\n control={control}\n rules={rules}\n render={({ field, fieldState: { error } }) => (\n <FormControl fullWidth={fullWidth} error={!!error} disabled={disabled} required={required} sx={sx}>\n {label && (\n <FormLabel htmlFor={name} sx={{ mb: 1, fontWeight: 500 }}>\n {label}\n </FormLabel>\n )}\n\n {children({\n value: field.value ?? '',\n onChange: field.onChange,\n onBlur: field.onBlur,\n error: !!error,\n errorMessage: error?.message,\n name,\n disabled,\n })}\n\n {(error?.message || helperText) && (\n <FormHelperText id={errorId} error={!!error}>\n {error?.message ?? helperText}\n </FormHelperText>\n )}\n </FormControl>\n )}\n />\n );\n}\n","/**\n * Field Namespace\n *\n * React Hook Form integrated form fields organized under a single namespace.\n * Provides a clean, consistent API for form building.\n *\n * @example\n * ```tsx\n * import { Field } from '@omnitron-dev/prism';\n *\n * function ProfileForm() {\n * const methods = useForm<ProfileData>();\n *\n * return (\n * <FormProvider {...methods}>\n * <form onSubmit={methods.handleSubmit(onSubmit)}>\n * <Field.Text name=\"name\" label=\"Full Name\" />\n * <Field.Text name=\"email\" label=\"Email\" type=\"email\" />\n * <Field.Select name=\"country\" label=\"Country\" options={countries} />\n * <Field.Number name=\"age\" label=\"Age\" min={0} max={150} />\n * <Field.Checkbox name=\"terms\" label=\"I agree to terms\" />\n * <Field.Switch name=\"newsletter\" label=\"Subscribe\" />\n * <Field.Phone name=\"phone\" label=\"Phone\" defaultCountry=\"US\" />\n * <Field.Upload name=\"avatar\" />\n * </form>\n * </FormProvider>\n * );\n * }\n * ```\n *\n * @module components/field\n */\n\n// Base fields\nimport { FieldText } from './field-text.js';\nimport { FieldSelect } from './field-select.js';\nimport { FieldCheckbox } from './field-checkbox.js';\nimport { FieldSwitch } from './field-switch.js';\nimport { FieldNumber } from './field-number.js';\nimport { FieldRadio } from './field-radio.js';\nimport { FieldAutocomplete } from './field-autocomplete.js';\nimport { FieldMultiSelect } from './field-multi-select.js';\nimport { FieldRating } from './field-rating.js';\nimport { FieldSlider } from './field-slider.js';\nimport { FieldDatePicker } from './field-date-picker.js';\n\n// New fields (v0.4.0)\nimport { FieldTimePicker } from './field-time-picker.js';\nimport { FieldDateTimePicker } from './field-datetime-picker.js';\nimport { FieldMultiCheckbox } from './field-multi-checkbox.js';\nimport { FieldMultiSwitch } from './field-multi-switch.js';\nimport { FieldCode } from './field-code.js';\nimport { FieldUpload, FieldUploadBox, FieldUploadAvatar } from './field-upload.js';\nimport { FieldPhone } from './field-phone.js';\nimport { FieldCountrySelect } from './field-country-select.js';\n\n// Editor fields (v0.4.0)\nimport { FieldEditor, FieldCustomEditor } from './field-editor.js';\n\n// =============================================================================\n// TYPE EXPORTS\n// =============================================================================\n\n// Base field types\nexport type { FieldTextProps } from './field-text.js';\nexport type { FieldSelectProps } from './field-select.js';\nexport type { FieldCheckboxProps } from './field-checkbox.js';\nexport type { FieldSwitchProps } from './field-switch.js';\nexport type { FieldNumberProps } from './field-number.js';\nexport type { FieldRadioProps, RadioOption } from './field-radio.js';\nexport type { FieldAutocompleteProps, AutocompleteOption } from './field-autocomplete.js';\nexport type { FieldMultiSelectProps, MultiSelectOption } from './field-multi-select.js';\nexport type { FieldRatingProps } from './field-rating.js';\nexport type { FieldSliderProps } from './field-slider.js';\nexport type { FieldDatePickerProps } from './field-date-picker.js';\n\n// New field types (v0.4.0)\nexport type { FieldTimePickerProps } from './field-time-picker.js';\nexport type { FieldDateTimePickerProps } from './field-datetime-picker.js';\nexport type { FieldMultiCheckboxProps, MultiCheckboxOption } from './field-multi-checkbox.js';\nexport type { FieldMultiSwitchProps, MultiSwitchOption } from './field-multi-switch.js';\nexport type { FieldCodeProps } from './field-code.js';\nexport type {\n FieldUploadProps,\n FieldUploadBoxProps,\n FieldUploadAvatarProps,\n FileValue,\n UploadValue,\n} from './field-upload.js';\nexport type { FieldPhoneProps, CountryData } from './field-phone.js';\nexport type { FieldCountrySelectProps, Country } from './field-country-select.js';\n\n// Editor field types (v0.4.0)\nexport type {\n FieldEditorProps,\n FieldCustomEditorProps,\n EditorRenderProps,\n EditorToolbarConfig,\n} from './field-editor.js';\n\n// =============================================================================\n// FIELD NAMESPACE\n// =============================================================================\n\n/**\n * Field namespace - React Hook Form integrated form fields.\n *\n * Available fields:\n * - Field.Text - Text input (text, email, password, etc.)\n * - Field.Select - Dropdown select\n * - Field.Checkbox - Checkbox input\n * - Field.Switch - Toggle switch\n * - Field.Number - Numeric input with validation\n * - Field.Radio - Radio button group\n * - Field.Autocomplete - Autocomplete with search\n * - Field.MultiSelect - Multiple selection with chips\n * - Field.Rating - Star rating\n * - Field.Slider - Range slider\n * - Field.DatePicker - Date picker (MUI X)\n * - Field.TimePicker - Time picker (MUI X)\n * - Field.DateTimePicker - Combined date-time picker (MUI X)\n * - Field.MultiCheckbox - Multiple checkbox group\n * - Field.MultiSwitch - Multiple switch group\n * - Field.Code - OTP/PIN code input\n * - Field.Upload - File upload with dropzone\n * - Field.UploadBox - Compact file upload box\n * - Field.UploadAvatar - Circular avatar upload\n * - Field.Phone - International phone input\n * - Field.Editor - Rich text editor (textarea fallback or custom)\n * - Field.CustomEditor - Headless editor with render prop\n */\nexport const Field = {\n // Base fields\n /** Text input field */\n Text: FieldText,\n /** Select dropdown field */\n Select: FieldSelect,\n /** Checkbox field */\n Checkbox: FieldCheckbox,\n /** Switch toggle field */\n Switch: FieldSwitch,\n /** Number input field */\n Number: FieldNumber,\n /** Radio button group field */\n Radio: FieldRadio,\n /** Autocomplete with search field */\n Autocomplete: FieldAutocomplete,\n /** Multiple selection with chips field */\n MultiSelect: FieldMultiSelect,\n /** Star rating field */\n Rating: FieldRating,\n /** Range slider field */\n Slider: FieldSlider,\n /** Date picker field (MUI X) */\n DatePicker: FieldDatePicker,\n\n // New fields (v0.4.0)\n /** Time picker field (MUI X) */\n TimePicker: FieldTimePicker,\n /** Combined date-time picker field (MUI X) */\n DateTimePicker: FieldDateTimePicker,\n /** Multiple checkbox group field */\n MultiCheckbox: FieldMultiCheckbox,\n /** Multiple switch group field */\n MultiSwitch: FieldMultiSwitch,\n /** OTP/PIN code input field */\n Code: FieldCode,\n /** File upload with dropzone */\n Upload: FieldUpload,\n /** Compact file upload box */\n UploadBox: FieldUploadBox,\n /** Circular avatar upload */\n UploadAvatar: FieldUploadAvatar,\n /** International phone input */\n Phone: FieldPhone,\n /** Country selector with flags */\n CountrySelect: FieldCountrySelect,\n\n // Editor fields (v0.4.0)\n /** Rich text editor (with textarea fallback or custom editor) */\n Editor: FieldEditor,\n /** Headless editor field with render prop */\n CustomEditor: FieldCustomEditor,\n} as const;\n\n// =============================================================================\n// INDIVIDUAL EXPORTS\n// =============================================================================\n\n// Also export individual components for those who prefer direct imports\nexport {\n // Base fields\n FieldText,\n FieldSelect,\n FieldCheckbox,\n FieldSwitch,\n FieldNumber,\n FieldRadio,\n FieldAutocomplete,\n FieldMultiSelect,\n FieldRating,\n FieldSlider,\n FieldDatePicker,\n // New fields (v0.4.0)\n FieldTimePicker,\n FieldDateTimePicker,\n FieldMultiCheckbox,\n FieldMultiSwitch,\n FieldCode,\n FieldUpload,\n FieldUploadBox,\n FieldUploadAvatar,\n FieldPhone,\n FieldCountrySelect,\n // Editor fields (v0.4.0)\n FieldEditor,\n FieldCustomEditor,\n};\n","'use client';\n\n/**\n * Error Boundary Component\n *\n * React error boundary for graceful error handling.\n * Includes stack trace parsing for improved debugging.\n *\n * @module components/error-boundary\n */\n\nimport { Component, useState, type ReactNode, type ErrorInfo } from 'react';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\nimport Collapse from '@mui/material/Collapse';\nimport IconButton from '@mui/material/IconButton';\nimport { ChevronDownIcon as ExpandMoreIcon } from '../../icons/controls.js';\nimport { CopyIcon as ContentCopyIcon } from '../../icons/controls.js';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// STACK TRACE PARSING\n// =============================================================================\n\n/**\n * Parsed stack frame information.\n */\nexport interface StackFrame {\n /** Function or method name */\n functionName: string | null;\n /** Source file path */\n filePath: string | null;\n /** Line number in the file */\n lineNumber: number | null;\n /** Column number in the file */\n columnNumber: number | null;\n /** Whether this frame is from app code (src/) vs node_modules */\n isAppCode: boolean;\n}\n\n/**\n * Parsed stack trace result.\n */\nexport interface ParsedStackTrace {\n /** Primary error location (first app code frame) */\n primary: StackFrame | null;\n /** All parsed frames */\n frames: StackFrame[];\n /** Original stack trace string */\n raw: string;\n}\n\n/**\n * Parse a single stack frame line.\n *\n * @param line - Stack trace line\n * @returns Parsed stack frame or null if couldn't parse\n */\nfunction parseStackFrame(line: string): StackFrame | null {\n // Match patterns like:\n // \"at functionName (file.tsx:123:45)\"\n // \"at Object.functionName (file.tsx:123:45)\"\n // \"at file.tsx:123:45\"\n // \"at async functionName (file.tsx:123:45)\"\n const patterns = [\n // Named function with file: at functionName (file:line:col)\n // Also covers the bundler-rewritten form `(file?v=hash:line:col)`: the\n // lazy `(.+?)` swallows the query string, which `cleanFilePath` strips.\n /at\\s+(?:async\\s+)?([^\\s(]+)\\s+\\((.+?):(\\d+):(\\d+)\\)/,\n // Anonymous at file: at file:line:col\n /at\\s+(.+?):(\\d+):(\\d+)/,\n ];\n\n for (const pattern of patterns) {\n const match = line.match(pattern);\n if (match) {\n const [, funcOrFile, file, lineStr, colStr] = match;\n\n // Which shape matched is decided by the LAST capture, not the second:\n // the anonymous pattern has three groups, so its second group holds a\n // line number — a defined value — and testing `file !== undefined`\n // called every anonymous frame a named one. The result was a frame\n // whose every field was wrong: the path read as the function name, the\n // line number as the path, the column as the line. Minified production\n // stacks are anonymous almost throughout, so that was the normal case\n // in the build where this component matters most.\n const hasFile = colStr !== undefined;\n const functionName = hasFile ? funcOrFile : null;\n const filePath = hasFile ? file : funcOrFile;\n const lineNumber = parseInt(hasFile ? lineStr : (file as string), 10);\n const columnNumber = parseInt(hasFile ? colStr : lineStr, 10);\n\n // App code vs library code. `node_modules` has to lose in BOTH\n // branches: a dependency shipping its own sources sits at\n // `node_modules/pkg/src/…`, which contains `/src/`, and it would\n // otherwise be picked as the error's primary location ahead of the\n // application frame that actually called it.\n const isAppCode = !filePath.includes('node_modules') && filePath.includes('src/');\n\n return {\n functionName: functionName || null,\n filePath: cleanFilePath(filePath),\n lineNumber: isNaN(lineNumber) ? null : lineNumber,\n columnNumber: isNaN(columnNumber) ? null : columnNumber,\n isAppCode,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Clean file path for display.\n */\nfunction cleanFilePath(path: string): string {\n // Remove webpack/vite query strings\n const cleaned = path.replace(/\\?.*$/, '');\n\n // Try to extract relative path from src/\n const srcIndex = cleaned.indexOf('/src/');\n if (srcIndex !== -1) {\n return cleaned.slice(srcIndex + 1);\n }\n\n // Try to get a reasonable path from the end\n const parts = cleaned.split('/');\n if (parts.length > 3) {\n return parts.slice(-3).join('/');\n }\n\n return cleaned;\n}\n\n/**\n * Parse an error stack trace into structured data.\n *\n * Extracts function names, file paths, and line numbers from stack traces.\n * Identifies app code vs library code for better debugging.\n *\n * @param stack - Error stack trace string\n * @returns Parsed stack trace with frames\n *\n * @example\n * ```tsx\n * try {\n * throw new Error('Something went wrong');\n * } catch (error) {\n * const parsed = parseStackTrace(error.stack);\n * console.log('Error in:', parsed.primary?.filePath);\n * console.log('Function:', parsed.primary?.functionName);\n * console.log('Line:', parsed.primary?.lineNumber);\n * }\n * ```\n */\nexport function parseStackTrace(stack?: string): ParsedStackTrace {\n if (!stack) {\n return { primary: null, frames: [], raw: '' };\n }\n\n const lines = stack.split('\\n');\n const frames: StackFrame[] = [];\n\n for (const line of lines) {\n const frame = parseStackFrame(line.trim());\n if (frame) {\n frames.push(frame);\n }\n }\n\n // Find the first app code frame as the primary location\n const primary = frames.find((f) => f.isAppCode) ?? frames[0] ?? null;\n\n return { primary, frames, raw: stack };\n}\n\n/**\n * Get a summary of the error location.\n *\n * @param error - Error object\n * @returns Human-readable error location\n */\nexport function getErrorLocation(error: Error): string {\n const parsed = parseStackTrace(error.stack);\n const { primary } = parsed;\n\n if (!primary) {\n return 'Unknown location';\n }\n\n const parts: string[] = [];\n\n if (primary.functionName) {\n parts.push(`in ${primary.functionName}`);\n }\n\n if (primary.filePath) {\n const location = primary.lineNumber ? `${primary.filePath}:${primary.lineNumber}` : primary.filePath;\n parts.push(`(${location})`);\n }\n\n return parts.join(' ') || 'Unknown location';\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Error fallback component props.\n */\nexport interface FallbackProps {\n /** The error that was caught */\n error: Error;\n /** Error info from React */\n errorInfo: ErrorInfo | null;\n /** Parsed stack trace for debugging */\n parsedStack: ParsedStackTrace;\n /** Reset error boundary state */\n resetErrorBoundary: () => void;\n}\n\n/**\n * Error boundary props.\n */\nexport interface ErrorBoundaryProps {\n /** Child components to render */\n children: ReactNode;\n /** Custom fallback component */\n fallback?: ReactNode | ((props: FallbackProps) => ReactNode);\n /** Callback when error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo, parsedStack: ParsedStackTrace) => void;\n /** Callback when error is reset */\n onReset?: () => void;\n /** Reset keys - boundary resets when these change */\n resetKeys?: unknown[];\n /** Custom sx props for default fallback */\n sx?: SxProps<Theme>;\n /** Show detailed stack info in default fallback (auto-detects dev mode if not set) */\n showDetails?: boolean;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\n// =============================================================================\n// DEFAULT FALLBACK\n// =============================================================================\n\ninterface DefaultFallbackProps extends FallbackProps {\n sx?: SxProps<Theme>;\n /** Show detailed stack info (auto-detected in dev) */\n showDetails?: boolean;\n}\n\nfunction DefaultErrorFallback({\n error,\n parsedStack,\n resetErrorBoundary,\n sx,\n showDetails,\n}: DefaultFallbackProps): ReactNode {\n const [expanded, setExpanded] = useState(false);\n const [copied, setCopied] = useState(false);\n\n // Auto-detect dev mode if not specified\n const shouldShowDetails = showDetails ?? (typeof process !== 'undefined' && process.env.NODE_ENV === 'development');\n\n const handleCopyStack = async () => {\n try {\n const text = [\n `Error: ${error.message}`,\n `Location: ${getErrorLocation(error)}`,\n '',\n 'Stack Trace:',\n parsedStack.raw,\n ].join('\\n');\n\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard API not available\n }\n };\n\n return (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n p: 3,\n textAlign: 'center',\n ...sx,\n }}\n >\n <Typography variant=\"h6\" color=\"error\" gutterBottom>\n Something went wrong\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{\n color: 'text.secondary',\n mb: 1,\n maxWidth: 400,\n }}\n >\n {error.message || 'An unexpected error occurred'}\n </Typography>\n {shouldShowDetails && parsedStack.primary && (\n <Typography\n variant=\"caption\"\n sx={{\n color: 'text.secondary',\n mb: 2,\n fontFamily: 'monospace',\n }}\n >\n {parsedStack.primary.filePath}\n {parsedStack.primary.lineNumber && `:${parsedStack.primary.lineNumber}`}\n {parsedStack.primary.functionName && ` (${parsedStack.primary.functionName})`}\n </Typography>\n )}\n <Box sx={{ display: 'flex', gap: 1, mb: 2 }}>\n <Button variant=\"outlined\" onClick={resetErrorBoundary}>\n Try Again\n </Button>\n\n {shouldShowDetails && (\n <>\n <IconButton\n size=\"small\"\n onClick={() => setExpanded(!expanded)}\n aria-label={expanded ? 'Hide stack trace' : 'Show stack trace'}\n aria-expanded={expanded}\n sx={{\n transform: expanded ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s',\n }}\n >\n <ExpandMoreIcon />\n </IconButton>\n\n <IconButton size=\"small\" onClick={handleCopyStack} title=\"Copy error details\">\n <ContentCopyIcon fontSize=\"small\" />\n </IconButton>\n {copied && (\n <Typography\n variant=\"caption\"\n sx={{\n color: 'success.main',\n alignSelf: 'center',\n }}\n >\n Copied!\n </Typography>\n )}\n </>\n )}\n </Box>\n {shouldShowDetails && (\n <Collapse in={expanded}>\n <Box\n sx={{\n mt: 1,\n p: 2,\n // Theme-aware: `grey.100` is a light value in both modes,\n // which put dark text on a near-white block in dark mode.\n bgcolor: 'action.hover',\n borderRadius: 1,\n maxWidth: 600,\n maxHeight: 300,\n overflow: 'auto',\n textAlign: 'left',\n }}\n >\n <Typography variant=\"caption\" component=\"pre\" sx={{ fontFamily: 'monospace', m: 0 }}>\n {parsedStack.frames.map((frame, i) => (\n <Box\n key={i}\n component=\"span\"\n sx={{\n display: 'block',\n color: frame.isAppCode ? 'error.main' : 'text.secondary',\n fontWeight: frame.isAppCode ? 600 : 400,\n }}\n >\n {frame.functionName || '(anonymous)'} at {frame.filePath || 'unknown'}\n {frame.lineNumber && `:${frame.lineNumber}`}\n </Box>\n ))}\n </Typography>\n </Box>\n </Collapse>\n )}\n </Box>\n );\n}\n\n// =============================================================================\n// ERROR BOUNDARY\n// =============================================================================\n\n/**\n * Error Boundary - Catches JavaScript errors in child components.\n *\n * @example\n * ```tsx\n * <ErrorBoundary\n * fallback={({ error, resetErrorBoundary }) => (\n * <div>\n * <p>Error: {error.message}</p>\n * <button onClick={resetErrorBoundary}>Retry</button>\n * </div>\n * )}\n * onError={(error, info) => logErrorToService(error, info)}\n * >\n * <MyComponent />\n * </ErrorBoundary>\n * ```\n *\n * @example\n * ```tsx\n * // With reset keys\n * <ErrorBoundary resetKeys={[userId, postId]}>\n * <UserPost userId={userId} postId={postId} />\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return {\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n const parsedStack = parseStackTrace(error.stack);\n this.setState({ errorInfo });\n this.props.onError?.(error, errorInfo, parsedStack);\n }\n\n componentDidUpdate(prevProps: ErrorBoundaryProps): void {\n const { resetKeys } = this.props;\n const { hasError } = this.state;\n\n if (hasError && resetKeys) {\n const previous = prevProps.resetKeys;\n // Length first: `some` walks the CURRENT array, so a key list that\n // shrinks — `[userId, postId]` to `[userId]` — compares only the keys\n // that remain, finds them equal, and never resets. Growing it reset\n // correctly, which is what made the asymmetry easy to miss.\n const hasKeyChanged =\n previous === undefined ||\n previous.length !== resetKeys.length ||\n resetKeys.some((key, index) => key !== previous[index]);\n\n if (hasKeyChanged) {\n this.resetErrorBoundary();\n }\n }\n }\n\n resetErrorBoundary = (): void => {\n this.props.onReset?.();\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n });\n };\n\n render(): ReactNode {\n const { hasError, error, errorInfo } = this.state;\n const { children, fallback, sx, showDetails } = this.props;\n\n if (hasError && error) {\n const parsedStack = parseStackTrace(error.stack);\n\n const fallbackProps: FallbackProps = {\n error,\n errorInfo,\n parsedStack,\n resetErrorBoundary: this.resetErrorBoundary,\n };\n\n if (typeof fallback === 'function') {\n return fallback(fallbackProps);\n }\n\n if (fallback) {\n return fallback;\n }\n\n return <DefaultErrorFallback {...fallbackProps} sx={sx} showDetails={showDetails} />;\n }\n\n return children;\n }\n}\n\n// =============================================================================\n// HOOK FOR THROWING ERRORS\n// =============================================================================\n\n/**\n * Hook to throw errors from event handlers.\n * Useful for triggering error boundary from async code.\n *\n * @returns Function to throw an error\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const throwError = useErrorBoundary();\n *\n * const handleClick = async () => {\n * try {\n * await fetchData();\n * } catch (error) {\n * throwError(error as Error);\n * }\n * };\n *\n * return <button onClick={handleClick}>Fetch</button>;\n * }\n * ```\n */\nexport function useErrorBoundary(): (error: Error) => void {\n const [, setError] = useState<Error | null>(null);\n\n return (error: Error) => {\n setError(() => {\n throw error;\n });\n };\n}\n"]}
|