Skip to content

Button

Source: packages/shared/components/ui/button.tsx Primitives: @radix-ui/react-slot, class-variance-authority

import { Button } from "@prosper/shared/components/ui/button";

Preview

Variants

VariantClass DescriptionUsage
primaryBlue background, white text, subtle borderDefault CTA — forms, dialogs
secondaryGray background, dark textLower-emphasis actions
tertiaryWhite background, dark text, gray borderOutline-style buttons (e.g. “Save as Draft”)
destructiveRed background, white textDelete, cancel
ghostTransparent, hover reveals accent bgToolbar icons, inline actions
linkNo background, underline on hoverInline text links

Code

<Button variant="primary">Publish Job</Button>
<Button variant="secondary">Cancel</Button>
<Button variant="tertiary">Save as Draft</Button>
<Button variant="destructive">Delete</Button>
<Button variant="ghost">Menu Item</Button>
<Button variant="link">Learn more</Button>

Sizes

SizeClassHeight
defaulth-10 px-4 py-240px
smh-7 px-2.528px
lgh-12 px-648px
iconsize-1040×40px
<Button size="sm">Small</Button>
<Button size="default">Default</Button>
<Button size="lg">Large</Button>
<Button size="icon"><PlusIcon /></Button>

Props

PropTypeDefaultDescription
variant"primary" | "secondary" | "tertiary" | "destructive" | "ghost" | "link""primary"Visual style
size"default" | "sm" | "lg" | "icon""default"Button size
asChildbooleanfalseRender as child element (e.g. wrapping a <Link>) via Radix Slot
disabledbooleanfalseDisables interaction, reduces opacity
classNamestringAdditional Tailwind classes

Plus all standard <button> HTML attributes.


Usage in the Codebase

Admin — LoginPage

<Button type="submit" className="w-full" disabled={isLoading}>
{isLoading ? (
<>
<Loader2 className="w-4 h-4 mr-2 animate-spin" />
Signing In...
</>
) : (
"Sign In"
)}
</Button>

Admin — JobForm

<Button type="button" variant="tertiary" onClick={handleSaveAsDraft}>
<Save className="w-4 h-4 mr-2" />
Save as Draft
</Button>
<Button type="submit">
<FileText className="w-4 h-4 mr-2" />
Publish Job
</Button>

Landing — ContactPage

<Button type="submit" disabled={isSubmitting} className="w-full sm:w-auto px-8">
{isSubmitting ? "Submitting..." : "Submit"}
</Button>

Notes

  • The buttonVariants function is also exported for use with non-button elements (e.g. styled links).
  • Icons placed inside buttons are automatically sized to 16px via the [&_svg:not([class*='size-'])]:size-4 utility.
  • Override in Admin LoginPage: className="w-full" stretches the button to full width inside the login card.
  • Override in Admin ApplicantList: variant="ghost" className="mb-4" adds bottom margin for the back-navigation button.
  • Override in Landing ContactPage: className="w-full sm:w-auto px-8" makes the submit button full-width on mobile and auto-width with extra horizontal padding on larger screens.