@banzamel/mineralui 1.11.1 → 2.0.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.
Files changed (61) hide show
  1. package/README.md +1 -1
  2. package/dist/MConflictIllustration-DfNfvv7Q.cjs +2 -0
  3. package/dist/MConflictIllustration-DfNfvv7Q.cjs.map +1 -0
  4. package/dist/{MConflictIllustration-Ctggjn7z.js → MConflictIllustration-Drsm8_8C.js} +41 -99
  5. package/dist/MConflictIllustration-Drsm8_8C.js.map +1 -0
  6. package/dist/{cards-CvgcQCAP.js → cards-C2t-pM0r.js} +12 -11
  7. package/dist/cards-C2t-pM0r.js.map +1 -0
  8. package/dist/{cards-O0osWbUF.cjs → cards-D7_hH3Q8.cjs} +2 -2
  9. package/dist/cards-D7_hH3Q8.cjs.map +1 -0
  10. package/dist/cards.cjs +1 -1
  11. package/dist/cards.js +1 -1
  12. package/dist/components/inputs/MInputUrl/MInputUrl.d.ts +3 -0
  13. package/dist/components/inputs/MInputUrl/MInputUrl.types.d.ts +27 -0
  14. package/dist/components/inputs/MInputUrl/index.d.ts +2 -0
  15. package/dist/components/inputs/index.d.ts +2 -0
  16. package/dist/{dropdowns-C9jREjLg.js → dropdowns-BJ8s18h2.js} +2 -2
  17. package/dist/dropdowns-BJ8s18h2.js.map +1 -0
  18. package/dist/{dropdowns-BP2HBR-x.cjs → dropdowns-BLd4lyr6.cjs} +2 -2
  19. package/dist/dropdowns-BLd4lyr6.cjs.map +1 -0
  20. package/dist/dropdowns.cjs +1 -1
  21. package/dist/dropdowns.js +1 -1
  22. package/dist/{form-D5F1kTIA.cjs → form-Bni0Gf_s.cjs} +2 -2
  23. package/dist/{form-D5F1kTIA.cjs.map → form-Bni0Gf_s.cjs.map} +1 -1
  24. package/dist/{form-CWoOQ_qo.js → form-CFhDAU18.js} +2 -2
  25. package/dist/{form-CWoOQ_qo.js.map → form-CFhDAU18.js.map} +1 -1
  26. package/dist/form.cjs +1 -1
  27. package/dist/form.js +1 -1
  28. package/dist/i18n/frameworkTexts.d.ts +0 -29
  29. package/dist/illustrations/index.d.ts +0 -1
  30. package/dist/illustrations.cjs +1 -1
  31. package/dist/illustrations.js +2 -2
  32. package/dist/index.cjs +1 -1
  33. package/dist/index.js +42 -42
  34. package/dist/inputs-BpdfT9Hp.cjs +2 -0
  35. package/dist/inputs-BpdfT9Hp.cjs.map +1 -0
  36. package/dist/{inputs-bbwdb6m3.js → inputs-CyDoEfL3.js} +333 -284
  37. package/dist/inputs-CyDoEfL3.js.map +1 -0
  38. package/dist/inputs.cjs +1 -1
  39. package/dist/inputs.js +3 -3
  40. package/dist/style-runtime.cjs +1 -1
  41. package/dist/style-runtime.js +1 -1
  42. package/dist/styles.css +1 -1
  43. package/dist/utils/validators.d.ts +14 -0
  44. package/dist/utils.cjs +1 -1
  45. package/dist/utils.js +2 -2
  46. package/dist/{validators-DRhikiAi.cjs → validators-B6yWdsu2.cjs} +2 -2
  47. package/dist/{validators-DRhikiAi.cjs.map → validators-B6yWdsu2.cjs.map} +1 -1
  48. package/dist/{validators-D5OCyV2h.js → validators-DVYOtFnw.js} +19 -2
  49. package/dist/{validators-D5OCyV2h.js.map → validators-DVYOtFnw.js.map} +1 -1
  50. package/package.json +1 -1
  51. package/dist/MConflictIllustration-CfYeZVmf.cjs +0 -2
  52. package/dist/MConflictIllustration-CfYeZVmf.cjs.map +0 -1
  53. package/dist/MConflictIllustration-Ctggjn7z.js.map +0 -1
  54. package/dist/cards-CvgcQCAP.js.map +0 -1
  55. package/dist/cards-O0osWbUF.cjs.map +0 -1
  56. package/dist/dropdowns-BP2HBR-x.cjs.map +0 -1
  57. package/dist/dropdowns-C9jREjLg.js.map +0 -1
  58. package/dist/illustrations/scenes/MCookieConsentIllustration.d.ts +0 -2
  59. package/dist/inputs-D38ib0gM.cjs +0 -2
  60. package/dist/inputs-D38ib0gM.cjs.map +0 -1
  61. package/dist/inputs-bbwdb6m3.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs-BpdfT9Hp.cjs","names":[],"sources":["../src/components/inputs/MTextarea/MTextarea.tsx","../src/components/inputs/MInputPassword/MInputPassword.tsx","../src/components/inputs/MInputNumber/MInputNumber.tsx","../src/components/inputs/MInputEmail/MInputEmail.tsx","../src/components/inputs/MInputUrl/MInputUrl.tsx","../src/components/inputs/MInputPhone/MInputPhone.tsx","../src/components/inputs/MInputName/MInputName.tsx","../src/components/inputs/MInputGroup/MInputGroup.tsx","../src/components/inputs/MInputIBAN/MInputIBAN.tsx","../src/components/inputs/MInputTaxId/MInputTaxId.tsx","../src/components/inputs/MInputCurrency/MInputCurrency.tsx","../src/components/inputs/MInputDate/MInputDate.tsx","../src/components/inputs/MInputCreditCard/MInputCreditCard.tsx","../src/components/inputs/MInputPostCode/MInputPostCode.tsx","../src/components/inputs/MInputOTP/MInputOTP.tsx","../src/components/inputs/MInputSlider/MInputSlider.tsx","../src/components/inputs/MInputFile/MCropEditor.tsx","../src/components/inputs/MInputFile/MInputFile.tsx"],"sourcesContent":["import {useState, useRef, useCallback, useEffect, forwardRef} from 'react'\nimport type * as React from 'react'\nimport type {MTextareaProps} from './MTextarea.types'\nimport {cn} from '../../../utils/cn'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport {useGhostText} from '../../../utils/useGhostText'\nimport {MSpinner} from '../../feedback'\nimport './MTextarea.css'\n\n// Render the multiline text input with optional auto-resize behavior.\nexport const MTextarea = forwardRef<HTMLTextAreaElement, MTextareaProps>(function MTextarea(\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 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 resolvedColorClass = hasError ? 'color-error' : color ? `color-${color}` : undefined\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 MInput.\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 `field-${variant}`,\n `field-${size}`,\n focused && 'focused',\n hasError && 'error',\n success && !hasError && 'success',\n disabled && 'disabled'\n )\n\n return (\n <div className={cn('textarea', resolvedColorClass, fullWidth && 'full-width', className)} style={style}>\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'field-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 && <MSpinner size=\"sm\" color={color} className=\"textarea-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=\"field-error\" role=\"alert\">\n {errorText}\n </span>\n )}\n {!errorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className=\"field-helper\">\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 * as React from 'react'\nimport type {MInputPasswordProps, MPasswordStrength} from './MInputPassword.types'\nimport {MInput} from '../MInput'\nimport {MEyeIcon, MEyeOffIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MInputPassword.css'\n\n// Approximate password strength with simple UI-focused heuristics.\nfunction calcStrength(value: string): MPasswordStrength {\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<MPasswordStrength, 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 MInputPassword = forwardRef<HTMLInputElement, MInputPasswordProps>(function MInputPassword(\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=\"password toggle\"\n onClick={() => setVisible((v) => !v)}\n tabIndex={-1}\n aria-label={visible ? 'Hide password' : 'Show password'}\n >\n {visible ? <MEyeOffIcon /> : <MEyeIcon />}\n </button>\n ) : undefined\n\n return (\n <div className={cn('password input', className)}>\n <MInput\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=\"password strength row\">\n <div className=\"password strength bar\">\n {[0, 1, 2, 3].map((i) => (\n <div\n key={i}\n className={cn(\n 'password strength segment',\n i < ['weak', 'fair', 'good', 'strong'].indexOf(strength) + 1 &&\n `strength-${strength}`\n )}\n />\n ))}\n </div>\n <span className={cn('password strength label', `strength-${strength}`)}>\n {STRENGTH_LABELS[strength]}\n </span>\n </div>\n )}\n </div>\n )\n})\n","import {useState, useCallback, useRef, useEffect, forwardRef} from 'react'\nimport type * as React from 'react'\nimport type {MInputNumberProps} from './MInputNumber.types'\nimport {MInput} from '../MInput'\nimport {cn} from '../../../utils/cn'\nimport {MChevronDownIcon, MChevronUpIcon} from '../../../icons'\nimport './MInputNumber.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 MInputNumber = forwardRef<HTMLInputElement, MInputNumberProps>(function MInputNumber(\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 const currentValueRef = useRef(currentValue)\n\n useEffect(() => {\n currentValueRef.current = currentValue\n }, [currentValue])\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(currentValueRef.current) || 0\n const newVal = roundToPrecision(clampValue(current + step * direction, min, max), precision)\n currentValueRef.current = newVal.toString()\n updateValue(newVal.toString())\n },\n [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 currentValueRef.current = filtered\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(currentValueRef.current)\n if (!isNaN(num)) {\n const clamped = roundToPrecision(clampValue(num, min, max), precision)\n currentValueRef.current = clamped.toString()\n updateValue(clamped.toString())\n }\n onBlur?.(e)\n },\n [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=\"number stepper\">\n <button\n type=\"button\"\n className=\"number step button\"\n onPointerDown={(event) => {\n event.preventDefault()\n startHold(1)\n }}\n onPointerUp={stopHold}\n onPointerLeave={stopHold}\n onPointerCancel={stopHold}\n tabIndex={-1}\n aria-label=\"Increment\"\n >\n <MChevronUpIcon />\n </button>\n <button\n type=\"button\"\n className=\"number step button\"\n onPointerDown={(event) => {\n event.preventDefault()\n startHold(-1)\n }}\n onPointerUp={stopHold}\n onPointerLeave={stopHold}\n onPointerCancel={stopHold}\n tabIndex={-1}\n aria-label=\"Decrement\"\n >\n <MChevronDownIcon />\n </button>\n </div>\n ) : undefined\n\n return (\n <MInput\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('number input', className)}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type * as React from 'react'\nimport type {MInputEmailProps} from './MInputEmail.types'\nimport {MInput} from '../MInput'\nimport {validateEmail} from '../../../utils/validators'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCheckIcon, MMailIcon} from '../../../icons'\n\n// Extend the base input with email validation and optional success feedback.\nexport const MInputEmail = forwardRef<HTMLInputElement, MInputEmailProps>(function MInputEmail(\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 validIcon =\n showValidIcon && isSuccess ? (\n <span className=\"validation-icon\">\n <MCheckIcon />\n </span>\n ) : undefined\n\n return (\n <MInput\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={<MMailIcon />}\n endIcon={validIcon}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type * as React from 'react'\nimport type {MInputUrlProps} from './MInputUrl.types'\nimport {MInput} from '../MInput'\nimport {validateUrl} from '../../../utils/validators'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCheckIcon, MLinkIcon} from '../../../icons'\n\nconst DEFAULT_PROTOCOLS = ['http', 'https']\n\n// Extend the base input with URL validation, optional protocol whitelisting\n// and an optional autoformatter that prepends the first allowed protocol on\n// blur (so users can type `example.com` and walk away with `https://example.com`).\nexport const MInputUrl = forwardRef<HTMLInputElement, MInputUrlProps>(function MInputUrl(\n {\n protocols = DEFAULT_PROTOCOLS,\n requireProtocol = true,\n formatOnBlur = false,\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 = 'https://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 const runValidation = useCallback(\n (val: string) => {\n const result = validateUrl(val, {protocols, requireProtocol})\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [protocols, requireProtocol, onValidationChange]\n )\n\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 // On blur: optionally prepend the first allowed protocol when the value\n // has no scheme yet, then run validation against the (possibly rewritten)\n // value. The rewritten value is surfaced to consumers through a\n // synthesised `onChange` so controlled inputs stay in sync.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n\n let next = e.target.value\n const hasScheme = /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(next)\n if (formatOnBlur && next && !hasScheme && protocols.length > 0) {\n next = `${protocols[0]}://${next}`\n if (value === undefined) {\n setInternalValue(next)\n }\n // Re-use the same native input element so refs, names and\n // ids on the synthetic event still resolve to the real DOM.\n e.target.value = next\n onChange?.(e as unknown as React.ChangeEvent<HTMLInputElement>)\n }\n\n if (validateOnBlur && next) {\n runValidation(next)\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, runValidation, formatOnBlur, protocols, value, onChange]\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 validIcon =\n showValidIcon && isSuccess ? (\n <span className=\"validation-icon\">\n <MCheckIcon />\n </span>\n ) : undefined\n\n return (\n <MInput\n {...rest}\n ref={ref}\n type=\"url\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder}\n startIcon={<MLinkIcon />}\n endIcon={validIcon}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type * as React from 'react'\nimport type {MInputPhoneProps} from './MInputPhone.types'\nimport {MInput} from '../MInput'\nimport {cn} from '../../../utils/cn'\nimport {validatePhone} from '../../../utils/validators'\nimport {formatPhone, stripNonDigits} from '../../../utils/formatters'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MPhoneIcon} from '../../../icons'\nimport './MInputPhone.css'\n\nconst 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// Sort longest prefix first so '+421' is matched before '+4'.\nconst PREFIX_ENTRIES = Object.entries(COUNTRY_PREFIXES).sort(([, a], [, b]) => b.length - a.length)\n\n// Match a leading +XX prefix back to its country code so the user can type the country in.\nfunction detectCountryFromValue(value: string): {country: string; rest: string} | null {\n const trimmed = value.trim().replace(/^00/, '+')\n\n if (!trimmed.startsWith('+')) {\n return null\n }\n\n const digitsAfterPlus = '+' + stripNonDigits(trimmed)\n\n for (const [country, prefix] of PREFIX_ENTRIES) {\n if (digitsAfterPlus.startsWith(prefix)) {\n return {country, rest: digitsAfterPlus.slice(prefix.length)}\n }\n }\n\n return null\n}\n\n// Detect a partial prefix the user is in the middle of typing (e.g. \"+4\" before they finish \"+49\").\nfunction looksLikePartialPrefix(value: string): boolean {\n const trimmed = value.trim()\n if (!trimmed.startsWith('+') && !trimmed.startsWith('00')) return false\n const normalized = trimmed.startsWith('00') ? '+' + trimmed.slice(2) : trimmed\n const digits = stripNonDigits(normalized)\n // Longest prefix in COUNTRY_PREFIXES is 3 digits (\"+421\"), so accept up to 3 digits as \"still typing\".\n return digits.length <= 3\n}\n\n// Normalize a partial prefix to canonical \"+digits\" form, so 00420 → +420 while typing.\nfunction normalizePartialPrefix(value: string): string {\n const trimmed = value.trim()\n const body = trimmed.startsWith('00') ? trimmed.slice(2) : trimmed.slice(1)\n return '+' + stripNonDigits(body).slice(0, 3)\n}\n\n// Extend the base input with country-aware phone formatting and validation.\nexport const MInputPhone = forwardRef<HTMLInputElement, MInputPhoneProps>(function MInputPhone(\n {\n countryCode,\n defaultCountryCode = 'PL',\n showCountryCode = true,\n formatOnChange = true,\n validateOnBlur = true,\n onValidationChange,\n onValueChange,\n onCountryChange,\n onClear,\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 [internalCountry, setInternalCountry] = useState((countryCode ?? defaultCountryCode).toUpperCase())\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentCountry = (countryCode ?? internalCountry).toUpperCase()\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 raw = e.target.value\n\n // Empty input — short-circuit so clear/backspace doesn't loop through the formatter.\n if (raw === '') {\n if (value === undefined) setInternalValue('')\n onValueChange?.('', '')\n onChange?.(e)\n return\n }\n\n const detected = detectCountryFromValue(raw)\n\n if (detected) {\n const nextCountry = detected.country\n if (countryCode === undefined && nextCountry !== currentCountry) {\n setInternalCountry(nextCountry)\n onCountryChange?.(nextCountry)\n }\n const digits = stripNonDigits(detected.rest)\n const formatted = formatOnChange ? formatPhone(digits, {countryCode: nextCountry}) : digits\n if (value === undefined) setInternalValue(formatted)\n onValueChange?.(digits, formatted)\n onChange?.(e)\n return\n }\n\n // User is mid-prefix (e.g. \"+\", \"+4\", \"+42\") — preserve so they can finish typing.\n if (looksLikePartialPrefix(raw)) {\n const preserved = normalizePartialPrefix(raw)\n if (value === undefined) setInternalValue(preserved)\n onValueChange?.(stripNonDigits(preserved), preserved)\n onChange?.(e)\n return\n }\n\n const digits = stripNonDigits(raw)\n const formatted = formatOnChange ? formatPhone(digits, {countryCode: currentCountry}) : digits\n\n if (value === undefined) {\n setInternalValue(formatted)\n }\n onValueChange?.(digits, formatted)\n onChange?.(e)\n },\n [onChange, value, formatOnChange, currentCountry, countryCode, onValueChange, onCountryChange]\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), currentCountry)\n setValidation(result)\n onValidationChange?.(result)\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, currentValue, currentCountry, onValidationChange]\n )\n\n // Reset validation state alongside the value when the clear button fires.\n const handleClear = useCallback(() => {\n if (value === undefined) setInternalValue('')\n setValidation({valid: true})\n setTouched(false)\n onValidationChange?.({valid: true})\n onValueChange?.('', '')\n onClear?.()\n }, [onClear, onValueChange, onValidationChange, value])\n\n // Hide the static prefix while the user is typing a partial +XX so the field doesn't show two prefixes at once.\n const isTypingPrefix = currentValue.startsWith('+')\n const prefix =\n showCountryCode && !isTypingPrefix ? (\n <span className=\"phone prefix\">{COUNTRY_PREFIXES[currentCountry] ?? `+${currentCountry}`}</span>\n ) : undefined\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n\n return (\n <MInput\n {...rest}\n ref={ref}\n type=\"tel\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onClear={handleClear}\n error={isError}\n errorText={resolvedErrorText}\n placeholder={placeholder}\n startIcon={showCountryCode ? prefix : <MPhoneIcon />}\n className={cn('phone input', className)}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type * as React from 'react'\nimport type {MInputNameProps} from './MInputName.types'\nimport {MInput} from '../MInput'\nimport {capitalizeWords} from '../../../utils/formatters'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MUserIcon} from '../../../icons'\n\n// Extend the base input with name-friendly filtering and optional word-count validation.\nexport const MInputName = forwardRef<HTMLInputElement, MInputNameProps>(function MInputName(\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 return (\n <MInput\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={<MUserIcon />}\n />\n )\n})\n","import {useState, useRef, useCallback, forwardRef, isValidElement} from 'react'\nimport type * as React from 'react'\nimport type {MInputGroupProps, MInputGroupAddon, MInputGroupSlot} from './MInputGroup.types'\nimport {cn} from '../../../utils/cn'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {MButton, MCheckbox} from '../../controls'\nimport {MSpinner} from '../../feedback'\nimport {MCloseIcon} from '../../../icons'\nimport './MInputGroup.css'\n\n// Detect structured addon configs while leaving raw React nodes untouched.\nfunction isAddonObject(slot: MInputGroupSlot): slot is MInputGroupAddon {\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: MInputGroupSlot, position: 'prepend' | 'append', index: number, color: string) {\n if (!isAddonObject(slot)) {\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 <MButton\n key={`${position}-${index}`}\n variant=\"ghost\"\n color={color as any}\n size=\"sm\"\n className={cn('addon', position, 'addon-button')}\n onClick={addon.onClick}\n clickEffect=\"none\"\n >\n {addon.content}\n </MButton>\n )\n }\n\n if (addon.type === 'checkbox') {\n return (\n <div key={`${position}-${index}`} className={cn('addon', position, 'checkbox')}>\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n checked={addon.checked}\n onChange={(e) => addon.onCheckedChange?.(e.target.checked)}\n className=\"addon-checkbox\"\n />\n </div>\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?: MInputGroupSlot | MInputGroupSlot[]): MInputGroupSlot[] {\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 MInputGroup = forwardRef<HTMLInputElement, MInputGroupProps>(function MInputGroup(\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 fullWidth = false,\n label,\n helperText,\n errorText,\n color = 'primary',\n error = false,\n maxLength,\n clearable = false,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n onClear,\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 resolvedColorClass = hasError ? 'color-error' : `color-${color}`\n const {currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n const hasContent = currentValue.length > 0\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 // Reset the field value while preserving focus and controlled integrations.\n const handleClear = useCallback(() => {\n setCurrentValue('')\n\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, '')\n input.dispatchEvent(new Event('input', {bubbles: true}))\n }\n\n onClear?.()\n input?.focus()\n }, [onClear, ref, setCurrentValue])\n\n const prependSlots = normalizeSlots(prepend)\n const appendSlots = normalizeSlots(append)\n\n return (\n <div className={cn('input-group', resolvedColorClass, fullWidth && 'full-width', className)} style={style}>\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'field-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 `field-${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, color))}\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 <MSpinner size=\"sm\" color={color} />\n </span>\n )}\n\n {clearable && hasContent && !loading && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn clear-btn-base\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear input\"\n >\n <MCloseIcon />\n </button>\n )}\n\n {appendSlots.map((slot, i) => renderSlot(slot, 'append', i, color))}\n </div>\n\n {(errorText || helperText) && (\n <div className={'bottom'}>\n {errorText && (\n <span id={id ? `${id}-error` : undefined} className={'field-error'} role=\"alert\">\n {errorText}\n </span>\n )}\n {!errorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className={'field-helper'}>\n {helperText}\n </span>\n )}\n </div>\n )}\n </div>\n )\n})\n","import {forwardRef, useCallback, useMemo, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputIBANProps} from './MInputIBAN.types'\nimport {MInputGroup} from '../MInputGroup'\nimport {cn} from '../../../utils/cn'\nimport {ibanCountries, getIbanCountryLength, validateIBAN} from '../../../utils/validators'\nimport {formatIBAN, unformatIBAN} from '../../../utils/formatters'\nimport type {ValidationResult} from '../../../utils/validators'\nimport './MInputIBAN.css'\n\nfunction normalizeCountryCode(countryCode?: string): string {\n return (\n countryCode\n ?.replace(/[^a-zA-Z]/g, '')\n .toUpperCase()\n .slice(0, 2) || ''\n )\n}\n\nfunction getAccountDigitsCap(countryCode: string): number {\n const length = getIbanCountryLength(countryCode) ?? 28\n return Math.max(length - 2, 0)\n}\n\nfunction buildIbanPlaceholder(countryCode: string): string {\n const accountChars = getAccountDigitsCap(countryCode)\n const groups: string[] = []\n let remaining = accountChars\n\n while (remaining > 0) {\n const take = Math.min(4, remaining)\n groups.push('0'.repeat(take))\n remaining -= take\n }\n\n return groups.join(' ')\n}\n\n// Browser-level cap: account digits plus the spaces that formatIBAN inserts between 4-char groups.\nfunction getFormattedMaxLength(countryCode: string): number {\n const accountChars = getAccountDigitsCap(countryCode)\n if (accountChars === 0) return 0\n const spaces = Math.max(0, Math.ceil(accountChars / 4) - 1)\n return accountChars + spaces\n}\n\n// Extend the grouped input with country-aware IBAN formatting and checksum validation.\nexport const MInputIBAN = forwardRef<HTMLInputElement, MInputIBANProps>(function MInputIBAN(\n {\n countryCode,\n formatOnChange = true,\n validateOnBlur = true,\n onValidationChange,\n onValueChange,\n onCountryChange,\n onClear,\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(normalizeCountryCode(countryCode) || 'PL')\n const currentCountry = normalizeCountryCode(countryCode) || internalCountry\n\n const buildDisplayValue = useCallback(\n (raw: string, country: string): string => {\n const cleaned = unformatIBAN(raw)\n .replace(/[^0-9]/g, '')\n .slice(0, getAccountDigitsCap(country))\n if (!cleaned) return ''\n return formatOnChange ? formatIBAN(cleaned) : cleaned\n },\n [formatOnChange]\n )\n\n const [internalValue, setInternalValue] = useState(() =>\n buildDisplayValue(defaultValue?.toString() ?? '', normalizeCountryCode(countryCode) || 'PL')\n )\n const [validation, setValidation] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? buildDisplayValue(value.toString(), currentCountry) : internalValue\n\n const resetValidation = useCallback(() => {\n setValidation({valid: true})\n setTouched(false)\n onValidationChange?.({valid: true})\n }, [onValidationChange])\n\n // Keep raw and formatted IBAN values aligned for consumers and display.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const formatted = buildDisplayValue(e.target.value, currentCountry)\n\n if (value === undefined) {\n setInternalValue(formatted)\n }\n\n if (!formatted && (touched || !validation.valid)) {\n resetValidation()\n }\n\n onValueChange?.(unformatIBAN(formatted), formatted)\n onChange?.(e)\n },\n [buildDisplayValue, currentCountry, onChange, onValueChange, resetValidation, touched, validation.valid, value]\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\n if (validateOnBlur && currentValue) {\n const fullIban = `${currentCountry}${unformatIBAN(currentValue)}`\n const result = validateIBAN(fullIban)\n setValidation(result)\n onValidationChange?.(result)\n }\n\n onBlur?.(e)\n },\n [currentCountry, currentValue, onBlur, onValidationChange, validateOnBlur]\n )\n\n // Reset both the displayed value and any error state when the clear button fires.\n const handleClear = useCallback(() => {\n if (value === undefined) setInternalValue('')\n resetValidation()\n onValueChange?.('', '')\n onClear?.()\n }, [onClear, onValueChange, resetValidation, value])\n\n // Switch the country code via the inline select.\n const handleCountrySelect = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n const next = normalizeCountryCode(e.target.value)\n if (!next) return\n\n if (countryCode === undefined) {\n setInternalCountry(next)\n }\n\n const reformatted = buildDisplayValue(currentValue, next)\n if (value === undefined) {\n setInternalValue(reformatted)\n }\n onValueChange?.(unformatIBAN(reformatted), reformatted)\n\n onCountryChange?.(next)\n\n if (touched && reformatted) {\n const fullIban = `${next}${unformatIBAN(reformatted)}`\n const result = validateIBAN(fullIban)\n setValidation(result)\n onValidationChange?.(result)\n }\n },\n [\n buildDisplayValue,\n countryCode,\n currentValue,\n onCountryChange,\n onValidationChange,\n onValueChange,\n touched,\n value,\n ]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n\n const countryOptions = useMemo(() => ibanCountries, [])\n const resolvedHelperText = resolvedErrorText\n ? undefined\n : (helperText ?? `Format: ${currentCountry} ${buildIbanPlaceholder(currentCountry)}`)\n\n return (\n <MInputGroup\n {...rest}\n ref={ref}\n type=\"text\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onClear={handleClear}\n error={isError}\n errorText={resolvedErrorText}\n placeholder={placeholder ?? buildIbanPlaceholder(currentCountry)}\n helperText={resolvedHelperText}\n disabled={disabled}\n maxLength={getFormattedMaxLength(currentCountry)}\n prepend={\n <div className=\"country-select-wrap\">\n <select\n className=\"country-select\"\n value={currentCountry}\n onChange={handleCountrySelect}\n disabled={disabled}\n aria-label=\"IBAN country\"\n >\n {countryOptions.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </div>\n }\n className={cn('input-iban', className)}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type * as React from 'react'\nimport type {MInputTaxIdProps, MTaxIdType} from './MInputTaxId.types'\nimport {MInput} from '../MInput'\nimport {validateNIP, validatePESEL, validateREGON} from '../../../utils/validators'\nimport {formatNIP, stripNonDigits} from '../../../utils/formatters'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCheckIcon, MIdCardIcon} from '../../../icons'\n\nconst VALIDATORS: Record<MTaxIdType, (v: string) => ValidationResult> = {\n NIP: validateNIP,\n PESEL: validatePESEL,\n REGON: validateREGON,\n}\n\nconst MAX_LENGTHS: Record<MTaxIdType, number> = {\n NIP: 13,\n PESEL: 11,\n REGON: 14,\n}\n\nconst PLACEHOLDERS: Record<MTaxIdType, 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 MInputTaxId = forwardRef<HTMLInputElement, MInputTaxIdProps>(function MInputTaxId(\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 validIcon =\n showValidIcon && isSuccess ? (\n <span className=\"validation-icon\">\n <MCheckIcon />\n </span>\n ) : undefined\n\n return (\n <MInput\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={<MIdCardIcon />}\n endIcon={validIcon}\n maxLength={MAX_LENGTHS[taxIdType]}\n />\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type * as React from 'react'\nimport type {MInputCurrencyProps} from './MInputCurrency.types'\nimport {MInput} from '../MInput'\nimport {cn} from '../../../utils/cn'\nimport {formatCurrency, parseCurrencyToNumber} from '../../../utils/formatters'\nimport './MInputCurrency.css'\n\n// Extend the base input with currency formatting and numeric callbacks.\nexport const MInputCurrency = forwardRef<HTMLInputElement, MInputCurrencyProps>(function MInputCurrency(\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=\"currency symbol\">{symbol}</span> : undefined\n\n return (\n <MInput\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('currency input', className)}\n />\n )\n})\n","import {useState, useCallback, useEffect, useRef, forwardRef} from 'react'\nimport type * as React from 'react'\nimport type {MInputDateProps} from './MInputDate.types'\nimport {MInput} from '../MInput'\nimport {stripNonDigits, formatDateInput} from '../../../utils/formatters'\nimport {validateDate, parseDateString} from '../../../utils/validators'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCalendarIcon} from '../../../icons'\n\nconst FORMAT_PLACEHOLDER: Record<string, string> = {\n 'DD/MM/YYYY': 'DD{s}MM{s}YYYY',\n 'MM/DD/YYYY': 'MM{s}DD{s}YYYY',\n 'YYYY/MM/DD': 'YYYY{s}MM{s}DD',\n}\n\n// Specialized date input with auto-formatting, parsing and validation.\n// Displays in DD/MM/YYYY (or other format) and emits a Date object.\nexport const MInputDate = forwardRef<HTMLInputElement, MInputDateProps>(function MInputDate(\n {\n format = 'DD/MM/YYYY',\n separator = '/',\n minDate,\n maxDate,\n validateOnBlur = true,\n validateOnChange = false,\n onDateChange,\n onValidationChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n onKeyDown,\n onClear,\n error,\n errorText,\n placeholder,\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 const internalChangeRef = useRef(false)\n\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n useEffect(() => {\n if (internalChangeRef.current) {\n internalChangeRef.current = false\n return\n }\n\n if (!currentValue) {\n setValidation({valid: true})\n setTouched(false)\n return\n }\n\n setValidation(validateDate(currentValue, {format, minDate, maxDate}))\n }, [currentValue, format, maxDate, minDate])\n\n const runValidation = useCallback(\n (val: string) => {\n const result = validateDate(val, {format, minDate, maxDate})\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [format, minDate, maxDate, onValidationChange]\n )\n\n const emitDate = useCallback(\n (formatted: string) => {\n const digits = stripNonDigits(formatted)\n if (digits.length === 8) {\n onDateChange?.(parseDateString(formatted, format), formatted)\n } else {\n onDateChange?.(null, formatted)\n }\n },\n [format, onDateChange]\n )\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const digits = stripNonDigits(e.target.value)\n if (digits.length > 8) return\n\n const formatted = formatDateInput(digits, format, separator)\n internalChangeRef.current = true\n\n if (value === undefined) {\n setInternalValue(formatted)\n }\n\n emitDate(formatted)\n\n if (validateOnChange && touched) {\n runValidation(formatted)\n }\n\n onChange?.(e)\n },\n [onChange, value, format, separator, validateOnChange, touched, runValidation, emitDate]\n )\n\n const handleClear = useCallback(() => {\n internalChangeRef.current = true\n if (value === undefined) {\n setInternalValue('')\n }\n setValidation({valid: true})\n setTouched(false)\n onDateChange?.(null, '')\n onClear?.()\n }, [value, onDateChange, onClear])\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n if (validateOnBlur && currentValue) {\n runValidation(currentValue)\n }\n onBlur?.(e)\n },\n [onBlur, validateOnBlur, currentValue, runValidation]\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (['Backspace', 'Delete', 'Tab', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) {\n onKeyDown?.(e)\n return\n }\n if (e.ctrlKey || e.metaKey) {\n onKeyDown?.(e)\n return\n }\n if (!/^\\d$/.test(e.key)) {\n e.preventDefault()\n }\n onKeyDown?.(e)\n },\n [onKeyDown]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n\n return (\n <MInput\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onClear={handleClear}\n error={isError}\n errorText={resolvedErrorText}\n placeholder={placeholder ?? FORMAT_PLACEHOLDER[format].replace(/\\{s\\}/g, separator)}\n startIcon={<MCalendarIcon />}\n maxLength={10}\n className={className}\n />\n )\n})\n","import {forwardRef, useCallback, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputCreditCardProps} from './MInputCreditCard.types'\nimport {MInput} from '../MInput'\nimport {cn} from '../../../utils/cn'\nimport {detectCardBrand, formatCardNumber, stripCardNumber, validateCardNumber} from '../../../utils/creditCards'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCheckIcon} from '../../../icons'\nimport './MInputCreditCard.css'\n\nfunction CardBrandBadge({value}: {value: string}) {\n const brand = detectCardBrand(value)\n\n return <span className={cn('credit-card-brand-badge', 'credit-brand', brand.brand)}>{brand.iconLabel}</span>\n}\n\n// Extend the base input with payment card detection, formatting and checksum validation.\nexport const MInputCreditCard = forwardRef<HTMLInputElement, MInputCreditCardProps>(function MInputCreditCard(\n {\n validateOnBlur = true,\n validateOnChange = false,\n showBrandIcon = true,\n showValidIcon = true,\n onValidationChange,\n onCardBrandChange,\n onValueChange,\n onClear,\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 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 // Reset validation state alongside the value when the clear button fires.\n const handleClear = useCallback(() => {\n if (value === undefined) setInternalValue('')\n setValidation({valid: true})\n setTouched(false)\n onValidationChange?.({valid: true})\n onValueChange?.('', '', 'unknown')\n onClear?.()\n }, [onClear, onValidationChange, onValueChange, value])\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=\"credit valid validation-icon credit-card-valid-icon\" aria-hidden=\"true\">\n <MCheckIcon />\n </span>\n ) : undefined\n\n return (\n <MInput\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onClear={handleClear}\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('credit-card input', className)}\n />\n )\n})\n","import {forwardRef, useCallback, useMemo, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputPostCodeProps} from './MInputPostCode.types'\nimport {MInputGroup} from '../MInputGroup'\nimport {cn} from '../../../utils/cn'\nimport {formatPostCode, getPostCodeRule, postCodeCountries, validatePostCode} from '../../../utils/postalCodes'\nimport type {ValidationResult} from '../../../utils/validators'\nimport './MInputPostCode.css'\n\n// Extend the grouped input with country-aware postal code masking and validation.\nexport const MInputPostCode = forwardRef<HTMLInputElement, MInputPostCodeProps>(function MInputPostCode(\n {\n country,\n defaultCountry = 'PL',\n selectableCountry = true,\n validateOnBlur = true,\n validateOnChange = false,\n onCountryChange,\n onValidationChange,\n onValueChange,\n onClear,\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 // Reset validation state alongside the value when the clear button fires.\n const handleClear = useCallback(() => {\n if (value === undefined) setInternalValue('')\n setValidation({valid: true})\n setTouched(false)\n onValidationChange?.({valid: true})\n onValueChange?.('', '', currentCountry)\n onClear?.()\n }, [onClear, onValidationChange, onValueChange, value, currentCountry])\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 <MInputGroup\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode={currentRule.inputMode}\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onClear={handleClear}\n error={isError}\n errorText={resolvedErrorText}\n helperText={resolvedErrorText ? undefined : (helperText ?? `Format: ${currentRule.example}`)}\n placeholder={selectableCountry ? currentRule.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 * as React from 'react'\nimport type {MInputOTPProps} from './MInputOTP.types'\nimport {cn} from '../../../utils/cn'\nimport {MCloseIcon} from '../../../icons'\nimport './MInputOTP.css'\n\nexport const MInputOTP = forwardRef<HTMLDivElement, MInputOTPProps>(function MInputOTP(\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 clearable = false,\n label,\n onClear,\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 const resolvedColorClass = error ? 'color-error' : `color-${color}`\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(\n (index: number) => {\n const clamped = Math.max(0, Math.min(index, length - 1))\n inputsRef.current[clamped]?.focus()\n },\n [length]\n )\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 const handleClear = useCallback(() => {\n updateValue('')\n onClear?.()\n focusSlot(0)\n }, [focusSlot, onClear, updateValue])\n\n return (\n <div\n ref={ref}\n className={cn('otp input', resolvedColorClass, size, disabled && 'disabled', className)}\n {...rest}\n >\n {label && <div className=\"otp label\">{label}</div>}\n <div className=\"otp control\">\n <div className=\"otp slots\" onPaste={handlePaste}>\n {Array.from({length}, (_, i) => (\n <input\n key={i}\n ref={(el) => {\n inputsRef.current[i] = el\n }}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={currentValue[i] || ''}\n disabled={disabled}\n className={cn('otp 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 {clearable && currentValue.length > 0 && !disabled && (\n <button\n type=\"button\"\n className=\"otp clear clear-btn-base\"\n onClick={handleClear}\n aria-label=\"Clear code\"\n >\n <MCloseIcon />\n </button>\n )}\n </div>\n {error && errorText && <div className=\"otp error\">{errorText}</div>}\n </div>\n )\n})\n","import {useState, useCallback, forwardRef} from 'react'\nimport type * as React from 'react'\nimport type {MInputSliderProps} from './MInputSlider.types'\nimport {MSlider} from '../../controls'\nimport {cn} from '../../../utils/cn'\nimport './MInputSlider.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 MInputSlider = forwardRef<HTMLDivElement, MInputSliderProps>(function MInputSlider(\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((val: number) => update(val), [update])\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 ref={ref} className={cn('slider input', size, disabled && 'disabled', className)} {...rest}>\n {label && <div className=\"slider label\">{label}</div>}\n <div className=\"slider row\">\n <MSlider\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('slider field', `color-${color}`)}\n value={currentValue}\n onChange={handleInputChange}\n onBlur={handleBlur}\n disabled={disabled}\n aria-label={label || 'MSlider value'}\n />\n )}\n </div>\n </div>\n )\n})\n","import {useState, useRef, useCallback, useEffect} from 'react'\nimport type * as React from 'react'\nimport type {MInputFileCropShape} from './MInputFile.types'\nimport {MButton, MSlider} from '../../controls'\nimport {MZoomInIcon} from '../../../icons'\nimport './MCropEditor.css'\n\ninterface MCropEditorProps {\n file: File\n shape: MInputFileCropShape\n outputSize: number\n quality: number\n onCrop: (cropped: File) => void\n onCancel: () => void\n}\n\nexport function MCropEditor({file, shape, outputSize, quality, onCrop, onCancel}: MCropEditorProps) {\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 handleSliderChange = useCallback(\n (newScale: number) => {\n const containerSize = 280\n const cx = containerSize / 2\n const cy = containerSize / 2\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 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(img, offset.x * ratio, offset.y * ratio, img.width * scale * ratio, img.height * scale * ratio)\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 // Convert scale to 0-100 range for MSlider and back\n const sliderValue = Math.round(((scale - 0.1) / (5 - 0.1)) * 100)\n\n const handleSliderValueChange = useCallback(\n (value: number) => {\n const newScale = 0.1 + (value / 100) * (5 - 0.1)\n handleSliderChange(newScale)\n },\n [handleSliderChange]\n )\n\n return (\n <div className=\"crop editor\">\n <div className=\"crop hint\" role=\"note\">\n Drag the image to reposition, scroll or use the slider to zoom, then click <strong>Apply</strong> to\n confirm the crop.\n </div>\n <div\n ref={containerRef}\n className={`crop 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=\"crop 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={`crop overlay ${shape}`} />\n </div>\n\n <div className=\"crop zoom\">\n <MZoomInIcon className=\"crop zoom icon\" aria-hidden=\"true\" />\n <MSlider\n min={0}\n max={100}\n step={1}\n value={sliderValue}\n onChange={handleSliderValueChange}\n color=\"primary\"\n className=\"crop zoom slider\"\n />\n </div>\n\n <div className=\"crop actions\">\n <MButton variant=\"ghost\" size=\"sm\" color=\"neutral\" onClick={onCancel}>\n Cancel\n </MButton>\n <MButton variant=\"filled\" size=\"sm\" color=\"primary\" onClick={exportCrop}>\n Apply\n </MButton>\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 * as React from 'react'\nimport type {MInputFileProps, MInputFileCropOptions} from './MInputFile.types'\nimport {MCropEditor} from './MCropEditor'\nimport {cn} from '../../../utils/cn'\nimport {\n MCloseIcon,\n MFileArchiveIcon,\n MFileCodeIcon,\n MFileDocsIcon,\n MFileExeIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFileTextIcon,\n MFileXlsIcon,\n MFileZipIcon,\n MUploadIcon,\n} from '../../../icons'\nimport './MInputFile.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 name = ext.toLowerCase()\n\n if (name === 'pdf') return <MFilePdfIcon className=\"file type icon\" aria-hidden=\"true\" />\n if (['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(name)) {\n return <MFileImageIcon className=\"file type icon\" aria-hidden=\"true\" />\n }\n if (['json'].includes(name)) return <MFileJsonIcon className=\"file type icon\" aria-hidden=\"true\" />\n if (['js', 'jsx', 'ts', 'tsx', 'html', 'css', 'php', 'xml'].includes(name)) {\n return <MFileCodeIcon className=\"file type icon\" aria-hidden=\"true\" />\n }\n if (['txt'].includes(name)) return <MFileTextIcon className=\"file type icon\" aria-hidden=\"true\" />\n if (['md'].includes(name)) return <MFileMdIcon className=\"file type icon\" aria-hidden=\"true\" />\n if (['docs', 'doc', 'docx'].includes(name)) return <MFileDocsIcon className=\"file type icon\" aria-hidden=\"true\" />\n if (['odt'].includes(name)) return <MFileOdtIcon className=\"file type icon\" aria-hidden=\"true\" />\n if (['csv', 'xls', 'xlsx'].includes(name)) return <MFileXlsIcon className=\"file type icon\" aria-hidden=\"true\" />\n if (['zip'].includes(name)) return <MFileZipIcon className=\"file type icon\" aria-hidden=\"true\" />\n if (['rar', '7z', 'tar', 'gz'].includes(name))\n return <MFileArchiveIcon className=\"file type icon\" aria-hidden=\"true\" />\n if (['mp3', 'wav', 'ogg'].includes(name)) return <MFileMp3Icon className=\"file type icon\" aria-hidden=\"true\" />\n if (['mp4', 'mov', 'avi', 'mkv', 'webm'].includes(name)) {\n return <MFileMp4Icon className=\"file type icon\" aria-hidden=\"true\" />\n }\n if (['exe', 'msi', 'bat'].includes(name)) return <MFileExeIcon className=\"file type icon\" aria-hidden=\"true\" />\n\n return <MFileIcon className=\"file type icon\" aria-hidden=\"true\" />\n}\n\nexport const MInputFile = forwardRef<HTMLDivElement, MInputFileProps>(function MInputFile(\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 clearable = false,\n icon,\n placeholder = 'Drop files here or click to browse',\n dropText = 'Drop files here',\n fullWidth = false,\n crop,\n onClear,\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: MInputFileCropOptions | 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 let accepted = Array.from(incoming)\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) => p === ext || p === mime || (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 clearFiles = useCallback(() => {\n objectUrls.forEach((url) => {\n if (url) URL.revokeObjectURL(url)\n })\n setCropFile(null)\n setFiles([])\n setFileError('')\n if (inputRef.current) {\n inputRef.current.value = ''\n }\n onChange?.([])\n onClear?.()\n }, [objectUrls, onChange, onClear])\n\n const displayError = errorText || fileError\n const hasError = error || !!fileError\n const resolvedColorClass = hasError ? 'color-error' : `color-${color}`\n\n return (\n <div\n ref={ref}\n className={cn(\n 'file input',\n resolvedColorClass,\n size,\n fullWidth && 'full-width',\n disabled && 'disabled',\n className\n )}\n {...rest}\n >\n {(label || (clearable && files.length > 0 && !disabled)) && (\n <div className=\"file header\">\n {label && <div className=\"file label\">{label}</div>}\n {clearable && files.length > 0 && !disabled && (\n <button\n type=\"button\"\n className=\"file clear clear-btn-base\"\n onClick={clearFiles}\n aria-label=\"Clear files\"\n >\n <MCloseIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n )}\n\n <div\n className={cn('file 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=\"file hidden\"\n />\n\n <div className=\"file content\">\n {icon && <div className=\"file icon\">{icon}</div>}\n {!icon && <MUploadIcon className=\"file icon default\" aria-hidden=\"true\" />}\n <div className=\"file text\">{dragging ? dropText : placeholder}</div>\n {accept && <div className=\"file accept\">{accept}</div>}\n </div>\n </div>\n\n {cropFile && cropOptions && (\n <MCropEditor\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 && <div className=\"file helper\">{helperText}</div>}\n {hasError && displayError && <div className=\"file error\">{displayError}</div>}\n\n {preview && files.length > 0 && !cropFile && (\n <div className=\"file preview\">\n {files.map((file, i) => (\n <div key={`${file.name}-${i}`} className=\"file item\">\n <div className=\"file thumb\">\n {objectUrls[i] ? (\n <img src={objectUrls[i]!} alt={file.name} className=\"file image\" />\n ) : (\n <FileTypeIcon ext={fileExtension(file.name)} />\n )}\n </div>\n <div className=\"file info\">\n <span className=\"file name\">{file.name}</span>\n <span className=\"file size\">{formatSize(file.size)}</span>\n </div>\n <button\n type=\"button\"\n className=\"file remove\"\n onClick={(e) => {\n e.stopPropagation()\n removeFile(i)\n }}\n aria-label={`Remove ${file.name}`}\n >\n <MCloseIcon aria-hidden=\"true\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n})\n"],"mappings":"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"}