@banzamel/mineralui 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -45
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +186 -3
- package/dist/index.js +3980 -2599
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/theme/ThemeProvider.tsx","../src/i18n/I18nProvider.tsx","../src/utils/cn.ts","../src/utils/postalCodes.ts","../src/utils/creditCards.ts","../src/utils/validators.ts","../src/utils/formatters.ts","../src/utils/dateUtils.ts","../src/utils/useDebounce.ts","../src/utils/useClickOutside.ts","../src/utils/useKeyboardNav.ts","../src/utils/useInteractionEffect.tsx","../src/utils/useReveal.ts","../src/utils/useGhostText.ts","../src/components/primitives/Portal/Portal.tsx","../src/components/primitives/Popover/Popover.tsx","../src/utils/layoutProps.ts","../src/components/layout/Container/Container.tsx","../src/utils/appearanceProps.ts","../src/components/layout/MHeader/MHeader.tsx","../src/components/layout/MFooter/MFooter.tsx","../src/components/layout/MNavbar/MNavbar.tsx","../src/components/typography/Link/Link.tsx","../src/components/layout/MNavs/MNavs.tsx","../src/components/layout/MTabs/MTabs.tsx","../src/components/layout/Section/Section.tsx","../src/components/layout/Stack/Stack.tsx","../src/components/layout/Inline/Inline.tsx","../src/components/layout/Grid/Grid.tsx","../src/components/layout/MGrid/MGrid.tsx","../src/components/layout/Surface/Surface.tsx","../src/components/layout/Divider/Divider.tsx","../src/components/display/DropdownMenu/DropdownMenu.tsx","../src/components/layout/MSidebar/MSidebar.tsx","../src/components/layout/MSubNav/MSubNav.tsx","../src/components/layout/MBreadcrumb/MBreadcrumb.tsx","../src/components/layout/MPagination/MPagination.tsx","../src/components/layout/AppShell/AppShell.tsx","../src/components/controls/Button/Button.tsx","../src/components/controls/Checkbox/Checkbox.tsx","../src/components/controls/Radio/RadioContext.ts","../src/components/controls/Radio/Radio.tsx","../src/components/controls/Radio/RadioGroup.tsx","../src/components/controls/Toggle/Toggle.tsx","../src/components/controls/Slider/Slider.tsx","../src/components/display/Card/Card.tsx","../src/components/display/Badge/Badge.tsx","../src/components/display/Alert/Alert.tsx","../src/components/display/Collapsible/Collapsible.tsx","../src/components/display/Accordion/Accordion.tsx","../src/components/display/Spinner/Spinner.tsx","../src/components/typography/Text/Text.tsx","../src/components/display/Loader/Loader.tsx","../src/components/display/Avatar/Avatar.tsx","../src/components/display/Modal/Modal.tsx","../src/components/typography/Heading/Heading.tsx","../src/components/typography/Code/Code.tsx","../src/components/typography/List/List.tsx","../src/components/typography/SubText/SubText.tsx","../src/components/typography/Kbd/Kbd.tsx","../src/components/display/CalendarBoard/CalendarBoard.tsx","../src/components/display/ProgressBar/ProgressBar.tsx","../src/components/display/CountUp/CountUp.tsx","../src/components/display/Rating/Rating.tsx","../src/components/display/Banner/Banner.tsx","../src/components/display/Image/Image.tsx","../src/components/display/Gallery/Gallery.tsx","../src/components/display/Carousel/Carousel.tsx","../src/components/display/TaskList/TaskList.tsx","../src/components/display/CardPayment/CardPayment.tsx","../src/components/display/Tooltip/Tooltip.tsx","../src/components/display/Toast/ToastContext.ts","../src/components/display/Toast/ToastItem.tsx","../src/components/display/Toast/ToastProvider.tsx","../src/components/display/Tag/Tag.tsx","../src/components/display/Drawer/Drawer.tsx","../src/components/display/Popconfirm/Popconfirm.tsx","../src/components/display/DataTable/DataTable.tsx","../src/components/display/ColorPicker/ColorPicker.tsx","../src/components/display/TreeView/TreeView.tsx","../src/utils/useControllableString.ts","../src/components/inputs/Input/Input.tsx","../src/components/inputs/Textarea/Textarea.tsx","../src/components/inputs/InputPassword/InputPassword.tsx","../src/components/inputs/InputNumber/InputNumber.tsx","../src/components/inputs/InputSearch/InputSearch.tsx","../src/components/inputs/InputEmail/InputEmail.tsx","../src/components/inputs/InputPhone/InputPhone.tsx","../src/components/inputs/InputName/InputName.tsx","../src/components/inputs/InputIBAN/InputIBAN.tsx","../src/components/inputs/InputTaxId/InputTaxId.tsx","../src/components/inputs/InputCurrency/InputCurrency.tsx","../src/components/inputs/InputCreditCard/InputCreditCard.tsx","../src/components/inputs/InputGroup/InputGroup.tsx","../src/components/inputs/InputPostCode/InputPostCode.tsx","../src/components/inputs/InputOTP/InputOTP.tsx","../src/components/inputs/InputSlider/InputSlider.tsx","../src/components/inputs/InputFile/CropEditor.tsx","../src/components/inputs/InputFile/InputFile.tsx","../src/components/dropdowns/Select/Select.tsx","../src/components/dropdowns/Autocomplete/Autocomplete.tsx","../src/components/dropdowns/DatePicker/DatePicker.tsx","../src/components/dropdowns/DateRangePicker/DateRangePicker.tsx","../src/components/dropdowns/TimePicker/TimePicker.tsx","../src/components/form/Form/FormContext.ts","../src/components/form/Form/Form.tsx","../src/components/form/Form/useFormField.ts"],"sourcesContent":["import {createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode} from 'react'\nimport type {MineralTheme, MineralMode, MineralModePreference} from './types'\n\nconst STORAGE_KEY = 'mineralui-theme'\n\nfunction resolveMode(pref: MineralModePreference): MineralMode {\n if (pref !== 'system') return pref\n if (typeof window === 'undefined') return 'dark'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction readStored(): MineralModePreference | null {\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n if (v === 'dark' || v === 'light' || v === 'system') return v\n } catch { /* SSR / blocked storage */ }\n return null\n}\n\ninterface ThemeContextValue {\n theme: MineralTheme\n mode: MineralModePreference\n resolvedMode: MineralMode\n setMode: (next: MineralModePreference) => void\n toggleMode: () => void\n}\n\nconst ThemeContext = createContext<ThemeContextValue>({\n theme: {},\n mode: 'dark',\n resolvedMode: 'dark',\n setMode: () => {},\n toggleMode: () => {},\n})\n\n// Map JS theme keys to CSS custom properties.\nconst varMap: Record<keyof MineralTheme, string> = {\n primaryRgb: '--mineral-primary-rgb',\n primary: '--mineral-primary',\n primaryDark: '--mineral-primary-dark',\n primaryLight: '--mineral-primary-light',\n neutralRgb: '--mineral-neutral-rgb',\n neutral: '--mineral-neutral',\n dark: '--mineral-dark',\n darkLight: '--mineral-dark-light',\n surface: '--mineral-surface',\n surfaceContrast: '--mineral-surface-contrast',\n pageBg: '--mineral-page-bg',\n pageText: '--mineral-page-text',\n text: '--mineral-text',\n textSecondary: '--mineral-text-secondary',\n textHeading: '--mineral-text-heading',\n border: '--mineral-border',\n borderHover: '--mineral-border-hover',\n borderFocus: '--mineral-border-focus',\n successRgb: '--mineral-success-rgb',\n success: '--mineral-success',\n errorRgb: '--mineral-error-rgb',\n error: '--mineral-error',\n warningRgb: '--mineral-warning-rgb',\n warning: '--mineral-warning',\n infoRgb: '--mineral-info-rgb',\n info: '--mineral-info',\n fontFamily: '--mineral-font-family-sans',\n fontFamilySans: '--mineral-font-family-sans',\n fontFamilyMono: '--mineral-font-family-mono',\n fontFamilyHeading: '--mineral-font-family-heading',\n fontColorDefault: '--mineral-fcolor-default',\n fontColorMuted: '--mineral-fcolor-muted',\n fontColorHeading: '--mineral-fcolor-heading',\n fontColorInverted: '--mineral-fcolor-inverted',\n fontColorPrimary: '--mineral-fcolor-primary',\n fontColorNeutral: '--mineral-fcolor-neutral',\n fontColorSuccess: '--mineral-fcolor-success',\n fontColorError: '--mineral-fcolor-error',\n fontColorWarning: '--mineral-fcolor-warning',\n fontColorInfo: '--mineral-fcolor-info',\n radiusSm: '--mineral-radius-sm',\n radiusMd: '--mineral-radius-md',\n radiusLg: '--mineral-radius-lg',\n}\n\nexport type MineralThemeScope = 'body' | 'wrapper'\n\ninterface MineralThemeProviderProps {\n theme?: MineralTheme\n mode?: MineralModePreference\n persist?: boolean\n scope?: MineralThemeScope\n children: ReactNode\n}\n\nexport function MineralThemeProvider({\n theme,\n mode: modeProp = 'dark',\n persist = true,\n scope = 'body',\n children,\n}: MineralThemeProviderProps) {\n const ref = useRef<HTMLDivElement>(null)\n const safeTheme = useMemo(() => theme ?? {}, [theme])\n\n const [mode, setModeState] = useState<MineralModePreference>(() => {\n if (persist) {\n const stored = readStored()\n if (stored) return stored\n }\n return modeProp\n })\n\n const resolved = resolveMode(mode)\n\n const setMode = useCallback((next: MineralModePreference) => {\n setModeState(next)\n if (persist) {\n try { localStorage.setItem(STORAGE_KEY, next) } catch { /* noop */ }\n }\n }, [persist])\n\n const toggleMode = useCallback(() => {\n setMode(resolved === 'dark' ? 'light' : 'dark')\n }, [resolved, setMode])\n\n // Listen for system theme changes when mode is 'system'.\n useEffect(() => {\n if (mode !== 'system') return\n const mq = window.matchMedia('(prefers-color-scheme: dark)')\n const handler = () => setModeState('system')\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [mode])\n\n // Apply token overrides and light/dark class.\n useEffect(() => {\n const target = scope === 'body' ? document.body : ref.current\n if (!target) return\n\n for (const [key, value] of Object.entries(safeTheme)) {\n const cssVar = varMap[key as keyof MineralTheme]\n if (cssVar && value) {\n target.style.setProperty(cssVar, value)\n if (cssVar === '--mineral-font-family-sans') {\n target.style.setProperty('--mineral-font-family', value)\n }\n }\n }\n\n target.classList.toggle('mineral-light', resolved === 'light')\n\n return () => {\n for (const key of Object.keys(safeTheme)) {\n const cssVar = varMap[key as keyof MineralTheme]\n if (cssVar) {\n target.style.removeProperty(cssVar)\n if (cssVar === '--mineral-font-family-sans') {\n target.style.removeProperty('--mineral-font-family')\n }\n }\n }\n target.classList.remove('mineral-light')\n }\n }, [resolved, safeTheme, scope])\n\n const ctx = useMemo<ThemeContextValue>(() => ({\n theme: safeTheme,\n mode,\n resolvedMode: resolved,\n setMode,\n toggleMode,\n }), [safeTheme, mode, resolved, setMode, toggleMode])\n\n return (\n <ThemeContext.Provider value={ctx}>\n {scope === 'wrapper' ? (\n <div ref={ref} className={resolved === 'light' ? 'mineral-light' : undefined}>\n {children}\n </div>\n ) : (\n children\n )}\n </ThemeContext.Provider>\n )\n}\n\nexport function useTheme(): ThemeContextValue {\n return useContext(ThemeContext)\n}\n","import {createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode} from 'react'\n\nconst STORAGE_KEY = 'mineralui-locale'\n\ntype Dict = Record<string, unknown>\n\nfunction readStored(fallback: string): string {\n try {\n return localStorage.getItem(STORAGE_KEY) ?? fallback\n } catch {\n return fallback\n }\n}\n\nfunction getByPath(obj: unknown, path: string): unknown {\n return path.split('.').reduce<unknown>(\n (cur, key) => (cur != null && typeof cur === 'object' ? (cur as Dict)[key] : undefined),\n obj,\n )\n}\n\nexport interface MI18nContextValue<T extends Dict = Dict> {\n locale: string\n setLocale: (next: string) => void\n toggleLocale: () => void\n dict: T\n t: (key: string, fallback?: string) => string\n}\n\nconst I18nContext = createContext<MI18nContextValue | null>(null)\n\nexport interface MI18nProviderProps<T extends Dict = Dict> {\n locales: Record<string, T>\n defaultLocale?: string\n persist?: boolean\n children: ReactNode\n}\n\nexport function MI18nProvider<T extends Dict = Dict>({\n locales,\n defaultLocale,\n persist = true,\n children,\n}: MI18nProviderProps<T>) {\n const keys = useMemo(() => Object.keys(locales), [locales])\n const fallback = defaultLocale ?? keys[0] ?? 'en'\n\n const [locale, setLocaleState] = useState<string>(() => {\n if (persist) {\n const stored = readStored(fallback)\n if (stored in locales) return stored\n }\n return fallback\n })\n\n const setLocale = useCallback((next: string) => {\n setLocaleState(next)\n if (persist) {\n try { localStorage.setItem(STORAGE_KEY, next) } catch { /* noop */ }\n }\n }, [persist])\n\n const toggleLocale = useCallback(() => {\n const idx = keys.indexOf(locale)\n const next = keys[(idx + 1) % keys.length]\n setLocale(next)\n }, [keys, locale, setLocale])\n\n useEffect(() => {\n document.documentElement.lang = locale\n }, [locale])\n\n const dict = (locales[locale] ?? locales[fallback] ?? {}) as T\n\n const t = useCallback((key: string, fb?: string): string => {\n const val = getByPath(dict, key)\n if (typeof val === 'string') return val\n return fb ?? key\n }, [dict])\n\n const ctx = useMemo<MI18nContextValue<T>>(() => ({\n locale,\n setLocale,\n toggleLocale,\n dict,\n t,\n }), [locale, setLocale, toggleLocale, dict, t])\n\n return (\n <I18nContext.Provider value={ctx as MI18nContextValue}>\n {children}\n </I18nContext.Provider>\n )\n}\n\nexport function useMI18n<T extends Dict = Dict>(): MI18nContextValue<T> {\n const ctx = useContext(I18nContext)\n if (!ctx) throw new Error('useMI18n must be used within MI18nProvider')\n return ctx as MI18nContextValue<T>\n}\n","// Join optional class names without pulling a runtime dependency.\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n","import type {ValidationResult} from './validators'\n\nexport interface PostCodeRule {\n countryCode: string\n label: string\n placeholder: string\n example: string\n inputMode: 'text' | 'numeric'\n maxLength: number\n regex: RegExp\n sanitize: (value: string) => string\n format: (value: string) => string\n message: string\n}\n\nconst OK_RESULT: ValidationResult = {valid: true}\n\nfunction keepLettersAndDigits(value: string): string {\n return value.toUpperCase().replace(/[^A-Z0-9]/g, '')\n}\n\nfunction formatPlPostCode(value: string): string {\n const digits = value.replace(/\\D/g, '').slice(0, 5)\n\n if (digits.length <= 2) {\n return digits\n }\n\n return `${digits.slice(0, 2)}-${digits.slice(2)}`\n}\n\nfunction formatUsPostCode(value: string): string {\n const digits = value.replace(/\\D/g, '').slice(0, 9)\n\n if (digits.length <= 5) {\n return digits\n }\n\n return `${digits.slice(0, 5)}-${digits.slice(5)}`\n}\n\nfunction formatFixedDigits(value: string, maxLength: number): string {\n return value.replace(/\\D/g, '').slice(0, maxLength)\n}\n\nfunction formatCaPostCode(value: string): string {\n const clean = keepLettersAndDigits(value).slice(0, 6)\n const chars = clean.split('')\n\n return chars\n .map((char, index) => {\n if (index === 3) {\n return ` ${char}`\n }\n\n return char\n })\n .join('')\n}\n\nfunction formatGbPostCode(value: string): string {\n const clean = keepLettersAndDigits(value).slice(0, 7)\n\n if (clean.length <= 3) {\n return clean\n }\n\n return `${clean.slice(0, clean.length - 3)} ${clean.slice(-3)}`\n}\n\nfunction formatNlPostCode(value: string): string {\n const clean = keepLettersAndDigits(value).slice(0, 6)\n\n if (clean.length <= 4) {\n return clean\n }\n\n return `${clean.slice(0, 4)} ${clean.slice(4)}`\n}\n\nexport const postCodeRules: Record<string, PostCodeRule> = {\n PL: {\n countryCode: 'PL',\n label: 'Poland',\n placeholder: '12-345',\n example: '00-001',\n inputMode: 'numeric',\n maxLength: 6,\n regex: /^\\d{2}-\\d{3}$/,\n sanitize: (value) => value.replace(/\\D/g, '').slice(0, 5),\n format: formatPlPostCode,\n message: 'Use the Polish format XX-XXX',\n },\n DE: {\n countryCode: 'DE',\n label: 'Germany',\n placeholder: '12345',\n example: '10115',\n inputMode: 'numeric',\n maxLength: 5,\n regex: /^\\d{5}$/,\n sanitize: (value) => value.replace(/\\D/g, '').slice(0, 5),\n format: (value) => formatFixedDigits(value, 5),\n message: 'Use a 5-digit German postal code',\n },\n FR: {\n countryCode: 'FR',\n label: 'France',\n placeholder: '75001',\n example: '75001',\n inputMode: 'numeric',\n maxLength: 5,\n regex: /^\\d{5}$/,\n sanitize: (value) => value.replace(/\\D/g, '').slice(0, 5),\n format: (value) => formatFixedDigits(value, 5),\n message: 'Use a 5-digit French postal code',\n },\n ES: {\n countryCode: 'ES',\n label: 'Spain',\n placeholder: '28013',\n example: '28013',\n inputMode: 'numeric',\n maxLength: 5,\n regex: /^\\d{5}$/,\n sanitize: (value) => value.replace(/\\D/g, '').slice(0, 5),\n format: (value) => formatFixedDigits(value, 5),\n message: 'Use a 5-digit Spanish postal code',\n },\n IT: {\n countryCode: 'IT',\n label: 'Italy',\n placeholder: '00184',\n example: '00184',\n inputMode: 'numeric',\n maxLength: 5,\n regex: /^\\d{5}$/,\n sanitize: (value) => value.replace(/\\D/g, '').slice(0, 5),\n format: (value) => formatFixedDigits(value, 5),\n message: 'Use a 5-digit Italian postal code',\n },\n US: {\n countryCode: 'US',\n label: 'United States',\n placeholder: '12345 or 12345-6789',\n example: '10001',\n inputMode: 'numeric',\n maxLength: 10,\n regex: /^\\d{5}(?:-\\d{4})?$/,\n sanitize: (value) => value.replace(/\\D/g, '').slice(0, 9),\n format: formatUsPostCode,\n message: 'Use ZIP or ZIP+4 format',\n },\n CA: {\n countryCode: 'CA',\n label: 'Canada',\n placeholder: 'A1A 1A1',\n example: 'M5V 3L9',\n inputMode: 'text',\n maxLength: 7,\n regex: /^[A-Z]\\d[A-Z] \\d[A-Z]\\d$/,\n sanitize: (value) => keepLettersAndDigits(value).slice(0, 6),\n format: formatCaPostCode,\n message: 'Use the Canadian format A1A 1A1',\n },\n GB: {\n countryCode: 'GB',\n label: 'United Kingdom',\n placeholder: 'SW1A 1AA',\n example: 'SW1A 1AA',\n inputMode: 'text',\n maxLength: 8,\n regex: /^[A-Z]{1,2}\\d[A-Z\\d]? \\d[A-Z]{2}$/,\n sanitize: (value) => keepLettersAndDigits(value).slice(0, 7),\n format: formatGbPostCode,\n message: 'Use a valid UK postcode',\n },\n NL: {\n countryCode: 'NL',\n label: 'Netherlands',\n placeholder: '1234 AB',\n example: '1012 AB',\n inputMode: 'text',\n maxLength: 7,\n regex: /^\\d{4} [A-Z]{2}$/,\n sanitize: (value) => keepLettersAndDigits(value).slice(0, 6),\n format: formatNlPostCode,\n message: 'Use the Dutch format 1234 AB',\n },\n}\n\nexport const postCodeCountries = Object.values(postCodeRules).map(({countryCode, label}) => ({\n value: countryCode,\n label,\n}))\n\n// Return the active postal rule or fall back to Poland for deterministic behavior.\nexport function getPostCodeRule(countryCode: string = 'PL'): PostCodeRule {\n return postCodeRules[countryCode.toUpperCase()] ?? postCodeRules.PL\n}\n\n// Keep postal input values aligned with the selected country format.\nexport function formatPostCode(value: string, countryCode: string = 'PL'): string {\n const rule = getPostCodeRule(countryCode)\n return rule.format(rule.sanitize(value))\n}\n\n// Validate the user-visible postal code against the selected country rule.\nexport function validatePostCode(value: string, countryCode: string = 'PL'): ValidationResult {\n if (!value) {\n return OK_RESULT\n }\n\n const rule = getPostCodeRule(countryCode)\n const formatted = rule.format(rule.sanitize(value))\n\n if (!rule.regex.test(formatted)) {\n return {valid: false, error: rule.message}\n }\n\n return OK_RESULT\n}\n","import type {ValidationResult} from './validators'\n\nexport type CreditCardBrand = 'visa' | 'mastercard' | 'amex' | 'discover' | 'maestro' | 'unknown'\n\nexport interface CreditCardBrandDetails {\n brand: CreditCardBrand\n label: string\n iconLabel: string\n maxLength: number\n formatGroups: number[]\n regex: RegExp\n}\n\nconst OK_RESULT: ValidationResult = {valid: true}\n\nconst creditCardBrands: CreditCardBrandDetails[] = [\n {\n brand: 'visa',\n label: 'Visa',\n iconLabel: 'VISA',\n maxLength: 16,\n formatGroups: [4, 4, 4, 4],\n regex: /^4\\d{12}(?:\\d{3})?$/,\n },\n {\n brand: 'mastercard',\n label: 'Mastercard',\n iconLabel: 'MC',\n maxLength: 16,\n formatGroups: [4, 4, 4, 4],\n regex: /^(5[1-5]\\d{14}|2(?:2[2-9]|[3-6]\\d|7[01])\\d{12}|2720\\d{12})$/,\n },\n {\n brand: 'amex',\n label: 'American Express',\n iconLabel: 'AMEX',\n maxLength: 15,\n formatGroups: [4, 6, 5],\n regex: /^3[47]\\d{13}$/,\n },\n {\n brand: 'discover',\n label: 'Discover',\n iconLabel: 'DISC',\n maxLength: 16,\n formatGroups: [4, 4, 4, 4],\n regex: /^(6011\\d{12}|65\\d{14}|64[4-9]\\d{13})$/,\n },\n {\n brand: 'maestro',\n label: 'Maestro',\n iconLabel: 'MAES',\n maxLength: 19,\n formatGroups: [4, 4, 4, 4, 3],\n regex: /^(5[06789]\\d{0,17}|6\\d{0,18})$/,\n },\n]\n\nfunction fallbackBrand(digits: string): CreditCardBrandDetails {\n return {\n brand: 'unknown',\n label: 'Card',\n iconLabel: 'CARD',\n maxLength: Math.min(Math.max(digits.length || 16, 16), 19),\n formatGroups: [4, 4, 4, 4, 3],\n regex: /^\\d{12,19}$/,\n }\n}\n\n// Remove every separator so card validation can work on raw digits.\nexport function stripCardNumber(value: string): string {\n return value.replace(/\\D/g, '')\n}\n\n// Detect the best matching payment brand from the visible card prefix.\nexport function detectCardBrand(value: string): CreditCardBrandDetails {\n const digits = stripCardNumber(value)\n return creditCardBrands.find((rule) => rule.regex.test(digits)) ?? fallbackBrand(digits)\n}\n\n// Group card digits according to the detected payment brand.\nexport function formatCardNumber(value: string): string {\n const digits = stripCardNumber(value)\n const rule = detectCardBrand(digits)\n const trimmedDigits = digits.slice(0, rule.maxLength)\n const parts: string[] = []\n let offset = 0\n\n for (const length of rule.formatGroups) {\n if (offset >= trimmedDigits.length) {\n break\n }\n\n parts.push(trimmedDigits.slice(offset, offset + length))\n offset += length\n }\n\n if (offset < trimmedDigits.length) {\n parts.push(trimmedDigits.slice(offset))\n }\n\n return parts.join(' ')\n}\n\nfunction passesLuhn(value: string): boolean {\n let sum = 0\n let shouldDouble = false\n\n for (let index = value.length - 1; index >= 0; index -= 1) {\n let digit = parseInt(value[index], 10)\n\n if (Number.isNaN(digit)) {\n return false\n }\n\n if (shouldDouble) {\n digit *= 2\n if (digit > 9) {\n digit -= 9\n }\n }\n\n sum += digit\n shouldDouble = !shouldDouble\n }\n\n return sum % 10 === 0\n}\n\n// Validate the detected card brand and Luhn checksum without third-party runtime dependencies.\nexport function validateCardNumber(value: string): ValidationResult {\n if (!value) {\n return OK_RESULT\n }\n\n const digits = stripCardNumber(value)\n const rule = detectCardBrand(digits)\n\n if (digits.length < 12) {\n return {valid: false, error: 'Card number is too short'}\n }\n\n if (digits.length > rule.maxLength) {\n return {valid: false, error: `${rule.label} card number is too long`}\n }\n\n if (rule.brand !== 'unknown' && !rule.regex.test(digits)) {\n return {valid: false, error: `Invalid ${rule.label} card number`}\n }\n\n if (!passesLuhn(digits)) {\n return {valid: false, error: 'Invalid card checksum'}\n }\n\n return OK_RESULT\n}\n\nexport {creditCardBrands}\n","export interface ValidationResult {\n valid: boolean\n error?: string\n}\n\nexport type ValidatorFn = (value: string) => ValidationResult\n\nconst ok: ValidationResult = {valid: true}\nconst fail = (error: string): ValidationResult => ({valid: false, error})\n\n// Ensure the field is not empty after trimming user input.\nexport function validateRequired(value: string): ValidationResult {\n return value.trim().length > 0 ? ok : fail('This field is required')\n}\n\n// Build a validator that enforces a minimum string length.\nexport function validateMinLength(min: number): ValidatorFn {\n return (value: string) => (value.length >= min ? ok : fail(`Minimum ${min} characters`))\n}\n\n// Build a validator that enforces a maximum string length.\nexport function validateMaxLength(max: number): ValidatorFn {\n return (value: string) => (value.length <= max ? ok : fail(`Maximum ${max} characters`))\n}\n\n// Build a validator around a custom regular expression.\nexport function validatePattern(pattern: RegExp, message?: string): ValidatorFn {\n return (value: string) => (pattern.test(value) ? ok : fail(message ?? 'Invalid format'))\n}\n\n// Validate numeric input against optional min and max bounds.\nexport function validateRange(min?: number, max?: number): ValidatorFn {\n return (value: string) => {\n const num = parseFloat(value)\n if (isNaN(num)) return fail('Must be a number')\n if (min !== undefined && num < min) return fail(`Minimum value is ${min}`)\n if (max !== undefined && num > max) return fail(`Maximum value is ${max}`)\n return ok\n }\n}\n\n// === Email ===\n\nconst EMAIL_RE =\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/\n\n// Validate email format while allowing empty optional fields.\nexport function validateEmail(value: string): ValidationResult {\n if (!value) return ok\n return EMAIL_RE.test(value) ? ok : fail('Invalid email address')\n}\n\n// === Phone ===\n\nconst PHONE_LENGTH: Record<string, number> = {\n PL: 9,\n DE: 10,\n US: 10,\n GB: 10,\n FR: 9,\n CZ: 9,\n SK: 9,\n}\n\n// Validate a phone number with optional country-specific digit counts.\nexport function validatePhone(value: string, countryCode?: string): ValidationResult {\n if (!value) return ok\n const digits = value.replace(/\\D/g, '')\n if (digits.length < 7) return fail('Phone number too short')\n if (digits.length > 15) return fail('Phone number too long')\n if (countryCode) {\n const expected = PHONE_LENGTH[countryCode.toUpperCase()]\n if (expected && digits.length !== expected) {\n return fail(`Phone number should have ${expected} digits`)\n }\n }\n return ok\n}\n\n// === IBAN (MOD-97, ISO 13616) ===\n\nconst IBAN_LENGTHS: Record<string, number> = {\n AL: 28,\n AD: 24,\n AT: 20,\n AZ: 28,\n BH: 22,\n BY: 28,\n BE: 16,\n BA: 20,\n BR: 29,\n BG: 22,\n CR: 22,\n HR: 21,\n CY: 28,\n CZ: 24,\n DK: 18,\n DO: 28,\n EG: 29,\n SV: 28,\n EE: 20,\n FO: 18,\n FI: 18,\n FR: 27,\n GE: 22,\n DE: 22,\n GI: 23,\n GR: 27,\n GL: 18,\n GT: 28,\n HU: 28,\n IS: 26,\n IQ: 23,\n IE: 22,\n IL: 23,\n IT: 27,\n JO: 30,\n KZ: 20,\n XK: 20,\n KW: 30,\n LV: 21,\n LB: 28,\n LI: 21,\n LT: 20,\n LU: 20,\n MT: 31,\n MR: 27,\n MU: 30,\n MD: 24,\n MC: 27,\n ME: 22,\n NL: 18,\n MK: 19,\n NO: 15,\n PK: 24,\n PS: 29,\n PL: 28,\n PT: 25,\n QA: 29,\n RO: 24,\n LC: 32,\n SM: 27,\n SA: 24,\n RS: 22,\n SC: 31,\n SK: 24,\n SI: 19,\n ES: 24,\n SE: 24,\n CH: 21,\n TL: 23,\n TN: 24,\n TR: 26,\n UA: 29,\n AE: 23,\n GB: 22,\n VA: 22,\n VG: 24,\n}\n\n// Run the MOD-97 remainder calculation on a numeric IBAN representation.\nfunction mod97(numStr: string): number {\n let remainder = 0\n for (let i = 0; i < numStr.length; i++) {\n remainder = (remainder * 10 + parseInt(numStr[i], 10)) % 97\n }\n return remainder\n}\n\n// Validate a full IBAN using country length rules and the MOD-97 checksum.\nexport function validateIBAN(value: string): ValidationResult {\n if (!value) return ok\n const iban = value.replace(/\\s/g, '').toUpperCase()\n\n if (iban.length < 2) return fail('IBAN too short')\n\n const countryCode = iban.slice(0, 2)\n const expectedLength = IBAN_LENGTHS[countryCode]\n\n if (!expectedLength) return fail('Unknown IBAN country code')\n if (iban.length !== expectedLength) {\n return fail(`IBAN for ${countryCode} should have ${expectedLength} characters`)\n }\n\n // MOD-97 check: move first 4 chars to end, convert letters to numbers\n const rearranged = iban.slice(4) + iban.slice(0, 4)\n const numStr = rearranged.replace(/[A-Z]/g, (ch) => String(ch.charCodeAt(0) - 55))\n\n return mod97(numStr) === 1 ? ok : fail('Invalid IBAN checksum')\n}\n\n// === NIP (Polish Tax ID) ===\n\nconst NIP_WEIGHTS = [6, 5, 7, 2, 3, 4, 5, 6, 7]\n\n// Validate a Polish NIP number with its weighted checksum.\nexport function validateNIP(value: string): ValidationResult {\n if (!value) return ok\n const digits = value.replace(/\\D/g, '')\n if (digits.length !== 10) return fail('NIP must have 10 digits')\n\n let sum = 0\n for (let i = 0; i < 9; i++) {\n sum += parseInt(digits[i], 10) * NIP_WEIGHTS[i]\n }\n const checkDigit = sum % 11\n if (checkDigit === 10) return fail('Invalid NIP')\n return checkDigit === parseInt(digits[9], 10) ? ok : fail('Invalid NIP checksum')\n}\n\n// === PESEL ===\n\nconst PESEL_WEIGHTS = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3]\n\n// Validate a Polish PESEL number with its checksum algorithm.\nexport function validatePESEL(value: string): ValidationResult {\n if (!value) return ok\n const digits = value.replace(/\\D/g, '')\n if (digits.length !== 11) return fail('PESEL must have 11 digits')\n\n let sum = 0\n for (let i = 0; i < 10; i++) {\n sum += parseInt(digits[i], 10) * PESEL_WEIGHTS[i]\n }\n const checkDigit = (10 - (sum % 10)) % 10\n return checkDigit === parseInt(digits[10], 10) ? ok : fail('Invalid PESEL checksum')\n}\n\n// === REGON ===\n\nconst REGON9_WEIGHTS = [8, 9, 2, 3, 4, 5, 6, 7]\nconst REGON14_WEIGHTS = [2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8]\n\n// Validate REGON numbers in both the 9-digit and 14-digit variants.\nexport function validateREGON(value: string): ValidationResult {\n if (!value) return ok\n const digits = value.replace(/\\D/g, '')\n\n if (digits.length !== 9 && digits.length !== 14) {\n return fail('REGON must have 9 or 14 digits')\n }\n\n const weights = digits.length === 9 ? REGON9_WEIGHTS : REGON14_WEIGHTS\n let sum = 0\n for (let i = 0; i < weights.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i]\n }\n const checkDigit = sum % 11 === 10 ? 0 : sum % 11\n const lastDigit = parseInt(digits[digits.length - 1], 10)\n return checkDigit === lastDigit ? ok : fail('Invalid REGON checksum')\n}\n\n// === Compose validators ===\n\n// Run validators in order and stop at the first failure.\nexport function composeValidators(...validators: ValidatorFn[]): ValidatorFn {\n return (value: string) => {\n for (const validator of validators) {\n const result = validator(value)\n if (!result.valid) return result\n }\n return ok\n }\n}\n\nexport {validatePostCode} from './postalCodes'\nexport {validateCardNumber} from './creditCards'\n","// Remove every non-digit character from the input.\nexport function stripNonDigits(value: string): string {\n return value.replace(/\\D/g, '')\n}\n\n// Keep only letters and digits for identifier-like inputs.\nexport function stripNonAlphanumeric(value: string): string {\n return value.replace(/[^a-zA-Z0-9]/g, '')\n}\n\n// Capitalize the first letter of every detected word.\nexport function capitalizeWords(value: string): string {\n return value.replace(/\\b\\w/g, (ch) => ch.toUpperCase())\n}\n\n// Group IBAN values into blocks of four characters.\nexport function formatIBAN(value: string): string {\n const clean = value.replace(/\\s/g, '').toUpperCase()\n return clean.replace(/(.{4})/g, '$1 ').trim()\n}\n\n// Return a raw IBAN string without grouping spaces.\nexport function unformatIBAN(value: string): string {\n return value.replace(/\\s/g, '').toUpperCase()\n}\n\nexport interface PhoneFormatOptions {\n countryCode?: string\n groupPattern?: number[]\n}\n\nconst PHONE_GROUPS: Record<string, number[]> = {\n PL: [3, 3, 3],\n DE: [3, 4, 3],\n US: [3, 3, 4],\n GB: [4, 3, 3],\n FR: [2, 2, 2, 2, 2],\n DEFAULT: [3, 3, 3],\n}\n\n// Format a phone number using country-specific or custom digit groups.\nexport function formatPhone(value: string, options: PhoneFormatOptions = {}): string {\n const digits = stripNonDigits(value)\n if (!digits) return ''\n\n const groups =\n options.groupPattern ?? PHONE_GROUPS[options.countryCode?.toUpperCase() ?? ''] ?? PHONE_GROUPS.DEFAULT\n\n const parts: string[] = []\n let pos = 0\n for (const len of groups) {\n if (pos >= digits.length) break\n parts.push(digits.slice(pos, pos + len))\n pos += len\n }\n if (pos < digits.length) {\n parts.push(digits.slice(pos))\n }\n return parts.join(' ')\n}\n\n// Format Polish NIP values with dash separators.\nexport function formatNIP(value: string): string {\n const digits = stripNonDigits(value)\n if (digits.length <= 3) return digits\n if (digits.length <= 6) return `${digits.slice(0, 3)}-${digits.slice(3)}`\n if (digits.length <= 8) return `${digits.slice(0, 3)}-${digits.slice(3, 6)}-${digits.slice(6)}`\n return `${digits.slice(0, 3)}-${digits.slice(3, 6)}-${digits.slice(6, 8)}-${digits.slice(8, 10)}`\n}\n\nexport interface CurrencyFormatOptions {\n decimalSeparator?: '.' | ','\n thousandSeparator?: ' ' | '.' | ',' | ''\n precision?: number\n}\n\n// Format a numeric string using configurable currency separators and precision.\nexport function formatCurrency(value: string, options: CurrencyFormatOptions = {}): string {\n const {decimalSeparator = ',', thousandSeparator = ' ', precision = 2} = options\n\n let clean = value.replace(/[^\\d.,-]/g, '')\n clean = clean.replace(',', '.')\n\n const parts = clean.split('.')\n let intPart = parts[0] || '0'\n let decPart = parts.length > 1 ? parts[1] : ''\n\n const isNegative = intPart.startsWith('-')\n if (isNegative) intPart = intPart.slice(1)\n\n intPart = intPart.replace(/^0+/, '') || '0'\n\n if (thousandSeparator) {\n intPart = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator)\n }\n\n decPart = decPart.slice(0, precision)\n\n const result = decPart ? `${intPart}${decimalSeparator}${decPart}` : intPart\n\n return isNegative ? `-${result}` : result\n}\n\n// Parse a formatted currency string back into a number.\nexport function parseCurrencyToNumber(\n formatted: string,\n thousandSeparator: string = ' ',\n decimalSeparator: string = ','\n): number | null {\n let clean = formatted\n if (thousandSeparator) {\n clean = clean.split(thousandSeparator).join('')\n }\n clean = clean.replace(decimalSeparator, '.')\n clean = clean.replace(/[^\\d.-]/g, '')\n const num = parseFloat(clean)\n return isNaN(num) ? null : num\n}\n\n// Preserve the logical cursor position after inserting separators into the value.\nexport function adjustCursorAfterFormat(oldValue: string, newValue: string, oldCursor: number): number {\n let realCharsBefore = 0\n for (let i = 0; i < oldCursor && i < oldValue.length; i++) {\n if (oldValue[i] !== ' ' && oldValue[i] !== '-') {\n realCharsBefore++\n }\n }\n\n let count = 0\n for (let i = 0; i < newValue.length; i++) {\n if (newValue[i] !== ' ' && newValue[i] !== '-') {\n count++\n }\n if (count === realCharsBefore) {\n return i + 1\n }\n }\n return newValue.length\n}\n\nexport {formatPostCode} from './postalCodes'\nexport {formatCardNumber} from './creditCards'\n","// Return the number of days for a month in a given year.\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\n// Return the first weekday index for the given month.\nexport function firstDayOfMonth(year: number, month: number): number {\n return new Date(year, month, 1).getDay()\n}\n\n// Compare two dates using only the calendar day.\nexport function isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\n// Check whether a date falls inside optional min and max boundaries.\nexport function isDateInRange(date: Date, min?: Date | null, max?: Date | null): boolean {\n if (min && date < stripTime(min)) return false\n if (max && date > stripTime(max)) return false\n return true\n}\n\n// Drop the time portion to make date comparisons predictable.\nexport function stripTime(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\n// Shift a date by a number of whole months.\nexport function addMonths(date: Date, count: number): Date {\n const result = new Date(date)\n result.setMonth(result.getMonth() + count)\n return result\n}\n\n// Shift a date by a number of whole years.\nexport function addYears(date: Date, count: number): Date {\n const result = new Date(date)\n result.setFullYear(result.getFullYear() + count)\n return result\n}\n\n// Pad numeric date parts to two digits.\nconst pad = (n: number): string => n.toString().padStart(2, '0')\n\n// Format a date with a lightweight token format.\nexport function formatDate(date: Date, format: string = 'dd.MM.yyyy'): string {\n const day = pad(date.getDate())\n const month = pad(date.getMonth() + 1)\n const year = date.getFullYear().toString()\n\n return format.replace('dd', day).replace('MM', month).replace('yyyy', year)\n}\n\n// Parse a date string according to the provided lightweight token format.\nexport function parseDate(value: string, format: string = 'dd.MM.yyyy'): Date | null {\n const dayIdx = format.indexOf('dd')\n const monthIdx = format.indexOf('MM')\n const yearIdx = format.indexOf('yyyy')\n\n if (dayIdx === -1 || monthIdx === -1 || yearIdx === -1) return null\n\n const day = parseInt(value.slice(dayIdx, dayIdx + 2), 10)\n const month = parseInt(value.slice(monthIdx, monthIdx + 2), 10)\n const year = parseInt(value.slice(yearIdx, yearIdx + 4), 10)\n\n if (isNaN(day) || isNaN(month) || isNaN(year)) return null\n if (month < 1 || month > 12) return null\n if (day < 1 || day > daysInMonth(year, month - 1)) return null\n\n return new Date(year, month - 1, day)\n}\n\nconst DAY_NAMES_PL = ['Pn', 'Wt', 'Śr', 'Cz', 'Pt', 'So', 'Nd']\nconst DAY_NAMES_EN = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']\n\nconst MONTH_NAMES_PL = [\n 'Styczeń',\n 'Luty',\n 'Marzec',\n 'Kwiecień',\n 'Maj',\n 'Czerwiec',\n 'Lipiec',\n 'Sierpień',\n 'Wrzesień',\n 'Październik',\n 'Listopad',\n 'Grudzień',\n]\nconst MONTH_NAMES_EN = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\n\n// Return localized short day names for calendar headers.\nexport function getDayNames(locale: 'pl' | 'en' = 'pl'): string[] {\n return locale === 'pl' ? DAY_NAMES_PL : DAY_NAMES_EN\n}\n\n// Return localized month names for pickers and headers.\nexport function getMonthNames(locale: 'pl' | 'en' = 'pl'): string[] {\n return locale === 'pl' ? MONTH_NAMES_PL : MONTH_NAMES_EN\n}\n\n// Parse a time string into numeric hour, minute and second parts.\nexport function parseTime(value: string): {hours: number; minutes: number; seconds: number} | null {\n const parts = value.split(':')\n if (parts.length < 2) return null\n\n const hours = parseInt(parts[0], 10)\n const minutes = parseInt(parts[1], 10)\n const seconds = parts.length > 2 ? parseInt(parts[2], 10) : 0\n\n if (isNaN(hours) || isNaN(minutes) || isNaN(seconds)) return null\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59 || seconds < 0 || seconds > 59) return null\n\n return {hours, minutes, seconds}\n}\n\n// Format time values with optional seconds output.\nexport function formatTime(hours: number, minutes: number, seconds?: number, showSeconds: boolean = false): string {\n const base = `${pad(hours)}:${pad(minutes)}`\n return showSeconds ? `${base}:${pad(seconds ?? 0)}` : base\n}\n","import {useState, useEffect, useRef, useCallback} from 'react'\n\n// Expose a value only after it stays stable for the given delay.\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debounced, setDebounced] = useState(value)\n\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delay)\n return () => clearTimeout(timer)\n }, [value, delay])\n\n return debounced\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n// Wrap a callback so repeated calls collapse into the latest invocation.\nexport function useDebouncedCallback<T extends (...args: any[]) => void>(callback: T, delay: number): T {\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n return useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((...args: any[]) => {\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => callbackRef.current(...args), delay)\n }) as T,\n [delay]\n )\n}\n","import {useEffect, type RefObject} from 'react'\n\n// Trigger a callback when pointer interaction happens outside the referenced element.\nexport function useClickOutside(ref: RefObject<HTMLElement | null>, handler: () => void): void {\n useEffect(() => {\n const listener = (e: MouseEvent | TouchEvent) => {\n if (!ref.current || ref.current.contains(e.target as Node)) return\n handler()\n }\n\n document.addEventListener('mousedown', listener)\n document.addEventListener('touchstart', listener)\n return () => {\n document.removeEventListener('mousedown', listener)\n document.removeEventListener('touchstart', listener)\n }\n }, [ref, handler])\n}\n","import {useState, useCallback, type KeyboardEvent} from 'react'\n\nexport interface UseKeyboardNavOptions {\n itemCount: number\n onSelect: (index: number) => void\n onClose: () => void\n isOpen: boolean\n loop?: boolean\n}\n\n// Provide arrow-key navigation and selection state for list-like widgets.\nexport function useKeyboardNav({itemCount, onSelect, onClose, isOpen, loop = true}: UseKeyboardNavOptions) {\n const [activeIndex, setActiveIndex] = useState(-1)\n\n // Reset highlight state when the owning widget closes or clears results.\n const resetIndex = useCallback(() => setActiveIndex(-1), [])\n\n const onKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!isOpen || itemCount === 0) return\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n setActiveIndex((prev) => {\n if (prev >= itemCount - 1) return loop ? 0 : prev\n return prev + 1\n })\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n setActiveIndex((prev) => {\n if (prev <= 0) return loop ? itemCount - 1 : 0\n return prev - 1\n })\n break\n }\n case 'Enter': {\n e.preventDefault()\n if (activeIndex >= 0 && activeIndex < itemCount) {\n onSelect(activeIndex)\n }\n break\n }\n case 'Escape': {\n e.preventDefault()\n onClose()\n break\n }\n case 'Home': {\n e.preventDefault()\n setActiveIndex(0)\n break\n }\n case 'End': {\n e.preventDefault()\n setActiveIndex(itemCount - 1)\n break\n }\n }\n },\n [isOpen, itemCount, activeIndex, onSelect, onClose, loop]\n )\n\n return {activeIndex, setActiveIndex, resetIndex, onKeyDown}\n}\n","import {useCallback, useRef} from 'react'\nimport type {PointerEvent, ReactElement} from 'react'\n\nexport type MineralClickEffect = 'none' | 'ripple'\n\nexport interface UseInteractionEffectOptions {\n effect?: MineralClickEffect\n disabled?: boolean\n centered?: boolean\n color?: string\n}\n\nexport interface UseInteractionEffectResult<T extends HTMLElement> {\n effectClassName?: string\n effectLayer: ReactElement | null\n handlePointerDown: (event: PointerEvent<T>) => void\n triggerEffect: (target: T | null) => void\n}\n\ninterface RippleOptions {\n centered: boolean\n color?: string\n clientX?: number\n clientY?: number\n}\n\n// Render and position a ripple wave inside the dedicated effect layer.\nfunction appendRipple(layer: HTMLSpanElement, host: HTMLElement, options: RippleOptions) {\n const rect = host.getBoundingClientRect()\n const size = Math.max(rect.width, rect.height) * 1.75\n const radius = size / 2\n const wave = document.createElement('span')\n const x =\n options.centered || options.clientX === undefined\n ? rect.width / 2 - radius\n : options.clientX - rect.left - radius\n const y =\n options.centered || options.clientY === undefined\n ? rect.height / 2 - radius\n : options.clientY - rect.top - radius\n\n wave.className = 'click-effect-wave'\n wave.style.width = `${size}px`\n wave.style.height = `${size}px`\n wave.style.left = `${x}px`\n wave.style.top = `${y}px`\n\n if (options.color) {\n wave.style.setProperty('--click-effect-color', options.color)\n }\n\n layer.appendChild(wave)\n wave.addEventListener('animationend', () => wave.remove(), {once: true})\n}\n\n// Attach a lightweight click feedback effect without coupling it to a specific component.\nexport function useInteractionEffect<T extends HTMLElement = HTMLElement>({\n effect = 'ripple',\n disabled = false,\n centered = false,\n color,\n}: UseInteractionEffectOptions = {}): UseInteractionEffectResult<T> {\n const layerRef = useRef<HTMLSpanElement>(null)\n const enabled = effect === 'ripple' && !disabled\n\n // Trigger a centered ripple for keyboard-driven or programmatic actions.\n const triggerEffect = useCallback(\n (target: T | null) => {\n if (!enabled || !target || !layerRef.current) {\n return\n }\n\n appendRipple(layerRef.current, target, {centered: true, color})\n },\n [color, enabled]\n )\n\n // Start the ripple from the actual pointer position when possible.\n const handlePointerDown = useCallback(\n (event: PointerEvent<T>) => {\n if (!enabled || !layerRef.current) {\n return\n }\n\n if (event.pointerType === 'mouse' && event.button !== 0) {\n return\n }\n\n appendRipple(layerRef.current, event.currentTarget, {\n centered,\n color,\n clientX: event.clientX,\n clientY: event.clientY,\n })\n },\n [centered, color, enabled]\n )\n\n return {\n effectClassName: enabled ? 'click-effect-root' : undefined,\n effectLayer: enabled ? <span ref={layerRef} className=\"click-effect-layer\" aria-hidden=\"true\" /> : null,\n handlePointerDown,\n triggerEffect,\n }\n}\n","import {useEffect, useRef} from 'react'\n\nexport type RevealProp = boolean | number\n\n// Observe an element and trigger a CSS reveal animation when it enters the viewport.\nexport function useReveal<T extends HTMLElement = HTMLElement>(reveal: RevealProp | undefined) {\n const ref = useRef<T>(null)\n\n useEffect(() => {\n if (reveal === false || reveal === undefined) return\n\n const node = ref.current\n if (!node) return\n\n const delay = typeof reveal === 'number' ? reveal : 0\n if (delay > 0) {\n node.style.setProperty('--mineral-reveal-delay', `${delay}s`)\n }\n\n const prefersReduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n if (prefersReduced) {\n node.classList.remove('mineral-reveal')\n node.classList.add('mineral-revealed')\n return\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n node.classList.add('mineral-revealed')\n observer.disconnect()\n }\n }\n },\n {threshold: 0.2}\n )\n\n observer.observe(node)\n return () => observer.disconnect()\n }, [reveal])\n\n return ref\n}\n","import {useState, useCallback, useMemo} from 'react'\n\nexport interface GhostTextOptions<T = string> {\n options: T[]\n value: string\n minChars?: number\n getLabel?: (option: T) => string\n filter?: (options: T[], input: string) => T[]\n}\n\nexport interface GhostTextReturn<T = string> {\n /** The ghost suffix to render after the typed text. */\n hint: string\n /** Accept the current hint and return the full value. */\n accept: () => {value: string; option: T | null}\n /** Cycle to the next matching option. */\n next: () => void\n /** Cycle to the previous matching option. */\n prev: () => void\n /** Reset the hint index (call on value change). */\n reset: () => void\n /** Number of matching options. */\n matchCount: number\n /** Handle keyboard events — Tab/Enter accept, arrows cycle, Escape resets. */\n onKeyDown: (e: React.KeyboardEvent) => boolean\n}\n\nfunction defaultGetLabel<T>(option: T): string {\n return typeof option === 'string' ? option : String(option)\n}\n\nfunction defaultFilter<T>(options: T[], input: string, getLabel: (o: T) => string): T[] {\n if (!input) return []\n const lower = input.toLowerCase()\n return options.filter((o) => getLabel(o).toLowerCase().startsWith(lower))\n}\n\n// Manage inline ghost-text suggestions for any text input.\nexport function useGhostText<T = string>({\n options,\n value,\n minChars = 2,\n getLabel = defaultGetLabel,\n filter,\n}: GhostTextOptions<T>): GhostTextReturn<T> {\n const [hintIndex, setHintIndex] = useState(0)\n\n const filtered = useMemo(() => {\n if (value.length < minChars) return []\n if (filter) return filter(options, value)\n return defaultFilter(options, value, getLabel)\n }, [options, value, minChars, filter, getLabel])\n\n const current = filtered.length > 0 ? filtered[hintIndex % filtered.length] : null\n const fullLabel = current ? getLabel(current) : ''\n const hint = fullLabel && fullLabel.toLowerCase().startsWith(value.toLowerCase())\n ? fullLabel.slice(value.length)\n : ''\n\n const accept = useCallback(() => {\n if (!hint || !current) return {value, option: null}\n return {value: value + hint, option: current}\n }, [hint, current, value])\n\n const next = useCallback(() => {\n if (filtered.length > 1) setHintIndex((i) => (i + 1) % filtered.length)\n }, [filtered.length])\n\n const prev = useCallback(() => {\n if (filtered.length > 1) setHintIndex((i) => (i - 1 + filtered.length) % filtered.length)\n }, [filtered.length])\n\n const reset = useCallback(() => setHintIndex(0), [])\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent): boolean => {\n if ((e.key === 'Tab' || e.key === 'Enter') && hint) {\n e.preventDefault()\n return true // signal: caller should accept\n }\n if (e.key === 'ArrowDown' && filtered.length > 1) {\n e.preventDefault()\n next()\n return false\n }\n if (e.key === 'ArrowUp' && filtered.length > 1) {\n e.preventDefault()\n prev()\n return false\n }\n return false\n },\n [hint, filtered.length, next, prev]\n )\n\n return {hint, accept, next, prev, reset, matchCount: filtered.length, onKeyDown}\n}\n","import {createPortal} from 'react-dom'\nimport type {PortalProps} from './Portal.types'\n\n// Mount children into a detached DOM target while defaulting to document.body.\nexport function Portal({children, container}: PortalProps) {\n const target = container ?? (typeof document !== 'undefined' ? document.body : null)\n if (!target) return null\n return createPortal(children, target)\n}\n","import {useState, useEffect, useRef, useCallback} from 'react'\nimport {Portal} from '../Portal'\nimport {cn} from '../../../utils/cn'\nimport type {PopoverProps} from './Popover.types'\nimport './Popover.css'\n\n// Position floating content relative to an anchor with viewport-aware flipping.\nexport function Popover({\n open,\n anchorRef,\n onClose,\n placement = 'bottom-start',\n matchWidth = false,\n offset = 4,\n children,\n className,\n style,\n}: PopoverProps) {\n const popoverRef = useRef<HTMLDivElement>(null)\n const [position, setPosition] = useState<{top: number; left: number; width?: number} | null>(null)\n const [flipped, setFlipped] = useState(false)\n\n // Recalculate popover position whenever layout or viewport constraints change.\n const updatePosition = useCallback(() => {\n if (!anchorRef.current || !popoverRef.current) return\n\n const anchor = anchorRef.current.getBoundingClientRect()\n const popover = popoverRef.current.getBoundingClientRect()\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const isTop = placement.startsWith('top')\n const isRight = placement.startsWith('right')\n const isLeft = placement.startsWith('left')\n const isHorizontal = isRight || isLeft\n const isEnd = placement.endsWith('end')\n\n let top: number\n let left: number\n\n if (isHorizontal) {\n // Horizontal placement: position to the right or left of the anchor\n const spaceRight = viewport.width - anchor.right - offset\n const spaceLeft = anchor.left - offset\n const shouldFlip = isRight\n ? spaceRight < popover.width && spaceLeft > spaceRight\n : spaceLeft < popover.width && spaceRight > spaceLeft\n\n setFlipped(shouldFlip)\n\n const showOnRight = isRight ? !shouldFlip : shouldFlip\n\n if (showOnRight) {\n left = anchor.right + offset + window.scrollX\n } else {\n left = anchor.left - popover.width - offset + window.scrollX\n }\n\n if (isEnd) {\n top = anchor.bottom - popover.height + window.scrollY\n } else {\n top = anchor.top + window.scrollY\n }\n } else {\n // Vertical placement: position above or below the anchor\n const spaceBelow = viewport.height - anchor.bottom - offset\n const spaceAbove = anchor.top - offset\n const shouldFlip = isTop\n ? spaceAbove < popover.height && spaceBelow > spaceAbove\n : spaceBelow < popover.height && spaceAbove > spaceBelow\n\n setFlipped(shouldFlip)\n\n const showOnTop = isTop ? !shouldFlip : shouldFlip\n\n if (showOnTop) {\n top = anchor.top - popover.height - offset + window.scrollY\n } else {\n top = anchor.bottom + offset + window.scrollY\n }\n\n if (isEnd) {\n left = anchor.right - popover.width + window.scrollX\n } else {\n left = anchor.left + window.scrollX\n }\n }\n\n // Clamp to viewport\n left = Math.max(8, Math.min(left, viewport.width - popover.width - 8))\n top = Math.max(8 + window.scrollY, top)\n\n setPosition({\n top,\n left,\n width: matchWidth ? anchor.width : undefined,\n })\n }, [anchorRef, placement, offset, matchWidth])\n\n useEffect(() => {\n if (!open) {\n setPosition(null)\n return\n }\n\n // Wait one frame so the rendered popover can be measured accurately.\n requestAnimationFrame(updatePosition)\n\n window.addEventListener('scroll', updatePosition, {passive: true})\n window.addEventListener('resize', updatePosition, {passive: true})\n return () => {\n window.removeEventListener('scroll', updatePosition)\n window.removeEventListener('resize', updatePosition)\n }\n }, [open, updatePosition])\n\n // Close the popover with the standard Escape key interaction.\n useEffect(() => {\n if (!open) return\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [open, onClose])\n\n // Close when the user interacts outside both the popover and its anchor.\n useEffect(() => {\n if (!open) return\n const handleClick = (e: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(e.target as Node) &&\n anchorRef.current &&\n !anchorRef.current.contains(e.target as Node)\n ) {\n onClose()\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [open, onClose, anchorRef])\n\n if (!open) return null\n\n return (\n <Portal>\n <div\n ref={popoverRef}\n className={cn('popover', flipped ? 'flipped' : 'normal', className)}\n style={{\n position: 'absolute',\n top: position?.top ?? 0,\n left: position?.left ?? 0,\n width: position?.width,\n visibility: position ? 'visible' : 'hidden',\n ...style,\n }}\n role=\"listbox\"\n >\n {children}\n </div>\n </Portal>\n )\n}\n","import type {CSSProperties} from 'react'\nimport type {MineralFontColor} from '../theme'\n\n// Keep the utility scale in one place so props and CSS stay in sync.\nexport const mineralUtilityScaleValues = ['none', 'xs', 'sm', 'md', 'lg', 'xl', '2xl'] as const\n\nexport type MineralUtilityScale = (typeof mineralUtilityScaleValues)[number]\n\nexport interface LayoutUtilityProps {\n spacing?: MineralUtilityScale\n padding?: MineralUtilityScale\n fsize?: string | number\n fcolor?: MineralFontColor\n mt?: MineralUtilityScale\n mb?: MineralUtilityScale\n ml?: MineralUtilityScale\n mr?: MineralUtilityScale\n mx?: MineralUtilityScale\n my?: MineralUtilityScale\n pt?: MineralUtilityScale\n pb?: MineralUtilityScale\n pl?: MineralUtilityScale\n pr?: MineralUtilityScale\n px?: MineralUtilityScale\n py?: MineralUtilityScale\n fullWidth?: boolean\n}\n\n// Translate spacing and typography utility props into deterministic class names.\nexport function getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n}: LayoutUtilityProps): Array<string | false | undefined> {\n return [\n spacing !== undefined && `spacing-${spacing}`,\n padding !== undefined && `padding-${padding}`,\n fsize !== undefined && 'has-fsize',\n false,\n mt !== undefined && `mt-${mt}`,\n mb !== undefined && `mb-${mb}`,\n ml !== undefined && `ml-${ml}`,\n mr !== undefined && `mr-${mr}`,\n mx !== undefined && `mx-${mx}`,\n my !== undefined && `my-${my}`,\n pt !== undefined && `pt-${pt}`,\n pb !== undefined && `pb-${pb}`,\n pl !== undefined && `pl-${pl}`,\n pr !== undefined && `pr-${pr}`,\n px !== undefined && `px-${px}`,\n py !== undefined && `py-${py}`,\n fullWidth && 'full-width',\n ]\n}\n\n// Keep dynamic font sizes in CSS variables so layout helpers can accept any valid CSS length.\nexport function getLayoutUtilityStyles({fsize}: Pick<LayoutUtilityProps, 'fsize'>): CSSProperties | undefined {\n if (fsize === undefined || fsize === null || fsize === '') {\n return undefined\n }\n\n return {\n '--mineral-layout-fsize': typeof fsize === 'number' ? `${fsize}px` : fsize,\n } as CSSProperties\n}\n","import type {ContainerProps} from './Container.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './Container.css'\n\n// Constrain page content widths and apply shared spacing utilities.\nexport function Container({\n size = 'content',\n padded = true,\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: ContainerProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <div\n className={cn(\n 'container',\n size,\n padded && 'padded',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type {MineralColor, MineralFontColor} from '../theme'\n\nexport interface AppearanceProps {\n color?: MineralColor\n fcolor?: MineralFontColor\n}\n\n// Translate semantic appearance props into shared utility classes.\nexport function getAppearanceClassNames({color, fcolor}: AppearanceProps): Array<string | false | undefined> {\n return [color && `fcolor-${color}`, fcolor && `fcolor-${fcolor}`]\n}\n","import type {MHeaderProps} from './MHeader.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {Container} from '../Container'\nimport './MHeader.css'\n\n// Render a reusable page header shell aligned to a shared container.\nexport function MHeader({\n container = 'wide',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n fcolor,\n className,\n children,\n ...rest\n}: MHeaderProps) {\n return (\n <header\n className={cn(\n 'header',\n tone,\n ...getAppearanceClassNames({fcolor}),\n bordered && 'bordered',\n sticky && 'sticky',\n className\n )}\n {...rest}\n >\n <Container size={container} padded={padded} className=\"inner\">\n {children}\n </Container>\n </header>\n )\n}\n","import type {MFooterProps} from './MFooter.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport {Container} from '../Container'\nimport './MFooter.css'\n\n// Render a reusable page footer shell with shared spacing utilities.\nexport function MFooter({\n container = 'wide',\n padded = true,\n bordered = true,\n tone = 'surface',\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MFooterProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <footer\n className={cn(\n 'footer',\n tone,\n bordered && 'bordered',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n <Container size={container} padded={padded} className=\"inner\" fullWidth>\n {children}\n </Container>\n </footer>\n )\n}\n","import type {MNavbarProps} from './MNavbar.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {Container} from '../Container'\nimport './MNavbar.css'\n\n// Render a horizontal app or site navigation shell with container alignment.\nexport function MNavbar({\n container = 'content',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n fcolor,\n justify = 'between',\n align = 'center',\n wrap = false,\n className,\n children,\n ...rest\n}: MNavbarProps) {\n return (\n <nav\n className={cn(\n 'navbar',\n tone,\n ...getAppearanceClassNames({fcolor}),\n bordered && 'bordered',\n sticky && 'sticky',\n className\n )}\n {...rest}\n >\n <Container size={container} padded={padded} className=\"container\">\n <div className={cn('inner', justify, align, wrap && 'wrap')}>{children}</div>\n </Container>\n </nav>\n )\n}\n","import {forwardRef} from 'react'\nimport type {MouseEvent} from 'react'\nimport type {MLinkProps} from './Link.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Link.css'\n\n// Render a semantic link that can target anchors or router link components.\nexport const MLink = forwardRef<HTMLElement, MLinkProps>(function MLink(\n {\n component,\n to,\n tone = 'default',\n underline = 'hover',\n fcolor,\n current = false,\n block = false,\n disabled = false,\n className,\n children,\n href,\n onClick,\n ...rest\n },\n ref\n) {\n const Component = component ?? 'a'\n\n // Prevent disabled links from navigating while still exposing their content.\n function handleClick(event: MouseEvent<HTMLAnchorElement>) {\n if (disabled) {\n event.preventDefault()\n return\n }\n\n onClick?.(event)\n }\n\n return (\n <Component\n ref={ref}\n href={component ? undefined : disabled ? undefined : href}\n to={component ? to : undefined}\n className={cn(\n 'link',\n tone,\n underline,\n ...getAppearanceClassNames({fcolor}),\n current && 'current',\n block && 'block',\n disabled && 'disabled',\n className\n )}\n aria-current={current ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n onClick={handleClick}\n {...rest}\n >\n {children}\n </Component>\n )\n})\n","import type {MNavsProps} from './MNavs.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {MLink} from '../../typography/Link'\nimport './MNavs.css'\n\n// Render a lightweight navigation list from data or custom children.\nexport function MNavs({\n items,\n orientation = 'horizontal',\n gap = 'md',\n fcolor,\n wrap = false,\n className,\n children,\n ...rest\n}: MNavsProps) {\n const gapClassName = gap === '2xl' ? 'gap-2xl' : gap\n\n return (\n <div\n className={cn(\n 'navs',\n orientation,\n gapClassName,\n ...getAppearanceClassNames({fcolor}),\n wrap && 'wrap',\n className\n )}\n {...rest}\n >\n {items\n ? items.map((item) => (\n <MLink\n key={item.key ?? item.href ?? item.title?.toString() ?? item.label?.toString()}\n component={item.component}\n href={item.href}\n to={item.to}\n target={item.target}\n rel={item.rel}\n title={item.title}\n fcolor={fcolor}\n current={item.current}\n disabled={item.disabled}\n className={cn('link', item.className)}\n >\n {item.label}\n </MLink>\n ))\n : children}\n </div>\n )\n}\n","import {useId, useMemo, useState} from 'react'\nimport type {KeyboardEvent} from 'react'\nimport type {MTabsItem, MTabsProps} from './MTabs.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './MTabs.css'\n\ninterface MTabsTriggerProps {\n item: MTabsItem\n isActive: boolean\n tabId: string\n panelId: string\n clickEffect: MTabsProps['clickEffect']\n rippleColor: string | undefined\n onSelect: (value: string) => void\n}\n\n// Keep the tab trigger behavior isolated from the list and panel rendering.\nfunction MTabsTrigger({item, isActive, tabId, panelId, clickEffect, rippleColor, onSelect}: MTabsTriggerProps) {\n const {effectClassName, effectLayer, handlePointerDown, triggerEffect} = useInteractionEffect<HTMLButtonElement>({\n effect: clickEffect,\n disabled: item.disabled,\n centered: true,\n color: rippleColor,\n })\n\n return (\n <button\n type=\"button\"\n id={tabId}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={panelId}\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n className={cn('tabs-trigger', isActive && 'active', item.disabled && 'disabled', effectClassName)}\n onPointerDown={handlePointerDown}\n onKeyDown={(event) => {\n if (event.key === ' ' || event.key === 'Enter') {\n triggerEffect(event.currentTarget)\n }\n }}\n onClick={() => onSelect(item.value)}\n >\n {effectLayer}\n {item.icon && <span className=\"tabs-icon\">{item.icon}</span>}\n <span className=\"tabs-label\">{item.label}</span>\n </button>\n )\n}\n\nexport function MTabs({\n items,\n value,\n defaultValue,\n onValueChange,\n variant = 'underline',\n orientation = 'horizontal',\n size = 'md',\n fullWidth = false,\n fcolor,\n showPanels = true,\n panelClassName,\n clickEffect = 'ripple',\n rippleColor,\n className,\n ...rest\n}: MTabsProps) {\n // Pick the first enabled item when the caller does not control the active tab.\n const fallbackValue = useMemo(\n () => defaultValue ?? items.find((item) => !item.disabled)?.value ?? '',\n [defaultValue, items]\n )\n const [internalValue, setInternalValue] = useState(fallbackValue)\n const activeValue = value ?? internalValue\n const activeItem = items.find((item) => item.value === activeValue) ?? items[0]\n const baseId = useId()\n\n // Support both controlled and uncontrolled tab state.\n function selectTab(nextValue: string) {\n if (value === undefined) {\n setInternalValue(nextValue)\n }\n onValueChange?.(nextValue)\n }\n\n // Re-map keyboard navigation depending on the rendered orientation.\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const enabledItems = items.filter((item) => !item.disabled)\n const currentIndex = enabledItems.findIndex((item) => item.value === activeItem?.value)\n\n if (currentIndex === -1) {\n return\n }\n\n const nextKeys = orientation === 'vertical' ? ['ArrowDown'] : ['ArrowRight', 'ArrowDown']\n const previousKeys = orientation === 'vertical' ? ['ArrowUp'] : ['ArrowLeft', 'ArrowUp']\n\n if (nextKeys.includes(event.key)) {\n event.preventDefault()\n const nextItem = enabledItems[(currentIndex + 1) % enabledItems.length]\n selectTab(nextItem.value)\n }\n\n if (previousKeys.includes(event.key)) {\n event.preventDefault()\n const nextItem = enabledItems[(currentIndex - 1 + enabledItems.length) % enabledItems.length]\n selectTab(nextItem.value)\n }\n }\n\n return (\n <div\n className={cn(\n 'tabs',\n variant,\n orientation,\n size,\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n {...rest}\n >\n <div className=\"tabs-list\" role=\"tablist\" aria-orientation={orientation} onKeyDown={handleKeyDown}>\n {items.map((item) => {\n const isActive = item.value === activeItem?.value\n const tabId = `${baseId}-${item.value}-tab`\n const panelId = `${baseId}-${item.value}-panel`\n\n return (\n <MTabsTrigger\n key={item.value}\n item={item}\n isActive={isActive}\n tabId={tabId}\n panelId={panelId}\n clickEffect={clickEffect}\n rippleColor={rippleColor}\n onSelect={selectTab}\n />\n )\n })}\n </div>\n\n {showPanels && activeItem?.content !== undefined && (\n <div\n key={activeItem.value}\n id={`${baseId}-${activeItem.value}-panel`}\n role=\"tabpanel\"\n aria-labelledby={`${baseId}-${activeItem.value}-tab`}\n className={cn('tabs-panel', panelClassName)}\n >\n {activeItem.content}\n </div>\n )}\n </div>\n )\n}\n","import type React from 'react'\nimport type {SectionProps} from './Section.types'\nimport {cn} from '../../../utils/cn'\nimport {useReveal} from '../../../utils/useReveal'\nimport './Section.css'\n\n// Render a semantic page section with predefined spacing and tone.\nexport function Section({\n as = 'section',\n spacing = 'lg',\n tone = 'default',\n reveal,\n className,\n style,\n children,\n ...rest\n}: SectionProps) {\n const Component = as\n const revealRef = useReveal(reveal)\n const hasReveal = reveal !== undefined && reveal !== false\n\n return (\n <Component\n ref={hasReveal ? (revealRef as React.RefObject<never>) : undefined}\n className={cn(\n 'section',\n spacing,\n tone,\n hasReveal && 'mineral-reveal',\n className\n )}\n style={style}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type {StackProps} from './Stack.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport {useReveal} from '../../../utils/useReveal'\nimport './Stack.css'\n\n// Stack children vertically with shared gap and utility props.\nexport function Stack({\n gap = 'md',\n align = 'stretch',\n reveal,\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: StackProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n const revealRef = useReveal<HTMLDivElement>(reveal)\n const gapClassName = gap === '2xl' ? 'gap-2xl' : gap\n\n return (\n <div\n ref={reveal !== undefined && reveal !== false ? revealRef : undefined}\n className={cn(\n 'stack',\n gapClassName,\n align !== 'stretch' && align,\n reveal !== undefined && reveal !== false && 'mineral-reveal',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type {InlineProps} from './Inline.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport {useReveal} from '../../../utils/useReveal'\nimport './Inline.css'\n\n// Arrange children horizontally with configurable alignment and wrapping.\nexport function Inline({\n gap = 'md',\n align = 'center',\n justify = 'start',\n wrap = 'wrap',\n reveal,\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: InlineProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n const revealRef = useReveal<HTMLDivElement>(reveal)\n const gapClassName = gap === '2xl' ? 'gap-2xl' : gap\n\n return (\n <div\n ref={reveal !== undefined && reveal !== false ? revealRef : undefined}\n className={cn(\n 'inline',\n gapClassName,\n align,\n `justify-${justify}`,\n wrap,\n reveal !== undefined && reveal !== false && 'mineral-reveal',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type {GridProps} from './Grid.types'\nimport {cn} from '../../../utils/cn'\nimport './Grid.css'\n\n// Render a simple equal-column grid with optional responsive min item width.\nexport function Grid({columns = 2, gap = 'lg', minItemWidth, className, style, children, ...rest}: GridProps) {\n const gapClassName = gap === '2xl' ? 'gap-2xl' : gap\n\n return (\n <div\n className={cn('grid', `columns-${columns}`, gapClassName, className)}\n style={{\n ...(minItemWidth ? {'--grid-min-item-width': minItemWidth} : {}),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import {Children, isValidElement} from 'react'\nimport type {MGridItemProps, MGridProps} from './MGrid.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './MGrid.css'\n\n// Render either a responsive row or a responsive column using one shared grid API.\nexport function MGrid({\n type = 'row',\n gap = 'lg',\n span,\n sm,\n md,\n lg,\n xl,\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MGridProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n const baseSpan = span ?? xl ?? lg\n const gapClassName = gap === '2xl' ? 'gap-2xl' : gap\n\n if (type === 'col') {\n return (\n <div\n className={cn(\n 'grid',\n 'col',\n baseSpan ? `span-${baseSpan}` : 'span-auto',\n xl && `xl-${xl}`,\n lg && `lg-${lg}`,\n md && `md-${md}`,\n sm && `sm-${sm}`,\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n }\n\n const childArray = Children.toArray(children)\n const autoColumns = Math.min(Math.max(childArray.length, 1), 12)\n const hasDesktopSizing = childArray.some((child) => {\n if (!isValidElement(child)) {\n return false\n }\n\n const p = child.props as Record<string, unknown>\n return Boolean(p?.span || p?.lg || p?.xl)\n })\n\n return (\n <div\n className={cn(\n 'grid',\n 'row',\n gapClassName,\n hasDesktopSizing ? 'tracked' : `auto-cols-${autoColumns}`,\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth: fullWidth ?? true,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n// Keep MGridItem as a compatibility alias for explicit column declarations.\nexport function MGridItem({span, sm, md, lg, xl, ...rest}: MGridItemProps) {\n return <MGrid type=\"col\" span={span} sm={sm} md={md} lg={lg} xl={xl} {...rest} />\n}\n","import type {SurfaceProps} from './Surface.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport {useReveal} from '../../../utils/useReveal'\nimport './Surface.css'\n\n// Render a reusable surface primitive for cards, panels and preview blocks.\nexport function Surface({\n tone = 'default',\n outlined = true,\n padded = true,\n reveal,\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: SurfaceProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n const revealRef = useReveal<HTMLDivElement>(reveal)\n\n return (\n <div\n ref={reveal !== undefined && reveal !== false ? revealRef : undefined}\n className={cn(\n 'surface',\n tone,\n outlined && 'outlined',\n padded && 'padded',\n reveal !== undefined && reveal !== false && 'mineral-reveal',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type {DividerProps} from './Divider.types'\nimport {cn} from '../../../utils/cn'\n\n// Render a semantic divider line between related content blocks.\nexport function Divider({className, style, ...rest}: DividerProps) {\n return <hr className={cn('divider', className)} style={style} {...rest} />\n}\n","import {\n useState,\n useRef,\n useCallback,\n Children,\n isValidElement,\n cloneElement,\n} from 'react'\nimport {Popover} from '../../primitives/Popover'\nimport {useKeyboardNav} from '../../../utils/useKeyboardNav'\nimport {cn} from '../../../utils/cn'\nimport type {\n MDropdownMenuProps,\n MDropdownItemProps,\n MDropdownGroupProps,\n MDropdownDividerProps,\n} from './DropdownMenu.types'\nimport './DropdownMenu.css'\n\ntype AnyProps = Record<string, any>\n\nfunction getProps(el: React.ReactElement): AnyProps {\n return el.props as AnyProps\n}\n\nfunction isItem(child: React.ReactElement): boolean {\n return !!(child.type as any).__dropdownItem\n}\n\nfunction isGroup(child: React.ReactElement): boolean {\n return !!(child.type as any).__dropdownGroup\n}\n\n// Collect all MDropdownItem elements from children (including inside groups).\nfunction collectItems(children: React.ReactNode): React.ReactElement[] {\n const items: React.ReactElement[] = []\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return\n if (isItem(child)) {\n items.push(child)\n } else if (isGroup(child)) {\n Children.forEach(getProps(child).children, (gc: React.ReactNode) => {\n if (isValidElement(gc) && isItem(gc)) {\n items.push(gc)\n }\n })\n }\n })\n return items\n}\n\nexport function MDropdownMenu({\n trigger,\n placement = 'bottom-start',\n size = 'md',\n closeOnSelect = true,\n openOn = 'click',\n className,\n style,\n children,\n}: MDropdownMenuProps) {\n const [open, setOpen] = useState(false)\n const anchorRef = useRef<HTMLDivElement>(null)\n const hoverTimeout = useRef<ReturnType<typeof setTimeout>>(null)\n\n const items = collectItems(children)\n const enabledCount = items.filter((i) => !getProps(i).disabled).length\n\n const handleSelect = useCallback(\n (index: number) => {\n let enabledIdx = 0\n for (const item of items) {\n const p = getProps(item)\n if (p.disabled) continue\n if (enabledIdx === index) {\n p.onClick?.()\n break\n }\n enabledIdx++\n }\n if (closeOnSelect) setOpen(false)\n },\n [items, closeOnSelect]\n )\n\n const {activeIndex, setActiveIndex, onKeyDown} = useKeyboardNav({\n itemCount: enabledCount,\n onSelect: handleSelect,\n onClose: () => setOpen(false),\n isOpen: open,\n })\n\n const handleTriggerClick = () => setOpen((o) => !o)\n\n const handleTriggerKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n setOpen(true)\n }\n if (open) onKeyDown(e as any)\n }\n\n // Map active index back to flat child rendering with enabled-only tracking.\n let enabledIdx = 0\n const renderChild = (child: React.ReactNode): React.ReactNode => {\n if (!isValidElement(child)) return child\n\n if (isItem(child)) {\n const p = getProps(child)\n const isDisabled = p.disabled\n const idx = isDisabled ? -1 : enabledIdx++\n return cloneElement(child, {\n _active: idx === activeIndex,\n _onHover: isDisabled ? undefined : () => setActiveIndex(idx),\n _onClick: () => {\n if (isDisabled) return\n p.onClick?.()\n if (closeOnSelect) setOpen(false)\n },\n } as AnyProps)\n }\n\n if (isGroup(child)) {\n return cloneElement(child, {\n children: Children.map(getProps(child).children, renderChild),\n } as AnyProps)\n }\n\n return child\n }\n\n const hoverHandlers = openOn === 'hover' ? {\n onMouseEnter: () => {\n if (hoverTimeout.current) clearTimeout(hoverTimeout.current)\n setOpen(true)\n },\n onMouseLeave: () => {\n hoverTimeout.current = setTimeout(() => setOpen(false), 150)\n },\n } : {}\n\n return (\n <div className={cn('dropdown-menu-anchor', className)} style={style} {...hoverHandlers}>\n <div\n ref={anchorRef}\n onClick={openOn === 'click' ? handleTriggerClick : undefined}\n onKeyDown={handleTriggerKeyDown}\n role=\"button\"\n tabIndex={0}\n className=\"dropdown-menu-trigger\"\n >\n {trigger}\n </div>\n <Popover\n open={open}\n anchorRef={anchorRef}\n onClose={() => setOpen(false)}\n placement={placement}\n className={cn('dropdown-menu-popover', size)}\n >\n <div className=\"dropdown-menu-list\" role=\"menu\" {...hoverHandlers}>\n {Children.map(children, renderChild)}\n </div>\n </Popover>\n </div>\n )\n}\n\nexport function MDropdownItem({\n icon,\n label,\n href,\n to,\n onClick,\n color,\n disabled = false,\n active = false,\n component,\n className,\n _active,\n _onHover,\n _onClick,\n}: MDropdownItemProps & {_active?: boolean; _onHover?: () => void; _onClick?: () => void}) {\n const isHighlighted = _active ?? active\n\n const content = (\n <>\n {icon && <span className=\"dropdown-menu-item-icon\">{icon}</span>}\n <span className=\"dropdown-menu-item-label\">{label}</span>\n </>\n )\n\n const cls = cn(\n 'dropdown-menu-item',\n isHighlighted && 'active',\n disabled && 'disabled',\n color,\n className\n )\n\n const handleClick = (e: React.MouseEvent) => {\n if (disabled) {\n e.preventDefault()\n return\n }\n _onClick?.()\n }\n\n const Tag = component ?? (href || to ? 'a' : 'button')\n const linkProps = href ? {href} : to ? {href: to} : {}\n\n return (\n <Tag\n className={cls}\n role=\"menuitem\"\n tabIndex={-1}\n onClick={handleClick}\n onMouseEnter={_onHover}\n aria-disabled={disabled || undefined}\n {...linkProps}\n >\n {content}\n </Tag>\n )\n}\n;(MDropdownItem as any).__dropdownItem = true\n\nexport function MDropdownGroup({label, children}: MDropdownGroupProps) {\n return (\n <div className=\"dropdown-menu-group\" role=\"group\">\n <div className=\"dropdown-menu-group-label\">{label}</div>\n {children}\n </div>\n )\n}\n;(MDropdownGroup as any).__dropdownGroup = true\n\nexport function MDropdownDivider({className}: MDropdownDividerProps) {\n return <div className={cn('dropdown-menu-divider', className)} role=\"separator\" />\n}\n","import {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n useMemo,\n} from 'react'\nimport {cn} from '../../../utils/cn'\nimport {MDropdownMenu} from '../../display/DropdownMenu'\nimport type {\n MSidebarProps,\n MSidebarHeaderProps,\n MSidebarNavProps,\n MSidebarItemProps,\n MSidebarGroupProps,\n MSidebarFooterProps,\n MSidebarDividerProps,\n MSidebarMode,\n} from './MSidebar.types'\nimport './MSidebar.css'\n\nconst STORAGE_KEY = 'mineralui-sidebar'\n\ninterface SidebarContextValue {\n mode: MSidebarMode\n mobile: boolean\n mobileOpen: boolean\n canToggle: boolean\n toggleMode: () => void\n}\n\nconst SidebarCtx = createContext<SidebarContextValue>({\n mode: 'expanded',\n mobile: false,\n mobileOpen: false,\n canToggle: false,\n toggleMode: () => {},\n})\n\nfunction useSidebar() {\n return useContext(SidebarCtx)\n}\n\nfunction useIsMobile(breakpoint: number): boolean {\n const [mobile, setMobile] = useState(() =>\n typeof window !== 'undefined' ? window.innerWidth < breakpoint : false\n )\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`)\n const handler = (e: MediaQueryListEvent) => setMobile(e.matches)\n setMobile(mq.matches)\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [breakpoint])\n return mobile\n}\n\nexport function MSidebar({\n mode: modeProp = 'auto',\n defaultMode = 'expanded',\n onModeChange,\n persist = false,\n side = 'left',\n tone = 'subtle',\n bordered = true,\n mobileBreakpoint = 768,\n className,\n style,\n children,\n}: MSidebarProps) {\n const mobile = useIsMobile(mobileBreakpoint)\n const [mobileOpen, setMobileOpen] = useState(false)\n\n const [internalMode, setInternalMode] = useState<MSidebarMode>(() => {\n if (persist) {\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n if (v === 'expanded' || v === 'collapsed') return v\n } catch { /* noop */ }\n }\n return defaultMode\n })\n\n const resolvedMode: MSidebarMode =\n modeProp === 'auto' ? internalMode : modeProp === 'collapsed' ? 'collapsed' : 'expanded'\n\n const toggleMode = useCallback(() => {\n const next: MSidebarMode = resolvedMode === 'expanded' ? 'collapsed' : 'expanded'\n setInternalMode(next)\n onModeChange?.(next)\n if (persist) {\n try { localStorage.setItem(STORAGE_KEY, next) } catch { /* noop */ }\n }\n }, [resolvedMode, onModeChange, persist])\n\n const closeMobile = useCallback(() => setMobileOpen(false), [])\n\n useEffect(() => {\n if (!mobileOpen) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false)\n }\n document.addEventListener('keydown', handler)\n return () => document.removeEventListener('keydown', handler)\n }, [mobileOpen])\n\n const canToggle = !mobile && modeProp === 'auto'\n\n const ctx = useMemo<SidebarContextValue>(\n () => ({mode: resolvedMode, mobile, mobileOpen, canToggle, toggleMode}),\n [resolvedMode, mobile, mobileOpen, canToggle, toggleMode]\n )\n\n const isCollapsed = !mobile && resolvedMode === 'collapsed'\n\n const sidebarCls = cn(\n 'sidebar',\n tone,\n side,\n isCollapsed && 'collapsed',\n bordered && 'bordered',\n mobile && 'mobile',\n mobile && mobileOpen && 'mobile-open',\n className\n )\n\n return (\n <SidebarCtx.Provider value={ctx}>\n {mobile && mobileOpen && (\n <div className=\"sidebar-backdrop\" onClick={closeMobile} />\n )}\n\n <aside className={sidebarCls} style={style}>\n {children}\n </aside>\n\n {mobile && !mobileOpen && (\n <button\n className={cn('sidebar-hamburger', side)}\n onClick={() => setMobileOpen(true)}\n aria-label=\"Open menu\"\n >\n <span className=\"sidebar-hamburger-icon\">☰</span>\n </button>\n )}\n </SidebarCtx.Provider>\n )\n}\n\nexport function MSidebarHeader({className, children}: MSidebarHeaderProps) {\n const {mode, mobile, canToggle, toggleMode} = useSidebar()\n const isCollapsed = !mobile && mode === 'collapsed'\n\n return (\n <div className={cn('sidebar-header', className)}>\n <div className=\"sidebar-header-content\">\n {children}\n </div>\n {canToggle && (\n <button\n className=\"sidebar-toggle\"\n onClick={toggleMode}\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n >\n <span className={cn('sidebar-chevron', isCollapsed && 'flipped')}>\n ‹\n </span>\n </button>\n )}\n </div>\n )\n}\n\nexport function MSidebarNav({className, children}: MSidebarNavProps) {\n return <nav className={cn('sidebar-nav', className)}>{children}</nav>\n}\n\nexport function MSidebarItem({\n icon,\n label,\n href,\n to,\n onClick,\n active = false,\n disabled = false,\n badge,\n color,\n component,\n className,\n}: MSidebarItemProps) {\n const {mode, mobile} = useSidebar()\n const isCollapsed = !mobile && mode === 'collapsed'\n\n const Tag = component ?? (href || to ? 'a' : 'button')\n const linkProps = component\n ? (to ? {to} : href ? {href} : {})\n : (href ? {href} : to ? {href: to} : {})\n\n const cls = cn(\n 'sidebar-item',\n active && 'active',\n disabled && 'disabled',\n color,\n className\n )\n\n return (\n <Tag\n className={cls}\n onClick={disabled ? undefined : onClick}\n aria-disabled={disabled || undefined}\n title={isCollapsed ? (typeof label === 'string' ? label : undefined) : undefined}\n {...linkProps}\n >\n {icon && <span className=\"sidebar-item-icon\">{icon}</span>}\n {!isCollapsed && <span className=\"sidebar-item-label\">{label}</span>}\n {!isCollapsed && badge && <span className=\"sidebar-item-badge\">{badge}</span>}\n </Tag>\n )\n}\n\nexport function MSidebarGroup({\n label,\n icon,\n active = false,\n defaultOpen = true,\n collapsible = true,\n children,\n className,\n}: MSidebarGroupProps) {\n const sidebarCtx = useSidebar()\n const {mode, mobile} = sidebarCtx\n const isCollapsed = !mobile && mode === 'collapsed'\n const [open, setOpen] = useState(defaultOpen)\n\n const expandedCtx = useMemo<SidebarContextValue>(\n () => ({...sidebarCtx, mode: 'expanded'}),\n [sidebarCtx]\n )\n\n const toggle = () => {\n if (collapsible) setOpen((o) => !o)\n }\n\n if (isCollapsed) {\n const trigger = (\n <span\n className={cn('sidebar-group-icon collapsed', active && 'active')}\n title={typeof label === 'string' ? label : undefined}\n >\n {icon}\n </span>\n )\n\n return (\n <div className={cn('sidebar-group', className)}>\n <MDropdownMenu trigger={trigger} placement=\"right-start\" closeOnSelect openOn=\"hover\">\n <SidebarCtx.Provider value={expandedCtx}>\n {children}\n </SidebarCtx.Provider>\n </MDropdownMenu>\n </div>\n )\n }\n\n return (\n <div className={cn('sidebar-group', className)}>\n <button\n className={cn('sidebar-group-header', active && 'active')}\n onClick={toggle}\n aria-expanded={open}\n >\n {icon && <span className=\"sidebar-group-icon\">{icon}</span>}\n <span className=\"sidebar-group-label\">{label}</span>\n {collapsible && (\n <span className={cn('sidebar-group-arrow', open && 'open')}>\n ›\n </span>\n )}\n </button>\n {open && <div className=\"sidebar-group-items\">{children}</div>}\n </div>\n )\n}\n\nexport function MSidebarFooter({className, children}: MSidebarFooterProps) {\n return <div className={cn('sidebar-footer', className)}>{children}</div>\n}\n\nexport function MSidebarDivider({className, spacing = 'md'}: MSidebarDividerProps) {\n return <hr className={cn('sidebar-divider', spacing, className)} />\n}\n","import type {MSubNavProps} from './MSubNav.types'\nimport {cn} from '../../../utils/cn'\nimport './MSubNav.css'\n\n// Render a horizontal secondary navigation bar below the main header.\nexport function MSubNav({\n items,\n active,\n onChange,\n component,\n className,\n ...rest\n}: MSubNavProps) {\n return (\n <nav className={cn('subnav', className)} {...rest}>\n {items.map((item) => {\n const Tag = component ?? (item.href ? 'a' : 'button')\n const isActive = active === item.value\n const linkProps = item.href ? {href: item.href} : {}\n\n return (\n <Tag\n key={item.value}\n className={cn(\n 'subnav-item',\n isActive && 'active',\n item.disabled && 'disabled'\n )}\n onClick={item.disabled ? undefined : () => onChange?.(item.value)}\n aria-disabled={item.disabled || undefined}\n {...linkProps}\n >\n {item.icon && <span className=\"subnav-item-icon\">{item.icon}</span>}\n <span className=\"subnav-item-label\">{item.label}</span>\n </Tag>\n )\n })}\n </nav>\n )\n}\n","import {Fragment, useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport type {MBreadcrumbProps} from './MBreadcrumb.types'\nimport './MBreadcrumb.css'\n\nexport function MBreadcrumb({\n items,\n separator = '/',\n maxItems,\n className,\n ...rest\n}: MBreadcrumbProps) {\n const visible = useMemo(() => {\n if (!maxItems || maxItems >= items.length) return items\n if (maxItems < 2) return [items[items.length - 1]]\n const head = items.slice(0, 1)\n const tail = items.slice(-(maxItems - 1))\n return [...head, null, ...tail]\n }, [items, maxItems])\n\n return (\n <nav aria-label=\"breadcrumb\" className={cn('breadcrumb', className)} {...rest}>\n <ol className=\"list\">\n {visible.map((item, i) => {\n if (item === null) {\n return (\n <li key=\"ellipsis\" className=\"item ellipsis\">\n <span className=\"separator\">{separator}</span>\n <span>…</span>\n </li>\n )\n }\n\n const isLast = i === visible.length - 1\n\n return (\n <li key={i} className={cn('item', isLast && 'active')}>\n {i > 0 && <span className=\"separator\">{separator}</span>}\n {item.href && !isLast ? (\n <a href={item.href} className=\"link\" onClick={item.onClick}>\n {item.label}\n </a>\n ) : item.onClick && !isLast ? (\n <button type=\"button\" className=\"link link-btn\" onClick={item.onClick}>\n {item.label}\n </button>\n ) : (\n <span className=\"current\" aria-current={isLast ? 'page' : undefined}>\n {item.label}\n </span>\n )}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import {useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport type {MPaginationProps} from './MPagination.types'\nimport './MPagination.css'\n\nfunction range(start: number, end: number): number[] {\n const result: number[] = []\n for (let i = start; i <= end; i++) result.push(i)\n return result\n}\n\nfunction buildPages(totalPages: number, page: number, siblings: number, boundaries: number): (number | 'dots')[] {\n if (totalPages <= (boundaries * 2) + (siblings * 2) + 3) {\n return range(1, totalPages)\n }\n\n const leftBound = Math.max(page - siblings, boundaries + 2)\n const rightBound = Math.min(page + siblings, totalPages - boundaries - 1)\n\n const showLeftDots = leftBound > boundaries + 2\n const showRightDots = rightBound < totalPages - boundaries - 1\n\n const leftEdge = range(1, boundaries)\n const rightEdge = range(totalPages - boundaries + 1, totalPages)\n\n if (!showLeftDots && showRightDots) {\n const leftCount = (siblings * 2) + boundaries + 2\n return [...range(1, leftCount), 'dots', ...rightEdge]\n }\n\n if (showLeftDots && !showRightDots) {\n const rightCount = (siblings * 2) + boundaries + 2\n return [...leftEdge, 'dots', ...range(totalPages - rightCount + 1, totalPages)]\n }\n\n return [...leftEdge, 'dots', ...range(leftBound, rightBound), 'dots', ...rightEdge]\n}\n\nexport function MPagination({\n total,\n page,\n pageSize = 10,\n onChange,\n siblings = 1,\n boundaries = 1,\n variant = 'numbered',\n className,\n ...rest\n}: MPaginationProps) {\n const totalPages = Math.max(1, Math.ceil(total / pageSize))\n const currentPage = Math.min(Math.max(1, page), totalPages)\n\n const pages = useMemo(\n () => buildPages(totalPages, currentPage, siblings, boundaries),\n [totalPages, currentPage, siblings, boundaries]\n )\n\n if (variant === 'simple') {\n return (\n <nav aria-label=\"pagination\" className={cn('pagination', className)} {...rest}>\n <button\n type=\"button\"\n className=\"btn\"\n disabled={currentPage <= 1}\n onClick={() => onChange(currentPage - 1)}\n >\n ‹\n </button>\n <span className=\"info\">\n {currentPage} / {totalPages}\n </span>\n <button\n type=\"button\"\n className=\"btn\"\n disabled={currentPage >= totalPages}\n onClick={() => onChange(currentPage + 1)}\n >\n ›\n </button>\n </nav>\n )\n }\n\n return (\n <nav aria-label=\"pagination\" className={cn('pagination', className)} {...rest}>\n <button\n type=\"button\"\n className=\"btn\"\n disabled={currentPage <= 1}\n onClick={() => onChange(currentPage - 1)}\n >\n ‹\n </button>\n {pages.map((p, i) =>\n p === 'dots' ? (\n <span key={`dots-${i}`} className=\"dots\">…</span>\n ) : (\n <button\n key={p}\n type=\"button\"\n className={cn('btn', p === currentPage && 'active')}\n onClick={() => onChange(p)}\n >\n {p}\n </button>\n )\n )}\n <button\n type=\"button\"\n className=\"btn\"\n disabled={currentPage >= totalPages}\n onClick={() => onChange(currentPage + 1)}\n >\n ›\n </button>\n </nav>\n )\n}\n","import {forwardRef} from 'react'\nimport type {AppShellProps, BodyProps} from './AppShell.types'\nimport {cn} from '../../../utils/cn'\nimport './AppShell.css'\n\nexport const AppShell = forwardRef<HTMLDivElement, AppShellProps>(function AppShell(\n {sidebar, className, children, ...rest},\n ref\n) {\n return (\n <div ref={ref} className={cn('app-shell', className)} {...rest}>\n {sidebar}\n {children}\n </div>\n )\n})\n\nexport const Body = forwardRef<HTMLDivElement, BodyProps>(function Body(\n {className, children, ...rest},\n ref\n) {\n return (\n <div ref={ref} className={cn('app-body', className)} {...rest}>\n {children}\n </div>\n )\n})\n","import {forwardRef} from 'react'\nimport type {ButtonProps} from './Button.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './Button.css'\n\n// Render the main action primitive with semantic variants and built-in click feedback.\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = 'primary',\n size = 'md',\n color = 'primary',\n fcolor,\n fullWidth = false,\n rounded = false,\n iconOnly = false,\n loading = false,\n startIcon,\n endIcon,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n children,\n disabled = false,\n type = 'button',\n onPointerDown,\n onKeyDown,\n ...rest\n },\n ref\n) {\n const isDisabled = disabled || loading\n const {effectClassName, effectLayer, handlePointerDown, triggerEffect} = useInteractionEffect<HTMLButtonElement>({\n effect: clickEffect,\n disabled: isDisabled,\n centered: iconOnly,\n color: rippleColor,\n })\n\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n 'button',\n variant,\n size,\n color,\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n rounded && 'rounded',\n iconOnly && 'icon-only',\n loading && 'loading',\n isDisabled && 'disabled',\n effectClassName,\n className\n )}\n style={style}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n onPointerDown={(event) => {\n handlePointerDown(event)\n onPointerDown?.(event)\n }}\n onKeyDown={(event) => {\n if (event.key === ' ' || event.key === 'Enter') {\n triggerEffect(event.currentTarget)\n }\n\n onKeyDown?.(event)\n }}\n {...rest}\n >\n {effectLayer}\n {loading && <span className=\"spinner\" aria-hidden=\"true\" />}\n {startIcon && <span className=\"icon start\">{startIcon}</span>}\n {children && <span className=\"content\">{children}</span>}\n {endIcon && <span className=\"icon end\">{endIcon}</span>}\n </button>\n )\n})\n","import {forwardRef, useEffect, useRef} from 'react'\nimport type {CheckboxProps} from './Checkbox.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './Checkbox.css'\n\n// Render a styled checkbox while keeping the native input for accessibility.\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n {\n checked,\n defaultChecked,\n indeterminate = false,\n name,\n id,\n value,\n disabled = false,\n size = 'md',\n color = 'primary',\n fcolor,\n label,\n labelPosition = 'right',\n error = false,\n errorText,\n onChange,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n },\n ref\n) {\n const internalRef = useRef<HTMLInputElement>(null)\n const inputRef = (ref as React.RefObject<HTMLInputElement>) ?? internalRef\n const {effectClassName, effectLayer, handlePointerDown, triggerEffect} = useInteractionEffect<HTMLSpanElement>({\n effect: clickEffect,\n disabled,\n centered: true,\n color: rippleColor,\n })\n\n // Keep the browser indeterminate flag in sync with React props.\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate\n }\n }, [indeterminate, inputRef])\n\n const hasError = error || !!errorText\n\n return (\n <div className={cn('checkbox', ...getAppearanceClassNames({fcolor}), className)} style={style}>\n <label className={cn('label', size, labelPosition === 'left' && 'label-left', disabled && 'disabled')}>\n <span\n className={cn('box', color, hasError && 'error', effectClassName)}\n onPointerDown={handlePointerDown}\n >\n {effectLayer}\n <input\n ref={inputRef}\n type=\"checkbox\"\n checked={checked}\n defaultChecked={defaultChecked}\n name={name}\n id={id}\n value={value}\n disabled={disabled}\n onChange={onChange}\n onKeyDown={(event) => {\n if (event.key === ' ' || event.key === 'Enter') {\n triggerEffect(event.currentTarget.parentElement as HTMLSpanElement | null)\n }\n }}\n className=\"input\"\n aria-invalid={hasError || undefined}\n />\n <svg className=\"checkmark\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n className=\"check-path\"\n d=\"M3.5 8L6.5 11L12.5 5\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"indeterminate-mark\" />\n </span>\n {label && <span className=\"label-text\">{label}</span>}\n </label>\n {errorText && (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n )}\n </div>\n )\n})\n","import {createContext, useContext} from 'react'\nimport type {RadioGroupContextValue} from './Radio.types'\n\nexport const RadioContext = createContext<RadioGroupContextValue | null>(null)\n\n// Read the nearest radio-group context when a radio participates in grouped state.\nexport function useRadioGroup(): RadioGroupContextValue | null {\n return useContext(RadioContext)\n}\n","import {forwardRef, useCallback} from 'react'\nimport type {RadioProps} from './Radio.types'\nimport {useRadioGroup} from './RadioContext'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './Radio.css'\n\n// Render a single radio that can work standalone or inside RadioGroup.\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(function Radio(\n {\n checked,\n defaultChecked,\n name,\n id,\n value,\n disabled = false,\n size = 'md',\n color = 'primary',\n fcolor,\n label,\n labelPosition = 'right',\n onChange,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n },\n ref\n) {\n const group = useRadioGroup()\n\n const resolvedName = group?.name ?? name\n const resolvedDisabled = group?.disabled ?? disabled\n const resolvedSize = group?.size ?? size\n const resolvedColor = group?.color ?? color\n const resolvedFontColor = group?.fcolor ?? fcolor\n const resolvedChecked = group ? group.value === value : checked\n const {effectClassName, effectLayer, handlePointerDown, triggerEffect} = useInteractionEffect<HTMLSpanElement>({\n effect: clickEffect,\n disabled: resolvedDisabled,\n centered: true,\n color: rippleColor,\n })\n\n // Delegate selection back to the group when one is present.\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(event)\n if (group?.onChange && value) {\n group.onChange(value)\n }\n },\n [onChange, group, value]\n )\n\n return (\n <label\n className={cn(\n 'radio',\n resolvedSize,\n ...getAppearanceClassNames({fcolor: resolvedFontColor}),\n labelPosition === 'left' && 'label-left',\n resolvedDisabled && 'disabled',\n className\n )}\n style={style}\n >\n <span className={cn('circle', resolvedColor, effectClassName)} onPointerDown={handlePointerDown}>\n {effectLayer}\n <input\n ref={ref}\n type=\"radio\"\n name={resolvedName}\n id={id}\n value={value}\n checked={resolvedChecked}\n defaultChecked={!group ? defaultChecked : undefined}\n disabled={resolvedDisabled}\n onChange={handleChange}\n onKeyDown={(event) => {\n if (event.key === ' ' || event.key === 'Enter') {\n triggerEffect(event.currentTarget.parentElement as HTMLSpanElement | null)\n }\n }}\n className=\"input\"\n />\n <span className=\"dot\" />\n </span>\n {label && <span className=\"label-text\">{label}</span>}\n </label>\n )\n})\n","import {useState, useCallback, useMemo} from 'react'\nimport type {RadioGroupProps} from './Radio.types'\nimport {RadioContext} from './RadioContext'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Radio.css'\n\n// Coordinate multiple radio items through shared context and optional controlled state.\nexport function RadioGroup({\n name,\n value,\n defaultValue,\n onChange,\n direction = 'vertical',\n children,\n disabled = false,\n size = 'md',\n color = 'primary',\n fcolor,\n error = false,\n errorText,\n label,\n className,\n style,\n}: RadioGroupProps) {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const currentValue = value !== undefined ? value : internalValue\n\n // Mirror controlled and uncontrolled usage with the same group API.\n const handleChange = useCallback(\n (val: string) => {\n if (value === undefined) {\n setInternalValue(val)\n }\n onChange?.(val)\n },\n [onChange, value]\n )\n\n // Memoize context so nested radios only update when relevant inputs change.\n const ctx = useMemo(\n () => ({name, value: currentValue, disabled, size, color, fcolor, onChange: handleChange}),\n [name, currentValue, disabled, size, color, fcolor, handleChange]\n )\n\n return (\n <RadioContext.Provider value={ctx}>\n <fieldset\n className={cn('radio-group', direction, ...getAppearanceClassNames({fcolor}), className)}\n style={style}\n role=\"radiogroup\"\n >\n {label && <legend className={cn('label', error && 'error')}>{label}</legend>}\n {children}\n {errorText && (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n )}\n </fieldset>\n </RadioContext.Provider>\n )\n}\n","import {forwardRef} from 'react'\nimport type {ToggleProps} from './Toggle.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './Toggle.css'\n\n// Render a switch-style boolean control with the same API shape as Checkbox.\nexport const Toggle = forwardRef<HTMLInputElement, ToggleProps>(function Toggle(\n {\n checked,\n defaultChecked,\n name,\n id,\n disabled = false,\n size = 'md',\n color = 'primary',\n fcolor,\n label,\n labelPosition = 'right',\n onChange,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n },\n ref\n) {\n const {effectClassName, effectLayer, handlePointerDown, triggerEffect} = useInteractionEffect<HTMLSpanElement>({\n effect: clickEffect,\n disabled,\n centered: true,\n color: rippleColor,\n })\n\n return (\n <label\n className={cn(\n 'toggle',\n size,\n ...getAppearanceClassNames({fcolor}),\n labelPosition === 'left' && 'label-left',\n disabled && 'disabled',\n className\n )}\n style={style}\n >\n <span className={cn('track', color, effectClassName)} onPointerDown={handlePointerDown}>\n {effectLayer}\n <input\n ref={ref}\n type=\"checkbox\"\n checked={checked}\n defaultChecked={defaultChecked}\n name={name}\n id={id}\n disabled={disabled}\n onChange={onChange}\n onKeyDown={(event) => {\n if (event.key === ' ' || event.key === 'Enter') {\n triggerEffect(event.currentTarget.parentElement as HTMLSpanElement | null)\n }\n }}\n className=\"input\"\n role=\"switch\"\n aria-checked={checked}\n />\n <span className=\"knob\" />\n </span>\n {label && <span className=\"label-text\">{label}</span>}\n </label>\n )\n})\n","import {useCallback, useRef} from 'react'\nimport type {SliderProps} from './Slider.types'\nimport {cn} from '../../../utils/cn'\nimport './Slider.css'\n\nexport function Slider({\n min = 0,\n max = 100,\n step = 1,\n value,\n onChange,\n marks,\n label,\n color = 'primary',\n disabled = false,\n className,\n ...rest\n}: SliderProps) {\n const trackRef = useRef<HTMLDivElement>(null)\n\n const percent = ((value - min) / (max - min)) * 100\n\n const clampAndSnap = useCallback(\n (raw: number) => {\n const snapped = Math.round(raw / step) * step\n return Math.min(max, Math.max(min, snapped))\n },\n [min, max, step]\n )\n\n const valueFromPointer = useCallback(\n (clientX: number) => {\n const track = trackRef.current\n if (!track) return value\n const rect = track.getBoundingClientRect()\n const ratio = (clientX - rect.left) / rect.width\n return clampAndSnap(min + ratio * (max - min))\n },\n [min, max, value, clampAndSnap]\n )\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (disabled) return\n e.preventDefault()\n const target = e.currentTarget as HTMLElement\n target.setPointerCapture(e.pointerId)\n onChange(valueFromPointer(e.clientX))\n\n const onMove = (ev: PointerEvent) => {\n onChange(valueFromPointer(ev.clientX))\n }\n const onUp = () => {\n target.removeEventListener('pointermove', onMove)\n target.removeEventListener('pointerup', onUp)\n }\n target.addEventListener('pointermove', onMove)\n target.addEventListener('pointerup', onUp)\n },\n [disabled, onChange, valueFromPointer]\n )\n\n return (\n <div className={cn('slider', color, disabled && 'disabled', className)} {...rest}>\n {label && <div className=\"label\">{label}</div>}\n <div className=\"track-wrapper\" ref={trackRef} onPointerDown={handlePointerDown}>\n <div className=\"track\">\n <div className=\"fill\" style={{width: `${percent}%`}} />\n <div className=\"thumb\" style={{left: `${percent}%`}} />\n </div>\n {marks && marks.length > 0 && (\n <div className=\"marks\">\n {marks.map((mark) => {\n const markPercent = ((mark.value - min) / (max - min)) * 100\n return (\n <div\n key={mark.value}\n className=\"mark\"\n style={{left: `${markPercent}%`}}\n >\n <div className=\"tick\" />\n {mark.label && <div className=\"label\">{mark.label}</div>}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import type {CardProps, CardSectionProps} from './Card.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {Surface} from '../../layout/Surface'\nimport './Card.css'\n\n// Compose elevated content blocks that can optionally behave like an interactive surface.\nexport function Card({\n interactive = false,\n stretch = true,\n tone = 'raised',\n padded = false,\n color,\n fcolor,\n clickEffect,\n rippleColor,\n className,\n children,\n onPointerDown,\n ...rest\n}: CardProps) {\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: clickEffect ?? (interactive ? 'ripple' : 'none'),\n disabled: !interactive,\n color: rippleColor,\n })\n\n return (\n <Surface\n tone={tone}\n padded={padded}\n className={cn(\n 'card',\n !stretch && 'no-stretch',\n color,\n ...getAppearanceClassNames({fcolor}),\n interactive && 'interactive',\n effectClassName,\n className\n )}\n onPointerDown={(event) => {\n handlePointerDown(event)\n onPointerDown?.(event)\n }}\n {...rest}\n >\n {effectLayer}\n {children}\n </Surface>\n )\n}\n\n// Render the top section of a card.\nexport function CardHeader({className, children, ...rest}: CardSectionProps) {\n return (\n <div className={cn('header', className)} {...rest}>\n {children}\n </div>\n )\n}\n\n// Render the main content section of a card.\nexport function CardBody({className, children, ...rest}: CardSectionProps) {\n return (\n <div className={cn('body', className)} {...rest}>\n {children}\n </div>\n )\n}\n\n// Render the bottom section of a card.\nexport function CardFooter({className, children, ...rest}: CardSectionProps) {\n return (\n <div className={cn('footer', className)} {...rest}>\n {children}\n </div>\n )\n}\n","import type {BadgeProps} from './Badge.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Badge.css'\n\n// Render a compact semantic label for status and metadata.\nexport function Badge({color = 'primary', size = 'md', fcolor, className, children, ...rest}: BadgeProps) {\n return (\n <span className={cn('badge', color, size, ...getAppearanceClassNames({fcolor}), className)} {...rest}>\n {children}\n </span>\n )\n}\n","import type {AlertProps} from './Alert.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Alert.css'\n\n// Render inline status messaging with optional heading content.\nexport function Alert({color = 'info', fcolor, title, className, children, ...rest}: AlertProps) {\n return (\n <div className={cn('alert', color, ...getAppearanceClassNames({fcolor}), className)} role=\"status\" {...rest}>\n {title && <div className=\"title\">{title}</div>}\n {children && <div className=\"content\">{children}</div>}\n </div>\n )\n}\n","import {useState} from 'react'\nimport {Button} from '../../controls/Button'\nimport {Stack} from '../../layout/Stack'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport type {CollapsibleProps} from './Collapsible.types'\nimport './Collapsible.css'\n\n// Toggle a section of content with a built-in trigger and disclosure state.\nexport function Collapsible({\n title,\n defaultOpen = false,\n open: controlledOpen,\n onToggle,\n fcolor,\n className,\n children,\n ...rest\n}: CollapsibleProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const open = controlledOpen ?? internalOpen\n\n const handleToggle = () => {\n const nextOpen = !open\n\n if (controlledOpen === undefined) {\n setInternalOpen(nextOpen)\n }\n\n onToggle?.(nextOpen)\n }\n\n const chevronIcon = (\n <span className={cn('chevron', open && 'open')} aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\">\n <path\n d=\"M4 6L8 10L12 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )\n\n return (\n <div className={cn('collapsible', ...getAppearanceClassNames({fcolor}), className)} {...rest}>\n <Button\n variant=\"ghost\"\n className=\"trigger\"\n aria-expanded={open}\n onClick={handleToggle}\n endIcon={chevronIcon}\n >\n {title}\n </Button>\n <div className={cn('content-wrap', open && 'open')} aria-hidden={!open}>\n <Stack className=\"content\">{children}</Stack>\n </div>\n </div>\n )\n}\n","import {useState, useCallback, Children, isValidElement} from 'react'\nimport {Collapsible} from '../Collapsible'\nimport {cn} from '../../../utils/cn'\nimport type {AccordionProps, AccordionItemProps} from './Accordion.types'\nimport './Accordion.css'\n\nexport function AccordionItem(_props: AccordionItemProps) {\n return null\n}\n\nexport function Accordion({\n multiple = false,\n defaultOpen,\n onChange,\n bordered = false,\n className,\n children,\n ...rest\n}: AccordionProps) {\n const initialOpen = Array.isArray(defaultOpen)\n ? defaultOpen\n : defaultOpen\n ? [defaultOpen]\n : []\n\n const [openIds, setOpenIds] = useState<string[]>(initialOpen)\n\n const handleToggle = useCallback(\n (id: string, isOpen: boolean) => {\n setOpenIds((prev) => {\n let next: string[]\n if (isOpen) {\n next = multiple ? [...prev, id] : [id]\n } else {\n next = prev.filter((v) => v !== id)\n }\n onChange?.(next)\n return next\n })\n },\n [multiple, onChange]\n )\n\n const items = Children.toArray(children).filter(\n (child) => isValidElement(child) && (child.type as any) === AccordionItem\n )\n\n return (\n <div className={cn('accordion', bordered && 'bordered', className)} {...rest}>\n {items.map((child) => {\n if (!isValidElement<AccordionItemProps>(child)) return null\n const {id, title, children: content, disabled, fcolor} = child.props\n const isOpen = openIds.includes(id)\n\n return (\n <div key={id} className={cn('accordion-item', disabled && 'disabled')}>\n <Collapsible\n title={title}\n open={isOpen}\n onToggle={disabled ? undefined : (open) => handleToggle(id, open)}\n fcolor={fcolor}\n >\n {content}\n </Collapsible>\n </div>\n )\n })}\n </div>\n )\n}\n","import type {CSSProperties} from 'react'\nimport type {SpinnerProps} from './Spinner.types'\nimport {cn} from '../../../utils/cn'\nimport './Spinner.css'\n\n// Render a minimal semantic loading indicator with token-aware sizing and color.\nexport function Spinner({color = 'primary', size = 'md', label = 'Loading', className, style, ...rest}: SpinnerProps) {\n const inlineStyle: CSSProperties =\n typeof size === 'number'\n ? {\n width: `${size}px`,\n height: `${size}px`,\n ...style,\n }\n : style || {}\n\n return (\n <span\n className={cn('spinner', typeof size === 'string' && size, color && `color-${color}`, className)}\n style={inlineStyle}\n role=\"status\"\n aria-label={label}\n {...rest}\n />\n )\n}\n","import type {TextProps} from './Text.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './Text.css'\n\n// Render body copy with shared tone, size and weight controls.\nexport function Text({\n as = 'p',\n tone = 'default',\n size,\n align = 'left',\n color,\n fcolor,\n weight = 'normal',\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n children,\n ...rest\n}: TextProps) {\n const Component = as\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <Component\n className={cn(\n 'text',\n !color && !fcolor && tone,\n size,\n align,\n weight,\n ...getAppearanceClassNames({color, fcolor}),\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={utilityStyle}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type {CSSProperties} from 'react'\nimport {Spinner} from '../Spinner'\nimport {Stack} from '../../layout/Stack'\nimport {Text} from '../../typography/Text'\nimport {cn} from '../../../utils/cn'\nimport type {LoaderProps} from './Loader.types'\nimport './Loader.css'\n\n// Keep loading feedback minimal so apps can reuse it without card or alert chrome.\nexport function Loader({\n color = 'primary',\n size = 'lg',\n label = 'Loading',\n center = true,\n minHeight = '40vh',\n className,\n style,\n ...rest\n}: LoaderProps) {\n const inlineStyle: CSSProperties = {\n minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight,\n ...style,\n }\n\n return (\n <div className={cn('loader', center && 'center', className)} style={inlineStyle} {...rest}>\n <Stack gap={'sm'} align={'center'}>\n <Spinner size={size} color={color} label={label} />\n <Text tone={'muted'} align={'center'}>\n {label}\n </Text>\n </Stack>\n </div>\n )\n}\n","import type {CSSProperties} from 'react'\nimport type {AvatarProps} from './Avatar.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './Avatar.css'\n\nfunction getFallbackInitials(name?: string, initials?: string) {\n if (initials) {\n return initials.slice(0, 2).toUpperCase()\n }\n\n if (!name) {\n return '?'\n }\n\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n\n if (parts.length === 0) {\n return '?'\n }\n\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase()\n }\n\n return `${parts[0][0]}${parts[1][0]}`.toUpperCase()\n}\n\n// Render user or entity identity as an image with initials fallback.\nexport function Avatar({\n src,\n alt,\n name,\n initials,\n size = 'md',\n shape = 'circle',\n color,\n fcolor,\n backgroundColor,\n clickEffect,\n rippleColor,\n className,\n style,\n onPointerDown,\n ...rest\n}: AvatarProps) {\n const fallbackInitials = getFallbackInitials(name, initials)\n const isInteractive = typeof rest.onClick === 'function' || rest.role === 'button' || rest.tabIndex !== undefined\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLSpanElement>({\n effect: clickEffect ?? (isInteractive ? 'ripple' : 'none'),\n disabled: !isInteractive,\n color: rippleColor,\n })\n const inlineStyle: CSSProperties =\n typeof size === 'number'\n ? {\n width: `${size}px`,\n height: `${size}px`,\n ...style,\n ...(backgroundColor ? {backgroundColor} : {}),\n }\n : {\n ...style,\n ...(backgroundColor ? {backgroundColor} : {}),\n }\n\n return (\n <span\n className={cn(\n 'avatar',\n typeof size === 'string' && size,\n shape,\n isInteractive && 'interactive',\n effectClassName,\n ...getAppearanceClassNames({color, fcolor}),\n className\n )}\n style={inlineStyle}\n aria-label={alt ?? name ?? 'Avatar'}\n onPointerDown={(event) => {\n handlePointerDown(event)\n onPointerDown?.(event)\n }}\n {...rest}\n >\n {effectLayer}\n {src ? (\n <img src={src} alt={alt ?? name ?? ''} className={'image'} />\n ) : (\n <span className={'fallback'}>{fallbackInitials}</span>\n )}\n </span>\n )\n}\n","import {useEffect} from 'react'\nimport type {MouseEvent} from 'react'\nimport type {ModalProps} from './Modal.types'\nimport {Portal} from '../../primitives/Portal'\nimport {Card, CardBody, CardFooter, CardHeader} from '../Card'\nimport {cn} from '../../../utils/cn'\nimport './Modal.css'\n\n// Render blocking overlay content for dense details and mobile-friendly dialogs.\nexport function Modal({\n open,\n onClose,\n title,\n description,\n footer,\n size = 'md',\n closeOnBackdrop = true,\n closeOnEscape = true,\n className,\n children,\n ...rest\n}: ModalProps) {\n useEffect(() => {\n if (!open || !closeOnEscape) {\n return\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose()\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [closeOnEscape, onClose, open])\n\n useEffect(() => {\n if (!open) {\n return\n }\n\n const previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n\n return () => {\n document.body.style.overflow = previousOverflow\n }\n }, [open])\n\n if (!open) {\n return null\n }\n\n const handleBackdropClick = (event: MouseEvent<HTMLDivElement>) => {\n if (!closeOnBackdrop) {\n return\n }\n\n if (event.target === event.currentTarget) {\n onClose()\n }\n }\n\n return (\n <Portal>\n <div className={'modal-backdrop'} onMouseDown={handleBackdropClick}>\n <div className={'modal-shell'}>\n <Card\n className={cn('modal', size, className)}\n role={'dialog'}\n aria-modal={'true'}\n aria-labelledby={title ? 'mineral-modal-title' : undefined}\n {...rest}\n >\n {(title || description) && (\n <CardHeader>\n {title && (\n <div id={'mineral-modal-title'} className={'modal-title'}>\n {title}\n </div>\n )}\n {description && <div className={'modal-description'}>{description}</div>}\n </CardHeader>\n )}\n <CardBody>{children}</CardBody>\n {footer && <CardFooter>{footer}</CardFooter>}\n </Card>\n </div>\n </div>\n </Portal>\n )\n}\n","import {createElement} from 'react'\nimport type {HeadingProps} from './Heading.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Heading.css'\n\n// Render semantic heading levels with shared MineralUI typography tokens.\nexport function Heading({level = 2, color, fcolor, className, children, ...rest}: HeadingProps) {\n return createElement(\n `h${level}`,\n {className: cn('heading', `h${level}`, ...getAppearanceClassNames({color, fcolor}), className), ...rest},\n children\n )\n}\n","import type {CodeProps} from './Code.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Code.css'\n\n// Render inline code tokens with semantic color support.\nexport function Code({color, fcolor, className, children, ...rest}: CodeProps) {\n return (\n <code className={cn('code', ...getAppearanceClassNames({color, fcolor}), className)} {...rest}>\n {children}\n </code>\n )\n}\n","import type {HTMLAttributes} from 'react'\nimport type {ListProps} from './List.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './List.css'\n\n// Render ordered or unordered lists with shared typography tokens.\nexport function List({ordered = false, color, fcolor, className, children, ...rest}: ListProps) {\n const Component = ordered ? 'ol' : 'ul'\n\n return (\n <Component\n className={cn('list', ordered && 'ordered', ...getAppearanceClassNames({color, fcolor}), className)}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n\n// Render a list item that inherits the parent list styling.\nexport function ListItem({className, children, ...rest}: HTMLAttributes<HTMLLIElement>) {\n return (\n <li className={cn('item', className)} {...rest}>\n {children}\n </li>\n )\n}\n","import type {SubTextProps} from './SubText.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './SubText.css'\n\n// Render small, muted secondary text for captions, hints and metadata.\nexport function SubText({\n as = 'span',\n size = 'sm',\n fcolor,\n className,\n children,\n ...rest\n}: SubTextProps) {\n const Component = as\n return (\n <Component\n className={cn('subtext', size, ...getAppearanceClassNames({fcolor}), className)}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type {KbdProps} from './Kbd.types'\nimport {cn} from '../../../utils/cn'\nimport './Kbd.css'\n\nexport function Kbd({size = 'md', className, children, ...rest}: KbdProps) {\n return (\n <kbd className={cn('kbd', size, className)} {...rest}>\n {children}\n </kbd>\n )\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\nimport type {ReactNode, RefObject} from 'react'\nimport type {\n CalendarBoardLocale,\n CalendarBoardProps,\n CalendarBoardView,\n CalendarDayCellProps,\n CalendarDetailsMode,\n CalendarEvent,\n CalendarEventItemProps,\n CalendarEventListProps,\n CalendarEventPopoverProps,\n CalendarFilterOption,\n CalendarTimelineProps,\n CalendarTimelineSlotState,\n} from './CalendarBoard.types'\nimport {cn} from '../../../utils/cn'\nimport {Badge} from '../Badge'\nimport {Button} from '../../controls/Button'\nimport {Avatar} from '../Avatar'\nimport {Card, CardBody} from '../Card'\nimport {Modal} from '../Modal'\nimport {Popover} from '../../primitives/Popover'\nimport {Heading, Text} from '../../typography'\nimport {Stack} from '../../layout/Stack'\nimport './CalendarBoard.css'\n\ninterface CalendarCopy {\n monthView: string\n weekView: string\n previousMonth: string\n nextMonth: string\n previousWeek: string\n nextWeek: string\n emptyStateText: string\n timelineTitle: string\n timelineEmptyState: string\n allDay: string\n itemsCount: (count: number) => string\n}\n\ninterface CalendarDetailsContentProps {\n date: Date | null\n events: CalendarEvent[]\n locale: CalendarBoardLocale\n timelineStartHour: number\n timelineEndHour: number\n showTimeline: boolean\n emptyStateText: string\n renderEventItem?: (event: CalendarEvent) => ReactNode\n}\n\ninterface CalendarWeekViewProps {\n days: Date[]\n eventsByDay: Map<string, CalendarEvent[]>\n selectedDate: Date | null\n activeDate: Date | null\n onDayInteract: (date: Date, target: HTMLElement, events: CalendarEvent[]) => void\n onDayHover: (date: Date, target: HTMLElement, events: CalendarEvent[]) => void\n onDayLeave: () => void\n dayBadge?: CalendarBoardProps['dayBadge']\n renderDayCell?: CalendarBoardProps['renderDayCell']\n locale: CalendarBoardLocale\n}\n\nfunction stripTime(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\nfunction normalizeDate(value?: Date | string | null) {\n if (!value) {\n return null\n }\n\n if (value instanceof Date) {\n return stripTime(value)\n }\n\n const parsed = new Date(value)\n if (Number.isNaN(parsed.getTime())) {\n return null\n }\n\n return stripTime(parsed)\n}\n\nfunction getDateKey(date: Date) {\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n\n return `${year}-${month}-${day}`\n}\n\nfunction getEventDate(event: CalendarEvent) {\n return normalizeDate(event.date)\n}\n\nfunction addDays(date: Date, amount: number) {\n const nextDate = new Date(date)\n nextDate.setDate(nextDate.getDate() + amount)\n return stripTime(nextDate)\n}\n\nfunction startOfWeek(date: Date, weekStartsOn: 0 | 1) {\n const safeDate = stripTime(date)\n const day = safeDate.getDay()\n const delta = (day - weekStartsOn + 7) % 7\n return addDays(safeDate, -delta)\n}\n\nfunction sortEventsByTime(events: CalendarEvent[]) {\n return [...events].sort((leftEvent, rightEvent) => {\n const leftTime = leftEvent.startTime ?? '99:99'\n const rightTime = rightEvent.startTime ?? '99:99'\n return leftTime.localeCompare(rightTime)\n })\n}\n\nfunction buildMonthGrid(month: Date, weekStartsOn: 0 | 1) {\n const monthStart = new Date(month.getFullYear(), month.getMonth(), 1)\n const gridStart = startOfWeek(monthStart, weekStartsOn)\n\n return Array.from({length: 42}, (_, index) => addDays(gridStart, index))\n}\n\nfunction getStatusColor(status?: CalendarEvent['status']) {\n switch (status) {\n case 'active':\n return 'rgba(14, 165, 233, 1)'\n case 'done':\n return 'rgba(34, 197, 94, 1)'\n case 'cancelled':\n return 'rgba(239, 68, 68, 1)'\n default:\n return 'rgba(245, 158, 11, 1)'\n }\n}\n\nfunction getCalendarCopy(locale: CalendarBoardLocale): CalendarCopy {\n if (locale === 'pl') {\n return {\n monthView: 'Miesiac',\n weekView: 'Tydzien',\n previousMonth: 'Poprzedni miesiac',\n nextMonth: 'Nastepny miesiac',\n previousWeek: 'Poprzedni tydzien',\n nextWeek: 'Nastepny tydzien',\n emptyStateText: 'Brak zdarzen dla wybranego dnia.',\n timelineTitle: 'Os czasu dnia',\n timelineEmptyState: 'Brak zdarzen w tej godzinie.',\n allDay: 'Caly dzien',\n itemsCount: (count) => `${count} zdarzen`,\n }\n }\n\n return {\n monthView: 'Month',\n weekView: 'Week',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n previousWeek: 'Previous week',\n nextWeek: 'Next week',\n emptyStateText: 'No events for the selected day.',\n timelineTitle: 'Daily timeline',\n timelineEmptyState: 'No events in this hour.',\n allDay: 'All day',\n itemsCount: (count) => `${count} events`,\n }\n}\n\nfunction formatBoardDate(date: Date, locale: CalendarBoardLocale) {\n return new Intl.DateTimeFormat(locale === 'pl' ? 'pl-PL' : 'en-US', {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(date)\n}\n\nfunction formatWeekRange(startDate: Date, locale: CalendarBoardLocale) {\n const endDate = addDays(startDate, 6)\n const formatter = new Intl.DateTimeFormat(locale === 'pl' ? 'pl-PL' : 'en-US', {\n day: 'numeric',\n month: 'short',\n })\n\n return `${formatter.format(startDate)} - ${formatter.format(endDate)}`\n}\n\nfunction formatEventTime(event: CalendarEvent, copy: CalendarCopy) {\n if (event.startTime && event.endTime) {\n return `${event.startTime} - ${event.endTime}`\n }\n\n if (event.startTime) {\n return event.startTime\n }\n\n return copy.allDay\n}\n\nfunction getTimelineSlotState(date: Date, hour: number): CalendarTimelineSlotState {\n const now = new Date()\n const slotStart = new Date(date)\n slotStart.setHours(hour, 0, 0, 0)\n const slotEnd = new Date(slotStart)\n slotEnd.setHours(hour + 1, 0, 0, 0)\n\n if (slotEnd <= now) {\n return 'past'\n }\n\n if (slotStart <= now && slotEnd > now) {\n return 'active'\n }\n\n return 'upcoming'\n}\n\nfunction buildDayMarkers(events: CalendarEvent[]) {\n return sortEventsByTime(events)\n .slice(0, 4)\n .map((event) => (\n <span\n key={event.id}\n className={'marker'}\n style={{background: event.color ?? getStatusColor(event.status)}}\n aria-hidden={'true'}\n />\n ))\n}\n\nfunction applyCalendarFilters(events: CalendarEvent[], filters: CalendarFilterOption[], activeFilterIds: string[]) {\n if (!filters.length || !activeFilterIds.length) {\n return events\n }\n\n const activeFilters = filters.filter((filterOption) => activeFilterIds.includes(filterOption.id))\n if (!activeFilters.length) {\n return events\n }\n\n return events.filter((event) => activeFilters.some((filterOption) => filterOption.predicate(event)))\n}\n\nfunction getViewTitle(month: Date, view: CalendarBoardView, locale: CalendarBoardLocale, weekStartsOn: 0 | 1) {\n if (view === 'week') {\n return formatWeekRange(startOfWeek(month, weekStartsOn), locale)\n }\n\n return new Intl.DateTimeFormat(locale === 'pl' ? 'pl-PL' : 'en-US', {\n month: 'long',\n year: 'numeric',\n }).format(month)\n}\n\nfunction getViewSubtitle(view: CalendarBoardView, copy: CalendarCopy) {\n return view === 'week' ? copy.weekView : copy.monthView\n}\n\nfunction CalendarDetailsContent({\n date,\n events,\n locale,\n timelineStartHour,\n timelineEndHour,\n showTimeline,\n emptyStateText,\n renderEventItem,\n}: CalendarDetailsContentProps) {\n if (!date) {\n return null\n }\n\n return (\n <Stack gap={'md'}>\n <Stack gap={'xs'}>\n <Heading level={4}>{formatBoardDate(date, locale)}</Heading>\n <Text tone={'muted'} size={'sm'}>\n {events.length > 0 ? `${events.length} items` : emptyStateText}\n </Text>\n </Stack>\n <CalendarEventList\n events={events}\n locale={locale}\n currentDate={date}\n emptyStateText={emptyStateText}\n renderEventItem={renderEventItem}\n />\n {showTimeline && (\n <CalendarTimeline\n date={date}\n events={events}\n locale={locale}\n startHour={timelineStartHour}\n endHour={timelineEndHour}\n />\n )}\n </Stack>\n )\n}\n\nfunction CalendarFilters({\n filters,\n activeFilterIds,\n onToggle,\n}: {\n filters: CalendarFilterOption[]\n activeFilterIds: string[]\n onToggle: (filterId: string) => void\n}) {\n if (!filters.length) {\n return null\n }\n\n return (\n <div className={'calendar-board-filters'}>\n {filters.map((filterOption) => {\n const isActive = activeFilterIds.includes(filterOption.id)\n\n return (\n <Button\n key={filterOption.id}\n type={'button'}\n size={'sm'}\n variant={isActive ? 'primary' : 'outlined'}\n color={isActive ? 'primary' : 'neutral'}\n className={'calendar-board-filter-btn'}\n onClick={() => onToggle(filterOption.id)}\n >\n {filterOption.label}\n </Button>\n )\n })}\n </div>\n )\n}\nfunction CalendarWeekView({\n days,\n eventsByDay,\n selectedDate,\n activeDate,\n onDayInteract,\n onDayHover,\n onDayLeave,\n dayBadge,\n renderDayCell,\n locale,\n}: CalendarWeekViewProps) {\n const todayKey = getDateKey(stripTime(new Date()))\n\n return (\n <div className={'calendar-board-week'}>\n {days.map((day) => {\n const dayKey = getDateKey(day)\n const dayEvents = eventsByDay.get(dayKey) ?? []\n const badge =\n dayBadge?.(day, dayEvents) ??\n (dayEvents.length > 0 ? <Badge size={'sm'}>{dayEvents.length}</Badge> : null)\n const markers = buildDayMarkers(dayEvents)\n const isSelected = Boolean(selectedDate && getDateKey(selectedDate) === dayKey)\n const context = {\n date: day,\n events: dayEvents,\n badge,\n isToday: dayKey === todayKey,\n isSelected,\n isOutsideMonth: false,\n }\n\n return (\n <div key={dayKey} className={'calendar-board-week-col'}>\n <CalendarDayCell\n date={day}\n events={dayEvents}\n badge={badge}\n markers={markers}\n isToday={context.isToday}\n isSelected={isSelected || Boolean(activeDate && getDateKey(activeDate) === dayKey)}\n isOutsideMonth={false}\n onClick={(event) => onDayInteract(day, event.currentTarget, dayEvents)}\n onMouseEnter={(event) => onDayHover(day, event.currentTarget, dayEvents)}\n onMouseLeave={onDayLeave}\n >\n {renderDayCell ? renderDayCell(day, context) : undefined}\n </CalendarDayCell>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport function CalendarDayCell({\n date,\n events = [],\n badge,\n markers,\n isToday = false,\n isSelected = false,\n isOutsideMonth = false,\n className,\n children,\n ...rest\n}: CalendarDayCellProps) {\n return (\n <button\n type={'button'}\n className={cn(\n 'calendar-day-cell',\n isToday && 'today',\n isSelected && 'selected',\n isOutsideMonth && 'outside-month',\n className\n )}\n {...rest}\n >\n {children ?? (\n <>\n <div className={'day-header'}>\n <span className={'day-number'}>{date.getDate()}</span>\n <div className={'day-meta'}>{badge}</div>\n </div>\n <div className={'markers'}>{markers ?? buildDayMarkers(events)}</div>\n </>\n )}\n </button>\n )\n}\n\nexport function CalendarEventItem({event, locale = 'en', className, currentDate, ...rest}: CalendarEventItemProps) {\n const copy = getCalendarCopy(locale)\n const statusColor =\n event.status === 'cancelled'\n ? 'error'\n : event.status === 'done'\n ? 'success'\n : event.status === 'active'\n ? 'info'\n : 'warning'\n\n return (\n <div className={cn('calendar-event-item', className)} {...rest}>\n <div className={'event-time'}>{formatEventTime(event, copy)}</div>\n <div className={'event-content'}>\n <div className={'event-title-row'}>\n <Heading level={5}>{event.title}</Heading>\n {event.status && (\n <Badge color={statusColor} size={'sm'}>\n {event.status}\n </Badge>\n )}\n </div>\n {event.description && (\n <Text size={'sm'} tone={'muted'}>\n {event.description}\n </Text>\n )}\n <div className={'event-details'}>\n {event.type && (\n <Badge color={'neutral'} size={'sm'}>\n {event.type}\n </Badge>\n )}\n {event.badgeLabel && <Badge size={'sm'}>{event.badgeLabel}</Badge>}\n {event.user && (\n <span className={'event-user'}>\n <Avatar\n size={'sm'}\n src={event.user.avatar}\n name={event.user.name}\n backgroundColor={event.user.color}\n />\n {event.user.name}\n </span>\n )}\n {!event.startTime && !event.endTime && currentDate && (\n <Text size={'sm'} tone={'muted'}>\n {formatBoardDate(currentDate, locale)}\n </Text>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport function CalendarEventList({\n events,\n locale = 'en',\n currentDate,\n emptyStateText,\n renderEventItem,\n className,\n ...rest\n}: CalendarEventListProps) {\n const copy = getCalendarCopy(locale)\n\n if (!events.length) {\n return (\n <Text size={'sm'} tone={'muted'} className={cn('calendar-event-list', className)} {...rest}>\n {emptyStateText ?? copy.emptyStateText}\n </Text>\n )\n }\n\n return (\n <div className={cn('calendar-event-list', className)} {...rest}>\n <Stack gap={'sm'}>\n {sortEventsByTime(events).map((event) =>\n renderEventItem ? (\n <div key={event.id}>{renderEventItem(event)}</div>\n ) : (\n <CalendarEventItem key={event.id} event={event} locale={locale} currentDate={currentDate} />\n )\n )}\n </Stack>\n </div>\n )\n}\nexport function CalendarTimeline({\n date,\n events,\n locale = 'en',\n startHour = 6,\n endHour = 22,\n emptyStateText,\n className,\n ...rest\n}: CalendarTimelineProps) {\n const copy = getCalendarCopy(locale)\n const hours = Array.from({length: Math.max(endHour - startHour + 1, 1)}, (_, index) => startHour + index)\n\n return (\n <div className={cn('calendar-timeline', className)} {...rest}>\n <Stack gap={'sm'}>\n <Heading level={5}>{copy.timelineTitle}</Heading>\n <div className={'timeline-slots'}>\n {hours.map((hour) => {\n const matchingEvents = events.filter((event) => {\n if (!event.startTime) {\n return false\n }\n\n return Number(event.startTime.split(':')[0]) === hour\n })\n const slotState = getTimelineSlotState(date, hour)\n\n return (\n <div key={hour} className={cn('timeline-slot', slotState)}>\n <div className={'slot-time'}>{`${String(hour).padStart(2, '0')}:00`}</div>\n <div className={'slot-line'} />\n <div className={'slot-content'}>\n {matchingEvents.length > 0 ? (\n <Stack gap={'xs'}>\n {matchingEvents.map((event) => (\n <div key={event.id} className={'slot-event'}>\n <span\n className={'slot-event-dot'}\n style={{\n background: event.color ?? getStatusColor(event.status),\n }}\n />\n <Text size={'sm'}>{event.title}</Text>\n </div>\n ))}\n </Stack>\n ) : (\n <Text size={'sm'} tone={'muted'}>\n {emptyStateText ?? copy.timelineEmptyState}\n </Text>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </Stack>\n </div>\n )\n}\n\nexport function CalendarEventPopover({\n open,\n anchorRef,\n onClose,\n onPointerEnter,\n onPointerLeave,\n date,\n events,\n locale = 'en',\n timelineStartHour = 6,\n timelineEndHour = 22,\n showTimeline = true,\n emptyStateText,\n renderEventItem,\n className,\n style,\n}: CalendarEventPopoverProps) {\n return (\n <Popover\n open={open}\n anchorRef={anchorRef}\n onClose={onClose}\n placement={'bottom-start'}\n className={cn('calendar-board-popover', className)}\n style={style}\n >\n <Card className={'calendar-event-popover'} onPointerEnter={onPointerEnter} onPointerLeave={onPointerLeave}>\n <CardBody>\n <CalendarDetailsContent\n date={date}\n events={events}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? getCalendarCopy(locale).emptyStateText}\n renderEventItem={renderEventItem}\n />\n </CardBody>\n </Card>\n </Popover>\n )\n}\n\nexport function CalendarBoard({\n month,\n defaultMonth,\n onMonthChange,\n events = [],\n locale = 'en',\n weekStartsOn = 1,\n view,\n defaultView = 'month',\n views = ['month', 'week'],\n onViewChange,\n selectedDate,\n defaultSelectedDate,\n onDayClick,\n dayBadge,\n renderDayCell,\n renderEventItem,\n detailsTrigger = 'click',\n detailsMode = 'auto',\n showTimeline = true,\n timelineStartHour = 6,\n timelineEndHour = 22,\n emptyStateText,\n filters = [],\n activeFilters,\n defaultActiveFilters = [],\n onActiveFiltersChange,\n fullWidth = false,\n className,\n ...rest\n}: CalendarBoardProps) {\n const copy = getCalendarCopy(locale)\n const today = stripTime(new Date())\n const [internalMonth, setInternalMonth] = useState(stripTime(defaultMonth ?? month ?? today))\n const [internalView, setInternalView] = useState<CalendarBoardView>(defaultView)\n const [internalSelectedDate, setInternalSelectedDate] = useState<Date | null>(normalizeDate(defaultSelectedDate))\n const [internalActiveFilters, setInternalActiveFilters] = useState<string[]>(defaultActiveFilters)\n const [activeDate, setActiveDate] = useState<Date | null>(null)\n const [detailsOpen, setDetailsOpen] = useState(false)\n const [isCompact, setIsCompact] = useState(false)\n const activeAnchorRef = useRef<HTMLElement | null>(null)\n const closeTimeoutRef = useRef<number | null>(null)\n\n const isMonthControlled = month !== undefined && typeof onMonthChange === 'function'\n const visibleMonth = stripTime(isMonthControlled ? (month ?? internalMonth) : internalMonth)\n const currentView = view ?? internalView\n const resolvedSelectedDate = normalizeDate(selectedDate) ?? internalSelectedDate\n const resolvedActiveFilters = activeFilters ?? internalActiveFilters\n\n useEffect(() => {\n const mediaQuery = window.matchMedia('(max-width: 768px)')\n const updateCompactState = () => setIsCompact(mediaQuery.matches)\n\n updateCompactState()\n mediaQuery.addEventListener('change', updateCompactState)\n\n return () => mediaQuery.removeEventListener('change', updateCompactState)\n }, [])\n\n useEffect(() => {\n if (isMonthControlled && month) {\n setInternalMonth(stripTime(month))\n }\n }, [isMonthControlled, month])\n\n useEffect(() => {\n if (view) {\n setInternalView(view)\n }\n }, [view])\n\n useEffect(() => {\n if (selectedDate !== undefined) {\n setInternalSelectedDate(normalizeDate(selectedDate))\n }\n }, [selectedDate])\n\n useEffect(\n () => () => {\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current)\n }\n },\n []\n )\n\n const filteredEvents = useMemo(\n () => applyCalendarFilters(events, filters, resolvedActiveFilters),\n [events, filters, resolvedActiveFilters]\n )\n\n const eventsByDay = useMemo(() => {\n const nextMap = new Map<string, CalendarEvent[]>()\n\n filteredEvents.forEach((event) => {\n const eventDate = getEventDate(event)\n if (!eventDate) {\n return\n }\n\n const key = getDateKey(eventDate)\n const currentEvents = nextMap.get(key) ?? []\n currentEvents.push(event)\n nextMap.set(key, currentEvents)\n })\n\n return nextMap\n }, [filteredEvents])\n const calendarDays = useMemo(() => {\n if (currentView === 'week') {\n const baseDate = resolvedSelectedDate ?? visibleMonth\n const weekStart = startOfWeek(baseDate, weekStartsOn)\n return Array.from({length: 7}, (_, index) => addDays(weekStart, index))\n }\n\n return buildMonthGrid(visibleMonth, weekStartsOn)\n }, [currentView, resolvedSelectedDate, visibleMonth, weekStartsOn])\n\n const effectiveDetailsMode: CalendarDetailsMode =\n detailsMode === 'auto' ? (isCompact ? 'modal' : 'popover') : detailsMode\n const activeEvents = activeDate ? (eventsByDay.get(getDateKey(activeDate)) ?? []) : []\n const canShowMonthView = views.includes('month')\n const canShowWeekView = views.includes('week')\n\n const setMonthAndNotify = (nextMonth: Date) => {\n const normalizedMonth = stripTime(nextMonth)\n setInternalMonth(normalizedMonth)\n onMonthChange?.(normalizedMonth)\n }\n\n const navigateBy = (amount: number) => {\n if (currentView === 'week') {\n const nextAnchor = addDays(resolvedSelectedDate ?? visibleMonth, amount * 7)\n setMonthAndNotify(nextAnchor)\n setInternalSelectedDate(nextAnchor)\n setActiveDate(nextAnchor)\n setDetailsOpen(false)\n return\n }\n\n const nextMonth = new Date(visibleMonth.getFullYear(), visibleMonth.getMonth() + amount, 1)\n setMonthAndNotify(nextMonth)\n setDetailsOpen(false)\n setActiveDate(null)\n }\n\n const setViewAndNotify = (nextView: CalendarBoardView) => {\n setInternalView(nextView)\n onViewChange?.(nextView)\n }\n\n const setSelectedDateAndNotify = (nextDate: Date, dayEvents: CalendarEvent[]) => {\n const normalizedDate = stripTime(nextDate)\n setInternalSelectedDate(normalizedDate)\n onDayClick?.(normalizedDate, dayEvents)\n }\n\n const clearCloseTimeout = () => {\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current)\n closeTimeoutRef.current = null\n }\n }\n\n const scheduleClose = () => {\n clearCloseTimeout()\n closeTimeoutRef.current = window.setTimeout(() => {\n setDetailsOpen(false)\n }, 180)\n }\n\n const openDetails = (date: Date, target: HTMLElement, dayEvents: CalendarEvent[]) => {\n activeAnchorRef.current = target\n setActiveDate(date)\n setSelectedDateAndNotify(date, dayEvents)\n setDetailsOpen(true)\n }\n\n const handleDayInteract = (date: Date, target: HTMLElement, dayEvents: CalendarEvent[]) => {\n clearCloseTimeout()\n openDetails(date, target, dayEvents)\n\n if (currentView === 'month' && date.getMonth() !== visibleMonth.getMonth()) {\n setMonthAndNotify(new Date(date.getFullYear(), date.getMonth(), 1))\n }\n }\n\n const handleDayHover = (date: Date, target: HTMLElement, dayEvents: CalendarEvent[]) => {\n if (detailsTrigger !== 'hover' || effectiveDetailsMode !== 'popover') {\n return\n }\n\n clearCloseTimeout()\n openDetails(date, target, dayEvents)\n }\n\n const handleFilterToggle = (filterId: string) => {\n const nextFilters = resolvedActiveFilters.includes(filterId)\n ? resolvedActiveFilters.filter((id) => id !== filterId)\n : [...resolvedActiveFilters, filterId]\n\n setInternalActiveFilters(nextFilters)\n onActiveFiltersChange?.(nextFilters)\n }\n\n const dayNameBase = startOfWeek(\n currentView === 'week' ? (resolvedSelectedDate ?? visibleMonth) : visibleMonth,\n weekStartsOn\n )\n\n return (\n <div className={cn('calendar-board', fullWidth && 'full-width', className)} {...rest}>\n <div className={'calendar-board-header'}>\n <Stack gap={'xs'}>\n <Heading level={3}>{getViewTitle(visibleMonth, currentView, locale, weekStartsOn)}</Heading>\n <Text size={'sm'} tone={'muted'}>\n {getViewSubtitle(currentView, copy)}\n </Text>\n </Stack>\n <Stack gap={'sm'} align={'end'}>\n <div className={'calendar-board-actions'}>\n <Button\n type={'button'}\n size={'sm'}\n variant={'outlined'}\n color={'neutral'}\n onClick={() => navigateBy(-1)}\n >\n {currentView === 'week' ? copy.previousWeek : copy.previousMonth}\n </Button>\n <Button\n type={'button'}\n size={'sm'}\n variant={'outlined'}\n color={'neutral'}\n onClick={() => navigateBy(1)}\n >\n {currentView === 'week' ? copy.nextWeek : copy.nextMonth}\n </Button>\n </div>\n {(canShowMonthView || canShowWeekView) && (\n <div className={'calendar-board-views'}>\n {canShowMonthView && (\n <Button\n type={'button'}\n size={'sm'}\n variant={currentView === 'month' ? 'primary' : 'outlined'}\n color={currentView === 'month' ? 'primary' : 'neutral'}\n onClick={() => setViewAndNotify('month')}\n >\n {copy.monthView}\n </Button>\n )}\n {canShowWeekView && (\n <Button\n type={'button'}\n size={'sm'}\n variant={currentView === 'week' ? 'primary' : 'outlined'}\n color={currentView === 'week' ? 'primary' : 'neutral'}\n onClick={() => setViewAndNotify('week')}\n >\n {copy.weekView}\n </Button>\n )}\n </div>\n )}\n </Stack>\n </div>\n\n <CalendarFilters filters={filters} activeFilterIds={resolvedActiveFilters} onToggle={handleFilterToggle} />\n\n <div className={'calendar-board-days'}>\n {Array.from({length: 7}, (_, index) => addDays(dayNameBase, index)).map((day) => (\n <div key={getDateKey(day)} className={'calendar-board-day'}>\n {new Intl.DateTimeFormat(locale === 'pl' ? 'pl-PL' : 'en-US', {weekday: 'short'}).format(day)}\n </div>\n ))}\n </div>\n\n {currentView === 'week' ? (\n <CalendarWeekView\n days={calendarDays}\n eventsByDay={eventsByDay}\n selectedDate={resolvedSelectedDate}\n activeDate={activeDate}\n onDayInteract={handleDayInteract}\n onDayHover={handleDayHover}\n onDayLeave={() => {\n if (detailsTrigger === 'hover' && effectiveDetailsMode === 'popover') {\n scheduleClose()\n }\n }}\n dayBadge={dayBadge}\n renderDayCell={renderDayCell}\n locale={locale}\n />\n ) : (\n <div className={'calendar-board-grid'}>\n {calendarDays.map((day) => {\n const dayKey = getDateKey(day)\n const dayEvents = eventsByDay.get(dayKey) ?? []\n const badge =\n dayBadge?.(day, dayEvents) ??\n (dayEvents.length > 0 ? <Badge size={'sm'}>{dayEvents.length}</Badge> : null)\n const isToday = dayKey === getDateKey(today)\n const isSelected = Boolean(resolvedSelectedDate && dayKey === getDateKey(resolvedSelectedDate))\n const isOutsideMonth = day.getMonth() !== visibleMonth.getMonth()\n const markers = buildDayMarkers(dayEvents)\n const context = {\n date: day,\n events: dayEvents,\n badge,\n isToday,\n isSelected,\n isOutsideMonth,\n }\n\n return (\n <CalendarDayCell\n key={dayKey}\n date={day}\n events={dayEvents}\n badge={badge}\n markers={markers}\n isToday={isToday}\n isSelected={isSelected || Boolean(activeDate && dayKey === getDateKey(activeDate))}\n isOutsideMonth={isOutsideMonth}\n onClick={(event) => handleDayInteract(day, event.currentTarget, dayEvents)}\n onMouseEnter={(event) => handleDayHover(day, event.currentTarget, dayEvents)}\n onMouseLeave={() => {\n if (detailsTrigger === 'hover' && effectiveDetailsMode === 'popover') {\n scheduleClose()\n }\n }}\n >\n {renderDayCell ? renderDayCell(day, context) : undefined}\n </CalendarDayCell>\n )\n })}\n </div>\n )}\n\n {effectiveDetailsMode === 'popover' ? (\n <CalendarEventPopover\n open={detailsOpen && Boolean(activeDate) && Boolean(activeAnchorRef.current)}\n anchorRef={activeAnchorRef as RefObject<HTMLElement | null>}\n onClose={() => setDetailsOpen(false)}\n onPointerEnter={() => clearCloseTimeout()}\n onPointerLeave={() => scheduleClose()}\n date={activeDate}\n events={activeEvents}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? copy.emptyStateText}\n renderEventItem={renderEventItem}\n />\n ) : (\n <Modal\n open={detailsOpen && Boolean(activeDate)}\n onClose={() => setDetailsOpen(false)}\n title={activeDate ? formatBoardDate(activeDate, locale) : undefined}\n description={activeDate ? copy.itemsCount(activeEvents.length) : undefined}\n size={'lg'}\n >\n <CalendarDetailsContent\n date={activeDate}\n events={activeEvents}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? copy.emptyStateText}\n renderEventItem={renderEventItem}\n />\n </Modal>\n )}\n </div>\n )\n}\n","import {useState, useEffect, useRef, useCallback} from 'react'\nimport type {ProgressBarProps} from './ProgressBar.types'\nimport {cn} from '../../../utils/cn'\nimport './ProgressBar.css'\n\nconst DURATION = 800\n\nfunction easeOutCubic(t: number) {\n return 1 - Math.pow(1 - t, 3)\n}\n\n// Render a horizontal bar that fills to represent progress as a percentage.\nexport function ProgressBar({\n value,\n max = 100,\n color = 'primary',\n size = 'md',\n label,\n showValue = false,\n animated = false,\n striped = false,\n className,\n ...rest\n}: ProgressBarProps) {\n const percent = Math.min(100, Math.max(0, (value / max) * 100))\n const [displayPercent, setDisplayPercent] = useState(0)\n const [barPercent, setBarPercent] = useState(0)\n const prevPercent = useRef(0)\n const rafRef = useRef(0)\n\n const animate = useCallback((from: number, to: number) => {\n cancelAnimationFrame(rafRef.current)\n const start = performance.now()\n\n const step = (now: number) => {\n const elapsed = now - start\n const progress = Math.min(elapsed / DURATION, 1)\n const eased = easeOutCubic(progress)\n const current = from + (to - from) * eased\n\n setDisplayPercent(current)\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(step)\n }\n }\n\n // Set bar width immediately for CSS transition\n setBarPercent(to)\n rafRef.current = requestAnimationFrame(step)\n }, [])\n\n useEffect(() => {\n animate(prevPercent.current, percent)\n prevPercent.current = percent\n return () => cancelAnimationFrame(rafRef.current)\n }, [percent, animate])\n\n return (\n <div\n className={cn('progress-bar', color, size, className)}\n role=\"progressbar\"\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={label}\n {...rest}\n >\n {(label || showValue) && (\n <div className=\"progress-bar-header\">\n {label && <span className=\"progress-bar-label\">{label}</span>}\n {showValue && <span className=\"progress-bar-value\">{Math.round(displayPercent)}%</span>}\n </div>\n )}\n <div className=\"progress-bar-track\">\n <div\n className={cn(\n 'progress-bar-fill',\n animated && 'animated',\n striped && 'striped'\n )}\n style={{width: `${barPercent}%`}}\n />\n </div>\n </div>\n )\n}\n","import {useState, useEffect, useRef} from 'react'\nimport type {CountUpProps} from './CountUp.types'\nimport {cn} from '../../../utils/cn'\n\n// Animate a number from a start value to a target, with an easing curve.\nexport function CountUp({\n value,\n from = 0,\n duration = 1000,\n decimals = 0,\n prefix = '',\n suffix = '',\n separator = '',\n className,\n ...rest\n}: CountUpProps) {\n const [display, setDisplay] = useState(from)\n const rafRef = useRef<number>(0)\n const startRef = useRef<number | null>(null)\n\n useEffect(() => {\n const startValue = display\n startRef.current = null\n\n const step = (timestamp: number) => {\n if (startRef.current === null) startRef.current = timestamp\n const elapsed = timestamp - startRef.current\n const progress = Math.min(elapsed / duration, 1)\n const eased = 1 - Math.pow(1 - progress, 3)\n const current = startValue + (value - startValue) * eased\n\n setDisplay(current)\n\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(step)\n }\n }\n\n rafRef.current = requestAnimationFrame(step)\n return () => cancelAnimationFrame(rafRef.current)\n }, [value, duration])\n\n const formatted = formatNumber(display, decimals, separator)\n\n return (\n <span className={cn('count-up', className)} {...rest}>\n {prefix}{formatted}{suffix}\n </span>\n )\n}\n\nfunction formatNumber(num: number, decimals: number, separator: string): string {\n const fixed = num.toFixed(decimals)\n if (!separator) return fixed\n\n const [int, dec] = fixed.split('.')\n const withSep = int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n return dec !== undefined ? `${withSep}.${dec}` : withSep\n}\n","import {useState} from 'react'\nimport type {RatingProps} from './Rating.types'\nimport {cn} from '../../../utils/cn'\nimport './Rating.css'\n\n// Render an interactive star-based rating control.\nexport function Rating({\n value = 0,\n max = 5,\n color = 'warning',\n size = 'md',\n readOnly = false,\n onChange,\n className,\n ...rest\n}: RatingProps) {\n const [hovered, setHovered] = useState<number | null>(null)\n const displayValue = hovered ?? value\n\n const handleClick = (index: number) => {\n if (readOnly) return\n onChange?.(index)\n }\n\n return (\n <div\n className={cn('rating', color, size, readOnly && 'read-only', className)}\n role=\"radiogroup\"\n aria-label=\"Rating\"\n onMouseLeave={() => setHovered(null)}\n {...rest}\n >\n {Array.from({length: max}, (_, i) => {\n const starIndex = i + 1\n const filled = starIndex <= displayValue\n return (\n <button\n key={i}\n type=\"button\"\n className={cn('rating-star', filled && 'filled')}\n onClick={() => handleClick(starIndex)}\n onMouseEnter={() => !readOnly && setHovered(starIndex)}\n aria-label={`${starIndex} star${starIndex > 1 ? 's' : ''}`}\n tabIndex={readOnly ? -1 : 0}\n disabled={readOnly}\n >\n ★\n </button>\n )\n })}\n </div>\n )\n}\n","import {useState} from 'react'\nimport type {BannerProps} from './Banner.types'\nimport {cn} from '../../../utils/cn'\nimport './Banner.css'\n\n// Render a prominent banner for announcements, CTAs or dismissible messages.\nexport function Banner({\n color = 'primary',\n variant = 'filled',\n icon,\n action,\n dismissible = false,\n onDismiss,\n className,\n children,\n ...rest\n}: BannerProps) {\n const [visible, setVisible] = useState(true)\n\n if (!visible) return null\n\n const handleDismiss = () => {\n setVisible(false)\n onDismiss?.()\n }\n\n return (\n <div\n className={cn('banner', color, variant, className)}\n role=\"banner\"\n {...rest}\n >\n {icon && <span className=\"banner-icon\">{icon}</span>}\n <div className=\"banner-content\">{children}</div>\n {action && <div className=\"banner-action\">{action}</div>}\n {dismissible && (\n <button\n className=\"banner-dismiss\"\n onClick={handleDismiss}\n aria-label=\"Dismiss\"\n type=\"button\"\n >\n ✕\n </button>\n )}\n </div>\n )\n}\n","import {useState} from 'react'\nimport type {ImageProps} from './Image.types'\nimport {cn} from '../../../utils/cn'\nimport './Image.css'\n\nconst RATIO_MAP: Record<string, string> = {\n '1:1': '1 / 1',\n '4:3': '4 / 3',\n '16:9': '16 / 9',\n '21:9': '21 / 9',\n}\n\n// Render a styled image with aspect ratio, fit, and optional fallback.\nexport function Image({\n fit = 'cover',\n ratio = 'auto',\n rounded = false,\n bordered = false,\n shadow = false,\n fallback,\n className,\n style,\n onError,\n ...rest\n}: ImageProps) {\n const [errored, setErrored] = useState(false)\n\n const handleError = (e: React.SyntheticEvent<HTMLImageElement>) => {\n if (fallback && !errored) {\n setErrored(true)\n e.currentTarget.src = fallback\n }\n onError?.(e)\n }\n\n const ratioStyle = ratio !== 'auto' && RATIO_MAP[ratio]\n ? {aspectRatio: RATIO_MAP[ratio], ...style}\n : style\n\n return (\n <img\n className={cn(\n 'image',\n fit,\n rounded && 'rounded',\n bordered && 'bordered',\n shadow && 'shadow',\n className\n )}\n style={ratioStyle}\n onError={handleError}\n {...rest}\n />\n )\n}\n","import type {GalleryProps} from './Gallery.types'\nimport {cn} from '../../../utils/cn'\nimport './Gallery.css'\n\n// Render a responsive image grid gallery.\nexport function Gallery({\n items,\n columns = 3,\n gap = 'md',\n rounded = true,\n className,\n ...rest\n}: GalleryProps) {\n return (\n <div\n className={cn('gallery', `columns-${columns}`, `gap-${gap}`, className)}\n {...rest}\n >\n {items.map((item, i) => (\n <figure key={i} className={cn('gallery-item', rounded && 'rounded')}>\n <img\n className=\"gallery-image\"\n src={item.src}\n alt={item.alt || ''}\n loading=\"lazy\"\n />\n {item.caption && (\n <figcaption className=\"gallery-caption\">{item.caption}</figcaption>\n )}\n </figure>\n ))}\n </div>\n )\n}\n","import {useState, useEffect, useCallback, useRef, Children} from 'react'\nimport type {CarouselProps} from './Carousel.types'\nimport {cn} from '../../../utils/cn'\nimport './Carousel.css'\n\n// Render a swipeable content slider with arrows, dots and transition modes.\nexport function Carousel({\n autoPlay = false,\n interval = 5000,\n showDots = true,\n showArrows = true,\n loop = true,\n draggable = true,\n transition = 'slide',\n className,\n children,\n ...rest\n}: CarouselProps) {\n const slides = Children.toArray(children)\n const count = slides.length\n const [active, setActive] = useState(0)\n const [dragOffset, setDragOffset] = useState(0)\n const [isDragging, setIsDragging] = useState(false)\n const dragStartX = useRef(0)\n const trackRef = useRef<HTMLDivElement>(null)\n\n const goTo = useCallback((index: number) => {\n if (loop) {\n setActive((index + count) % count)\n } else {\n setActive(Math.max(0, Math.min(index, count - 1)))\n }\n }, [count, loop])\n\n const prev = useCallback(() => goTo(active - 1), [active, goTo])\n const next = useCallback(() => goTo(active + 1), [active, goTo])\n\n useEffect(() => {\n if (!autoPlay || count <= 1 || isDragging) return\n const timer = setInterval(next, interval)\n return () => clearInterval(timer)\n }, [autoPlay, interval, next, count, isDragging])\n\n const handleDragStart = (clientX: number) => {\n if (!draggable) return\n setIsDragging(true)\n dragStartX.current = clientX\n setDragOffset(0)\n }\n\n const handleDragMove = (clientX: number) => {\n if (!isDragging) return\n const diff = clientX - dragStartX.current\n setDragOffset(diff)\n }\n\n const handleDragEnd = () => {\n if (!isDragging) return\n setIsDragging(false)\n const threshold = 50\n if (dragOffset < -threshold) {\n next()\n } else if (dragOffset > threshold) {\n prev()\n }\n setDragOffset(0)\n }\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (!draggable) return\n e.currentTarget.setPointerCapture(e.pointerId)\n handleDragStart(e.clientX)\n }\n\n const onPointerMove = (e: React.PointerEvent) => {\n handleDragMove(e.clientX)\n }\n\n const onPointerUp = () => {\n handleDragEnd()\n }\n\n if (count === 0) return null\n\n const isFade = transition === 'fade'\n const trackStyle = !isFade\n ? {transform: `translateX(calc(-${active * 100}% + ${isDragging ? dragOffset : 0}px))`}\n : undefined\n\n return (\n <div className={cn('carousel', isFade && 'fade', className)} {...rest}>\n <div\n className=\"carousel-viewport\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n style={{touchAction: draggable ? 'pan-y' : undefined, cursor: draggable ? (isDragging ? 'grabbing' : 'grab') : undefined}}\n >\n <div\n ref={trackRef}\n className={cn('carousel-track', isDragging && 'dragging')}\n style={trackStyle}\n >\n {slides.map((slide, i) => (\n <div\n key={i}\n className={cn(\n 'carousel-slide',\n isFade && i === active && 'active',\n isFade && i !== active && 'hidden'\n )}\n >\n {slide}\n </div>\n ))}\n </div>\n </div>\n\n {showArrows && count > 1 && (\n <>\n <button\n className=\"carousel-arrow carousel-arrow-prev\"\n onClick={prev}\n aria-label=\"Previous slide\"\n type=\"button\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M10 3L5 8L10 13\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <button\n className=\"carousel-arrow carousel-arrow-next\"\n onClick={next}\n aria-label=\"Next slide\"\n type=\"button\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M6 3L11 8L6 13\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </>\n )}\n\n {showDots && count > 1 && (\n <div className=\"carousel-dots\">\n {slides.map((_, i) => (\n <button\n key={i}\n className={cn('carousel-dot', i === active && 'active')}\n onClick={() => goTo(i)}\n aria-label={`Slide ${i + 1}`}\n type=\"button\"\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n","import type {TaskListProps} from './TaskList.types'\nimport {cn} from '../../../utils/cn'\nimport './TaskList.css'\n\n// Render an interactive checklist with toggleable task items.\nexport function TaskList({\n items,\n color = 'primary',\n strikethrough = true,\n onChange,\n className,\n ...rest\n}: TaskListProps) {\n return (\n <div className={cn('task-list', color, className)} role=\"list\" {...rest}>\n {items.map((item) => (\n <label\n key={item.id}\n className={cn(\n 'task-list-item',\n item.checked && 'checked',\n item.disabled && 'disabled'\n )}\n role=\"listitem\"\n >\n <input\n type=\"checkbox\"\n className=\"task-list-checkbox\"\n checked={item.checked ?? false}\n disabled={item.disabled}\n onChange={(e) => onChange?.(item.id, e.target.checked)}\n />\n <span className={cn('task-list-label', item.checked && strikethrough && 'done')}>\n {item.label}\n </span>\n </label>\n ))}\n </div>\n )\n}\n","import type {CardPaymentProps} from './CardPayment.types'\nimport {cn} from '../../../utils/cn'\nimport {detectCardBrand} from '../../../utils/creditCards'\nimport './CardPayment.css'\n\nfunction maskNumber(raw: string): string {\n const digits = raw.replace(/\\D/g, '')\n if (digits.length <= 4) return digits\n const last4 = digits.slice(-4)\n return `\\u2022\\u2022\\u2022\\u2022 \\u2022\\u2022\\u2022\\u2022 \\u2022\\u2022\\u2022\\u2022 ${last4}`\n}\n\n// Display-only payment card with balance, masked number, holder name and brand badge.\nexport function CardPayment({\n holder,\n number,\n expiry,\n brand,\n brandIcon,\n balance,\n balanceLabel = 'Current balance',\n color,\n className,\n ...rest\n}: CardPaymentProps) {\n const detected = brand ?? detectCardBrand(number).brand\n const masked = maskNumber(number)\n const brandLabel = detectCardBrand(number).iconLabel\n\n return (\n <div className={cn('card-payment', className)} {...rest}>\n {balance !== undefined && (\n <div>\n <p className=\"cp-balance-label\">{balanceLabel}</p>\n <p className=\"cp-balance\">{balance}</p>\n </div>\n )}\n\n <div className=\"cp-row\">\n <span className={cn('cp-brand', !brandIcon && detected)}>\n {brandIcon ?? brandLabel}\n </span>\n <span className=\"cp-number\">{masked}</span>\n </div>\n\n <div className=\"cp-details\">\n <div>\n <p className=\"cp-field-label\">Card holder</p>\n <p className=\"cp-field-value\">{holder}</p>\n </div>\n <div>\n <p className=\"cp-field-label\">Expiration date</p>\n <p className=\"cp-field-value\">{expiry}</p>\n </div>\n </div>\n </div>\n )\n}\n","import {useRef, useState} from 'react'\nimport type {TooltipProps} from './Tooltip.types'\nimport {cn} from '../../../utils/cn'\nimport './Tooltip.css'\n\n// Lightweight tooltip shown on hover or focus around a child element.\nexport function Tooltip({\n content,\n placement = 'top',\n delay = 0,\n className,\n children,\n ...rest\n}: TooltipProps) {\n const [visible, setVisible] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n function show() {\n if (delay > 0) {\n timeoutRef.current = setTimeout(() => setVisible(true), delay)\n } else {\n setVisible(true)\n }\n }\n\n function hide() {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n setVisible(false)\n }\n\n return (\n <div\n className={cn('tooltip-wrapper', className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n {...rest}\n >\n {children}\n {visible && (\n <div className={cn('tooltip-bubble', placement)} role=\"tooltip\">\n {content}\n </div>\n )}\n </div>\n )\n}\n","import {createContext, useContext} from 'react'\nimport type {ToastContext as ToastContextType} from './Toast.types'\n\nconst ToastCtx = createContext<ToastContextType | null>(null)\n\nexport const ToastContextProvider = ToastCtx.Provider\n\nexport function useToast(): ToastContextType {\n const ctx = useContext(ToastCtx)\n if (!ctx) throw new Error('useToast must be used inside ToastProvider')\n return ctx\n}\n","import {useEffect, useState} from 'react'\nimport type {ToastEntry} from './Toast.types'\nimport {cn} from '../../../utils/cn'\n\n// Single toast notification with enter/exit animation.\nexport function ToastItem({entry, onDismiss}: {entry: ToastEntry; onDismiss: (id: string) => void}) {\n const [exiting, setExiting] = useState(false)\n const duration = entry.duration ?? 4000\n\n useEffect(() => {\n if (duration <= 0) return\n const timer = setTimeout(() => setExiting(true), duration)\n return () => clearTimeout(timer)\n }, [duration])\n\n function handleEnd() {\n if (exiting) onDismiss(entry.id)\n }\n\n return (\n <div\n className={cn('toast-item', entry.color || 'info', exiting && 'exit')}\n role=\"status\"\n onAnimationEnd={handleEnd}\n >\n {entry.title && <div className=\"title\">{entry.title}</div>}\n <div className=\"message\">{entry.message}</div>\n <button className=\"close\" onClick={() => setExiting(true)} aria-label=\"Close\">×</button>\n </div>\n )\n}\n","import {useCallback, useMemo, useRef, useState} from 'react'\nimport {Portal} from '../../primitives/Portal'\nimport {ToastContextProvider, useToast} from './ToastContext'\nimport {ToastItem} from './ToastItem'\nimport type {ToastEntry, ToastOptions, ToastProviderProps} from './Toast.types'\nimport {cn} from '../../../utils/cn'\nimport './Toast.css'\n\nlet counter = 0\n\n// Global toast container with auto-dismiss and stacking.\nexport function ToastProvider({position = 'top-right', duration = 4000, children}: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastEntry[]>([])\n const defaultDuration = useRef(duration)\n defaultDuration.current = duration\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id))\n }, [])\n\n const toast = useCallback((options: ToastOptions) => {\n const id = `toast-${++counter}`\n const entry: ToastEntry = {\n id,\n ...options,\n duration: options.duration ?? defaultDuration.current,\n }\n setToasts((prev) => [...prev, entry])\n return id\n }, [])\n\n const ctx = useMemo(() => ({toast, dismiss}), [toast, dismiss])\n\n return (\n <ToastContextProvider value={ctx}>\n {children}\n <Portal>\n <div className={cn('toast-container', position)}>\n {toasts.map((entry) => (\n <ToastItem key={entry.id} entry={entry} onDismiss={dismiss} />\n ))}\n </div>\n </Portal>\n </ToastContextProvider>\n )\n}\n\nexport {useToast}\n","import type {TagProps} from './Tag.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Tag.css'\n\nexport function Tag({\n label,\n color = 'primary',\n variant = 'solid',\n closable = false,\n onClose,\n icon,\n fcolor,\n className,\n ...rest\n}: TagProps) {\n return (\n <span\n className={cn('m-tag', color, variant, ...getAppearanceClassNames({fcolor}), className)}\n {...rest}\n >\n {icon && <span className=\"m-tag-icon\">{icon}</span>}\n <span className=\"m-tag-label\">{label}</span>\n {closable && (\n <button\n type=\"button\"\n className=\"m-tag-close\"\n onClick={(e) => {\n e.stopPropagation()\n onClose?.()\n }}\n aria-label=\"Remove\"\n >\n ×\n </button>\n )}\n </span>\n )\n}\n","import {useEffect} from 'react'\nimport type {MouseEvent} from 'react'\nimport type {DrawerProps} from './Drawer.types'\nimport {Portal} from '../../primitives/Portal'\nimport {cn} from '../../../utils/cn'\nimport './Drawer.css'\n\nexport function Drawer({\n open,\n onClose,\n side = 'right',\n size = 'md',\n title,\n overlay = true,\n closeOnBackdrop = true,\n closeOnEscape = true,\n className,\n children,\n ...rest\n}: DrawerProps) {\n useEffect(() => {\n if (!open || !closeOnEscape) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, closeOnEscape, onClose])\n\n useEffect(() => {\n if (!open) return\n\n const prev = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = prev\n }\n }, [open])\n\n if (!open) return null\n\n const handleBackdropClick = (e: MouseEvent<HTMLDivElement>) => {\n if (closeOnBackdrop && e.target === e.currentTarget) onClose()\n }\n\n return (\n <Portal>\n <div\n className={cn('drawer-backdrop', overlay && 'overlay')}\n onMouseDown={handleBackdropClick}\n >\n <div\n className={cn('drawer', side, size, className)}\n role=\"dialog\"\n aria-modal=\"true\"\n {...rest}\n >\n {title && (\n <div className=\"header\">\n <div className=\"title\">{title}</div>\n <button type=\"button\" className=\"close\" onClick={onClose} aria-label=\"Close\">\n ×\n </button>\n </div>\n )}\n <div className=\"body\">{children}</div>\n </div>\n </div>\n </Portal>\n )\n}\n","import {useCallback} from 'react'\nimport type {PopconfirmProps} from './Popconfirm.types'\nimport {Popover} from '../../primitives/Popover'\nimport {cn} from '../../../utils/cn'\nimport './Popconfirm.css'\n\nexport function Popconfirm({\n title,\n description,\n onConfirm,\n onCancel,\n confirmText = 'Yes',\n cancelText = 'No',\n color = 'warning',\n icon,\n placement = 'top-start',\n open,\n onOpenChange,\n anchorRef,\n className,\n}: PopconfirmProps) {\n const handleCancel = useCallback(() => {\n onOpenChange(false)\n onCancel?.()\n }, [onOpenChange, onCancel])\n\n const handleConfirm = useCallback(() => {\n onOpenChange(false)\n onConfirm()\n }, [onOpenChange, onConfirm])\n\n return (\n <Popover\n open={open}\n anchorRef={anchorRef}\n onClose={handleCancel}\n placement={placement}\n className={cn('popconfirm', color, className)}\n >\n <div className=\"body\">\n {icon && <div className=\"icon\">{icon}</div>}\n <div className=\"content\">\n <div className=\"title\">{title}</div>\n {description && (\n <div className=\"description\">{description}</div>\n )}\n </div>\n </div>\n <div className=\"actions\">\n <button\n type=\"button\"\n className=\"btn cancel\"\n onClick={handleCancel}\n >\n {cancelText}\n </button>\n <button\n type=\"button\"\n className=\"btn confirm\"\n onClick={handleConfirm}\n >\n {confirmText}\n </button>\n </div>\n </Popover>\n )\n}\n","import {useMemo, useState} from 'react'\nimport type {DataTableProps, DataTableSort} from './DataTable.types'\nimport {Checkbox} from '../../controls/Checkbox'\nimport {MPagination} from '../../layout/MPagination'\nimport {cn} from '../../../utils/cn'\nimport './DataTable.css'\n\nfunction getRowKey<T>(row: T, index: number, rowKey?: string | ((row: T, index: number) => string)): string {\n if (typeof rowKey === 'function') return rowKey(row, index)\n if (typeof rowKey === 'string') return String((row as any)[rowKey])\n return String((row as any).id ?? index)\n}\n\nexport function DataTable<T = any>({\n columns,\n data,\n rowKey,\n sortable = false,\n filterable = false,\n selectable = false,\n pagination = false,\n pageSize = 10,\n striped = false,\n compact = false,\n stickyHeader = false,\n sort: controlledSort,\n onSortChange,\n selectedKeys: controlledSelected,\n onSelectionChange,\n emptyText = 'No data',\n filterPlaceholder = 'Filter…',\n className,\n ...rest\n}: DataTableProps<T>) {\n const [internalSort, setInternalSort] = useState<DataTableSort | null>(null)\n const [internalSelected, setInternalSelected] = useState<string[]>([])\n const [filter, setFilter] = useState('')\n const [page, setPage] = useState(0)\n\n const activeSort = controlledSort !== undefined ? controlledSort : internalSort\n const selected = controlledSelected ?? internalSelected\n const setSelected = onSelectionChange ?? setInternalSelected\n\n function handleSort(key: string) {\n let next: DataTableSort | null\n if (activeSort?.key === key) {\n next = activeSort.dir === 'asc' ? {key, dir: 'desc'} : null\n } else {\n next = {key, dir: 'asc'}\n }\n if (onSortChange) onSortChange(next)\n else setInternalSort(next)\n setPage(0)\n }\n\n const filtered = useMemo(() => {\n if (!filterable || !filter.trim()) return data\n const lc = filter.toLowerCase()\n return data.filter((row) =>\n columns.some((col) => {\n if (col.filterable === false) return false\n const val = (row as any)[col.key]\n return val != null && String(val).toLowerCase().includes(lc)\n })\n )\n }, [data, filter, filterable, columns])\n\n const sorted = useMemo(() => {\n if (!activeSort) return filtered\n const col = columns.find((c) => c.key === activeSort.key)\n if (!col?.sortable && !sortable) return filtered\n const dir = activeSort.dir === 'asc' ? 1 : -1\n return [...filtered].sort((a, b) => {\n const va = (a as any)[activeSort.key]\n const vb = (b as any)[activeSort.key]\n if (va == null && vb == null) return 0\n if (va == null) return 1\n if (vb == null) return -1\n if (typeof va === 'number' && typeof vb === 'number') return (va - vb) * dir\n return String(va).localeCompare(String(vb)) * dir\n })\n }, [filtered, activeSort, columns, sortable])\n\n const totalPages = pagination ? Math.max(1, Math.ceil(sorted.length / pageSize)) : 1\n const pageData = pagination ? sorted.slice(page * pageSize, (page + 1) * pageSize) : sorted\n\n const allKeys = pageData.map((row, i) => getRowKey(row, page * pageSize + i, rowKey))\n const allSelected = allKeys.length > 0 && allKeys.every((k) => selected.includes(k))\n\n function toggleAll() {\n if (allSelected) {\n setSelected(selected.filter((k) => !allKeys.includes(k)))\n } else {\n setSelected([...new Set([...selected, ...allKeys])])\n }\n }\n\n function toggleRow(key: string) {\n setSelected(selected.includes(key) ? selected.filter((k) => k !== key) : [...selected, key])\n }\n\n function handleRowClick(key: string, e: React.MouseEvent) {\n const target = e.target as HTMLElement\n if (target.closest('button, a, [data-no-row-select]')) return\n toggleRow(key)\n }\n\n return (\n <div className={cn('data-table', className)} {...rest}>\n {filterable && (\n <div className=\"toolbar\">\n <input\n type=\"text\"\n className=\"filter\"\n placeholder={filterPlaceholder}\n value={filter}\n onChange={(e) => {\n setFilter(e.target.value)\n setPage(0)\n }}\n />\n </div>\n )}\n <div className=\"scroll\">\n <table className={cn('root', striped && 'striped', compact && 'compact')}>\n <thead className={cn('head', stickyHeader && 'sticky')}>\n <tr>\n {selectable && (\n <th className=\"th check-col\">\n <Checkbox\n checked={allSelected}\n onChange={toggleAll}\n size=\"sm\"\n clickEffect=\"none\"\n />\n </th>\n )}\n {columns.map((col) => {\n const isSortable = col.sortable ?? sortable\n const isSorted = activeSort?.key === col.key\n return (\n <th\n key={col.key}\n className={cn(\n 'th',\n isSortable && 'sortable',\n isSorted && `sorted-${activeSort!.dir}`\n )}\n style={{\n width: col.width,\n textAlign: col.align,\n }}\n onClick={isSortable ? () => handleSort(col.key) : undefined}\n >\n <span className=\"th-content\">\n {col.label}\n {isSortable && (\n <span className=\"sort-icon\">\n {isSorted ? (activeSort!.dir === 'asc' ? '▲' : '▼') : '⇅'}\n </span>\n )}\n </span>\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {pageData.length === 0 && (\n <tr>\n <td\n className=\"empty\"\n colSpan={columns.length + (selectable ? 1 : 0)}\n >\n {emptyText}\n </td>\n </tr>\n )}\n {pageData.map((row, i) => {\n const key = getRowKey(row, page * pageSize + i, rowKey)\n const isSelected = selected.includes(key)\n return (\n <tr\n key={key}\n className={cn('row', isSelected && 'selected', selectable && 'selectable')}\n onClick={selectable ? (e) => handleRowClick(key, e) : undefined}\n >\n {selectable && (\n <td className=\"td check-col\">\n <Checkbox\n checked={isSelected}\n onChange={() => {}}\n size=\"sm\"\n clickEffect=\"none\"\n />\n </td>\n )}\n {columns.map((col) => (\n <td\n key={col.key}\n className=\"td\"\n style={{textAlign: col.align}}\n >\n {col.render\n ? col.render((row as any)[col.key], row, page * pageSize + i)\n : (row as any)[col.key]}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n {pagination && totalPages > 1 && (\n <MPagination\n total={sorted.length}\n page={page + 1}\n pageSize={pageSize}\n onChange={(p) => setPage(p - 1)}\n />\n )}\n </div>\n )\n}\n","import {useCallback, useEffect, useRef, useState} from 'react'\nimport type {ColorPickerProps} from './ColorPicker.types'\nimport {cn} from '../../../utils/cn'\nimport './ColorPicker.css'\n\nfunction hsvToHex(h: number, s: number, v: number): string {\n const f = (n: number) => {\n const k = (n + h / 60) % 6\n return v - v * s * Math.max(0, Math.min(k, 4 - k, 1))\n }\n const r = Math.round(f(5) * 255)\n const g = Math.round(f(3) * 255)\n const b = Math.round(f(1) * 255)\n return `#${[r, g, b].map((c) => c.toString(16).padStart(2, '0')).join('')}`\n}\n\nfunction hexToHsv(hex: string): [number, number, number] {\n const m = hex.replace('#', '').match(/.{2}/g)\n if (!m) return [0, 0, 1]\n const [r, g, b] = m.map((c) => parseInt(c, 16) / 255)\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const d = max - min\n let h = 0\n if (d !== 0) {\n if (max === r) h = ((g - b) / d + 6) % 6\n else if (max === g) h = (b - r) / d + 2\n else h = (r - g) / d + 4\n h *= 60\n }\n const s = max === 0 ? 0 : d / max\n return [h, s, max]\n}\n\nfunction hexToRgb(hex: string): string {\n const m = hex.replace('#', '').match(/.{2}/g)\n if (!m) return 'rgb(0, 0, 0)'\n const [r, g, b] = m.map((c) => parseInt(c, 16))\n return `rgb(${r}, ${g}, ${b})`\n}\n\nfunction hexToHsl(hex: string): string {\n const m = hex.replace('#', '').match(/.{2}/g)\n if (!m) return 'hsl(0, 0%, 0%)'\n const [r, g, b] = m.map((c) => parseInt(c, 16) / 255)\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n let h = 0\n let s = 0\n if (max !== min) {\n const d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n if (max === r) h = ((g - b) / d + 6) % 6\n else if (max === g) h = (b - r) / d + 2\n else h = (r - g) / d + 4\n h *= 60\n }\n return `hsl(${Math.round(h)}, ${Math.round(s * 100)}%, ${Math.round(l * 100)}%)`\n}\n\nfunction formatOutput(hex: string, format: string): string {\n if (format === 'rgb') return hexToRgb(hex)\n if (format === 'hsl') return hexToHsl(hex)\n return hex\n}\n\nfunction normalizeToHex(value: string): string {\n if (!value) return '#000000'\n if (value.startsWith('#')) return value.length === 7 ? value : '#000000'\n const rgbMatch = value.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/)\n if (rgbMatch) {\n return `#${[rgbMatch[1], rgbMatch[2], rgbMatch[3]]\n .map((c) => parseInt(c).toString(16).padStart(2, '0'))\n .join('')}`\n }\n return '#000000'\n}\n\nconst DEFAULT_SWATCHES = [\n '#ef4444', '#f97316', '#eab308', '#22c55e', '#06b6d4',\n '#3b82f6', '#8b5cf6', '#ec4899', '#000000', '#ffffff',\n]\n\nexport function ColorPicker({\n value,\n onChange,\n swatches = DEFAULT_SWATCHES,\n format = 'hex',\n size = 'md',\n label,\n disabled = false,\n className,\n ...rest\n}: ColorPickerProps) {\n const hex = normalizeToHex(value ?? '#3b82f6')\n const [hsv, setHsv] = useState<[number, number, number]>(() => hexToHsv(hex))\n const [inputValue, setInputValue] = useState(formatOutput(hex, format))\n const areaRef = useRef<HTMLDivElement>(null)\n const hueRef = useRef<HTMLDivElement>(null)\n const dragging = useRef<'area' | 'hue' | null>(null)\n\n useEffect(() => {\n const newHex = normalizeToHex(value ?? '#3b82f6')\n setHsv(hexToHsv(newHex))\n setInputValue(formatOutput(newHex, format))\n }, [value, format])\n\n const emit = useCallback(\n (h: number, s: number, v: number) => {\n const newHex = hsvToHex(h, s, v)\n setHsv([h, s, v])\n setInputValue(formatOutput(newHex, format))\n onChange?.(formatOutput(newHex, format))\n },\n [onChange, format]\n )\n\n function handleAreaPointer(e: React.PointerEvent | PointerEvent) {\n const rect = areaRef.current?.getBoundingClientRect()\n if (!rect) return\n const s = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n const v = Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height))\n emit(hsv[0], s, v)\n }\n\n function handleHuePointer(e: React.PointerEvent | PointerEvent) {\n const rect = hueRef.current?.getBoundingClientRect()\n if (!rect) return\n const h = Math.max(0, Math.min(360, ((e.clientX - rect.left) / rect.width) * 360))\n emit(h, hsv[1], hsv[2])\n }\n\n useEffect(() => {\n function onMove(e: PointerEvent) {\n if (dragging.current === 'area') handleAreaPointer(e)\n else if (dragging.current === 'hue') handleHuePointer(e)\n }\n function onUp() {\n dragging.current = null\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n return () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n })\n\n function handleInputChange(val: string) {\n setInputValue(val)\n try {\n const h = normalizeToHex(val)\n if (h !== '#000000' || val === '#000000' || val.toLowerCase() === 'rgb(0, 0, 0)') {\n setHsv(hexToHsv(h))\n onChange?.(formatOutput(h, format))\n }\n } catch {\n // ignore invalid input while typing\n }\n }\n\n const currentHex = hsvToHex(hsv[0], hsv[1], hsv[2])\n\n return (\n <div className={cn('color-picker', size, disabled && 'disabled', className)} {...rest}>\n {label && <label className=\"label\">{label}</label>}\n\n <div\n ref={areaRef}\n className=\"area\"\n style={{background: `hsl(${hsv[0]}, 100%, 50%)`}}\n onPointerDown={(e) => {\n if (disabled) return\n dragging.current = 'area'\n handleAreaPointer(e)\n }}\n >\n <div className=\"white\" />\n <div className=\"black\" />\n <div\n className=\"cursor\"\n style={{\n left: `${hsv[1] * 100}%`,\n top: `${(1 - hsv[2]) * 100}%`,\n background: currentHex,\n }}\n />\n </div>\n\n <div\n ref={hueRef}\n className=\"hue\"\n onPointerDown={(e) => {\n if (disabled) return\n dragging.current = 'hue'\n handleHuePointer(e)\n }}\n >\n <div\n className=\"hue-thumb\"\n style={{left: `${(hsv[0] / 360) * 100}%`}}\n />\n </div>\n\n <div className=\"controls\">\n <div className=\"preview\" style={{background: currentHex}} />\n <input\n type=\"text\"\n className=\"input\"\n value={inputValue}\n onChange={(e) => handleInputChange(e.target.value)}\n disabled={disabled}\n />\n </div>\n\n {swatches.length > 0 && (\n <div className=\"swatches\">\n {swatches.map((swatch) => (\n <button\n key={swatch}\n type=\"button\"\n className={cn('swatch', currentHex.toLowerCase() === swatch.toLowerCase() && 'active')}\n style={{background: swatch}}\n onClick={() => {\n if (disabled) return\n const [h, s, v] = hexToHsv(swatch)\n emit(h, s, v)\n }}\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n","import {useState} from 'react'\nimport type {TreeViewProps, TreeItemProps, TreeNode} from './TreeView.types'\nimport {cn} from '../../../utils/cn'\nimport './TreeView.css'\n\nfunction TreeItem({\n node,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n onToggle,\n onSelect,\n indent,\n}: TreeItemProps) {\n const hasChildren = node.children && node.children.length > 0\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'tree-item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable'\n )}\n style={{paddingLeft: level * indent}}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>▶</span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {node.icon && <span className=\"icon\">{node.icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul className=\"list\" role=\"group\">\n {node.children!.map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n onToggle={onToggle}\n onSelect={onSelect}\n indent={indent}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\nexport function TreeView({\n items,\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n indent = 20,\n className,\n ...rest\n}: TreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id)\n ? expandedArr.filter((e) => e !== id)\n : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: TreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n return (\n <div className={cn('tree-view', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n indent={indent}\n />\n ))}\n </ul>\n </div>\n )\n}\n","import {useCallback, useState} from 'react'\n\ntype ControllableStringLike = string | number | readonly string[] | null | undefined\n\nfunction normalizeStringValue(value: ControllableStringLike) {\n if (value === null || value === undefined) {\n return ''\n }\n\n return value.toString()\n}\n\n// Share controlled and uncontrolled string state logic between text-like primitives.\nexport function useControllableString(value: ControllableStringLike, defaultValue?: ControllableStringLike) {\n const [internalValue, setInternalValue] = useState(() => normalizeStringValue(defaultValue))\n const isControlled = value !== undefined\n const currentValue = isControlled ? normalizeStringValue(value) : internalValue\n\n const setCurrentValue = useCallback(\n (nextValue: string) => {\n if (!isControlled) {\n setInternalValue(nextValue)\n }\n },\n [isControlled]\n )\n\n return {\n isControlled,\n currentValue,\n setCurrentValue,\n }\n}\n","import {forwardRef, useCallback, useRef, useState} from 'react'\nimport type {InputProps} from './Input.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {useGhostText} from '../../../utils/useGhostText'\nimport './Input.css'\n\n// Render the base text input used by all specialized input wrappers.\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n type = 'text',\n value,\n defaultValue,\n name,\n id,\n placeholder,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n autoComplete,\n inputMode,\n variant = 'outlined',\n size = 'md',\n color,\n fcolor,\n fullWidth = false,\n rounded = false,\n label,\n helperText,\n errorText,\n startIcon,\n endIcon,\n clearable = false,\n error = false,\n success = false,\n maxLength,\n showCharCount = false,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n onClear,\n ghostOptions,\n ghostMinChars = 2,\n onGhostAccept,\n loading = false,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n inputClassName,\n labelClassName,\n },\n ref\n) {\n const [focused, setFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: clickEffect,\n disabled: disabled || readOnly,\n color: rippleColor,\n })\n\n const {isControlled, currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n const ghost = useGhostText({\n options: ghostOptions ?? [],\n value: currentValue,\n minChars: ghostMinChars,\n })\n const hasError = error || !!errorText\n const hasContent = currentValue.length > 0\n\n // Mirror focus state so the wrapper can style the input consistently.\n const handleFocus = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true)\n onFocus?.(event)\n },\n [onFocus]\n )\n\n // Clear focus styles before delegating to the caller.\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false)\n onBlur?.(event)\n },\n [onBlur]\n )\n\n // Keep uncontrolled usage working without blocking controlled integrations.\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setCurrentValue(event.target.value)\n onChange?.(event)\n ghost.reset()\n },\n [onChange, setCurrentValue, ghost.reset]\n )\n\n // Intercept keyboard events for ghost text acceptance before delegating.\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (ghostOptions && ghost.hint) {\n const accepted = ghost.onKeyDown(event)\n if (accepted) {\n const result = ghost.accept()\n setCurrentValue(result.value)\n onGhostAccept?.(result.value)\n // Fire synthetic change so controlled parents stay in sync.\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input) {\n const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n nativeSet?.call(input, result.value)\n input.dispatchEvent(new Event('input', {bubbles: true}))\n }\n return\n }\n }\n onKeyDown?.(event)\n },\n [ghostOptions, ghost, setCurrentValue, onGhostAccept, onKeyDown, ref]\n )\n\n // Reset the visible value while preserving focus for quick repeated input.\n const handleClear = useCallback(() => {\n setCurrentValue('')\n\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input && isControlled) {\n input.value = ''\n }\n\n onClear?.()\n input?.focus()\n }, [isControlled, onClear, ref, setCurrentValue])\n\n const containerClasses = cn(\n 'container',\n variant,\n size,\n focused && 'focused',\n hasError && 'input-error',\n success && !hasError && 'input-success',\n color === 'neutral' && 'color-neutral',\n color === 'success' && 'color-success',\n color === 'error' && 'color-error',\n color === 'warning' && 'color-warning',\n color === 'info' && 'color-info',\n disabled && 'disabled',\n rounded && 'rounded',\n effectClassName\n )\n\n return (\n <div\n className={cn('input', ...getAppearanceClassNames({fcolor}), fullWidth && 'full-width', className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'label',\n focused && 'focused',\n hasError && 'error',\n success && !hasError && 'success',\n required && 'required',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className={containerClasses} onPointerDown={handlePointerDown}>\n {effectLayer}\n {startIcon && <span className=\"start-icon\">{startIcon}</span>}\n\n {ghostOptions ? (\n <div className=\"ghost-text-field\">\n <input\n ref={ref ?? inputRef}\n type={type}\n value={currentValue}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n autoComplete={autoComplete ?? 'off'}\n inputMode={inputMode}\n maxLength={maxLength}\n className={cn('field', inputClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n {focused && ghost.hint && (\n <span className=\"ghost-text-overlay\" aria-hidden=\"true\">\n <span className=\"ghost-text-typed\">{currentValue}</span>\n <span className=\"ghost-text-hint\">{ghost.hint}</span>\n </span>\n )}\n </div>\n ) : (\n <input\n ref={ref ?? inputRef}\n type={type}\n value={currentValue}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n inputMode={inputMode}\n maxLength={maxLength}\n className={cn('field', inputClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n )}\n\n {loading && <span className=\"spinner\" />}\n\n {clearable && hasContent && !loading && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear input\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n\n {endIcon && !loading && <span className=\"end-icon\">{endIcon}</span>}\n </div>\n\n {(errorText || helperText || showCharCount) && (\n <div className=\"bottom-row\">\n <span>\n {errorText && (\n <span id={id ? `${id}-error` : undefined} className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n )}\n {!errorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className=\"helper-text\">\n {helperText}\n </span>\n )}\n </span>\n {showCharCount && maxLength && (\n <span className={cn('char-count', currentValue.length > maxLength && 'over')}>\n {currentValue.length}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n )\n})\n","import {useState, useRef, useCallback, useEffect, forwardRef} from 'react'\nimport type {TextareaProps} from './Textarea.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport {useGhostText} from '../../../utils/useGhostText'\nimport './Textarea.css'\n\n// Render the multiline text input with optional auto-resize behavior.\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n {\n value,\n defaultValue,\n name,\n id,\n placeholder,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n rows = 3,\n autoResize = false,\n minRows,\n maxRows,\n variant = 'outlined',\n size = 'md',\n color,\n fcolor,\n fullWidth = false,\n label,\n helperText,\n errorText,\n error = false,\n success = false,\n maxLength,\n showCharCount = false,\n ghostOptions,\n ghostMinChars = 2,\n onGhostAccept,\n loading = false,\n onChange,\n onFocus,\n onBlur,\n className,\n style,\n textareaClassName,\n labelClassName,\n },\n ref\n) {\n const [focused, setFocused] = useState(false)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n const {currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n const ghost = useGhostText({\n options: ghostOptions ?? [],\n value: currentValue,\n minChars: ghostMinChars,\n })\n const hasError = error || !!errorText\n const resolvedRef = ref ?? textareaRef\n\n // Resize the textarea to fit content while respecting min and max row limits.\n const adjustHeight = useCallback(() => {\n const el = typeof resolvedRef === 'function' ? null : resolvedRef?.current\n if (!el || !autoResize) return\n\n el.style.height = 'auto'\n const lineHeight = parseFloat(getComputedStyle(el).lineHeight) || 20\n const minH = minRows ? minRows * lineHeight : 0\n const maxH = maxRows ? maxRows * lineHeight : Infinity\n const newHeight = Math.min(Math.max(el.scrollHeight, minH), maxH)\n el.style.height = `${newHeight}px`\n el.style.overflowY = el.scrollHeight > newHeight ? 'auto' : 'hidden'\n }, [autoResize, minRows, maxRows, resolvedRef])\n\n useEffect(() => {\n adjustHeight()\n }, [currentValue, adjustHeight])\n\n // Mirror focus state so wrapper styling stays consistent with Input.\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(true)\n onFocus?.(e)\n },\n [onFocus]\n )\n\n // Clear focus styling before delegating blur handling.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(false)\n onBlur?.(e)\n },\n [onBlur]\n )\n\n // Keep uncontrolled usage working without blocking controlled integrations.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCurrentValue(e.target.value)\n onChange?.(e)\n ghost.reset()\n },\n [onChange, setCurrentValue, ghost.reset]\n )\n\n // Intercept keyboard events for ghost text acceptance.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (ghostOptions && ghost.hint) {\n const accepted = ghost.onKeyDown(e)\n if (accepted) {\n const result = ghost.accept()\n setCurrentValue(result.value)\n onGhostAccept?.(result.value)\n const el = typeof resolvedRef === 'function' ? null : resolvedRef?.current\n if (el) {\n const nativeSet = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')?.set\n nativeSet?.call(el, result.value)\n el.dispatchEvent(new Event('input', {bubbles: true}))\n }\n return\n }\n }\n },\n [ghostOptions, ghost, setCurrentValue, onGhostAccept, resolvedRef]\n )\n\n const containerClasses = cn(\n 'container',\n variant,\n size,\n focused && 'focused',\n hasError && 'error',\n success && !hasError && 'success',\n color === 'neutral' && 'color-neutral',\n color === 'success' && 'color-success',\n color === 'error' && 'color-error',\n color === 'warning' && 'color-warning',\n color === 'info' && 'color-info',\n disabled && 'disabled'\n )\n\n return (\n <div\n className={cn('textarea', ...getAppearanceClassNames({fcolor}), fullWidth && 'full-width', className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'label',\n focused && 'focused',\n hasError && 'error',\n success && !hasError && 'success',\n required && 'required',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className={containerClasses}>\n {ghostOptions ? (\n <div className=\"ghost-text-field ghost-text-field-multi\">\n <textarea\n ref={resolvedRef as React.Ref<HTMLTextAreaElement>}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n rows={autoResize ? (minRows ?? rows) : rows}\n maxLength={maxLength}\n value={currentValue}\n className={cn('field', textareaClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n {focused && ghost.hint && (\n <span className=\"ghost-text-overlay\" aria-hidden=\"true\">\n <span className=\"ghost-text-typed\">{currentValue}</span>\n <span className=\"ghost-text-hint\">{ghost.hint}</span>\n </span>\n )}\n </div>\n ) : (\n <textarea\n ref={resolvedRef as React.Ref<HTMLTextAreaElement>}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n rows={autoResize ? (minRows ?? rows) : rows}\n maxLength={maxLength}\n value={currentValue}\n className={cn('field', textareaClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n )}\n {loading && <span className=\"spinner\" />}\n </div>\n\n {(errorText || helperText || showCharCount) && (\n <div className=\"bottom-row\">\n <span>\n {errorText && (\n <span id={id ? `${id}-error` : undefined} className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n )}\n {!errorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className=\"helper-text\">\n {helperText}\n </span>\n )}\n </span>\n {showCharCount && maxLength && (\n <span className={cn('char-count', currentValue.length > maxLength && 'over')}>\n {currentValue.length}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n )\n})\n","import {useState, useCallback, useEffect, forwardRef} from 'react'\nimport type {InputPasswordProps, PasswordStrength} from './InputPassword.types'\nimport {Input} from '../Input'\nimport {cn} from '../../../utils/cn'\nimport './InputPassword.css'\n\n// Approximate password strength with simple UI-focused heuristics.\nfunction calcStrength(value: string): PasswordStrength {\n let score = 0\n if (value.length >= 8) score++\n if (value.length >= 12) score++\n if (/[a-z]/.test(value) && /[A-Z]/.test(value)) score++\n if (/\\d/.test(value)) score++\n if (/[^a-zA-Z0-9]/.test(value)) score++\n\n if (score <= 1) return 'weak'\n if (score <= 2) return 'fair'\n if (score <= 3) return 'good'\n return 'strong'\n}\n\nconst STRENGTH_LABELS: Record<PasswordStrength, string> = {\n weak: 'Weak',\n fair: 'Fair',\n good: 'Good',\n strong: 'Strong',\n}\n\n// Extend the base input with password visibility and optional strength feedback.\nexport const InputPassword = forwardRef<HTMLInputElement, InputPasswordProps>(function InputPassword(\n {showToggle = true, showStrength = false, onStrengthChange, value, defaultValue, onChange, className, ...rest},\n ref\n) {\n const [visible, setVisible] = useState(false)\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const currentValue = value !== undefined ? value.toString() : internalValue\n const strength = calcStrength(currentValue)\n\n useEffect(() => {\n onStrengthChange?.(strength)\n }, [strength, onStrengthChange])\n\n // Keep uncontrolled usage working while reporting changes to the caller.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value)\n }\n onChange?.(e)\n },\n [onChange, value]\n )\n\n const toggleIcon = showToggle ? (\n <button\n type=\"button\"\n className=\"toggle-btn\"\n onClick={() => setVisible((v) => !v)}\n tabIndex={-1}\n aria-label={visible ? 'Hide password' : 'Show password'}\n >\n {visible ? '\\u25E0' : '\\u25C9'}\n </button>\n ) : undefined\n\n return (\n <div className={cn('input-password', className)}>\n <Input\n {...rest}\n ref={ref}\n type={visible ? 'text' : 'password'}\n value={currentValue}\n onChange={handleChange}\n endIcon={toggleIcon}\n />\n {showStrength && currentValue.length > 0 && (\n <div className=\"strength-row\">\n <div className=\"strength-bar\">\n {[0, 1, 2, 3].map((i) => (\n <div\n key={i}\n className={cn(\n 'strength-segment',\n i < ['weak', 'fair', 'good', 'strong'].indexOf(strength) + 1 &&\n `strength-${strength}`\n )}\n />\n ))}\n </div>\n <span className={cn('strength-label', `strength-${strength}`)}>{STRENGTH_LABELS[strength]}</span>\n </div>\n )}\n </div>\n )\n})\n","import {useState, useCallback, useRef, useEffect, forwardRef} from 'react'\nimport type {InputNumberProps} from './InputNumber.types'\nimport {Input} from '../Input'\nimport {cn} from '../../../utils/cn'\nimport './InputNumber.css'\n\n// Keep numeric values inside optional min and max bounds.\nfunction clampValue(val: number, min?: number, max?: number): number {\n if (min !== undefined && val < min) return min\n if (max !== undefined && val > max) return max\n return val\n}\n\n// Prevent floating-point drift when step values use decimal precision.\nfunction roundToPrecision(val: number, precision: number): number {\n const factor = Math.pow(10, precision)\n return Math.round(val * factor) / factor\n}\n\n// Extend the base input with stepping, clamping and keyboard increment support.\nexport const InputNumber = forwardRef<HTMLInputElement, InputNumberProps>(function InputNumber(\n {\n min,\n max,\n step = 1,\n showStepper = true,\n precision = 0,\n allowNegative = true,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onKeyDown,\n onBlur,\n disabled = false,\n className,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const currentValue = value !== undefined ? value.toString() : internalValue\n const intervalRef = useRef<ReturnType<typeof setInterval>>(null)\n\n // Keep the displayed string and numeric callback in sync.\n const updateValue = useCallback(\n (newVal: string) => {\n if (value === undefined) {\n setInternalValue(newVal)\n }\n const num = parseFloat(newVal)\n onValueChange?.(isNaN(num) ? null : num)\n },\n [value, onValueChange]\n )\n\n // Move the current value by one step in the requested direction.\n const increment = useCallback(\n (direction: 1 | -1) => {\n const current = parseFloat(currentValue) || 0\n const newVal = roundToPrecision(clampValue(current + step * direction, min, max), precision)\n updateValue(newVal.toString())\n },\n [currentValue, step, min, max, precision, updateValue]\n )\n\n // Repeat stepping while the pointer is held on a stepper button.\n const startHold = useCallback(\n (direction: 1 | -1) => {\n increment(direction)\n intervalRef.current = setInterval(() => increment(direction), 150)\n },\n [increment]\n )\n\n // Clear the hold timer when the pointer is released.\n const stopHold = useCallback(() => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n }, [])\n\n useEffect(() => stopHold, [stopHold])\n\n // Filter user input down to numeric characters before storing it.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value\n const filtered = raw.replace(allowNegative ? /[^\\d.,-]/g : /[^\\d.,]/g, '')\n updateValue(filtered)\n onChange?.(e)\n },\n [onChange, allowNegative, updateValue]\n )\n\n // Snap the entered value back into range when the field loses focus.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const num = parseFloat(currentValue)\n if (!isNaN(num)) {\n const clamped = roundToPrecision(clampValue(num, min, max), precision)\n updateValue(clamped.toString())\n }\n onBlur?.(e)\n },\n [currentValue, min, max, precision, updateValue, onBlur]\n )\n\n // Support ArrowUp and ArrowDown as a keyboard stepper.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n increment(1)\n } else if (e.key === 'ArrowDown') {\n e.preventDefault()\n increment(-1)\n }\n onKeyDown?.(e)\n },\n [increment, onKeyDown]\n )\n\n const stepper =\n showStepper && !disabled ? (\n <div className=\"stepper\">\n <button\n type=\"button\"\n className=\"step-btn\"\n onMouseDown={() => startHold(1)}\n onMouseUp={stopHold}\n onMouseLeave={stopHold}\n tabIndex={-1}\n aria-label=\"Increment\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 10L8 6L12 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"step-btn\"\n onMouseDown={() => startHold(-1)}\n onMouseUp={stopHold}\n onMouseLeave={stopHold}\n tabIndex={-1}\n aria-label=\"Decrement\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 6L8 10L12 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n ) : undefined\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"decimal\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n endIcon={stepper}\n disabled={disabled}\n className={cn('input-number', className)}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputSearchProps} from './InputSearch.types'\nimport {Input} from '../Input'\nimport {useDebouncedCallback} from '../../../utils/useDebounce'\n\n// Extend the base input with debounced search callbacks and an inline clear action.\nexport const InputSearch = forwardRef<HTMLInputElement, InputSearchProps>(function InputSearch(\n {\n debounceMs = 300,\n onSearch,\n value,\n defaultValue,\n onChange,\n onKeyDown,\n onClear,\n clearable = true,\n placeholder = 'Search...',\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n const debouncedSearch = useDebouncedCallback((val: string) => onSearch?.(val), debounceMs)\n\n // Update local state and debounce search notifications while typing.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value)\n }\n debouncedSearch(e.target.value)\n onChange?.(e)\n },\n [onChange, value, debouncedSearch]\n )\n\n // Run search immediately when the user confirms with Enter.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n onSearch?.(currentValue)\n }\n onKeyDown?.(e)\n },\n [currentValue, onSearch, onKeyDown]\n )\n\n // Clear both the visible field and the emitted search query.\n const handleClear = useCallback(() => {\n if (value === undefined) {\n setInternalValue('')\n }\n onSearch?.('')\n onClear?.()\n }, [value, onSearch, onClear])\n\n const searchIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"6.5\" cy=\"6.5\" r=\"5\" />\n <line x1=\"10\" y1=\"10\" x2=\"14.5\" y2=\"14.5\" />\n </svg>\n )\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"search\"\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onClear={handleClear}\n clearable={clearable}\n placeholder={placeholder}\n startIcon={searchIcon}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputEmailProps} from './InputEmail.types'\nimport {Input} from '../Input'\nimport {validateEmail} from '../../../utils/validators'\nimport type {ValidationResult} from '../../../utils/validators'\n\n// Extend the base input with email validation and optional success feedback.\nexport const InputEmail = forwardRef<HTMLInputElement, InputEmailProps>(function InputEmail(\n {\n validateOnBlur = true,\n validateOnChange = false,\n showValidIcon = true,\n onValidationChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n success,\n placeholder = 'email@example.com',\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n // Reuse the shared email validator and surface the latest result upstream.\n const runValidation = useCallback(\n (val: string) => {\n const result = validateEmail(val)\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [onValidationChange]\n )\n\n // Validate while typing only when the component is configured to do so.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value)\n }\n if (validateOnChange && touched) {\n runValidation(e.target.value)\n }\n onChange?.(e)\n },\n [onChange, value, validateOnChange, touched, runValidation]\n )\n\n // Validate optional email input on blur once the user has interacted with it.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n if (validateOnBlur && e.target.value) {\n runValidation(e.target.value)\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, runValidation]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess =\n !isError && success !== undefined ? success : touched && validation.valid && currentValue.length > 0\n\n const emailIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"1\" y=\"3\" width=\"14\" height=\"10\" rx=\"2\" />\n <path d=\"M1 5L8 9L15 5\" />\n </svg>\n )\n\n const validIcon =\n showValidIcon && isSuccess ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"var(--mineral-success)\" strokeWidth=\"2\">\n <path d=\"M3 8L6.5 11.5L13 4.5\" />\n </svg>\n ) : undefined\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"email\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder}\n startIcon={emailIcon}\n endIcon={validIcon}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputPhoneProps} from './InputPhone.types'\nimport {Input} from '../Input'\nimport {cn} from '../../../utils/cn'\nimport {validatePhone} from '../../../utils/validators'\nimport {formatPhone, stripNonDigits} from '../../../utils/formatters'\nimport type {ValidationResult} from '../../../utils/validators'\nimport './InputPhone.css'\n\n// Extend the base input with country-aware phone formatting and validation.\nexport const InputPhone = forwardRef<HTMLInputElement, InputPhoneProps>(function InputPhone(\n {\n countryCode = 'PL',\n showCountryCode = true,\n formatOnChange = true,\n validateOnBlur = true,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n placeholder = '123 456 789',\n className,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n // Keep the emitted raw digits and the displayed formatted value aligned.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const digits = stripNonDigits(e.target.value)\n const formatted = formatOnChange ? formatPhone(digits, {countryCode}) : digits\n\n if (value === undefined) {\n setInternalValue(formatted)\n }\n onValueChange?.(digits, formatted)\n onChange?.(e)\n },\n [onChange, value, formatOnChange, countryCode, onValueChange]\n )\n\n // Validate the raw number on blur using country-specific length rules.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n if (validateOnBlur && currentValue) {\n const result = validatePhone(stripNonDigits(currentValue), countryCode)\n setValidation(result)\n onValidationChange?.(result)\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, currentValue, countryCode, onValidationChange]\n )\n\n const COUNTRY_PREFIXES: Record<string, string> = {\n PL: '+48',\n DE: '+49',\n US: '+1',\n GB: '+44',\n FR: '+33',\n CZ: '+420',\n SK: '+421',\n }\n\n const prefix = showCountryCode ? (\n <span className=\"prefix\">{COUNTRY_PREFIXES[countryCode.toUpperCase()] ?? `+${countryCode}`}</span>\n ) : undefined\n\n const phoneIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M3 1.5h10a1 1 0 011 1v11a1 1 0 01-1 1H3a1 1 0 01-1-1v-11a1 1 0 011-1z\" />\n <line x1=\"5\" y1=\"12\" x2=\"11\" y2=\"12\" />\n </svg>\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"tel\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n placeholder={placeholder}\n startIcon={showCountryCode ? prefix : phoneIcon}\n className={cn('input-phone', className)}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputNameProps} from './InputName.types'\nimport {Input} from '../Input'\nimport {capitalizeWords} from '../../../utils/formatters'\nimport type {ValidationResult} from '../../../utils/validators'\n\n// Extend the base input with name-friendly filtering and optional word-count validation.\nexport const InputName = forwardRef<HTMLInputElement, InputNameProps>(function InputName(\n {\n autoCapitalize = true,\n allowNumbers = false,\n allowSpecialChars = false,\n minWords,\n validateOnBlur = true,\n onValidationChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n placeholder = 'Jan Kowalski',\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n // Normalize user input according to the configured name rules.\n const filterValue = useCallback(\n (raw: string): string => {\n let filtered = raw\n if (!allowNumbers) {\n filtered = filtered.replace(/\\d/g, '')\n }\n if (!allowSpecialChars) {\n filtered = filtered.replace(/[^a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ\\s'-]/g, '')\n }\n if (autoCapitalize) {\n filtered = capitalizeWords(filtered)\n }\n return filtered\n },\n [allowNumbers, allowSpecialChars, autoCapitalize]\n )\n\n // Store the filtered value while still delegating the original change event.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const filtered = filterValue(e.target.value)\n if (value === undefined) {\n setInternalValue(filtered)\n }\n onChange?.(e)\n },\n [onChange, value, filterValue]\n )\n\n // Validate the minimum word count after the user leaves the field.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n if (validateOnBlur && currentValue) {\n const words = currentValue.trim().split(/\\s+/).filter(Boolean)\n if (minWords && words.length < minWords) {\n const result: ValidationResult = {\n valid: false,\n error: `Enter at least ${minWords} word${minWords > 1 ? 's' : ''}`,\n }\n setValidation(result)\n onValidationChange?.(result)\n } else {\n const result: ValidationResult = {valid: true}\n setValidation(result)\n onValidationChange?.(result)\n }\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, currentValue, minWords, onValidationChange]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n\n const userIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"8\" cy=\"5\" r=\"3\" />\n <path d=\"M2 14c0-3 2.5-5 6-5s6 2 6 5\" />\n </svg>\n )\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"text\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n placeholder={placeholder}\n startIcon={userIcon}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputIBANProps} from './InputIBAN.types'\nimport {Input} from '../Input'\nimport {validateIBAN} from '../../../utils/validators'\nimport {formatIBAN, unformatIBAN} from '../../../utils/formatters'\nimport type {ValidationResult} from '../../../utils/validators'\n\n// Extend the base input with IBAN formatting and checksum validation.\nexport const InputIBAN = forwardRef<HTMLInputElement, InputIBANProps>(function InputIBAN(\n {\n formatOnChange = true,\n validateOnBlur = true,\n showValidIcon = true,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n success,\n placeholder = 'PL00 0000 0000 0000 0000 0000 0000',\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n // Keep raw and formatted IBAN values aligned for consumers and display.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n let raw = e.target.value.replace(/[^a-zA-Z0-9\\s]/g, '').toUpperCase()\n const clean = raw.replace(/\\s/g, '')\n const formatted = formatOnChange ? formatIBAN(clean) : clean\n\n if (value === undefined) {\n setInternalValue(formatted)\n }\n onValueChange?.(clean, formatted)\n onChange?.(e)\n },\n [onChange, value, formatOnChange, onValueChange]\n )\n\n // Validate the normalized IBAN once the user leaves the field.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n if (validateOnBlur && currentValue) {\n const result = validateIBAN(unformatIBAN(currentValue))\n setValidation(result)\n onValidationChange?.(result)\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, currentValue, onValidationChange]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess =\n !isError && (success !== undefined ? success : touched && validation.valid && currentValue.length > 0)\n\n const bankIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M1 14h14\" />\n <path d=\"M2 6h12\" />\n <path d=\"M8 2L1 6h14L8 2z\" />\n <path d=\"M3 6v8M6 6v8M10 6v8M13 6v8\" />\n </svg>\n )\n\n const validIcon =\n showValidIcon && isSuccess ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"var(--mineral-success)\" strokeWidth=\"2\">\n <path d=\"M3 8L6.5 11.5L13 4.5\" />\n </svg>\n ) : undefined\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"text\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder}\n startIcon={bankIcon}\n endIcon={validIcon}\n maxLength={34 + 8}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputTaxIdProps, TaxIdType} from './InputTaxId.types'\nimport {Input} from '../Input'\nimport {validateNIP, validatePESEL, validateREGON} from '../../../utils/validators'\nimport {formatNIP, stripNonDigits} from '../../../utils/formatters'\nimport type {ValidationResult} from '../../../utils/validators'\n\nconst VALIDATORS: Record<TaxIdType, (v: string) => ValidationResult> = {\n NIP: validateNIP,\n PESEL: validatePESEL,\n REGON: validateREGON,\n}\n\nconst MAX_LENGTHS: Record<TaxIdType, number> = {\n NIP: 13,\n PESEL: 11,\n REGON: 14,\n}\n\nconst PLACEHOLDERS: Record<TaxIdType, string> = {\n NIP: '123-456-78-19',\n PESEL: '00000000000',\n REGON: '000000000',\n}\n\n// Extend the base input with NIP, PESEL and REGON formatting and validation.\nexport const InputTaxId = forwardRef<HTMLInputElement, InputTaxIdProps>(function InputTaxId(\n {\n taxIdType,\n formatOnChange = true,\n validateOnBlur = true,\n showValidIcon = true,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n success,\n placeholder,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n // Normalize the visible value based on the selected identifier type.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const digits = stripNonDigits(e.target.value)\n const formatted = formatOnChange && taxIdType === 'NIP' ? formatNIP(digits) : digits\n\n if (value === undefined) {\n setInternalValue(formatted)\n }\n onValueChange?.(digits)\n onChange?.(e)\n },\n [onChange, value, formatOnChange, taxIdType, onValueChange]\n )\n\n // Validate the stripped numeric value against the active identifier rules.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n if (validateOnBlur && currentValue) {\n const validator = VALIDATORS[taxIdType]\n const result = validator(stripNonDigits(currentValue))\n setValidation(result)\n onValidationChange?.(result)\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, currentValue, taxIdType, onValidationChange]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess =\n !isError && (success !== undefined ? success : touched && validation.valid && currentValue.length > 0)\n\n const idIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"1\" y=\"3\" width=\"14\" height=\"10\" rx=\"2\" />\n <line x1=\"4\" y1=\"7\" x2=\"8\" y2=\"7\" />\n <line x1=\"4\" y1=\"10\" x2=\"12\" y2=\"10\" />\n </svg>\n )\n\n const validIcon =\n showValidIcon && isSuccess ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"var(--mineral-success)\" strokeWidth=\"2\">\n <path d=\"M3 8L6.5 11.5L13 4.5\" />\n </svg>\n ) : undefined\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder ?? PLACEHOLDERS[taxIdType]}\n startIcon={idIcon}\n endIcon={validIcon}\n maxLength={MAX_LENGTHS[taxIdType]}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputCurrencyProps} from './InputCurrency.types'\nimport {Input} from '../Input'\nimport {cn} from '../../../utils/cn'\nimport {formatCurrency, parseCurrencyToNumber} from '../../../utils/formatters'\nimport './InputCurrency.css'\n\n// Extend the base input with currency formatting and numeric callbacks.\nexport const InputCurrency = forwardRef<HTMLInputElement, InputCurrencyProps>(function InputCurrency(\n {\n currency,\n currencySymbol,\n currencyPosition = 'end',\n decimalSeparator = ',',\n thousandSeparator = ' ',\n precision = 2,\n min,\n max,\n allowNegative = false,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n placeholder = '0,00',\n startIcon,\n endIcon,\n className,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n const symbol = currencySymbol ?? currency ?? ''\n\n // Filter user input down to one decimal separator and an optional minus sign.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value\n let filtered = ''\n let hasDecimal = false\n for (const ch of raw) {\n if (ch >= '0' && ch <= '9') {\n filtered += ch\n } else if ((ch === ',' || ch === '.') && !hasDecimal) {\n filtered += decimalSeparator\n hasDecimal = true\n } else if (ch === '-' && allowNegative && filtered.length === 0) {\n filtered += '-'\n }\n }\n\n const formatted = formatCurrency(filtered, {decimalSeparator, thousandSeparator, precision})\n\n if (value === undefined) {\n setInternalValue(formatted)\n }\n\n const num = parseCurrencyToNumber(formatted, thousandSeparator, decimalSeparator)\n onValueChange?.(num)\n onChange?.(e)\n },\n [onChange, value, decimalSeparator, thousandSeparator, precision, allowNegative, onValueChange]\n )\n\n // Clamp the numeric value on blur and snap it to the configured precision.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n let num = parseCurrencyToNumber(currentValue, thousandSeparator, decimalSeparator)\n if (num !== null) {\n if (min !== undefined && num < min) num = min\n if (max !== undefined && num > max) num = max\n const fixed = num.toFixed(precision).replace('.', decimalSeparator)\n const formatted = formatCurrency(fixed, {decimalSeparator, thousandSeparator, precision})\n if (value === undefined) {\n setInternalValue(formatted)\n }\n onValueChange?.(num)\n }\n onBlur?.(e)\n },\n [currentValue, min, max, precision, decimalSeparator, thousandSeparator, value, onValueChange, onBlur]\n )\n\n const symbolEl = symbol ? <span className=\"symbol\">{symbol}</span> : undefined\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"decimal\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder={placeholder}\n startIcon={currencyPosition === 'start' ? symbolEl : startIcon}\n endIcon={currencyPosition === 'end' ? symbolEl : endIcon}\n className={cn('input-currency', className)}\n />\n )\n})\n","import {forwardRef, useCallback, useMemo, useState} from 'react'\nimport type {InputCreditCardProps} from './InputCreditCard.types'\nimport {Input} from '../Input'\nimport {cn} from '../../../utils/cn'\nimport {detectCardBrand, formatCardNumber, stripCardNumber, validateCardNumber} from '../../../utils/creditCards'\nimport type {ValidationResult} from '../../../utils/validators'\nimport './InputCreditCard.css'\n\nfunction CardBrandBadge({value}: {value: string}) {\n const brand = detectCardBrand(value)\n\n return <span className={cn('card-brand', brand.brand)}>{brand.iconLabel}</span>\n}\n\n// Extend the base input with payment card detection, formatting and checksum validation.\nexport const InputCreditCard = forwardRef<HTMLInputElement, InputCreditCardProps>(function InputCreditCard(\n {\n validateOnBlur = true,\n validateOnChange = false,\n showBrandIcon = true,\n showValidIcon = true,\n onValidationChange,\n onCardBrandChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n success,\n placeholder = '4242 4242 4242 4242',\n className,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(() => formatCardNumber(defaultValue?.toString() ?? ''))\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? formatCardNumber(value.toString()) : internalValue\n const detectedBrand = useMemo(() => detectCardBrand(currentValue), [currentValue])\n\n const runValidation = useCallback(\n (formattedValue: string) => {\n const result = validateCardNumber(formattedValue)\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [onValidationChange]\n )\n\n // Keep the visible card number grouped while exposing raw digits to the caller.\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const formattedValue = formatCardNumber(event.target.value)\n const nextBrand = detectCardBrand(formattedValue)\n\n if (value === undefined) {\n setInternalValue(formattedValue)\n }\n\n onCardBrandChange?.(nextBrand.brand)\n onValueChange?.(stripCardNumber(formattedValue), formattedValue, nextBrand.brand)\n\n if (validateOnChange && touched) {\n runValidation(formattedValue)\n }\n\n onChange?.(event)\n },\n [onCardBrandChange, onChange, onValueChange, runValidation, touched, validateOnChange, value]\n )\n\n // Validate after the user leaves the field so checksum feedback stays predictable.\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n\n if (validateOnBlur && currentValue) {\n runValidation(currentValue)\n }\n\n onBlur?.(event)\n },\n [currentValue, onBlur, runValidation, validateOnBlur]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess =\n !isError && success !== undefined\n ? success\n : touched && validation.valid && stripCardNumber(currentValue).length > 0\n\n const validIcon =\n showValidIcon && isSuccess ? (\n <span className=\"valid-icon\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M3 8L6.5 11.5L13 4.5\" />\n </svg>\n </span>\n ) : undefined\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder}\n startIcon={showBrandIcon ? <CardBrandBadge value={currentValue} /> : undefined}\n endIcon={validIcon}\n className={cn('input-credit-card', className)}\n />\n )\n})\n","import {useState, useRef, useCallback, forwardRef, isValidElement} from 'react'\nimport type {InputGroupProps, InputGroupAddon, InputGroupSlot} from './InputGroup.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './InputGroup.css'\n\n// Detect structured addon configs while leaving raw React nodes untouched.\nfunction isAddonObject(slot: InputGroupSlot): slot is InputGroupAddon {\n return typeof slot === 'object' && slot !== null && !isValidElement(slot) && 'type' in slot\n}\n\n// Render one prepend or append slot based on its declared addon type.\nfunction renderSlot(slot: InputGroupSlot, position: 'prepend' | 'append', index: number) {\n if (!isAddonObject(slot)) {\n // Raw ReactNode — render as-is inside addon container\n return (\n <div key={`${position}-${index}`} className={cn('addon', 'custom', position)}>\n {slot}\n </div>\n )\n }\n\n const addon = slot\n\n if (addon.type === 'button') {\n return (\n <button\n key={`${position}-${index}`}\n type=\"button\"\n className={cn('addon', position, 'button')}\n onClick={addon.onClick}\n >\n {addon.content}\n </button>\n )\n }\n\n if (addon.type === 'checkbox') {\n return (\n <label key={`${position}-${index}`} className={cn('addon', position, 'checkbox')}>\n <input\n type=\"checkbox\"\n checked={addon.checked}\n onChange={(e) => addon.onCheckedChange?.(e.target.checked)}\n />\n </label>\n )\n }\n\n // text or icon\n return (\n <span key={`${position}-${index}`} className={cn('addon', position)}>\n {addon.content}\n </span>\n )\n}\n\n// Normalize the public slot API to a flat array for predictable rendering.\nfunction normalizeSlots(slots?: InputGroupSlot | InputGroupSlot[]): InputGroupSlot[] {\n if (slots === undefined || slots === null) return []\n if (Array.isArray(slots)) return slots\n return [slots]\n}\n\n// Render a grouped input with prepend and append content around a shared field.\nexport const InputGroup = forwardRef<HTMLInputElement, InputGroupProps>(function InputGroup(\n {\n prepend,\n append,\n type = 'text',\n value,\n defaultValue,\n name,\n id,\n placeholder,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n autoComplete,\n inputMode,\n size = 'md',\n fcolor,\n fullWidth = false,\n label,\n helperText,\n errorText,\n color = 'primary',\n error = false,\n maxLength,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n loading = false,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n inputClassName,\n labelClassName,\n },\n ref\n) {\n const [focused, setFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: clickEffect,\n disabled: disabled || readOnly,\n color: rippleColor,\n })\n\n const hasError = error || !!errorText\n const {currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n\n // Mirror focus state so the wrapper can style the group consistently.\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true)\n onFocus?.(e)\n },\n [onFocus]\n )\n\n // Clear wrapper focus styling before delegating blur handling.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false)\n onBlur?.(e)\n },\n [onBlur]\n )\n\n // Keep uncontrolled usage working without blocking controlled integrations.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setCurrentValue(e.target.value)\n onChange?.(e)\n },\n [onChange, setCurrentValue]\n )\n\n const prependSlots = normalizeSlots(prepend)\n const appendSlots = normalizeSlots(append)\n\n return (\n <div\n className={cn(\n 'input-group',\n color,\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'label',\n focused && 'focused',\n hasError && 'error',\n required && 'required',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div\n className={cn(\n 'container',\n size,\n focused && 'focused',\n hasError && 'has-error',\n disabled && 'disabled',\n effectClassName\n )}\n onPointerDown={handlePointerDown}\n >\n {effectLayer}\n {prependSlots.map((slot, i) => renderSlot(slot, 'prepend', i))}\n\n <input\n ref={ref ?? inputRef}\n type={type}\n value={currentValue}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n inputMode={inputMode}\n maxLength={maxLength}\n className={cn('field', inputClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n\n {loading && (\n <span className={'spinner-addon'}>\n <span className={'spinner'} />\n </span>\n )}\n\n {appendSlots.map((slot, i) => renderSlot(slot, 'append', i))}\n </div>\n\n {(errorText || helperText) && (\n <div className={'bottom'}>\n {errorText && (\n <span id={id ? `${id}-error` : undefined} className={'error-text'} role=\"alert\">\n {errorText}\n </span>\n )}\n {!errorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className={'helper'}>\n {helperText}\n </span>\n )}\n </div>\n )}\n </div>\n )\n})\n","import {forwardRef, useCallback, useMemo, useState} from 'react'\nimport type {InputPostCodeProps} from './InputPostCode.types'\nimport {InputGroup} from '../InputGroup'\nimport {cn} from '../../../utils/cn'\nimport {formatPostCode, getPostCodeRule, postCodeCountries, validatePostCode} from '../../../utils/postalCodes'\nimport type {ValidationResult} from '../../../utils/validators'\nimport './InputPostCode.css'\n\n// Extend the grouped input with country-aware postal code masking and validation.\nexport const InputPostCode = forwardRef<HTMLInputElement, InputPostCodeProps>(function InputPostCode(\n {\n country,\n defaultCountry = 'PL',\n selectableCountry = true,\n validateOnBlur = true,\n validateOnChange = false,\n onCountryChange,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n helperText,\n placeholder,\n className,\n disabled = false,\n ...rest\n },\n ref\n) {\n const [internalCountry, setInternalCountry] = useState(defaultCountry.toUpperCase())\n const [internalValue, setInternalValue] = useState(() =>\n formatPostCode(defaultValue?.toString() ?? '', country ?? defaultCountry)\n )\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentCountry = (country ?? internalCountry).toUpperCase()\n const currentRule = useMemo(() => getPostCodeRule(currentCountry), [currentCountry])\n const currentValue = value !== undefined ? formatPostCode(value.toString(), currentCountry) : internalValue\n\n const runValidation = useCallback(\n (formattedValue: string, nextCountry: string) => {\n const result = validatePostCode(formattedValue, nextCountry)\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [onValidationChange]\n )\n\n // Keep the visible postal code aligned with the selected country rule.\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const formattedValue = formatPostCode(event.target.value, currentCountry)\n\n if (value === undefined) {\n setInternalValue(formattedValue)\n }\n\n onValueChange?.(formattedValue.replace(/\\s|-/g, ''), formattedValue, currentCountry)\n\n if (validateOnChange && touched) {\n runValidation(formattedValue, currentCountry)\n }\n\n onChange?.(event)\n },\n [currentCountry, onChange, onValueChange, runValidation, touched, validateOnChange, value]\n )\n\n // Re-run validation after blur so the visible formatting and error state stay in sync.\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n\n if (validateOnBlur && currentValue) {\n runValidation(currentValue, currentCountry)\n }\n\n onBlur?.(event)\n },\n [currentCountry, currentValue, onBlur, runValidation, validateOnBlur]\n )\n\n // Switch the formatter and validation rule whenever the selected country changes.\n const handleCountryChange = useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const nextCountry = event.target.value.toUpperCase()\n const formattedValue = formatPostCode(currentValue, nextCountry)\n\n if (country === undefined) {\n setInternalCountry(nextCountry)\n }\n\n if (value === undefined) {\n setInternalValue(formattedValue)\n }\n\n onCountryChange?.(nextCountry)\n\n if (touched) {\n runValidation(formattedValue, nextCountry)\n }\n },\n [country, currentValue, onCountryChange, runValidation, touched, value]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n\n return (\n <InputGroup\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode={currentRule.inputMode}\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n helperText={resolvedErrorText ? undefined : (helperText ?? `Format: ${currentRule.example}`)}\n placeholder={placeholder ?? currentRule.placeholder}\n maxLength={currentRule.maxLength}\n disabled={disabled}\n prepend={\n selectableCountry ? (\n <div className=\"country-select-wrap\">\n <select\n className=\"country-select\"\n value={currentCountry}\n onChange={handleCountryChange}\n disabled={disabled}\n aria-label=\"Postal code country\"\n >\n {postCodeCountries.map((option) => (\n <option key={option.value} value={option.value}>\n {option.value}\n </option>\n ))}\n </select>\n </div>\n ) : (\n {type: 'text', content: currentCountry}\n )\n }\n className={cn('input-post-code', className)}\n />\n )\n})\n","import {useState, useCallback, useRef, useEffect, forwardRef} from 'react'\nimport type {InputOTPProps} from './InputOTP.types'\nimport {cn} from '../../../utils/cn'\nimport './InputOTP.css'\n\nexport const InputOTP = forwardRef<HTMLDivElement, InputOTPProps>(function InputOTP(\n {\n length = 6,\n value,\n onChange,\n autoFocus = false,\n disabled = false,\n color = 'primary',\n size = 'md',\n error = false,\n errorText,\n label,\n className,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState('')\n const currentValue = value !== undefined ? value : internalValue\n const inputsRef = useRef<(HTMLInputElement | null)[]>([])\n\n const updateValue = useCallback(\n (newVal: string) => {\n if (value === undefined) setInternalValue(newVal)\n onChange?.(newVal)\n },\n [value, onChange]\n )\n\n const focusSlot = useCallback((index: number) => {\n const clamped = Math.max(0, Math.min(index, length - 1))\n inputsRef.current[clamped]?.focus()\n }, [length])\n\n useEffect(() => {\n if (autoFocus) focusSlot(0)\n }, [autoFocus, focusSlot])\n\n const handleInput = useCallback(\n (index: number, char: string) => {\n if (!/^\\d$/.test(char)) return\n const chars = currentValue.split('')\n while (chars.length <= index) chars.push('')\n chars[index] = char\n updateValue(chars.join(''))\n if (index < length - 1) focusSlot(index + 1)\n },\n [currentValue, length, updateValue, focusSlot]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n e.preventDefault()\n const chars = currentValue.split('')\n if (chars[index]) {\n chars[index] = ''\n updateValue(chars.join(''))\n } else if (index > 0) {\n chars[index - 1] = ''\n updateValue(chars.join(''))\n focusSlot(index - 1)\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault()\n if (index > 0) focusSlot(index - 1)\n } else if (e.key === 'ArrowRight') {\n e.preventDefault()\n if (index < length - 1) focusSlot(index + 1)\n }\n },\n [currentValue, length, updateValue, focusSlot]\n )\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault()\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, length)\n if (pasted) {\n updateValue(pasted)\n focusSlot(Math.min(pasted.length, length - 1))\n }\n },\n [length, updateValue, focusSlot]\n )\n\n return (\n <div\n ref={ref}\n className={cn('input-otp', color, size, error && 'error', disabled && 'disabled', className)}\n {...rest}\n >\n {label && <div className=\"label\">{label}</div>}\n <div className=\"slots\" onPaste={handlePaste}>\n {Array.from({length}, (_, i) => (\n <input\n key={i}\n ref={(el) => { inputsRef.current[i] = el }}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={currentValue[i] || ''}\n disabled={disabled}\n className={cn('slot', currentValue[i] && 'filled')}\n aria-label={`Digit ${i + 1}`}\n onChange={(e) => {\n const char = e.target.value.slice(-1)\n handleInput(i, char)\n }}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onFocus={(e) => e.target.select()}\n />\n ))}\n </div>\n {error && errorText && <div className=\"error-text\">{errorText}</div>}\n </div>\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputSliderProps} from './InputSlider.types'\nimport {Slider} from '../../controls/Slider'\nimport {cn} from '../../../utils/cn'\nimport './InputSlider.css'\n\nfunction clampValue(val: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, val))\n}\n\nfunction roundToPrecision(val: number, precision: number): number {\n const factor = Math.pow(10, precision)\n return Math.round(val * factor) / factor\n}\n\nexport const InputSlider = forwardRef<HTMLDivElement, InputSliderProps>(function InputSlider(\n {\n min = 0,\n max = 100,\n step = 1,\n value,\n onChange,\n precision = 0,\n marks,\n showInput = true,\n color = 'primary',\n size = 'md',\n disabled = false,\n label,\n className,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(min)\n const currentValue = value !== undefined ? value : internalValue\n\n const update = useCallback(\n (newVal: number) => {\n const clamped = roundToPrecision(clampValue(newVal, min, max), precision)\n if (value === undefined) setInternalValue(clamped)\n onChange?.(clamped)\n },\n [min, max, precision, value, onChange]\n )\n\n const handleSliderChange = useCallback(\n (val: number) => update(val),\n [update]\n )\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value\n if (raw === '' || raw === '-') return\n const num = parseFloat(raw)\n if (!isNaN(num)) update(num)\n },\n [update]\n )\n\n const handleBlur = useCallback(() => {\n update(currentValue)\n }, [currentValue, update])\n\n return (\n <div\n ref={ref}\n className={cn('input-slider', size, disabled && 'disabled', className)}\n {...rest}\n >\n {label && <div className=\"label\">{label}</div>}\n <div className=\"row\">\n <Slider\n min={min}\n max={max}\n step={step}\n value={currentValue}\n onChange={handleSliderChange}\n marks={marks}\n color={color}\n disabled={disabled}\n />\n {showInput && (\n <input\n type=\"text\"\n inputMode=\"decimal\"\n className={cn('field', color)}\n value={currentValue}\n onChange={handleInputChange}\n onBlur={handleBlur}\n disabled={disabled}\n aria-label={label || 'Slider value'}\n />\n )}\n </div>\n </div>\n )\n})\n","import {useState, useRef, useCallback, useEffect} from 'react'\nimport type {InputFileCropShape} from './InputFile.types'\nimport './CropEditor.css'\n\ninterface CropEditorProps {\n file: File\n shape: InputFileCropShape\n outputSize: number\n quality: number\n onCrop: (cropped: File) => void\n onCancel: () => void\n}\n\nexport function CropEditor({file, shape, outputSize, quality, onCrop, onCancel}: CropEditorProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const imgRef = useRef<HTMLImageElement | null>(null)\n const [imgSrc, setImgSrc] = useState('')\n const [scale, setScale] = useState(1)\n const [offset, setOffset] = useState({x: 0, y: 0})\n const [dragging, setDragging] = useState(false)\n const dragStart = useRef({x: 0, y: 0, ox: 0, oy: 0})\n\n useEffect(() => {\n const url = URL.createObjectURL(file)\n setImgSrc(url)\n return () => URL.revokeObjectURL(url)\n }, [file])\n\n useEffect(() => {\n if (!imgSrc) return\n const img = new Image()\n img.onload = () => {\n imgRef.current = img\n const minDim = Math.min(img.width, img.height)\n const containerSize = 280\n const initialScale = containerSize / minDim\n setScale(initialScale)\n setOffset({\n x: (containerSize - img.width * initialScale) / 2,\n y: (containerSize - img.height * initialScale) / 2,\n })\n }\n img.src = imgSrc\n }, [imgSrc])\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault()\n setDragging(true)\n dragStart.current = {x: e.clientX, y: e.clientY, ox: offset.x, oy: offset.y}\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n },\n [offset]\n )\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent) => {\n if (!dragging) return\n setOffset({\n x: dragStart.current.ox + (e.clientX - dragStart.current.x),\n y: dragStart.current.oy + (e.clientY - dragStart.current.y),\n })\n },\n [dragging]\n )\n\n const handlePointerUp = useCallback(() => {\n setDragging(false)\n }, [])\n\n const handleWheel = useCallback(\n (e: React.WheelEvent) => {\n e.preventDefault()\n const containerSize = 280\n const cx = containerSize / 2\n const cy = containerSize / 2\n\n const delta = e.deltaY > 0 ? 0.95 : 1.05\n const newScale = Math.max(0.1, Math.min(scale * delta, 10))\n\n setOffset({\n x: cx - (cx - offset.x) * (newScale / scale),\n y: cy - (cy - offset.y) * (newScale / scale),\n })\n setScale(newScale)\n },\n [scale, offset]\n )\n\n const handleSlider = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const containerSize = 280\n const cx = containerSize / 2\n const cy = containerSize / 2\n\n const newScale = parseFloat(e.target.value)\n setOffset({\n x: cx - (cx - offset.x) * (newScale / scale),\n y: cy - (cy - offset.y) * (newScale / scale),\n })\n setScale(newScale)\n },\n [scale, offset]\n )\n\n const exportCrop = useCallback(() => {\n const img = imgRef.current\n const canvas = canvasRef.current\n if (!img || !canvas) return\n\n const containerSize = 280\n canvas.width = outputSize\n canvas.height = outputSize\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n const ratio = outputSize / containerSize\n\n if (shape === 'circle') {\n ctx.beginPath()\n ctx.arc(outputSize / 2, outputSize / 2, outputSize / 2, 0, Math.PI * 2)\n ctx.closePath()\n ctx.clip()\n }\n\n ctx.drawImage(\n img,\n offset.x * ratio,\n offset.y * ratio,\n img.width * scale * ratio,\n img.height * scale * ratio\n )\n\n canvas.toBlob(\n (blob) => {\n if (!blob) return\n const ext = file.name.replace(/.*\\./, '')\n const name = file.name.replace(/\\.[^.]+$/, '') + '_cropped.' + ext\n const cropped = new File([blob], name, {type: blob.type})\n onCrop(cropped)\n },\n file.type.startsWith('image/png') ? 'image/png' : 'image/jpeg',\n quality\n )\n }, [file, offset, scale, outputSize, quality, shape, onCrop])\n\n return (\n <div className=\"crop-editor\">\n <div\n ref={containerRef}\n className={`viewport ${shape}`}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onWheel={handleWheel}\n >\n {imgSrc && (\n <img\n src={imgSrc}\n alt=\"\"\n className=\"image\"\n draggable={false}\n style={{\n transform: `translate(${offset.x}px, ${offset.y}px) scale(${scale})`,\n transformOrigin: '0 0',\n }}\n />\n )}\n <div className={`overlay ${shape}`} />\n </div>\n\n <div className=\"zoom\">\n <svg viewBox=\"0 0 16 16\" className=\"zoom-icon\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" fill=\"none\" />\n <path d=\"M11 11L14 14\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M5 7H9M7 5V9\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n <input\n type=\"range\"\n className=\"zoom-slider\"\n min=\"0.1\"\n max=\"5\"\n step=\"0.01\"\n value={scale}\n onChange={handleSlider}\n />\n </div>\n\n <div className=\"actions\">\n <button type=\"button\" className=\"btn cancel\" onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className=\"btn confirm\" onClick={exportCrop}>\n Crop\n </button>\n </div>\n\n <canvas ref={canvasRef} style={{display: 'none'}} />\n </div>\n )\n}\n","import {useState, useCallback, useRef, useMemo, useEffect, forwardRef} from 'react'\nimport type {InputFileProps, InputFileCropOptions} from './InputFile.types'\nimport {CropEditor} from './CropEditor'\nimport {cn} from '../../../utils/cn'\nimport './InputFile.css'\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction fileExtension(name: string): string {\n const dot = name.lastIndexOf('.')\n return dot >= 0 ? name.slice(dot + 1).toUpperCase() : ''\n}\n\nfunction isImage(file: File): boolean {\n return file.type.startsWith('image/')\n}\n\nfunction FileTypeIcon({ext}: {ext: string}) {\n const label = ext || 'FILE'\n return (\n <div className=\"type-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 40 48\" fill=\"none\">\n <path\n d=\"M4 4C4 1.8 5.8 0 8 0H26L36 10V44C36 46.2 34.2 48 32 48H8C5.8 48 4 46.2 4 44V4Z\"\n fill=\"currentColor\"\n opacity=\"0.12\"\n />\n <path\n d=\"M26 0L36 10H30C27.8 10 26 8.2 26 6V0Z\"\n fill=\"currentColor\"\n opacity=\"0.2\"\n />\n </svg>\n <span className=\"type-ext\">{label}</span>\n </div>\n )\n}\n\nexport const InputFile = forwardRef<HTMLDivElement, InputFileProps>(function InputFile(\n {\n accept,\n multiple = false,\n maxSize,\n maxFiles,\n onChange,\n label,\n helperText,\n errorText,\n error = false,\n disabled = false,\n color = 'primary',\n size = 'md',\n preview = true,\n icon,\n placeholder = 'Drop files here or click to browse',\n dropText = 'Drop files here',\n fullWidth = false,\n crop,\n className,\n ...rest\n },\n ref\n) {\n const [dragging, setDragging] = useState(false)\n const [files, setFiles] = useState<File[]>([])\n const [fileError, setFileError] = useState('')\n const [cropFile, setCropFile] = useState<File | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const dragCounter = useRef(0)\n\n const cropOptions: InputFileCropOptions | null = crop\n ? typeof crop === 'boolean'\n ? {shape: 'square', outputSize: 256, quality: 0.92}\n : {shape: crop.shape ?? 'square', outputSize: crop.outputSize ?? 256, quality: crop.quality ?? 0.92}\n : null\n\n const objectUrls = useMemo(() => {\n return files.map((f) => (isImage(f) ? URL.createObjectURL(f) : null))\n }, [files])\n\n useEffect(() => {\n return () => {\n objectUrls.forEach((url) => {\n if (url) URL.revokeObjectURL(url)\n })\n }\n }, [objectUrls])\n\n const processFiles = useCallback(\n (incoming: FileList | File[]) => {\n const list = Array.from(incoming)\n let accepted = list\n\n if (accept) {\n const patterns = accept.split(',').map((s) => s.trim().toLowerCase())\n accepted = accepted.filter((f) => {\n const ext = '.' + f.name.split('.').pop()?.toLowerCase()\n const mime = f.type.toLowerCase()\n return patterns.some(\n (p) =>\n p === ext ||\n p === mime ||\n (p.endsWith('/*') && mime.startsWith(p.slice(0, -1)))\n )\n })\n }\n\n if (maxSize) {\n const oversized = accepted.filter((f) => f.size > maxSize)\n if (oversized.length) {\n setFileError(`Max file size: ${formatSize(maxSize)}`)\n return\n }\n }\n\n if (maxFiles && accepted.length > maxFiles) {\n setFileError(`Max ${maxFiles} file${maxFiles > 1 ? 's' : ''}`)\n return\n }\n\n setFileError('')\n\n if (cropOptions && accepted.length === 1 && isImage(accepted[0])) {\n setCropFile(accepted[0])\n return\n }\n\n setFiles(accepted)\n onChange?.(accepted)\n },\n [accept, maxSize, maxFiles, onChange, cropOptions]\n )\n\n const handleCropDone = useCallback(\n (cropped: File) => {\n setCropFile(null)\n setFiles([cropped])\n onChange?.([cropped])\n },\n [onChange]\n )\n\n const handleCropCancel = useCallback(() => {\n setCropFile(null)\n }, [])\n\n const handleDragEnter = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (disabled) return\n dragCounter.current++\n setDragging(true)\n },\n [disabled]\n )\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n dragCounter.current--\n if (dragCounter.current <= 0) {\n dragCounter.current = 0\n setDragging(false)\n }\n }, [])\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }, [])\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n dragCounter.current = 0\n setDragging(false)\n if (disabled) return\n if (e.dataTransfer.files.length) {\n processFiles(e.dataTransfer.files)\n }\n },\n [disabled, processFiles]\n )\n\n const handleClick = useCallback(() => {\n if (!disabled) inputRef.current?.click()\n }, [disabled])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files?.length) {\n processFiles(e.target.files)\n }\n },\n [processFiles]\n )\n\n const removeFile = useCallback(\n (index: number) => {\n const url = objectUrls[index]\n if (url) URL.revokeObjectURL(url)\n const next = files.filter((_, i) => i !== index)\n setFiles(next)\n onChange?.(next)\n },\n [files, objectUrls, onChange]\n )\n\n const displayError = errorText || fileError\n const hasError = error || !!fileError\n\n return (\n <div\n ref={ref}\n className={cn('input-file', color, size, fullWidth && 'full-width', disabled && 'disabled', className)}\n {...rest}\n >\n {label && <div className=\"label\">{label}</div>}\n\n <div\n className={cn('dropzone', dragging && 'dragging', hasError && 'error')}\n onClick={handleClick}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }}\n aria-label={label || placeholder}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={handleChange}\n tabIndex={-1}\n className=\"hidden-input\"\n />\n\n <div className=\"content\">\n {icon && <div className=\"icon\">{icon}</div>}\n {!icon && (\n <svg className=\"icon-default\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M12 16V4M12 4L8 8M12 4L16 8M4 17V19C4 20.1 4.9 21 6 21H18C19.1 21 20 20.1 20 19V17\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n <div className=\"text\">\n {dragging ? dropText : placeholder}\n </div>\n {accept && (\n <div className=\"accept\">{accept}</div>\n )}\n </div>\n </div>\n\n {cropFile && cropOptions && (\n <CropEditor\n file={cropFile}\n shape={cropOptions.shape!}\n outputSize={cropOptions.outputSize!}\n quality={cropOptions.quality!}\n onCrop={handleCropDone}\n onCancel={handleCropCancel}\n />\n )}\n\n {helperText && !hasError && (\n <div className=\"helper\">{helperText}</div>\n )}\n {hasError && displayError && (\n <div className=\"error-text\">{displayError}</div>\n )}\n\n {preview && files.length > 0 && !cropFile && (\n <div className=\"preview\">\n {files.map((file, i) => (\n <div key={`${file.name}-${i}`} className=\"item\">\n <div className=\"thumb\">\n {objectUrls[i] ? (\n <img\n src={objectUrls[i]!}\n alt={file.name}\n className=\"image\"\n />\n ) : (\n <FileTypeIcon ext={fileExtension(file.name)} />\n )}\n </div>\n <div className=\"info\">\n <span className=\"name\">{file.name}</span>\n <span className=\"size\">{formatSize(file.size)}</span>\n </div>\n <button\n type=\"button\"\n className=\"remove\"\n onClick={(e) => {\n e.stopPropagation()\n removeFile(i)\n }}\n aria-label={`Remove ${file.name}`}\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n})\n","import {useState, useRef, useCallback, useMemo} from 'react'\nimport type {SelectProps, SelectOption} from './Select.types'\nimport {Popover} from '../../primitives/Popover'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useKeyboardNav} from '../../../utils/useKeyboardNav'\nimport './Select.css'\n\n// Render a selectable list with optional search, grouping and multi-select tags.\nexport function Select({\n options,\n value,\n defaultValue,\n onChange,\n multiple = false,\n searchable = false,\n placeholder = 'Select...',\n disabled = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n color,\n fcolor,\n fullWidth = false,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n loading = false,\n clearable = false,\n maxHeight = 300,\n noOptionsText = 'No options',\n renderOption,\n renderValue,\n className,\n style,\n}: SelectProps) {\n const [open, setOpen] = useState(false)\n const [internalValue, setInternalValue] = useState<string | string[]>(defaultValue ?? (multiple ? [] : ''))\n const [search, setSearch] = useState('')\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const currentValue = value !== undefined ? value : internalValue\n const hasError = error || !!errorText\n\n // Normalize the public value into a string array for rendering and selection logic.\n const selectedValues = useMemo(() => {\n if (Array.isArray(currentValue)) return currentValue\n return currentValue ? [currentValue] : []\n }, [currentValue])\n\n const selectedOptions = useMemo(\n () => options.filter((o) => selectedValues.includes(o.value)),\n [options, selectedValues]\n )\n\n // Filter options locally when the searchable mode is active.\n const filteredOptions = useMemo(() => {\n if (!searchable || !search) return options\n const lower = search.toLowerCase()\n return options.filter((o) => o.label.toLowerCase().includes(lower))\n }, [options, searchable, search])\n\n // Group options\n // Preserve group headers without changing the flat keyboard navigation index map.\n const groupedOptions = useMemo(() => {\n const groups = new Map<string, SelectOption[]>()\n for (const opt of filteredOptions) {\n const key = opt.group ?? ''\n if (!groups.has(key)) groups.set(key, [])\n groups.get(key)!.push(opt)\n }\n return groups\n }, [filteredOptions])\n\n const flatFiltered = filteredOptions\n\n // Toggle or replace the current selection depending on the mode.\n const handleSelect = useCallback(\n (index: number) => {\n const opt = flatFiltered[index]\n if (!opt || opt.disabled) return\n\n if (multiple) {\n const arr = Array.isArray(currentValue) ? currentValue : []\n const newVal = arr.includes(opt.value) ? arr.filter((v) => v !== opt.value) : [...arr, opt.value]\n if (value === undefined) setInternalValue(newVal)\n onChange?.(newVal)\n } else {\n if (value === undefined) setInternalValue(opt.value)\n onChange?.(opt.value)\n setOpen(false)\n setSearch('')\n }\n },\n [flatFiltered, multiple, currentValue, value, onChange]\n )\n\n const {activeIndex, setActiveIndex, resetIndex, onKeyDown} = useKeyboardNav({\n itemCount: flatFiltered.length,\n onSelect: handleSelect,\n onClose: () => {\n setOpen(false)\n setSearch('')\n },\n isOpen: open,\n })\n\n // Open the popover and reset keyboard navigation when the trigger is used.\n const handleTriggerClick = useCallback(() => {\n if (disabled) return\n setOpen((v) => !v)\n resetIndex()\n }, [disabled, resetIndex])\n\n // Reset the current selection without closing the outer field wrapper.\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n const empty = multiple ? [] : ''\n if (value === undefined) setInternalValue(empty)\n onChange?.(empty)\n },\n [multiple, value, onChange]\n )\n\n // Render tags, labels or the placeholder based on the current selection state.\n const displayValue = useMemo(() => {\n if (renderValue && selectedOptions.length > 0) {\n return renderValue(multiple ? selectedOptions : selectedOptions[0])\n }\n if (multiple && selectedOptions.length > 0) {\n return (\n <span className=\"tags\">\n {selectedOptions.map((o) => (\n <span key={o.value} className=\"m-tag\">\n {o.label}\n </span>\n ))}\n </span>\n )\n }\n if (!multiple && selectedOptions.length > 0) {\n return selectedOptions[0].label\n }\n return <span className=\"placeholder\">{placeholder}</span>\n }, [selectedOptions, multiple, renderValue, placeholder])\n\n return (\n <div\n className={cn(\n 'select',\n color && `color-${color}`,\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={triggerRef}\n className={cn('trigger', variant, size, open && 'focused', hasError && 'error', disabled && 'disabled')}\n onClick={handleTriggerClick}\n onKeyDown={onKeyDown as unknown as React.KeyboardEventHandler}\n tabIndex={disabled ? -1 : 0}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-invalid={hasError || undefined}\n id={id}\n >\n <span className=\"value\">{displayValue}</span>\n\n {loading && <span className=\"spinner\" />}\n\n {clearable && selectedValues.length > 0 && !loading && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear selection\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n\n <span className={cn('arrow', open && 'open')} aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\">\n <path\n d=\"M4 6L8 10L12 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </div>\n\n {/* Hidden input for form submission */}\n {name && (\n <input\n type=\"hidden\"\n name={name}\n value={Array.isArray(currentValue) ? currentValue.join(',') : currentValue}\n />\n )}\n\n <Popover\n className={'select-popover'}\n open={open}\n anchorRef={triggerRef}\n onClose={() => {\n setOpen(false)\n setSearch('')\n }}\n matchWidth\n placement=\"bottom-start\"\n >\n <div style={{maxHeight}} className=\"dropdown\">\n {searchable && (\n <div className=\"search-box\">\n <input\n type=\"text\"\n className=\"search-input\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value)\n setActiveIndex(0)\n }}\n onKeyDown={onKeyDown as unknown as React.KeyboardEventHandler}\n autoFocus\n />\n </div>\n )}\n\n {flatFiltered.length === 0 ? (\n <div className=\"no-options\">{noOptionsText}</div>\n ) : (\n <div className=\"options-list\" role=\"listbox\">\n {[...groupedOptions.entries()].map(([group, opts]) => (\n <div key={group}>\n {group && <div className=\"group-header\">{group}</div>}\n {opts.map((opt) => {\n const flatIndex = flatFiltered.indexOf(opt)\n const isActive = flatIndex === activeIndex\n const isSelected = selectedValues.includes(opt.value)\n return (\n <div\n key={opt.value}\n className={cn(\n 'option',\n isActive && 'active',\n isSelected && 'selected',\n opt.disabled && 'disabled'\n )}\n onClick={() => !opt.disabled && handleSelect(flatIndex)}\n onMouseEnter={() => setActiveIndex(flatIndex)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={opt.disabled}\n >\n {multiple && (\n <span className={cn('checkbox', isSelected && 'checked')}>\n {isSelected && (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M3.5 8L6.5 11L12.5 5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n )}\n {renderOption ? renderOption(opt, isActive, isSelected) : opt.label}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n </Popover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n","import {useState, useRef, useCallback, useMemo} from 'react'\nimport type {AutocompleteProps} from './Autocomplete.types'\nimport {Popover} from '../../primitives/Popover'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useKeyboardNav} from '../../../utils/useKeyboardNav'\nimport {useDebouncedCallback} from '../../../utils/useDebounce'\nimport './Autocomplete.css'\n\n// Resolve labels for primitive string options without extra configuration.\nfunction defaultGetLabel<T>(option: T): string {\n if (typeof option === 'string') return option\n return String(option)\n}\n\n// Resolve values for primitive string options without extra configuration.\nfunction defaultGetValue<T>(option: T): string {\n if (typeof option === 'string') return option\n return String(option)\n}\n\n// Apply a basic case-insensitive filter when the caller does not provide one.\nfunction defaultFilter<T>(options: T[], input: string, getLabel: (o: T) => string): T[] {\n if (!input) return options\n const lower = input.toLowerCase()\n return options.filter((o) => getLabel(o).toLowerCase().includes(lower))\n}\n\n// Render a searchable suggestion list with optional free-solo and multi-tag behavior.\nexport function Autocomplete<T = string>({\n options,\n value,\n onChange,\n getOptionLabel = defaultGetLabel,\n getOptionValue = defaultGetValue,\n filterOptions,\n multiple = false,\n freeSolo = false,\n debounceMs = 0,\n onInputChange,\n loading = false,\n loadingText = 'Loading...',\n noOptionsText = 'No options',\n placeholder = 'Type to search...',\n disabled = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n color,\n fcolor,\n fullWidth = false,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n clearable = false,\n maxHeight = 300,\n renderOption,\n renderTags,\n className,\n style,\n}: AutocompleteProps<T>) {\n const [open, setOpen] = useState(false)\n const [inputValue, setInputValue] = useState('')\n const wrapperRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const hasError = error || !!errorText\n\n // Normalize the public value into an array for tag and selection rendering.\n const selectedValues = useMemo(() => {\n if (value == null) return []\n return Array.isArray(value) ? value.filter((item) => item != null) : [value]\n }, [value])\n\n // Filter suggestions locally unless the caller owns that logic.\n const filtered = useMemo(() => {\n if (filterOptions) return filterOptions(options, inputValue)\n return defaultFilter(options, inputValue, getOptionLabel)\n }, [options, inputValue, filterOptions, getOptionLabel])\n\n const debouncedInputChange = useDebouncedCallback((val: string) => onInputChange?.(val), debounceMs)\n\n // Update the visible query and optionally notify async search logic.\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n debouncedInputChange(e.target.value)\n if (!open) setOpen(true)\n },\n [open, debouncedInputChange]\n )\n\n // Apply a selected option to single or multiple value modes.\n const handleSelect = useCallback(\n (index: number) => {\n const opt = filtered[index]\n if (!opt) return\n\n if (multiple) {\n const arr = [...selectedValues]\n const val = getOptionValue(opt)\n const existIdx = arr.findIndex((v) => getOptionValue(v) === val)\n if (existIdx >= 0) {\n arr.splice(existIdx, 1)\n } else {\n arr.push(opt)\n }\n onChange?.(arr)\n setInputValue('')\n inputRef.current?.focus()\n } else {\n onChange?.(opt)\n setInputValue(getOptionLabel(opt))\n setOpen(false)\n }\n },\n [filtered, multiple, selectedValues, getOptionValue, getOptionLabel, onChange]\n )\n\n // Remove a selected tag by index in multiple mode.\n const handleRemoveTag = useCallback(\n (index: number) => {\n const arr = [...selectedValues]\n arr.splice(index, 1)\n onChange?.(multiple ? arr : (arr[0] ?? ('' as unknown as T)))\n },\n [selectedValues, onChange, multiple]\n )\n\n const {\n activeIndex,\n setActiveIndex,\n resetIndex,\n onKeyDown: navKeyDown,\n } = useKeyboardNav({\n itemCount: filtered.length,\n onSelect: handleSelect,\n onClose: () => setOpen(false),\n isOpen: open,\n })\n\n // Combine free-solo submission, tag removal and list navigation.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && freeSolo && activeIndex < 0 && inputValue) {\n onChange?.(inputValue as unknown as T)\n setOpen(false)\n return\n }\n // Backspace removes last tag in multiple\n if (e.key === 'Backspace' && multiple && !inputValue && selectedValues.length > 0) {\n handleRemoveTag(selectedValues.length - 1)\n return\n }\n navKeyDown(e as unknown as React.KeyboardEvent<Element>)\n },\n [freeSolo, activeIndex, inputValue, multiple, selectedValues, onChange, navKeyDown, handleRemoveTag]\n )\n\n // Clear the input query and the selected value(s) together.\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n setInputValue('')\n onChange?.(multiple ? ([] as unknown as T) : ('' as unknown as T))\n inputRef.current?.focus()\n },\n [multiple, onChange]\n )\n\n return (\n <div\n className={cn(\n 'autocomplete',\n color && `color-${color}`,\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={wrapperRef}\n className={cn(\n 'input-wrapper',\n variant,\n size,\n open && 'focused',\n hasError && 'error',\n disabled && 'disabled'\n )}\n onClick={() => inputRef.current?.focus()}\n >\n {multiple &&\n selectedValues.length > 0 &&\n (renderTags ? (\n renderTags(selectedValues, handleRemoveTag)\n ) : (\n <span className=\"tags\">\n {selectedValues.map((v, i) => (\n <span key={getOptionValue(v)} className=\"m-tag\">\n {getOptionLabel(v)}\n <button\n type=\"button\"\n className=\"m-tag-remove\"\n onClick={(e) => {\n e.stopPropagation()\n handleRemoveTag(i)\n }}\n tabIndex={-1}\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </span>\n ))}\n </span>\n ))}\n\n <input\n ref={inputRef}\n type=\"text\"\n className=\"input\"\n value={inputValue}\n onChange={handleInputChange}\n onFocus={() => {\n setOpen(true)\n resetIndex()\n }}\n onKeyDown={handleKeyDown}\n placeholder={selectedValues.length > 0 ? '' : placeholder}\n disabled={disabled}\n id={id}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-invalid={hasError || undefined}\n autoComplete=\"off\"\n />\n\n {loading && <span className=\"spinner\" />}\n\n {clearable && (selectedValues.length > 0 || inputValue) && !loading && !disabled && (\n <button type=\"button\" className=\"clear-btn\" onClick={handleClear} tabIndex={-1}>\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {name && <input type=\"hidden\" name={name} value={selectedValues.map(getOptionValue).join(',')} />}\n\n <Popover\n className={cn('autocomplete-popover', color && `color-${color}`)}\n open={open && (filtered.length > 0 || loading)}\n anchorRef={wrapperRef}\n onClose={() => setOpen(false)}\n matchWidth\n placement=\"bottom-start\"\n >\n <div style={{maxHeight}} className=\"dropdown\">\n {loading ? (\n <div className=\"loading-msg\">{loadingText}</div>\n ) : filtered.length === 0 ? (\n <div className=\"no-options\">{noOptionsText}</div>\n ) : (\n <div className=\"options-list\" role=\"listbox\">\n {filtered.map((opt, i) => {\n const isActive = i === activeIndex\n const isSelected = selectedValues.some((v) => getOptionValue(v) === getOptionValue(opt))\n return (\n <div\n key={getOptionValue(opt)}\n className={cn('option', isActive && 'active', isSelected && 'selected')}\n onClick={() => handleSelect(i)}\n onMouseEnter={() => setActiveIndex(i)}\n role=\"option\"\n aria-selected={isSelected}\n >\n {renderOption ? renderOption(opt, isActive) : getOptionLabel(opt)}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </Popover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n","import {useState, useRef, useCallback, useMemo, useEffect} from 'react'\nimport type {DatePickerProps} from './DatePicker.types'\nimport {Popover} from '../../primitives/Popover'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {\n formatDate,\n parseDate,\n daysInMonth,\n firstDayOfMonth,\n isSameDay,\n isDateInRange,\n getDayNames,\n getMonthNames,\n addMonths,\n stripTime,\n} from '../../../utils/dateUtils'\nimport './DatePicker.css'\n\n// Normalize external date inputs into valid Date objects or null.\nfunction toDate(val: Date | string | undefined): Date | null {\n if (!val) return null\n if (val instanceof Date) return val\n const date = new Date(val)\n return isNaN(date.getTime()) ? null : date\n}\n\nconst ChevronLeftIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M9.5 3.5L5 8L9.5 12.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\nconst ChevronRightIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M6.5 3.5L11 8L6.5 12.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\nconst ClearIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 4L12 12M12 4L4 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" />\n </svg>\n)\n\n// Render a date input with calendar navigation, parsing and optional inline mode.\nexport function DatePicker({\n value,\n defaultValue,\n onChange,\n format = 'dd.MM.yyyy',\n locale = 'pl',\n min,\n max,\n disabledDates,\n placeholder,\n disabled = false,\n readOnly = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n fcolor,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n clearable = false,\n inline = false,\n showTodayButton = true,\n firstDayOfWeek = 1,\n fullWidth = false,\n className,\n style,\n}: DatePickerProps) {\n const [open, setOpen] = useState(false)\n const [internalDate, setInternalDate] = useState<Date | null>(toDate(defaultValue))\n const [inputText, setInputText] = useState('')\n const selectedDate = toDate(value) ?? internalDate\n const [viewDate, setViewDate] = useState(() => {\n const date = selectedDate ?? new Date()\n return new Date(date.getFullYear(), date.getMonth(), 1)\n })\n const [viewMode, setViewMode] = useState<'days' | 'months'>('days')\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const minDate = toDate(min)\n const maxDate = toDate(max)\n const hasError = error || !!errorText\n\n useEffect(() => {\n if (!selectedDate) return\n setViewDate(new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1))\n }, [selectedDate])\n\n const displayText = useMemo(() => {\n if (inputText) return inputText\n return selectedDate ? formatDate(selectedDate, format) : ''\n }, [selectedDate, format, inputText])\n\n const dayNames = getDayNames(locale)\n const monthNames = getMonthNames(locale)\n\n // Centralize date disabling so all calendar paths share the same logic.\n const isDisabled = useCallback(\n (date: Date): boolean => {\n if (!isDateInRange(date, minDate, maxDate)) return true\n if (Array.isArray(disabledDates)) {\n return disabledDates.some((disabledDate) => isSameDay(disabledDate, date))\n }\n if (typeof disabledDates === 'function') {\n return disabledDates(date)\n }\n return false\n },\n [minDate, maxDate, disabledDates]\n )\n\n // Apply the selected date and keep the calendar view aligned with it.\n const handleSelectDate = useCallback(\n (date: Date) => {\n if (isDisabled(date)) return\n if (value === undefined) setInternalDate(date)\n setInputText('')\n setViewDate(new Date(date.getFullYear(), date.getMonth(), 1))\n onChange?.(date)\n if (!inline) setOpen(false)\n },\n [inline, isDisabled, onChange, value]\n )\n\n const handleInputChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setInputText(event.target.value)\n }, [])\n\n // Parse manual input and commit it when it resolves to an allowed date.\n const handleInputBlur = useCallback(() => {\n if (!inputText) return\n const parsed = parseDate(inputText, format)\n if (parsed && !isDisabled(parsed)) {\n handleSelectDate(parsed)\n }\n setInputText('')\n }, [format, handleSelectDate, inputText, isDisabled])\n\n // Clear the current selection without toggling the popover state first.\n const handleClear = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation()\n if (value === undefined) setInternalDate(null)\n setInputText('')\n onChange?.(null)\n },\n [onChange, value]\n )\n\n // Jump directly to today's date through the same selection path.\n const handleToday = useCallback(() => {\n const today = stripTime(new Date())\n handleSelectDate(today)\n }, [handleSelectDate])\n\n // Build the six-week calendar grid including previous and next month fillers.\n const calendarDays = useMemo(() => {\n const year = viewDate.getFullYear()\n const month = viewDate.getMonth()\n const totalDays = daysInMonth(year, month)\n let startDay = firstDayOfMonth(year, month)\n\n if (firstDayOfWeek === 1) {\n startDay = startDay === 0 ? 6 : startDay - 1\n }\n\n const days: Array<{date: Date; currentMonth: boolean}> = []\n\n const prevMonth = month === 0 ? 11 : month - 1\n const prevYear = month === 0 ? year - 1 : year\n const prevDays = daysInMonth(prevYear, prevMonth)\n for (let i = startDay - 1; i >= 0; i--) {\n days.push({date: new Date(prevYear, prevMonth, prevDays - i), currentMonth: false})\n }\n\n for (let day = 1; day <= totalDays; day++) {\n days.push({date: new Date(year, month, day), currentMonth: true})\n }\n\n const remaining = 42 - days.length\n const nextMonth = month === 11 ? 0 : month + 1\n const nextYear = month === 11 ? year + 1 : year\n for (let day = 1; day <= remaining; day++) {\n days.push({date: new Date(nextYear, nextMonth, day), currentMonth: false})\n }\n\n return days\n }, [firstDayOfWeek, viewDate])\n\n const today = stripTime(new Date())\n\n // Render the day or month view depending on the current picker mode.\n const renderCalendar = () => (\n <div className=\"calendar\">\n <div className=\"calendar-header\">\n <button\n type=\"button\"\n className=\"nav-btn\"\n onClick={() => setViewDate(addMonths(viewDate, -1))}\n aria-label=\"Previous month\"\n >\n <ChevronLeftIcon />\n </button>\n <button\n type=\"button\"\n className=\"header-title\"\n onClick={() => setViewMode((current) => (current === 'days' ? 'months' : 'days'))}\n >\n {monthNames[viewDate.getMonth()]} {viewDate.getFullYear()}\n </button>\n <button\n type=\"button\"\n className=\"nav-btn\"\n onClick={() => setViewDate(addMonths(viewDate, 1))}\n aria-label=\"Next month\"\n >\n <ChevronRightIcon />\n </button>\n </div>\n\n {viewMode === 'days' ? (\n <>\n <div className=\"day-names\">\n {dayNames.map((dayName) => (\n <span key={dayName} className=\"day-name\">\n {dayName}\n </span>\n ))}\n </div>\n\n <div className=\"day-grid\">\n {calendarDays.map(({date, currentMonth}, index) => {\n const isSelected = selectedDate ? isSameDay(date, selectedDate) : false\n const isToday = isSameDay(date, today)\n const disabledDay = isDisabled(date)\n\n return (\n <button\n key={`${date.toISOString()}-${index}`}\n type=\"button\"\n className={cn(\n 'day',\n !currentMonth && 'other-month',\n isToday && 'today',\n isSelected && 'selected',\n disabledDay && 'disabled'\n )}\n onClick={() => handleSelectDate(date)}\n disabled={disabledDay}\n tabIndex={-1}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n </>\n ) : (\n <div className=\"month-grid\">\n {monthNames.map((monthName, index) => (\n <button\n key={monthName}\n type=\"button\"\n className={cn('month-cell', viewDate.getMonth() === index && 'selected')}\n onClick={() => {\n setViewDate(new Date(viewDate.getFullYear(), index, 1))\n setViewMode('days')\n }}\n >\n {monthName.slice(0, 3)}\n </button>\n ))}\n </div>\n )}\n\n {showTodayButton && (\n <div className=\"footer\">\n <button type=\"button\" className=\"today-btn\" onClick={handleToday}>\n Today\n </button>\n </div>\n )}\n </div>\n )\n\n const calendarIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"1\" y=\"3\" width=\"14\" height=\"12\" rx=\"2\" />\n <line x1=\"1\" y1=\"7\" x2=\"15\" y2=\"7\" />\n <line x1=\"5\" y1=\"1\" x2=\"5\" y2=\"4\" />\n <line x1=\"11\" y1=\"1\" x2=\"11\" y2=\"4\" />\n </svg>\n )\n\n if (inline) {\n return (\n <div\n className={cn(\n 'date-picker',\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n style={style}\n >\n {label && <label className={cn('label', hasError && 'error', required && 'required')}>{label}</label>}\n {renderCalendar()}\n </div>\n )\n }\n\n return (\n <div\n className={cn('date-picker', ...getAppearanceClassNames({fcolor}), fullWidth && 'full-width', className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={triggerRef}\n className={cn('trigger', variant, size, open && 'focused', hasError && 'error', disabled && 'disabled')}\n onClick={() => !disabled && !readOnly && setOpen(true)}\n >\n <span className=\"icon\">{calendarIcon}</span>\n <input\n type=\"text\"\n className=\"input\"\n value={displayText}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n placeholder={placeholder ?? format.toLowerCase()}\n disabled={disabled}\n readOnly={readOnly}\n id={id}\n aria-invalid={hasError || undefined}\n />\n {clearable && selectedDate && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear date\"\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {name && selectedDate && (\n <input type=\"hidden\" name={name} value={selectedDate.toISOString().split('T')[0]} />\n )}\n\n <Popover\n className={'date-picker-popover'}\n open={open}\n anchorRef={triggerRef}\n onClose={() => setOpen(false)}\n placement=\"bottom-start\"\n >\n {renderCalendar()}\n </Popover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {Popover} from '../../primitives/Popover'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {\n addMonths,\n daysInMonth,\n firstDayOfMonth,\n formatDate,\n getDayNames,\n getMonthNames,\n isDateInRange,\n isSameDay,\n stripTime,\n} from '../../../utils/dateUtils'\nimport type {DateRangePickerProps, DateRangePreset} from './DateRangePicker.types'\nimport './DateRangePicker.css'\n\nfunction toDate(value: Date | string | null | undefined): Date | null {\n if (!value) return null\n if (value instanceof Date) return stripTime(value)\n const date = new Date(value)\n return isNaN(date.getTime()) ? null : stripTime(date)\n}\n\nfunction sortRange(start: Date, end: Date) {\n return start.getTime() <= end.getTime() ? {start, end} : {start: end, end: start}\n}\n\nfunction isBetween(date: Date, start: Date | null, end: Date | null) {\n if (!start || !end) return false\n const time = date.getTime()\n return time > start.getTime() && time < end.getTime()\n}\n\nfunction formatRangeLabel(start: Date | null, end: Date | null, format: string) {\n if (start && end) {\n return `${formatDate(start, format)} - ${formatDate(end, format)}`\n }\n\n if (start) {\n return `${formatDate(start, format)} - ...`\n }\n\n return ''\n}\n\nfunction startOfMonth(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), 1)\n}\n\nfunction endOfMonth(date: Date) {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0)\n}\n\nfunction daysAgo(days: number): Date {\n const date = stripTime(new Date())\n date.setDate(date.getDate() - (days - 1))\n return date\n}\n\nfunction monthsAgo(months: number): Date {\n const today = stripTime(new Date())\n return new Date(today.getFullYear(), today.getMonth() - months, today.getDate())\n}\n\nfunction getDefaultPresets(): DateRangePreset[] {\n const today = stripTime(new Date())\n const previousMonthDate = new Date(today.getFullYear(), today.getMonth() - 1, 1)\n\n return [\n {label: 'Today', value: {start: today, end: today}},\n {label: '2 days', value: {start: daysAgo(2), end: today}},\n {label: '3 days', value: {start: daysAgo(3), end: today}},\n {label: '7 days', value: {start: daysAgo(7), end: today}},\n {label: '14 days', value: {start: daysAgo(14), end: today}},\n {label: '31 days', value: {start: daysAgo(31), end: today}},\n {label: 'This month', value: {start: startOfMonth(today), end: endOfMonth(today)}},\n {label: 'Previous month', value: {start: startOfMonth(previousMonthDate), end: endOfMonth(previousMonthDate)}},\n {label: '2 months', value: {start: monthsAgo(2), end: today}},\n {label: '3 months', value: {start: monthsAgo(3), end: today}},\n {label: '6 months', value: {start: monthsAgo(6), end: today}},\n {label: '1 year', value: {start: monthsAgo(12), end: today}},\n ]\n}\n\nconst CalendarIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"1\" y=\"3\" width=\"14\" height=\"12\" rx=\"2\" />\n <line x1=\"1\" y1=\"7\" x2=\"15\" y2=\"7\" />\n <line x1=\"5\" y1=\"1\" x2=\"5\" y2=\"4\" />\n <line x1=\"11\" y1=\"1\" x2=\"11\" y2=\"4\" />\n </svg>\n)\n\nconst ChevronLeftIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M9.5 3.5L5 8L9.5 12.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\nconst ChevronRightIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M6.5 3.5L11 8L6.5 12.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\nconst ClearIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 4L12 12M12 4L4 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" />\n </svg>\n)\n\nfunction buildCalendarDays(viewDate: Date, firstDayOfWeek: 0 | 1) {\n const year = viewDate.getFullYear()\n const month = viewDate.getMonth()\n const totalDays = daysInMonth(year, month)\n let startDay = firstDayOfMonth(year, month)\n\n if (firstDayOfWeek === 1) {\n startDay = startDay === 0 ? 6 : startDay - 1\n }\n\n const days = [] as Array<{date: Date; currentMonth: boolean}>\n\n const previousMonth = month === 0 ? 11 : month - 1\n const previousYear = month === 0 ? year - 1 : year\n const previousMonthDays = daysInMonth(previousYear, previousMonth)\n\n for (let index = startDay - 1; index >= 0; index -= 1) {\n days.push({date: new Date(previousYear, previousMonth, previousMonthDays - index), currentMonth: false})\n }\n\n for (let day = 1; day <= totalDays; day += 1) {\n days.push({date: new Date(year, month, day), currentMonth: true})\n }\n\n const remaining = 42 - days.length\n const nextMonth = month === 11 ? 0 : month + 1\n const nextYear = month === 11 ? year + 1 : year\n\n for (let day = 1; day <= remaining; day += 1) {\n days.push({date: new Date(nextYear, nextMonth, day), currentMonth: false})\n }\n\n return days\n}\n\n// Render a single control for start and end date selection inside one calendar popover.\nexport function DateRangePicker({\n value,\n defaultValue,\n onChange,\n format = 'dd.MM.yyyy',\n locale = 'pl',\n min,\n max,\n disabledDates,\n placeholder = 'Select date range...',\n disabled = false,\n readOnly = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n fcolor,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n clearable = false,\n inline = false,\n showTodayButton = true,\n presets = false,\n presetsSidebar = false,\n firstDayOfWeek = 1,\n fullWidth = false,\n allowSameDay = true,\n className,\n style,\n}: DateRangePickerProps) {\n const controlledRange = value\n ? {\n start: toDate(value.start),\n end: toDate(value.end),\n }\n : null\n const [internalRange, setInternalRange] = useState(() => ({\n start: toDate(defaultValue?.start),\n end: toDate(defaultValue?.end),\n }))\n const [hoveredDate, setHoveredDate] = useState<Date | null>(null)\n const [open, setOpen] = useState(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const selectedRange = controlledRange ?? internalRange\n const startDate = selectedRange.start\n const endDate = selectedRange.end\n const minDate = toDate(min)\n const maxDate = toDate(max)\n const hasError = error || !!errorText\n const dayNames = getDayNames(locale)\n const monthNames = getMonthNames(locale)\n const availablePresets = useMemo(() => {\n if (presets === true || (presetsSidebar && !presets)) {\n return getDefaultPresets()\n }\n\n if (Array.isArray(presets)) {\n return presets\n }\n\n return []\n }, [presets, presetsSidebar])\n\n const [viewDate, setViewDate] = useState(() => {\n const baseDate = startDate ?? new Date()\n return new Date(baseDate.getFullYear(), baseDate.getMonth(), 1)\n })\n\n useEffect(() => {\n if (!startDate) return\n setViewDate(new Date(startDate.getFullYear(), startDate.getMonth(), 1))\n }, [startDate])\n\n const isDisabled = useCallback(\n (date: Date): boolean => {\n if (!isDateInRange(date, minDate, maxDate)) return true\n if (Array.isArray(disabledDates)) {\n return disabledDates.some((disabledDate) => isSameDay(disabledDate, date))\n }\n if (typeof disabledDates === 'function') {\n return disabledDates(date)\n }\n return false\n },\n [disabledDates, maxDate, minDate]\n )\n\n const commitRange = useCallback(\n (nextRange: {start: Date | null; end: Date | null}) => {\n if (value === undefined) {\n setInternalRange(nextRange)\n }\n onChange?.(nextRange)\n },\n [onChange, value]\n )\n\n const handleDayClick = useCallback(\n (date: Date) => {\n if (isDisabled(date)) return\n\n if (!startDate || (startDate && endDate)) {\n commitRange({start: date, end: null})\n setHoveredDate(null)\n return\n }\n\n if (!allowSameDay && isSameDay(date, startDate)) {\n return\n }\n\n const orderedRange = sortRange(startDate, date)\n commitRange(orderedRange)\n setHoveredDate(null)\n\n if (!inline) {\n setOpen(false)\n }\n },\n [allowSameDay, commitRange, endDate, inline, isDisabled, startDate]\n )\n\n const handleClear = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation()\n commitRange({start: null, end: null})\n setHoveredDate(null)\n },\n [commitRange]\n )\n\n const handleToday = useCallback(() => {\n const today = stripTime(new Date())\n if (isDisabled(today)) return\n commitRange({start: today, end: today})\n setViewDate(new Date(today.getFullYear(), today.getMonth(), 1))\n setHoveredDate(null)\n if (!inline) {\n setOpen(false)\n }\n }, [commitRange, inline, isDisabled])\n\n const handlePresetClick = useCallback(\n (preset: DateRangePreset) => {\n const start = toDate(preset.value.start)\n const end = toDate(preset.value.end)\n\n if (!start || !end) {\n return\n }\n\n const orderedRange = sortRange(start, end)\n\n if (isDisabled(orderedRange.start) || isDisabled(orderedRange.end)) {\n return\n }\n\n commitRange(orderedRange)\n setViewDate(new Date(orderedRange.start.getFullYear(), orderedRange.start.getMonth(), 1))\n setHoveredDate(null)\n\n if (!inline) {\n setOpen(false)\n }\n },\n [commitRange, inline, isDisabled]\n )\n\n const previewEnd = startDate && !endDate ? hoveredDate : null\n const firstMonth = viewDate\n const secondMonth = addMonths(viewDate, 1)\n const today = stripTime(new Date())\n\n const displayValue = useMemo(() => formatRangeLabel(startDate, endDate, format), [endDate, format, startDate])\n\n const calendarMonths = useMemo(\n () =>\n [firstMonth, secondMonth].map((monthDate) => ({\n monthDate,\n days: buildCalendarDays(monthDate, firstDayOfWeek),\n })),\n [firstDayOfWeek, firstMonth, secondMonth]\n )\n\n const summaryText =\n startDate && endDate\n ? `${formatDate(startDate, format)} - ${formatDate(endDate, format)}`\n : startDate\n ? `${formatDate(startDate, format)} - ...`\n : placeholder\n\n const showSidebar = presetsSidebar && availablePresets.length > 0\n const showInlinePresets = !presetsSidebar && availablePresets.length > 0\n\n const renderPresetsSidebar = () => (\n <div className=\"presets-sidebar\">\n {availablePresets.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n className=\"preset-sidebar-btn\"\n onClick={() => handlePresetClick(preset)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )\n\n const renderCalendarContent = () => (\n <div className=\"calendar-body\">\n <div className=\"calendar-top\">\n <div className=\"calendar-caption\">\n <span className=\"caption-title\">\n {monthNames[firstMonth.getMonth()]} {firstMonth.getFullYear()}\n </span>\n <span className=\"caption-subtitle\">Select start and end dates in one panel.</span>\n </div>\n <div className=\"nav-actions\">\n <button\n type=\"button\"\n className=\"nav-btn\"\n onClick={() => setViewDate(addMonths(viewDate, -1))}\n aria-label=\"Previous month\"\n >\n <ChevronLeftIcon />\n </button>\n <button\n type=\"button\"\n className=\"nav-btn\"\n onClick={() => setViewDate(addMonths(viewDate, 1))}\n aria-label=\"Next month\"\n >\n <ChevronRightIcon />\n </button>\n </div>\n </div>\n\n {showInlinePresets && (\n <div className=\"presets\">\n {availablePresets.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n className=\"preset-btn\"\n onClick={() => handlePresetClick(preset)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"months\">\n {calendarMonths.map(({monthDate, days}) => (\n <div key={monthDate.toISOString()} className=\"month-panel\">\n <div className=\"month-title\">\n {monthNames[monthDate.getMonth()]} {monthDate.getFullYear()}\n </div>\n <div className=\"day-names\">\n {dayNames.map((dayName) => (\n <span key={`${monthDate.toISOString()}-${dayName}`} className=\"day-name\">\n {dayName}\n </span>\n ))}\n </div>\n <div className=\"day-grid\">\n {days.map(({date, currentMonth}, index) => {\n const disabledDay = isDisabled(date)\n const selectedStart = startDate ? isSameDay(date, startDate) : false\n const selectedEnd = endDate ? isSameDay(date, endDate) : false\n const inRange = isBetween(date, startDate, endDate)\n const previewRangeData =\n !endDate && startDate && previewEnd ? sortRange(startDate, previewEnd) : null\n const previewRange = previewRangeData\n ? isBetween(date, previewRangeData.start, previewRangeData.end)\n : false\n const previewEdge = previewRangeData\n ? isSameDay(date, previewRangeData.start) || isSameDay(date, previewRangeData.end)\n : false\n\n return (\n <button\n key={`${monthDate.toISOString()}-${index}`}\n type=\"button\"\n className={cn(\n 'day',\n !currentMonth && 'other-month',\n isSameDay(date, today) && 'today',\n selectedStart && 'range-start selected',\n selectedEnd && 'range-end selected',\n inRange && 'in-range',\n previewRange && !previewEdge && 'preview-range',\n disabledDay && 'disabled'\n )}\n onClick={() => handleDayClick(date)}\n onMouseEnter={() => startDate && !endDate && setHoveredDate(date)}\n onFocus={() => startDate && !endDate && setHoveredDate(date)}\n disabled={disabledDay}\n tabIndex={-1}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"footer\">\n <span className=\"summary\">{summaryText}</span>\n <div className=\"footer-actions\">\n {clearable && (startDate || endDate) && (\n <button\n type=\"button\"\n className=\"footer-btn\"\n onClick={(event) => {\n event.preventDefault()\n commitRange({start: null, end: null})\n setHoveredDate(null)\n }}\n >\n Clear\n </button>\n )}\n {showTodayButton && (\n <button type=\"button\" className=\"footer-btn\" onClick={handleToday}>\n Today\n </button>\n )}\n </div>\n </div>\n </div>\n )\n\n const renderCalendar = () => (\n <div className={cn('date-range-calendar', showSidebar && 'with-sidebar')}>\n {showSidebar && renderPresetsSidebar()}\n {renderCalendarContent()}\n </div>\n )\n\n if (inline) {\n return (\n <div\n className={cn(\n 'date-range-picker',\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n style={style}\n >\n {label && <label className={cn('label', hasError && 'error', required && 'required')}>{label}</label>}\n {renderCalendar()}\n </div>\n )\n }\n\n return (\n <div\n className={cn(\n 'date-range-picker',\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={triggerRef}\n className={cn('trigger', variant, size, open && 'focused', hasError && 'error', disabled && 'disabled')}\n onClick={() => !disabled && !readOnly && setOpen(true)}\n >\n <span className=\"icon\">\n <CalendarIcon />\n </span>\n <input\n type=\"text\"\n className=\"input\"\n value={displayValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly\n id={id}\n aria-invalid={hasError || undefined}\n />\n {clearable && (startDate || endDate) && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear date range\"\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {name && startDate && endDate && (\n <input\n type=\"hidden\"\n name={name}\n value={`${startDate.toISOString().split('T')[0]}:${endDate.toISOString().split('T')[0]}`}\n />\n )}\n\n <Popover\n className={'date-range-picker-popover'}\n open={open}\n anchorRef={triggerRef}\n onClose={() => {\n setOpen(false)\n setHoveredDate(null)\n }}\n placement=\"bottom-start\"\n >\n {renderCalendar()}\n </Popover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n","import {useState, useRef, useCallback, useMemo, useEffect} from 'react'\nimport type {TimePickerProps} from './TimePicker.types'\nimport {Popover} from '../../primitives/Popover'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {formatTime, parseTime} from '../../../utils/dateUtils'\nimport './TimePicker.css'\n\n// Compare time tuples so min/max checks can stay string-format agnostic.\nfunction compareTimeParts(\n left: {hours: number; minutes: number; seconds: number},\n right: {hours: number; minutes: number; seconds: number}\n): number {\n if (left.hours !== right.hours) return left.hours - right.hours\n if (left.minutes !== right.minutes) return left.minutes - right.minutes\n return left.seconds - right.seconds\n}\n\n// Check whether a time falls within optional min and max boundaries.\nfunction isTimeInRange(\n value: {hours: number; minutes: number; seconds: number},\n min?: {hours: number; minutes: number; seconds: number} | null,\n max?: {hours: number; minutes: number; seconds: number} | null\n): boolean {\n if (min && compareTimeParts(value, min) < 0) return false\n if (max && compareTimeParts(value, max) > 0) return false\n return true\n}\n\nconst ClearIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 4L12 12M12 4L4 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" />\n </svg>\n)\n\n// Render a time input backed by scrollable hour, minute and second columns.\nexport function TimePicker({\n value,\n defaultValue,\n onChange,\n format = '24h',\n showSeconds = false,\n minuteStep = 1,\n min,\n max,\n placeholder,\n disabled = false,\n readOnly = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n fcolor,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n clearable = false,\n fullWidth = false,\n className,\n style,\n}: TimePickerProps) {\n const [open, setOpen] = useState(false)\n const [internalValue, setInternalValue] = useState(defaultValue ?? '')\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const currentValue = value !== undefined ? value : internalValue\n const hasError = error || !!errorText\n const parsed = parseTime(currentValue)\n const minTime = parseTime(min ?? '')\n const maxTime = parseTime(max ?? '')\n\n // Build the visible hour list based on the selected time format.\n const hours = useMemo(() => {\n const items: number[] = []\n const maxHour = format === '12h' ? 12 : 23\n const startHour = format === '12h' ? 1 : 0\n for (let index = startHour; index <= maxHour; index++) {\n items.push(index)\n }\n return items\n }, [format])\n\n // Build the minute list using the configured step size.\n const minutes = useMemo(() => {\n const items: number[] = []\n for (let index = 0; index < 60; index += minuteStep) {\n items.push(index)\n }\n return items\n }, [minuteStep])\n\n // Build the seconds list only when the picker exposes seconds.\n const seconds = useMemo(() => {\n if (!showSeconds) return []\n const items: number[] = []\n for (let index = 0; index < 60; index++) {\n items.push(index)\n }\n return items\n }, [showSeconds])\n\n // Reuse range validation for list rendering and direct text input.\n const isSelectable = useCallback(\n (hoursValue: number, minutesValue: number, secondsValue: number = 0) => {\n return isTimeInRange({hours: hoursValue, minutes: minutesValue, seconds: secondsValue}, minTime, maxTime)\n },\n [maxTime, minTime]\n )\n\n // Apply the selected time and keep uncontrolled usage in sync.\n const handleSelect = useCallback(\n (hoursValue: number, minutesValue: number, secondsValue: number = 0) => {\n if (!isSelectable(hoursValue, minutesValue, secondsValue)) return\n const time = formatTime(hoursValue, minutesValue, secondsValue, showSeconds)\n if (value === undefined) setInternalValue(time)\n onChange?.(time)\n },\n [isSelectable, onChange, showSeconds, value]\n )\n\n const handleInputChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const raw = event.target.value\n if (value === undefined) setInternalValue(raw)\n },\n [value]\n )\n\n // Normalize manual input once the user leaves the field.\n const handleInputBlur = useCallback(() => {\n const nextValue = parseTime(currentValue)\n if (nextValue && isTimeInRange(nextValue, minTime, maxTime)) {\n const time = formatTime(nextValue.hours, nextValue.minutes, nextValue.seconds, showSeconds)\n if (value === undefined) setInternalValue(time)\n onChange?.(time)\n }\n }, [currentValue, maxTime, minTime, onChange, showSeconds, value])\n\n // Clear the current time without closing the trigger first.\n const handleClear = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation()\n if (value === undefined) setInternalValue('')\n onChange?.('')\n },\n [onChange, value]\n )\n\n const clockIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" />\n <line x1=\"8\" y1=\"4\" x2=\"8\" y2=\"8\" />\n <line x1=\"8\" y1=\"8\" x2=\"11\" y2=\"10\" />\n </svg>\n )\n\n return (\n <div\n className={cn('time-picker', ...getAppearanceClassNames({fcolor}), fullWidth && 'full-width', className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={triggerRef}\n className={cn('trigger', variant, size, open && 'focused', hasError && 'error', disabled && 'disabled')}\n onClick={() => !disabled && !readOnly && setOpen(true)}\n >\n <span className=\"icon\">{clockIcon}</span>\n <input\n type=\"text\"\n className=\"input\"\n value={currentValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n placeholder={placeholder ?? (showSeconds ? 'HH:MM:SS' : 'HH:MM')}\n disabled={disabled}\n readOnly={readOnly}\n id={id}\n aria-invalid={hasError || undefined}\n />\n {clearable && currentValue && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear time\"\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {name && <input type=\"hidden\" name={name} value={currentValue} />}\n\n <Popover className=\"time-picker-popover\" open={open} anchorRef={triggerRef} onClose={() => setOpen(false)} placement=\"bottom-start\">\n <div className=\"columns\">\n <TimeColumn\n items={hours}\n selected={parsed?.hours}\n onSelect={(hoursValue) => handleSelect(hoursValue, parsed?.minutes ?? 0, parsed?.seconds ?? 0)}\n isDisabled={(hoursValue) =>\n !isSelectable(hoursValue, parsed?.minutes ?? 0, parsed?.seconds ?? 0)\n }\n label=\"Hr\"\n />\n <TimeColumn\n items={minutes}\n selected={parsed?.minutes}\n onSelect={(minutesValue) =>\n handleSelect(parsed?.hours ?? 0, minutesValue, parsed?.seconds ?? 0)\n }\n isDisabled={(minutesValue) =>\n !isSelectable(parsed?.hours ?? 0, minutesValue, parsed?.seconds ?? 0)\n }\n label=\"Min\"\n />\n {showSeconds && (\n <TimeColumn\n items={seconds}\n selected={parsed?.seconds}\n onSelect={(secondsValue) =>\n handleSelect(parsed?.hours ?? 0, parsed?.minutes ?? 0, secondsValue)\n }\n isDisabled={(secondsValue) =>\n !isSelectable(parsed?.hours ?? 0, parsed?.minutes ?? 0, secondsValue)\n }\n label=\"Sec\"\n />\n )}\n </div>\n </Popover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n\n// Render one scrollable time column and keep the selected value centered.\nfunction TimeColumn({\n items,\n selected,\n onSelect,\n isDisabled,\n label,\n}: {\n items: number[]\n selected?: number\n onSelect: (value: number) => void\n isDisabled?: (value: number) => boolean\n label: string\n}) {\n const listRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (selected === undefined || !listRef.current) return\n const element = listRef.current.querySelector(`[data-value=\"${selected}\"]`) as HTMLElement | null\n if (element) {\n const list = listRef.current\n list.scrollTop = element.offsetTop - list.clientHeight / 2 + element.offsetHeight / 2\n }\n }, [selected])\n\n const pad = (value: number) => value.toString().padStart(2, '0')\n\n return (\n <div className=\"column\">\n <div className=\"column-label\">{label}</div>\n <div ref={listRef} className=\"column-list\">\n {items.map((item) => {\n const disabled = isDisabled?.(item) ?? false\n return (\n <button\n key={item}\n type=\"button\"\n data-value={item}\n className={cn('column-item', item === selected && 'selected', disabled && 'disabled')}\n onClick={() => onSelect(item)}\n disabled={disabled}\n >\n {pad(item)}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","import {createContext, useContext} from 'react'\nimport type {FormContextValue} from './Form.types'\n\nexport const FormContext = createContext<FormContextValue | null>(null)\n\n// Read the nearest form context to integrate custom fields with shared state.\nexport function useFormContext(): FormContextValue | null {\n return useContext(FormContext)\n}\n","import {useState, useRef, useCallback, useMemo} from 'react'\nimport type {FormProps, FieldRegistration, FormContextValue, FormHelpers} from './Form.types'\nimport {FormContext} from './FormContext'\nimport {validateRequired} from '../../../utils/validators'\nimport type {ValidationResult} from '../../../utils/validators'\nimport './Form.css'\n\n// Coordinate form values, validation state and submit helpers through context.\nexport function Form({\n initialValues = {},\n onSubmit,\n onChange,\n validationMode = 'onBlur',\n children,\n className,\n style,\n noValidate = true,\n}: FormProps) {\n const [values, setValues] = useState<Record<string, unknown>>({...initialValues})\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [touched, setTouched] = useState<Record<string, boolean>>({})\n const [isSubmitting, setIsSubmitting] = useState(false)\n const fieldsRef = useRef<Map<string, FieldRegistration>>(new Map())\n\n // Track mounted fields so validation stays aligned with active inputs.\n const registerField = useCallback((reg: FieldRegistration) => {\n fieldsRef.current.set(reg.name, reg)\n }, [])\n\n const unregisterField = useCallback((name: string) => {\n fieldsRef.current.delete(name)\n }, [])\n\n // Run required and custom validators without mutating visible error state yet.\n const validateFieldInternal = useCallback(\n (name: string, val?: unknown): ValidationResult => {\n const reg = fieldsRef.current.get(name)\n if (!reg) return {valid: true}\n\n const fieldValue = val !== undefined ? val : values[name]\n const strValue = fieldValue != null ? String(fieldValue) : ''\n\n // Required check\n if (reg.required) {\n const reqResult = validateRequired(strValue)\n if (!reqResult.valid) return reqResult\n }\n\n // Custom validators\n if (reg.validate) {\n for (const validator of reg.validate) {\n const result = validator(strValue)\n if (!result.valid) return result\n }\n }\n\n return {valid: true}\n },\n [values]\n )\n\n // Persist the latest validation result for a single field.\n const validateField = useCallback(\n (name: string): ValidationResult => {\n const result = validateFieldInternal(name)\n setErrors((prev) => {\n if (result.valid) {\n const next = {...prev}\n delete next[name]\n return next\n }\n return {...prev, [name]: result.error!}\n })\n return result\n },\n [validateFieldInternal]\n )\n\n // Validate every registered field before submit.\n const validateAll = useCallback((): boolean => {\n let allValid = true\n const newErrors: Record<string, string> = {}\n\n for (const [name] of fieldsRef.current) {\n const result = validateFieldInternal(name)\n if (!result.valid) {\n allValid = false\n newErrors[name] = result.error!\n }\n }\n\n setErrors(newErrors)\n // Mark all as touched\n const allTouched: Record<string, boolean> = {}\n for (const [name] of fieldsRef.current) {\n allTouched[name] = true\n }\n setTouched(allTouched)\n\n return allValid\n }, [validateFieldInternal])\n\n // Update field values and trigger onChange or validation according to mode.\n const setFieldValue = useCallback(\n (name: string, val: unknown) => {\n setValues((prev) => {\n const next = {...prev, [name]: val}\n onChange?.(next)\n return next\n })\n\n if (validationMode === 'onChange' && touched[name]) {\n // Defer validation to next tick so values are updated\n setTimeout(() => validateField(name), 0)\n }\n },\n [onChange, validationMode, touched, validateField]\n )\n\n const setFieldError = useCallback((name: string, error: string) => {\n setErrors((prev) => ({...prev, [name]: error}))\n }, [])\n\n // Mark fields as touched so blur validation can start surfacing errors.\n const setFieldTouched = useCallback(\n (name: string, isTouched: boolean) => {\n setTouched((prev) => ({...prev, [name]: isTouched}))\n if (validationMode === 'onBlur' && isTouched) {\n validateField(name)\n }\n },\n [validationMode, validateField]\n )\n\n const resetForm = useCallback(() => {\n setValues({...initialValues})\n setErrors({})\n setTouched({})\n setIsSubmitting(false)\n }, [initialValues])\n\n // Guard submit flow with validation and a single in-flight submission state.\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault()\n if (isSubmitting) return\n\n const valid = validateAll()\n if (!valid) return\n\n setIsSubmitting(true)\n const helpers: FormHelpers = {\n setSubmitting: setIsSubmitting,\n resetForm,\n setFieldError,\n }\n\n try {\n await onSubmit?.(values, helpers)\n } finally {\n setIsSubmitting(false)\n }\n },\n [isSubmitting, validateAll, values, onSubmit, resetForm, setFieldError]\n )\n\n // Memoize the public form context to limit downstream re-renders.\n const ctx = useMemo<FormContextValue>(\n () => ({\n values,\n errors,\n touched,\n registerField,\n unregisterField,\n setFieldValue,\n setFieldError,\n setFieldTouched,\n validateField,\n validateAll,\n resetForm,\n isSubmitting,\n }),\n [\n values,\n errors,\n touched,\n registerField,\n unregisterField,\n setFieldValue,\n setFieldError,\n setFieldTouched,\n validateField,\n validateAll,\n resetForm,\n isSubmitting,\n ]\n )\n\n return (\n <FormContext.Provider value={ctx}>\n <form onSubmit={handleSubmit} noValidate={noValidate} className={`form${className ? ` ${className}` : ''}`} style={style}>\n {typeof children === 'function' ? children(ctx) : children}\n </form>\n </FormContext.Provider>\n )\n}\n","import {useEffect, useCallback} from 'react'\nimport {useFormContext} from './FormContext'\nimport type {ValidatorFn} from '../../../utils/validators'\n\nexport interface UseFormFieldOptions {\n validate?: ValidatorFn[]\n required?: boolean\n}\n\nexport interface UseFormFieldReturn {\n value: unknown\n error: string | undefined\n touched: boolean\n onChange: (value: unknown) => void\n onBlur: () => void\n}\n\n// Connect a field name to the nearest form context and expose field-level helpers.\nexport function useFormField(name: string, options?: UseFormFieldOptions): UseFormFieldReturn {\n const ctx = useFormContext()\n\n // Register the field definition so the form can validate and reset it centrally.\n useEffect(() => {\n if (!ctx) return\n ctx.registerField({\n name,\n validate: options?.validate,\n required: options?.required,\n })\n return () => ctx.unregisterField(name)\n }, [ctx, name, options?.validate, options?.required])\n\n // Forward value updates into the form state.\n const onChange = useCallback(\n (val: unknown) => {\n ctx?.setFieldValue(name, val)\n },\n [ctx, name]\n )\n\n // Mark the field as touched when the control loses focus.\n const onBlur = useCallback(() => {\n ctx?.setFieldTouched(name, true)\n }, [ctx, name])\n\n return {\n value: ctx?.values[name] ?? '',\n error: ctx?.errors[name],\n touched: ctx?.touched[name] ?? false,\n onChange,\n onBlur,\n }\n}\n"],"mappings":"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,QAAQ,MAAU,IAIvD,QAAO,EACH,0BAA0B,OAAO,KAAU,WAAW,GAAG,EAAM,MAAM,GACxE;;;;ACvEL,SAAgB,GAAU,EACtB,UAAO,WACP,YAAS,IACT,YACA,YACA,UACA,WACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,cACA,cACA,UACA,aACA,GAAG,KACY;CACf,IAAM,IAAe,GAAuB,EAAC,UAAM,CAAC;AAEpD,QACI,kBAAC,OAAD;EACI,WAAW,EACP,aACA,GACA,KAAU,UACV,GAAG,GAA2B;GAC1B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACH,CAAC,EACF,EACH;EACD,OAAO;GAAC,GAAG;GAAc,GAAG;GAAM;EAClC,GAAI;EAEH;EACC,CAAA;;;;ACxDd,SAAgB,EAAwB,EAAC,UAAO,aAA6D;AACzG,QAAO,CAAC,KAAS,UAAU,KAAS,KAAU,UAAU,IAAS;;;;ACFrE,SAAgB,GAAQ,EACpB,eAAY,QACZ,YAAS,IACT,cAAW,IACX,YAAS,IACT,UAAO,WACP,WACA,cACA,aACA,GAAG,KACU;AACb,QACI,kBAAC,UAAD;EACI,WAAW,EACP,UACA,GACA,GAAG,EAAwB,EAAC,WAAO,CAAC,EACpC,KAAY,YACZ,KAAU,UACV,EACH;EACD,GAAI;YAEJ,kBAAC,IAAD;GAAW,MAAM;GAAmB;GAAQ,WAAU;GACjD;GACO,CAAA;EACP,CAAA;;;;AC1BjB,SAAgB,GAAQ,EACpB,eAAY,QACZ,YAAS,IACT,cAAW,IACX,UAAO,WACP,YACA,YACA,UACA,WACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,cACA,cACA,UACA,aACA,GAAG,KACU;CACb,IAAM,IAAe,GAAuB,EAAC,UAAM,CAAC;AAEpD,QACI,kBAAC,UAAD;EACI,WAAW,EACP,UACA,GACA,KAAY,YACZ,GAAG,GAA2B;GAC1B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;G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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/theme/ThemeProvider.tsx","../src/i18n/I18nProvider.tsx","../src/utils/cn.ts","../src/utils/postalCodes.ts","../src/utils/creditCards.ts","../src/utils/validators.ts","../src/utils/formatters.ts","../src/utils/dateUtils.ts","../src/utils/useDebounce.ts","../src/utils/useClickOutside.ts","../src/utils/useKeyboardNav.ts","../src/utils/useInteractionEffect.tsx","../src/utils/useReveal.ts","../src/utils/useGhostText.ts","../src/components/primitives/Portal/Portal.tsx","../src/components/primitives/Popover/Popover.tsx","../src/utils/layoutProps.ts","../src/components/layout/Container/Container.tsx","../src/utils/appearanceProps.ts","../src/components/layout/MHeader/MHeader.tsx","../src/components/layout/MFooter/MFooter.tsx","../src/components/layout/MNavbar/MNavbar.tsx","../src/components/typography/Link/Link.tsx","../src/components/layout/MNavs/MNavs.tsx","../src/components/layout/MTabs/MTabs.tsx","../src/components/layout/Section/Section.tsx","../src/components/layout/Stack/Stack.tsx","../src/components/layout/Inline/Inline.tsx","../src/components/layout/Grid/Grid.tsx","../src/components/layout/MGrid/MGrid.tsx","../src/components/layout/Surface/Surface.tsx","../src/components/layout/Divider/Divider.tsx","../src/components/overlays/DropdownMenu/DropdownMenu.tsx","../src/components/layout/MSidebar/MSidebar.tsx","../src/components/layout/MSubNav/MSubNav.tsx","../src/components/layout/MBreadcrumb/MBreadcrumb.tsx","../src/components/layout/MPagination/MPagination.tsx","../src/components/layout/AppShell/AppShell.tsx","../src/components/controls/Button/Button.tsx","../src/components/controls/Checkbox/Checkbox.tsx","../src/components/controls/Radio/RadioContext.ts","../src/components/controls/Radio/Radio.tsx","../src/components/controls/Radio/RadioGroup.tsx","../src/components/controls/Toggle/Toggle.tsx","../src/components/controls/Slider/Slider.tsx","../src/components/cards/Card/Card.tsx","../src/components/cards/CardPayment/CardPayment.tsx","../src/components/display/QrCode/QrCode.tsx","../src/components/cards/CardBusiness/CardBusiness.tsx","../src/components/cards/CardService/CardService.tsx","../src/utils/useControllableString.ts","../src/components/inputs/Input/Input.tsx","../src/components/inputs/InputSearch/InputSearch.tsx","../src/components/cards/CardGrid/CardGrid.tsx","../src/components/data/DataTable/DataTable.tsx","../src/components/data/TreeView/TreeView.tsx","../src/components/data/TaskList/TaskList.tsx","../src/components/feedback/Badge/Badge.tsx","../src/components/media/Avatar/Avatar.tsx","../src/components/overlays/Modal/Modal.tsx","../src/components/typography/Heading/Heading.tsx","../src/components/typography/Text/Text.tsx","../src/components/typography/Code/Code.tsx","../src/components/typography/List/List.tsx","../src/components/typography/SubText/SubText.tsx","../src/components/typography/Kbd/Kbd.tsx","../src/components/data/CalendarBoard/CalendarBoard.tsx","../src/components/feedback/Alert/Alert.tsx","../src/components/feedback/Banner/Banner.tsx","../src/components/feedback/Tag/Tag.tsx","../src/components/feedback/Spinner/Spinner.tsx","../src/components/feedback/Loader/Loader.tsx","../src/components/feedback/Toast/ToastContext.ts","../src/components/feedback/Toast/ToastItem.tsx","../src/components/feedback/Toast/ToastProvider.tsx","../src/components/overlays/Drawer/Drawer.tsx","../src/components/overlays/Tooltip/Tooltip.tsx","../src/components/overlays/Popconfirm/Popconfirm.tsx","../src/components/media/Image/Image.tsx","../src/components/media/Gallery/Gallery.tsx","../src/components/media/Carousel/Carousel.tsx","../src/components/display/Collapsible/Collapsible.tsx","../src/components/display/Accordion/Accordion.tsx","../src/components/display/ProgressBar/ProgressBar.tsx","../src/components/display/CountUp/CountUp.tsx","../src/components/display/Rating/Rating.tsx","../src/components/display/ColorPicker/ColorPicker.tsx","../src/components/inputs/Textarea/Textarea.tsx","../src/components/inputs/InputPassword/InputPassword.tsx","../src/components/inputs/InputNumber/InputNumber.tsx","../src/components/inputs/InputEmail/InputEmail.tsx","../src/components/inputs/InputPhone/InputPhone.tsx","../src/components/inputs/InputName/InputName.tsx","../src/components/inputs/InputIBAN/InputIBAN.tsx","../src/components/inputs/InputTaxId/InputTaxId.tsx","../src/components/inputs/InputCurrency/InputCurrency.tsx","../src/components/inputs/InputCreditCard/InputCreditCard.tsx","../src/components/inputs/InputGroup/InputGroup.tsx","../src/components/inputs/InputPostCode/InputPostCode.tsx","../src/components/inputs/InputOTP/InputOTP.tsx","../src/components/inputs/InputSlider/InputSlider.tsx","../src/components/inputs/InputFile/CropEditor.tsx","../src/components/inputs/InputFile/InputFile.tsx","../src/components/dropdowns/Select/Select.tsx","../src/components/dropdowns/Autocomplete/Autocomplete.tsx","../src/components/dropdowns/DatePicker/DatePicker.tsx","../src/components/dropdowns/DateRangePicker/DateRangePicker.tsx","../src/components/dropdowns/TimePicker/TimePicker.tsx","../src/components/form/Form/FormContext.ts","../src/components/form/Form/Form.tsx","../src/components/form/Form/useFormField.ts"],"sourcesContent":["import {createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode} from 'react'\nimport type {MineralTheme, MineralMode, MineralModePreference} from './types'\n\nconst STORAGE_KEY = 'mineralui-theme'\n\n// Resolve the final mode once 'system' is allowed.\nfunction resolveMode(pref: MineralModePreference): MineralMode {\n if (pref !== 'system') return pref\n if (typeof window === 'undefined') return 'dark'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\n// Read a persisted mode safely when storage is available.\nfunction readStored(): MineralModePreference | null {\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n if (v === 'dark' || v === 'light' || v === 'system') return v\n } catch {\n /* SSR / blocked storage */\n }\n return null\n}\n\ninterface ThemeContextValue {\n theme: MineralTheme\n mode: MineralModePreference\n resolvedMode: MineralMode\n setMode: (next: MineralModePreference) => void\n toggleMode: () => void\n}\n\nconst ThemeContext = createContext<ThemeContextValue>({\n theme: {},\n mode: 'dark',\n resolvedMode: 'dark',\n setMode: () => {},\n toggleMode: () => {},\n})\n\n// Map JS theme keys to CSS custom properties.\nconst varMap: Record<keyof MineralTheme, string> = {\n primaryRgb: '--mineral-primary-rgb',\n primary: '--mineral-primary',\n primaryDark: '--mineral-primary-dark',\n primaryLight: '--mineral-primary-light',\n neutralRgb: '--mineral-neutral-rgb',\n neutral: '--mineral-neutral',\n dark: '--mineral-dark',\n darkLight: '--mineral-dark-light',\n surface: '--mineral-surface',\n surfaceContrast: '--mineral-surface-contrast',\n pageBg: '--mineral-page-bg',\n pageText: '--mineral-page-text',\n text: '--mineral-text',\n textSecondary: '--mineral-text-secondary',\n textHeading: '--mineral-text-heading',\n border: '--mineral-border',\n borderHover: '--mineral-border-hover',\n borderFocus: '--mineral-border-focus',\n successRgb: '--mineral-success-rgb',\n success: '--mineral-success',\n errorRgb: '--mineral-error-rgb',\n error: '--mineral-error',\n warningRgb: '--mineral-warning-rgb',\n warning: '--mineral-warning',\n infoRgb: '--mineral-info-rgb',\n info: '--mineral-info',\n fontFamily: '--mineral-font-family-sans',\n fontFamilySans: '--mineral-font-family-sans',\n fontFamilyMono: '--mineral-font-family-mono',\n fontFamilyHeading: '--mineral-font-family-heading',\n fontColorDefault: '--mineral-fcolor-default',\n fontColorMuted: '--mineral-fcolor-muted',\n fontColorHeading: '--mineral-fcolor-heading',\n fontColorInverted: '--mineral-fcolor-inverted',\n fontColorPrimary: '--mineral-fcolor-primary',\n fontColorNeutral: '--mineral-fcolor-neutral',\n fontColorSuccess: '--mineral-fcolor-success',\n fontColorError: '--mineral-fcolor-error',\n fontColorWarning: '--mineral-fcolor-warning',\n fontColorInfo: '--mineral-fcolor-info',\n radiusSm: '--mineral-radius-sm',\n radiusMd: '--mineral-radius-md',\n radiusLg: '--mineral-radius-lg',\n}\n\nexport type MineralThemeScope = 'body' | 'wrapper'\n\ninterface MineralThemeProviderProps {\n theme?: MineralTheme\n mode?: MineralModePreference\n persist?: boolean\n scope?: MineralThemeScope\n children: ReactNode\n}\n\n// Sync theme tokens and mode classes with either the body or a local wrapper.\nexport function MineralThemeProvider({\n theme,\n mode: modeProp = 'dark',\n persist = true,\n scope = 'body',\n children,\n}: MineralThemeProviderProps) {\n const ref = useRef<HTMLDivElement>(null)\n const safeTheme = useMemo(() => theme ?? {}, [theme])\n\n const [mode, setModeState] = useState<MineralModePreference>(() => {\n if (persist) {\n const stored = readStored()\n if (stored) return stored\n }\n return modeProp\n })\n\n const resolved = resolveMode(mode)\n\n const setMode = useCallback(\n (next: MineralModePreference) => {\n setModeState(next)\n if (persist) {\n try {\n localStorage.setItem(STORAGE_KEY, next)\n } catch {\n /* noop */\n }\n }\n },\n [persist]\n )\n\n const toggleMode = useCallback(() => {\n setMode(resolved === 'dark' ? 'light' : 'dark')\n }, [resolved, setMode])\n\n // Listen for system theme changes when mode is 'system'.\n useEffect(() => {\n if (mode !== 'system') return\n const mq = window.matchMedia('(prefers-color-scheme: dark)')\n const handler = () => setModeState('system')\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [mode])\n\n // Apply token overrides and light/dark class.\n useEffect(() => {\n const target = scope === 'body' ? document.body : ref.current\n if (!target) return\n\n for (const [key, value] of Object.entries(safeTheme)) {\n const cssVar = varMap[key as keyof MineralTheme]\n if (cssVar && value) {\n target.style.setProperty(cssVar, value)\n if (cssVar === '--mineral-font-family-sans') {\n target.style.setProperty('--mineral-font-family', value)\n }\n }\n }\n\n target.classList.toggle('mineral-light', resolved === 'light')\n\n return () => {\n for (const key of Object.keys(safeTheme)) {\n const cssVar = varMap[key as keyof MineralTheme]\n if (cssVar) {\n target.style.removeProperty(cssVar)\n if (cssVar === '--mineral-font-family-sans') {\n target.style.removeProperty('--mineral-font-family')\n }\n }\n }\n target.classList.remove('mineral-light')\n }\n }, [resolved, safeTheme, scope])\n\n const ctx = useMemo<ThemeContextValue>(\n () => ({\n theme: safeTheme,\n mode,\n resolvedMode: resolved,\n setMode,\n toggleMode,\n }),\n [safeTheme, mode, resolved, setMode, toggleMode]\n )\n\n return (\n <ThemeContext.Provider value={ctx}>\n {scope === 'wrapper' ? (\n <div ref={ref} className={resolved === 'light' ? 'mineral-light' : undefined}>\n {children}\n </div>\n ) : (\n children\n )}\n </ThemeContext.Provider>\n )\n}\n\nexport function useTheme(): ThemeContextValue {\n return useContext(ThemeContext)\n}\n","import {createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode} from 'react'\n\nconst STORAGE_KEY = 'mineralui-locale'\n\ntype Dict = Record<string, unknown>\n\n// Read the saved locale, but fall back cleanly in SSR or blocked storage.\nfunction readStored(fallback: string): string {\n try {\n return localStorage.getItem(STORAGE_KEY) ?? fallback\n } catch {\n return fallback\n }\n}\n\n// Resolve nested translation keys like \"ui.actions.save\".\nfunction getByPath(obj: unknown, path: string): unknown {\n return path\n .split('.')\n .reduce<unknown>((cur, key) => (cur != null && typeof cur === 'object' ? (cur as Dict)[key] : undefined), obj)\n}\n\nexport interface MI18nContextValue<T extends Dict = Dict> {\n locale: string\n setLocale: (next: string) => void\n toggleLocale: () => void\n dict: T\n t: (key: string, fallback?: string) => string\n}\n\nconst I18nContext = createContext<MI18nContextValue | null>(null)\n\nexport interface MI18nProviderProps<T extends Dict = Dict> {\n locales: Record<string, T>\n defaultLocale?: string\n persist?: boolean\n children: ReactNode\n}\n\n// Provide the active locale, dictionary and a tiny dot-path translator.\nexport function MI18nProvider<T extends Dict = Dict>({\n locales,\n defaultLocale,\n persist = true,\n children,\n}: MI18nProviderProps<T>) {\n const keys = useMemo(() => Object.keys(locales), [locales])\n const fallback = defaultLocale ?? keys[0] ?? 'en'\n\n const [locale, setLocaleState] = useState<string>(() => {\n if (persist) {\n const stored = readStored(fallback)\n if (stored in locales) return stored\n }\n return fallback\n })\n\n const setLocale = useCallback(\n (next: string) => {\n setLocaleState(next)\n if (persist) {\n try {\n localStorage.setItem(STORAGE_KEY, next)\n } catch {\n /* noop */\n }\n }\n },\n [persist]\n )\n\n const toggleLocale = useCallback(() => {\n const idx = keys.indexOf(locale)\n const next = keys[(idx + 1) % keys.length]\n setLocale(next)\n }, [keys, locale, setLocale])\n\n useEffect(() => {\n document.documentElement.lang = locale\n }, [locale])\n\n const dict = (locales[locale] ?? locales[fallback] ?? {}) as T\n\n const t = useCallback(\n (key: string, fb?: string): string => {\n const val = getByPath(dict, key)\n if (typeof val === 'string') return val\n return fb ?? key\n },\n [dict]\n )\n\n const ctx = useMemo<MI18nContextValue<T>>(\n () => ({\n locale,\n setLocale,\n toggleLocale,\n dict,\n t,\n }),\n [locale, setLocale, toggleLocale, dict, t]\n )\n\n return <I18nContext.Provider value={ctx as MI18nContextValue}>{children}</I18nContext.Provider>\n}\n\nexport function useMI18n<T extends Dict = Dict>(): MI18nContextValue<T> {\n const ctx = useContext(I18nContext)\n if (!ctx) throw new Error('useMI18n must be used within MI18nProvider')\n return ctx as MI18nContextValue<T>\n}\n","// Join optional class names without pulling a runtime dependency.\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n","import type {ValidationResult} from './validators'\n\nexport interface PostCodeRule {\n countryCode: string\n label: string\n placeholder: string\n example: string\n inputMode: 'text' | 'numeric'\n maxLength: number\n regex: RegExp\n sanitize: (value: string) => string\n format: (value: string) => string\n message: string\n}\n\nconst OK_RESULT: ValidationResult = {valid: true}\n\n// Reuse one sanitizer for countries that mix letters and digits.\nfunction keepLettersAndDigits(value: string): string {\n return value.toUpperCase().replace(/[^A-Z0-9]/g, '')\n}\n\n// Apply the common Polish XX-XXX postcode shape.\nfunction formatPlPostCode(value: string): string {\n const digits = value.replace(/\\D/g, '').slice(0, 5)\n\n if (digits.length <= 2) {\n return digits\n }\n\n return `${digits.slice(0, 2)}-${digits.slice(2)}`\n}\n\n// Support ZIP and ZIP+4 with the same formatter.\nfunction formatUsPostCode(value: string): string {\n const digits = value.replace(/\\D/g, '').slice(0, 9)\n\n if (digits.length <= 5) {\n return digits\n }\n\n return `${digits.slice(0, 5)}-${digits.slice(5)}`\n}\n\n// Clamp countries that only need a fixed number of digits.\nfunction formatFixedDigits(value: string, maxLength: number): string {\n return value.replace(/\\D/g, '').slice(0, maxLength)\n}\n\n// Insert the standard center space used by Canadian post codes.\nfunction formatCaPostCode(value: string): string {\n const clean = keepLettersAndDigits(value).slice(0, 6)\n const chars = clean.split('')\n\n return chars\n .map((char, index) => {\n if (index === 3) {\n return ` ${char}`\n }\n\n return char\n })\n .join('')\n}\n\n// Split the outward and inward parts of a UK postcode.\nfunction formatGbPostCode(value: string): string {\n const clean = keepLettersAndDigits(value).slice(0, 7)\n\n if (clean.length <= 3) {\n return clean\n }\n\n return `${clean.slice(0, clean.length - 3)} ${clean.slice(-3)}`\n}\n\n// Split Dutch codes into four digits and two letters.\nfunction formatNlPostCode(value: string): string {\n const clean = keepLettersAndDigits(value).slice(0, 6)\n\n if (clean.length <= 4) {\n return clean\n }\n\n return `${clean.slice(0, 4)} ${clean.slice(4)}`\n}\n\nexport const postCodeRules: Record<string, PostCodeRule> = {\n PL: {\n countryCode: 'PL',\n label: 'Poland',\n placeholder: '12-345',\n example: '00-001',\n inputMode: 'numeric',\n maxLength: 6,\n regex: /^\\d{2}-\\d{3}$/,\n sanitize: (value) => value.replace(/\\D/g, '').slice(0, 5),\n format: formatPlPostCode,\n message: 'Use the Polish format XX-XXX',\n },\n DE: {\n countryCode: 'DE',\n label: 'Germany',\n placeholder: '12345',\n example: '10115',\n inputMode: 'numeric',\n maxLength: 5,\n regex: /^\\d{5}$/,\n sanitize: (value) => value.replace(/\\D/g, '').slice(0, 5),\n format: (value) => formatFixedDigits(value, 5),\n message: 'Use a 5-digit German postal code',\n },\n FR: {\n countryCode: 'FR',\n label: 'France',\n placeholder: '75001',\n example: '75001',\n inputMode: 'numeric',\n maxLength: 5,\n regex: /^\\d{5}$/,\n sanitize: (value) => value.replace(/\\D/g, '').slice(0, 5),\n format: (value) => formatFixedDigits(value, 5),\n message: 'Use a 5-digit French postal code',\n },\n ES: {\n countryCode: 'ES',\n label: 'Spain',\n placeholder: '28013',\n example: '28013',\n inputMode: 'numeric',\n maxLength: 5,\n regex: /^\\d{5}$/,\n sanitize: (value) => value.replace(/\\D/g, '').slice(0, 5),\n format: (value) => formatFixedDigits(value, 5),\n message: 'Use a 5-digit Spanish postal code',\n },\n IT: {\n countryCode: 'IT',\n label: 'Italy',\n placeholder: '00184',\n example: '00184',\n inputMode: 'numeric',\n maxLength: 5,\n regex: /^\\d{5}$/,\n sanitize: (value) => value.replace(/\\D/g, '').slice(0, 5),\n format: (value) => formatFixedDigits(value, 5),\n message: 'Use a 5-digit Italian postal code',\n },\n US: {\n countryCode: 'US',\n label: 'United States',\n placeholder: '12345 or 12345-6789',\n example: '10001',\n inputMode: 'numeric',\n maxLength: 10,\n regex: /^\\d{5}(?:-\\d{4})?$/,\n sanitize: (value) => value.replace(/\\D/g, '').slice(0, 9),\n format: formatUsPostCode,\n message: 'Use ZIP or ZIP+4 format',\n },\n CA: {\n countryCode: 'CA',\n label: 'Canada',\n placeholder: 'A1A 1A1',\n example: 'M5V 3L9',\n inputMode: 'text',\n maxLength: 7,\n regex: /^[A-Z]\\d[A-Z] \\d[A-Z]\\d$/,\n sanitize: (value) => keepLettersAndDigits(value).slice(0, 6),\n format: formatCaPostCode,\n message: 'Use the Canadian format A1A 1A1',\n },\n GB: {\n countryCode: 'GB',\n label: 'United Kingdom',\n placeholder: 'SW1A 1AA',\n example: 'SW1A 1AA',\n inputMode: 'text',\n maxLength: 8,\n regex: /^[A-Z]{1,2}\\d[A-Z\\d]? \\d[A-Z]{2}$/,\n sanitize: (value) => keepLettersAndDigits(value).slice(0, 7),\n format: formatGbPostCode,\n message: 'Use a valid UK postcode',\n },\n NL: {\n countryCode: 'NL',\n label: 'Netherlands',\n placeholder: '1234 AB',\n example: '1012 AB',\n inputMode: 'text',\n maxLength: 7,\n regex: /^\\d{4} [A-Z]{2}$/,\n sanitize: (value) => keepLettersAndDigits(value).slice(0, 6),\n format: formatNlPostCode,\n message: 'Use the Dutch format 1234 AB',\n },\n}\n\nexport const postCodeCountries = Object.values(postCodeRules).map(({countryCode, label}) => ({\n value: countryCode,\n label,\n}))\n\n// Return the active postal rule or fall back to Poland for deterministic behavior.\nexport function getPostCodeRule(countryCode: string = 'PL'): PostCodeRule {\n return postCodeRules[countryCode.toUpperCase()] ?? postCodeRules.PL\n}\n\n// Keep postal input values aligned with the selected country format.\nexport function formatPostCode(value: string, countryCode: string = 'PL'): string {\n const rule = getPostCodeRule(countryCode)\n return rule.format(rule.sanitize(value))\n}\n\n// Validate the user-visible postal code against the selected country rule.\nexport function validatePostCode(value: string, countryCode: string = 'PL'): ValidationResult {\n if (!value) {\n return OK_RESULT\n }\n\n const rule = getPostCodeRule(countryCode)\n const formatted = rule.format(rule.sanitize(value))\n\n if (!rule.regex.test(formatted)) {\n return {valid: false, error: rule.message}\n }\n\n return OK_RESULT\n}\n","import type {ValidationResult} from './validators'\n\nexport type CreditCardBrand = 'visa' | 'mastercard' | 'amex' | 'discover' | 'maestro' | 'unknown'\n\nexport interface CreditCardBrandDetails {\n brand: CreditCardBrand\n label: string\n iconLabel: string\n maxLength: number\n formatGroups: number[]\n regex: RegExp\n}\n\nconst OK_RESULT: ValidationResult = {valid: true}\n\n// Card brand rules also drive formatting and visible brand badges.\nconst creditCardBrands: CreditCardBrandDetails[] = [\n {\n brand: 'visa',\n label: 'Visa',\n iconLabel: 'VISA',\n maxLength: 16,\n formatGroups: [4, 4, 4, 4],\n regex: /^4\\d{12}(?:\\d{3})?$/,\n },\n {\n brand: 'mastercard',\n label: 'Mastercard',\n iconLabel: 'MC',\n maxLength: 16,\n formatGroups: [4, 4, 4, 4],\n regex: /^(5[1-5]\\d{14}|2(?:2[2-9]|[3-6]\\d|7[01])\\d{12}|2720\\d{12})$/,\n },\n {\n brand: 'amex',\n label: 'American Express',\n iconLabel: 'AMEX',\n maxLength: 15,\n formatGroups: [4, 6, 5],\n regex: /^3[47]\\d{13}$/,\n },\n {\n brand: 'discover',\n label: 'Discover',\n iconLabel: 'DISC',\n maxLength: 16,\n formatGroups: [4, 4, 4, 4],\n regex: /^(6011\\d{12}|65\\d{14}|64[4-9]\\d{13})$/,\n },\n {\n brand: 'maestro',\n label: 'Maestro',\n iconLabel: 'MAES',\n maxLength: 19,\n formatGroups: [4, 4, 4, 4, 3],\n regex: /^(5[06789]\\d{0,17}|6\\d{0,18})$/,\n },\n]\n\n// Fall back to a generic brand so formatting still works for unknown prefixes.\nfunction fallbackBrand(digits: string): CreditCardBrandDetails {\n return {\n brand: 'unknown',\n label: 'Card',\n iconLabel: 'CARD',\n maxLength: Math.min(Math.max(digits.length || 16, 16), 19),\n formatGroups: [4, 4, 4, 4, 3],\n regex: /^\\d{12,19}$/,\n }\n}\n\n// Remove every separator so card validation can work on raw digits.\nexport function stripCardNumber(value: string): string {\n return value.replace(/\\D/g, '')\n}\n\n// Detect the best matching payment brand from the visible card prefix.\nexport function detectCardBrand(value: string): CreditCardBrandDetails {\n const digits = stripCardNumber(value)\n return creditCardBrands.find((rule) => rule.regex.test(digits)) ?? fallbackBrand(digits)\n}\n\n// Group card digits according to the detected payment brand.\nexport function formatCardNumber(value: string): string {\n const digits = stripCardNumber(value)\n const rule = detectCardBrand(digits)\n const trimmedDigits = digits.slice(0, rule.maxLength)\n const parts: string[] = []\n let offset = 0\n\n for (const length of rule.formatGroups) {\n if (offset >= trimmedDigits.length) {\n break\n }\n\n parts.push(trimmedDigits.slice(offset, offset + length))\n offset += length\n }\n\n if (offset < trimmedDigits.length) {\n parts.push(trimmedDigits.slice(offset))\n }\n\n return parts.join(' ')\n}\n\n// Run the Luhn checksum used by most card numbers.\nfunction passesLuhn(value: string): boolean {\n let sum = 0\n let shouldDouble = false\n\n for (let index = value.length - 1; index >= 0; index -= 1) {\n let digit = parseInt(value[index], 10)\n\n if (Number.isNaN(digit)) {\n return false\n }\n\n if (shouldDouble) {\n digit *= 2\n if (digit > 9) {\n digit -= 9\n }\n }\n\n sum += digit\n shouldDouble = !shouldDouble\n }\n\n return sum % 10 === 0\n}\n\n// Validate the detected card brand and Luhn checksum without third-party runtime dependencies.\nexport function validateCardNumber(value: string): ValidationResult {\n if (!value) {\n return OK_RESULT\n }\n\n const digits = stripCardNumber(value)\n const rule = detectCardBrand(digits)\n\n if (digits.length < 12) {\n return {valid: false, error: 'Card number is too short'}\n }\n\n if (digits.length > rule.maxLength) {\n return {valid: false, error: `${rule.label} card number is too long`}\n }\n\n if (rule.brand !== 'unknown' && !rule.regex.test(digits)) {\n return {valid: false, error: `Invalid ${rule.label} card number`}\n }\n\n if (!passesLuhn(digits)) {\n return {valid: false, error: 'Invalid card checksum'}\n }\n\n return OK_RESULT\n}\n\nexport {creditCardBrands}\n","export interface ValidationResult {\n valid: boolean\n error?: string\n}\n\nexport type ValidatorFn = (value: string) => ValidationResult\n\nconst ok: ValidationResult = {valid: true}\nconst fail = (error: string): ValidationResult => ({valid: false, error})\n\n// Ensure the field is not empty after trimming user input.\nexport function validateRequired(value: string): ValidationResult {\n return value.trim().length > 0 ? ok : fail('This field is required')\n}\n\n// Build a validator that enforces a minimum string length.\nexport function validateMinLength(min: number): ValidatorFn {\n return (value: string) => (value.length >= min ? ok : fail(`Minimum ${min} characters`))\n}\n\n// Build a validator that enforces a maximum string length.\nexport function validateMaxLength(max: number): ValidatorFn {\n return (value: string) => (value.length <= max ? ok : fail(`Maximum ${max} characters`))\n}\n\n// Build a validator around a custom regular expression.\nexport function validatePattern(pattern: RegExp, message?: string): ValidatorFn {\n return (value: string) => (pattern.test(value) ? ok : fail(message ?? 'Invalid format'))\n}\n\n// Validate numeric input against optional min and max bounds.\nexport function validateRange(min?: number, max?: number): ValidatorFn {\n return (value: string) => {\n const num = parseFloat(value)\n if (isNaN(num)) return fail('Must be a number')\n if (min !== undefined && num < min) return fail(`Minimum value is ${min}`)\n if (max !== undefined && num > max) return fail(`Maximum value is ${max}`)\n return ok\n }\n}\n\n// === Email ===\n\nconst EMAIL_RE =\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/\n\n// Validate email format while allowing empty optional fields.\nexport function validateEmail(value: string): ValidationResult {\n if (!value) return ok\n return EMAIL_RE.test(value) ? ok : fail('Invalid email address')\n}\n\n// === Phone ===\n\nconst PHONE_LENGTH: Record<string, number> = {\n PL: 9,\n DE: 10,\n US: 10,\n GB: 10,\n FR: 9,\n CZ: 9,\n SK: 9,\n}\n\n// Validate a phone number with optional country-specific digit counts.\nexport function validatePhone(value: string, countryCode?: string): ValidationResult {\n if (!value) return ok\n const digits = value.replace(/\\D/g, '')\n if (digits.length < 7) return fail('Phone number too short')\n if (digits.length > 15) return fail('Phone number too long')\n if (countryCode) {\n const expected = PHONE_LENGTH[countryCode.toUpperCase()]\n if (expected && digits.length !== expected) {\n return fail(`Phone number should have ${expected} digits`)\n }\n }\n return ok\n}\n\n// === IBAN (MOD-97, ISO 13616) ===\n\nconst IBAN_LENGTHS: Record<string, number> = {\n AL: 28,\n AD: 24,\n AT: 20,\n AZ: 28,\n BH: 22,\n BY: 28,\n BE: 16,\n BA: 20,\n BR: 29,\n BG: 22,\n CR: 22,\n HR: 21,\n CY: 28,\n CZ: 24,\n DK: 18,\n DO: 28,\n EG: 29,\n SV: 28,\n EE: 20,\n FO: 18,\n FI: 18,\n FR: 27,\n GE: 22,\n DE: 22,\n GI: 23,\n GR: 27,\n GL: 18,\n GT: 28,\n HU: 28,\n IS: 26,\n IQ: 23,\n IE: 22,\n IL: 23,\n IT: 27,\n JO: 30,\n KZ: 20,\n XK: 20,\n KW: 30,\n LV: 21,\n LB: 28,\n LI: 21,\n LT: 20,\n LU: 20,\n MT: 31,\n MR: 27,\n MU: 30,\n MD: 24,\n MC: 27,\n ME: 22,\n NL: 18,\n MK: 19,\n NO: 15,\n PK: 24,\n PS: 29,\n PL: 28,\n PT: 25,\n QA: 29,\n RO: 24,\n LC: 32,\n SM: 27,\n SA: 24,\n RS: 22,\n SC: 31,\n SK: 24,\n SI: 19,\n ES: 24,\n SE: 24,\n CH: 21,\n TL: 23,\n TN: 24,\n TR: 26,\n UA: 29,\n AE: 23,\n GB: 22,\n VA: 22,\n VG: 24,\n}\n\n// Run the MOD-97 remainder calculation on a numeric IBAN representation.\nfunction mod97(numStr: string): number {\n let remainder = 0\n for (let i = 0; i < numStr.length; i++) {\n remainder = (remainder * 10 + parseInt(numStr[i], 10)) % 97\n }\n return remainder\n}\n\n// Validate a full IBAN using country length rules and the MOD-97 checksum.\nexport function validateIBAN(value: string): ValidationResult {\n if (!value) return ok\n const iban = value.replace(/\\s/g, '').toUpperCase()\n\n if (iban.length < 2) return fail('IBAN too short')\n\n const countryCode = iban.slice(0, 2)\n const expectedLength = IBAN_LENGTHS[countryCode]\n\n if (!expectedLength) return fail('Unknown IBAN country code')\n if (iban.length !== expectedLength) {\n return fail(`IBAN for ${countryCode} should have ${expectedLength} characters`)\n }\n\n // MOD-97 check: move first 4 chars to end, convert letters to numbers\n const rearranged = iban.slice(4) + iban.slice(0, 4)\n const numStr = rearranged.replace(/[A-Z]/g, (ch) => String(ch.charCodeAt(0) - 55))\n\n return mod97(numStr) === 1 ? ok : fail('Invalid IBAN checksum')\n}\n\n// === NIP (Polish Tax ID) ===\n\nconst NIP_WEIGHTS = [6, 5, 7, 2, 3, 4, 5, 6, 7]\n\n// Validate a Polish NIP number with its weighted checksum.\nexport function validateNIP(value: string): ValidationResult {\n if (!value) return ok\n const digits = value.replace(/\\D/g, '')\n if (digits.length !== 10) return fail('NIP must have 10 digits')\n\n let sum = 0\n for (let i = 0; i < 9; i++) {\n sum += parseInt(digits[i], 10) * NIP_WEIGHTS[i]\n }\n const checkDigit = sum % 11\n if (checkDigit === 10) return fail('Invalid NIP')\n return checkDigit === parseInt(digits[9], 10) ? ok : fail('Invalid NIP checksum')\n}\n\n// === PESEL ===\n\nconst PESEL_WEIGHTS = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3]\n\n// Validate a Polish PESEL number with its checksum algorithm.\nexport function validatePESEL(value: string): ValidationResult {\n if (!value) return ok\n const digits = value.replace(/\\D/g, '')\n if (digits.length !== 11) return fail('PESEL must have 11 digits')\n\n let sum = 0\n for (let i = 0; i < 10; i++) {\n sum += parseInt(digits[i], 10) * PESEL_WEIGHTS[i]\n }\n const checkDigit = (10 - (sum % 10)) % 10\n return checkDigit === parseInt(digits[10], 10) ? ok : fail('Invalid PESEL checksum')\n}\n\n// === REGON ===\n\nconst REGON9_WEIGHTS = [8, 9, 2, 3, 4, 5, 6, 7]\nconst REGON14_WEIGHTS = [2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8]\n\n// Validate REGON numbers in both the 9-digit and 14-digit variants.\nexport function validateREGON(value: string): ValidationResult {\n if (!value) return ok\n const digits = value.replace(/\\D/g, '')\n\n if (digits.length !== 9 && digits.length !== 14) {\n return fail('REGON must have 9 or 14 digits')\n }\n\n const weights = digits.length === 9 ? REGON9_WEIGHTS : REGON14_WEIGHTS\n let sum = 0\n for (let i = 0; i < weights.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i]\n }\n const checkDigit = sum % 11 === 10 ? 0 : sum % 11\n const lastDigit = parseInt(digits[digits.length - 1], 10)\n return checkDigit === lastDigit ? ok : fail('Invalid REGON checksum')\n}\n\n// === Compose validators ===\n\n// Run validators in order and stop at the first failure.\nexport function composeValidators(...validators: ValidatorFn[]): ValidatorFn {\n return (value: string) => {\n for (const validator of validators) {\n const result = validator(value)\n if (!result.valid) return result\n }\n return ok\n }\n}\n\nexport {validatePostCode} from './postalCodes'\nexport {validateCardNumber} from './creditCards'\n","// Remove every non-digit character from the input.\nexport function stripNonDigits(value: string): string {\n return value.replace(/\\D/g, '')\n}\n\n// Keep only letters and digits for identifier-like inputs.\nexport function stripNonAlphanumeric(value: string): string {\n return value.replace(/[^a-zA-Z0-9]/g, '')\n}\n\n// Capitalize the first letter of every detected word.\nexport function capitalizeWords(value: string): string {\n return value.replace(/\\b\\w/g, (ch) => ch.toUpperCase())\n}\n\n// Group IBAN values into blocks of four characters.\nexport function formatIBAN(value: string): string {\n const clean = value.replace(/\\s/g, '').toUpperCase()\n return clean.replace(/(.{4})/g, '$1 ').trim()\n}\n\n// Return a raw IBAN string without grouping spaces.\nexport function unformatIBAN(value: string): string {\n return value.replace(/\\s/g, '').toUpperCase()\n}\n\nexport interface PhoneFormatOptions {\n countryCode?: string\n groupPattern?: number[]\n}\n\nconst PHONE_GROUPS: Record<string, number[]> = {\n PL: [3, 3, 3],\n DE: [3, 4, 3],\n US: [3, 3, 4],\n GB: [4, 3, 3],\n FR: [2, 2, 2, 2, 2],\n DEFAULT: [3, 3, 3],\n}\n\n// Format a phone number using country-specific or custom digit groups.\nexport function formatPhone(value: string, options: PhoneFormatOptions = {}): string {\n const digits = stripNonDigits(value)\n if (!digits) return ''\n\n const groups =\n options.groupPattern ?? PHONE_GROUPS[options.countryCode?.toUpperCase() ?? ''] ?? PHONE_GROUPS.DEFAULT\n\n const parts: string[] = []\n let pos = 0\n for (const len of groups) {\n if (pos >= digits.length) break\n parts.push(digits.slice(pos, pos + len))\n pos += len\n }\n if (pos < digits.length) {\n parts.push(digits.slice(pos))\n }\n return parts.join(' ')\n}\n\n// Format Polish NIP values with dash separators.\nexport function formatNIP(value: string): string {\n const digits = stripNonDigits(value)\n if (digits.length <= 3) return digits\n if (digits.length <= 6) return `${digits.slice(0, 3)}-${digits.slice(3)}`\n if (digits.length <= 8) return `${digits.slice(0, 3)}-${digits.slice(3, 6)}-${digits.slice(6)}`\n return `${digits.slice(0, 3)}-${digits.slice(3, 6)}-${digits.slice(6, 8)}-${digits.slice(8, 10)}`\n}\n\nexport interface CurrencyFormatOptions {\n decimalSeparator?: '.' | ','\n thousandSeparator?: ' ' | '.' | ',' | ''\n precision?: number\n}\n\n// Format a numeric string using configurable currency separators and precision.\nexport function formatCurrency(value: string, options: CurrencyFormatOptions = {}): string {\n const {decimalSeparator = ',', thousandSeparator = ' ', precision = 2} = options\n\n let clean = value.replace(/[^\\d.,-]/g, '')\n clean = clean.replace(',', '.')\n\n const parts = clean.split('.')\n let intPart = parts[0] || '0'\n let decPart = parts.length > 1 ? parts[1] : ''\n\n const isNegative = intPart.startsWith('-')\n if (isNegative) intPart = intPart.slice(1)\n\n intPart = intPart.replace(/^0+/, '') || '0'\n\n if (thousandSeparator) {\n intPart = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator)\n }\n\n decPart = decPart.slice(0, precision)\n\n const result = decPart ? `${intPart}${decimalSeparator}${decPart}` : intPart\n\n return isNegative ? `-${result}` : result\n}\n\n// Parse a formatted currency string back into a number.\nexport function parseCurrencyToNumber(\n formatted: string,\n thousandSeparator: string = ' ',\n decimalSeparator: string = ','\n): number | null {\n let clean = formatted\n if (thousandSeparator) {\n clean = clean.split(thousandSeparator).join('')\n }\n clean = clean.replace(decimalSeparator, '.')\n clean = clean.replace(/[^\\d.-]/g, '')\n const num = parseFloat(clean)\n return isNaN(num) ? null : num\n}\n\n// Preserve the logical cursor position after inserting separators into the value.\nexport function adjustCursorAfterFormat(oldValue: string, newValue: string, oldCursor: number): number {\n let realCharsBefore = 0\n for (let i = 0; i < oldCursor && i < oldValue.length; i++) {\n if (oldValue[i] !== ' ' && oldValue[i] !== '-') {\n realCharsBefore++\n }\n }\n\n let count = 0\n for (let i = 0; i < newValue.length; i++) {\n if (newValue[i] !== ' ' && newValue[i] !== '-') {\n count++\n }\n if (count === realCharsBefore) {\n return i + 1\n }\n }\n return newValue.length\n}\n\nexport {formatPostCode} from './postalCodes'\nexport {formatCardNumber} from './creditCards'\n","// Return the number of days for a month in a given year.\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\n// Return the first weekday index for the given month.\nexport function firstDayOfMonth(year: number, month: number): number {\n return new Date(year, month, 1).getDay()\n}\n\n// Compare two dates using only the calendar day.\nexport function isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\n// Check whether a date falls inside optional min and max boundaries.\nexport function isDateInRange(date: Date, min?: Date | null, max?: Date | null): boolean {\n if (min && date < stripTime(min)) return false\n if (max && date > stripTime(max)) return false\n return true\n}\n\n// Drop the time portion to make date comparisons predictable.\nexport function stripTime(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\n// Shift a date by a number of whole months.\nexport function addMonths(date: Date, count: number): Date {\n const result = new Date(date)\n result.setMonth(result.getMonth() + count)\n return result\n}\n\n// Shift a date by a number of whole years.\nexport function addYears(date: Date, count: number): Date {\n const result = new Date(date)\n result.setFullYear(result.getFullYear() + count)\n return result\n}\n\n// Pad numeric date parts to two digits.\nconst pad = (n: number): string => n.toString().padStart(2, '0')\n\n// Format a date with a lightweight token format.\nexport function formatDate(date: Date, format: string = 'dd.MM.yyyy'): string {\n const day = pad(date.getDate())\n const month = pad(date.getMonth() + 1)\n const year = date.getFullYear().toString()\n\n return format.replace('dd', day).replace('MM', month).replace('yyyy', year)\n}\n\n// Parse a date string according to the provided lightweight token format.\nexport function parseDate(value: string, format: string = 'dd.MM.yyyy'): Date | null {\n const dayIdx = format.indexOf('dd')\n const monthIdx = format.indexOf('MM')\n const yearIdx = format.indexOf('yyyy')\n\n if (dayIdx === -1 || monthIdx === -1 || yearIdx === -1) return null\n\n const day = parseInt(value.slice(dayIdx, dayIdx + 2), 10)\n const month = parseInt(value.slice(monthIdx, monthIdx + 2), 10)\n const year = parseInt(value.slice(yearIdx, yearIdx + 4), 10)\n\n if (isNaN(day) || isNaN(month) || isNaN(year)) return null\n if (month < 1 || month > 12) return null\n if (day < 1 || day > daysInMonth(year, month - 1)) return null\n\n return new Date(year, month - 1, day)\n}\n\nconst DAY_NAMES_PL = ['Pn', 'Wt', 'Śr', 'Cz', 'Pt', 'So', 'Nd']\nconst DAY_NAMES_EN = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']\n\nconst MONTH_NAMES_PL = [\n 'Styczeń',\n 'Luty',\n 'Marzec',\n 'Kwiecień',\n 'Maj',\n 'Czerwiec',\n 'Lipiec',\n 'Sierpień',\n 'Wrzesień',\n 'Październik',\n 'Listopad',\n 'Grudzień',\n]\nconst MONTH_NAMES_EN = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\n\n// Return localized short day names for calendar headers.\nexport function getDayNames(locale: 'pl' | 'en' = 'pl'): string[] {\n return locale === 'pl' ? DAY_NAMES_PL : DAY_NAMES_EN\n}\n\n// Return localized month names for pickers and headers.\nexport function getMonthNames(locale: 'pl' | 'en' = 'pl'): string[] {\n return locale === 'pl' ? MONTH_NAMES_PL : MONTH_NAMES_EN\n}\n\n// Parse a time string into numeric hour, minute and second parts.\nexport function parseTime(value: string): {hours: number; minutes: number; seconds: number} | null {\n const parts = value.split(':')\n if (parts.length < 2) return null\n\n const hours = parseInt(parts[0], 10)\n const minutes = parseInt(parts[1], 10)\n const seconds = parts.length > 2 ? parseInt(parts[2], 10) : 0\n\n if (isNaN(hours) || isNaN(minutes) || isNaN(seconds)) return null\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59 || seconds < 0 || seconds > 59) return null\n\n return {hours, minutes, seconds}\n}\n\n// Format time values with optional seconds output.\nexport function formatTime(hours: number, minutes: number, seconds?: number, showSeconds: boolean = false): string {\n const base = `${pad(hours)}:${pad(minutes)}`\n return showSeconds ? `${base}:${pad(seconds ?? 0)}` : base\n}\n","import {useState, useEffect, useRef, useCallback} from 'react'\n\n// Expose a value only after it stays stable for the given delay.\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debounced, setDebounced] = useState(value)\n\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delay)\n return () => clearTimeout(timer)\n }, [value, delay])\n\n return debounced\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n// Wrap a callback so repeated calls collapse into the latest invocation.\nexport function useDebouncedCallback<T extends (...args: any[]) => void>(callback: T, delay: number): T {\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n return useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((...args: any[]) => {\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => callbackRef.current(...args), delay)\n }) as T,\n [delay]\n )\n}\n","import {useEffect, type RefObject} from 'react'\n\n// Trigger a callback when pointer interaction happens outside the referenced element.\nexport function useClickOutside(ref: RefObject<HTMLElement | null>, handler: () => void): void {\n useEffect(() => {\n const listener = (e: MouseEvent | TouchEvent) => {\n if (!ref.current || ref.current.contains(e.target as Node)) return\n handler()\n }\n\n document.addEventListener('mousedown', listener)\n document.addEventListener('touchstart', listener)\n return () => {\n document.removeEventListener('mousedown', listener)\n document.removeEventListener('touchstart', listener)\n }\n }, [ref, handler])\n}\n","import {useState, useCallback, type KeyboardEvent} from 'react'\n\nexport interface UseKeyboardNavOptions {\n itemCount: number\n onSelect: (index: number) => void\n onClose: () => void\n isOpen: boolean\n loop?: boolean\n}\n\n// Provide arrow-key navigation and selection state for list-like widgets.\nexport function useKeyboardNav({itemCount, onSelect, onClose, isOpen, loop = true}: UseKeyboardNavOptions) {\n const [activeIndex, setActiveIndex] = useState(-1)\n\n // Reset highlight state when the owning widget closes or clears results.\n const resetIndex = useCallback(() => setActiveIndex(-1), [])\n\n const onKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!isOpen || itemCount === 0) return\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n setActiveIndex((prev) => {\n if (prev >= itemCount - 1) return loop ? 0 : prev\n return prev + 1\n })\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n setActiveIndex((prev) => {\n if (prev <= 0) return loop ? itemCount - 1 : 0\n return prev - 1\n })\n break\n }\n case 'Enter': {\n e.preventDefault()\n if (activeIndex >= 0 && activeIndex < itemCount) {\n onSelect(activeIndex)\n }\n break\n }\n case 'Escape': {\n e.preventDefault()\n onClose()\n break\n }\n case 'Home': {\n e.preventDefault()\n setActiveIndex(0)\n break\n }\n case 'End': {\n e.preventDefault()\n setActiveIndex(itemCount - 1)\n break\n }\n }\n },\n [isOpen, itemCount, activeIndex, onSelect, onClose, loop]\n )\n\n return {activeIndex, setActiveIndex, resetIndex, onKeyDown}\n}\n","import {useCallback, useRef} from 'react'\nimport type {PointerEvent, ReactElement} from 'react'\n\nexport type MineralClickEffect = 'none' | 'ripple'\n\nexport interface UseInteractionEffectOptions {\n effect?: MineralClickEffect\n disabled?: boolean\n centered?: boolean\n color?: string\n}\n\nexport interface UseInteractionEffectResult<T extends HTMLElement> {\n effectClassName?: string\n effectLayer: ReactElement | null\n handlePointerDown: (event: PointerEvent<T>) => void\n triggerEffect: (target: T | null) => void\n}\n\ninterface RippleOptions {\n centered: boolean\n color?: string\n clientX?: number\n clientY?: number\n}\n\n// Render and position a ripple wave inside the dedicated effect layer.\nfunction appendRipple(layer: HTMLSpanElement, host: HTMLElement, options: RippleOptions) {\n const rect = host.getBoundingClientRect()\n const size = Math.max(rect.width, rect.height) * 1.75\n const radius = size / 2\n const wave = document.createElement('span')\n const x =\n options.centered || options.clientX === undefined\n ? rect.width / 2 - radius\n : options.clientX - rect.left - radius\n const y =\n options.centered || options.clientY === undefined\n ? rect.height / 2 - radius\n : options.clientY - rect.top - radius\n\n wave.className = 'click-effect-wave'\n wave.style.width = `${size}px`\n wave.style.height = `${size}px`\n wave.style.left = `${x}px`\n wave.style.top = `${y}px`\n\n if (options.color) {\n wave.style.setProperty('--click-effect-color', options.color)\n }\n\n layer.appendChild(wave)\n wave.addEventListener('animationend', () => wave.remove(), {once: true})\n}\n\n// Attach a lightweight click feedback effect without coupling it to a specific component.\nexport function useInteractionEffect<T extends HTMLElement = HTMLElement>({\n effect = 'ripple',\n disabled = false,\n centered = false,\n color,\n}: UseInteractionEffectOptions = {}): UseInteractionEffectResult<T> {\n const layerRef = useRef<HTMLSpanElement>(null)\n const enabled = effect === 'ripple' && !disabled\n\n // Trigger a centered ripple for keyboard-driven or programmatic actions.\n const triggerEffect = useCallback(\n (target: T | null) => {\n if (!enabled || !target || !layerRef.current) {\n return\n }\n\n appendRipple(layerRef.current, target, {centered: true, color})\n },\n [color, enabled]\n )\n\n // Start the ripple from the actual pointer position when possible.\n const handlePointerDown = useCallback(\n (event: PointerEvent<T>) => {\n if (!enabled || !layerRef.current) {\n return\n }\n\n if (event.pointerType === 'mouse' && event.button !== 0) {\n return\n }\n\n appendRipple(layerRef.current, event.currentTarget, {\n centered,\n color,\n clientX: event.clientX,\n clientY: event.clientY,\n })\n },\n [centered, color, enabled]\n )\n\n return {\n effectClassName: enabled ? 'click-effect-root' : undefined,\n effectLayer: enabled ? <span ref={layerRef} className=\"click-effect-layer\" aria-hidden=\"true\" /> : null,\n handlePointerDown,\n triggerEffect,\n }\n}\n","import {useEffect, useRef} from 'react'\n\nexport type RevealProp = boolean | number\n\n// Observe an element and trigger a CSS reveal animation when it enters the viewport.\nexport function useReveal<T extends HTMLElement = HTMLElement>(reveal: RevealProp | undefined) {\n const ref = useRef<T>(null)\n\n useEffect(() => {\n if (reveal === false || reveal === undefined) return\n\n const node = ref.current\n if (!node) return\n\n const delay = typeof reveal === 'number' ? reveal : 0\n if (delay > 0) {\n node.style.setProperty('--mineral-reveal-delay', `${delay}s`)\n }\n\n const prefersReduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n if (prefersReduced) {\n node.classList.remove('mineral-reveal')\n node.classList.add('mineral-revealed')\n return\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n node.classList.add('mineral-revealed')\n observer.disconnect()\n }\n }\n },\n {threshold: 0.2}\n )\n\n observer.observe(node)\n return () => observer.disconnect()\n }, [reveal])\n\n return ref\n}\n","import {useState, useCallback, useMemo} from 'react'\n\nexport interface GhostTextOptions<T = string> {\n options: T[]\n value: string\n minChars?: number\n getLabel?: (option: T) => string\n filter?: (options: T[], input: string) => T[]\n}\n\nexport interface GhostTextReturn<T = string> {\n /** The ghost suffix to render after the typed text. */\n hint: string\n /** Accept the current hint and return the full value. */\n accept: () => {value: string; option: T | null}\n /** Cycle to the next matching option. */\n next: () => void\n /** Cycle to the previous matching option. */\n prev: () => void\n /** Reset the hint index (call on value change). */\n reset: () => void\n /** Number of matching options. */\n matchCount: number\n /** Handle keyboard events — Tab/Enter accept, arrows cycle, Escape resets. */\n onKeyDown: (e: React.KeyboardEvent) => boolean\n}\n\nfunction defaultGetLabel<T>(option: T): string {\n return typeof option === 'string' ? option : String(option)\n}\n\nfunction defaultFilter<T>(options: T[], input: string, getLabel: (o: T) => string): T[] {\n if (!input) return []\n const lower = input.toLowerCase()\n return options.filter((o) => getLabel(o).toLowerCase().startsWith(lower))\n}\n\n// Manage inline ghost-text suggestions for any text input.\nexport function useGhostText<T = string>({\n options,\n value,\n minChars = 2,\n getLabel = defaultGetLabel,\n filter,\n}: GhostTextOptions<T>): GhostTextReturn<T> {\n const [hintIndex, setHintIndex] = useState(0)\n\n const filtered = useMemo(() => {\n if (value.length < minChars) return []\n if (filter) return filter(options, value)\n return defaultFilter(options, value, getLabel)\n }, [options, value, minChars, filter, getLabel])\n\n const current = filtered.length > 0 ? filtered[hintIndex % filtered.length] : null\n const fullLabel = current ? getLabel(current) : ''\n const hint = fullLabel && fullLabel.toLowerCase().startsWith(value.toLowerCase())\n ? fullLabel.slice(value.length)\n : ''\n\n const accept = useCallback(() => {\n if (!hint || !current) return {value, option: null}\n return {value: value + hint, option: current}\n }, [hint, current, value])\n\n const next = useCallback(() => {\n if (filtered.length > 1) setHintIndex((i) => (i + 1) % filtered.length)\n }, [filtered.length])\n\n const prev = useCallback(() => {\n if (filtered.length > 1) setHintIndex((i) => (i - 1 + filtered.length) % filtered.length)\n }, [filtered.length])\n\n const reset = useCallback(() => setHintIndex(0), [])\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent): boolean => {\n if ((e.key === 'Tab' || e.key === 'Enter') && hint) {\n e.preventDefault()\n return true // signal: caller should accept\n }\n if (e.key === 'ArrowDown' && filtered.length > 1) {\n e.preventDefault()\n next()\n return false\n }\n if (e.key === 'ArrowUp' && filtered.length > 1) {\n e.preventDefault()\n prev()\n return false\n }\n return false\n },\n [hint, filtered.length, next, prev]\n )\n\n return {hint, accept, next, prev, reset, matchCount: filtered.length, onKeyDown}\n}\n","import {createPortal} from 'react-dom'\nimport type {PortalProps} from './Portal.types'\n\n// Mount children into a detached DOM target while defaulting to document.body.\nexport function Portal({children, container}: PortalProps) {\n const target = container ?? (typeof document !== 'undefined' ? document.body : null)\n if (!target) return null\n return createPortal(children, target)\n}\n","import {useState, useEffect, useRef, useCallback} from 'react'\nimport {Portal} from '../Portal'\nimport {cn} from '../../../utils/cn'\nimport type {PopoverProps} from './Popover.types'\nimport './Popover.css'\n\n// Position floating content relative to an anchor with viewport-aware flipping.\nexport function Popover({\n open,\n anchorRef,\n onClose,\n placement = 'bottom-start',\n matchWidth = false,\n offset = 4,\n children,\n className,\n style,\n}: PopoverProps) {\n const popoverRef = useRef<HTMLDivElement>(null)\n const [position, setPosition] = useState<{top: number; left: number; width?: number} | null>(null)\n const [flipped, setFlipped] = useState(false)\n\n // Recalculate popover position whenever layout or viewport constraints change.\n const updatePosition = useCallback(() => {\n if (!anchorRef.current || !popoverRef.current) return\n\n const anchor = anchorRef.current.getBoundingClientRect()\n const popover = popoverRef.current.getBoundingClientRect()\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const isTop = placement.startsWith('top')\n const isRight = placement.startsWith('right')\n const isLeft = placement.startsWith('left')\n const isHorizontal = isRight || isLeft\n const isEnd = placement.endsWith('end')\n\n let top: number\n let left: number\n\n if (isHorizontal) {\n // Horizontal placement: position to the right or left of the anchor\n const spaceRight = viewport.width - anchor.right - offset\n const spaceLeft = anchor.left - offset\n const shouldFlip = isRight\n ? spaceRight < popover.width && spaceLeft > spaceRight\n : spaceLeft < popover.width && spaceRight > spaceLeft\n\n setFlipped(shouldFlip)\n\n const showOnRight = isRight ? !shouldFlip : shouldFlip\n\n if (showOnRight) {\n left = anchor.right + offset + window.scrollX\n } else {\n left = anchor.left - popover.width - offset + window.scrollX\n }\n\n if (isEnd) {\n top = anchor.bottom - popover.height + window.scrollY\n } else {\n top = anchor.top + window.scrollY\n }\n } else {\n // Vertical placement: position above or below the anchor\n const spaceBelow = viewport.height - anchor.bottom - offset\n const spaceAbove = anchor.top - offset\n const shouldFlip = isTop\n ? spaceAbove < popover.height && spaceBelow > spaceAbove\n : spaceBelow < popover.height && spaceAbove > spaceBelow\n\n setFlipped(shouldFlip)\n\n const showOnTop = isTop ? !shouldFlip : shouldFlip\n\n if (showOnTop) {\n top = anchor.top - popover.height - offset + window.scrollY\n } else {\n top = anchor.bottom + offset + window.scrollY\n }\n\n if (isEnd) {\n left = anchor.right - popover.width + window.scrollX\n } else {\n left = anchor.left + window.scrollX\n }\n }\n\n // Clamp to viewport\n left = Math.max(8, Math.min(left, viewport.width - popover.width - 8))\n top = Math.max(8 + window.scrollY, top)\n\n setPosition({\n top,\n left,\n width: matchWidth ? anchor.width : undefined,\n })\n }, [anchorRef, placement, offset, matchWidth])\n\n useEffect(() => {\n if (!open) {\n setPosition(null)\n return\n }\n\n // Wait one frame so the rendered popover can be measured accurately.\n requestAnimationFrame(updatePosition)\n\n window.addEventListener('scroll', updatePosition, {passive: true})\n window.addEventListener('resize', updatePosition, {passive: true})\n return () => {\n window.removeEventListener('scroll', updatePosition)\n window.removeEventListener('resize', updatePosition)\n }\n }, [open, updatePosition])\n\n // Close the popover with the standard Escape key interaction.\n useEffect(() => {\n if (!open) return\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [open, onClose])\n\n // Close when the user interacts outside both the popover and its anchor.\n useEffect(() => {\n if (!open) return\n const handleClick = (e: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(e.target as Node) &&\n anchorRef.current &&\n !anchorRef.current.contains(e.target as Node)\n ) {\n onClose()\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [open, onClose, anchorRef])\n\n if (!open) return null\n\n return (\n <Portal>\n <div\n ref={popoverRef}\n className={cn('popover', flipped ? 'flipped' : 'normal', className)}\n style={{\n position: 'absolute',\n top: position?.top ?? 0,\n left: position?.left ?? 0,\n width: position?.width,\n visibility: position ? 'visible' : 'hidden',\n ...style,\n }}\n role=\"listbox\"\n >\n {children}\n </div>\n </Portal>\n )\n}\n","import type {CSSProperties} from 'react'\nimport type {MineralFontColor} from '../theme'\n\n// Keep the utility scale in one place so props and CSS stay in sync.\nexport const mineralUtilityScaleValues = ['none', 'xs', 'sm', 'md', 'lg', 'xl', '2xl'] as const\n\nexport type MineralUtilityScale = (typeof mineralUtilityScaleValues)[number]\n\nexport interface LayoutUtilityProps {\n spacing?: MineralUtilityScale\n padding?: MineralUtilityScale\n fsize?: string | number\n fcolor?: MineralFontColor\n mt?: MineralUtilityScale\n mb?: MineralUtilityScale\n ml?: MineralUtilityScale\n mr?: MineralUtilityScale\n mx?: MineralUtilityScale\n my?: MineralUtilityScale\n pt?: MineralUtilityScale\n pb?: MineralUtilityScale\n pl?: MineralUtilityScale\n pr?: MineralUtilityScale\n px?: MineralUtilityScale\n py?: MineralUtilityScale\n fullWidth?: boolean\n}\n\n// Translate spacing and typography utility props into deterministic class names.\nexport function getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n}: LayoutUtilityProps): Array<string | false | undefined> {\n return [\n spacing !== undefined && `spacing-${spacing}`,\n padding !== undefined && `padding-${padding}`,\n fsize !== undefined && 'has-fsize',\n false,\n mt !== undefined && `mt-${mt}`,\n mb !== undefined && `mb-${mb}`,\n ml !== undefined && `ml-${ml}`,\n mr !== undefined && `mr-${mr}`,\n mx !== undefined && `mx-${mx}`,\n my !== undefined && `my-${my}`,\n pt !== undefined && `pt-${pt}`,\n pb !== undefined && `pb-${pb}`,\n pl !== undefined && `pl-${pl}`,\n pr !== undefined && `pr-${pr}`,\n px !== undefined && `px-${px}`,\n py !== undefined && `py-${py}`,\n fullWidth && 'full-width',\n ]\n}\n\n// Keep dynamic font sizes in CSS variables so layout helpers can accept any valid CSS length.\nexport function getLayoutUtilityStyles({fsize}: Pick<LayoutUtilityProps, 'fsize'>): CSSProperties | undefined {\n if (fsize === undefined || fsize === null || fsize === '') {\n return undefined\n }\n\n return {\n '--mineral-layout-fsize': typeof fsize === 'number' ? `${fsize}px` : fsize,\n } as CSSProperties\n}\n","import type {ContainerProps} from './Container.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './Container.css'\n\n// Constrain page content widths and apply shared spacing utilities.\nexport function Container({\n size = 'content',\n padded = true,\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: ContainerProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <div\n className={cn(\n 'container',\n size,\n padded && 'padded',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type {MineralColor, MineralFontColor} from '../theme'\n\nexport interface AppearanceProps {\n color?: MineralColor\n fcolor?: MineralFontColor\n}\n\n// Translate semantic appearance props into shared utility classes.\nexport function getAppearanceClassNames({color, fcolor}: AppearanceProps): Array<string | false | undefined> {\n return [color && `fcolor-${color}`, fcolor && `fcolor-${fcolor}`]\n}\n","import type {MHeaderProps} from './MHeader.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {Container} from '../Container'\nimport './MHeader.css'\n\n// Render a reusable page header shell aligned to a shared container.\nexport function MHeader({\n container = 'wide',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n fcolor,\n className,\n children,\n ...rest\n}: MHeaderProps) {\n return (\n <header\n className={cn(\n 'header',\n tone,\n ...getAppearanceClassNames({fcolor}),\n bordered && 'bordered',\n sticky && 'sticky',\n className\n )}\n {...rest}\n >\n <Container size={container} padded={padded} className=\"inner\">\n {children}\n </Container>\n </header>\n )\n}\n","import type {MFooterProps} from './MFooter.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport {Container} from '../Container'\nimport './MFooter.css'\n\n// Render a reusable page footer shell with shared spacing utilities.\nexport function MFooter({\n container = 'wide',\n padded = true,\n bordered = true,\n tone = 'surface',\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MFooterProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <footer\n className={cn(\n 'footer',\n tone,\n bordered && 'bordered',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n <Container size={container} padded={padded} className=\"inner\" fullWidth>\n {children}\n </Container>\n </footer>\n )\n}\n","import type {MNavbarProps} from './MNavbar.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {Container} from '../Container'\nimport './MNavbar.css'\n\n// Render a horizontal app or site navigation shell with container alignment.\nexport function MNavbar({\n container = 'content',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n fcolor,\n justify = 'between',\n align = 'center',\n wrap = false,\n className,\n children,\n ...rest\n}: MNavbarProps) {\n return (\n <nav\n className={cn(\n 'navbar',\n tone,\n ...getAppearanceClassNames({fcolor}),\n bordered && 'bordered',\n sticky && 'sticky',\n className\n )}\n {...rest}\n >\n <Container size={container} padded={padded} className=\"container\">\n <div className={cn('inner', justify, align, wrap && 'wrap')}>{children}</div>\n </Container>\n </nav>\n )\n}\n","import {forwardRef} from 'react'\nimport type {MouseEvent} from 'react'\nimport type {MLinkProps} from './Link.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Link.css'\n\n// Render a semantic link that can target anchors or router link components.\nexport const MLink = forwardRef<HTMLElement, MLinkProps>(function MLink(\n {\n component,\n to,\n tone = 'default',\n underline = 'hover',\n fcolor,\n current = false,\n block = false,\n disabled = false,\n className,\n children,\n href,\n onClick,\n ...rest\n },\n ref\n) {\n const Component = component ?? 'a'\n\n // Prevent disabled links from navigating while still exposing their content.\n function handleClick(event: MouseEvent<HTMLAnchorElement>) {\n if (disabled) {\n event.preventDefault()\n return\n }\n\n onClick?.(event)\n }\n\n return (\n <Component\n ref={ref}\n href={component ? undefined : disabled ? undefined : href}\n to={component ? to : undefined}\n className={cn(\n 'link',\n tone,\n underline,\n ...getAppearanceClassNames({fcolor}),\n current && 'current',\n block && 'block',\n disabled && 'disabled',\n className\n )}\n aria-current={current ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n onClick={handleClick}\n {...rest}\n >\n {children}\n </Component>\n )\n})\n","import type {MNavsProps} from './MNavs.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {MLink} from '../../typography/Link'\nimport './MNavs.css'\n\n// Render a lightweight navigation list from data or custom children.\nexport function MNavs({\n items,\n orientation = 'horizontal',\n gap = 'md',\n fcolor,\n wrap = false,\n className,\n children,\n ...rest\n}: MNavsProps) {\n const gapClassName = gap === '2xl' ? 'gap-2xl' : gap\n\n return (\n <div\n className={cn(\n 'navs',\n orientation,\n gapClassName,\n ...getAppearanceClassNames({fcolor}),\n wrap && 'wrap',\n className\n )}\n {...rest}\n >\n {items\n ? items.map((item) => (\n <MLink\n key={item.key ?? item.href ?? item.title?.toString() ?? item.label?.toString()}\n component={item.component}\n href={item.href}\n to={item.to}\n target={item.target}\n rel={item.rel}\n title={item.title}\n fcolor={fcolor}\n current={item.current}\n disabled={item.disabled}\n className={cn('link', item.className)}\n >\n {item.label}\n </MLink>\n ))\n : children}\n </div>\n )\n}\n","import {useId, useMemo, useState} from 'react'\nimport type {KeyboardEvent} from 'react'\nimport type {MTabsItem, MTabsProps} from './MTabs.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './MTabs.css'\n\ninterface MTabsTriggerProps {\n item: MTabsItem\n isActive: boolean\n tabId: string\n panelId: string\n clickEffect: MTabsProps['clickEffect']\n rippleColor: string | undefined\n onSelect: (value: string) => void\n}\n\n// Keep the tab trigger behavior isolated from the list and panel rendering.\nfunction MTabsTrigger({item, isActive, tabId, panelId, clickEffect, rippleColor, onSelect}: MTabsTriggerProps) {\n const {effectClassName, effectLayer, handlePointerDown, triggerEffect} = useInteractionEffect<HTMLButtonElement>({\n effect: clickEffect,\n disabled: item.disabled,\n centered: true,\n color: rippleColor,\n })\n\n return (\n <button\n type=\"button\"\n id={tabId}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={panelId}\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n className={cn('tabs-trigger', isActive && 'active', item.disabled && 'disabled', effectClassName)}\n onPointerDown={handlePointerDown}\n onKeyDown={(event) => {\n if (event.key === ' ' || event.key === 'Enter') {\n triggerEffect(event.currentTarget)\n }\n }}\n onClick={() => onSelect(item.value)}\n >\n {effectLayer}\n {item.icon && <span className=\"tabs-icon\">{item.icon}</span>}\n <span className=\"tabs-label\">{item.label}</span>\n </button>\n )\n}\n\nexport function MTabs({\n items,\n value,\n defaultValue,\n onValueChange,\n variant = 'underline',\n orientation = 'horizontal',\n size = 'md',\n fullWidth = false,\n fcolor,\n showPanels = true,\n panelClassName,\n clickEffect = 'ripple',\n rippleColor,\n className,\n ...rest\n}: MTabsProps) {\n // Pick the first enabled item when the caller does not control the active tab.\n const fallbackValue = useMemo(\n () => defaultValue ?? items.find((item) => !item.disabled)?.value ?? '',\n [defaultValue, items]\n )\n const [internalValue, setInternalValue] = useState(fallbackValue)\n const activeValue = value ?? internalValue\n const activeItem = items.find((item) => item.value === activeValue) ?? items[0]\n const baseId = useId()\n\n // Support both controlled and uncontrolled tab state.\n function selectTab(nextValue: string) {\n if (value === undefined) {\n setInternalValue(nextValue)\n }\n onValueChange?.(nextValue)\n }\n\n // Re-map keyboard navigation depending on the rendered orientation.\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const enabledItems = items.filter((item) => !item.disabled)\n const currentIndex = enabledItems.findIndex((item) => item.value === activeItem?.value)\n\n if (currentIndex === -1) {\n return\n }\n\n const nextKeys = orientation === 'vertical' ? ['ArrowDown'] : ['ArrowRight', 'ArrowDown']\n const previousKeys = orientation === 'vertical' ? ['ArrowUp'] : ['ArrowLeft', 'ArrowUp']\n\n if (nextKeys.includes(event.key)) {\n event.preventDefault()\n const nextItem = enabledItems[(currentIndex + 1) % enabledItems.length]\n selectTab(nextItem.value)\n }\n\n if (previousKeys.includes(event.key)) {\n event.preventDefault()\n const nextItem = enabledItems[(currentIndex - 1 + enabledItems.length) % enabledItems.length]\n selectTab(nextItem.value)\n }\n }\n\n return (\n <div\n className={cn(\n 'tabs',\n variant,\n orientation,\n size,\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n {...rest}\n >\n <div className=\"tabs-list\" role=\"tablist\" aria-orientation={orientation} onKeyDown={handleKeyDown}>\n {items.map((item) => {\n const isActive = item.value === activeItem?.value\n const tabId = `${baseId}-${item.value}-tab`\n const panelId = `${baseId}-${item.value}-panel`\n\n return (\n <MTabsTrigger\n key={item.value}\n item={item}\n isActive={isActive}\n tabId={tabId}\n panelId={panelId}\n clickEffect={clickEffect}\n rippleColor={rippleColor}\n onSelect={selectTab}\n />\n )\n })}\n </div>\n\n {showPanels && activeItem?.content !== undefined && (\n <div\n key={activeItem.value}\n id={`${baseId}-${activeItem.value}-panel`}\n role=\"tabpanel\"\n aria-labelledby={`${baseId}-${activeItem.value}-tab`}\n className={cn('tabs-panel', panelClassName)}\n >\n {activeItem.content}\n </div>\n )}\n </div>\n )\n}\n","import type React from 'react'\nimport type {SectionProps} from './Section.types'\nimport {cn} from '../../../utils/cn'\nimport {useReveal} from '../../../utils/useReveal'\nimport './Section.css'\n\n// Render a semantic page section with predefined spacing and tone.\nexport function Section({\n as = 'section',\n spacing = 'lg',\n tone = 'default',\n reveal,\n className,\n style,\n children,\n ...rest\n}: SectionProps) {\n const Component = as\n const revealRef = useReveal(reveal)\n const hasReveal = reveal !== undefined && reveal !== false\n\n return (\n <Component\n ref={hasReveal ? (revealRef as React.RefObject<never>) : undefined}\n className={cn(\n 'section',\n spacing,\n tone,\n hasReveal && 'mineral-reveal',\n className\n )}\n style={style}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type {StackProps} from './Stack.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport {useReveal} from '../../../utils/useReveal'\nimport './Stack.css'\n\n// Stack children vertically with shared gap and utility props.\nexport function Stack({\n gap = 'md',\n align = 'stretch',\n reveal,\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: StackProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n const revealRef = useReveal<HTMLDivElement>(reveal)\n const gapClassName = gap === '2xl' ? 'gap-2xl' : gap\n\n return (\n <div\n ref={reveal !== undefined && reveal !== false ? revealRef : undefined}\n className={cn(\n 'stack',\n gapClassName,\n align !== 'stretch' && align,\n reveal !== undefined && reveal !== false && 'mineral-reveal',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type {InlineProps} from './Inline.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport {useReveal} from '../../../utils/useReveal'\nimport './Inline.css'\n\n// Arrange children horizontally with configurable alignment and wrapping.\nexport function Inline({\n gap = 'md',\n align = 'center',\n justify = 'start',\n wrap = 'wrap',\n reveal,\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: InlineProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n const revealRef = useReveal<HTMLDivElement>(reveal)\n const gapClassName = gap === '2xl' ? 'gap-2xl' : gap\n\n return (\n <div\n ref={reveal !== undefined && reveal !== false ? revealRef : undefined}\n className={cn(\n 'inline',\n gapClassName,\n align,\n `justify-${justify}`,\n wrap,\n reveal !== undefined && reveal !== false && 'mineral-reveal',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type {GridProps} from './Grid.types'\nimport {cn} from '../../../utils/cn'\nimport './Grid.css'\n\n// Render a simple equal-column grid with optional responsive min item width.\nexport function Grid({columns = 2, gap = 'lg', minItemWidth, className, style, children, ...rest}: GridProps) {\n const gapClassName = gap === '2xl' ? 'gap-2xl' : gap\n\n return (\n <div\n className={cn('grid', `columns-${columns}`, gapClassName, className)}\n style={{\n ...(minItemWidth ? {'--grid-min-item-width': minItemWidth} : {}),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import {Children, isValidElement} from 'react'\nimport type {MGridItemProps, MGridProps} from './MGrid.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './MGrid.css'\n\n// Render either a responsive row or a responsive column using one shared grid API.\nexport function MGrid({\n type = 'row',\n gap = 'lg',\n span,\n sm,\n md,\n lg,\n xl,\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MGridProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n const baseSpan = span ?? xl ?? lg\n const gapClassName = gap === '2xl' ? 'gap-2xl' : gap\n\n if (type === 'col') {\n return (\n <div\n className={cn(\n 'grid',\n 'col',\n baseSpan ? `span-${baseSpan}` : 'span-auto',\n xl && `xl-${xl}`,\n lg && `lg-${lg}`,\n md && `md-${md}`,\n sm && `sm-${sm}`,\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n }\n\n const childArray = Children.toArray(children)\n const autoColumns = Math.min(Math.max(childArray.length, 1), 12)\n const hasDesktopSizing = childArray.some((child) => {\n if (!isValidElement(child)) {\n return false\n }\n\n const p = child.props as Record<string, unknown>\n return Boolean(p?.span || p?.lg || p?.xl)\n })\n\n return (\n <div\n className={cn(\n 'grid',\n 'row',\n gapClassName,\n hasDesktopSizing ? 'tracked' : `auto-cols-${autoColumns}`,\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth: fullWidth ?? true,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n// Keep MGridItem as a compatibility alias for explicit column declarations.\nexport function MGridItem({span, sm, md, lg, xl, ...rest}: MGridItemProps) {\n return <MGrid type=\"col\" span={span} sm={sm} md={md} lg={lg} xl={xl} {...rest} />\n}\n","import type {SurfaceProps} from './Surface.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport {useReveal} from '../../../utils/useReveal'\nimport './Surface.css'\n\n// Render a reusable surface primitive for cards, panels and preview blocks.\nexport function Surface({\n tone = 'default',\n outlined = true,\n padded = true,\n reveal,\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: SurfaceProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n const revealRef = useReveal<HTMLDivElement>(reveal)\n\n return (\n <div\n ref={reveal !== undefined && reveal !== false ? revealRef : undefined}\n className={cn(\n 'surface',\n tone,\n outlined && 'outlined',\n padded && 'padded',\n reveal !== undefined && reveal !== false && 'mineral-reveal',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type {DividerProps} from './Divider.types'\nimport {cn} from '../../../utils/cn'\n\n// Render a semantic divider line between related content blocks.\nexport function Divider({className, style, ...rest}: DividerProps) {\n return <hr className={cn('divider', className)} style={style} {...rest} />\n}\n","import {\n useState,\n useRef,\n useCallback,\n Children,\n isValidElement,\n cloneElement,\n} from 'react'\nimport {Popover} from '../../primitives/Popover'\nimport {useKeyboardNav} from '../../../utils/useKeyboardNav'\nimport {cn} from '../../../utils/cn'\nimport type {\n MDropdownMenuProps,\n MDropdownItemProps,\n MDropdownGroupProps,\n MDropdownDividerProps,\n} from './DropdownMenu.types'\nimport './DropdownMenu.css'\n\ntype AnyProps = Record<string, any>\n\nfunction getProps(el: React.ReactElement): AnyProps {\n return el.props as AnyProps\n}\n\nfunction isItem(child: React.ReactElement): boolean {\n return !!(child.type as any).__dropdownItem\n}\n\nfunction isGroup(child: React.ReactElement): boolean {\n return !!(child.type as any).__dropdownGroup\n}\n\n// Collect all MDropdownItem elements from children (including inside groups).\nfunction collectItems(children: React.ReactNode): React.ReactElement[] {\n const items: React.ReactElement[] = []\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return\n if (isItem(child)) {\n items.push(child)\n } else if (isGroup(child)) {\n Children.forEach(getProps(child).children, (gc: React.ReactNode) => {\n if (isValidElement(gc) && isItem(gc)) {\n items.push(gc)\n }\n })\n }\n })\n return items\n}\n\nexport function MDropdownMenu({\n trigger,\n placement = 'bottom-start',\n size = 'md',\n closeOnSelect = true,\n openOn = 'click',\n className,\n style,\n children,\n}: MDropdownMenuProps) {\n const [open, setOpen] = useState(false)\n const anchorRef = useRef<HTMLDivElement>(null)\n const hoverTimeout = useRef<ReturnType<typeof setTimeout>>(null)\n\n const items = collectItems(children)\n const enabledCount = items.filter((i) => !getProps(i).disabled).length\n\n const handleSelect = useCallback(\n (index: number) => {\n let enabledIdx = 0\n for (const item of items) {\n const p = getProps(item)\n if (p.disabled) continue\n if (enabledIdx === index) {\n p.onClick?.()\n break\n }\n enabledIdx++\n }\n if (closeOnSelect) setOpen(false)\n },\n [items, closeOnSelect]\n )\n\n const {activeIndex, setActiveIndex, onKeyDown} = useKeyboardNav({\n itemCount: enabledCount,\n onSelect: handleSelect,\n onClose: () => setOpen(false),\n isOpen: open,\n })\n\n const handleTriggerClick = () => setOpen((o) => !o)\n\n const handleTriggerKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n setOpen(true)\n }\n if (open) onKeyDown(e as any)\n }\n\n // Map active index back to flat child rendering with enabled-only tracking.\n let enabledIdx = 0\n const renderChild = (child: React.ReactNode): React.ReactNode => {\n if (!isValidElement(child)) return child\n\n if (isItem(child)) {\n const p = getProps(child)\n const isDisabled = p.disabled\n const idx = isDisabled ? -1 : enabledIdx++\n return cloneElement(child, {\n _active: idx === activeIndex,\n _onHover: isDisabled ? undefined : () => setActiveIndex(idx),\n _onClick: () => {\n if (isDisabled) return\n p.onClick?.()\n if (closeOnSelect) setOpen(false)\n },\n } as AnyProps)\n }\n\n if (isGroup(child)) {\n return cloneElement(child, {\n children: Children.map(getProps(child).children, renderChild),\n } as AnyProps)\n }\n\n return child\n }\n\n const hoverHandlers = openOn === 'hover' ? {\n onMouseEnter: () => {\n if (hoverTimeout.current) clearTimeout(hoverTimeout.current)\n setOpen(true)\n },\n onMouseLeave: () => {\n hoverTimeout.current = setTimeout(() => setOpen(false), 150)\n },\n } : {}\n\n return (\n <div className={cn('dropdown-menu-anchor', className)} style={style} {...hoverHandlers}>\n <div\n ref={anchorRef}\n onClick={openOn === 'click' ? handleTriggerClick : undefined}\n onKeyDown={handleTriggerKeyDown}\n role=\"button\"\n tabIndex={0}\n className=\"dropdown-menu-trigger\"\n >\n {trigger}\n </div>\n <Popover\n open={open}\n anchorRef={anchorRef}\n onClose={() => setOpen(false)}\n placement={placement}\n className={cn('dropdown-menu-popover', size)}\n >\n <div className=\"dropdown-menu-list\" role=\"menu\" {...hoverHandlers}>\n {Children.map(children, renderChild)}\n </div>\n </Popover>\n </div>\n )\n}\n\nexport function MDropdownItem({\n icon,\n label,\n href,\n to,\n onClick,\n color,\n disabled = false,\n active = false,\n component,\n className,\n _active,\n _onHover,\n _onClick,\n}: MDropdownItemProps & {_active?: boolean; _onHover?: () => void; _onClick?: () => void}) {\n const isHighlighted = _active ?? active\n\n const content = (\n <>\n {icon && <span className=\"dropdown-menu-item-icon\">{icon}</span>}\n <span className=\"dropdown-menu-item-label\">{label}</span>\n </>\n )\n\n const cls = cn(\n 'dropdown-menu-item',\n isHighlighted && 'active',\n disabled && 'disabled',\n color,\n className\n )\n\n const handleClick = (e: React.MouseEvent) => {\n if (disabled) {\n e.preventDefault()\n return\n }\n _onClick?.()\n }\n\n const Tag = component ?? (href || to ? 'a' : 'button')\n const linkProps = href ? {href} : to ? {href: to} : {}\n\n return (\n <Tag\n className={cls}\n role=\"menuitem\"\n tabIndex={-1}\n onClick={handleClick}\n onMouseEnter={_onHover}\n aria-disabled={disabled || undefined}\n {...linkProps}\n >\n {content}\n </Tag>\n )\n}\n;(MDropdownItem as any).__dropdownItem = true\n\nexport function MDropdownGroup({label, children}: MDropdownGroupProps) {\n return (\n <div className=\"dropdown-menu-group\" role=\"group\">\n <div className=\"dropdown-menu-group-label\">{label}</div>\n {children}\n </div>\n )\n}\n;(MDropdownGroup as any).__dropdownGroup = true\n\nexport function MDropdownDivider({className}: MDropdownDividerProps) {\n return <div className={cn('dropdown-menu-divider', className)} role=\"separator\" />\n}\n","import {createContext, useContext, useState, useEffect, useCallback, useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport {MDropdownMenu} from '../../overlays/DropdownMenu'\nimport type {\n MSidebarProps,\n MSidebarHeaderProps,\n MSidebarNavProps,\n MSidebarItemProps,\n MSidebarGroupProps,\n MSidebarFooterProps,\n MSidebarDividerProps,\n MSidebarMode,\n} from './MSidebar.types'\nimport './MSidebar.css'\n\nconst STORAGE_KEY = 'mineralui-sidebar'\n\ninterface SidebarContextValue {\n mode: MSidebarMode\n mobile: boolean\n mobileOpen: boolean\n canToggle: boolean\n toggleMode: () => void\n}\n\nconst SidebarCtx = createContext<SidebarContextValue>({\n mode: 'expanded',\n mobile: false,\n mobileOpen: false,\n canToggle: false,\n toggleMode: () => {},\n})\n\n// Read shared sidebar state inside slot components.\nfunction useSidebar() {\n return useContext(SidebarCtx)\n}\n\n// Track the responsive breakpoint once for the whole sidebar tree.\nfunction useIsMobile(breakpoint: number): boolean {\n const [mobile, setMobile] = useState(() => (typeof window !== 'undefined' ? window.innerWidth < breakpoint : false))\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`)\n const handler = (e: MediaQueryListEvent) => setMobile(e.matches)\n setMobile(mq.matches)\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [breakpoint])\n return mobile\n}\n\n// Render the sidebar shell and coordinate desktop and mobile behavior.\nexport function MSidebar({\n mode: modeProp = 'auto',\n defaultMode = 'expanded',\n onModeChange,\n persist = false,\n side = 'left',\n tone = 'subtle',\n bordered = true,\n mobileBreakpoint = 768,\n className,\n style,\n children,\n}: MSidebarProps) {\n const mobile = useIsMobile(mobileBreakpoint)\n const [mobileOpen, setMobileOpen] = useState(false)\n\n const [internalMode, setInternalMode] = useState<MSidebarMode>(() => {\n if (persist) {\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n if (v === 'expanded' || v === 'collapsed') return v\n } catch {\n /* noop */\n }\n }\n return defaultMode\n })\n\n const resolvedMode: MSidebarMode =\n modeProp === 'auto' ? internalMode : modeProp === 'collapsed' ? 'collapsed' : 'expanded'\n\n // Toggle only the desktop width state. Mobile uses its own overlay flow.\n const toggleMode = useCallback(() => {\n const next: MSidebarMode = resolvedMode === 'expanded' ? 'collapsed' : 'expanded'\n setInternalMode(next)\n onModeChange?.(next)\n if (persist) {\n try {\n localStorage.setItem(STORAGE_KEY, next)\n } catch {\n /* noop */\n }\n }\n }, [resolvedMode, onModeChange, persist])\n\n const closeMobile = useCallback(() => setMobileOpen(false), [])\n\n // Let Escape close the temporary mobile drawer.\n useEffect(() => {\n if (!mobileOpen) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false)\n }\n document.addEventListener('keydown', handler)\n return () => document.removeEventListener('keydown', handler)\n }, [mobileOpen])\n\n const canToggle = !mobile && modeProp === 'auto'\n\n const ctx = useMemo<SidebarContextValue>(\n () => ({mode: resolvedMode, mobile, mobileOpen, canToggle, toggleMode}),\n [resolvedMode, mobile, mobileOpen, canToggle, toggleMode]\n )\n\n const isCollapsed = !mobile && resolvedMode === 'collapsed'\n\n const sidebarCls = cn(\n 'sidebar',\n tone,\n side,\n isCollapsed && 'collapsed',\n bordered && 'bordered',\n mobile && 'mobile',\n mobile && mobileOpen && 'mobile-open',\n className\n )\n\n return (\n <SidebarCtx.Provider value={ctx}>\n {mobile && mobileOpen && <div className=\"sidebar-backdrop\" onClick={closeMobile} />}\n\n <aside className={sidebarCls} style={style}>\n {children}\n </aside>\n\n {mobile && !mobileOpen && (\n <button\n className={cn('sidebar-hamburger', side)}\n onClick={() => setMobileOpen(true)}\n aria-label=\"Open menu\"\n >\n <span className=\"sidebar-hamburger-icon\">☰</span>\n </button>\n )}\n </SidebarCtx.Provider>\n )\n}\n\n// Render the top area with branding and an optional collapse toggle.\nexport function MSidebarHeader({className, children}: MSidebarHeaderProps) {\n const {mode, mobile, canToggle, toggleMode} = useSidebar()\n const isCollapsed = !mobile && mode === 'collapsed'\n\n return (\n <div className={cn('sidebar-header', className)}>\n <div className=\"sidebar-header-content\">{children}</div>\n {canToggle && (\n <button\n className=\"sidebar-toggle\"\n onClick={toggleMode}\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n >\n <span className={cn('sidebar-chevron', isCollapsed && 'flipped')}>‹</span>\n </button>\n )}\n </div>\n )\n}\n\n// Wrap sidebar links in a navigation landmark.\nexport function MSidebarNav({className, children}: MSidebarNavProps) {\n return <nav className={cn('sidebar-nav', className)}>{children}</nav>\n}\n\n// Render one clickable sidebar row as a link, button or custom component.\nexport function MSidebarItem({\n icon,\n label,\n href,\n to,\n onClick,\n active = false,\n disabled = false,\n badge,\n color,\n component,\n className,\n}: MSidebarItemProps) {\n const {mode, mobile} = useSidebar()\n const isCollapsed = !mobile && mode === 'collapsed'\n\n const Tag = component ?? (href || to ? 'a' : 'button')\n const linkProps = component ? (to ? {to} : href ? {href} : {}) : href ? {href} : to ? {href: to} : {}\n\n const cls = cn('sidebar-item', active && 'active', disabled && 'disabled', color, className)\n\n return (\n <Tag\n className={cls}\n onClick={disabled ? undefined : onClick}\n aria-disabled={disabled || undefined}\n title={isCollapsed ? (typeof label === 'string' ? label : undefined) : undefined}\n {...linkProps}\n >\n {icon && <span className=\"sidebar-item-icon\">{icon}</span>}\n {!isCollapsed && <span className=\"sidebar-item-label\">{label}</span>}\n {!isCollapsed && badge && <span className=\"sidebar-item-badge\">{badge}</span>}\n </Tag>\n )\n}\n\n// Group related sidebar items and swap to a dropdown when collapsed.\nexport function MSidebarGroup({\n label,\n icon,\n active = false,\n defaultOpen = true,\n collapsible = true,\n children,\n className,\n}: MSidebarGroupProps) {\n const sidebarCtx = useSidebar()\n const {mode, mobile} = sidebarCtx\n const isCollapsed = !mobile && mode === 'collapsed'\n const [open, setOpen] = useState(defaultOpen)\n\n const expandedCtx = useMemo<SidebarContextValue>(() => ({...sidebarCtx, mode: 'expanded'}), [sidebarCtx])\n\n // Keep expand/collapse local to this group.\n const toggle = () => {\n if (collapsible) setOpen((o) => !o)\n }\n\n if (isCollapsed) {\n const trigger = (\n <span\n className={cn('sidebar-group-icon collapsed', active && 'active')}\n title={typeof label === 'string' ? label : undefined}\n >\n {icon}\n </span>\n )\n\n return (\n <div className={cn('sidebar-group', className)}>\n <MDropdownMenu trigger={trigger} placement=\"right-start\" closeOnSelect openOn=\"hover\">\n <SidebarCtx.Provider value={expandedCtx}>{children}</SidebarCtx.Provider>\n </MDropdownMenu>\n </div>\n )\n }\n\n return (\n <div className={cn('sidebar-group', className)}>\n <button className={cn('sidebar-group-header', active && 'active')} onClick={toggle} aria-expanded={open}>\n {icon && <span className=\"sidebar-group-icon\">{icon}</span>}\n <span className=\"sidebar-group-label\">{label}</span>\n {collapsible && <span className={cn('sidebar-group-arrow', open && 'open')}>›</span>}\n </button>\n {open && <div className=\"sidebar-group-items\">{children}</div>}\n </div>\n )\n}\n\n// Render the bottom slot for version info or quick actions.\nexport function MSidebarFooter({className, children}: MSidebarFooterProps) {\n return <div className={cn('sidebar-footer', className)}>{children}</div>\n}\n\n// Render a spacing-aware divider between sidebar regions.\nexport function MSidebarDivider({className, spacing = 'md'}: MSidebarDividerProps) {\n return <hr className={cn('sidebar-divider', spacing, className)} />\n}\n","import type {MSubNavProps} from './MSubNav.types'\nimport {cn} from '../../../utils/cn'\nimport './MSubNav.css'\n\n// Render a horizontal secondary navigation bar below the main header.\nexport function MSubNav({\n items,\n active,\n onChange,\n component,\n className,\n ...rest\n}: MSubNavProps) {\n return (\n <nav className={cn('subnav', className)} {...rest}>\n {items.map((item) => {\n const Tag = component ?? (item.href ? 'a' : 'button')\n const isActive = active === item.value\n const linkProps = item.href ? {href: item.href} : {}\n\n return (\n <Tag\n key={item.value}\n className={cn(\n 'subnav-item',\n isActive && 'active',\n item.disabled && 'disabled'\n )}\n onClick={item.disabled ? undefined : () => onChange?.(item.value)}\n aria-disabled={item.disabled || undefined}\n {...linkProps}\n >\n {item.icon && <span className=\"subnav-item-icon\">{item.icon}</span>}\n <span className=\"subnav-item-label\">{item.label}</span>\n </Tag>\n )\n })}\n </nav>\n )\n}\n","import {Fragment, useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport type {MBreadcrumbProps} from './MBreadcrumb.types'\nimport './MBreadcrumb.css'\n\n// Render a compact path and collapse the middle when needed.\nexport function MBreadcrumb({items, separator = '/', maxItems, className, ...rest}: MBreadcrumbProps) {\n // Keep the current page visible while shortening deep paths.\n const visible = useMemo(() => {\n if (!maxItems || maxItems >= items.length) return items\n if (maxItems < 2) return [items[items.length - 1]]\n const head = items.slice(0, 1)\n const tail = items.slice(-(maxItems - 1))\n return [...head, null, ...tail]\n }, [items, maxItems])\n\n return (\n <nav aria-label=\"breadcrumb\" className={cn('breadcrumb', className)} {...rest}>\n <ol className=\"trail\">\n {visible.map((item, i) => {\n if (item === null) {\n return (\n <li key=\"ellipsis\" className=\"crumb dots\">\n <span className=\"sep\">{separator}</span>\n <span>…</span>\n </li>\n )\n }\n\n const isLast = i === visible.length - 1\n\n return (\n <li key={i} className={cn('crumb', isLast && 'active')}>\n {i > 0 && <span className=\"sep\">{separator}</span>}\n {item.href && !isLast ? (\n <a href={item.href} className=\"link\" onClick={item.onClick}>\n {item.label}\n </a>\n ) : item.onClick && !isLast ? (\n <button type=\"button\" className=\"link btn\" onClick={item.onClick}>\n {item.label}\n </button>\n ) : (\n <span className=\"current\" aria-current={isLast ? 'page' : undefined}>\n {item.label}\n </span>\n )}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import {useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport type {MPaginationProps} from './MPagination.types'\nimport './MPagination.css'\n\nfunction range(start: number, end: number): number[] {\n const result: number[] = []\n for (let i = start; i <= end; i++) result.push(i)\n return result\n}\n\nfunction buildPages(totalPages: number, page: number, siblings: number, boundaries: number): (number | 'dots')[] {\n if (totalPages <= (boundaries * 2) + (siblings * 2) + 3) {\n return range(1, totalPages)\n }\n\n const leftBound = Math.max(page - siblings, boundaries + 2)\n const rightBound = Math.min(page + siblings, totalPages - boundaries - 1)\n\n const showLeftDots = leftBound > boundaries + 2\n const showRightDots = rightBound < totalPages - boundaries - 1\n\n const leftEdge = range(1, boundaries)\n const rightEdge = range(totalPages - boundaries + 1, totalPages)\n\n if (!showLeftDots && showRightDots) {\n const leftCount = (siblings * 2) + boundaries + 2\n return [...range(1, leftCount), 'dots', ...rightEdge]\n }\n\n if (showLeftDots && !showRightDots) {\n const rightCount = (siblings * 2) + boundaries + 2\n return [...leftEdge, 'dots', ...range(totalPages - rightCount + 1, totalPages)]\n }\n\n return [...leftEdge, 'dots', ...range(leftBound, rightBound), 'dots', ...rightEdge]\n}\n\nexport function MPagination({\n total,\n page,\n pageSize = 10,\n onChange,\n siblings = 1,\n boundaries = 1,\n variant = 'numbered',\n className,\n ...rest\n}: MPaginationProps) {\n const totalPages = Math.max(1, Math.ceil(total / pageSize))\n const currentPage = Math.min(Math.max(1, page), totalPages)\n\n const pages = useMemo(\n () => buildPages(totalPages, currentPage, siblings, boundaries),\n [totalPages, currentPage, siblings, boundaries]\n )\n\n if (variant === 'simple') {\n return (\n <nav aria-label=\"pagination\" className={cn('pagination', className)} {...rest}>\n <button\n type=\"button\"\n className=\"btn\"\n disabled={currentPage <= 1}\n onClick={() => onChange(currentPage - 1)}\n >\n ‹\n </button>\n <span className=\"info\">\n {currentPage} / {totalPages}\n </span>\n <button\n type=\"button\"\n className=\"btn\"\n disabled={currentPage >= totalPages}\n onClick={() => onChange(currentPage + 1)}\n >\n ›\n </button>\n </nav>\n )\n }\n\n return (\n <nav aria-label=\"pagination\" className={cn('pagination', className)} {...rest}>\n <button\n type=\"button\"\n className=\"btn\"\n disabled={currentPage <= 1}\n onClick={() => onChange(currentPage - 1)}\n >\n ‹\n </button>\n {pages.map((p, i) =>\n p === 'dots' ? (\n <span key={`dots-${i}`} className=\"dots\">…</span>\n ) : (\n <button\n key={p}\n type=\"button\"\n className={cn('btn', p === currentPage && 'active')}\n onClick={() => onChange(p)}\n >\n {p}\n </button>\n )\n )}\n <button\n type=\"button\"\n className=\"btn\"\n disabled={currentPage >= totalPages}\n onClick={() => onChange(currentPage + 1)}\n >\n ›\n </button>\n </nav>\n )\n}\n","import {forwardRef, Children, isValidElement} from 'react'\nimport type {AppShellProps, BodyProps} from './AppShell.types'\nimport {cn} from '../../../utils/cn'\nimport {MSidebar} from '../MSidebar'\nimport './AppShell.css'\n\nexport const AppShell = forwardRef<HTMLDivElement, AppShellProps>(function AppShell(\n {className, children, ...rest},\n ref\n) {\n const sidebarElements: React.ReactNode[] = []\n const otherElements: React.ReactNode[] = []\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && child.type === MSidebar) {\n sidebarElements.push(child)\n } else {\n otherElements.push(child)\n }\n })\n\n return (\n <div ref={ref} className={cn('app-shell', className)} {...rest}>\n {sidebarElements}\n <div className=\"app-main\">{otherElements}</div>\n </div>\n )\n})\n\nexport const Body = forwardRef<HTMLDivElement, BodyProps>(function Body(\n {className, children, ...rest},\n ref\n) {\n return (\n <div ref={ref} className={cn('app-body', className)} {...rest}>\n {children}\n </div>\n )\n})\n","import {forwardRef} from 'react'\nimport type {ButtonProps} from './Button.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './Button.css'\n\n// Render the main action primitive with semantic variants and built-in click feedback.\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = 'primary',\n size = 'md',\n color = 'primary',\n fcolor,\n fullWidth = false,\n rounded = false,\n iconOnly = false,\n loading = false,\n pulsing = false,\n startIcon,\n endIcon,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n children,\n disabled = false,\n type = 'button',\n onPointerDown,\n onKeyDown,\n ...rest\n },\n ref\n) {\n const isDisabled = disabled || loading\n const {effectClassName, effectLayer, handlePointerDown, triggerEffect} = useInteractionEffect<HTMLButtonElement>({\n effect: clickEffect,\n disabled: isDisabled,\n centered: iconOnly,\n color: rippleColor,\n })\n\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n 'button',\n variant,\n size,\n color,\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n rounded && 'rounded',\n iconOnly && 'icon-only',\n loading && 'loading',\n pulsing && 'pulsing',\n isDisabled && 'disabled',\n effectClassName,\n className\n )}\n style={style}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n onPointerDown={(event) => {\n handlePointerDown(event)\n onPointerDown?.(event)\n }}\n onKeyDown={(event) => {\n if (event.key === ' ' || event.key === 'Enter') {\n triggerEffect(event.currentTarget)\n }\n\n onKeyDown?.(event)\n }}\n {...rest}\n >\n {effectLayer}\n {loading && <span className=\"spinner\" aria-hidden=\"true\" />}\n {startIcon && <span className=\"icon start\">{startIcon}</span>}\n {children && <span className=\"content\">{children}</span>}\n {endIcon && <span className=\"icon end\">{endIcon}</span>}\n </button>\n )\n})\n","import {forwardRef, useEffect, useRef} from 'react'\nimport type {CheckboxProps} from './Checkbox.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './Checkbox.css'\n\n// Render a styled checkbox while keeping the native input for accessibility.\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n {\n checked,\n defaultChecked,\n indeterminate = false,\n name,\n id,\n value,\n disabled = false,\n size = 'md',\n color = 'primary',\n fcolor,\n label,\n labelPosition = 'right',\n error = false,\n errorText,\n onChange,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n },\n ref\n) {\n const internalRef = useRef<HTMLInputElement>(null)\n const inputRef = (ref as React.RefObject<HTMLInputElement>) ?? internalRef\n const {effectClassName, effectLayer, handlePointerDown, triggerEffect} = useInteractionEffect<HTMLSpanElement>({\n effect: clickEffect,\n disabled,\n centered: true,\n color: rippleColor,\n })\n\n // Keep the browser indeterminate flag in sync with React props.\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate\n }\n }, [indeterminate, inputRef])\n\n const hasError = error || !!errorText\n\n return (\n <div className={cn('checkbox', ...getAppearanceClassNames({fcolor}), className)} style={style}>\n <label className={cn('label', size, labelPosition === 'left' && 'label-left', disabled && 'disabled')}>\n <span\n className={cn('box', color, hasError && 'error', effectClassName)}\n onPointerDown={handlePointerDown}\n >\n {effectLayer}\n <input\n ref={inputRef}\n type=\"checkbox\"\n checked={checked}\n defaultChecked={defaultChecked}\n name={name}\n id={id}\n value={value}\n disabled={disabled}\n onChange={onChange}\n onKeyDown={(event) => {\n if (event.key === ' ' || event.key === 'Enter') {\n triggerEffect(event.currentTarget.parentElement as HTMLSpanElement | null)\n }\n }}\n className=\"input\"\n aria-invalid={hasError || undefined}\n />\n <svg className=\"checkmark\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n className=\"check-path\"\n d=\"M3.5 8L6.5 11L12.5 5\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"indeterminate-mark\" />\n </span>\n {label && <span className=\"label-text\">{label}</span>}\n </label>\n {errorText && (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n )}\n </div>\n )\n})\n","import {createContext, useContext} from 'react'\nimport type {RadioGroupContextValue} from './Radio.types'\n\nexport const RadioContext = createContext<RadioGroupContextValue | null>(null)\n\n// Read the nearest radio-group context when a radio participates in grouped state.\nexport function useRadioGroup(): RadioGroupContextValue | null {\n return useContext(RadioContext)\n}\n","import {forwardRef, useCallback} from 'react'\nimport type {RadioProps} from './Radio.types'\nimport {useRadioGroup} from './RadioContext'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './Radio.css'\n\n// Render a single radio that can work standalone or inside RadioGroup.\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(function Radio(\n {\n checked,\n defaultChecked,\n name,\n id,\n value,\n disabled = false,\n size = 'md',\n color = 'primary',\n fcolor,\n label,\n labelPosition = 'right',\n onChange,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n },\n ref\n) {\n const group = useRadioGroup()\n\n const resolvedName = group?.name ?? name\n const resolvedDisabled = group?.disabled ?? disabled\n const resolvedSize = group?.size ?? size\n const resolvedColor = group?.color ?? color\n const resolvedFontColor = group?.fcolor ?? fcolor\n const resolvedChecked = group ? group.value === value : checked\n const {effectClassName, effectLayer, handlePointerDown, triggerEffect} = useInteractionEffect<HTMLSpanElement>({\n effect: clickEffect,\n disabled: resolvedDisabled,\n centered: true,\n color: rippleColor,\n })\n\n // Delegate selection back to the group when one is present.\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(event)\n if (group?.onChange && value) {\n group.onChange(value)\n }\n },\n [onChange, group, value]\n )\n\n return (\n <label\n className={cn(\n 'radio',\n resolvedSize,\n ...getAppearanceClassNames({fcolor: resolvedFontColor}),\n labelPosition === 'left' && 'label-left',\n resolvedDisabled && 'disabled',\n className\n )}\n style={style}\n >\n <span className={cn('circle', resolvedColor, effectClassName)} onPointerDown={handlePointerDown}>\n {effectLayer}\n <input\n ref={ref}\n type=\"radio\"\n name={resolvedName}\n id={id}\n value={value}\n checked={resolvedChecked}\n defaultChecked={!group ? defaultChecked : undefined}\n disabled={resolvedDisabled}\n onChange={handleChange}\n onKeyDown={(event) => {\n if (event.key === ' ' || event.key === 'Enter') {\n triggerEffect(event.currentTarget.parentElement as HTMLSpanElement | null)\n }\n }}\n className=\"input\"\n />\n <span className=\"dot\" />\n </span>\n {label && <span className=\"label-text\">{label}</span>}\n </label>\n )\n})\n","import {useState, useCallback, useMemo} from 'react'\nimport type {RadioGroupProps} from './Radio.types'\nimport {RadioContext} from './RadioContext'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Radio.css'\n\n// Coordinate multiple radio items through shared context and optional controlled state.\nexport function RadioGroup({\n name,\n value,\n defaultValue,\n onChange,\n direction = 'vertical',\n children,\n disabled = false,\n size = 'md',\n color = 'primary',\n fcolor,\n error = false,\n errorText,\n label,\n className,\n style,\n}: RadioGroupProps) {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const currentValue = value !== undefined ? value : internalValue\n\n // Mirror controlled and uncontrolled usage with the same group API.\n const handleChange = useCallback(\n (val: string) => {\n if (value === undefined) {\n setInternalValue(val)\n }\n onChange?.(val)\n },\n [onChange, value]\n )\n\n // Memoize context so nested radios only update when relevant inputs change.\n const ctx = useMemo(\n () => ({name, value: currentValue, disabled, size, color, fcolor, onChange: handleChange}),\n [name, currentValue, disabled, size, color, fcolor, handleChange]\n )\n\n return (\n <RadioContext.Provider value={ctx}>\n <fieldset\n className={cn('radio-group', direction, ...getAppearanceClassNames({fcolor}), className)}\n style={style}\n role=\"radiogroup\"\n >\n {label && <legend className={cn('label', error && 'error')}>{label}</legend>}\n {children}\n {errorText && (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n )}\n </fieldset>\n </RadioContext.Provider>\n )\n}\n","import {forwardRef} from 'react'\nimport type {ToggleProps} from './Toggle.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './Toggle.css'\n\n// Render a switch-style boolean control with the same API shape as Checkbox.\nexport const Toggle = forwardRef<HTMLInputElement, ToggleProps>(function Toggle(\n {\n checked,\n defaultChecked,\n name,\n id,\n disabled = false,\n size = 'md',\n color = 'primary',\n fcolor,\n label,\n labelPosition = 'right',\n onChange,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n },\n ref\n) {\n const {effectClassName, effectLayer, handlePointerDown, triggerEffect} = useInteractionEffect<HTMLSpanElement>({\n effect: clickEffect,\n disabled,\n centered: true,\n color: rippleColor,\n })\n\n return (\n <label\n className={cn(\n 'toggle',\n size,\n ...getAppearanceClassNames({fcolor}),\n labelPosition === 'left' && 'label-left',\n disabled && 'disabled',\n className\n )}\n style={style}\n >\n <span className={cn('track', color, effectClassName)} onPointerDown={handlePointerDown}>\n {effectLayer}\n <input\n ref={ref}\n type=\"checkbox\"\n checked={checked}\n defaultChecked={defaultChecked}\n name={name}\n id={id}\n disabled={disabled}\n onChange={onChange}\n onKeyDown={(event) => {\n if (event.key === ' ' || event.key === 'Enter') {\n triggerEffect(event.currentTarget.parentElement as HTMLSpanElement | null)\n }\n }}\n className=\"input\"\n role=\"switch\"\n aria-checked={checked}\n />\n <span className=\"knob\" />\n </span>\n {label && <span className=\"label-text\">{label}</span>}\n </label>\n )\n})\n","import {useCallback, useRef} from 'react'\nimport type {SliderProps} from './Slider.types'\nimport {cn} from '../../../utils/cn'\nimport './Slider.css'\n\nexport function Slider({\n min = 0,\n max = 100,\n step = 1,\n value,\n onChange,\n marks,\n label,\n color = 'primary',\n disabled = false,\n className,\n ...rest\n}: SliderProps) {\n const trackRef = useRef<HTMLDivElement>(null)\n\n const percent = ((value - min) / (max - min)) * 100\n\n const clampAndSnap = useCallback(\n (raw: number) => {\n const snapped = Math.round(raw / step) * step\n return Math.min(max, Math.max(min, snapped))\n },\n [min, max, step]\n )\n\n const valueFromPointer = useCallback(\n (clientX: number) => {\n const track = trackRef.current\n if (!track) return value\n const rect = track.getBoundingClientRect()\n const ratio = (clientX - rect.left) / rect.width\n return clampAndSnap(min + ratio * (max - min))\n },\n [min, max, value, clampAndSnap]\n )\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (disabled) return\n e.preventDefault()\n const target = e.currentTarget as HTMLElement\n target.setPointerCapture(e.pointerId)\n onChange(valueFromPointer(e.clientX))\n\n const onMove = (ev: PointerEvent) => {\n onChange(valueFromPointer(ev.clientX))\n }\n const onUp = () => {\n target.removeEventListener('pointermove', onMove)\n target.removeEventListener('pointerup', onUp)\n }\n target.addEventListener('pointermove', onMove)\n target.addEventListener('pointerup', onUp)\n },\n [disabled, onChange, valueFromPointer]\n )\n\n return (\n <div className={cn('slider', color, disabled && 'disabled', className)} {...rest}>\n {label && <div className=\"label\">{label}</div>}\n <div className=\"track-wrapper\" ref={trackRef} onPointerDown={handlePointerDown}>\n <div className=\"track\">\n <div className=\"fill\" style={{width: `${percent}%`}} />\n <div className=\"thumb\" style={{left: `${percent}%`}} />\n </div>\n {marks && marks.length > 0 && (\n <div className=\"marks\">\n {marks.map((mark) => {\n const markPercent = ((mark.value - min) / (max - min)) * 100\n return (\n <div\n key={mark.value}\n className=\"mark\"\n style={{left: `${markPercent}%`}}\n >\n <div className=\"tick\" />\n {mark.label && <div className=\"label\">{mark.label}</div>}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import type {CardProps, CardSectionProps} from './Card.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {Surface} from '../../layout/Surface'\nimport './Card.css'\n\n// Compose elevated content blocks that can optionally behave like an interactive surface.\nexport function Card({\n interactive = false,\n stretch = true,\n tone = 'raised',\n padded = false,\n color,\n fcolor,\n clickEffect,\n rippleColor,\n className,\n children,\n onPointerDown,\n ...rest\n}: CardProps) {\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: clickEffect ?? (interactive ? 'ripple' : 'none'),\n disabled: !interactive,\n color: rippleColor,\n })\n\n return (\n <Surface\n tone={tone}\n padded={padded}\n className={cn(\n 'card',\n !stretch && 'no-stretch',\n color,\n ...getAppearanceClassNames({fcolor}),\n interactive && 'interactive',\n effectClassName,\n className\n )}\n onPointerDown={(event) => {\n handlePointerDown(event)\n onPointerDown?.(event)\n }}\n {...rest}\n >\n {effectLayer}\n {children}\n </Surface>\n )\n}\n\n// Render the top section of a card.\nexport function CardHeader({className, children, ...rest}: CardSectionProps) {\n return (\n <div className={cn('header', className)} {...rest}>\n {children}\n </div>\n )\n}\n\n// Render the main content section of a card.\nexport function CardBody({className, children, ...rest}: CardSectionProps) {\n return (\n <div className={cn('body', className)} {...rest}>\n {children}\n </div>\n )\n}\n\n// Render the bottom section of a card.\nexport function CardFooter({className, children, ...rest}: CardSectionProps) {\n return (\n <div className={cn('footer', className)} {...rest}>\n {children}\n </div>\n )\n}\n","import type {CardPaymentProps} from './CardPayment.types'\nimport {cn} from '../../../utils/cn'\nimport {detectCardBrand} from '../../../utils/creditCards'\nimport './CardPayment.css'\n\nfunction maskNumber(raw: string): string {\n const digits = raw.replace(/\\D/g, '')\n if (digits.length <= 4) return digits\n const last4 = digits.slice(-4)\n return `\\u2022\\u2022\\u2022\\u2022 \\u2022\\u2022\\u2022\\u2022 \\u2022\\u2022\\u2022\\u2022 ${last4}`\n}\n\n// Display-only payment card with balance, masked number, holder name and brand badge.\nexport function CardPayment({\n holder,\n number,\n expiry,\n brand,\n brandIcon,\n balance,\n balanceLabel = 'Current balance',\n color,\n className,\n ...rest\n}: CardPaymentProps) {\n const detected = brand ?? detectCardBrand(number).brand\n const masked = maskNumber(number)\n const brandLabel = detectCardBrand(number).iconLabel\n\n return (\n <div className={cn('card-payment', className)} {...rest}>\n {balance !== undefined && (\n <div>\n <p className=\"cp-balance-label\">{balanceLabel}</p>\n <p className=\"cp-balance\">{balance}</p>\n </div>\n )}\n\n <div className=\"cp-row\">\n <span className={cn('cp-brand', !brandIcon && detected)}>\n {brandIcon ?? brandLabel}\n </span>\n <span className=\"cp-number\">{masked}</span>\n </div>\n\n <div className=\"cp-details\">\n <div>\n <p className=\"cp-field-label\">Card holder</p>\n <p className=\"cp-field-value\">{holder}</p>\n </div>\n <div>\n <p className=\"cp-field-label\">Expiration date</p>\n <p className=\"cp-field-value\">{expiry}</p>\n </div>\n </div>\n </div>\n )\n}\n","import type {CSSProperties} from 'react'\nimport type {QrCodeProps} from './QrCode.types'\nimport {cn} from '../../../utils/cn'\nimport './QrCode.css'\n\ntype VersionInfo = {\n version: number\n size: number\n dataWords: number\n ecWords: number\n byteLimit: number\n align: number[]\n}\n\nconst versions: VersionInfo[] = [\n {version: 1, size: 21, dataWords: 19, ecWords: 7, byteLimit: 17, align: []},\n {version: 2, size: 25, dataWords: 34, ecWords: 10, byteLimit: 32, align: [6, 18]},\n {version: 3, size: 29, dataWords: 55, ecWords: 15, byteLimit: 53, align: [6, 22]},\n {version: 4, size: 33, dataWords: 80, ecWords: 20, byteLimit: 78, align: [6, 26]},\n {version: 5, size: 37, dataWords: 108, ecWords: 26, byteLimit: 106, align: [6, 30]},\n]\n\nconst formatBits = [\n '111011111000100',\n '111001011110011',\n '111110110101010',\n '111100010011101',\n '110011000101111',\n '110001100011000',\n '110110001000001',\n '110100101110110',\n]\n\nconst expTable = new Array<number>(512).fill(0)\nconst logTable = new Array<number>(256).fill(0)\nconst encoder = new TextEncoder()\n\nlet fieldReady = false\n\n// Prepare log/exp lookup tables for QR Reed-Solomon math.\nfunction ensureField() {\n if (fieldReady) return\n\n let value = 1\n\n for (let i = 0; i < 255; i += 1) {\n expTable[i] = value\n logTable[value] = i\n value <<= 1\n\n if (value & 0x100) {\n value ^= 0x11d\n }\n }\n\n for (let i = 255; i < 512; i += 1) {\n expTable[i] = expTable[i - 255]\n }\n\n fieldReady = true\n}\n\n// Multiply two values inside the QR Galois field.\nfunction gfMul(a: number, b: number) {\n if (!a || !b) return 0\n ensureField()\n return expTable[logTable[a] + logTable[b]]\n}\n\n// Multiply generator polynomials used for error correction.\nfunction polyMul(left: number[], right: number[]) {\n const next = new Array(left.length + right.length - 1).fill(0)\n\n for (let row = 0; row < left.length; row += 1) {\n for (let col = 0; col < right.length; col += 1) {\n next[row + col] ^= gfMul(left[row], right[col])\n }\n }\n\n return next\n}\n\n// Build the generator polynomial for the chosen correction size.\nfunction makeGenerator(ecWords: number) {\n ensureField()\n\n let poly = [1]\n\n for (let i = 0; i < ecWords; i += 1) {\n poly = polyMul(poly, [1, expTable[i]])\n }\n\n return poly\n}\n\n// Compute Reed-Solomon error words for the current payload.\nfunction makeErrorWords(data: number[], ecWords: number) {\n const poly = makeGenerator(ecWords)\n const work = [...data, ...new Array(ecWords).fill(0)]\n\n for (let i = 0; i < data.length; i += 1) {\n const factor = work[i]\n\n if (!factor) continue\n\n for (let j = 0; j < poly.length; j += 1) {\n work[i + j] ^= gfMul(poly[j], factor)\n }\n }\n\n return work.slice(-ecWords)\n}\n\n// Push bits in MSB order so QR payload building stays explicit.\nfunction pushBits(target: number[], value: number, size: number) {\n for (let bit = size - 1; bit >= 0; bit -= 1) {\n target.push((value >> bit) & 1)\n }\n}\n\n// Repack a flat bit list into QR codewords.\nfunction bitsToBytes(bits: number[]) {\n const bytes: number[] = []\n\n for (let i = 0; i < bits.length; i += 8) {\n let byte = 0\n\n for (let bit = 0; bit < 8; bit += 1) {\n byte = (byte << 1) | (bits[i + bit] ?? 0)\n }\n\n bytes.push(byte)\n }\n\n return bytes\n}\n\n// Pick the smallest supported QR version for the payload.\nfunction pickVersion(length: number) {\n return versions.find((item) => length <= item.byteLimit) ?? null\n}\n\n// Encode a string as byte mode payload plus correction words.\nfunction encodeData(value: string, info: VersionInfo) {\n const data = Array.from(encoder.encode(value))\n const bits: number[] = []\n const capacity = info.dataWords * 8\n\n pushBits(bits, 0b0100, 4)\n pushBits(bits, data.length, 8)\n\n data.forEach((byte) => pushBits(bits, byte, 8))\n\n pushBits(bits, 0, Math.min(4, capacity - bits.length))\n\n while (bits.length % 8 !== 0) {\n bits.push(0)\n }\n\n const pads = [0xec, 0x11]\n\n for (let i = 0; bits.length < capacity; i += 1) {\n pushBits(bits, pads[i % 2], 8)\n }\n\n const dataWords = bitsToBytes(bits)\n return [...dataWords, ...makeErrorWords(dataWords, info.ecWords)]\n}\n\n// Create an empty matrix before function patterns are placed.\nfunction makeGrid(size: number) {\n return Array.from({length: size}, () => Array<boolean | null>(size).fill(null))\n}\n\n// Write a module and mark it as reserved.\nfunction setCell(grid: (boolean | null)[][], marks: boolean[][], row: number, col: number, dark: boolean) {\n if (row < 0 || col < 0 || row >= grid.length || col >= grid.length) return\n grid[row][col] = dark\n marks[row][col] = true\n}\n\n// Place one finder pattern with its quiet white border.\nfunction placeFinder(grid: (boolean | null)[][], marks: boolean[][], top: number, left: number) {\n for (let row = -1; row <= 7; row += 1) {\n for (let col = -1; col <= 7; col += 1) {\n const edge = row === -1 || row === 7 || col === -1 || col === 7\n const outer = row === 0 || row === 6 || col === 0 || col === 6\n const inner = row >= 2 && row <= 4 && col >= 2 && col <= 4\n setCell(grid, marks, top + row, left + col, !edge && (outer || inner))\n }\n }\n}\n\n// Place one alignment pattern unless another function block already owns it.\nfunction placeAlign(grid: (boolean | null)[][], marks: boolean[][], center: number, middle: number) {\n if (marks[center][middle]) return\n\n for (let row = -2; row <= 2; row += 1) {\n for (let col = -2; col <= 2; col += 1) {\n const edge = Math.max(Math.abs(row), Math.abs(col)) === 2\n const dot = row === 0 && col === 0\n setCell(grid, marks, center + row, middle + col, edge || dot)\n }\n }\n}\n\n// Reserve format info cells before data placement starts.\nfunction markFormat(marks: boolean[][]) {\n const size = marks.length\n const left = [\n [8, 0],\n [8, 1],\n [8, 2],\n [8, 3],\n [8, 4],\n [8, 5],\n [8, 7],\n [8, 8],\n [7, 8],\n [5, 8],\n [4, 8],\n [3, 8],\n [2, 8],\n [1, 8],\n [0, 8],\n ]\n const right = [\n [size - 1, 8],\n [size - 2, 8],\n [size - 3, 8],\n [size - 4, 8],\n [size - 5, 8],\n [size - 6, 8],\n [size - 7, 8],\n [8, size - 8],\n [8, size - 7],\n [8, size - 6],\n [8, size - 5],\n [8, size - 4],\n [8, size - 3],\n [8, size - 2],\n [8, size - 1],\n ]\n\n ;[...left, ...right].forEach(([row, col]) => {\n marks[row][col] = true\n })\n}\n\n// Build the static QR scaffolding: finders, timing and align blocks.\nfunction makeBase(info: VersionInfo) {\n const grid = makeGrid(info.size)\n const marks = Array.from({length: info.size}, () => Array<boolean>(info.size).fill(false))\n\n placeFinder(grid, marks, 0, 0)\n placeFinder(grid, marks, 0, info.size - 7)\n placeFinder(grid, marks, info.size - 7, 0)\n\n for (let i = 8; i < info.size - 8; i += 1) {\n setCell(grid, marks, 6, i, i % 2 === 0)\n setCell(grid, marks, i, 6, i % 2 === 0)\n }\n\n info.align.forEach((row) => {\n info.align.forEach((col) => {\n placeAlign(grid, marks, row, col)\n })\n })\n\n markFormat(marks)\n setCell(grid, marks, info.version * 4 + 9, 8, true)\n\n return {grid, marks}\n}\n\n// Fill open cells with payload bits using the QR zig-zag path.\nfunction placeData(grid: (boolean | null)[][], marks: boolean[][], words: number[]) {\n const size = grid.length\n const bits: number[] = []\n\n words.forEach((word) => pushBits(bits, word, 8))\n\n let index = 0\n let up = true\n\n for (let col = size - 1; col > 0; col -= 2) {\n if (col === 6) {\n col -= 1\n }\n\n let row = up ? size - 1 : 0\n\n while (row >= 0 && row < size) {\n for (let offset = 0; offset < 2; offset += 1) {\n const x = col - offset\n\n if (marks[row][x]) continue\n\n grid[row][x] = bits[index] === 1\n index += 1\n }\n\n row += up ? -1 : 1\n }\n\n up = !up\n }\n\n for (let row = 0; row < size; row += 1) {\n for (let col = 0; col < size; col += 1) {\n if (!marks[row][col] && grid[row][col] == null) {\n grid[row][col] = false\n }\n }\n }\n}\n\n// Check whether the current mask flips this module.\nfunction shouldFlip(mask: number, row: number, col: number) {\n switch (mask) {\n case 0:\n return (row + col) % 2 === 0\n case 1:\n return row % 2 === 0\n case 2:\n return col % 3 === 0\n case 3:\n return (row + col) % 3 === 0\n case 4:\n return (Math.floor(row / 2) + Math.floor(col / 3)) % 2 === 0\n case 5:\n return ((row * col) % 2) + ((row * col) % 3) === 0\n case 6:\n return (((row * col) % 2) + ((row * col) % 3)) % 2 === 0\n case 7:\n return (((row + col) % 2) + ((row * col) % 3)) % 2 === 0\n default:\n return false\n }\n}\n\n// Apply one mask while leaving reserved cells untouched.\nfunction applyMask(grid: (boolean | null)[][], marks: boolean[][], mask: number) {\n return grid.map((line, row) =>\n line.map((cell, col) => {\n if (marks[row][col]) return Boolean(cell)\n return shouldFlip(mask, row, col) ? !cell : Boolean(cell)\n })\n )\n}\n\n// Write format bits into both reserved format strips.\nfunction withFormat(grid: boolean[][], mask: number) {\n const size = grid.length\n const bits = formatBits[mask]\n const left = [\n [8, 0],\n [8, 1],\n [8, 2],\n [8, 3],\n [8, 4],\n [8, 5],\n [8, 7],\n [8, 8],\n [7, 8],\n [5, 8],\n [4, 8],\n [3, 8],\n [2, 8],\n [1, 8],\n [0, 8],\n ]\n const right = [\n [size - 1, 8],\n [size - 2, 8],\n [size - 3, 8],\n [size - 4, 8],\n [size - 5, 8],\n [size - 6, 8],\n [size - 7, 8],\n [8, size - 8],\n [8, size - 7],\n [8, size - 6],\n [8, size - 5],\n [8, size - 4],\n [8, size - 3],\n [8, size - 2],\n [8, size - 1],\n ]\n const next = grid.map((line) => [...line])\n\n bits.split('').forEach((bit, index) => {\n const dark = bit === '1'\n const [leftRow, leftCol] = left[index]\n const [rightRow, rightCol] = right[index]\n\n next[leftRow][leftCol] = dark\n next[rightRow][rightCol] = dark\n })\n\n return next\n}\n\n// Penalize long runs of the same color.\nfunction runPenalty(values: boolean[]) {\n let score = 0\n let run = 1\n\n for (let i = 1; i <= values.length; i += 1) {\n if (values[i] === values[i - 1]) {\n run += 1\n continue\n }\n\n if (run >= 5) {\n score += run - 2\n }\n\n run = 1\n }\n\n return score\n}\n\n// Penalize large flat blocks that scan poorly.\nfunction blockPenalty(grid: boolean[][]) {\n let score = 0\n\n for (let row = 0; row < grid.length - 1; row += 1) {\n for (let col = 0; col < grid.length - 1; col += 1) {\n const cell = grid[row][col]\n\n if (cell === grid[row][col + 1] && cell === grid[row + 1][col] && cell === grid[row + 1][col + 1]) {\n score += 3\n }\n }\n }\n\n return score\n}\n\n// Penalize patterns that look too similar to finder markers.\nfunction finderPenalty(values: boolean[]) {\n const matchA = '10111010000'\n const matchB = '00001011101'\n let score = 0\n\n for (let i = 0; i <= values.length - 11; i += 1) {\n const slice = values\n .slice(i, i + 11)\n .map((cell) => (cell ? '1' : '0'))\n .join('')\n\n if (slice === matchA || slice === matchB) {\n score += 40\n }\n }\n\n return score\n}\n\n// Keep the dark/light balance near the QR target.\nfunction ratioPenalty(grid: boolean[][]) {\n const total = grid.length * grid.length\n const dark = grid.flat().filter(Boolean).length\n const ratio = (dark * 100) / total\n return Math.floor(Math.abs(ratio - 50) / 5) * 10\n}\n\n// Sum the standard QR penalties for one candidate matrix.\nfunction getPenalty(grid: boolean[][]) {\n let score = 0\n\n for (let row = 0; row < grid.length; row += 1) {\n score += runPenalty(grid[row])\n score += finderPenalty(grid[row])\n }\n\n for (let col = 0; col < grid.length; col += 1) {\n const line = grid.map((row) => row[col])\n score += runPenalty(line)\n score += finderPenalty(line)\n }\n\n score += blockPenalty(grid)\n score += ratioPenalty(grid)\n\n return score\n}\n\n// Build the final matrix and pick the mask with the lowest penalty.\nfunction makeMatrix(value: string) {\n const data = Array.from(encoder.encode(value))\n const info = pickVersion(data.length)\n\n if (!info) {\n return null\n }\n\n const {grid, marks} = makeBase(info)\n placeData(grid, marks, encodeData(value, info))\n\n let bestMask = 0\n let bestGrid = withFormat(applyMask(grid, marks, 0), 0)\n let bestScore = getPenalty(bestGrid)\n\n for (let mask = 1; mask < 8; mask += 1) {\n const masked = withFormat(applyMask(grid, marks, mask), mask)\n const score = getPenalty(masked)\n\n if (score < bestScore) {\n bestMask = mask\n bestGrid = masked\n bestScore = score\n }\n }\n\n return {grid: bestGrid, mask: bestMask}\n}\n\n// Render a local SVG QR code without adding a runtime dependency.\nexport function QrCode({\n value,\n size = 144,\n padding = 4,\n fg = '#111827',\n bg = '#ffffff',\n className,\n style,\n ...rest\n}: QrCodeProps) {\n const qr = makeMatrix(value)\n\n if (!qr) {\n return null\n }\n\n const dimension = qr.grid.length + padding * 2\n const nextStyle = {\n '--qr-size': `${size}px`,\n ...style,\n } as CSSProperties\n\n return (\n <div className={cn('qr-code', className)} style={nextStyle} {...rest}>\n <svg\n viewBox={`0 0 ${dimension} ${dimension}`}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"QR code\"\n >\n <rect width={dimension} height={dimension} fill={bg} />\n {qr.grid.map((line, row) =>\n line.map((cell, col) =>\n cell ? (\n <rect\n key={`${row}-${col}`}\n x={col + padding}\n y={row + padding}\n width=\"1\"\n height=\"1\"\n fill={fg}\n />\n ) : null\n )\n )}\n </svg>\n </div>\n )\n}\n","import type {CardBusinessProps} from './CardBusiness.types'\nimport {cn} from '../../../utils/cn'\nimport {QrCode} from '../../display/QrCode'\nimport './CardBusiness.css'\n\nconst mailIcon = (\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 3.5h12a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1v-7a1 1 0 0 1 1-1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n <path d=\"m2 5 6 4 6-4\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n)\n\nconst phoneIcon = (\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5.3 2.4 3.9 3.8a1.5 1.5 0 0 0-.4 1.4c.6 2.5 2.6 4.6 5.2 5.2a1.5 1.5 0 0 0 1.4-.4l1.4-1.4a1 1 0 0 1 1-.2l2 1a1 1 0 0 1 .6.9v2a1 1 0 0 1-1 1C7.5 13.3 2.7 8.5 2.7 2.5a1 1 0 0 1 1-1h2a1 1 0 0 1 .9.6l1 2a1 1 0 0 1-.3 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\nconst webIcon = (\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"5.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M2.5 8h11\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path\n d=\"M8 2.5c1.7 1.5 2.6 3.3 2.6 5.5S9.7 12 8 13.5C6.3 12 5.4 10.2 5.4 8S6.3 4 8 2.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n </svg>\n)\n\nconst pinIcon = (\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M8 14s4-3.6 4-7a4 4 0 1 0-8 0c0 3.4 4 7 4 7z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"8\" cy=\"7\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n)\n\n// Build a short avatar fallback from the visible name.\nfunction initials(name: string): string {\n return name\n .split(/\\s+/)\n .slice(0, 2)\n .map((word) => word[0]?.toUpperCase() ?? '')\n .join('')\n}\n\n// Join available address fields into one readable line.\nfunction formatAddress(address: CardBusinessProps['address']): string | null {\n if (!address) return null\n\n return [address.street, [address.zip, address.city].filter(Boolean).join(' '), address.country]\n .filter(Boolean)\n .join(', ')\n}\n\n// Render a compact business card for a person or a company profile.\nexport function CardBusiness({\n variant = 'user',\n name,\n title,\n avatar,\n address,\n contact,\n socials,\n online,\n lastActive,\n qrCode,\n qrValue,\n color = 'primary',\n className,\n ...rest\n}: CardBusinessProps) {\n const addr = formatAddress(address)\n\n return (\n <div className={cn('card-business', variant, color, className)} {...rest}>\n <div className=\"cb-header\">\n <div className=\"cb-avatar-wrap\">\n {avatar ? (\n <img src={avatar} alt={name} className={cn('cb-avatar', variant)} />\n ) : (\n <span className={cn('cb-avatar', 'cb-initials', variant)}>{initials(name)}</span>\n )}\n {online !== undefined && <span className={cn('cb-status', online ? 'online' : 'offline')} />}\n </div>\n\n <div className=\"cb-info\">\n <h3 className=\"cb-name\">{name}</h3>\n {title && <p className=\"cb-title\">{title}</p>}\n {lastActive && <p className=\"cb-last-active\">{lastActive}</p>}\n </div>\n\n {(qrValue || qrCode) && (\n <div className=\"cb-qr\">\n {qrValue ? (\n <QrCode value={qrValue} size={56} padding={3} className=\"cb-qr-code\" />\n ) : (\n <img src={qrCode} alt=\"QR\" className=\"cb-qr-img\" />\n )}\n </div>\n )}\n </div>\n\n {(contact || addr) && (\n <div className=\"cb-details\">\n {contact?.email && (\n <div className=\"cb-detail\">\n <span className=\"cb-detail-icon\">{mailIcon}</span>\n <a href={`mailto:${contact.email}`} className=\"cb-detail-value\">\n {contact.email}\n </a>\n </div>\n )}\n {contact?.phone && (\n <div className=\"cb-detail\">\n <span className=\"cb-detail-icon\">{phoneIcon}</span>\n <a href={`tel:${contact.phone}`} className=\"cb-detail-value\">\n {contact.phone}\n </a>\n </div>\n )}\n {contact?.website && (\n <div className=\"cb-detail\">\n <span className=\"cb-detail-icon\">{webIcon}</span>\n <a\n href={contact.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"cb-detail-value\"\n >\n {contact.website.replace(/^https?:\\/\\//, '')}\n </a>\n </div>\n )}\n {addr && (\n <div className=\"cb-detail\">\n <span className=\"cb-detail-icon\">{pinIcon}</span>\n <span className=\"cb-detail-value\">{addr}</span>\n </div>\n )}\n </div>\n )}\n\n {socials && socials.length > 0 && (\n <div className=\"cb-socials\">\n {socials.map((item) => (\n <a\n key={item.platform}\n href={item.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"cb-social\"\n title={item.platform}\n >\n {item.icon ?? item.platform}\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import {useState, useRef, useEffect} from 'react'\nimport type {CardServiceProps} from './CardService.types'\nimport {cn} from '../../../utils/cn'\nimport './CardService.css'\n\nfunction StarIcon({filled}: {filled: boolean}) {\n return (\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" className={cn('cs-star', filled && 'filled')}>\n <path\n d=\"M8 1.3l1.8 3.6 4 .6-2.9 2.8.7 4-3.6-1.9-3.6 1.9.7-4L2.2 5.5l4-.6L8 1.3z\"\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n />\n </svg>\n )\n}\n\nfunction AvatarStack({people, max = 4}: {people: CardServiceProps['participants']; max?: number}) {\n if (!people || people.length === 0) return null\n const visible = people.slice(0, max)\n const overflow = people.length - max\n\n return (\n <div className=\"cs-avatars\">\n {visible.map((p, i) => (\n <span key={i} className=\"cs-avatar-sm\" title={p.name}>\n {p.avatar ? (\n <img src={p.avatar} alt={p.name} />\n ) : (\n <span>{p.name[0]?.toUpperCase()}</span>\n )}\n </span>\n ))}\n {overflow > 0 && <span className=\"cs-avatar-sm cs-overflow\">+{overflow}</span>}\n </div>\n )\n}\n\n// Card for services, courses or products with rating, gallery, cart and participant display.\nexport function CardService({\n variant = 'service',\n title,\n description,\n price,\n currency = 'PLN',\n duration,\n available,\n image,\n gallery,\n rating,\n reviewCount,\n favorite,\n onFavorite,\n menuItems,\n onAddToCart,\n icon,\n color = 'primary',\n leader,\n participants,\n maxParticipants,\n quantity: controlledQty,\n onQuantityChange,\n className,\n ...rest\n}: CardServiceProps) {\n const [menuOpen, setMenuOpen] = useState(false)\n const [galleryIdx, setGalleryIdx] = useState(0)\n const [internalQty, setInternalQty] = useState(1)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const qty = controlledQty ?? internalQty\n const images = gallery && gallery.length > 0 ? gallery : image ? [image] : []\n\n useEffect(() => {\n if (!menuOpen) return\n function close(e: MouseEvent) {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) setMenuOpen(false)\n }\n document.addEventListener('mousedown', close)\n return () => document.removeEventListener('mousedown', close)\n }, [menuOpen])\n\n function changeQty(next: number) {\n const val = Math.max(1, next)\n if (onQuantityChange) onQuantityChange(val)\n else setInternalQty(val)\n }\n\n const availLabel =\n available === true ? 'Available' :\n available === false ? 'Unavailable' :\n typeof available === 'number' ? `${available} spots` :\n null\n\n return (\n <div className={cn('card-service', variant, color, className)} {...rest}>\n {/* Image / Gallery */}\n {images.length > 0 && (\n <div className=\"cs-gallery\">\n <img src={images[galleryIdx]} alt={title} className=\"cs-image\" />\n {images.length > 1 && (\n <div className=\"cs-gallery-dots\">\n {images.map((_, i) => (\n <button\n key={i}\n className={cn('cs-dot', i === galleryIdx && 'active')}\n onClick={() => setGalleryIdx(i)}\n aria-label={`Image ${i + 1}`}\n />\n ))}\n </div>\n )}\n\n {onFavorite && (\n <button\n className={cn('cs-fav', favorite && 'active')}\n onClick={onFavorite}\n aria-label={favorite ? 'Remove from favorites' : 'Add to favorites'}\n >\n {favorite ? '♥' : '♡'}\n </button>\n )}\n\n {menuItems && menuItems.length > 0 && (\n <div className=\"cs-menu-wrap\" ref={menuRef}>\n <button className=\"cs-menu-btn\" onClick={() => setMenuOpen(!menuOpen)} aria-label=\"More options\">\n ⋮\n </button>\n {menuOpen && (\n <div className=\"cs-menu\">\n {menuItems.map((item, i) => (\n <button\n key={i}\n className={cn('cs-menu-item', item.danger && 'danger')}\n onClick={() => { item.onClick?.(); setMenuOpen(false) }}\n >\n {item.icon && <span className=\"cs-menu-icon\">{item.icon}</span>}\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Body */}\n <div className=\"cs-body\">\n <div className=\"cs-top\">\n {icon && <span className=\"cs-icon\">{icon}</span>}\n <h3 className=\"cs-title\">{title}</h3>\n </div>\n\n {description && <p className=\"cs-desc\">{description}</p>}\n\n {/* Rating */}\n {rating !== undefined && (\n <div className=\"cs-rating\">\n {[1, 2, 3, 4, 5].map((n) => (\n <StarIcon key={n} filled={n <= Math.round(rating)} />\n ))}\n <span className=\"cs-rating-value\">{rating.toFixed(1)}</span>\n {reviewCount !== undefined && (\n <span className=\"cs-review-count\">({reviewCount})</span>\n )}\n </div>\n )}\n\n {/* Leader / Participants */}\n {leader && (\n <div className=\"cs-leader\">\n <span className=\"cs-avatar-sm\" title={leader.name}>\n {leader.avatar ? (\n <img src={leader.avatar} alt={leader.name} />\n ) : (\n <span>{leader.name[0]?.toUpperCase()}</span>\n )}\n </span>\n <span className=\"cs-leader-name\">{leader.name}</span>\n </div>\n )}\n\n {variant === 'course' && participants && (\n <div className=\"cs-participants\">\n <AvatarStack people={participants} />\n {maxParticipants && (\n <span className=\"cs-spots\">\n {participants.length}/{maxParticipants}\n </span>\n )}\n </div>\n )}\n\n {/* Meta: duration, availability */}\n <div className=\"cs-meta\">\n {duration && <span className=\"cs-tag\">⏱ {duration}</span>}\n {availLabel && (\n <span className={cn('cs-tag', available === false && 'unavailable')}>\n {availLabel}\n </span>\n )}\n </div>\n </div>\n\n {/* Footer: price + actions */}\n <div className=\"cs-footer\">\n {price !== undefined && (\n <span className=\"cs-price\">\n {typeof price === 'number' ? price.toFixed(2) : price}\n {' '}<span className=\"cs-currency\">{currency}</span>\n </span>\n )}\n\n <div className=\"cs-actions\">\n {variant === 'product' && onAddToCart && (\n <div className=\"cs-qty\">\n <button className=\"cs-qty-btn\" onClick={() => changeQty(qty - 1)} aria-label=\"Decrease\">−</button>\n <span className=\"cs-qty-value\">{qty}</span>\n <button className=\"cs-qty-btn\" onClick={() => changeQty(qty + 1)} aria-label=\"Increase\">+</button>\n </div>\n )}\n {onAddToCart && (\n <button\n className=\"cs-cart-btn\"\n onClick={() => onAddToCart(qty)}\n disabled={available === false}\n >\n Add to cart\n </button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import {useCallback, useState} from 'react'\n\ntype ControllableStringLike = string | number | readonly string[] | null | undefined\n\n// Normalize mixed input values so text-like controls always work with strings.\nfunction normalizeStringValue(value: ControllableStringLike) {\n if (value === null || value === undefined) {\n return ''\n }\n\n return value.toString()\n}\n\n// Share controlled and uncontrolled string state logic between text-like primitives.\nexport function useControllableString(value: ControllableStringLike, defaultValue?: ControllableStringLike) {\n const [internalValue, setInternalValue] = useState(() => normalizeStringValue(defaultValue))\n const isControlled = value !== undefined\n const currentValue = isControlled ? normalizeStringValue(value) : internalValue\n\n const setCurrentValue = useCallback(\n (nextValue: string) => {\n if (!isControlled) {\n setInternalValue(nextValue)\n }\n },\n [isControlled]\n )\n\n return {\n isControlled,\n currentValue,\n setCurrentValue,\n }\n}\n","import {forwardRef, useCallback, useRef, useState} from 'react'\nimport type {InputProps} from './Input.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {useGhostText} from '../../../utils/useGhostText'\nimport './Input.css'\n\n// Render the base text input used by all specialized input wrappers.\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n type = 'text',\n value,\n defaultValue,\n name,\n id,\n placeholder,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n autoComplete,\n inputMode,\n variant = 'outlined',\n size = 'md',\n color,\n fcolor,\n fullWidth = false,\n rounded = false,\n label,\n helperText,\n errorText,\n startIcon,\n endIcon,\n clearable = false,\n error = false,\n success = false,\n maxLength,\n showCharCount = false,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n onClear,\n ghostOptions,\n ghostMinChars = 2,\n onGhostAccept,\n loading = false,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n inputClassName,\n labelClassName,\n },\n ref\n) {\n const [focused, setFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: clickEffect,\n disabled: disabled || readOnly,\n color: rippleColor,\n })\n\n const {isControlled, currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n const ghost = useGhostText({\n options: ghostOptions ?? [],\n value: currentValue,\n minChars: ghostMinChars,\n })\n const hasError = error || !!errorText\n const hasContent = currentValue.length > 0\n\n // Mirror focus state so the wrapper can style the input consistently.\n const handleFocus = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true)\n onFocus?.(event)\n },\n [onFocus]\n )\n\n // Clear focus styles before delegating to the caller.\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false)\n onBlur?.(event)\n },\n [onBlur]\n )\n\n // Keep uncontrolled usage working without blocking controlled integrations.\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setCurrentValue(event.target.value)\n onChange?.(event)\n ghost.reset()\n },\n [onChange, setCurrentValue, ghost.reset]\n )\n\n // Intercept keyboard events for ghost text acceptance before delegating.\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (ghostOptions && ghost.hint) {\n const accepted = ghost.onKeyDown(event)\n if (accepted) {\n const result = ghost.accept()\n setCurrentValue(result.value)\n onGhostAccept?.(result.value)\n // Fire synthetic change so controlled parents stay in sync.\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input) {\n const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n nativeSet?.call(input, result.value)\n input.dispatchEvent(new Event('input', {bubbles: true}))\n }\n return\n }\n }\n onKeyDown?.(event)\n },\n [ghostOptions, ghost, setCurrentValue, onGhostAccept, onKeyDown, ref]\n )\n\n // Reset the visible value while preserving focus for quick repeated input.\n const handleClear = useCallback(() => {\n setCurrentValue('')\n\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input && isControlled) {\n input.value = ''\n }\n\n onClear?.()\n input?.focus()\n }, [isControlled, onClear, ref, setCurrentValue])\n\n const containerClasses = cn(\n 'container',\n variant,\n size,\n focused && 'focused',\n hasError && 'input-error',\n success && !hasError && 'input-success',\n color === 'neutral' && 'color-neutral',\n color === 'success' && 'color-success',\n color === 'error' && 'color-error',\n color === 'warning' && 'color-warning',\n color === 'info' && 'color-info',\n disabled && 'disabled',\n rounded && 'rounded',\n effectClassName\n )\n\n return (\n <div\n className={cn('input', ...getAppearanceClassNames({fcolor}), fullWidth && 'full-width', className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'label',\n focused && 'focused',\n hasError && 'error',\n success && !hasError && 'success',\n required && 'required',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className={containerClasses} onPointerDown={handlePointerDown}>\n {effectLayer}\n {startIcon && <span className=\"start-icon\">{startIcon}</span>}\n\n {ghostOptions ? (\n <div className=\"ghost-text-field\">\n <input\n ref={ref ?? inputRef}\n type={type}\n value={currentValue}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n autoComplete={autoComplete ?? 'off'}\n inputMode={inputMode}\n maxLength={maxLength}\n className={cn('field', inputClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n {focused && ghost.hint && (\n <span className=\"ghost-text-overlay\" aria-hidden=\"true\">\n <span className=\"ghost-text-typed\">{currentValue}</span>\n <span className=\"ghost-text-hint\">{ghost.hint}</span>\n </span>\n )}\n </div>\n ) : (\n <input\n ref={ref ?? inputRef}\n type={type}\n value={currentValue}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n inputMode={inputMode}\n maxLength={maxLength}\n className={cn('field', inputClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n )}\n\n {loading && <span className=\"spinner\" />}\n\n {clearable && hasContent && !loading && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear input\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n\n {endIcon && !loading && <span className=\"end-icon\">{endIcon}</span>}\n </div>\n\n {(errorText || helperText || showCharCount) && (\n <div className=\"bottom-row\">\n <span>\n {errorText && (\n <span id={id ? `${id}-error` : undefined} className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n )}\n {!errorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className=\"helper-text\">\n {helperText}\n </span>\n )}\n </span>\n {showCharCount && maxLength && (\n <span className={cn('char-count', currentValue.length > maxLength && 'over')}>\n {currentValue.length}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputSearchProps} from './InputSearch.types'\nimport {Input} from '../Input'\nimport {useDebouncedCallback} from '../../../utils/useDebounce'\n\n// Extend the base input with debounced search callbacks and an inline clear action.\nexport const InputSearch = forwardRef<HTMLInputElement, InputSearchProps>(function InputSearch(\n {\n debounceMs = 300,\n onSearch,\n value,\n defaultValue,\n onChange,\n onKeyDown,\n onClear,\n clearable = true,\n placeholder = 'Search...',\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n const debouncedSearch = useDebouncedCallback((val: string) => onSearch?.(val), debounceMs)\n\n // Update local state and debounce search notifications while typing.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value)\n }\n debouncedSearch(e.target.value)\n onChange?.(e)\n },\n [onChange, value, debouncedSearch]\n )\n\n // Run search immediately when the user confirms with Enter.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n onSearch?.(currentValue)\n }\n onKeyDown?.(e)\n },\n [currentValue, onSearch, onKeyDown]\n )\n\n // Clear both the visible field and the emitted search query.\n const handleClear = useCallback(() => {\n if (value === undefined) {\n setInternalValue('')\n }\n onSearch?.('')\n onClear?.()\n }, [value, onSearch, onClear])\n\n const searchIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"6.5\" cy=\"6.5\" r=\"5\" />\n <line x1=\"10\" y1=\"10\" x2=\"14.5\" y2=\"14.5\" />\n </svg>\n )\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"search\"\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onClear={handleClear}\n clearable={clearable}\n placeholder={placeholder}\n startIcon={searchIcon}\n />\n )\n})\n","import {useState, useMemo, useRef, useEffect} from 'react'\nimport type {CardGridProps} from './CardGrid.types'\nimport {cn} from '../../../utils/cn'\nimport {InputSearch} from '../../inputs/InputSearch'\nimport './CardGrid.css'\n\nfunction getNestedValue(obj: unknown, key: string): unknown {\n const parts = key.split('.')\n let val: unknown = obj\n\n for (const p of parts) {\n if (val == null || typeof val !== 'object') return undefined\n val = (val as Record<string, unknown>)[p]\n }\n\n return val\n}\n\nexport function CardGrid<T extends Record<string, unknown>>({\n items,\n renderCard,\n searchable = false,\n searchKeys,\n searchPlaceholder = 'Search...',\n filterable = false,\n filterKeys = [],\n sortable = false,\n sortKeys = [],\n defaultSort,\n columns = 3,\n gap,\n emptyMessage = 'No results found.',\n className,\n style,\n ...rest\n}: CardGridProps<T>) {\n const [search, setSearch] = useState('')\n const [filters, setFilters] = useState<Record<string, Set<string>>>({})\n const [sortKey, setSortKey] = useState<string | null>(defaultSort?.key ?? null)\n const [sortDir, setSortDir] = useState<'asc' | 'desc'>(defaultSort?.direction ?? 'asc')\n const [filterOpen, setFilterOpen] = useState(false)\n const [sortOpen, setSortOpen] = useState(false)\n const filterRef = useRef<HTMLDivElement>(null)\n const sortRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n function close(event: MouseEvent) {\n if (filterRef.current && !filterRef.current.contains(event.target as Node)) {\n setFilterOpen(false)\n }\n\n if (sortRef.current && !sortRef.current.contains(event.target as Node)) {\n setSortOpen(false)\n }\n }\n\n document.addEventListener('mousedown', close)\n return () => document.removeEventListener('mousedown', close)\n }, [])\n\n const processed = useMemo(() => {\n let result = [...items]\n\n if (search && searchKeys && searchKeys.length > 0) {\n const query = search.toLowerCase()\n result = result.filter((item) =>\n searchKeys.some((key) => {\n const value = getNestedValue(item, key)\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n }\n\n for (const [key, selected] of Object.entries(filters)) {\n if (selected.size === 0) continue\n\n result = result.filter((item) => {\n const value = getNestedValue(item, key)\n return value != null && selected.has(String(value))\n })\n }\n\n if (sortKey) {\n result.sort((a, b) => {\n const av = getNestedValue(a, sortKey)\n const bv = getNestedValue(b, sortKey)\n\n if (av == null && bv == null) return 0\n if (av == null) return 1\n if (bv == null) return -1\n\n const compare = String(av).localeCompare(String(bv), undefined, {numeric: true})\n return sortDir === 'asc' ? compare : -compare\n })\n }\n\n return result\n }, [items, search, searchKeys, filters, sortKey, sortDir])\n\n function toggleFilter(key: string, value: string) {\n setFilters((prev) => {\n const next = new Set(prev[key] ?? [])\n\n if (next.has(value)) next.delete(value)\n else next.add(value)\n\n return {...prev, [key]: next}\n })\n }\n\n const filterOptions = useMemo(() => {\n const map: Record<string, string[]> = {}\n\n for (const filterKey of filterKeys) {\n if (filterKey.options) {\n map[filterKey.key] = filterKey.options\n continue\n }\n\n const values = new Set<string>()\n\n for (const item of items) {\n const value = getNestedValue(item, filterKey.key)\n if (value != null) values.add(String(value))\n }\n\n map[filterKey.key] = Array.from(values).sort()\n }\n\n return map\n }, [items, filterKeys])\n\n const activeSort = sortKeys.find((item) => item.key === sortKey)\n\n return (\n <div className={cn('card-grid', className)} style={style} {...rest}>\n {(searchable || filterable || sortable) && (\n <div className=\"cg-toolbar\">\n {searchable && (\n <InputSearch\n className=\"cg-search\"\n size=\"sm\"\n fullWidth\n placeholder={searchPlaceholder}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onClear={() => setSearch('')}\n />\n )}\n\n <div className=\"cg-toolbar-actions\">\n {filterable && filterKeys.length > 0 && (\n <div className=\"cg-dropdown-wrap\" ref={filterRef}>\n <button\n type=\"button\"\n className=\"cg-toolbar-btn\"\n aria-expanded={filterOpen}\n onClick={() => {\n setFilterOpen(!filterOpen)\n setSortOpen(false)\n }}\n >\n Filter\n </button>\n {filterOpen && (\n <div className=\"cg-dropdown\">\n {filterKeys.map((filterKey) => (\n <div key={filterKey.key} className=\"cg-filter-group\">\n <span className=\"cg-filter-label\">{filterKey.label}</span>\n {(filterOptions[filterKey.key] ?? []).map((option) => (\n <label key={option} className=\"cg-filter-option\">\n <input\n type=\"checkbox\"\n checked={filters[filterKey.key]?.has(option) ?? false}\n onChange={() => toggleFilter(filterKey.key, option)}\n />\n {option}\n </label>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {sortable && sortKeys.length > 0 && (\n <div className=\"cg-dropdown-wrap\" ref={sortRef}>\n <button\n type=\"button\"\n className=\"cg-toolbar-btn\"\n aria-expanded={sortOpen}\n onClick={() => {\n setSortOpen(!sortOpen)\n setFilterOpen(false)\n }}\n >\n {activeSort ? `Sort: ${activeSort.label}` : 'Sort'}\n </button>\n {sortOpen && (\n <div className=\"cg-dropdown\">\n {sortKeys.map((sortItem) => (\n <button\n key={sortItem.key}\n type=\"button\"\n className={cn('cg-sort-item', sortKey === sortItem.key && 'active')}\n onClick={() => {\n if (sortKey === sortItem.key) {\n setSortDir(sortDir === 'asc' ? 'desc' : 'asc')\n } else {\n setSortKey(sortItem.key)\n setSortDir('asc')\n }\n\n setSortOpen(false)\n }}\n >\n {sortItem.label}\n {sortKey === sortItem.key && (\n <span className=\"cg-sort-dir\">\n {sortDir === 'asc' ? 'Up' : 'Down'}\n </span>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {processed.length > 0 ? (\n <div\n className=\"cg-grid\"\n style={{\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\n ...(gap ? {gap} : {}),\n }}\n >\n {processed.map((item, index) => renderCard(item, index))}\n </div>\n ) : (\n <div className=\"cg-empty\">{emptyMessage}</div>\n )}\n </div>\n )\n}\n","import {useMemo, useState} from 'react'\nimport type {DataTableProps, DataTableSort} from './DataTable.types'\nimport {Checkbox} from '../../controls/Checkbox'\nimport {InputSearch} from '../../inputs/InputSearch'\nimport {MPagination} from '../../layout/MPagination'\nimport {cn} from '../../../utils/cn'\nimport './DataTable.css'\n\nfunction getRowKey<T>(row: T, index: number, rowKey?: string | ((row: T, index: number) => string)): string {\n if (typeof rowKey === 'function') return rowKey(row, index)\n if (typeof rowKey === 'string') return String((row as any)[rowKey])\n return String((row as any).id ?? index)\n}\n\nexport function DataTable<T = any>({\n columns,\n data,\n rowKey,\n sortable = false,\n filterable = false,\n selectable = false,\n pagination = false,\n pageSize = 10,\n striped = false,\n compact = false,\n stickyHeader = false,\n sort: controlledSort,\n onSortChange,\n selectedKeys: controlledSelected,\n onSelectionChange,\n emptyText = 'No data',\n filterPlaceholder = 'Search...',\n className,\n ...rest\n}: DataTableProps<T>) {\n const [internalSort, setInternalSort] = useState<DataTableSort | null>(null)\n const [internalSelected, setInternalSelected] = useState<string[]>([])\n const [filter, setFilter] = useState('')\n const [page, setPage] = useState(0)\n\n const activeSort = controlledSort !== undefined ? controlledSort : internalSort\n const selected = controlledSelected ?? internalSelected\n const setSelected = onSelectionChange ?? setInternalSelected\n\n function handleSort(key: string) {\n let next: DataTableSort | null\n\n if (activeSort?.key === key) {\n next = activeSort.dir === 'asc' ? {key, dir: 'desc'} : null\n } else {\n next = {key, dir: 'asc'}\n }\n\n if (onSortChange) onSortChange(next)\n else setInternalSort(next)\n\n setPage(0)\n }\n\n const filtered = useMemo(() => {\n if (!filterable || !filter.trim()) return data\n\n const query = filter.toLowerCase()\n\n return data.filter((row) =>\n columns.some((col) => {\n if (col.filterable === false) return false\n\n const value = (row as any)[col.key]\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n }, [data, filter, filterable, columns])\n\n const sorted = useMemo(() => {\n if (!activeSort) return filtered\n\n const col = columns.find((item) => item.key === activeSort.key)\n if (!col?.sortable && !sortable) return filtered\n\n const dir = activeSort.dir === 'asc' ? 1 : -1\n\n return [...filtered].sort((a, b) => {\n const va = (a as any)[activeSort.key]\n const vb = (b as any)[activeSort.key]\n\n if (va == null && vb == null) return 0\n if (va == null) return 1\n if (vb == null) return -1\n if (typeof va === 'number' && typeof vb === 'number') return (va - vb) * dir\n\n return String(va).localeCompare(String(vb)) * dir\n })\n }, [filtered, activeSort, columns, sortable])\n\n const totalPages = pagination ? Math.max(1, Math.ceil(sorted.length / pageSize)) : 1\n const pageData = pagination ? sorted.slice(page * pageSize, (page + 1) * pageSize) : sorted\n\n const allKeys = pageData.map((row, index) => getRowKey(row, page * pageSize + index, rowKey))\n const allSelected = allKeys.length > 0 && allKeys.every((key) => selected.includes(key))\n\n function toggleAll() {\n if (allSelected) {\n setSelected(selected.filter((key) => !allKeys.includes(key)))\n } else {\n setSelected([...new Set([...selected, ...allKeys])])\n }\n }\n\n function toggleRow(key: string) {\n setSelected(selected.includes(key) ? selected.filter((item) => item !== key) : [...selected, key])\n }\n\n function handleRowClick(key: string, event: React.MouseEvent) {\n const target = event.target as HTMLElement\n if (target.closest('button, a, [data-no-row-select]')) return\n toggleRow(key)\n }\n\n return (\n <div className={cn('data-table', className)} {...rest}>\n {filterable && (\n <div className=\"toolbar\">\n <InputSearch\n className=\"filter-search\"\n size=\"sm\"\n fullWidth\n placeholder={filterPlaceholder}\n value={filter}\n onChange={(event) => {\n setFilter(event.target.value)\n setPage(0)\n }}\n onClear={() => {\n setFilter('')\n setPage(0)\n }}\n />\n </div>\n )}\n <div className=\"scroll\">\n <table className={cn('root', striped && 'striped', compact && 'compact')}>\n <thead className={cn('head', stickyHeader && 'sticky')}>\n <tr>\n {selectable && (\n <th className=\"th check-col\">\n <Checkbox checked={allSelected} onChange={toggleAll} size=\"sm\" clickEffect=\"none\" />\n </th>\n )}\n {columns.map((col) => {\n const isSortable = col.sortable ?? sortable\n const isSorted = activeSort?.key === col.key\n\n return (\n <th\n key={col.key}\n className={cn(\n 'th',\n isSortable && 'sortable',\n isSorted && `sorted-${activeSort!.dir}`\n )}\n style={{\n width: col.width,\n textAlign: col.align,\n }}\n onClick={isSortable ? () => handleSort(col.key) : undefined}\n >\n <span className=\"th-content\">\n {col.label}\n {isSortable && (\n <span className=\"sort-icon\">\n {isSorted ? (activeSort!.dir === 'asc' ? '▲' : '▼') : '⇅'}\n </span>\n )}\n </span>\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {pageData.length === 0 && (\n <tr>\n <td className=\"empty\" colSpan={columns.length + (selectable ? 1 : 0)}>\n {emptyText}\n </td>\n </tr>\n )}\n {pageData.map((row, index) => {\n const key = getRowKey(row, page * pageSize + index, rowKey)\n const isSelected = selected.includes(key)\n\n return (\n <tr\n key={key}\n className={cn('row', isSelected && 'selected', selectable && 'selectable')}\n onClick={selectable ? (event) => handleRowClick(key, event) : undefined}\n >\n {selectable && (\n <td className=\"td check-col\">\n <Checkbox\n checked={isSelected}\n onChange={() => {}}\n size=\"sm\"\n clickEffect=\"none\"\n />\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className=\"td\" style={{textAlign: col.align}}>\n {col.render\n ? col.render((row as any)[col.key], row, page * pageSize + index)\n : (row as any)[col.key]}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n {pagination && totalPages > 1 && (\n <MPagination\n total={sorted.length}\n page={page + 1}\n pageSize={pageSize}\n onChange={(nextPage) => setPage(nextPage - 1)}\n />\n )}\n </div>\n )\n}\n","import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent} from 'react'\nimport type {TreeViewProps, TreeItemProps, TreeNode, TreeViewContextMenuItem, TreeViewMoveEvent} from './TreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {Portal} from '../../primitives/Portal'\nimport './TreeView.css'\n\ntype FileTypeMeta = {\n label: string\n color: string\n background: string\n}\n\n// Keep file badges simple but still readable for common extensions.\nconst folderClosed = (\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n <path d=\"M1.5 3A1.5 1.5 0 0 0 0 4.5v8A1.5 1.5 0 0 0 1.5 14h13a1.5 1.5 0 0 0 1.5-1.5V6a1.5 1.5 0 0 0-1.5-1.5H7.71L6.85 3.36A1.5 1.5 0 0 0 5.79 3H1.5z\" />\n </svg>\n)\n\nconst folderOpen = (\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n <path d=\"M.54 3.87L.5 3a2 2 0 0 1 2-2h3.67a2 2 0 0 1 1.41.59l.83.82H14.5a2 2 0 0 1 2 2v1.1a.5.5 0 0 1 0 .1V12a2 2 0 0 1-2 2H1.5a2 2 0 0 1-2-2V4.5a.5.5 0 0 1 0-.13V4a.5.5 0 0 1 .04-.13zM2.5 2a1 1 0 0 0-1 1v.5h4.38l-.73-.73A1 1 0 0 0 4.44 2.5H2.5zM1.5 5v7a1 1 0 0 0 1 1h11a1 1 0 0 0 1-1V5.5h-13V5z\" />\n </svg>\n)\n\nconst genericFileIcon = (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\">\n <path\n d=\"M5 1.75h6.1l3.9 3.9v11.1a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 4 16.75v-13A2 2 0 0 1 5 1.75z\"\n fill=\"var(--mineral-surface)\"\n stroke=\"var(--mineral-border-strong, var(--mineral-border))\"\n strokeWidth=\"1\"\n />\n <path\n d=\"M11 1.75v3a1 1 0 0 0 1 1h3\"\n fill=\"none\"\n stroke=\"var(--mineral-border-strong, var(--mineral-border))\"\n strokeWidth=\"1\"\n />\n </svg>\n)\n\nconst fileTypeMap: Record<string, FileTypeMeta> = {\n pdf: {label: 'PDF', color: '#c62828', background: '#fde8e8'},\n ts: {label: 'TS', color: '#3178c6', background: '#e8f1fb'},\n tsx: {label: 'TSX', color: '#3178c6', background: '#e8f1fb'},\n js: {label: 'JS', color: '#7a5f00', background: '#fff7c2'},\n jsx: {label: 'JSX', color: '#7a5f00', background: '#fff7c2'},\n css: {label: 'CSS', color: '#264de4', background: '#e6edff'},\n scss: {label: 'CSS', color: '#bf4b8a', background: '#fdebf4'},\n html: {label: 'HTML', color: '#e34c26', background: '#fff0ea'},\n json: {label: 'JSON', color: '#6b7a1b', background: '#f3f8d8'},\n md: {label: 'MD', color: '#0f7490', background: '#e6f7fb'},\n txt: {label: 'TXT', color: '#475569', background: '#eef2f7'},\n csv: {label: 'CSV', color: '#0f766e', background: '#e5fbf6'},\n zip: {label: 'ZIP', color: '#7c3aed', background: '#f0e8ff'},\n svg: {label: 'SVG', color: '#c97a00', background: '#fff3d8'},\n png: {label: 'IMG', color: '#7c3aed', background: '#f2eaff'},\n jpg: {label: 'IMG', color: '#7c3aed', background: '#f2eaff'},\n jpeg: {label: 'IMG', color: '#7c3aed', background: '#f2eaff'},\n gif: {label: 'IMG', color: '#7c3aed', background: '#f2eaff'},\n webp: {label: 'IMG', color: '#7c3aed', background: '#f2eaff'},\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: TreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Map the extension to a small label and color pair.\nfunction getFileTypeMeta(label: string): FileTypeMeta | null {\n const ext = getFileExtension(label)\n if (!ext) return null\n\n return (\n fileTypeMap[ext] ?? {\n label: ext.slice(0, 3).toUpperCase(),\n color: '#475569',\n background: '#eef2f7',\n }\n )\n}\n\n// Draw a tiny file badge when the node does not provide a custom icon.\nfunction renderFileIcon(label: string) {\n const meta = getFileTypeMeta(label)\n\n if (!meta) {\n return genericFileIcon\n }\n\n return (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\">\n <path\n d=\"M5 1.75h6.1l3.9 3.9v11.1a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 4 16.75v-13A2 2 0 0 1 5 1.75z\"\n fill=\"var(--mineral-surface)\"\n stroke=\"var(--mineral-border-strong, var(--mineral-border))\"\n strokeWidth=\"1\"\n />\n <path\n d=\"M11 1.75v3a1 1 0 0 0 1 1h3\"\n fill=\"none\"\n stroke=\"var(--mineral-border-strong, var(--mineral-border))\"\n strokeWidth=\"1\"\n />\n <rect x=\"4.5\" y=\"10.25\" width=\"11\" height=\"5.25\" rx=\"1.6\" fill={meta.background} />\n <text\n x=\"10\"\n y=\"14\"\n textAnchor=\"middle\"\n fontSize=\"4\"\n fontWeight=\"700\"\n fontFamily=\"var(--mineral-font-family-sans, sans-serif)\"\n fill={meta.color}\n >\n {meta.label}\n </text>\n </svg>\n )\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: TreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? folderOpen : folderClosed\n\n return renderFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: TreeNode[]) {\n const nodeMap = new Map<string, TreeNode>()\n const descendants = new Map<string, Set<string>>()\n\n function walk(node: TreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants}\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: TreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n aria-grabbed={draggable && !node.disabled ? isDragging : undefined}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>{'>'}</span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function TreeView({\n items,\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: TreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: TreeNode\n items: TreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const {nodeMap, descendants} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: TreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: TreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: TreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: TreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: TreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: TreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies TreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <Portal>\n <div ref={menuRef} className=\"tree-menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </Portal>\n )}\n </div>\n )\n}\n","import type {TaskListProps} from './TaskList.types'\nimport {cn} from '../../../utils/cn'\nimport './TaskList.css'\n\n// Render an interactive checklist with toggleable task items.\nexport function TaskList({\n items,\n color = 'primary',\n strikethrough = true,\n onChange,\n className,\n ...rest\n}: TaskListProps) {\n return (\n <div className={cn('task-list', color, className)} role=\"list\" {...rest}>\n {items.map((item) => (\n <label\n key={item.id}\n className={cn(\n 'task-list-item',\n item.checked && 'checked',\n item.disabled && 'disabled'\n )}\n role=\"listitem\"\n >\n <input\n type=\"checkbox\"\n className=\"task-list-checkbox\"\n checked={item.checked ?? false}\n disabled={item.disabled}\n onChange={(e) => onChange?.(item.id, e.target.checked)}\n />\n <span className={cn('task-list-label', item.checked && strikethrough && 'done')}>\n {item.label}\n </span>\n </label>\n ))}\n </div>\n )\n}\n","import type {BadgeProps} from './Badge.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Badge.css'\n\n// Render a compact semantic label for status and metadata.\nexport function Badge({color = 'primary', size = 'md', fcolor, pulsing = false, className, children, ...rest}: BadgeProps) {\n return (\n <span className={cn('badge', color, size, ...getAppearanceClassNames({fcolor}), pulsing && 'pulsing', className)} {...rest}>\n {children}\n </span>\n )\n}\n","import type {CSSProperties} from 'react'\nimport type {AvatarProps} from './Avatar.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './Avatar.css'\n\nfunction getFallbackInitials(name?: string, initials?: string) {\n if (initials) {\n return initials.slice(0, 2).toUpperCase()\n }\n\n if (!name) {\n return '?'\n }\n\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n\n if (parts.length === 0) {\n return '?'\n }\n\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase()\n }\n\n return `${parts[0][0]}${parts[1][0]}`.toUpperCase()\n}\n\n// Render user or entity identity as an image with initials fallback.\nexport function Avatar({\n src,\n alt,\n name,\n initials,\n size = 'md',\n shape = 'circle',\n color,\n fcolor,\n backgroundColor,\n clickEffect,\n rippleColor,\n className,\n style,\n onPointerDown,\n ...rest\n}: AvatarProps) {\n const fallbackInitials = getFallbackInitials(name, initials)\n const isInteractive = typeof rest.onClick === 'function' || rest.role === 'button' || rest.tabIndex !== undefined\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLSpanElement>({\n effect: clickEffect ?? (isInteractive ? 'ripple' : 'none'),\n disabled: !isInteractive,\n color: rippleColor,\n })\n const inlineStyle: CSSProperties =\n typeof size === 'number'\n ? {\n width: `${size}px`,\n height: `${size}px`,\n ...style,\n ...(backgroundColor ? {backgroundColor} : {}),\n }\n : {\n ...style,\n ...(backgroundColor ? {backgroundColor} : {}),\n }\n\n return (\n <span\n className={cn(\n 'avatar',\n typeof size === 'string' && size,\n shape,\n isInteractive && 'interactive',\n effectClassName,\n ...getAppearanceClassNames({color, fcolor}),\n className\n )}\n style={inlineStyle}\n aria-label={alt ?? name ?? 'Avatar'}\n onPointerDown={(event) => {\n handlePointerDown(event)\n onPointerDown?.(event)\n }}\n {...rest}\n >\n {effectLayer}\n {src ? (\n <img src={src} alt={alt ?? name ?? ''} className={'image'} />\n ) : (\n <span className={'fallback'}>{fallbackInitials}</span>\n )}\n </span>\n )\n}\n","import {useEffect} from 'react'\nimport type {MouseEvent} from 'react'\nimport type {ModalProps} from './Modal.types'\nimport {Portal} from '../../primitives/Portal'\nimport {Card, CardBody, CardFooter, CardHeader} from '../../cards/Card'\nimport {cn} from '../../../utils/cn'\nimport './Modal.css'\n\n// Render blocking overlay content for dense details and mobile-friendly dialogs.\nexport function Modal({\n open,\n onClose,\n title,\n description,\n footer,\n size = 'md',\n closeOnBackdrop = true,\n closeOnEscape = true,\n className,\n children,\n ...rest\n}: ModalProps) {\n useEffect(() => {\n if (!open || !closeOnEscape) {\n return\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose()\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [closeOnEscape, onClose, open])\n\n useEffect(() => {\n if (!open) {\n return\n }\n\n const previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n\n return () => {\n document.body.style.overflow = previousOverflow\n }\n }, [open])\n\n if (!open) {\n return null\n }\n\n const handleBackdropClick = (event: MouseEvent<HTMLDivElement>) => {\n if (!closeOnBackdrop) {\n return\n }\n\n if (event.target === event.currentTarget) {\n onClose()\n }\n }\n\n return (\n <Portal>\n <div className={'modal-backdrop'} onMouseDown={handleBackdropClick}>\n <div className={'modal-shell'}>\n <Card\n className={cn('modal', size, className)}\n role={'dialog'}\n aria-modal={'true'}\n aria-labelledby={title ? 'mineral-modal-title' : undefined}\n {...rest}\n >\n {(title || description) && (\n <CardHeader>\n {title && (\n <div id={'mineral-modal-title'} className={'modal-title'}>\n {title}\n </div>\n )}\n {description && <div className={'modal-description'}>{description}</div>}\n </CardHeader>\n )}\n <CardBody>{children}</CardBody>\n {footer && <CardFooter>{footer}</CardFooter>}\n </Card>\n </div>\n </div>\n </Portal>\n )\n}\n","import {createElement} from 'react'\nimport type {HeadingProps} from './Heading.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Heading.css'\n\n// Render semantic heading levels with shared MineralUI typography tokens.\nexport function Heading({level = 2, color, fcolor, className, children, ...rest}: HeadingProps) {\n return createElement(\n `h${level}`,\n {className: cn('heading', `h${level}`, ...getAppearanceClassNames({color, fcolor}), className), ...rest},\n children\n )\n}\n","import type {TextProps} from './Text.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './Text.css'\n\n// Render body copy with shared tone, size and weight controls.\nexport function Text({\n as = 'p',\n tone = 'default',\n size,\n align = 'left',\n color,\n fcolor,\n weight = 'normal',\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n children,\n ...rest\n}: TextProps) {\n const Component = as\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <Component\n className={cn(\n 'text',\n !color && !fcolor && tone,\n size,\n align,\n weight,\n ...getAppearanceClassNames({color, fcolor}),\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n fcolor,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={utilityStyle}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type {CodeProps} from './Code.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Code.css'\n\n// Render inline code tokens with semantic color support.\nexport function Code({color, fcolor, className, children, ...rest}: CodeProps) {\n return (\n <code className={cn('code', ...getAppearanceClassNames({color, fcolor}), className)} {...rest}>\n {children}\n </code>\n )\n}\n","import type {HTMLAttributes} from 'react'\nimport type {ListProps} from './List.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './List.css'\n\n// Render ordered or unordered lists with shared typography tokens.\nexport function List({ordered = false, color, fcolor, className, children, ...rest}: ListProps) {\n const Component = ordered ? 'ol' : 'ul'\n\n return (\n <Component\n className={cn('list', ordered && 'ordered', ...getAppearanceClassNames({color, fcolor}), className)}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n\n// Render a list item that inherits the parent list styling.\nexport function ListItem({className, children, ...rest}: HTMLAttributes<HTMLLIElement>) {\n return (\n <li className={cn('item', className)} {...rest}>\n {children}\n </li>\n )\n}\n","import type {SubTextProps} from './SubText.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './SubText.css'\n\n// Render small, muted secondary text for captions, hints and metadata.\nexport function SubText({\n as = 'span',\n size = 'sm',\n fcolor,\n className,\n children,\n ...rest\n}: SubTextProps) {\n const Component = as\n return (\n <Component\n className={cn('subtext', size, ...getAppearanceClassNames({fcolor}), className)}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type {KbdProps} from './Kbd.types'\nimport {cn} from '../../../utils/cn'\nimport './Kbd.css'\n\nexport function Kbd({size = 'md', className, children, ...rest}: KbdProps) {\n return (\n <kbd className={cn('kbd', size, className)} {...rest}>\n {children}\n </kbd>\n )\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\nimport type {ReactNode, RefObject} from 'react'\nimport type {\n CalendarBoardLocale,\n CalendarBoardProps,\n CalendarBoardView,\n CalendarDayCellProps,\n CalendarDetailsMode,\n CalendarEvent,\n CalendarEventItemProps,\n CalendarEventListProps,\n CalendarEventPopoverProps,\n CalendarFilterOption,\n CalendarTimelineProps,\n CalendarTimelineSlotState,\n} from './CalendarBoard.types'\nimport {cn} from '../../../utils/cn'\nimport {Badge} from '../../feedback/Badge'\nimport {Button} from '../../controls/Button'\nimport {Avatar} from '../../media/Avatar'\nimport {Card, CardBody} from '../../cards/Card'\nimport {Modal} from '../../overlays/Modal'\nimport {Popover} from '../../primitives/Popover'\nimport {Heading, Text} from '../../typography'\nimport {Stack} from '../../layout/Stack'\nimport './CalendarBoard.css'\n\ninterface CalendarCopy {\n monthView: string\n weekView: string\n previousMonth: string\n nextMonth: string\n previousWeek: string\n nextWeek: string\n emptyStateText: string\n timelineTitle: string\n timelineEmptyState: string\n allDay: string\n itemsCount: (count: number) => string\n}\n\ninterface CalendarDetailsContentProps {\n date: Date | null\n events: CalendarEvent[]\n locale: CalendarBoardLocale\n timelineStartHour: number\n timelineEndHour: number\n showTimeline: boolean\n emptyStateText: string\n renderEventItem?: (event: CalendarEvent) => ReactNode\n}\n\ninterface CalendarWeekViewProps {\n days: Date[]\n eventsByDay: Map<string, CalendarEvent[]>\n selectedDate: Date | null\n activeDate: Date | null\n onDayInteract: (date: Date, target: HTMLElement, events: CalendarEvent[]) => void\n onDayHover: (date: Date, target: HTMLElement, events: CalendarEvent[]) => void\n onDayLeave: () => void\n dayBadge?: CalendarBoardProps['dayBadge']\n renderDayCell?: CalendarBoardProps['renderDayCell']\n locale: CalendarBoardLocale\n}\n\nfunction stripTime(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\nfunction normalizeDate(value?: Date | string | null) {\n if (!value) {\n return null\n }\n\n if (value instanceof Date) {\n return stripTime(value)\n }\n\n const parsed = new Date(value)\n if (Number.isNaN(parsed.getTime())) {\n return null\n }\n\n return stripTime(parsed)\n}\n\nfunction getDateKey(date: Date) {\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n\n return `${year}-${month}-${day}`\n}\n\nfunction getEventDate(event: CalendarEvent) {\n return normalizeDate(event.date)\n}\n\nfunction addDays(date: Date, amount: number) {\n const nextDate = new Date(date)\n nextDate.setDate(nextDate.getDate() + amount)\n return stripTime(nextDate)\n}\n\nfunction startOfWeek(date: Date, weekStartsOn: 0 | 1) {\n const safeDate = stripTime(date)\n const day = safeDate.getDay()\n const delta = (day - weekStartsOn + 7) % 7\n return addDays(safeDate, -delta)\n}\n\nfunction sortEventsByTime(events: CalendarEvent[]) {\n return [...events].sort((leftEvent, rightEvent) => {\n const leftTime = leftEvent.startTime ?? '99:99'\n const rightTime = rightEvent.startTime ?? '99:99'\n return leftTime.localeCompare(rightTime)\n })\n}\n\nfunction buildMonthGrid(month: Date, weekStartsOn: 0 | 1) {\n const monthStart = new Date(month.getFullYear(), month.getMonth(), 1)\n const gridStart = startOfWeek(monthStart, weekStartsOn)\n\n return Array.from({length: 42}, (_, index) => addDays(gridStart, index))\n}\n\nfunction getStatusColor(status?: CalendarEvent['status']) {\n switch (status) {\n case 'active':\n return 'rgba(14, 165, 233, 1)'\n case 'done':\n return 'rgba(34, 197, 94, 1)'\n case 'cancelled':\n return 'rgba(239, 68, 68, 1)'\n default:\n return 'rgba(245, 158, 11, 1)'\n }\n}\n\nfunction getCalendarCopy(locale: CalendarBoardLocale): CalendarCopy {\n if (locale === 'pl') {\n return {\n monthView: 'Miesiac',\n weekView: 'Tydzien',\n previousMonth: 'Poprzedni miesiac',\n nextMonth: 'Nastepny miesiac',\n previousWeek: 'Poprzedni tydzien',\n nextWeek: 'Nastepny tydzien',\n emptyStateText: 'Brak zdarzen dla wybranego dnia.',\n timelineTitle: 'Os czasu dnia',\n timelineEmptyState: 'Brak zdarzen w tej godzinie.',\n allDay: 'Caly dzien',\n itemsCount: (count) => `${count} zdarzen`,\n }\n }\n\n return {\n monthView: 'Month',\n weekView: 'Week',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n previousWeek: 'Previous week',\n nextWeek: 'Next week',\n emptyStateText: 'No events for the selected day.',\n timelineTitle: 'Daily timeline',\n timelineEmptyState: 'No events in this hour.',\n allDay: 'All day',\n itemsCount: (count) => `${count} events`,\n }\n}\n\nfunction formatBoardDate(date: Date, locale: CalendarBoardLocale) {\n return new Intl.DateTimeFormat(locale === 'pl' ? 'pl-PL' : 'en-US', {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(date)\n}\n\nfunction formatWeekRange(startDate: Date, locale: CalendarBoardLocale) {\n const endDate = addDays(startDate, 6)\n const formatter = new Intl.DateTimeFormat(locale === 'pl' ? 'pl-PL' : 'en-US', {\n day: 'numeric',\n month: 'short',\n })\n\n return `${formatter.format(startDate)} - ${formatter.format(endDate)}`\n}\n\nfunction formatEventTime(event: CalendarEvent, copy: CalendarCopy) {\n if (event.startTime && event.endTime) {\n return `${event.startTime} - ${event.endTime}`\n }\n\n if (event.startTime) {\n return event.startTime\n }\n\n return copy.allDay\n}\n\nfunction getTimelineSlotState(date: Date, hour: number): CalendarTimelineSlotState {\n const now = new Date()\n const slotStart = new Date(date)\n slotStart.setHours(hour, 0, 0, 0)\n const slotEnd = new Date(slotStart)\n slotEnd.setHours(hour + 1, 0, 0, 0)\n\n if (slotEnd <= now) {\n return 'past'\n }\n\n if (slotStart <= now && slotEnd > now) {\n return 'active'\n }\n\n return 'upcoming'\n}\n\nfunction buildDayMarkers(events: CalendarEvent[]) {\n return sortEventsByTime(events)\n .slice(0, 4)\n .map((event) => (\n <span\n key={event.id}\n className={'marker'}\n style={{background: event.color ?? getStatusColor(event.status)}}\n aria-hidden={'true'}\n />\n ))\n}\n\nfunction applyCalendarFilters(events: CalendarEvent[], filters: CalendarFilterOption[], activeFilterIds: string[]) {\n if (!filters.length || !activeFilterIds.length) {\n return events\n }\n\n const activeFilters = filters.filter((filterOption) => activeFilterIds.includes(filterOption.id))\n if (!activeFilters.length) {\n return events\n }\n\n return events.filter((event) => activeFilters.some((filterOption) => filterOption.predicate(event)))\n}\n\nfunction getViewTitle(month: Date, view: CalendarBoardView, locale: CalendarBoardLocale, weekStartsOn: 0 | 1) {\n if (view === 'week') {\n return formatWeekRange(startOfWeek(month, weekStartsOn), locale)\n }\n\n return new Intl.DateTimeFormat(locale === 'pl' ? 'pl-PL' : 'en-US', {\n month: 'long',\n year: 'numeric',\n }).format(month)\n}\n\nfunction getViewSubtitle(view: CalendarBoardView, copy: CalendarCopy) {\n return view === 'week' ? copy.weekView : copy.monthView\n}\n\nfunction CalendarDetailsContent({\n date,\n events,\n locale,\n timelineStartHour,\n timelineEndHour,\n showTimeline,\n emptyStateText,\n renderEventItem,\n}: CalendarDetailsContentProps) {\n if (!date) {\n return null\n }\n\n return (\n <Stack gap={'md'}>\n <Stack gap={'xs'}>\n <Heading level={4}>{formatBoardDate(date, locale)}</Heading>\n <Text tone={'muted'} size={'sm'}>\n {events.length > 0 ? `${events.length} items` : emptyStateText}\n </Text>\n </Stack>\n <CalendarEventList\n events={events}\n locale={locale}\n currentDate={date}\n emptyStateText={emptyStateText}\n renderEventItem={renderEventItem}\n />\n {showTimeline && (\n <CalendarTimeline\n date={date}\n events={events}\n locale={locale}\n startHour={timelineStartHour}\n endHour={timelineEndHour}\n />\n )}\n </Stack>\n )\n}\n\nfunction CalendarFilters({\n filters,\n activeFilterIds,\n onToggle,\n}: {\n filters: CalendarFilterOption[]\n activeFilterIds: string[]\n onToggle: (filterId: string) => void\n}) {\n if (!filters.length) {\n return null\n }\n\n return (\n <div className={'calendar-board-filters'}>\n {filters.map((filterOption) => {\n const isActive = activeFilterIds.includes(filterOption.id)\n\n return (\n <Button\n key={filterOption.id}\n type={'button'}\n size={'sm'}\n variant={isActive ? 'primary' : 'outlined'}\n color={isActive ? 'primary' : 'neutral'}\n className={'calendar-board-filter-btn'}\n onClick={() => onToggle(filterOption.id)}\n >\n {filterOption.label}\n </Button>\n )\n })}\n </div>\n )\n}\nfunction CalendarWeekView({\n days,\n eventsByDay,\n selectedDate,\n activeDate,\n onDayInteract,\n onDayHover,\n onDayLeave,\n dayBadge,\n renderDayCell,\n locale,\n}: CalendarWeekViewProps) {\n const todayKey = getDateKey(stripTime(new Date()))\n\n return (\n <div className={'calendar-board-week'}>\n {days.map((day) => {\n const dayKey = getDateKey(day)\n const dayEvents = eventsByDay.get(dayKey) ?? []\n const badge =\n dayBadge?.(day, dayEvents) ??\n (dayEvents.length > 0 ? <Badge size={'sm'}>{dayEvents.length}</Badge> : null)\n const markers = buildDayMarkers(dayEvents)\n const isSelected = Boolean(selectedDate && getDateKey(selectedDate) === dayKey)\n const context = {\n date: day,\n events: dayEvents,\n badge,\n isToday: dayKey === todayKey,\n isSelected,\n isOutsideMonth: false,\n }\n\n return (\n <div key={dayKey} className={'calendar-board-week-col'}>\n <CalendarDayCell\n date={day}\n events={dayEvents}\n badge={badge}\n markers={markers}\n isToday={context.isToday}\n isSelected={isSelected || Boolean(activeDate && getDateKey(activeDate) === dayKey)}\n isOutsideMonth={false}\n onClick={(event) => onDayInteract(day, event.currentTarget, dayEvents)}\n onMouseEnter={(event) => onDayHover(day, event.currentTarget, dayEvents)}\n onMouseLeave={onDayLeave}\n >\n {renderDayCell ? renderDayCell(day, context) : undefined}\n </CalendarDayCell>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport function CalendarDayCell({\n date,\n events = [],\n badge,\n markers,\n isToday = false,\n isSelected = false,\n isOutsideMonth = false,\n className,\n children,\n ...rest\n}: CalendarDayCellProps) {\n return (\n <button\n type={'button'}\n className={cn(\n 'calendar-day-cell',\n isToday && 'today',\n isSelected && 'selected',\n isOutsideMonth && 'outside-month',\n className\n )}\n {...rest}\n >\n {children ?? (\n <>\n <div className={'day-header'}>\n <span className={'day-number'}>{date.getDate()}</span>\n <div className={'day-meta'}>{badge}</div>\n </div>\n <div className={'markers'}>{markers ?? buildDayMarkers(events)}</div>\n </>\n )}\n </button>\n )\n}\n\nexport function CalendarEventItem({event, locale = 'en', className, currentDate, ...rest}: CalendarEventItemProps) {\n const copy = getCalendarCopy(locale)\n const statusColor =\n event.status === 'cancelled'\n ? 'error'\n : event.status === 'done'\n ? 'success'\n : event.status === 'active'\n ? 'info'\n : 'warning'\n\n return (\n <div className={cn('calendar-event-item', className)} {...rest}>\n <div className={'event-time'}>{formatEventTime(event, copy)}</div>\n <div className={'event-content'}>\n <div className={'event-title-row'}>\n <Heading level={5}>{event.title}</Heading>\n {event.status && (\n <Badge color={statusColor} size={'sm'}>\n {event.status}\n </Badge>\n )}\n </div>\n {event.description && (\n <Text size={'sm'} tone={'muted'}>\n {event.description}\n </Text>\n )}\n <div className={'event-details'}>\n {event.type && (\n <Badge color={'neutral'} size={'sm'}>\n {event.type}\n </Badge>\n )}\n {event.badgeLabel && <Badge size={'sm'}>{event.badgeLabel}</Badge>}\n {event.user && (\n <span className={'event-user'}>\n <Avatar\n size={'sm'}\n src={event.user.avatar}\n name={event.user.name}\n backgroundColor={event.user.color}\n />\n {event.user.name}\n </span>\n )}\n {!event.startTime && !event.endTime && currentDate && (\n <Text size={'sm'} tone={'muted'}>\n {formatBoardDate(currentDate, locale)}\n </Text>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport function CalendarEventList({\n events,\n locale = 'en',\n currentDate,\n emptyStateText,\n renderEventItem,\n className,\n ...rest\n}: CalendarEventListProps) {\n const copy = getCalendarCopy(locale)\n\n if (!events.length) {\n return (\n <Text size={'sm'} tone={'muted'} className={cn('calendar-event-list', className)} {...rest}>\n {emptyStateText ?? copy.emptyStateText}\n </Text>\n )\n }\n\n return (\n <div className={cn('calendar-event-list', className)} {...rest}>\n <Stack gap={'sm'}>\n {sortEventsByTime(events).map((event) =>\n renderEventItem ? (\n <div key={event.id}>{renderEventItem(event)}</div>\n ) : (\n <CalendarEventItem key={event.id} event={event} locale={locale} currentDate={currentDate} />\n )\n )}\n </Stack>\n </div>\n )\n}\nexport function CalendarTimeline({\n date,\n events,\n locale = 'en',\n startHour = 6,\n endHour = 22,\n emptyStateText,\n className,\n ...rest\n}: CalendarTimelineProps) {\n const copy = getCalendarCopy(locale)\n const hours = Array.from({length: Math.max(endHour - startHour + 1, 1)}, (_, index) => startHour + index)\n\n return (\n <div className={cn('calendar-timeline', className)} {...rest}>\n <Stack gap={'sm'}>\n <Heading level={5}>{copy.timelineTitle}</Heading>\n <div className={'timeline-slots'}>\n {hours.map((hour) => {\n const matchingEvents = events.filter((event) => {\n if (!event.startTime) {\n return false\n }\n\n return Number(event.startTime.split(':')[0]) === hour\n })\n const slotState = getTimelineSlotState(date, hour)\n\n return (\n <div key={hour} className={cn('timeline-slot', slotState)}>\n <div className={'slot-time'}>{`${String(hour).padStart(2, '0')}:00`}</div>\n <div className={'slot-line'} />\n <div className={'slot-content'}>\n {matchingEvents.length > 0 ? (\n <Stack gap={'xs'}>\n {matchingEvents.map((event) => (\n <div key={event.id} className={'slot-event'}>\n <span\n className={'slot-event-dot'}\n style={{\n background: event.color ?? getStatusColor(event.status),\n }}\n />\n <Text size={'sm'}>{event.title}</Text>\n </div>\n ))}\n </Stack>\n ) : (\n <Text size={'sm'} tone={'muted'}>\n {emptyStateText ?? copy.timelineEmptyState}\n </Text>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </Stack>\n </div>\n )\n}\n\nexport function CalendarEventPopover({\n open,\n anchorRef,\n onClose,\n onPointerEnter,\n onPointerLeave,\n date,\n events,\n locale = 'en',\n timelineStartHour = 6,\n timelineEndHour = 22,\n showTimeline = true,\n emptyStateText,\n renderEventItem,\n className,\n style,\n}: CalendarEventPopoverProps) {\n return (\n <Popover\n open={open}\n anchorRef={anchorRef}\n onClose={onClose}\n placement={'bottom-start'}\n className={cn('calendar-board-popover', className)}\n style={style}\n >\n <Card className={'calendar-event-popover'} onPointerEnter={onPointerEnter} onPointerLeave={onPointerLeave}>\n <CardBody>\n <CalendarDetailsContent\n date={date}\n events={events}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? getCalendarCopy(locale).emptyStateText}\n renderEventItem={renderEventItem}\n />\n </CardBody>\n </Card>\n </Popover>\n )\n}\n\nexport function CalendarBoard({\n month,\n defaultMonth,\n onMonthChange,\n events = [],\n locale = 'en',\n weekStartsOn = 1,\n view,\n defaultView = 'month',\n views = ['month', 'week'],\n onViewChange,\n selectedDate,\n defaultSelectedDate,\n onDayClick,\n dayBadge,\n renderDayCell,\n renderEventItem,\n detailsTrigger = 'click',\n detailsMode = 'auto',\n showTimeline = true,\n timelineStartHour = 6,\n timelineEndHour = 22,\n emptyStateText,\n filters = [],\n activeFilters,\n defaultActiveFilters = [],\n onActiveFiltersChange,\n fullWidth = false,\n className,\n ...rest\n}: CalendarBoardProps) {\n const copy = getCalendarCopy(locale)\n const today = stripTime(new Date())\n const [internalMonth, setInternalMonth] = useState(stripTime(defaultMonth ?? month ?? today))\n const [internalView, setInternalView] = useState<CalendarBoardView>(defaultView)\n const [internalSelectedDate, setInternalSelectedDate] = useState<Date | null>(normalizeDate(defaultSelectedDate))\n const [internalActiveFilters, setInternalActiveFilters] = useState<string[]>(defaultActiveFilters)\n const [activeDate, setActiveDate] = useState<Date | null>(null)\n const [detailsOpen, setDetailsOpen] = useState(false)\n const [isCompact, setIsCompact] = useState(false)\n const activeAnchorRef = useRef<HTMLElement | null>(null)\n const closeTimeoutRef = useRef<number | null>(null)\n\n const isMonthControlled = month !== undefined && typeof onMonthChange === 'function'\n const visibleMonth = stripTime(isMonthControlled ? (month ?? internalMonth) : internalMonth)\n const currentView = view ?? internalView\n const resolvedSelectedDate = normalizeDate(selectedDate) ?? internalSelectedDate\n const resolvedActiveFilters = activeFilters ?? internalActiveFilters\n\n useEffect(() => {\n const mediaQuery = window.matchMedia('(max-width: 768px)')\n const updateCompactState = () => setIsCompact(mediaQuery.matches)\n\n updateCompactState()\n mediaQuery.addEventListener('change', updateCompactState)\n\n return () => mediaQuery.removeEventListener('change', updateCompactState)\n }, [])\n\n useEffect(() => {\n if (isMonthControlled && month) {\n setInternalMonth(stripTime(month))\n }\n }, [isMonthControlled, month])\n\n useEffect(() => {\n if (view) {\n setInternalView(view)\n }\n }, [view])\n\n useEffect(() => {\n if (selectedDate !== undefined) {\n setInternalSelectedDate(normalizeDate(selectedDate))\n }\n }, [selectedDate])\n\n useEffect(\n () => () => {\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current)\n }\n },\n []\n )\n\n const filteredEvents = useMemo(\n () => applyCalendarFilters(events, filters, resolvedActiveFilters),\n [events, filters, resolvedActiveFilters]\n )\n\n const eventsByDay = useMemo(() => {\n const nextMap = new Map<string, CalendarEvent[]>()\n\n filteredEvents.forEach((event) => {\n const eventDate = getEventDate(event)\n if (!eventDate) {\n return\n }\n\n const key = getDateKey(eventDate)\n const currentEvents = nextMap.get(key) ?? []\n currentEvents.push(event)\n nextMap.set(key, currentEvents)\n })\n\n return nextMap\n }, [filteredEvents])\n const calendarDays = useMemo(() => {\n if (currentView === 'week') {\n const baseDate = resolvedSelectedDate ?? visibleMonth\n const weekStart = startOfWeek(baseDate, weekStartsOn)\n return Array.from({length: 7}, (_, index) => addDays(weekStart, index))\n }\n\n return buildMonthGrid(visibleMonth, weekStartsOn)\n }, [currentView, resolvedSelectedDate, visibleMonth, weekStartsOn])\n\n const effectiveDetailsMode: CalendarDetailsMode =\n detailsMode === 'auto' ? (isCompact ? 'modal' : 'popover') : detailsMode\n const activeEvents = activeDate ? (eventsByDay.get(getDateKey(activeDate)) ?? []) : []\n const canShowMonthView = views.includes('month')\n const canShowWeekView = views.includes('week')\n\n const setMonthAndNotify = (nextMonth: Date) => {\n const normalizedMonth = stripTime(nextMonth)\n setInternalMonth(normalizedMonth)\n onMonthChange?.(normalizedMonth)\n }\n\n const navigateBy = (amount: number) => {\n if (currentView === 'week') {\n const nextAnchor = addDays(resolvedSelectedDate ?? visibleMonth, amount * 7)\n setMonthAndNotify(nextAnchor)\n setInternalSelectedDate(nextAnchor)\n setActiveDate(nextAnchor)\n setDetailsOpen(false)\n return\n }\n\n const nextMonth = new Date(visibleMonth.getFullYear(), visibleMonth.getMonth() + amount, 1)\n setMonthAndNotify(nextMonth)\n setDetailsOpen(false)\n setActiveDate(null)\n }\n\n const setViewAndNotify = (nextView: CalendarBoardView) => {\n setInternalView(nextView)\n onViewChange?.(nextView)\n }\n\n const setSelectedDateAndNotify = (nextDate: Date, dayEvents: CalendarEvent[]) => {\n const normalizedDate = stripTime(nextDate)\n setInternalSelectedDate(normalizedDate)\n onDayClick?.(normalizedDate, dayEvents)\n }\n\n const clearCloseTimeout = () => {\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current)\n closeTimeoutRef.current = null\n }\n }\n\n const scheduleClose = () => {\n clearCloseTimeout()\n closeTimeoutRef.current = window.setTimeout(() => {\n setDetailsOpen(false)\n }, 180)\n }\n\n const openDetails = (date: Date, target: HTMLElement, dayEvents: CalendarEvent[]) => {\n activeAnchorRef.current = target\n setActiveDate(date)\n setSelectedDateAndNotify(date, dayEvents)\n setDetailsOpen(true)\n }\n\n const handleDayInteract = (date: Date, target: HTMLElement, dayEvents: CalendarEvent[]) => {\n clearCloseTimeout()\n openDetails(date, target, dayEvents)\n\n if (currentView === 'month' && date.getMonth() !== visibleMonth.getMonth()) {\n setMonthAndNotify(new Date(date.getFullYear(), date.getMonth(), 1))\n }\n }\n\n const handleDayHover = (date: Date, target: HTMLElement, dayEvents: CalendarEvent[]) => {\n if (detailsTrigger !== 'hover' || effectiveDetailsMode !== 'popover') {\n return\n }\n\n clearCloseTimeout()\n openDetails(date, target, dayEvents)\n }\n\n const handleFilterToggle = (filterId: string) => {\n const nextFilters = resolvedActiveFilters.includes(filterId)\n ? resolvedActiveFilters.filter((id) => id !== filterId)\n : [...resolvedActiveFilters, filterId]\n\n setInternalActiveFilters(nextFilters)\n onActiveFiltersChange?.(nextFilters)\n }\n\n const dayNameBase = startOfWeek(\n currentView === 'week' ? (resolvedSelectedDate ?? visibleMonth) : visibleMonth,\n weekStartsOn\n )\n\n return (\n <div className={cn('calendar-board', fullWidth && 'full-width', className)} {...rest}>\n <div className={'calendar-board-header'}>\n <Stack gap={'xs'}>\n <Heading level={3}>{getViewTitle(visibleMonth, currentView, locale, weekStartsOn)}</Heading>\n <Text size={'sm'} tone={'muted'}>\n {getViewSubtitle(currentView, copy)}\n </Text>\n </Stack>\n <Stack gap={'sm'} align={'end'}>\n <div className={'calendar-board-actions'}>\n <Button\n type={'button'}\n size={'sm'}\n variant={'outlined'}\n color={'neutral'}\n onClick={() => navigateBy(-1)}\n >\n {currentView === 'week' ? copy.previousWeek : copy.previousMonth}\n </Button>\n <Button\n type={'button'}\n size={'sm'}\n variant={'outlined'}\n color={'neutral'}\n onClick={() => navigateBy(1)}\n >\n {currentView === 'week' ? copy.nextWeek : copy.nextMonth}\n </Button>\n </div>\n {(canShowMonthView || canShowWeekView) && (\n <div className={'calendar-board-views'}>\n {canShowMonthView && (\n <Button\n type={'button'}\n size={'sm'}\n variant={currentView === 'month' ? 'primary' : 'outlined'}\n color={currentView === 'month' ? 'primary' : 'neutral'}\n onClick={() => setViewAndNotify('month')}\n >\n {copy.monthView}\n </Button>\n )}\n {canShowWeekView && (\n <Button\n type={'button'}\n size={'sm'}\n variant={currentView === 'week' ? 'primary' : 'outlined'}\n color={currentView === 'week' ? 'primary' : 'neutral'}\n onClick={() => setViewAndNotify('week')}\n >\n {copy.weekView}\n </Button>\n )}\n </div>\n )}\n </Stack>\n </div>\n\n <CalendarFilters filters={filters} activeFilterIds={resolvedActiveFilters} onToggle={handleFilterToggle} />\n\n <div className={'calendar-board-days'}>\n {Array.from({length: 7}, (_, index) => addDays(dayNameBase, index)).map((day) => (\n <div key={getDateKey(day)} className={'calendar-board-day'}>\n {new Intl.DateTimeFormat(locale === 'pl' ? 'pl-PL' : 'en-US', {weekday: 'short'}).format(day)}\n </div>\n ))}\n </div>\n\n {currentView === 'week' ? (\n <CalendarWeekView\n days={calendarDays}\n eventsByDay={eventsByDay}\n selectedDate={resolvedSelectedDate}\n activeDate={activeDate}\n onDayInteract={handleDayInteract}\n onDayHover={handleDayHover}\n onDayLeave={() => {\n if (detailsTrigger === 'hover' && effectiveDetailsMode === 'popover') {\n scheduleClose()\n }\n }}\n dayBadge={dayBadge}\n renderDayCell={renderDayCell}\n locale={locale}\n />\n ) : (\n <div className={'calendar-board-grid'}>\n {calendarDays.map((day) => {\n const dayKey = getDateKey(day)\n const dayEvents = eventsByDay.get(dayKey) ?? []\n const badge =\n dayBadge?.(day, dayEvents) ??\n (dayEvents.length > 0 ? <Badge size={'sm'}>{dayEvents.length}</Badge> : null)\n const isToday = dayKey === getDateKey(today)\n const isSelected = Boolean(resolvedSelectedDate && dayKey === getDateKey(resolvedSelectedDate))\n const isOutsideMonth = day.getMonth() !== visibleMonth.getMonth()\n const markers = buildDayMarkers(dayEvents)\n const context = {\n date: day,\n events: dayEvents,\n badge,\n isToday,\n isSelected,\n isOutsideMonth,\n }\n\n return (\n <CalendarDayCell\n key={dayKey}\n date={day}\n events={dayEvents}\n badge={badge}\n markers={markers}\n isToday={isToday}\n isSelected={isSelected || Boolean(activeDate && dayKey === getDateKey(activeDate))}\n isOutsideMonth={isOutsideMonth}\n onClick={(event) => handleDayInteract(day, event.currentTarget, dayEvents)}\n onMouseEnter={(event) => handleDayHover(day, event.currentTarget, dayEvents)}\n onMouseLeave={() => {\n if (detailsTrigger === 'hover' && effectiveDetailsMode === 'popover') {\n scheduleClose()\n }\n }}\n >\n {renderDayCell ? renderDayCell(day, context) : undefined}\n </CalendarDayCell>\n )\n })}\n </div>\n )}\n\n {effectiveDetailsMode === 'popover' ? (\n <CalendarEventPopover\n open={detailsOpen && Boolean(activeDate) && Boolean(activeAnchorRef.current)}\n anchorRef={activeAnchorRef as RefObject<HTMLElement | null>}\n onClose={() => setDetailsOpen(false)}\n onPointerEnter={() => clearCloseTimeout()}\n onPointerLeave={() => scheduleClose()}\n date={activeDate}\n events={activeEvents}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? copy.emptyStateText}\n renderEventItem={renderEventItem}\n />\n ) : (\n <Modal\n open={detailsOpen && Boolean(activeDate)}\n onClose={() => setDetailsOpen(false)}\n title={activeDate ? formatBoardDate(activeDate, locale) : undefined}\n description={activeDate ? copy.itemsCount(activeEvents.length) : undefined}\n size={'lg'}\n >\n <CalendarDetailsContent\n date={activeDate}\n events={activeEvents}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? copy.emptyStateText}\n renderEventItem={renderEventItem}\n />\n </Modal>\n )}\n </div>\n )\n}\n","import type {AlertProps} from './Alert.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Alert.css'\n\n// Render inline status messaging with optional heading content.\nexport function Alert({color = 'info', fcolor, title, className, children, ...rest}: AlertProps) {\n return (\n <div className={cn('alert', color, ...getAppearanceClassNames({fcolor}), className)} role=\"status\" {...rest}>\n {title && <div className=\"title\">{title}</div>}\n {children && <div className=\"content\">{children}</div>}\n </div>\n )\n}\n","import {useState} from 'react'\nimport type {BannerProps} from './Banner.types'\nimport {cn} from '../../../utils/cn'\nimport './Banner.css'\n\n// Render a prominent banner for announcements, CTAs or dismissible messages.\nexport function Banner({\n color = 'primary',\n variant = 'filled',\n icon,\n action,\n dismissible = false,\n onDismiss,\n className,\n children,\n ...rest\n}: BannerProps) {\n const [visible, setVisible] = useState(true)\n\n if (!visible) return null\n\n const handleDismiss = () => {\n setVisible(false)\n onDismiss?.()\n }\n\n return (\n <div\n className={cn('banner', color, variant, className)}\n role=\"banner\"\n {...rest}\n >\n {icon && <span className=\"banner-icon\">{icon}</span>}\n <div className=\"banner-content\">{children}</div>\n {action && <div className=\"banner-action\">{action}</div>}\n {dismissible && (\n <button\n className=\"banner-dismiss\"\n onClick={handleDismiss}\n aria-label=\"Dismiss\"\n type=\"button\"\n >\n ✕\n </button>\n )}\n </div>\n )\n}\n","import type {TagProps} from './Tag.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport './Tag.css'\n\nexport function Tag({\n label,\n color = 'primary',\n variant = 'solid',\n closable = false,\n onClose,\n icon,\n fcolor,\n className,\n ...rest\n}: TagProps) {\n return (\n <span\n className={cn('m-tag', color, variant, ...getAppearanceClassNames({fcolor}), className)}\n {...rest}\n >\n {icon && <span className=\"m-tag-icon\">{icon}</span>}\n <span className=\"m-tag-label\">{label}</span>\n {closable && (\n <button\n type=\"button\"\n className=\"m-tag-close\"\n onClick={(e) => {\n e.stopPropagation()\n onClose?.()\n }}\n aria-label=\"Remove\"\n >\n ×\n </button>\n )}\n </span>\n )\n}\n","import type {CSSProperties} from 'react'\nimport type {SpinnerProps} from './Spinner.types'\nimport {cn} from '../../../utils/cn'\nimport './Spinner.css'\n\n// Render a minimal semantic loading indicator with token-aware sizing and color.\nexport function Spinner({color = 'primary', size = 'md', label = 'Loading', className, style, ...rest}: SpinnerProps) {\n const inlineStyle: CSSProperties =\n typeof size === 'number'\n ? {\n width: `${size}px`,\n height: `${size}px`,\n ...style,\n }\n : style || {}\n\n return (\n <span\n className={cn('spinner', typeof size === 'string' && size, color && `color-${color}`, className)}\n style={inlineStyle}\n role=\"status\"\n aria-label={label}\n {...rest}\n />\n )\n}\n","import type {CSSProperties} from 'react'\nimport {Spinner} from '../Spinner'\nimport {Stack} from '../../layout/Stack'\nimport {Text} from '../../typography/Text'\nimport {cn} from '../../../utils/cn'\nimport type {LoaderProps} from './Loader.types'\nimport './Loader.css'\n\n// Keep loading feedback minimal so apps can reuse it without card or alert chrome.\nexport function Loader({\n color = 'primary',\n size = 'lg',\n label = 'Loading',\n center = true,\n minHeight = '40vh',\n className,\n style,\n ...rest\n}: LoaderProps) {\n const inlineStyle: CSSProperties = {\n minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight,\n ...style,\n }\n\n return (\n <div className={cn('loader', center && 'center', className)} style={inlineStyle} {...rest}>\n <Stack gap={'sm'} align={'center'}>\n <Spinner size={size} color={color} label={label} />\n <Text tone={'muted'} align={'center'}>\n {label}\n </Text>\n </Stack>\n </div>\n )\n}\n","import {createContext, useContext} from 'react'\nimport type {ToastContext as ToastContextType} from './Toast.types'\n\nconst ToastCtx = createContext<ToastContextType | null>(null)\n\nexport const ToastContextProvider = ToastCtx.Provider\n\nexport function useToast(): ToastContextType {\n const ctx = useContext(ToastCtx)\n if (!ctx) throw new Error('useToast must be used inside ToastProvider')\n return ctx\n}\n","import {useEffect, useState} from 'react'\nimport type {ReactNode} from 'react'\nimport type {ToastEntry} from './Toast.types'\nimport {cn} from '../../../utils/cn'\n\nconst icons: Record<string, ReactNode> = {\n success: (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" />\n <path d=\"M7 10l2 2 4-4\" />\n </svg>\n ),\n warning: (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 3L1.5 17h17L10 3z\" />\n <path d=\"M10 8v4\" />\n <circle cx=\"10\" cy=\"14.5\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n error: (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" />\n <path d=\"M7 7l6 6M13 7l-6 6\" />\n </svg>\n ),\n danger: (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" />\n <path d=\"M7 7l6 6M13 7l-6 6\" />\n </svg>\n ),\n info: (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" />\n <path d=\"M10 9v4\" />\n <circle cx=\"10\" cy=\"6.5\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n primary: (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" />\n <path d=\"M10 9v4\" />\n <circle cx=\"10\" cy=\"6.5\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n neutral: (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" />\n <path d=\"M7 10h6\" />\n </svg>\n ),\n}\n\n// Single toast notification with enter/exit animation.\nexport function ToastItem({entry, onDismiss}: {entry: ToastEntry; onDismiss: (id: string) => void}) {\n const [exiting, setExiting] = useState(false)\n const duration = entry.duration ?? 4000\n\n useEffect(() => {\n if (duration <= 0) return\n const timer = setTimeout(() => setExiting(true), duration)\n return () => clearTimeout(timer)\n }, [duration])\n\n function handleEnd() {\n if (exiting) onDismiss(entry.id)\n }\n\n const color = entry.color || 'info'\n const icon = icons[color]\n\n return (\n <div\n className={cn('toast-item', color, exiting && 'exit')}\n role=\"status\"\n onAnimationEnd={handleEnd}\n >\n <div className=\"toast-body\">\n {icon && <span className=\"toast-icon\">{icon}</span>}\n <div className=\"toast-content\">\n {entry.title && <div className=\"toast-title\">{entry.title}</div>}\n <div className=\"toast-message\">{entry.message}</div>\n </div>\n </div>\n <button className=\"toast-close\" onClick={() => setExiting(true)} aria-label=\"Close\">×</button>\n </div>\n )\n}\n","import {useCallback, useMemo, useRef, useState} from 'react'\nimport {Portal} from '../../primitives/Portal'\nimport {ToastContextProvider, useToast} from './ToastContext'\nimport {ToastItem} from './ToastItem'\nimport type {ToastEntry, ToastOptions, ToastProviderProps} from './Toast.types'\nimport {cn} from '../../../utils/cn'\nimport './Toast.css'\n\nlet counter = 0\n\n// Global toast container with auto-dismiss and stacking.\nexport function ToastProvider({position = 'top-right', duration = 4000, children}: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastEntry[]>([])\n const defaultDuration = useRef(duration)\n defaultDuration.current = duration\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id))\n }, [])\n\n const toast = useCallback((options: ToastOptions) => {\n const id = `toast-${++counter}`\n const entry: ToastEntry = {\n id,\n ...options,\n duration: options.duration ?? defaultDuration.current,\n }\n setToasts((prev) => [...prev, entry])\n return id\n }, [])\n\n const ctx = useMemo(() => ({toast, dismiss}), [toast, dismiss])\n\n return (\n <ToastContextProvider value={ctx}>\n {children}\n <Portal>\n <div className={cn('toast-container', position)}>\n {toasts.map((entry) => (\n <ToastItem key={entry.id} entry={entry} onDismiss={dismiss} />\n ))}\n </div>\n </Portal>\n </ToastContextProvider>\n )\n}\n\nexport {useToast}\n","import {useEffect} from 'react'\nimport type {MouseEvent} from 'react'\nimport type {DrawerProps} from './Drawer.types'\nimport {Portal} from '../../primitives/Portal'\nimport {cn} from '../../../utils/cn'\nimport './Drawer.css'\n\nexport function Drawer({\n open,\n onClose,\n side = 'right',\n size = 'md',\n title,\n overlay = true,\n closeOnBackdrop = true,\n closeOnEscape = true,\n className,\n children,\n ...rest\n}: DrawerProps) {\n useEffect(() => {\n if (!open || !closeOnEscape) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, closeOnEscape, onClose])\n\n useEffect(() => {\n if (!open) return\n\n const prev = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = prev\n }\n }, [open])\n\n if (!open) return null\n\n const handleBackdropClick = (e: MouseEvent<HTMLDivElement>) => {\n if (closeOnBackdrop && e.target === e.currentTarget) onClose()\n }\n\n return (\n <Portal>\n <div\n className={cn('drawer-backdrop', overlay && 'overlay')}\n onMouseDown={handleBackdropClick}\n >\n <div\n className={cn('drawer', side, size, className)}\n role=\"dialog\"\n aria-modal=\"true\"\n {...rest}\n >\n {title && (\n <div className=\"header\">\n <div className=\"title\">{title}</div>\n <button type=\"button\" className=\"close\" onClick={onClose} aria-label=\"Close\">\n ×\n </button>\n </div>\n )}\n <div className=\"body\">{children}</div>\n </div>\n </div>\n </Portal>\n )\n}\n","import {useRef, useState, useCallback, useLayoutEffect} from 'react'\nimport type {TooltipProps} from './Tooltip.types'\nimport {cn} from '../../../utils/cn'\nimport {Portal} from '../../primitives/Portal'\nimport './Tooltip.css'\n\nfunction computePosition(\n trigger: DOMRect,\n bubble: DOMRect,\n placement: string\n): {top: number; left: number} {\n const gap = 6\n switch (placement) {\n case 'bottom':\n return {top: trigger.bottom + gap, left: trigger.left + trigger.width / 2 - bubble.width / 2}\n case 'left':\n return {top: trigger.top + trigger.height / 2 - bubble.height / 2, left: trigger.left - bubble.width - gap}\n case 'right':\n return {top: trigger.top + trigger.height / 2 - bubble.height / 2, left: trigger.right + gap}\n default:\n return {top: trigger.top - bubble.height - gap, left: trigger.left + trigger.width / 2 - bubble.width / 2}\n }\n}\n\nexport function Tooltip({\n content,\n placement = 'top',\n delay = 0,\n className,\n children,\n ...rest\n}: TooltipProps) {\n const [visible, setVisible] = useState(false)\n const [pos, setPos] = useState<{top: number; left: number} | null>(null)\n const wrapperRef = useRef<HTMLDivElement>(null)\n const bubbleRef = useRef<HTMLDivElement>(null)\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n const show = useCallback(() => {\n if (delay > 0) {\n timeoutRef.current = setTimeout(() => setVisible(true), delay)\n } else {\n setVisible(true)\n }\n }, [delay])\n\n const hide = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n setVisible(false)\n setPos(null)\n }, [])\n\n useLayoutEffect(() => {\n if (!visible || !wrapperRef.current || !bubbleRef.current) return\n const triggerRect = wrapperRef.current.getBoundingClientRect()\n const bubbleRect = bubbleRef.current.getBoundingClientRect()\n setPos(computePosition(triggerRect, bubbleRect, placement))\n }, [visible, placement])\n\n return (\n <div\n ref={wrapperRef}\n className={cn('tooltip-wrapper', className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n {...rest}\n >\n {children}\n {visible && (\n <Portal>\n <div\n ref={bubbleRef}\n className={cn('tooltip-bubble', placement)}\n role=\"tooltip\"\n style={pos ? {top: pos.top, left: pos.left} : {visibility: 'hidden'}}\n >\n {content}\n </div>\n </Portal>\n )}\n </div>\n )\n}\n","import {useCallback} from 'react'\nimport type {PopconfirmProps} from './Popconfirm.types'\nimport {Popover} from '../../primitives/Popover'\nimport {cn} from '../../../utils/cn'\nimport './Popconfirm.css'\n\nexport function Popconfirm({\n title,\n description,\n onConfirm,\n onCancel,\n confirmText = 'Yes',\n cancelText = 'No',\n color = 'warning',\n icon,\n placement = 'top-start',\n open,\n onOpenChange,\n anchorRef,\n className,\n}: PopconfirmProps) {\n const handleCancel = useCallback(() => {\n onOpenChange(false)\n onCancel?.()\n }, [onOpenChange, onCancel])\n\n const handleConfirm = useCallback(() => {\n onOpenChange(false)\n onConfirm()\n }, [onOpenChange, onConfirm])\n\n return (\n <Popover\n open={open}\n anchorRef={anchorRef}\n onClose={handleCancel}\n placement={placement}\n className={cn('popconfirm', color, className)}\n >\n <div className=\"body\">\n {icon && <div className=\"icon\">{icon}</div>}\n <div className=\"content\">\n <div className=\"title\">{title}</div>\n {description && (\n <div className=\"description\">{description}</div>\n )}\n </div>\n </div>\n <div className=\"actions\">\n <button\n type=\"button\"\n className=\"btn cancel\"\n onClick={handleCancel}\n >\n {cancelText}\n </button>\n <button\n type=\"button\"\n className=\"btn confirm\"\n onClick={handleConfirm}\n >\n {confirmText}\n </button>\n </div>\n </Popover>\n )\n}\n","import {useState} from 'react'\nimport type {ImageProps} from './Image.types'\nimport {cn} from '../../../utils/cn'\nimport './Image.css'\n\nconst RATIO_MAP: Record<string, string> = {\n '1:1': '1 / 1',\n '4:3': '4 / 3',\n '16:9': '16 / 9',\n '21:9': '21 / 9',\n}\n\n// Render a styled image with aspect ratio, fit, and optional fallback.\nexport function Image({\n fit = 'cover',\n ratio = 'auto',\n rounded = false,\n bordered = false,\n shadow = false,\n fallback,\n className,\n style,\n onError,\n ...rest\n}: ImageProps) {\n const [errored, setErrored] = useState(false)\n\n const handleError = (e: React.SyntheticEvent<HTMLImageElement>) => {\n if (fallback && !errored) {\n setErrored(true)\n e.currentTarget.src = fallback\n }\n onError?.(e)\n }\n\n const ratioStyle = ratio !== 'auto' && RATIO_MAP[ratio]\n ? {aspectRatio: RATIO_MAP[ratio], ...style}\n : style\n\n return (\n <img\n className={cn(\n 'image',\n fit,\n rounded && 'rounded',\n bordered && 'bordered',\n shadow && 'shadow',\n className\n )}\n style={ratioStyle}\n onError={handleError}\n {...rest}\n />\n )\n}\n","import type {GalleryProps} from './Gallery.types'\nimport {cn} from '../../../utils/cn'\nimport './Gallery.css'\n\n// Render a responsive image grid gallery.\nexport function Gallery({\n items,\n columns = 3,\n gap = 'md',\n rounded = true,\n className,\n ...rest\n}: GalleryProps) {\n return (\n <div\n className={cn('gallery', `columns-${columns}`, `gap-${gap}`, className)}\n {...rest}\n >\n {items.map((item, i) => (\n <figure key={i} className={cn('gallery-item', rounded && 'rounded')}>\n <img\n className=\"gallery-image\"\n src={item.src}\n alt={item.alt || ''}\n loading=\"lazy\"\n />\n {item.caption && (\n <figcaption className=\"gallery-caption\">{item.caption}</figcaption>\n )}\n </figure>\n ))}\n </div>\n )\n}\n","import {useState, useEffect, useCallback, useRef, Children} from 'react'\nimport type {CarouselProps} from './Carousel.types'\nimport {cn} from '../../../utils/cn'\nimport './Carousel.css'\n\n// Render a swipeable content slider with arrows, dots and transition modes.\nexport function Carousel({\n autoPlay = false,\n interval = 5000,\n showDots = true,\n showArrows = true,\n loop = true,\n draggable = true,\n transition = 'slide',\n className,\n children,\n ...rest\n}: CarouselProps) {\n const slides = Children.toArray(children)\n const count = slides.length\n const [active, setActive] = useState(0)\n const [dragOffset, setDragOffset] = useState(0)\n const [isDragging, setIsDragging] = useState(false)\n const dragStartX = useRef(0)\n const trackRef = useRef<HTMLDivElement>(null)\n\n const goTo = useCallback((index: number) => {\n if (loop) {\n setActive((index + count) % count)\n } else {\n setActive(Math.max(0, Math.min(index, count - 1)))\n }\n }, [count, loop])\n\n const prev = useCallback(() => goTo(active - 1), [active, goTo])\n const next = useCallback(() => goTo(active + 1), [active, goTo])\n\n useEffect(() => {\n if (!autoPlay || count <= 1 || isDragging) return\n const timer = setInterval(next, interval)\n return () => clearInterval(timer)\n }, [autoPlay, interval, next, count, isDragging])\n\n const handleDragStart = (clientX: number) => {\n if (!draggable) return\n setIsDragging(true)\n dragStartX.current = clientX\n setDragOffset(0)\n }\n\n const handleDragMove = (clientX: number) => {\n if (!isDragging) return\n const diff = clientX - dragStartX.current\n setDragOffset(diff)\n }\n\n const handleDragEnd = () => {\n if (!isDragging) return\n setIsDragging(false)\n const threshold = 50\n if (dragOffset < -threshold) {\n next()\n } else if (dragOffset > threshold) {\n prev()\n }\n setDragOffset(0)\n }\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (!draggable) return\n e.currentTarget.setPointerCapture(e.pointerId)\n handleDragStart(e.clientX)\n }\n\n const onPointerMove = (e: React.PointerEvent) => {\n handleDragMove(e.clientX)\n }\n\n const onPointerUp = () => {\n handleDragEnd()\n }\n\n if (count === 0) return null\n\n const isFade = transition === 'fade'\n const trackStyle = !isFade\n ? {transform: `translateX(calc(-${active * 100}% + ${isDragging ? dragOffset : 0}px))`}\n : undefined\n\n return (\n <div className={cn('carousel', isFade && 'fade', className)} {...rest}>\n <div\n className=\"carousel-viewport\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n style={{touchAction: draggable ? 'pan-y' : undefined, cursor: draggable ? (isDragging ? 'grabbing' : 'grab') : undefined}}\n >\n <div\n ref={trackRef}\n className={cn('carousel-track', isDragging && 'dragging')}\n style={trackStyle}\n >\n {slides.map((slide, i) => (\n <div\n key={i}\n className={cn(\n 'carousel-slide',\n isFade && i === active && 'active',\n isFade && i !== active && 'hidden'\n )}\n >\n {slide}\n </div>\n ))}\n </div>\n </div>\n\n {showArrows && count > 1 && (\n <>\n <button\n className=\"carousel-arrow carousel-arrow-prev\"\n onClick={prev}\n aria-label=\"Previous slide\"\n type=\"button\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M10 3L5 8L10 13\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <button\n className=\"carousel-arrow carousel-arrow-next\"\n onClick={next}\n aria-label=\"Next slide\"\n type=\"button\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M6 3L11 8L6 13\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </>\n )}\n\n {showDots && count > 1 && (\n <div className=\"carousel-dots\">\n {slides.map((_, i) => (\n <button\n key={i}\n className={cn('carousel-dot', i === active && 'active')}\n onClick={() => goTo(i)}\n aria-label={`Slide ${i + 1}`}\n type=\"button\"\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n","import {useState} from 'react'\nimport {Button} from '../../controls/Button'\nimport {Stack} from '../../layout/Stack'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport type {CollapsibleProps} from './Collapsible.types'\nimport './Collapsible.css'\n\n// Toggle a section of content with a built-in trigger and disclosure state.\nexport function Collapsible({\n title,\n defaultOpen = false,\n open: controlledOpen,\n onToggle,\n fcolor,\n className,\n children,\n ...rest\n}: CollapsibleProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const open = controlledOpen ?? internalOpen\n\n const handleToggle = () => {\n const nextOpen = !open\n\n if (controlledOpen === undefined) {\n setInternalOpen(nextOpen)\n }\n\n onToggle?.(nextOpen)\n }\n\n const chevronIcon = (\n <span className={cn('chevron', open && 'open')} aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\">\n <path\n d=\"M4 6L8 10L12 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )\n\n return (\n <div className={cn('collapsible', ...getAppearanceClassNames({fcolor}), className)} {...rest}>\n <Button\n variant=\"ghost\"\n className=\"trigger\"\n aria-expanded={open}\n onClick={handleToggle}\n endIcon={chevronIcon}\n >\n {title}\n </Button>\n <div className={cn('content-wrap', open && 'open')} aria-hidden={!open}>\n <Stack className=\"content\">{children}</Stack>\n </div>\n </div>\n )\n}\n","import {useState, useCallback, Children, isValidElement} from 'react'\nimport {Collapsible} from '../Collapsible'\nimport {cn} from '../../../utils/cn'\nimport type {AccordionProps, AccordionItemProps} from './Accordion.types'\nimport './Accordion.css'\n\nexport function AccordionItem(_props: AccordionItemProps) {\n return null\n}\n\nexport function Accordion({\n multiple = false,\n defaultOpen,\n onChange,\n bordered = false,\n className,\n children,\n ...rest\n}: AccordionProps) {\n const initialOpen = Array.isArray(defaultOpen)\n ? defaultOpen\n : defaultOpen\n ? [defaultOpen]\n : []\n\n const [openIds, setOpenIds] = useState<string[]>(initialOpen)\n\n const handleToggle = useCallback(\n (id: string, isOpen: boolean) => {\n setOpenIds((prev) => {\n let next: string[]\n if (isOpen) {\n next = multiple ? [...prev, id] : [id]\n } else {\n next = prev.filter((v) => v !== id)\n }\n onChange?.(next)\n return next\n })\n },\n [multiple, onChange]\n )\n\n const items = Children.toArray(children).filter(\n (child) => isValidElement(child) && (child.type as any) === AccordionItem\n )\n\n return (\n <div className={cn('accordion', bordered && 'bordered', className)} {...rest}>\n {items.map((child) => {\n if (!isValidElement<AccordionItemProps>(child)) return null\n const {id, title, children: content, disabled, fcolor} = child.props\n const isOpen = openIds.includes(id)\n\n return (\n <div key={id} className={cn('accordion-item', disabled && 'disabled')}>\n <Collapsible\n title={title}\n open={isOpen}\n onToggle={disabled ? undefined : (open) => handleToggle(id, open)}\n fcolor={fcolor}\n >\n {content}\n </Collapsible>\n </div>\n )\n })}\n </div>\n )\n}\n","import {useState, useEffect, useRef, useCallback} from 'react'\nimport type {ProgressBarProps} from './ProgressBar.types'\nimport {cn} from '../../../utils/cn'\nimport './ProgressBar.css'\n\nconst DURATION = 800\n\nfunction easeOutCubic(t: number) {\n return 1 - Math.pow(1 - t, 3)\n}\n\n// Render a horizontal bar that fills to represent progress as a percentage.\nexport function ProgressBar({\n value,\n max = 100,\n color = 'primary',\n size = 'md',\n label,\n showValue = false,\n animated = false,\n striped = false,\n className,\n ...rest\n}: ProgressBarProps) {\n const percent = Math.min(100, Math.max(0, (value / max) * 100))\n const [displayPercent, setDisplayPercent] = useState(0)\n const [barPercent, setBarPercent] = useState(0)\n const prevPercent = useRef(0)\n const rafRef = useRef(0)\n\n const animate = useCallback((from: number, to: number) => {\n cancelAnimationFrame(rafRef.current)\n const start = performance.now()\n\n const step = (now: number) => {\n const elapsed = now - start\n const progress = Math.min(elapsed / DURATION, 1)\n const eased = easeOutCubic(progress)\n const current = from + (to - from) * eased\n\n setDisplayPercent(current)\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(step)\n }\n }\n\n // Set bar width immediately for CSS transition\n setBarPercent(to)\n rafRef.current = requestAnimationFrame(step)\n }, [])\n\n useEffect(() => {\n animate(prevPercent.current, percent)\n prevPercent.current = percent\n return () => cancelAnimationFrame(rafRef.current)\n }, [percent, animate])\n\n return (\n <div\n className={cn('progress-bar', color, size, className)}\n role=\"progressbar\"\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={label}\n {...rest}\n >\n {(label || showValue) && (\n <div className=\"progress-bar-header\">\n {label && <span className=\"progress-bar-label\">{label}</span>}\n {showValue && <span className=\"progress-bar-value\">{Math.round(displayPercent)}%</span>}\n </div>\n )}\n <div className=\"progress-bar-track\">\n <div\n className={cn(\n 'progress-bar-fill',\n animated && 'animated',\n striped && 'striped'\n )}\n style={{width: `${barPercent}%`}}\n />\n </div>\n </div>\n )\n}\n","import {useState, useEffect, useRef} from 'react'\nimport type {CountUpProps} from './CountUp.types'\nimport {cn} from '../../../utils/cn'\n\n// Animate a number from a start value to a target, with an easing curve.\nexport function CountUp({\n value,\n from = 0,\n duration = 1000,\n decimals = 0,\n prefix = '',\n suffix = '',\n separator = '',\n className,\n ...rest\n}: CountUpProps) {\n const [display, setDisplay] = useState(from)\n const rafRef = useRef<number>(0)\n const startRef = useRef<number | null>(null)\n\n useEffect(() => {\n const startValue = display\n startRef.current = null\n\n const step = (timestamp: number) => {\n if (startRef.current === null) startRef.current = timestamp\n const elapsed = timestamp - startRef.current\n const progress = Math.min(elapsed / duration, 1)\n const eased = 1 - Math.pow(1 - progress, 3)\n const current = startValue + (value - startValue) * eased\n\n setDisplay(current)\n\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(step)\n }\n }\n\n rafRef.current = requestAnimationFrame(step)\n return () => cancelAnimationFrame(rafRef.current)\n }, [value, duration])\n\n const formatted = formatNumber(display, decimals, separator)\n\n return (\n <span className={cn('count-up', className)} {...rest}>\n {prefix}{formatted}{suffix}\n </span>\n )\n}\n\nfunction formatNumber(num: number, decimals: number, separator: string): string {\n const fixed = num.toFixed(decimals)\n if (!separator) return fixed\n\n const [int, dec] = fixed.split('.')\n const withSep = int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n return dec !== undefined ? `${withSep}.${dec}` : withSep\n}\n","import {useState} from 'react'\nimport type {RatingProps} from './Rating.types'\nimport {cn} from '../../../utils/cn'\nimport './Rating.css'\n\n// Render an interactive star-based rating control.\nexport function Rating({\n value = 0,\n max = 5,\n color = 'warning',\n size = 'md',\n readOnly = false,\n onChange,\n className,\n ...rest\n}: RatingProps) {\n const [hovered, setHovered] = useState<number | null>(null)\n const displayValue = hovered ?? value\n\n const handleClick = (index: number) => {\n if (readOnly) return\n onChange?.(index)\n }\n\n return (\n <div\n className={cn('rating', color, size, readOnly && 'read-only', className)}\n role=\"radiogroup\"\n aria-label=\"Rating\"\n onMouseLeave={() => setHovered(null)}\n {...rest}\n >\n {Array.from({length: max}, (_, i) => {\n const starIndex = i + 1\n const filled = starIndex <= displayValue\n return (\n <button\n key={i}\n type=\"button\"\n className={cn('rating-star', filled && 'filled')}\n onClick={() => handleClick(starIndex)}\n onMouseEnter={() => !readOnly && setHovered(starIndex)}\n aria-label={`${starIndex} star${starIndex > 1 ? 's' : ''}`}\n tabIndex={readOnly ? -1 : 0}\n disabled={readOnly}\n >\n ★\n </button>\n )\n })}\n </div>\n )\n}\n","import {useCallback, useEffect, useRef, useState} from 'react'\nimport type {ColorPickerProps} from './ColorPicker.types'\nimport {cn} from '../../../utils/cn'\nimport './ColorPicker.css'\n\nfunction hsvToHex(h: number, s: number, v: number): string {\n const f = (n: number) => {\n const k = (n + h / 60) % 6\n return v - v * s * Math.max(0, Math.min(k, 4 - k, 1))\n }\n const r = Math.round(f(5) * 255)\n const g = Math.round(f(3) * 255)\n const b = Math.round(f(1) * 255)\n return `#${[r, g, b].map((c) => c.toString(16).padStart(2, '0')).join('')}`\n}\n\nfunction hexToHsv(hex: string): [number, number, number] {\n const m = hex.replace('#', '').match(/.{2}/g)\n if (!m) return [0, 0, 1]\n const [r, g, b] = m.map((c) => parseInt(c, 16) / 255)\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const d = max - min\n let h = 0\n if (d !== 0) {\n if (max === r) h = ((g - b) / d + 6) % 6\n else if (max === g) h = (b - r) / d + 2\n else h = (r - g) / d + 4\n h *= 60\n }\n const s = max === 0 ? 0 : d / max\n return [h, s, max]\n}\n\nfunction hexToRgb(hex: string): string {\n const m = hex.replace('#', '').match(/.{2}/g)\n if (!m) return 'rgb(0, 0, 0)'\n const [r, g, b] = m.map((c) => parseInt(c, 16))\n return `rgb(${r}, ${g}, ${b})`\n}\n\nfunction hexToHsl(hex: string): string {\n const m = hex.replace('#', '').match(/.{2}/g)\n if (!m) return 'hsl(0, 0%, 0%)'\n const [r, g, b] = m.map((c) => parseInt(c, 16) / 255)\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n let h = 0\n let s = 0\n if (max !== min) {\n const d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n if (max === r) h = ((g - b) / d + 6) % 6\n else if (max === g) h = (b - r) / d + 2\n else h = (r - g) / d + 4\n h *= 60\n }\n return `hsl(${Math.round(h)}, ${Math.round(s * 100)}%, ${Math.round(l * 100)}%)`\n}\n\nfunction formatOutput(hex: string, format: string): string {\n if (format === 'rgb') return hexToRgb(hex)\n if (format === 'hsl') return hexToHsl(hex)\n return hex\n}\n\nfunction normalizeToHex(value: string): string {\n if (!value) return '#000000'\n if (value.startsWith('#')) return value.length === 7 ? value : '#000000'\n const rgbMatch = value.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/)\n if (rgbMatch) {\n return `#${[rgbMatch[1], rgbMatch[2], rgbMatch[3]]\n .map((c) => parseInt(c).toString(16).padStart(2, '0'))\n .join('')}`\n }\n return '#000000'\n}\n\nconst DEFAULT_SWATCHES = [\n '#ef4444', '#f97316', '#eab308', '#22c55e', '#06b6d4',\n '#3b82f6', '#8b5cf6', '#ec4899', '#000000', '#ffffff',\n]\n\nexport function ColorPicker({\n value,\n onChange,\n swatches = DEFAULT_SWATCHES,\n format = 'hex',\n size = 'md',\n label,\n disabled = false,\n className,\n ...rest\n}: ColorPickerProps) {\n const hex = normalizeToHex(value ?? '#3b82f6')\n const [hsv, setHsv] = useState<[number, number, number]>(() => hexToHsv(hex))\n const [inputValue, setInputValue] = useState(formatOutput(hex, format))\n const areaRef = useRef<HTMLDivElement>(null)\n const hueRef = useRef<HTMLDivElement>(null)\n const dragging = useRef<'area' | 'hue' | null>(null)\n\n useEffect(() => {\n const newHex = normalizeToHex(value ?? '#3b82f6')\n setHsv(hexToHsv(newHex))\n setInputValue(formatOutput(newHex, format))\n }, [value, format])\n\n const emit = useCallback(\n (h: number, s: number, v: number) => {\n const newHex = hsvToHex(h, s, v)\n setHsv([h, s, v])\n setInputValue(formatOutput(newHex, format))\n onChange?.(formatOutput(newHex, format))\n },\n [onChange, format]\n )\n\n function handleAreaPointer(e: React.PointerEvent | PointerEvent) {\n const rect = areaRef.current?.getBoundingClientRect()\n if (!rect) return\n const s = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n const v = Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height))\n emit(hsv[0], s, v)\n }\n\n function handleHuePointer(e: React.PointerEvent | PointerEvent) {\n const rect = hueRef.current?.getBoundingClientRect()\n if (!rect) return\n const h = Math.max(0, Math.min(360, ((e.clientX - rect.left) / rect.width) * 360))\n emit(h, hsv[1], hsv[2])\n }\n\n useEffect(() => {\n function onMove(e: PointerEvent) {\n if (dragging.current === 'area') handleAreaPointer(e)\n else if (dragging.current === 'hue') handleHuePointer(e)\n }\n function onUp() {\n dragging.current = null\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n return () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n })\n\n function handleInputChange(val: string) {\n setInputValue(val)\n try {\n const h = normalizeToHex(val)\n if (h !== '#000000' || val === '#000000' || val.toLowerCase() === 'rgb(0, 0, 0)') {\n setHsv(hexToHsv(h))\n onChange?.(formatOutput(h, format))\n }\n } catch {\n // ignore invalid input while typing\n }\n }\n\n const currentHex = hsvToHex(hsv[0], hsv[1], hsv[2])\n\n return (\n <div className={cn('color-picker', size, disabled && 'disabled', className)} {...rest}>\n {label && <label className=\"label\">{label}</label>}\n\n <div\n ref={areaRef}\n className=\"area\"\n style={{background: `hsl(${hsv[0]}, 100%, 50%)`}}\n onPointerDown={(e) => {\n if (disabled) return\n dragging.current = 'area'\n handleAreaPointer(e)\n }}\n >\n <div className=\"white\" />\n <div className=\"black\" />\n <div\n className=\"cursor\"\n style={{\n left: `${hsv[1] * 100}%`,\n top: `${(1 - hsv[2]) * 100}%`,\n background: currentHex,\n }}\n />\n </div>\n\n <div\n ref={hueRef}\n className=\"hue\"\n onPointerDown={(e) => {\n if (disabled) return\n dragging.current = 'hue'\n handleHuePointer(e)\n }}\n >\n <div\n className=\"hue-thumb\"\n style={{left: `${(hsv[0] / 360) * 100}%`}}\n />\n </div>\n\n <div className=\"controls\">\n <div className=\"preview\" style={{background: currentHex}} />\n <input\n type=\"text\"\n className=\"input\"\n value={inputValue}\n onChange={(e) => handleInputChange(e.target.value)}\n disabled={disabled}\n />\n </div>\n\n {swatches.length > 0 && (\n <div className=\"swatches\">\n {swatches.map((swatch) => (\n <button\n key={swatch}\n type=\"button\"\n className={cn('swatch', currentHex.toLowerCase() === swatch.toLowerCase() && 'active')}\n style={{background: swatch}}\n onClick={() => {\n if (disabled) return\n const [h, s, v] = hexToHsv(swatch)\n emit(h, s, v)\n }}\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n","import {useState, useRef, useCallback, useEffect, forwardRef} from 'react'\nimport type {TextareaProps} from './Textarea.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport {useGhostText} from '../../../utils/useGhostText'\nimport './Textarea.css'\n\n// Render the multiline text input with optional auto-resize behavior.\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n {\n value,\n defaultValue,\n name,\n id,\n placeholder,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n rows = 3,\n autoResize = false,\n minRows,\n maxRows,\n variant = 'outlined',\n size = 'md',\n color,\n fcolor,\n fullWidth = false,\n label,\n helperText,\n errorText,\n error = false,\n success = false,\n maxLength,\n showCharCount = false,\n ghostOptions,\n ghostMinChars = 2,\n onGhostAccept,\n loading = false,\n onChange,\n onFocus,\n onBlur,\n className,\n style,\n textareaClassName,\n labelClassName,\n },\n ref\n) {\n const [focused, setFocused] = useState(false)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n const {currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n const ghost = useGhostText({\n options: ghostOptions ?? [],\n value: currentValue,\n minChars: ghostMinChars,\n })\n const hasError = error || !!errorText\n const resolvedRef = ref ?? textareaRef\n\n // Resize the textarea to fit content while respecting min and max row limits.\n const adjustHeight = useCallback(() => {\n const el = typeof resolvedRef === 'function' ? null : resolvedRef?.current\n if (!el || !autoResize) return\n\n el.style.height = 'auto'\n const lineHeight = parseFloat(getComputedStyle(el).lineHeight) || 20\n const minH = minRows ? minRows * lineHeight : 0\n const maxH = maxRows ? maxRows * lineHeight : Infinity\n const newHeight = Math.min(Math.max(el.scrollHeight, minH), maxH)\n el.style.height = `${newHeight}px`\n el.style.overflowY = el.scrollHeight > newHeight ? 'auto' : 'hidden'\n }, [autoResize, minRows, maxRows, resolvedRef])\n\n useEffect(() => {\n adjustHeight()\n }, [currentValue, adjustHeight])\n\n // Mirror focus state so wrapper styling stays consistent with Input.\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(true)\n onFocus?.(e)\n },\n [onFocus]\n )\n\n // Clear focus styling before delegating blur handling.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(false)\n onBlur?.(e)\n },\n [onBlur]\n )\n\n // Keep uncontrolled usage working without blocking controlled integrations.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCurrentValue(e.target.value)\n onChange?.(e)\n ghost.reset()\n },\n [onChange, setCurrentValue, ghost.reset]\n )\n\n // Intercept keyboard events for ghost text acceptance.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (ghostOptions && ghost.hint) {\n const accepted = ghost.onKeyDown(e)\n if (accepted) {\n const result = ghost.accept()\n setCurrentValue(result.value)\n onGhostAccept?.(result.value)\n const el = typeof resolvedRef === 'function' ? null : resolvedRef?.current\n if (el) {\n const nativeSet = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')?.set\n nativeSet?.call(el, result.value)\n el.dispatchEvent(new Event('input', {bubbles: true}))\n }\n return\n }\n }\n },\n [ghostOptions, ghost, setCurrentValue, onGhostAccept, resolvedRef]\n )\n\n const containerClasses = cn(\n 'container',\n variant,\n size,\n focused && 'focused',\n hasError && 'error',\n success && !hasError && 'success',\n color === 'neutral' && 'color-neutral',\n color === 'success' && 'color-success',\n color === 'error' && 'color-error',\n color === 'warning' && 'color-warning',\n color === 'info' && 'color-info',\n disabled && 'disabled'\n )\n\n return (\n <div\n className={cn('textarea', ...getAppearanceClassNames({fcolor}), fullWidth && 'full-width', className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'label',\n focused && 'focused',\n hasError && 'error',\n success && !hasError && 'success',\n required && 'required',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className={containerClasses}>\n {ghostOptions ? (\n <div className=\"ghost-text-field ghost-text-field-multi\">\n <textarea\n ref={resolvedRef as React.Ref<HTMLTextAreaElement>}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n rows={autoResize ? (minRows ?? rows) : rows}\n maxLength={maxLength}\n value={currentValue}\n className={cn('field', textareaClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n {focused && ghost.hint && (\n <span className=\"ghost-text-overlay\" aria-hidden=\"true\">\n <span className=\"ghost-text-typed\">{currentValue}</span>\n <span className=\"ghost-text-hint\">{ghost.hint}</span>\n </span>\n )}\n </div>\n ) : (\n <textarea\n ref={resolvedRef as React.Ref<HTMLTextAreaElement>}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n rows={autoResize ? (minRows ?? rows) : rows}\n maxLength={maxLength}\n value={currentValue}\n className={cn('field', textareaClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n )}\n {loading && <span className=\"spinner\" />}\n </div>\n\n {(errorText || helperText || showCharCount) && (\n <div className=\"bottom-row\">\n <span>\n {errorText && (\n <span id={id ? `${id}-error` : undefined} className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n )}\n {!errorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className=\"helper-text\">\n {helperText}\n </span>\n )}\n </span>\n {showCharCount && maxLength && (\n <span className={cn('char-count', currentValue.length > maxLength && 'over')}>\n {currentValue.length}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n )\n})\n","import {useState, useCallback, useEffect, forwardRef} from 'react'\nimport type {InputPasswordProps, PasswordStrength} from './InputPassword.types'\nimport {Input} from '../Input'\nimport {cn} from '../../../utils/cn'\nimport './InputPassword.css'\n\n// Approximate password strength with simple UI-focused heuristics.\nfunction calcStrength(value: string): PasswordStrength {\n let score = 0\n if (value.length >= 8) score++\n if (value.length >= 12) score++\n if (/[a-z]/.test(value) && /[A-Z]/.test(value)) score++\n if (/\\d/.test(value)) score++\n if (/[^a-zA-Z0-9]/.test(value)) score++\n\n if (score <= 1) return 'weak'\n if (score <= 2) return 'fair'\n if (score <= 3) return 'good'\n return 'strong'\n}\n\nconst STRENGTH_LABELS: Record<PasswordStrength, string> = {\n weak: 'Weak',\n fair: 'Fair',\n good: 'Good',\n strong: 'Strong',\n}\n\n// Extend the base input with password visibility and optional strength feedback.\nexport const InputPassword = forwardRef<HTMLInputElement, InputPasswordProps>(function InputPassword(\n {showToggle = true, showStrength = false, onStrengthChange, value, defaultValue, onChange, className, ...rest},\n ref\n) {\n const [visible, setVisible] = useState(false)\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const currentValue = value !== undefined ? value.toString() : internalValue\n const strength = calcStrength(currentValue)\n\n useEffect(() => {\n onStrengthChange?.(strength)\n }, [strength, onStrengthChange])\n\n // Keep uncontrolled usage working while reporting changes to the caller.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value)\n }\n onChange?.(e)\n },\n [onChange, value]\n )\n\n const toggleIcon = showToggle ? (\n <button\n type=\"button\"\n className=\"toggle-btn\"\n onClick={() => setVisible((v) => !v)}\n tabIndex={-1}\n aria-label={visible ? 'Hide password' : 'Show password'}\n >\n {visible ? '\\u25E0' : '\\u25C9'}\n </button>\n ) : undefined\n\n return (\n <div className={cn('input-password', className)}>\n <Input\n {...rest}\n ref={ref}\n type={visible ? 'text' : 'password'}\n value={currentValue}\n onChange={handleChange}\n endIcon={toggleIcon}\n />\n {showStrength && currentValue.length > 0 && (\n <div className=\"strength-row\">\n <div className=\"strength-bar\">\n {[0, 1, 2, 3].map((i) => (\n <div\n key={i}\n className={cn(\n 'strength-segment',\n i < ['weak', 'fair', 'good', 'strong'].indexOf(strength) + 1 &&\n `strength-${strength}`\n )}\n />\n ))}\n </div>\n <span className={cn('strength-label', `strength-${strength}`)}>{STRENGTH_LABELS[strength]}</span>\n </div>\n )}\n </div>\n )\n})\n","import {useState, useCallback, useRef, useEffect, forwardRef} from 'react'\nimport type {InputNumberProps} from './InputNumber.types'\nimport {Input} from '../Input'\nimport {cn} from '../../../utils/cn'\nimport './InputNumber.css'\n\n// Keep numeric values inside optional min and max bounds.\nfunction clampValue(val: number, min?: number, max?: number): number {\n if (min !== undefined && val < min) return min\n if (max !== undefined && val > max) return max\n return val\n}\n\n// Prevent floating-point drift when step values use decimal precision.\nfunction roundToPrecision(val: number, precision: number): number {\n const factor = Math.pow(10, precision)\n return Math.round(val * factor) / factor\n}\n\n// Extend the base input with stepping, clamping and keyboard increment support.\nexport const InputNumber = forwardRef<HTMLInputElement, InputNumberProps>(function InputNumber(\n {\n min,\n max,\n step = 1,\n showStepper = true,\n precision = 0,\n allowNegative = true,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onKeyDown,\n onBlur,\n disabled = false,\n className,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const currentValue = value !== undefined ? value.toString() : internalValue\n const intervalRef = useRef<ReturnType<typeof setInterval>>(null)\n\n // Keep the displayed string and numeric callback in sync.\n const updateValue = useCallback(\n (newVal: string) => {\n if (value === undefined) {\n setInternalValue(newVal)\n }\n const num = parseFloat(newVal)\n onValueChange?.(isNaN(num) ? null : num)\n },\n [value, onValueChange]\n )\n\n // Move the current value by one step in the requested direction.\n const increment = useCallback(\n (direction: 1 | -1) => {\n const current = parseFloat(currentValue) || 0\n const newVal = roundToPrecision(clampValue(current + step * direction, min, max), precision)\n updateValue(newVal.toString())\n },\n [currentValue, step, min, max, precision, updateValue]\n )\n\n // Repeat stepping while the pointer is held on a stepper button.\n const startHold = useCallback(\n (direction: 1 | -1) => {\n increment(direction)\n intervalRef.current = setInterval(() => increment(direction), 150)\n },\n [increment]\n )\n\n // Clear the hold timer when the pointer is released.\n const stopHold = useCallback(() => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n }, [])\n\n useEffect(() => stopHold, [stopHold])\n\n // Filter user input down to numeric characters before storing it.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value\n const filtered = raw.replace(allowNegative ? /[^\\d.,-]/g : /[^\\d.,]/g, '')\n updateValue(filtered)\n onChange?.(e)\n },\n [onChange, allowNegative, updateValue]\n )\n\n // Snap the entered value back into range when the field loses focus.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const num = parseFloat(currentValue)\n if (!isNaN(num)) {\n const clamped = roundToPrecision(clampValue(num, min, max), precision)\n updateValue(clamped.toString())\n }\n onBlur?.(e)\n },\n [currentValue, min, max, precision, updateValue, onBlur]\n )\n\n // Support ArrowUp and ArrowDown as a keyboard stepper.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n increment(1)\n } else if (e.key === 'ArrowDown') {\n e.preventDefault()\n increment(-1)\n }\n onKeyDown?.(e)\n },\n [increment, onKeyDown]\n )\n\n const stepper =\n showStepper && !disabled ? (\n <div className=\"stepper\">\n <button\n type=\"button\"\n className=\"step-btn\"\n onMouseDown={() => startHold(1)}\n onMouseUp={stopHold}\n onMouseLeave={stopHold}\n tabIndex={-1}\n aria-label=\"Increment\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 10L8 6L12 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"step-btn\"\n onMouseDown={() => startHold(-1)}\n onMouseUp={stopHold}\n onMouseLeave={stopHold}\n tabIndex={-1}\n aria-label=\"Decrement\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 6L8 10L12 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n ) : undefined\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"decimal\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n endIcon={stepper}\n disabled={disabled}\n className={cn('input-number', className)}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputEmailProps} from './InputEmail.types'\nimport {Input} from '../Input'\nimport {validateEmail} from '../../../utils/validators'\nimport type {ValidationResult} from '../../../utils/validators'\n\n// Extend the base input with email validation and optional success feedback.\nexport const InputEmail = forwardRef<HTMLInputElement, InputEmailProps>(function InputEmail(\n {\n validateOnBlur = true,\n validateOnChange = false,\n showValidIcon = true,\n onValidationChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n success,\n placeholder = 'email@example.com',\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n // Reuse the shared email validator and surface the latest result upstream.\n const runValidation = useCallback(\n (val: string) => {\n const result = validateEmail(val)\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [onValidationChange]\n )\n\n // Validate while typing only when the component is configured to do so.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value)\n }\n if (validateOnChange && touched) {\n runValidation(e.target.value)\n }\n onChange?.(e)\n },\n [onChange, value, validateOnChange, touched, runValidation]\n )\n\n // Validate optional email input on blur once the user has interacted with it.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n if (validateOnBlur && e.target.value) {\n runValidation(e.target.value)\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, runValidation]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess =\n !isError && success !== undefined ? success : touched && validation.valid && currentValue.length > 0\n\n const emailIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"1\" y=\"3\" width=\"14\" height=\"10\" rx=\"2\" />\n <path d=\"M1 5L8 9L15 5\" />\n </svg>\n )\n\n const validIcon =\n showValidIcon && isSuccess ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"var(--mineral-success)\" strokeWidth=\"2\">\n <path d=\"M3 8L6.5 11.5L13 4.5\" />\n </svg>\n ) : undefined\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"email\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder}\n startIcon={emailIcon}\n endIcon={validIcon}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputPhoneProps} from './InputPhone.types'\nimport {Input} from '../Input'\nimport {cn} from '../../../utils/cn'\nimport {validatePhone} from '../../../utils/validators'\nimport {formatPhone, stripNonDigits} from '../../../utils/formatters'\nimport type {ValidationResult} from '../../../utils/validators'\nimport './InputPhone.css'\n\n// Extend the base input with country-aware phone formatting and validation.\nexport const InputPhone = forwardRef<HTMLInputElement, InputPhoneProps>(function InputPhone(\n {\n countryCode = 'PL',\n showCountryCode = true,\n formatOnChange = true,\n validateOnBlur = true,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n placeholder = '123 456 789',\n className,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n // Keep the emitted raw digits and the displayed formatted value aligned.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const digits = stripNonDigits(e.target.value)\n const formatted = formatOnChange ? formatPhone(digits, {countryCode}) : digits\n\n if (value === undefined) {\n setInternalValue(formatted)\n }\n onValueChange?.(digits, formatted)\n onChange?.(e)\n },\n [onChange, value, formatOnChange, countryCode, onValueChange]\n )\n\n // Validate the raw number on blur using country-specific length rules.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n if (validateOnBlur && currentValue) {\n const result = validatePhone(stripNonDigits(currentValue), countryCode)\n setValidation(result)\n onValidationChange?.(result)\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, currentValue, countryCode, onValidationChange]\n )\n\n const COUNTRY_PREFIXES: Record<string, string> = {\n PL: '+48',\n DE: '+49',\n US: '+1',\n GB: '+44',\n FR: '+33',\n CZ: '+420',\n SK: '+421',\n }\n\n const prefix = showCountryCode ? (\n <span className=\"prefix\">{COUNTRY_PREFIXES[countryCode.toUpperCase()] ?? `+${countryCode}`}</span>\n ) : undefined\n\n const phoneIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M3 1.5h10a1 1 0 011 1v11a1 1 0 01-1 1H3a1 1 0 01-1-1v-11a1 1 0 011-1z\" />\n <line x1=\"5\" y1=\"12\" x2=\"11\" y2=\"12\" />\n </svg>\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"tel\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n placeholder={placeholder}\n startIcon={showCountryCode ? prefix : phoneIcon}\n className={cn('input-phone', className)}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputNameProps} from './InputName.types'\nimport {Input} from '../Input'\nimport {capitalizeWords} from '../../../utils/formatters'\nimport type {ValidationResult} from '../../../utils/validators'\n\n// Extend the base input with name-friendly filtering and optional word-count validation.\nexport const InputName = forwardRef<HTMLInputElement, InputNameProps>(function InputName(\n {\n autoCapitalize = true,\n allowNumbers = false,\n allowSpecialChars = false,\n minWords,\n validateOnBlur = true,\n onValidationChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n placeholder = 'Jan Kowalski',\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n // Normalize user input according to the configured name rules.\n const filterValue = useCallback(\n (raw: string): string => {\n let filtered = raw\n if (!allowNumbers) {\n filtered = filtered.replace(/\\d/g, '')\n }\n if (!allowSpecialChars) {\n filtered = filtered.replace(/[^a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ\\s'-]/g, '')\n }\n if (autoCapitalize) {\n filtered = capitalizeWords(filtered)\n }\n return filtered\n },\n [allowNumbers, allowSpecialChars, autoCapitalize]\n )\n\n // Store the filtered value while still delegating the original change event.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const filtered = filterValue(e.target.value)\n if (value === undefined) {\n setInternalValue(filtered)\n }\n onChange?.(e)\n },\n [onChange, value, filterValue]\n )\n\n // Validate the minimum word count after the user leaves the field.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n if (validateOnBlur && currentValue) {\n const words = currentValue.trim().split(/\\s+/).filter(Boolean)\n if (minWords && words.length < minWords) {\n const result: ValidationResult = {\n valid: false,\n error: `Enter at least ${minWords} word${minWords > 1 ? 's' : ''}`,\n }\n setValidation(result)\n onValidationChange?.(result)\n } else {\n const result: ValidationResult = {valid: true}\n setValidation(result)\n onValidationChange?.(result)\n }\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, currentValue, minWords, onValidationChange]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n\n const userIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"8\" cy=\"5\" r=\"3\" />\n <path d=\"M2 14c0-3 2.5-5 6-5s6 2 6 5\" />\n </svg>\n )\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"text\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n placeholder={placeholder}\n startIcon={userIcon}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputIBANProps} from './InputIBAN.types'\nimport {Input} from '../Input'\nimport {validateIBAN} from '../../../utils/validators'\nimport {formatIBAN, unformatIBAN} from '../../../utils/formatters'\nimport type {ValidationResult} from '../../../utils/validators'\n\n// Extend the base input with IBAN formatting and checksum validation.\nexport const InputIBAN = forwardRef<HTMLInputElement, InputIBANProps>(function InputIBAN(\n {\n formatOnChange = true,\n validateOnBlur = true,\n showValidIcon = true,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n success,\n placeholder = 'PL00 0000 0000 0000 0000 0000 0000',\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n // Keep raw and formatted IBAN values aligned for consumers and display.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n let raw = e.target.value.replace(/[^a-zA-Z0-9\\s]/g, '').toUpperCase()\n const clean = raw.replace(/\\s/g, '')\n const formatted = formatOnChange ? formatIBAN(clean) : clean\n\n if (value === undefined) {\n setInternalValue(formatted)\n }\n onValueChange?.(clean, formatted)\n onChange?.(e)\n },\n [onChange, value, formatOnChange, onValueChange]\n )\n\n // Validate the normalized IBAN once the user leaves the field.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n if (validateOnBlur && currentValue) {\n const result = validateIBAN(unformatIBAN(currentValue))\n setValidation(result)\n onValidationChange?.(result)\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, currentValue, onValidationChange]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess =\n !isError && (success !== undefined ? success : touched && validation.valid && currentValue.length > 0)\n\n const bankIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M1 14h14\" />\n <path d=\"M2 6h12\" />\n <path d=\"M8 2L1 6h14L8 2z\" />\n <path d=\"M3 6v8M6 6v8M10 6v8M13 6v8\" />\n </svg>\n )\n\n const validIcon =\n showValidIcon && isSuccess ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"var(--mineral-success)\" strokeWidth=\"2\">\n <path d=\"M3 8L6.5 11.5L13 4.5\" />\n </svg>\n ) : undefined\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"text\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder}\n startIcon={bankIcon}\n endIcon={validIcon}\n maxLength={34 + 8}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputTaxIdProps, TaxIdType} from './InputTaxId.types'\nimport {Input} from '../Input'\nimport {validateNIP, validatePESEL, validateREGON} from '../../../utils/validators'\nimport {formatNIP, stripNonDigits} from '../../../utils/formatters'\nimport type {ValidationResult} from '../../../utils/validators'\n\nconst VALIDATORS: Record<TaxIdType, (v: string) => ValidationResult> = {\n NIP: validateNIP,\n PESEL: validatePESEL,\n REGON: validateREGON,\n}\n\nconst MAX_LENGTHS: Record<TaxIdType, number> = {\n NIP: 13,\n PESEL: 11,\n REGON: 14,\n}\n\nconst PLACEHOLDERS: Record<TaxIdType, string> = {\n NIP: '123-456-78-19',\n PESEL: '00000000000',\n REGON: '000000000',\n}\n\n// Extend the base input with NIP, PESEL and REGON formatting and validation.\nexport const InputTaxId = forwardRef<HTMLInputElement, InputTaxIdProps>(function InputTaxId(\n {\n taxIdType,\n formatOnChange = true,\n validateOnBlur = true,\n showValidIcon = true,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n success,\n placeholder,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n // Normalize the visible value based on the selected identifier type.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const digits = stripNonDigits(e.target.value)\n const formatted = formatOnChange && taxIdType === 'NIP' ? formatNIP(digits) : digits\n\n if (value === undefined) {\n setInternalValue(formatted)\n }\n onValueChange?.(digits)\n onChange?.(e)\n },\n [onChange, value, formatOnChange, taxIdType, onValueChange]\n )\n\n // Validate the stripped numeric value against the active identifier rules.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n if (validateOnBlur && currentValue) {\n const validator = VALIDATORS[taxIdType]\n const result = validator(stripNonDigits(currentValue))\n setValidation(result)\n onValidationChange?.(result)\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, currentValue, taxIdType, onValidationChange]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess =\n !isError && (success !== undefined ? success : touched && validation.valid && currentValue.length > 0)\n\n const idIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"1\" y=\"3\" width=\"14\" height=\"10\" rx=\"2\" />\n <line x1=\"4\" y1=\"7\" x2=\"8\" y2=\"7\" />\n <line x1=\"4\" y1=\"10\" x2=\"12\" y2=\"10\" />\n </svg>\n )\n\n const validIcon =\n showValidIcon && isSuccess ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"var(--mineral-success)\" strokeWidth=\"2\">\n <path d=\"M3 8L6.5 11.5L13 4.5\" />\n </svg>\n ) : undefined\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder ?? PLACEHOLDERS[taxIdType]}\n startIcon={idIcon}\n endIcon={validIcon}\n maxLength={MAX_LENGTHS[taxIdType]}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputCurrencyProps} from './InputCurrency.types'\nimport {Input} from '../Input'\nimport {cn} from '../../../utils/cn'\nimport {formatCurrency, parseCurrencyToNumber} from '../../../utils/formatters'\nimport './InputCurrency.css'\n\n// Extend the base input with currency formatting and numeric callbacks.\nexport const InputCurrency = forwardRef<HTMLInputElement, InputCurrencyProps>(function InputCurrency(\n {\n currency,\n currencySymbol,\n currencyPosition = 'end',\n decimalSeparator = ',',\n thousandSeparator = ' ',\n precision = 2,\n min,\n max,\n allowNegative = false,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n placeholder = '0,00',\n startIcon,\n endIcon,\n className,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n const symbol = currencySymbol ?? currency ?? ''\n\n // Filter user input down to one decimal separator and an optional minus sign.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value\n let filtered = ''\n let hasDecimal = false\n for (const ch of raw) {\n if (ch >= '0' && ch <= '9') {\n filtered += ch\n } else if ((ch === ',' || ch === '.') && !hasDecimal) {\n filtered += decimalSeparator\n hasDecimal = true\n } else if (ch === '-' && allowNegative && filtered.length === 0) {\n filtered += '-'\n }\n }\n\n const formatted = formatCurrency(filtered, {decimalSeparator, thousandSeparator, precision})\n\n if (value === undefined) {\n setInternalValue(formatted)\n }\n\n const num = parseCurrencyToNumber(formatted, thousandSeparator, decimalSeparator)\n onValueChange?.(num)\n onChange?.(e)\n },\n [onChange, value, decimalSeparator, thousandSeparator, precision, allowNegative, onValueChange]\n )\n\n // Clamp the numeric value on blur and snap it to the configured precision.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n let num = parseCurrencyToNumber(currentValue, thousandSeparator, decimalSeparator)\n if (num !== null) {\n if (min !== undefined && num < min) num = min\n if (max !== undefined && num > max) num = max\n const fixed = num.toFixed(precision).replace('.', decimalSeparator)\n const formatted = formatCurrency(fixed, {decimalSeparator, thousandSeparator, precision})\n if (value === undefined) {\n setInternalValue(formatted)\n }\n onValueChange?.(num)\n }\n onBlur?.(e)\n },\n [currentValue, min, max, precision, decimalSeparator, thousandSeparator, value, onValueChange, onBlur]\n )\n\n const symbolEl = symbol ? <span className=\"symbol\">{symbol}</span> : undefined\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"decimal\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder={placeholder}\n startIcon={currencyPosition === 'start' ? symbolEl : startIcon}\n endIcon={currencyPosition === 'end' ? symbolEl : endIcon}\n className={cn('input-currency', className)}\n />\n )\n})\n","import {forwardRef, useCallback, useMemo, useState} from 'react'\nimport type {InputCreditCardProps} from './InputCreditCard.types'\nimport {Input} from '../Input'\nimport {cn} from '../../../utils/cn'\nimport {detectCardBrand, formatCardNumber, stripCardNumber, validateCardNumber} from '../../../utils/creditCards'\nimport type {ValidationResult} from '../../../utils/validators'\nimport './InputCreditCard.css'\n\nfunction CardBrandBadge({value}: {value: string}) {\n const brand = detectCardBrand(value)\n\n return <span className={cn('card-brand', brand.brand)}>{brand.iconLabel}</span>\n}\n\n// Extend the base input with payment card detection, formatting and checksum validation.\nexport const InputCreditCard = forwardRef<HTMLInputElement, InputCreditCardProps>(function InputCreditCard(\n {\n validateOnBlur = true,\n validateOnChange = false,\n showBrandIcon = true,\n showValidIcon = true,\n onValidationChange,\n onCardBrandChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n success,\n placeholder = '4242 4242 4242 4242',\n className,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(() => formatCardNumber(defaultValue?.toString() ?? ''))\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? formatCardNumber(value.toString()) : internalValue\n const detectedBrand = useMemo(() => detectCardBrand(currentValue), [currentValue])\n\n const runValidation = useCallback(\n (formattedValue: string) => {\n const result = validateCardNumber(formattedValue)\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [onValidationChange]\n )\n\n // Keep the visible card number grouped while exposing raw digits to the caller.\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const formattedValue = formatCardNumber(event.target.value)\n const nextBrand = detectCardBrand(formattedValue)\n\n if (value === undefined) {\n setInternalValue(formattedValue)\n }\n\n onCardBrandChange?.(nextBrand.brand)\n onValueChange?.(stripCardNumber(formattedValue), formattedValue, nextBrand.brand)\n\n if (validateOnChange && touched) {\n runValidation(formattedValue)\n }\n\n onChange?.(event)\n },\n [onCardBrandChange, onChange, onValueChange, runValidation, touched, validateOnChange, value]\n )\n\n // Validate after the user leaves the field so checksum feedback stays predictable.\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n\n if (validateOnBlur && currentValue) {\n runValidation(currentValue)\n }\n\n onBlur?.(event)\n },\n [currentValue, onBlur, runValidation, validateOnBlur]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess =\n !isError && success !== undefined\n ? success\n : touched && validation.valid && stripCardNumber(currentValue).length > 0\n\n const validIcon =\n showValidIcon && isSuccess ? (\n <span className=\"valid-icon\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M3 8L6.5 11.5L13 4.5\" />\n </svg>\n </span>\n ) : undefined\n\n return (\n <Input\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder}\n startIcon={showBrandIcon ? <CardBrandBadge value={currentValue} /> : undefined}\n endIcon={validIcon}\n className={cn('input-credit-card', className)}\n />\n )\n})\n","import {useState, useRef, useCallback, forwardRef, isValidElement} from 'react'\nimport type {InputGroupProps, InputGroupAddon, InputGroupSlot} from './InputGroup.types'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './InputGroup.css'\n\n// Detect structured addon configs while leaving raw React nodes untouched.\nfunction isAddonObject(slot: InputGroupSlot): slot is InputGroupAddon {\n return typeof slot === 'object' && slot !== null && !isValidElement(slot) && 'type' in slot\n}\n\n// Render one prepend or append slot based on its declared addon type.\nfunction renderSlot(slot: InputGroupSlot, position: 'prepend' | 'append', index: number) {\n if (!isAddonObject(slot)) {\n // Raw ReactNode — render as-is inside addon container\n return (\n <div key={`${position}-${index}`} className={cn('addon', 'custom', position)}>\n {slot}\n </div>\n )\n }\n\n const addon = slot\n\n if (addon.type === 'button') {\n return (\n <button\n key={`${position}-${index}`}\n type=\"button\"\n className={cn('addon', position, 'button')}\n onClick={addon.onClick}\n >\n {addon.content}\n </button>\n )\n }\n\n if (addon.type === 'checkbox') {\n return (\n <label key={`${position}-${index}`} className={cn('addon', position, 'checkbox')}>\n <input\n type=\"checkbox\"\n checked={addon.checked}\n onChange={(e) => addon.onCheckedChange?.(e.target.checked)}\n />\n </label>\n )\n }\n\n // text or icon\n return (\n <span key={`${position}-${index}`} className={cn('addon', position)}>\n {addon.content}\n </span>\n )\n}\n\n// Normalize the public slot API to a flat array for predictable rendering.\nfunction normalizeSlots(slots?: InputGroupSlot | InputGroupSlot[]): InputGroupSlot[] {\n if (slots === undefined || slots === null) return []\n if (Array.isArray(slots)) return slots\n return [slots]\n}\n\n// Render a grouped input with prepend and append content around a shared field.\nexport const InputGroup = forwardRef<HTMLInputElement, InputGroupProps>(function InputGroup(\n {\n prepend,\n append,\n type = 'text',\n value,\n defaultValue,\n name,\n id,\n placeholder,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n autoComplete,\n inputMode,\n size = 'md',\n fcolor,\n fullWidth = false,\n label,\n helperText,\n errorText,\n color = 'primary',\n error = false,\n maxLength,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n loading = false,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n inputClassName,\n labelClassName,\n },\n ref\n) {\n const [focused, setFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: clickEffect,\n disabled: disabled || readOnly,\n color: rippleColor,\n })\n\n const hasError = error || !!errorText\n const {currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n\n // Mirror focus state so the wrapper can style the group consistently.\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true)\n onFocus?.(e)\n },\n [onFocus]\n )\n\n // Clear wrapper focus styling before delegating blur handling.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false)\n onBlur?.(e)\n },\n [onBlur]\n )\n\n // Keep uncontrolled usage working without blocking controlled integrations.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setCurrentValue(e.target.value)\n onChange?.(e)\n },\n [onChange, setCurrentValue]\n )\n\n const prependSlots = normalizeSlots(prepend)\n const appendSlots = normalizeSlots(append)\n\n return (\n <div\n className={cn(\n 'input-group',\n color,\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'label',\n focused && 'focused',\n hasError && 'error',\n required && 'required',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div\n className={cn(\n 'container',\n size,\n focused && 'focused',\n hasError && 'has-error',\n disabled && 'disabled',\n effectClassName\n )}\n onPointerDown={handlePointerDown}\n >\n {effectLayer}\n {prependSlots.map((slot, i) => renderSlot(slot, 'prepend', i))}\n\n <input\n ref={ref ?? inputRef}\n type={type}\n value={currentValue}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n inputMode={inputMode}\n maxLength={maxLength}\n className={cn('field', inputClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n\n {loading && (\n <span className={'spinner-addon'}>\n <span className={'spinner'} />\n </span>\n )}\n\n {appendSlots.map((slot, i) => renderSlot(slot, 'append', i))}\n </div>\n\n {(errorText || helperText) && (\n <div className={'bottom'}>\n {errorText && (\n <span id={id ? `${id}-error` : undefined} className={'error-text'} role=\"alert\">\n {errorText}\n </span>\n )}\n {!errorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className={'helper'}>\n {helperText}\n </span>\n )}\n </div>\n )}\n </div>\n )\n})\n","import {forwardRef, useCallback, useMemo, useState} from 'react'\nimport type {InputPostCodeProps} from './InputPostCode.types'\nimport {InputGroup} from '../InputGroup'\nimport {cn} from '../../../utils/cn'\nimport {formatPostCode, getPostCodeRule, postCodeCountries, validatePostCode} from '../../../utils/postalCodes'\nimport type {ValidationResult} from '../../../utils/validators'\nimport './InputPostCode.css'\n\n// Extend the grouped input with country-aware postal code masking and validation.\nexport const InputPostCode = forwardRef<HTMLInputElement, InputPostCodeProps>(function InputPostCode(\n {\n country,\n defaultCountry = 'PL',\n selectableCountry = true,\n validateOnBlur = true,\n validateOnChange = false,\n onCountryChange,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n error,\n errorText,\n helperText,\n placeholder,\n className,\n disabled = false,\n ...rest\n },\n ref\n) {\n const [internalCountry, setInternalCountry] = useState(defaultCountry.toUpperCase())\n const [internalValue, setInternalValue] = useState(() =>\n formatPostCode(defaultValue?.toString() ?? '', country ?? defaultCountry)\n )\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentCountry = (country ?? internalCountry).toUpperCase()\n const currentRule = useMemo(() => getPostCodeRule(currentCountry), [currentCountry])\n const currentValue = value !== undefined ? formatPostCode(value.toString(), currentCountry) : internalValue\n\n const runValidation = useCallback(\n (formattedValue: string, nextCountry: string) => {\n const result = validatePostCode(formattedValue, nextCountry)\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [onValidationChange]\n )\n\n // Keep the visible postal code aligned with the selected country rule.\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const formattedValue = formatPostCode(event.target.value, currentCountry)\n\n if (value === undefined) {\n setInternalValue(formattedValue)\n }\n\n onValueChange?.(formattedValue.replace(/\\s|-/g, ''), formattedValue, currentCountry)\n\n if (validateOnChange && touched) {\n runValidation(formattedValue, currentCountry)\n }\n\n onChange?.(event)\n },\n [currentCountry, onChange, onValueChange, runValidation, touched, validateOnChange, value]\n )\n\n // Re-run validation after blur so the visible formatting and error state stay in sync.\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n\n if (validateOnBlur && currentValue) {\n runValidation(currentValue, currentCountry)\n }\n\n onBlur?.(event)\n },\n [currentCountry, currentValue, onBlur, runValidation, validateOnBlur]\n )\n\n // Switch the formatter and validation rule whenever the selected country changes.\n const handleCountryChange = useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const nextCountry = event.target.value.toUpperCase()\n const formattedValue = formatPostCode(currentValue, nextCountry)\n\n if (country === undefined) {\n setInternalCountry(nextCountry)\n }\n\n if (value === undefined) {\n setInternalValue(formattedValue)\n }\n\n onCountryChange?.(nextCountry)\n\n if (touched) {\n runValidation(formattedValue, nextCountry)\n }\n },\n [country, currentValue, onCountryChange, runValidation, touched, value]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n\n return (\n <InputGroup\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode={currentRule.inputMode}\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n helperText={resolvedErrorText ? undefined : (helperText ?? `Format: ${currentRule.example}`)}\n placeholder={placeholder ?? currentRule.placeholder}\n maxLength={currentRule.maxLength}\n disabled={disabled}\n prepend={\n selectableCountry ? (\n <div className=\"country-select-wrap\">\n <select\n className=\"country-select\"\n value={currentCountry}\n onChange={handleCountryChange}\n disabled={disabled}\n aria-label=\"Postal code country\"\n >\n {postCodeCountries.map((option) => (\n <option key={option.value} value={option.value}>\n {option.value}\n </option>\n ))}\n </select>\n </div>\n ) : (\n {type: 'text', content: currentCountry}\n )\n }\n className={cn('input-post-code', className)}\n />\n )\n})\n","import {useState, useCallback, useRef, useEffect, forwardRef} from 'react'\nimport type {InputOTPProps} from './InputOTP.types'\nimport {cn} from '../../../utils/cn'\nimport './InputOTP.css'\n\nexport const InputOTP = forwardRef<HTMLDivElement, InputOTPProps>(function InputOTP(\n {\n length = 6,\n value,\n onChange,\n autoFocus = false,\n disabled = false,\n color = 'primary',\n size = 'md',\n error = false,\n errorText,\n label,\n className,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState('')\n const currentValue = value !== undefined ? value : internalValue\n const inputsRef = useRef<(HTMLInputElement | null)[]>([])\n\n const updateValue = useCallback(\n (newVal: string) => {\n if (value === undefined) setInternalValue(newVal)\n onChange?.(newVal)\n },\n [value, onChange]\n )\n\n const focusSlot = useCallback((index: number) => {\n const clamped = Math.max(0, Math.min(index, length - 1))\n inputsRef.current[clamped]?.focus()\n }, [length])\n\n useEffect(() => {\n if (autoFocus) focusSlot(0)\n }, [autoFocus, focusSlot])\n\n const handleInput = useCallback(\n (index: number, char: string) => {\n if (!/^\\d$/.test(char)) return\n const chars = currentValue.split('')\n while (chars.length <= index) chars.push('')\n chars[index] = char\n updateValue(chars.join(''))\n if (index < length - 1) focusSlot(index + 1)\n },\n [currentValue, length, updateValue, focusSlot]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n e.preventDefault()\n const chars = currentValue.split('')\n if (chars[index]) {\n chars[index] = ''\n updateValue(chars.join(''))\n } else if (index > 0) {\n chars[index - 1] = ''\n updateValue(chars.join(''))\n focusSlot(index - 1)\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault()\n if (index > 0) focusSlot(index - 1)\n } else if (e.key === 'ArrowRight') {\n e.preventDefault()\n if (index < length - 1) focusSlot(index + 1)\n }\n },\n [currentValue, length, updateValue, focusSlot]\n )\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault()\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, length)\n if (pasted) {\n updateValue(pasted)\n focusSlot(Math.min(pasted.length, length - 1))\n }\n },\n [length, updateValue, focusSlot]\n )\n\n return (\n <div\n ref={ref}\n className={cn('input-otp', color, size, error && 'error', disabled && 'disabled', className)}\n {...rest}\n >\n {label && <div className=\"label\">{label}</div>}\n <div className=\"slots\" onPaste={handlePaste}>\n {Array.from({length}, (_, i) => (\n <input\n key={i}\n ref={(el) => { inputsRef.current[i] = el }}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={currentValue[i] || ''}\n disabled={disabled}\n className={cn('slot', currentValue[i] && 'filled')}\n aria-label={`Digit ${i + 1}`}\n onChange={(e) => {\n const char = e.target.value.slice(-1)\n handleInput(i, char)\n }}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onFocus={(e) => e.target.select()}\n />\n ))}\n </div>\n {error && errorText && <div className=\"error-text\">{errorText}</div>}\n </div>\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type {InputSliderProps} from './InputSlider.types'\nimport {Slider} from '../../controls/Slider'\nimport {cn} from '../../../utils/cn'\nimport './InputSlider.css'\n\nfunction clampValue(val: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, val))\n}\n\nfunction roundToPrecision(val: number, precision: number): number {\n const factor = Math.pow(10, precision)\n return Math.round(val * factor) / factor\n}\n\nexport const InputSlider = forwardRef<HTMLDivElement, InputSliderProps>(function InputSlider(\n {\n min = 0,\n max = 100,\n step = 1,\n value,\n onChange,\n precision = 0,\n marks,\n showInput = true,\n color = 'primary',\n size = 'md',\n disabled = false,\n label,\n className,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(min)\n const currentValue = value !== undefined ? value : internalValue\n\n const update = useCallback(\n (newVal: number) => {\n const clamped = roundToPrecision(clampValue(newVal, min, max), precision)\n if (value === undefined) setInternalValue(clamped)\n onChange?.(clamped)\n },\n [min, max, precision, value, onChange]\n )\n\n const handleSliderChange = useCallback(\n (val: number) => update(val),\n [update]\n )\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value\n if (raw === '' || raw === '-') return\n const num = parseFloat(raw)\n if (!isNaN(num)) update(num)\n },\n [update]\n )\n\n const handleBlur = useCallback(() => {\n update(currentValue)\n }, [currentValue, update])\n\n return (\n <div\n ref={ref}\n className={cn('input-slider', size, disabled && 'disabled', className)}\n {...rest}\n >\n {label && <div className=\"label\">{label}</div>}\n <div className=\"row\">\n <Slider\n min={min}\n max={max}\n step={step}\n value={currentValue}\n onChange={handleSliderChange}\n marks={marks}\n color={color}\n disabled={disabled}\n />\n {showInput && (\n <input\n type=\"text\"\n inputMode=\"decimal\"\n className={cn('field', color)}\n value={currentValue}\n onChange={handleInputChange}\n onBlur={handleBlur}\n disabled={disabled}\n aria-label={label || 'Slider value'}\n />\n )}\n </div>\n </div>\n )\n})\n","import {useState, useRef, useCallback, useEffect} from 'react'\nimport type {InputFileCropShape} from './InputFile.types'\nimport './CropEditor.css'\n\ninterface CropEditorProps {\n file: File\n shape: InputFileCropShape\n outputSize: number\n quality: number\n onCrop: (cropped: File) => void\n onCancel: () => void\n}\n\nexport function CropEditor({file, shape, outputSize, quality, onCrop, onCancel}: CropEditorProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const imgRef = useRef<HTMLImageElement | null>(null)\n const [imgSrc, setImgSrc] = useState('')\n const [scale, setScale] = useState(1)\n const [offset, setOffset] = useState({x: 0, y: 0})\n const [dragging, setDragging] = useState(false)\n const dragStart = useRef({x: 0, y: 0, ox: 0, oy: 0})\n\n useEffect(() => {\n const url = URL.createObjectURL(file)\n setImgSrc(url)\n return () => URL.revokeObjectURL(url)\n }, [file])\n\n useEffect(() => {\n if (!imgSrc) return\n const img = new Image()\n img.onload = () => {\n imgRef.current = img\n const minDim = Math.min(img.width, img.height)\n const containerSize = 280\n const initialScale = containerSize / minDim\n setScale(initialScale)\n setOffset({\n x: (containerSize - img.width * initialScale) / 2,\n y: (containerSize - img.height * initialScale) / 2,\n })\n }\n img.src = imgSrc\n }, [imgSrc])\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault()\n setDragging(true)\n dragStart.current = {x: e.clientX, y: e.clientY, ox: offset.x, oy: offset.y}\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n },\n [offset]\n )\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent) => {\n if (!dragging) return\n setOffset({\n x: dragStart.current.ox + (e.clientX - dragStart.current.x),\n y: dragStart.current.oy + (e.clientY - dragStart.current.y),\n })\n },\n [dragging]\n )\n\n const handlePointerUp = useCallback(() => {\n setDragging(false)\n }, [])\n\n const handleWheel = useCallback(\n (e: React.WheelEvent) => {\n e.preventDefault()\n const containerSize = 280\n const cx = containerSize / 2\n const cy = containerSize / 2\n\n const delta = e.deltaY > 0 ? 0.95 : 1.05\n const newScale = Math.max(0.1, Math.min(scale * delta, 10))\n\n setOffset({\n x: cx - (cx - offset.x) * (newScale / scale),\n y: cy - (cy - offset.y) * (newScale / scale),\n })\n setScale(newScale)\n },\n [scale, offset]\n )\n\n const handleSlider = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const containerSize = 280\n const cx = containerSize / 2\n const cy = containerSize / 2\n\n const newScale = parseFloat(e.target.value)\n setOffset({\n x: cx - (cx - offset.x) * (newScale / scale),\n y: cy - (cy - offset.y) * (newScale / scale),\n })\n setScale(newScale)\n },\n [scale, offset]\n )\n\n const exportCrop = useCallback(() => {\n const img = imgRef.current\n const canvas = canvasRef.current\n if (!img || !canvas) return\n\n const containerSize = 280\n canvas.width = outputSize\n canvas.height = outputSize\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n const ratio = outputSize / containerSize\n\n if (shape === 'circle') {\n ctx.beginPath()\n ctx.arc(outputSize / 2, outputSize / 2, outputSize / 2, 0, Math.PI * 2)\n ctx.closePath()\n ctx.clip()\n }\n\n ctx.drawImage(\n img,\n offset.x * ratio,\n offset.y * ratio,\n img.width * scale * ratio,\n img.height * scale * ratio\n )\n\n canvas.toBlob(\n (blob) => {\n if (!blob) return\n const ext = file.name.replace(/.*\\./, '')\n const name = file.name.replace(/\\.[^.]+$/, '') + '_cropped.' + ext\n const cropped = new File([blob], name, {type: blob.type})\n onCrop(cropped)\n },\n file.type.startsWith('image/png') ? 'image/png' : 'image/jpeg',\n quality\n )\n }, [file, offset, scale, outputSize, quality, shape, onCrop])\n\n return (\n <div className=\"crop-editor\">\n <div\n ref={containerRef}\n className={`viewport ${shape}`}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onWheel={handleWheel}\n >\n {imgSrc && (\n <img\n src={imgSrc}\n alt=\"\"\n className=\"image\"\n draggable={false}\n style={{\n transform: `translate(${offset.x}px, ${offset.y}px) scale(${scale})`,\n transformOrigin: '0 0',\n }}\n />\n )}\n <div className={`overlay ${shape}`} />\n </div>\n\n <div className=\"zoom\">\n <svg viewBox=\"0 0 16 16\" className=\"zoom-icon\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" fill=\"none\" />\n <path d=\"M11 11L14 14\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M5 7H9M7 5V9\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n <input\n type=\"range\"\n className=\"zoom-slider\"\n min=\"0.1\"\n max=\"5\"\n step=\"0.01\"\n value={scale}\n onChange={handleSlider}\n />\n </div>\n\n <div className=\"actions\">\n <button type=\"button\" className=\"btn cancel\" onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className=\"btn confirm\" onClick={exportCrop}>\n Crop\n </button>\n </div>\n\n <canvas ref={canvasRef} style={{display: 'none'}} />\n </div>\n )\n}\n","import {useState, useCallback, useRef, useMemo, useEffect, forwardRef} from 'react'\nimport type {InputFileProps, InputFileCropOptions} from './InputFile.types'\nimport {CropEditor} from './CropEditor'\nimport {cn} from '../../../utils/cn'\nimport './InputFile.css'\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction fileExtension(name: string): string {\n const dot = name.lastIndexOf('.')\n return dot >= 0 ? name.slice(dot + 1).toUpperCase() : ''\n}\n\nfunction isImage(file: File): boolean {\n return file.type.startsWith('image/')\n}\n\nfunction FileTypeIcon({ext}: {ext: string}) {\n const label = ext || 'FILE'\n return (\n <div className=\"type-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 40 48\" fill=\"none\">\n <path\n d=\"M4 4C4 1.8 5.8 0 8 0H26L36 10V44C36 46.2 34.2 48 32 48H8C5.8 48 4 46.2 4 44V4Z\"\n fill=\"currentColor\"\n opacity=\"0.12\"\n />\n <path\n d=\"M26 0L36 10H30C27.8 10 26 8.2 26 6V0Z\"\n fill=\"currentColor\"\n opacity=\"0.2\"\n />\n </svg>\n <span className=\"type-ext\">{label}</span>\n </div>\n )\n}\n\nexport const InputFile = forwardRef<HTMLDivElement, InputFileProps>(function InputFile(\n {\n accept,\n multiple = false,\n maxSize,\n maxFiles,\n onChange,\n label,\n helperText,\n errorText,\n error = false,\n disabled = false,\n color = 'primary',\n size = 'md',\n preview = true,\n icon,\n placeholder = 'Drop files here or click to browse',\n dropText = 'Drop files here',\n fullWidth = false,\n crop,\n className,\n ...rest\n },\n ref\n) {\n const [dragging, setDragging] = useState(false)\n const [files, setFiles] = useState<File[]>([])\n const [fileError, setFileError] = useState('')\n const [cropFile, setCropFile] = useState<File | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const dragCounter = useRef(0)\n\n const cropOptions: InputFileCropOptions | null = crop\n ? typeof crop === 'boolean'\n ? {shape: 'square', outputSize: 256, quality: 0.92}\n : {shape: crop.shape ?? 'square', outputSize: crop.outputSize ?? 256, quality: crop.quality ?? 0.92}\n : null\n\n const objectUrls = useMemo(() => {\n return files.map((f) => (isImage(f) ? URL.createObjectURL(f) : null))\n }, [files])\n\n useEffect(() => {\n return () => {\n objectUrls.forEach((url) => {\n if (url) URL.revokeObjectURL(url)\n })\n }\n }, [objectUrls])\n\n const processFiles = useCallback(\n (incoming: FileList | File[]) => {\n const list = Array.from(incoming)\n let accepted = list\n\n if (accept) {\n const patterns = accept.split(',').map((s) => s.trim().toLowerCase())\n accepted = accepted.filter((f) => {\n const ext = '.' + f.name.split('.').pop()?.toLowerCase()\n const mime = f.type.toLowerCase()\n return patterns.some(\n (p) =>\n p === ext ||\n p === mime ||\n (p.endsWith('/*') && mime.startsWith(p.slice(0, -1)))\n )\n })\n }\n\n if (maxSize) {\n const oversized = accepted.filter((f) => f.size > maxSize)\n if (oversized.length) {\n setFileError(`Max file size: ${formatSize(maxSize)}`)\n return\n }\n }\n\n if (maxFiles && accepted.length > maxFiles) {\n setFileError(`Max ${maxFiles} file${maxFiles > 1 ? 's' : ''}`)\n return\n }\n\n setFileError('')\n\n if (cropOptions && accepted.length === 1 && isImage(accepted[0])) {\n setCropFile(accepted[0])\n return\n }\n\n setFiles(accepted)\n onChange?.(accepted)\n },\n [accept, maxSize, maxFiles, onChange, cropOptions]\n )\n\n const handleCropDone = useCallback(\n (cropped: File) => {\n setCropFile(null)\n setFiles([cropped])\n onChange?.([cropped])\n },\n [onChange]\n )\n\n const handleCropCancel = useCallback(() => {\n setCropFile(null)\n }, [])\n\n const handleDragEnter = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (disabled) return\n dragCounter.current++\n setDragging(true)\n },\n [disabled]\n )\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n dragCounter.current--\n if (dragCounter.current <= 0) {\n dragCounter.current = 0\n setDragging(false)\n }\n }, [])\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }, [])\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n dragCounter.current = 0\n setDragging(false)\n if (disabled) return\n if (e.dataTransfer.files.length) {\n processFiles(e.dataTransfer.files)\n }\n },\n [disabled, processFiles]\n )\n\n const handleClick = useCallback(() => {\n if (!disabled) inputRef.current?.click()\n }, [disabled])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files?.length) {\n processFiles(e.target.files)\n }\n },\n [processFiles]\n )\n\n const removeFile = useCallback(\n (index: number) => {\n const url = objectUrls[index]\n if (url) URL.revokeObjectURL(url)\n const next = files.filter((_, i) => i !== index)\n setFiles(next)\n onChange?.(next)\n },\n [files, objectUrls, onChange]\n )\n\n const displayError = errorText || fileError\n const hasError = error || !!fileError\n\n return (\n <div\n ref={ref}\n className={cn('input-file', color, size, fullWidth && 'full-width', disabled && 'disabled', className)}\n {...rest}\n >\n {label && <div className=\"label\">{label}</div>}\n\n <div\n className={cn('dropzone', dragging && 'dragging', hasError && 'error')}\n onClick={handleClick}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }}\n aria-label={label || placeholder}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={handleChange}\n tabIndex={-1}\n className=\"hidden-input\"\n />\n\n <div className=\"content\">\n {icon && <div className=\"icon\">{icon}</div>}\n {!icon && (\n <svg className=\"icon-default\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M12 16V4M12 4L8 8M12 4L16 8M4 17V19C4 20.1 4.9 21 6 21H18C19.1 21 20 20.1 20 19V17\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n <div className=\"text\">\n {dragging ? dropText : placeholder}\n </div>\n {accept && (\n <div className=\"accept\">{accept}</div>\n )}\n </div>\n </div>\n\n {cropFile && cropOptions && (\n <CropEditor\n file={cropFile}\n shape={cropOptions.shape!}\n outputSize={cropOptions.outputSize!}\n quality={cropOptions.quality!}\n onCrop={handleCropDone}\n onCancel={handleCropCancel}\n />\n )}\n\n {helperText && !hasError && (\n <div className=\"helper\">{helperText}</div>\n )}\n {hasError && displayError && (\n <div className=\"error-text\">{displayError}</div>\n )}\n\n {preview && files.length > 0 && !cropFile && (\n <div className=\"preview\">\n {files.map((file, i) => (\n <div key={`${file.name}-${i}`} className=\"item\">\n <div className=\"thumb\">\n {objectUrls[i] ? (\n <img\n src={objectUrls[i]!}\n alt={file.name}\n className=\"image\"\n />\n ) : (\n <FileTypeIcon ext={fileExtension(file.name)} />\n )}\n </div>\n <div className=\"info\">\n <span className=\"name\">{file.name}</span>\n <span className=\"size\">{formatSize(file.size)}</span>\n </div>\n <button\n type=\"button\"\n className=\"remove\"\n onClick={(e) => {\n e.stopPropagation()\n removeFile(i)\n }}\n aria-label={`Remove ${file.name}`}\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n})\n","import {useState, useRef, useCallback, useMemo} from 'react'\nimport type {SelectProps, SelectOption} from './Select.types'\nimport {Popover} from '../../primitives/Popover'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useKeyboardNav} from '../../../utils/useKeyboardNav'\nimport './Select.css'\n\n// Render a selectable list with optional search, grouping and multi-select tags.\nexport function Select({\n options,\n value,\n defaultValue,\n onChange,\n multiple = false,\n searchable = false,\n placeholder = 'Select...',\n disabled = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n color,\n fcolor,\n fullWidth = false,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n loading = false,\n clearable = false,\n maxHeight = 300,\n noOptionsText = 'No options',\n renderOption,\n renderValue,\n className,\n style,\n}: SelectProps) {\n const [open, setOpen] = useState(false)\n const [internalValue, setInternalValue] = useState<string | string[]>(defaultValue ?? (multiple ? [] : ''))\n const [search, setSearch] = useState('')\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const currentValue = value !== undefined ? value : internalValue\n const hasError = error || !!errorText\n\n // Normalize the public value into a string array for rendering and selection logic.\n const selectedValues = useMemo(() => {\n if (Array.isArray(currentValue)) return currentValue\n return currentValue ? [currentValue] : []\n }, [currentValue])\n\n const selectedOptions = useMemo(\n () => options.filter((o) => selectedValues.includes(o.value)),\n [options, selectedValues]\n )\n\n // Filter options locally when the searchable mode is active.\n const filteredOptions = useMemo(() => {\n if (!searchable || !search) return options\n const lower = search.toLowerCase()\n return options.filter((o) => o.label.toLowerCase().includes(lower))\n }, [options, searchable, search])\n\n // Group options\n // Preserve group headers without changing the flat keyboard navigation index map.\n const groupedOptions = useMemo(() => {\n const groups = new Map<string, SelectOption[]>()\n for (const opt of filteredOptions) {\n const key = opt.group ?? ''\n if (!groups.has(key)) groups.set(key, [])\n groups.get(key)!.push(opt)\n }\n return groups\n }, [filteredOptions])\n\n const flatFiltered = filteredOptions\n\n // Toggle or replace the current selection depending on the mode.\n const handleSelect = useCallback(\n (index: number) => {\n const opt = flatFiltered[index]\n if (!opt || opt.disabled) return\n\n if (multiple) {\n const arr = Array.isArray(currentValue) ? currentValue : []\n const newVal = arr.includes(opt.value) ? arr.filter((v) => v !== opt.value) : [...arr, opt.value]\n if (value === undefined) setInternalValue(newVal)\n onChange?.(newVal)\n } else {\n if (value === undefined) setInternalValue(opt.value)\n onChange?.(opt.value)\n setOpen(false)\n setSearch('')\n }\n },\n [flatFiltered, multiple, currentValue, value, onChange]\n )\n\n const {activeIndex, setActiveIndex, resetIndex, onKeyDown} = useKeyboardNav({\n itemCount: flatFiltered.length,\n onSelect: handleSelect,\n onClose: () => {\n setOpen(false)\n setSearch('')\n },\n isOpen: open,\n })\n\n // Open the popover and reset keyboard navigation when the trigger is used.\n const handleTriggerClick = useCallback(() => {\n if (disabled) return\n setOpen((v) => !v)\n resetIndex()\n }, [disabled, resetIndex])\n\n // Reset the current selection without closing the outer field wrapper.\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n const empty = multiple ? [] : ''\n if (value === undefined) setInternalValue(empty)\n onChange?.(empty)\n },\n [multiple, value, onChange]\n )\n\n // Render tags, labels or the placeholder based on the current selection state.\n const displayValue = useMemo(() => {\n if (renderValue && selectedOptions.length > 0) {\n return renderValue(multiple ? selectedOptions : selectedOptions[0])\n }\n if (multiple && selectedOptions.length > 0) {\n return (\n <span className=\"tags\">\n {selectedOptions.map((o) => (\n <span key={o.value} className=\"m-tag\">\n {o.label}\n </span>\n ))}\n </span>\n )\n }\n if (!multiple && selectedOptions.length > 0) {\n return selectedOptions[0].label\n }\n return <span className=\"placeholder\">{placeholder}</span>\n }, [selectedOptions, multiple, renderValue, placeholder])\n\n return (\n <div\n className={cn(\n 'select',\n color && `color-${color}`,\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={triggerRef}\n className={cn('trigger', variant, size, open && 'focused', hasError && 'error', disabled && 'disabled')}\n onClick={handleTriggerClick}\n onKeyDown={onKeyDown as unknown as React.KeyboardEventHandler}\n tabIndex={disabled ? -1 : 0}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-invalid={hasError || undefined}\n id={id}\n >\n <span className=\"value\">{displayValue}</span>\n\n {loading && <span className=\"spinner\" />}\n\n {clearable && selectedValues.length > 0 && !loading && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear selection\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n\n <span className={cn('arrow', open && 'open')} aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\">\n <path\n d=\"M4 6L8 10L12 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </div>\n\n {/* Hidden input for form submission */}\n {name && (\n <input\n type=\"hidden\"\n name={name}\n value={Array.isArray(currentValue) ? currentValue.join(',') : currentValue}\n />\n )}\n\n <Popover\n className={'select-popover'}\n open={open}\n anchorRef={triggerRef}\n onClose={() => {\n setOpen(false)\n setSearch('')\n }}\n matchWidth\n placement=\"bottom-start\"\n >\n <div style={{maxHeight}} className=\"dropdown\">\n {searchable && (\n <div className=\"search-box\">\n <input\n type=\"text\"\n className=\"search-input\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value)\n setActiveIndex(0)\n }}\n onKeyDown={onKeyDown as unknown as React.KeyboardEventHandler}\n autoFocus\n />\n </div>\n )}\n\n {flatFiltered.length === 0 ? (\n <div className=\"no-options\">{noOptionsText}</div>\n ) : (\n <div className=\"options-list\" role=\"listbox\">\n {[...groupedOptions.entries()].map(([group, opts]) => (\n <div key={group}>\n {group && <div className=\"group-header\">{group}</div>}\n {opts.map((opt) => {\n const flatIndex = flatFiltered.indexOf(opt)\n const isActive = flatIndex === activeIndex\n const isSelected = selectedValues.includes(opt.value)\n return (\n <div\n key={opt.value}\n className={cn(\n 'option',\n isActive && 'active',\n isSelected && 'selected',\n opt.disabled && 'disabled'\n )}\n onClick={() => !opt.disabled && handleSelect(flatIndex)}\n onMouseEnter={() => setActiveIndex(flatIndex)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={opt.disabled}\n >\n {multiple && (\n <span className={cn('checkbox', isSelected && 'checked')}>\n {isSelected && (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M3.5 8L6.5 11L12.5 5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n )}\n {renderOption ? renderOption(opt, isActive, isSelected) : opt.label}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n </Popover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n","import {useState, useRef, useCallback, useMemo} from 'react'\nimport type {AutocompleteProps} from './Autocomplete.types'\nimport {Popover} from '../../primitives/Popover'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {useKeyboardNav} from '../../../utils/useKeyboardNav'\nimport {useDebouncedCallback} from '../../../utils/useDebounce'\nimport './Autocomplete.css'\n\n// Resolve labels for primitive string options without extra configuration.\nfunction defaultGetLabel<T>(option: T): string {\n if (typeof option === 'string') return option\n return String(option)\n}\n\n// Resolve values for primitive string options without extra configuration.\nfunction defaultGetValue<T>(option: T): string {\n if (typeof option === 'string') return option\n return String(option)\n}\n\n// Apply a basic case-insensitive filter when the caller does not provide one.\nfunction defaultFilter<T>(options: T[], input: string, getLabel: (o: T) => string): T[] {\n if (!input) return options\n const lower = input.toLowerCase()\n return options.filter((o) => getLabel(o).toLowerCase().includes(lower))\n}\n\n// Render a searchable suggestion list with optional free-solo and multi-tag behavior.\nexport function Autocomplete<T = string>({\n options,\n value,\n onChange,\n getOptionLabel = defaultGetLabel,\n getOptionValue = defaultGetValue,\n filterOptions,\n multiple = false,\n freeSolo = false,\n debounceMs = 0,\n onInputChange,\n loading = false,\n loadingText = 'Loading...',\n noOptionsText = 'No options',\n placeholder = 'Type to search...',\n disabled = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n color,\n fcolor,\n fullWidth = false,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n clearable = false,\n maxHeight = 300,\n renderOption,\n renderTags,\n className,\n style,\n}: AutocompleteProps<T>) {\n const [open, setOpen] = useState(false)\n const [inputValue, setInputValue] = useState('')\n const wrapperRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const hasError = error || !!errorText\n\n // Normalize the public value into an array for tag and selection rendering.\n const selectedValues = useMemo(() => {\n if (value == null) return []\n return Array.isArray(value) ? value.filter((item) => item != null) : [value]\n }, [value])\n\n // Filter suggestions locally unless the caller owns that logic.\n const filtered = useMemo(() => {\n if (filterOptions) return filterOptions(options, inputValue)\n return defaultFilter(options, inputValue, getOptionLabel)\n }, [options, inputValue, filterOptions, getOptionLabel])\n\n const debouncedInputChange = useDebouncedCallback((val: string) => onInputChange?.(val), debounceMs)\n\n // Update the visible query and optionally notify async search logic.\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n debouncedInputChange(e.target.value)\n if (!open) setOpen(true)\n },\n [open, debouncedInputChange]\n )\n\n // Apply a selected option to single or multiple value modes.\n const handleSelect = useCallback(\n (index: number) => {\n const opt = filtered[index]\n if (!opt) return\n\n if (multiple) {\n const arr = [...selectedValues]\n const val = getOptionValue(opt)\n const existIdx = arr.findIndex((v) => getOptionValue(v) === val)\n if (existIdx >= 0) {\n arr.splice(existIdx, 1)\n } else {\n arr.push(opt)\n }\n onChange?.(arr)\n setInputValue('')\n inputRef.current?.focus()\n } else {\n onChange?.(opt)\n setInputValue(getOptionLabel(opt))\n setOpen(false)\n }\n },\n [filtered, multiple, selectedValues, getOptionValue, getOptionLabel, onChange]\n )\n\n // Remove a selected tag by index in multiple mode.\n const handleRemoveTag = useCallback(\n (index: number) => {\n const arr = [...selectedValues]\n arr.splice(index, 1)\n onChange?.(multiple ? arr : (arr[0] ?? ('' as unknown as T)))\n },\n [selectedValues, onChange, multiple]\n )\n\n const {\n activeIndex,\n setActiveIndex,\n resetIndex,\n onKeyDown: navKeyDown,\n } = useKeyboardNav({\n itemCount: filtered.length,\n onSelect: handleSelect,\n onClose: () => setOpen(false),\n isOpen: open,\n })\n\n // Combine free-solo submission, tag removal and list navigation.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && freeSolo && activeIndex < 0 && inputValue) {\n onChange?.(inputValue as unknown as T)\n setOpen(false)\n return\n }\n // Backspace removes last tag in multiple\n if (e.key === 'Backspace' && multiple && !inputValue && selectedValues.length > 0) {\n handleRemoveTag(selectedValues.length - 1)\n return\n }\n navKeyDown(e as unknown as React.KeyboardEvent<Element>)\n },\n [freeSolo, activeIndex, inputValue, multiple, selectedValues, onChange, navKeyDown, handleRemoveTag]\n )\n\n // Clear the input query and the selected value(s) together.\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n setInputValue('')\n onChange?.(multiple ? ([] as unknown as T) : ('' as unknown as T))\n inputRef.current?.focus()\n },\n [multiple, onChange]\n )\n\n return (\n <div\n className={cn(\n 'autocomplete',\n color && `color-${color}`,\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={wrapperRef}\n className={cn(\n 'input-wrapper',\n variant,\n size,\n open && 'focused',\n hasError && 'error',\n disabled && 'disabled'\n )}\n onClick={() => inputRef.current?.focus()}\n >\n {multiple &&\n selectedValues.length > 0 &&\n (renderTags ? (\n renderTags(selectedValues, handleRemoveTag)\n ) : (\n <span className=\"tags\">\n {selectedValues.map((v, i) => (\n <span key={getOptionValue(v)} className=\"m-tag\">\n {getOptionLabel(v)}\n <button\n type=\"button\"\n className=\"m-tag-remove\"\n onClick={(e) => {\n e.stopPropagation()\n handleRemoveTag(i)\n }}\n tabIndex={-1}\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </span>\n ))}\n </span>\n ))}\n\n <input\n ref={inputRef}\n type=\"text\"\n className=\"input\"\n value={inputValue}\n onChange={handleInputChange}\n onFocus={() => {\n setOpen(true)\n resetIndex()\n }}\n onKeyDown={handleKeyDown}\n placeholder={selectedValues.length > 0 ? '' : placeholder}\n disabled={disabled}\n id={id}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-invalid={hasError || undefined}\n autoComplete=\"off\"\n />\n\n {loading && <span className=\"spinner\" />}\n\n {clearable && (selectedValues.length > 0 || inputValue) && !loading && !disabled && (\n <button type=\"button\" className=\"clear-btn\" onClick={handleClear} tabIndex={-1}>\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {name && <input type=\"hidden\" name={name} value={selectedValues.map(getOptionValue).join(',')} />}\n\n <Popover\n className={cn('autocomplete-popover', color && `color-${color}`)}\n open={open && (filtered.length > 0 || loading)}\n anchorRef={wrapperRef}\n onClose={() => setOpen(false)}\n matchWidth\n placement=\"bottom-start\"\n >\n <div style={{maxHeight}} className=\"dropdown\">\n {loading ? (\n <div className=\"loading-msg\">{loadingText}</div>\n ) : filtered.length === 0 ? (\n <div className=\"no-options\">{noOptionsText}</div>\n ) : (\n <div className=\"options-list\" role=\"listbox\">\n {filtered.map((opt, i) => {\n const isActive = i === activeIndex\n const isSelected = selectedValues.some((v) => getOptionValue(v) === getOptionValue(opt))\n return (\n <div\n key={getOptionValue(opt)}\n className={cn('option', isActive && 'active', isSelected && 'selected')}\n onClick={() => handleSelect(i)}\n onMouseEnter={() => setActiveIndex(i)}\n role=\"option\"\n aria-selected={isSelected}\n >\n {renderOption ? renderOption(opt, isActive) : getOptionLabel(opt)}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </Popover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n","import {useState, useRef, useCallback, useMemo, useEffect} from 'react'\nimport type {DatePickerProps} from './DatePicker.types'\nimport {Popover} from '../../primitives/Popover'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {\n formatDate,\n parseDate,\n daysInMonth,\n firstDayOfMonth,\n isSameDay,\n isDateInRange,\n getDayNames,\n getMonthNames,\n addMonths,\n stripTime,\n} from '../../../utils/dateUtils'\nimport './DatePicker.css'\n\n// Normalize external date inputs into valid Date objects or null.\nfunction toDate(val: Date | string | undefined): Date | null {\n if (!val) return null\n if (val instanceof Date) return val\n const date = new Date(val)\n return isNaN(date.getTime()) ? null : date\n}\n\nconst ChevronLeftIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M9.5 3.5L5 8L9.5 12.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\nconst ChevronRightIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M6.5 3.5L11 8L6.5 12.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\nconst ClearIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 4L12 12M12 4L4 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" />\n </svg>\n)\n\n// Render a date input with calendar navigation, parsing and optional inline mode.\nexport function DatePicker({\n value,\n defaultValue,\n onChange,\n format = 'dd.MM.yyyy',\n locale = 'pl',\n min,\n max,\n disabledDates,\n placeholder,\n disabled = false,\n readOnly = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n fcolor,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n clearable = false,\n inline = false,\n showTodayButton = true,\n firstDayOfWeek = 1,\n fullWidth = false,\n className,\n style,\n}: DatePickerProps) {\n const [open, setOpen] = useState(false)\n const [internalDate, setInternalDate] = useState<Date | null>(toDate(defaultValue))\n const [inputText, setInputText] = useState('')\n const selectedDate = toDate(value) ?? internalDate\n const [viewDate, setViewDate] = useState(() => {\n const date = selectedDate ?? new Date()\n return new Date(date.getFullYear(), date.getMonth(), 1)\n })\n const [viewMode, setViewMode] = useState<'days' | 'months'>('days')\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const minDate = toDate(min)\n const maxDate = toDate(max)\n const hasError = error || !!errorText\n\n useEffect(() => {\n if (!selectedDate) return\n setViewDate(new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1))\n }, [selectedDate])\n\n const displayText = useMemo(() => {\n if (inputText) return inputText\n return selectedDate ? formatDate(selectedDate, format) : ''\n }, [selectedDate, format, inputText])\n\n const dayNames = getDayNames(locale)\n const monthNames = getMonthNames(locale)\n\n // Centralize date disabling so all calendar paths share the same logic.\n const isDisabled = useCallback(\n (date: Date): boolean => {\n if (!isDateInRange(date, minDate, maxDate)) return true\n if (Array.isArray(disabledDates)) {\n return disabledDates.some((disabledDate) => isSameDay(disabledDate, date))\n }\n if (typeof disabledDates === 'function') {\n return disabledDates(date)\n }\n return false\n },\n [minDate, maxDate, disabledDates]\n )\n\n // Apply the selected date and keep the calendar view aligned with it.\n const handleSelectDate = useCallback(\n (date: Date) => {\n if (isDisabled(date)) return\n if (value === undefined) setInternalDate(date)\n setInputText('')\n setViewDate(new Date(date.getFullYear(), date.getMonth(), 1))\n onChange?.(date)\n if (!inline) setOpen(false)\n },\n [inline, isDisabled, onChange, value]\n )\n\n const handleInputChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setInputText(event.target.value)\n }, [])\n\n // Parse manual input and commit it when it resolves to an allowed date.\n const handleInputBlur = useCallback(() => {\n if (!inputText) return\n const parsed = parseDate(inputText, format)\n if (parsed && !isDisabled(parsed)) {\n handleSelectDate(parsed)\n }\n setInputText('')\n }, [format, handleSelectDate, inputText, isDisabled])\n\n // Clear the current selection without toggling the popover state first.\n const handleClear = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation()\n if (value === undefined) setInternalDate(null)\n setInputText('')\n onChange?.(null)\n },\n [onChange, value]\n )\n\n // Jump directly to today's date through the same selection path.\n const handleToday = useCallback(() => {\n const today = stripTime(new Date())\n handleSelectDate(today)\n }, [handleSelectDate])\n\n // Build the six-week calendar grid including previous and next month fillers.\n const calendarDays = useMemo(() => {\n const year = viewDate.getFullYear()\n const month = viewDate.getMonth()\n const totalDays = daysInMonth(year, month)\n let startDay = firstDayOfMonth(year, month)\n\n if (firstDayOfWeek === 1) {\n startDay = startDay === 0 ? 6 : startDay - 1\n }\n\n const days: Array<{date: Date; currentMonth: boolean}> = []\n\n const prevMonth = month === 0 ? 11 : month - 1\n const prevYear = month === 0 ? year - 1 : year\n const prevDays = daysInMonth(prevYear, prevMonth)\n for (let i = startDay - 1; i >= 0; i--) {\n days.push({date: new Date(prevYear, prevMonth, prevDays - i), currentMonth: false})\n }\n\n for (let day = 1; day <= totalDays; day++) {\n days.push({date: new Date(year, month, day), currentMonth: true})\n }\n\n const remaining = 42 - days.length\n const nextMonth = month === 11 ? 0 : month + 1\n const nextYear = month === 11 ? year + 1 : year\n for (let day = 1; day <= remaining; day++) {\n days.push({date: new Date(nextYear, nextMonth, day), currentMonth: false})\n }\n\n return days\n }, [firstDayOfWeek, viewDate])\n\n const today = stripTime(new Date())\n\n // Render the day or month view depending on the current picker mode.\n const renderCalendar = () => (\n <div className=\"calendar\">\n <div className=\"calendar-header\">\n <button\n type=\"button\"\n className=\"nav-btn\"\n onClick={() => setViewDate(addMonths(viewDate, -1))}\n aria-label=\"Previous month\"\n >\n <ChevronLeftIcon />\n </button>\n <button\n type=\"button\"\n className=\"header-title\"\n onClick={() => setViewMode((current) => (current === 'days' ? 'months' : 'days'))}\n >\n {monthNames[viewDate.getMonth()]} {viewDate.getFullYear()}\n </button>\n <button\n type=\"button\"\n className=\"nav-btn\"\n onClick={() => setViewDate(addMonths(viewDate, 1))}\n aria-label=\"Next month\"\n >\n <ChevronRightIcon />\n </button>\n </div>\n\n {viewMode === 'days' ? (\n <>\n <div className=\"day-names\">\n {dayNames.map((dayName) => (\n <span key={dayName} className=\"day-name\">\n {dayName}\n </span>\n ))}\n </div>\n\n <div className=\"day-grid\">\n {calendarDays.map(({date, currentMonth}, index) => {\n const isSelected = selectedDate ? isSameDay(date, selectedDate) : false\n const isToday = isSameDay(date, today)\n const disabledDay = isDisabled(date)\n\n return (\n <button\n key={`${date.toISOString()}-${index}`}\n type=\"button\"\n className={cn(\n 'day',\n !currentMonth && 'other-month',\n isToday && 'today',\n isSelected && 'selected',\n disabledDay && 'disabled'\n )}\n onClick={() => handleSelectDate(date)}\n disabled={disabledDay}\n tabIndex={-1}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n </>\n ) : (\n <div className=\"month-grid\">\n {monthNames.map((monthName, index) => (\n <button\n key={monthName}\n type=\"button\"\n className={cn('month-cell', viewDate.getMonth() === index && 'selected')}\n onClick={() => {\n setViewDate(new Date(viewDate.getFullYear(), index, 1))\n setViewMode('days')\n }}\n >\n {monthName.slice(0, 3)}\n </button>\n ))}\n </div>\n )}\n\n {showTodayButton && (\n <div className=\"footer\">\n <button type=\"button\" className=\"today-btn\" onClick={handleToday}>\n Today\n </button>\n </div>\n )}\n </div>\n )\n\n const calendarIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"1\" y=\"3\" width=\"14\" height=\"12\" rx=\"2\" />\n <line x1=\"1\" y1=\"7\" x2=\"15\" y2=\"7\" />\n <line x1=\"5\" y1=\"1\" x2=\"5\" y2=\"4\" />\n <line x1=\"11\" y1=\"1\" x2=\"11\" y2=\"4\" />\n </svg>\n )\n\n if (inline) {\n return (\n <div\n className={cn(\n 'date-picker',\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n style={style}\n >\n {label && <label className={cn('label', hasError && 'error', required && 'required')}>{label}</label>}\n {renderCalendar()}\n </div>\n )\n }\n\n return (\n <div\n className={cn('date-picker', ...getAppearanceClassNames({fcolor}), fullWidth && 'full-width', className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={triggerRef}\n className={cn('trigger', variant, size, open && 'focused', hasError && 'error', disabled && 'disabled')}\n onClick={() => !disabled && !readOnly && setOpen(true)}\n >\n <span className=\"icon\">{calendarIcon}</span>\n <input\n type=\"text\"\n className=\"input\"\n value={displayText}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n placeholder={placeholder ?? format.toLowerCase()}\n disabled={disabled}\n readOnly={readOnly}\n id={id}\n aria-invalid={hasError || undefined}\n />\n {clearable && selectedDate && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear date\"\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {name && selectedDate && (\n <input type=\"hidden\" name={name} value={selectedDate.toISOString().split('T')[0]} />\n )}\n\n <Popover\n className={'date-picker-popover'}\n open={open}\n anchorRef={triggerRef}\n onClose={() => setOpen(false)}\n placement=\"bottom-start\"\n >\n {renderCalendar()}\n </Popover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {Popover} from '../../primitives/Popover'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {\n addMonths,\n daysInMonth,\n firstDayOfMonth,\n formatDate,\n getDayNames,\n getMonthNames,\n isDateInRange,\n isSameDay,\n stripTime,\n} from '../../../utils/dateUtils'\nimport type {DateRangePickerProps, DateRangePreset} from './DateRangePicker.types'\nimport './DateRangePicker.css'\n\nfunction toDate(value: Date | string | null | undefined): Date | null {\n if (!value) return null\n if (value instanceof Date) return stripTime(value)\n const date = new Date(value)\n return isNaN(date.getTime()) ? null : stripTime(date)\n}\n\nfunction sortRange(start: Date, end: Date) {\n return start.getTime() <= end.getTime() ? {start, end} : {start: end, end: start}\n}\n\nfunction isBetween(date: Date, start: Date | null, end: Date | null) {\n if (!start || !end) return false\n const time = date.getTime()\n return time > start.getTime() && time < end.getTime()\n}\n\nfunction formatRangeLabel(start: Date | null, end: Date | null, format: string) {\n if (start && end) {\n return `${formatDate(start, format)} - ${formatDate(end, format)}`\n }\n\n if (start) {\n return `${formatDate(start, format)} - ...`\n }\n\n return ''\n}\n\nfunction startOfMonth(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), 1)\n}\n\nfunction endOfMonth(date: Date) {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0)\n}\n\nfunction daysAgo(days: number): Date {\n const date = stripTime(new Date())\n date.setDate(date.getDate() - (days - 1))\n return date\n}\n\nfunction monthsAgo(months: number): Date {\n const today = stripTime(new Date())\n return new Date(today.getFullYear(), today.getMonth() - months, today.getDate())\n}\n\nfunction getDefaultPresets(): DateRangePreset[] {\n const today = stripTime(new Date())\n const previousMonthDate = new Date(today.getFullYear(), today.getMonth() - 1, 1)\n\n return [\n {label: 'Today', value: {start: today, end: today}},\n {label: '2 days', value: {start: daysAgo(2), end: today}},\n {label: '3 days', value: {start: daysAgo(3), end: today}},\n {label: '7 days', value: {start: daysAgo(7), end: today}},\n {label: '14 days', value: {start: daysAgo(14), end: today}},\n {label: '31 days', value: {start: daysAgo(31), end: today}},\n {label: 'This month', value: {start: startOfMonth(today), end: endOfMonth(today)}},\n {label: 'Previous month', value: {start: startOfMonth(previousMonthDate), end: endOfMonth(previousMonthDate)}},\n {label: '2 months', value: {start: monthsAgo(2), end: today}},\n {label: '3 months', value: {start: monthsAgo(3), end: today}},\n {label: '6 months', value: {start: monthsAgo(6), end: today}},\n {label: '1 year', value: {start: monthsAgo(12), end: today}},\n ]\n}\n\nconst CalendarIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"1\" y=\"3\" width=\"14\" height=\"12\" rx=\"2\" />\n <line x1=\"1\" y1=\"7\" x2=\"15\" y2=\"7\" />\n <line x1=\"5\" y1=\"1\" x2=\"5\" y2=\"4\" />\n <line x1=\"11\" y1=\"1\" x2=\"11\" y2=\"4\" />\n </svg>\n)\n\nconst ChevronLeftIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M9.5 3.5L5 8L9.5 12.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\nconst ChevronRightIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M6.5 3.5L11 8L6.5 12.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\nconst ClearIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 4L12 12M12 4L4 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" />\n </svg>\n)\n\nfunction buildCalendarDays(viewDate: Date, firstDayOfWeek: 0 | 1) {\n const year = viewDate.getFullYear()\n const month = viewDate.getMonth()\n const totalDays = daysInMonth(year, month)\n let startDay = firstDayOfMonth(year, month)\n\n if (firstDayOfWeek === 1) {\n startDay = startDay === 0 ? 6 : startDay - 1\n }\n\n const days = [] as Array<{date: Date; currentMonth: boolean}>\n\n const previousMonth = month === 0 ? 11 : month - 1\n const previousYear = month === 0 ? year - 1 : year\n const previousMonthDays = daysInMonth(previousYear, previousMonth)\n\n for (let index = startDay - 1; index >= 0; index -= 1) {\n days.push({date: new Date(previousYear, previousMonth, previousMonthDays - index), currentMonth: false})\n }\n\n for (let day = 1; day <= totalDays; day += 1) {\n days.push({date: new Date(year, month, day), currentMonth: true})\n }\n\n const remaining = 42 - days.length\n const nextMonth = month === 11 ? 0 : month + 1\n const nextYear = month === 11 ? year + 1 : year\n\n for (let day = 1; day <= remaining; day += 1) {\n days.push({date: new Date(nextYear, nextMonth, day), currentMonth: false})\n }\n\n return days\n}\n\n// Render a single control for start and end date selection inside one calendar popover.\nexport function DateRangePicker({\n value,\n defaultValue,\n onChange,\n format = 'dd.MM.yyyy',\n locale = 'pl',\n min,\n max,\n disabledDates,\n placeholder = 'Select date range...',\n disabled = false,\n readOnly = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n fcolor,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n clearable = false,\n inline = false,\n showTodayButton = true,\n presets = false,\n presetsSidebar = false,\n firstDayOfWeek = 1,\n fullWidth = false,\n allowSameDay = true,\n className,\n style,\n}: DateRangePickerProps) {\n const controlledRange = value\n ? {\n start: toDate(value.start),\n end: toDate(value.end),\n }\n : null\n const [internalRange, setInternalRange] = useState(() => ({\n start: toDate(defaultValue?.start),\n end: toDate(defaultValue?.end),\n }))\n const [hoveredDate, setHoveredDate] = useState<Date | null>(null)\n const [open, setOpen] = useState(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const selectedRange = controlledRange ?? internalRange\n const startDate = selectedRange.start\n const endDate = selectedRange.end\n const minDate = toDate(min)\n const maxDate = toDate(max)\n const hasError = error || !!errorText\n const dayNames = getDayNames(locale)\n const monthNames = getMonthNames(locale)\n const availablePresets = useMemo(() => {\n if (presets === true || (presetsSidebar && !presets)) {\n return getDefaultPresets()\n }\n\n if (Array.isArray(presets)) {\n return presets\n }\n\n return []\n }, [presets, presetsSidebar])\n\n const [viewDate, setViewDate] = useState(() => {\n const baseDate = startDate ?? new Date()\n return new Date(baseDate.getFullYear(), baseDate.getMonth(), 1)\n })\n\n useEffect(() => {\n if (!startDate) return\n setViewDate(new Date(startDate.getFullYear(), startDate.getMonth(), 1))\n }, [startDate])\n\n const isDisabled = useCallback(\n (date: Date): boolean => {\n if (!isDateInRange(date, minDate, maxDate)) return true\n if (Array.isArray(disabledDates)) {\n return disabledDates.some((disabledDate) => isSameDay(disabledDate, date))\n }\n if (typeof disabledDates === 'function') {\n return disabledDates(date)\n }\n return false\n },\n [disabledDates, maxDate, minDate]\n )\n\n const commitRange = useCallback(\n (nextRange: {start: Date | null; end: Date | null}) => {\n if (value === undefined) {\n setInternalRange(nextRange)\n }\n onChange?.(nextRange)\n },\n [onChange, value]\n )\n\n const handleDayClick = useCallback(\n (date: Date) => {\n if (isDisabled(date)) return\n\n if (!startDate || (startDate && endDate)) {\n commitRange({start: date, end: null})\n setHoveredDate(null)\n return\n }\n\n if (!allowSameDay && isSameDay(date, startDate)) {\n return\n }\n\n const orderedRange = sortRange(startDate, date)\n commitRange(orderedRange)\n setHoveredDate(null)\n\n if (!inline) {\n setOpen(false)\n }\n },\n [allowSameDay, commitRange, endDate, inline, isDisabled, startDate]\n )\n\n const handleClear = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation()\n commitRange({start: null, end: null})\n setHoveredDate(null)\n },\n [commitRange]\n )\n\n const handleToday = useCallback(() => {\n const today = stripTime(new Date())\n if (isDisabled(today)) return\n commitRange({start: today, end: today})\n setViewDate(new Date(today.getFullYear(), today.getMonth(), 1))\n setHoveredDate(null)\n if (!inline) {\n setOpen(false)\n }\n }, [commitRange, inline, isDisabled])\n\n const handlePresetClick = useCallback(\n (preset: DateRangePreset) => {\n const start = toDate(preset.value.start)\n const end = toDate(preset.value.end)\n\n if (!start || !end) {\n return\n }\n\n const orderedRange = sortRange(start, end)\n\n if (isDisabled(orderedRange.start) || isDisabled(orderedRange.end)) {\n return\n }\n\n commitRange(orderedRange)\n setViewDate(new Date(orderedRange.start.getFullYear(), orderedRange.start.getMonth(), 1))\n setHoveredDate(null)\n\n if (!inline) {\n setOpen(false)\n }\n },\n [commitRange, inline, isDisabled]\n )\n\n const previewEnd = startDate && !endDate ? hoveredDate : null\n const firstMonth = viewDate\n const secondMonth = addMonths(viewDate, 1)\n const today = stripTime(new Date())\n\n const displayValue = useMemo(() => formatRangeLabel(startDate, endDate, format), [endDate, format, startDate])\n\n const calendarMonths = useMemo(\n () =>\n [firstMonth, secondMonth].map((monthDate) => ({\n monthDate,\n days: buildCalendarDays(monthDate, firstDayOfWeek),\n })),\n [firstDayOfWeek, firstMonth, secondMonth]\n )\n\n const summaryText =\n startDate && endDate\n ? `${formatDate(startDate, format)} - ${formatDate(endDate, format)}`\n : startDate\n ? `${formatDate(startDate, format)} - ...`\n : placeholder\n\n const showSidebar = presetsSidebar && availablePresets.length > 0\n const showInlinePresets = !presetsSidebar && availablePresets.length > 0\n\n const renderPresetsSidebar = () => (\n <div className=\"presets-sidebar\">\n {availablePresets.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n className=\"preset-sidebar-btn\"\n onClick={() => handlePresetClick(preset)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )\n\n const renderCalendarContent = () => (\n <div className=\"calendar-body\">\n <div className=\"calendar-top\">\n <div className=\"calendar-caption\">\n <span className=\"caption-title\">\n {monthNames[firstMonth.getMonth()]} {firstMonth.getFullYear()}\n </span>\n <span className=\"caption-subtitle\">Select start and end dates in one panel.</span>\n </div>\n <div className=\"nav-actions\">\n <button\n type=\"button\"\n className=\"nav-btn\"\n onClick={() => setViewDate(addMonths(viewDate, -1))}\n aria-label=\"Previous month\"\n >\n <ChevronLeftIcon />\n </button>\n <button\n type=\"button\"\n className=\"nav-btn\"\n onClick={() => setViewDate(addMonths(viewDate, 1))}\n aria-label=\"Next month\"\n >\n <ChevronRightIcon />\n </button>\n </div>\n </div>\n\n {showInlinePresets && (\n <div className=\"presets\">\n {availablePresets.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n className=\"preset-btn\"\n onClick={() => handlePresetClick(preset)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"months\">\n {calendarMonths.map(({monthDate, days}) => (\n <div key={monthDate.toISOString()} className=\"month-panel\">\n <div className=\"month-title\">\n {monthNames[monthDate.getMonth()]} {monthDate.getFullYear()}\n </div>\n <div className=\"day-names\">\n {dayNames.map((dayName) => (\n <span key={`${monthDate.toISOString()}-${dayName}`} className=\"day-name\">\n {dayName}\n </span>\n ))}\n </div>\n <div className=\"day-grid\">\n {days.map(({date, currentMonth}, index) => {\n const disabledDay = isDisabled(date)\n const selectedStart = startDate ? isSameDay(date, startDate) : false\n const selectedEnd = endDate ? isSameDay(date, endDate) : false\n const inRange = isBetween(date, startDate, endDate)\n const previewRangeData =\n !endDate && startDate && previewEnd ? sortRange(startDate, previewEnd) : null\n const previewRange = previewRangeData\n ? isBetween(date, previewRangeData.start, previewRangeData.end)\n : false\n const previewEdge = previewRangeData\n ? isSameDay(date, previewRangeData.start) || isSameDay(date, previewRangeData.end)\n : false\n\n return (\n <button\n key={`${monthDate.toISOString()}-${index}`}\n type=\"button\"\n className={cn(\n 'day',\n !currentMonth && 'other-month',\n isSameDay(date, today) && 'today',\n selectedStart && 'range-start selected',\n selectedEnd && 'range-end selected',\n inRange && 'in-range',\n previewRange && !previewEdge && 'preview-range',\n disabledDay && 'disabled'\n )}\n onClick={() => handleDayClick(date)}\n onMouseEnter={() => startDate && !endDate && setHoveredDate(date)}\n onFocus={() => startDate && !endDate && setHoveredDate(date)}\n disabled={disabledDay}\n tabIndex={-1}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"footer\">\n <span className=\"summary\">{summaryText}</span>\n <div className=\"footer-actions\">\n {clearable && (startDate || endDate) && (\n <button\n type=\"button\"\n className=\"footer-btn\"\n onClick={(event) => {\n event.preventDefault()\n commitRange({start: null, end: null})\n setHoveredDate(null)\n }}\n >\n Clear\n </button>\n )}\n {showTodayButton && (\n <button type=\"button\" className=\"footer-btn\" onClick={handleToday}>\n Today\n </button>\n )}\n </div>\n </div>\n </div>\n )\n\n const renderCalendar = () => (\n <div className={cn('date-range-calendar', showSidebar && 'with-sidebar')}>\n {showSidebar && renderPresetsSidebar()}\n {renderCalendarContent()}\n </div>\n )\n\n if (inline) {\n return (\n <div\n className={cn(\n 'date-range-picker',\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n style={style}\n >\n {label && <label className={cn('label', hasError && 'error', required && 'required')}>{label}</label>}\n {renderCalendar()}\n </div>\n )\n }\n\n return (\n <div\n className={cn(\n 'date-range-picker',\n ...getAppearanceClassNames({fcolor}),\n fullWidth && 'full-width',\n className\n )}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={triggerRef}\n className={cn('trigger', variant, size, open && 'focused', hasError && 'error', disabled && 'disabled')}\n onClick={() => !disabled && !readOnly && setOpen(true)}\n >\n <span className=\"icon\">\n <CalendarIcon />\n </span>\n <input\n type=\"text\"\n className=\"input\"\n value={displayValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly\n id={id}\n aria-invalid={hasError || undefined}\n />\n {clearable && (startDate || endDate) && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear date range\"\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {name && startDate && endDate && (\n <input\n type=\"hidden\"\n name={name}\n value={`${startDate.toISOString().split('T')[0]}:${endDate.toISOString().split('T')[0]}`}\n />\n )}\n\n <Popover\n className={'date-range-picker-popover'}\n open={open}\n anchorRef={triggerRef}\n onClose={() => {\n setOpen(false)\n setHoveredDate(null)\n }}\n placement=\"bottom-start\"\n >\n {renderCalendar()}\n </Popover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n","import {useState, useRef, useCallback, useMemo, useEffect} from 'react'\nimport type {TimePickerProps} from './TimePicker.types'\nimport {Popover} from '../../primitives/Popover'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {formatTime, parseTime} from '../../../utils/dateUtils'\nimport './TimePicker.css'\n\n// Compare time tuples so min/max checks can stay string-format agnostic.\nfunction compareTimeParts(\n left: {hours: number; minutes: number; seconds: number},\n right: {hours: number; minutes: number; seconds: number}\n): number {\n if (left.hours !== right.hours) return left.hours - right.hours\n if (left.minutes !== right.minutes) return left.minutes - right.minutes\n return left.seconds - right.seconds\n}\n\n// Check whether a time falls within optional min and max boundaries.\nfunction isTimeInRange(\n value: {hours: number; minutes: number; seconds: number},\n min?: {hours: number; minutes: number; seconds: number} | null,\n max?: {hours: number; minutes: number; seconds: number} | null\n): boolean {\n if (min && compareTimeParts(value, min) < 0) return false\n if (max && compareTimeParts(value, max) > 0) return false\n return true\n}\n\nconst ClearIcon = () => (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 4L12 12M12 4L4 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" />\n </svg>\n)\n\n// Render a time input backed by scrollable hour, minute and second columns.\nexport function TimePicker({\n value,\n defaultValue,\n onChange,\n format = '24h',\n showSeconds = false,\n minuteStep = 1,\n min,\n max,\n placeholder,\n disabled = false,\n readOnly = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n fcolor,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n clearable = false,\n fullWidth = false,\n className,\n style,\n}: TimePickerProps) {\n const [open, setOpen] = useState(false)\n const [internalValue, setInternalValue] = useState(defaultValue ?? '')\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const currentValue = value !== undefined ? value : internalValue\n const hasError = error || !!errorText\n const parsed = parseTime(currentValue)\n const minTime = parseTime(min ?? '')\n const maxTime = parseTime(max ?? '')\n\n // Build the visible hour list based on the selected time format.\n const hours = useMemo(() => {\n const items: number[] = []\n const maxHour = format === '12h' ? 12 : 23\n const startHour = format === '12h' ? 1 : 0\n for (let index = startHour; index <= maxHour; index++) {\n items.push(index)\n }\n return items\n }, [format])\n\n // Build the minute list using the configured step size.\n const minutes = useMemo(() => {\n const items: number[] = []\n for (let index = 0; index < 60; index += minuteStep) {\n items.push(index)\n }\n return items\n }, [minuteStep])\n\n // Build the seconds list only when the picker exposes seconds.\n const seconds = useMemo(() => {\n if (!showSeconds) return []\n const items: number[] = []\n for (let index = 0; index < 60; index++) {\n items.push(index)\n }\n return items\n }, [showSeconds])\n\n // Reuse range validation for list rendering and direct text input.\n const isSelectable = useCallback(\n (hoursValue: number, minutesValue: number, secondsValue: number = 0) => {\n return isTimeInRange({hours: hoursValue, minutes: minutesValue, seconds: secondsValue}, minTime, maxTime)\n },\n [maxTime, minTime]\n )\n\n // Apply the selected time and keep uncontrolled usage in sync.\n const handleSelect = useCallback(\n (hoursValue: number, minutesValue: number, secondsValue: number = 0) => {\n if (!isSelectable(hoursValue, minutesValue, secondsValue)) return\n const time = formatTime(hoursValue, minutesValue, secondsValue, showSeconds)\n if (value === undefined) setInternalValue(time)\n onChange?.(time)\n },\n [isSelectable, onChange, showSeconds, value]\n )\n\n const handleInputChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const raw = event.target.value\n if (value === undefined) setInternalValue(raw)\n },\n [value]\n )\n\n // Normalize manual input once the user leaves the field.\n const handleInputBlur = useCallback(() => {\n const nextValue = parseTime(currentValue)\n if (nextValue && isTimeInRange(nextValue, minTime, maxTime)) {\n const time = formatTime(nextValue.hours, nextValue.minutes, nextValue.seconds, showSeconds)\n if (value === undefined) setInternalValue(time)\n onChange?.(time)\n }\n }, [currentValue, maxTime, minTime, onChange, showSeconds, value])\n\n // Clear the current time without closing the trigger first.\n const handleClear = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation()\n if (value === undefined) setInternalValue('')\n onChange?.('')\n },\n [onChange, value]\n )\n\n const clockIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" />\n <line x1=\"8\" y1=\"4\" x2=\"8\" y2=\"8\" />\n <line x1=\"8\" y1=\"8\" x2=\"11\" y2=\"10\" />\n </svg>\n )\n\n return (\n <div\n className={cn('time-picker', ...getAppearanceClassNames({fcolor}), fullWidth && 'full-width', className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={triggerRef}\n className={cn('trigger', variant, size, open && 'focused', hasError && 'error', disabled && 'disabled')}\n onClick={() => !disabled && !readOnly && setOpen(true)}\n >\n <span className=\"icon\">{clockIcon}</span>\n <input\n type=\"text\"\n className=\"input\"\n value={currentValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n placeholder={placeholder ?? (showSeconds ? 'HH:MM:SS' : 'HH:MM')}\n disabled={disabled}\n readOnly={readOnly}\n id={id}\n aria-invalid={hasError || undefined}\n />\n {clearable && currentValue && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear time\"\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {name && <input type=\"hidden\" name={name} value={currentValue} />}\n\n <Popover className=\"time-picker-popover\" open={open} anchorRef={triggerRef} onClose={() => setOpen(false)} placement=\"bottom-start\">\n <div className=\"columns\">\n <TimeColumn\n items={hours}\n selected={parsed?.hours}\n onSelect={(hoursValue) => handleSelect(hoursValue, parsed?.minutes ?? 0, parsed?.seconds ?? 0)}\n isDisabled={(hoursValue) =>\n !isSelectable(hoursValue, parsed?.minutes ?? 0, parsed?.seconds ?? 0)\n }\n label=\"Hr\"\n />\n <TimeColumn\n items={minutes}\n selected={parsed?.minutes}\n onSelect={(minutesValue) =>\n handleSelect(parsed?.hours ?? 0, minutesValue, parsed?.seconds ?? 0)\n }\n isDisabled={(minutesValue) =>\n !isSelectable(parsed?.hours ?? 0, minutesValue, parsed?.seconds ?? 0)\n }\n label=\"Min\"\n />\n {showSeconds && (\n <TimeColumn\n items={seconds}\n selected={parsed?.seconds}\n onSelect={(secondsValue) =>\n handleSelect(parsed?.hours ?? 0, parsed?.minutes ?? 0, secondsValue)\n }\n isDisabled={(secondsValue) =>\n !isSelectable(parsed?.hours ?? 0, parsed?.minutes ?? 0, secondsValue)\n }\n label=\"Sec\"\n />\n )}\n </div>\n </Popover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"error-text\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n\n// Render one scrollable time column and keep the selected value centered.\nfunction TimeColumn({\n items,\n selected,\n onSelect,\n isDisabled,\n label,\n}: {\n items: number[]\n selected?: number\n onSelect: (value: number) => void\n isDisabled?: (value: number) => boolean\n label: string\n}) {\n const listRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (selected === undefined || !listRef.current) return\n const element = listRef.current.querySelector(`[data-value=\"${selected}\"]`) as HTMLElement | null\n if (element) {\n const list = listRef.current\n list.scrollTop = element.offsetTop - list.clientHeight / 2 + element.offsetHeight / 2\n }\n }, [selected])\n\n const pad = (value: number) => value.toString().padStart(2, '0')\n\n return (\n <div className=\"column\">\n <div className=\"column-label\">{label}</div>\n <div ref={listRef} className=\"column-list\">\n {items.map((item) => {\n const disabled = isDisabled?.(item) ?? false\n return (\n <button\n key={item}\n type=\"button\"\n data-value={item}\n className={cn('column-item', item === selected && 'selected', disabled && 'disabled')}\n onClick={() => onSelect(item)}\n disabled={disabled}\n >\n {pad(item)}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","import {createContext, useContext} from 'react'\nimport type {FormContextValue} from './Form.types'\n\nexport const FormContext = createContext<FormContextValue | null>(null)\n\n// Read the nearest form context to integrate custom fields with shared state.\nexport function useFormContext(): FormContextValue | null {\n return useContext(FormContext)\n}\n","import {useState, useRef, useCallback, useMemo} from 'react'\nimport type {FormProps, FieldRegistration, FormContextValue, FormHelpers} from './Form.types'\nimport {FormContext} from './FormContext'\nimport {validateRequired} from '../../../utils/validators'\nimport type {ValidationResult} from '../../../utils/validators'\nimport './Form.css'\n\n// Coordinate form values, validation state and submit helpers through context.\nexport function Form({\n initialValues = {},\n onSubmit,\n onChange,\n validationMode = 'onBlur',\n children,\n className,\n style,\n noValidate = true,\n}: FormProps) {\n const [values, setValues] = useState<Record<string, unknown>>({...initialValues})\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [touched, setTouched] = useState<Record<string, boolean>>({})\n const [isSubmitting, setIsSubmitting] = useState(false)\n const fieldsRef = useRef<Map<string, FieldRegistration>>(new Map())\n\n // Track mounted fields so validation stays aligned with active inputs.\n const registerField = useCallback((reg: FieldRegistration) => {\n fieldsRef.current.set(reg.name, reg)\n }, [])\n\n const unregisterField = useCallback((name: string) => {\n fieldsRef.current.delete(name)\n }, [])\n\n // Run required and custom validators without mutating visible error state yet.\n const validateFieldInternal = useCallback(\n (name: string, val?: unknown): ValidationResult => {\n const reg = fieldsRef.current.get(name)\n if (!reg) return {valid: true}\n\n const fieldValue = val !== undefined ? val : values[name]\n const strValue = fieldValue != null ? String(fieldValue) : ''\n\n // Required check\n if (reg.required) {\n const reqResult = validateRequired(strValue)\n if (!reqResult.valid) return reqResult\n }\n\n // Custom validators\n if (reg.validate) {\n for (const validator of reg.validate) {\n const result = validator(strValue)\n if (!result.valid) return result\n }\n }\n\n return {valid: true}\n },\n [values]\n )\n\n // Persist the latest validation result for a single field.\n const validateField = useCallback(\n (name: string): ValidationResult => {\n const result = validateFieldInternal(name)\n setErrors((prev) => {\n if (result.valid) {\n const next = {...prev}\n delete next[name]\n return next\n }\n return {...prev, [name]: result.error!}\n })\n return result\n },\n [validateFieldInternal]\n )\n\n // Validate every registered field before submit.\n const validateAll = useCallback((): boolean => {\n let allValid = true\n const newErrors: Record<string, string> = {}\n\n for (const [name] of fieldsRef.current) {\n const result = validateFieldInternal(name)\n if (!result.valid) {\n allValid = false\n newErrors[name] = result.error!\n }\n }\n\n setErrors(newErrors)\n // Mark all as touched\n const allTouched: Record<string, boolean> = {}\n for (const [name] of fieldsRef.current) {\n allTouched[name] = true\n }\n setTouched(allTouched)\n\n return allValid\n }, [validateFieldInternal])\n\n // Update field values and trigger onChange or validation according to mode.\n const setFieldValue = useCallback(\n (name: string, val: unknown) => {\n setValues((prev) => {\n const next = {...prev, [name]: val}\n onChange?.(next)\n return next\n })\n\n if (validationMode === 'onChange' && touched[name]) {\n // Defer validation to next tick so values are updated\n setTimeout(() => validateField(name), 0)\n }\n },\n [onChange, validationMode, touched, validateField]\n )\n\n const setFieldError = useCallback((name: string, error: string) => {\n setErrors((prev) => ({...prev, [name]: error}))\n }, [])\n\n // Mark fields as touched so blur validation can start surfacing errors.\n const setFieldTouched = useCallback(\n (name: string, isTouched: boolean) => {\n setTouched((prev) => ({...prev, [name]: isTouched}))\n if (validationMode === 'onBlur' && isTouched) {\n validateField(name)\n }\n },\n [validationMode, validateField]\n )\n\n const resetForm = useCallback(() => {\n setValues({...initialValues})\n setErrors({})\n setTouched({})\n setIsSubmitting(false)\n }, [initialValues])\n\n // Guard submit flow with validation and a single in-flight submission state.\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault()\n if (isSubmitting) return\n\n const valid = validateAll()\n if (!valid) return\n\n setIsSubmitting(true)\n const helpers: FormHelpers = {\n setSubmitting: setIsSubmitting,\n resetForm,\n setFieldError,\n }\n\n try {\n await onSubmit?.(values, helpers)\n } finally {\n setIsSubmitting(false)\n }\n },\n [isSubmitting, validateAll, values, onSubmit, resetForm, setFieldError]\n )\n\n // Memoize the public form context to limit downstream re-renders.\n const ctx = useMemo<FormContextValue>(\n () => ({\n values,\n errors,\n touched,\n registerField,\n unregisterField,\n setFieldValue,\n setFieldError,\n setFieldTouched,\n validateField,\n validateAll,\n resetForm,\n isSubmitting,\n }),\n [\n values,\n errors,\n touched,\n registerField,\n unregisterField,\n setFieldValue,\n setFieldError,\n setFieldTouched,\n validateField,\n validateAll,\n resetForm,\n isSubmitting,\n ]\n )\n\n return (\n <FormContext.Provider value={ctx}>\n <form onSubmit={handleSubmit} noValidate={noValidate} className={`form${className ? ` ${className}` : ''}`} style={style}>\n {typeof children === 'function' ? children(ctx) : children}\n </form>\n </FormContext.Provider>\n )\n}\n","import {useEffect, useCallback} from 'react'\nimport {useFormContext} from './FormContext'\nimport type {ValidatorFn} from '../../../utils/validators'\n\nexport interface UseFormFieldOptions {\n validate?: ValidatorFn[]\n required?: boolean\n}\n\nexport interface UseFormFieldReturn {\n value: unknown\n error: string | undefined\n touched: boolean\n onChange: (value: unknown) => void\n onBlur: () => void\n}\n\n// Connect a field name to the nearest form context and expose field-level helpers.\nexport function useFormField(name: string, options?: UseFormFieldOptions): UseFormFieldReturn {\n const ctx = useFormContext()\n\n // Register the field definition so the form can validate and reset it centrally.\n useEffect(() => {\n if (!ctx) return\n ctx.registerField({\n name,\n validate: options?.validate,\n required: options?.required,\n })\n return () => ctx.unregisterField(name)\n }, [ctx, name, options?.validate, options?.required])\n\n // Forward value updates into the form state.\n const onChange = useCallback(\n (val: unknown) => {\n ctx?.setFieldValue(name, val)\n },\n [ctx, name]\n )\n\n // Mark the field as touched when the control loses focus.\n const onBlur = useCallback(() => {\n ctx?.setFieldTouched(name, true)\n }, [ctx, name])\n\n return {\n value: ctx?.values[name] ?? '',\n error: ctx?.errors[name],\n touched: ctx?.touched[name] ?? false,\n onChange,\n onBlur,\n }\n}\n"],"mappings":"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AAQ,MAAU,IAIvD,QAAO,EACH,0BAA0B,OAAO,KAAU,WAAW,GAAG,EAAM,MAAM,GACxE;;;;ACvEL,SAAgB,GAAU,EACtB,UAAO,WACP,YAAS,IACT,YACA,YACA,UACA,WACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,cACA,cACA,UACA,aACA,GAAG,KACY;CACf,IAAM,IAAe,GAAuB,EAAC,UAAM,CAAC;AAEpD,QACI,kBAAC,OAAD;EACI,WAAW,EACP,aACA,GACA,KAAU,UACV,GAAG,GAA2B;GAC1B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACH,CAAC,EACF,EACH;EACD,OAAO;GAAC,GAAG;GAAc,GAAG;GAAM;EAClC,GAAI;EAEH;EACC,CAAA;;;;ACxDd,SAAgB,EAAwB,EAAC,UAAO,aAA6D;AACzG,QAAO,CAAC,KAAS,UAAU,KAAS,KAAU,UAAU,IAAS;;;;ACFrE,SAAgB,GAAQ,EACpB,eAAY,QACZ,YAAS,IACT,cAAW,IACX,YAAS,IACT,UAAO,WACP,WACA,cACA,aACA,GAAG,KACU;AACb,QACI,kBAAC,UAAD;EACI,WAAW,EACP,UACA,GACA,GAAG,EAAwB,EAAC,WAAO,CAAC,EACpC,KAAY,YACZ,KAAU,UACV,EACH;EACD,GAAI;YAEJ,kBAAC,IAAD;GAAW,MAAM;GAAmB;GAAQ,WAAU;GACjD;GACO,CAAA;EACP,CAAA;;;;AC1BjB,SAAgB,GAAQ,EACpB,eAAY,QACZ,YAAS,IACT,cAAW,IACX,UAAO,WACP,YACA,YACA,UACA,WACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,cACA,cACA,UACA,aACA,GAAG,KACU;CACb,IAAM,IAAe,GAAuB,EAAC,UAAM,CAAC;AAEpD,QACI,kBAAC,UAAD;EACI,WAAW,EACP,UACA,GACA,KAAY,YACZ,GAAG,GAA2B;GAC1B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GAC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"}
|