diff --git a/CLAUDE.md b/CLAUDE.md index 72b4e92..605ad72 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -98,6 +98,7 @@ Volledige MCP-tool documentatie: [docs/runbooks/mcp-integration.md](./docs/runbo | Story met UI-component | `docs/patterns/story-with-ui-component.md` | | Web Push | `docs/patterns/web-push.md` | | Job-config resolver (PBI-67) | `lib/job-config.ts` ↔ `scrum4me-mcp/src/lib/job-config.ts` | +| Debug-id op component-root | `docs/patterns/debug-id.md` | --- diff --git a/docs/patterns/debug-id.md b/docs/patterns/debug-id.md new file mode 100644 index 0000000..ae4c5b2 --- /dev/null +++ b/docs/patterns/debug-id.md @@ -0,0 +1,64 @@ +--- +title: "Debug-id op component-root" +status: active +audience: [ai-agent, contributor] +language: nl +last_updated: 2026-05-09 +when_to_read: "Wanneer je een named-component aanmaakt of aanpast." +--- + +# Patroon: Debug-id op component-root + +## Regel: named-component boundary + +Elk named-component plaatst `data-debug-id` en `data-debug-label` via de +`debugProps`-helper op zijn root JSX-element. Zes concrete regels: + +1. **Import** `debugProps` uit `@/lib/debug` — geen inline attribuut schrijven. +2. **Spread** het resultaat op het root element: `{...debugProps(id, component, file)}`. +3. **`id`** is kebab-case van de componentnaam, bijv. `sprint-board`. +4. **`component`** is de PascalCase naam zoals die geëxporteerd wordt, bijv. `SprintBoard`. +5. **`file`** is het relatieve pad vanaf de repo-root, bijv. `components/sprint/sprint-board.tsx`. +6. **Root = het buitenste JSX-element** dat de component rendert — niet een wrapper div die je extra toevoegt. + +In productie (`NODE_ENV=production`) retourneert `debugProps` een leeg object `{}` +zodat er geen debug-attributen in de gebundelde HTML staan. + +## Helper-voorbeeld + +```tsx +import { debugProps } from '@/lib/debug' + +export function SprintBoard({ ... }: SprintBoardProps) { + return ( +