@famgia/omnify-react 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks/index.cjs +26 -5
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.cts +42 -3
- package/dist/hooks/index.d.ts +42 -3
- package/dist/hooks/index.js +23 -5
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.cjs +35 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +45 -2
- package/dist/index.d.ts +45 -2
- package/dist/index.js +31 -5
- package/dist/index.js.map +1 -1
- package/dist/schemas/index.cjs +503 -0
- package/dist/schemas/index.cjs.map +1 -0
- package/dist/schemas/index.d.cts +744 -0
- package/dist/schemas/index.d.ts +744 -0
- package/dist/schemas/index.js +429 -0
- package/dist/schemas/index.js.map +1 -0
- package/package.json +35 -10
- package/scripts/build-schemas.ts +95 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/JapaneseNameField.tsx","../src/lib/zod-i18n.ts","../src/lib/form-validation.ts","../src/components/JapaneseAddressField.tsx","../src/components/JapaneseBankField.tsx","../src/hooks/use-form-mutation.ts","../src/lib/rules/kana.ts"],"sourcesContent":["/**\n * JapaneseNameField - Japanese name input component\n * Handles lastname + firstname with optional kana fields\n *\n * @example\n * ```tsx\n * import { JapaneseNameField } from '@famgia/omnify-react/components';\n *\n * <JapaneseNameField\n * schemas={customerSchemas}\n * i18n={customerI18n}\n * prefix=\"name\"\n * showKana={true}\n * />\n * ```\n */\nimport { Form, Input, Row, Col } from 'antd';\nimport type { FormInstance } from 'antd';\nimport type { RuleObject } from 'antd/es/form';\nimport { zodRule, isZodRequired } from '../lib/form-validation';\nimport { getZodLocale } from '../lib/zod-i18n';\n\nexport interface I18nConfig {\n fields: Record<string, { label?: Record<string, string>; placeholder?: Record<string, string> }>;\n}\n\nexport interface JapaneseNameFieldProps {\n /** Form instance (optional) */\n form?: FormInstance;\n /** Zod schemas for validation */\n schemas: Record<string, unknown>;\n /** i18n configuration for labels and placeholders */\n i18n: I18nConfig;\n /** Field name prefix (default: 'name') */\n prefix?: string;\n /** Override required status */\n required?: boolean;\n /** Show kana fields (default: true) */\n showKana?: boolean;\n /** Custom label for name fields */\n label?: string;\n /** Custom label for kana fields */\n kanaLabel?: string;\n}\n\nfunction getLabel(i18n: I18nConfig, field: string, locale: string): string {\n return i18n.fields[field]?.label?.[locale] ?? i18n.fields[field]?.label?.['en'] ?? field;\n}\n\nfunction getCompoundLabel(i18n: I18nConfig, prefix: string, locale: string): string | undefined {\n // Try to get compound-level label (e.g., 'name' -> '氏名')\n return i18n.fields[prefix]?.label?.[locale] ?? i18n.fields[prefix]?.label?.['en'];\n}\n\nfunction getPlaceholder(i18n: I18nConfig, field: string, locale: string): string {\n return i18n.fields[field]?.placeholder?.[locale] ?? i18n.fields[field]?.placeholder?.['en'] ?? '';\n}\n\nexport function JapaneseNameField({\n schemas,\n i18n,\n prefix = 'name',\n required = false,\n showKana = true,\n label,\n kanaLabel,\n}: JapaneseNameFieldProps) {\n const locale = getZodLocale();\n\n const lastnameField = `${prefix}_lastname`;\n const firstnameField = `${prefix}_firstname`;\n const kanaLastnameField = `${prefix}_kana_lastname`;\n const kanaFirstnameField = `${prefix}_kana_firstname`;\n\n const getRule = (field: string): RuleObject[] => {\n const schema = schemas[field];\n if (!schema) return [];\n return [zodRule(schema as any, getLabel(i18n, field, locale))];\n };\n\n // Check if a field is required by examining its Zod schema\n const isFieldRequired = (field: string): boolean => {\n const schema = schemas[field];\n if (!schema) return false;\n return isZodRequired(schema as any);\n };\n\n const nameRequired = isFieldRequired(lastnameField) || isFieldRequired(firstnameField) || required;\n const kanaRequired = isFieldRequired(kanaLastnameField) || isFieldRequired(kanaFirstnameField);\n\n // Try compound label first, then fallback to first field's label\n const nameLabel = label ?? getCompoundLabel(i18n, prefix, locale) ?? getLabel(i18n, lastnameField, locale);\n const nameKanaLabel =\n kanaLabel ??\n `${getCompoundLabel(i18n, prefix, locale) ?? getLabel(i18n, kanaLastnameField, locale)}(カナ)`;\n\n // Get short field labels (姓, 名, etc.)\n const lastnameShortLabel = locale === 'ja' ? '姓' : 'Last';\n const firstnameShortLabel = locale === 'ja' ? '名' : 'First';\n\n const prefixStyle: React.CSSProperties = {\n color: 'rgba(0, 0, 0, 0.88)',\n fontWeight: 500,\n borderRight: '1px solid #d9d9d9',\n paddingRight: 8,\n marginRight: 4,\n };\n\n return (\n <>\n <Form.Item label={nameLabel} required={nameRequired} style={{ marginBottom: 0 }}>\n <Row gutter={8}>\n <Col span={12}>\n <Form.Item name={lastnameField} rules={getRule(lastnameField)} style={{ marginBottom: 16 }}>\n <Input\n prefix={<span style={prefixStyle}>{lastnameShortLabel}</span>}\n placeholder={getPlaceholder(i18n, lastnameField, locale)}\n />\n </Form.Item>\n </Col>\n <Col span={12}>\n <Form.Item name={firstnameField} rules={getRule(firstnameField)} style={{ marginBottom: 16 }}>\n <Input\n prefix={<span style={prefixStyle}>{firstnameShortLabel}</span>}\n placeholder={getPlaceholder(i18n, firstnameField, locale)}\n />\n </Form.Item>\n </Col>\n </Row>\n </Form.Item>\n\n {showKana && (\n <Form.Item label={nameKanaLabel} required={kanaRequired} style={{ marginBottom: 0 }}>\n <Row gutter={8}>\n <Col span={12}>\n <Form.Item\n name={kanaLastnameField}\n rules={getRule(kanaLastnameField)}\n style={{ marginBottom: 16 }}\n >\n <Input\n prefix={<span style={prefixStyle}>{lastnameShortLabel}</span>}\n placeholder={getPlaceholder(i18n, kanaLastnameField, locale)}\n />\n </Form.Item>\n </Col>\n <Col span={12}>\n <Form.Item\n name={kanaFirstnameField}\n rules={getRule(kanaFirstnameField)}\n style={{ marginBottom: 16 }}\n >\n <Input\n prefix={<span style={prefixStyle}>{firstnameShortLabel}</span>}\n placeholder={getPlaceholder(i18n, kanaFirstnameField, locale)}\n />\n </Form.Item>\n </Col>\n </Row>\n </Form.Item>\n )}\n </>\n );\n}\n","/**\n * Zod i18n - Localization for Zod validation messages\n *\n * This module provides locale-aware validation messages for Zod schemas.\n * It works independently of generated schemas and can be configured at runtime.\n *\n * @example\n * ```typescript\n * import { setZodLocale, getZodMessage } from '@famgia/omnify-react/lib';\n *\n * // Set locale once at app level\n * setZodLocale('ja');\n *\n * // Get translated message\n * const msg = getZodMessage('required', { displayName: 'Email' });\n * ```\n */\n\n// Default validation messages for all supported locales\nconst DEFAULT_MESSAGES: Record<string, Record<string, string>> = {\n required: {\n en: '${displayName} is required',\n ja: '${displayName}は必須です',\n vi: '${displayName} là bắt buộc',\n ko: '${displayName}은(는) 필수입니다',\n 'zh-CN': '${displayName}是必填项',\n 'zh-TW': '${displayName}為必填欄位',\n th: '${displayName} จำเป็นต้องกรอก',\n es: '${displayName} es obligatorio',\n },\n minLength: {\n en: '${displayName} must be at least ${min} characters',\n ja: '${displayName}は${min}文字以上で入力してください',\n vi: '${displayName} phải có ít nhất ${min} ký tự',\n ko: '${displayName}은(는) ${min}자 이상이어야 합니다',\n 'zh-CN': '${displayName}至少需要${min}个字符',\n 'zh-TW': '${displayName}至少需要${min}個字元',\n th: '${displayName} ต้องมีอย่างน้อย ${min} ตัวอักษร',\n es: '${displayName} debe tener al menos ${min} caracteres',\n },\n maxLength: {\n en: '${displayName} must be at most ${max} characters',\n ja: '${displayName}は${max}文字以内で入力してください',\n vi: '${displayName} không được quá ${max} ký tự',\n ko: '${displayName}은(는) ${max}자 이하여야 합니다',\n 'zh-CN': '${displayName}最多${max}个字符',\n 'zh-TW': '${displayName}最多${max}個字元',\n th: '${displayName} ต้องไม่เกิน ${max} ตัวอักษร',\n es: '${displayName} debe tener como máximo ${max} caracteres',\n },\n min: {\n en: '${displayName} must be at least ${min}',\n ja: '${displayName}は${min}以上で入力してください',\n vi: '${displayName} phải lớn hơn hoặc bằng ${min}',\n ko: '${displayName}은(는) ${min} 이상이어야 합니다',\n 'zh-CN': '${displayName}必须大于等于${min}',\n 'zh-TW': '${displayName}必須大於等於${min}',\n th: '${displayName} ต้องมากกว่าหรือเท่ากับ ${min}',\n es: '${displayName} debe ser al menos ${min}',\n },\n max: {\n en: '${displayName} must be at most ${max}',\n ja: '${displayName}は${max}以下で入力してください',\n vi: '${displayName} phải nhỏ hơn hoặc bằng ${max}',\n ko: '${displayName}은(는) ${max} 이하여야 합니다',\n 'zh-CN': '${displayName}必须小于等于${max}',\n 'zh-TW': '${displayName}必須小於等於${max}',\n th: '${displayName} ต้องน้อยกว่าหรือเท่ากับ ${max}',\n es: '${displayName} debe ser como máximo ${max}',\n },\n email: {\n en: 'Please enter a valid email address',\n ja: '有効なメールアドレスを入力してください',\n vi: 'Vui lòng nhập địa chỉ email hợp lệ',\n ko: '유효한 이메일 주소를 입력하세요',\n 'zh-CN': '请输入有效的电子邮件地址',\n 'zh-TW': '請輸入有效的電子郵件地址',\n th: 'กรุณากรอกอีเมลที่ถูกต้อง',\n es: 'Por favor, introduce una dirección de correo electrónico válida',\n },\n url: {\n en: 'Please enter a valid URL',\n ja: '有効なURLを入力してください',\n vi: 'Vui lòng nhập URL hợp lệ',\n ko: '유효한 URL을 입력하세요',\n 'zh-CN': '请输入有效的URL',\n 'zh-TW': '請輸入有效的網址',\n th: 'กรุณากรอก URL ที่ถูกต้อง',\n es: 'Por favor, introduce una URL válida',\n },\n pattern: {\n en: '${displayName} format is invalid',\n ja: '${displayName}の形式が正しくありません',\n vi: '${displayName} không đúng định dạng',\n ko: '${displayName} 형식이 올바르지 않습니다',\n 'zh-CN': '${displayName}格式不正确',\n 'zh-TW': '${displayName}格式不正確',\n th: 'รูปแบบ${displayName}ไม่ถูกต้อง',\n es: 'El formato de ${displayName} no es válido',\n },\n};\n\n// State\nlet currentLocale = 'ja';\nlet fallbackLocale = 'en';\nlet customMessages: Record<string, Record<string, string>> = {};\n\n/**\n * Reset all settings to defaults (for testing)\n * @internal\n */\nexport function resetZodI18n(): void {\n currentLocale = 'ja';\n fallbackLocale = 'en';\n customMessages = {};\n}\n\n/**\n * Set current locale for Zod validation messages\n */\nexport function setZodLocale(locale: string): void {\n currentLocale = locale;\n}\n\n/**\n * Get current locale\n */\nexport function getZodLocale(): string {\n return currentLocale;\n}\n\n/**\n * Set fallback locale (used when message not found in current locale)\n */\nexport function setZodFallbackLocale(locale: string): void {\n fallbackLocale = locale;\n}\n\n/**\n * Get fallback locale\n */\nexport function getZodFallbackLocale(): string {\n return fallbackLocale;\n}\n\n/**\n * Add custom validation messages\n * @param messages - Object with message keys and locale values\n */\nexport function addZodMessages(messages: Record<string, Record<string, string>>): void {\n for (const [key, locales] of Object.entries(messages)) {\n customMessages[key] = { ...customMessages[key], ...locales };\n }\n}\n\n/**\n * Get translated validation message\n *\n * @param key - Message key (e.g., 'required', 'minLength')\n * @param params - Template parameters to replace\n * @returns Formatted message string\n *\n * @example\n * getZodMessage('required', { displayName: '氏名' })\n * // => '氏名は必須です'\n */\nexport function getZodMessage(\n key: string,\n params: Record<string, string | number> = {}\n): string {\n // Try custom messages first, then defaults\n const messages = customMessages[key] ?? DEFAULT_MESSAGES[key];\n if (!messages) return key;\n\n let message =\n messages[currentLocale] ??\n messages[fallbackLocale] ??\n messages['en'] ??\n key;\n\n // Replace template placeholders\n for (const [param, value] of Object.entries(params)) {\n message = message.replace(new RegExp(`\\\\$\\\\{${param}\\\\}`, 'g'), String(value));\n }\n\n return message;\n}\n\n/**\n * Get all messages for a specific locale\n */\nexport function getZodMessages(locale?: string): Record<string, string> {\n const targetLocale = locale ?? currentLocale;\n const result: Record<string, string> = {};\n\n // Start with defaults\n for (const [key, locales] of Object.entries(DEFAULT_MESSAGES)) {\n result[key] = locales[targetLocale] ?? locales[fallbackLocale] ?? locales['en'] ?? key;\n }\n\n // Override with custom\n for (const [key, locales] of Object.entries(customMessages)) {\n if (locales[targetLocale]) {\n result[key] = locales[targetLocale];\n }\n }\n\n return result;\n}\n","/**\n * Form validation utilities for Ant Design + Zod\n *\n * Compatible with Zod v3.x and v4.x\n *\n * @example\n * ```typescript\n * import { zodRule, requiredRule } from '@famgia/omnify-react/lib';\n *\n * <Form.Item\n * name=\"email\"\n * rules={[zodRule(customerSchemas.email, 'メールアドレス')]}\n * >\n * <Input />\n * </Form.Item>\n * ```\n */\n\nimport type { RuleObject } from 'antd/es/form';\nimport type { z } from 'zod';\nimport { getZodMessage } from './zod-i18n';\n\n/**\n * Convert Zod schema to Ant Design Form rule with i18n support\n *\n * @example\n * // Set locale once at component level\n * setZodLocale('ja');\n *\n * // Use without passing locale\n * <Form.Item\n * name=\"email\"\n * rules={[zodRule(customerSchemas.email, 'メールアドレス')]}\n * >\n * <Input />\n * </Form.Item>\n */\nexport function zodRule<T extends z.ZodTypeAny>(\n schema: T,\n displayName?: string\n): RuleObject {\n const field = displayName ?? 'この項目';\n\n return {\n validator: async (_, value) => {\n // 空チェック - 必須として扱う\n if (value === undefined || value === null || value === '') {\n if (schema.safeParse(undefined).success) return;\n throw new Error(getZodMessage('required', { displayName: field }));\n }\n\n const result = schema.safeParse(value);\n if (result.success) return;\n\n // 最初のZodエラーを取得\n const issue = result.error.issues[0];\n if (!issue) {\n throw new Error(getZodMessage('required', { displayName: field }));\n }\n\n // エラータイプに基づいて翻訳(Zod v3/v4対応)\n const issueAny = issue as unknown as Record<string, unknown>;\n switch (issue.code) {\n case 'too_small': {\n const origin = issueAny.origin as string | undefined;\n const minimum = issueAny.minimum as number;\n if (origin === 'string' && minimum === 1) {\n throw new Error(getZodMessage('required', { displayName: field }));\n }\n if (origin === 'string') {\n throw new Error(getZodMessage('minLength', { displayName: field, min: minimum }));\n }\n throw new Error(getZodMessage('min', { displayName: field, min: minimum }));\n }\n\n case 'too_big': {\n const origin = issueAny.origin as string | undefined;\n const maximum = issueAny.maximum as number;\n if (origin === 'string') {\n throw new Error(getZodMessage('maxLength', { displayName: field, max: maximum }));\n }\n throw new Error(getZodMessage('max', { displayName: field, max: maximum }));\n }\n\n // Zod v4: 'invalid_string' → 'invalid_format'\n case 'invalid_format': {\n const format = issueAny.format as string | undefined;\n if (format === 'email') {\n throw new Error(getZodMessage('email', { displayName: field }));\n }\n if (format === 'url') {\n throw new Error(getZodMessage('url', { displayName: field }));\n }\n if (format === 'regex') {\n throw new Error(getZodMessage('pattern', { displayName: field }));\n }\n break;\n }\n\n // Zod v3: 'invalid_string' (handled via default case for forward compatibility)\n default: {\n // Zod v3 compatibility: handle invalid_string code\n if ((issue.code as string) === 'invalid_string') {\n const validation = issueAny.validation as string | undefined;\n if (validation === 'email') {\n throw new Error(getZodMessage('email', { displayName: field }));\n }\n if (validation === 'url') {\n throw new Error(getZodMessage('url', { displayName: field }));\n }\n if (validation === 'regex') {\n throw new Error(getZodMessage('pattern', { displayName: field }));\n }\n }\n break;\n }\n\n case 'invalid_type': {\n const expected = issueAny.expected as string | undefined;\n if (expected && value === undefined) {\n throw new Error(getZodMessage('required', { displayName: field }));\n }\n break;\n }\n }\n\n // フォールバック: Zodのオリジナルメッセージを使用\n throw new Error(issue.message);\n },\n };\n}\n\n/**\n * Create required rule with i18n message\n *\n * @example\n * <Form.Item\n * name=\"name\"\n * rules={[requiredRule('名前')]}\n * >\n * <Input />\n * </Form.Item>\n */\nexport function requiredRule(displayName: string): RuleObject {\n return {\n required: true,\n message: getZodMessage('required', { displayName }),\n };\n}\n\n/**\n * Check if a Zod schema represents a required field\n */\nexport function isZodRequired(schema: z.ZodTypeAny): boolean {\n const schemaDesc = (schema as any)?._def?.typeName;\n const inner = (schema as any)?._def?.innerType;\n\n if (schemaDesc === 'ZodOptional' || schemaDesc === 'ZodNullable') return false;\n if (inner?._def?.typeName === 'ZodOptional' || inner?._def?.typeName === 'ZodNullable') return false;\n\n return true;\n}\n","/**\n * JapaneseAddressField - Japanese address input component\n * Handles postal code, prefecture, address fields with postal code lookup\n *\n * @example\n * ```tsx\n * import { JapaneseAddressField } from '@famgia/omnify-react/components';\n *\n * <JapaneseAddressField\n * form={form}\n * schemas={customerSchemas}\n * i18n={customerI18n}\n * prefix=\"address\"\n * prefectureOptions={prefectureOptions}\n * />\n * ```\n */\nimport { useState, useCallback } from 'react';\nimport { Form, Input, Select, Button, message } from 'antd';\nimport { SearchOutlined, LoadingOutlined } from '@ant-design/icons';\nimport type { FormInstance } from 'antd';\nimport type { RuleObject } from 'antd/es/form';\nimport { zodRule, isZodRequired } from '../lib/form-validation';\nimport { getZodLocale } from '../lib/zod-i18n';\n\nexport interface I18nConfig {\n fields: Record<string, { label?: Record<string, string>; placeholder?: Record<string, string> }>;\n}\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n}\n\nexport interface PostalLookupResult {\n prefecture?: string;\n prefectureCode?: string;\n prefectureName?: string;\n address1?: string;\n address2?: string;\n}\n\nexport interface JapaneseAddressFieldProps {\n /** Ant Design form instance */\n form: FormInstance;\n /** Zod schemas for validation */\n schemas: Record<string, unknown>;\n /** i18n configuration for labels and placeholders */\n i18n: I18nConfig;\n /** Field name prefix (default: 'address') */\n prefix?: string;\n /** Use prefecture ID instead of code (default: false) */\n usePrefectureId?: boolean;\n /** Prefecture options for select. If not provided, a simple input is shown */\n prefectureOptions?: SelectOption[];\n /** Enable postal code lookup (default: true) */\n enablePostalLookup?: boolean;\n /** Show search button (default: true) */\n showSearchButton?: boolean;\n /** Auto search when postal code is complete (default: true) */\n autoSearch?: boolean;\n /** Custom postal lookup function */\n onPostalLookup?: (postalCode: string) => Promise<PostalLookupResult | null>;\n}\n\nfunction getLabel(i18n: I18nConfig, field: string, locale: string): string {\n return i18n.fields[field]?.label?.[locale] ?? i18n.fields[field]?.label?.['en'] ?? field;\n}\n\nfunction getPlaceholder(i18n: I18nConfig, field: string, locale: string): string {\n return i18n.fields[field]?.placeholder?.[locale] ?? i18n.fields[field]?.placeholder?.['en'] ?? '';\n}\n\n// Default postal lookup function using zipcloud API\nasync function lookupPostalCode(postalCode: string): Promise<PostalLookupResult | null> {\n try {\n const response = await fetch(`https://zipcloud.ibsnet.co.jp/api/search?zipcode=${postalCode}`);\n const data = await response.json();\n\n if (data.results && data.results.length > 0) {\n const result = data.results[0];\n return {\n prefectureCode: result.prefcode,\n prefectureName: result.address1,\n address1: result.address2,\n address2: result.address3,\n };\n }\n return null;\n } catch (error) {\n console.error('Postal code lookup failed:', error);\n return null;\n }\n}\n\n// Localized messages\nconst MESSAGES = {\n ja: {\n searchAddress: '住所検索',\n searching: '検索中...',\n notFound: '郵便番号が見つかりませんでした',\n error: '住所検索に失敗しました',\n invalidFormat: '郵便番号の形式が正しくありません(例:123-4567)',\n },\n en: {\n searchAddress: 'Search Address',\n searching: 'Searching...',\n notFound: 'Postal code not found',\n error: 'Address lookup failed',\n invalidFormat: 'Invalid postal code format (e.g., 123-4567)',\n },\n vi: {\n searchAddress: 'Tìm địa chỉ',\n searching: 'Đang tìm...',\n notFound: 'Không tìm thấy mã bưu điện',\n error: 'Tìm địa chỉ thất bại',\n invalidFormat: 'Định dạng mã bưu điện không hợp lệ (VD: 123-4567)',\n },\n} as const;\n\nfunction getMessage(key: keyof (typeof MESSAGES)['ja'], locale: string): string {\n return (MESSAGES as any)[locale]?.[key] ?? MESSAGES.ja[key];\n}\n\nexport function JapaneseAddressField({\n form,\n schemas,\n i18n,\n prefix = 'address',\n usePrefectureId = false,\n prefectureOptions,\n enablePostalLookup = true,\n showSearchButton = true,\n autoSearch = true,\n onPostalLookup,\n}: JapaneseAddressFieldProps) {\n const locale = getZodLocale();\n const [isSearching, setIsSearching] = useState(false);\n\n // Field names\n const postalCodeField = `${prefix}_postal_code`;\n const prefectureField = usePrefectureId ? `${prefix}_prefecture_id` : `${prefix}_prefecture`;\n const address1Field = `${prefix}_address1`;\n const address2Field = `${prefix}_address2`;\n const address3Field = `${prefix}_address3`;\n\n // Get rules from schemas\n const getRule = (field: string): RuleObject[] => {\n const schema = schemas[field];\n if (!schema) return [];\n return [zodRule(schema as any, getLabel(i18n, field, locale))];\n };\n\n // Check if a field is required by examining its Zod schema description\n const isRequired = (field: string): boolean => {\n const schema = schemas[field];\n if (!schema) return false;\n return isZodRequired(schema as any);\n };\n\n // Lookup address from postal code\n const doLookup = useCallback(\n async (postalCode: string) => {\n const digits = postalCode.replace(/[^0-9]/g, '');\n if (digits.length !== 7) {\n message.warning(getMessage('invalidFormat', locale));\n return;\n }\n\n setIsSearching(true);\n try {\n const lookupFn = onPostalLookup ?? lookupPostalCode;\n const result = await lookupFn(postalCode);\n\n if (result) {\n const prefectureValue = usePrefectureId ? result.prefectureCode : result.prefecture;\n form.setFieldsValue({\n [prefectureField]: prefectureValue,\n [address1Field]: result.address1,\n [address2Field]: result.address2,\n });\n } else {\n message.info(getMessage('notFound', locale));\n }\n } catch (error) {\n message.error(getMessage('error', locale));\n console.error('Postal code lookup failed:', error);\n } finally {\n setIsSearching(false);\n }\n },\n [form, locale, onPostalLookup, prefectureField, address1Field, address2Field, usePrefectureId]\n );\n\n const handlePostalCodeChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const postalCode = e.target.value.replace(/[^0-9]/g, '');\n if (autoSearch && enablePostalLookup && postalCode.length === 7) {\n await doLookup(postalCode);\n }\n };\n\n const handleSearchClick = async () => {\n const postalCode = form.getFieldValue(postalCodeField);\n if (postalCode) {\n await doLookup(postalCode);\n }\n };\n\n return (\n <>\n {/* 郵便番号 */}\n <Form.Item\n name={postalCodeField}\n label={getLabel(i18n, postalCodeField, locale)}\n rules={getRule(postalCodeField)}\n required={isRequired(postalCodeField)}\n >\n <Input\n placeholder={getPlaceholder(i18n, postalCodeField, locale)}\n style={{ width: enablePostalLookup && showSearchButton ? 'calc(100% - 110px)' : 150 }}\n onChange={handlePostalCodeChange}\n addonAfter={\n enablePostalLookup &&\n showSearchButton && (\n <Button\n type=\"text\"\n size=\"small\"\n icon={isSearching ? <LoadingOutlined /> : <SearchOutlined />}\n onClick={handleSearchClick}\n disabled={isSearching}\n >\n {getMessage('searchAddress', locale)}\n </Button>\n )\n }\n />\n </Form.Item>\n\n {/* 都道府県 */}\n <Form.Item\n name={prefectureField}\n label={getLabel(i18n, prefectureField, locale)}\n rules={getRule(prefectureField)}\n required={isRequired(prefectureField)}\n >\n {prefectureOptions ? (\n <Select\n placeholder={getPlaceholder(i18n, prefectureField, locale)}\n options={prefectureOptions}\n style={{ width: 200 }}\n showSearch\n optionFilterProp=\"label\"\n />\n ) : (\n <Input\n placeholder={getPlaceholder(i18n, prefectureField, locale)}\n style={{ width: 200 }}\n />\n )}\n </Form.Item>\n\n {/* 市区町村 */}\n <Form.Item\n name={address1Field}\n label={getLabel(i18n, address1Field, locale)}\n rules={getRule(address1Field)}\n required={isRequired(address1Field)}\n >\n <Input placeholder={getPlaceholder(i18n, address1Field, locale)} />\n </Form.Item>\n\n {/* 番地 */}\n <Form.Item\n name={address2Field}\n label={getLabel(i18n, address2Field, locale)}\n rules={getRule(address2Field)}\n required={isRequired(address2Field)}\n >\n <Input placeholder={getPlaceholder(i18n, address2Field, locale)} />\n </Form.Item>\n\n {/* 建物名・部屋番号 */}\n <Form.Item\n name={address3Field}\n label={getLabel(i18n, address3Field, locale)}\n rules={getRule(address3Field)}\n required={isRequired(address3Field)}\n >\n <Input placeholder={getPlaceholder(i18n, address3Field, locale)} />\n </Form.Item>\n </>\n );\n}\n","/**\n * JapaneseBankField - Japanese bank account input component\n *\n * @example\n * ```tsx\n * import { JapaneseBankField } from '@famgia/omnify-react/components';\n *\n * <JapaneseBankField\n * schemas={customerSchemas}\n * i18n={customerI18n}\n * prefix=\"bank\"\n * accountTypeOptions={accountTypeOptions}\n * />\n * ```\n */\nimport { Form, Input, Select, Row, Col } from 'antd';\nimport type { FormInstance } from 'antd';\nimport type { RuleObject } from 'antd/es/form';\nimport { zodRule, isZodRequired } from '../lib/form-validation';\nimport { getZodLocale } from '../lib/zod-i18n';\n\nexport interface I18nConfig {\n fields: Record<string, { label?: Record<string, string>; placeholder?: Record<string, string> }>;\n}\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n}\n\nexport interface JapaneseBankFieldProps {\n /** Form instance (optional) */\n form?: FormInstance;\n /** Zod schemas for validation */\n schemas: Record<string, unknown>;\n /** i18n configuration for labels and placeholders */\n i18n: I18nConfig;\n /** Field name prefix (default: 'bank') */\n prefix?: string;\n /** Account type options. If not provided, a simple input is shown */\n accountTypeOptions?: SelectOption[];\n}\n\nfunction getLabel(i18n: I18nConfig, field: string, locale: string): string {\n return i18n.fields[field]?.label?.[locale] ?? i18n.fields[field]?.label?.['en'] ?? field;\n}\n\nfunction getPlaceholder(i18n: I18nConfig, field: string, locale: string): string {\n return i18n.fields[field]?.placeholder?.[locale] ?? i18n.fields[field]?.placeholder?.['en'] ?? '';\n}\n\nexport function JapaneseBankField({\n schemas,\n i18n,\n prefix = 'bank',\n accountTypeOptions,\n}: JapaneseBankFieldProps) {\n const locale = getZodLocale();\n\n const bankCodeField = `${prefix}_bank_code`;\n const bankNameField = `${prefix}_bank_name`;\n const branchCodeField = `${prefix}_branch_code`;\n const branchNameField = `${prefix}_branch_name`;\n const accountTypeField = `${prefix}_account_type`;\n const accountNumberField = `${prefix}_account_number`;\n const accountHolderField = `${prefix}_account_holder`;\n\n const getRule = (field: string): RuleObject[] => {\n const schema = schemas[field];\n if (!schema) return [];\n return [zodRule(schema as any, getLabel(i18n, field, locale))];\n };\n\n // Check if a field is required by examining its Zod schema\n const isRequired = (field: string): boolean => {\n const schema = schemas[field];\n if (!schema) return false;\n return isZodRequired(schema as any);\n };\n\n const bankRequired = isRequired(bankCodeField) || isRequired(bankNameField);\n const branchRequired = isRequired(branchCodeField) || isRequired(branchNameField);\n\n // Short labels\n const codeShortLabel = locale === 'ja' ? 'コード' : 'Code';\n const nameShortLabel = locale === 'ja' ? '名称' : 'Name';\n\n const bankLabel = locale === 'ja' ? '銀行' : 'Bank';\n const branchLabel = locale === 'ja' ? '支店' : 'Branch';\n\n const prefixStyle: React.CSSProperties = {\n color: 'rgba(0, 0, 0, 0.88)',\n fontWeight: 500,\n borderRight: '1px solid #d9d9d9',\n paddingRight: 8,\n marginRight: 4,\n };\n\n return (\n <>\n {/* 銀行コード・銀行名 */}\n <Form.Item label={bankLabel} required={bankRequired} style={{ marginBottom: 0 }}>\n <Row gutter={8}>\n <Col span={8}>\n <Form.Item name={bankCodeField} rules={getRule(bankCodeField)} style={{ marginBottom: 16 }}>\n <Input\n prefix={<span style={prefixStyle}>{codeShortLabel}</span>}\n placeholder={getPlaceholder(i18n, bankCodeField, locale)}\n maxLength={4}\n />\n </Form.Item>\n </Col>\n <Col span={16}>\n <Form.Item name={bankNameField} rules={getRule(bankNameField)} style={{ marginBottom: 16 }}>\n <Input\n prefix={<span style={prefixStyle}>{nameShortLabel}</span>}\n placeholder={getPlaceholder(i18n, bankNameField, locale)}\n />\n </Form.Item>\n </Col>\n </Row>\n </Form.Item>\n\n {/* 支店コード・支店名 */}\n <Form.Item label={branchLabel} required={branchRequired} style={{ marginBottom: 0 }}>\n <Row gutter={8}>\n <Col span={8}>\n <Form.Item\n name={branchCodeField}\n rules={getRule(branchCodeField)}\n style={{ marginBottom: 16 }}\n >\n <Input\n prefix={<span style={prefixStyle}>{codeShortLabel}</span>}\n placeholder={getPlaceholder(i18n, branchCodeField, locale)}\n maxLength={3}\n />\n </Form.Item>\n </Col>\n <Col span={16}>\n <Form.Item\n name={branchNameField}\n rules={getRule(branchNameField)}\n style={{ marginBottom: 16 }}\n >\n <Input\n prefix={<span style={prefixStyle}>{nameShortLabel}</span>}\n placeholder={getPlaceholder(i18n, branchNameField, locale)}\n />\n </Form.Item>\n </Col>\n </Row>\n </Form.Item>\n\n {/* 口座種別 */}\n <Form.Item\n name={accountTypeField}\n label={getLabel(i18n, accountTypeField, locale)}\n rules={getRule(accountTypeField)}\n required={isRequired(accountTypeField)}\n >\n {accountTypeOptions ? (\n <Select\n placeholder={getPlaceholder(i18n, accountTypeField, locale)}\n options={accountTypeOptions}\n style={{ width: 150 }}\n />\n ) : (\n <Input\n placeholder={getPlaceholder(i18n, accountTypeField, locale)}\n style={{ width: 150 }}\n />\n )}\n </Form.Item>\n\n {/* 口座番号 */}\n <Form.Item\n name={accountNumberField}\n label={getLabel(i18n, accountNumberField, locale)}\n rules={getRule(accountNumberField)}\n required={isRequired(accountNumberField)}\n >\n <Input\n placeholder={getPlaceholder(i18n, accountNumberField, locale)}\n maxLength={7}\n style={{ width: 150 }}\n />\n </Form.Item>\n\n {/* 口座名義 */}\n <Form.Item\n name={accountHolderField}\n label={getLabel(i18n, accountHolderField, locale)}\n rules={getRule(accountHolderField)}\n required={isRequired(accountHolderField)}\n >\n <Input placeholder={getPlaceholder(i18n, accountHolderField, locale)} />\n </Form.Item>\n </>\n );\n}\n","/**\n * useFormMutation - Form mutation with auto Laravel error handling\n *\n * @example\n * ```typescript\n * import { useFormMutation } from '@famgia/omnify-react/hooks';\n *\n * const mutation = useFormMutation({\n * form,\n * mutationFn: (data) => axios.post('/api/customers', data),\n * invalidateKeys: [['customers']],\n * successMessage: '保存しました',\n * });\n *\n * <Form form={form} onFinish={mutation.mutate}>\n * ...\n * <Button loading={mutation.isPending}>保存</Button>\n * </Form>\n * ```\n */\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { App } from 'antd';\nimport type { FormInstance } from 'antd';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseFormMutationOptions<TData, TResult> {\n /** Ant Design form instance */\n form: FormInstance;\n /** API call function */\n mutationFn: (data: TData) => Promise<TResult>;\n /** Query keys to invalidate on success */\n invalidateKeys?: readonly (readonly unknown[])[];\n /** Success message to show */\n successMessage?: string;\n /** Callback on success */\n onSuccess?: (data: TResult) => void;\n /** Callback on error */\n onError?: (error: unknown) => void;\n}\n\n// =============================================================================\n// Laravel Error Helpers\n// =============================================================================\n\n/**\n * Parse Laravel validation errors to Ant Design form format\n */\nfunction getFormErrors(error: unknown): { name: string; errors: string[] }[] {\n const data = (error as any)?.response?.data;\n const errors = data?.errors;\n\n if (!errors || typeof errors !== 'object') return [];\n\n return Object.entries(errors).map(([name, messages]) => ({\n name,\n errors: Array.isArray(messages) ? messages : [String(messages)],\n }));\n}\n\n/**\n * Get general validation message from Laravel response\n */\nfunction getValidationMessage(error: unknown): string | null {\n const data = (error as any)?.response?.data;\n return data?.message || null;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\nexport function useFormMutation<TData, TResult = unknown>({\n form,\n mutationFn,\n invalidateKeys = [],\n successMessage,\n onSuccess,\n onError,\n}: UseFormMutationOptions<TData, TResult>) {\n const queryClient = useQueryClient();\n const { message } = App.useApp();\n\n return useMutation({\n mutationFn,\n onSuccess: (data) => {\n // Invalidate queries\n invalidateKeys.forEach((key) => {\n queryClient.invalidateQueries({ queryKey: [...key] });\n });\n\n // Show success message\n if (successMessage) {\n message.success(successMessage);\n }\n\n // Custom callback\n onSuccess?.(data);\n },\n onError: (error) => {\n // Set form field errors from Laravel validation\n const formErrors = getFormErrors(error);\n if (formErrors.length > 0) {\n form.setFields(formErrors);\n }\n\n // Show general error message\n const validationMessage = getValidationMessage(error);\n if (validationMessage) {\n message.error(validationMessage);\n }\n\n // Custom callback\n onError?.(error);\n },\n });\n}\n","/**\n * Japanese Kana Validation Rules\n *\n * Provides configurable validation for Japanese character input:\n * - 全角カタカナ (Full-width Katakana) - default\n * - 半角カタカナ (Half-width Katakana)\n * - ひらがな (Hiragana)\n * - Mixed modes\n *\n * @example\n * ```typescript\n * import { kanaString, KATAKANA_PATTERN } from '@famgia/omnify-react/lib';\n * import { z } from 'zod';\n *\n * // Method 1: Use kanaString helper\n * const schema = z.object({\n * name_kana: kanaString(), // 全角カタカナ (default)\n * });\n *\n * // Method 2: Use pattern directly\n * const schema2 = z.object({\n * name_kana: z.string().regex(KATAKANA_PATTERN, '全角カタカナで入力してください'),\n * });\n * ```\n */\n\nimport { z } from 'zod';\n\nexport interface KanaRuleOptions {\n /** Allow full-width katakana (ア-ン) - default: true */\n fullWidthKatakana?: boolean;\n /** Allow half-width katakana (ア-ン) - default: false */\n halfWidthKatakana?: boolean;\n /** Allow hiragana (あ-ん) - default: false */\n hiragana?: boolean;\n /** Allow numbers (0-9, 0-9) - default: false */\n allowNumbers?: boolean;\n /** Allow full-width numbers (0-9) - default: false */\n fullWidthNumbers?: boolean;\n /** Allow half-width numbers (0-9) - default: false */\n halfWidthNumbers?: boolean;\n /** Allow spaces (full-width and half-width) - default: true */\n allowSpaces?: boolean;\n /** Allow specific special characters - default: ['ー', '・'] */\n allowSpecialChars?: string[];\n /** Custom error message */\n message?: string;\n}\n\n// Character ranges\nconst CHAR_RANGES = {\n // Full-width Katakana: ァ-ヶ (U+30A1-U+30F6) + ー (U+30FC)\n fullWidthKatakana: 'ァ-ヶー',\n // Half-width Katakana: ヲ-゚ (U+FF66-U+FF9F)\n halfWidthKatakana: 'ヲ-゚',\n // Hiragana: ぁ-ゖ (U+3041-U+3096)\n hiragana: 'ぁ-ゖ',\n // Full-width numbers: 0-9\n fullWidthNumbers: '0-9',\n // Half-width numbers: 0-9\n halfWidthNumbers: '0-9',\n // Full-width space: (U+3000)\n fullWidthSpace: ' ',\n // Half-width space\n halfWidthSpace: ' ',\n // Common special chars for names\n defaultSpecialChars: ['ー', '・'],\n} as const;\n\n// Default options: 全角カタカナ + spaces + ー・\nconst DEFAULT_OPTIONS: Required<KanaRuleOptions> = {\n fullWidthKatakana: true,\n halfWidthKatakana: false,\n hiragana: false,\n allowNumbers: false,\n fullWidthNumbers: false,\n halfWidthNumbers: false,\n allowSpaces: true,\n allowSpecialChars: ['ー', '・'],\n message: '',\n};\n\n/**\n * Build regex pattern from options\n */\nfunction buildKanaPattern(options: KanaRuleOptions = {}): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const parts: string[] = [];\n\n if (opts.fullWidthKatakana) {\n parts.push(CHAR_RANGES.fullWidthKatakana);\n }\n if (opts.halfWidthKatakana) {\n parts.push(CHAR_RANGES.halfWidthKatakana);\n }\n if (opts.hiragana) {\n parts.push(CHAR_RANGES.hiragana);\n }\n if (opts.allowNumbers || opts.fullWidthNumbers) {\n parts.push(CHAR_RANGES.fullWidthNumbers);\n }\n if (opts.allowNumbers || opts.halfWidthNumbers) {\n parts.push(CHAR_RANGES.halfWidthNumbers);\n }\n if (opts.allowSpaces) {\n parts.push(CHAR_RANGES.fullWidthSpace);\n parts.push(CHAR_RANGES.halfWidthSpace);\n }\n if (opts.allowSpecialChars && opts.allowSpecialChars.length > 0) {\n // Escape special regex chars\n const escaped = opts.allowSpecialChars\n .map((c) => c.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('');\n parts.push(escaped);\n }\n\n return `^[${parts.join('')}]*$`;\n}\n\n/**\n * Get default error message based on options\n */\nfunction getDefaultMessage(options: KanaRuleOptions = {}, locale = 'ja'): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const messages: Record<string, Record<string, string>> = {\n ja: {\n fullWidthKatakana: '全角カタカナ',\n halfWidthKatakana: '半角カタカナ',\n hiragana: 'ひらがな',\n mixed: 'カナ文字',\n },\n en: {\n fullWidthKatakana: 'full-width katakana',\n halfWidthKatakana: 'half-width katakana',\n hiragana: 'hiragana',\n mixed: 'kana characters',\n },\n };\n\n const msg = messages[locale] ?? messages['ja'];\n\n // Determine what type to show in message\n let type = msg.mixed;\n if (opts.fullWidthKatakana && !opts.halfWidthKatakana && !opts.hiragana) {\n type = msg.fullWidthKatakana;\n } else if (opts.halfWidthKatakana && !opts.fullWidthKatakana && !opts.hiragana) {\n type = msg.halfWidthKatakana;\n } else if (opts.hiragana && !opts.fullWidthKatakana && !opts.halfWidthKatakana) {\n type = msg.hiragana;\n }\n\n if (locale === 'ja') {\n return `${type}で入力してください`;\n }\n return `Please enter in ${type}`;\n}\n\n/**\n * Create a kana validation regex\n */\nexport function createKanaRegex(options: KanaRuleOptions = {}): RegExp {\n return new RegExp(buildKanaPattern(options));\n}\n\n/**\n * Validate a string against kana rules\n */\nexport function validateKana(value: string, options: KanaRuleOptions = {}): boolean {\n if (!value) return true; // Empty is valid (use required for that)\n const regex = createKanaRegex(options);\n return regex.test(value);\n}\n\n/**\n * Get kana validation pattern string (for Zod .regex())\n */\nexport function getKanaPattern(options: KanaRuleOptions = {}): string {\n return buildKanaPattern(options);\n}\n\n/**\n * Get error message for kana validation\n */\nexport function getKanaErrorMessage(options: KanaRuleOptions = {}, locale = 'ja'): string {\n return options.message ?? getDefaultMessage(options, locale);\n}\n\n// ============================================================================\n// Preset configurations\n// ============================================================================\n\n/** 全角カタカナ (Full-width Katakana) - Default for Japanese names */\nexport const KATAKANA_FULL_WIDTH: KanaRuleOptions = {\n fullWidthKatakana: true,\n halfWidthKatakana: false,\n hiragana: false,\n allowSpaces: true,\n allowSpecialChars: ['ー', '・'],\n};\n\n/** 半角カタカナ (Half-width Katakana) - Legacy systems */\nexport const KATAKANA_HALF_WIDTH: KanaRuleOptions = {\n fullWidthKatakana: false,\n halfWidthKatakana: true,\n hiragana: false,\n allowSpaces: true,\n allowSpecialChars: ['ー'], // Half-width prolonged sound mark\n};\n\n/** ひらがな (Hiragana) */\nexport const HIRAGANA: KanaRuleOptions = {\n fullWidthKatakana: false,\n halfWidthKatakana: false,\n hiragana: true,\n allowSpaces: true,\n allowSpecialChars: ['ー'],\n};\n\n/** カタカナ + ひらがな (Any kana) */\nexport const KANA_ANY: KanaRuleOptions = {\n fullWidthKatakana: true,\n halfWidthKatakana: true,\n hiragana: true,\n allowSpaces: true,\n allowSpecialChars: ['ー', '・', 'ー'],\n};\n\n/** 全角カタカナ + 数字 (Full-width katakana with numbers) */\nexport const KATAKANA_WITH_NUMBERS: KanaRuleOptions = {\n fullWidthKatakana: true,\n halfWidthKatakana: false,\n hiragana: false,\n allowNumbers: true,\n allowSpaces: true,\n allowSpecialChars: ['ー', '・'],\n};\n\n// ============================================================================\n// Pattern strings for Zod .regex()\n// ============================================================================\n\n/** Pattern: 全角カタカナ + スペース + ー・ (for z.string().regex()) */\nexport const KATAKANA_PATTERN = /^[ァ-ヶー・ ]*$/;\n\n/** Pattern: 半角カタカナ (for z.string().regex()) */\nexport const KATAKANA_HALF_PATTERN = /^[ヲ-゚ー ]*$/;\n\n/** Pattern: ひらがな (for z.string().regex()) */\nexport const HIRAGANA_PATTERN = /^[ぁ-ゖー ]*$/;\n\n/** Pattern: すべてのかな (for z.string().regex()) */\nexport const KANA_ANY_PATTERN = /^[ァ-ヶぁ-ゖヲ-゚ー・ー ]*$/;\n\n// ============================================================================\n// Zod refinement helpers\n// ============================================================================\n\n/**\n * Create Zod string schema with kana validation\n * @example\n * const schema = z.object({\n * name_kana: kanaString(), // 全角カタカナ (default)\n * name_kana2: kanaString({ hiragana: true }), // カタカナ + ひらがな\n * });\n */\nexport function kanaString(options: KanaRuleOptions = {}) {\n const opts = { ...KATAKANA_FULL_WIDTH, ...options };\n const regex = createKanaRegex(opts);\n const message = getKanaErrorMessage(opts);\n\n return z.string().regex(regex, { message });\n}\n\n/**\n * Add kana validation to existing Zod string schema\n * @example\n * const schema = z.string().min(1).pipe(withKana());\n */\nexport function withKana(options: KanaRuleOptions = {}) {\n return kanaString(options);\n}\n\n// Default export\nexport const kanaRules = {\n createRegex: createKanaRegex,\n validate: validateKana,\n getPattern: getKanaPattern,\n getMessage: getKanaErrorMessage,\n // Zod helpers\n string: kanaString,\n // Presets\n presets: {\n fullWidthKatakana: KATAKANA_FULL_WIDTH,\n halfWidthKatakana: KATAKANA_HALF_WIDTH,\n hiragana: HIRAGANA,\n any: KANA_ANY,\n withNumbers: KATAKANA_WITH_NUMBERS,\n },\n // Pattern constants for direct use\n patterns: {\n katakana: KATAKANA_PATTERN,\n katakanaHalf: KATAKANA_HALF_PATTERN,\n hiragana: HIRAGANA_PATTERN,\n any: KANA_ANY_PATTERN,\n },\n};\n"],"mappings":"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","names":["message","Form","Input","Fragment","jsx","jsxs","getLabel","getPlaceholder","Form","Input","Form","Input","Select","Row","Col","Fragment","jsx","jsxs","getLabel","getPlaceholder","Form","Row","Col","Input","Select","message","message"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/JapaneseNameField.tsx","../src/lib/zod-i18n.ts","../src/lib/form-validation.ts","../src/components/JapaneseAddressField.tsx","../src/components/JapaneseBankField.tsx","../src/hooks/use-form-mutation.ts","../src/lib/rules/kana.ts","../src/index.ts"],"sourcesContent":["/**\n * JapaneseNameField - Japanese name input component\n * Handles lastname + firstname with optional kana fields\n *\n * @example\n * ```tsx\n * import { JapaneseNameField } from '@famgia/omnify-react/components';\n *\n * <JapaneseNameField\n * schemas={customerSchemas}\n * i18n={customerI18n}\n * prefix=\"name\"\n * showKana={true}\n * />\n * ```\n */\nimport { Form, Input, Row, Col } from 'antd';\nimport type { FormInstance } from 'antd';\nimport type { RuleObject } from 'antd/es/form';\nimport { zodRule, isZodRequired } from '../lib/form-validation';\nimport { getZodLocale } from '../lib/zod-i18n';\n\nexport interface I18nConfig {\n fields: Record<string, { label?: Record<string, string>; placeholder?: Record<string, string> }>;\n}\n\nexport interface JapaneseNameFieldProps {\n /** Form instance (optional) */\n form?: FormInstance;\n /** Zod schemas for validation */\n schemas: Record<string, unknown>;\n /** i18n configuration for labels and placeholders */\n i18n: I18nConfig;\n /** Field name prefix (default: 'name') */\n prefix?: string;\n /** Override required status */\n required?: boolean;\n /** Show kana fields (default: true) */\n showKana?: boolean;\n /** Custom label for name fields */\n label?: string;\n /** Custom label for kana fields */\n kanaLabel?: string;\n}\n\nfunction getLabel(i18n: I18nConfig, field: string, locale: string): string {\n return i18n.fields[field]?.label?.[locale] ?? i18n.fields[field]?.label?.['en'] ?? field;\n}\n\nfunction getCompoundLabel(i18n: I18nConfig, prefix: string, locale: string): string | undefined {\n // Try to get compound-level label (e.g., 'name' -> '氏名')\n return i18n.fields[prefix]?.label?.[locale] ?? i18n.fields[prefix]?.label?.['en'];\n}\n\nfunction getPlaceholder(i18n: I18nConfig, field: string, locale: string): string {\n return i18n.fields[field]?.placeholder?.[locale] ?? i18n.fields[field]?.placeholder?.['en'] ?? '';\n}\n\nexport function JapaneseNameField({\n schemas,\n i18n,\n prefix = 'name',\n required = false,\n showKana = true,\n label,\n kanaLabel,\n}: JapaneseNameFieldProps) {\n const locale = getZodLocale();\n\n const lastnameField = `${prefix}_lastname`;\n const firstnameField = `${prefix}_firstname`;\n const kanaLastnameField = `${prefix}_kana_lastname`;\n const kanaFirstnameField = `${prefix}_kana_firstname`;\n\n const getRule = (field: string): RuleObject[] => {\n const schema = schemas[field];\n if (!schema) return [];\n return [zodRule(schema as any, getLabel(i18n, field, locale))];\n };\n\n // Check if a field is required by examining its Zod schema\n const isFieldRequired = (field: string): boolean => {\n const schema = schemas[field];\n if (!schema) return false;\n return isZodRequired(schema as any);\n };\n\n const nameRequired = isFieldRequired(lastnameField) || isFieldRequired(firstnameField) || required;\n const kanaRequired = isFieldRequired(kanaLastnameField) || isFieldRequired(kanaFirstnameField);\n\n // Try compound label first, then fallback to first field's label\n const nameLabel = label ?? getCompoundLabel(i18n, prefix, locale) ?? getLabel(i18n, lastnameField, locale);\n const nameKanaLabel =\n kanaLabel ??\n `${getCompoundLabel(i18n, prefix, locale) ?? getLabel(i18n, kanaLastnameField, locale)}(カナ)`;\n\n // Get short field labels (姓, 名, etc.)\n const lastnameShortLabel = locale === 'ja' ? '姓' : 'Last';\n const firstnameShortLabel = locale === 'ja' ? '名' : 'First';\n\n const prefixStyle: React.CSSProperties = {\n color: 'rgba(0, 0, 0, 0.88)',\n fontWeight: 500,\n borderRight: '1px solid #d9d9d9',\n paddingRight: 8,\n marginRight: 4,\n };\n\n return (\n <>\n <Form.Item label={nameLabel} required={nameRequired} style={{ marginBottom: 0 }}>\n <Row gutter={8}>\n <Col span={12}>\n <Form.Item name={lastnameField} rules={getRule(lastnameField)} style={{ marginBottom: 16 }}>\n <Input\n prefix={<span style={prefixStyle}>{lastnameShortLabel}</span>}\n placeholder={getPlaceholder(i18n, lastnameField, locale)}\n />\n </Form.Item>\n </Col>\n <Col span={12}>\n <Form.Item name={firstnameField} rules={getRule(firstnameField)} style={{ marginBottom: 16 }}>\n <Input\n prefix={<span style={prefixStyle}>{firstnameShortLabel}</span>}\n placeholder={getPlaceholder(i18n, firstnameField, locale)}\n />\n </Form.Item>\n </Col>\n </Row>\n </Form.Item>\n\n {showKana && (\n <Form.Item label={nameKanaLabel} required={kanaRequired} style={{ marginBottom: 0 }}>\n <Row gutter={8}>\n <Col span={12}>\n <Form.Item\n name={kanaLastnameField}\n rules={getRule(kanaLastnameField)}\n style={{ marginBottom: 16 }}\n >\n <Input\n prefix={<span style={prefixStyle}>{lastnameShortLabel}</span>}\n placeholder={getPlaceholder(i18n, kanaLastnameField, locale)}\n />\n </Form.Item>\n </Col>\n <Col span={12}>\n <Form.Item\n name={kanaFirstnameField}\n rules={getRule(kanaFirstnameField)}\n style={{ marginBottom: 16 }}\n >\n <Input\n prefix={<span style={prefixStyle}>{firstnameShortLabel}</span>}\n placeholder={getPlaceholder(i18n, kanaFirstnameField, locale)}\n />\n </Form.Item>\n </Col>\n </Row>\n </Form.Item>\n )}\n </>\n );\n}\n","/**\n * Zod i18n - Localization for Zod validation messages\n *\n * This module provides locale-aware validation messages for Zod schemas.\n * It works independently of generated schemas and can be configured at runtime.\n *\n * @example\n * ```typescript\n * import { setZodLocale, getZodMessage } from '@famgia/omnify-react/lib';\n *\n * // Set locale once at app level\n * setZodLocale('ja');\n *\n * // Get translated message\n * const msg = getZodMessage('required', { displayName: 'Email' });\n * ```\n */\n\n// Default validation messages for all supported locales\nconst DEFAULT_MESSAGES: Record<string, Record<string, string>> = {\n required: {\n en: '${displayName} is required',\n ja: '${displayName}は必須です',\n vi: '${displayName} là bắt buộc',\n ko: '${displayName}은(는) 필수입니다',\n 'zh-CN': '${displayName}是必填项',\n 'zh-TW': '${displayName}為必填欄位',\n th: '${displayName} จำเป็นต้องกรอก',\n es: '${displayName} es obligatorio',\n },\n minLength: {\n en: '${displayName} must be at least ${min} characters',\n ja: '${displayName}は${min}文字以上で入力してください',\n vi: '${displayName} phải có ít nhất ${min} ký tự',\n ko: '${displayName}은(는) ${min}자 이상이어야 합니다',\n 'zh-CN': '${displayName}至少需要${min}个字符',\n 'zh-TW': '${displayName}至少需要${min}個字元',\n th: '${displayName} ต้องมีอย่างน้อย ${min} ตัวอักษร',\n es: '${displayName} debe tener al menos ${min} caracteres',\n },\n maxLength: {\n en: '${displayName} must be at most ${max} characters',\n ja: '${displayName}は${max}文字以内で入力してください',\n vi: '${displayName} không được quá ${max} ký tự',\n ko: '${displayName}은(는) ${max}자 이하여야 합니다',\n 'zh-CN': '${displayName}最多${max}个字符',\n 'zh-TW': '${displayName}最多${max}個字元',\n th: '${displayName} ต้องไม่เกิน ${max} ตัวอักษร',\n es: '${displayName} debe tener como máximo ${max} caracteres',\n },\n min: {\n en: '${displayName} must be at least ${min}',\n ja: '${displayName}は${min}以上で入力してください',\n vi: '${displayName} phải lớn hơn hoặc bằng ${min}',\n ko: '${displayName}은(는) ${min} 이상이어야 합니다',\n 'zh-CN': '${displayName}必须大于等于${min}',\n 'zh-TW': '${displayName}必須大於等於${min}',\n th: '${displayName} ต้องมากกว่าหรือเท่ากับ ${min}',\n es: '${displayName} debe ser al menos ${min}',\n },\n max: {\n en: '${displayName} must be at most ${max}',\n ja: '${displayName}は${max}以下で入力してください',\n vi: '${displayName} phải nhỏ hơn hoặc bằng ${max}',\n ko: '${displayName}은(는) ${max} 이하여야 합니다',\n 'zh-CN': '${displayName}必须小于等于${max}',\n 'zh-TW': '${displayName}必須小於等於${max}',\n th: '${displayName} ต้องน้อยกว่าหรือเท่ากับ ${max}',\n es: '${displayName} debe ser como máximo ${max}',\n },\n email: {\n en: 'Please enter a valid email address',\n ja: '有効なメールアドレスを入力してください',\n vi: 'Vui lòng nhập địa chỉ email hợp lệ',\n ko: '유효한 이메일 주소를 입력하세요',\n 'zh-CN': '请输入有效的电子邮件地址',\n 'zh-TW': '請輸入有效的電子郵件地址',\n th: 'กรุณากรอกอีเมลที่ถูกต้อง',\n es: 'Por favor, introduce una dirección de correo electrónico válida',\n },\n url: {\n en: 'Please enter a valid URL',\n ja: '有効なURLを入力してください',\n vi: 'Vui lòng nhập URL hợp lệ',\n ko: '유효한 URL을 입력하세요',\n 'zh-CN': '请输入有效的URL',\n 'zh-TW': '請輸入有效的網址',\n th: 'กรุณากรอก URL ที่ถูกต้อง',\n es: 'Por favor, introduce una URL válida',\n },\n pattern: {\n en: '${displayName} format is invalid',\n ja: '${displayName}の形式が正しくありません',\n vi: '${displayName} không đúng định dạng',\n ko: '${displayName} 형식이 올바르지 않습니다',\n 'zh-CN': '${displayName}格式不正确',\n 'zh-TW': '${displayName}格式不正確',\n th: 'รูปแบบ${displayName}ไม่ถูกต้อง',\n es: 'El formato de ${displayName} no es válido',\n },\n};\n\n// State\nlet currentLocale = 'ja';\nlet fallbackLocale = 'en';\nlet customMessages: Record<string, Record<string, string>> = {};\n\n/**\n * Reset all settings to defaults (for testing)\n * @internal\n */\nexport function resetZodI18n(): void {\n currentLocale = 'ja';\n fallbackLocale = 'en';\n customMessages = {};\n}\n\n/**\n * Set current locale for Zod validation messages\n */\nexport function setZodLocale(locale: string): void {\n currentLocale = locale;\n}\n\n/**\n * Get current locale\n */\nexport function getZodLocale(): string {\n return currentLocale;\n}\n\n/**\n * Set fallback locale (used when message not found in current locale)\n */\nexport function setZodFallbackLocale(locale: string): void {\n fallbackLocale = locale;\n}\n\n/**\n * Get fallback locale\n */\nexport function getZodFallbackLocale(): string {\n return fallbackLocale;\n}\n\n/**\n * Add custom validation messages\n * @param messages - Object with message keys and locale values\n */\nexport function addZodMessages(messages: Record<string, Record<string, string>>): void {\n for (const [key, locales] of Object.entries(messages)) {\n customMessages[key] = { ...customMessages[key], ...locales };\n }\n}\n\n/**\n * Get translated validation message\n *\n * @param key - Message key (e.g., 'required', 'minLength')\n * @param params - Template parameters to replace\n * @returns Formatted message string\n *\n * @example\n * getZodMessage('required', { displayName: '氏名' })\n * // => '氏名は必須です'\n */\nexport function getZodMessage(\n key: string,\n params: Record<string, string | number> = {}\n): string {\n // Try custom messages first, then defaults\n const messages = customMessages[key] ?? DEFAULT_MESSAGES[key];\n if (!messages) return key;\n\n let message =\n messages[currentLocale] ??\n messages[fallbackLocale] ??\n messages['en'] ??\n key;\n\n // Replace template placeholders\n for (const [param, value] of Object.entries(params)) {\n message = message.replace(new RegExp(`\\\\$\\\\{${param}\\\\}`, 'g'), String(value));\n }\n\n return message;\n}\n\n/**\n * Get all messages for a specific locale\n */\nexport function getZodMessages(locale?: string): Record<string, string> {\n const targetLocale = locale ?? currentLocale;\n const result: Record<string, string> = {};\n\n // Start with defaults\n for (const [key, locales] of Object.entries(DEFAULT_MESSAGES)) {\n result[key] = locales[targetLocale] ?? locales[fallbackLocale] ?? locales['en'] ?? key;\n }\n\n // Override with custom\n for (const [key, locales] of Object.entries(customMessages)) {\n if (locales[targetLocale]) {\n result[key] = locales[targetLocale];\n }\n }\n\n return result;\n}\n","/**\n * Form validation utilities for Ant Design + Zod\n *\n * Compatible with Zod v3.x and v4.x\n *\n * @example\n * ```typescript\n * import { zodRule, requiredRule } from '@famgia/omnify-react/lib';\n *\n * <Form.Item\n * name=\"email\"\n * rules={[zodRule(customerSchemas.email, 'メールアドレス')]}\n * >\n * <Input />\n * </Form.Item>\n * ```\n */\n\nimport type { RuleObject } from 'antd/es/form';\nimport type { z } from 'zod';\nimport { getZodMessage } from './zod-i18n';\n\n/**\n * Convert Zod schema to Ant Design Form rule with i18n support\n *\n * @example\n * // Set locale once at component level\n * setZodLocale('ja');\n *\n * // Use without passing locale\n * <Form.Item\n * name=\"email\"\n * rules={[zodRule(customerSchemas.email, 'メールアドレス')]}\n * >\n * <Input />\n * </Form.Item>\n */\nexport function zodRule<T extends z.ZodTypeAny>(\n schema: T,\n displayName?: string\n): RuleObject {\n const field = displayName ?? 'この項目';\n\n return {\n validator: async (_, value) => {\n // 空チェック - 必須として扱う\n if (value === undefined || value === null || value === '') {\n if (schema.safeParse(undefined).success) return;\n throw new Error(getZodMessage('required', { displayName: field }));\n }\n\n const result = schema.safeParse(value);\n if (result.success) return;\n\n // 最初のZodエラーを取得\n const issue = result.error.issues[0];\n if (!issue) {\n throw new Error(getZodMessage('required', { displayName: field }));\n }\n\n // エラータイプに基づいて翻訳(Zod v3/v4対応)\n const issueAny = issue as unknown as Record<string, unknown>;\n switch (issue.code) {\n case 'too_small': {\n const origin = issueAny.origin as string | undefined;\n const minimum = issueAny.minimum as number;\n if (origin === 'string' && minimum === 1) {\n throw new Error(getZodMessage('required', { displayName: field }));\n }\n if (origin === 'string') {\n throw new Error(getZodMessage('minLength', { displayName: field, min: minimum }));\n }\n throw new Error(getZodMessage('min', { displayName: field, min: minimum }));\n }\n\n case 'too_big': {\n const origin = issueAny.origin as string | undefined;\n const maximum = issueAny.maximum as number;\n if (origin === 'string') {\n throw new Error(getZodMessage('maxLength', { displayName: field, max: maximum }));\n }\n throw new Error(getZodMessage('max', { displayName: field, max: maximum }));\n }\n\n // Zod v4: 'invalid_string' → 'invalid_format'\n case 'invalid_format': {\n const format = issueAny.format as string | undefined;\n if (format === 'email') {\n throw new Error(getZodMessage('email', { displayName: field }));\n }\n if (format === 'url') {\n throw new Error(getZodMessage('url', { displayName: field }));\n }\n if (format === 'regex') {\n throw new Error(getZodMessage('pattern', { displayName: field }));\n }\n break;\n }\n\n // Zod v3: 'invalid_string' (handled via default case for forward compatibility)\n default: {\n // Zod v3 compatibility: handle invalid_string code\n if ((issue.code as string) === 'invalid_string') {\n const validation = issueAny.validation as string | undefined;\n if (validation === 'email') {\n throw new Error(getZodMessage('email', { displayName: field }));\n }\n if (validation === 'url') {\n throw new Error(getZodMessage('url', { displayName: field }));\n }\n if (validation === 'regex') {\n throw new Error(getZodMessage('pattern', { displayName: field }));\n }\n }\n break;\n }\n\n case 'invalid_type': {\n const expected = issueAny.expected as string | undefined;\n if (expected && value === undefined) {\n throw new Error(getZodMessage('required', { displayName: field }));\n }\n break;\n }\n }\n\n // フォールバック: Zodのオリジナルメッセージを使用\n throw new Error(issue.message);\n },\n };\n}\n\n/**\n * Create required rule with i18n message\n *\n * @example\n * <Form.Item\n * name=\"name\"\n * rules={[requiredRule('名前')]}\n * >\n * <Input />\n * </Form.Item>\n */\nexport function requiredRule(displayName: string): RuleObject {\n return {\n required: true,\n message: getZodMessage('required', { displayName }),\n };\n}\n\n/**\n * Check if a Zod schema represents a required field\n */\nexport function isZodRequired(schema: z.ZodTypeAny): boolean {\n const schemaDesc = (schema as any)?._def?.typeName;\n const inner = (schema as any)?._def?.innerType;\n\n if (schemaDesc === 'ZodOptional' || schemaDesc === 'ZodNullable') return false;\n if (inner?._def?.typeName === 'ZodOptional' || inner?._def?.typeName === 'ZodNullable') return false;\n\n return true;\n}\n","/**\n * JapaneseAddressField - Japanese address input component\n * Handles postal code, prefecture, address fields with postal code lookup\n *\n * @example\n * ```tsx\n * import { JapaneseAddressField } from '@famgia/omnify-react/components';\n *\n * <JapaneseAddressField\n * form={form}\n * schemas={customerSchemas}\n * i18n={customerI18n}\n * prefix=\"address\"\n * prefectureOptions={prefectureOptions}\n * />\n * ```\n */\nimport { useState, useCallback } from 'react';\nimport { Form, Input, Select, Button, message } from 'antd';\nimport { SearchOutlined, LoadingOutlined } from '@ant-design/icons';\nimport type { FormInstance } from 'antd';\nimport type { RuleObject } from 'antd/es/form';\nimport { zodRule, isZodRequired } from '../lib/form-validation';\nimport { getZodLocale } from '../lib/zod-i18n';\n\nexport interface I18nConfig {\n fields: Record<string, { label?: Record<string, string>; placeholder?: Record<string, string> }>;\n}\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n}\n\nexport interface PostalLookupResult {\n prefecture?: string;\n prefectureCode?: string;\n prefectureName?: string;\n address1?: string;\n address2?: string;\n}\n\nexport interface JapaneseAddressFieldProps {\n /** Ant Design form instance */\n form: FormInstance;\n /** Zod schemas for validation */\n schemas: Record<string, unknown>;\n /** i18n configuration for labels and placeholders */\n i18n: I18nConfig;\n /** Field name prefix (default: 'address') */\n prefix?: string;\n /** Use prefecture ID instead of code (default: false) */\n usePrefectureId?: boolean;\n /** Prefecture options for select. If not provided, a simple input is shown */\n prefectureOptions?: SelectOption[];\n /** Enable postal code lookup (default: true) */\n enablePostalLookup?: boolean;\n /** Show search button (default: true) */\n showSearchButton?: boolean;\n /** Auto search when postal code is complete (default: true) */\n autoSearch?: boolean;\n /** Custom postal lookup function */\n onPostalLookup?: (postalCode: string) => Promise<PostalLookupResult | null>;\n}\n\nfunction getLabel(i18n: I18nConfig, field: string, locale: string): string {\n return i18n.fields[field]?.label?.[locale] ?? i18n.fields[field]?.label?.['en'] ?? field;\n}\n\nfunction getPlaceholder(i18n: I18nConfig, field: string, locale: string): string {\n return i18n.fields[field]?.placeholder?.[locale] ?? i18n.fields[field]?.placeholder?.['en'] ?? '';\n}\n\n// Default postal lookup function using zipcloud API\nasync function lookupPostalCode(postalCode: string): Promise<PostalLookupResult | null> {\n try {\n const response = await fetch(`https://zipcloud.ibsnet.co.jp/api/search?zipcode=${postalCode}`);\n const data = await response.json();\n\n if (data.results && data.results.length > 0) {\n const result = data.results[0];\n return {\n prefectureCode: result.prefcode,\n prefectureName: result.address1,\n address1: result.address2,\n address2: result.address3,\n };\n }\n return null;\n } catch (error) {\n console.error('Postal code lookup failed:', error);\n return null;\n }\n}\n\n// Localized messages\nconst MESSAGES = {\n ja: {\n searchAddress: '住所検索',\n searching: '検索中...',\n notFound: '郵便番号が見つかりませんでした',\n error: '住所検索に失敗しました',\n invalidFormat: '郵便番号の形式が正しくありません(例:123-4567)',\n },\n en: {\n searchAddress: 'Search Address',\n searching: 'Searching...',\n notFound: 'Postal code not found',\n error: 'Address lookup failed',\n invalidFormat: 'Invalid postal code format (e.g., 123-4567)',\n },\n vi: {\n searchAddress: 'Tìm địa chỉ',\n searching: 'Đang tìm...',\n notFound: 'Không tìm thấy mã bưu điện',\n error: 'Tìm địa chỉ thất bại',\n invalidFormat: 'Định dạng mã bưu điện không hợp lệ (VD: 123-4567)',\n },\n} as const;\n\nfunction getMessage(key: keyof (typeof MESSAGES)['ja'], locale: string): string {\n return (MESSAGES as any)[locale]?.[key] ?? MESSAGES.ja[key];\n}\n\nexport function JapaneseAddressField({\n form,\n schemas,\n i18n,\n prefix = 'address',\n usePrefectureId = false,\n prefectureOptions,\n enablePostalLookup = true,\n showSearchButton = true,\n autoSearch = true,\n onPostalLookup,\n}: JapaneseAddressFieldProps) {\n const locale = getZodLocale();\n const [isSearching, setIsSearching] = useState(false);\n\n // Field names\n const postalCodeField = `${prefix}_postal_code`;\n const prefectureField = usePrefectureId ? `${prefix}_prefecture_id` : `${prefix}_prefecture`;\n const address1Field = `${prefix}_address1`;\n const address2Field = `${prefix}_address2`;\n const address3Field = `${prefix}_address3`;\n\n // Get rules from schemas\n const getRule = (field: string): RuleObject[] => {\n const schema = schemas[field];\n if (!schema) return [];\n return [zodRule(schema as any, getLabel(i18n, field, locale))];\n };\n\n // Check if a field is required by examining its Zod schema description\n const isRequired = (field: string): boolean => {\n const schema = schemas[field];\n if (!schema) return false;\n return isZodRequired(schema as any);\n };\n\n // Lookup address from postal code\n const doLookup = useCallback(\n async (postalCode: string) => {\n const digits = postalCode.replace(/[^0-9]/g, '');\n if (digits.length !== 7) {\n message.warning(getMessage('invalidFormat', locale));\n return;\n }\n\n setIsSearching(true);\n try {\n const lookupFn = onPostalLookup ?? lookupPostalCode;\n const result = await lookupFn(postalCode);\n\n if (result) {\n const prefectureValue = usePrefectureId ? result.prefectureCode : result.prefecture;\n form.setFieldsValue({\n [prefectureField]: prefectureValue,\n [address1Field]: result.address1,\n [address2Field]: result.address2,\n });\n } else {\n message.info(getMessage('notFound', locale));\n }\n } catch (error) {\n message.error(getMessage('error', locale));\n console.error('Postal code lookup failed:', error);\n } finally {\n setIsSearching(false);\n }\n },\n [form, locale, onPostalLookup, prefectureField, address1Field, address2Field, usePrefectureId]\n );\n\n const handlePostalCodeChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const postalCode = e.target.value.replace(/[^0-9]/g, '');\n if (autoSearch && enablePostalLookup && postalCode.length === 7) {\n await doLookup(postalCode);\n }\n };\n\n const handleSearchClick = async () => {\n const postalCode = form.getFieldValue(postalCodeField);\n if (postalCode) {\n await doLookup(postalCode);\n }\n };\n\n return (\n <>\n {/* 郵便番号 */}\n <Form.Item\n name={postalCodeField}\n label={getLabel(i18n, postalCodeField, locale)}\n rules={getRule(postalCodeField)}\n required={isRequired(postalCodeField)}\n >\n <Input\n placeholder={getPlaceholder(i18n, postalCodeField, locale)}\n style={{ width: enablePostalLookup && showSearchButton ? 'calc(100% - 110px)' : 150 }}\n onChange={handlePostalCodeChange}\n addonAfter={\n enablePostalLookup &&\n showSearchButton && (\n <Button\n type=\"text\"\n size=\"small\"\n icon={isSearching ? <LoadingOutlined /> : <SearchOutlined />}\n onClick={handleSearchClick}\n disabled={isSearching}\n >\n {getMessage('searchAddress', locale)}\n </Button>\n )\n }\n />\n </Form.Item>\n\n {/* 都道府県 */}\n <Form.Item\n name={prefectureField}\n label={getLabel(i18n, prefectureField, locale)}\n rules={getRule(prefectureField)}\n required={isRequired(prefectureField)}\n >\n {prefectureOptions ? (\n <Select\n placeholder={getPlaceholder(i18n, prefectureField, locale)}\n options={prefectureOptions}\n style={{ width: 200 }}\n showSearch\n optionFilterProp=\"label\"\n />\n ) : (\n <Input\n placeholder={getPlaceholder(i18n, prefectureField, locale)}\n style={{ width: 200 }}\n />\n )}\n </Form.Item>\n\n {/* 市区町村 */}\n <Form.Item\n name={address1Field}\n label={getLabel(i18n, address1Field, locale)}\n rules={getRule(address1Field)}\n required={isRequired(address1Field)}\n >\n <Input placeholder={getPlaceholder(i18n, address1Field, locale)} />\n </Form.Item>\n\n {/* 番地 */}\n <Form.Item\n name={address2Field}\n label={getLabel(i18n, address2Field, locale)}\n rules={getRule(address2Field)}\n required={isRequired(address2Field)}\n >\n <Input placeholder={getPlaceholder(i18n, address2Field, locale)} />\n </Form.Item>\n\n {/* 建物名・部屋番号 */}\n <Form.Item\n name={address3Field}\n label={getLabel(i18n, address3Field, locale)}\n rules={getRule(address3Field)}\n required={isRequired(address3Field)}\n >\n <Input placeholder={getPlaceholder(i18n, address3Field, locale)} />\n </Form.Item>\n </>\n );\n}\n","/**\n * JapaneseBankField - Japanese bank account input component\n *\n * @example\n * ```tsx\n * import { JapaneseBankField } from '@famgia/omnify-react/components';\n *\n * <JapaneseBankField\n * schemas={customerSchemas}\n * i18n={customerI18n}\n * prefix=\"bank\"\n * accountTypeOptions={accountTypeOptions}\n * />\n * ```\n */\nimport { Form, Input, Select, Row, Col } from 'antd';\nimport type { FormInstance } from 'antd';\nimport type { RuleObject } from 'antd/es/form';\nimport { zodRule, isZodRequired } from '../lib/form-validation';\nimport { getZodLocale } from '../lib/zod-i18n';\n\nexport interface I18nConfig {\n fields: Record<string, { label?: Record<string, string>; placeholder?: Record<string, string> }>;\n}\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n}\n\nexport interface JapaneseBankFieldProps {\n /** Form instance (optional) */\n form?: FormInstance;\n /** Zod schemas for validation */\n schemas: Record<string, unknown>;\n /** i18n configuration for labels and placeholders */\n i18n: I18nConfig;\n /** Field name prefix (default: 'bank') */\n prefix?: string;\n /** Account type options. If not provided, a simple input is shown */\n accountTypeOptions?: SelectOption[];\n}\n\nfunction getLabel(i18n: I18nConfig, field: string, locale: string): string {\n return i18n.fields[field]?.label?.[locale] ?? i18n.fields[field]?.label?.['en'] ?? field;\n}\n\nfunction getPlaceholder(i18n: I18nConfig, field: string, locale: string): string {\n return i18n.fields[field]?.placeholder?.[locale] ?? i18n.fields[field]?.placeholder?.['en'] ?? '';\n}\n\nexport function JapaneseBankField({\n schemas,\n i18n,\n prefix = 'bank',\n accountTypeOptions,\n}: JapaneseBankFieldProps) {\n const locale = getZodLocale();\n\n const bankCodeField = `${prefix}_bank_code`;\n const bankNameField = `${prefix}_bank_name`;\n const branchCodeField = `${prefix}_branch_code`;\n const branchNameField = `${prefix}_branch_name`;\n const accountTypeField = `${prefix}_account_type`;\n const accountNumberField = `${prefix}_account_number`;\n const accountHolderField = `${prefix}_account_holder`;\n\n const getRule = (field: string): RuleObject[] => {\n const schema = schemas[field];\n if (!schema) return [];\n return [zodRule(schema as any, getLabel(i18n, field, locale))];\n };\n\n // Check if a field is required by examining its Zod schema\n const isRequired = (field: string): boolean => {\n const schema = schemas[field];\n if (!schema) return false;\n return isZodRequired(schema as any);\n };\n\n const bankRequired = isRequired(bankCodeField) || isRequired(bankNameField);\n const branchRequired = isRequired(branchCodeField) || isRequired(branchNameField);\n\n // Short labels\n const codeShortLabel = locale === 'ja' ? 'コード' : 'Code';\n const nameShortLabel = locale === 'ja' ? '名称' : 'Name';\n\n const bankLabel = locale === 'ja' ? '銀行' : 'Bank';\n const branchLabel = locale === 'ja' ? '支店' : 'Branch';\n\n const prefixStyle: React.CSSProperties = {\n color: 'rgba(0, 0, 0, 0.88)',\n fontWeight: 500,\n borderRight: '1px solid #d9d9d9',\n paddingRight: 8,\n marginRight: 4,\n };\n\n return (\n <>\n {/* 銀行コード・銀行名 */}\n <Form.Item label={bankLabel} required={bankRequired} style={{ marginBottom: 0 }}>\n <Row gutter={8}>\n <Col span={8}>\n <Form.Item name={bankCodeField} rules={getRule(bankCodeField)} style={{ marginBottom: 16 }}>\n <Input\n prefix={<span style={prefixStyle}>{codeShortLabel}</span>}\n placeholder={getPlaceholder(i18n, bankCodeField, locale)}\n maxLength={4}\n />\n </Form.Item>\n </Col>\n <Col span={16}>\n <Form.Item name={bankNameField} rules={getRule(bankNameField)} style={{ marginBottom: 16 }}>\n <Input\n prefix={<span style={prefixStyle}>{nameShortLabel}</span>}\n placeholder={getPlaceholder(i18n, bankNameField, locale)}\n />\n </Form.Item>\n </Col>\n </Row>\n </Form.Item>\n\n {/* 支店コード・支店名 */}\n <Form.Item label={branchLabel} required={branchRequired} style={{ marginBottom: 0 }}>\n <Row gutter={8}>\n <Col span={8}>\n <Form.Item\n name={branchCodeField}\n rules={getRule(branchCodeField)}\n style={{ marginBottom: 16 }}\n >\n <Input\n prefix={<span style={prefixStyle}>{codeShortLabel}</span>}\n placeholder={getPlaceholder(i18n, branchCodeField, locale)}\n maxLength={3}\n />\n </Form.Item>\n </Col>\n <Col span={16}>\n <Form.Item\n name={branchNameField}\n rules={getRule(branchNameField)}\n style={{ marginBottom: 16 }}\n >\n <Input\n prefix={<span style={prefixStyle}>{nameShortLabel}</span>}\n placeholder={getPlaceholder(i18n, branchNameField, locale)}\n />\n </Form.Item>\n </Col>\n </Row>\n </Form.Item>\n\n {/* 口座種別 */}\n <Form.Item\n name={accountTypeField}\n label={getLabel(i18n, accountTypeField, locale)}\n rules={getRule(accountTypeField)}\n required={isRequired(accountTypeField)}\n >\n {accountTypeOptions ? (\n <Select\n placeholder={getPlaceholder(i18n, accountTypeField, locale)}\n options={accountTypeOptions}\n style={{ width: 150 }}\n />\n ) : (\n <Input\n placeholder={getPlaceholder(i18n, accountTypeField, locale)}\n style={{ width: 150 }}\n />\n )}\n </Form.Item>\n\n {/* 口座番号 */}\n <Form.Item\n name={accountNumberField}\n label={getLabel(i18n, accountNumberField, locale)}\n rules={getRule(accountNumberField)}\n required={isRequired(accountNumberField)}\n >\n <Input\n placeholder={getPlaceholder(i18n, accountNumberField, locale)}\n maxLength={7}\n style={{ width: 150 }}\n />\n </Form.Item>\n\n {/* 口座名義 */}\n <Form.Item\n name={accountHolderField}\n label={getLabel(i18n, accountHolderField, locale)}\n rules={getRule(accountHolderField)}\n required={isRequired(accountHolderField)}\n >\n <Input placeholder={getPlaceholder(i18n, accountHolderField, locale)} />\n </Form.Item>\n </>\n );\n}\n","/**\n * useFormMutation - Form mutation with auto Laravel error handling\n *\n * Features:\n * - Auto parse Laravel validation errors to Ant Design form format\n * - Support nested field paths (e.g., \"items.0.name\" → [\"items\", 0, \"name\"])\n * - Auto invalidate queries on success\n * - Optional redirect after success\n * - Optional i18n translation for messages\n *\n * @example\n * ```typescript\n * import { useFormMutation } from '@famgia/omnify-react';\n * import { useRouter } from 'next/navigation';\n * import { useTranslations } from 'next-intl';\n *\n * function MyForm() {\n * const [form] = Form.useForm();\n * const router = useRouter();\n * const t = useTranslations();\n *\n * const mutation = useFormMutation({\n * form,\n * mutationFn: (data) => api.post('/api/customers', data),\n * invalidateKeys: [['customers']],\n * successMessage: 'messages.saved',\n * redirectTo: '/customers',\n * router, // Optional: for redirect\n * translateFn: t, // Optional: for i18n\n * });\n *\n * return (\n * <Form form={form} onFinish={mutation.mutate}>\n * ...\n * <Button loading={mutation.isPending}>保存</Button>\n * </Form>\n * );\n * }\n * ```\n */\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { App } from 'antd';\nimport type { FormInstance } from 'antd';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Router interface - compatible with Next.js useRouter */\nexport interface FormMutationRouter {\n push: (path: string) => void;\n}\n\n/** Translation function - compatible with next-intl useTranslations */\nexport type TranslateFn = (key: string) => string;\n\nexport interface UseFormMutationOptions<TData, TResult> {\n /** Ant Design form instance */\n form: FormInstance;\n /** API call function */\n mutationFn: (data: TData) => Promise<TResult>;\n /** Query keys to invalidate on success */\n invalidateKeys?: readonly (readonly unknown[])[];\n /** Success message to show (will be translated if translateFn provided) */\n successMessage?: string;\n /** Redirect path after success (requires router) */\n redirectTo?: string;\n /** Router instance for redirect (e.g., useRouter from next/navigation) */\n router?: FormMutationRouter;\n /** Translation function for messages (e.g., useTranslations from next-intl) */\n translateFn?: TranslateFn;\n /** Callback on success */\n onSuccess?: (data: TResult) => void;\n /** Callback on error */\n onError?: (error: unknown) => void;\n}\n\n// =============================================================================\n// Laravel Error Helpers (exported for reuse)\n// =============================================================================\n\n/** Form field error for Ant Design */\nexport interface FormFieldError {\n name: string | (string | number)[];\n errors: string[];\n}\n\n/**\n * Parse Laravel validation errors to Ant Design form format\n *\n * Supports:\n * - Simple fields: \"email\" → name: \"email\"\n * - Dot notation: \"user.name\" → name: [\"user\", \"name\"]\n * - Array notation: \"items.0.name\" → name: [\"items\", 0, \"name\"]\n *\n * @example\n * form.setFields(getFormErrors(error))\n */\nexport function getFormErrors(error: unknown): FormFieldError[] {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data = (error as any)?.response?.data;\n const errors = data?.errors;\n\n if (!errors || typeof errors !== 'object') return [];\n\n return Object.entries(errors).map(([fieldName, messages]) => ({\n // Convert \"user.name\" or \"items.0.name\" to array path for Ant Design\n name: fieldName.includes('.')\n ? fieldName.split('.').map((part) => (/^\\d+$/.test(part) ? parseInt(part, 10) : part))\n : fieldName,\n errors: Array.isArray(messages) ? (messages as string[]) : [String(messages)],\n }));\n}\n\n/**\n * Get general validation message from Laravel 422 response\n * @example \"The name_lastname field is required. (and 3 more errors)\"\n */\nexport function getValidationMessage(error: unknown): string | null {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const axiosError = error as any;\n\n // Only for 422 validation errors\n if (axiosError?.response?.status !== 422) return null;\n\n return axiosError?.response?.data?.message ?? null;\n}\n\n/**\n * Get first error message from validation errors\n * Useful when field names don't match form fields\n */\nexport function getFirstValidationError(error: unknown): string | null {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const errors = (error as any)?.response?.data?.errors;\n\n if (!errors || typeof errors !== 'object') return null;\n\n const firstField = Object.keys(errors)[0];\n return firstField ? errors[firstField][0] : null;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\nexport function useFormMutation<TData, TResult = unknown>({\n form,\n mutationFn,\n invalidateKeys = [],\n successMessage,\n redirectTo,\n router,\n translateFn,\n onSuccess,\n onError,\n}: UseFormMutationOptions<TData, TResult>) {\n const queryClient = useQueryClient();\n const { message } = App.useApp();\n\n return useMutation({\n mutationFn,\n onSuccess: (data) => {\n // Invalidate queries\n invalidateKeys.forEach((key) => {\n queryClient.invalidateQueries({ queryKey: [...key] });\n });\n\n // Show success message (translate if translateFn provided)\n if (successMessage) {\n const msg = translateFn ? translateFn(successMessage) : successMessage;\n message.success(msg);\n }\n\n // Redirect if router and redirectTo provided\n if (redirectTo && router) {\n router.push(redirectTo);\n }\n\n // Custom callback\n onSuccess?.(data);\n },\n onError: (error) => {\n // Set form field errors from Laravel validation\n const formErrors = getFormErrors(error);\n if (formErrors.length > 0) {\n form.setFields(formErrors);\n }\n\n // Show general validation message (from Laravel)\n const validationMessage = getValidationMessage(error);\n if (validationMessage) {\n message.error(validationMessage);\n }\n\n // Custom callback\n onError?.(error);\n },\n });\n}\n","/**\n * Japanese Kana Validation Rules\n *\n * Provides configurable validation for Japanese character input:\n * - 全角カタカナ (Full-width Katakana) - default\n * - 半角カタカナ (Half-width Katakana)\n * - ひらがな (Hiragana)\n * - Mixed modes\n *\n * @example\n * ```typescript\n * import { kanaString, KATAKANA_PATTERN } from '@famgia/omnify-react/lib';\n * import { z } from 'zod';\n *\n * // Method 1: Use kanaString helper\n * const schema = z.object({\n * name_kana: kanaString(), // 全角カタカナ (default)\n * });\n *\n * // Method 2: Use pattern directly\n * const schema2 = z.object({\n * name_kana: z.string().regex(KATAKANA_PATTERN, '全角カタカナで入力してください'),\n * });\n * ```\n */\n\nimport { z } from 'zod';\n\nexport interface KanaRuleOptions {\n /** Allow full-width katakana (ア-ン) - default: true */\n fullWidthKatakana?: boolean;\n /** Allow half-width katakana (ア-ン) - default: false */\n halfWidthKatakana?: boolean;\n /** Allow hiragana (あ-ん) - default: false */\n hiragana?: boolean;\n /** Allow numbers (0-9, 0-9) - default: false */\n allowNumbers?: boolean;\n /** Allow full-width numbers (0-9) - default: false */\n fullWidthNumbers?: boolean;\n /** Allow half-width numbers (0-9) - default: false */\n halfWidthNumbers?: boolean;\n /** Allow spaces (full-width and half-width) - default: true */\n allowSpaces?: boolean;\n /** Allow specific special characters - default: ['ー', '・'] */\n allowSpecialChars?: string[];\n /** Custom error message */\n message?: string;\n}\n\n// Character ranges\nconst CHAR_RANGES = {\n // Full-width Katakana: ァ-ヶ (U+30A1-U+30F6) + ー (U+30FC)\n fullWidthKatakana: 'ァ-ヶー',\n // Half-width Katakana: ヲ-゚ (U+FF66-U+FF9F)\n halfWidthKatakana: 'ヲ-゚',\n // Hiragana: ぁ-ゖ (U+3041-U+3096)\n hiragana: 'ぁ-ゖ',\n // Full-width numbers: 0-9\n fullWidthNumbers: '0-9',\n // Half-width numbers: 0-9\n halfWidthNumbers: '0-9',\n // Full-width space: (U+3000)\n fullWidthSpace: ' ',\n // Half-width space\n halfWidthSpace: ' ',\n // Common special chars for names\n defaultSpecialChars: ['ー', '・'],\n} as const;\n\n// Default options: 全角カタカナ + spaces + ー・\nconst DEFAULT_OPTIONS: Required<KanaRuleOptions> = {\n fullWidthKatakana: true,\n halfWidthKatakana: false,\n hiragana: false,\n allowNumbers: false,\n fullWidthNumbers: false,\n halfWidthNumbers: false,\n allowSpaces: true,\n allowSpecialChars: ['ー', '・'],\n message: '',\n};\n\n/**\n * Build regex pattern from options\n */\nfunction buildKanaPattern(options: KanaRuleOptions = {}): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const parts: string[] = [];\n\n if (opts.fullWidthKatakana) {\n parts.push(CHAR_RANGES.fullWidthKatakana);\n }\n if (opts.halfWidthKatakana) {\n parts.push(CHAR_RANGES.halfWidthKatakana);\n }\n if (opts.hiragana) {\n parts.push(CHAR_RANGES.hiragana);\n }\n if (opts.allowNumbers || opts.fullWidthNumbers) {\n parts.push(CHAR_RANGES.fullWidthNumbers);\n }\n if (opts.allowNumbers || opts.halfWidthNumbers) {\n parts.push(CHAR_RANGES.halfWidthNumbers);\n }\n if (opts.allowSpaces) {\n parts.push(CHAR_RANGES.fullWidthSpace);\n parts.push(CHAR_RANGES.halfWidthSpace);\n }\n if (opts.allowSpecialChars && opts.allowSpecialChars.length > 0) {\n // Escape special regex chars\n const escaped = opts.allowSpecialChars\n .map((c) => c.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('');\n parts.push(escaped);\n }\n\n return `^[${parts.join('')}]*$`;\n}\n\n/**\n * Get default error message based on options\n */\nfunction getDefaultMessage(options: KanaRuleOptions = {}, locale = 'ja'): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const messages: Record<string, Record<string, string>> = {\n ja: {\n fullWidthKatakana: '全角カタカナ',\n halfWidthKatakana: '半角カタカナ',\n hiragana: 'ひらがな',\n mixed: 'カナ文字',\n },\n en: {\n fullWidthKatakana: 'full-width katakana',\n halfWidthKatakana: 'half-width katakana',\n hiragana: 'hiragana',\n mixed: 'kana characters',\n },\n };\n\n const msg = messages[locale] ?? messages['ja'];\n\n // Determine what type to show in message\n let type = msg.mixed;\n if (opts.fullWidthKatakana && !opts.halfWidthKatakana && !opts.hiragana) {\n type = msg.fullWidthKatakana;\n } else if (opts.halfWidthKatakana && !opts.fullWidthKatakana && !opts.hiragana) {\n type = msg.halfWidthKatakana;\n } else if (opts.hiragana && !opts.fullWidthKatakana && !opts.halfWidthKatakana) {\n type = msg.hiragana;\n }\n\n if (locale === 'ja') {\n return `${type}で入力してください`;\n }\n return `Please enter in ${type}`;\n}\n\n/**\n * Create a kana validation regex\n */\nexport function createKanaRegex(options: KanaRuleOptions = {}): RegExp {\n return new RegExp(buildKanaPattern(options));\n}\n\n/**\n * Validate a string against kana rules\n */\nexport function validateKana(value: string, options: KanaRuleOptions = {}): boolean {\n if (!value) return true; // Empty is valid (use required for that)\n const regex = createKanaRegex(options);\n return regex.test(value);\n}\n\n/**\n * Get kana validation pattern string (for Zod .regex())\n */\nexport function getKanaPattern(options: KanaRuleOptions = {}): string {\n return buildKanaPattern(options);\n}\n\n/**\n * Get error message for kana validation\n */\nexport function getKanaErrorMessage(options: KanaRuleOptions = {}, locale = 'ja'): string {\n return options.message ?? getDefaultMessage(options, locale);\n}\n\n// ============================================================================\n// Preset configurations\n// ============================================================================\n\n/** 全角カタカナ (Full-width Katakana) - Default for Japanese names */\nexport const KATAKANA_FULL_WIDTH: KanaRuleOptions = {\n fullWidthKatakana: true,\n halfWidthKatakana: false,\n hiragana: false,\n allowSpaces: true,\n allowSpecialChars: ['ー', '・'],\n};\n\n/** 半角カタカナ (Half-width Katakana) - Legacy systems */\nexport const KATAKANA_HALF_WIDTH: KanaRuleOptions = {\n fullWidthKatakana: false,\n halfWidthKatakana: true,\n hiragana: false,\n allowSpaces: true,\n allowSpecialChars: ['ー'], // Half-width prolonged sound mark\n};\n\n/** ひらがな (Hiragana) */\nexport const HIRAGANA: KanaRuleOptions = {\n fullWidthKatakana: false,\n halfWidthKatakana: false,\n hiragana: true,\n allowSpaces: true,\n allowSpecialChars: ['ー'],\n};\n\n/** カタカナ + ひらがな (Any kana) */\nexport const KANA_ANY: KanaRuleOptions = {\n fullWidthKatakana: true,\n halfWidthKatakana: true,\n hiragana: true,\n allowSpaces: true,\n allowSpecialChars: ['ー', '・', 'ー'],\n};\n\n/** 全角カタカナ + 数字 (Full-width katakana with numbers) */\nexport const KATAKANA_WITH_NUMBERS: KanaRuleOptions = {\n fullWidthKatakana: true,\n halfWidthKatakana: false,\n hiragana: false,\n allowNumbers: true,\n allowSpaces: true,\n allowSpecialChars: ['ー', '・'],\n};\n\n// ============================================================================\n// Pattern strings for Zod .regex()\n// ============================================================================\n\n/** Pattern: 全角カタカナ + スペース + ー・ (for z.string().regex()) */\nexport const KATAKANA_PATTERN = /^[ァ-ヶー・ ]*$/;\n\n/** Pattern: 半角カタカナ (for z.string().regex()) */\nexport const KATAKANA_HALF_PATTERN = /^[ヲ-゚ー ]*$/;\n\n/** Pattern: ひらがな (for z.string().regex()) */\nexport const HIRAGANA_PATTERN = /^[ぁ-ゖー ]*$/;\n\n/** Pattern: すべてのかな (for z.string().regex()) */\nexport const KANA_ANY_PATTERN = /^[ァ-ヶぁ-ゖヲ-゚ー・ー ]*$/;\n\n// ============================================================================\n// Zod refinement helpers\n// ============================================================================\n\n/**\n * Create Zod string schema with kana validation\n * @example\n * const schema = z.object({\n * name_kana: kanaString(), // 全角カタカナ (default)\n * name_kana2: kanaString({ hiragana: true }), // カタカナ + ひらがな\n * });\n */\nexport function kanaString(options: KanaRuleOptions = {}) {\n const opts = { ...KATAKANA_FULL_WIDTH, ...options };\n const regex = createKanaRegex(opts);\n const message = getKanaErrorMessage(opts);\n\n return z.string().regex(regex, { message });\n}\n\n/**\n * Add kana validation to existing Zod string schema\n * @example\n * const schema = z.string().min(1).pipe(withKana());\n */\nexport function withKana(options: KanaRuleOptions = {}) {\n return kanaString(options);\n}\n\n// Default export\nexport const kanaRules = {\n createRegex: createKanaRegex,\n validate: validateKana,\n getPattern: getKanaPattern,\n getMessage: getKanaErrorMessage,\n // Zod helpers\n string: kanaString,\n // Presets\n presets: {\n fullWidthKatakana: KATAKANA_FULL_WIDTH,\n halfWidthKatakana: KATAKANA_HALF_WIDTH,\n hiragana: HIRAGANA,\n any: KANA_ANY,\n withNumbers: KATAKANA_WITH_NUMBERS,\n },\n // Pattern constants for direct use\n patterns: {\n katakana: KATAKANA_PATTERN,\n katakanaHalf: KATAKANA_HALF_PATTERN,\n hiragana: HIRAGANA_PATTERN,\n any: KANA_ANY_PATTERN,\n },\n};\n","/**\n * @famgia/omnify-react\n *\n * React runtime components, hooks, and utilities for Omnify schemas.\n *\n * @example\n * ```typescript\n * import {\n * // Components\n * JapaneseNameField,\n * JapaneseAddressField,\n * JapaneseBankField,\n *\n * // Hooks\n * useFormMutation,\n *\n * // Utilities\n * setZodLocale,\n * zodRule,\n * kanaString,\n * } from '@famgia/omnify-react';\n * ```\n */\n\n// =============================================================================\n// Components\n// =============================================================================\n\nexport {\n JapaneseNameField,\n type JapaneseNameFieldProps,\n type I18nConfig as JapaneseNameI18nConfig,\n} from './components/JapaneseNameField';\n\nexport {\n JapaneseAddressField,\n type JapaneseAddressFieldProps,\n type PostalLookupResult,\n type SelectOption as AddressSelectOption,\n} from './components/JapaneseAddressField';\n\nexport {\n JapaneseBankField,\n type JapaneseBankFieldProps,\n type SelectOption as BankSelectOption,\n} from './components/JapaneseBankField';\n\n// OmnifyForm namespace for convenient component access\nimport { JapaneseNameField } from './components/JapaneseNameField';\nimport { JapaneseAddressField } from './components/JapaneseAddressField';\nimport { JapaneseBankField } from './components/JapaneseBankField';\n\n/**\n * OmnifyForm - Namespace for Omnify form components\n * \n * @example\n * ```tsx\n * <OmnifyForm.JapaneseName schemas={customerSchemas} i18n={customerI18n} prefix=\"name\" />\n * <OmnifyForm.JapaneseAddress form={form} schemas={customerSchemas} i18n={customerI18n} prefix=\"address\" />\n * <OmnifyForm.JapaneseBank schemas={customerSchemas} i18n={customerI18n} prefix=\"bank\" />\n * ```\n */\nexport const OmnifyForm = {\n JapaneseName: JapaneseNameField,\n JapaneseAddress: JapaneseAddressField,\n JapaneseBank: JapaneseBankField,\n} as const;\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\nexport {\n useFormMutation,\n type UseFormMutationOptions,\n type FormMutationRouter,\n type TranslateFn,\n type FormFieldError,\n // Helper functions for Laravel validation errors\n getFormErrors,\n getValidationMessage,\n getFirstValidationError,\n} from './hooks/use-form-mutation';\n\n// =============================================================================\n// Lib - Utilities\n// =============================================================================\n\n// Zod i18n\nexport {\n setZodLocale,\n getZodLocale,\n setZodFallbackLocale,\n getZodFallbackLocale,\n addZodMessages,\n getZodMessage,\n getZodMessages,\n} from './lib/zod-i18n';\n\n// Form validation\nexport { zodRule, requiredRule, isZodRequired } from './lib/form-validation';\n\n// Japanese validation rules\nexport {\n // Kana validation\n kanaRules,\n createKanaRegex,\n validateKana,\n getKanaPattern,\n getKanaErrorMessage,\n // Zod helpers\n kanaString,\n withKana,\n // Pattern constants\n KATAKANA_PATTERN,\n KATAKANA_HALF_PATTERN,\n HIRAGANA_PATTERN,\n KANA_ANY_PATTERN,\n // Presets\n KATAKANA_FULL_WIDTH,\n KATAKANA_HALF_WIDTH,\n HIRAGANA,\n KANA_ANY,\n KATAKANA_WITH_NUMBERS,\n // Types\n type KanaRuleOptions,\n // Aliases\n kanaPattern,\n kanaRegex,\n} from './lib/rules';\n"],"mappings":"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","names":["message","Form","Input","Fragment","jsx","jsxs","getLabel","getPlaceholder","Form","Input","Form","Input","Select","Row","Col","Fragment","jsx","jsxs","getLabel","getPlaceholder","Form","Row","Col","Input","Select","message","message"]}
|