Theme
Source of truth: components.json with style: "radix-maia"
Last updated: 2026-02-27
Native Maia theme (enforced)
Use native shadcn Maia theme components only. Do not add custom style overrides that deviate from the theme.
Design System lab by Gagan Malik — inspect radix-maia tokens, shadcn components, spacing, radius, typography, and Maia dropdown patterns in the browser.

गगन मलिक द्वारा
Semantic colours from app/globals.css — copy the CSS variable names into your theme.
--primary--secondary--muted--accent--destructive--border--background--foreground--chart-1--chart-2--chart-3--chart-4--chart-5Derived from --radius (1rem). Match trigger and dropdown radius in attached menus.
rounded-smrounded-mdrounded-lgrounded-xlrounded-2xlrounded-3xlrounded-4xlUse 4, 8, 16, 24, and 32px for padding, gaps, and section rhythm.
4px — tight gaps
p-1 / gap-18px — related elements
p-2 / gap-216px — default padding
p-4 / gap-424px — section spacing
p-6 / gap-632px — large breaks
p-8 / gap-8Inter loader tokens, type scale, and semantic foreground roles.
Inter
Primary UI and reading face — loaded via next/font/google on the root layout.
The quick brown fox jumps over the lazy dog. 0123456789
CSS variable on html
--font-interTailwind @theme sans mapping
--font-sans: var(--font-inter)Utility class
font-sansBody smoothing
antialiasedFont loader
next/font/google · InterSubset and display
latin · display: swapHeading 1 — page title scale
Heading 2 — section title
Heading 3 — subsection
Body — default reading text at text-base.
Muted — secondary copy at text-sm text-muted-foreground.
Small — captions and meta at text-xs.
Variants and sizes from the shadcn registry — no custom radius overrides.
Field description using the Field pattern.
Use cards for self-contained summaries, not full-page layout.
| Token | Tailwind | Usage |
|---|---|---|
--primary | bg-primary | Primary actions and emphasis |
--radius | rounded-4xl | Pill triggers and attached dropdowns |
Dropdown content uses the same radius family as the trigger. Overlap with sideOffset=-4 for Maia attachment.
Tab to interactive elements — focus-visible:ring-2 on buttons, inputs, and switches.
Minimum 44×44pt for taps. Wrap compact controls when needed.
Animations respect prefers-reduced-motion via SectionReveal and shared motion helpers.
Source of truth: components.json with style: "radix-maia"
Last updated: 2026-02-27
Use native shadcn Maia theme components only. Do not add custom style overrides that deviate from the theme.
npx shadcn@latest add <component> --overwrite
style or baseColor in components.json unless intentionally switching themes.app/globals.css via @theme inline and :root.--muted: oklch(0.92 0 0) — tuned for perceptible ghost-button hover contrast against --background (WCAG 2.1 non-text contrast).--radius: 1rem (large). Derived: --radius-sm through --radius-4xl.Use a consistent spacing scale for padding, margins, and gaps:
| Pixels | Tailwind | Usage |
|---|---|---|
| 4 | p-1, gap-1 | Tight gaps, icon padding |
| 8 | p-2, gap-2 | Small gaps between related elements |
| 16 | p-4, gap-4 | Default padding, card gaps |
| 24 | p-6, gap-6 | Section spacing |
| 32 | p-8, gap-8 | Large section breaks |
Avoid arbitrary values unless aligning to a specific design spec.
focus-visible:ring-2, focus-visible:ring-ring).aria-label, aria-describedby, role where appropriate. Prefer native elements (<button>, <a>) over divs.prefers-reduced-motion for animations. Transitions should clarify state, not distract.@/lib/motion (re-exports motion, AnimatePresence, and types) so future reduced-motion or config changes stay centralized.useReducedMotionTransition() hook from @/lib/motion for the transition prop so animations are disabled when the user prefers reduced motion. See lib/hooks.ts for usePrefersReducedMotion().min-h-11 (44px) or size-11 for touch-friendly buttons on mobile.rounded-4xl (pill) → SelectContent uses rounded-4xl.sideOffset={-4}
sideOffset={8}).When aligning a component with a reference (screenshot or live example), verify before declaring done:
first:rounded-t-*, last:rounded-b-*)| Component | Trigger radius | Content radius | Item radius | sideOffset |
|---|---|---|---|---|
| Select | rounded-4xl | rounded-4xl | first:rounded-t-4xl last:rounded-b-4xl first:last:rounded-4xl | -4 |
| Switch | — | — | — | — |
| Table | — | — | first:rounded-l-lg last:rounded-r-lg (8px, on first/last cell per row) | — |
Switch: Use for boolean toggles (e.g. Ask voice settings: Voice mode, Wake word). Wrap in min-h-[44px] min-w-[44px] flex items-center justify-center when a larger touch target is needed. From shadcn registry; has built-in focus-visible ring.
Table row cells: First and last cells (th or td) in each row use rounded-l-lg / rounded-r-lg (8px) in default and hover states. Requires border-separate border-spacing-0 on the table for rounded corners to render correctly.
Source: components/ui — shadcn registry (radix-maia theme)
Last updated: 2026-03-19
All components are from the shadcn registry unless noted. Add or update with:
npx shadcn@latest add <component> --overwrite
| Component | File | Description |
|---|---|---|
| Badge | badge.tsx | Status labels, tags |
| Breadcrumb | breadcrumb.tsx | Navigation breadcrumbs |
| Button | button.tsx | Primary actions, variants (default, outline, ghost, etc.) |
| Card | card.tsx | Card container with header, content, footer |
| Carousel | carousel.tsx | Image/content carousel (embla-carousel) |
| Command | command.tsx | Command palette (⌘K) |
| Dialog | dialog.tsx | Modal dialogs |
| Dropdown Menu | dropdown-menu.tsx | Context menus, dropdown actions |
components/ui)| Component | File | Description |
|---|---|---|
| Tracked Link | tracked-link.tsx | Link wrapper with analytics (trackEvent) |
components/skeletons)Route-level loading UIs use shared skeleton components. They mirror mobile vs desktop layouts: tighter horizontal padding ( → / ), stacked vertically with full-width controls on small viewports ( → ), with image on top and text block below on mobile (matching ), and with title + “View archive” stacked on narrow screens. Inline skeletons in (e.g. pricing, archive, legal index) follow the same padding pattern.
For tech stack, SEO, and other technical reference, see full documentation.
Plans देखें, या सवाल पूछें।
नए लेख और अपडेट अपने आप पाने के लिए इस लिंक को अपने RSS रीडर में जोड़ें।
| Hover Card |
hover-card.tsx |
| Hover-triggered popover |
| Input | input.tsx | Text input field |
| Input Group | input-group.tsx | Input with addons (prefix/suffix) |
| Pagination | pagination.tsx | Page navigation |
| Popover | popover.tsx | Floating popover content |
| Select | select.tsx | Dropdown select |
| Separator | separator.tsx | Visual divider |
| Sheet | sheet.tsx | Slide-out panel |
| Sidebar | sidebar.tsx | Collapsible sidebar layout |
| Skeleton | skeleton.tsx | Loading placeholder |
| Sonner | sonner.tsx | Toast notifications |
| Switch | switch.tsx | Toggle (Voice mode, Wake word in Ask voice settings sheet) |
| Table | table.tsx | Data tables |
| Textarea | textarea.tsx | Multi-line text input |
| Tooltip | tooltip.tsx | Hover tooltips |
px-4sm:px-6sm:px-8flex-colsm:flex-rowWritingsBentoCardapp/**/loading.tsx