Stencil Forms is a tool for managing complex form state in Stencil projects.
🚨 This component is built for Stencil apps, not vanilla Web Component projects. It might be possible to use it in vanilla projects, but I wouldn't recommend it. 🚨
<stencil-form />
is heavily inspired by Formik and react-beautiful-dnd (both React-based solutions), except relying Web Components and standard, built-in browser features.
import { FormRenderProps } from "stencil-form";
interface FormValues {
demo: string;
}
// In the `your-component` render function
<stencil-form
initialValues={{ demo: "Hello world!" }}
renderer={(props: FormRenderProps<FormValues>) => {
const { errors, groupProps, labelProps, inputProps, formProps } = props;
return (
<form {...formProps}>
<div {...groupProps("demo")}>
<label {...labelProps("demo")}> Demo </label>
<input {...inputProps("demo")} type="text" required />
{errors.demo && (
<label class="error" {...labelProps("demo")}>
{errors.demo}
</label>
)}
</div>
</form>
);
}}
/>;
Styling is entirely up to you! The component provides minimal, mildly opinionated resets for input
and select
elements but stops short of removing things like ::-webkit-inner-spin-button
or ::-ms-clear
. If you'd like to ensure cross-browser consistency, I'd highly reccommend reading TJ VanToll's pseudo-element list.
In order to allow maximum flexibility, <stencil-form />
does not use Shadow DOM. If the ::part
and ::theme
proposal is rolled out, that might change—for now, Shadow DOM makes it too difficult for developers to implement custom styles.
This package in unpublished at the moment. It will be available on NPM soon.
To build locally, just clone this monorepo.
lerna bootstrap
cd packages/demo
npm start