import { type Derived } from "./core/handle.ts"; export interface FieldRule { /** 必須。関数/state を渡せば条件付きにできる。 */ required?: unknown; /** メール形式。 */ email?: boolean; /** 数値/日付の範囲。 */ min?: number; max?: number; /** 文字数。 */ minLength?: number; maxLength?: number; /** 正規表現。 */ pattern?: RegExp | string; /** 他フィールドと一致(確認用パスワードなど)。 */ same?: string; /** この条件が偽なら、このフィールドは検証しない。 */ when?: () => boolean; /** 既定メッセージの差し替え。 */ message?: string; /** 自作の検証。エラー文字列を返すとエラー、null/undefined なら OK。 */ validate?: (value: unknown, values: Record) => string | null | undefined; } export interface FormOptions { /** 送信ボタンを実行中/未入力で無効化するか(既定 false = CV 優先)。 */ disableSubmit?: boolean; /** エラー表示先を指定する属性名(既定 "data-brg-error")。 */ errorAttr?: string; /** 非表示のフィールドも検証するか(既定 false)。 */ validateHidden?: boolean; /** エラー要素が無いとき自動生成するか(既定 true)。 */ autoErrorSlot?: boolean; } export interface FormApi { /** 現在の入力値(DOM から都度読み直す)。 */ values: Derived>; /** フィールド名 → エラーメッセージ。見えていないフィールドは含まれない。 */ errors: Derived>; /** エラーが1つも無いか。 */ valid: Derived; /** 一度でも触られたか。 */ dirty: Derived; /** 送信中か(二重送信の判定に使う)。 */ submitting: Derived; /** 送信を試みたか(初回はエラーを出さない、という制御に使う)。 */ submitted: Derived; /** 送信ハンドラを登録する / 引数なしで送信を試みる。 */ submit(handler?: (values: Record) => unknown): boolean | void; /** いま検証する(DOM から読み直す)。エラーが無ければ true。 */ validate(): boolean; /** 値をリセットする。 */ reset(values?: Record): void; /** 最初のエラー箇所へスクロールしてフォーカスする。 */ focusFirstError(): boolean; /** 値の変化を取り直す(外部が DOM を直接書き換えたとき用)。 */ refresh(): void; } export declare function form(el: HTMLElement, rules?: Record, options?: FormOptions): FormApi; /** * HTML の属性からルールを読む(HTML を1文字も変えずに既存フォームを検証対象にする)。 * required / type=email / pattern / min / max / minlength / maxlength を拾う。 */ export declare function rulesFromHtml(el: HTMLElement): Record;