Card Family
Composite marketing cards — StatCard, FeatureCard, CtaCard, TestimonialCard, PricingCard, and IconBadge — built on the primary surface

Card Family#

The card family is a set of composite, marketing-oriented components built on the primary package:arcane_jaspr/arcane_jaspr.dart surface. Each one is themed automatically by the active stylesheet, and most accept the same per-instance styles: and decoration: surfaces described in Authoring like Flutter.

Source: lib/component/card/

StatCard and StatCardRow#

A compact metric surface: a label, a value, and optional trend, description, and icon.

Source: lib/component/card/stat_card.dart

StatCard(
  label: 'Monthly Revenue',
  value: r'$48,120',
  trend: '+12.5%',
  trendPositive: true,
  description: 'vs. last month',
)

Arrange several in a responsive grid with StatCardRow:

StatCardRow(
  columns: 3,
  cards: <Widget>[
    StatCard(label: 'Users', value: '1,204'),
    StatCard(label: 'Sessions', value: '8,932'),
    StatCard(label: 'Bounce', value: '32%', trend: '-4%', trendPositive: true),
  ],
)

StatCard: label and value are required. icon is a literal text/glyph string rendered inside the icon badge, iconBackground is a CSS color for that badge, and trend / trendPositive / description are optional. StatCardRow: cards is required; columns defaults to 4; gap is an optional CSS length.

FeatureCard and IconCard#

FeatureCard promotes a single capability with a title, description, optional icon, and optional CTA.

Source: lib/component/card/feature_card.dart

FeatureCard(
  title: 'Type-safe styling',
  description: 'Compile-time checked design tokens with full autocomplete.',
  icon: ArcaneIcon.palette(),
  href: '/docs/concepts/styling',
  showArrow: true,
)

The .accented constructor requires an icon and accentColor and always shows a CTA button:

FeatureCard.accented(
  title: 'External docs',
  description: 'Opens the full API reference in a new tab.',
  icon: ArcaneIcon.bookOpen(),
  accentColor: 'var(--primary)',
  href: 'https://pub.dev/packages/arcane_jaspr',
  isExternal: true,
  ctaText: 'Read the docs',
)

Key props: title and description are required. accentColor tints the icon container and uniform perimeter border, isExternal opens the link in a new tab, showCta / ctaText control the button, and horizontal switches to a side-by-side layout.

IconCard is a lighter tile — a required title and icon, with optional subtitle, onTap, and href:

IconCard(
  title: 'Settings',
  icon: ArcaneIcon.settings(),
  subtitle: 'Manage your workspace',
  href: '/settings',
)

CtaCard#

A call-to-action card with a dashed border, centered content, and an action button. Used for "request", "suggest", or any action-oriented tile.

Source: lib/component/card/cta_card.dart

CtaCard(
  icon: ArcaneIcon.plus(),
  title: 'Request a feature',
  description: 'Tell us what would make Arcane Jaspr better for you.',
  ctaText: 'Open an issue',
  href: 'https://github.com/ArcaneArts/arcane_jaspr/issues',
  accentColor: 'var(--primary)',
  isExternal: true,
)

Key props: title and ctaText are required. accentColor colors the icon chip and CTA button (defaults to var(--primary)). When isExternal is true the anchor opens in a new tab with rel="noopener noreferrer" and shows a trailing external-link glyph. height defaults to '420px' and showHoverEffects defaults to true.

TestimonialCard and RatingStars#

TestimonialCard renders a quote, an author, and an optional star rating.

Source: lib/component/card/testimonial_card.dart

TestimonialCard(
  quote: 'Arcane Jaspr made our web build feel like Flutter.',
  authorName: 'Ada Lovelace',
  authorTitle: 'Staff Engineer',
  authorCompany: 'Analytical Engines',
  rating: 5,
  showRatingBadge: true,
  showAccentBorder: true,
)

Key props: quote and authorName are required. When rating is set and no accentColor is given, the accent color is derived from the rating (5 = success green down to 1 = destructive red). showQuotes, showRatingBadge, and showAccentBorder toggle the decorative treatments; the border always colors the complete perimeter.

RatingStars is the standalone star control:

RatingStars(
  rating: 4.5,
  maxStars: 5,
  size: 20,
)

rating is required. maxStars defaults to 5, size (in pixels) to 16. Set interactive: true and provide onRatingChanged to let users pick a rating.

PricingCard and PricingGrid#

PricingCard renders a full pricing tier: title, price, feature list, optional hardware specs, a badge, and a CTA.

Source: lib/component/card/pricing_card.dart

PricingCard(
  title: 'Pro',
  price: r'$29',
  period: '/month',
  subtitle: 'For growing teams',
  badge: 'Popular',
  badgeVariant: PricingBadgeVariant.popular,
  highlighted: true,
  features: const <String>[
    'Unlimited projects',
    'Priority support',
    'Custom domains',
  ],
  specs: const <SpecEntry>[
    SpecEntry(label: 'Seats', value: '10'),
    SpecEntry(label: 'Storage', value: '1 TB', highlight: true),
  ],
  buttonText: 'Start free trial',
  buttonLink: '/signup',
)

Key props: highlighted marks the featured card. variant (PricingCardVariant.compact, .standard, .hero) sets the density; .compact and .hero also have dedicated named constructors that require title and price. badge / badgeVariant render the corner badge, specs is a List<SpecEntry> of hardware/feature rows (each with label, value, and an optional highlight), and accentColor overrides the accent.

PricingGrid lays out several tiers from typed PricingTier data:

PricingGrid(
  columns: 3,
  tiers: const <PricingTier>[
    PricingTier(
      name: 'Starter',
      price: 0,
      description: 'For side projects',
      features: <String>['1 project', 'Community support'],
    ),
    PricingTier(
      name: 'Pro',
      price: 29,
      description: 'For growing teams',
      features: <String>['Unlimited projects', 'Priority support'],
      isPopular: true,
      isHighlighted: true,
    ),
  ],
)

IconBadge#

A small tinted chip that frames an icon — the building block behind the icon treatments on the other cards.

Source: lib/component/view/icon_badge.dart

IconBadge(
  icon: ArcaneIcon.zap(),
  accentColor: 'var(--primary)',
  size: 40,
  tintOpacity: 0.12,
)

icon is required. accentColor defaults to var(--primary), size to 40, and tintOpacity to 0.12. Use the .square constructor for a rounded-rectangle badge (radius defaults to 8) instead of the default circle.