ai-infrastructure-hugg…
Hugging Face Inference SDK patterns for TypeScript/Node.js — InferenceClient setup, chat completion, text generation, streaming, embeddings, image generation,…
TanStack Form patterns - useForm, form.Field, validators, arrays, linked fields, createFormHook, type safety
$ npx -y skills add agents-inc/skills --skill web-forms-tanstack-form --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/web-forms-tanstack-formContext preview
The summary Claude sees to decide when to auto-load this skill.
TanStack Form patterns - useForm, form.Field, validators, arrays, linked fields, createFormHook, type safety
name: web-forms-tanstack-form description: TanStack Form patterns - useForm, form.Field, validators, arrays, linked fields, createFormHook, type safety
> **Quick Guide:** `useForm` takes `defaultValues`, and every field name, value type and the submit > payload are inferred from that object. Fields render through `form.Field` with a `children` render > prop that supplies `field.state.value`, `field.handleChange` and `field.handleBlur`. Validation > lives in the `validators` prop — keyed by event (`onChange`, `onBlur`, `onSubmit`) with an `Async` > variant of each, on the field or on the form. `mode="array"` unlocks `pushValue`/`removeValue`, > `onChangeListenTo` re-runs a validator when another field changes, and `form.Subscribe` narrows > which state changes re-render what.
**Detailed Resources:**
---
[examples/core.md](examples/core.md).
form components once, and `useAppForm` replaces `useForm` at each call site. Follow [examples/composition.md](examples/composition.md).
binding differ; reference.md's Framework Packages table names both for each.
---
<critical_requirements>
**Give `useForm` a `defaultValues` entry for every field.** Field names, value types and the submit payload are all inferred from that object, so a field missing from it is a field the types do not know about.
**Render every field through `form.Field` and its `children` render prop.** The render prop receives the value and the handlers explicitly — this library has no field-registration helper and does no ref forwarding, so an input wired any other way never joins the form.
**Put validation in the `validators` prop, keyed by the event that should run it.** `onChange`, `onBlur` and `onSubmit` each have an `Async` counterpart, and the same prop exists on the field and on the form.
**Read `field.state.meta.errors` as an array.** It holds every current error for the field, so `.map()` over it or check `.length`; compared against a string it is always unequal.
**Call `e.preventDefault()` in the form's `onSubmit` before `form.handleSubmit()`.** The library does not intercept the native submit, so without it the browser navigates away mid-submission.
</critical_requirements>
---
**Auto-detection:** @tanstack/react-form, @tanstack/vue-form, @tanstack/solid-form, @tanstack/angular-form, @tanstack/lit-form, @tanstack/form-core, form.Field, form.Subscribe, createFormHook, createFormHookContexts, useAppForm, withForm, fieldContext, formContext, field.handleChange, field.handleBlur, field.state.meta, pushValue, removeValue, swapValues, onChangeListenTo, onBlurListenTo, setErrorMap, formDevtoolsPlugin
**Applies to:**
**Handled elsewhere:**
schema states its rules is settled by whatever owns it.
and the handlers, and the markup is yours.
nothing.
---
<philosophy>
The form is headless and its types run on inference. `defaultValues` is the schema of record: field names autocomplete from it, `field.state.value` is typed by it, and the `onSubmit` payload matches it — without a generic parameter, and without a second type declaration that could drift.
Validation is bound to events rather than to a mode. Each validator declares when it runs, at the level it belongs to, so a cheap format check can sit on `onChange` while the expensive uniqueness check waits for `onBlurAsync` on the same field.
State is read by subscription. `form.Subscribe` and `useStore` take a selector and re-render only when what the selector returns changes, so reading `form.state` directly in a component body opts out of the whole design.
</philosophy>
---
<patterns>
The render prop is the whole field API — value in, handlers out, nothing implicit.
const form = useForm({
defaultValues: { name: "", email: "" },
onSubmit: async ({ value }) => {
await submitToApi(value);
},
});
<form
onSubmit={(e) => {
e.preventDefault();
form.handleSubmit();
}}
>
<form.Field
name="email"
children={(field) => (
<input
value={field.state.value}
onBlur={field.handleBlur}
onChange={(e) => field.handleChange(e.target.value)}
/>
)}
/>
</form>;`onBlur={field.handleBlur}` is what marks the field touched — omit it and `isTouched` stays false and any `onBlur` validator never runs.
Full code: [examples/core.md](examples/core.md)
---
A sync validator returns a message string, or `undefined` when the value p
The official skills marketplace for Agents Inc. 150+ skills covering everything from React and Prisma to Redis, ElevenLabs, and infrastructure tooling. Pick the skills that match your stack and install them via Claude Code. Need more control?
Repo: agents-inc/skills
Hugging Face Inference SDK patterns for TypeScript/Node.js — InferenceClient setup, chat completion, text generation, streaming, embeddings, image generation,…
LiteLLM proxy server setup, TypeScript client patterns via OpenAI SDK, model routing, fallbacks, load balancing, spend tracking, virtual keys, and production…
Serverless GPU compute platform for AI model deployment — web endpoints, GPU functions, model serving, and TypeScript client patterns
Local LLM inference with the Ollama JavaScript client -- chat, streaming, tool calling, vision, embeddings, structured output, model management, and…
Replicate SDK patterns for TypeScript/Node.js -- client setup, predictions, streaming, webhooks, file handling, model versioning, deployments, and training
Together AI SDK patterns for TypeScript — client setup, chat completions, streaming, structured output, function calling, embeddings, image generation,…