Creative Tim UICreative Tim UI

Charts Blocks based on shadcn/ui

Files
components/creative-tim/blocks/blog-writer-seo-analytics-01.tsx
"use client"

import * as React from "react"
import { BarChart2, RefreshCw, TrendingUp } from "lucide-react"

import { Badge } from "@/registry/creative-tim/ui/badge"
import { Button } from "@/registry/creative-tim/ui/button"
import {
  Card,
  CardContent,
  CardHeader,
  CardTitle,
} from "@/registry/creative-tim/ui/card"

const DR_HISTORY = [18, 22, 24, 25, 28, 31, 35, 38, 40, 42, 44, 46]
const MONTHS = [
  "Jun",
  "Jul",
  "Aug",
  "Sep",
  "Oct",
  "Nov",
  "Dec",
  "Jan",
  "Feb",
  "Mar",
  "Apr",
  "May",
]

function Sparkline({ data }: { data: number[] }) {
  const max = Math.max(...data)
  const min = Math.min(...data)
  const range = max - min || 1
  const height = 40
  const width = 200
  const points = data
    .map((v, i) => {
      const x = (i / (data.length - 1)) * width
      const y = height - ((v - min) / range) * height
      return `${x},${y}`
    })
    .join(" ")

  return (
    <svg
      viewBox={`0 0 ${width} ${height}`}
      className="h-10 w-full text-orange-500"
    >
      <polyline
        points={points}
        fill="none"
        stroke="currentColor"
        strokeWidth="2"
        strokeLinecap="round"
        strokeLinejoin="round"
      />
    </svg>
  )
}

export function BlogWriterSeoAnalytics01() {
  return (
    <div className="mx-auto max-w-4xl space-y-6 p-6">
      <div className="flex items-center justify-between">
        <h1 className="text-base font-semibold">SEO Analytics</h1>
        <Button variant="outline" size="sm">
          <RefreshCw className="mr-1.5 h-3.5 w-3.5" />
          Refresh
        </Button>
      </div>

      {/* KPI row */}
      <div className="grid grid-cols-2 gap-4 md:grid-cols-4">
        <Card>
          <CardContent className="px-4 py-3">
            <p className="text-muted-foreground text-xs">Domain Rating</p>
            <p className="text-2xl font-bold">
              46
              <span className="text-muted-foreground text-sm font-normal">
                /100
              </span>
            </p>
            <div className="mt-1 flex items-center gap-1 text-xs text-emerald-600">
              <TrendingUp className="h-3 w-3" />
              +4 this month
            </div>
          </CardContent>
        </Card>
        <Card>
          <CardContent className="px-4 py-3">
            <p className="text-muted-foreground text-xs">Articles Published</p>
            <p className="text-2xl font-bold">87</p>
            <p className="text-muted-foreground mt-1 text-xs">last 3 months</p>
          </CardContent>
        </Card>
        <Card>
          <CardContent className="px-4 py-3">
            <p className="text-muted-foreground text-xs">Backlinks</p>
            <p className="text-2xl font-bold">234</p>
            <div className="mt-1 flex items-center gap-1 text-xs text-emerald-600">
              <TrendingUp className="h-3 w-3" />
              +18 this month
            </div>
          </CardContent>
        </Card>
        <Card>
          <CardContent className="px-4 py-3">
            <p className="text-muted-foreground text-xs">SEO Provider</p>
            <p className="mt-1 text-sm font-medium">DataForSEO</p>
            <Badge
              variant="outline"
              className="mt-1 border-emerald-200 bg-emerald-50 text-xs text-emerald-700"
            >
              Active
            </Badge>
          </CardContent>
        </Card>
      </div>

      {/* Domain rating trend */}
      <Card>
        <CardHeader className="pb-2">
          <CardTitle className="text-sm">Domain Rating Trend</CardTitle>
        </CardHeader>
        <CardContent className="space-y-3">
          <Sparkline data={DR_HISTORY} />
          <div className="text-muted-foreground flex justify-between text-xs">
            {MONTHS.map((m) => (
              <span key={m}>{m}</span>
            ))}
          </div>
          <p className="text-muted-foreground text-xs">
            Domain rating has grown from {DR_HISTORY[0]} to{" "}
            {DR_HISTORY[DR_HISTORY.length - 1]} over 12 months.
          </p>
        </CardContent>
      </Card>

      <p className="text-muted-foreground text-xs">
        Last synced: May 8, 2025 at 09:14 AM · Metrics from DataForSEO
      </p>
    </div>
  )
}
SEO analytics dashboard with domain rating trend sparkline and key metrics
blog-writer-seo-analytics-01

SEO Analytics

Domain Rating

46/100

+4 this month

Articles Published

87

last 3 months

Backlinks

234

+18 this month

SEO Provider

DataForSEO

Active
Domain Rating Trend
JunJulAugSepOctNovDecJanFebMarAprMay

Domain rating has grown from 18 to 46 over 12 months.

Last synced: May 8, 2025 at 09:14 AM · Metrics from DataForSEO

"use client"

import * as React from "react"
import { BarChart2, RefreshCw, TrendingUp } from "lucide-react"

