--- description: Figma ↔ codebase prop alignment & normalization for design-system components globs: app/components/**/*.{ts,tsx} alwaysApply: false --- # Component prop alignment Figma emits PascalCase enum values (`"Standard"`, `"Inverse"`); the codebase stores lowercase (`"standard"`, `"inverse"`). Components must accept **both**, normalize to lowercase internally, and never break existing consumer call sites. ## Scope Applies to enum-like string props: `variant`, `size`, `state`, `mode`, `type`, `position`, `alignment`, `status`, `color`, `palette`. **Skip** for free-form strings (URLs, classNames), booleans, numbers, or internal-only props. ## Pattern ```typescript // Type accepts both formats export type ComponentSizeValue = "small" | "medium" | "Small" | "Medium"; // Container normalizes via helpers from lib/propNormalization.ts import { normalizeSize } from "../../../lib/propNormalization"; const ComponentContainer = ({ size: sizeProp = "small" }: Props) => { const size = normalizeSize(sizeProp, SIZE_OPTIONS, "small"); return ; }; ``` ## Normalizers Use an existing helper from `lib/propNormalization.ts` before writing a new one. Generic: `normalizeMode`, `normalizeState`, `normalizeInputState`, `normalizeSize`, `normalizeAlignment`, `normalizeSmallMediumLargeSize`, `normalizeLabelVariant`. Component-specific variants are named `normalize` (e.g. `normalizeChipPalette`, `normalizeButtonState`) — add one there rather than inlining a switch in your container. ## Figma traceability Every DS component's container docstring cites its Figma origin so designers and engineers can jump between the two. Format: `Figma: "" ()`. ```typescript /** * Figma: "Control / Incrementer" (`17857:30943`). A compact [ - value + ] * row used for numeric step inputs… */ ``` When the view renders a distinct Figma node, add `data-figma-node=""` on the root element for quick DOM-to-design lookup.