Skip to content

Components / Sections

Package Cards

Fixed packages with what they cost: each card names a package and who it suits, gives the price and what it is counted in (or "Price on request", for a business that quotes), lists what is included with a tick in a colour block, can carry a bonus line on that block, and ends in an action that asks about that package. The cards lift a hover step under the pointer. The action is a link: a contact page, a mailto, a chat. Zero JavaScript.

Live demo

Sample packages

Monthly packages

  • Starter

    One channel, kept alive

    4.5 ma month

    • 12 posts
    • Captions and hashtags
    • A monthly report

    Ask about Starter

  • Growth

    Two channels and ads

    8 ma month

    Ads budget apart

    • 20 posts
    • 8 short videos
    • Ads set-up and tuning

    First month: a free shoot

    Ask about Growth

  • Custom

    For groups and launches

    Price on request

    • Everything in Growth
    • A team on call
    • Launch campaigns

    Ask about Custom

Live, from the library itself, at full size: scroll, hover, navigate away and back. The demo is never gated.

Variants · each row writes the attribute the prop writes; the section's own CSS answers

tone
density

Measured

JavaScript of its own

0 B

CSS 11.9 kB raw including the base tokens. Measured from a production build, and again in CI for every change that can move it.

Browser support

Baseline · widely available

every browser.

Install Pro

The demo above is never gated; the source is. With a key in components.json (see account), the registry serves it like any other item:

terminal
npx shadcn@latest add @moonarc-pro/package-cards
src/pages/index.astro
---
import PackageCards from '@/components/moonarc/pro/PackageCards.astro';
---
<PackageCards
  headline="Monthly packages"
  packages={[
    { name: 'Starter', tagline: 'One channel, kept alive', price: '4.5 m', unit: 'a month', includes: ['12 posts', 'Captions', 'A monthly report'], href: '/contact/?package=starter' },
    { name: 'Growth', tagline: 'Two channels and ads', price: '8 m', unit: 'a month', includes: ['20 posts', '8 short videos', 'Ads set-up'], bonus: 'First month: a free shoot', href: '/contact/?package=growth' },
    { name: 'Custom', tagline: 'For groups and launches', includes: ['Everything above', 'A team on call'], href: '/contact/?package=custom' },
  ]}
/>

Without a key the registry answers 401 with an upgrade message.

Props

PropTypeDefaultDescription
packages{ name, tagline?, price?, unit?, note?, includes, bonus?, href, action?, external? }[]noneThe packages, in order. A package without a price shows the section's onRequest line; note sits under the price; action replaces "Ask about <name>"; external opens the link in a new tab.
eyebrowstringnoneA short line above the heading.
headlinestringnoneThe heading. Slot "headline" wins and may hold an <em>.
copystringnoneA line under the heading. Slot "copy" wins.
block1 | 2 | 3 | 4 | 51The colour block the ticks and the bonus line paint.
onRequeststring'Price on request'What a package without a price says instead.
askstring'Ask about'The action's first words, followed by the package's name.
includesLabelstring'Included'Accessible name of each card's list.
level2 | 32Heading level of the section's heading; the packages' names are one below.
tone'surface' | 'muted' | 'ink' | 'brand'unset (paints nothing)The section's ground; on ink and brand the cards follow the tone's card colour.
density'compact' | 'cozy' | 'roomy''cozy'Block padding ×0.8 / ×1 / ×1.25 through --ma-density.

Theming and overrides

The section reads the theme contract (shadcn's variable names with the base tokens as fallback), so a pasted theme or one --ma-brand recolours it. Its class names are the override surface and stay stable; a named slot replaces the matching prop with your own markup.

Classes

.ma-packages.ma-packages__action.ma-packages__amount.ma-packages__bonus.ma-packages__card.ma-packages__copy.ma-packages__eyebrow.ma-packages__foot.ma-packages__grid.ma-packages__head.ma-packages__headline.ma-packages__item.ma-packages__list.ma-packages__name.ma-packages__note.ma-packages__price.ma-packages__tagline.ma-packages__tick.ma-packages__top.ma-packages__unit

Slots

slot="eyebrow"slot="headline"slot="copy"

Reduced motion

The cards do not lift and the action fills at once.

With ClientRouter

CSS only; nothing to rebind.

Why it is built this way

Replaces: Pricing cards (Tailwind Plus) · Package cards (Framer agency templates). See the migration table.

What is on offer, as colour blocks: each card paints one of the palette's blocks and carries a drawing in its corner (Motif), an index, a name, a line, chips for what it includes and a foot with a price and a round arrow.

newly · Chrome 105 · Firefox 121 · Safari 15.4hover

Free

$0/yr

MIT, forever

  • 125 primitives, no account, no token
  • Runtime, GSAP and Lenis adapters
  • Public shadcn registry
  • MCP server
Set up in five minutes

Pro

$129/yr

One person, billed yearly

  • 108 sections and 11 GPU effects, demos never gated
  • Every template: Waitlist, Launch, Agentic, Studio, Agency, Atelier, Gather, Creator, Endpoint, Homescreen, Estate, Practice, and Stay
  • audit_motion and measure_budget, locally and in CI
  • compose_section with a total cost
  • New components monthly, dated changelog
  • Email support within 2 working days
Not open yet: see the plan

Team

$349/yr

Up to 10 people, one invoice

  • Everything in Pro, for the whole team
  • One key for the team, locally and in CI
  • Move up from Pro at any time
  • More than 10 people: email us
Talk to us

Shows pricing plans side by side, with an annual/monthly toggle that rolls every price digit by digit to the other period with zero JavaScript (radios, :has and NumberFlow), the highlighted plan wearing a travelling border beam, cards revealed with a stagger.

newly · Chrome 125 · Firefox 128 · Safari 16.4scrollclick

A feature-by-plan comparison: the highlighted plan's column lit, rows revealed with a 40 ms stagger as the table scrolls into view, and a header row that sticks when you cap the table's height.

every browserscroll

Also: view transitions · how costs are measured · browser support · accessibility policy · five-minute setup · MCP for agents · this page as Markdown