Skip to main content
Glama
radio.md7.71 kB
# Catalyst Radio Button Components - HTML & Tailwind CSS Examples This document provides HTML structure and Tailwind CSS class examples derived from the React-based Catalyst UI Kit's `RadioGroup`, `RadioField`, and `Radio` components. These examples are intended for AI consumption and may need adaptation. These components rely on Headless UI for functionality. ## Overview The Catalyst Radio Button system provides accessible and styled radio inputs: - **`RadioGroup`**: A container for a set of related radio buttons, ensuring only one can be selected. Wraps `Headless.RadioGroup`. - **`RadioField`**: A wrapper for a single radio input along with its label and optional description. Wraps `Headless.Field`. - **`Radio`**: The visual radio button element itself. Wraps `Headless.Radio`. ## HTML Structure Example (Conceptual) JavaScript (Headless UI) is crucial for managing selection state, keyboard navigation, and ARIA attributes. ```html <!-- RadioGroup --> <div role="radiogroup" aria-labelledby="radio-group-label" class="space-y-3 **:data-[slot=label]:font-normal has-data-[slot=description]:space-y-6 has-data-[slot=description]:**:data-[slot=label]:font-medium"> <!-- Optional: <label id="radio-group-label">Group Label</label> --> <!-- RadioField 1 --> <div data-slot="field" class="grid grid-cols-[1.125rem_1fr] gap-x-4 gap-y-1 sm:grid-cols-[1rem_1fr] *:data-[slot=control]:col-start-1 *:data-[slot=control]:row-start-1 *:data-[slot=control]:mt-0.75 sm:*:data-[slot=control]:mt-1 *:data-[slot=label]:col-start-2 *:data-[slot=label]:row-start-1 *:data-[slot=description]:col-start-2 *:data-[slot=description]:row-start-2 has-data-[slot=description]:**:data-[slot=label]:font-medium"> <!-- Radio Control (Headless.Radio wrapped in a span) --> <!-- Add 'data-checked' or 'data-disabled' to the 'group' span for different states --> <span data-slot="control" class="group inline-flex focus:outline-hidden" role="radio" aria-checked="false" tabindex="-1"> <!-- Visual part of the radio button --> <span class="... (base radio classes) ... ... (color classes) ..."> <span class="size-full rounded-full border-[4.5px] border-transparent bg-[var(--radio-indicator)] bg-clip-padding forced-colors:border-[Canvas] forced-colors:group-data-checked:border-[Highlight]"></span> </span> </span> <!-- Label (associated with the radio control) --> <label data-slot="label" class="text-sm text-zinc-900 dark:text-white cursor-pointer">Option A</label> <!-- Optional Description --> <p data-slot="description" class="text-sm text-zinc-600 dark:text-zinc-400">Description for option A.</p> </div> <!-- RadioField 2 (similar structure, aria-checked="true" if selected) ... --> </div> ``` ## Tailwind CSS Classes ### `RadioGroup` (`<div role="radiogroup">`) ```plaintext space-y-3 **:data-[slot=label]:font-normal has-data-[slot=description]:space-y-6 has-data-[slot=description]:**:data-[slot=label]:font-medium ``` - `space-y-3`: Vertical spacing between radio fields. - `**:data-[slot=label]:font-normal`: Default font weight for labels within the group. - `has-data-[slot=description]:...`: Conditional styles if descriptions are present, increasing spacing and making labels medium weight. ### `RadioField` (`<div data-slot="field">`) ```plaintext grid grid-cols-[1.125rem_1fr] gap-x-4 gap-y-1 sm:grid-cols-[1rem_1fr] *:data-[slot=control]:col-start-1 *:data-[slot=control]:row-start-1 *:data-[slot=control]:mt-0.75 sm:*:data-[slot=control]:mt-1 *:data-[slot=label]:col-start-2 *:data-[slot=label]:row-start-1 *:data-[slot=description]:col-start-2 *:data-[slot=description]:row-start-2 has-data-[slot=description]:**:data-[slot=label]:font-medium ``` - Grid layout for the radio control, label, and description. ### `Radio` (Visual Element) The `Headless.Radio` component (conceptualized as `<span data-slot="control" class="group...">` above) wraps the visual styled `<span>`. **Outer styled `<span>` classes (combines `base` and a `colors` entry):** Base classes (`base` array from `radio.tsx`): ```plaintext relative isolate flex size-[1.1875rem] shrink-0 rounded-full sm:size-[1.0625rem] before:absolute before:inset-0 before:-z-10 before:rounded-full before:bg-white before:shadow-sm group-data-checked:before:bg-(--radio-checked-bg) dark:before:hidden dark:bg-white/5 dark:group-data-checked:bg-(--radio-checked-bg) border border-zinc-950/15 group-data-checked:border-transparent group-data-hover:group-data-checked:border-transparent group-data-hover:border-zinc-950/30 group-data-checked:bg-(--radio-checked-border) dark:border-white/15 dark:group-data-checked:border-white/5 dark:group-data-hover:group-data-checked:border-white/5 dark:group-data-hover:border-white/30 after:absolute after:inset-0 after:rounded-full after:shadow-[inset_0_1px_--theme(--color-white/15%)] dark:after:-inset-px dark:after:hidden dark:after:rounded-full dark:group-data-checked:after:block [--radio-indicator:transparent] group-data-checked:[--radio-indicator:var(--radio-checked-indicator)] group-data-hover:group-data-checked:[--radio-indicator:var(--radio-checked-indicator)] group-data-hover:[--radio-indicator:var(--color-zinc-900)]/10 dark:group-data-hover:group-data-checked:[--radio-indicator:var(--radio-checked-indicator)] dark:group-data-hover:[--radio-indicator:var(--color-zinc-700)] group-data-focus:outline group-data-focus:outline-2 group-data-focus:outline-offset-2 group-data-focus:outline-blue-500 group-data-disabled:opacity-50 group-data-disabled:border-zinc-950/25 group-data-disabled:bg-zinc-950/5 group-data-disabled:[--radio-checked-indicator:var(--color-zinc-950)]/50 group-data-disabled:before:bg-transparent dark:group-data-disabled:border-white/20 dark:group-data-disabled:bg-white/[2.5%] dark:group-data-disabled:[--radio-checked-indicator:var(--color-white)]/50 dark:group-data-checked:group-data-disabled:after:hidden ``` **Color Variant Classes (`colors` object from `radio.tsx`):** These define CSS variables like `--radio-checked-bg`, `--radio-checked-border`, `--radio-checked-indicator`. Default color is `dark/zinc`. ```javascript const colors = { 'dark/zinc': [ '[--radio-checked-bg:var(--color-zinc-900)] [--radio-checked-border:var(--color-zinc-950)]/90 [--radio-checked-indicator:var(--color-white)]', 'dark:[--radio-checked-bg:var(--color-zinc-600)]', ], // ... (all other color definitions from radio.tsx, full list omitted for brevity) rose: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-rose-500)] [--radio-checked-border:var(--color-rose-600)]/90', }; ``` **Inner indicator `<span>` (the dot):** ```plaintext size-full rounded-full border-[4.5px] border-transparent bg-[var(--radio-indicator)] bg-clip-padding forced-colors:border-[Canvas] forced-colors:group-data-checked:border-[Highlight] ``` - `bg-[var(--radio-indicator)]`: The dot's color is controlled by the `--radio-indicator` CSS variable, which is set by the base and color classes on the parent. ## Notes for Usage * **JavaScript for Functionality:** Headless UI manages the core logic (selection, keyboard support, ARIA states). * **Data Attributes:** Styling relies on `group-data-checked`, `group-data-focus`, `group-data-disabled` on the parent `group` (the `Headless.Radio` element) to style the visual parts. * **CSS Variables:** Catalyst's specific CSS variable patterns are used extensively. * **Label and Description:** These are typically associated with the radio input via `RadioField` and Headless UI's context. This Markdown file provides the HTML structure and class details from Catalyst's Radio Button components for analysis and adaptation.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/CaullenOmdahl/Tailwind-Svelte-Assistant'

If you have feedback or need assistance with the MCP directory API, please join our Discord server