shadimage
flx
blockcontent-11source: ok · refreshed

Content 11

A billing overview split with a dashboard preview card and two feature highlights, built for the app-shell preset.

npx shadcn add "https://ui.flexnative.com/r/content-11.json"
free

Where it goes

testimonialkanbandashboard-shellfeature-grid

Use cases

dashboard

Tags auto-generated by rules on 9/24/2026 — empty means no evidence, not lack of support.

Dependencies

Bundle weight · medium
animationmotion

Registry dependencies

@flx/dynamic-iconcardbadge

Files2 · source cached 10/8/2026, 6:17:29 AM

registry/blocks/content/content-11/content-11.tsx
import { LayoutDashboard, Sparkles } from 'lucide-react'
import Balancer from 'react-wrap-balancer'

import { Content11Dashboard } from './content-11-dashboard'

const features = [
  {
    icon: LayoutDashboard,
    title: 'One view for every account',
    description:
      'Balances, payments, and campaign activity live in a single dashboard instead of scattered spreadsheets.',
  },
  {
    icon: Sparkles,
    title: 'Insights that update themselves',
    description:
      'Every record is grouped by status, channel, and performance automatically, so trends surface before you go looking for them.',
  },
]

export function Content11() {
  return (
    <section className="bg-background w-full">
      <div className="mx-auto flex max-w-6xl flex-col gap-10 px-6 py-16 sm:py-24 lg:gap-14">
        <div className="flex max-w-xl flex-col gap-4">
          <h2 className="text-foreground text-2xl font-semibold tracking-tight text-balance sm:text-3xl">
            <Balancer>Every account, one place to watch it move</Balancer>
          </h2>
          <p className="text-muted-foreground max-w-sm text-sm sm:text-base">
            <Balancer>
              Balances, campaigns, and payments stay in sync automatically, so
              your team spends less time reconciling and more time collecting.
            </Balancer>
          </p>
        </div>

        <div className="grid grid-cols-1 items-stretch gap-8 lg:grid-cols-[1.4fr_1fr] lg:gap-6">
          <div className="bg-secondary/70 dark:bg-secondary/30 relative h-72 w-full overflow-hidden rounded-3xl sm:h-80 lg:h-[22rem]">
            <div className="absolute top-6 left-6 w-[125%] max-w-none overflow-hidden rounded-2xl *:w-full">
              <Content11Dashboard />
            </div>
          </div>

          <div className="flex flex-col gap-4 sm:gap-5">
            {features.map((feature) => (
              <div
                key={feature.title}
                className="bg-secondary/70 dark:bg-secondary/30 flex h-full flex-col gap-2 rounded-3xl p-6"
              >
                <feature.icon className="text-foreground size-5" />
                <h3 className="text-foreground text-sm font-semibold">
                  {feature.title}
                </h3>
                <p className="text-muted-foreground text-sm leading-relaxed">
                  <Balancer>{feature.description}</Balancer>
                </p>
              </div>
            ))}
          </div>
        </div>
      </div>
    </section>
  )
}
registry/blocks/content/content-11/content-11-dashboard.tsx
import {
  ArrowDownRight,
  ArrowUpRight,
  Mail,
  MessageSquare,
  Phone,
} from 'lucide-react'

import { Card } from '@/components/ui/card'
import { cn } from '@/lib/utils'

const stats = [
  {
    label: 'Outstanding balance',
    value: '$1,842,900',
    delta: '-4.2%',
    trend: 'down' as const,
  },
  {
    label: 'Active accounts',
    value: '312',
    delta: '+12',
    trend: 'up' as const,
  },
  {
    label: 'Recovery rate',
    value: '74%',
    delta: '+3.1%',
    trend: 'up' as const,
  },
  {
    label: 'Avg. resolution',
    value: '9.6 days',
    delta: '-1.8d',
    trend: 'down' as const,
  },
]

const channels = [
  { icon: Mail, label: 'Email', sent: '1,240 sent', rate: '21.3%' },
  { icon: MessageSquare, label: 'SMS', sent: '860 sent', rate: '26.5%' },
  { icon: Phone, label: 'Phone', sent: '410 sent', rate: '31.2%' },
]

const timeline = [
  { title: 'Payment posted', meta: 'Meridian Co · $12,400' },
  { title: 'Reminder sequence completed', meta: 'Harlow Group' },
  { title: 'New accounts imported', meta: '380 records' },
  { title: 'Collection plan started', meta: 'Ridgeline LLC' },
]

export function Content11Dashboard() {
  return (
    <Card className="border-border/40 w-full gap-0 overflow-hidden rounded-none p-0 shadow-sm">
      <div className="border-border/40 flex items-center justify-between gap-3 border-b px-5 py-4 sm:px-6">
        <div>
          <h3 className="text-foreground text-sm font-semibold tracking-tight">
            Collections
          </h3>
          <p className="text-muted-foreground mt-0.5 text-xs">
            How every account is trending this month
          </p>
        </div>
      </div>

      <div className="grid grid-cols-2 gap-3 px-5 py-4 sm:grid-cols-4 sm:px-6">
        {stats.map((stat) => (
          <div
            key={stat.label}
            className="border-border/40 min-w-0 rounded-lg border p-3"
          >
            <p className="text-muted-foreground truncate text-[11px]">
              {stat.label}
            </p>
            <p className="text-foreground mt-1 text-base font-semibold tabular-nums">
              {stat.value}
            </p>
            <p
              className={cn(
                'mt-1 flex items-center gap-0.5 text-[11px] tabular-nums',
                stat.trend === 'up'
                  ? 'text-emerald-600 dark:text-emerald-400'
                  : 'text-muted-foreground',
              )}
            >
              {stat.trend === 'up' ? (
                <ArrowUpRight className="size-3" />
              ) : (
                <ArrowDownRight className="size-3" />
              )}
              {stat.delta}
            </p>
          </div>
        ))}
      </div>

      <div className="border-border/40 sm:divide-border/40 grid grid-cols-1 gap-6 border-t px-5 py-5 sm:grid-cols-2 sm:gap-0 sm:divide-x sm:px-6">
        <div className="sm:pr-6">
          <h4 className="text-foreground text-xs font-medium">Channel mix</h4>
          <div className="divide-border/40 mt-3 flex flex-col divide-y">
            {channels.map(({ icon: ChannelIcon, label, sent, rate }) => (
              <div
                key={label}
                className="flex items-center gap-3 py-2.5 first:pt-0 last:pb-0"
              >
                <ChannelIcon className="text-foreground/60 size-4 shrink-0" />
                <div className="min-w-0 flex-1">
                  <p className="text-foreground text-xs font-medium">{label}</p>
                  <p className="text-muted-foreground text-[11px]">{sent}</p>
                </div>
                <span className="text-foreground text-xs font-medium tabular-nums">
                  {rate}
                </span>
              </div>
            ))}
          </div>
        </div>

        <div className="sm:pl-6">
          <h4 className="text-foreground text-xs font-medium">Timeline</h4>
          <div className="relative mt-3 flex flex-col gap-3.5 pl-4">
            <div className="bg-border/50 absolute top-1 bottom-1 left-[3px] w-px" />
            {timeline.map((entry) => (
              <div key={entry.title} className="relative">
                <span className="bg-foreground/40 absolute top-1 -left-4 size-1.5 rounded-full" />
                <p className="text-foreground text-xs font-medium">
                  {entry.title}
                </p>
                <p className="text-muted-foreground text-[11px]">
                  {entry.meta}
                </p>
              </div>
            ))}
          </div>
        </div>
      </div>
    </Card>
  )
}

More from flx

Browse all components in this library →