{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"marketing-stats-achievement-bars","type":"registry:block","title":"Achievement Bars","files":[{"path":"components/blocks/marketing/stats/achievement-bars.tsx","content":"import { Badge } from '@/components/ui/badge';\nimport { Progress } from '@/components/ui/progress';\nimport { CheckCircle2, AlertCircle, Target } from 'lucide-react';\nimport { cn } from '@/lib/utils';\n\nexport default function AchievementBars() {\n  const achievements = [\n    {\n      title: 'Q3 Sales Target',\n      currentValue: 1842350,\n      targetValue: 2000000,\n      format: 'currency',\n      progress: 92.1, // pre-calculated for demo\n      status: 'on-track', // on-track, at-risk, completed\n      timeRemaining: '14 days remaining',\n    },\n    {\n      title: 'Customer Acquisition',\n      currentValue: 2427,\n      targetValue: 3000,\n      format: 'number',\n      progress: 80.9,\n      status: 'on-track',\n      timeRemaining: '14 days remaining',\n    },\n    {\n      title: 'Retention Rate',\n      currentValue: 78.5,\n      targetValue: 75,\n      format: 'percent',\n      progress: 104.7, // can exceed 100%\n      status: 'completed',\n      timeRemaining: 'Goal exceeded',\n    },\n    {\n      title: 'Support Response Time',\n      currentValue: 4.2,\n      targetValue: 3,\n      format: 'time',\n      progress: 71.4, // inverse: lower is better, so 71.4% to goal\n      status: 'at-risk',\n      timeRemaining: '14 days remaining',\n    },\n  ];\n\n  // Format functions for different value types\n  const formatValue = (value: number, format: string) => {\n    switch (format) {\n      case 'currency':\n        return new Intl.NumberFormat('en-US', {\n          style: 'currency',\n          currency: 'USD',\n          maximumFractionDigits: 0,\n        }).format(value);\n      case 'number':\n        return new Intl.NumberFormat('en-US').format(value);\n      case 'percent':\n        return `${value}%`;\n      case 'time':\n        return `${value} hours`;\n      default:\n        return value.toString();\n    }\n  };\n\n  // Status indicator component\n  const StatusIndicator = ({ status }: { status: string }) => {\n    switch (status) {\n      case 'completed':\n        return (\n          <div className=\"flex items-center text-emerald-500\">\n            <CheckCircle2 className=\"mr-1 h-3 w-3 sm:h-4 sm:w-4\" />\n            <span className=\"text-[10px] font-medium sm:text-xs\">\n              Completed\n            </span>\n          </div>\n        );\n      case 'at-risk':\n        return (\n          <div className=\"flex items-center text-amber-500\">\n            <AlertCircle className=\"mr-1 h-3 w-3 sm:h-4 sm:w-4\" />\n            <span className=\"text-[10px] font-medium sm:text-xs\">At Risk</span>\n          </div>\n        );\n      case 'on-track':\n      default:\n        return (\n          <div className=\"flex items-center text-blue-500\">\n            <Target className=\"mr-1 h-3 w-3 sm:h-4 sm:w-4\" />\n            <span className=\"text-[10px] font-medium sm:text-xs\">On Track</span>\n          </div>\n        );\n    }\n  };\n\n  // Helper function to get progress bar color class based on status\n  const getProgressClass = (status: string) => {\n    switch (status) {\n      case 'completed':\n        return 'bg-emerald-500';\n      case 'at-risk':\n        return 'bg-amber-500';\n      case 'on-track':\n      default:\n        return 'bg-blue-500';\n    }\n  };\n\n  return (\n    <div className=\"container mx-auto px-4 py-24 md:px-6 lg:py-32 2xl:max-w-[1400px]\">\n      <div className=\"mx-auto max-w-5xl\">\n        <div className=\"mb-12 text-center\">\n          <Badge className=\"mb-2\">Q3 Progress</Badge>\n          <h2 className=\"text-3xl font-bold md:text-4xl\">Goal Tracking</h2>\n          <p className=\"text-muted-foreground mx-auto mt-3 max-w-2xl\">\n            Monitor our progress toward key business objectives\n          </p>\n        </div>\n\n        <div className=\"space-y-8\">\n          {achievements.map((achievement, index) => (\n            <div key={index} className=\"bg-card rounded-xl border p-4 sm:p-6\">\n              <div className=\"mb-2 flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between sm:gap-0\">\n                <h3 className=\"text-base font-semibold sm:text-lg\">\n                  {achievement.title}\n                </h3>\n                <StatusIndicator status={achievement.status} />\n              </div>\n\n              <div className=\"flex flex-col gap-1 sm:flex-row sm:items-baseline sm:justify-between sm:gap-0\">\n                <div className=\"text-xl font-bold sm:text-2xl md:text-3xl\">\n                  {formatValue(achievement.currentValue, achievement.format)}\n                </div>\n                <div className=\"text-muted-foreground text-sm\">\n                  Target:{' '}\n                  {formatValue(achievement.targetValue, achievement.format)}\n                </div>\n              </div>\n\n              <div className=\"mt-4 space-y-2\">\n                <div className=\"flex items-center justify-between\">\n                  <span className=\"text-xs font-medium sm:text-sm\">\n                    {achievement.progress}%\n                  </span>\n                  <span className=\"text-muted-foreground text-xs sm:text-sm\">\n                    {achievement.timeRemaining}\n                  </span>\n                </div>\n                <Progress\n                  value={Math.min(achievement.progress, 100)}\n                  className={cn(\n                    'h-2',\n                    achievement.status === 'completed'\n                      ? 'bg-emerald-100 dark:bg-emerald-950'\n                      : achievement.status === 'at-risk'\n                        ? 'bg-amber-100 dark:bg-amber-950'\n                        : 'bg-blue-100 dark:bg-blue-950',\n                    '[&>div]:' + getProgressClass(achievement.status)\n                  )}\n                />\n              </div>\n            </div>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n}\n","type":"registry:component","target":"components/blocks/marketing/stats/achievement-bars.tsx"},{"path":"components/ui/badge.tsx","content":"import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n  \"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n        secondary:\n          \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n        destructive:\n          \"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n        outline:\n          \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n        ghost:\n          \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n        link: \"text-primary underline-offset-4 hover:underline\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nfunction Badge({\n  className,\n  variant = \"default\",\n  asChild = false,\n  ...props\n}: React.ComponentProps<\"span\"> &\n  VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n  const Comp = asChild ? Slot.Root : \"span\"\n\n  return (\n    <Comp\n      data-slot=\"badge\"\n      data-variant={variant}\n      className={cn(badgeVariants({ variant }), className)}\n      {...props}\n    />\n  )\n}\n\nexport { Badge, badgeVariants }\n","type":"registry:ui","target":"components/ui/badge.tsx"},{"path":"components/ui/progress.tsx","content":"\"use client\"\n\nimport * as React from \"react\"\nimport { Progress as ProgressPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Progress({\n  className,\n  value,\n  ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root>) {\n  return (\n    <ProgressPrimitive.Root\n      data-slot=\"progress\"\n      className={cn(\n        \"relative flex h-1.5 w-full items-center overflow-x-hidden rounded-full bg-muted\",\n        className\n      )}\n      {...props}\n    >\n      <ProgressPrimitive.Indicator\n        data-slot=\"progress-indicator\"\n        className=\"size-full flex-1 bg-primary transition-all\"\n        style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n      />\n    </ProgressPrimitive.Root>\n  )\n}\n\nexport { Progress }\n","type":"registry:ui","target":"components/ui/progress.tsx"}],"description":"Horizontal bars that fill to show milestones reached against a target. Drop it on a results page to visualize goals hit and progress toward each one.","dependencies":["class-variance-authority","lucide-react","radix-ui"]}