Response Format (IMPORTANT)
- •Confirm the widget name, behavior, and props before writing code
- •Follow the steps below in order — each step depends on the previous
- •Run tests after implementation to verify correctness
- •Keep total response concise — show key code, not boilerplate
When to use
Use this skill when:
- •Adding a new widget type to
@rezi-ui/core - •Creating a new
ui.*factory function - •User asks for a new visual element not covered by existing widgets
Source of truth
- •
packages/core/src/widgets/types.ts— all widget prop types and VNode union - •
packages/core/src/widgets/ui.ts— allui.*factory functions - •
packages/core/src/layout/kinds/— layout handlers by category - •
packages/core/src/renderer/renderToDrawlist/widgets/— render handlers by category - •
packages/core/src/index.ts— public exports - •
packages/core/src/ui/— design tokens, recipes, and capabilities - •
docs/guide/widget-authoring.md— widget authoring guide with design system integration
Steps
- •
Add props type to
packages/core/src/widgets/types.ts:- •Use the
Readonly<{...}>pattern - •Include
key?: stringif the widget can appear in lists
- •Use the
- •
Add VNode kind to the
VNodediscriminated union intypes.ts - •
Add factory function to
packages/core/src/widgets/ui.ts:- •Add JSDoc with
@exampletag - •Return a VNode with the correct kind
- •Add JSDoc with
- •
Add layout handler in
packages/core/src/layout/kinds/:- •
leaf.tsfor non-container widgets - •
box.ts/stack.tsfor containers - •
collections.tsfor data widgets - •
overlays.tsfor layered widgets
- •
- •
Add render handler in
packages/core/src/renderer/renderToDrawlist/widgets/:- •
basic.ts,containers.ts,collections.ts,editors.ts,overlays.ts,navigation.ts, orfiles.ts
- •
- •
Add design system support (if the widget is interactive):
- •Register the new widget kind in
packages/core/src/widgets/protocol.ts - •Add optional DS props as needed (
dsVariant?,dsTone?,dsSize?) for advanced customization - •Wire recipe-based rendering so baseline DS styling auto-activates when
ThemeDefinitionsemantic tokens are available; DS props override defaults when specified - •See
docs/guide/widget-authoring.mdfor the full pattern
- •Register the new widget kind in
- •
Export both props type and factory from
packages/core/src/index.ts - •
Add JSX wrapper (if needed) in
packages/jsx/src/components.ts - •
Write tests in
packages/core/src/widgets/__tests__/ - •
Add docs in
docs/widgets/{widget-name}.md
Verification
bash
node scripts/run-tests.mjs
- •Widget + props exported from
packages/core/src/index.ts - •Renders correctly via
createTestRenderer - •Layout produces expected dimensions
- •Widget supports
ds*props for design-system-based styling (if interactive) - •Widget renders correctly with at least 2 themes