---
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)

1. **Confirm the widget name, behavior, and props** before writing code
2. **Follow the steps below in order** — each step depends on the previous
3. **Run tests after implementation** to verify correctness
4. **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` — all `ui.*` 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

1. **Add props type** to `packages/core/src/widgets/types.ts`:
   - Use the `Readonly<{...}>` pattern
   - Include `key?: string` if the widget can appear in lists

2. **Add VNode kind** to the `VNode` discriminated union in `types.ts`

3. **Add factory function** to `packages/core/src/widgets/ui.ts`:
   - Add JSDoc with `@example` tag
   - Return a VNode with the correct kind

4. **Add layout handler** in `packages/core/src/layout/kinds/`:
   - `leaf.ts` for non-container widgets
   - `box.ts` / `stack.ts` for containers
   - `collections.ts` for data widgets
   - `overlays.ts` for layered widgets

5. **Add render handler** in `packages/core/src/renderer/renderToDrawlist/widgets/`:
   - `basic.ts`, `containers.ts`, `collections.ts`, `editors.ts`, `overlays.ts`, `navigation.ts`, or `files.ts`

6. **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 `ThemeDefinition` semantic tokens are available; DS props override defaults when specified
   - See `docs/guide/widget-authoring.md` for the full pattern

7. **Export** both props type and factory from `packages/core/src/index.ts`

8. **Add JSX wrapper** (if needed) in `packages/jsx/src/components.ts`

9. **Write tests** in `packages/core/src/widgets/__tests__/`

10. **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
