Web InnoventixFreeCode

Alternating Media Rows

Original · free

Three feature rows that alternate a text column with a CSS-built visual panel, walking the reader through a plan, measure and ship story.

byWeb InnoventixReact + Tailwind
alternatingmedia-textchecklist
Open

Copy prompt gives Claude Code, Cursor or v0 a ready-to-paste prompt that recreates this exact component.

npx shadcn@latest add https://webinnoventix.com/r/feature-alternating-media.json
feature-alternating-media.tsx
export default function FeatureAlternatingMedia() {
  const rows = [
    {
      eyebrow: "Plan",
      title: "See the whole quarter on one board",
      body: "Drag work between weeks, spot the crunch before it arrives and keep every stakeholder looking at the same picture. No screenshots, no stale exports.",
      points: ["Timeline and board views", "Capacity warnings", "Shareable read only links"],
      label: "Illustration of a planning board with three columns of task cards",
      visual: (
        <div className="grid grid-cols-3 gap-3">
          {[
            ["h-16", "h-24", "h-12"],
            ["h-24", "h-12", "h-20"],
            ["h-12", "h-20", "h-16"],
          ].map((col, i) => (
            <div key={i} className="space-y-3">
              {col.map((h, j) => (
                <div
                  key={j}
                  className={`${h} rounded-lg bg-white/70 shadow-sm ring-1 ring-indigo-900/5 dark:bg-white/10 dark:ring-white/10`}
                />
              ))}
            </div>
          ))}
        </div>
      ),
    },
    {
      eyebrow: "Measure",
      title: "Numbers that update while you watch",
      body: "Live metrics replace the weekly spreadsheet ritual. Set a target once and the chart tracks it for you, flagging the moment a trend turns.",
      points: ["Real time dashboards", "Custom goals", "Anomaly alerts"],
      label: "Illustration of a rising bar chart with a trend line",
      visual: (
        <div className="flex h-full items-end gap-3">
          {[40, 62, 48, 78, 90, 70].map((v, i) => (
            <div key={i} className="flex flex-1 flex-col justify-end">
              <div
                className="rounded-t-md bg-gradient-to-t from-emerald-500 to-emerald-300 dark:from-emerald-500 dark:to-emerald-400"
                style={{ height: `${v}%` }}
              />
            </div>
          ))}
        </div>
      ),
    },
    {
      eyebrow: "Ship",
      title: "Hand off with nothing lost in the gap",
      body: "Every decision, file and comment travels with the work when it moves to the next team, so context never falls through the cracks between tools.",
      points: ["Threaded discussion", "Attached specs", "Automatic handover notes"],
      label: "Illustration of stacked message threads and an attached file",
      visual: (
        <div className="space-y-3">
          <div className="flex items-start gap-3">
            <div className="h-8 w-8 shrink-0 rounded-full bg-amber-300 dark:bg-amber-400/80" />
            <div className="flex-1 space-y-2">
              <div className="h-3 w-2/3 rounded bg-white/70 dark:bg-white/15" />
              <div className="h-3 w-full rounded bg-white/50 dark:bg-white/10" />
            </div>
          </div>
          <div className="ml-11 rounded-lg bg-white/70 p-3 ring-1 ring-amber-900/5 dark:bg-white/10 dark:ring-white/10">
            <div className="flex items-center gap-2">
              <div className="h-6 w-6 rounded bg-amber-400/80" />
              <div className="h-3 w-1/2 rounded bg-white/60 dark:bg-white/15" />
            </div>
          </div>
          <div className="flex items-start gap-3">
            <div className="h-8 w-8 shrink-0 rounded-full bg-rose-300 dark:bg-rose-400/80" />
            <div className="flex-1 space-y-2">
              <div className="h-3 w-1/2 rounded bg-white/70 dark:bg-white/15" />
            </div>
          </div>
        </div>
      ),
    },
  ];

  const tints = [
    "from-indigo-100 to-indigo-50 dark:from-indigo-500/15 dark:to-indigo-500/5",
    "from-emerald-100 to-emerald-50 dark:from-emerald-500/15 dark:to-emerald-500/5",
    "from-amber-100 to-amber-50 dark:from-amber-500/15 dark:to-amber-500/5",
  ];

  return (
    <section className="bg-white px-6 py-16 dark:bg-zinc-950 md:py-24">
      <div className="mx-auto max-w-6xl">
        <div className="mx-auto max-w-2xl text-center">
          <h2 className="text-balance text-3xl font-bold tracking-tight text-zinc-900 sm:text-4xl dark:text-white">
            One flow from first idea to finished work
          </h2>
          <p className="mt-4 text-lg leading-relaxed text-zinc-600 dark:text-zinc-400">
            Three stages, one continuous thread. Nothing gets copied, re-keyed or forgotten along the way.
          </p>
        </div>

        <div className="mt-16 space-y-16 md:space-y-24">
          {rows.map((row, i) => (
            <div
              key={row.title}
              className="grid items-center gap-8 md:grid-cols-2 md:gap-12"
            >
              <div className={i % 2 === 1 ? "md:order-2" : ""}>
                <p className="text-sm font-semibold uppercase tracking-widest text-indigo-600 dark:text-indigo-400">
                  {row.eyebrow}
                </p>
                <h3 className="mt-3 text-2xl font-bold tracking-tight text-zinc-900 sm:text-3xl dark:text-white">
                  {row.title}
                </h3>
                <p className="mt-4 text-base leading-relaxed text-zinc-600 dark:text-zinc-400">
                  {row.body}
                </p>
                <ul className="mt-6 space-y-3">
                  {row.points.map((point) => (
                    <li key={point} className="flex items-center gap-3">
                      <svg
                        aria-hidden="true"
                        viewBox="0 0 20 20"
                        fill="currentColor"
                        className="h-5 w-5 shrink-0 text-emerald-500 dark:text-emerald-400"
                      >
                        <path
                          fillRule="evenodd"
                          d="M16.7 5.3a1 1 0 0 1 0 1.4l-7.5 7.5a1 1 0 0 1-1.4 0L3.3 9.7a1 1 0 1 1 1.4-1.4l3.3 3.29 6.8-6.79a1 1 0 0 1 1.4 0z"
                          clipRule="evenodd"
                        />
                      </svg>
                      <span className="text-sm font-medium text-zinc-700 dark:text-zinc-300">
                        {point}
                      </span>
                    </li>
                  ))}
                </ul>
              </div>

              <figure
                role="img"
                aria-label={row.label}
                className={`flex min-h-56 items-center rounded-2xl border border-zinc-200 bg-gradient-to-br p-6 shadow-sm dark:border-zinc-800 ${tints[i]} ${
                  i % 2 === 1 ? "md:order-1" : ""
                }`}
              >
                <div className="w-full">{row.visual}</div>
              </figure>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

Dependencies

None — React + Tailwind only.

Licence

Built by Web Innoventix. Free for personal and commercial use, no attribution required.

Built by Web Innoventix

Need a custom interface, a full website, or SEO that gets you cited by AI? We design, build and rank it end to end.

Get a free quote

Similar components

Browse all →
Three Column Icon Grid

Three Column Icon Grid

Original

A responsive icon grid that presents six product capabilities as scannable cards, each with an inline SVG icon, title and short description.

Bento Feature Grid

Bento Feature Grid

Original

A bento-style grid mixing one large hero cell, a tall stat cell and several compact cards to give features a clear visual hierarchy.

Tabbed Feature Switcher

Tabbed Feature Switcher

Original

A tabbed feature preview that switches panels using only native radio inputs and Tailwind peer variants, so it works with no JavaScript.

Stat Backed Features

Stat Backed Features

Original

A feature layout that pairs each capability with a headline metric, so every claim is anchored to a measurable result.

Scroll-reveal bento grid

Scroll-reveal bento grid

Original

An asymmetric bento feature grid whose cards stagger into view on scroll, lift on hover and feature an animated conic gradient border, shimmering headline, growing bar chart and a masked marquee tag strip.

Sticky scroll steps

Sticky scroll steps

Original

A scroll-linked how-it-works section where a sticky panel cross-fades between steps and a progress ring plus filling timeline track advance as you scroll through the process.

Spotlight hover feature cards

Spotlight hover feature cards

Original

A responsive feature card grid where each card follows the cursor with a radial spotlight glow, lifts and rotates its icon on hover, reveals a call to action, and sits above a scrolling logo marquee.

Animated marquee highlights band

Animated marquee highlights band

Original

A bold feature band with an animated gradient background, floating blurred orbs, blur-in staggered headline, two opposing marquee pill rows and shimmering stat cards.

Bordered Feature Grid (2x2)

Bordered Feature Grid (2x2)

MIT

A two-column grid of bordered feature cards, each pairing an outlined icon with a title and supporting copy. Clean, enterprise-leaning layout with full dark-mode support.

Outlined Feature Cards with CTA

Outlined Feature Cards with CTA

MIT

A three-column feature section with heading and intro, plus blue-outlined cards that each carry an icon, description, and a circular arrow call-to-action. Fully theme-aware.

Icon-Left Feature List

Icon-Left Feature List

MIT

A centered heading over a three-column feature list, each row leading with a rounded icon badge and a 'Learn More' link. Classic marketing feature block, ported with added dark variants.

Hover-Reveal Bento Grid

Hover-Reveal Bento Grid

MIT

The Magic UI bento pattern: a mixed-span grid of cards where the icon shrinks and the description lifts on hover to reveal a call-to-action. Self-contained (no framer-motion, no icon libs), pure CSS group-hover, with a glow background and full dark styling.