diff --git a/docs/app/docs/components/alert-dialog/docs/example_1.tsx b/docs/app/docs/components/alert-dialog/docs/example_1.tsx index 21ab0bc91..4b0d3f926 100644 --- a/docs/app/docs/components/alert-dialog/docs/example_1.tsx +++ b/docs/app/docs/components/alert-dialog/docs/example_1.tsx @@ -17,12 +17,14 @@ const AlertDialogExample = () => { This action cannot be undone. +
Delete Cancel +
diff --git a/docs/app/docs/components/aspect-ratio/page.mdx b/docs/app/docs/components/aspect-ratio/page.mdx index f3b85c8c6..b2d51d70e 100644 --- a/docs/app/docs/components/aspect-ratio/page.mdx +++ b/docs/app/docs/components/aspect-ratio/page.mdx @@ -2,6 +2,7 @@ import Documentation from "@/components/layout/Documentation/Documentation" import AspectRatio from "@radui/ui/AspectRatio" import codeUsage, { AspectRatioTable } from "./docs/codeUsage" import Card from "@radui/ui/Card" +import Ruler from "@/components/utility/Ruler" import aspectRatioMetadata from "./seo" export const metadata = aspectRatioMetadata @@ -11,16 +12,40 @@ export const metadata = aspectRatioMetadata description="Aspect Ratio is used to set the desired ratio." > - - - Landscape photograph - - +
+ {/* Top ruler */} +
+ +
+ +
+ {/* Left ruler */} +
+ +
+ + + + Landscape photograph + + + + {/* Right ruler */} +
+ +
+
+ + {/* Bottom ruler */} +
+ +
+
{ return
{sizes.map((size, index) => { return
- "Behind every great man is a woman rolling her eyes." — Jim Carrey + "Behind every great man is a woman rolling her eyes." - Jim Carrey
})}
diff --git a/docs/app/docs/components/blockquote/examples/BlockQuoteExample.tsx b/docs/app/docs/components/blockquote/examples/BlockQuoteExample.tsx index 9bf068663..f06b5c485 100644 --- a/docs/app/docs/components/blockquote/examples/BlockQuoteExample.tsx +++ b/docs/app/docs/components/blockquote/examples/BlockQuoteExample.tsx @@ -3,7 +3,7 @@ import BlockQuote from "@radui/ui/BlockQuote" const BlockQuoteExample = () => (
- "Behind every great man is a woman rolling her eyes." — Jim Carrey + "Behind every great man is a woman rolling her eyes." - Jim Carrey
) diff --git a/docs/app/docs/components/blockquote/examples/BlockQuoteSizes.tsx b/docs/app/docs/components/blockquote/examples/BlockQuoteSizes.tsx index 5c50c667f..e8f964222 100644 --- a/docs/app/docs/components/blockquote/examples/BlockQuoteSizes.tsx +++ b/docs/app/docs/components/blockquote/examples/BlockQuoteSizes.tsx @@ -7,7 +7,7 @@ const BlockQuoteSizes = () => { {sizes.map((size, index) => { return
- "Behind every great man is a woman rolling her eyes." — Jim Carrey + "Behind every great man is a woman rolling her eyes." - Jim Carrey
})} diff --git a/docs/app/docs/components/callout/examples/CalloutColor.tsx b/docs/app/docs/components/callout/examples/CalloutColor.tsx index 6c42fdf0c..da1ff2536 100644 --- a/docs/app/docs/components/callout/examples/CalloutColor.tsx +++ b/docs/app/docs/components/callout/examples/CalloutColor.tsx @@ -1,6 +1,6 @@ "use client"; import Callout from "@radui/ui/Callout"; -import { BookmarkIcon } from './CalloutExample'; +import { AlertCircle as BookmarkIcon } from 'lucide-react'; const CalloutColor = () => { const colors = ['red', 'green', 'blue', 'yellow', 'purple', 'orange', 'pink']; @@ -9,7 +9,7 @@ const CalloutColor = () => { return ( - + Seems like there's been an error. Please try again. diff --git a/docs/app/docs/components/callout/examples/CalloutExample.tsx b/docs/app/docs/components/callout/examples/CalloutExample.tsx index 31d14a095..34628ed0a 100644 --- a/docs/app/docs/components/callout/examples/CalloutExample.tsx +++ b/docs/app/docs/components/callout/examples/CalloutExample.tsx @@ -1,15 +1,12 @@ "use client"; import Callout from "@radui/ui/Callout"; - -export const BookmarkIcon = () => { - return ; -}; +import { AlertCircle as BookmarkIcon } from 'lucide-react'; const CalloutExample = () => ( - + Seems like there's been an error. Please try again. diff --git a/docs/app/docs/components/callout/examples/CalloutSizes.tsx b/docs/app/docs/components/callout/examples/CalloutSizes.tsx index ff21094f2..d5da4ab9f 100644 --- a/docs/app/docs/components/callout/examples/CalloutSizes.tsx +++ b/docs/app/docs/components/callout/examples/CalloutSizes.tsx @@ -1,6 +1,6 @@ "use client"; import Callout from '@radui/ui/Callout'; -import { BookmarkIcon } from './CalloutExample'; +import { AlertCircle as BookmarkIcon } from 'lucide-react'; const CalloutSizes = () => { const sizes = ['small', 'medium', 'large', 'x-large']; @@ -12,7 +12,7 @@ const CalloutSizes = () => { return ( - + Seems like there's been an error. Please try again. diff --git a/docs/app/docs/components/callout/examples/CalloutVariants.tsx b/docs/app/docs/components/callout/examples/CalloutVariants.tsx index d1c0ed24f..f2499a68a 100644 --- a/docs/app/docs/components/callout/examples/CalloutVariants.tsx +++ b/docs/app/docs/components/callout/examples/CalloutVariants.tsx @@ -2,8 +2,7 @@ import Callout from '@radui/ui/Callout'; import Text from "@radui/ui/Text"; import Separator from '@radui/ui/Separator'; - -import { BookmarkIcon } from './CalloutExample'; +import { AlertCircle as BookmarkIcon } from 'lucide-react'; import TooltipWrapper from '@/components/ui/Tooltip'; const CalloutVariants = () => { @@ -21,7 +20,7 @@ const CalloutVariants = () => { return - + Seems like there's been an error. Please try again. diff --git a/docs/app/docs/components/toggle-group/docs/toggle-group-example-basic.tsx b/docs/app/docs/components/toggle-group/docs/toggle-group-example-basic.tsx index a900bae83..e35f85bfa 100644 --- a/docs/app/docs/components/toggle-group/docs/toggle-group-example-basic.tsx +++ b/docs/app/docs/components/toggle-group/docs/toggle-group-example-basic.tsx @@ -3,21 +3,7 @@ import React from 'react'; import ToggleGroup from '@radui/ui/ToggleGroup'; - -const FrameIcon = () => { - return ; -}; -const CropIcon = () => { - return ; -}; - -const LayersIcon = () => { - return ; -}; - -const ColumnsIcon = () => { - return ; -}; +import { Frame as FrameIcon, Crop as CropIcon, Layers as LayersIcon, Columns as ColumnsIcon } from 'lucide-react'; // More on writing stories with args: https://storybook.js.org/docs/react/writing-stories/args const items = [ diff --git a/docs/app/docs/components/toggle/docs/toggle-example-basic.tsx b/docs/app/docs/components/toggle/docs/toggle-example-basic.tsx index 540db77e2..435b006f5 100644 --- a/docs/app/docs/components/toggle/docs/toggle-example-basic.tsx +++ b/docs/app/docs/components/toggle/docs/toggle-example-basic.tsx @@ -3,12 +3,13 @@ import React from 'react'; import Toggle from '@radui/ui/Toggle'; +import { Power } from 'lucide-react'; const ToggleExampleBasic = () => { const [pressed, setPressed] = React.useState(false); const Icon = () => { - return ; + return ; }; const handleChange = (newPressed) => { diff --git a/docs/app/docs/components/tooltip/docs/examples/tooltip_example1.tsx b/docs/app/docs/components/tooltip/docs/examples/tooltip_example1.tsx index b20905942..925551621 100644 --- a/docs/app/docs/components/tooltip/docs/examples/tooltip_example1.tsx +++ b/docs/app/docs/components/tooltip/docs/examples/tooltip_example1.tsx @@ -1,19 +1,15 @@ "use client" -import Card from "@radui/ui/Card" import Tooltip from "@radui/ui/Tooltip" -import Text from "@radui/ui/Text" const TooltipExample1 = () => { return ( - - - Hello Tooltip. Hover Me! - + + Hello Tooltip. Hover Me! - - Hello from the tooltip! + + Hello from the tooltip! ) diff --git a/docs/app/docs/contributing/component-coverage/CoverageIcons.js b/docs/app/docs/contributing/component-coverage/CoverageIcons.js new file mode 100644 index 000000000..04b399c94 --- /dev/null +++ b/docs/app/docs/contributing/component-coverage/CoverageIcons.js @@ -0,0 +1,10 @@ +'use client'; + +import { Check, X, AlertCircle, Minus } from 'lucide-react'; + +export const CheckIcon = () => ; +export const XIcon = () => ; +export const HighPriorityIcon = () => ; +export const MediumPriorityIcon = () => ; +export const DashIcon = () => ; + diff --git a/docs/app/docs/contributing/component-coverage/page.mdx b/docs/app/docs/contributing/component-coverage/page.mdx index 22b3f7087..7d2899df9 100644 --- a/docs/app/docs/contributing/component-coverage/page.mdx +++ b/docs/app/docs/contributing/component-coverage/page.mdx @@ -1,4 +1,5 @@ import componentCoverageMetadata from "./seo" +import { CheckIcon, XIcon, HighPriorityIcon, MediumPriorityIcon, DashIcon } from "./CoverageIcons" export const metadata = componentCoverageMetadata @@ -91,67 +92,69 @@ This comparison focuses purely on **component availability**, not API design, ac --- -## Component Coverage Matrix +## Component Coverage Matrix [Sample] +PS: This table is mostly a placeholder, we'd like to publish our component list in comparison to other libraries as a way to measure our own progress. + | Component | Rad UI | Radix UI | Base UI | Ark UI | Headless UI | Priority | | ---------------------------- | ------ | -------- | ------- | ------ | ----------- | --------- | | **Layout & Structure** | | | | | | | -| Accordion | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| AspectRatio | ✅ | ✅ | ❌ | ❌ | ❌ | – | -| Separator | ✅ | ✅ | ✅ | ❌ | ❌ | – | -| Splitter | ✅ | ❌ | ❌ | ✅ | ❌ | – | -| Steps | ✅ | ❌ | ❌ | ✅ | ❌ | – | +| Accordion | | | | | | | +| AspectRatio | | | | | | | +| Separator | | | | | | | +| Splitter | | | | | | | +| Steps | | | | | | | | **Navigation** | | | | | | | -| Breadcrumb | ❌ | ❌ | ✅ | ✅ | ❌ | 🔴 High | -| NavigationMenu | ✅ | ✅ | ❌ | ❌ | ❌ | – | -| Menubar | ✅ | ✅ | ❌ | ❌ | ❌ | – | -| TabNav | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Tabs | ✅ | ✅ | ✅ | ✅ | ✅ | – | +| Breadcrumb | | | | | | High | +| NavigationMenu | | | | | | | +| Menubar | | | | | | | +| TabNav | | | | | | | +| Tabs | | | | | | | | **Overlays & Dialogs** | | | | | | | -| AlertDialog | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| Dialog | ✅ | ✅ | ✅ | ✅ | ✅ | – | -| Popover | ❌ | ✅ | ✅ | ✅ | ✅ | 🔴 High | -| Tooltip | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| HoverCard | ✅ | ✅ | ❌ | ✅ | ❌ | – | -| BottomSheet | ❌ | ❌ | ❌ | ✅ | ❌ | 🟡 Medium | -| FloatingPanel | ❌ | ❌ | ❌ | ✅ | ❌ | 🟡 Medium | +| AlertDialog | | | | | | | +| Dialog | | | | | | | +| Popover | | | | | | High | +| Tooltip | | | | | | | +| HoverCard | | | | | | | +| BottomSheet | | | | | | Medium | +| FloatingPanel | | | | | | Medium | | **Forms & Inputs** | | | | | | | -| Button | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| Checkbox | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| CheckboxGroup | ✅ | ❌ | ✅ | ✅ | ❌ | – | -| CheckboxCards | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Radio | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| RadioGroup | ✅ | ✅ | ✅ | ✅ | ✅ | – | -| RadioCards | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Switch | ✅ | ✅ | ✅ | ✅ | ✅ | – | -| Toggle | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| ToggleGroup | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| TextArea | ✅ | ❌ | ✅ | ✅ | ❌ | – | -| NumberField | ✅ | ❌ | ✅ | ✅ | ❌ | – | -| Select | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| Combobox | ❌ | ❌ | ✅ | ✅ | ✅ | 🔴 High | -| DatePicker | ❌ | ❌ | ✅ | ✅ | ❌ | 🔴 High | -| TimePicker | ❌ | ❌ | ✅ | ✅ | ❌ | 🟡 Medium | +| Button | | | | | | | +| Checkbox | | | | | | | +| CheckboxGroup | | | | | | | +| CheckboxCards | | | | | | | +| Radio | | | | | | | +| RadioGroup | | | | | | | +| RadioCards | | | | | | | +| Switch | | | | | | | +| Toggle | | | | | | | +| ToggleGroup | | | | | | | +| TextArea | | | | | | | +| NumberField | | | | | | | +| Select | | | | | | | +| Combobox | | | | | | High | +| DatePicker | | | | | | High | +| TimePicker | | | | | | Medium | | **Data Display** | | | | | | | -| Avatar | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| AvatarGroup | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Badge | ✅ | ❌ | ✅ | ❌ | ❌ | – | -| Card | ✅ | ❌ | ✅ | ❌ | ❌ | – | -| Table | ✅ | ❌ | ✅ | ✅ | ❌ | – | -| Skeleton | ✅ | ❌ | ❌ | ❌ | ❌ | – | +| Avatar | | | | | | | +| AvatarGroup | | | | | | | +| Badge | | | | | | | +| Card | | | | | | | +| Table | | | | | | | +| Skeleton | | | | | | | | **Feedback & Notifications** | | | | | | | -| Toast | ❌ | ✅ | ✅ | ✅ | ❌ | 🔴 High | -| Callout | ✅ | ❌ | ❌ | ❌ | ❌ | – | +| Toast | | | | | | High | +| Callout | | | | | | | | **Typography** | | | | | | | -| Heading | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Text | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Code | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Kbd | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Em | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Strong | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| BlockQuote | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Quote | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Link | ✅ | ❌ | ❌ | ❌ | ❌ | – | +| Heading | | | | | | | +| Text | | | | | | | +| Code | | | | | | | +| Kbd | | | | | | | +| Em | | | | | | | +| Strong | | | | | | | +| BlockQuote | | | | | | | +| Quote | | | | | | | +| Link | | | | | | | --- @@ -159,7 +162,7 @@ This comparison focuses purely on **component availability**, not API design, ac These components appear across multiple libraries and are frequently expected in production apps. -### 🔴 High Priority +### High Priority 1. **Popover** Present in Radix UI, Base UI, Ark UI, Headless UI @@ -183,22 +186,6 @@ This list is not “missing features shame”. It is the practical roadmap requi --- -## Coverage Summary by Category - -| Category | Rad UI | Radix UI | Base UI | Ark UI | Headless UI | -| ------------------ | ------ | -------- | ------- | ------ | ----------- | -| Layout & Structure | 5 | 2 | 1 | 2 | 0 | -| Navigation | 4 | 2 | 1 | 2 | 1 | -| Overlays & Dialogs | 5 | 4 | 3 | 6 | 2 | -| Forms & Inputs | 18 | 7 | 15 | 20 | 3 | -| Data Display | 8 | 1 | 3 | 6 | 0 | -| Menus | 3 | 2 | 2 | 3 | 2 | -| Feedback | 1 | 1 | 1 | 1 | 0 | -| Typography | 9 | 0 | 0 | 0 | 0 | -| Utilities | 7 | 3 | 0 | 10 | 1 | -| **Total** | **54** | **22** | **25** | **50** | **9** | - ---- ## Where Rad UI Differentiates diff --git a/docs/app/docs/contributing/component-maturity-rubric/page.mdx b/docs/app/docs/contributing/component-maturity-rubric/page.mdx index 1874333cd..5652dec6c 100644 --- a/docs/app/docs/contributing/component-maturity-rubric/page.mdx +++ b/docs/app/docs/contributing/component-maturity-rubric/page.mdx @@ -20,9 +20,9 @@ Use it to assess component maturity, identify gaps, and decide when a component Every component in Rad UI belongs to one of three maturity levels: -- 🧪 **Experimental**: early work, learning phase, sharp edges expected -- 🔄 **Beta**: feature complete, usable, still gaining real world confidence -- ✅ **Production**: stable API, strong docs, strong tests, safe to adopt +- **Experimental**: early work, learning phase, sharp edges expected +- **Beta**: feature complete, usable, still gaining real world confidence +- **Production**: stable API, strong docs, strong tests, safe to adopt Promotion is earned. Not vibes. @@ -30,7 +30,7 @@ Promotion is earned. Not vibes. ## Maturity Levels -### 🧪 Experimental +### Experimental For components in active development or exploration. @@ -45,7 +45,7 @@ For components in active development or exploration. --- -### 🔄 Beta +### Beta For components that are feature complete and broadly usable, but still under validation. @@ -58,7 +58,7 @@ Small refinements can still happen. --- -### ✅ Production +### Production For stable components with high confidence. diff --git a/docs/app/docs/guides/component-coverage/page.mdx b/docs/app/docs/guides/component-coverage/page.mdx deleted file mode 100644 index 1f67d6998..000000000 --- a/docs/app/docs/guides/component-coverage/page.mdx +++ /dev/null @@ -1,263 +0,0 @@ -import componentCoverageMetadata from "./seo" - -export const metadata = componentCoverageMetadata - -# Component Coverage Comparison: Rad UI, Radix UI, Base UI, Ark UI, Headless UI - -## Executive Summary - -This document presents a side-by-side comparison of component coverage across modern headless and semi-headless UI libraries: - -**Rad UI**, **Radix UI**, **Base UI**, **Ark UI**, and **Headless UI**. - -The purpose of this document is not to rank or judge libraries, but to: - -* Compare component availability across the ecosystem -* Identify commonly expected UI building blocks -* Highlight areas where Rad UI can expand coverage to better support real-world product needs - -Different libraries optimize for different tradeoffs. This comparison focuses purely on **component availability**, not API design, accessibility depth, performance characteristics, or composability philosophy. - -### High-level observations - -* **Total components**: Rad UI currently includes **54 components** (33 released, 21 in development) -* **Common gaps**: 6 components appear consistently across other libraries but are not yet present in Rad UI -* **Differentiation**: Rad UI includes a broader typography and layout layer than most peers -* **Overall coverage**: Rad UI offers broader surface area than Radix UI and Headless UI, and comparable breadth to Ark UI - ---- - -## Current Rad UI Component Inventory - -### Total Components: 54 - -### Officially Released: 33 - -### In Codebase / In Progress: 21 - -1. Accordion -2. AlertDialog -3. AspectRatio -4. Avatar -5. AvatarGroup -6. Badge -7. BlockQuote -8. Button -9. Callout -10. Card -11. Checkbox -12. CheckboxCards -13. CheckboxGroup -14. Code -15. Collapsible -16. ContextMenu -17. DataList -18. Dialog -19. Disclosure -20. DropdownMenu -21. Em -22. Heading -23. HoverCard -24. Kbd -25. Link -26. Menubar -27. Minimap -28. NavigationMenu -29. NumberField -30. Progress -31. Quote -32. Radio -33. RadioCards -34. RadioGroup -35. ScrollArea -36. Select -37. Separator -38. Skeleton -39. Slider -40. Splitter -41. Steps -42. Strong -43. Switch -44. Table -45. TabNav -46. Tabs -47. Text -48. TextArea -49. Theme -50. Toggle -51. ToggleGroup -52. Tooltip -53. Tree -54. VisuallyHidden - ---- - -## Component Coverage Matrix - -| Component | Rad UI | Radix UI | Base UI | Ark UI | Headless UI | Priority | -| ---------------------------- | ------ | -------- | ------- | ------ | ----------- | --------- | -| **Layout & Structure** | | | | | | | -| Accordion | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| AspectRatio | ✅ | ✅ | ❌ | ❌ | ❌ | – | -| Separator | ✅ | ✅ | ✅ | ❌ | ❌ | – | -| Splitter | ✅ | ❌ | ❌ | ✅ | ❌ | – | -| Steps | ✅ | ❌ | ❌ | ✅ | ❌ | – | -| **Navigation** | | | | | | | -| Breadcrumb | ❌ | ❌ | ✅ | ✅ | ❌ | 🔴 High | -| NavigationMenu | ✅ | ✅ | ❌ | ❌ | ❌ | – | -| Menubar | ✅ | ✅ | ❌ | ❌ | ❌ | – | -| TabNav | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Tabs | ✅ | ✅ | ✅ | ✅ | ✅ | – | -| **Overlays & Dialogs** | | | | | | | -| AlertDialog | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| Dialog | ✅ | ✅ | ✅ | ✅ | ✅ | – | -| Popover | ❌ | ✅ | ✅ | ✅ | ✅ | 🔴 High | -| Tooltip | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| HoverCard | ✅ | ✅ | ❌ | ✅ | ❌ | – | -| BottomSheet | ❌ | ❌ | ❌ | ✅ | ❌ | 🟡 Medium | -| FloatingPanel | ❌ | ❌ | ❌ | ✅ | ❌ | 🟡 Medium | -| **Forms & Inputs** | | | | | | | -| Button | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| Checkbox | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| CheckboxGroup | ✅ | ❌ | ✅ | ✅ | ❌ | – | -| CheckboxCards | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Radio | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| RadioGroup | ✅ | ✅ | ✅ | ✅ | ✅ | – | -| RadioCards | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Switch | ✅ | ✅ | ✅ | ✅ | ✅ | – | -| Toggle | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| ToggleGroup | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| TextArea | ✅ | ❌ | ✅ | ✅ | ❌ | – | -| NumberField | ✅ | ❌ | ✅ | ✅ | ❌ | – | -| Select | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| Combobox | ❌ | ❌ | ✅ | ✅ | ✅ | 🔴 High | -| DatePicker | ❌ | ❌ | ✅ | ✅ | ❌ | 🔴 High | -| TimePicker | ❌ | ❌ | ✅ | ✅ | ❌ | 🟡 Medium | -| **Data Display** | | | | | | | -| Avatar | ✅ | ✅ | ✅ | ✅ | ❌ | – | -| AvatarGroup | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Badge | ✅ | ❌ | ✅ | ❌ | ❌ | – | -| Card | ✅ | ❌ | ✅ | ❌ | ❌ | – | -| Table | ✅ | ❌ | ✅ | ✅ | ❌ | – | -| Skeleton | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| **Feedback & Notifications** | | | | | | | -| Toast | ❌ | ✅ | ✅ | ✅ | ❌ | 🔴 High | -| Callout | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| **Typography** | | | | | | | -| Heading | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Text | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Code | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Kbd | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Em | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Strong | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| BlockQuote | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Quote | ✅ | ❌ | ❌ | ❌ | ❌ | – | -| Link | ✅ | ❌ | ❌ | ❌ | ❌ | – | - ---- - -## Commonly Expected Components Not Yet in Rad UI - -The following components appear across multiple libraries and represent patterns commonly expected in production applications. - -### 🔴 High Priority - -1. **Popover** - Present in Radix UI, Base UI, Ark UI, Headless UI - -2. **Combobox** - Present in Base UI, Ark UI, Headless UI - -3. **DatePicker** - Present in Base UI, Ark UI - -4. **Toast** - Present in Radix UI, Base UI, Ark UI - -5. **Pagination** - Present in Base UI, Ark UI - -6. **Breadcrumb** - Present in Base UI, Ark UI - ---- - -## Coverage Summary by Category - -| Category | Rad UI | Radix UI | Base UI | Ark UI | Headless UI | -| ------------------ | ------ | -------- | ------- | ------ | ----------- | -| Layout & Structure | 5 | 2 | 1 | 2 | 0 | -| Navigation | 4 | 2 | 1 | 2 | 1 | -| Overlays & Dialogs | 5 | 4 | 3 | 6 | 2 | -| Forms & Inputs | 18 | 7 | 15 | 20 | 3 | -| Data Display | 8 | 1 | 3 | 6 | 0 | -| Menus | 3 | 2 | 2 | 3 | 2 | -| Feedback | 1 | 1 | 1 | 1 | 0 | -| Typography | 9 | 0 | 0 | 0 | 0 | -| Utilities | 7 | 3 | 0 | 10 | 1 | -| **Total** | **54** | **22** | **25** | **50** | **9** | - ---- - -## Areas of Differentiation - -* **Typography layer**: Rad UI provides a structured typography system that most peer libraries do not include -* **Extended form patterns**: Components like CheckboxCards and RadioCards are uncommon elsewhere -* **Layout primitives**: Splitter, Steps, and Minimap are not widely available in other libraries -* **Theme abstraction**: Rad UI includes a dedicated Theme component rather than treating theming as external setup - ---- - -## Opportunities for Expansion - -* Add commonly expected overlay patterns (Popover, Toast) -* Expand date and time input coverage -* Improve data navigation patterns (Pagination, Breadcrumb) -* Introduce optional animation and transition primitives - ---- - -## Conclusion - -Rad UI already offers broad component coverage with a strong foundation in typography, layout, and form controls. While its surface area is comparable to larger libraries, there are a small number of widely expected components that would meaningfully improve completeness. - -This document serves as a transparent snapshot of where Rad UI fits within the broader UI ecosystem today and helps guide future expansion in a deliberate, user-driven way. - ---- - -## Contributing - -We welcome contributions to Rad UI! If you're interested in helping expand our component coverage, here are some ways to get involved: - -### High Priority Components - -The following components are marked as high priority and would be great contributions: - -- **Popover** - A versatile overlay component for displaying content relative to a trigger -- **Combobox** - An autocomplete input with dropdown suggestions -- **DatePicker** - Date selection component with calendar interface -- **Toast** - Notification system for user feedback -- **Breadcrumb** - Navigation component showing hierarchical path -- **Pagination** - Component for navigating through paginated content - -### How to Contribute - -1. **Check existing issues**: Look for open issues related to the component you want to work on -2. **Comment on the issue**: Let others know you're working on it to avoid duplicate work -3. **Follow our guidelines**: See our [Contributing Guide](/docs/contributing/contributing-to-rad-ui) for detailed instructions -4. **Component standards**: Review our [Component Maturity Rubric](/docs/contributing/component-maturity-rubric) to understand what's expected - -### Getting Started - -- Join our [Discord community](https://discord.gg/rad-ui) to discuss ideas and get help -- Set up your [development environment](/docs/contributing/setting-up-dev-environment) -- Explore [Good First Issues](https://github.com/rad-ui/rad-ui/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) if you're new to the project - -We value all contributions and are grateful for your help in making Rad UI better! - ---- - -*Last updated: December 2025* -*Document version: 1.0* - ---- \ No newline at end of file diff --git a/docs/app/docs/guides/component-coverage/seo.ts b/docs/app/docs/guides/component-coverage/seo.ts deleted file mode 100644 index 85bc3d9a3..000000000 --- a/docs/app/docs/guides/component-coverage/seo.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Metadata } from "next"; - -const componentCoverageMetadata: Metadata = { - title: "Component Coverage Comparison | Rad UI", - description: "A transparent comparison of component availability across Rad UI, Radix UI, Base UI, Ark UI, and Headless UI.", - openGraph: { - title: "Component Coverage Comparison | Rad UI", - description: "A transparent comparison of component availability across Rad UI, Radix UI, Base UI, Ark UI, and Headless UI.", - type: "article", - }, -}; - -export default componentCoverageMetadata; - diff --git a/docs/app/docs/layout.tsx b/docs/app/docs/layout.tsx index 075d4a5f5..b09ab626e 100644 --- a/docs/app/docs/layout.tsx +++ b/docs/app/docs/layout.tsx @@ -18,9 +18,7 @@ const DiscordIcon = () => { return } -const BookmarkIcon = () => { - return -}; +import { Wrench as BookmarkIcon } from 'lucide-react'; const Layout = ({ children }: Doc) => { @@ -59,8 +57,6 @@ const DocsLayoutChunks = ({ children }: { children: React.ReactNode }) => { const DocsLayoutGridRoot = ({ children }: { children: React.ReactNode }) => { return
-
-
@@ -73,18 +69,15 @@ const DocsLayoutJoinDiscordCallout = () => { return
- + -
+
Under Construction - We're actively working on new components and features. Stay tuned! Head over to our GitHub to see what's coming next. - - - - Let’s build together — meet us on Discord. + We're actively working on new components and features. Stay tuned! Head over to our GitHub to see what's coming next. + Let's build together - meet us on Discord. diff --git a/docs/app/globals.scss b/docs/app/globals.scss index d1c9a696f..caaa612fb 100644 --- a/docs/app/globals.scss +++ b/docs/app/globals.scss @@ -135,24 +135,10 @@ code .selector { } -.layout-image { - inset: -11 0 0 0; - width: 100%; - height: 100%; - pointer-events: none; - position: fixed; - - --color: var(--rad-ui-color-gray-200); - - background-color: var(--rad-ui-color-gray-50); - - [data-rad-ui-theme=dark] & { - // Only show the pattern on dark mode - background-image: linear-gradient(0deg, transparent 24%, var(--color) 25%, var(--color) 26%, transparent 27%,transparent 74%, var(--color) 75%, var(--color) 76%, transparent 77%,transparent), - linear-gradient(90deg, transparent 24%, var(--color) 25%, var(--color) 26%, transparent 27%,transparent 74%, var(--color) 75%, var(--color) 76%, transparent 77%,transparent); - background-size: 55px 55px; +body[data-scroll-locked] { + // Todo, move this to the scroll area component in the library + .rad-ui-scroll-area-scrollbar { + opacity: 0; + pointer-events: none; } - - - } \ No newline at end of file diff --git a/docs/app/landingComponents/HeroSection.js b/docs/app/landingComponents/HeroSection.js index 0c60da69a..2eebfdb0a 100644 --- a/docs/app/landingComponents/HeroSection.js +++ b/docs/app/landingComponents/HeroSection.js @@ -4,11 +4,7 @@ import Button from "@radui/ui/Button" import Heading from "@radui/ui/Heading" import Code from "@radui/ui/Code" import Text from "@radui/ui/Text" -import ToolbarDemo from "./ToolbarDemo" -import MusicAppPlayerDemo from "./MusicAppPlayerDemo" -import AddToCartDemo from "./AddToCartDemo" -import TrafficAnalyticsDemo from "./TrafficAnalyticsDemo" -import YourTeamDemo from "./YourTeamDemo" +import RadUIDemo from "./RadUIDemo" @@ -161,29 +157,12 @@ color="blue" variant="ghost" onClick={() => {
- {/* */} -
-
- + {/* Rad UI Demo Showcase */} + {/*
+
+
-
- -
- -
- -
- -
- - -
- -
-
- - -
+
*/} {/* Features Section */} @@ -214,9 +193,6 @@ color="blue" variant="ghost" onClick={() => {
-
- -
Integrate RadUI effortlessly into your React and Next.js projects today diff --git a/docs/app/landingComponents/MusicAppPlayerDemo.js b/docs/app/landingComponents/MusicAppPlayerDemo.js index e27564db8..49393a76c 100644 --- a/docs/app/landingComponents/MusicAppPlayerDemo.js +++ b/docs/app/landingComponents/MusicAppPlayerDemo.js @@ -10,17 +10,7 @@ import Fade from "@radui/fx/Fade" import Slide from "@radui/fx/Slide" -const LeftArrow = () => { - return ; -}; - -const ShuffleIcon = () => { - return ; -}; - -const ThreeDots = () => { - return ; -}; +import { ArrowLeft as LeftArrow, Shuffle as ShuffleIcon, MoreVertical as ThreeDots } from 'lucide-react'; const MusicBars = ({ index }) => { const randomHeightBars = [ @@ -45,13 +35,17 @@ const MusicAppPlayerDemo = () => {
-
- +
+
- - +
+ +
+
+ +
diff --git a/docs/app/landingComponents/RadUIDemo.js b/docs/app/landingComponents/RadUIDemo.js new file mode 100644 index 000000000..d16076c4e --- /dev/null +++ b/docs/app/landingComponents/RadUIDemo.js @@ -0,0 +1,379 @@ +'use client'; + +import { useState } from 'react'; +import Card from '@radui/ui/Card'; +import Button from '@radui/ui/Button'; +import Heading from '@radui/ui/Heading'; +import Text from '@radui/ui/Text'; +import Switch from '@radui/ui/Switch'; +import Avatar from '@radui/ui/Avatar'; +import Separator from '@radui/ui/Separator'; +import ToggleGroup from '@radui/ui/ToggleGroup'; +import Progress from '@radui/ui/Progress'; +import { motion } from 'motion/react'; + +const RadUIDemo = () => { + const [sliderValue, setSliderValue] = useState([450]); + const [gpuCount, setGpuCount] = useState(8); + const [wallpaperTinting, setWallpaperTinting] = useState(false); + const [sameAsShipping, setSameAsShipping] = useState(true); + const [agreedToTerms, setAgreedToTerms] = useState(true); + const [selectedSource, setSelectedSource] = useState('social'); + + return ( + +
+ {/* Left Column */} +
+ {/* Payment Method Card */} + + Payment Method + All transactions are secure and encrypted + +
+
+ Name on Card + +
+
+ Card Number + + Enter your 16-digit number. +
+
+
+ Month + +
+
+ Year + +
+
+
+ CVV + +
+
+
+ + {/* Billing Address Card */} + + Billing Address + The billing address associated with your payment method +
+ setSameAsShipping(e.target.checked)} + className="w-4 h-4 border border-gray-400 rounded text-green-900 focus:ring-green-900" + /> + Same as shipping address +
+
+ + {/* Comments Card */} + + Comments +