name: ui-primitives description: UI primitive components for this project (BlockStack, InlineStack, Text, Heading, Paragraph, Button, Icon). Use when writing JSX, creating components, or working with layout and typography.
UI Primitives
Always prefer UI primitives over raw HTML elements.
Layout
Use BlockStack and InlineStack from @/components/ui/layout instead of <div className="flex ...">:
BlockStack= vertical flex (flex-col)InlineStack= horizontal flex (flex-row)- Both support
gap,align,blockAlignprops - Use
asprop for semantic elements:<BlockStack as="ul">,<InlineStack as="li">
Typography
All typography components are exported from @/components/ui/typography.
Use Heading for headings instead of raw <h1-h6> or Text as="h*":
<Heading level={2}>Title</Heading>— renders<h2>withrole="heading"andaria-level- Automatically sets
size="md"+weight="semibold"for level 1,size="sm"for others - Supports
tone,size,weight,fontoverrides
Use Paragraph for paragraph text instead of raw <p> or Text as="p":
<Paragraph size="sm" tone="subdued">instead of<p className="text-sm text-muted">
Use Text for inline text (<span>, <dt>, <dd>, etc.):
<Text as="dt" weight="semibold">instead of<dt className="font-semibold">- Supports:
as,size,weight,tone,fontprops
Buttons
Use Button from @/components/ui/button
Icons
Use Icon from @/components/ui/icon
Styling
- Use shadcn/ui components from
@/components/ui/for all UI primitives - Use TailwindCSS v4 for styling (not CSS modules or styled-components)
- Only use inline styling (
style={...}) for dynamic/variable CSS values (e.g.,style={{height: h}}). Never use inline styles for static values — use Tailwind classes instead - Use
cn()utility for conditional classes (from@/lib/utils) - Prefer composition over prop drilling for complex components
Suggest Abstractions for Repeated Patterns
When you see similar Tailwind class combinations used multiple times, suggest creating reusable components or utility classes:
- Multiple buttons with similar styling -> Create a Button variant or new component
- Repeated container/card patterns -> Abstract into reusable Card component
- Common spacing/layout patterns -> Suggest utility classes or component abstractions
- Similar form field styling -> Create form field components
When Raw HTML is Acceptable
- Semantic elements not supported by primitives (e.g.,
<dl>,<ul>,<ol>,<table>) - Complex layouts where primitives don't fit
- Performance-critical sections where abstraction overhead matters