name: rezi-add-widget description: Add a new widget type to the Rezi framework. Use when creating new ui.* factory functions with layout, rendering, and tests. user-invocable: true allowed-tools: Read, Glob, Grep, Edit, Write, Bash(node scripts/run-tests.mjs*) argument-hint: "[widget-name]" metadata: short-description: Add new widget
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 unionpackages/core/src/widgets/ui.ts— allui.*factory functionspackages/core/src/layout/kinds/— layout handlers by categorypackages/core/src/renderer/renderToDrawlist/widgets/— render handlers by categorypackages/core/src/index.ts— public exportspackages/core/src/ui/— design tokens, recipes, and capabilitiesdocs/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.tsAdd 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 widgetsbox.ts/stack.tsfor containerscollections.tsfor data widgetsoverlays.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.tsAdd JSX wrapper (if needed) in
packages/jsx/src/components.tsWrite tests in
packages/core/src/widgets/__tests__/Add docs in
docs/widgets/{widget-name}.md
Verification
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