Spaces:
Paused
Paused
| import { | |
| BarChart3, | |
| PieChart, | |
| LineChart, | |
| Activity, | |
| Table, | |
| Target, | |
| Map, | |
| TrendingUp, | |
| Grid3X3, | |
| LayoutDashboard, | |
| Filter, | |
| Share2 | |
| } from 'lucide-react'; | |
| const rand = (min: number, max: number) => Math.floor(Math.random() * (max - min + 1)) + min; | |
| export const MiniBarChart = () => ( | |
| <div className="flex items-end justify-around h-full gap-1 pb-2"> | |
| {[60, 80, 45, 90, 70, 55, 85].map((h, i) => ( | |
| <div | |
| key={i} | |
| className="flex-1 bg-gradient-to-t from-primary to-primary/30 rounded-t animate-pulse" | |
| style={{ height: `${h}%`, animationDelay: `${i * 0.1}s` }} | |
| /> | |
| ))} | |
| </div> | |
| ); | |
| export const MiniPieChart = () => ( | |
| <div className="h-full flex items-center justify-center"> | |
| <div className="relative w-16 h-16"> | |
| <svg viewBox="0 0 36 36" className="w-full h-full -rotate-90"> | |
| <circle | |
| cx="18" | |
| cy="18" | |
| r="15.9" | |
| fill="none" | |
| stroke="hsl(var(--secondary))" | |
| strokeWidth="3" | |
| /> | |
| <circle | |
| cx="18" | |
| cy="18" | |
| r="15.9" | |
| fill="none" | |
| stroke="hsl(var(--primary))" | |
| strokeWidth="3" | |
| strokeDasharray="75 25" | |
| className="animate-pulse" | |
| /> | |
| <circle | |
| cx="18" | |
| cy="18" | |
| r="15.9" | |
| fill="none" | |
| stroke="hsl(var(--accent))" | |
| strokeWidth="3" | |
| strokeDasharray="25 75" | |
| strokeDashoffset="-75" | |
| /> | |
| </svg> | |
| <div className="absolute inset-0 flex items-center justify-center text-[10px] font-mono text-primary"> | |
| 75% | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| export const MiniLineChart = () => ( | |
| <div className="h-full flex items-end p-2"> | |
| <svg viewBox="0 0 100 40" className="w-full h-full"> | |
| <path | |
| d="M0,35 L15,28 L30,32 L45,15 L60,20 L75,8 L100,12" | |
| fill="none" | |
| stroke="hsl(var(--primary))" | |
| strokeWidth="2" | |
| className="animate-pulse" | |
| /> | |
| <path | |
| d="M0,35 L15,28 L30,32 L45,15 L60,20 L75,8 L100,12 L100,40 L0,40 Z" | |
| fill="url(#gradient)" | |
| opacity="0.3" | |
| /> | |
| <defs> | |
| <linearGradient id="gradient" x1="0%" y1="0%" x2="0%" y2="100%"> | |
| <stop offset="0%" stopColor="hsl(var(--primary))" /> | |
| <stop offset="100%" stopColor="transparent" /> | |
| </linearGradient> | |
| </defs> | |
| </svg> | |
| </div> | |
| ); | |
| export const MiniActivity = () => ( | |
| <div className="h-full flex items-center justify-center gap-0.5"> | |
| {[...Array(20)].map((_, i) => ( | |
| <div | |
| key={i} | |
| className="w-1 bg-primary rounded-full animate-pulse" | |
| style={{ | |
| height: `${Math.random() * 60 + 20}%`, | |
| animationDelay: `${i * 0.05}s`, | |
| }} | |
| /> | |
| ))} | |
| </div> | |
| ); | |
| export const MiniTable = () => ( | |
| <div className="h-full flex flex-col text-[7px] font-mono"> | |
| <div className="flex border-b border-primary/30 pb-1 mb-1"> | |
| <span className="flex-1 text-primary">ID</span> | |
| <span className="flex-1 text-primary">STATUS</span> | |
| <span className="flex-1 text-primary">VAL</span> | |
| </div> | |
| {[...Array(4)].map((_, i) => ( | |
| <div key={i} className="flex py-0.5 text-muted-foreground"> | |
| <span className="flex-1">#{String(i + 1).padStart(3, '0')}</span> | |
| <span className="flex-1 text-green-400">●</span> | |
| <span className="flex-1">{Math.floor(Math.random() * 100)}</span> | |
| </div> | |
| ))} | |
| </div> | |
| ); | |
| export const MiniGauge = () => ( | |
| <div className="h-full flex items-center justify-center"> | |
| <div className="relative w-16 h-10 overflow-hidden"> | |
| <div className="absolute inset-0 border-4 border-b-0 border-primary/30 rounded-t-full" /> | |
| <div | |
| className="absolute inset-0 border-4 border-b-0 border-primary rounded-t-full animate-pulse" | |
| style={{ clipPath: 'polygon(0 100%, 0 0, 75% 0, 75% 100%)' }} | |
| /> | |
| <div className="absolute bottom-0 left-1/2 w-0.5 h-8 bg-accent origin-bottom -translate-x-1/2 rotate-[30deg]" /> | |
| <div className="absolute bottom-0 left-1/2 text-[8px] font-mono text-primary -translate-x-1/2"> | |
| 75% | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| export const MiniMap = () => ( | |
| <div className="h-full bg-secondary/30 rounded relative overflow-hidden"> | |
| <div className="absolute inset-0 grid grid-cols-4 grid-rows-4 gap-px opacity-30"> | |
| {[...Array(16)].map((_, i) => ( | |
| <div key={i} className="border border-primary/20" /> | |
| ))} | |
| </div> | |
| <div className="absolute top-1/3 left-1/2 w-2 h-2 bg-accent rounded-full animate-ping" /> | |
| <div className="absolute top-1/3 left-1/2 w-2 h-2 bg-accent rounded-full" /> | |
| <div className="absolute top-1/2 left-1/4 w-1.5 h-1.5 bg-primary rounded-full" /> | |
| <div className="absolute top-2/3 left-3/4 w-1.5 h-1.5 bg-primary rounded-full" /> | |
| </div> | |
| ); | |
| export const MiniProgress = () => ( | |
| <div className="h-full flex flex-col justify-center gap-3"> | |
| <div className="text-center"> | |
| <div className="text-2xl font-mono text-primary animate-pulse">87%</div> | |
| <div className="text-[8px] text-muted-foreground">PROGRESS</div> | |
| </div> | |
| <div className="h-2 bg-secondary rounded-full overflow-hidden"> | |
| <div className="h-full w-[87%] bg-gradient-to-r from-primary via-accent to-primary animate-pulse rounded-full" /> | |
| </div> | |
| </div> | |
| ); | |
| export const MiniHeatmap = () => ( | |
| <div className="h-full grid grid-cols-7 gap-0.5 p-1"> | |
| {[...Array(35)].map((_, i) => ( | |
| <div | |
| key={i} | |
| className="rounded-sm" | |
| style={{ | |
| backgroundColor: `hsl(var(--primary) / ${Math.random() * 0.8 + 0.1})`, | |
| }} | |
| /> | |
| ))} | |
| </div> | |
| ); | |
| export const MiniTreemap = () => ( | |
| <div className="h-full grid grid-cols-3 grid-rows-2 gap-0.5"> | |
| <div className="col-span-2 bg-primary/60 rounded flex items-center justify-center text-[8px]"> | |
| 45% | |
| </div> | |
| <div className="bg-primary/40 rounded flex items-center justify-center text-[7px]">20%</div> | |
| <div className="bg-primary/30 rounded flex items-center justify-center text-[7px]">15%</div> | |
| <div className="bg-primary/20 rounded flex items-center justify-center text-[6px]">12%</div> | |
| <div className="bg-primary/10 rounded flex items-center justify-center text-[6px]">8%</div> | |
| </div> | |
| ); | |
| export const MiniRadar = () => ( | |
| <div className="h-full flex items-center justify-center"> | |
| <svg viewBox="0 0 100 100" className="w-16 h-16"> | |
| <polygon | |
| points="50,10 90,30 80,80 20,80 10,30" | |
| fill="none" | |
| stroke="hsl(var(--secondary))" | |
| strokeWidth="1" | |
| /> | |
| <polygon | |
| points="50,25 75,37 70,65 30,65 25,37" | |
| fill="none" | |
| stroke="hsl(var(--secondary))" | |
| strokeWidth="1" | |
| /> | |
| <polygon | |
| points="50,40 60,45 57,55 43,55 40,45" | |
| fill="none" | |
| stroke="hsl(var(--secondary))" | |
| strokeWidth="1" | |
| /> | |
| <polygon | |
| points="50,20 80,35 72,72 28,72 20,35" | |
| fill="hsl(var(--primary) / 0.3)" | |
| stroke="hsl(var(--primary))" | |
| strokeWidth="2" | |
| className="animate-pulse" | |
| /> | |
| </svg> | |
| </div> | |
| ); | |
| export const MiniFunnel = () => ( | |
| <div className="h-full flex flex-col justify-center gap-1 px-2"> | |
| {[ | |
| { label: 'Visitors', width: '100%', value: '10K' }, | |
| { label: 'Signups', width: '60%', value: '6K' }, | |
| { label: 'Active', width: '35%', value: '3.5K' }, | |
| { label: 'Paid', width: '15%', value: '1.5K' }, | |
| ].map(({ label, width, value }) => ( | |
| <div key={label} className="flex items-center gap-2"> | |
| <div className="flex-1 h-3 bg-secondary/30 rounded overflow-hidden"> | |
| <div className="h-full bg-gradient-to-r from-primary to-accent" style={{ width }} /> | |
| </div> | |
| <span className="text-[6px] text-muted-foreground w-8">{value}</span> | |
| </div> | |
| ))} | |
| </div> | |
| ); | |
| export const MiniSankey = () => ( | |
| <div className="h-full flex items-center justify-center"> | |
| <svg viewBox="0 0 100 60" className="w-full h-full"> | |
| <path | |
| d="M10,10 Q30,10 50,20 T90,25" | |
| fill="none" | |
| stroke="hsl(var(--primary))" | |
| strokeWidth="8" | |
| opacity="0.6" | |
| /> | |
| <path | |
| d="M10,30 Q30,30 50,30 T90,35" | |
| fill="none" | |
| stroke="hsl(var(--primary))" | |
| strokeWidth="6" | |
| opacity="0.4" | |
| /> | |
| <path | |
| d="M10,50 Q30,50 50,40 T90,45" | |
| fill="none" | |
| stroke="hsl(var(--primary))" | |
| strokeWidth="4" | |
| opacity="0.2" | |
| /> | |
| </svg> | |
| </div> | |
| ); | |
| export const MiniScatter = () => ( | |
| <div className="h-full relative bg-secondary/10 rounded"> | |
| {[...Array(12)].map((_, i) => ( | |
| <div | |
| key={i} | |
| className="absolute w-2 h-2 bg-primary rounded-full animate-pulse" | |
| style={{ | |
| left: `${Math.random() * 80 + 10}%`, | |
| top: `${Math.random() * 80 + 10}%`, | |
| animationDelay: `${i * 0.1}s`, | |
| opacity: Math.random() * 0.5 + 0.5, | |
| }} | |
| /> | |
| ))} | |
| </div> | |
| ); | |
| export const MiniQRCode = () => ( | |
| <div className="h-full flex items-center justify-center"> | |
| <div className="w-14 h-14 grid grid-cols-7 gap-px"> | |
| {[...Array(49)].map((_, i) => { | |
| const isCorner = (i < 21 && (i % 7 < 3 || i < 3)) || (i >= 28 && i < 49 && i % 7 < 3); | |
| const isRandom = !isCorner && Math.random() > 0.5; | |
| return ( | |
| <div key={i} className={`${isCorner || isRandom ? 'bg-primary' : 'bg-secondary/30'}`} /> | |
| ); | |
| })} | |
| </div> | |
| </div> | |
| ); | |
| export const MiniSpeedometer = () => ( | |
| <div className="h-full flex items-center justify-center"> | |
| <div className="relative w-16 h-8 overflow-hidden mt-2"> | |
| <div className="absolute inset-0 border-4 border-b-0 border-primary/30 rounded-t-full" /> | |
| <div | |
| className="absolute inset-0 border-4 border-b-0 border-primary rounded-t-full animate-pulse" | |
| style={{ transform: 'rotate(-45deg)', transformOrigin: 'bottom center' }} | |
| /> | |
| <div className="absolute bottom-0 left-1/2 w-0.5 h-7 bg-red-500 origin-bottom -translate-x-1/2 rotate-45" /> | |
| <div className="absolute bottom-0 left-1/2 w-2 h-2 bg-primary rounded-full -translate-x-1/2 translate-y-1/2" /> | |
| </div> | |
| </div> | |
| ); | |
| export const MiniFlowchart = () => ( | |
| <div className="h-full flex items-center justify-center"> | |
| <svg viewBox="0 0 100 60" className="w-full h-full"> | |
| <rect | |
| x="5" | |
| y="22" | |
| width="20" | |
| height="16" | |
| rx="2" | |
| fill="hsl(var(--primary) / 0.3)" | |
| stroke="hsl(var(--primary))" | |
| /> | |
| <rect | |
| x="40" | |
| y="5" | |
| width="20" | |
| height="16" | |
| rx="8" | |
| fill="hsl(var(--primary) / 0.3)" | |
| stroke="hsl(var(--primary))" | |
| /> | |
| <rect | |
| x="40" | |
| y="39" | |
| width="20" | |
| height="16" | |
| rx="8" | |
| fill="hsl(var(--primary) / 0.3)" | |
| stroke="hsl(var(--primary))" | |
| /> | |
| <rect | |
| x="75" | |
| y="22" | |
| width="20" | |
| height="16" | |
| rx="2" | |
| fill="hsl(var(--primary) / 0.3)" | |
| stroke="hsl(var(--primary))" | |
| /> | |
| <path d="M25,30 L40,13" fill="none" stroke="hsl(var(--primary))" strokeWidth="1" /> | |
| <path d="M25,30 L40,47" fill="none" stroke="hsl(var(--primary))" strokeWidth="1" /> | |
| <path d="M60,13 L75,30" fill="none" stroke="hsl(var(--primary))" strokeWidth="1" /> | |
| <path d="M60,47 L75,30" fill="none" stroke="hsl(var(--primary))" strokeWidth="1" /> | |
| </svg> | |
| </div> | |
| ); | |