{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "api-documentation-page",
  "title": "Api Documentation Page",
  "type": "registry:page",
  "files": [
    {
      "path": "packages/registry-angular/blocks/api-documentation-page/api-documentation-page.component.ts",
      "content": "// Stripe and Mintlify style two-pane API documentation reference page: HTTP method badge,\n// endpoint path, request header/body schema tables, response attributes, interactive\n// multi-language request snippets (cURL, Node.js, Python, Go, Ruby) and status response tabs\n// with copy actions. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, DestroyRef, Input, inject, signal } from '@angular/core'\nimport {\n  Check,\n  Copy,\n  CornerDownRight,\n  Globe,\n  LucideAngularModule,\n  Server,\n  ShieldCheck,\n  Terminal,\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 { UiSeparatorComponent } from '@/ui/separator/separator.component'\nimport {\n  UiTableBodyComponent,\n  UiTableCellComponent,\n  UiTableComponent,\n  UiTableHeadComponent,\n  UiTableHeaderComponent,\n  UiTableRowComponent,\n} from '@/ui/table/table.component'\n\nexport type ApiDocLanguage = 'curl' | 'node' | 'python' | 'go' | 'ruby'\nexport type ApiDocStatus = '200' | '400' | '401'\n\nexport interface ApiDocHeader {\n  name: string\n  type: string\n  required: boolean\n  sample: string\n  description: string\n}\n\nexport interface ApiDocNestedParam {\n  name: string\n  type: string\n  required: boolean\n  description: string\n  example?: string\n}\n\nexport interface ApiDocBodyParam {\n  name: string\n  type: string\n  required: boolean\n  description: string\n  example?: string\n  nested?: ApiDocNestedParam[]\n}\n\nexport interface ApiDocResponseAttr {\n  name: string\n  type: string\n  description: string\n  example: string\n}\n\nexport interface ApiDocStatusPill {\n  code: ApiDocStatus\n  label: string\n  summary: string\n  dotColor: string\n}\n\nconst headersList: ApiDocHeader[] = [\n  {\n    name: 'Authorization',\n    type: 'string',\n    required: true,\n    sample: 'Bearer uipkge_live_51Msz...',\n    description: 'Secret API key prefixed with uipkge_live_ or sk_test_. Pass in the HTTP Authorization header.',\n  },\n  {\n    name: 'Content-Type',\n    type: 'string',\n    required: true,\n    sample: 'application/json',\n    description: 'Specifies the media type of the request body. Must be application/json.',\n  },\n  {\n    name: 'Idempotency-Key',\n    type: 'string (UUID)',\n    required: false,\n    sample: '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d',\n    description: 'Unique client-generated key that prevents duplicate executions if a request is retried.',\n  },\n]\n\nconst bodyParams: ApiDocBodyParam[] = [\n  {\n    name: 'customer_id',\n    type: 'string',\n    required: true,\n    description: 'Unique customer identifier for the subscriber. Must begin with the prefix cus_.',\n    example: '\"cus_N63vKZbI8O8yWp\"',\n  },\n  {\n    name: 'plan_id',\n    type: 'string',\n    required: true,\n    description: 'Identifier of the subscription tier to enroll the customer into.',\n    example: '\"plan_pro_monthly\"',\n  },\n  {\n    name: 'items',\n    type: 'array of objects',\n    required: true,\n    description: 'List of subscription line items defining the base plan and any optional recurring addons.',\n    nested: [\n      {\n        name: 'items[].price_id',\n        type: 'string',\n        required: true,\n        description: 'Unique price object identifier corresponding to a catalog product.',\n        example: '\"price_1Msz82eZvKYlo2C\"',\n      },\n      {\n        name: 'items[].quantity',\n        type: 'integer',\n        required: false,\n        description: 'Unit quantity of the specified price item. Defaults to 1 if omitted.',\n        example: '1',\n      },\n    ],\n  },\n  {\n    name: 'payment_method_id',\n    type: 'string',\n    required: false,\n    description: 'Attached payment method ID (pm_...) to charge. If omitted, uses the customer default payment source.',\n    example: '\"pm_1OdVq82eZvKYlo2C\"',\n  },\n  {\n    name: 'billing_cycle_anchor',\n    type: 'integer (timestamp)',\n    required: false,\n    description: 'Future Unix timestamp that marks the beginning of recurring billing cycles.',\n    example: '1717200000',\n  },\n  {\n    name: 'trial_period_days',\n    type: 'integer',\n    required: false,\n    description: 'Number of zero-charge trial days before regular billing begins (1 to 90).',\n    example: '14',\n  },\n  {\n    name: 'coupon_code',\n    type: 'string',\n    required: false,\n    description: 'Valid discount or promotional coupon applied to initial invoices.',\n    example: '\"LAUNCH2026\"',\n  },\n  {\n    name: 'metadata',\n    type: 'object',\n    required: false,\n    description: 'Arbitrary key-value map for attribution and custom IDs. Supports up to 50 keys, max 500 chars/value.',\n    example: '{\"referrer\": \"onboarding_flow\"}',\n  },\n]\n\nconst responseAttributes: ApiDocResponseAttr[] = [\n  {\n    name: 'id',\n    type: 'string',\n    description: 'Unique identifier for the subscription entity, prefixed with sub_.',\n    example: '\"sub_1Om48B2eZvKYlo2CqO8k2\"',\n  },\n  {\n    name: 'object',\n    type: 'string',\n    description: 'String representing the object type. Always subscription.',\n    example: '\"subscription\"',\n  },\n  {\n    name: 'customer',\n    type: 'string',\n    description: 'Customer identifier associated with this subscription record.',\n    example: '\"cus_N63vKZbI8O8yWp\"',\n  },\n  {\n    name: 'status',\n    type: 'string',\n    description: 'Current lifecycle status: trialing, active, past_due, canceled, unpaid, or incomplete.',\n    example: '\"trialing\"',\n  },\n  {\n    name: 'current_period_start',\n    type: 'integer (timestamp)',\n    description: 'Unix timestamp marking the start of the current active billing cycle.',\n    example: '1717200000',\n  },\n  {\n    name: 'current_period_end',\n    type: 'integer (timestamp)',\n    description: 'Unix timestamp marking the end of the current cycle and scheduled renewal date.',\n    example: '1719792000',\n  },\n  {\n    name: 'trial_end',\n    type: 'integer (timestamp) | null',\n    description: 'Unix timestamp when the free trial period concludes and billing begins.',\n    example: '1718409600',\n  },\n  {\n    name: 'cancel_at_period_end',\n    type: 'boolean',\n    description: 'If true, the subscription will terminate automatically at the end of the current period.',\n    example: 'false',\n  },\n  {\n    name: 'latest_invoice',\n    type: 'string',\n    description: 'Identifier of the most recent invoice generated for this subscription (in_...).',\n    example: '\"in_1Om48B2eZvKYlo2Cj891\"',\n  },\n]\n\nconst statusPills: ApiDocStatusPill[] = [\n  {\n    code: '200',\n    label: '200 OK',\n    summary: 'Subscription created successfully. Returns full subscription entity.',\n    dotColor: 'bg-success',\n  },\n  {\n    code: '400',\n    label: '400 Bad Request',\n    summary: 'Missing required parameters or malformed JSON payload.',\n    dotColor: 'bg-warning',\n  },\n  {\n    code: '401',\n    label: '401 Unauthorized',\n    summary: 'Missing, expired, or invalid Bearer secret API key.',\n    dotColor: 'bg-destructive',\n  },\n]\n\nconst requestSnippets: Record<ApiDocLanguage, string> = {\n  curl: `curl -X POST https://api.acme.com/v1/customers/subscriptions \\\\\n  -H \"Authorization: Bearer uipkge_live_51Msz...\" \\\\\n  -H \"Content-Type: application/json\" \\\\\n  -H \"Idempotency-Key: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d\" \\\\\n  -d '{\n    \"customer_id\": \"cus_N63vKZbI8O8yWp\",\n    \"plan_id\": \"plan_pro_monthly\",\n    \"payment_method_id\": \"pm_1OdVq82eZvKYlo2C\",\n    \"billing_cycle_anchor\": 1717200000,\n    \"items\": [\n      {\n        \"price_id\": \"price_1Msz82eZvKYlo2C\",\n        \"quantity\": 1\n      },\n      {\n        \"price_id\": \"price_addon_seats_pro\",\n        \"quantity\": 5\n      }\n    ],\n    \"trial_period_days\": 14,\n    \"coupon_code\": \"LAUNCH2026\",\n    \"metadata\": {\n      \"referrer\": \"onboarding_flow\",\n      \"account_manager\": \"priya.raman\"\n    }\n  }'`,\n  node: `import Acme from '@acme/sdk'\n\nconst acme = new Acme({\n  apiKey: process.env.ACME_SECRET_KEY,\n})\n\nconst subscription = await acme.subscriptions.create({\n  customerId: 'cus_N63vKZbI8O8yWp',\n  planId: 'plan_pro_monthly',\n  paymentMethodId: 'pm_1OdVq82eZvKYlo2C',\n  billingCycleAnchor: 1717200000,\n  items: [\n    { priceId: 'price_1Msz82eZvKYlo2C', quantity: 1 },\n    { priceId: 'price_addon_seats_pro', quantity: 5 },\n  ],\n  trialPeriodDays: 14,\n  couponCode: 'LAUNCH2026',\n  metadata: {\n    referrer: 'onboarding_flow',\n    accountManager: 'priya.raman',\n  },\n}, {\n  idempotencyKey: '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d',\n})\n\nconsole.log(subscription.id)`,\n  python: `import os\nimport acme\n\nacme.api_key = os.environ.get(\"ACME_SECRET_KEY\")\n\nsubscription = acme.Subscription.create(\n    customer_id=\"cus_N63vKZbI8O8yWp\",\n    plan_id=\"plan_pro_monthly\",\n    payment_method_id=\"pm_1OdVq82eZvKYlo2C\",\n    billing_cycle_anchor=1717200000,\n    items=[\n        {\"price_id\": \"price_1Msz82eZvKYlo2C\", \"quantity\": 1},\n        {\"price_id\": \"price_addon_seats_pro\", \"quantity\": 5},\n    ],\n    trial_period_days=14,\n    coupon_code=\"LAUNCH2026\",\n    metadata={\n        \"referrer\": \"onboarding_flow\",\n        \"account_manager\": \"priya.raman\",\n    },\n    idempotency_key=\"9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d\",\n)\n\nprint(subscription.id)`,\n  go: `package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/acme/acme-go\"\n)\n\nfunc main() {\n\tclient := acme.NewClient(os.Getenv(\"ACME_SECRET_KEY\"))\n\n\tparams := &acme.SubscriptionCreateParams{\n\t\tCustomerID:      acme.String(\"cus_N63vKZbI8O8yWp\"),\n\t\tPlanID:          acme.String(\"plan_pro_monthly\"),\n\t\tPaymentMethodID: acme.String(\"pm_1OdVq82eZvKYlo2C\"),\n\t\tItems: []*acme.SubscriptionItemParams{\n\t\t\t{PriceID: acme.String(\"price_1Msz82eZvKYlo2C\"), Quantity: acme.Int64(1)},\n\t\t\t{PriceID: acme.String(\"price_addon_seats_pro\"), Quantity: acme.Int64(5)},\n\t\t},\n\t\tTrialPeriodDays: acme.Int64(14),\n\t\tCouponCode:      acme.String(\"LAUNCH2026\"),\n\t\tMetadata: map[string]string{\n\t\t\t\"referrer\":        \"onboarding_flow\",\n\t\t\t\"account_manager\": \"priya.raman\",\n\t\t},\n\t}\n\n\tsub, err := client.Subscriptions.New(context.Background(), params)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Printf(\"Created subscription: %s\\\\n\", sub.ID)\n}`,\n  ruby: `require \"acme\"\n\nAcme.api_key = ENV[\"ACME_SECRET_KEY\"]\n\nsubscription = Acme::Subscription.create(\n  {\n    customer_id: \"cus_N63vKZbI8O8yWp\",\n    plan_id: \"plan_pro_monthly\",\n    payment_method_id: \"pm_1OdVq82eZvKYlo2C\",\n    billing_cycle_anchor: 1717200000,\n    items: [\n      { price_id: \"price_1Msz82eZvKYlo2C\", quantity: 1 },\n      { price_id: \"price_addon_seats_pro\", quantity: 5 }\n    ],\n    trial_period_days: 14,\n    coupon_code: \"LAUNCH2026\",\n    metadata: {\n      referrer: \"onboarding_flow\",\n      account_manager: \"priya.raman\"\n    }\n  },\n  { idempotency_key: \"9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d\" }\n)\n\nputs subscription.id`,\n}\n\nconst responseSnippets: Record<ApiDocStatus, string> = {\n  '200': `{\n  \"id\": \"sub_1Om48B2eZvKYlo2CqO8k2\",\n  \"object\": \"subscription\",\n  \"customer\": \"cus_N63vKZbI8O8yWp\",\n  \"status\": \"trialing\",\n  \"plan\": {\n    \"id\": \"plan_pro_monthly\",\n    \"name\": \"Pro Tier Monthly\",\n    \"amount\": 4900,\n    \"currency\": \"usd\",\n    \"interval\": \"month\"\n  },\n  \"items\": {\n    \"object\": \"list\",\n    \"data\": [\n      {\n        \"id\": \"si_98f12a3bc4d5\",\n        \"price\": \"price_1Msz82eZvKYlo2C\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"si_98f12a3bc4d6\",\n        \"price\": \"price_addon_seats_pro\",\n        \"quantity\": 5\n      }\n    ],\n    \"total_count\": 2\n  },\n  \"current_period_start\": 1717200000,\n  \"current_period_end\": 1719792000,\n  \"trial_start\": 1717200000,\n  \"trial_end\": 1718409600,\n  \"cancel_at_period_end\": false,\n  \"latest_invoice\": \"in_1Om48B2eZvKYlo2Cj891\",\n  \"metadata\": {\n    \"account_manager\": \"priya.raman\",\n    \"referrer\": \"onboarding_flow\"\n  },\n  \"created_at\": 1717200000\n}`,\n  '400': `{\n  \"error\": {\n    \"type\": \"invalid_request_error\",\n    \"code\": \"parameter_missing\",\n    \"param\": \"customer_id\",\n    \"message\": \"Missing required param: customer_id. Please provide a valid customer identifier.\",\n    \"doc_url\": \"https://api.acme.com/docs/errors#parameter_missing\"\n  }\n}`,\n  '401': `{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"Invalid API Key provided: uipkge_live_51Msz... Check your secret key in dashboard.\",\n    \"doc_url\": \"https://api.acme.com/docs/errors#authentication\"\n  }\n}`,\n}\n\nconst ENDPOINT_URL = 'https://api.acme.com/v1/customers/subscriptions'\nconst ENDPOINT_PATH = '/v1/customers/subscriptions'\n\ninterface LanguageOption {\n  value: ApiDocLanguage\n  label: string\n}\n\nconst languageOptions: LanguageOption[] = [\n  { value: 'curl', label: 'cURL' },\n  { value: 'node', label: 'Node.js' },\n  { value: 'python', label: 'Python' },\n  { value: 'go', label: 'Go' },\n  { value: 'ruby', label: 'Ruby' },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-api-documentation-page, [ui-api-documentation-page]',\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    UiSeparatorComponent,\n    UiTableBodyComponent,\n    UiTableCellComponent,\n    UiTableComponent,\n    UiTableHeadComponent,\n    UiTableHeaderComponent,\n    UiTableRowComponent,\n  ],\n  template: `\n    <div data-slot=\"api-documentation-page\" [class]=\"rootClass\">\n      <!-- Top Reference Navigation Bar -->\n      <header\n        class=\"border-border bg-card/60 flex flex-wrap items-center justify-between gap-4 border-b px-4 py-3 sm:px-6\"\n      >\n        <div class=\"flex flex-wrap items-center gap-3\">\n          <div class=\"bg-primary/10 text-primary flex size-8 items-center justify-center rounded-lg\">\n            <lucide-icon [img]=\"Server\" class=\"size-4\" />\n          </div>\n          <div class=\"flex items-center gap-2\">\n            <span class=\"text-foreground text-xs font-semibold\">Acme Billing API</span>\n            <span class=\"text-muted-foreground text-xs\">/</span>\n            <span class=\"text-muted-foreground text-xs\">Subscriptions</span>\n            <span ui-badge variant=\"secondary\" class=\"font-mono text-xs font-normal\">v2026-03-01</span>\n          </div>\n        </div>\n\n        <div class=\"flex flex-wrap items-center gap-2\">\n          <div class=\"border-border bg-background/80 flex items-center gap-2 rounded-md border px-2.5 py-1 text-xs\">\n            <span class=\"bg-success size-2 rounded-full\"></span>\n            <span class=\"text-muted-foreground font-mono text-xs\">Base:</span>\n            <span class=\"font-mono font-medium\">https://api.acme.com/v1</span>\n          </div>\n          <button ui-button variant=\"outline\" size=\"sm\" class=\"h-7 gap-1.5 text-xs\" (click)=\"copyEndpoint()\">\n            @if (copiedEndpoint()) {\n              <lucide-icon [img]=\"Check\" class=\"text-success size-3\" />\n            } @else {\n              <lucide-icon [img]=\"Copy\" class=\"size-3\" />\n            }\n            {{ copiedEndpoint() ? 'Copied URL' : 'Copy Base URL' }}\n          </button>\n        </div>\n      </header>\n\n      <!-- Two-Column Reference Layout -->\n      <div class=\"grid grid-cols-1 lg:grid-cols-12\">\n        <!-- Left Main Column: Documentation Prose & Schema Tables -->\n        <main class=\"border-border space-y-8 p-4 sm:p-6 lg:col-span-7 lg:border-r lg:p-8\">\n          <!-- Endpoint Section Header -->\n          <section class=\"space-y-4\">\n            <div class=\"flex flex-wrap items-center gap-2.5\">\n              <span\n                class=\"border-success/30 bg-success/10 text-success inline-flex items-center rounded-md border px-2.5 py-0.5 font-mono text-xs font-bold tracking-wider\"\n              >\n                POST\n              </span>\n              <span class=\"text-foreground font-mono text-sm font-semibold tracking-tight sm:text-base\">\n                {{ endpointPath }}\n              </span>\n            </div>\n\n            <div>\n              <h1 class=\"text-foreground text-2xl font-bold tracking-tight sm:text-3xl\">Create a subscription</h1>\n              <p class=\"text-muted-foreground mt-2 text-sm leading-relaxed\">\n                Creates a new recurring subscription contract for an existing customer account. If a default payment\n                method is attached, initial recurring invoices are calculated and charged upon trial conclusion or cycle\n                anchor date.\n              </p>\n            </div>\n\n            <!-- Metadata Badges -->\n            <div class=\"flex flex-wrap items-center gap-2 pt-1\">\n              <div\n                class=\"border-border bg-card text-muted-foreground inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs\"\n              >\n                <lucide-icon [img]=\"Zap\" class=\"text-warning size-3.5\" />\n                <span>Idempotent:</span>\n                <span class=\"text-foreground font-medium\">Yes (via Idempotency-Key)</span>\n              </div>\n\n              <div\n                class=\"border-border bg-card text-muted-foreground inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs\"\n              >\n                <lucide-icon [img]=\"ShieldCheck\" class=\"text-success size-3.5\" />\n                <span>Auth:</span>\n                <span class=\"text-foreground font-medium\">Bearer Secret Key</span>\n              </div>\n\n              <div\n                class=\"border-border bg-card text-muted-foreground inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs\"\n              >\n                <lucide-icon [img]=\"Globe\" class=\"text-foreground/70 size-3.5\" />\n                <span>Rate Limit:</span>\n                <span class=\"text-foreground font-medium\">100 req/min</span>\n              </div>\n            </div>\n          </section>\n\n          <div ui-separator></div>\n\n          <!-- Request Headers -->\n          <section class=\"space-y-3\">\n            <div class=\"flex items-center justify-between\">\n              <h2 class=\"text-foreground text-xs font-semibold tracking-wider uppercase\">Request Headers</h2>\n              <span ui-badge variant=\"secondary\" class=\"font-mono text-xs font-normal\">HTTP/1.1 & HTTP/2</span>\n            </div>\n\n            <div ui-card class=\"border-border overflow-hidden border shadow-none\">\n              <div class=\"overflow-x-auto\">\n                <table ui-table>\n                  <thead ui-table-header>\n                    <tr ui-table-row class=\"bg-muted/40 hover:bg-muted/40\">\n                      <th ui-table-head class=\"text-xs font-semibold\">Header</th>\n                      <th ui-table-head class=\"text-xs font-semibold\">Type</th>\n                      <th ui-table-head class=\"text-xs font-semibold\">Requirement</th>\n                      <th ui-table-head class=\"text-xs font-semibold\">Description</th>\n                    </tr>\n                  </thead>\n                  <tbody ui-table-body>\n                    @for (header of headersList; track header.name) {\n                      <tr ui-table-row class=\"text-xs\">\n                        <td ui-table-cell class=\"text-foreground font-mono font-medium\">{{ header.name }}</td>\n                        <td ui-table-cell>\n                          <span ui-badge variant=\"secondary\" class=\"font-mono text-xs font-normal\">\n                            {{ header.type }}\n                          </span>\n                        </td>\n                        <td ui-table-cell>\n                          @if (header.required) {\n                            <span ui-badge class=\"border-destructive/20 bg-destructive/10 text-destructive text-xs\">\n                              REQUIRED\n                            </span>\n                          } @else {\n                            <span class=\"text-muted-foreground text-xs\">optional</span>\n                          }\n                        </td>\n                        <td ui-table-cell class=\"text-muted-foreground\">\n                          <p>{{ header.description }}</p>\n                          <code class=\"text-foreground/80 mt-1 inline-block font-mono text-xs\">\n                            Sample: {{ header.sample }}\n                          </code>\n                        </td>\n                      </tr>\n                    }\n                  </tbody>\n                </table>\n              </div>\n            </div>\n          </section>\n\n          <!-- Request Body Parameters -->\n          <section class=\"space-y-3\">\n            <div class=\"flex items-center justify-between\">\n              <div class=\"space-y-0.5\">\n                <h2 class=\"text-foreground text-xs font-semibold tracking-wider uppercase\">Request Body Parameters</h2>\n                <p class=\"text-muted-foreground text-xs\">Provide arguments in a standard JSON payload format.</p>\n              </div>\n              <span ui-badge variant=\"outline\" class=\"font-mono text-xs font-normal\">application/json</span>\n            </div>\n\n            <div ui-card class=\"border-border overflow-hidden border shadow-none\">\n              <div class=\"overflow-x-auto\">\n                <table ui-table>\n                  <thead ui-table-header>\n                    <tr ui-table-row class=\"bg-muted/40 hover:bg-muted/40\">\n                      <th ui-table-head class=\"text-xs font-semibold\">Parameter</th>\n                      <th ui-table-head class=\"text-xs font-semibold\">Type</th>\n                      <th ui-table-head class=\"text-xs font-semibold\">Requirement</th>\n                      <th ui-table-head class=\"text-xs font-semibold\">Description & Constraints</th>\n                    </tr>\n                  </thead>\n                  <tbody ui-table-body>\n                    @for (param of bodyParams; track param.name) {\n                      <tr ui-table-row class=\"text-xs\">\n                        <td ui-table-cell class=\"text-foreground font-mono font-medium\">{{ param.name }}</td>\n                        <td ui-table-cell>\n                          <span ui-badge variant=\"secondary\" class=\"font-mono text-xs font-normal\">\n                            {{ param.type }}\n                          </span>\n                        </td>\n                        <td ui-table-cell>\n                          @if (param.required) {\n                            <span ui-badge class=\"border-destructive/20 bg-destructive/10 text-destructive text-xs\">\n                              REQUIRED\n                            </span>\n                          } @else {\n                            <span class=\"text-muted-foreground text-xs\">optional</span>\n                          }\n                        </td>\n                        <td ui-table-cell class=\"text-muted-foreground\">\n                          <p>{{ param.description }}</p>\n                          @if (param.example) {\n                            <div class=\"mt-1\">\n                              <span class=\"text-muted-foreground text-xs\">Example: </span>\n                              <code class=\"text-foreground font-mono text-xs\">{{ param.example }}</code>\n                            </div>\n                          }\n                        </td>\n                      </tr>\n                      @if (param.nested) {\n                        @for (child of param.nested; track child.name) {\n                          <tr ui-table-row class=\"bg-muted/15 text-xs\">\n                            <td ui-table-cell class=\"text-foreground pl-6 font-mono text-xs font-medium\">\n                              <div class=\"flex items-center gap-1.5\">\n                                <lucide-icon [img]=\"CornerDownRight\" class=\"text-muted-foreground size-3 shrink-0\" />\n                                <span>{{ child.name }}</span>\n                              </div>\n                            </td>\n                            <td ui-table-cell>\n                              <span ui-badge variant=\"outline\" class=\"font-mono text-xs font-normal\">\n                                {{ child.type }}\n                              </span>\n                            </td>\n                            <td ui-table-cell>\n                              @if (child.required) {\n                                <span ui-badge class=\"border-destructive/20 bg-destructive/10 text-destructive text-xs\">\n                                  REQUIRED\n                                </span>\n                              } @else {\n                                <span class=\"text-muted-foreground text-xs\">optional</span>\n                              }\n                            </td>\n                            <td ui-table-cell class=\"text-muted-foreground\">\n                              <p>{{ child.description }}</p>\n                              @if (child.example) {\n                                <div class=\"mt-1\">\n                                  <span class=\"text-muted-foreground text-xs\">Example: </span>\n                                  <code class=\"text-foreground font-mono text-xs\">{{ child.example }}</code>\n                                </div>\n                              }\n                            </td>\n                          </tr>\n                        }\n                      }\n                    }\n                  </tbody>\n                </table>\n              </div>\n            </div>\n          </section>\n\n          <!-- Response Schema Attributes -->\n          <section class=\"space-y-3\">\n            <div class=\"space-y-0.5\">\n              <h2 class=\"text-foreground text-xs font-semibold tracking-wider uppercase\">Response Object Attributes</h2>\n              <p class=\"text-muted-foreground text-xs\">\n                Properties returned in the 200 OK HTTP JSON payload representation.\n              </p>\n            </div>\n\n            <div ui-card class=\"border-border overflow-hidden border shadow-none\">\n              <div class=\"overflow-x-auto\">\n                <table ui-table>\n                  <thead ui-table-header>\n                    <tr ui-table-row class=\"bg-muted/40 hover:bg-muted/40\">\n                      <th ui-table-head class=\"text-xs font-semibold\">Attribute</th>\n                      <th ui-table-head class=\"text-xs font-semibold\">Type</th>\n                      <th ui-table-head class=\"text-xs font-semibold\">Description</th>\n                      <th ui-table-head class=\"text-xs font-semibold\">Sample Value</th>\n                    </tr>\n                  </thead>\n                  <tbody ui-table-body>\n                    @for (attr of responseAttributes; track attr.name) {\n                      <tr ui-table-row class=\"text-xs\">\n                        <td ui-table-cell class=\"text-foreground font-mono font-medium\">{{ attr.name }}</td>\n                        <td ui-table-cell>\n                          <span ui-badge variant=\"secondary\" class=\"font-mono text-xs font-normal\">\n                            {{ attr.type }}\n                          </span>\n                        </td>\n                        <td ui-table-cell class=\"text-muted-foreground\">{{ attr.description }}</td>\n                        <td ui-table-cell class=\"text-foreground/90 font-mono text-xs\">{{ attr.example }}</td>\n                      </tr>\n                    }\n                  </tbody>\n                </table>\n              </div>\n            </div>\n          </section>\n        </main>\n\n        <!-- Right Column: Interactive Code & Response Inspector -->\n        <aside class=\"bg-muted/20 space-y-6 p-4 sm:p-6 lg:col-span-5\">\n          <div class=\"space-y-6 lg:sticky lg:top-6\">\n            <!-- Request Code Card -->\n            <div class=\"overflow-hidden rounded-xl border border-neutral-800 bg-neutral-950 text-neutral-100 shadow-md\">\n              <div\n                class=\"flex flex-wrap items-center justify-between border-b border-neutral-800 bg-neutral-900/90 px-3 py-2\"\n              >\n                <div class=\"flex items-center gap-1 overflow-x-auto\">\n                  @for (lang of languageOptions; track lang.value) {\n                    <button type=\"button\" [class]=\"langTabClass(lang.value)\" (click)=\"setLanguage(lang.value)\">\n                      {{ lang.label }}\n                    </button>\n                  }\n                </div>\n\n                <button\n                  ui-button\n                  variant=\"ghost\"\n                  size=\"sm\"\n                  class=\"h-7 shrink-0 gap-1.5 text-xs text-neutral-300 hover:bg-neutral-800 hover:text-neutral-100\"\n                  (click)=\"copyRequestSnippet()\"\n                >\n                  @if (copiedRequest()) {\n                    <lucide-icon [img]=\"Check\" class=\"text-success size-3\" />\n                  } @else {\n                    <lucide-icon [img]=\"Copy\" class=\"size-3\" />\n                  }\n                  {{ copiedRequest() ? 'Copied' : 'Copy' }}\n                </button>\n              </div>\n\n              <div\n                class=\"flex items-center justify-between border-b border-neutral-800/60 bg-neutral-950/60 px-4 py-1.5\"\n              >\n                <div class=\"flex items-center gap-2\">\n                  <lucide-icon [img]=\"Terminal\" class=\"size-3.5 text-neutral-400\" />\n                  <span class=\"font-mono text-xs text-neutral-400\">Request Example</span>\n                </div>\n                <span class=\"font-mono text-xs text-neutral-500 uppercase\">{{ selectedLang() }}</span>\n              </div>\n\n              <div class=\"max-h-[360px] overflow-auto p-4 font-mono text-xs leading-relaxed text-neutral-200\">\n                <pre class=\"whitespace-pre\"><code>{{ requestSnippet() }}</code></pre>\n              </div>\n            </div>\n\n            <!-- Response Code Card -->\n            <div class=\"overflow-hidden rounded-xl border border-neutral-800 bg-neutral-950 text-neutral-100 shadow-md\">\n              <div\n                class=\"flex flex-wrap items-center justify-between border-b border-neutral-800 bg-neutral-900/90 px-3 py-2\"\n              >\n                <div class=\"flex items-center gap-1.5 overflow-x-auto\">\n                  <span class=\"mr-1 text-xs font-semibold tracking-wider text-neutral-400 uppercase\">Response</span>\n                  @for (pill of statusPills; track pill.code) {\n                    <button type=\"button\" [class]=\"statusTabClass(pill.code)\" (click)=\"setStatus(pill.code)\">\n                      <span [class]=\"cn('size-2 rounded-full', pill.dotColor)\"></span>\n                      <span>{{ pill.label }}</span>\n                    </button>\n                  }\n                </div>\n\n                <button\n                  ui-button\n                  variant=\"ghost\"\n                  size=\"sm\"\n                  class=\"h-7 shrink-0 gap-1.5 text-xs text-neutral-300 hover:bg-neutral-800 hover:text-neutral-100\"\n                  (click)=\"copyResponseSnippet()\"\n                >\n                  @if (copiedResponse()) {\n                    <lucide-icon [img]=\"Check\" class=\"text-success size-3\" />\n                  } @else {\n                    <lucide-icon [img]=\"Copy\" class=\"size-3\" />\n                  }\n                  {{ copiedResponse() ? 'Copied' : 'Copy' }}\n                </button>\n              </div>\n\n              <div class=\"border-b border-neutral-800/60 bg-neutral-950/60 px-4 py-2 text-xs text-neutral-400\">\n                <span>{{ activeStatusSummary() }}</span>\n              </div>\n\n              <div class=\"max-h-[380px] overflow-auto p-4 font-mono text-xs leading-relaxed text-neutral-200\">\n                <pre class=\"whitespace-pre\"><code>{{ responseSnippet() }}</code></pre>\n              </div>\n            </div>\n          </div>\n        </aside>\n      </div>\n    </div>\n  `,\n})\nexport class UiApiDocumentationPageComponent {\n  protected readonly Check = Check\n  protected readonly Copy = Copy\n  protected readonly CornerDownRight = CornerDownRight\n  protected readonly Globe = Globe\n  protected readonly Server = Server\n  protected readonly ShieldCheck = ShieldCheck\n  protected readonly Terminal = Terminal\n  protected readonly Zap = Zap\n\n  protected readonly headersList = headersList\n  protected readonly bodyParams = bodyParams\n  protected readonly responseAttributes = responseAttributes\n  protected readonly statusPills = statusPills\n  protected readonly languageOptions = languageOptions\n  protected readonly endpointPath = ENDPOINT_PATH\n\n  @Input() set initialLanguage(v: ApiDocLanguage) {\n    if (v) this.selectedLang.set(v)\n  }\n  @Input() set initialStatus(v: ApiDocStatus) {\n    if (v) this.selectedStatus.set(v)\n  }\n  @Input('class') className?: string\n\n  readonly selectedLang = signal<ApiDocLanguage>('curl')\n  readonly selectedStatus = signal<ApiDocStatus>('200')\n  readonly copiedEndpoint = signal(false)\n  readonly copiedRequest = signal(false)\n  readonly copiedResponse = signal(false)\n\n  private readonly timers: ReturnType<typeof setTimeout>[] = []\n\n  constructor() {\n    inject(DestroyRef).onDestroy(() => {\n      for (const t of this.timers) clearTimeout(t)\n    })\n  }\n\n  get rootClass(): string {\n    return cn(\n      'bg-background text-foreground border-border w-full overflow-hidden rounded-xl border shadow-xs',\n      this.className,\n    )\n  }\n\n  requestSnippet(): string {\n    return requestSnippets[this.selectedLang()]\n  }\n\n  responseSnippet(): string {\n    return responseSnippets[this.selectedStatus()]\n  }\n\n  activeStatusSummary(): string {\n    return statusPills.find((p) => p.code === this.selectedStatus())?.summary ?? ''\n  }\n\n  langTabClass(lang: ApiDocLanguage): string {\n    return cn(\n      'rounded-md px-2.5 py-1 font-mono text-xs transition-colors',\n      this.selectedLang() === lang\n        ? 'bg-neutral-800 font-semibold text-neutral-100 shadow-xs'\n        : 'text-neutral-400 hover:bg-neutral-800/50 hover:text-neutral-200',\n    )\n  }\n\n  statusTabClass(code: ApiDocStatus): string {\n    return cn(\n      'flex items-center gap-1.5 rounded-md px-2.5 py-1 font-mono text-xs transition-colors',\n      this.selectedStatus() === code\n        ? 'bg-neutral-800 font-semibold text-neutral-100 shadow-xs'\n        : 'text-neutral-400 hover:bg-neutral-800/50 hover:text-neutral-200',\n    )\n  }\n\n  protected cn(...args: Parameters<typeof cn>): string {\n    return cn(...args)\n  }\n\n  setLanguage(lang: ApiDocLanguage): void {\n    this.selectedLang.set(lang)\n  }\n\n  setStatus(code: ApiDocStatus): void {\n    this.selectedStatus.set(code)\n  }\n\n  private flash(target: 'endpoint' | 'request' | 'response'): void {\n    if (target === 'endpoint') this.copiedEndpoint.set(true)\n    if (target === 'request') this.copiedRequest.set(true)\n    if (target === 'response') this.copiedResponse.set(true)\n    this.timers.push(\n      setTimeout(() => {\n        if (target === 'endpoint') this.copiedEndpoint.set(false)\n        if (target === 'request') this.copiedRequest.set(false)\n        if (target === 'response') this.copiedResponse.set(false)\n      }, 2000),\n    )\n  }\n\n  async copyEndpoint(): Promise<void> {\n    try {\n      await navigator.clipboard.writeText(ENDPOINT_URL)\n      this.flash('endpoint')\n    } catch {\n      // Clipboard unavailable — skip the feedback swap.\n    }\n  }\n\n  async copyRequestSnippet(): Promise<void> {\n    try {\n      await navigator.clipboard.writeText(requestSnippets[this.selectedLang()])\n      this.flash('request')\n    } catch {\n      // Clipboard unavailable — skip the feedback swap.\n    }\n  }\n\n  async copyResponseSnippet(): Promise<void> {\n    try {\n      await navigator.clipboard.writeText(responseSnippets[this.selectedStatus()])\n      this.flash('response')\n    } catch {\n      // Clipboard unavailable — skip the feedback swap.\n    }\n  }\n}\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/api-documentation-page/api-documentation-page.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/api-documentation-page/index.ts",
      "content": "export {\n  UiApiDocumentationPageComponent,\n  type ApiDocBodyParam,\n  type ApiDocHeader,\n  type ApiDocLanguage,\n  type ApiDocNestedParam,\n  type ApiDocResponseAttr,\n  type ApiDocStatus,\n  type ApiDocStatusPill,\n} from './api-documentation-page.component'\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/api-documentation-page/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",
    "https://uipkge.dev/r/angular/table.json"
  ],
  "description": "Stripe and Mintlify style two-pane API documentation reference page with HTTP method badge, endpoint path, headers, request parameter tables with nested schema hints, response attributes, interactive multi-language code snippets (cURL, Node.js, Python, Go, Ruby), and status response tabs with copy actions.",
  "categories": [
    "devops",
    "app"
  ]
}