radix-ui

Radix UI Primitives Skill

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "radix-ui" with this command: npx skills add slanycukr/riot-api-project/slanycukr-riot-api-project-radix-ui

Radix UI Primitives Skill

Radix UI Primitives provides low-level, unstyled React components with built-in accessibility, keyboard navigation, and focus management. Perfect for building design systems and custom UI components.

Quick Start

Basic Dialog Example

import * as Dialog from "@radix-ui/react-dialog"; import { Cross2Icon } from "@radix-ui/react-icons";

function BasicDialog() { return ( <Dialog.Root> <Dialog.Trigger asChild> <button className="btn-primary">Edit profile</button> </Dialog.Trigger> <Dialog.Portal> <Dialog.Overlay className="dialog-overlay" /> <Dialog.Content className="dialog-content"> <Dialog.Title className="dialog-title">Edit profile</Dialog.Title> <Dialog.Description className="dialog-description"> Make changes to your profile here. </Dialog.Description>

      &#x3C;div className="dialog-fields">
        &#x3C;input placeholder="Name" defaultValue="John Doe" />
        &#x3C;input placeholder="Username" defaultValue="@johndoe" />
      &#x3C;/div>

      &#x3C;div className="dialog-actions">
        &#x3C;Dialog.Close asChild>
          &#x3C;button className="btn-primary">Save changes&#x3C;/button>
        &#x3C;/Dialog.Close>
      &#x3C;/div>

      &#x3C;Dialog.Close asChild>
        &#x3C;button className="dialog-close" aria-label="Close">
          &#x3C;Cross2Icon />
        &#x3C;/button>
      &#x3C;/Dialog.Close>
    &#x3C;/Dialog.Content>
  &#x3C;/Dialog.Portal>
&#x3C;/Dialog.Root>

); }

Dropdown Menu Example

import * as DropdownMenu from "@radix-ui/react-dropdown-menu"; import { HamburgerMenuIcon, CheckIcon } from "@radix-ui/react-icons";

function UserMenu() { const [showBookmarks, setShowBookmarks] = React.useState(true);

return ( <DropdownMenu.Root> <DropdownMenu.Trigger asChild> <button className="icon-btn" aria-label="Menu"> <HamburgerMenuIcon /> </button> </DropdownMenu.Trigger>

  &#x3C;DropdownMenu.Portal>
    &#x3C;DropdownMenu.Content className="dropdown-content" sideOffset={5}>
      &#x3C;DropdownMenu.Item className="dropdown-item">
        New Tab &#x3C;div className="shortcut">⌘+T&#x3C;/div>
      &#x3C;/DropdownMenu.Item>
      &#x3C;DropdownMenu.Item className="dropdown-item">
        New Window &#x3C;div className="shortcut">⌘+N&#x3C;/div>
      &#x3C;/DropdownMenu.Item>

      &#x3C;DropdownMenu.Separator className="dropdown-separator" />

      &#x3C;DropdownMenu.CheckboxItem
        className="dropdown-item"
        checked={showBookmarks}
        onCheckedChange={setShowBookmarks}
      >
        &#x3C;DropdownMenu.ItemIndicator className="item-indicator">
          &#x3C;CheckIcon />
        &#x3C;/DropdownMenu.ItemIndicator>
        Show Bookmarks
      &#x3C;/DropdownMenu.CheckboxItem>

      &#x3C;DropdownMenu.Arrow className="dropdown-arrow" />
    &#x3C;/DropdownMenu.Content>
  &#x3C;/DropdownMenu.Portal>
&#x3C;/DropdownMenu.Root>

); }

Common Patterns

Primitive Components

Radix provides 30+ primitive components for common UI patterns:

// Accordion with animation import * as Accordion from "@radix-ui/react-accordion";

function FAQAccordion() { return ( <Accordion.Root type="single" collapsible className="accordion"> <Accordion.Item value="item-1" className="accordion-item"> <Accordion.Header> <Accordion.Trigger className="accordion-trigger"> Is it accessible? <ChevronDownIcon className="accordion-chevron" /> </Accordion.Trigger> </Accordion.Header> <Accordion.Content className="accordion-content"> Yes. It adheres to WAI-ARIA design patterns. </Accordion.Content> </Accordion.Item> </Accordion.Root> ); }

// Tooltip with delay import * as Tooltip from "@radix-ui/react-tooltip";

function TooltipExample() { return ( <Tooltip.Provider delayDuration={800}> <Tooltip.Root> <Tooltip.Trigger asChild> <button className="icon-btn"> <InfoIcon /> </button> </Tooltip.Trigger> <Tooltip.Portal> <Tooltip.Content className="tooltip" sideOffset={5}> Additional information <Tooltip.Arrow className="tooltip-arrow" /> </Tooltip.Content> </Tooltip.Portal> </Tooltip.Root> </Tooltip.Provider> ); }

Accessibility Features

Radix automatically handles accessibility:

// All components include proper ARIA attributes // Focus management is handled automatically // Keyboard navigation works out of the box // Screen reader support is built-in

// Example: Select with proper labeling import * as Select from "@radix-ui/react-select";