import { Badge } from "@/registry/creative-tim/ui/badge"
import { Button } from "@/registry/creative-tim/ui/button"
import {
  Card,
  CardContent,
  CardHeader,
  CardTitle,
} from "@/registry/creative-tim/ui/card"

const DR_HISTORY = [18, 22, 24, 25, 28, 31, 35, 38, 40, 42, 44, 46]
const MONTHS = [
  "Jun",
  "Jul",
  "Aug",
  "Sep",
  "Oct",
  "Nov",
  "Dec",
  "Jan",
  "Feb",
  "Mar",
  "Apr",
  "May",
]

function Sparkline({ data }: { data: number[] }) {
  const max = Math.max(...data)
  const min = Math.min(...data)
  const range = max - min || 1
  const height = 40
  const width = 200
  const points = data
    .map((v, i) => {
      const x = (i / (data.length - 1)) * width
      const y = height - ((v - min) / range) * height
      return `${x},${y}`
    })
    .join(" ")

  return (
    <svg
      viewBox={`0 0 ${width} ${height}`}
      className="h-10 w-full text-orange-500"
    >
      <polyline
        points={points}
        fill="none"
        stroke="currentColor"
        strokeWidth="2"
        strokeLinecap="round"
        strokeLinejoin="round"
      />
    </svg>
  )
}

export function BlogWriterSeoAnalytics01() {
  return (
    <div className="mx-auto max-w-4xl space-y-6 p-6">
      <div className="flex items-center justify-between">
        <h1 className="text-base font-semibold">SEO Analytics</h1>
        <Button variant="outline" size="sm">
          <RefreshCw className="mr-1.5 h-3.5 w-3.5" />
          Refresh
        </Button>
      </div>

      {/* KPI row */}
      <div className="grid grid-cols-2 gap-4 md:grid-cols-4">
        <Card>
          <CardContent className="px-4 py-3">
            <p className="text-muted-foreground text-xs">Domain Rating</p>
            <p className="text-2xl font-bold">
              46
              <span className="text-muted-foreground text-sm font-normal">
                /100
              </span>
            </p>
            <div className="mt-1 flex items-center gap-1 text-xs text-emerald-600">
              <TrendingUp className="h-3 w-3" />
              +4 this month
            </div>
          </CardContent>
        </Card>
        <Card>
          <CardContent className="px-4 py-3">
            <p className="text-muted-foreground text-xs">Articles Published</p>
            <p className="text-2xl font-bold">87</p>
            <p className="text-muted-foreground mt-1 text-xs">last 3 months</p>
          </CardContent>
        </Card>
        <Card>
          <CardContent className="px-4 py-3">
            <p className="text-muted-foreground text-xs">Backlinks</p>
            <p className="text-2xl font-bold">234</p>
            <div className="mt-1 flex items-center gap-1 text-xs text-emerald-600">
              <TrendingUp className="h-3 w-3" />
              +18 this month
            </div>
          </CardContent>
        </Card>
        <Card>
          <CardContent className="px-4 py-3">
            <p className="text-muted-foreground text-xs">SEO Provider</p>
            <p className="mt-1 text-sm font-medium">DataForSEO</p>
            <Badge
              variant="outline"
              className="mt-1 border-emerald-200 bg-emerald-50 text-xs text-emerald-700"
            >
              Active
            </Badge>
          </CardContent>
        </Card>
      </div>

      {/* Domain rating trend */}
      <Card>
        <CardHeader className="pb-2">
          <CardTitle className="text-sm">Domain Rating Trend</CardTitle>
        </CardHeader>
        <CardContent className="space-y-3">
          <Sparkline data={DR_HISTORY} />
          <div className="text-muted-foreground flex justify-between text-xs">
            {MONTHS.map((m) => (
              <span key={m}>{m}</span>
            ))}
          </div>
          <p className="text-muted-foreground text-xs">
            Domain rating has grown from {DR_HISTORY[0]} to{" "}
            {DR_HISTORY[DR_HISTORY.length - 1]} over 12 months.
          </p>
        </CardContent>
      </Card>

      <p className="text-muted-foreground text-xs">
        Last synced: May 8, 2025 at 09:14 AM · Metrics from DataForSEO
      </p>
    </div>
  )
}
Files
app/bar-chart-example/page.tsx
import BarChartExample from "@/components/creative-tim/blocks/bar-chart-example"

export default function Page() {
  return <BarChartExample />
}
Bar chart with year selector showing overview balance
bar-chart-example

Sales Overview

Monthly performance metrics

Total Balance

$87,982.00

21.8%vs 2023
import BarChartExample from "@/components/creative-tim/blocks/bar-chart-example"

export default function Page() {
  return <BarChartExample />
}
PRO Blocks

This is a PRO block. Upgrade your account to access the source code and install this block via CLI/MCP.

Upgrade to PRO
Three chart cards showing website views, daily sales, and completed tasks
card-charts-example-1

Website Views

2,490

12.5%

Daily Sales

$2,490

8.2%

Completed Tasks

2,490

