Skip to content

Pricing Team

Team-size calculator: a warm range slider (10–500 people) drives a big serif monthly price, annual saving line and a sapling illustration that grows with team size.

organic-soft/section/pricing-team
Open ↗

Source

"use client";

import { useId, useState } from "react";
import { cn } from "@/lib/utils";

export interface PricingTeamProps {
  title?: string;
  /** Price per employee per month (EUR). */
  perSeat?: number;
  min?: number;
  max?: number;
  defaultSize?: number;
  className?: string;
}

/** Team-size calculator: a warm range slider (10–500 people) drives a big serif monthly price, annual saving line and a sapling illustration that grows with team size. */
export function PricingTeam({ title = "Pay for the team you have", perSeat = 9, min = 10, max = 500, defaultSize = 60, className }: PricingTeamProps) {
  const id = useId();
  const [size, setSize] = useState(defaultSize);
  const monthly = size <= 20 ? 0 : size * perSeat * (size > 200 ? 0.8 : 1);
  const annual = monthly * 12 * 0.85;
  const scale = 0.5 + ((size - min) / (max - min)) * 0.5;
  const eur = (n: number) => `€${Math.round(n).toLocaleString("en-US")}`;
  return (
    <section aria-labelledby={`${id}-t`} className={cn("da-section bg-da-bg text-da-fg", className)}>
      <div className="da-container">
        <div className="mx-auto grid max-w-4xl items-center gap-10 rounded-da-lg bg-da-surface p-8 text-da-surface-fg shadow-da-md sm:p-12 md:grid-cols-[1fr_auto]">
          <div>
            <h2 id={`${id}-t`} className="font-da-display text-[clamp(2rem,4vw,2.75rem)] leading-tight tracking-da-display">
              {title}
            </h2>
            <label htmlFor={id} className="mt-8 block text-da-muted-fg">
              Team size: <span className="font-da-mono text-da-fg">{size} people</span>
            </label>
            <input
              id={id}
              type="range"
              min={min}
              max={max}
              step={10}
              value={size}
              onChange={(e) => setSize(Number(e.target.value))}
              aria-valuetext={`${size} people`}
              className="da-focus mt-3 w-full accent-(--da-primary)"
            />
            <div className="mt-8 flex flex-wrap items-end gap-x-6 gap-y-2" aria-live="polite">
              <p>
                <span className="font-da-display text-6xl">{monthly === 0 ? "Free" : eur(monthly)}</span>
                {monthly > 0 && <span className="ml-1 text-da-muted-fg">/ month</span>}
              </p>
              {monthly > 0 && <p className="rounded-da-pill bg-da-accent px-3 py-1 text-sm text-da-accent-fg">{eur(annual)} / year if paid annually (−15%)</p>}
            </div>
            <p className="mt-4 text-sm text-da-muted-fg">Free up to 20 people · 20% off every seat above 200.</p>
          </div>
          <svg aria-hidden viewBox="0 0 160 200" className="mx-auto h-48 w-40 overflow-visible">
            <ellipse cx="80" cy="190" rx="60" ry="8" fill="var(--da-surface-2)" />
            <g style={{ transform: `scale(${scale})`, transformOrigin: "80px 190px", transition: "transform var(--da-duration-slow) var(--da-ease)" }}>
              <path d="M80 190V70" stroke="var(--da-primary)" strokeWidth="5" strokeLinecap="round" />
              <path d="M80 130c-30 0-48-18-48-48 30 0 48 18 48 48Z" fill="var(--da-primary)" opacity=".75" />
              <path d="M80 105c28 0 44-16 44-44-28 0-44 16-44 44Z" fill="var(--da-primary)" />
              <path d="M80 80c-18 0-30-12-30-30 18 0 30 12 30 30Z" fill="color-mix(in oklab, var(--da-primary) 55%, var(--da-accent))" />
            </g>
          </svg>
        </div>
      </div>
    </section>
  );
}

export default PricingTeam;

modules/organic-soft/section/pricing-team/index.tsx

Props

PropTypeDefaultDescription
titlestring—Heading.
perSeatnumber—Price per employee per month (EUR).
minnumber—Min.
maxnumber—Max.
defaultSizenumber—Default Size.
classNamestring—Extra classes on the root.

Other pricing variants in Organic Soft

Pricing in other art directions

Pricing Comparison

Full feature matrix: ruled table with plan headers (price + CTA, highlighted plan in yellow), ink group separator rows and check / dash / text values, horizontally scrollable on mobile.

BrutalistPricing

Pricing Single