function AccessibleSelect() { return ( <Select.Root> <Select.Trigger aria-label="Select a fruit"> <Select.Value placeholder="Choose a fruit…" /> <Select.Icon> <ChevronDownIcon /> </Select.Icon> </Select.Trigger>

  &#x3C;Select.Portal>
    &#x3C;Select.Content>
      &#x3C;Select.Viewport>
        &#x3C;Select.Group>
          &#x3C;Select.Label>Fruits&#x3C;/Select.Label>
          &#x3C;Select.Item value="apple">
            &#x3C;Select.ItemText>Apple&#x3C;/Select.ItemText>
            &#x3C;Select.ItemIndicator>
              &#x3C;CheckIcon />
            &#x3C;/Select.ItemIndicator>
          &#x3C;/Select.Item>
        &#x3C;/Select.Group>
      &#x3C;/Select.Viewport>
    &#x3C;/Select.Content>
  &#x3C;/Select.Portal>
&#x3C;/Select.Root>

); }

Composition with asChild

Compose Radix primitives with your own components:

// Use your existing button styles import { Dialog, Tooltip } from "@radix-ui/react-dialog"; import { Button } from "./your-design-system";

function ComposedDialog() { return ( <Dialog.Root> <Dialog.Trigger asChild> <Button variant="primary">Open Dialog</Button> </Dialog.Trigger>

  &#x3C;Dialog.Portal>
    &#x3C;Dialog.Overlay />
    &#x3C;Dialog.Content>
      &#x3C;Dialog.Title>Dialog Title&#x3C;/Dialog.Title>
      &#x3C;Dialog.Close asChild>
        &#x3C;Button variant="secondary">Close&#x3C;/Button>
      &#x3C;/Dialog.Close>
    &#x3C;/Dialog.Content>
  &#x3C;/Dialog.Portal>
&#x3C;/Dialog.Root>

); }

// Multiple primitives on one element function TooltipDialogButton() { return ( <Dialog.Root> <Tooltip.Root> <Tooltip.Trigger asChild> <Dialog.Trigger asChild> <Button variant="primary">Open Dialog</Button> </Dialog.Trigger> </Tooltip.Trigger> <Tooltip.Portal> <Tooltip.Content>Opens a modal dialog</Tooltip.Content> </Tooltip.Portal> </Tooltip.Root>

  {/* Dialog content */}
&#x3C;/Dialog.Root>

); }

Custom Component Abstractions

Create your own simplified APIs:

// Custom Dialog wrapper import * as DialogPrimitive from "@radix-ui/react-dialog";

export const CustomDialog = ({ children, trigger, title }) => { return ( <DialogPrimitive.Root> <DialogPrimitive.Trigger asChild>{trigger}</DialogPrimitive.Trigger> <DialogPrimitive.Portal> <DialogPrimitive.Overlay className="overlay" /> <DialogPrimitive.Content className="content"> <DialogPrimitive.Title>{title}</DialogPrimitive.Title> {children} <DialogPrimitive.Close asChild> <button className="close-btn">×</button> </DialogPrimitive.Close> </DialogPrimitive.Content> </DialogPrimitive.Portal> </DialogPrimitive.Root> ); };

// Usage <CustomDialog title="Settings" trigger={<Button>Open Settings</Button>}> <div>Settings content here</div> </CustomDialog>;

Styling with Data Attributes

Style components based on their state:

/* Accordion animations */ .accordion-content[data-state="open"] { animation: slideDown 300ms ease-out; }

.accordion-content[data-state="closed"] { animation: slideUp 300ms ease-out; }

/* Dropdown positioning */ .dropdown-content { transform-origin: var(--radix-dropdown-menu-content-transform-origin); }

.dropdown-content[data-side="top"] { animation: slideUp 0.3s ease-out; }

.dropdown-content[data-side="bottom"] { animation: slideDown 0.3s ease-out; }

/* Focus states */ .dropdown-item[data-highlighted] { background: #f0f0f0; }

.dropdown-item[data-state="checked"] { background: #e0e0e0; }

Advanced Patterns

// Controlled components for async operations function AsyncDialog() { const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false);

const handleSubmit = async (e) => { e.preventDefault(); setLoading(true);

await submitForm();
setLoading(false);
setOpen(false);

};

return ( <Dialog.Root open={open} onOpenChange={setOpen}> <Dialog.Trigger asChild> <Button>Open Form</Button> </Dialog.Trigger> <Dialog.Portal> <Dialog.Content> <form onSubmit={handleSubmit}> <input name="email" type="email" required /> <Button type="submit" disabled={loading}> {loading ? "Submitting…" : "Submit"} </Button> </form> </Dialog.Content> </Dialog.Portal> </Dialog.Root> ); }

// Popover with collision detection function SmartPopover() { return ( <Popover.Root> <Popover.Trigger asChild> <Button>Click me</Button> </Popover.Trigger> <Popover.Portal> <Popover.Content className="popover" sideOffset={10} collisionPadding={20} > Content that avoids screen edges <Popover.Arrow className="popover-arrow" /> </Popover.Content> </Popover.Portal> </Popover.Root> ); }

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

axios

No summary provided by upstream source.

Repository SourceNeeds Review
General

httpx

No summary provided by upstream source.

Repository SourceNeeds Review
General

structlog

No summary provided by upstream source.

Repository SourceNeeds Review
General

zod v4

No summary provided by upstream source.

Repository SourceNeeds Review