{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "usage-metering-dashboard",
  "title": "Usage Metering Dashboard",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/usage-metering-dashboard/usage-metering-dashboard.component.ts",
      "content": "// Real-time consumption metering and overage monitoring dashboard: billing cycle\n// tracking with days remaining, 4 resource meter cards with threshold progress bars and\n// projected month-end usage, projected invoice cost summary with overage breakdown,\n// auto-scale overage protection toggle, email alert threshold selector, and recent\n// usage events audit log. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, signal } from '@angular/core'\nimport {\n  Activity,\n  ArrowDownUp,\n  ArrowUpRight,\n  Cpu,\n  Database,\n  LucideAngularModule,\n  TriangleAlert,\n  Zap,\n} from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport {\n  UiCardComponent,\n  UiCardContentComponent,\n  UiCardDescriptionComponent,\n  UiCardHeaderComponent,\n  UiCardTitleComponent,\n} from '@/ui/card/card.component'\nimport { UiProgressComponent } from '@/ui/progress/progress.component'\nimport {\n  UiSelectComponent,\n  UiSelectContentComponent,\n  UiSelectItemComponent,\n  UiSelectTriggerComponent,\n  UiSelectValueComponent,\n} from '@/ui/select/select.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\nimport { UiSwitchComponent } from '@/ui/switch/switch.component'\nimport {\n  UiTableBodyComponent,\n  UiTableCellComponent,\n  UiTableComponent,\n  UiTableHeadComponent,\n  UiTableHeaderComponent,\n  UiTableRowComponent,\n} from '@/ui/table/table.component'\n\nexport interface UsageEvent {\n  id: string\n  timestamp: string\n  service: string\n  description: string\n  volume: string\n  status: 'warning' | 'normal'\n  statusLabel: string\n}\n\nconst events: UsageEvent[] = [\n  {\n    id: 'evt-1',\n    timestamp: 'Aug 18, 2026 14:22',\n    service: 'API Gateway',\n    description: 'Spike: Batch sync job',\n    volume: '+240,000 reqs',\n    status: 'warning',\n    statusLabel: 'High Spike',\n  },\n  {\n    id: 'evt-2',\n    timestamp: 'Aug 17, 2026 09:15',\n    service: 'Vector Storage',\n    description: 'Index re-indexing & optimization',\n    volume: '+12.4 GB',\n    status: 'normal',\n    statusLabel: 'Normal',\n  },\n  {\n    id: 'evt-3',\n    timestamp: 'Aug 16, 2026 22:40',\n    service: 'Compute Cluster',\n    description: 'Model inference burst job',\n    volume: '+85.0 hrs',\n    status: 'normal',\n    statusLabel: 'Normal',\n  },\n  {\n    id: 'evt-4',\n    timestamp: 'Aug 15, 2026 11:05',\n    service: 'CDN Edge',\n    description: 'Media cache invalidation & egress',\n    volume: '+64.2 GB',\n    status: 'normal',\n    statusLabel: 'Normal',\n  },\n  {\n    id: 'evt-5',\n    timestamp: 'Aug 14, 2026 18:30',\n    service: 'API Gateway',\n    description: 'Webhook delivery retry storm',\n    volume: '+180,000 reqs',\n    status: 'warning',\n    statusLabel: 'High Spike',\n  },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-usage-metering-dashboard, [ui-usage-metering-dashboard]',\n  standalone: true,\n  // React renders the root <div> 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    UiCardDescriptionComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiProgressComponent,\n    UiSelectComponent,\n    UiSelectContentComponent,\n    UiSelectItemComponent,\n    UiSelectTriggerComponent,\n    UiSelectValueComponent,\n    UiSeparatorComponent,\n    UiSwitchComponent,\n    UiTableBodyComponent,\n    UiTableCellComponent,\n    UiTableComponent,\n    UiTableHeadComponent,\n    UiTableHeaderComponent,\n    UiTableRowComponent,\n  ],\n  template: `\n    <div data-slot=\"usage-metering-dashboard\" [class]=\"rootClass\">\n      <div class=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n        <div class=\"space-y-1\">\n          <h1 class=\"text-foreground text-2xl font-bold tracking-tight sm:text-3xl\">Usage & Metering</h1>\n          <p class=\"text-muted-foreground text-sm\">\n            Monitor your organization's resource consumption and billing cycle limits.\n          </p>\n        </div>\n        <div class=\"flex items-center gap-2\">\n          <button ui-button variant=\"outline\" size=\"sm\" class=\"shrink-0 gap-1.5\">\n            <lucide-icon [img]=\"Zap\" class=\"fill-warning text-warning size-4\" />\n            <span>Change Plan</span>\n            <lucide-icon [img]=\"ArrowUpRight\" class=\"text-muted-foreground size-3.5\" />\n          </button>\n        </div>\n      </div>\n\n      <div ui-card class=\"bg-muted/30 p-4\">\n        <div class=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n          <div class=\"space-y-1\">\n            <div class=\"flex items-center gap-2\">\n              <span class=\"text-foreground text-sm font-semibold\">Current Billing Period</span>\n              <span ui-badge variant=\"outline\" class=\"text-xs font-normal\">Scale Plan — $199/mo</span>\n            </div>\n            <p class=\"text-muted-foreground text-xs tabular-nums\">\n              Day 18 of 30 · Current period ends Sep 1, 2026 (12 days remaining)\n            </p>\n          </div>\n          <div class=\"w-full space-y-1.5 sm:w-72\">\n            <div class=\"flex items-center justify-between gap-x-2 text-xs\">\n              <span class=\"text-muted-foreground\">Cycle Progress</span>\n              <span class=\"text-foreground font-medium tabular-nums\">60%</span>\n            </div>\n            <ui-progress [value]=\"60\" class=\"h-1.5\" />\n          </div>\n        </div>\n      </div>\n\n      <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n        <div ui-card class=\"flex flex-col justify-between\">\n          <div ui-card-header class=\"pb-3\">\n            <div class=\"flex items-center justify-between gap-2\">\n              <div class=\"flex min-w-0 items-center gap-2.5\">\n                <div\n                  class=\"bg-muted text-muted-foreground border-border flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                  aria-hidden=\"true\"\n                >\n                  <lucide-icon [img]=\"Activity\" class=\"size-4\" />\n                </div>\n                <h3 ui-card-title class=\"truncate text-sm font-medium\">API Requests</h3>\n              </div>\n              <span ui-badge variant=\"warning\" class=\"shrink-0 gap-1 text-xs\">\n                <lucide-icon [img]=\"TriangleAlert\" class=\"size-3\" />\n                <span>Approaching Limit</span>\n              </span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3\">\n            <div>\n              <div class=\"mb-1 flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5 text-xs\">\n                <span class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">1.84M</span>\n                <span class=\"text-muted-foreground tabular-nums\">/ 2.0M limit</span>\n              </div>\n              <ui-progress [value]=\"92\" class=\"[&_[data-slot=progress-indicator]]:bg-warning h-2\" />\n              <div class=\"mt-1.5 flex items-center justify-between gap-x-2 text-xs\">\n                <span class=\"text-muted-foreground tabular-nums\">92% utilized</span>\n                <span class=\"text-warning font-medium tabular-nums\">160K remaining</span>\n              </div>\n            </div>\n            <div class=\"border-border/60 border-t pt-2.5 text-xs\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <span class=\"text-muted-foreground\">Projected at month-end:</span>\n                <span class=\"text-foreground font-medium tabular-nums\">2.15M</span>\n              </div>\n              <p class=\"text-warning mt-0.5 text-xs font-medium tabular-nums\">+150K overage (~$15.00)</p>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"flex flex-col justify-between\">\n          <div ui-card-header class=\"pb-3\">\n            <div class=\"flex items-center justify-between gap-2\">\n              <div class=\"flex min-w-0 items-center gap-2.5\">\n                <div\n                  class=\"bg-muted text-muted-foreground border-border flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                  aria-hidden=\"true\"\n                >\n                  <lucide-icon [img]=\"Cpu\" class=\"size-4\" />\n                </div>\n                <h3 ui-card-title class=\"truncate text-sm font-medium\">Compute Hours</h3>\n              </div>\n              <span ui-badge variant=\"success\" class=\"shrink-0 text-xs\">Healthy</span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3\">\n            <div>\n              <div class=\"mb-1 flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5 text-xs\">\n                <span class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">420</span>\n                <span class=\"text-muted-foreground tabular-nums\">/ 1,000 hrs limit</span>\n              </div>\n              <ui-progress [value]=\"42\" class=\"[&_[data-slot=progress-indicator]]:bg-success h-2\" />\n              <div class=\"mt-1.5 flex items-center justify-between gap-x-2 text-xs\">\n                <span class=\"text-muted-foreground tabular-nums\">42% utilized</span>\n                <span class=\"text-muted-foreground tabular-nums\">580 hrs remaining</span>\n              </div>\n            </div>\n            <div class=\"border-border/60 border-t pt-2.5 text-xs\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <span class=\"text-muted-foreground\">Projected at month-end:</span>\n                <span class=\"text-foreground font-medium tabular-nums\">700 hrs</span>\n              </div>\n              <p class=\"text-muted-foreground mt-0.5 text-xs\">Within allowance (300 hrs headroom)</p>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"flex flex-col justify-between\">\n          <div ui-card-header class=\"pb-3\">\n            <div class=\"flex items-center justify-between gap-2\">\n              <div class=\"flex min-w-0 items-center gap-2.5\">\n                <div\n                  class=\"bg-muted text-muted-foreground border-border flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                  aria-hidden=\"true\"\n                >\n                  <lucide-icon [img]=\"Database\" class=\"size-4\" />\n                </div>\n                <h3 ui-card-title class=\"truncate text-sm font-medium\">Vector Storage</h3>\n              </div>\n              <span ui-badge variant=\"success\" class=\"shrink-0 text-xs\">Healthy</span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3\">\n            <div>\n              <div class=\"mb-1 flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5 text-xs\">\n                <span class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">78 GB</span>\n                <span class=\"text-muted-foreground tabular-nums\">/ 100 GB limit</span>\n              </div>\n              <ui-progress [value]=\"78\" class=\"h-2\" />\n              <div class=\"mt-1.5 flex items-center justify-between gap-x-2 text-xs\">\n                <span class=\"text-muted-foreground tabular-nums\">78% utilized</span>\n                <span class=\"text-muted-foreground tabular-nums\">22 GB remaining</span>\n              </div>\n            </div>\n            <div class=\"border-border/60 border-t pt-2.5 text-xs\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <span class=\"text-muted-foreground\">Projected at month-end:</span>\n                <span class=\"text-foreground font-medium tabular-nums\">84 GB</span>\n              </div>\n              <p class=\"text-muted-foreground mt-0.5 text-xs\">Within allowance (16 GB headroom)</p>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"flex flex-col justify-between\">\n          <div ui-card-header class=\"pb-3\">\n            <div class=\"flex items-center justify-between gap-2\">\n              <div class=\"flex min-w-0 items-center gap-2.5\">\n                <div\n                  class=\"bg-muted text-muted-foreground border-border flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                  aria-hidden=\"true\"\n                >\n                  <lucide-icon [img]=\"ArrowDownUp\" class=\"size-4\" />\n                </div>\n                <h3 ui-card-title class=\"truncate text-sm font-medium\">Bandwidth / Egress</h3>\n              </div>\n              <span ui-badge variant=\"success\" class=\"shrink-0 text-xs\">Healthy</span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3\">\n            <div>\n              <div class=\"mb-1 flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5 text-xs\">\n                <span class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">412 GB</span>\n                <span class=\"text-muted-foreground tabular-nums\">/ 500 GB limit</span>\n              </div>\n              <ui-progress [value]=\"82.4\" class=\"h-2\" />\n              <div class=\"mt-1.5 flex items-center justify-between gap-x-2 text-xs\">\n                <span class=\"text-muted-foreground tabular-nums\">82.4% utilized</span>\n                <span class=\"text-muted-foreground tabular-nums\">88 GB remaining</span>\n              </div>\n            </div>\n            <div class=\"border-border/60 border-t pt-2.5 text-xs\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <span class=\"text-muted-foreground\">Projected at month-end:</span>\n                <span class=\"text-foreground font-medium tabular-nums\">485 GB</span>\n              </div>\n              <p class=\"text-muted-foreground mt-0.5 text-xs\">Within allowance (15 GB headroom)</p>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n        <div ui-card>\n          <div ui-card-header>\n            <div class=\"flex items-center justify-between gap-x-2\">\n              <h3 ui-card-title>Projected Month-End Cost</h3>\n              <span ui-badge variant=\"warning\" class=\"gap-1 text-xs\">\n                <lucide-icon [img]=\"TriangleAlert\" class=\"size-3\" />\n                <span>Overage Projected</span>\n              </span>\n            </div>\n            <p ui-card-description>Estimated cycle total factoring base tier and current consumption trajectory.</p>\n          </div>\n          <div ui-card-content class=\"space-y-4\">\n            <div\n              class=\"border-border bg-muted/40 flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5 rounded-lg border p-4\"\n            >\n              <div>\n                <p class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">Projected Invoice</p>\n                <p class=\"text-foreground text-3xl font-bold tracking-tight tabular-nums\">$214.00</p>\n              </div>\n              <div class=\"text-right\">\n                <span class=\"text-muted-foreground text-xs\">\n                  Base Plan: <strong class=\"text-foreground font-semibold tabular-nums\">$199.00</strong>\n                </span>\n                <p class=\"text-warning text-xs font-semibold tabular-nums\">+$15.00 overage</p>\n              </div>\n            </div>\n\n            <div class=\"space-y-2.5 text-sm\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <span class=\"text-foreground\">Scale Plan Base Subscription</span>\n                <span class=\"text-foreground font-medium tabular-nums\">$199.00</span>\n              </div>\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <div class=\"flex items-center gap-1.5\">\n                  <span class=\"text-foreground\">API Requests Overage</span>\n                  <span ui-badge variant=\"outline\" class=\"text-xs font-normal\">150K @ $0.10 / 1K</span>\n                </div>\n                <span class=\"text-warning font-medium tabular-nums\">+$15.00</span>\n              </div>\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <span class=\"text-muted-foreground\">Compute Hours (1,000 hrs allowance)</span>\n                <span class=\"text-muted-foreground tabular-nums\">$0.00</span>\n              </div>\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <span class=\"text-muted-foreground\">Storage & Egress Bandwidth</span>\n                <span class=\"text-muted-foreground tabular-nums\">$0.00</span>\n              </div>\n            </div>\n\n            <div ui-separator></div>\n\n            <div class=\"text-muted-foreground flex items-center justify-between gap-x-2 text-xs\">\n              <span>Next scheduled invoice date</span>\n              <span class=\"text-foreground font-medium tabular-nums\">September 1, 2026</span>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card>\n          <div ui-card-header>\n            <h3 ui-card-title>Overage Protection & Alerts</h3>\n            <p ui-card-description>Configure notifications and automated guardrails before limits are breached.</p>\n          </div>\n          <div ui-card-content class=\"space-y-4\">\n            <div class=\"flex items-start justify-between gap-4\">\n              <div class=\"space-y-1\">\n                <label class=\"text-foreground text-sm leading-none font-medium\">Auto-scale Overage Protection</label>\n                <p class=\"text-muted-foreground text-xs leading-relaxed\">\n                  Automatically throttle or scale resources to prevent unexpected billing spikes beyond set allowances.\n                </p>\n              </div>\n              <ui-switch\n                [checked]=\"autoScaleProtection()\"\n                (checkedChange)=\"autoScaleProtection.set($event)\"\n                aria-label=\"Toggle auto-scale overage protection\"\n              />\n            </div>\n\n            <div ui-separator></div>\n\n            <div class=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n              <div class=\"space-y-1\">\n                <label class=\"text-foreground text-sm leading-none font-medium\">Email Alert Threshold</label>\n                <p class=\"text-muted-foreground text-xs\">\n                  Notify workspace admins when any metric crosses this percentage.\n                </p>\n              </div>\n              <ui-select [value]=\"alertThreshold()\" (valueChange)=\"alertThreshold.set($event)\">\n                <button ui-select-trigger class=\"w-full text-xs sm:w-44\" aria-label=\"Email alert threshold\">\n                  <ui-select-value placeholder=\"Select threshold\" />\n                </button>\n                <ui-select-content>\n                  <ui-select-item value=\"80\">80% of limit</ui-select-item>\n                  <ui-select-item value=\"90\">90% of limit</ui-select-item>\n                  <ui-select-item value=\"100\">100% of limit</ui-select-item>\n                </ui-select-content>\n              </ui-select>\n            </div>\n\n            <div ui-separator></div>\n\n            <div class=\"bg-muted/40 border-border space-y-1.5 rounded-lg border p-3\">\n              <div class=\"flex items-center justify-between gap-x-2 text-xs\">\n                <span class=\"text-muted-foreground\">Hard Spending Cap</span>\n                <span class=\"text-foreground font-semibold tabular-nums\">$300.00 / mo</span>\n              </div>\n              <div class=\"flex items-center justify-between gap-x-2 text-xs\">\n                <span class=\"text-muted-foreground\">Recipients</span>\n                <span class=\"text-muted-foreground truncate\">billing-alerts@acme.corp</span>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div ui-card>\n        <div ui-card-header>\n          <div class=\"flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between\">\n            <div>\n              <h3 ui-card-title>Recent Usage Events</h3>\n              <p ui-card-description>\n                High-volume consumption spikes and automated resource scaling events this cycle.\n              </p>\n            </div>\n            <span ui-badge variant=\"outline\" class=\"w-fit text-xs font-normal tabular-nums\">5 events logged</span>\n          </div>\n        </div>\n        <div ui-card-content class=\"p-0 sm:p-6 sm:pt-0\">\n          <div class=\"overflow-x-auto\">\n            <table ui-table>\n              <thead ui-table-header>\n                <tr ui-table-row>\n                  <th ui-table-head>Timestamp</th>\n                  <th ui-table-head>Service</th>\n                  <th ui-table-head>Event Description</th>\n                  <th ui-table-head class=\"text-right\">Volume</th>\n                  <th ui-table-head class=\"text-right\">Status</th>\n                </tr>\n              </thead>\n              <tbody ui-table-body>\n                @for (event of usageEvents; track event.id) {\n                  <tr ui-table-row>\n                    <td ui-table-cell class=\"text-muted-foreground text-xs whitespace-nowrap tabular-nums\">\n                      {{ event.timestamp }}\n                    </td>\n                    <td ui-table-cell class=\"text-foreground text-xs font-medium whitespace-nowrap\">\n                      {{ event.service }}\n                    </td>\n                    <td ui-table-cell class=\"text-muted-foreground text-xs\">{{ event.description }}</td>\n                    <td\n                      ui-table-cell\n                      class=\"text-foreground text-right text-xs font-medium whitespace-nowrap tabular-nums\"\n                    >\n                      {{ event.volume }}\n                    </td>\n                    <td ui-table-cell class=\"text-right\">\n                      <span\n                        ui-badge\n                        [variant]=\"event.status === 'warning' ? 'warning' : 'success'\"\n                        class=\"text-xs whitespace-normal\"\n                      >\n                        {{ event.statusLabel }}\n                      </span>\n                    </td>\n                  </tr>\n                }\n              </tbody>\n            </table>\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class UiUsageMeteringDashboardComponent {\n  protected readonly Activity = Activity\n  protected readonly ArrowDownUp = ArrowDownUp\n  protected readonly ArrowUpRight = ArrowUpRight\n  protected readonly Cpu = Cpu\n  protected readonly Database = Database\n  protected readonly TriangleAlert = TriangleAlert\n  protected readonly Zap = Zap\n\n  protected readonly usageEvents = events\n\n  @Input('class') className?: string\n  @Input() set initialAutoScaleProtection(v: boolean | undefined) {\n    if (v !== undefined) this.autoScaleProtection.set(v)\n  }\n  @Input() set initialAlertThreshold(v: string | undefined) {\n    if (v) this.alertThreshold.set(v)\n  }\n\n  readonly autoScaleProtection = signal(true)\n  readonly alertThreshold = signal('90')\n\n  get rootClass(): string {\n    return cn('mx-auto w-full max-w-6xl space-y-6', this.className)\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/usage-metering-dashboard/usage-metering-dashboard.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/usage-metering-dashboard/index.ts",
      "content": "export { UiUsageMeteringDashboardComponent, type UsageEvent } from './usage-metering-dashboard.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/usage-metering-dashboard/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/progress.json",
    "https://uipkge.dev/r/angular/select.json",
    "https://uipkge.dev/r/angular/separator.json",
    "https://uipkge.dev/r/angular/switch.json",
    "https://uipkge.dev/r/angular/table.json"
  ],
  "description": "Real-time consumption metering and overage monitoring dashboard: billing cycle tracking with days remaining, 4 key resource meter cards (API requests, compute hours, vector storage, bandwidth) with color-shifting threshold progress bars and projected month-end usage, projected invoice cost summary with overage breakdown, auto-scale overage protection toggle, email alert threshold selector, and recent usage events audit log.",
  "categories": [
    "finance",
    "billing",
    "app"
  ]
}