Initial Commit

This commit is contained in:
2026-05-27 23:47:53 +01:00
parent fbc70f96e6
commit 9b28db724f
18103 changed files with 1600554 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
# Toggle Variants (cva config)
## Purpose
`toggleVariants` is the cva (class-variance-authority) configuration powering every `<Toggle>` render. It is split from `toggle.tsx` into its own module so an ejected source copy under `npx shadcn@latest add @suaveplan/toggle` keeps the cva configuration in a dedicated file. Theme overrides flow through `useThemedVariants("Toggle", toggleVariants)`.
## Features
- Two visual variants (`default`, `outline`) covering the upstream shadcn surface.
- Three sizes (`sm`, `default`, `lg`) for use in dense toolbars or roomy headers.
- `data-[state=on]:bg-accent data-[state=on]:text-accent-foreground` flips the colour when pressed.
- `hover:bg-muted hover:text-muted-foreground` for the pointer-hover affordance.
- `data-icon` slot rules (`[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0`) so child icons inherit sizing.
- `disabled:pointer-events-none disabled:opacity-50` for the native disabled state.
- `motion-reduce:transition-none` for users with `prefers-reduced-motion: reduce`.
- `focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2` for keyboard-only focus styling.
## Usage: Basic Example
```ts
import { toggleVariants } from "@suaveplan/react-ui";
const className = toggleVariants({ variant: "default", size: "default" });
```
## Usage: Advanced Example
```ts
import { toggleVariants, cn } from "@suaveplan/react-ui";
export function CustomToggle({ active }: { active: boolean }) {
return (
<button
type="button"
aria-pressed={active}
data-state={active ? "on" : "off"}
className={cn(
toggleVariants({ variant: "outline", size: "lg" }),
active ? "ring-2 ring-accent" : ""
)}
>
Toggle
</button>
);
}
```
## API Reference
### `toggleVariants(props?: { variant?: "default" | "outline"; size?: "sm" | "default" | "lg" }): string`
Returns the cva-merged class string for the supplied variant + size combination. Both fields are optional; omitted fields fall back to the cva `defaultVariants` (`variant: "default"`, `size: "default"`).
## Implementation Notes
- The resolver is tagged with `componentName: "Toggle"` (non-enumerable, non-writable) via `defineVariants`.
- The cva config mirrors the visual surface of `<Button>` so toolbars combining `<Button>` + `<Toggle>` look coherent without per-component overrides.
- The `data-icon` slot rules are duplicated between `<Button>` and `<Toggle>` because both surfaces accept the same icon-as-child pattern; consumers benefit from the consistent sizing.
- Tokens reference theme-driven CSS custom properties (`bg-accent`, `text-accent-foreground`, `bg-muted`, `text-muted-foreground`) so the colour palette comes from the active `ThemePlugin.cssVariables` payload.