> ## Documentation Index
> Fetch the complete documentation index at: https://api.fanvue.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# SubscribeButton

> A subscription / purchase button pairing an action label with the current price and an optional struck-through previous price.

```tsx theme={null}
import { SubscribeButton } from "@fanvue/ui";
import type {
  SubscribeButtonProps,
  SubscribeButtonSize,
  SubscribeButtonVariant,
} from "@fanvue/ui";
```

## Examples

## Default

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-subscribebutton--default&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="200" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="SubscribeButton — Default" />
</Frame>

```tsx theme={null}
import { SubscribeButton } from "@fanvue/ui";

<SubscribeButton price="$9.99/mo" discount="$19.99" variant="primary" size="48">Join now</SubscribeButton>
```

## Brand

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-subscribebutton--brand&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="200" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="SubscribeButton — Brand" />
</Frame>

```tsx theme={null}
import { SubscribeButton } from "@fanvue/ui";

<SubscribeButton price="$9.99/mo" discount="$19.99" variant="brand" size="48">Join now</SubscribeButton>
```

## Disabled

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-subscribebutton--disabled&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="200" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="SubscribeButton — Disabled" />
</Frame>

```tsx theme={null}
import { SubscribeButton } from "@fanvue/ui";

<SubscribeButton
  price="$9.99/mo"
  discount="$19.99"
  variant="primary"
  size="48"
  disabled
>
  Join now
</SubscribeButton>
```

## Sizes

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-subscribebutton--sizes&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="200" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="SubscribeButton — Sizes" />
</Frame>

```tsx theme={null}
import { SubscribeButton } from "@fanvue/ui";

<div className="flex flex-col items-start gap-3">
  <SubscribeButton price="$9.99/mo" discount="$19.99" variant="primary" size="48">
    Join now
  </SubscribeButton>
  <SubscribeButton price="$9.99/mo" discount="$19.99" variant="primary" size="40">
    Join now
  </SubscribeButton>
  <SubscribeButton price="$9.99/mo" discount="$19.99" variant="primary" size="32">
    Join now
  </SubscribeButton>
</div>
```

## Without Discount

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-subscribebutton--without-discount&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="200" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="SubscribeButton — Without Discount" />
</Frame>

```tsx theme={null}
import { SubscribeButton } from "@fanvue/ui";

<SubscribeButton price="$9.99/mo" variant="primary" size="48">Join now</SubscribeButton>
```

## Props

## SubscribeButton

A subscription / purchase button pairing an action label with the current price and an optional struck-through previous price. Built on `Button`, so it inherits the same variants, sizes, `negative` dark-surface treatment, `fullWidth`, loading, and disabled behaviour.

The accessible name defaults to the label plus pricing (e.g. `"Join now, $9.99, was $19.99"`); pass `aria-label` to override.

<ParamField path="price" type="string" required>
  Current price shown on the trailing side (e.g. `"$9.99/mo"`).
</ParamField>

<ParamField path="children" type="ReactNode" default="Join now">
  Leading action label.
</ParamField>

<ParamField path="discount" type="string">
  Previous price rendered struck-through before `SubscribeButtonProps.price`.
</ParamField>

<ParamField path="fullWidth" type="boolean" default="false">
  When `true`, the button will take the full width of its container.
</ParamField>

<ParamField path="loading" type="boolean" default="false">
  When `true`, replaces the label with a spinner and disables interaction.
</ParamField>

<ParamField path="negative" type="boolean" default="false">
  Forces the dark-surface treatment regardless of theme. Only honored on `primary`, `secondary`, `tertiary`, and `outline` variants; ignored on all others. Use when placing the button on a dark background in a light theme (e.g. an inverted hero or modal).
</ParamField>

<ParamField path="size" type="&#x22;32&#x22; | &#x22;40&#x22; | &#x22;48&#x22;" default="48">
  Height of the button in pixels.
</ParamField>

<ParamField path="variant" type="&#x22;brand&#x22; | &#x22;primary&#x22; | &#x22;secondary&#x22; | &#x22;tertiary&#x22; | &#x22;outline&#x22;" default="primary">
  Visual style variant. `brand` is the Figma "Upsell" (green) type.
</ParamField>

## Exported types

Also exported from `@fanvue/ui`: `SubscribeButtonProps`, `SubscribeButtonSize`, `SubscribeButtonVariant`.

***

**Setup:** [Installation](/docs/ui/installation) · [Theming](/docs/ui/theming)
