RCR Frontend
Supplements global react-guidelines and frontend-html-css-guidelines skills.
Component Organization
- Reusable components:
src/app/components/with kebab-case naming (includes all Shadcn-derived primitives) - No separate
ui/directory — everything lives directly undersrc/app/components/ - Page-specific components:
-components/directory or-component.tsxsuffix
Styling
- Tailwind CSS v4 with
c-*design tokens fromsrc/app/styles/theme.css - Semantic color pattern:
c-main/c-main-contrast,c-destructive/c-destructive-contrast. Never invent token names — checksrc/app/styles/app.cssfor the full list - Never use legacy Shadcn theme variables (
bg-background,text-foreground, etc.) - Detecting invalid classes: Oxfmt sorts unknown classes to the front. If classes appear out of order after
bun check, they're misspelled or missing from the theme
Radix & Shadcn
- Always import Radix from the
radix-uipackage (import { HoverCard as HoverCardPrimitive } from 'radix-ui'), not from subpackages like@radix-ui/react-hover-card - Use
asChildto compose styling (e.g., dropdown trigger styled as Button) rather than duplicating inline styles - Mark key DOM nodes with
data-slotattributes for styling hooks
Component Primitives
Buttons
The Button component handles sizing, text, and icon dimensions internally. Never override these with utility classes.
- Dimensions: use the
sizeprop (default|sm|icon), never manualh-x w-x p-0. For icon-only buttons,size="icon"givessize-9. - Text size: baked into the base (
text-sm). Never addtext-xs,text-sm, etc. viaclassName. - Icon size: the base rule
[&_svg:not([class*='size-'])]:size-4auto-sizes child SVGs. Never addh-x w-xorsize-xto icons inside buttons — omit sizing entirely and let the button handle it. - Content over positioning: put content (counts, badges) as regular children in flow — never absolutely-positioned overlays.
Icons
- Lucide icons with
Iconsuffix:HomeIcon, notHome - Icons inherit size from surrounding text automatically.
size-[1em]is redundant — omit it. - Only add explicit
size-*when overriding the contextual size (e.g., a larger icon in small text). - Use
<Spinner />from@/components/spinnerfor loading states
Tailwind Shorthand
- When width and height are equal, use
size-xinstead ofw-x h-x - No custom/arbitrary text sizes (
text-[10px],text-[13px], etc.) — use design system tokens (text-xs,text-sm, etc.) unless there's a specific constraint preventing it
Event Handlers
- No inline arrow functions in JSX
onClick/onChangeprops — extract to a named handler or a component with its own handler
Forms
- TanStack Forms + Zod schemas for form management and validation
Converted and distributed by TomeVault — claim your Tome and manage your conversions.