Components
Button
The core action element. Three orthogonal axes — variant × intent × size — plus loading and icon slots.
Installation
npx shadcn@latest add https://ui.saasflare.io/r/button.jsonpnpm add @saasflare/uiIcon Only
Loading…
"use client"import { Button, MagnifyingGlassIcon } from "@saasflare/ui"/** * `isIconOnly` maps each size to its square icon counterpart. Icon-only buttons * need an accessible name, so an `aria-label` is required. The last button shows * `isIconOnly` + `isLoading`, where the spinner replaces the icon. */export function Demo() { return ( <div className="flex flex-wrap items-center gap-3"> <Button isIconOnly size="xs" variant="ghost" aria-label="Search"> <MagnifyingGlassIcon aria-hidden /> </Button> <Button isIconOnly size="sm" variant="soft" aria-label="Search"> <MagnifyingGlassIcon aria-hidden /> </Button> <Button isIconOnly size="md" variant="outline" aria-label="Search"> <MagnifyingGlassIcon aria-hidden /> </Button> <Button isIconOnly size="lg" variant="solid" aria-label="Search"> <MagnifyingGlassIcon aria-hidden /> </Button> <Button isIconOnly size="md" isLoading aria-label="Searching"> <MagnifyingGlassIcon aria-hidden /> </Button> </div> )}Icon Slots
Loading…
"use client"import { Button, ArrowLeftIcon, ArrowRightIcon } from "@saasflare/ui"/** Leading + trailing icons via `startContent` / `endContent`, across variants. */export function Demo() { return ( <div className="flex flex-wrap items-center gap-3"> <Button variant="solid" endContent={<ArrowRightIcon aria-hidden />}> Continue </Button> <Button variant="outline" startContent={<ArrowLeftIcon aria-hidden />}> Go back </Button> <Button variant="ghost" startContent={<ArrowLeftIcon aria-hidden />} endContent={<ArrowRightIcon aria-hidden />} > Navigate </Button> </div> )}Intents
Loading…
"use client"import { Button } from "@saasflare/ui"/** Semantic color intents, applied across any variant. */export function Demo() { return ( <div className="flex flex-wrap items-center gap-3"> <Button intent="primary">Primary</Button> <Button intent="neutral">Neutral</Button> <Button intent="success">Success</Button> <Button intent="warning">Warning</Button> <Button intent="danger">Danger</Button> <Button intent="info">Info</Button> </div> )}Loading
Loading…
"use client"import { Button, ArrowRightIcon } from "@saasflare/ui"/** * `isLoading` swaps in a spinner, forces `disabled` + `aria-busy`, and stops * hover motion. `spinnerPlacement` picks the side; the opposite slot keeps its * content. */export function Demo() { return ( <div className="flex flex-wrap items-center gap-3"> <Button isLoading>Saving…</Button> <Button isLoading spinnerPlacement="end"> Saving… </Button> <Button isLoading spinnerPlacement="start" endContent={<ArrowRightIcon aria-hidden />} > Next </Button> </div> )}Sizes
Loading…
"use client"import { Button } from "@saasflare/ui"/** The `size` axis, from `xs` to `xl`. */export function Demo() { return ( <div className="flex flex-wrap items-center gap-3"> <Button size="xs">Extra small</Button> <Button size="sm">Small</Button> <Button size="md">Medium</Button> <Button size="lg">Large</Button> <Button size="xl">Extra large</Button> </div> )}Variants
Loading…
"use client"import { Button } from "@saasflare/ui"/** Button visual treatments — the `variant` axis. */export function Demo() { return ( <div className="flex flex-wrap items-center gap-3"> <Button variant="solid">Solid</Button> <Button variant="soft">Soft</Button> <Button variant="outline">Outline</Button> <Button variant="ghost">Ghost</Button> <Button variant="link">Link</Button> <Button variant="glass">Glass</Button> </div> )}API Reference
Prop
Type