Components
Button
Curation ships three buttons on purpose. The inline Button is the shadcn
primitive on MyList's tokens, sized for actions in flow. ToolbarButton is
the header controls' box with a label in it, for the actions in a page's top
band. BaseButton is the legacy app's 3.13rem full-width form pill. The last
two are their own components so shadcn add button can never overwrite them.
Inline
The default variant is a solid --brand-fill plate with --brand-foreground
on it — black on light, white on dark, as mobile's primary action is. Focus is the ring pair:
focus-visible:ring-[3px] ring-ring/50 on the brand-ink ring token.
import { Button } from "@/components/ui/button";
<Button>Publish</Button>Variants
Six variants. secondary and ghost are ink tints, so they read on either
theme; link is text-brand-ink with an underline on hover.
<Button variant="default" /> <Button variant="secondary" /> <Button variant="outline" /> <Button variant="ghost" /> <Button variant="destructive" /> <Button variant="link" />
Sizes
Four text sizes and four square icon sizes. An SVG child is sized
automatically unless it carries its own size-* class.
<Button size="xs" /> <Button size="sm" /> <Button /> <Button size="lg" /> <Button size="icon" aria-label="Add"><PlusIcon /></Button>
Toolbar
The actions in a page's top band — Save and Publish on the list editor, New
list on the shelf. They sit beside the sort menu, the segmented filter and
the view toggle, so they take those controls' box: 2.25rem tall,
rounded-md like every header control, a 0.81rem semibold
label, no border and no shadow. secondary is the sort menu's own ink/[0.04]
tint; primary is the same box on the brand plate. One primary per band.
Disabled swaps the plate rather than fading it — mobile's rule. Both variants
fall to the tint with an ink-quiet label, which reads as "not now" where a
fade would drag the label below AA.
Icon-only actions in the same band are ghost Buttons at size="icon",
rounded-lg, in text-ink-tertiary: a plate would rank them beside the
labelled actions.
import { ToolbarButton } from "@/components/base/toolbar-button";
<ToolbarButton variant="secondary">Save</ToolbarButton>
<ToolbarButton>Publish</ToolbarButton>
<ToolbarButton><PlusIcon /> New list</ToolbarButton>Form
BaseButton is the ported BaseButton.vue: full width, 3.13rem tall,
rounded-lg (legacy's 1rem, snapped to the Radius ladder), and
three variants. secondary is the outlined gradient plate; danger is the
destructive fill. It closes login forms, editors and confirm sheets — anywhere
the button is the form's last row rather than an action in flow.
import { BaseButton } from "@/components/base/base-button";
<BaseButton>Continue</BaseButton>
<BaseButton variant="secondary">Not now</BaseButton>
<BaseButton variant="danger">Delete account</BaseButton>