3.1%
import CardChartsExample1 from "@/components/creative-tim/blocks/card-charts-example-1"

export default function Page() {
  return <CardChartsExample1 />
}
PRO Blocks

This is a PRO block. Upgrade your account to access the source code and install this block via CLI/MCP.

Upgrade to PRO
Three chart cards with footer timestamps showing campaign metrics
card-charts-example-2

Website Views

Last Campaign Performance

Campaign sent 2 days ago

Daily Sales

15% increase in today sales

Campaign sent 2 days ago

Completed Tasks

Last Campaign Performance

Campaign sent 2 days ago

import CardChartsExample2 from "@/components/creative-tim/blocks/card-charts-example-2"

export default function Page() {
  return <CardChartsExample2 />
}
PRO Blocks

This is a PRO block. Upgrade your account to access the source code and install this block via CLI/MCP.

Upgrade to PRO
Line chart comparing team productivity across two years
comparison-chart-widget

Team Productivity Tracker

Tasks completed 2023

7,982.80

+30%
import ComparisonChartWidget from "@/components/creative-tim/blocks/comparison-chart-widget"

export default function Page() {
  return <ComparisonChartWidget />
}
PRO Blocks

This is a PRO block. Upgrade your account to access the source code and install this block via CLI/MCP.

Upgrade to PRO
Multi-line chart showing annual sales performance with footer
line-chart

$127,092.22

Annual Sales Performance

Year-to-Date sales comparison

import LineChartBlock from "@/components/creative-tim/blocks/line-chart"

export default function Page() {
  return <LineChartBlock />
}
PRO Blocks

This is a PRO block. Upgrade your account to access the source code and install this block via CLI/MCP.

Upgrade to PRO
Single line chart with year selector showing website views traffic
single-line-chart

Website Views Traffic

Unique Views Breakdown

$87,982.00

import SingleLineChart from "@/components/creative-tim/blocks/single-line-chart"

export default function Page() {
  return <SingleLineChart />
}
Files
app/kpi-sparkline-cards/page.tsx
import KpiSparklineCards from "@/components/creative-tim/blocks/kpi-sparkline-cards"

export default function Page() {
  return <KpiSparklineCards />
}
KPI metric cards with embedded sparkline trend charts and change indicators
kpi-sparkline-cards

Monthly Revenue

12.5%

$84,200

$9,420 today

Active Users

8.2%

12,430

1,204 new this week

Avg. Session

3.1%

4m 12s

vs 4m 04s last month

Churn Rate

0.8%

2.4%

−0.8pp vs last month

import KpiSparklineCards from "@/components/creative-tim/blocks/kpi-sparkline-cards"

export default function Page() {
  return <KpiSparklineCards />
}
Files
app/area-chart-gradient/page.tsx
import AreaChartGradient from "@/components/creative-tim/blocks/area-chart-gradient"

export default function Page() {
  return <AreaChartGradient />
}
Revenue area chart with time-range tabs, gradient fill, and period comparison
area-chart-gradient

Total Revenue

$2.0M22.8%

vs. previous period

Current period
Previous period
import AreaChartGradient from "@/components/creative-tim/blocks/area-chart-gradient"

export default function Page() {
  return <AreaChartGradient />
}
Files
app/combo-chart-target/page.tsx
import ComboChartTarget from "@/components/creative-tim/blocks/combo-chart-target"

export default function Page() {
  return <ComboChartTarget />
}
Combo bar+line chart showing actual sales vs target with achievement percentage badge
combo-chart-target

Sales vs Target

Monthly actual vs target — FY 2024

Actual:1178K
106.1% of target
Actual revenue
Target
import ComboChartTarget from "@/components/creative-tim/blocks/combo-chart-target"

export default function Page() {
  return <ComboChartTarget />
}
Files
app/donut-chart-breakdown/page.tsx
import DonutChartBreakdown from "@/components/creative-tim/blocks/donut-chart-breakdown"

export default function Page() {
  return <DonutChartBreakdown />
}
Interactive donut chart with total in center and detailed legend breakdown
donut-chart-breakdown

Budget Breakdown

Annual operating expenses by category

$216,000Total
Infrastructure
20.0%$43,200
Personnel
45.6%$98,500
Marketing
14.7%$31,800
Software
8.5%$18,400
Operations
11.2%$24,100
import DonutChartBreakdown from "@/components/creative-tim/blocks/donut-chart-breakdown"

export default function Page() {
  return <DonutChartBreakdown />
}
Files
app/bar-list-metrics/page.tsx
import BarListMetrics from "@/components/creative-tim/blocks/bar-list-metrics"

export default function Page() {
  return <BarListMetrics />
}
Ranked horizontal bar list with Pages/Sources/Devices tabs and change badges
bar-list-metrics

Top Traffic

Last 30 days · 56,700 total visits

1/dashboard
12,840+8.4%
2/pricing
9,210+12.1%
3/blog/intro
7,650-2.3%
4/docs/start
6,420+5.7%
5/login
5,180+1.2%
import BarListMetrics from "@/components/creative-tim/blocks/bar-list-metrics"

export default function Page() {
  return <BarListMetrics />
}