Rework multi-part recipes to a slotted recipe() architecture (#223)
* Rework multi-part recipes to a slotted recipe() architecture
Replace the flat multi-part recipe exports with a HeroUI/Tailwind-Variants-style
recipe() helper (issue #215). field and textInput from @luke-ui/react/recipes are
now slotted recipes: select variants at the outer call, then read each slot, e.g.
field({ necessityIndicator, tone }).label(className) and textInput({ size }).group().
Slot functions take only an optional extra class. combobox migrates to one internal
slotted recipe with a shared size group. Types are inferred from each config; no
Vanilla Extract implementation types (RuntimeFn/StyleRule) leak into the public .d.ts.
recipe() runs at build time in a .css.ts, decomposing a slotted config into one
recipeInLayer-equivalent recipe per slot in declaration order, so the emitted CSS and
class names are byte-identical to the previous hand-written recipes. The returned
callable is registered with Vanilla Extract's function serializer so it survives the
.css.ts build boundary. Single-base extend inheritance is supported.
The composed ComboboxField and TextField components are unchanged: they keep reusing
the Field primitive internally and gain the migrated recipes through the primitives
they render.
Pre-1.0 breaking change to @luke-ui/react/recipes. Removed with no aliases: fieldLabel,
fieldMessage, textInputGroup, textInputControl, textInputAdornmentStart,
textInputAdornmentEnd. The *Variants types are kept.
* Delete changesets
* Simplify props
* Improve types and comments
authored by