Single-plan pricing card: giant price on a yellow panel, numbered feature grid on paper, full-width ink CTA, guarantee line and a rotated pink discount sticker.

BrutalistPricing

Pricing Slider

Usage-based pricing calculator: chunky range slider with a square yellow thumb, live per-unit and total price (volume tiers), included-features list and an ink CTA bar.

BrutalistPricing

Pricing Tiers

Three plans glued together in one ruled strip, the highlighted plan pops out in solid yellow with a rotated badge. Monthly/yearly toggle with discount chip, custom-price plan support.

BrutalistPricing

Pricing Credits

Pay-as-you-go pricing: four glass radio cards of recording-hour packs (tags like Popular / Best value) feeding a gradient summary card with price, per-hour cost, inclusions and CTA.

GlassPricing

Pricing Duo

Free vs paid in one glass panel: two plan headers with price and CTA over a shared feature table (checks, dashes, values); the paid column is tinted with a soft gradient and a gradient CTA.

GlassPricing

Pricing Frosted

Three frosted pricing cards with a pill billing toggle; the featured plan gets a gradient frame, gradient badge and gradient CTA and stands slightly taller. Per-seat units and custom pricing supported.

GlassPricing

Pricing Spotlight

Single-plan pricing: a wide glass card split into a gradient price block (plan, big price, CTA, sales link) and a two-column feature list with a money-back guarantee and customer wordmarks.

GlassPricing

Pricing Columns

Three quiet pricing columns with a segmented monthly/yearly control, per-seat units, and a featured plan lifted by a ring, soft shadow and an indigo hairline highlight on top.

MinimalPricing

Pricing Rows

Plans stacked as full-width horizontal rows (name + description, highlight chips, price, CTA), the featured one ringed in indigo, followed by an inverted ink enterprise strip.

MinimalPricing

Pricing Table

Full plan comparison table: four plan columns with price and CTA in the header, grouped feature rows with checks, dashes or values, featured column tinted; horizontally scrollable on small screens.

MinimalPricing

Pricing Usage

Seat-based pricing calculator: range slider for responders, four volume tiers with the active one highlighted, monthly/yearly toggle and a live estimated total panel with inclusions and CTA.

MinimalPricing

Pricing Columns

Three plan columns separated by hairlines (no cards): mono plan name, huge price, note, ruled feature list and a button; the featured plan has an ink button and a signal dot.

Mono CleanPricing

Pricing One

Single-price poster: a gigantic price set in the display face across the left, and on the right a short pitch, a two-column “included” list with en-dashes and an ink CTA; separated by a full-ink rule.

Mono CleanPricing

Pricing Table

Plain typographic comparison table: ink header rule, mono column heads, hairline rows, em-dash for absent features, and the featured column marked with a signal dot.

Mono CleanPricing

Pricing Toggle

Pricing as a ruled list: a text toggle “Monthly / Yearly (−20%)” with an underline on the active option, then one row per plan — name, blurb, price, arrow link — rows invert on hover.

Mono CleanPricing

Pricing Fees

Pay-as-you-go fee sheet: big per-method rates in bordered cells (4-up), then a “no hidden fees” checklist band.

Neo CorporatePricing

Pricing Matrix

Enterprise feature matrix: sticky-looking header row of plans, grouped rows with section headings, checks/dashes/values and a tinted featured column.

Neo CorporatePricing

Pricing Tiers

Three bordered tiers with a monthly/annual segmented toggle; the featured tier has a blue top bar and “Most popular” badge; enterprise shows “Custom”.

Neo CorporatePricing

Pricing Volume

Volume-based fee calculator: stepped slider of monthly payment volume, the blended rate tier highlighted in a tier table, and an estimated monthly fee vs. a typical 2.9% processor.

Neo CorporatePricing

Pricing Cards

Three rounded plan cards with emoji (Sprout, Bloom, Forest), a pill monthly/yearly toggle, mint tick lists, and the featured plan filled in lavender with a tilted butter “Most loved” sticker.

Soft FlatPricing

Pricing Compare

Rounded comparison table inside a white card: soft zebra rows, round mint check and grey dash badges, and a lavender featured column with rounded head.

Soft FlatPricing

Pricing Duo

Two big plan blocks side by side: a mint “Free” block and a periwinkle “Pro” block with light text, huge rounded prices, round-tick feature lists and contrasting pill CTAs.

Soft FlatPricing

Pricing Team

Team-size price calculator: big round −/+ stepper around an editable number, avatar dots popping in for each person (paid seats ringed), and a butter summary card with the live monthly total.

Soft FlatPricing