Title: feat(forms, component): expand into batteries-included tier (1.13.0) by Copilot · Pull Request #95 · bQuery/bQuery · GitHub
Open Graph Title: feat(forms, component): expand into batteries-included tier (1.13.0) by Copilot · Pull Request #95 · bQuery/bQuery
X Title: feat(forms, component): expand into batteries-included tier (1.13.0) by Copilot · Pull Request #95 · bQuery/bQuery
Description: Turns @bquery/bquery/forms and @bquery/bquery/component from solid building blocks into a true batteries-included tier — covering everything users typically reach for — while preserving zero deps, tree-shakeability, and the core → reactive → view/forms/component dependency rule.
Forms (src/forms/*)
Validators: integer, numeric, between, length, oneOf, notOneOf, arrayOf, requiredIf, requiredUnless, dateAfter, dateBefore, validDate, fileSize, fileType (validDate renamed from the planned isDate to avoid collision with the existing core type guard), plus combinators compose, all, not, withMessage.
Field state: lifted isValidating/isFocused/dirtySince onto every FormField; added focus/blur, setValue(v, { touch, validate, silent }), setError/clearError, a disabled signal that excludes the field from validation, per-field validateOn/debounceMs, and parse/format on FieldConfig.
Form state: submitCount, lastSubmittedAt, submitError, aggregated isValidating/isPristine, touchAll/untouchAll, resetField, resetErrors, getDirtyValues, subscribe, plus onSubmitError/onSubmitSuccess/validationStrategy/mode: 'all' | 'first' on FormConfig.
Field arrays: createFieldArray({ initial, factory, validators }) with add/remove/move/insert/clear.
DOM bindings: bindField and bindForm (auto-discovers [name], wires submit, marks aria-invalid, configurable errorSlot mapper); both return cleanup.
Composables: scope-aware useForm/useField/useFieldArray that auto-dispose with the owning component.
Schema: fluent schema({ name: field