{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "bento-metrics-mixed",
  "title": "Bento — Mixed Metrics",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/bento-metrics-mixed/bento-metrics-mixed.component.ts",
      "content": "// Six tiles mixing headline numbers, a sparkline row, a short list, and a status tile —\n// the summary band that sits beneath a hero. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core'\nimport { ArrowUpRight, CircleCheck, LucideAngularModule } from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport { UiCardComponent, UiCardContentComponent } from '@/ui/card/card.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\n\nconst series = [4, 9, 7, 14, 11, 18, 16, 23, 21, 28, 26, 33]\n\nconst definitions = [\n  { name: 'revenue_net', owner: 'finance' },\n  { name: 'margin_by_channel', owner: 'finance' },\n  { name: 'pipeline_weighted', owner: 'revops' },\n]\n\n// Inline SVG polyline: a sparkline does not justify a charting dependency.\nfunction points(values: number[]): string {\n  const min = Math.min(...values)\n  const max = Math.max(...values)\n  const span = max - min || 1\n  return values\n    .map((value, index) => {\n      const x = (index / (values.length - 1)) * 100\n      const y = 30 - ((value - min) / span) * 26\n      return `${x.toFixed(1)},${y.toFixed(1)}`\n    })\n    .join(' ')\n}\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-bento-metrics-mixed, [ui-bento-metrics-mixed]',\n  standalone: true,\n  // React renders the root <section> itself: the host stays out of layout and `class` goes to the root.\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [\n    LucideAngularModule,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiSeparatorComponent,\n  ],\n  template: `\n    <section data-slot=\"bento-metrics-mixed\" [class]=\"rootClass\">\n      <div class=\"mx-auto max-w-6xl px-6 py-16\">\n        <span ui-badge variant=\"secondary\">At a glance</span>\n\n        <div class=\"mt-6 grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n          <div ui-card>\n            <div ui-card-content class=\"p-5\">\n              <p class=\"text-muted-foreground text-xs tracking-wide uppercase\">Days to close</p>\n              <p class=\"font-display mt-2 text-3xl font-bold tracking-tight\">4.2</p>\n              <p class=\"text-success mt-1 text-xs\">down from 9.4</p>\n            </div>\n          </div>\n\n          <div ui-card class=\"sm:col-span-2\">\n            <div ui-card-content class=\"p-5\">\n              <div class=\"flex items-baseline justify-between gap-3\">\n                <p class=\"text-muted-foreground text-xs tracking-wide uppercase\">Certified metrics published</p>\n                <p class=\"font-mono text-xs\">12 months</p>\n              </div>\n              <p class=\"font-display mt-2 text-3xl font-bold tracking-tight\">340</p>\n              <svg\n                class=\"text-primary/70 mt-2 h-8 w-full\"\n                viewBox=\"0 0 100 32\"\n                preserveAspectRatio=\"none\"\n                aria-hidden=\"true\"\n              >\n                <polyline [attr.points]=\"sparkPoints\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n              </svg>\n            </div>\n          </div>\n\n          <div ui-card>\n            <div ui-card-content class=\"flex h-full flex-col p-5\">\n              <p class=\"text-muted-foreground text-xs tracking-wide uppercase\">Status</p>\n              <div class=\"mt-3 flex items-center gap-2\">\n                <lucide-icon [img]=\"CircleCheck\" class=\"text-success size-4\" aria-hidden=\"true\" />\n                <p class=\"text-sm font-medium\">All systems operational</p>\n              </div>\n              <p class=\"text-muted-foreground mt-auto pt-3 font-mono text-xs\">99.98% · rolling 90 days</p>\n            </div>\n          </div>\n\n          <div ui-card class=\"sm:col-span-2\">\n            <div ui-card-content class=\"p-5\">\n              <p class=\"text-muted-foreground text-xs tracking-wide uppercase\">Most-read definitions</p>\n              <ul class=\"mt-3 space-y-2\">\n                @for (definition of definitionRows; track definition.name) {\n                  <li class=\"flex items-center justify-between gap-3\">\n                    <span class=\"min-w-0 truncate font-mono text-xs\">{{ definition.name }}</span>\n                    <span class=\"text-muted-foreground shrink-0 text-xs\">{{ definition.owner }}</span>\n                  </li>\n                }\n              </ul>\n            </div>\n          </div>\n\n          <div ui-card class=\"sm:col-span-2\">\n            <div ui-card-content class=\"flex h-full flex-col justify-between gap-4 p-5 sm:flex-row sm:items-center\">\n              <div class=\"min-w-0\">\n                <p class=\"text-sm font-medium\">See the whole workspace</p>\n                <p class=\"text-muted-foreground mt-1 text-xs\">Live demo, no signup, real definitions.</p>\n              </div>\n              <button ui-button variant=\"outline\" size=\"sm\" class=\"shrink-0\">\n                Open the demo\n                <lucide-icon [img]=\"ArrowUpRight\" class=\"ml-1.5 size-3.5\" aria-hidden=\"true\" />\n              </button>\n            </div>\n          </div>\n        </div>\n\n        <ui-separator class=\"mt-6\" />\n        <p class=\"text-muted-foreground mt-4 text-xs\">Figures from the Northwind workspace, refreshed hourly.</p>\n      </div>\n    </section>\n  `,\n})\nexport class UiBentoMetricsMixedComponent {\n  protected readonly ArrowUpRight = ArrowUpRight\n  protected readonly CircleCheck = CircleCheck\n\n  protected readonly definitionRows = definitions\n  protected readonly sparkPoints = points(series)\n\n  @Input('class') className?: string\n\n  get rootClass(): string {\n    return cn('bg-background', this.className)\n  }\n}\n\nexport { points as bentoMetricsMixedPoints }\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/bento-metrics-mixed/bento-metrics-mixed.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/bento-metrics-mixed/index.ts",
      "content": "export { UiBentoMetricsMixedComponent, bentoMetricsMixedPoints } from './bento-metrics-mixed.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/bento-metrics-mixed/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/badge.json",
    "https://uipkge.dev/r/angular/button.json",
    "https://uipkge.dev/r/angular/card.json",
    "https://uipkge.dev/r/angular/separator.json"
  ],
  "description": "Five-tile bento mixing headline numbers, an inline sparkline, a short list, and a status tile, for the summary band beneath a hero.",
  "categories": [
    "marketing"
  ]
}