{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "record-detail-page",
  "title": "Record Detail Page",
  "type": "registry:page",
  "files": [
    {
      "path": "packages/registry-angular/blocks/record-detail-page/record-detail-page.component.ts",
      "content": "// Admin record detail page: breadcrumb header with status badge and Edit / Delete\n// actions, two-column layout with a summary card (avatar, identity, key metrics),\n// Details / Activity tabs (labeled description-list sections and an icon timeline feed),\n// plus a side panel with owner metadata, relative timestamps, tag badges, and a\n// recent-orders mini list. All data is hardcoded inline for you to replace.\n// Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core'\nimport {\n  Building2,\n  ChevronRight,\n  CreditCard,\n  FileText,\n  LucideAngularModule,\n  Mail,\n  MessageSquare,\n  Pencil,\n  Plus,\n  ReceiptText,\n  Trash2,\n  UserPlus,\n  type LucideIconData,\n} from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiAvatarComponent, UiAvatarFallbackComponent, UiAvatarImageComponent } from '@/ui/avatar/avatar.component'\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 { UiSeparatorComponent } from '@/ui/separator/separator.component'\nimport {\n  UiTabsComponent,\n  UiTabsContentComponent,\n  UiTabsListComponent,\n  UiTabsTriggerComponent,\n} from '@/ui/tabs/tabs.component'\n\ninterface DataListRow {\n  label: string\n  value: string\n}\n\ninterface Section {\n  title: string\n  icon: LucideIconData\n  rows: DataListRow[]\n}\n\ninterface ActivityEvent {\n  icon: LucideIconData\n  sentence: string\n  time: string\n}\n\ninterface Order {\n  id: string\n  amount: string\n  status: 'Paid' | 'Pending' | 'Refunded'\n}\n\nconst summaryRows: DataListRow[] = [\n  { label: 'Account ID', value: 'CUS-004182' },\n  { label: 'Plan', value: 'Business annual' },\n  { label: 'Lifetime value', value: '$48,200' },\n]\n\nconst sections: Section[] = [\n  {\n    title: 'Contact',\n    icon: Mail,\n    rows: [\n      { label: 'Email', value: 'billing@acmecorp.com' },\n      { label: 'Phone', value: '+1 (415) 555-0134' },\n      { label: 'Website', value: 'acmecorp.com' },\n      { label: 'Address', value: '500 Market St, San Francisco, CA' },\n    ],\n  },\n  {\n    title: 'Company',\n    icon: Building2,\n    rows: [\n      { label: 'Industry', value: 'Logistics & supply chain' },\n      { label: 'Employees', value: '240–500' },\n      { label: 'Tax ID', value: 'US-84-2917365' },\n      { label: 'Payment terms', value: 'Net 30' },\n    ],\n  },\n]\n\nconst activity: ActivityEvent[] = [\n  { icon: ReceiptText, sentence: 'Invoice INV-2091 paid — $12,400', time: '2h ago' },\n  { icon: MessageSquare, sentence: 'Priya left a note on the renewal deal', time: 'Yesterday' },\n  { icon: UserPlus, sentence: 'Dana Whitfield added as billing contact', time: '3d ago' },\n  { icon: FileText, sentence: 'Contract Q3-amendment.pdf uploaded', time: '1w ago' },\n]\n\nconst tags = ['enterprise', 'renewal-q4', 'priority-support']\n\nconst orders: Order[] = [\n  { id: 'ORD-8841', amount: '$12,400.00', status: 'Paid' },\n  { id: 'ORD-8790', amount: '$3,180.50', status: 'Pending' },\n  { id: 'ORD-8612', amount: '$940.00', status: 'Refunded' },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-record-detail-page, [ui-record-detail-page]',\n  standalone: true,\n  // The block renders its own root <div>: keep this wrapper out of the layout.\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [\n    LucideAngularModule,\n    UiAvatarComponent,\n    UiAvatarFallbackComponent,\n    UiAvatarImageComponent,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardDescriptionComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiSeparatorComponent,\n    UiTabsComponent,\n    UiTabsContentComponent,\n    UiTabsListComponent,\n    UiTabsTriggerComponent,\n  ],\n  template: `\n    <div data-slot=\"record-detail-page\" [class]=\"rootClass\">\n      <div class=\"flex flex-wrap items-center justify-between gap-4\">\n        <div class=\"flex min-w-0 items-center gap-1.5\">\n          <button ui-button variant=\"link\" size=\"sm\" class=\"text-muted-foreground h-auto min-h-6 px-0\">\n            Customers\n          </button>\n          <lucide-icon [img]=\"ChevronRight\" class=\"text-muted-foreground size-4 shrink-0\" aria-hidden=\"true\" />\n          <span class=\"truncate text-sm font-semibold\">Acme Corp</span>\n          <span ui-badge variant=\"secondary\" class=\"ml-2\">Active</span>\n        </div>\n        <div class=\"flex items-center gap-2\">\n          <button ui-button variant=\"outline\" size=\"sm\">\n            <lucide-icon [img]=\"Pencil\" class=\"size-4\" aria-hidden=\"true\" />\n            Edit\n          </button>\n          <button ui-button variant=\"outline\" size=\"sm\" class=\"text-destructive hover:text-destructive\">\n            <lucide-icon [img]=\"Trash2\" class=\"size-4\" aria-hidden=\"true\" />\n            Delete\n          </button>\n        </div>\n      </div>\n\n      <div class=\"mt-6 grid gap-6 lg:grid-cols-3\">\n        <div class=\"space-y-6 lg:col-span-2\">\n          <div ui-card>\n            <div ui-card-header class=\"flex-row items-center gap-4 space-y-0\">\n              <ui-avatar size=\"2xl\" class=\"size-14\">\n                <ui-avatar-image src=\"https://i.pravatar.cc/112?img=32\" alt=\"Acme Corp logo\" />\n                <ui-avatar-fallback>AC</ui-avatar-fallback>\n              </ui-avatar>\n              <div class=\"min-w-0\">\n                <h3 ui-card-title class=\"text-lg\">Acme Corp</h3>\n                <p ui-card-description class=\"truncate\">billing&#64;acmecorp.com · Customer since March 2023</p>\n              </div>\n            </div>\n            <div ui-card-content>\n              <ui-separator class=\"mb-4\" />\n              <dl class=\"grid gap-x-8 gap-y-3 sm:grid-cols-3\">\n                @for (row of summaryRows; track row.label) {\n                  <div>\n                    <dt class=\"text-muted-foreground text-xs\">{{ row.label }}</dt>\n                    <dd class=\"mt-0.5 text-sm font-medium\">{{ row.value }}</dd>\n                  </div>\n                }\n              </dl>\n            </div>\n          </div>\n\n          <ui-tabs defaultValue=\"details\">\n            <ui-tabs-list>\n              <button ui-tabs-trigger value=\"details\">Details</button>\n              <button ui-tabs-trigger value=\"activity\">Activity</button>\n            </ui-tabs-list>\n\n            <ui-tabs-content value=\"details\" class=\"space-y-6 pt-4\">\n              @for (section of sections; track section.title) {\n                <section>\n                  <h3 class=\"flex items-center gap-2 text-sm font-semibold\">\n                    <lucide-icon [img]=\"section.icon\" class=\"text-muted-foreground size-4\" aria-hidden=\"true\" />\n                    {{ section.title }}\n                  </h3>\n                  <dl class=\"border-border mt-3 divide-y rounded-lg border\">\n                    @for (row of section.rows; track row.label) {\n                      <div class=\"px-4 py-2.5 sm:flex sm:items-center sm:gap-4\">\n                        <dt class=\"text-muted-foreground text-xs sm:w-36 sm:text-sm\">{{ row.label }}</dt>\n                        <dd class=\"mt-0.5 text-sm font-medium sm:mt-0\">{{ row.value }}</dd>\n                      </div>\n                    }\n                  </dl>\n                </section>\n              }\n            </ui-tabs-content>\n\n            <ui-tabs-content value=\"activity\" class=\"pt-4\">\n              <ol\n                class=\"before:bg-border relative space-y-6 before:absolute before:inset-y-1 before:left-[15px] before:w-px\"\n              >\n                @for (event of activity; track event.sentence) {\n                  <li class=\"relative flex items-start gap-4 pl-0\">\n                    <span\n                      class=\"bg-background ring-border relative z-10 flex size-8 shrink-0 items-center justify-center rounded-full ring-1\"\n                    >\n                      <lucide-icon [img]=\"event.icon\" class=\"text-muted-foreground size-4\" aria-hidden=\"true\" />\n                    </span>\n                    <div class=\"min-w-0 pt-1\">\n                      <p class=\"truncate text-sm\">{{ event.sentence }}</p>\n                      <time class=\"text-muted-foreground text-xs\">{{ event.time }}</time>\n                    </div>\n                  </li>\n                }\n              </ol>\n            </ui-tabs-content>\n          </ui-tabs>\n        </div>\n\n        <div class=\"space-y-6\">\n          <div ui-card>\n            <div ui-card-header>\n              <h3 ui-card-title class=\"text-sm font-medium\">Record meta</h3>\n            </div>\n            <div ui-card-content class=\"space-y-4\">\n              <div class=\"flex items-center gap-3\">\n                <ui-avatar class=\"size-8\">\n                  <ui-avatar-image src=\"https://i.pravatar.cc/64?img=47\" alt=\"Priya Raman\" />\n                  <ui-avatar-fallback>PR</ui-avatar-fallback>\n                </ui-avatar>\n                <div class=\"min-w-0\">\n                  <p class=\"text-muted-foreground text-xs\">Owner</p>\n                  <p class=\"truncate text-sm font-medium\">Priya Raman</p>\n                </div>\n              </div>\n              <ui-separator />\n              <dl class=\"space-y-3\">\n                <div class=\"flex items-center justify-between gap-4\">\n                  <dt class=\"text-muted-foreground text-xs\">Created</dt>\n                  <dd class=\"text-sm font-medium\">Mar 14, 2023</dd>\n                </div>\n                <div class=\"flex items-center justify-between gap-4\">\n                  <dt class=\"text-muted-foreground text-xs\">Updated</dt>\n                  <dd class=\"text-sm font-medium\">2 hours ago</dd>\n                </div>\n              </dl>\n              <ui-separator />\n              <div>\n                <p class=\"text-muted-foreground mb-2 text-xs\">Tags</p>\n                <div class=\"flex flex-wrap gap-1.5\">\n                  @for (tag of tags; track tag) {\n                    <span ui-badge variant=\"secondary\">{{ tag }}</span>\n                  }\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <div ui-card>\n            <div ui-card-header class=\"flex-row items-center justify-between space-y-0\">\n              <h3 ui-card-title class=\"text-sm font-medium\">Recent orders</h3>\n              <button ui-button variant=\"ghost\" size=\"icon\" aria-label=\"View all orders\">\n                <lucide-icon [img]=\"CreditCard\" class=\"size-4\" aria-hidden=\"true\" />\n              </button>\n            </div>\n            <div ui-card-content>\n              <ul class=\"divide-y\">\n                @for (order of orders; track order.id) {\n                  <li class=\"flex items-center gap-3 py-2.5 first:pt-0 last:pb-0\">\n                    <span class=\"font-mono text-xs\">{{ order.id }}</span>\n                    <span class=\"text-muted-foreground ml-auto text-sm tabular-nums\">{{ order.amount }}</span>\n                    <span\n                      ui-badge\n                      [variant]=\"\n                        order.status === 'Paid' ? 'default' : order.status === 'Pending' ? 'secondary' : 'outline'\n                      \"\n                      class=\"min-w-[72px] justify-center\"\n                    >\n                      {{ order.status }}\n                    </span>\n                  </li>\n                }\n              </ul>\n              <button ui-button variant=\"outline\" size=\"sm\" class=\"mt-4 w-full\">\n                <lucide-icon [img]=\"Plus\" class=\"size-4\" aria-hidden=\"true\" />\n                New order\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class UiRecordDetailPageComponent {\n  protected readonly ChevronRight = ChevronRight\n  protected readonly CreditCard = CreditCard\n  protected readonly Pencil = Pencil\n  protected readonly Plus = Plus\n  protected readonly Trash2 = Trash2\n  protected readonly summaryRows = summaryRows\n  protected readonly sections = sections\n  protected readonly activity = activity\n  protected readonly tags = tags\n  protected readonly orders = orders\n\n  @Input('class') className?: string\n\n  get rootClass(): string {\n    return cn('bg-background text-foreground w-full', this.className)\n  }\n}\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/record-detail-page/record-detail-page.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/record-detail-page/index.ts",
      "content": "export { UiRecordDetailPageComponent } from './record-detail-page.component'\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/record-detail-page/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/avatar.json",
    "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",
    "https://uipkge.dev/r/angular/tabs.json"
  ],
  "description": "Admin record detail page: breadcrumb header with status badge and Edit / Delete actions, two-column layout with a summary card (avatar, identity, key metrics), Details / Activity tabs (labeled description-list sections and an icon timeline feed), plus a side panel with owner metadata, relative timestamps, tag badges, and a recent-orders mini list. All data is hardcoded inline for you to replace.",
  "categories": [
    "layout",
    "app"
  ]
}