Files
metabuilder/fakemui/react/components/email/inputs/EmailAddressInput.tsx
johndoe6345789 89f83a7476 Organize fakemui folder: email components complete, docs consolidated
- Email components (Phase 2 COMPLETE):
  * Fixed 18 broken imports: @metabuilder/fakemui/hooks → ../../../src/utils/useAccessible
  * Renamed email-wip/ → email/ (production-ready)
  * Enabled exports in react/components/index.ts
  * All 22 email components now production-ready (1244 lines)

- Cleanup:
  * Removed wip/ directory (duplicate of src/utils/accessibility)
  * Preserved 15 Python/PyQt6 implementation files (full implementations, not stubs)
  * Moved 7 markdown files to fakemui/docs/ (better organization)

- Documentation:
  * Updated CLAUDE.md: Phase 2 email complete, added deletion safety gotcha
  * Created plan: txt/FAKEMUI_REORGANIZATION_PLAN_2026-02-01.txt

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 20:18:49 +00:00

49 lines
1.6 KiB
TypeScript

// fakemui/react/components/email/inputs/EmailAddressInput.tsx
import React, { forwardRef } from 'react'
import { TextField, TextFieldProps } from '../../inputs/TextField'
import { useAccessible } from '../../../../src/utils/useAccessible'
export interface EmailAddressInputProps extends Omit<TextFieldProps, 'type'> {
onValidate?: (valid: boolean) => void
allowMultiple?: boolean
}
export const EmailAddressInput = forwardRef<HTMLInputElement, EmailAddressInputProps>(
({ onValidate, allowMultiple = false, testId: customTestId, ...props }, ref) => {
const accessible = useAccessible({
feature: 'email',
component: 'email-input',
identifier: customTestId || 'email'
})
const validateEmail = (value: string) => {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
if (allowMultiple) {
const emails = value.split(',').map(e => e.trim())
return emails.every(e => emailRegex.test(e) || e === '')
}
return emailRegex.test(value) || value === ''
}
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const valid = validateEmail(e.target.value)
onValidate?.(valid)
props.onChange?.(e)
}
return (
<TextField
ref={ref}
type="email"
label={props.label || (allowMultiple ? 'Recipients' : 'Email Address')}
placeholder={allowMultiple ? 'user@example.com, another@example.com' : 'user@example.com'}
{...accessible}
{...props}
onChange={handleChange}
/>
)
}
)
EmailAddressInput.displayName = 'EmailAddressInput'