.claude/skills/rezi-debug-rendering/SKILL.md
Debug rendering and layout issues in Rezi apps. Use when UI looks wrong, has layout problems, or renders unexpectedly.
npx skillsauth add rtlzeromemory/rezi rezi-debug-renderingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when:
packages/core/src/app/widgetRenderer.ts — full render pipelinepackages/core/src/app/__tests__/widgetRenderer.transition.test.ts — transition behavior expectationspackages/core/src/runtime/commit.ts — VNode → RuntimeInstance treepackages/core/src/layout/ — layout enginepackages/core/src/renderer/renderToDrawlist/ — draw operationspackages/core/src/widgets/composition.ts — animation hook implementationspackages/core/src/ui/ — design tokens, recipes, and capability tiersEnable profiling:
REZI_PERF=1 REZI_PERF_DETAIL=1 node your-app.js
Check VNode tree structure — ensure no missing children or null nodes
Check widget IDs — must be unique across the entire tree. Duplicate IDs cause unpredictable behavior
Check nesting depth:
Check key props on list items — missing keys cause full re-render and lost state
Inspect with test renderer:
const r = createTestRenderer({ viewport: { cols: 80, rows: 24 } });
const result = r.render(myView(state));
console.log(result.toText()); // see actual output
result.findById("my-widget"); // locate specific nodes
Review layout props: width, height, flex, p, gap, align
If animation is involved, verify:
ui.box, ui.row, ui.column, ui.grid) use transition with expected properties (position, size, opacity)properties: [] is not accidentally disabling tracksopacity stays within [0..1]exitTransition exists on nodes that should animate out before removalRead enriched runtime errors carefully:
ZRUI_DUPLICATE_ID now includes both conflicting widget kinds + ctx.id() guidanceZRUI_DUPLICATE_KEY includes the duplicate key and parent contextZRUI_INVALID_PROPS includes prop name, widget kind, and expected typeZRUI_UPDATE_DURING_RENDER includes guidance to move updates into event handlers/effects| Symptom | Likely cause |
|---------|-------------|
| Widget not visible | Missing from VNode tree, or zero width/height |
| Overlapping widgets | Wrong container type (use column/row not box) |
| Content truncated | Fixed width too small, missing flex |
| Flicker/full re-render | Missing key on list items |
| Transition not animating | transition missing, wrong properties, or no actual value delta |
| Opacity animation looks wrong | opacity outside [0..1] (clamped) or properties excludes opacity |
| Exit animation not visible | Missing exitTransition, zero/invalid duration, or node has no stable key |
| Exit node still interactive | Exit nodes are render-only; focus/hit-test should come from active tree only |
| Crash on deep tree | Nesting depth > 500 |
| DS styling not applied | DS styling is automatic with ThemeDefinition; check semantic tokens/theme activation (no dsVariant required) |
| Wheel scrolling not working | Ensure the container uses overflow: "scroll" and content exceeds viewport size |
testing
Write tests for Rezi widgets, screens, or app logic using createTestRenderer and node:test.
development
Add routing with guards and nested outlets to a Rezi app. Use when building multi-page/screen TUI applications.
tools
Profile and optimize Rezi app performance. Use when app feels slow, frames drop, or render phases take too long.
tools
Add modal dialogs and overlay UI with focus trapping. Use when implementing confirmations, alerts, or layered interfaces.