@foi/design-system 0.0.19 → 0.0.20
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 +234 -241
- package/dist/{DatePicker.utils-BAUVa26Q.js → DatePicker.utils-D6aKFBuv.js} +1 -1
- package/dist/{DatePicker.utils-BAUVa26Q.js.map → DatePicker.utils-D6aKFBuv.js.map} +1 -1
- package/dist/{IconButton-C3x-E-ot.js → Toast-k4dxCveh.js} +455 -294
- package/dist/Toast-k4dxCveh.js.map +1 -0
- package/dist/hooks.mjs +1 -2
- package/dist/index.d.ts +14 -13
- package/dist/index.mjs +5615 -536
- package/dist/index.mjs.map +1 -1
- package/dist/theme.d.ts +22 -0
- package/dist/utilities.mjs +1 -1
- package/package.json +1 -13
- package/dist/IconButton-C3x-E-ot.js.map +0 -1
- package/dist/RadioGroup-Cvt9MtvM.js +0 -456
- package/dist/RadioGroup-Cvt9MtvM.js.map +0 -1
- package/dist/RadioGroup.context-v_CCYB7_.js +0 -392
- package/dist/RadioGroup.context-v_CCYB7_.js.map +0 -1
- package/dist/Switch-6eNmT34-.js +0 -4196
- package/dist/Switch-6eNmT34-.js.map +0 -1
- package/dist/ThemeProvider-C_PzAJz3.js +0 -44
- package/dist/ThemeProvider-C_PzAJz3.js.map +0 -1
- package/dist/Toast-_9W7YGxS.js +0 -146
- package/dist/Toast-_9W7YGxS.js.map +0 -1
- package/dist/atoms.d.ts +0 -21
- package/dist/atoms.mjs +0 -4
- package/dist/hocs.d.ts +0 -2
- package/dist/hocs.mjs +0 -2
- package/dist/molecules.d.ts +0 -10
- package/dist/molecules.mjs +0 -3
- package/dist/useStateCallback-B4O93zzK.js +0 -32
- package/dist/useStateCallback-B4O93zzK.js.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/components/atoms/Skeleton/Skeleton.emotion.ts","../src/components/atoms/Skeleton/Skeleton.tsx","../src/components/organisms/DataGrid/DataGrid.emotion.ts","../src/components/organisms/DataGrid/DataGridMenu/DataGridMenu.emotion.ts","../src/components/organisms/DataGrid/DataGridMenu/components/DataGridMenuSearch.tsx","../src/components/organisms/DataGrid/DataGridMenu/components/DataGridMenuMultiSelect.tsx","../src/components/organisms/DataGrid/DataGridMenu/DataGridMenu.tsx","../src/components/organisms/DataGrid/DataGridMenu/index.tsx","../src/components/organisms/DataGrid/DataGridSkeleton/DataGridSkeleton.tsx","../src/components/atoms/Pagination/Pagination.emotion.ts","../src/components/atoms/Pagination/PaginationMenu/PaginationMenu.emotion.ts","../src/components/atoms/Pagination/PaginationMenu/PaginationMenu.tsx","../src/components/atoms/Pagination/PaginationMenu/index.tsx","../src/components/atoms/Pagination/Pagination.tsx","../src/components/atoms/Pagination/index.tsx","../src/components/organisms/DataGrid/DataGrid.tsx","../src/components/organisms/DataGrid/index.tsx"],"sourcesContent":["import { css, keyframes } from '@emotion/react';\n\nconst shimmer = keyframes`\n 0% { background-position: 200% center; }\n 100% { background-position: -200% center; }\n`;\n\nconst Style = css`\n &.--SKELETON {\n display: block;\n background: linear-gradient(\n 90deg,\n rgba(255, 255, 255, 0.05) 0%,\n rgba(255, 255, 255, 0.13) 50%,\n rgba(255, 255, 255, 0.05) 100%\n );\n background-size: 200% 100%;\n animation: ${shimmer} 1.4s ease infinite;\n\n &.--SKELETON--circular {\n border-radius: 50%;\n }\n\n &.--SKELETON--rectangular {\n border-radius: 4px;\n }\n }\n`;\n\nexport default Style;\n","// Component Base\nimport Style from './Skeleton.emotion';\nimport type { SkeletonProps } from './Skeleton.interface';\n\n/**\n * A low-fidelity placeholder that mimics the shape of content while it loads.\n *\n * Use `variant=\"rectangular\"` for text lines, cards, or images and\n * `variant=\"circular\"` for avatars or icon placeholders. Set `width` and\n * `height` to match the real content's dimensions.\n */\nconst Skeleton = ({ variant = 'rectangular', width, height, className }: SkeletonProps) => (\n <span\n className={['--SKELETON', `--SKELETON--${variant}`, className || ''].filter(Boolean).join(' ')}\n css={Style}\n style={{ width, height }}\n aria-hidden='true'\n />\n);\n\nexport default Skeleton;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst Style = (theme: Record<string, string>) => css`\n &.--DATAGRID {\n width: 100%;\n box-sizing: border-box;\n\n ${getStyle(theme, 'background-color', '--DATAGRID-ROOT-BACKGROUND-COLOR')};\n ${getStyle(theme, 'border-color', `--DATAGRID-ROOT-BORDER-COLOR`)};\n ${getStyle(theme, 'border-width', `--DATAGRID-ROOT-BORDER-WIDTH`)};\n ${getStyle(theme, 'border-radius', '--DATAGRID-ROOT-BORDER-RADIUS')};\n ${getStyle(theme, 'border-style', `--DATAGRID-ROOT-BORDER-STYLE`)};\n\n .--DATAGRID-tableContainer {\n width: 100%;\n overflow-x: auto;\n }\n\n .--DATAGRID-bodyContainer {\n &::-webkit-scrollbar {\n width: 12px;\n height: 4px;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0.5);\n border-radius: 9999px;\n border: 3px solid transparent;\n background-clip: padding-box;\n }\n }\n\n .--DATAGRID-table {\n width: 100%;\n border-collapse: collapse;\n\n .--DATAGRID-thead {\n .--DATAGRID-thScrollbarSpacer {\n border: none;\n background: transparent;\n }\n\n .--DATAGRID-headerRow {\n height: 48px;\n\n .--DATAGRID-th {\n ${getStyle(theme, 'background-color', '--DATAGRID-ROOT-BACKGROUND-COLOR')};\n\n padding: 8px 16px;\n text-align: left;\n white-space: nowrap;\n\n ${getStyle(theme, 'border-bottom-color', `--DATAGRID-ROOT-BORDER-COLOR`)};\n ${getStyle(theme, 'border-bottom-width', `--DATAGRID-ROOT-BORDER-WIDTH`)};\n ${getStyle(theme, 'border-bottom-style', `--DATAGRID-ROOT-BORDER-STYLE`)};\n\n &.--DATAGRID-thOptions {\n width: 80px;\n text-align: right;\n }\n\n .--DATAGRID-thInner {\n display: flex;\n align-items: center;\n gap: 6px;\n\n .--DATAGRID-thActions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n }\n\n .--DATAGRID-filterActive {\n ${getStyle(theme, 'color', '--DATAGRID-EVENTS-ENABLED-ICON-COLOR')};\n }\n\n .--DATAGRID-thLabel {\n ${getStyle(theme, 'color', '--DATAGRID-EVENTS-ENABLED-COLOR-SECONDARY')};\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: 1;\n white-space: nowrap;\n }\n\n .--DATAGRID-filterContainer {\n display: flex;\n align-items: center;\n gap: 4px;\n\n .--DATAGRID-filterLabel {\n ${getStyle(theme, 'color', '--DATAGRID-EVENTS-ENABLED-COLOR-SECONDARY')};\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.75rem;\n font-weight: 500;\n cursor: pointer;\n }\n }\n }\n }\n }\n }\n\n .--DATAGRID-tbody {\n .--DATAGRID-row {\n height: 48px;\n transition: background-color 150ms;\n\n ${getStyle(theme, 'border-bottom-color', `--DATAGRID-ROOT-BORDER-COLOR`)};\n ${getStyle(theme, 'border-bottom-width', `--DATAGRID-ROOT-BORDER-WIDTH`)};\n ${getStyle(theme, 'border-bottom-style', `--DATAGRID-ROOT-BORDER-STYLE`)};\n\n &:hover {\n ${getStyle(theme, 'background-color', '--DATAGRID-EVENTS-HOVER-BACKGROUND-COLOR')};\n }\n\n &:last-child {\n border-bottom: none;\n }\n }\n\n .--DATAGRID-td {\n ${getStyle(theme, 'color', '--DATAGRID-EVENTS-ENABLED-COLOR-PRIMARY')};\n\n padding: 8px 16px;\n vertical-align: middle;\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: 1;\n }\n\n .--DATAGRID-emptyCell {\n text-align: center;\n vertical-align: middle;\n\n ${getStyle(theme, 'color', '--DATAGRID-EVENTS-ENABLED-COLOR-SECONDARY')};\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 400;\n }\n\n .--DATAGRID-loadingMore {\n text-align: center;\n padding: 12px 16px;\n height: 48px;\n vertical-align: middle;\n\n ${getStyle(theme, 'color', '--DATAGRID-EVENTS-ENABLED-COLOR-SECONDARY')};\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n }\n }\n }\n\n .--DATAGRID-tdOptions {\n text-align: right;\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n align-items: center;\n padding: 12px 16px !important;\n }\n }\n`;\n\nexport default Style;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst container = (theme: Record<string, string>, event: string): string => `\n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--DATAGRIDMENU-${event}-BACKGROUND-COLOR`)}\n \n // BORDERS\n ${getStyle(theme, 'border-color', `--DATAGRIDMENU-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--DATAGRIDMENU-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--DATAGRIDMENU-${event}-BORDER-STYLE`)}\n ${getStyle(theme, 'border-radius', `--DATAGRIDMENU-${event}-BORDER-RADIUS`)}\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--DATAGRIDMENU {\n position: fixed;\n z-index: 200;\n padding: 16px;\n width: calc(240px - 32px);\n display: flex;\n flex-direction: column;\n gap: 12px;\n box-shadow:\n rgba(0, 0, 0, 0.2) 0px 5px 5px -3px,\n rgba(0, 0, 0, 0.14) 0px 8px 10px 1px,\n rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;\n\n ${container(theme, 'ROOT')}\n\n .--DATAGRIDMENU-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n .--DATAGRIDMENU-headerTitle {\n ${getStyle(theme, 'color', '--DATAGRIDMENU-EVENTS-ENABLED-COLOR-PRIMARY')};\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 600;\n }\n }\n\n .--DATAGRIDMENU-content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n // ─── Options list ─────────────────────────────────────────────────────────\n\n .--DATAGRIDMENU-optionsList {\n max-height: 180px;\n overflow-y: auto;\n // padding + negative margin let the Checkbox ::before shadow render without being clipped\n padding: 4px 8px;\n margin: 0 -8px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n &::-webkit-scrollbar {\n width: 12px;\n height: 4px;\n }\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0.5);\n border-radius: 9999px;\n border: 3px solid transparent;\n background-clip: padding-box;\n }\n }\n\n .--DATAGRIDMENU-optionRow {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .--DATAGRIDMENU-optionDot {\n width: 6px;\n height: 24px;\n border-radius: 2px;\n flex-shrink: 0;\n }\n\n .--DATAGRIDMENU-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n }\n }\n`;\n\nexport default Style;\n","import TextField from '@components/atoms/TextField';\nimport Icon from '@components/atoms/Icon';\n\nconst CLASS = '--DATAGRIDMENU';\n\ninterface DataGridMenuSearchProps {\n columnKey: string;\n pendingSearch: string;\n onSearchChange: (val: string) => void;\n searchLabel?: string;\n}\n\nconst DataGridMenuSearch = ({\n columnKey,\n pendingSearch,\n onSearchChange,\n searchLabel = 'Search',\n}: DataGridMenuSearchProps) => (\n <div className={`${CLASS}-searchInput`}>\n <TextField\n name={`search-${columnKey}`}\n label={searchLabel}\n value={pendingSearch}\n onValueChange={onSearchChange}\n showErrorText={false}\n width='full'\n autoFocus\n data-testid={`${CLASS}-searchInput-${columnKey}`}\n startAdornment={<Icon name='search' style={{ color: 'white' }} />}\n />\n\n </div>\n);\n\nexport default DataGridMenuSearch;\n","import TextField from '@components/atoms/TextField';\nimport Checkbox from '@components/atoms/Checkbox';\nimport type { DataGridFilterOption } from '../../DataGrid.interface';\n\nconst CLASS = '--DATAGRIDMENU';\n\ninterface DataGridMenuMultiSelectProps {\n filterType: 'multiselect' | 'multiselect-search';\n columnKey: string;\n options: DataGridFilterOption[];\n pendingMulti: string[];\n onMultiChange: (values: string[]) => void;\n multiSearch: string;\n onMultiSearchChange: (val: string) => void;\n}\n\nconst DataGridMenuMultiSelect = ({\n filterType,\n columnKey,\n options,\n pendingMulti,\n onMultiChange,\n multiSearch,\n onMultiSearchChange,\n}: DataGridMenuMultiSelectProps) => {\n const isMultiSearch = filterType === 'multiselect-search';\n const filteredOpts = options.filter(\n opt => !multiSearch || opt.label.toLowerCase().includes(multiSearch.toLowerCase()),\n );\n\n return (\n <>\n {isMultiSearch && (\n <div className={`${CLASS}-searchInput`}>\n <TextField\n name={`multiSearch-${columnKey}`}\n label='Search options'\n value={multiSearch}\n onValueChange={onMultiSearchChange}\n showErrorText={false}\n width='full'\n autoFocus\n data-testid={`${CLASS}-multiSearch-${columnKey}`}\n />\n </div>\n )}\n <div className={`${CLASS}-optionsList`} data-testid={`${CLASS}-optionsList-${columnKey}`}>\n {filteredOpts.map(opt => (\n <div key={opt.value} className={`${CLASS}-optionRow`}>\n {opt.color && (\n <span className={`${CLASS}-optionDot`} style={{ backgroundColor: opt.color }} aria-hidden='true' />\n )}\n <Checkbox\n checked={pendingMulti.includes(opt.value)}\n onChecked={checked =>\n onMultiChange(checked ? [...pendingMulti, opt.value] : pendingMulti.filter(v => v !== opt.value))\n }\n label={opt.label}\n showErrorText={false}\n data-testid={`${CLASS}-option-${columnKey}-${opt.value}`}\n />\n </div>\n ))}\n </div>\n </>\n );\n};\n\nexport default DataGridMenuMultiSelect;\n","// Component Base\nimport { useLayoutEffect, useRef } from 'react';\nimport emotion from './DataGridMenu.emotion';\nimport type { DataGridMenuProps } from './DataGridMenu.interface';\n// External Libraries\nimport ReactDOM from 'react-dom';\n// Custom Components\nimport Button from '@components/atoms/Button';\nimport IconButton from '@components/atoms/IconButton';\nimport Icon from '@components/atoms/Icon';\nimport DataGridMenuSearch from './components/DataGridMenuSearch';\nimport DataGridMenuMultiSelect from './components/DataGridMenuMultiSelect';\n\nconst CLASS = '--DATAGRIDMENU';\n\n/**\n * A portal-rendered popover that provides filter controls for a DataGrid column.\n *\n * Positions itself below `anchorEl` using `useLayoutEffect` and repositions\n * on window scroll / resize. Renders one of three filter UIs based on `filterType`:\n * - `'search'` — a single text input.\n * - `'multiselect'` — a list of checkboxes.\n * - `'multiselect-search'` — a list of checkboxes with an inline search input.\n *\n * Apply/cancel actions are delegated to the parent via `onApply` and `onCancel`.\n */\nconst DataGridMenu = ({\n filterType,\n options,\n columnKey,\n filterTitle,\n searchLabel,\n cancelLabel = 'Cancel',\n applyLabel = 'Apply',\n pendingSearch,\n onSearchChange,\n pendingMulti,\n onMultiChange,\n multiSearch,\n onMultiSearchChange,\n onCancel,\n onApply,\n onClear,\n anchorEl,\n style,\n}: DataGridMenuProps) => {\n const menuRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!anchorEl) return;\n\n const update = () => {\n if (!menuRef.current) return;\n const rect = anchorEl.getBoundingClientRect();\n const menuWidth = menuRef.current.offsetWidth;\n const centeredLeft = rect.left + rect.width / 2 - menuWidth / 2;\n menuRef.current.style.top = `${rect.bottom + 8}px`;\n menuRef.current.style.left = `${Math.max(8, Math.min(centeredLeft, window.innerWidth - menuWidth - 8))}px`;\n };\n\n update();\n // capture: true catches scroll inside overflow containers (e.g. DataGrid's overflow-x: auto)\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [anchorEl]);\n\n return ReactDOM.createPortal(\n <div\n ref={menuRef}\n className={CLASS}\n css={emotion(style)}\n data-popover-key={columnKey}\n data-testid={`${CLASS}-${columnKey}`}\n >\n <div className={`${CLASS}-header`}>\n <span className={`${CLASS}-headerTitle`}>{filterTitle}</span>\n <IconButton\n icon={<Icon name='delete_outline' size='sm' />}\n onClick={onClear}\n aria-label='Clear filter'\n data-testid={`${CLASS}-clearBtn-${columnKey}`}\n />\n </div>\n <div className={`${CLASS}-content`}>\n {filterType === 'search' && (\n <DataGridMenuSearch\n columnKey={columnKey}\n pendingSearch={pendingSearch}\n onSearchChange={onSearchChange}\n searchLabel={searchLabel}\n />\n )}\n {(filterType === 'multiselect' || filterType === 'multiselect-search') && (\n <DataGridMenuMultiSelect\n filterType={filterType}\n columnKey={columnKey}\n options={options ?? []}\n pendingMulti={pendingMulti}\n onMultiChange={onMultiChange}\n multiSearch={multiSearch}\n onMultiSearchChange={onMultiSearchChange}\n />\n )}\n </div>\n <div className={`${CLASS}-actions`}>\n <Button onClick={onCancel} data-testid={`${CLASS}-cancelBtn-${columnKey}`} variant='ghost'>\n {cancelLabel}\n </Button>\n <Button onClick={onApply} data-testid={`${CLASS}-applyBtn-${columnKey}`}>\n {applyLabel}\n </Button>\n </div>\n </div>,\n document.body,\n );\n};\n\nexport default DataGridMenu;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { DataGridMenuStyleProps } from './DataGridMenu.interface';\nimport DataGridMenuBase from './DataGridMenu';\n\nconst DataGridMenu = ({ theme, variant = 'default', ...rest }: DataGridMenuStyleProps) => {\n const { componentStyles } = useCreateComponentStyles([Component.DATAGRIDMENU], theme, variant.toUpperCase());\n return <DataGridMenuBase {...rest} style={componentStyles} />;\n};\n\nexport default DataGridMenu;\n","import { useMemo } from 'react';\nimport Skeleton from '@components/atoms/Skeleton';\nimport type { DataGridColumn } from '../DataGrid.interface';\n\ninterface DataGridSkeletonProps {\n columns: DataGridColumn[];\n pageSize: number;\n}\n\nconst CLASS = '--DATAGRID';\n\nconst DataGridSkeleton = ({ columns, pageSize }: DataGridSkeletonProps) => {\n const widths = useMemo(\n () =>\n Array.from({ length: pageSize }, () =>\n columns.map(col => (col.type === 'options' ? null : `${Math.floor(Math.random() * 51) + 40}%`)),\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pageSize, columns.length],\n );\n\n return (\n <>\n {Array.from({ length: pageSize }).map((_, i) => (\n <tr key={i} className={`${CLASS}-row`}>\n {columns.map((col, colIndex) => (\n <td\n key={col.key}\n className={[`${CLASS}-td`, col.type === 'options' ? `${CLASS}-tdOptions` : ''].filter(Boolean).join(' ')}\n >\n {col.type === 'options' ? (\n <Skeleton variant='circular' width={24} height={24} />\n ) : (\n <Skeleton height={16} width={widths[i][colIndex] ?? undefined} />\n )}\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n};\n\nexport default DataGridSkeleton;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst Style = (theme: Record<string, string>) => css`\n &.--PAGINATION {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 16px;\n padding: 8px 16px;\n\n .--PAGINATION-rowsControl {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n\n .--PAGINATION-rowsSize {\n ${getStyle(theme, 'color', '--PAGINATION-EVENTS-ENABLED-COLOR-SECONDARY')};\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.8125rem;\n user-select: none;\n min-width: 20px;\n text-align: center;\n }\n }\n\n .--PAGINATION-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n\n .--PAGINATION-info {\n ${getStyle(theme, 'color', '--PAGINATION-EVENTS-ENABLED-COLOR-SECONDARY')};\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.8125rem;\n user-select: none;\n }\n }\n }\n`;\n\nexport default Style;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst row = (theme: Record<string, string>, event: string): string => `\n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--PAGINATIONMENU-EVENTS-${event}-BACKGROUND-COLOR`)}\n \n // BORDERS\n ${getStyle(theme, 'border-color', `--PAGINATIONMENU-EVENTS-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--PAGINATIONMENU-EVENTS-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--PAGINATIONMENU-EVENTS-${event}-BORDER-STYLE`)}\n ${getStyle(theme, 'border-radius', `--PAGINATIONMENU-EVENTS-${event}-BORDER-RADIUS`)}\n`;\n\nconst typography = (theme: Record<string, string>, event: string): string => `\n // TYPOGRAPHY\n ${getStyle(theme, 'color', `--PAGINATIONMENU-EVENTS-${event}-COLOR-PRIMARY`)};\n ${getStyle(theme, 'caret-color', `--PAGINATIONMENU-EVENTS-${event}-COLOR-PRIMARY`)};\n`;\n\nconst container = (theme: Record<string, string>, event: string): string => `\n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--PAGINATIONMENU-${event}-BACKGROUND-COLOR`)}\n \n // BORDERS\n ${getStyle(theme, 'border-color', `--PAGINATIONMENU-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--PAGINATIONMENU-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--PAGINATIONMENU-${event}-BORDER-STYLE`)}\n ${getStyle(theme, 'border-radius', `--PAGINATIONMENU-${event}-BORDER-RADIUS`)}\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--PAGINATIONMENU {\n position: absolute;\n bottom: calc(100% + ${theme['--PAGINATIONMENU-ROOT-BOTTOM'] || ''});\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n z-index: 10;\n box-shadow:\n rgba(0, 0, 0, 0.2) 0px 5px 5px -3px,\n rgba(0, 0, 0, 0.14) 0px 8px 10px 1px,\n rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;\n\n ${container(theme, 'ROOT')}\n\n .--PAGINATIONMENU-option {\n all: unset;\n cursor: pointer;\n text-align: center;\n padding: 6px 20px;\n white-space: nowrap;\n transition: background-color 120ms;\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.8125rem;\n\n // ENABLED\n ${row(theme, 'ENABLED')}\n ${typography(theme, 'ENABLED')}\n\n // VALUE\n &.--PAGINATIONMENU-selected {\n ${row(theme, 'VALUE')}\n ${typography(theme, 'VALUE')}\n }\n\n // HOVER\n &:hover {\n ${row(theme, 'HOVER')}\n ${typography(theme, 'HOVER')}\n }\n\n // - ACTIVE\n &:active,\n &.--PAGINATIONMENU-active {\n ${row(theme, 'ACTIVE')}\n ${typography(theme, 'ACTIVE')}\n }\n\n // FOCUS\n &:focus-visible {\n outline-offset: 0px;\n outline: 0;\n ${row(theme, 'FOCUS')}\n ${typography(theme, 'FOCUS')}\n }\n }\n }\n`;\n\nexport default Style;\n","// Component Base\nimport emotion from './PaginationMenu.emotion';\nimport type { PaginationMenuProps } from './PaginationMenu.interface';\n\nconst CLASS = '--PAGINATIONMENU';\n\n/**\n * A floating dropdown that renders a list of page-size options.\n *\n * Rendered inside `<Pagination>` when `pageSizeOptions` is provided.\n * Keyboard focus is controlled externally via `focusedElement`.\n */\nconst PaginationMenu = ({ options, activeOption, onSelect, focusedElement = -1, style }: PaginationMenuProps) => (\n <div className={CLASS} css={emotion(style)}>\n {options.map((option, index) => {\n const selectedClass = option === activeOption ? `${CLASS}-selected` : '';\n const isActive = focusedElement === index;\n return (\n <button\n key={option}\n className={[`${CLASS}-option`, selectedClass, isActive ? `${CLASS}-active` : ''].filter(Boolean).join(' ')}\n onClick={() => onSelect(option)}\n >\n {option}\n </button>\n );\n })}\n </div>\n);\n\nexport default PaginationMenu;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { PaginationMenuStyleProps } from './PaginationMenu.interface';\nimport PaginationMenuBase from './PaginationMenu';\n\nconst PaginationMenu = ({ theme, variant = 'default', ...rest }: PaginationMenuStyleProps) => {\n const { componentStyles } = useCreateComponentStyles([Component.PAGINATIONMENU], theme, variant.toUpperCase());\n return <PaginationMenuBase {...rest} style={componentStyles} />;\n};\n\nexport default PaginationMenu;\nexport type { PaginationMenuProps, PaginationMenuStyleProps } from './PaginationMenu.interface';\n","// Component Base\nimport React, { useState, useEffect } from 'react';\nimport Style from './Pagination.emotion';\nimport type { PaginationProps } from './Pagination.interface';\n// Custom Components\nimport IconButton from '@components/atoms/IconButton';\nimport Icon from '@components/atoms/Icon';\nimport PaginationMenu from './PaginationMenu';\n\nconst CLASS = '--PAGINATION';\n\n/**\n * A pagination control bar that lets users navigate between pages of data.\n *\n * Displays the current row range (`start–end of total`), first/prev/next/last\n * navigation buttons, and — when `pageSizeOptions` is provided — a rows-per-page\n * dropdown menu.\n *\n * All navigation buttons are disabled while `loading` is `true`.\n */\nconst Pagination = ({\n page,\n total,\n pageSize,\n onPageChange,\n pageSizeOptions,\n onPageSizeChange,\n loading,\n className,\n style,\n}: PaginationProps) => {\n const [rowsMenuOpen, setRowsMenuOpen] = useState(false);\n const [focusedElement, setFocusedElement] = useState(-1);\n\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n const start = page * pageSize + 1;\n const end = Math.min((page + 1) * pageSize, total);\n const isFirst = page === 0;\n const isLast = page >= totalPages - 1;\n\n const closeMenu = () => {\n setRowsMenuOpen(false);\n setFocusedElement(-1);\n };\n\n useEffect(() => {\n if (!rowsMenuOpen) return;\n const close = (e: MouseEvent) => {\n if (!(e.target as HTMLElement).closest(`.${CLASS}-rowsControl`)) {\n setRowsMenuOpen(false);\n setFocusedElement(-1);\n }\n };\n document.addEventListener('mousedown', close);\n return () => document.removeEventListener('mousedown', close);\n }, [rowsMenuOpen]);\n\n const onKeyDownRowsBtn = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === 'Tab' || e.key === 'Escape') {\n setRowsMenuOpen(false);\n setFocusedElement(-1);\n } else if (['ArrowDown', 'ArrowUp'].includes(e.key) && rowsMenuOpen) {\n e.preventDefault();\n if (e.key === 'ArrowDown') setFocusedElement(prev => (prev + 1 >= (pageSizeOptions?.length ?? 0) ? 0 : prev + 1));\n else setFocusedElement(prev => (prev - 1 < 0 ? (pageSizeOptions?.length ?? 1) - 1 : prev - 1));\n } else if (e.key === 'Enter' && rowsMenuOpen && focusedElement >= 0 && pageSizeOptions) {\n e.preventDefault();\n const option = pageSizeOptions[focusedElement];\n if (option !== undefined) {\n onPageSizeChange?.(option);\n setRowsMenuOpen(false);\n setFocusedElement(-1);\n }\n }\n };\n\n return (\n <div className={[CLASS, className || ''].filter(Boolean).join(' ')} css={Style(style ?? {})}>\n {pageSizeOptions && pageSizeOptions.length > 0 && (\n <div className={`${CLASS}-rowsControl`}>\n {rowsMenuOpen && (\n <PaginationMenu\n options={pageSizeOptions}\n activeOption={pageSize}\n onSelect={option => {\n onPageSizeChange?.(option);\n closeMenu();\n }}\n focusedElement={focusedElement}\n />\n )}\n <span className={`${CLASS}-rowsSize`}>{pageSize}</span>\n <IconButton\n icon={<Icon name='arrow_drop_up' size='sm' />}\n onClick={() => (rowsMenuOpen ? closeMenu() : setRowsMenuOpen(true))}\n onKeyDown={onKeyDownRowsBtn}\n isFlipped={rowsMenuOpen}\n aria-label='Rows per page'\n data-testid={`${CLASS}-rowsBtn`}\n />\n </div>\n )}\n <div className={`${CLASS}-controls`}>\n <span className={`${CLASS}-info`}>\n {start}-{end} of {total}\n </span>\n <IconButton\n icon={<Icon name='first_page' size='sm' />}\n onClick={() => onPageChange(0)}\n disabled={loading || isFirst}\n aria-label='First page'\n data-testid={`${CLASS}-first`}\n />\n <IconButton\n icon={<Icon name='chevron_left' size='sm' />}\n onClick={() => onPageChange(page - 1)}\n disabled={loading || isFirst}\n aria-label='Previous page'\n data-testid={`${CLASS}-prev`}\n />\n <IconButton\n icon={<Icon name='chevron_right' size='sm' />}\n onClick={() => onPageChange(page + 1)}\n disabled={loading || isLast}\n aria-label='Next page'\n data-testid={`${CLASS}-next`}\n />\n <IconButton\n icon={<Icon name='last_page' size='sm' />}\n onClick={() => onPageChange(totalPages - 1)}\n disabled={loading || isLast}\n aria-label='Last page'\n data-testid={`${CLASS}-last`}\n />\n </div>\n </div>\n );\n};\n\nexport default Pagination;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { PaginationStyleProps } from './Pagination.interface';\nimport PaginationBase from './Pagination';\n\nconst Pagination = ({ theme, variant = 'default', ...rest }: PaginationStyleProps) => {\n const { componentStyles } = useCreateComponentStyles([Component.PAGINATION], theme, variant.toUpperCase());\n return <PaginationBase {...rest} style={componentStyles} />;\n};\n\nexport default Pagination;\nexport type { PaginationProps, PaginationStyleProps } from './Pagination.interface';\n","// Component Base\nimport React, { useState, useEffect, useRef, useCallback, useLayoutEffect } from 'react';\nimport emotion from './DataGrid.emotion';\nimport type { DataGridProps, DataGridColumn, DataGridSortState } from './DataGrid.interface';\n// Custom Components\nimport IconButton from '@components/atoms/IconButton';\nimport Icon from '@components/atoms/Icon';\nimport DataGridMenu from './DataGridMenu';\nimport DataGridSkeleton from './DataGridSkeleton';\nimport Pagination from '@components/atoms/Pagination';\n\nconst CLASS = '--DATAGRID';\nconst DEFAULT_PAGE_SIZE = 10;\n\n/**\n * A full-featured data table with server-side fetching, sorting, filtering, and pagination.\n *\n * Pass `columns` to define the table structure and `onFetch` to supply data.\n * `onFetch` is called automatically whenever the page, page size, active sort,\n * or any column filter changes.\n *\n * **Pagination modes** (controlled by `paginationType`):\n * - `'pagination'` — renders a `<Pagination>` bar below the table.\n * - `'scroll'` — appends rows as the user scrolls down (infinite scroll).\n *\n * **Column actions:**\n * - Sortable columns show a sort-direction toggle in the header.\n * - Columns with a `filter` config show a filter popover icon.\n * - Add a column with `type: 'options'` and a `render` prop for row-level action buttons.\n */\nconst DataGrid = <T extends object>({\n columns,\n onFetch,\n paginationType = 'pagination',\n pageSize = DEFAULT_PAGE_SIZE,\n pageSizeOptions,\n emptyContent = <span>No se han encontrado resultados</span>,\n loadingMoreContent = <span>Cargando...</span>,\n className,\n style,\n}: DataGridProps<T>) => {\n const [rows, setRows] = useState<T[]>([]);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(0);\n const [currentPageSize, setCurrentPageSize] = useState(pageSize);\n const [isLoading, setIsLoading] = useState(true);\n const [sortState, setSortState] = useState<DataGridSortState | null>(null);\n const [filters, setFilters] = useState<Record<string, string | string[]>>({});\n const [openPopover, setOpenPopover] = useState<string | null>(null);\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const [pendingSearch, setPendingSearch] = useState('');\n const [pendingMulti, setPendingMulti] = useState<string[]>([]);\n const [multiSearch, setMultiSearch] = useState('');\n const [colWidths, setColWidths] = useState<number[]>([]);\n const [scrollbarWidth, setScrollbarWidth] = useState(0);\n\n const filterRefs = useRef<Record<string, HTMLElement | null>>({});\n const theadRef = useRef<HTMLTableSectionElement>(null);\n const headerTableRef = useRef<HTMLTableElement>(null);\n const bodyContainerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n let cancelled = false;\n onFetch({ page, pageSize: currentPageSize, filters, sort: sortState ?? undefined }).then(result => {\n if (cancelled) return;\n setRows(prev => (paginationType === 'scroll' && page > 0 ? [...prev, ...result.data] : result.data));\n setTotal(result.total);\n setIsLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [page, currentPageSize, filters, sortState, paginationType, onFetch]);\n\n // Sync column widths between fixed header and scrollable body (scroll mode only).\n // ResizeObserver re-measures whenever the header table is resized (e.g. viewport shrink).\n useLayoutEffect(() => {\n if (paginationType !== 'scroll' || !theadRef.current || !bodyContainerRef.current || !headerTableRef.current)\n return;\n\n const measure = () => {\n if (!theadRef.current || !bodyContainerRef.current) return;\n const ths = Array.from(\n theadRef.current.querySelectorAll<HTMLTableCellElement>(`th:not(.${CLASS}-thScrollbarSpacer)`),\n );\n setColWidths(ths.map(th => th.getBoundingClientRect().width));\n setScrollbarWidth(bodyContainerRef.current.offsetWidth - bodyContainerRef.current.clientWidth);\n };\n\n measure();\n\n const ro = new ResizeObserver(measure);\n ro.observe(headerTableRef.current);\n return () => ro.disconnect();\n }, [paginationType, columns.length, isLoading]);\n\n useEffect(() => {\n if (!openPopover) return;\n const close = (e: MouseEvent) => {\n if (!(e.target as HTMLElement).closest(`[data-popover-key=\"${openPopover}\"]`)) {\n setOpenPopover(null);\n }\n };\n document.addEventListener('mousedown', close);\n return () => document.removeEventListener('mousedown', close);\n }, [openPopover]);\n\n const openFilter = (col: DataGridColumn<T>) => {\n if (!col.filter) return;\n if (openPopover === col.key) {\n setOpenPopover(null);\n setAnchorEl(null);\n return;\n }\n const existing = filters[col.key];\n if (col.filter.type === 'search') {\n setPendingSearch(typeof existing === 'string' ? existing : '');\n } else {\n setPendingMulti(Array.isArray(existing) ? existing : []);\n setMultiSearch('');\n }\n setAnchorEl(filterRefs.current[col.key] ?? null);\n setOpenPopover(col.key);\n };\n\n const applyFilter = (col: DataGridColumn<T>) => {\n if (!col.filter) return;\n const newValue = col.filter.type === 'search' ? pendingSearch : pendingMulti;\n setIsLoading(true);\n setFilters(prev => ({ ...prev, [col.key]: newValue }));\n setPage(0);\n setOpenPopover(null);\n };\n\n const isFilterActive = (key: string): boolean => {\n const val = filters[key];\n if (val === undefined || val === null) return false;\n return Array.isArray(val) ? val.length > 0 : val !== '';\n };\n\n const toggleSort = (key: string) => {\n setIsLoading(true);\n setSortState(prev =>\n prev?.key === key ? { key, direction: prev.direction === 'asc' ? 'desc' : 'asc' } : { key, direction: 'asc' },\n );\n setPage(0);\n };\n\n const handlePageChange = (newPage: number) => {\n setIsLoading(true);\n setPage(newPage);\n };\n\n const handlePageSizeChange = (newSize: number) => {\n setIsLoading(true);\n setCurrentPageSize(newSize);\n setPage(0);\n };\n\n const handleScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n if (paginationType !== 'scroll' || isLoading || rows.length >= total) return;\n const { scrollTop, scrollHeight, clientHeight } = e.currentTarget;\n if (scrollHeight - scrollTop - clientHeight < 48) {\n setIsLoading(true);\n setPage(p => p + 1);\n }\n },\n [paginationType, isLoading, rows.length, total],\n );\n\n const totalColumns = columns.length;\n const openCol = openPopover ? columns.find(c => c.key === openPopover) : undefined;\n const bodyHeight = currentPageSize * 48;\n const isEmpty = !isLoading && rows.length === 0;\n\n // Header cells — shared between scroll and non-scroll modes\n const headerCells = columns.map(col => (\n <th\n key={col.key}\n className={[`${CLASS}-th`, col.type === 'options' ? `${CLASS}-thOptions` : ''].join(' ')}\n style={col.width ? { width: col.width } : undefined}\n >\n <div className={`${CLASS}-thInner`} data-testid={`${CLASS}-th-${col.key}`}>\n {typeof col.label === 'string' ? <span className={`${CLASS}-thLabel`}>{col.label}</span> : col.label}\n {col.type !== 'options' && (\n <div className={`${CLASS}-thActions`}>\n {col.filter && (\n <div className={`${CLASS}-filterContainer`} data-popover-key={col.key}>\n <span\n ref={el => {\n filterRefs.current[col.key] = el;\n }}\n >\n <IconButton\n icon={\n <Icon\n name={isFilterActive(col.key) ? 'filter_alt' : 'filter_list'}\n size='sm'\n style={{ color: isFilterActive(col.key) ? 'white' : '' }}\n />\n }\n onClick={() => openFilter(col)}\n data-testid={`${CLASS}-filterBtn-${col.key}`}\n aria-label={`Filter ${col.label}`}\n />\n </span>\n </div>\n )}\n {col.sortable !== false && (\n <IconButton\n icon={\n <Icon\n name={\n sortState?.key === col.key\n ? sortState.direction === 'asc'\n ? 'arrow_upward'\n : 'arrow_downward'\n : 'unfold_more'\n }\n size='sm'\n style={{ color: sortState?.key === col.key ? 'white' : '' }}\n />\n }\n onClick={() => toggleSort(col.key)}\n data-testid={`${CLASS}-sortBtn-${col.key}`}\n aria-label={`Sort ${col.label}`}\n />\n )}\n </div>\n )}\n </div>\n </th>\n ));\n\n // In pagination mode show skeleton on every page load, in scroll mode only on initial load\n const showSkeleton = isLoading && (paginationType !== 'scroll' || rows.length === 0);\n\n // Body rows — shared between scroll and non-scroll modes\n const bodyContent = showSkeleton ? (\n <DataGridSkeleton columns={columns as DataGridColumn[]} pageSize={currentPageSize} />\n ) : isEmpty ? (\n <tr>\n <td colSpan={totalColumns} className={`${CLASS}-emptyCell`} style={{ height: `${bodyHeight}px` }}>\n {emptyContent}\n </td>\n </tr>\n ) : (\n <>\n {rows.map((row, rowIndex) => (\n <tr key={rowIndex} className={`${CLASS}-row`} data-testid={`${CLASS}-row-${rowIndex}`}>\n {columns.map(col => {\n const cellValue = (row as Record<string, unknown>)[col.key];\n return (\n <td\n key={col.key}\n className={[`${CLASS}-td`, col.type === 'options' ? `${CLASS}-tdOptions` : '']\n .filter(Boolean)\n .join(' ')}\n data-testid={`${CLASS}-cell-${col.key}-${rowIndex}`}\n >\n {col.render ? col.render(cellValue, row) : String(cellValue ?? '')}\n </td>\n );\n })}\n </tr>\n ))}\n {paginationType === 'scroll' && isLoading && (\n <tr>\n <td colSpan={totalColumns} className={`${CLASS}-loadingMore`}>\n {loadingMoreContent}\n </td>\n </tr>\n )}\n </>\n );\n\n return (\n <div className={[CLASS, className || ''].join(' ')} css={emotion(style)} data-testid={CLASS}>\n <div className={`${CLASS}-tableContainer`}>\n {paginationType === 'scroll' ? (\n <>\n {/* Fixed header table — sits outside the scroll container */}\n <table ref={headerTableRef} className={`${CLASS}-table`}>\n <colgroup>\n {columns.map(col => (\n <col key={col.key} style={col.width ? { width: col.width } : undefined} />\n ))}\n {/* Spacer column to compensate for the body's scrollbar width */}\n <col style={{ width: scrollbarWidth || 0 }} />\n </colgroup>\n <thead ref={theadRef} className={`${CLASS}-thead`}>\n <tr className={`${CLASS}-headerRow`}>\n {headerCells}\n <th aria-hidden='true' className={`${CLASS}-thScrollbarSpacer`} style={{ padding: 0 }} />\n </tr>\n </thead>\n </table>\n\n {/* Scrollable body — only this container scrolls vertically */}\n <div\n ref={bodyContainerRef}\n className={`${CLASS}-bodyContainer`}\n style={{ overflowY: 'auto', maxHeight: `${bodyHeight}px` }}\n onScroll={handleScroll}\n >\n <table className={`${CLASS}-table`} style={{ tableLayout: 'fixed', width: '100%' }}>\n <colgroup>\n {columns.map((col, i) => (\n <col\n key={col.key}\n style={{ width: colWidths[i] !== undefined ? colWidths[i] : (col.width ?? 'auto') }}\n />\n ))}\n </colgroup>\n <tbody className={`${CLASS}-tbody`}>{bodyContent}</tbody>\n </table>\n </div>\n </>\n ) : (\n <table className={`${CLASS}-table`}>\n <thead className={`${CLASS}-thead`}>\n <tr className={`${CLASS}-headerRow`}>{headerCells}</tr>\n </thead>\n <tbody className={`${CLASS}-tbody`}>{bodyContent}</tbody>\n </table>\n )}\n </div>\n {paginationType === 'pagination' && (\n <Pagination\n page={page}\n total={total}\n pageSize={currentPageSize}\n onPageChange={handlePageChange}\n pageSizeOptions={pageSizeOptions}\n onPageSizeChange={handlePageSizeChange}\n loading={isLoading}\n />\n )}\n {openCol?.filter && (\n <DataGridMenu\n filterType={openCol.filter.type}\n options={openCol.filter.options}\n columnKey={openCol.key}\n filterTitle={openCol.filter.title}\n searchLabel={openCol.filter.label}\n cancelLabel={openCol.filter.cancelLabel}\n applyLabel={openCol.filter.applyLabel}\n pendingSearch={pendingSearch}\n onSearchChange={setPendingSearch}\n pendingMulti={pendingMulti}\n onMultiChange={setPendingMulti}\n multiSearch={multiSearch}\n onMultiSearchChange={setMultiSearch}\n onCancel={() => setOpenPopover(null)}\n onApply={() => applyFilter(openCol)}\n onClear={() => {\n if (openCol.filter?.type === 'search') {\n setPendingSearch('');\n } else {\n setPendingMulti([]);\n setMultiSearch('');\n }\n }}\n anchorEl={anchorEl}\n />\n )}\n </div>\n );\n};\n\nexport default DataGrid;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { DataGridStyleProps } from './DataGrid.interface';\nimport DataGridBase from './DataGrid';\n\nconst DataGrid = <T extends object>({ theme, variant = 'default', ...rest }: DataGridStyleProps<T>) => {\n const { componentStyles } = useCreateComponentStyles([Component.DATAGRID], theme, variant.toUpperCase());\n return <DataGridBase<T> {...rest} style={componentStyles} />;\n};\n\nexport default DataGrid;\nexport type {\n DataGridProps,\n DataGridStyleProps,\n DataGridColumn,\n DataGridColumnType,\n DataGridFilterType,\n DataGridFilterOption,\n DataGridFilter,\n DataGridFetchParams,\n DataGridFetchResult,\n DataGridPaginationType,\n DataGridSortState,\n} from './DataGrid.interface';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/components/atoms/Button/Button.emotion.ts","../src/components/atoms/Button/Button.tsx","../src/components/atoms/Button/index.tsx","../src/components/atoms/Checkbox/Checkbox.emotion.ts","../src/components/molecules/CheckboxGroup/CheckboxGroup.context.ts","../src/components/molecules/CheckboxTree/CheckboxTree.context.ts","../src/components/atoms/Checkbox/Checkbox.tsx","../src/components/atoms/Checkbox/index.tsx","../src/components/atoms/Chip/Chip.emotion.ts","../src/components/atoms/Chip/Chip.tsx","../src/components/atoms/Chip/index.tsx","../src/components/atoms/DatePicker/DatePicker.emotion.ts","../src/components/atoms/DatePicker/DatePickerMenu/DatePickerMenu.emotion.ts","../src/components/atoms/DatePicker/DatePickerMenu/DatePickerMenu.tsx","../src/components/atoms/DatePicker/DatePickerMenu/index.tsx","../src/components/atoms/DatePicker/DatePicker.tsx","../src/components/atoms/DatePicker/index.tsx","../src/components/atoms/NumberField/NumberField.emotion.ts","../src/components/atoms/NumberField/NumberField.tsx","../src/components/atoms/NumberField/index.tsx","../src/components/atoms/Pagination/Pagination.emotion.ts","../src/components/atoms/Pagination/PaginationMenu/PaginationMenu.emotion.ts","../src/components/atoms/Pagination/PaginationMenu/PaginationMenu.tsx","../src/components/atoms/Pagination/PaginationMenu/index.tsx","../src/components/atoms/Pagination/Pagination.tsx","../src/components/atoms/Pagination/index.tsx","../src/components/atoms/Radio/Radio.emotion.ts","../src/components/atoms/Radio/RadioGroup.context.ts","../src/components/atoms/Radio/Radio.tsx","../src/components/atoms/Radio/index.tsx","../src/components/atoms/Select/Select.emotion.ts","../src/components/atoms/Select/SelectMenu/SelectMenu.emotion.ts","../src/components/atoms/Select/SelectMenu/SelectMenu.tsx","../src/components/atoms/Select/SelectMenu/index.tsx","../src/components/atoms/Select/Select.tsx","../src/components/atoms/Select/index.tsx","../src/components/atoms/Skeleton/Skeleton.emotion.ts","../src/components/atoms/Skeleton/Skeleton.tsx","../src/components/atoms/Slider/Slider.emotion.ts","../src/components/atoms/Slider/Slider.tsx","../src/components/atoms/Slider/index.tsx","../src/components/atoms/Switch/Switch.emotion.ts","../src/components/atoms/Switch/Switch.tsx","../src/components/atoms/Switch/index.tsx","../src/components/atoms/TextField/TextField.emotion.ts","../src/components/atoms/TextField/TextField.tsx","../src/components/atoms/TextField/index.tsx","../src/components/molecules/CheckboxGroup/CheckboxGroup.emotion.ts","../src/components/molecules/CheckboxGroup/CheckboxGroup.tsx","../src/components/molecules/CheckboxGroup/index.tsx","../src/components/molecules/CheckboxTree/CheckboxTree.emotion.ts","../src/components/molecules/CheckboxTree/CheckboxTree.tsx","../src/components/molecules/CheckboxTree/index.tsx","../src/components/molecules/Modal/Modal.emotion.ts","../src/components/molecules/Modal/Modal.tsx","../src/components/molecules/Modal/index.tsx","../src/components/molecules/RadioGroup/RadioGroup.emotion.ts","../src/components/molecules/RadioGroup/RadioGroup.tsx","../src/components/molecules/RadioGroup/index.tsx","../src/components/organisms/DataGrid/DataGrid.emotion.ts","../src/components/organisms/DataGrid/DataGridMenu/DataGridMenu.emotion.ts","../src/components/organisms/DataGrid/DataGridMenu/components/DataGridMenuSearch.tsx","../src/components/organisms/DataGrid/DataGridMenu/components/DataGridMenuMultiSelect.tsx","../src/components/organisms/DataGrid/DataGridMenu/DataGridMenu.tsx","../src/components/organisms/DataGrid/DataGridMenu/index.tsx","../src/components/organisms/DataGrid/DataGridSkeleton/DataGridSkeleton.tsx","../src/components/organisms/DataGrid/DataGrid.tsx","../src/components/organisms/DataGrid/index.tsx","../src/hocs/ThemeProvider/fonts/loadFonts.ts","../src/hocs/ThemeProvider/ThemeProvider.tsx"],"sourcesContent":["import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst styles = (theme: Record<string, string>, event: string): string => {\n return `\n // UTILS\n ${getStyle(theme, 'color', `--BUTTON-EVENTS-${event}-COLOR-PRIMARY`)}\n\n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--BUTTON-EVENTS-${event}-BACKGROUND-COLOR`)}\n\n // BORDERS\n ${getStyle(theme, 'border-color', `--BUTTON-EVENTS-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--BUTTON-EVENTS-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--BUTTON-EVENTS-${event}-BORDER-STYLE`)}\n\n // OUTLINE\n ${getStyle(theme, 'outline-color', `--BUTTON-EVENTS-${event}-OUTLINE-COLOR`)}\n ${getStyle(theme, 'outline-width', `--BUTTON-EVENTS-${event}-OUTLINE-WIDTH`)}\n ${getStyle(theme, 'outline-style', `--BUTTON-EVENTS-${event}-OUTLINE-STYLE`)}\n ${getStyle(theme, 'outline-offset', `--BUTTON-EVENTS-${event}-OUTLINE-OFFSET`)}\n `;\n};\n\nconst Style = (theme: Record<string, string>) => css`\n &.--BUTTON {\n width: 100%;\n height: 48px;\n ${getStyle(theme, 'border-radius', '--BUTTON-ROOT-BORDER-RADIUS')};\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 8px;\n text-transform: none;\n position: relative;\n text-decoration: none;\n cursor: pointer;\n padding: 13.5px 16px;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n\n // ENABLED\n ${styles(theme, 'ENABLED')};\n\n // HOVER\n &:hover {\n ${styles(theme, 'HOVER')};\n }\n\n // ACTIVE\n &.--BUTTON-active,\n &:active {\n ${styles(theme, 'ACTIVE')};\n }\n\n // FOCUS\n &:focus-visible {\n outline: none;\n ${styles(theme, 'FOCUS')};\n }\n\n // DISABLED\n &:disabled {\n pointer-events: none;\n ${styles(theme, 'DISABLED')};\n }\n\n // LOADING\n &.--BUTTON-loading {\n pointer-events: none;\n ${styles(theme, 'LOADING')};\n }\n\n .--BUTTON-iconStart,\n .--BUTTON-iconEnd {\n display: inline-flex;\n align-items: center;\n > svg {\n width: 20px;\n height: 20px;\n }\n }\n\n .--BUTTON-span {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem; // 14px\n font-weight: 500;\n line-height: 1.5;\n letter-spacing: 0.01em;\n }\n }\n`;\n\nexport default Style;\n","import React, { useState } from 'react';\n// Component Base\nimport emotion from './Button.emotion';\nimport type { ButtonProps } from './Button.interface';\n\nconst CLASS = '--BUTTON';\n\n/**\n * Buttons communicate actions that users can take. Place them in dialogs, forms, cards,\n * and toolbars.\n *\n * Supports optional leading/trailing icons and a `loading` state that visually signals\n * a pending operation.\n */\nconst Button = ({\n className,\n style,\n children = 'Click me!',\n type = 'button',\n loading = false,\n iconStart,\n iconEnd,\n ...rest\n}: ButtonProps) => {\n const [isActive, setIsActive] = useState<boolean>(false);\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (event.key === 'Enter' || event.key === 'Space') {\n setIsActive(true);\n }\n rest.onKeyDown?.(event);\n };\n\n const onKeyUp = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (event.key === 'Enter' || event.key === 'Space') {\n setIsActive(false);\n }\n rest.onKeyUp?.(event);\n };\n\n const onBlur = (event: React.FocusEvent<HTMLButtonElement>) => {\n setIsActive(false);\n rest.onBlur?.(event);\n };\n\n return (\n <button\n className={[CLASS, isActive ? `${CLASS}-active` : '', loading ? `${CLASS}-loading` : '', className || ''].join(\n ' ',\n )}\n css={emotion(style)}\n type={type}\n onKeyDown={onKeyDown}\n onKeyUp={onKeyUp}\n onBlur={onBlur}\n data-testid={CLASS}\n {...rest}\n >\n {iconStart && <span className={`${CLASS}-iconStart`}>{iconStart}</span>}\n <span className={`${CLASS}-span`}>{children}</span>\n {iconEnd && <span className={`${CLASS}-iconEnd`}>{iconEnd}</span>}\n </button>\n );\n};\n\nexport default Button;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { ButtonStyleProps } from './Button.interface';\nimport ButtonBase from './Button';\n\nconst Button = ({ theme, variant = 'default', ...rest }: ButtonStyleProps) => {\n const { componentStyles } = useCreateComponentStyles([Component.BUTTON], theme, variant.toUpperCase());\n\n return <ButtonBase {...rest} style={componentStyles} />;\n};\n\nexport default Button;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst background = (theme: Record<string, string>, event: string): string => `\n // BACKGROUNDS \n ${getStyle(theme, 'background-color', `--CHECKBOX-EVENTS-${event}-BACKGROUND-COLOR`)}\n`;\n\nconst border = (theme: Record<string, string>, event: string): string => `\n // BORDERS\n ${getStyle(theme, 'border-color', `--CHECKBOX-EVENTS-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--CHECKBOX-EVENTS-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--CHECKBOX-EVENTS-${event}-BORDER-STYLE`)}\n`;\n\nconst outline = (theme: Record<string, string>, event: string): string => ` \n // OUTLINE\n ${getStyle(theme, 'outline-color', `--CHECKBOX-EVENTS-${event}-OUTLINE-COLOR`)}\n ${getStyle(theme, 'outline-width', `--CHECKBOX-EVENTS-${event}-OUTLINE-WIDTH`)}\n ${getStyle(theme, 'outline-style', `--CHECKBOX-EVENTS-${event}-OUTLINE-STYLE`)}\n ${getStyle(theme, 'outline-offset', `--CHECKBOX-EVENTS-${event}-OUTLINE-OFFSET`)}\n`;\n\nconst shadow = (theme: Record<string, string>, event: string): string => ` \n // SHADOW\n ${getStyle(theme, 'background-color', `--CHECKBOX-EVENTS-${event}-SHADOW-COLOR`)}\n`;\n\nconst icon = (theme: Record<string, string>, event: string): string => `\n // UTILS\n > span {\n ${getStyle(theme, 'color', `--CHECKBOX-EVENTS-${event}-ICON-COLOR`)};\n }\n`;\n\nconst label = (theme: Record<string, string>, event: string): string => `\n // TYPOGRAPHY\n .--CHECKBOX-label {\n ${getStyle(theme, 'color', `--CHECKBOX-EVENTS-${event}-COLOR-PRIMARY`)}\n }\n\n ~ .--CHECKBOX-helperText {\n ${getStyle(theme, 'color', `--CHECKBOX-EVENTS-${event}-COLOR-SECONDARY`)}\n }\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--CHECKBOX {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: fit-content;\n\n .--CHECKBOX-container {\n display: flex;\n flex-direction: row;\n gap: 12px;\n align-items: center;\n cursor: pointer;\n\n // ENABLED\n ${label(theme, 'ENABLED')};\n\n // VALUE\n &:has(.--CHECKBOX-inputField:checked) {\n ${label(theme, 'VALUE')};\n }\n\n // HOVER\n &:hover {\n ${label(theme, 'HOVER')};\n\n .--CHECKBOX-checkbox .--CHECKBOX-span {\n &:before {\n opacity: 1;\n ${shadow(theme, 'HOVER')};\n }\n }\n }\n\n // ACTIVE\n &:has(.--CHECKBOX-inputField.--CHECKBOX-active, .--CHECKBOX-inputField:active) {\n ${label(theme, 'ACTIVE')};\n }\n\n // FOCUS-VISIBLE\n &:has(.--CHECKBOX-inputField:focus-visible) {\n ${label(theme, 'FOCUS')};\n }\n\n // ERROR\n &:has(.--CHECKBOX-inputField.--CHECKBOX-error) {\n ${label(theme, 'ERROR')};\n }\n\n // ERROR + VALUE\n &:has(.--CHECKBOX-inputField.--CHECKBOX-error:checked) {\n ${label(theme, 'ERROR_VALUE')};\n }\n\n // ERROR + HOVER\n &:hover:has(.--CHECKBOX-inputField.--CHECKBOX-error) {\n ${label(theme, 'ERROR_HOVER')};\n\n .--CHECKBOX-checkbox .--CHECKBOX-span {\n &:before {\n opacity: 1;\n ${shadow(theme, 'ERROR_HOVER')};\n }\n }\n }\n\n // ERROR + ACTIVE\n &:has(.--CHECKBOX-inputField.--CHECKBOX-error:active),\n &:has(.--CHECKBOX-inputField.--CHECKBOX-error.--CHECKBOX-active) {\n ${label(theme, 'ERROR_ACTIVE')};\n }\n\n // ERROR + FOCUS\n &:has(.--CHECKBOX-inputField.--CHECKBOX-error:focus-visible) {\n ${label(theme, 'ERROR_FOCUS')};\n }\n\n // DISABLED\n &:has(.--CHECKBOX-inputField:disabled) {\n pointer-events: none;\n ${label(theme, 'DISABLED')};\n }\n\n // DISABLED + VALUE\n &:has(.--CHECKBOX-inputField:disabled:checked) {\n ${label(theme, 'DISABLED_VALUE')};\n }\n\n .--CHECKBOX-checkbox {\n position: relative;\n display: inline-flex;\n width: 24px;\n height: 24px;\n isolation: isolate;\n\n .--CHECKBOX-inputField {\n cursor: pointer;\n position: absolute;\n opacity: 0;\n width: 100%;\n height: 100%;\n z-index: 2;\n margin: 0;\n -webkit-tap-highlight-color: transparent;\n\n ~ .--CHECKBOX-span > span {\n visibility: hidden;\n }\n &:checked ~ .--CHECKBOX-span > span,\n &:indeterminate ~ .--CHECKBOX-span > span {\n visibility: visible;\n }\n\n // ENABLED\n ~ .--CHECKBOX-span {\n ${background(theme, 'ENABLED')};\n ${border(theme, 'ENABLED')};\n ${icon(theme, 'ENABLED')};\n }\n\n // VALUE\n &:checked ~ .--CHECKBOX-span {\n ${background(theme, 'VALUE')};\n ${border(theme, 'VALUE')};\n ${icon(theme, 'VALUE')};\n }\n\n // INDETERMINATE (same appearance as VALUE)\n &:indeterminate ~ .--CHECKBOX-span {\n ${background(theme, 'VALUE')};\n ${border(theme, 'VALUE')};\n ${icon(theme, 'VALUE')};\n }\n\n // HOVER\n // Is at the container level\n\n // ACTIVE\n &.--CHECKBOX-active ~ .--CHECKBOX-span,\n &:active ~ .--CHECKBOX-span {\n &:before {\n opacity: 1;\n ${shadow(theme, 'ACTIVE')};\n }\n }\n\n // FOCUS\n &:focus-visible ~ .--CHECKBOX-span {\n outline: none;\n ${outline(theme, 'FOCUS')};\n ${icon(theme, 'FOCUS')};\n }\n\n // ERROR\n &.--CHECKBOX-error ~ .--CHECKBOX-span {\n ${background(theme, 'ERROR')};\n ${border(theme, 'ERROR')};\n ${icon(theme, 'ERROR')};\n }\n\n // ERROR + VALUE\n &.--CHECKBOX-error:checked ~ .--CHECKBOX-span {\n ${background(theme, 'ERROR_VALUE')};\n ${border(theme, 'ERROR_VALUE')};\n ${icon(theme, 'ERROR_VALUE')};\n }\n\n // ERROR + VALUE\n // Is at the container level\n\n // ERROR + ACTIVE\n &.--CHECKBOX-error:active ~ .--CHECKBOX-span,\n &.--CHECKBOX-error.--CHECKBOX-active ~ .--CHECKBOX-span {\n &:before {\n opacity: 1;\n ${shadow(theme, 'ERROR_ACTIVE')};\n }\n }\n\n // ERROR + FOCUS\n &.--CHECKBOX-error:focus-visible ~ .--CHECKBOX-span {\n ${outline(theme, 'ERROR_FOCUS')};\n ${icon(theme, 'ERROR_FOCUS')};\n }\n\n // DISABLED\n &:disabled ~ .--CHECKBOX-span {\n ${background(theme, 'DISABLED')};\n ${border(theme, 'DISABLED')};\n ${icon(theme, 'DISABLED')};\n }\n\n // DISABLED + VALUE\n &:disabled:checked ~ .--CHECKBOX-span {\n ${background(theme, 'DISABLED_VALUE')};\n ${border(theme, 'DISABLED_VALUE')};\n ${icon(theme, 'DISABLED_VALUE')};\n }\n }\n\n .--CHECKBOX-span {\n width: 24px;\n height: 24px;\n ${getStyle(theme, 'border-radius', '--CHECKBOX-ROOT-BORDER-RADIUS')};\n position: absolute;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n transition:\n background-color 150ms ease-in-out,\n border-color 150ms ease-in-out;\n\n > span {\n width: 100%;\n height: auto;\n z-index: 1;\n }\n\n &:before {\n content: '';\n position: absolute;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n opacity: 0;\n transition: opacity 150ms ease-in-out;\n z-index: -1;\n }\n }\n }\n\n .--CHECKBOX-label {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1;\n }\n }\n\n .--CHECKBOX-helperText {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 13px;\n line-height: 16px;\n margin-left: 14px;\n }\n }\n`;\n\nexport default Style;\n","import { createContext } from 'react';\n\nexport interface CheckboxGroupContextValue {\n /** Array of currently checked option values */\n checkedValues: string[];\n /** Toggle a value in/out of the checked array */\n onChange: (value: string, checked: boolean) => void;\n /** Group-level disabled state */\n disabled?: boolean;\n /** Group-level validation error */\n error?: { message?: string };\n}\n\nexport const CheckboxGroupContext = createContext<CheckboxGroupContextValue | null>(null);\n","import { createContext } from 'react';\n\nexport interface CheckboxTreeContextValue {\n /** Array of currently checked option values */\n checkedValues: string[];\n /** Toggle a value in/out of the checked array */\n onChange: (value: string, checked: boolean) => void;\n /** Tree-level disabled state */\n disabled?: boolean;\n /** Tree-level validation error */\n error?: { message?: string };\n}\n\nexport const CheckboxTreeContext = createContext<CheckboxTreeContextValue | null>(null);\n","import React, { useState, useContext } from 'react';\n// Component Base\nimport emotion from './Checkbox.emotion';\nimport type { CheckboxProps, CheckboxBaseProps } from './Checkbox.interface';\nimport { CheckboxGroupContext } from '../../molecules/CheckboxGroup/CheckboxGroup.context';\nimport { CheckboxTreeContext } from '../../molecules/CheckboxTree/CheckboxTree.context';\n// External Libraries\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\n// Custom Components\nimport Icon from '@components/atoms/Icon';\n\nconst CLASS = '--CHECKBOX';\n\n/**\n * Headless presentational layer for the checkbox.\n * Accepts `checked` and `onChecked` directly — use this when you need a controlled checkbox outside of React Hook Form.\n */\nexport const CheckboxBase = React.forwardRef<HTMLInputElement, CheckboxBaseProps>(\n (\n {\n label,\n icon = <Icon name='check' />,\n helperText,\n showErrorText = true,\n className,\n style = {},\n disabled,\n checked,\n onChecked,\n error,\n onKeyDown,\n onKeyUp,\n onBlur,\n ...rest\n }: CheckboxBaseProps,\n ref,\n ) => {\n const [isActive, setIsActive] = useState(false);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' || event.key === 'Space') setIsActive(true);\n onKeyDown?.(event);\n };\n\n const handleKeyUp = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' || event.key === 'Space') {\n setIsActive(false);\n onChecked(!checked);\n }\n onKeyUp?.(event);\n };\n\n const handleBlur = () => {\n setIsActive(false);\n onBlur?.({} as React.FocusEvent<HTMLInputElement>);\n };\n\n return (\n <div\n className={[CLASS, isActive ? `${CLASS}-active` : '', className || ''].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n <label className={`${CLASS}-container`}>\n <div className={`${CLASS}-checkbox`}>\n <input\n className={[\n `${CLASS}-inputField`,\n isActive ? `${CLASS}-active` : '',\n showErrorText && error && `${CLASS}-error`,\n ].join(' ')}\n type='checkbox'\n checked={checked}\n disabled={disabled}\n onChange={e => onChecked(e.target.checked)}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onBlur={handleBlur}\n ref={ref}\n data-testid={`${CLASS}-inputField`}\n {...rest}\n />\n <span className={`${CLASS}-span`} data-testid={`${CLASS}-icon`}>\n {icon}\n </span>\n </div>\n <span className={`${CLASS}-label`} data-testid={`${CLASS}-label`}>\n {label}\n </span>\n </label>\n {(helperText || showErrorText) && (\n <span className={`${CLASS}-helperText`} data-testid={`${CLASS}-helperText`}>\n {helperText && (!error || !showErrorText) && helperText}\n {showErrorText && error && error.message}\n </span>\n )}\n </div>\n );\n },\n);\n\nCheckboxBase.displayName = 'CheckboxBase';\n\nconst CheckboxRHF = <TFieldValues extends FieldValues = FieldValues>({\n name,\n control,\n ...rest\n}: CheckboxProps<TFieldValues>) => {\n const { field, fieldState } = useController({ control: control!, name: name! as FieldPath<TFieldValues> });\n const [value, setValue] = useState<boolean>(field.value || false);\n const errorText = fieldState.error;\n\n const onChecked = (checked: boolean) => {\n field.onChange(checked);\n setValue(checked);\n if (errorText) field.onBlur();\n };\n\n return (\n <CheckboxBase\n {...rest}\n name={name}\n checked={value}\n onChecked={onChecked}\n onBlur={() => field.onBlur()}\n error={errorText}\n />\n );\n};\n\nconst Checkbox = <TFieldValues extends FieldValues = FieldValues>(props: CheckboxProps<TFieldValues>) => {\n const groupCtx = useContext(CheckboxGroupContext);\n const treeCtx = useContext(CheckboxTreeContext);\n const ctx = groupCtx ?? treeCtx;\n\n if (typeof props.checked === 'boolean' && !props.control) {\n const { checked, onChecked, name, control, ...rest } = props;\n return <CheckboxBase {...rest} name={name} checked={checked} onChecked={onChecked ?? (() => {})} />;\n }\n\n if (ctx) {\n const { value, name, control, ...rest } = props;\n const itemValue = (value as string) ?? name ?? '';\n const checked = ctx.checkedValues.includes(itemValue);\n\n return (\n <CheckboxBase\n {...rest}\n name={name}\n value={itemValue}\n checked={checked}\n onChecked={c => ctx.onChange(itemValue, c)}\n disabled={rest.disabled ?? ctx.disabled}\n error={ctx.error}\n showErrorText={false}\n helperText={undefined}\n />\n );\n }\n\n return <CheckboxRHF {...props} />;\n};\n\nexport default Checkbox;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { CheckboxStyleProps } from './Checkbox.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport CheckboxBase from './Checkbox';\n\nconst Checkbox = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: CheckboxStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.CHECKBOX], theme, variant.toUpperCase());\n\n return <CheckboxBase {...rest} style={componentStyles} />;\n};\n\nexport default Checkbox;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst Style = (theme: Record<string, string>) => css`\n &.--CHIP {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n height: 24px;\n width: fit-content;\n border-radius: 999px;\n white-space: nowrap;\n box-sizing: border-box;\n\n // TYPOGRAPHY\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n line-height: 1.4;\n\n ${getStyle(theme, 'background-color', '--CHIP-EVENTS-ENABLED-BACKGROUND-COLOR')};\n ${getStyle(theme, 'color', '--CHIP-EVENTS-ENABLED-COLOR-PRIMARY')};\n ${getStyle(theme, 'border-color', '--CHIP-EVENTS-ENABLED-BORDER-COLOR')};\n ${getStyle(theme, 'border-width', '--CHIP-EVENTS-ENABLED-BORDER-WIDTH')};\n ${getStyle(theme, 'border-style', '--CHIP-EVENTS-ENABLED-BORDER-STYLE')};\n\n .--CHIP-label {\n padding: 0 10px;\n }\n }\n`;\n\nexport default Style;\n","import type { FC } from 'react';\nimport emotion from './Chip.emotion';\nimport type { ChipBaseProps } from './Chip.interface';\n\nconst CLASS = '--CHIP';\n\nconst Chip: FC<ChipBaseProps> = ({ children, className, style = {} }) => (\n <div className={[CLASS, className].filter(Boolean).join(' ')} css={emotion(style)} data-testid={CLASS}>\n {typeof children === 'string' ? <span className={`${CLASS}-label`}>{children}</span> : children}\n </div>\n);\n\nexport default Chip;\n","import type { FC } from 'react';\nimport { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { ChipStyleProps } from './Chip.interface';\nimport ChipBase from './Chip';\n\nexport type { ChipStyleProps, ChipVariant } from './Chip.interface';\n\nconst Chip: FC<ChipStyleProps> = ({ theme, variant = 'default', ...rest }) => {\n const { componentStyles } = useCreateComponentStyles([Component.CHIP], theme, variant.toUpperCase());\n return <ChipBase {...rest} style={componentStyles} />;\n};\n\nexport default Chip;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst border = (theme: Record<string, string>, event: string): string => `\n ${getStyle(theme, 'border-color', `--DATEPICKER-EVENTS-${event}-BORDER-COLOR`)};\n ${getStyle(theme, 'border-width', `--DATEPICKER-EVENTS-${event}-BORDER-WIDTH`)};\n ${getStyle(theme, 'border-style', `--DATEPICKER-EVENTS-${event}-BORDER-STYLE`)};\n`;\n\nconst labelStyles = (theme: Record<string, string>, event: string, activateLabel = false): string => `\n ${getStyle(theme, 'color', `--DATEPICKER-EVENTS-${event}-COLOR-SECONDARY`)};\n ${activateLabel ? 'transform: translate(14px, -24px); font-size: 0.75rem;' : ''};\n`;\n\nconst legendStyles = (activate: boolean): string => `\n .--DATEPICKER-legend {\n max-width: ${activate ? '100%' : '0px'};\n }\n`;\n\nconst container = (theme: Record<string, string>, event: string): string => `\n ${getStyle(theme, 'background-color', `--DATEPICKER-EVENTS-${event}-BACKGROUND-COLOR`)};\n ~ .--DATEPICKER-helperText {\n ${getStyle(theme, 'color', `--DATEPICKER-EVENTS-${event}-COLOR-TERTIARY`)};\n }\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--DATEPICKER {\n position: relative;\n padding: 0;\n border: 0;\n width: 100%;\n\n &.--DATEPICKER-paddingBottom {\n padding-bottom: 24px;\n }\n\n .--DATEPICKER-container {\n box-sizing: border-box;\n position: relative;\n display: inline-flex;\n align-items: center;\n min-height: 48px;\n\n width: -webkit-fill-available;\n width: -moz-available;\n width: stretch;\n\n ${getStyle(theme, 'border-radius', '--DATEPICKER-ROOT-BORDER-RADIUS')};\n\n // ENABLED\n ${container(theme, 'ENABLED')};\n\n // VALUE (field has content or calendar is open)\n &:has(.--DATEPICKER-fieldRow.--DATEPICKER-open) {\n ${container(theme, 'VALUE')};\n }\n\n // HOVER\n &:has(.--DATEPICKER-fieldRow:hover) {\n ${container(theme, 'HOVER')};\n }\n\n // ACTIVE\n &:has(.--DATEPICKER-fieldRow:active) {\n ${container(theme, 'ACTIVE')};\n }\n\n // FOCUS (user is typing inside the 3 sub-inputs)\n &:has(.--DATEPICKER-fieldRow:focus-within) {\n outline: none;\n ${container(theme, 'FOCUS')};\n }\n\n // ERROR\n &:has(.--DATEPICKER-fieldRow.--DATEPICKER-error) {\n ${container(theme, 'ERROR')};\n }\n\n // ERROR + VALUE\n &:has(.--DATEPICKER-fieldRow.--DATEPICKER-error.--DATEPICKER-open) {\n ${container(theme, 'ERROR_VALUE')};\n }\n\n // ERROR + HOVER\n &:has(.--DATEPICKER-fieldRow.--DATEPICKER-error:hover) {\n ${container(theme, 'ERROR_HOVER')};\n }\n\n // ERROR + ACTIVE\n &:has(.--DATEPICKER-fieldRow.--DATEPICKER-error:active) {\n ${container(theme, 'ERROR_ACTIVE')};\n }\n\n // ERROR + FOCUS\n &:has(.--DATEPICKER-fieldRow.--DATEPICKER-error:focus-within) {\n ${container(theme, 'ERROR_FOCUS')};\n }\n\n // DISABLED\n &:has(.--DATEPICKER-fieldRow.--DATEPICKER-disabled) {\n pointer-events: none;\n ${container(theme, 'DISABLED')};\n }\n\n // DISABLED + VALUE\n &:has(.--DATEPICKER-fieldRow.--DATEPICKER-disabled.--DATEPICKER-open) {\n pointer-events: none;\n ${container(theme, 'DISABLED_VALUE')};\n }\n\n .--DATEPICKER-fieldRow {\n display: flex;\n align-items: center;\n gap: 0px;\n\n height: -webkit-fill-available;\n height: -moz-available;\n height: stretch;\n width: -webkit-fill-available;\n width: -moz-available;\n width: stretch;\n\n min-width: 0;\n border: 0;\n margin: 0;\n padding: 15px 14px;\n background-color: transparent;\n cursor: text;\n box-sizing: border-box;\n\n // ── Label / fieldset states triggered as sibling ────────────────\n\n // ENABLED\n ~ .--DATEPICKER-label {\n ${labelStyles(theme, 'ENABLED', true)};\n }\n ~ .--DATEPICKER-fieldset {\n ${border(theme, 'ENABLED')};\n ${legendStyles(true)};\n }\n\n // VALUE\n &.--DATEPICKER-open {\n ~ .--DATEPICKER-label {\n ${labelStyles(theme, 'VALUE', true)};\n }\n ~ .--DATEPICKER-fieldset {\n ${border(theme, 'VALUE')};\n ${legendStyles(true)};\n }\n }\n\n // HOVER\n &:hover {\n ~ .--DATEPICKER-label {\n ${labelStyles(theme, 'HOVER')};\n }\n ~ .--DATEPICKER-fieldset {\n ${border(theme, 'HOVER')};\n }\n }\n\n // FOCUS (typing in sub-inputs)\n &:focus-within {\n ~ .--DATEPICKER-label {\n ${labelStyles(theme, 'FOCUS', true)};\n }\n ~ .--DATEPICKER-fieldset {\n ${border(theme, 'FOCUS')};\n ${legendStyles(true)};\n }\n }\n\n // ERROR\n &.--DATEPICKER-error {\n ~ .--DATEPICKER-label {\n ${labelStyles(theme, 'ERROR')};\n }\n ~ .--DATEPICKER-fieldset {\n ${border(theme, 'ERROR')};\n }\n }\n\n // ERROR + VALUE\n &.--DATEPICKER-error.--DATEPICKER-open {\n ~ .--DATEPICKER-label {\n ${labelStyles(theme, 'ERROR_VALUE')};\n }\n ~ .--DATEPICKER-fieldset {\n ${border(theme, 'ERROR_VALUE')};\n }\n }\n\n // ERROR + HOVER\n &.--DATEPICKER-error:hover {\n ~ .--DATEPICKER-label {\n ${labelStyles(theme, 'ERROR_HOVER')};\n }\n ~ .--DATEPICKER-fieldset {\n ${border(theme, 'ERROR_HOVER')};\n }\n }\n\n // ERROR + FOCUS\n &.--DATEPICKER-error:focus-within {\n ~ .--DATEPICKER-label {\n ${labelStyles(theme, 'ERROR_FOCUS')};\n }\n ~ .--DATEPICKER-fieldset {\n ${border(theme, 'ERROR_FOCUS')};\n ${legendStyles(true)};\n }\n }\n\n // DISABLED\n &.--DATEPICKER-disabled {\n user-select: none;\n pointer-events: none;\n cursor: default;\n\n .--DATEPICKER-partInput {\n ${getStyle(theme, 'color', '--DATEPICKER-EVENTS-DISABLED-COLOR-PRIMARY')};\n }\n .--DATEPICKER-separator {\n ${getStyle(theme, 'color', '--DATEPICKER-EVENTS-DISABLED-COLOR-PRIMARY')};\n }\n\n ~ .--DATEPICKER-label {\n ${labelStyles(theme, 'DISABLED')};\n }\n ~ .--DATEPICKER-fieldset {\n ${border(theme, 'DISABLED')};\n }\n }\n\n // ── Sub-input elements ───────────────────────────────────────────\n\n .--DATEPICKER-separator {\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 400;\n letter-spacing: 0.01em;\n line-height: 1;\n ${getStyle(theme, 'color', '--DATEPICKER-EVENTS-ENABLED-COLOR-PRIMARY')};\n user-select: none;\n padding: 0 2px;\n }\n\n .--DATEPICKER-partInput {\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: 1;\n padding: 0;\n margin: 0;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n white-space: nowrap;\n user-select: none;\n cursor: text;\n outline: none;\n\n &.--DATEPICKER-placeholder {\n ${getStyle(theme, 'color', '--DATEPICKER-EVENTS-ENABLED-COLOR-SECONDARY')};\n }\n\n &:focus {\n ${getStyle(theme, 'background-color', '--DATEPICKER-EVENTS-VALUE-BORDER-COLOR')};\n border-radius: 2px;\n }\n\n &:focus-visible {\n outline: none;\n }\n\n ${getStyle(theme, 'color', '--DATEPICKER-EVENTS-ENABLED-COLOR-PRIMARY')};\n }\n }\n\n // ── Calendar icon button ─────────────────────────────────────────\n\n .--DATEPICKER-calendarIcon {\n flex-shrink: 0;\n ${getStyle(theme, 'color', '--DATEPICKER-EVENTS-ENABLED-ICON-COLOR')};\n }\n\n // ── Floating label ───────────────────────────────────────────────\n\n .--DATEPICKER-label {\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: normal;\n\n padding: 0;\n display: block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n position: absolute;\n pointer-events: none;\n z-index: 4;\n\n transform: translate(14px, 0px);\n transition: 150ms ease-in-out;\n }\n\n // ── Fieldset border ──────────────────────────────────────────────\n\n .--DATEPICKER-fieldset {\n height: 100%;\n width: -webkit-fill-available;\n width: -moz-available;\n width: stretch;\n\n text-align: left;\n position: absolute;\n margin: 0;\n padding: 0 6px;\n pointer-events: none;\n overflow: hidden;\n z-index: 5;\n box-sizing: border-box;\n ${getStyle(theme, 'border-radius', '--DATEPICKER-ROOT-BORDER-RADIUS')};\n -webkit-tap-highlight-color: transparent;\n\n .--DATEPICKER-legend {\n width: auto;\n overflow: hidden;\n display: block;\n padding: 0;\n height: 0px;\n visibility: hidden;\n\n max-width: 0px;\n transition: max-width 150ms ease-in-out;\n\n .--DATEPICKER-text {\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.75rem;\n letter-spacing: 0.01em;\n font-weight: 500;\n padding: 0px 7px;\n }\n }\n }\n\n .--DATEPICKER-adornment {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0px 12px;\n }\n }\n\n .--DATEPICKER-helperText {\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.75rem;\n line-height: 1;\n\n display: block;\n margin-top: 8px;\n margin-left: 14px;\n height: 16px;\n }\n }\n`;\n\nexport default Style;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst outline = (theme: Record<string, string>, event: string): string => ` \n // OUTLINE\n ${getStyle(theme, 'outline-color', `--DATEPICKERMENU-EVENTS-${event}-OUTLINE-COLOR`)}\n ${getStyle(theme, 'outline-width', `--DATEPICKERMENU-EVENTS-${event}-OUTLINE-WIDTH`)}\n ${getStyle(theme, 'outline-style', `--DATEPICKERMENU-EVENTS-${event}-OUTLINE-STYLE`)}\n ${getStyle(theme, 'outline-offset', `--DATEPICKERMENU-EVENTS-${event}-OUTLINE-OFFSET`)}\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--DATEPICKERMENU {\n z-index: 100;\n position: absolute;\n top: 52px;\n left: 0px;\n box-shadow:\n rgba(0, 0, 0, 0.2) 0px 5px 5px -3px,\n rgba(0, 0, 0, 0.14) 0px 8px 10px 1px,\n rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;\n ${getStyle(theme, 'border-radius', '--DATEPICKERMENU-ROOT-BORDER-RADIUS')};\n ${getStyle(theme, 'background-color', '--DATEPICKERMENU-ROOT-BACKGROUND-COLOR')};\n box-sizing: border-box;\n padding: 16px;\n width: 272px;\n height: autopx;\n\n // Animation\n display: none;\n opacity: 0;\n translate: 0px -10px;\n transition-property: display opacity translate;\n transition-duration: 150ms;\n transition-behavior: allow-discrete;\n\n &.--DATEPICKERMENU-open {\n display: block;\n opacity: 1;\n translate: 0px 0px;\n\n @starting-style {\n opacity: 0;\n translate: 0px -10px;\n }\n }\n\n &.--DATEPICKERMENU-static {\n position: static;\n margin-top: 8px;\n }\n\n // ── Header (month/year + navigation) ──────────────────────────────────────\n\n .--DATEPICKERMENU-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin: 0 0px 12px 4px;\n\n .--DATEPICKERMENU-yearToggle {\n display: flex;\n gap: 12px;\n align-items: center;\n\n .--DATEPICKERMENU-labelWrap {\n overflow-x: hidden;\n\n .--DATEPICKERMENU-headerLabel {\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 1rem;\n ${getStyle(theme, 'color', '--DATEPICKERMENU-EVENTS-ENABLED-COLOR-PRIMARY')};\n\n .--DATEPICKERMENU-yearLabel {\n font-family: ${theme['--FONTFAMILY-SECONDARY'] || theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.938rem;\n ${getStyle(theme, 'color', '--DATEPICKERMENU-EVENTS-ENABLED-COLOR-PRIMARY')};\n }\n }\n\n // Slide animations when month changes\n &.--DATEPICKERMENU-slideLeft .--DATEPICKERMENU-headerLabel {\n animation: dpSlideFromLeft 150ms ease-in-out;\n }\n &.--DATEPICKERMENU-slideRight .--DATEPICKERMENU-headerLabel {\n animation: dpSlideFromRight 150ms ease-in-out;\n }\n }\n\n .--DATEPICKERMENU-yearArrow {\n ${getStyle(theme, 'color', '--DATEPICKERMENU-EVENTS-ENABLED-ICON-COLOR')};\n }\n }\n\n .--DATEPICKERMENU-monthNav {\n display: flex;\n gap: 12px;\n\n .--DATEPICKERMENU-navArrow {\n ${getStyle(theme, 'color', '--DATEPICKERMENU-EVENTS-ENABLED-ICON-COLOR')};\n }\n }\n }\n\n // ── Calendar grid ─────────────────────────────────────────────────────────\n\n .--DATEPICKERMENU-body {\n display: flex;\n flex-direction: column;\n gap: 12px;\n overflow-y: clip;\n height: 245px;\n\n &.--DATEPICKERMENU-yearBody {\n overflow: clip;\n overflow-clip-margin: 18px;\n }\n }\n\n .--DATEPICKERMENU-yearScrollWrapper {\n display: flex;\n flex-direction: column;\n gap: 12px;\n overflow-y: scroll;\n height: 100%;\n width: calc(100% + 24px);\n margin-left: -8px;\n padding: 8px;\n box-sizing: border-box;\n scroll-padding: 8px;\n\n &::-webkit-scrollbar {\n width: 12px;\n height: 4px;\n cursor: pointer;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0.5);\n border-radius: 9999px;\n border: 3px solid transparent;\n background-clip: padding-box;\n }\n }\n\n .--DATEPICKERMENU-weekRow {\n display: flex;\n width: 100%;\n justify-content: space-between;\n gap: 12px;\n }\n\n // Viewport that clips the slide animation while letting outlines overflow\n .--DATEPICKERMENU-gridViewport {\n overflow: clip;\n overflow-clip-margin: 6px;\n }\n\n // Month grid (with slide animation)\n .--DATEPICKERMENU-calendarGrid {\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n &.--DATEPICKERMENU-slideLeft {\n animation: dpSlideFromLeft 150ms ease-in-out;\n }\n &.--DATEPICKERMENU-slideRight {\n animation: dpSlideFromRight 150ms ease-in-out;\n }\n }\n\n // ── Day cells ─────────────────────────────────────────────────────────────\n\n .--DATEPICKERMENU-dayCell {\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 14px;\n ${getStyle(theme, 'color', '--DATEPICKERMENU-EVENTS-ENABLED-COLOR-SECONDARY')};\n width: 24px;\n height: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: transparent;\n }\n\n .--DATEPICKERMENU-dayBtn {\n width: 24px;\n height: 24px;\n cursor: pointer;\n border: none;\n border-radius: 4px;\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 14px;\n ${getStyle(theme, 'color', '--DATEPICKERMENU-EVENTS-ENABLED-COLOR-PRIMARY')};\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: transparent;\n isolation: isolate;\n padding: 0px;\n\n &::before {\n content: '';\n position: absolute;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n opacity: 0;\n transition: opacity 150ms ease-in-out;\n z-index: -1;\n }\n\n // Hover\n &:hover {\n ::before {\n opacity: 1;\n ${getStyle(theme, 'background-color', '--DATEPICKERMENU-EVENTS-HOVER-BACKGROUND-COLOR')};\n }\n }\n\n // Active\n &:active {\n &::before {\n opacity: 1;\n ${getStyle(theme, 'background-color', '--DATEPICKERMENU-EVENTS-ACTIVE-BACKGROUND-COLOR')};\n }\n }\n\n // Focus\n &.--DATEPICKERMENU-focused,\n &:focus-visible {\n outline: none;\n ${outline(theme, 'FOCUS')};\n }\n\n &.--DATEPICKERMENU-today {\n ${getStyle(theme, 'background-color', '--DATEPICKERMENU-EVENTS-ENABLED-BACKGROUND-COLOR')};\n }\n\n &.--DATEPICKERMENU-selected {\n ${getStyle(theme, 'background-color', '--DATEPICKERMENU-EVENTS-VALUE-BACKGROUND-COLOR')};\n ${getStyle(theme, 'color', '--DATEPICKERMENU-EVENTS-VALUE-COLOR-PRIMARY')};\n }\n\n &:disabled {\n pointer-events: none;\n cursor: default;\n ${getStyle(theme, 'color', '--DATEPICKERMENU-EVENTS-DISABLED-COLOR-PRIMARY')};\n background-color: transparent;\n\n &.--DATEPICKERMENU-selected {\n ${getStyle(theme, 'background-color', '--DATEPICKERMENU-EVENTS-DISABLED-COLOR-PRIMARY')};\n }\n\n &.--DATEPICKERMENU-today::after {\n ${getStyle(theme, 'background-color', '--DATEPICKERMENU-EVENTS-DISABLED-COLOR-PRIMARY')};\n }\n }\n }\n\n // ── Year cells ────────────────────────────────────────────────────────────\n\n .--DATEPICKERMENU-yearBtn {\n cursor: pointer;\n border: none;\n border-radius: 4px;\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 14px;\n ${getStyle(theme, 'color', '--DATEPICKERMENU-EVENTS-ENABLED-COLOR-PRIMARY')};\n width: 40.5px;\n height: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: transparent;\n position: relative;\n isolation: isolate;\n padding: 0px;\n\n &::before {\n content: '';\n position: absolute;\n width: 54px;\n height: 36px;\n border-radius: 18px;\n opacity: 0;\n transition: opacity 150ms ease-in-out;\n z-index: -1;\n }\n\n // Hover\n &:hover {\n ::before {\n opacity: 1;\n ${getStyle(theme, 'background-color', '--DATEPICKERMENU-EVENTS-HOVER-BACKGROUND-COLOR')};\n }\n }\n\n // Active\n &:active {\n &::before {\n opacity: 1;\n ${getStyle(theme, 'background-color', '--DATEPICKERMENU-EVENTS-ACTIVE-BACKGROUND-COLOR')};\n }\n }\n\n // Focus\n &.--DATEPICKERMENU-focused,\n &:focus-visible {\n outline: none;\n ${outline(theme, 'FOCUS')};\n }\n\n &.--DATEPICKERMENU-selected {\n ${getStyle(theme, 'background-color', '--DATEPICKERMENU-EVENTS-VALUE-BACKGROUND-COLOR')};\n ${getStyle(theme, 'color', '--DATEPICKERMENU-EVENTS-VALUE-COLOR-PRIMARY')};\n }\n }\n }\n\n @keyframes dpSlideFromLeft {\n from {\n translate: -100% 0;\n }\n to {\n translate: 0 0;\n }\n }\n\n @keyframes dpSlideFromRight {\n from {\n translate: 100% 0;\n }\n to {\n translate: 0 0;\n }\n }\n`;\n\nexport default Style;\n","import React, { forwardRef, useEffect, useLayoutEffect, useRef, useState } from 'react';\n// Component Base\nimport emotion from './DatePickerMenu.emotion';\nimport type { DatePickerMenuProps } from './DatePickerMenu.interface';\n// External Libraries\nimport { format as formatDate, isValid } from 'date-fns';\n// Custom Components\nimport IconButton from '@components/atoms/IconButton';\nimport Icon from '@components/atoms/Icon';\n\nconst CLASS = '--DATEPICKERMENU';\n\n/**\n * Calendar popup for `DatePicker`.\n *\n * Displays a monthly grid with weekday headers, month/year navigation, and a\n * scrollable year-picker. Keyboard navigation (arrow keys, Enter, Escape) is\n * handled by the parent `DatePicker`; this component focuses the active day\n * button when `focusedElement` changes.\n */\nconst DatePickerMenu = forwardRef<HTMLDivElement, DatePickerMenuProps>(\n (\n {\n isOpen,\n hasStaticOptions = false,\n testId = `${CLASS}-root`,\n monthLabel = '',\n yearLabel = '',\n onPrevMonth,\n onNextMonth,\n disablePrev = false,\n disableNext = false,\n weeks = [],\n years = [],\n daysOfWeek = [],\n selectedValue,\n format = 'MM/dd/yyyy',\n today,\n focusedElement = -1,\n onSelectDay = () => {},\n onSelectYear = () => {},\n onMoveFocus = () => {},\n onClose = () => {},\n style,\n },\n ref,\n ) => {\n const [openYearPicker, setOpenYearPicker] = useState(false);\n const [slideDir, setSlideDir] = useState<'left' | 'right' | null>(null);\n const [slideKey, setSlideKey] = useState(0);\n const [iconHasFocus, setIconHasFocus] = useState(false);\n const [focusedYear, setFocusedYear] = useState(-1);\n\n const dayRefs = useRef<Record<number, HTMLButtonElement | null>>({});\n const yearRefs = useRef<Record<number, HTMLButtonElement | null>>({});\n const menuInnerRef = useRef<HTMLDivElement>(null);\n\n // ── Trigger slide animation when month changes ────────────────────────────\n const prevMonth = useRef(monthLabel + yearLabel);\n useEffect(() => {\n if (!isOpen) return;\n const current = monthLabel + yearLabel;\n if (current === prevMonth.current) return;\n prevMonth.current = current;\n }, [monthLabel, yearLabel, isOpen]);\n\n const onPrev = () => {\n setSlideDir('left');\n setSlideKey(k => k + 1);\n onPrevMonth();\n };\n\n const onNext = () => {\n setSlideDir('right');\n setSlideKey(k => k + 1);\n onNextMonth();\n };\n\n // ── Focus the active day button (keyboard navigation) ─────────────────────\n useEffect(() => {\n if (!isOpen || focusedElement < 0) return;\n const el = dayRefs.current[focusedElement];\n if (!el) return;\n\n const active = document.activeElement as HTMLElement | null;\n const inputFocused = Boolean(active && (active.tagName === 'INPUT' || active.role === 'combobox'));\n\n if (inputFocused) {\n el.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n } else {\n el.focus();\n el.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n }\n }, [focusedElement, isOpen]);\n\n // ── Close year picker when calendar closes (delayed to match close animation) ──\n useEffect(() => {\n if (!isOpen) {\n const timer = setTimeout(() => setOpenYearPicker(false), 150);\n return () => clearTimeout(timer);\n }\n }, [isOpen]);\n\n // ── Auto-focus the target year when year picker opens ─────────────────────\n useLayoutEffect(() => {\n if (!openYearPicker) {\n setFocusedYear(-1);\n return;\n }\n const targetYear =\n selectedValue && isValid(selectedValue)\n ? selectedValue.getFullYear()\n : (today?.getFullYear() ?? new Date().getFullYear());\n const flat = years.flat();\n const idx = flat.findIndex(y => y.label === String(targetYear));\n setFocusedYear(idx >= 0 ? idx : 0);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [openYearPicker]);\n\n // ── Focus the year button when focusedYear changes ────────────────────────\n useLayoutEffect(() => {\n if (!openYearPicker || focusedYear < 0) return;\n const el = yearRefs.current[focusedYear];\n if (!el) return;\n el.focus({ preventScroll: true });\n el.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n }, [focusedYear, openYearPicker]);\n\n // ── Key handler on day buttons ────────────────────────────────────────────\n const onDayKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>, value: string) => {\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(e.key)) {\n e.preventDefault();\n e.stopPropagation();\n onMoveFocus(e.key);\n return;\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n onSelectDay(value, true);\n }\n };\n\n // ── Tab cycle among header icons + focused day ────────────────────────────\n const queryBtn = (root: HTMLElement, selector: string): HTMLElement | null => {\n const el = root.querySelector<HTMLElement>(selector);\n if (!el) return null;\n return el.tagName === 'BUTTON' ? el : el.querySelector<HTMLElement>('button');\n };\n\n // ── Year arrow-key navigation ─────────────────────────────────────────────\n const moveYearFocus = (key: string) => {\n const cols = years[0]?.length ?? 4;\n const delta = ({ ArrowRight: 1, ArrowLeft: -1, ArrowDown: cols, ArrowUp: -cols } as Record<string, number>)[key];\n if (!delta) return;\n const next = focusedYear + delta;\n if (next < 0 || next >= years.flat().length) return;\n setFocusedYear(next);\n };\n\n const cycleFocus = (reverse: boolean) => {\n const root = menuInnerRef.current;\n if (!root) return;\n\n const yearBtn = queryBtn(root, `.${CLASS}-yearArrow`);\n const navArrows = Array.from(root.querySelectorAll<HTMLElement>(`.${CLASS}-navArrow`));\n const prevBtn = !openYearPicker\n ? navArrows[0]?.tagName === 'BUTTON'\n ? navArrows[0]\n : (navArrows[0]?.querySelector<HTMLElement>('button') ?? null)\n : null;\n const nextBtn = !openYearPicker\n ? navArrows[1]?.tagName === 'BUTTON'\n ? navArrows[1]\n : (navArrows[1]?.querySelector<HTMLElement>('button') ?? null)\n : null;\n const dayBtn = !openYearPicker && focusedElement >= 0 ? (dayRefs.current[focusedElement] ?? null) : null;\n const focusedYearBtn = openYearPicker && focusedYear >= 0 ? (yearRefs.current[focusedYear] ?? null) : null;\n\n const elements = openYearPicker\n ? [yearBtn, focusedYearBtn].filter((el): el is HTMLElement => el !== null)\n : [yearBtn, prevBtn, nextBtn, dayBtn].filter((el): el is HTMLElement => el !== null);\n if (elements.length === 0) return;\n\n const currentIdx = elements.indexOf(document.activeElement as HTMLElement);\n const direction = reverse ? -1 : 1;\n const nextIdx = (currentIdx + direction + elements.length) % elements.length;\n elements[nextIdx]?.focus();\n };\n\n // ── Key handler on the menu container (capture phase) ────────────────────\n // Capture fires top-down before any child (including IconButton internals)\n const onMenuKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n onClose();\n return;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n e.stopPropagation();\n cycleFocus(e.shiftKey);\n return;\n }\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(e.key)) {\n if (openYearPicker) {\n e.preventDefault();\n e.stopPropagation();\n moveYearFocus(e.key);\n } else {\n const isOnDay = Object.values(dayRefs.current).some(el => el === document.activeElement);\n if (!isOnDay) {\n e.preventDefault();\n e.stopPropagation();\n onMoveFocus(e.key);\n }\n // If on a day, let it propagate so onDayKeyDown handles it\n }\n }\n };\n\n // ── Formatted selected / today values ─────────────────────────────────────\n const selectedStr = selectedValue && isValid(selectedValue) ? formatDate(selectedValue, format) : null;\n const todayStr = today && isValid(today) ? formatDate(today, format) : null;\n\n // ── Render ─────────────────────────────────────────────────────────────────\n return (\n <div ref={ref}>\n <div\n ref={menuInnerRef}\n className={[CLASS, isOpen ? `${CLASS}-open` : '', hasStaticOptions ? `${CLASS}-static` : '']\n .filter(Boolean)\n .join(' ')}\n css={emotion(style)}\n role='dialog'\n aria-label='Date picker calendar'\n data-testid={testId}\n onKeyDownCapture={onMenuKeyDown}\n >\n {/* ── Header ───────────────────────────────────────────────────────── */}\n <div className={`${CLASS}-header`}>\n <div className={`${CLASS}-yearToggle`}>\n <div className={`${CLASS}-labelWrap`}>\n <span className={`${CLASS}-headerLabel`}>\n {monthLabel} <span className={`${CLASS}-yearLabel`}>{yearLabel}</span>\n </span>\n </div>\n <IconButton\n icon={<Icon name='arrow_drop_up' />}\n onClick={() => setOpenYearPicker(v => !v)}\n className={`${CLASS}-yearArrow`}\n isFlipped={!openYearPicker}\n aria-label={openYearPicker ? 'Close year selector' : 'Open year selector'}\n tabIndex={-1}\n onFocus={() => setIconHasFocus(true)}\n />\n </div>\n\n {!openYearPicker && (\n <div className={`${CLASS}-monthNav`}>\n <IconButton\n icon={<Icon name='keyboard_arrow_left' />}\n onClick={onPrev}\n className={`${CLASS}-navArrow`}\n disabled={disablePrev}\n aria-label='Previous month'\n tabIndex={-1}\n onFocus={() => setIconHasFocus(true)}\n />\n <IconButton\n icon={<Icon name='keyboard_arrow_right' />}\n onClick={onNext}\n className={`${CLASS}-navArrow`}\n disabled={disableNext}\n aria-label='Next month'\n tabIndex={-1}\n onFocus={() => setIconHasFocus(true)}\n />\n </div>\n )}\n </div>\n\n {/* ── Body ─────────────────────────────────────────────────────────── */}\n <div className={[`${CLASS}-body`, openYearPicker ? `${CLASS}-yearBody` : ''].filter(Boolean).join(' ')}>\n {/* ── Month calendar ─────────────────────────────────────────────── */}\n {!openYearPicker && (\n <>\n {/* Weekday headers */}\n <div className={`${CLASS}-weekRow`}>\n {daysOfWeek.map((d, i) => (\n <span className={`${CLASS}-dayCell`} key={`header-${i}`}>\n {d}\n </span>\n ))}\n </div>\n\n {/* Day grid with slide animation */}\n <div className={`${CLASS}-gridViewport`}>\n <div\n className={[\n `${CLASS}-calendarGrid`,\n slideDir === 'left' ? `${CLASS}-slideLeft` : '',\n slideDir === 'right' ? `${CLASS}-slideRight` : '',\n ]\n .filter(Boolean)\n .join(' ')}\n key={slideKey}\n onAnimationEnd={() => setSlideDir(null)}\n >\n {(() => {\n let dayIndex = 0;\n return weeks.map((week, wi) => (\n <div className={`${CLASS}-weekRow`} key={`week-${wi}`}>\n {week.map((cell, ci) => {\n if (!cell.isDate) {\n return <span className={`${CLASS}-dayCell`} key={`blank-${wi}-${ci}`} />;\n }\n const idx = dayIndex++;\n const isSelected = Boolean(selectedStr && cell.value === selectedStr && isOpen);\n const isToday = cell.value === todayStr;\n const isFocused = focusedElement === idx && isOpen && !iconHasFocus;\n\n return (\n <button\n key={cell.value}\n id={`${CLASS}-day-${idx}`}\n ref={el => {\n dayRefs.current[idx] = el;\n }}\n className={[\n `${CLASS}-dayBtn`,\n isSelected ? `${CLASS}-selected` : '',\n isToday ? `${CLASS}-today` : '',\n isFocused ? `${CLASS}-focused` : '',\n ]\n .filter(Boolean)\n .join(' ')}\n type='button'\n onClick={() => onSelectDay(cell.value)}\n onFocus={() => setIconHasFocus(false)}\n onKeyDown={e => onDayKeyDown(e, cell.value)}\n disabled={cell.isDisabled}\n role='option'\n aria-selected={isSelected}\n tabIndex={-1}\n >\n {cell.label}\n </button>\n );\n })}\n </div>\n ));\n })()}\n </div>\n </div>\n </>\n )}\n\n {/* ── Year picker ───────────────────────────────────────────────── */}\n {openYearPicker && (\n <div className={`${CLASS}-yearScrollWrapper`}>\n {(() => {\n let yearIndex = 0;\n return years.map((row, ri) => (\n <div className={`${CLASS}-weekRow`} key={`year-row-${ri}`}>\n {row.map(cell => {\n const idx = yearIndex++;\n const isSelected =\n selectedValue && isValid(selectedValue)\n ? cell.label === formatDate(selectedValue, 'yyyy')\n : false;\n const isFocused = focusedYear === idx && !iconHasFocus;\n\n return (\n <button\n key={cell.value}\n ref={el => {\n yearRefs.current[idx] = el;\n }}\n className={[\n `${CLASS}-yearBtn`,\n isSelected ? `${CLASS}-selected` : '',\n isFocused ? `${CLASS}-focused` : '',\n ]\n .filter(Boolean)\n .join(' ')}\n type='button'\n tabIndex={-1}\n onClick={() => {\n onSelectYear(cell.value);\n setOpenYearPicker(false);\n }}\n onFocus={() => setIconHasFocus(false)}\n aria-selected={isSelected}\n >\n {cell.label}\n </button>\n );\n })}\n </div>\n ));\n })()}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n },\n);\n\nDatePickerMenu.displayName = 'DatePickerMenu';\n\nexport default DatePickerMenu;\n","import React from 'react';\nimport { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { DatePickerMenuStyleProps } from './DatePickerMenu.interface';\nimport DatePickerMenuBase from './DatePickerMenu';\n\nconst DatePickerMenu = React.forwardRef<HTMLDivElement, DatePickerMenuStyleProps>(({ theme, ...rest }, ref) => {\n const { componentStyles } = useCreateComponentStyles([Component.DATEPICKERMENU, Component.DATEPICKER], theme);\n\n return <DatePickerMenuBase {...rest} style={componentStyles} ref={ref} />;\n});\n\nDatePickerMenu.displayName = 'DatePickerMenu';\n\nexport default DatePickerMenu;\n","import React, { useState, useRef, useEffect, useMemo } from 'react';\n// Component Base\nimport emotion from './DatePicker.emotion';\nimport type { DatePickerProps } from './DatePicker.interface';\nimport {\n datePickerConfig,\n isDateValid,\n isDateOutOfRange,\n getWeeksForMonth,\n getYearsGrid,\n isPrevMonthDisabled,\n isNextMonthDisabled,\n splitDateParts,\n formatMonthLabel,\n getBrowserLang,\n daysDictionary,\n} from './DatePicker.utils';\n// External Libraries\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\nimport { format as formatDate, parse, startOfDay, addDays, addMonths, startOfMonth, isValid } from 'date-fns';\n// Custom Hooks\nimport { useOnClickOutside } from '@hooks/useOnClickOutside';\n// Custom Components\nimport Icon from '@components/atoms/Icon';\nimport IconButton from '@components/atoms/IconButton';\nimport DatePickerMenu from './DatePickerMenu';\n\nconst CLASS = '--DATEPICKER';\n\n/**\n * A date input field with a pop-up calendar for selecting dates.\n *\n * Renders three spinbutton spans (month/day or day/month, and year) that\n * support Tab navigation and direct numeric entry. The calendar popup supports\n * full keyboard navigation (arrows to move focus, Enter to select, Tab to close).\n *\n * Language controls both the date format and the calendar labels:\n * - `en` → `MM / DD / YYYY`, Sunday-first calendar\n * - `es` → `DD / MM / YYYY`, Monday-first calendar\n *\n * The form value is a `Date` object.\n */\nconst DatePicker = <TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n control,\n language = getBrowserLang(),\n minDate,\n maxDate,\n disabled,\n disableFuture,\n disablePast,\n hasStaticOptions = false,\n showErrorText = true,\n hasPadding = false,\n helperText,\n style,\n className,\n}: DatePickerProps<TFieldValues>) => {\n const format = datePickerConfig[language].format;\n const today = useMemo(() => startOfDay(new Date()), []);\n const isEnglish = language === 'en';\n\n const { field, fieldState } = useController({ control, name: name as FieldPath<TFieldValues> });\n const errorText = fieldState.error;\n\n // ── Sub-input state (empty string = no value entered yet) ────────────────────\n\n const initParts = isValid(field.value as Date)\n ? splitDateParts(field.value as Date)\n : { day: '', month: '', year: '' };\n\n const [day, setDay] = useState(initParts.day);\n const [month, setMonth] = useState(initParts.month);\n const [year, setYear] = useState(initParts.year);\n\n // ── Calendar state ───────────────────────────────────────────────────────────\n const [isOpen, setIsOpen] = useState(false);\n const [focusedElement, setFocusedElement] = useState(-1);\n const [temporalDate, setTemporalDate] = useState<Date>(() =>\n isValid(field.value as Date) ? (field.value as Date) : today,\n );\n\n // ── Refs ─────────────────────────────────────────────────────────────────────\n const containerRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const iconWrapRef = useRef<HTMLDivElement>(null);\n const dayRef = useRef<HTMLSpanElement>(null);\n const monthRef = useRef<HTMLSpanElement>(null);\n const yearRef = useRef<HTMLSpanElement>(null);\n\n // Digit buffers: accumulate keystrokes within a focused segment; reset on focus\n const dayBuffer = useRef('');\n const monthBuffer = useRef('');\n const yearBuffer = useRef('');\n\n // ── Derived values ────────────────────────────────────────────────────────────\n const hasValue = !!(day || month || year);\n const isFieldOpen = isOpen || hasValue;\n\n const weeks = useMemo(\n () => getWeeksForMonth(temporalDate, format, language, { minDate, maxDate, disableFuture, disablePast, today }),\n [temporalDate, language, minDate, maxDate, disableFuture, disablePast, today, format],\n );\n const flatDays = useMemo(() => weeks.flat().filter(d => d.isDate), [weeks]);\n const years = useMemo(() => getYearsGrid(format, 1900, 200, 4), [format]);\n\n const daysOfWeek = datePickerConfig[language].daysOfWeek.map(d => daysDictionary[language][d]);\n const monthLabel = formatMonthLabel(temporalDate, language);\n const yearLabel = formatDate(temporalDate, 'yyyy');\n\n // ── Sync sub-inputs → RHF ────────────────────────────────────────────────────\n useEffect(() => {\n if (!day && !month && !year) return;\n const d = day || '01';\n const m = month || '01';\n const y = year || '2000';\n const dateStr = isEnglish ? `${m}/${d}/${y}` : `${d}/${m}/${y}`;\n const parsed = parse(dateStr, format, new Date());\n field.onChange(parsed);\n\n // eslint-disable-next-line react-hooks/set-state-in-effect\n if (isDateValid(parsed)) setTemporalDate(parsed);\n if (errorText) field.onBlur();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [day, month, year]);\n\n // ── Click outside → close calendar ───────────────────────────────────────────\n useOnClickOutside({\n ref: menuRef,\n onAction: () => {\n setIsOpen(false);\n field.onBlur();\n },\n isActive: isOpen,\n exceptRef: containerRef,\n });\n\n // ── Container blur → close and trigger validation ─────────────────────────────\n const onContainerBlur = (e: React.FocusEvent<HTMLDivElement>) => {\n const related = e.relatedTarget as Node | null;\n const inContainer = containerRef.current?.contains(related);\n const inMenu = menuRef.current?.contains(related);\n if (inContainer || inMenu) return;\n setIsOpen(false);\n field.onBlur();\n };\n\n // ── Focus helper ──────────────────────────────────────────────────────────────\n const focusPart = (ref: { current: HTMLSpanElement | null }) => requestAnimationFrame(() => ref.current?.focus());\n\n // ── Segment key handlers ──────────────────────────────────────────────────────\n const onKeyDownDay = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(e.key) && isOpen) {\n e.preventDefault();\n e.stopPropagation();\n moveFocus(e.key);\n return;\n }\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n setDay('');\n dayBuffer.current = '';\n return;\n }\n if (!/^\\d$/.test(e.key)) return;\n e.preventDefault();\n dayBuffer.current = (dayBuffer.current + e.key).slice(-2);\n const num = parseInt(dayBuffer.current, 10);\n if (num === 0) {\n setDay('01');\n dayBuffer.current = '';\n return;\n }\n const clamped = Math.min(num, 31);\n setDay(String(clamped).padStart(2, '0'));\n if (num > 3 || dayBuffer.current.length >= 2) {\n dayBuffer.current = '';\n focusPart(isEnglish ? yearRef : monthRef);\n }\n };\n\n const onKeyDownMonth = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(e.key) && isOpen) {\n e.preventDefault();\n e.stopPropagation();\n moveFocus(e.key);\n return;\n }\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n setMonth('');\n monthBuffer.current = '';\n return;\n }\n if (!/^\\d$/.test(e.key)) return;\n e.preventDefault();\n monthBuffer.current = (monthBuffer.current + e.key).slice(-2);\n const num = parseInt(monthBuffer.current, 10);\n if (num === 0) {\n setMonth('01');\n monthBuffer.current = '';\n return;\n }\n const clamped = Math.min(num, 12);\n setMonth(String(clamped).padStart(2, '0'));\n if (num > 1 || monthBuffer.current.length >= 2) {\n monthBuffer.current = '';\n focusPart(isEnglish ? dayRef : yearRef);\n }\n };\n\n const onKeyDownYear = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(e.key) && isOpen) {\n e.preventDefault();\n e.stopPropagation();\n moveFocus(e.key);\n return;\n }\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n setYear('');\n yearBuffer.current = '';\n return;\n }\n if (!/^\\d$/.test(e.key)) return;\n e.preventDefault();\n yearBuffer.current = (yearBuffer.current + e.key).slice(-4);\n setYear(String(parseInt(yearBuffer.current, 10)).padStart(4, '0'));\n };\n\n // ── Calendar open / close ─────────────────────────────────────────────────────\n const openCalendar = () => {\n if (disabled) return;\n const base = isDateValid(field.value as Date) ? (field.value as Date) : today;\n setTemporalDate(base);\n setFocusedElement(base.getDate() - 1);\n setIsOpen(true);\n };\n\n const closeCalendar = () => setIsOpen(false);\n\n const toggleCalendar = () => (isOpen ? closeCalendar() : openCalendar());\n\n // ── Month navigation ──────────────────────────────────────────────────────────\n const onPrevMonth = () => {\n setTemporalDate(d => addMonths(d, -1));\n setFocusedElement(-1);\n };\n const onNextMonth = () => {\n setTemporalDate(d => addMonths(d, 1));\n setFocusedElement(-1);\n };\n\n const isPrevDisabled = isPrevMonthDisabled(temporalDate, { minDate, disablePast, today, format });\n const isNextDisabled = isNextMonthDisabled(temporalDate, { maxDate, disableFuture, today, format });\n\n // ── Keyboard navigation inside calendar ───────────────────────────────────────\n const moveFocus = (key: string) => {\n if (!isOpen) return;\n const delta = ({ ArrowRight: 1, ArrowLeft: -1, ArrowDown: 7, ArrowUp: -7 } as Record<string, number>)[key];\n if (!delta) return;\n\n if (focusedElement < 0) {\n if (flatDays.length > 0) setFocusedElement(0);\n return;\n }\n\n const base = flatDays[focusedElement];\n if (!base) return;\n\n const baseDate = parse(base.value, format, new Date());\n const candidate = addDays(baseDate, delta);\n\n if (isDateOutOfRange(candidate, { minDate, maxDate, disableFuture, disablePast, today })) return;\n\n if (candidate.getMonth() !== baseDate.getMonth() || candidate.getFullYear() !== baseDate.getFullYear()) {\n if (delta > 0 && isNextDisabled) return;\n if (delta < 0 && isPrevDisabled) return;\n setTemporalDate(startOfMonth(candidate));\n // flatDays[n] = day n+1 of month, so day n is at index n-1\n setFocusedElement(candidate.getDate() - 1);\n return;\n }\n\n const idx = flatDays.findIndex(d => d.value === formatDate(candidate, format));\n if (idx >= 0) setFocusedElement(idx);\n };\n\n // ── Day / year selection ──────────────────────────────────────────────────────\n const onSelectDay = (value: string, viaKeyboard?: boolean) => {\n const parsed = parse(value, format, new Date());\n field.onChange(parsed);\n const parts = splitDateParts(parsed);\n setDay(parts.day);\n setMonth(parts.month);\n setYear(parts.year);\n setIsOpen(false);\n if (viaKeyboard) requestAnimationFrame(() => iconWrapRef.current?.querySelector('button')?.focus());\n };\n\n const onSelectYear = (value: string) => {\n const parsed = parse(value, format, new Date());\n const base = isDateValid(field.value as Date) ? (field.value as Date) : today;\n const newDate = new Date(base);\n newDate.setFullYear(parsed.getFullYear());\n const final = parse(formatDate(newDate, format), format, new Date());\n field.onChange(final);\n const parts = splitDateParts(final);\n setDay(parts.day);\n setMonth(parts.month);\n setYear(parts.year);\n setTemporalDate(final);\n };\n\n // ── Keyboard on the container (handles Enter, Escape, Tab, and arrows) ────────\n const onKeyDownContainer = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Tab') {\n closeCalendar();\n return;\n }\n if (e.key === 'Escape') {\n closeCalendar();\n return;\n }\n if (e.key === 'Enter' && isOpen) {\n e.preventDefault();\n if (focusedElement >= 0 && flatDays[focusedElement] && !flatDays[focusedElement].isDisabled) {\n onSelectDay(flatDays[focusedElement].value);\n }\n }\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(e.key) && isOpen) {\n e.preventDefault();\n moveFocus(e.key);\n }\n };\n\n // ── Render helpers (language-dependent slot ordering) ─────────────────────────\n const firstRef = isEnglish ? monthRef : dayRef;\n const firstPlaceholder = isEnglish ? 'MM' : 'DD';\n const firstValue = isEnglish ? month : day;\n const onKeyDownFirst = isEnglish ? onKeyDownMonth : onKeyDownDay;\n const onFocusFirst = isEnglish\n ? () => {\n monthBuffer.current = '';\n }\n : () => {\n dayBuffer.current = '';\n };\n\n const secondRef = isEnglish ? dayRef : monthRef;\n const secondPlaceholder = isEnglish ? 'DD' : 'MM';\n const secondValue = isEnglish ? day : month;\n const onKeyDownSecond = isEnglish ? onKeyDownDay : onKeyDownMonth;\n const onFocusSecond = isEnglish\n ? () => {\n dayBuffer.current = '';\n }\n : () => {\n monthBuffer.current = '';\n };\n\n return (\n <div\n className={[CLASS, hasPadding ? `${CLASS}-paddingBottom` : '', className || ''].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n <div ref={containerRef} className={`${CLASS}-container`} onBlur={onContainerBlur} onKeyDown={onKeyDownContainer}>\n {/* ── Three spinbutton spans ───────────────────────────────────────── */}\n <div\n className={[\n `${CLASS}-fieldRow`,\n isFieldOpen ? `${CLASS}-open` : '',\n errorText ? `${CLASS}-error` : '',\n disabled ? `${CLASS}-disabled` : '',\n ].join(' ')}\n onClick={e => {\n if (e.target === e.currentTarget) firstRef.current?.focus();\n }}\n data-testid={`${CLASS}-fieldRow`}\n >\n <span\n ref={firstRef}\n role='spinbutton'\n aria-label={isEnglish ? 'Month' : 'Day'}\n aria-valuenow={parseInt(firstValue) || undefined}\n aria-valuemin={1}\n aria-valuemax={isEnglish ? 12 : 31}\n aria-valuetext={firstValue || firstPlaceholder}\n className={[`${CLASS}-partInput`, !firstValue ? `${CLASS}-placeholder` : ''].filter(Boolean).join(' ')}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={onKeyDownFirst}\n onFocus={onFocusFirst}\n data-testid={`${CLASS}-first`}\n >\n {firstValue || firstPlaceholder}\n </span>\n <span className={`${CLASS}-separator`}>/</span>\n <span\n ref={secondRef}\n role='spinbutton'\n aria-label={isEnglish ? 'Day' : 'Month'}\n aria-valuenow={parseInt(secondValue) || undefined}\n aria-valuemin={1}\n aria-valuemax={isEnglish ? 31 : 12}\n aria-valuetext={secondValue || secondPlaceholder}\n className={[`${CLASS}-partInput`, !secondValue ? `${CLASS}-placeholder` : ''].filter(Boolean).join(' ')}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={onKeyDownSecond}\n onFocus={onFocusSecond}\n data-testid={`${CLASS}-second`}\n >\n {secondValue || secondPlaceholder}\n </span>\n <span className={`${CLASS}-separator`}>/</span>\n <span\n ref={yearRef}\n role='spinbutton'\n aria-label='Year'\n aria-valuenow={parseInt(year) || undefined}\n aria-valuemin={1900}\n aria-valuemax={2100}\n aria-valuetext={year || 'YYYY'}\n className={[`${CLASS}-partInput`, !year ? `${CLASS}-placeholder` : ''].filter(Boolean).join(' ')}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={onKeyDownYear}\n onFocus={() => {\n yearBuffer.current = '';\n }}\n data-testid={`${CLASS}-year`}\n >\n {year || 'YYYY'}\n </span>\n </div>\n\n {/* ── Calendar icon button ─────────────────────────────────────────── */}\n <div ref={iconWrapRef} className={`${CLASS}-adornment`}>\n <IconButton\n className={`${CLASS}-calendarIcon`}\n onClick={toggleCalendar}\n icon={<Icon name='event' />}\n disabled={disabled}\n tabIndex={0}\n data-testid={`${CLASS}-calendarIcon`}\n />\n </div>\n\n {/* ── Fieldset border ──────────────────────────────────────────────── */}\n <fieldset aria-hidden='true' className={`${CLASS}-fieldset`}>\n <legend className={`${CLASS}-legend`}>\n <span className={`${CLASS}-text`}>{label}</span>\n </legend>\n </fieldset>\n <span className={`${CLASS}-label`}>{label}</span>\n </div>\n\n {/* ── Helper / error text ──────────────────────────────────────────────── */}\n {(showErrorText || helperText) && (\n <span className={`${CLASS}-helperText`} data-testid={`${CLASS}-helperText`}>\n {helperText && !errorText && helperText}\n {showErrorText && errorText && errorText.message}\n </span>\n )}\n\n {/* ── Calendar popup ───────────────────────────────────────────────────── */}\n <DatePickerMenu\n ref={menuRef}\n isOpen={isOpen}\n hasStaticOptions={hasStaticOptions}\n language={language}\n monthLabel={monthLabel}\n yearLabel={yearLabel}\n onPrevMonth={onPrevMonth}\n onNextMonth={onNextMonth}\n disablePrev={isPrevDisabled}\n disableNext={isNextDisabled}\n weeks={weeks}\n years={years}\n daysOfWeek={daysOfWeek}\n selectedValue={isDateValid(field.value as Date) ? (field.value as Date) : undefined}\n format={format}\n today={today}\n focusedElement={focusedElement}\n onSelectDay={onSelectDay}\n onSelectYear={onSelectYear}\n onMoveFocus={moveFocus}\n onClose={closeCalendar}\n />\n </div>\n );\n};\n\nexport default DatePicker;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { DatePickerStyleProps } from './DatePicker.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport DatePickerBase from './DatePicker';\n\nconst DatePicker = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: DatePickerStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.DATEPICKER], theme, variant.toUpperCase());\n\n return <DatePickerBase {...rest} style={componentStyles} />;\n};\n\nexport default DatePicker;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst border = (theme: Record<string, string>, event: string): string => `\n // BORDERS\n ${getStyle(theme, 'border-color', `--NUMBERFIELD-EVENTS-${event}-BORDER-COLOR`)};\n ${getStyle(theme, 'border-width', `--NUMBERFIELD-EVENTS-${event}-BORDER-WIDTH`)};\n ${getStyle(theme, 'border-style', `--NUMBERFIELD-EVENTS-${event}-BORDER-STYLE`)};\n`;\n\nconst typography = (theme: Record<string, string>, event: string): string => `\n // TYPOGRAPHY\n ${getStyle(theme, 'color', `--NUMBERFIELD-EVENTS-${event}-COLOR-PRIMARY`)};\n ${getStyle(theme, 'caret-color', `--NUMBERFIELD-EVENTS-${event}-COLOR-PRIMARY`)};\n`;\n\nconst labelStyles = (theme: Record<string, string>, event: string, activateLabel = false): string => {\n return `\n ${getStyle(theme, 'color', `--NUMBERFIELD-EVENTS-${event}-COLOR-SECONDARY`)};\n ${activateLabel ? 'transform: translate(14px, -24px); font-size: 0.75rem;' : ''};\n`;\n};\n\nconst legendStyles = (activate: boolean): string => `\n .--NUMBERFIELD-legend {\n max-width: ${activate ? '100%' : '0px'};\n }\n`;\n\nconst container = (theme: Record<string, string>, event: string): string => `\n ${getStyle(theme, 'background-color', `--NUMBERFIELD-EVENTS-${event}-BACKGROUND-COLOR`)};\n ~ .--NUMBERFIELD-helperText {\n ${getStyle(theme, 'color', `--NUMBERFIELD-EVENTS-${event}-COLOR-TERTIARY`)};\n }\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--NUMBERFIELD {\n position: relative;\n padding: 0;\n border: 0;\n width: 100%;\n\n &.--NUMBERFIELD-paddingBottom {\n padding-bottom: 24px;\n }\n\n .--NUMBERFIELD-container {\n box-sizing: border-box;\n position: relative;\n display: inline-flex;\n align-items: center;\n\n // Safari Firefox Chrome/Edge\n width: -webkit-fill-available;\n width: -moz-available;\n width: stretch;\n\n ${getStyle(theme, 'border-radius', '--NUMBERFIELD-ROOT-BORDER-RADIUS')};\n\n // ENABLED\n ${container(theme, 'ENABLED')};\n\n // VALUE\n &:has(.--NUMBERFIELD-inputField:not(:placeholder-shown)),\n &:has(.--NUMBERFIELD-inputField[placeholder]:not([placeholder=' '])),\n &:has(.--NUMBERFIELD-inputField:-webkit-autofill),\n &:has(.--NUMBERFIELD-inputField.--NUMBERFIELD-open) {\n ${container(theme, 'VALUE')};\n }\n\n // HOVER\n &:has(.--NUMBERFIELD-inputField:hover) {\n ${container(theme, 'HOVER')};\n }\n\n // ACTIVE\n &:has(.--NUMBERFIELD-inputField:active, .--NUMBERFIELD-inputField.--NUMBERFIELD-active) {\n ${container(theme, 'ACTIVE')};\n }\n\n // FOCUS\n &:has(.--NUMBERFIELD-inputField:focus-visible) {\n outline: none;\n ${container(theme, 'FOCUS')};\n }\n\n // ERROR\n &:has(.--NUMBERFIELD-inputField.--NUMBERFIELD-error) {\n ${container(theme, 'ERROR')};\n }\n\n // ERROR + VALUE\n &:has(.--NUMBERFIELD-inputField.--NUMBERFIELD-error:not(:placeholder-shown)),\n &:has(.--NUMBERFIELD-inputField.--NUMBERFIELD-error[placeholder]:not([placeholder=' '])) {\n ${container(theme, 'ERROR_VALUE')};\n }\n\n // ERROR + HOVER\n &:has(.--NUMBERFIELD-inputField.--NUMBERFIELD-error:hover) {\n ${container(theme, 'ERROR_HOVER')};\n }\n\n // ERROR + ACTIVE\n &:has(\n .--NUMBERFIELD-inputField.--NUMBERFIELD-error:active,\n .--NUMBERFIELD-inputField.--NUMBERFIELD-error.--NUMBERFIELD-active\n ) {\n ${container(theme, 'ERROR_ACTIVE')};\n }\n\n // ERROR + FOCUS\n &:has(.--NUMBERFIELD-inputField.--NUMBERFIELD-error:focus-visible) {\n ${container(theme, 'ERROR_FOCUS')};\n }\n\n // DISABLED\n &:has(.--NUMBERFIELD-inputField:disabled) {\n pointer-events: none;\n ${container(theme, 'DISABLED')};\n }\n\n // DISABLED + VALUE\n &:has(.--NUMBERFIELD-inputField:disabled:not(:placeholder-shown)),\n &:has(.--NUMBERFIELD-inputField:disabled[placeholder]:not([placeholder=' '])) {\n pointer-events: none;\n ${container(theme, 'DISABLED_VALUE')};\n }\n\n .--NUMBERFIELD-inputField {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem; // 14px\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: 1;\n\n // Safari Firefox Chrome/Edge\n height: -webkit-fill-available;\n height: -moz-available;\n height: stretch;\n width: -webkit-fill-available;\n width: -moz-available;\n width: stretch;\n\n min-width: 0;\n border: 0;\n margin: 0;\n padding: 15px 14px;\n background-color: transparent;\n cursor: text;\n display: block;\n box-sizing: border-box;\n\n // Always has end adornment (remove/add buttons)\n padding-right: 0px;\n\n &.--NUMBERFIELD-left {\n padding-left: 0px;\n }\n\n &.--NUMBERFIELD-spinner {\n text-align: center;\n }\n\n // Hide native number spinners\n -moz-appearance: textfield;\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n\n // ENABLED\n ${typography(theme, 'ENABLED')};\n ~ .--NUMBERFIELD-label {\n ${labelStyles(theme, 'ENABLED')};\n }\n ~ .--NUMBERFIELD-fieldset {\n ${border(theme, 'ENABLED')};\n }\n\n // VALUE\n &:not(:placeholder-shown),\n &[placeholder]:not([placeholder=' ']),\n &:-webkit-autofill,\n &.--NUMBERFIELD-open {\n ${typography(theme, 'VALUE')};\n ~ .--NUMBERFIELD-label {\n ${labelStyles(theme, 'VALUE', true)};\n }\n ~ .--NUMBERFIELD-fieldset {\n ${border(theme, 'VALUE')};\n ${legendStyles(true)};\n }\n }\n\n // Autocomplete\n &:-webkit-autofill {\n -webkit-background-clip: text;\n ${getStyle(theme, '-webkit-text-fill-color', '--NUMBERFIELD-EVENTS-ENABLED-COLOR-PRIMARY')};\n }\n\n // HOVER\n &:hover {\n ${typography(theme, 'HOVER')};\n ~ .--NUMBERFIELD-label {\n ${labelStyles(theme, 'HOVER')};\n }\n ~ .--NUMBERFIELD-fieldset {\n ${border(theme, 'HOVER')};\n }\n }\n\n // ACTIVE\n &:active,\n &.--NUMBERFIELD-active {\n ${typography(theme, 'ACTIVE')};\n ~ .--NUMBERFIELD-label {\n ${labelStyles(theme, 'ACTIVE')};\n }\n ~ .--NUMBERFIELD-fieldset {\n ${border(theme, 'ACTIVE')};\n }\n }\n\n // FOCUS\n &:focus-visible {\n outline: none;\n ${typography(theme, 'FOCUS')};\n ~ .--NUMBERFIELD-label {\n ${labelStyles(theme, 'FOCUS', true)};\n }\n ~ .--NUMBERFIELD-fieldset {\n ${border(theme, 'FOCUS')};\n ${legendStyles(true)};\n }\n }\n\n // ERROR\n &.--NUMBERFIELD-error {\n ${typography(theme, 'ERROR')};\n ~ .--NUMBERFIELD-label {\n ${labelStyles(theme, 'ERROR')};\n }\n ~ .--NUMBERFIELD-fieldset {\n ${border(theme, 'ERROR')};\n }\n }\n\n // ERROR + VALUE\n &.--NUMBERFIELD-error:not(:placeholder-shown),\n &.--NUMBERFIELD-error[placeholder]:not([placeholder=' ']) {\n ${typography(theme, 'ERROR_VALUE')};\n ~ .--NUMBERFIELD-label {\n ${labelStyles(theme, 'ERROR_VALUE')};\n }\n ~ .--NUMBERFIELD-fieldset {\n ${border(theme, 'ERROR_VALUE')};\n }\n }\n\n // ERROR + HOVER\n &.--NUMBERFIELD-error:hover {\n ${typography(theme, 'ERROR_HOVER')};\n ~ .--NUMBERFIELD-label {\n ${labelStyles(theme, 'ERROR_HOVER')};\n }\n ~ .--NUMBERFIELD-fieldset {\n ${border(theme, 'ERROR_HOVER')};\n }\n }\n\n // ERROR + ACTIVE\n &.--NUMBERFIELD-error:active,\n &.--NUMBERFIELD-error.--NUMBERFIELD-active {\n ${typography(theme, 'ERROR_ACTIVE')};\n ~ .--NUMBERFIELD-label {\n ${labelStyles(theme, 'ERROR_ACTIVE')};\n }\n ~ .--NUMBERFIELD-fieldset {\n ${border(theme, 'ERROR_ACTIVE')};\n }\n }\n\n // ERROR + FOCUS\n &.--NUMBERFIELD-error:focus-visible {\n ${typography(theme, 'ERROR_FOCUS')};\n ~ .--NUMBERFIELD-label {\n ${labelStyles(theme, 'ERROR_FOCUS')};\n }\n ~ .--NUMBERFIELD-fieldset {\n ${border(theme, 'ERROR_FOCUS')};\n }\n }\n\n // DISABLED\n &:disabled {\n user-select: none;\n pointer-events: none;\n ${typography(theme, 'DISABLED')};\n ~ .--NUMBERFIELD-label {\n ${labelStyles(theme, 'DISABLED')};\n }\n ~ .--NUMBERFIELD-fieldset {\n ${border(theme, 'DISABLED')};\n }\n }\n\n // DISABLED + VALUE\n &:disabled:not(:placeholder-shown),\n &:disabled[placeholder]:not([placeholder=' ']) {\n user-select: none;\n pointer-events: none;\n ${typography(theme, 'DISABLED_VALUE')};\n ~ .--NUMBERFIELD-label {\n ${labelStyles(theme, 'DISABLED_VALUE')};\n }\n ~ .--NUMBERFIELD-fieldset {\n ${border(theme, 'DISABLED_VALUE')};\n }\n }\n }\n\n .--NUMBERFIELD-label {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem; // 14px\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: normal;\n\n padding: 0;\n display: block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n position: absolute;\n pointer-events: none;\n z-index: 4;\n\n // ANIMATION\n transform: translate(14px, 0px);\n transition: 150ms ease-in-out;\n }\n\n .--NUMBERFIELD-fieldset {\n // Safari Firefox Chrome/Edge\n height: 100%;\n width: -webkit-fill-available;\n width: -moz-available;\n width: stretch;\n\n text-align: left;\n position: absolute;\n margin: 0;\n padding: 0 6px;\n pointer-events: none;\n overflow: hidden;\n z-index: 5;\n box-sizing: border-box;\n ${getStyle(theme, 'border-radius', '--NUMBERFIELD-ROOT-BORDER-RADIUS')};\n -webkit-tap-highlight-color: transparent;\n\n .--NUMBERFIELD-legend {\n width: auto;\n overflow: hidden;\n display: block;\n padding: 0;\n height: 0px;\n visibility: hidden;\n\n // Animation\n max-width: 0px;\n transition: max-width 150ms ease-in-out;\n\n .--NUMBERFIELD-text {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.75rem; // 12px\n letter-spacing: 0.01em;\n font-weight: 500;\n padding: 0px 7px;\n }\n }\n }\n\n .--NUMBERFIELD-adornment {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0px 12px;\n }\n }\n\n .--NUMBERFIELD-helperText {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.75rem; // 12px\n line-height: 1;\n\n display: block;\n margin-top: 8px;\n margin-left: 14px;\n height: 16px;\n }\n }\n`;\n\nexport default Style;\n","import React, { useState, type JSX } from 'react';\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\nimport emotion from './NumberField.emotion';\nimport type { NumberFieldBaseProps, NumberFieldProps } from './NumberField.interface';\nimport IconButton from '@components/atoms/IconButton';\nimport Icon from '@components/atoms/Icon';\n\nconst CLASS = '--NUMBERFIELD';\n\nconst Adornment = ({ children }: { children: JSX.Element }) => <div className={`${CLASS}-adornment`}>{children}</div>;\n\nexport const NumberFieldBase = ({\n label,\n value,\n onChange,\n error,\n style = {},\n width,\n disabled,\n regex,\n hasPadding = false,\n format,\n startAdornment,\n helperText,\n showErrorText = true,\n className,\n onBlur,\n min,\n max,\n step = 1,\n display = 'standard',\n ...rest\n}: NumberFieldBaseProps) => {\n const numValue = value === '' ? NaN : parseFloat(value);\n\n const handleDecrement = () => {\n const base = isNaN(numValue) ? (min ?? 0) : numValue;\n const next = parseFloat((base - step).toFixed(10));\n const bounded = min !== undefined ? Math.max(min, next) : next;\n onChange(String(bounded));\n };\n\n const handleIncrement = () => {\n const base = isNaN(numValue) ? (min ?? 0) : numValue;\n const next = parseFloat((base + step).toFixed(10));\n const bounded = max !== undefined ? Math.min(max, next) : next;\n onChange(String(bounded));\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n event.preventDefault();\n const inputValue = event.target.value;\n if ((regex && regex.test(inputValue)) || !regex) {\n const valueToSet = format && inputValue ? format(inputValue) : inputValue;\n onChange(valueToSet);\n }\n };\n\n const atMin = !isNaN(numValue) && min !== undefined && numValue <= min;\n const atMax = !isNaN(numValue) && max !== undefined && numValue >= max;\n\n const decrementButton = (\n <IconButton\n icon={<Icon name='remove' />}\n onClick={handleDecrement}\n disabled={disabled || atMin}\n aria-label='Decrease value'\n />\n );\n\n const incrementButton = (\n <IconButton\n icon={<Icon name='add' />}\n onClick={handleIncrement}\n disabled={disabled || atMax}\n aria-label='Increase value'\n />\n );\n\n const isSpinner = display === 'spinner';\n const hasLeftAdornment = isSpinner || !!startAdornment;\n\n return (\n <div\n className={[CLASS, hasPadding ? `${CLASS}-paddingBottom` : '', className || ''].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n <div className={`${CLASS}-container`}>\n {isSpinner ? (\n <Adornment>{decrementButton}</Adornment>\n ) : (\n startAdornment && <Adornment>{startAdornment}</Adornment>\n )}\n\n <input\n className={[\n `${CLASS}-inputField`,\n error && `${CLASS}-error`,\n hasLeftAdornment && `${CLASS}-open`,\n hasLeftAdornment && `${CLASS}-left`,\n isSpinner && `${CLASS}-spinner`,\n ].join(' ')}\n placeholder=' '\n value={value}\n disabled={disabled}\n data-testid={`${CLASS}-inputField`}\n onChange={handleChange}\n onBlur={onBlur}\n type='number'\n {...rest}\n />\n\n <Adornment>\n {isSpinner ? (\n incrementButton\n ) : (\n <div style={{ display: 'flex', gap: '8px' }}>\n {decrementButton}\n {incrementButton}\n </div>\n )}\n </Adornment>\n\n <fieldset aria-hidden='true' className={`${CLASS}-fieldset`}>\n <legend className={`${CLASS}-legend`}>\n <span className={`${CLASS}-text`}>{label}</span>\n </legend>\n </fieldset>\n <span className={`${CLASS}-label`}>{label}</span>\n </div>\n {(showErrorText || helperText) && (\n <span className={`${CLASS}-helperText`} data-testid={`${CLASS}-helperText`}>\n {helperText && (!error || !showErrorText) && helperText}\n {showErrorText && error && error.message}\n </span>\n )}\n </div>\n );\n};\n\nconst NumberFieldRHF = <TFieldValues extends FieldValues = FieldValues>({\n name,\n control,\n ...rest\n}: NumberFieldProps<TFieldValues>) => {\n const { field, fieldState } = useController({\n control: control!,\n name: name as FieldPath<TFieldValues>,\n });\n\n const [value, setValue] = useState<string>(\n field.value !== undefined && field.value !== null ? String(field.value) : '',\n );\n const errorText = fieldState.error;\n\n const onChange = (val: string) => {\n field.onChange(val === '' ? undefined : Number(val));\n setValue(val);\n if (errorText) field.onBlur();\n };\n\n return (\n <NumberFieldBase\n {...rest}\n name={name}\n value={value}\n onChange={onChange}\n onBlur={() => field.onBlur()}\n error={errorText}\n />\n );\n};\n\nconst NumberField = <TFieldValues extends FieldValues = FieldValues>(props: NumberFieldProps<TFieldValues>) => {\n if (!props.control) {\n const { name, control, onValueChange, value, ...rest } = props;\n return (\n <NumberFieldBase\n {...rest}\n name={name}\n value={value !== undefined ? String(value) : ''}\n onChange={onValueChange || (() => {})}\n />\n );\n }\n return <NumberFieldRHF {...props} />;\n};\n\nexport default NumberField;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { NumberFieldStyleProps } from './NumberField.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport NumberFieldBase from './NumberField';\n\nconst NumberField = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: NumberFieldStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.NUMBERFIELD], theme, variant.toUpperCase());\n\n return <NumberFieldBase {...rest} style={componentStyles} />;\n};\n\nexport default NumberField;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst Style = (theme: Record<string, string>) => css`\n &.--PAGINATION {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 16px;\n padding: 8px 16px;\n\n .--PAGINATION-rowsControl {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n\n .--PAGINATION-rowsSize {\n ${getStyle(theme, 'color', '--PAGINATION-EVENTS-ENABLED-COLOR-SECONDARY')};\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.8125rem;\n user-select: none;\n min-width: 20px;\n text-align: center;\n }\n }\n\n .--PAGINATION-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n\n .--PAGINATION-info {\n ${getStyle(theme, 'color', '--PAGINATION-EVENTS-ENABLED-COLOR-SECONDARY')};\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.8125rem;\n user-select: none;\n }\n }\n }\n`;\n\nexport default Style;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst row = (theme: Record<string, string>, event: string): string => `\n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--PAGINATIONMENU-EVENTS-${event}-BACKGROUND-COLOR`)}\n \n // BORDERS\n ${getStyle(theme, 'border-color', `--PAGINATIONMENU-EVENTS-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--PAGINATIONMENU-EVENTS-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--PAGINATIONMENU-EVENTS-${event}-BORDER-STYLE`)}\n ${getStyle(theme, 'border-radius', `--PAGINATIONMENU-EVENTS-${event}-BORDER-RADIUS`)}\n`;\n\nconst typography = (theme: Record<string, string>, event: string): string => `\n // TYPOGRAPHY\n ${getStyle(theme, 'color', `--PAGINATIONMENU-EVENTS-${event}-COLOR-PRIMARY`)};\n ${getStyle(theme, 'caret-color', `--PAGINATIONMENU-EVENTS-${event}-COLOR-PRIMARY`)};\n`;\n\nconst container = (theme: Record<string, string>, event: string): string => `\n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--PAGINATIONMENU-${event}-BACKGROUND-COLOR`)}\n \n // BORDERS\n ${getStyle(theme, 'border-color', `--PAGINATIONMENU-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--PAGINATIONMENU-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--PAGINATIONMENU-${event}-BORDER-STYLE`)}\n ${getStyle(theme, 'border-radius', `--PAGINATIONMENU-${event}-BORDER-RADIUS`)}\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--PAGINATIONMENU {\n position: absolute;\n bottom: calc(100% + ${theme['--PAGINATIONMENU-ROOT-BOTTOM'] || ''});\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n z-index: 10;\n box-shadow:\n rgba(0, 0, 0, 0.2) 0px 5px 5px -3px,\n rgba(0, 0, 0, 0.14) 0px 8px 10px 1px,\n rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;\n\n ${container(theme, 'ROOT')}\n\n .--PAGINATIONMENU-option {\n all: unset;\n cursor: pointer;\n text-align: center;\n padding: 6px 20px;\n white-space: nowrap;\n transition: background-color 120ms;\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.8125rem;\n\n // ENABLED\n ${row(theme, 'ENABLED')}\n ${typography(theme, 'ENABLED')}\n\n // VALUE\n &.--PAGINATIONMENU-selected {\n ${row(theme, 'VALUE')}\n ${typography(theme, 'VALUE')}\n }\n\n // HOVER\n &:hover {\n ${row(theme, 'HOVER')}\n ${typography(theme, 'HOVER')}\n }\n\n // - ACTIVE\n &:active,\n &.--PAGINATIONMENU-active {\n ${row(theme, 'ACTIVE')}\n ${typography(theme, 'ACTIVE')}\n }\n\n // FOCUS\n &:focus-visible {\n outline-offset: 0px;\n outline: 0;\n ${row(theme, 'FOCUS')}\n ${typography(theme, 'FOCUS')}\n }\n }\n }\n`;\n\nexport default Style;\n","// Component Base\nimport emotion from './PaginationMenu.emotion';\nimport type { PaginationMenuProps } from './PaginationMenu.interface';\n\nconst CLASS = '--PAGINATIONMENU';\n\n/**\n * A floating dropdown that renders a list of page-size options.\n *\n * Rendered inside `<Pagination>` when `pageSizeOptions` is provided.\n * Keyboard focus is controlled externally via `focusedElement`.\n */\nconst PaginationMenu = ({ options, activeOption, onSelect, focusedElement = -1, style }: PaginationMenuProps) => (\n <div className={CLASS} css={emotion(style)}>\n {options.map((option, index) => {\n const selectedClass = option === activeOption ? `${CLASS}-selected` : '';\n const isActive = focusedElement === index;\n return (\n <button\n key={option}\n className={[`${CLASS}-option`, selectedClass, isActive ? `${CLASS}-active` : ''].filter(Boolean).join(' ')}\n onClick={() => onSelect(option)}\n >\n {option}\n </button>\n );\n })}\n </div>\n);\n\nexport default PaginationMenu;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { PaginationMenuStyleProps } from './PaginationMenu.interface';\nimport PaginationMenuBase from './PaginationMenu';\n\nconst PaginationMenu = ({ theme, variant = 'default', ...rest }: PaginationMenuStyleProps) => {\n const { componentStyles } = useCreateComponentStyles([Component.PAGINATIONMENU], theme, variant.toUpperCase());\n return <PaginationMenuBase {...rest} style={componentStyles} />;\n};\n\nexport default PaginationMenu;\nexport type { PaginationMenuProps, PaginationMenuStyleProps } from './PaginationMenu.interface';\n","// Component Base\nimport React, { useState, useEffect } from 'react';\nimport Style from './Pagination.emotion';\nimport type { PaginationProps } from './Pagination.interface';\n// Custom Components\nimport IconButton from '@components/atoms/IconButton';\nimport Icon from '@components/atoms/Icon';\nimport PaginationMenu from './PaginationMenu';\n\nconst CLASS = '--PAGINATION';\n\n/**\n * A pagination control bar that lets users navigate between pages of data.\n *\n * Displays the current row range (`start–end of total`), first/prev/next/last\n * navigation buttons, and — when `pageSizeOptions` is provided — a rows-per-page\n * dropdown menu.\n *\n * All navigation buttons are disabled while `loading` is `true`.\n */\nconst Pagination = ({\n page,\n total,\n pageSize,\n onPageChange,\n pageSizeOptions,\n onPageSizeChange,\n loading,\n className,\n style,\n}: PaginationProps) => {\n const [rowsMenuOpen, setRowsMenuOpen] = useState(false);\n const [focusedElement, setFocusedElement] = useState(-1);\n\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n const start = page * pageSize + 1;\n const end = Math.min((page + 1) * pageSize, total);\n const isFirst = page === 0;\n const isLast = page >= totalPages - 1;\n\n const closeMenu = () => {\n setRowsMenuOpen(false);\n setFocusedElement(-1);\n };\n\n useEffect(() => {\n if (!rowsMenuOpen) return;\n const close = (e: MouseEvent) => {\n if (!(e.target as HTMLElement).closest(`.${CLASS}-rowsControl`)) {\n setRowsMenuOpen(false);\n setFocusedElement(-1);\n }\n };\n document.addEventListener('mousedown', close);\n return () => document.removeEventListener('mousedown', close);\n }, [rowsMenuOpen]);\n\n const onKeyDownRowsBtn = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === 'Tab' || e.key === 'Escape') {\n setRowsMenuOpen(false);\n setFocusedElement(-1);\n } else if (['ArrowDown', 'ArrowUp'].includes(e.key) && rowsMenuOpen) {\n e.preventDefault();\n if (e.key === 'ArrowDown') setFocusedElement(prev => (prev + 1 >= (pageSizeOptions?.length ?? 0) ? 0 : prev + 1));\n else setFocusedElement(prev => (prev - 1 < 0 ? (pageSizeOptions?.length ?? 1) - 1 : prev - 1));\n } else if (e.key === 'Enter' && rowsMenuOpen && focusedElement >= 0 && pageSizeOptions) {\n e.preventDefault();\n const option = pageSizeOptions[focusedElement];\n if (option !== undefined) {\n onPageSizeChange?.(option);\n setRowsMenuOpen(false);\n setFocusedElement(-1);\n }\n }\n };\n\n return (\n <div className={[CLASS, className || ''].filter(Boolean).join(' ')} css={Style(style ?? {})}>\n {pageSizeOptions && pageSizeOptions.length > 0 && (\n <div className={`${CLASS}-rowsControl`}>\n {rowsMenuOpen && (\n <PaginationMenu\n options={pageSizeOptions}\n activeOption={pageSize}\n onSelect={option => {\n onPageSizeChange?.(option);\n closeMenu();\n }}\n focusedElement={focusedElement}\n />\n )}\n <span className={`${CLASS}-rowsSize`}>{pageSize}</span>\n <IconButton\n icon={<Icon name='arrow_drop_up' size='sm' />}\n onClick={() => (rowsMenuOpen ? closeMenu() : setRowsMenuOpen(true))}\n onKeyDown={onKeyDownRowsBtn}\n isFlipped={rowsMenuOpen}\n aria-label='Rows per page'\n data-testid={`${CLASS}-rowsBtn`}\n />\n </div>\n )}\n <div className={`${CLASS}-controls`}>\n <span className={`${CLASS}-info`}>\n {start}-{end} of {total}\n </span>\n <IconButton\n icon={<Icon name='first_page' size='sm' />}\n onClick={() => onPageChange(0)}\n disabled={loading || isFirst}\n aria-label='First page'\n data-testid={`${CLASS}-first`}\n />\n <IconButton\n icon={<Icon name='chevron_left' size='sm' />}\n onClick={() => onPageChange(page - 1)}\n disabled={loading || isFirst}\n aria-label='Previous page'\n data-testid={`${CLASS}-prev`}\n />\n <IconButton\n icon={<Icon name='chevron_right' size='sm' />}\n onClick={() => onPageChange(page + 1)}\n disabled={loading || isLast}\n aria-label='Next page'\n data-testid={`${CLASS}-next`}\n />\n <IconButton\n icon={<Icon name='last_page' size='sm' />}\n onClick={() => onPageChange(totalPages - 1)}\n disabled={loading || isLast}\n aria-label='Last page'\n data-testid={`${CLASS}-last`}\n />\n </div>\n </div>\n );\n};\n\nexport default Pagination;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { PaginationStyleProps } from './Pagination.interface';\nimport PaginationBase from './Pagination';\n\nconst Pagination = ({ theme, variant = 'default', ...rest }: PaginationStyleProps) => {\n const { componentStyles } = useCreateComponentStyles([Component.PAGINATION], theme, variant.toUpperCase());\n return <PaginationBase {...rest} style={componentStyles} />;\n};\n\nexport default Pagination;\nexport type { PaginationProps, PaginationStyleProps } from './Pagination.interface';\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst background = (theme: Record<string, string>, event: string): string => `\n // BACKGROUNDS \n ${getStyle(theme, 'background-color', `--RADIO-EVENTS-${event}-BACKGROUND-COLOR`)}\n`;\n\nconst border = (theme: Record<string, string>, event: string): string => `\n // BORDERS\n ${getStyle(theme, 'border-color', `--RADIO-EVENTS-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--RADIO-EVENTS-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--RADIO-EVENTS-${event}-BORDER-STYLE`)}\n`;\n\nconst outline = (theme: Record<string, string>, event: string): string => ` \n // OUTLINE\n ${getStyle(theme, 'outline-color', `--RADIO-EVENTS-${event}-OUTLINE-COLOR`)}\n ${getStyle(theme, 'outline-width', `--RADIO-EVENTS-${event}-OUTLINE-WIDTH`)}\n ${getStyle(theme, 'outline-style', `--RADIO-EVENTS-${event}-OUTLINE-STYLE`)}\n ${getStyle(theme, 'outline-offset', `--RADIO-EVENTS-${event}-OUTLINE-OFFSET`)}\n`;\n\nconst shadow = (theme: Record<string, string>, event: string): string => ` \n // SHADOW\n ${getStyle(theme, 'background-color', `--RADIO-EVENTS-${event}-SHADOW-COLOR`)}\n`;\n\nconst icon = (theme: Record<string, string>, event: string): string => `\n // UTILS\n > span {\n ${getStyle(theme, 'color', `--RADIO-EVENTS-${event}-ICON-COLOR`)};\n }\n`;\n\nconst label = (theme: Record<string, string>, event: string): string => `\n // TYPOGRAPHY\n .--RADIO-label {\n ${getStyle(theme, 'color', `--RADIO-EVENTS-${event}-COLOR-PRIMARY`)}\n }\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--RADIO {\n display: flex;\n flex-direction: column;\n width: fit-content;\n\n .--RADIO-container {\n display: flex;\n flex-direction: row;\n gap: 12px;\n align-items: center;\n cursor: pointer;\n\n // ENABLED\n ${label(theme, 'ENABLED')};\n\n // VALUE\n &:has(.--RADIO-inputField:checked) {\n ${label(theme, 'VALUE')};\n }\n\n // HOVER\n &:hover {\n ${label(theme, 'HOVER')};\n\n .--RADIO-radio .--RADIO-span {\n &:before {\n opacity: 1;\n ${shadow(theme, 'HOVER')};\n }\n }\n }\n\n // ACTIVE\n &:has(.--RADIO-inputField.--RADIO-active, .--RADIO-inputField:active) {\n ${label(theme, 'ACTIVE')};\n }\n\n // FOCUS-VISIBLE\n &:has(.--RADIO-inputField:focus-visible) {\n ${label(theme, 'FOCUS')};\n }\n\n // ERROR\n &:has(.--RADIO-inputField.--RADIO-error) {\n ${label(theme, 'ERROR')};\n }\n\n // ERROR + VALUE\n &:has(.--RADIO-inputField.--RADIO-error:checked) {\n ${label(theme, 'ERROR_VALUE')};\n }\n\n // ERROR + HOVER\n &:hover:has(.--RADIO-inputField.--RADIO-error) {\n ${label(theme, 'ERROR_HOVER')};\n\n .--RADIO-radio .--RADIO-span {\n &:before {\n opacity: 1;\n ${shadow(theme, 'ERROR_HOVER')};\n }\n }\n }\n\n // ERROR + ACTIVE\n &:has(.--RADIO-inputField.--RADIO-error:active),\n &:has(.--RADIO-inputField.--RADIO-error.--RADIO-active) {\n ${label(theme, 'ERROR_ACTIVE')};\n }\n\n // ERROR + FOCUS\n &:has(.--RADIO-inputField.--RADIO-error:focus-visible) {\n ${label(theme, 'ERROR_FOCUS')};\n }\n\n // DISABLED\n &:has(.--RADIO-inputField:disabled) {\n pointer-events: none;\n ${label(theme, 'DISABLED')};\n }\n\n // DISABLED + VALUE\n &:has(.--RADIO-inputField:disabled:checked) {\n ${label(theme, 'DISABLED_VALUE')};\n }\n\n .--RADIO-radio {\n position: relative;\n display: inline-flex;\n width: 24px;\n height: 24px;\n isolation: isolate;\n\n .--RADIO-inputField {\n cursor: pointer;\n position: absolute;\n opacity: 0;\n width: 100%;\n height: 100%;\n z-index: 2;\n margin: 0;\n -webkit-tap-highlight-color: transparent;\n\n ~ .--RADIO-span > span {\n visibility: hidden;\n }\n &:checked ~ .--RADIO-span > span {\n visibility: visible;\n }\n\n // ENABLED\n ~ .--RADIO-span {\n ${background(theme, 'ENABLED')};\n ${border(theme, 'ENABLED')};\n ${icon(theme, 'ENABLED')};\n }\n\n // VALUE\n &:checked ~ .--RADIO-span {\n ${background(theme, 'VALUE')};\n ${border(theme, 'VALUE')};\n ${icon(theme, 'VALUE')};\n }\n\n // HOVER\n // Is at the container level\n\n // ACTIVE\n &.--RADIO-active ~ .--RADIO-span,\n &:active ~ .--RADIO-span {\n &:before {\n opacity: 1;\n ${shadow(theme, 'ACTIVE')};\n }\n }\n\n // FOCUS\n &:focus-visible ~ .--RADIO-span {\n outline: none;\n ${outline(theme, 'FOCUS')};\n ${icon(theme, 'FOCUS')};\n }\n\n // ERROR\n &.--RADIO-error ~ .--RADIO-span {\n ${background(theme, 'ERROR')};\n ${border(theme, 'ERROR')};\n ${icon(theme, 'ERROR')};\n }\n\n // ERROR + VALUE\n &.--RADIO-error:checked ~ .--RADIO-span {\n ${background(theme, 'ERROR_VALUE')};\n ${border(theme, 'ERROR_VALUE')};\n ${icon(theme, 'ERROR_VALUE')};\n }\n\n // ERROR + VALUE\n // Is at the container level\n\n // ERROR + ACTIVE\n &.--RADIO-error:active ~ .--RADIO-span,\n &.--RADIO-error.--RADIO-active ~ .--RADIO-span {\n &:before {\n opacity: 1;\n ${shadow(theme, 'ERROR_ACTIVE')};\n }\n }\n\n // ERROR + FOCUS\n &.--RADIO-error:focus-visible ~ .--RADIO-span {\n ${outline(theme, 'ERROR_FOCUS')};\n ${icon(theme, 'ERROR_FOCUS')};\n }\n\n // DISABLED\n &:disabled ~ .--RADIO-span {\n ${background(theme, 'DISABLED')};\n ${border(theme, 'DISABLED')};\n ${icon(theme, 'DISABLED')};\n }\n\n // DISABLED + VALUE\n &:disabled:checked ~ .--RADIO-span {\n ${background(theme, 'DISABLED_VALUE')};\n ${border(theme, 'DISABLED_VALUE')};\n ${icon(theme, 'DISABLED_VALUE')};\n }\n }\n\n .--RADIO-span {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n position: absolute;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 150ms ease-in-out;\n\n > span {\n width: 16px;\n height: 16px;\n z-index: 1;\n }\n\n &:before {\n content: '';\n position: absolute;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n opacity: 0;\n transition: opacity 150ms ease-in-out;\n z-index: -1;\n }\n }\n }\n\n .--RADIO-label {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1;\n }\n }\n }\n`;\n\nexport default Style;\n","import { createContext } from 'react';\n\nexport interface RadioGroupContextValue {\n /** The name attribute shared by all radios in this group */\n name: string;\n /** The currently selected value */\n selectedValue: string;\n /** Select a value */\n onChange: (value: string) => void;\n /** Group-level disabled state */\n disabled?: boolean;\n /** Group-level validation error */\n error?: { message?: string };\n /** Value of the first non-disabled Radio child — used to implement roving tabindex */\n firstValue: string;\n}\n\nexport const RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n","import React, { useState, useContext } from 'react';\n// Component Base\nimport emotion from './Radio.emotion';\nimport type { RadioProps, RadioBaseProps } from './Radio.interface';\nimport { RadioGroupContext } from './RadioGroup.context';\n// Custom Components\nimport Icon from '@components/atoms/Icon';\n\nconst CLASS = '--RADIO';\n\n/**\n * Headless presentational layer for the radio button.\n * Accepts `checked` and `onChange` directly — use this when you need a controlled radio outside of React Hook Form.\n */\nexport const RadioBase = React.forwardRef<HTMLInputElement, RadioBaseProps>(\n (\n {\n label,\n icon = <Icon name='circle' fill style={{ fontSize: '16px' }} />,\n className,\n style = {},\n disabled,\n checked,\n onSelect,\n error,\n onKeyDown,\n onKeyUp,\n onBlur,\n value,\n name,\n ...rest\n }: RadioBaseProps,\n ref,\n ) => {\n const [isActive, setIsActive] = useState(false);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' || event.key === 'Space') setIsActive(true);\n onKeyDown?.(event);\n };\n\n const handleKeyUp = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' || event.key === 'Space') {\n setIsActive(false);\n onSelect();\n }\n onKeyUp?.(event);\n };\n\n const handleBlur = () => {\n setIsActive(false);\n onBlur?.({} as React.FocusEvent<HTMLInputElement>);\n };\n\n return (\n <div\n className={[CLASS, isActive ? `${CLASS}-active` : '', className || ''].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n <label className={`${CLASS}-container`}>\n <div className={`${CLASS}-radio`}>\n <input\n className={[`${CLASS}-inputField`, isActive ? `${CLASS}-active` : '', error ? `${CLASS}-error` : ''].join(\n ' ',\n )}\n type='radio'\n value={value}\n name={name}\n checked={checked}\n disabled={disabled}\n onChange={() => onSelect()}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onBlur={handleBlur}\n ref={ref}\n data-testid={`${CLASS}-inputField`}\n {...rest}\n />\n <span className={`${CLASS}-span`} data-testid={`${CLASS}-icon`}>\n {icon}\n </span>\n </div>\n <span className={`${CLASS}-label`} data-testid={`${CLASS}-label`}>\n {label}\n </span>\n </label>\n </div>\n );\n },\n);\n\nRadioBase.displayName = 'RadioBase';\n\n/**\n * A radio button lets the user select exactly one option from a set.\n *\n * **Radio must always be rendered inside a `<RadioGroup>`** — it reads its selected state,\n * name and change handler from the nearest RadioGroup context.\n * Rendering a Radio outside a RadioGroup throws an error.\n */\nconst Radio = (props: RadioProps) => {\n const groupCtx = useContext(RadioGroupContext);\n\n if (!groupCtx) throw new Error('Radio must be used inside a RadioGroup.');\n\n const { value, ...rest } = props;\n const checked = groupCtx.selectedValue === value;\n\n // Roving tabindex: selected → 0; unselected but first when nothing selected → 0; everything else → -1\n const noSelection = groupCtx.selectedValue === '';\n const tabIndex = checked || (noSelection && groupCtx.firstValue === value) ? 0 : -1;\n\n return (\n <RadioBase\n {...rest}\n name={groupCtx.name}\n value={value}\n checked={checked}\n onSelect={() => groupCtx.onChange(value)}\n disabled={rest.disabled ?? groupCtx.disabled}\n tabIndex={tabIndex}\n />\n );\n};\n\nexport default Radio;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { RadioStyleProps } from './Radio.interface';\nimport RadioBase from './Radio';\n\nconst Radio = ({ theme, variant = 'default', ...rest }: RadioStyleProps) => {\n const { componentStyles } = useCreateComponentStyles([Component.RADIO], theme, variant.toUpperCase());\n\n return <RadioBase {...rest} style={componentStyles} />;\n};\n\nexport default Radio;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst border = (theme: Record<string, string>, event: string): string => `\n // BORDERS\n ${getStyle(theme, 'border-color', `--SELECT-EVENTS-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--SELECT-EVENTS-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--SELECT-EVENTS-${event}-BORDER-STYLE`)}\n`;\n\nconst typography = (theme: Record<string, string>, event: string): string => `\n // TYPOGRAPHY\n ${getStyle(theme, 'color', `--SELECT-EVENTS-${event}-COLOR-PRIMARY`)}\n ${getStyle(theme, 'caret-color', `--SELECT-EVENTS-${event}-FONT-PRIMARY`)}\n`;\n\nconst labelStyles = (theme: Record<string, string>, event: string, activateLabel = false): string => {\n return `\n ${getStyle(theme, 'color', `--SELECT-EVENTS-${event}-COLOR-SECONDARY`)}\n ${activateLabel ? 'transform: translate(14px, -24px); font-size: 0.75rem;' : ''}\n`;\n};\n\nconst legendStyles = (activate: boolean): string => `\n .--SELECT-legend {\n max-width: ${activate ? '100%' : '0px'};\n }\n`;\n\nconst container = (theme: Record<string, string>, event: string): string => `\n ${getStyle(theme, 'background-color', `--SELECT-EVENTS-${event}-BACKGROUND-COLOR`)}\n ~ .--SELECT-helperText {\n ${getStyle(theme, 'color', `--SELECT-EVENTS-${event}-COLOR-TERTIARY`)}\n }\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--SELECT {\n position: relative;\n padding: 0;\n border: 0;\n width: 100%;\n\n &.--SELECT-paddingBottom {\n padding-bottom: 24px;\n }\n\n .--SELECT-container {\n box-sizing: border-box;\n position: relative;\n display: inline-flex;\n align-items: center;\n\n // Safari Firefox Chrome/Edge\n width: -webkit-fill-available;\n width: -moz-available;\n width: stretch;\n\n ${getStyle(theme, 'border-radius', '--SELECT-ROOT-BORDER-RADIUS')};\n\n // ENABLED\n ${container(theme, 'ENABLED')};\n\n // VALUE\n &:has(.--SELECT-selectField:not(:placeholder-shown)) {\n ${container(theme, 'VALUE')};\n }\n\n // HOVER\n &:has(.--SELECT-selectField:hover) {\n ${container(theme, 'HOVER')};\n }\n\n // ACTIVE\n &:has(.--SELECT-selectField:active, .--SELECT-selectField.--SELECT-active) {\n ${container(theme, 'ACTIVE')};\n }\n\n // FOCUS\n &:has(.--SELECT-selectField:focus-visible) {\n outline: none;\n ${container(theme, 'FOCUS')};\n }\n\n // ERROR\n &:has(.--SELECT-selectField.--SELECT-error) {\n ${container(theme, 'ERROR')};\n }\n\n // ERROR + VALUE\n &:has(.--SELECT-selectField.--SELECT-error:not(:placeholder-shown)) {\n ${container(theme, 'ERROR_VALUE')};\n }\n\n // ERROR + HOVER\n &:has(.--SELECT-selectField.--SELECT-error:hover) {\n ${container(theme, 'ERROR_HOVER')};\n }\n\n // ERROR + ACTIVE\n &:has(.--SELECT-selectField.--SELECT-error:active, .--SELECT-selectField.--SELECT-error.--SELECT-active) {\n ${container(theme, 'ERROR_ACTIVE')};\n }\n\n // ERROR + FOCUS\n &:has(.--SELECT-selectField.--SELECT-error:focus-visible) {\n ${container(theme, 'ERROR_FOCUS')};\n }\n\n // DISABLED\n &:has(.--SELECT-selectField:disabled) {\n pointer-events: none;\n ${container(theme, 'DISABLED')};\n }\n\n // DISABLED + VALUE\n &:has(.--SELECT-selectField:disabled:not(:placeholder-shown)) {\n pointer-events: none;\n ${container(theme, 'DISABLED-VALUE')};\n }\n\n .--SELECT-selectField {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem; // 14px\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: 1;\n\n // Safari Firefox Chrome/Edge\n height: -webkit-fill-available;\n height: -moz-available;\n height: stretch;\n width: -webkit-fill-available;\n width: -moz-available;\n width: stretch;\n\n min-width: 0;\n border: 0;\n margin: 0;\n padding: 15px 14px;\n background-color: transparent;\n cursor: text;\n display: block;\n box-sizing: border-box;\n\n &:read-only {\n cursor: pointer;\n }\n\n // ENABLED\n ${typography(theme, 'ENABLED')};\n ~ .--SELECT-label {\n ${labelStyles(theme, 'ENABLED')}\n }\n ~ .--SELECT-fieldset {\n ${border(theme, 'ENABLED')}\n }\n\n // VALUE\n &:not(:placeholder-shown),\n &[placeholder]:not([placeholder=' ']),\n &.--SELECT-open {\n ${typography(theme, 'VALUE')};\n ~ .--SELECT-label {\n ${labelStyles(theme, 'VALUE', true)}\n }\n ~ .--SELECT-fieldset {\n ${border(theme, 'VALUE')};\n ${legendStyles(true)};\n }\n }\n\n // HOVER\n &:hover {\n ${typography(theme, 'HOVER')};\n ~ .--SELECT-label {\n ${labelStyles(theme, 'HOVER')}\n }\n ~ .--SELECT-fieldset {\n ${border(theme, 'HOVER')}\n }\n }\n\n // ACTIVE\n &:active,\n &.--SELECT-active {\n ${typography(theme, 'ACTIVE')};\n ~ .--SELECT-label {\n ${labelStyles(theme, 'ACTIVE')};\n }\n ~ .--SELECT-fieldset {\n ${border(theme, 'ACTIVE')};\n }\n }\n\n // FOCUS\n &:focus-visible {\n outline: none;\n ${typography(theme, 'FOCUS')};\n ~ .--SELECT-label {\n ${labelStyles(theme, 'FOCUS', true)}\n }\n ~ .--SELECT-fieldset {\n ${border(theme, 'FOCUS')};\n ${legendStyles(true)};\n }\n }\n\n // ERROR\n &.--SELECT-error {\n ${typography(theme, 'ERROR')};\n ~ .--SELECT-label {\n ${labelStyles(theme, 'ERROR')}\n }\n ~ .--SELECT-fieldset {\n ${border(theme, 'ERROR')}\n }\n }\n\n // ERROR + VALUE\n &.--SELECT-error:not(:placeholder-shown),\n &.--SELECT-error.--SELECT-open {\n ${typography(theme, 'ERROR_VALUE')};\n ~ .--SELECT-label {\n ${labelStyles(theme, 'ERROR_VALUE')};\n }\n ~ .--SELECT-fieldset {\n ${border(theme, 'ERROR_VALUE')};\n }\n }\n\n // ERROR + HOVER\n &.--SELECT-error:hover {\n ${typography(theme, 'ERROR_HOVER')};\n ~ .--SELECT-label {\n ${labelStyles(theme, 'ERROR_HOVER')}\n }\n ~ .--SELECT-fieldset {\n ${border(theme, 'ERROR_HOVER')}\n }\n }\n\n // ERROR + ACTIVE\n &.--SELECT-error:active,\n &.--SELECT-error.--SELECT-active {\n ${typography(theme, 'ERROR_ACTIVE')};\n ~ .--SELECT-label {\n ${labelStyles(theme, 'ERROR_ACTIVE')}\n }\n ~ .--SELECT-fieldset {\n ${border(theme, 'ERROR_ACTIVE')}\n }\n }\n\n // ERROR + FOCUS\n &.--SELECT-error:focus-visible {\n ${typography(theme, 'ERROR_FOCUS')};\n ~ .--SELECT-label {\n ${labelStyles(theme, 'ERROR_FOCUS')}\n }\n ~ .--SELECT-fieldset {\n ${border(theme, 'ERROR_FOCUS')}\n }\n }\n\n // DISABLED\n &:disabled {\n user-select: none;\n pointer-events: none;\n ${typography(theme, 'DISABLED')};\n ~ .--SELECT-label {\n ${labelStyles(theme, 'DISABLED')}\n }\n ~ .--SELECT-fieldset {\n ${border(theme, 'DISABLED')}\n }\n }\n\n // DISABLED + VALUE\n &:disabled:not(:placeholder-shown),\n &:disabled.--SELECT-open {\n user-select: none;\n pointer-events: none;\n ${typography(theme, 'DISABLED_VALUE')};\n ~ .--SELECT-label {\n ${labelStyles(theme, 'DISABLED_VALUE')}\n }\n ~ .--SELECT-fieldset {\n ${border(theme, 'DISABLED_VALUE')}\n }\n }\n }\n\n .--SELECT-label {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem; // 14px\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: normal;\n\n padding: 0;\n display: block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n position: absolute;\n pointer-events: none;\n z-index: 4;\n\n // ANIMATION\n transform: translate(14px, 0px);\n transition: 150ms ease-in-out;\n }\n\n .--SELECT-fieldset {\n // Safari Firefox Chrome/Edge\n height: 100%;\n width: -webkit-fill-available;\n width: -moz-available;\n width: stretch;\n\n text-align: left;\n position: absolute;\n margin: 0;\n padding: 0 6px;\n pointer-events: none;\n overflow: hidden;\n z-index: 5;\n box-sizing: border-box;\n ${getStyle(theme, 'border-radius', '--SELECT-ROOT-BORDER-RADIUS')};\n -webkit-tap-highlight-color: transparent;\n\n .--SELECT-legend {\n width: auto;\n overflow: hidden;\n display: block;\n padding: 0;\n height: 0px;\n visibility: hidden;\n\n // Animation\n max-width: 0px;\n transition: max-width 150ms ease-in-out;\n\n .--SELECT-text {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.75rem; // 12px\n letter-spacing: 0.01em;\n font-weight: 500;\n padding: 0px 7px;\n }\n }\n }\n\n .--SELECT-adornment {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0px 12px;\n }\n }\n\n .--SELECT-helperText {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.75rem; // 12px\n line-height: 1;\n\n display: block;\n margin-top: 8px;\n margin-left: 14px;\n height: 16px;\n }\n }\n`;\n\nexport default Style;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst row = (theme: Record<string, string>, event: string): string => `\n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--SELECTMENU-EVENTS-${event}-BACKGROUND-COLOR`)}\n \n // BORDERS\n ${getStyle(theme, 'border-color', `--SELECTMENU-EVENTS-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--SELECTMENU-EVENTS-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--SELECTMENU-EVENTS-${event}-BORDER-STYLE`)}\n ${getStyle(theme, 'border-radius', `--SELECTMENU-EVENTS-${event}-BORDER-RADIUS`)}\n`;\n\nconst typography = (theme: Record<string, string>, event: string): string => `\n // TYPOGRAPHY\n ${getStyle(theme, 'color', `--SELECTMENU-EVENTS-${event}-COLOR-PRIMARY`)};\n ${getStyle(theme, 'caret-color', `--SELECTMENU-EVENTS-${event}-COLOR-PRIMARY`)};\n`;\n\nconst container = (theme: Record<string, string>, event: string): string => `\n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--SELECTMENU-${event}-BACKGROUND-COLOR`)}\n \n // BORDERS\n ${getStyle(theme, 'border-color', `--SELECTMENU-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--SELECTMENU-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--SELECTMENU-${event}-BORDER-STYLE`)}\n ${getStyle(theme, 'border-radius', `--SELECTMENU-${event}-BORDER-RADIUS`)}\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--SELECTMENU {\n z-index: 100;\n position: absolute;\n top: calc(48px + ${theme['--SELECTMENU-ROOT-TOP'] || ''});\n left: 0px;\n width: 100%;\n box-shadow:\n rgba(0, 0, 0, 0.2) 0px 5px 5px -3px,\n rgba(0, 0, 0, 0.14) 0px 8px 10px 1px,\n rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;\n box-sizing: border-box;\n max-height: 126px; // 3 rows * 42px\n overflow-y: auto;\n cursor: pointer;\n ${container(theme, 'ROOT')}\n\n // Animation\n display: none;\n opacity: 0;\n translate: 0px -10px;\n transition-property: display opacity;\n transition-duration: 150ms;\n transition-behavior: allow-discrete;\n\n &.--SELECTMENU-open {\n display: block;\n opacity: 1;\n translate: 0px 0px;\n\n @starting-style {\n opacity: 0;\n translate: 0px -10px;\n }\n }\n\n // ROW STYLES\n .--SELECTMENU-row:last-child,\n .--SELECTMENU-row:has(+ .--SELECTMENU-row:hover),\n .--SELECTMENU-row:has(+ .--SELECTMENU-selected) {\n // border-bottom: none;\n }\n\n .--SELECTMENU-row {\n padding: 0px 24px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n justify-content: center;\n border-top: none;\n border-left: none;\n border-right: none;\n height: 42px;\n box-sizing: border-box;\n\n .--SELECTMENU-rowTitle {\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n ${getStyle(theme, 'color', '--SELECTMENU-ENABLED-FONT-PRIMARY')}\n font-size: 0.875rem; // 14px\n line-height: 1.5;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n .--SELECTMENU-rowDescription {\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n ${getStyle(theme, 'color', '--SELECTMENU-ENABLED-FONT-SECONDARY')}\n font-size: 0.75rem; // 12px\n line-height: 1;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n // ENABLED\n ${row(theme, 'ENABLED')}\n ${typography(theme, 'ENABLED')}\n\n // VALUE\n &.--SELECTMENU-selected {\n ${row(theme, 'VALUE')}\n ${typography(theme, 'VALUE')}\n }\n\n // HOVER\n &:hover {\n ${row(theme, 'HOVER')}\n ${typography(theme, 'HOVER')}\n }\n\n // - ACTIVE\n &:active,\n &.--SELECTMENU-active {\n ${row(theme, 'ACTIVE')}\n ${typography(theme, 'ACTIVE')}\n }\n\n // FOCUS\n &:focus-visible {\n outline-offset: 0px;\n outline: 0;\n ${row(theme, 'FOCUS')}\n ${typography(theme, 'FOCUS')}\n }\n\n &.--SELECTMENU-descriptionMenu {\n height: 52px;\n }\n }\n\n &::-webkit-scrollbar {\n width: 12px;\n height: 4px;\n }\n\n ::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0.5);\n border-radius: 9999px;\n border: 3px solid transparent;\n background-clip: padding-box;\n }\n\n &.--SELECTMENU-staticMenu {\n position: static;\n margin-top: 8px;\n }\n\n &.--SELECTMENU-descriptionMenu {\n max-height: 156px; // 3 rows * 52px\n }\n }\n`;\n\nexport default Style;\n","import React, { useEffect } from 'react';\nimport emotion from './SelectMenu.emotion';\nimport type { SelectMenuProps } from './SelectMenu.interface';\n\nconst CLASS = '--SELECTMENU';\n\n/**\n * Dropdown list rendered by `<Select>`.\n * Scrolls the focused option into view on keyboard navigation and calls `onChange` on click.\n */\nconst SelectMenu = React.forwardRef<HTMLDivElement, SelectMenuProps>(\n (\n {\n displayOptions,\n value,\n isOpen,\n hasStaticOptions,\n hasDescription,\n onChange,\n focusedElement,\n onScroll,\n style,\n className,\n },\n ref,\n ) => {\n useEffect(() => {\n const el = document.getElementById(`${CLASS}-option-${focusedElement}`);\n el?.scrollIntoView({ block: 'nearest' });\n }, [focusedElement]);\n\n return (\n <div\n id={`${CLASS}-root`}\n className={[\n CLASS,\n hasStaticOptions ? `${CLASS}-staticMenu` : '',\n hasDescription ? `${CLASS}-descriptionMenu` : '',\n isOpen && `${CLASS}-open`,\n className || '',\n ].join(' ')}\n css={emotion(style)}\n onScroll={onScroll}\n role='listbox'\n ref={ref}\n data-testid={CLASS}\n >\n {displayOptions.map((option, index) => {\n const selectedClass = option.value === value && isOpen ? `${CLASS}-selected` : '';\n const isActive = focusedElement === index;\n\n return (\n <div\n id={`${CLASS}-option-${index}`}\n key={option.value}\n className={[\n `${CLASS}-row`,\n selectedClass,\n `${CLASS}-row`,\n hasDescription ? `${CLASS}-descriptionMenu` : '',\n isActive ? `${CLASS}-active` : '',\n ].join(' ')}\n onClick={() => onChange(option)}\n role='option'\n tabIndex={-1}\n data-testid={`${CLASS}-row-${option.label}`}\n >\n <span className={`${CLASS}-rowTitle`}>{option.label}</span>\n {hasDescription && <span className={`${CLASS}-rowDescription`}>{option.description}</span>}\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nexport default SelectMenu;\n","import React from 'react';\nimport { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { SelectMenuStyleProps } from './SelectMenu.interface';\nimport SelectMenuBase from './SelectMenu';\n\nconst SelectMenu = React.forwardRef<HTMLDivElement, SelectMenuStyleProps>(({ theme, ...rest }, ref) => {\n const { componentStyles } = useCreateComponentStyles([Component.SELECTMENU, Component.SELECT], theme);\n\n return <SelectMenuBase {...rest} style={componentStyles} ref={ref} />;\n});\n\nSelectMenu.displayName = 'SelectMenu';\n\nexport default SelectMenu;\n","import React, { useState, useRef } from 'react';\n// Component Base\nimport emotion from './Select.emotion';\nimport type { SelectProps } from './Select.interface';\n// External Libraries\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\n// Custom Hooks\nimport { useOnClickOutside } from '@hooks/useOnClickOutside';\nimport { useStateCallback } from '@hooks/useStateCallback';\n// Custom Components\nimport Icon from '@components/atoms/Icon';\nimport IconButton from '@components/atoms/IconButton';\nimport SelectMenu from './SelectMenu';\nimport type { OptionProp } from '@interfaces';\n\nconst CLASS = '--SELECT';\n\n// We save the latest menu list after we closed. So we can show it in the close animation\nlet saveFilteredOptions: Array<OptionProp> = [];\n\n/**\n * A select field lets users pick a single option from a dropdown list.\n *\n * Features: floating label, helper/error text, optional search (≥3 chars), lazy loading via\n * `range`, per-option descriptions, and full keyboard navigation (arrows, Enter, Tab).\n * The form value is a `string` (the selected option's `value`).\n */\nconst Select = <TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n control,\n options,\n\n disabled,\n range = 100,\n hasStaticOptions = false,\n hasSearch = false,\n hasDescription = false,\n hasPadding = false,\n showErrorText = true,\n helperText,\n style,\n className,\n ...rest\n}: SelectProps<TFieldValues>) => {\n // Get value from controller\n const { field, fieldState } = useController({\n control,\n name: name as FieldPath<TFieldValues>,\n });\n const [value, setValue] = useStateCallback<string>(field.value || '');\n const [open, setOpen] = useStateCallback(false);\n const wasOpenedRef = useRef(false);\n const ref = useRef<HTMLDivElement>(null);\n const exceptRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const selectedOption = options.find(option => option.value === value);\n const errorText = fieldState.error;\n const heightBox = hasDescription ? 156 : 126;\n const [searchValue, setSearchValue] = useStateCallback<string>(selectedOption?.label || '');\n const [sliceBy, setSliceBy] = useState<number>(1);\n const [activeSearch, setActiveSearch] = useState<boolean>(false);\n const [focusedElement, setFocusedElement] = useState<number>(-1);\n\n const isOpen = open || !!(hasSearch && searchValue && !value);\n\n // Close the menu and reset all transient state in one place\n const closeMenu = (searchLabel?: string) => {\n setOpen(false);\n setSearchValue(searchLabel ?? selectedOption?.label ?? '');\n setActiveSearch(false);\n setFocusedElement(-1);\n if (wasOpenedRef.current) field.onBlur();\n };\n\n // Open the menu and mark the field as interacted\n const openMenu = () => {\n wasOpenedRef.current = true;\n setOpen(true);\n };\n\n useOnClickOutside({\n ref,\n onAction: () => closeMenu(),\n isActive: isOpen,\n exceptRef,\n });\n\n const onChange = (option: OptionProp) => {\n field.onChange(option.value);\n setValue(option.value);\n closeMenu(option.label);\n };\n\n // Focus the input text when user clicks it\n const onFocus = (event: React.MouseEvent<HTMLInputElement>) => {\n const select = event.target as HTMLInputElement;\n select.select();\n };\n\n // Move between options with the keyboard\n const onMoveFocus = (key: string) => {\n if (key === 'ArrowDown' && isOpen)\n setFocusedElement(focusedElement + 1 >= saveFilteredOptions.length ? 0 : focusedElement + 1);\n else if (key === 'ArrowUp' && isOpen)\n setFocusedElement(focusedElement - 1 < 0 ? saveFilteredOptions.length - 1 : focusedElement - 1);\n };\n\n // Handle key events on the container\n const onKeyDownContainer = (event: React.KeyboardEvent<HTMLDivElement>) => {\n event.stopPropagation();\n\n // On Enter we check if an option is focused to select it\n if (event.key === 'Enter') {\n event.preventDefault();\n if (isOpen && focusedElement >= 0) {\n const option = filteredOptions()[focusedElement];\n if (option) onChange(option);\n } else {\n if (isOpen) closeMenu();\n else openMenu();\n }\n }\n // On Tab or Escape we close the Menu\n else if (event.key === 'Tab' || event.key === 'Escape') closeMenu();\n // On ArrowDown or ArrowUp we move the focus in the Menu\n else if (['ArrowDown', 'ArrowUp'].includes(event.key)) {\n if (isOpen) {\n event.preventDefault();\n onMoveFocus(event.key);\n }\n }\n };\n\n // Handle key events on the IconButton\n const onKeyDownIconButton = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n\n // On Enter we toggle the open state\n if (event.key === 'Enter') {\n event.preventDefault();\n if (isOpen && focusedElement >= 0) {\n const option = filteredOptions()[focusedElement];\n if (option) onChange(option);\n } else {\n if (isOpen) closeMenu();\n else openMenu();\n }\n }\n // On Tab or Escape we close the menu\n else if (event.key === 'Tab' || event.key === 'Escape') closeMenu();\n // On ArrowDown or ArrowUp we move the focus in the Menu\n else if (['ArrowDown', 'ArrowUp'].includes(event.key)) {\n event.preventDefault();\n inputRef.current?.focus();\n onMoveFocus(event.key);\n }\n };\n\n // Handle click on the Select\n const onClick = (\n event: React.MouseEvent<HTMLButtonElement, MouseEvent> | React.MouseEvent<HTMLDivElement, MouseEvent>,\n ) => {\n event.stopPropagation();\n\n if (!disabled) {\n if (isOpen) closeMenu();\n else openMenu();\n }\n };\n\n // Handle scroll on the Menu\n const onScroll = (event: React.UIEvent<HTMLDivElement, UIEvent>) => {\n event.preventDefault();\n const handleEvent = event;\n\n const { scrollHeight, scrollTop } = handleEvent.target as HTMLDivElement;\n\n if (scrollTop + heightBox >= scrollHeight && filteredOptions().length >= sliceBy * range) setSliceBy(sliceBy + 1);\n };\n\n // Handle search on the Input\n const onSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n event.preventDefault();\n const handleEvent = event;\n const { value: inputValue } = handleEvent.target;\n if (inputValue.length > 2) setSliceBy(1);\n setSearchValue(inputValue, () => setActiveSearch(true));\n openMenu();\n };\n\n // Filter options based on search value\n const filteredOptions = (): Array<OptionProp> => {\n if (hasSearch && searchValue && searchValue.length > 2) {\n const filtered = options.slice(0, range * sliceBy);\n if (searchValue === selectedOption?.label && !activeSearch) {\n saveFilteredOptions = filtered;\n return filtered;\n }\n\n const filter = options\n .filter(option => option.label.toLocaleUpperCase().includes(searchValue.toLocaleUpperCase()))\n .slice(0, range * sliceBy);\n\n // Check again if we have the search actived\n if (activeSearch) saveFilteredOptions = filter || [];\n else saveFilteredOptions = filtered;\n return filter || [];\n }\n\n saveFilteredOptions = options.slice(0, range * sliceBy);\n return options.slice(0, range * sliceBy);\n };\n\n return (\n <div\n className={[CLASS, hasPadding ? `${CLASS}-paddingBottom` : '', className || ''].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n <div\n className={`${CLASS}-container`}\n onClick={onClick}\n onKeyDown={event => !disabled && onKeyDownContainer(event)}\n role='button'\n ref={exceptRef}\n data-testid={`${CLASS}-container`}\n >\n <input\n name={name}\n className={[`${CLASS}-selectField`, isOpen && `${CLASS}-open`, errorText && `${CLASS}-error`].join(' ')}\n onClick={event => hasSearch && onFocus(event)}\n onChange={onSearch}\n value={searchValue}\n placeholder=' '\n disabled={disabled}\n readOnly={!hasSearch}\n ref={inputRef}\n role='combobox'\n autoComplete='off'\n data-testid={`${CLASS}-selectField`}\n {...(hasSearch && { placeholder: 'Search...' })}\n {...rest}\n />\n\n <div className={`${CLASS}-adornment`}>\n <IconButton\n icon={<Icon name='arrow_drop_up' />}\n onClick={onClick}\n onKeyDown={event => !disabled && onKeyDownIconButton(event)}\n disabled={disabled}\n isFlipped={!isOpen}\n tabIndex={-1}\n />\n </div>\n\n <fieldset aria-hidden='true' className={`${CLASS}-fieldset`}>\n <legend className={`${CLASS}-legend`}>\n <span className={`${CLASS}-text`}>{label}</span>\n </legend>\n </fieldset>\n <span className={`${CLASS}-label`}>{label}</span>\n </div>\n\n {(showErrorText || helperText) && (\n <span className={`${CLASS}-helperText`} data-testid={`${CLASS}-helperText`}>\n {helperText && (!errorText || !showErrorText) && helperText}\n {showErrorText && errorText && errorText.message}\n </span>\n )}\n\n <SelectMenu\n displayOptions={isOpen ? filteredOptions() : saveFilteredOptions}\n value={value}\n isOpen={isOpen}\n hasStaticOptions={hasStaticOptions}\n hasDescription={hasDescription}\n onChange={onChange}\n focusedElement={focusedElement}\n onScroll={onScroll}\n ref={ref}\n />\n </div>\n );\n};\n\nexport default Select;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { SelectStyleProps } from './Select.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport SelectBase from './Select';\n\nconst Select = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: SelectStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.SELECT], theme, variant.toUpperCase());\n\n return <SelectBase {...rest} style={componentStyles} />;\n};\n\nexport default Select;\n","import { css, keyframes } from '@emotion/react';\n\nconst shimmer = keyframes`\n 0% { background-position: 200% center; }\n 100% { background-position: -200% center; }\n`;\n\nconst Style = css`\n &.--SKELETON {\n display: block;\n background: linear-gradient(\n 90deg,\n rgba(255, 255, 255, 0.05) 0%,\n rgba(255, 255, 255, 0.13) 50%,\n rgba(255, 255, 255, 0.05) 100%\n );\n background-size: 200% 100%;\n animation: ${shimmer} 1.4s ease infinite;\n\n &.--SKELETON--circular {\n border-radius: 50%;\n }\n\n &.--SKELETON--rectangular {\n border-radius: 4px;\n }\n }\n`;\n\nexport default Style;\n","// Component Base\nimport Style from './Skeleton.emotion';\nimport type { SkeletonProps } from './Skeleton.interface';\n\n/**\n * A low-fidelity placeholder that mimics the shape of content while it loads.\n *\n * Use `variant=\"rectangular\"` for text lines, cards, or images and\n * `variant=\"circular\"` for avatars or icon placeholders. Set `width` and\n * `height` to match the real content's dimensions.\n */\nconst Skeleton = ({ variant = 'rectangular', width, height, className }: SkeletonProps) => (\n <span\n className={['--SKELETON', `--SKELETON--${variant}`, className || ''].filter(Boolean).join(' ')}\n css={Style}\n style={{ width, height }}\n aria-hidden='true'\n />\n);\n\nexport default Skeleton;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst rail = (theme: Record<string, string>, event: string): string => `\n ~ .--SLIDER-rail {\n ${getStyle(theme, 'background-color', `--SLIDER-EVENTS-${event}-BACKGROUND-COLOR`)}\n }\n`;\n\nconst tracker = (theme: Record<string, string>, event: string): string => `\n ~ .--SLIDER-tracker { \n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--SLIDER-EVENTS-${event}-BACKGROUND-COLOR`)}\n }\n`;\n\nconst thumbIcon = (theme: Record<string, string>, event: string): string => `\n ~ .--SLIDER-thumbIcon { \n // UTILS\n ${getStyle(theme, 'background-color', `--SLIDER-EVENTS-${event}-ICON-BACKGROUND-COLOR`)}\n \n // BORDERS\n ${getStyle(theme, 'border-color', `--SLIDER-EVENTS-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--SLIDER-EVENTS-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--SLIDER-EVENTS-${event}-BORDER-STYLE`)}\n ${getStyle(theme, 'border-radius', `--SLIDER-EVENTS-${event}-BORDER-RADIUS`)}\n\n \n > span {\n ${getStyle(theme, 'color', `--SLIDER-EVENTS-${event}-ICON-COLOR`)};\n }\n }\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--SLIDER {\n justify-content: center;\n display: flex;\n border-radius: 12px;\n box-sizing: content-box;\n position: relative;\n touch-action: none;\n -webkit-tap-highlight-color: transparent;\n height: 4px;\n width: 100%;\n padding: 8px 0px;\n\n .--SLIDER-inputField {\n appearance: none;\n width: 100%;\n height: 0px;\n outline: none;\n position: absolute;\n pointer-events: none;\n cursor: default;\n z-index: 3;\n margin: 0px;\n\n // ENABLED\n ${rail(theme, 'ENABLED')};\n ${thumbIcon(theme, 'ENABLED')};\n\n // VALUE\n ${tracker(theme, 'VALUE')};\n\n // HOVER\n @media (hover: hover) {\n :hover + .--SLIDER-ripple {\n opacity: 1;\n ${getStyle(theme, 'background-color', '--SLIDER-EVENTS-HOVER-BACKGROUND-COLOR')};\n }\n }\n\n // ACTIVE\n :active + .--SLIDER-ripple {\n opacity: 1;\n ${getStyle(theme, 'background-color', '--SLIDER-EVENTS-ACTIVE-BACKGROUND-COLOR')};\n }\n\n // FOCUS\n &:focus-visible + .--SLIDER-ripple + .--SLIDER-thumbIcon {\n ${getStyle(theme, 'outline-color', '--SLIDER-EVENTS-FOCUS-OUTLINE-COLOR')}\n ${getStyle(theme, 'outline-width', '--SLIDER-EVENTS-FOCUS-OUTLINE-WIDTH')}\n ${getStyle(theme, 'outline-style', '--SLIDER-EVENTS-FOCUS-OUTLINE-STYLE')}\n ${getStyle(theme, 'outline-offset', '--SLIDER-EVENTS-FOCUS-OUTLINE-OFFSET')}\n }\n\n // DISABLED\n &:disabled {\n &::-webkit-slider-thumb {\n pointer-events: none;\n }\n\n ${rail(theme, 'DISABLED')};\n ${tracker(theme, 'DISABLED_VALUE')};\n ${thumbIcon(theme, 'DISABLED')};\n\n ~ .--SLIDER-mark {\n ${getStyle(theme, 'background-color', '--SLIDER-EVENTS-DISABLED_VALUE-BACKGROUND-COLOR')}\n }\n\n ~ .--SLIDER-mark.--SLIDER-mark--active {\n ${getStyle(theme, 'background-color', '--SLIDER-EVENTS-DISABLED-BACKGROUND-COLOR')}\n }\n }\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n cursor: pointer;\n border-radius: 50%;\n width: 24px;\n height: 24px;\n pointer-events: auto;\n }\n }\n\n .--SLIDER-rail {\n display: block;\n position: absolute;\n border-radius: inherit;\n width: 100%;\n height: inherit;\n top: 50%;\n -webkit-transform: translateY(-50%);\n -moz-transform: translateY(-50%);\n -ms-transform: translateY(-50%);\n transform: translateY(-50%);\n cursor: pointer;\n }\n\n .--SLIDER-tracker {\n border: none;\n display: block;\n position: absolute;\n border-radius: inherit;\n height: inherit;\n top: 50%;\n transform: translateY(-50%);\n z-index: 1;\n cursor: pointer;\n }\n\n &.--SLIDER--clicking {\n .--SLIDER-thumbIcon,\n .--SLIDER-ripple {\n transition:\n left 150ms ease-in-out,\n top 150ms ease-in-out,\n background-color 150ms ease-in-out,\n opacity 150ms ease-in-out;\n }\n\n .--SLIDER-tracker {\n transition:\n left 150ms ease-in-out,\n right 150ms ease-in-out,\n width 150ms ease-in-out,\n top 150ms ease-in-out,\n bottom 150ms ease-in-out,\n height 150ms ease-in-out;\n }\n }\n\n &.--SLIDER--vertical {\n width: 4px;\n height: 100%;\n padding: 0px 8px;\n flex-direction: column;\n\n .--SLIDER-inputField {\n width: 0px;\n height: 100%;\n writing-mode: vertical-lr;\n direction: rtl;\n }\n\n .--SLIDER-rail {\n width: inherit;\n height: 100%;\n left: 50%;\n top: 0;\n transform: translateX(-50%);\n }\n\n .--SLIDER-tracker {\n width: inherit;\n left: 50%;\n height: auto;\n top: auto;\n transform: translateX(-50%);\n }\n\n .--SLIDER-ripple {\n top: auto;\n left: 50%;\n transform: translateX(-50%);\n margin-left: 0;\n margin-top: -6px;\n }\n\n .--SLIDER-thumbIcon {\n top: auto;\n left: 50%;\n transform: translateX(-50%);\n }\n\n .--SLIDER-mark {\n top: auto;\n left: 50%;\n transform: translateX(-50%);\n }\n }\n\n .--SLIDER-mark {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: 2px;\n height: 2px;\n border-radius: 50%;\n pointer-events: none;\n z-index: 1;\n ${getStyle(theme, 'background-color', '--SLIDER-EVENTS-VALUE-BACKGROUND-COLOR')}\n\n &.--SLIDER-mark--active {\n ${getStyle(theme, 'background-color', '--SLIDER-EVENTS-ENABLED-BACKGROUND-COLOR')}\n }\n }\n\n .--SLIDER-ripple {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n margin-left: -4px;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n pointer-events: none;\n z-index: 2;\n opacity: 0;\n transition:\n background-color 150ms ease-in-out,\n opacity 150ms ease-in-out;\n }\n\n .--SLIDER-thumbIcon {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n z-index: 4;\n border-radius: 50%;\n box-sizing: border-box;\n\n > span {\n font-size: 20px;\n }\n }\n }\n`;\n\nexport default Style;\n","// Component Base\nimport React, { useState, useRef } from 'react';\nimport emotion from './Slider.emotion';\nimport type { SliderProps } from './Slider.interface';\n// External Libraries\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\n\nconst CLASS = '--SLIDER';\n\n/**\n * A slider lets users select a numeric value (or range) by dragging a thumb along a track.\n *\n * The form value is `number[]`:\n * - **Single-thumb mode** — pass a 1-element array, e.g. `[50]`.\n * - **Range mode** — pass a 2-element array, e.g. `[20, 80]`.\n *\n * Use the `track` prop to control which side of the thumb the filled track appears on.\n */\nconst Slider = <TFieldValues extends FieldValues = FieldValues>({\n min = 0,\n max = Infinity,\n name,\n step = 25,\n distance = 0,\n disabled = false,\n iconMin,\n iconMax,\n showMarks = false,\n direction = 'horizontal',\n track = 'normal',\n control,\n style,\n}: SliderProps<TFieldValues>) => {\n const { field } = useController({ control, name: name as FieldPath<TFieldValues> });\n\n const rawValue = (field.value as number[]) ?? [min];\n const isRange = rawValue.length >= 2;\n\n const containerRef = useRef<HTMLSpanElement>(null);\n const clickTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const isVertical = direction === 'vertical';\n\n const marks =\n max !== Infinity && min !== max && step > 0\n ? Array.from({ length: Math.round((max - min) / step) + 1 }, (_, i) => Math.min(min + i * step, max))\n : [];\n\n const useMarkSnapping = marks.length > 0;\n\n const nearestValue = (raw: number): number => {\n if (useMarkSnapping) {\n return marks.reduce((closest, mark) => (Math.abs(mark - raw) <= Math.abs(closest - raw) ? mark : closest));\n }\n return Math.max(min, Math.min(max, Math.round((raw - min) / step) * step + min));\n };\n\n const [localValues, setLocalValues] = useState<number[]>(() =>\n useMarkSnapping ? rawValue.map(nearestValue) : rawValue,\n );\n\n const updateValues = (next: number[]) => {\n field.onChange(next);\n setLocalValues(next);\n };\n\n const onChangeMin = (event: React.ChangeEvent<HTMLInputElement>) => {\n const raw = parseFloat(event.target.value);\n const snapped = nearestValue(raw);\n const value = isRange ? Math.min(snapped, localValues[1] - distance) : snapped;\n updateValues(isRange ? [value, localValues[1]] : [value]);\n };\n\n const onChangeMax = (event: React.ChangeEvent<HTMLInputElement>) => {\n const raw = parseFloat(event.target.value);\n const snapped = nearestValue(raw);\n const value = Math.max(snapped, localValues[0] + distance);\n updateValues([localValues[0], value]);\n };\n\n const onKeyDownMin = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!useMarkSnapping) return;\n const current = localValues[0];\n let next: number | undefined;\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n next = marks.find(m => m > current) ?? current;\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n next = [...marks].reverse().find(m => m < current) ?? current;\n } else if (e.key === 'Home') {\n next = min;\n } else if (e.key === 'End') {\n next = isRange ? Math.min(max, localValues[1] - distance) : max;\n }\n if (next !== undefined && next !== current) {\n e.preventDefault();\n const value = isRange ? Math.min(next, localValues[1] - distance) : next;\n updateValues(isRange ? [value, localValues[1]] : [value]);\n }\n };\n\n const onKeyDownMax = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!useMarkSnapping) return;\n const current = localValues[1];\n let next: number | undefined;\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n next = marks.find(m => m > current) ?? current;\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n next = [...marks].reverse().find(m => m < current) ?? current;\n } else if (e.key === 'Home') {\n next = Math.max(min, localValues[0] + distance);\n } else if (e.key === 'End') {\n next = max;\n }\n if (next !== undefined && next !== current) {\n e.preventDefault();\n const value = Math.max(next, localValues[0] + distance);\n updateValues([localValues[0], value]);\n }\n };\n\n const onTrack = (event: React.MouseEvent<HTMLSpanElement>) => {\n if (disabled || max === Infinity || max === min) return;\n\n const el = containerRef.current;\n const rect = el?.getBoundingClientRect();\n if (!rect || !el) return;\n\n const p = isVertical\n ? Math.max(0, Math.min(1, (rect.bottom - event.clientY) / rect.height))\n : Math.max(0, Math.min(1, (event.clientX - rect.left) / rect.width));\n\n const raw = min + p * (max - min);\n const clicked = nearestValue(raw);\n\n if (!isRange) {\n updateValues([Math.max(min, Math.min(max, clicked))]);\n } else {\n const distToMin = Math.abs(clicked - localValues[0]);\n const distToMax = Math.abs(clicked - localValues[1]);\n\n if (distToMin <= distToMax) {\n updateValues([Math.max(min, Math.min(clicked, localValues[1] - distance)), localValues[1]]);\n } else {\n updateValues([localValues[0], Math.min(max, Math.max(clicked, localValues[0] + distance))]);\n }\n }\n\n el.classList.add(`${CLASS}--clicking`);\n clearTimeout(clickTimer.current);\n clickTimer.current = setTimeout(() => el.classList.remove(`${CLASS}--clicking`), 150);\n };\n\n const pct = (value: number) => (max === min ? 0 : ((value - min) / (max - min)) * 100);\n\n const thumbPosition = (value: number): React.CSSProperties => {\n const p = pct(value);\n if (isVertical) return { top: `calc(${100 - p}% - ${((100 - p) / 100) * 24}px)` };\n return { left: `calc(${p}% - ${(p / 100) * 24}px)` };\n };\n\n const markPosition = (value: number): React.CSSProperties => {\n const p = pct(value);\n if (isVertical) return { top: `calc(${100 - p}% - ${((100 - p) / 100) * 24}px + 11px)` };\n return { left: `calc(${p}% - ${(p / 100) * 24}px + 11px)` };\n };\n\n const trackerStyles = (): React.CSSProperties[] => {\n const v0 = localValues[0];\n const v1 = localValues[1] ?? v0;\n const p0 = pct(v0);\n const p1 = pct(v1);\n const off = (p: number) => 12 - (p / 100) * 24;\n\n if (isVertical) {\n if (!isRange) {\n if (track === 'inverted') return [{ top: '0%', bottom: `calc(${p0}% + ${off(p0)}px)` }];\n return [{ top: `calc(${100 - p0}% - ${off(p0)}px)`, bottom: '0%' }];\n }\n if (track === 'inverted')\n return [\n { top: '0%', bottom: `calc(${p1}% + ${off(p1)}px)` },\n { top: `calc(${100 - p0}% - ${off(p0)}px)`, bottom: '0%' },\n ];\n return [{ top: `calc(${100 - p1}% - ${off(p1)}px)`, bottom: `calc(${p0}% + ${off(p0)}px)` }];\n }\n\n if (!isRange) {\n if (track === 'inverted') return [{ left: `calc(${p0}% + ${off(p0)}px)`, right: '0%' }];\n return [{ left: '0%', right: `calc(${100 - p0}% - ${off(p0)}px)` }];\n }\n if (track === 'inverted')\n return [\n { left: '0%', right: `calc(${100 - p0}% - ${off(p0)}px)` },\n { left: `calc(${p1}% + ${off(p1)}px)`, right: '0%' },\n ];\n return [{ left: `calc(${p0}% + ${off(p0)}px)`, right: `calc(${100 - p1}% - ${off(p1)}px)` }];\n };\n\n const isMarkActive = (mark: number): boolean => {\n if (!isRange) return track === 'inverted' ? mark >= localValues[0] : mark <= localValues[0];\n if (track === 'inverted') return mark <= localValues[0] || mark >= localValues[1];\n return mark >= localValues[0] && mark <= localValues[1];\n };\n\n const inputStep = useMarkSnapping ? 'any' : step;\n\n return (\n <span\n ref={containerRef}\n className={[CLASS, isVertical ? `${CLASS}--vertical` : ''].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n <input\n className={`${CLASS}-inputField`}\n type='range'\n min={min}\n max={max}\n step={inputStep}\n value={localValues[0]}\n onChange={onChangeMin}\n onKeyDown={onKeyDownMin}\n disabled={disabled}\n data-testid={isRange ? `${CLASS}-minField` : `${CLASS}-field`}\n />\n <span className={`${CLASS}-ripple`} style={thumbPosition(localValues[0])} aria-hidden='true' />\n <span className={`${CLASS}-thumbIcon`} style={thumbPosition(localValues[0])} aria-hidden='true'>\n {iconMin}\n </span>\n {isRange && (\n <>\n <input\n className={`${CLASS}-inputField`}\n type='range'\n min={min}\n max={max}\n step={inputStep}\n value={localValues[1]}\n onChange={onChangeMax}\n onKeyDown={onKeyDownMax}\n disabled={disabled}\n data-testid={`${CLASS}-maxField`}\n />\n <span className={`${CLASS}-ripple`} style={thumbPosition(localValues[1])} aria-hidden='true' />\n <span className={`${CLASS}-thumbIcon`} style={thumbPosition(localValues[1])} aria-hidden='true'>\n {iconMax}\n </span>\n </>\n )}\n <span className={`${CLASS}-rail`} onClick={onTrack} />\n {trackerStyles().map((s, i) => (\n <span key={i} className={`${CLASS}-tracker`} onClick={onTrack} style={s} />\n ))}\n {showMarks &&\n marks.map(mark => (\n <span\n key={mark}\n className={[`${CLASS}-mark`, isMarkActive(mark) && `${CLASS}-mark--active`].filter(Boolean).join(' ')}\n style={markPosition(mark)}\n aria-hidden='true'\n onClick={onTrack}\n />\n ))}\n </span>\n );\n};\n\nexport default Slider;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { SliderStyleProps } from './Slider.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport SliderBase from './Slider';\n\nconst Slider = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: SliderStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.SLIDER], theme, variant.toUpperCase());\n\n return <SliderBase {...rest} style={componentStyles} />;\n};\n\nexport default Slider;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst background = (theme: Record<string, string>, event: string): string => `\n ~ .--SWITCH-span {\n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--SWITCH-EVENTS-${event}-BACKGROUND-COLOR`)}\n }\n`;\n\nconst border = (theme: Record<string, string>, event: string): string => `\n ~ .--SWITCH-span {\n // BORDERS\n ${getStyle(theme, 'border-color', `--SWITCH-EVENTS-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--SWITCH-EVENTS-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--SWITCH-EVENTS-${event}-BORDER-STYLE`)}\n ${getStyle(theme, 'border-radius', `--SWITCH-EVENTS-${event}-BORDER-RADIUS`)}\n }\n`;\n\nconst outline = (theme: Record<string, string>, event: string): string => `\n ~ .--SWITCH-span {\n // OUTLINE\n ${getStyle(theme, 'outline-color', `--SWITCH-EVENTS-${event}-OUTLINE-COLOR`)}\n ${getStyle(theme, 'outline-width', `--SWITCH-EVENTS-${event}-OUTLINE-WIDTH`)}\n ${getStyle(theme, 'outline-style', `--SWITCH-EVENTS-${event}-OUTLINE-STYLE`)}\n ${getStyle(theme, 'outline-offset', `--SWITCH-EVENTS-${event}-OUTLINE-OFFSET`)}\n }\n`;\n\nconst icon = (theme: Record<string, string>, event: string): string => `\n// UTILS\n ~ .--SWITCH-span > span {\n ${getStyle(theme, 'color', `--SWITCH-EVENTS-${event}-ICON-COLOR`)};\n\n > .--SWITCH-shadow {\n ${getStyle(theme, 'background-color', `--SWITCH-EVENTS-${event}-ICON-BACKGROUND-COLOR`)};\n }\n }\n`;\n\nconst label = (theme: Record<string, string>, event: string): string => `\n // TYPOGRAPHY\n .--SWITCH-label {\n ${getStyle(theme, 'color', `--SWITCH-EVENTS-${event}-COLOR-PRIMARY`)}\n }\n\n ~ .--SWITCH-helperText {\n ${getStyle(theme, 'color', `--SWITCH-EVENTS-${event}-COLOR-SECONDARY`)}\n }\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--SWITCH {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: fit-content;\n\n .--SWITCH-container {\n display: flex;\n flex-direction: row;\n gap: 12px;\n align-items: center;\n cursor: pointer;\n\n // ENABLED\n ${label(theme, 'ENABLED')};\n\n // VALUE\n &:has(.--SWITCH-inputField:checked) {\n ${label(theme, 'VALUE')};\n }\n\n // HOVER\n &:has(.--SWITCH-inputField:hover) {\n ${label(theme, 'HOVER')};\n }\n\n // ACTIVE\n &:has(.--SWITCH-inputField.--SWITCH-active, .--SWITCH-inputField:active) {\n ${label(theme, 'ACTIVE')};\n }\n\n // FOCUS-VISIBLE\n &:has(.--SWITCH-inputField:focus-visible) {\n ${label(theme, 'FOCUS')};\n }\n\n // DISABLED\n &:has(.--SWITCH-inputField:disabled) {\n pointer-events: none;\n ${label(theme, 'DISABLED')};\n }\n\n // DISABLED + VALUE\n &:has(.--SWITCH-inputField:disabled:checked) {\n ${label(theme, 'DISABLED_VALUE')};\n }\n\n .--SWITCH-checkbox {\n position: relative;\n display: inline-flex;\n width: 48px;\n height: 24px;\n\n .--SWITCH-inputField {\n cursor: pointer;\n position: absolute;\n opacity: 0;\n width: 100%;\n height: 100%;\n z-index: 2;\n margin: 0;\n -webkit-tap-highlight-color: transparent;\n\n // ENABLED\n ${background(theme, 'ENABLED')};\n ${border(theme, 'ENABLED')};\n ${icon(theme, 'ENABLED')};\n\n // VALUE\n &:checked {\n ${background(theme, 'VALUE')};\n ${border(theme, 'VALUE')};\n ${icon(theme, 'VALUE')};\n\n ~ .--SWITCH-span {\n .--SWITCH-iconOff {\n transform: translateX(27px);\n opacity: 0;\n }\n .--SWITCH-iconOn {\n transform: translateX(-3px);\n opacity: 1;\n }\n }\n }\n\n // HOVER\n &:hover {\n ~ .--SWITCH-span {\n .--SWITCH-iconOn,\n .--SWITCH-iconOff {\n &::before {\n opacity: 1;\n ${getStyle(theme, 'background-color', '--SWITCH-EVENTS-HOVER-SHADOW-COLOR')}\n }\n }\n }\n }\n\n // ACTIVE\n &.--SWITCH-active,\n &:active {\n ~ .--SWITCH-span {\n .--SWITCH-iconOn,\n .--SWITCH-iconOff {\n &::before {\n opacity: 1;\n ${getStyle(theme, 'background-color', '--SWITCH-EVENTS-ACTIVE-SHADOW-COLOR')}\n }\n }\n }\n }\n\n // FOCUS\n &:focus-visible {\n outline: none;\n ${outline(theme, 'FOCUS')};\n ${icon(theme, 'FOCUS')};\n }\n\n // DISABLED\n &:disabled {\n ${background(theme, 'DISABLED')};\n ${border(theme, 'DISABLED')};\n ${icon(theme, 'DISABLED')};\n }\n\n // DISABLED + VALUE\n &:disabled:checked {\n ${background(theme, 'DISABLED_VALUE')};\n ${border(theme, 'DISABLED_VALUE')};\n ${icon(theme, 'DISABLED_VALUE')};\n\n ~ .--SWITCH-span {\n .--SWITCH-iconOff {\n transform: translateX(27px);\n opacity: 0;\n }\n .--SWITCH-iconOn {\n transform: translateX(-3px);\n opacity: 1;\n }\n }\n }\n }\n\n .--SWITCH-span {\n width: 48px;\n height: 24px;\n ${getStyle(theme, 'border-radius', '--SWITCH-ROOT-BORDER-RADIUS')};\n position: relative;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n transition: background-color 150ms ease-in-out;\n\n .--SWITCH-iconOff,\n .--SWITCH-iconOn {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n\n height: min(16px, calc(100% - 6px));\n aspect-ratio: 1;\n\n transition:\n transform 150ms ease-in-out,\n opacity 150ms ease-in-out;\n\n &::before {\n content: '';\n position: absolute;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n top: calc(50% - 16px);\n left: calc(50% - 16px);\n opacity: 0;\n z-index: -1;\n transition: opacity 150ms ease-in-out;\n }\n\n > span {\n max-width: 100%;\n max-height: 100%;\n position: absolute;\n z-index: 1;\n font-size: 12px;\n }\n\n .--SWITCH-shadow {\n position: absolute;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n pointer-events: none;\n z-index: -1;\n transition: background-color 150ms ease-in-out;\n }\n }\n\n .--SWITCH-iconOff {\n left: 0;\n transform: translateX(3px);\n opacity: 1;\n }\n .--SWITCH-iconOn {\n right: 0;\n transform: translateX(calc(-1 * 27px));\n opacity: 0;\n }\n }\n }\n }\n\n .--SWITCH-label {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1;\n }\n\n .--SWITCH-helperText {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 13px;\n line-height: 16px;\n margin-left: 14px;\n }\n }\n`;\n\nexport default Style;\n","// Component Base\nimport React, { useState } from 'react';\nimport emotion from './Switch.emotion';\nimport type { SwitchProps } from './Switch.interface';\n// External Libraries\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\n\nconst CLASS = '--SWITCH';\n\n/**\n * A switch (toggle) lets users turn a single setting on or off, like a physical light switch.\n * Unlike a checkbox, a switch is expected to apply its effect immediately without a submit action.\n *\n * Optionally accepts `iconOn` and `iconOff` to visually communicate both states.\n * The form value is a `boolean`.\n */\nconst Switch = <TFieldValues extends FieldValues = FieldValues>({\n name,\n control,\n iconOn,\n iconOff,\n disabled,\n label,\n helperText,\n className,\n style,\n ...rest\n}: SwitchProps<TFieldValues>) => {\n const [isActive, setIsActive] = useState<boolean>(false);\n\n // Get value from controller\n const { field, fieldState } = useController({\n control,\n name: name as FieldPath<TFieldValues>,\n });\n const [value, setValue] = useState<boolean>(field.value || false);\n const errorText = fieldState.error;\n\n const onClick = (checked: boolean) => {\n // Send data to react hook form\n field.onChange(checked);\n\n // Update local state\n setValue(checked);\n\n if (errorText) onBlur();\n };\n\n const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const { checked } = event.target;\n onClick(checked);\n };\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' || event.key === 'Space') {\n setIsActive(true);\n }\n rest.onKeyDown?.(event);\n };\n\n const onKeyUp = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' || event.key === 'Space') {\n setIsActive(false);\n onClick(!value);\n }\n rest.onKeyUp?.(event);\n };\n\n // Send data to react hook form\n const onBlur = () => field.onBlur();\n\n return (\n <div\n className={[CLASS, isActive ? `${CLASS}-active` : '', className || ''].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n <label className={`${CLASS}-container`}>\n <div className={`${CLASS}-checkbox`}>\n <input\n className={[`${CLASS}-inputField`, isActive ? `${CLASS}-active` : '', errorText && `${CLASS}-error`].join(\n ' ',\n )}\n type='checkbox'\n value={name}\n checked={value}\n disabled={disabled}\n onChange={onChange}\n onKeyDown={onKeyDown}\n onKeyUp={onKeyUp}\n onBlur={onBlur}\n data-testid={`${CLASS}-inputField`}\n {...rest}\n />\n <span className={`${CLASS}-span`} data-testid={`${CLASS}-icon`}>\n <span className={`${CLASS}-iconOff`}>\n <span className={`${CLASS}-shadow`} />\n {iconOff}\n </span>\n <span className={`${CLASS}-iconOn`}>\n <span className={`${CLASS}-shadow`} />\n {iconOn}\n </span>\n </span>\n </div>\n <span className={`${CLASS}-label`} data-testid={`${CLASS}-label`}>\n {label}\n </span>\n </label>\n {(helperText || errorText) && (\n <span className={`${CLASS}-helperText`} data-testid={`${CLASS}-helperText`}>\n {errorText ? errorText.message : helperText}\n </span>\n )}\n </div>\n );\n};\n\nexport default Switch;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { SwitchStyleProps } from './Switch.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport SwitchBase from './Switch';\n\nconst Switch = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: SwitchStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.SWITCH], theme, variant.toUpperCase());\n\n return <SwitchBase {...rest} style={componentStyles} />;\n};\n\nexport default Switch;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst border = (theme: Record<string, string>, event: string): string => `\n // BORDERS\n ${getStyle(theme, 'border-color', `--TEXTFIELD-EVENTS-${event}-BORDER-COLOR`)};\n ${getStyle(theme, 'border-width', `--TEXTFIELD-EVENTS-${event}-BORDER-WIDTH`)};\n ${getStyle(theme, 'border-style', `--TEXTFIELD-EVENTS-${event}-BORDER-STYLE`)};\n`;\n\nconst typography = (theme: Record<string, string>, event: string): string => `\n // TYPOGRAPHY\n ${getStyle(theme, 'color', `--TEXTFIELD-EVENTS-${event}-COLOR-PRIMARY`)};\n ${getStyle(theme, 'caret-color', `--TEXTFIELD-EVENTS-${event}-COLOR-PRIMARY`)};\n`;\n\nconst labelStyles = (theme: Record<string, string>, event: string, activateLabel = false): string => {\n return `\n ${getStyle(theme, 'color', `--TEXTFIELD-EVENTS-${event}-COLOR-SECONDARY`)};\n ${activateLabel ? 'transform: translate(14px, -24px); font-size: 0.75rem;' : ''};\n`;\n};\n\nconst legendStyles = (activate: boolean): string => `\n .--TEXTFIELD-legend {\n max-width: ${activate ? '100%' : '0px'};\n }\n`;\n\nconst container = (theme: Record<string, string>, event: string): string => `\n ${getStyle(theme, 'background-color', `--TEXTFIELD-EVENTS-${event}-BACKGROUND-COLOR`)};\n ~ .--TEXTFIELD-helperText {\n ${getStyle(theme, 'color', `--TEXTFIELD-EVENTS-${event}-COLOR-TERTIARY`)};\n }\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--TEXTFIELD {\n position: relative;\n padding: 0;\n border: 0;\n width: 100%;\n\n &.--TEXTFIELD-paddingBottom {\n padding-bottom: 24px;\n }\n\n .--TEXTFIELD-container {\n box-sizing: border-box;\n position: relative;\n display: inline-flex;\n align-items: center;\n\n // Safari Firefox Chrome/Edge\n width: -webkit-fill-available;\n width: -moz-available;\n width: stretch;\n\n ${getStyle(theme, 'border-radius', '--TEXTFIELD-ROOT-BORDER-RADIUS')};\n\n // ENABLED\n ${container(theme, 'ENABLED')};\n\n // VALUE\n &:has(.--TEXTFIELD-inputField:not(:placeholder-shown)),\n &:has(.--TEXTFIELD-inputField[placeholder]:not([placeholder=' '])),\n &:has(.--TEXTFIELD-inputField:-webkit-autofill),\n &:has(.--TEXTFIELD-inputField.--TEXTFIELD-open) {\n ${container(theme, 'VALUE')};\n }\n\n // HOVER\n &:has(.--TEXTFIELD-inputField:hover) {\n ${container(theme, 'HOVER')};\n }\n\n // ACTIVE\n &:has(.--TEXTFIELD-inputField:active, .--TEXTFIELD-inputField.--TEXTFIELD-active) {\n ${container(theme, 'ACTIVE')};\n }\n\n // FOCUS\n &:has(.--TEXTFIELD-inputField:focus-visible) {\n outline: none;\n ${container(theme, 'FOCUS')};\n }\n\n // ERROR\n &:has(.--TEXTFIELD-inputField.--TEXTFIELD-error) {\n ${container(theme, 'ERROR')};\n }\n\n // ERROR + VALUE\n &:has(.--TEXTFIELD-inputField.--TEXTFIELD-error:not(:placeholder-shown)),\n &:has(.--TEXTFIELD-inputField.--TEXTFIELD-error[placeholder]:not([placeholder=' '])) {\n ${container(theme, 'ERROR_VALUE')};\n }\n\n // ERROR + HOVER\n &:has(.--TEXTFIELD-inputField.--TEXTFIELD-error:hover) {\n ${container(theme, 'ERROR_HOVER')};\n }\n\n // ERROR + ACTIVE\n &:has(\n .--TEXTFIELD-inputField.--TEXTFIELD-error:active,\n .--TEXTFIELD-inputField.--TEXTFIELD-error.--TEXTFIELD-active\n ) {\n ${container(theme, 'ERROR_ACTIVE')};\n }\n\n // ERROR + FOCUS\n &:has(.--TEXTFIELD-inputField.--TEXTFIELD-error:focus-visible) {\n ${container(theme, 'ERROR_FOCUS')};\n }\n\n // DISABLED\n &:has(.--TEXTFIELD-inputField:disabled) {\n pointer-events: none;\n ${container(theme, 'DISABLED')};\n }\n\n // DISABLED + VALUE\n &:has(.--TEXTFIELD-inputField:disabled:not(:placeholder-shown)),\n &:has(.--TEXTFIELD-inputField:disabled[placeholder]:not([placeholder=' '])) {\n pointer-events: none;\n ${container(theme, 'DISABLED_VALUE')};\n }\n\n .--TEXTFIELD-inputField {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem; // 14px\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: 1;\n\n // Safari Firefox Chrome/Edge\n height: -webkit-fill-available;\n height: -moz-available;\n height: stretch;\n width: -webkit-fill-available;\n width: -moz-available;\n width: stretch;\n\n min-width: 0;\n border: 0;\n margin: 0;\n padding: 15px 14px;\n background-color: transparent;\n cursor: text;\n display: block;\n box-sizing: border-box;\n\n &.--TEXTFIELD-right {\n padding-right: 0px;\n }\n\n &.--TEXTFIELD-left {\n padding-left: 0px;\n }\n\n // ENABLED\n ${typography(theme, 'ENABLED')};\n ~ .--TEXTFIELD-label {\n ${labelStyles(theme, 'ENABLED')};\n }\n ~ .--TEXTFIELD-fieldset {\n ${border(theme, 'ENABLED')};\n }\n\n // VALUE\n &:not(:placeholder-shown),\n &[placeholder]:not([placeholder=' ']),\n &:-webkit-autofill,\n &.--TEXTFIELD-open {\n ${typography(theme, 'VALUE')};\n ~ .--TEXTFIELD-label {\n ${labelStyles(theme, 'VALUE', true)};\n }\n ~ .--TEXTFIELD-fieldset {\n ${border(theme, 'VALUE')};\n ${legendStyles(true)};\n }\n }\n\n // Autocomplete\n &:-webkit-autofill {\n -webkit-background-clip: text;\n ${getStyle(theme, '-webkit-text-fill-color', '--TEXTFIELD-EVENTS-ENABLED-COLOR-PRIMARY')};\n }\n\n // HOVER\n &:hover {\n ${typography(theme, 'HOVER')};\n ~ .--TEXTFIELD-label {\n ${labelStyles(theme, 'HOVER')};\n }\n ~ .--TEXTFIELD-fieldset {\n ${border(theme, 'HOVER')};\n }\n }\n\n // ACTIVE\n &:active,\n &.--TEXTFIELD-active {\n ${typography(theme, 'ACTIVE')};\n ~ .--TEXTFIELD-label {\n ${labelStyles(theme, 'ACTIVE')};\n }\n ~ .--TEXTFIELD-fieldset {\n ${border(theme, 'ACTIVE')};\n }\n }\n\n // FOCUS\n &:focus-visible {\n outline: none;\n ${typography(theme, 'FOCUS')};\n ~ .--TEXTFIELD-label {\n ${labelStyles(theme, 'FOCUS', true)};\n }\n ~ .--TEXTFIELD-fieldset {\n ${border(theme, 'FOCUS')};\n ${legendStyles(true)};\n }\n }\n\n // ERROR\n &.--TEXTFIELD-error {\n ${typography(theme, 'ERROR')};\n ~ .--TEXTFIELD-label {\n ${labelStyles(theme, 'ERROR')};\n }\n ~ .--TEXTFIELD-fieldset {\n ${border(theme, 'ERROR')};\n }\n }\n\n // ERROR + VALUE\n &.--TEXTFIELD-error:not(:placeholder-shown),\n &.--TEXTFIELD-error[placeholder]:not([placeholder=' ']) {\n ${typography(theme, 'ERROR_VALUE')};\n ~ .--TEXTFIELD-label {\n ${labelStyles(theme, 'ERROR_VALUE')};\n }\n ~ .--TEXTFIELD-fieldset {\n ${border(theme, 'ERROR_VALUE')};\n }\n }\n\n // ERROR + HOVER\n &.--TEXTFIELD-error:hover {\n ${typography(theme, 'ERROR_HOVER')};\n ~ .--TEXTFIELD-label {\n ${labelStyles(theme, 'ERROR_HOVER')};\n }\n ~ .--TEXTFIELD-fieldset {\n ${border(theme, 'ERROR_HOVER')};\n }\n }\n\n // ERROR + ACTIVE\n &.--TEXTFIELD-error:active,\n &.--TEXTFIELD-error.--TEXTFIELD-active {\n ${typography(theme, 'ERROR_ACTIVE')};\n ~ .--TEXTFIELD-label {\n ${labelStyles(theme, 'ERROR_ACTIVE')};\n }\n ~ .--TEXTFIELD-fieldset {\n ${border(theme, 'ERROR_ACTIVE')};\n }\n }\n\n // ERROR + FOCUS\n &.--TEXTFIELD-error:focus-visible {\n ${typography(theme, 'ERROR_FOCUS')};\n ~ .--TEXTFIELD-label {\n ${labelStyles(theme, 'ERROR_FOCUS')};\n }\n ~ .--TEXTFIELD-fieldset {\n ${border(theme, 'ERROR_FOCUS')};\n }\n }\n\n // DISABLED\n &:disabled {\n user-select: none;\n pointer-events: none;\n ${typography(theme, 'DISABLED')};\n ~ .--TEXTFIELD-label {\n ${labelStyles(theme, 'DISABLED')};\n }\n ~ .--TEXTFIELD-fieldset {\n ${border(theme, 'DISABLED')};\n }\n }\n\n // DISABLED + VALUE\n &:disabled:not(:placeholder-shown),\n &:disabled[placeholder]:not([placeholder=' ']) {\n user-select: none;\n pointer-events: none;\n ${typography(theme, 'DISABLED_VALUE')};\n ~ .--TEXTFIELD-label {\n ${labelStyles(theme, 'DISABLED_VALUE')};\n }\n ~ .--TEXTFIELD-fieldset {\n ${border(theme, 'DISABLED_VALUE')};\n }\n }\n }\n\n .--TEXTFIELD-label {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem; // 14px\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: normal;\n\n padding: 0;\n display: block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n position: absolute;\n pointer-events: none;\n z-index: 4;\n\n // ANIMATION\n transform: translate(14px, 0px);\n transition: 150ms ease-in-out;\n }\n\n .--TEXTFIELD-fieldset {\n // Safari Firefox Chrome/Edge\n height: 100%;\n width: -webkit-fill-available;\n width: -moz-available;\n width: stretch;\n\n text-align: left;\n position: absolute;\n margin: 0;\n padding: 0 6px;\n pointer-events: none;\n overflow: hidden;\n z-index: 5;\n box-sizing: border-box;\n ${getStyle(theme, 'border-radius', '--TEXTFIELD-ROOT-BORDER-RADIUS')};\n -webkit-tap-highlight-color: transparent;\n\n .--TEXTFIELD-legend {\n width: auto;\n overflow: hidden;\n display: block;\n padding: 0;\n height: 0px;\n visibility: hidden;\n\n // Animation\n max-width: 0px;\n transition: max-width 150ms ease-in-out;\n\n .--TEXTFIELD-text {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.75rem; // 12px\n letter-spacing: 0.01em;\n font-weight: 500;\n padding: 0px 7px;\n }\n }\n }\n\n .--TEXTFIELD-adornment {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0px 12px;\n }\n }\n\n .--TEXTFIELD-helperText {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.75rem; // 12px\n line-height: 1;\n\n display: block;\n margin-top: 8px;\n margin-left: 14px;\n height: 16px;\n }\n }\n`;\n\nexport default Style;\n","import React, { useState, type JSX } from 'react';\nimport emotion from './TextField.emotion';\nimport type { TextFieldBaseProps, TextFieldProps } from './TextField.interface';\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\n\nconst CLASS = '--TEXTFIELD';\n\nconst Adornment = ({ children }: { children: JSX.Element }) => <div className={`${CLASS}-adornment`}>{children}</div>;\n\nexport const TextFieldBase = ({\n label,\n value,\n onChange,\n error,\n style = {},\n width,\n disabled,\n type = 'text',\n regex,\n hasPadding = false,\n format,\n startAdornment,\n endAdornment,\n helperText,\n showErrorText = true,\n className,\n onBlur,\n ...rest\n}: TextFieldBaseProps) => {\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n event.preventDefault();\n const inputValue = event.target.value;\n if ((regex && regex.test(inputValue)) || !regex) {\n const valueToSet = format && inputValue ? format(inputValue) : inputValue;\n onChange(valueToSet);\n }\n };\n\n return (\n <div\n className={[CLASS, hasPadding ? `${CLASS}-paddingBottom` : '', className || ''].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n <div className={`${CLASS}-container`}>\n {startAdornment && <Adornment>{startAdornment}</Adornment>}\n\n <input\n className={[\n `${CLASS}-inputField`,\n error && `${CLASS}-error`,\n startAdornment && `${CLASS}-open`,\n startAdornment && `${CLASS}-left`,\n endAdornment && `${CLASS}-right`,\n ].join(' ')}\n placeholder=' '\n value={value}\n disabled={disabled}\n data-testid={`${CLASS}-inputField`}\n onChange={handleChange}\n onBlur={onBlur}\n type={type}\n {...rest}\n />\n\n {endAdornment && <Adornment>{endAdornment}</Adornment>}\n\n <fieldset aria-hidden='true' className={`${CLASS}-fieldset`}>\n <legend className={`${CLASS}-legend`}>\n <span className={`${CLASS}-text`}>{label}</span>\n </legend>\n </fieldset>\n <span className={`${CLASS}-label`}>{label}</span>\n </div>\n {(showErrorText || helperText) && (\n <span className={`${CLASS}-helperText`} data-testid={`${CLASS}-helperText`}>\n {helperText && (!error || !showErrorText) && helperText}\n {showErrorText && error && error.message}\n </span>\n )}\n </div>\n );\n};\n\nconst TextFieldRHF = <TFieldValues extends FieldValues = FieldValues>({\n name,\n control,\n ...rest\n}: TextFieldProps<TFieldValues>) => {\n const { field, fieldState } = useController({\n control: control!,\n name: name as FieldPath<TFieldValues>,\n });\n const [value, setValue] = useState<string>(field.value || '');\n const errorText = fieldState.error;\n\n const onChange = (val: string) => {\n field.onChange(val);\n setValue(val);\n if (errorText) field.onBlur();\n };\n\n return (\n <TextFieldBase\n {...rest}\n name={name}\n value={value}\n onChange={onChange}\n onBlur={() => field.onBlur()}\n error={errorText}\n />\n );\n};\n\nconst TextField = <TFieldValues extends FieldValues = FieldValues>(props: TextFieldProps<TFieldValues>) => {\n if (!props.control) {\n const { name, control, onValueChange, value, ...rest } = props;\n return <TextFieldBase {...rest} name={name} value={value || ''} onChange={onValueChange || (() => {})} />;\n }\n return <TextFieldRHF {...props} />;\n};\n\nexport default TextField;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { TextFieldStyleProps } from './TextField.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport TextFieldBase from './TextField';\n\nconst TextField = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: TextFieldStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.TEXTFIELD], theme, variant.toUpperCase());\n\n return <TextFieldBase {...rest} style={componentStyles} />;\n};\n\nexport default TextField;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst labelColor = (theme: Record<string, string>, event: string): string => `\n .--CHECKBOXGROUP-label {\n ${getStyle(theme, 'color', `--CHECKBOXGROUP-EVENTS-${event}-COLOR-PRIMARY`)}\n }\n\n .--CHECKBOXGROUP-helperText {\n ${getStyle(theme, 'color', `--CHECKBOXGROUP-EVENTS-${event}-COLOR-SECONDARY`)}\n }\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--CHECKBOXGROUP {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: fit-content;\n\n // ENABLED\n ${labelColor(theme, 'ENABLED')};\n\n // ERROR\n &.--CHECKBOXGROUP-error {\n ${labelColor(theme, 'ERROR')};\n }\n\n // DISABLED\n &.--CHECKBOXGROUP-disabled {\n ${labelColor(theme, 'DISABLED')};\n }\n\n .--CHECKBOXGROUP-items {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n &.--CHECKBOXGROUP--horizontal .--CHECKBOXGROUP-items {\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .--CHECKBOXGROUP-label {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1;\n }\n\n .--CHECKBOXGROUP-helperText {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 13px;\n line-height: 16px;\n margin-left: 14px;\n }\n }\n`;\n\nexport default Style;\n","// Component Base\nimport emotion from './CheckboxGroup.emotion';\nimport type { CheckboxGroupProps } from './CheckboxGroup.interface';\nimport { CheckboxGroupContext } from './CheckboxGroup.context';\n// External Libraries\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\n\nconst CLASS = '--CHECKBOXGROUP';\n\n/**\n * CheckboxGroup manages a set of `<Checkbox>` children as a single RHF field.\n * The form value is `string[]` — the `value` props of every checked child.\n *\n * Validation (min, max, custom) is declared on the Zod schema:\n * ```ts\n * z.object({\n * options: z.array(z.string()).min(1, 'Select at least one').max(3, 'Select at most 3'),\n * })\n * ```\n *\n * @example\n * ```tsx\n * <CheckboxGroup name=\"options\" control={control} label=\"Skills\">\n * <Checkbox value=\"react\" label=\"React\" />\n * <Checkbox value=\"vue\" label=\"Vue\" />\n * </CheckboxGroup>\n * ```\n */\nconst CheckboxGroup = <TFieldValues extends FieldValues = FieldValues>({\n name,\n control,\n children,\n label,\n helperText,\n showErrorText = true,\n disabled,\n direction = 'vertical',\n style,\n className,\n}: CheckboxGroupProps<TFieldValues>) => {\n const { field, fieldState } = useController({ control, name: name as FieldPath<TFieldValues> });\n\n const checkedValues: string[] = Array.isArray(field.value) ? field.value : [];\n const errorText = fieldState.error;\n\n const onChange = (value: string, checked: boolean) => {\n const next = checked ? [...checkedValues, value] : checkedValues.filter(v => v !== value);\n field.onChange(next);\n field.onBlur();\n };\n\n return (\n <CheckboxGroupContext.Provider value={{ checkedValues, onChange, disabled, error: errorText }}>\n <div\n className={[\n CLASS,\n `${CLASS}--${direction}`,\n showErrorText && errorText?.message && `${CLASS}-error`,\n disabled && `${CLASS}-disabled`,\n className || '',\n ].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n {label && (\n <span className={`${CLASS}-label`} data-testid={`${CLASS}-label`}>\n {label}\n </span>\n )}\n\n <div className={`${CLASS}-items`} data-testid={`${CLASS}-items`}>\n {children}\n </div>\n\n <span className={`${CLASS}-helperText`} data-testid={`${CLASS}-helperText`}>\n {helperText && (!errorText || !showErrorText) && helperText}\n {showErrorText && errorText && errorText.message}\n </span>\n </div>\n </CheckboxGroupContext.Provider>\n );\n};\n\nexport default CheckboxGroup;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { CheckboxGroupStyleProps } from './CheckboxGroup.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport CheckboxGroupBase from './CheckboxGroup';\n\nconst CheckboxGroup = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: CheckboxGroupStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.CHECKBOXGROUP], theme, variant.toUpperCase());\n\n return <CheckboxGroupBase {...rest} style={componentStyles} />;\n};\n\nexport default CheckboxGroup;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst Style = (theme: Record<string, string>) => css`\n &.--CHECKBOXTREE {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: fit-content;\n\n .--CHECKBOXTREE-children {\n display: flex;\n flex-direction: column;\n padding-left: 36px;\n gap: 16px;\n }\n\n .--CHECKBOXTREE-helperText {\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 13px;\n line-height: 16px;\n margin-left: 14px;\n ${getStyle(theme, 'color', '--CHECKBOXTREE-EVENTS-ENABLED-COLOR-SECONDARY')}\n\n &:empty {\n display: none;\n }\n }\n\n &.--CHECKBOXTREE-error {\n .--CHECKBOXTREE-helperText {\n ${getStyle(theme, 'color', '--CHECKBOXTREE-EVENTS-ERROR-COLOR-SECONDARY')}\n }\n }\n\n &.--CHECKBOXTREE-disabled {\n .--CHECKBOXTREE-helperText {\n ${getStyle(theme, 'color', '--CHECKBOXTREE-EVENTS-DISABLED-COLOR-SECONDARY')}\n }\n }\n }\n`;\n\nexport default Style;\n","import React, { useRef, useEffect, useMemo } from 'react';\n// External Libraries\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\nimport Icon from '@components/atoms/Icon';\n// Component Base\nimport emotion from './CheckboxTree.emotion';\nimport type { CheckboxTreeProps } from './CheckboxTree.interface';\nimport Checkbox from '@components/atoms/Checkbox';\nimport { CheckboxTreeContext } from './CheckboxTree.context';\n\nconst CLASS = '--CHECKBOXTREE';\n\n/**\n * CheckboxTree renders a parent `<Checkbox>` that controls all of its `<Checkbox>` children.\n *\n * Parent states:\n * - **Checked** — all children are checked.\n * - **Unchecked** — no children are checked.\n * - **Indeterminate** — some (but not all) children are checked.\n *\n * The form value is `string[]` — the `value` props of every checked child.\n * Validation is declared on the Zod schema, the same way as CheckboxGroup.\n *\n * @example\n * ```tsx\n * <CheckboxTree name=\"options\" control={control} label=\"Select all\">\n * <Checkbox value=\"a\" label=\"Option A\" />\n * <Checkbox value=\"b\" label=\"Option B\" />\n * </CheckboxTree>\n * ```\n */\nconst CheckboxTree = <TFieldValues extends FieldValues = FieldValues>({\n name,\n control,\n children,\n label,\n iconChecked = <Icon name='check' />,\n iconIndeterminate = <Icon name='remove' />,\n helperText,\n showErrorText = true,\n disabled,\n style,\n className,\n}: CheckboxTreeProps<TFieldValues>) => {\n const { field, fieldState } = useController({ control, name: name as FieldPath<TFieldValues> });\n\n const checkedValues: string[] = Array.isArray(field.value) ? field.value : [];\n const errorText = fieldState.error;\n\n const childValues = useMemo(\n () =>\n React.Children.toArray(children)\n .map(child => {\n const el = child as React.ReactElement<{ value?: string; name?: string }>;\n return el.props?.value ?? el.props?.name ?? '';\n })\n .filter(Boolean),\n [children],\n );\n\n const allChecked = childValues.length > 0 && childValues.every(v => checkedValues.includes(v));\n const someChecked = !allChecked && childValues.some(v => checkedValues.includes(v));\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const input = rootRef.current?.querySelectorAll<HTMLInputElement>('input[type=\"checkbox\"]')[0];\n if (input) input.indeterminate = someChecked;\n }, [someChecked]);\n\n const onParentChange = (checked: boolean) => {\n const next = checked ? [...childValues] : [];\n field.onChange(next);\n field.onBlur();\n };\n\n const onChange = (value: string, checked: boolean) => {\n const next = checked ? [...checkedValues, value] : checkedValues.filter(v => v !== value);\n field.onChange(next);\n field.onBlur();\n };\n\n return (\n <div\n ref={rootRef}\n className={[\n CLASS,\n showErrorText && errorText?.message ? `${CLASS}-error` : '',\n disabled ? `${CLASS}-disabled` : '',\n className || '',\n ].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n <Checkbox\n checked={allChecked || someChecked}\n onChecked={onParentChange}\n label={label}\n icon={someChecked ? iconIndeterminate : iconChecked}\n disabled={disabled}\n showErrorText={false}\n helperText={undefined}\n />\n\n <CheckboxTreeContext.Provider value={{ checkedValues, onChange, disabled, error: errorText }}>\n <div className={`${CLASS}-children`} data-testid={`${CLASS}-children`}>\n {children}\n </div>\n </CheckboxTreeContext.Provider>\n\n <span className={`${CLASS}-helperText`} data-testid={`${CLASS}-helperText`}>\n {helperText && (!errorText || !showErrorText) && helperText}\n {showErrorText && errorText && errorText.message}\n </span>\n </div>\n );\n};\n\nexport default CheckboxTree;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { CheckboxTreeStyleProps } from './CheckboxTree.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport CheckboxTreeBase from './CheckboxTree';\n\nconst CheckboxTree = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: CheckboxTreeStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.CHECKBOXTREE], theme, variant.toUpperCase());\n\n return <CheckboxTreeBase {...rest} style={componentStyles} />;\n};\n\nexport default CheckboxTree;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst container = (theme: Record<string, string>, event: string): string => `\n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--MODAL-${event}-BACKGROUND-COLOR`)}\n \n // BORDERS\n ${getStyle(theme, 'border-color', `--MODAL-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--MODAL-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--MODAL-${event}-BORDER-STYLE`)}\n ${getStyle(theme, 'border-radius', `--MODAL-${event}-BORDER-RADIUS`)}\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--MODAL-scrim {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n\n .--MODAL {\n display: flex;\n flex-direction: column;\n width: 480px;\n max-width: calc(100vw - 48px);\n max-height: calc(100vh - 64px);\n overflow: hidden;\n box-shadow:\n rgba(0, 0, 0, 0.2) 0px 5px 5px -3px,\n rgba(0, 0, 0, 0.14) 0px 8px 10px 1px,\n rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;\n\n ${container(theme, 'ROOT')}\n\n &.--MODAL-lg {\n width: 720px;\n }\n\n .--MODAL-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px 20px;\n flex-shrink: 0;\n }\n\n .--MODAL-title {\n flex: 1;\n margin: 0;\n\n ${getStyle(theme, 'color', '--MODAL-EVENTS-ENABLED-COLOR-PRIMARY')};\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 1rem;\n font-weight: 600;\n line-height: 1.25;\n }\n\n .--MODAL-body {\n flex: 1;\n padding: 20px;\n overflow-y: auto;\n\n ${getStyle(theme, 'color', '--MODAL-EVENTS-ENABLED-COLOR-SECONDARY')};\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n line-height: 1.5;\n }\n\n .--MODAL-footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 16px 20px;\n flex-shrink: 0;\n }\n }\n`;\n\nexport default Style;\n","import { type FC, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\n// Component Base\nimport emotion from './Modal.emotion';\nimport type { ModalProps } from './Modal.interface';\n// Custom Components\nimport IconButton from '@components/atoms/IconButton';\nimport Icon from '@components/atoms/Icon';\n\nconst CLASS = '--MODAL';\n\n/**\n * Generic overlay dialog rendered via a portal into `document.body`.\n *\n * Closes on:\n * - Clicking the × button in the header.\n * - Pressing **Escape** (unless `staticBackdrop` is `true`).\n * - Clicking the semi-transparent backdrop (unless `staticBackdrop` is `true`).\n *\n * Pass `footer` to render action buttons below the body content.\n */\nconst Modal: FC<ModalProps> = ({\n open,\n onClose,\n header,\n showCloseButton = true,\n size = 'md',\n children,\n footer,\n staticBackdrop = false,\n className,\n style,\n}) => {\n useEffect(() => {\n if (!open || staticBackdrop) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, onClose, staticBackdrop]);\n\n if (!open) return null;\n\n return createPortal(\n <div\n className={`${CLASS}-scrim`}\n css={emotion(style)}\n role='dialog'\n aria-modal='true'\n onClick={e => {\n if (!staticBackdrop && e.target === e.currentTarget) onClose();\n }}\n >\n <div className={[CLASS, size === 'lg' ? `${CLASS}-lg` : '', className || ''].filter(Boolean).join(' ')}>\n {(header !== undefined || showCloseButton) && (\n <header className={`${CLASS}-header`}>\n {header}\n {showCloseButton && <IconButton icon={<Icon name='close' />} onClick={onClose} aria-label='Cerrar modal' />}\n </header>\n )}\n {children !== undefined && <div className={`${CLASS}-body`}>{children}</div>}\n {footer && <footer className={`${CLASS}-footer`}>{footer}</footer>}\n </div>\n </div>,\n document.body,\n );\n};\n\nModal.displayName = 'Modal';\n\nexport default Modal;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { FC } from 'react';\nimport type { ModalStyleProps } from './Modal.interface';\nimport ModalBase from './Modal';\n\nconst Modal: FC<ModalStyleProps> = ({ theme, variant = 'default', ...rest }) => {\n const { componentStyles } = useCreateComponentStyles([Component.MODAL], theme, variant.toUpperCase());\n return <ModalBase {...rest} style={componentStyles} />;\n};\n\nexport default Modal;\nexport type { ModalStyleProps, ModalProps } from './Modal.interface';\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst labelColor = (theme: Record<string, string>, event: string): string => `\n .--RADIOGROUP-label {\n ${getStyle(theme, 'color', `--RADIOGROUP-EVENTS-${event}-COLOR-PRIMARY`)}\n }\n\n .--RADIOGROUP-helperText {\n ${getStyle(theme, 'color', `--RADIOGROUP-EVENTS-${event}-COLOR-SECONDARY`)}\n }\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--RADIOGROUP {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: fit-content;\n\n // ENABLED\n ${labelColor(theme, 'ENABLED')};\n\n // ERROR\n &.--RADIOGROUP-error {\n ${labelColor(theme, 'ERROR')};\n }\n\n // DISABLED\n &.--RADIOGROUP-disabled {\n ${labelColor(theme, 'DISABLED')};\n }\n\n .--RADIOGROUP-items {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n &.--RADIOGROUP--horizontal .--RADIOGROUP-items {\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .--RADIOGROUP-label {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1;\n }\n\n .--RADIOGROUP-helperText {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 13px;\n line-height: 16px;\n margin-left: 14px;\n }\n }\n`;\n\nexport default Style;\n","// Component Base\nimport React from 'react';\nimport emotion from './RadioGroup.emotion';\nimport type { RadioGroupProps } from './RadioGroup.interface';\nimport { RadioGroupContext } from '@components/atoms/Radio/RadioGroup.context';\n// External Libraries\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\n\nconst CLASS = '--RADIOGROUP';\n\n/**\n * RadioGroup manages a set of `<Radio>` children as a single RHF field.\n * The form value is a `string` — the `value` prop of the selected Radio.\n *\n * Provides a `RadioGroupContext` that every child `<Radio>` reads its selected state from.\n * Rendering a `<Radio>` outside a RadioGroup throws an error.\n *\n * @example\n * ```tsx\n * <RadioGroup name=\"option\" control={control} label=\"Pick one\">\n * <Radio value=\"a\" label=\"Option A\" />\n * <Radio value=\"b\" label=\"Option B\" />\n * </RadioGroup>\n * ```\n */\nconst RadioGroup = <TFieldValues extends FieldValues = FieldValues>({\n name,\n control,\n children,\n label,\n helperText,\n showErrorText = true,\n disabled,\n direction = 'vertical',\n style,\n className,\n}: RadioGroupProps<TFieldValues>) => {\n const { field, fieldState } = useController({ control, name: name as FieldPath<TFieldValues> });\n\n const selectedValue: string = typeof field.value === 'string' ? field.value : '';\n const errorText = fieldState.error;\n\n const onChange = (value: string) => {\n field.onChange(value);\n field.onBlur();\n };\n\n const firstValue =\n (\n React.Children.toArray(children).find(\n (child): child is React.ReactElement<{ value?: string; disabled?: boolean }> =>\n React.isValidElement<{ value?: string; disabled?: boolean }>(child) && !child.props.disabled,\n ) as React.ReactElement<{ value?: string }> | undefined\n )?.props.value ?? '';\n\n return (\n <RadioGroupContext.Provider value={{ name, selectedValue, onChange, disabled, error: errorText, firstValue }}>\n <div\n className={[\n CLASS,\n `${CLASS}--${direction}`,\n showErrorText && errorText?.message && `${CLASS}-error`,\n disabled && `${CLASS}-disabled`,\n className || '',\n ].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n {label && (\n <span className={`${CLASS}-label`} data-testid={`${CLASS}-label`}>\n {label}\n </span>\n )}\n\n <div className={`${CLASS}-items`} data-testid={`${CLASS}-items`}>\n {children}\n </div>\n\n <span className={`${CLASS}-helperText`} data-testid={`${CLASS}-helperText`}>\n {helperText && (!errorText || !showErrorText) && helperText}\n {showErrorText && errorText && errorText.message}\n </span>\n </div>\n </RadioGroupContext.Provider>\n );\n};\n\nexport default RadioGroup;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { RadioGroupStyleProps } from './RadioGroup.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport RadioGroupBase from './RadioGroup';\n\nconst RadioGroup = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: RadioGroupStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.RADIOGROUP], theme, variant.toUpperCase());\n\n return <RadioGroupBase {...rest} style={componentStyles} />;\n};\n\nexport default RadioGroup;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst Style = (theme: Record<string, string>) => css`\n &.--DATAGRID {\n width: 100%;\n box-sizing: border-box;\n\n ${getStyle(theme, 'background-color', '--DATAGRID-ROOT-BACKGROUND-COLOR')};\n ${getStyle(theme, 'border-color', `--DATAGRID-ROOT-BORDER-COLOR`)};\n ${getStyle(theme, 'border-width', `--DATAGRID-ROOT-BORDER-WIDTH`)};\n ${getStyle(theme, 'border-radius', '--DATAGRID-ROOT-BORDER-RADIUS')};\n ${getStyle(theme, 'border-style', `--DATAGRID-ROOT-BORDER-STYLE`)};\n\n .--DATAGRID-tableContainer {\n width: 100%;\n overflow-x: auto;\n }\n\n .--DATAGRID-bodyContainer {\n &::-webkit-scrollbar {\n width: 12px;\n height: 4px;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0.5);\n border-radius: 9999px;\n border: 3px solid transparent;\n background-clip: padding-box;\n }\n }\n\n .--DATAGRID-table {\n width: 100%;\n border-collapse: collapse;\n\n .--DATAGRID-thead {\n .--DATAGRID-thScrollbarSpacer {\n border: none;\n background: transparent;\n }\n\n .--DATAGRID-headerRow {\n height: 48px;\n\n .--DATAGRID-th {\n ${getStyle(theme, 'background-color', '--DATAGRID-ROOT-BACKGROUND-COLOR')};\n\n padding: 8px 16px;\n text-align: left;\n white-space: nowrap;\n\n ${getStyle(theme, 'border-bottom-color', `--DATAGRID-ROOT-BORDER-COLOR`)};\n ${getStyle(theme, 'border-bottom-width', `--DATAGRID-ROOT-BORDER-WIDTH`)};\n ${getStyle(theme, 'border-bottom-style', `--DATAGRID-ROOT-BORDER-STYLE`)};\n\n &.--DATAGRID-thOptions {\n width: 80px;\n text-align: right;\n }\n\n .--DATAGRID-thInner {\n display: flex;\n align-items: center;\n gap: 6px;\n\n .--DATAGRID-thActions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n }\n\n .--DATAGRID-filterActive {\n ${getStyle(theme, 'color', '--DATAGRID-EVENTS-ENABLED-ICON-COLOR')};\n }\n\n .--DATAGRID-thLabel {\n ${getStyle(theme, 'color', '--DATAGRID-EVENTS-ENABLED-COLOR-SECONDARY')};\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: 1;\n white-space: nowrap;\n }\n\n .--DATAGRID-filterContainer {\n display: flex;\n align-items: center;\n gap: 4px;\n\n .--DATAGRID-filterLabel {\n ${getStyle(theme, 'color', '--DATAGRID-EVENTS-ENABLED-COLOR-SECONDARY')};\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.75rem;\n font-weight: 500;\n cursor: pointer;\n }\n }\n }\n }\n }\n }\n\n .--DATAGRID-tbody {\n .--DATAGRID-row {\n height: 48px;\n transition: background-color 150ms;\n\n ${getStyle(theme, 'border-bottom-color', `--DATAGRID-ROOT-BORDER-COLOR`)};\n ${getStyle(theme, 'border-bottom-width', `--DATAGRID-ROOT-BORDER-WIDTH`)};\n ${getStyle(theme, 'border-bottom-style', `--DATAGRID-ROOT-BORDER-STYLE`)};\n\n &:hover {\n ${getStyle(theme, 'background-color', '--DATAGRID-EVENTS-HOVER-BACKGROUND-COLOR')};\n }\n\n &:last-child {\n border-bottom: none;\n }\n }\n\n .--DATAGRID-td {\n ${getStyle(theme, 'color', '--DATAGRID-EVENTS-ENABLED-COLOR-PRIMARY')};\n\n padding: 8px 16px;\n vertical-align: middle;\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: 1;\n }\n\n .--DATAGRID-emptyCell {\n text-align: center;\n vertical-align: middle;\n\n ${getStyle(theme, 'color', '--DATAGRID-EVENTS-ENABLED-COLOR-SECONDARY')};\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 400;\n }\n\n .--DATAGRID-loadingMore {\n text-align: center;\n padding: 12px 16px;\n height: 48px;\n vertical-align: middle;\n\n ${getStyle(theme, 'color', '--DATAGRID-EVENTS-ENABLED-COLOR-SECONDARY')};\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n }\n }\n }\n\n .--DATAGRID-tdOptions {\n text-align: right;\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n align-items: center;\n padding: 12px 16px !important;\n }\n }\n`;\n\nexport default Style;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst container = (theme: Record<string, string>, event: string): string => `\n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--DATAGRIDMENU-${event}-BACKGROUND-COLOR`)}\n \n // BORDERS\n ${getStyle(theme, 'border-color', `--DATAGRIDMENU-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--DATAGRIDMENU-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--DATAGRIDMENU-${event}-BORDER-STYLE`)}\n ${getStyle(theme, 'border-radius', `--DATAGRIDMENU-${event}-BORDER-RADIUS`)}\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--DATAGRIDMENU {\n position: fixed;\n z-index: 200;\n padding: 16px;\n width: calc(240px - 32px);\n display: flex;\n flex-direction: column;\n gap: 12px;\n box-shadow:\n rgba(0, 0, 0, 0.2) 0px 5px 5px -3px,\n rgba(0, 0, 0, 0.14) 0px 8px 10px 1px,\n rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;\n\n ${container(theme, 'ROOT')}\n\n .--DATAGRIDMENU-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n .--DATAGRIDMENU-headerTitle {\n ${getStyle(theme, 'color', '--DATAGRIDMENU-EVENTS-ENABLED-COLOR-PRIMARY')};\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 600;\n }\n }\n\n .--DATAGRIDMENU-content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n // ─── Options list ─────────────────────────────────────────────────────────\n\n .--DATAGRIDMENU-optionsList {\n max-height: 180px;\n overflow-y: auto;\n // padding + negative margin let the Checkbox ::before shadow render without being clipped\n padding: 4px 8px;\n margin: 0 -8px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n &::-webkit-scrollbar {\n width: 12px;\n height: 4px;\n }\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0.5);\n border-radius: 9999px;\n border: 3px solid transparent;\n background-clip: padding-box;\n }\n }\n\n .--DATAGRIDMENU-optionRow {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .--DATAGRIDMENU-optionDot {\n width: 6px;\n height: 24px;\n border-radius: 2px;\n flex-shrink: 0;\n }\n\n .--DATAGRIDMENU-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n }\n }\n`;\n\nexport default Style;\n","import TextField from '@components/atoms/TextField';\nimport Icon from '@components/atoms/Icon';\n\nconst CLASS = '--DATAGRIDMENU';\n\ninterface DataGridMenuSearchProps {\n columnKey: string;\n pendingSearch: string;\n onSearchChange: (val: string) => void;\n searchLabel?: string;\n}\n\nconst DataGridMenuSearch = ({\n columnKey,\n pendingSearch,\n onSearchChange,\n searchLabel = 'Search',\n}: DataGridMenuSearchProps) => (\n <div className={`${CLASS}-searchInput`}>\n <TextField\n name={`search-${columnKey}`}\n label={searchLabel}\n value={pendingSearch}\n onValueChange={onSearchChange}\n showErrorText={false}\n width='full'\n autoFocus\n data-testid={`${CLASS}-searchInput-${columnKey}`}\n startAdornment={<Icon name='search' style={{ color: 'white' }} />}\n />\n\n </div>\n);\n\nexport default DataGridMenuSearch;\n","import TextField from '@components/atoms/TextField';\nimport Checkbox from '@components/atoms/Checkbox';\nimport type { DataGridFilterOption } from '../../DataGrid.interface';\n\nconst CLASS = '--DATAGRIDMENU';\n\ninterface DataGridMenuMultiSelectProps {\n filterType: 'multiselect' | 'multiselect-search';\n columnKey: string;\n options: DataGridFilterOption[];\n pendingMulti: string[];\n onMultiChange: (values: string[]) => void;\n multiSearch: string;\n onMultiSearchChange: (val: string) => void;\n}\n\nconst DataGridMenuMultiSelect = ({\n filterType,\n columnKey,\n options,\n pendingMulti,\n onMultiChange,\n multiSearch,\n onMultiSearchChange,\n}: DataGridMenuMultiSelectProps) => {\n const isMultiSearch = filterType === 'multiselect-search';\n const filteredOpts = options.filter(\n opt => !multiSearch || opt.label.toLowerCase().includes(multiSearch.toLowerCase()),\n );\n\n return (\n <>\n {isMultiSearch && (\n <div className={`${CLASS}-searchInput`}>\n <TextField\n name={`multiSearch-${columnKey}`}\n label='Search options'\n value={multiSearch}\n onValueChange={onMultiSearchChange}\n showErrorText={false}\n width='full'\n autoFocus\n data-testid={`${CLASS}-multiSearch-${columnKey}`}\n />\n </div>\n )}\n <div className={`${CLASS}-optionsList`} data-testid={`${CLASS}-optionsList-${columnKey}`}>\n {filteredOpts.map(opt => (\n <div key={opt.value} className={`${CLASS}-optionRow`}>\n {opt.color && (\n <span className={`${CLASS}-optionDot`} style={{ backgroundColor: opt.color }} aria-hidden='true' />\n )}\n <Checkbox\n checked={pendingMulti.includes(opt.value)}\n onChecked={checked =>\n onMultiChange(checked ? [...pendingMulti, opt.value] : pendingMulti.filter(v => v !== opt.value))\n }\n label={opt.label}\n showErrorText={false}\n data-testid={`${CLASS}-option-${columnKey}-${opt.value}`}\n />\n </div>\n ))}\n </div>\n </>\n );\n};\n\nexport default DataGridMenuMultiSelect;\n","// Component Base\nimport { useLayoutEffect, useRef } from 'react';\nimport emotion from './DataGridMenu.emotion';\nimport type { DataGridMenuProps } from './DataGridMenu.interface';\n// External Libraries\nimport ReactDOM from 'react-dom';\n// Custom Components\nimport Button from '@components/atoms/Button';\nimport IconButton from '@components/atoms/IconButton';\nimport Icon from '@components/atoms/Icon';\nimport DataGridMenuSearch from './components/DataGridMenuSearch';\nimport DataGridMenuMultiSelect from './components/DataGridMenuMultiSelect';\n\nconst CLASS = '--DATAGRIDMENU';\n\n/**\n * A portal-rendered popover that provides filter controls for a DataGrid column.\n *\n * Positions itself below `anchorEl` using `useLayoutEffect` and repositions\n * on window scroll / resize. Renders one of three filter UIs based on `filterType`:\n * - `'search'` — a single text input.\n * - `'multiselect'` — a list of checkboxes.\n * - `'multiselect-search'` — a list of checkboxes with an inline search input.\n *\n * Apply/cancel actions are delegated to the parent via `onApply` and `onCancel`.\n */\nconst DataGridMenu = ({\n filterType,\n options,\n columnKey,\n filterTitle,\n searchLabel,\n cancelLabel = 'Cancel',\n applyLabel = 'Apply',\n pendingSearch,\n onSearchChange,\n pendingMulti,\n onMultiChange,\n multiSearch,\n onMultiSearchChange,\n onCancel,\n onApply,\n onClear,\n anchorEl,\n style,\n}: DataGridMenuProps) => {\n const menuRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!anchorEl) return;\n\n const update = () => {\n if (!menuRef.current) return;\n const rect = anchorEl.getBoundingClientRect();\n const menuWidth = menuRef.current.offsetWidth;\n const centeredLeft = rect.left + rect.width / 2 - menuWidth / 2;\n menuRef.current.style.top = `${rect.bottom + 8}px`;\n menuRef.current.style.left = `${Math.max(8, Math.min(centeredLeft, window.innerWidth - menuWidth - 8))}px`;\n };\n\n update();\n // capture: true catches scroll inside overflow containers (e.g. DataGrid's overflow-x: auto)\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [anchorEl]);\n\n return ReactDOM.createPortal(\n <div\n ref={menuRef}\n className={CLASS}\n css={emotion(style)}\n data-popover-key={columnKey}\n data-testid={`${CLASS}-${columnKey}`}\n >\n <div className={`${CLASS}-header`}>\n <span className={`${CLASS}-headerTitle`}>{filterTitle}</span>\n <IconButton\n icon={<Icon name='delete_outline' size='sm' />}\n onClick={onClear}\n aria-label='Clear filter'\n data-testid={`${CLASS}-clearBtn-${columnKey}`}\n />\n </div>\n <div className={`${CLASS}-content`}>\n {filterType === 'search' && (\n <DataGridMenuSearch\n columnKey={columnKey}\n pendingSearch={pendingSearch}\n onSearchChange={onSearchChange}\n searchLabel={searchLabel}\n />\n )}\n {(filterType === 'multiselect' || filterType === 'multiselect-search') && (\n <DataGridMenuMultiSelect\n filterType={filterType}\n columnKey={columnKey}\n options={options ?? []}\n pendingMulti={pendingMulti}\n onMultiChange={onMultiChange}\n multiSearch={multiSearch}\n onMultiSearchChange={onMultiSearchChange}\n />\n )}\n </div>\n <div className={`${CLASS}-actions`}>\n <Button onClick={onCancel} data-testid={`${CLASS}-cancelBtn-${columnKey}`} variant='ghost'>\n {cancelLabel}\n </Button>\n <Button onClick={onApply} data-testid={`${CLASS}-applyBtn-${columnKey}`}>\n {applyLabel}\n </Button>\n </div>\n </div>,\n document.body,\n );\n};\n\nexport default DataGridMenu;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { DataGridMenuStyleProps } from './DataGridMenu.interface';\nimport DataGridMenuBase from './DataGridMenu';\n\nconst DataGridMenu = ({ theme, variant = 'default', ...rest }: DataGridMenuStyleProps) => {\n const { componentStyles } = useCreateComponentStyles([Component.DATAGRIDMENU], theme, variant.toUpperCase());\n return <DataGridMenuBase {...rest} style={componentStyles} />;\n};\n\nexport default DataGridMenu;\n","import { useMemo } from 'react';\nimport Skeleton from '@components/atoms/Skeleton';\nimport type { DataGridColumn } from '../DataGrid.interface';\n\ninterface DataGridSkeletonProps {\n columns: DataGridColumn[];\n pageSize: number;\n}\n\nconst CLASS = '--DATAGRID';\n\nconst DataGridSkeleton = ({ columns, pageSize }: DataGridSkeletonProps) => {\n const widths = useMemo(\n () =>\n Array.from({ length: pageSize }, () =>\n columns.map(col => (col.type === 'options' ? null : `${Math.floor(Math.random() * 51) + 40}%`)),\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pageSize, columns.length],\n );\n\n return (\n <>\n {Array.from({ length: pageSize }).map((_, i) => (\n <tr key={i} className={`${CLASS}-row`}>\n {columns.map((col, colIndex) => (\n <td\n key={col.key}\n className={[`${CLASS}-td`, col.type === 'options' ? `${CLASS}-tdOptions` : ''].filter(Boolean).join(' ')}\n >\n {col.type === 'options' ? (\n <Skeleton variant='circular' width={24} height={24} />\n ) : (\n <Skeleton height={16} width={widths[i][colIndex] ?? undefined} />\n )}\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n};\n\nexport default DataGridSkeleton;\n","// Component Base\nimport React, { useState, useEffect, useRef, useCallback, useLayoutEffect } from 'react';\nimport emotion from './DataGrid.emotion';\nimport type { DataGridProps, DataGridColumn, DataGridSortState } from './DataGrid.interface';\n// Custom Components\nimport IconButton from '@components/atoms/IconButton';\nimport Icon from '@components/atoms/Icon';\nimport DataGridMenu from './DataGridMenu';\nimport DataGridSkeleton from './DataGridSkeleton';\nimport Pagination from '@components/atoms/Pagination';\n\nconst CLASS = '--DATAGRID';\nconst DEFAULT_PAGE_SIZE = 10;\n\n/**\n * A full-featured data table with server-side fetching, sorting, filtering, and pagination.\n *\n * Pass `columns` to define the table structure and `onFetch` to supply data.\n * `onFetch` is called automatically whenever the page, page size, active sort,\n * or any column filter changes.\n *\n * **Pagination modes** (controlled by `paginationType`):\n * - `'pagination'` — renders a `<Pagination>` bar below the table.\n * - `'scroll'` — appends rows as the user scrolls down (infinite scroll).\n *\n * **Column actions:**\n * - Sortable columns show a sort-direction toggle in the header.\n * - Columns with a `filter` config show a filter popover icon.\n * - Add a column with `type: 'options'` and a `render` prop for row-level action buttons.\n */\nconst DataGrid = <T extends object>({\n columns,\n onFetch,\n paginationType = 'pagination',\n pageSize = DEFAULT_PAGE_SIZE,\n pageSizeOptions,\n emptyContent = <span>No se han encontrado resultados</span>,\n loadingMoreContent = <span>Cargando...</span>,\n className,\n style,\n}: DataGridProps<T>) => {\n const [rows, setRows] = useState<T[]>([]);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(0);\n const [currentPageSize, setCurrentPageSize] = useState(pageSize);\n const [isLoading, setIsLoading] = useState(true);\n const [sortState, setSortState] = useState<DataGridSortState | null>(null);\n const [filters, setFilters] = useState<Record<string, string | string[]>>({});\n const [openPopover, setOpenPopover] = useState<string | null>(null);\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const [pendingSearch, setPendingSearch] = useState('');\n const [pendingMulti, setPendingMulti] = useState<string[]>([]);\n const [multiSearch, setMultiSearch] = useState('');\n const [colWidths, setColWidths] = useState<number[]>([]);\n const [scrollbarWidth, setScrollbarWidth] = useState(0);\n\n const filterRefs = useRef<Record<string, HTMLElement | null>>({});\n const theadRef = useRef<HTMLTableSectionElement>(null);\n const headerTableRef = useRef<HTMLTableElement>(null);\n const bodyContainerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n let cancelled = false;\n onFetch({ page, pageSize: currentPageSize, filters, sort: sortState ?? undefined }).then(result => {\n if (cancelled) return;\n setRows(prev => (paginationType === 'scroll' && page > 0 ? [...prev, ...result.data] : result.data));\n setTotal(result.total);\n setIsLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [page, currentPageSize, filters, sortState, paginationType, onFetch]);\n\n // Sync column widths between fixed header and scrollable body (scroll mode only).\n // ResizeObserver re-measures whenever the header table is resized (e.g. viewport shrink).\n useLayoutEffect(() => {\n if (paginationType !== 'scroll' || !theadRef.current || !bodyContainerRef.current || !headerTableRef.current)\n return;\n\n const measure = () => {\n if (!theadRef.current || !bodyContainerRef.current) return;\n const ths = Array.from(\n theadRef.current.querySelectorAll<HTMLTableCellElement>(`th:not(.${CLASS}-thScrollbarSpacer)`),\n );\n setColWidths(ths.map(th => th.getBoundingClientRect().width));\n setScrollbarWidth(bodyContainerRef.current.offsetWidth - bodyContainerRef.current.clientWidth);\n };\n\n measure();\n\n const ro = new ResizeObserver(measure);\n ro.observe(headerTableRef.current);\n return () => ro.disconnect();\n }, [paginationType, columns.length, isLoading]);\n\n useEffect(() => {\n if (!openPopover) return;\n const close = (e: MouseEvent) => {\n if (!(e.target as HTMLElement).closest(`[data-popover-key=\"${openPopover}\"]`)) {\n setOpenPopover(null);\n }\n };\n document.addEventListener('mousedown', close);\n return () => document.removeEventListener('mousedown', close);\n }, [openPopover]);\n\n const openFilter = (col: DataGridColumn<T>) => {\n if (!col.filter) return;\n if (openPopover === col.key) {\n setOpenPopover(null);\n setAnchorEl(null);\n return;\n }\n const existing = filters[col.key];\n if (col.filter.type === 'search') {\n setPendingSearch(typeof existing === 'string' ? existing : '');\n } else {\n setPendingMulti(Array.isArray(existing) ? existing : []);\n setMultiSearch('');\n }\n setAnchorEl(filterRefs.current[col.key] ?? null);\n setOpenPopover(col.key);\n };\n\n const applyFilter = (col: DataGridColumn<T>) => {\n if (!col.filter) return;\n const newValue = col.filter.type === 'search' ? pendingSearch : pendingMulti;\n setIsLoading(true);\n setFilters(prev => ({ ...prev, [col.key]: newValue }));\n setPage(0);\n setOpenPopover(null);\n };\n\n const isFilterActive = (key: string): boolean => {\n const val = filters[key];\n if (val === undefined || val === null) return false;\n return Array.isArray(val) ? val.length > 0 : val !== '';\n };\n\n const toggleSort = (key: string) => {\n setIsLoading(true);\n setSortState(prev =>\n prev?.key === key ? { key, direction: prev.direction === 'asc' ? 'desc' : 'asc' } : { key, direction: 'asc' },\n );\n setPage(0);\n };\n\n const handlePageChange = (newPage: number) => {\n setIsLoading(true);\n setPage(newPage);\n };\n\n const handlePageSizeChange = (newSize: number) => {\n setIsLoading(true);\n setCurrentPageSize(newSize);\n setPage(0);\n };\n\n const handleScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n if (paginationType !== 'scroll' || isLoading || rows.length >= total) return;\n const { scrollTop, scrollHeight, clientHeight } = e.currentTarget;\n if (scrollHeight - scrollTop - clientHeight < 48) {\n setIsLoading(true);\n setPage(p => p + 1);\n }\n },\n [paginationType, isLoading, rows.length, total],\n );\n\n const totalColumns = columns.length;\n const openCol = openPopover ? columns.find(c => c.key === openPopover) : undefined;\n const bodyHeight = currentPageSize * 48;\n const isEmpty = !isLoading && rows.length === 0;\n\n // Header cells — shared between scroll and non-scroll modes\n const headerCells = columns.map(col => (\n <th\n key={col.key}\n className={[`${CLASS}-th`, col.type === 'options' ? `${CLASS}-thOptions` : ''].join(' ')}\n style={col.width ? { width: col.width } : undefined}\n >\n <div className={`${CLASS}-thInner`} data-testid={`${CLASS}-th-${col.key}`}>\n {typeof col.label === 'string' ? <span className={`${CLASS}-thLabel`}>{col.label}</span> : col.label}\n {col.type !== 'options' && (\n <div className={`${CLASS}-thActions`}>\n {col.filter && (\n <div className={`${CLASS}-filterContainer`} data-popover-key={col.key}>\n <span\n ref={el => {\n filterRefs.current[col.key] = el;\n }}\n >\n <IconButton\n icon={\n <Icon\n name={isFilterActive(col.key) ? 'filter_alt' : 'filter_list'}\n size='sm'\n style={{ color: isFilterActive(col.key) ? 'white' : '' }}\n />\n }\n onClick={() => openFilter(col)}\n data-testid={`${CLASS}-filterBtn-${col.key}`}\n aria-label={`Filter ${col.label}`}\n />\n </span>\n </div>\n )}\n {col.sortable !== false && (\n <IconButton\n icon={\n <Icon\n name={\n sortState?.key === col.key\n ? sortState.direction === 'asc'\n ? 'arrow_upward'\n : 'arrow_downward'\n : 'unfold_more'\n }\n size='sm'\n style={{ color: sortState?.key === col.key ? 'white' : '' }}\n />\n }\n onClick={() => toggleSort(col.key)}\n data-testid={`${CLASS}-sortBtn-${col.key}`}\n aria-label={`Sort ${col.label}`}\n />\n )}\n </div>\n )}\n </div>\n </th>\n ));\n\n // In pagination mode show skeleton on every page load, in scroll mode only on initial load\n const showSkeleton = isLoading && (paginationType !== 'scroll' || rows.length === 0);\n\n // Body rows — shared between scroll and non-scroll modes\n const bodyContent = showSkeleton ? (\n <DataGridSkeleton columns={columns as DataGridColumn[]} pageSize={currentPageSize} />\n ) : isEmpty ? (\n <tr>\n <td colSpan={totalColumns} className={`${CLASS}-emptyCell`} style={{ height: `${bodyHeight}px` }}>\n {emptyContent}\n </td>\n </tr>\n ) : (\n <>\n {rows.map((row, rowIndex) => (\n <tr key={rowIndex} className={`${CLASS}-row`} data-testid={`${CLASS}-row-${rowIndex}`}>\n {columns.map(col => {\n const cellValue = (row as Record<string, unknown>)[col.key];\n return (\n <td\n key={col.key}\n className={[`${CLASS}-td`, col.type === 'options' ? `${CLASS}-tdOptions` : '']\n .filter(Boolean)\n .join(' ')}\n data-testid={`${CLASS}-cell-${col.key}-${rowIndex}`}\n >\n {col.render ? col.render(cellValue, row) : String(cellValue ?? '')}\n </td>\n );\n })}\n </tr>\n ))}\n {paginationType === 'scroll' && isLoading && (\n <tr>\n <td colSpan={totalColumns} className={`${CLASS}-loadingMore`}>\n {loadingMoreContent}\n </td>\n </tr>\n )}\n </>\n );\n\n return (\n <div className={[CLASS, className || ''].join(' ')} css={emotion(style)} data-testid={CLASS}>\n <div className={`${CLASS}-tableContainer`}>\n {paginationType === 'scroll' ? (\n <>\n {/* Fixed header table — sits outside the scroll container */}\n <table ref={headerTableRef} className={`${CLASS}-table`}>\n <colgroup>\n {columns.map(col => (\n <col key={col.key} style={col.width ? { width: col.width } : undefined} />\n ))}\n {/* Spacer column to compensate for the body's scrollbar width */}\n <col style={{ width: scrollbarWidth || 0 }} />\n </colgroup>\n <thead ref={theadRef} className={`${CLASS}-thead`}>\n <tr className={`${CLASS}-headerRow`}>\n {headerCells}\n <th aria-hidden='true' className={`${CLASS}-thScrollbarSpacer`} style={{ padding: 0 }} />\n </tr>\n </thead>\n </table>\n\n {/* Scrollable body — only this container scrolls vertically */}\n <div\n ref={bodyContainerRef}\n className={`${CLASS}-bodyContainer`}\n style={{ overflowY: 'auto', maxHeight: `${bodyHeight}px` }}\n onScroll={handleScroll}\n >\n <table className={`${CLASS}-table`} style={{ tableLayout: 'fixed', width: '100%' }}>\n <colgroup>\n {columns.map((col, i) => (\n <col\n key={col.key}\n style={{ width: colWidths[i] !== undefined ? colWidths[i] : (col.width ?? 'auto') }}\n />\n ))}\n </colgroup>\n <tbody className={`${CLASS}-tbody`}>{bodyContent}</tbody>\n </table>\n </div>\n </>\n ) : (\n <table className={`${CLASS}-table`}>\n <thead className={`${CLASS}-thead`}>\n <tr className={`${CLASS}-headerRow`}>{headerCells}</tr>\n </thead>\n <tbody className={`${CLASS}-tbody`}>{bodyContent}</tbody>\n </table>\n )}\n </div>\n {paginationType === 'pagination' && (\n <Pagination\n page={page}\n total={total}\n pageSize={currentPageSize}\n onPageChange={handlePageChange}\n pageSizeOptions={pageSizeOptions}\n onPageSizeChange={handlePageSizeChange}\n loading={isLoading}\n />\n )}\n {openCol?.filter && (\n <DataGridMenu\n filterType={openCol.filter.type}\n options={openCol.filter.options}\n columnKey={openCol.key}\n filterTitle={openCol.filter.title}\n searchLabel={openCol.filter.label}\n cancelLabel={openCol.filter.cancelLabel}\n applyLabel={openCol.filter.applyLabel}\n pendingSearch={pendingSearch}\n onSearchChange={setPendingSearch}\n pendingMulti={pendingMulti}\n onMultiChange={setPendingMulti}\n multiSearch={multiSearch}\n onMultiSearchChange={setMultiSearch}\n onCancel={() => setOpenPopover(null)}\n onApply={() => applyFilter(openCol)}\n onClear={() => {\n if (openCol.filter?.type === 'search') {\n setPendingSearch('');\n } else {\n setPendingMulti([]);\n setMultiSearch('');\n }\n }}\n anchorEl={anchorEl}\n />\n )}\n </div>\n );\n};\n\nexport default DataGrid;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { DataGridStyleProps } from './DataGrid.interface';\nimport DataGridBase from './DataGrid';\n\nconst DataGrid = <T extends object>({ theme, variant = 'default', ...rest }: DataGridStyleProps<T>) => {\n const { componentStyles } = useCreateComponentStyles([Component.DATAGRID], theme, variant.toUpperCase());\n return <DataGridBase<T> {...rest} style={componentStyles} />;\n};\n\nexport default DataGrid;\nexport type {\n DataGridProps,\n DataGridStyleProps,\n DataGridColumn,\n DataGridColumnType,\n DataGridFilterType,\n DataGridFilterOption,\n DataGridFilter,\n DataGridFetchParams,\n DataGridFetchResult,\n DataGridPaginationType,\n DataGridSortState,\n} from './DataGrid.interface';\n","const mulishRegular = new URL('../../../assets/fonts/Mulish/Mulish-Regular.ttf', import.meta.url).href;\nconst mulishMedium = new URL('../../../assets/fonts/Mulish/Mulish-Medium.ttf', import.meta.url).href;\nconst mulishSemiBold = new URL('../../../assets/fonts/Mulish/Mulish-SemiBold.ttf', import.meta.url).href;\nconst mulishBold = new URL('../../../assets/fonts/Mulish/Mulish-Bold.ttf', import.meta.url).href;\n\nconst leagueSpartanRegular = new URL('../../../assets/fonts/LeagueSpartan/LeagueSpartan-Regular.ttf', import.meta.url)\n .href;\nconst leagueSpartanBold = new URL('../../../assets/fonts/LeagueSpartan/LeagueSpartan-Bold.ttf', import.meta.url).href;\n\nconst googleSansCodeLight = new URL('../../../assets/fonts/GoogleSansCode/Light.ttf', import.meta.url).href;\nconst googleSansCodeLightItalic = new URL('../../../assets/fonts/GoogleSansCode/LightItalic.ttf', import.meta.url).href;\nconst googleSansCodeRegular = new URL('../../../assets/fonts/GoogleSansCode/Regular.ttf', import.meta.url).href;\nconst googleSansCodeItalic = new URL('../../../assets/fonts/GoogleSansCode/Italic.ttf', import.meta.url).href;\nconst googleSansCodeMedium = new URL('../../../assets/fonts/GoogleSansCode/Medium.ttf', import.meta.url).href;\nconst googleSansCodeMediumItalic = new URL('../../../assets/fonts/GoogleSansCode/MediumItalic.ttf', import.meta.url)\n .href;\nconst googleSansCodeSemiBold = new URL('../../../assets/fonts/GoogleSansCode/SemiBold.ttf', import.meta.url).href;\nconst googleSansCodeSemiBoldItalic = new URL('../../../assets/fonts/GoogleSansCode/SemiBoldItalic.ttf', import.meta.url)\n .href;\nconst googleSansCodeBold = new URL('../../../assets/fonts/GoogleSansCode/Bold.ttf', import.meta.url).href;\nconst googleSansCodeBoldItalic = new URL('../../../assets/fonts/GoogleSansCode/BoldItalic.ttf', import.meta.url).href;\n\nconst materialSymbolsRounded = new URL(\n '../../../assets/fonts/MaterialSymbolsRounded/MaterialSymbolsRounded.woff2',\n import.meta.url,\n).href;\n\nconst fontFaceCSS = `\n@font-face { font-family: 'Mulish'; src: url('${mulishRegular}') format('truetype'); }\n@font-face { font-family: 'Mulish'; src: url('${mulishMedium}') format('truetype'); font-weight: 500; }\n@font-face { font-family: 'Mulish'; src: url('${mulishSemiBold}') format('truetype'); font-weight: 600; }\n@font-face { font-family: 'Mulish'; src: url('${mulishBold}') format('truetype'); font-weight: 700; }\n\n@font-face { font-family: 'League Spartan'; src: url('${leagueSpartanRegular}') format('truetype'); }\n@font-face { font-family: 'League Spartan'; src: url('${leagueSpartanBold}') format('truetype'); font-weight: bold; }\n\n@font-face { font-family: 'Google Sans Code'; src: url('${googleSansCodeLight}') format('truetype'); font-weight: 300; }\n@font-face { font-family: 'Google Sans Code'; src: url('${googleSansCodeLightItalic}') format('truetype'); font-weight: 300; font-style: italic; }\n@font-face { font-family: 'Google Sans Code'; src: url('${googleSansCodeRegular}') format('truetype'); font-weight: 400; }\n@font-face { font-family: 'Google Sans Code'; src: url('${googleSansCodeItalic}') format('truetype'); font-weight: 400; font-style: italic; }\n@font-face { font-family: 'Google Sans Code'; src: url('${googleSansCodeMedium}') format('truetype'); font-weight: 500; }\n@font-face { font-family: 'Google Sans Code'; src: url('${googleSansCodeMediumItalic}') format('truetype'); font-weight: 500; font-style: italic; }\n@font-face { font-family: 'Google Sans Code'; src: url('${googleSansCodeSemiBold}') format('truetype'); font-weight: 600; }\n@font-face { font-family: 'Google Sans Code'; src: url('${googleSansCodeSemiBoldItalic}') format('truetype'); font-weight: 600; font-style: italic; }\n@font-face { font-family: 'Google Sans Code'; src: url('${googleSansCodeBold}') format('truetype'); font-weight: 700; }\n@font-face { font-family: 'Google Sans Code'; src: url('${googleSansCodeBoldItalic}') format('truetype'); font-weight: 700; font-style: italic; }\n\n@font-face { font-family: 'Material Symbols Rounded'; src: url('${materialSymbolsRounded}') format('woff2'); font-weight: 100 900; font-style: normal; font-display: block; }\n`;\n\nlet injected = false;\n\nexport const loadFonts = () => {\n if (typeof document === 'undefined' || injected) return;\n injected = true;\n const style = document.createElement('style');\n style.textContent = fontFaceCSS;\n document.head.appendChild(style);\n};\n","import { useLayoutEffect } from 'react';\nimport { ThemeProviderComponent } from './ThemeProvider.interface';\nimport type { Theme } from './ThemeProvider.interface';\nimport { useCreateThemeStyles } from './useThemeProvider.hook';\nimport { loadFonts } from './fonts/loadFonts';\nimport { ToastProvider } from '@components/molecules/Toast';\n\nconst ThemeProvider = <T extends readonly Theme[]>(props: ThemeProviderComponent<T>) => {\n const { themes, theme: selectedTheme, children, toast } = props;\n useCreateThemeStyles(themes, selectedTheme);\n useLayoutEffect(() => {\n loadFonts();\n }, []);\n\n return (\n <ToastProvider position={toast?.position} duration={toast?.duration}>\n {children}\n </ToastProvider>\n );\n};\n\nexport default ThemeProvider;\n"],"mappings":"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"}
|