{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "airbnb-host-earnings",
  "title": "Airbnb Host Earnings",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/airbnb-host-earnings/airbnb-host-earnings.component.ts",
      "content": "// Short-term rental host revenue dashboard: gross earnings, occupancy rate,\n// ADR & RevPAR metrics, payout schedule, dynamic pricing suggestions, and an\n// itemized reservation payout table. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, signal } from '@angular/core'\nimport {\n  Building2,\n  Calendar,\n  CalendarCheck,\n  Check,\n  CheckCircle2,\n  Clock,\n  DollarSign,\n  Download,\n  Home,\n  Landmark,\n  LucideAngularModule,\n  TrendingUp,\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 { UiProgressComponent } from '@/ui/progress/progress.component'\nimport {\n  UiSelectComponent,\n  UiSelectContentComponent,\n  UiSelectItemComponent,\n  UiSelectTriggerComponent,\n  UiSelectValueComponent,\n} from '@/ui/select/select.component'\nimport {\n  UiTableBodyComponent,\n  UiTableCellComponent,\n  UiTableComponent,\n  UiTableHeadComponent,\n  UiTableHeaderComponent,\n  UiTableRowComponent,\n} from '@/ui/table/table.component'\n\nexport type ReservationPayoutStatus = 'paid' | 'processing'\n\nexport interface ReservationGuest {\n  name: string\n  avatar: string\n  initials: string\n}\n\nexport interface ReservationPayout {\n  id: string\n  confirmationCode: string\n  guest: ReservationGuest\n  property: string\n  location: string\n  datesBooked: string\n  nightsCount: number\n  nightlyRate: string\n  cleaningFee: string\n  hostServiceFee: string\n  netPayout: string\n  status: ReservationPayoutStatus\n}\n\nconst reservations: ReservationPayout[] = [\n  {\n    id: 'res-1',\n    confirmationCode: 'HM-8924A',\n    guest: {\n      name: 'Sophia Martinez',\n      avatar: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=150&auto=format&fit=crop&q=80',\n      initials: 'SM',\n    },\n    property: 'Malibu Beachfront Villa',\n    location: 'Malibu, CA',\n    datesBooked: 'Aug 18-24 (6 nights)',\n    nightsCount: 6,\n    nightlyRate: '$650.00',\n    cleaningFee: '$350.00',\n    hostServiceFee: '-$127.50',\n    netPayout: '$4,122.50',\n    status: 'paid',\n  },\n  {\n    id: 'res-2',\n    confirmationCode: 'HM-8919B',\n    guest: {\n      name: 'David Kim',\n      avatar: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=150&auto=format&fit=crop&q=80',\n      initials: 'DK',\n    },\n    property: 'Aspen Luxury Chalet',\n    location: 'Aspen, CO',\n    datesBooked: 'Aug 12-16 (4 nights)',\n    nightsCount: 4,\n    nightlyRate: '$720.00',\n    cleaningFee: '$250.00',\n    hostServiceFee: '-$94.00',\n    netPayout: '$3,036.00',\n    status: 'paid',\n  },\n  {\n    id: 'res-3',\n    confirmationCode: 'HM-8912C',\n    guest: {\n      name: 'Elena Rostova',\n      avatar: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=150&auto=format&fit=crop&q=80',\n      initials: 'ER',\n    },\n    property: 'Maui Oceanfront Suite',\n    location: 'Maui, HI',\n    datesBooked: 'Aug 04-10 (6 nights)',\n    nightsCount: 6,\n    nightlyRate: '$580.00',\n    cleaningFee: '$300.00',\n    hostServiceFee: '-$113.40',\n    netPayout: '$3,666.60',\n    status: 'paid',\n  },\n  {\n    id: 'res-4',\n    confirmationCode: 'HM-8931D',\n    guest: {\n      name: 'Marcus Vance',\n      avatar: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=150&auto=format&fit=crop&q=80',\n      initials: 'MV',\n    },\n    property: 'Malibu Beachfront Villa',\n    location: 'Malibu, CA',\n    datesBooked: 'Aug 25-31 (6 nights)',\n    nightsCount: 6,\n    nightlyRate: '$690.00',\n    cleaningFee: '$350.00',\n    hostServiceFee: '-$134.70',\n    netPayout: '$4,355.30',\n    status: 'processing',\n  },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-airbnb-host-earnings, [ui-airbnb-host-earnings]',\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    UiAvatarComponent,\n    UiAvatarFallbackComponent,\n    UiAvatarImageComponent,\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    UiTableBodyComponent,\n    UiTableCellComponent,\n    UiTableComponent,\n    UiTableHeadComponent,\n    UiTableHeaderComponent,\n    UiTableRowComponent,\n  ],\n  template: `\n    <div data-slot=\"airbnb-host-earnings\" [class]=\"rootClass\">\n      <!-- Header Section -->\n      <div class=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n        <div class=\"space-y-1\">\n          <h1 class=\"text-foreground text-2xl font-bold tracking-tight sm:text-3xl\">\n            Host Earnings & Revenue Analytics\n          </h1>\n          <p class=\"text-muted-foreground text-sm\">\n            Short-term rental portfolio revenue, occupancy yield metrics, and automated payout disbursement schedule.\n          </p>\n        </div>\n        <div class=\"flex flex-wrap items-center gap-2.5\">\n          <ui-select [value]=\"selectedProperty()\" (valueChange)=\"selectedProperty.set($event)\">\n            <button ui-select-trigger class=\"w-48 text-xs\" aria-label=\"Select property\">\n              <lucide-icon [img]=\"Home\" class=\"text-muted-foreground mr-1.5 size-3.5\" />\n              <ui-select-value placeholder=\"Select property\" />\n            </button>\n            <ui-select-content>\n              <ui-select-item value=\"all\">All Properties (3)</ui-select-item>\n              <ui-select-item value=\"malibu\">Malibu Beachfront Villa</ui-select-item>\n              <ui-select-item value=\"aspen\">Aspen Luxury Chalet</ui-select-item>\n              <ui-select-item value=\"maui\">Maui Oceanfront Suite</ui-select-item>\n            </ui-select-content>\n          </ui-select>\n\n          <ui-select [value]=\"selectedTimeframe()\" (valueChange)=\"selectedTimeframe.set($event)\">\n            <button ui-select-trigger class=\"w-52 text-xs\" aria-label=\"Select timeframe\">\n              <lucide-icon [img]=\"Calendar\" class=\"text-muted-foreground mr-1.5 size-3.5\" />\n              <ui-select-value placeholder=\"Select timeframe\" />\n            </button>\n            <ui-select-content>\n              <ui-select-item value=\"this-month\">This Month · August 2026</ui-select-item>\n              <ui-select-item value=\"last-month\">Last Month · July 2026</ui-select-item>\n              <ui-select-item value=\"q3\">Last 90 Days (Peak Summer)</ui-select-item>\n              <ui-select-item value=\"ytd\">Year to Date · 2026</ui-select-item>\n            </ui-select-content>\n          </ui-select>\n\n          <button ui-button aria-label=\"Download attachment\" variant=\"outline\" size=\"sm\" class=\"gap-1.5 text-xs\">\n            <lucide-icon [img]=\"Download\" class=\"size-3.5\" />\n            <span>Export Tax 1099 CSV</span>\n          </button>\n        </div>\n      </div>\n\n      <!-- 4 Primary Host KPI Cards -->\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 shadow-xs\">\n          <div ui-card-header class=\"pb-2\">\n            <div class=\"flex items-center justify-between gap-2\">\n              <div class=\"flex flex-wrap items-center gap-2\">\n                <div\n                  class=\"border-success/20 bg-success/10 text-success flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                  aria-hidden=\"true\"\n                >\n                  <lucide-icon [img]=\"DollarSign\" class=\"size-4\" />\n                </div>\n                <h3 ui-card-title class=\"text-muted-foreground text-sm font-medium\">Gross Earnings</h3>\n              </div>\n              <span\n                ui-badge\n                wrap\n                variant=\"outline\"\n                class=\"border-success/20 bg-success/10 text-success text-xs font-bold tabular-nums\"\n              >\n                +14.2% vs last month\n              </span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3\">\n            <div>\n              <div class=\"flex items-baseline gap-1.5\">\n                <span class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">$18,450.00</span>\n              </div>\n              <p class=\"text-muted-foreground mt-0.5 text-xs\">Net after 3% fee: $17,896.50</p>\n            </div>\n            <div class=\"border-border/60 border-t pt-2 text-xs\">\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-muted-foreground\">Projected month-end:</span>\n                <span class=\"text-foreground font-semibold tabular-nums\">$21,400.00</span>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"flex flex-col justify-between shadow-xs\">\n          <div ui-card-header class=\"pb-2\">\n            <div class=\"flex items-center justify-between gap-2\">\n              <div class=\"flex flex-wrap items-center gap-2\">\n                <div\n                  class=\"border-border bg-muted text-foreground flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                  aria-hidden=\"true\"\n                >\n                  <lucide-icon [img]=\"CalendarCheck\" class=\"size-4\" />\n                </div>\n                <h3 ui-card-title class=\"text-muted-foreground text-sm font-medium\">Occupancy Rate</h3>\n              </div>\n              <span\n                ui-badge\n                wrap\n                variant=\"outline\"\n                class=\"border-success/20 bg-success/10 text-success text-xs font-bold tabular-nums\"\n              >\n                +6.2% vs area avg\n              </span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3\">\n            <div>\n              <div class=\"flex items-baseline gap-1.5\">\n                <span class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">88.5%</span>\n              </div>\n              <p class=\"text-muted-foreground mt-0.5 text-xs tabular-nums\">27 of 31 nights booked</p>\n            </div>\n            <div class=\"space-y-1.5\">\n              <ui-progress\n                [value]=\"88.5\"\n                class=\"[&_[data-slot=progress-indicator]]:bg-success dark:[&_[data-slot=progress-indicator]]:bg-success h-1.5\"\n              />\n              <div class=\"text-muted-foreground flex items-center justify-between text-xs tabular-nums\">\n                <span>4 nights open</span>\n                <span>2 instant holds</span>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"flex flex-col justify-between shadow-xs\">\n          <div ui-card-header class=\"pb-2\">\n            <div class=\"flex items-center justify-between gap-2\">\n              <div class=\"flex flex-wrap items-center gap-2\">\n                <div\n                  class=\"border-border bg-muted text-foreground flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                  aria-hidden=\"true\"\n                >\n                  <lucide-icon [img]=\"TrendingUp\" class=\"size-4\" />\n                </div>\n                <h3 ui-card-title class=\"text-muted-foreground text-sm font-medium\">Average Daily Rate (ADR)</h3>\n              </div>\n              <span\n                ui-badge\n                wrap\n                variant=\"outline\"\n                class=\"border-success/20 bg-success/10 text-success text-xs font-medium tabular-nums\"\n              >\n                +$45.00 vs baseline\n              </span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3\">\n            <div>\n              <div class=\"flex items-baseline gap-1\">\n                <span class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">$683.33</span>\n                <span class=\"text-muted-foreground text-xs font-normal\">/ night</span>\n              </div>\n              <p class=\"text-muted-foreground mt-0.5 text-xs\">Blended across active portfolio</p>\n            </div>\n            <div class=\"border-border/60 border-t pt-2 text-xs\">\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-muted-foreground\">Weekend surge rate:</span>\n                <span class=\"text-foreground font-semibold tabular-nums\">$820.00 / night</span>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"flex flex-col justify-between shadow-xs\">\n          <div ui-card-header class=\"pb-2\">\n            <div class=\"flex items-center justify-between gap-2\">\n              <div class=\"flex flex-wrap items-center gap-2\">\n                <div\n                  class=\"border-border bg-muted text-foreground flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                  aria-hidden=\"true\"\n                >\n                  <lucide-icon [img]=\"Building2\" class=\"size-4\" />\n                </div>\n                <h3 ui-card-title class=\"text-muted-foreground text-sm font-medium\">RevPAR (Yield / Unit)</h3>\n              </div>\n              <span\n                ui-badge\n                wrap\n                variant=\"outline\"\n                class=\"border-success/20 bg-success/10 text-success text-xs font-bold tabular-nums\"\n              >\n                +18.4% YoY\n              </span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3\">\n            <div>\n              <div class=\"flex items-baseline gap-1.5\">\n                <span class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">$604.75</span>\n              </div>\n              <p class=\"text-muted-foreground mt-0.5 text-xs tabular-nums\">Market benchmark: $512.00</p>\n            </div>\n            <div class=\"border-border/60 border-t pt-2 text-xs\">\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-muted-foreground\">Regional yield index:</span>\n                <span class=\"text-success font-semibold\">Top 5% in submarket</span>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Middle Grid: Upcoming Payouts Schedule & Dynamic Pricing Suggestions -->\n      <div class=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n        <div ui-card class=\"flex flex-col justify-between shadow-xs\">\n          <div ui-card-header>\n            <div class=\"flex items-center justify-between\">\n              <div class=\"space-y-1\">\n                <h3 ui-card-title>Upcoming Payouts Schedule</h3>\n                <p ui-card-description>\n                  Automated direct deposits sent to your verified checking account 24 hours post check-in.\n                </p>\n              </div>\n              <span\n                ui-badge\n                wrap\n                variant=\"outline\"\n                class=\"border-success/20 bg-success/10 text-success text-xs font-medium\"\n              >\n                <lucide-icon [img]=\"CheckCircle2\" class=\"mr-1 size-3\" />\n                Auto-Transfer Active\n              </span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-4\">\n            <div class=\"border-border bg-muted/40 rounded-lg border p-4\">\n              <div class=\"flex items-start justify-between gap-4\">\n                <div class=\"flex items-start gap-3\">\n                  <div\n                    class=\"border-success/20 bg-success/10 text-success flex size-9 shrink-0 items-center justify-center rounded-lg border\"\n                  >\n                    <lucide-icon [img]=\"Landmark\" class=\"size-4.5\" />\n                  </div>\n                  <div class=\"space-y-0.5\">\n                    <span class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">Next Payout</span>\n                    <div class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">$4,250.00</div>\n                    <p class=\"text-foreground text-xs font-medium\">\n                      Direct Deposit to Chase •••• 4892 ·\n                      <span class=\"text-success font-semibold\">Arriving Aug 24</span>\n                    </p>\n                  </div>\n                </div>\n                <span ui-badge wrap variant=\"secondary\" class=\"text-xs\">Scheduled</span>\n              </div>\n            </div>\n\n            <div class=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n              <div class=\"border-border bg-card rounded-lg border p-3.5 shadow-xs\">\n                <span class=\"text-muted-foreground text-xs font-medium\">Completed payouts YTD</span>\n                <div class=\"text-foreground mt-1 text-xl font-bold tracking-tight tabular-nums\">$92,400.00</div>\n                <p class=\"text-muted-foreground mt-0.5 text-xs\">18 completed disbursement cycles</p>\n              </div>\n              <div class=\"border-border bg-card rounded-lg border p-3.5 shadow-xs\">\n                <span class=\"text-muted-foreground text-xs font-medium\">Settlement routing</span>\n                <div class=\"text-foreground mt-1 text-sm font-semibold\">JPMorgan Chase Bank</div>\n                <p class=\"text-muted-foreground mt-0.5 text-xs tabular-nums\">Routing: 021000021 · $0 held</p>\n              </div>\n            </div>\n\n            <div class=\"flex items-center justify-between pt-1\">\n              <p class=\"text-muted-foreground text-xs\">Payouts release automatically 24h after each guest check-in.</p>\n              <button ui-button variant=\"outline\" size=\"sm\" class=\"gap-1.5 text-xs\">\n                <lucide-icon [img]=\"Building2\" class=\"size-3.5\" />\n                <span>Manage Bank Account</span>\n              </button>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"flex flex-col justify-between shadow-xs\">\n          <div ui-card-header>\n            <div class=\"flex items-center justify-between\">\n              <div class=\"space-y-1\">\n                <h3 ui-card-title>Dynamic Pricing Suggestions</h3>\n                <p ui-card-description>\n                  Machine-learning demand forecasts and local holiday surge pricing recommendations.\n                </p>\n              </div>\n              <span\n                ui-badge\n                wrap\n                variant=\"outline\"\n                class=\"border-warning/20 bg-warning/10 text-warning gap-1 text-xs font-semibold\"\n              >\n                <lucide-icon [img]=\"TrendingUp\" class=\"size-3\" />\n                Smart Rates\n              </span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-4\">\n            <div class=\"border-border/80 bg-muted/30 hover:bg-muted/50 rounded-lg border p-4 transition-colors\">\n              <div class=\"flex items-start gap-3\">\n                <div\n                  class=\"border-warning/20 bg-warning/10 text-warning mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                >\n                  <lucide-icon [img]=\"TrendingUp\" class=\"size-4\" />\n                </div>\n                <div class=\"flex-1 space-y-2\">\n                  <div class=\"flex flex-wrap items-center justify-between gap-2\">\n                    <h4 class=\"text-foreground text-sm font-semibold\">\n                      High demand weekend Sep 4-7: increase ADR by +15%\n                    </h4>\n                    <span ui-badge wrap variant=\"outline\" class=\"text-xs font-medium\">Labor Day Peak</span>\n                  </div>\n                  <p class=\"text-muted-foreground text-xs leading-relaxed\">\n                    Regional guest search volume is up +48% in Malibu and Maui. Raising base rate from $680.00 to\n                    $782.00/night captures peak holiday yield.\n                  </p>\n\n                  <div class=\"border-border/60 grid grid-cols-1 gap-2 border-t pt-2.5 text-xs sm:grid-cols-3\">\n                    <div>\n                      <span class=\"text-muted-foreground\">Current ADR:</span>\n                      <p class=\"text-foreground font-semibold tabular-nums\">$680.00 / night</p>\n                    </div>\n                    <div>\n                      <span class=\"text-muted-foreground\">Suggested ADR:</span>\n                      <p class=\"text-success font-semibold tabular-nums\">$782.00 (+15%)</p>\n                    </div>\n                    <div class=\"sm:text-right\">\n                      <span class=\"text-muted-foreground\">Est. Extra Rev:</span>\n                      <p class=\"text-foreground font-semibold tabular-nums\">+$408.00 (4 nights)</p>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n\n            @if (isPricingApplied()) {\n              <div\n                class=\"border-success/20 bg-success/10 flex items-center justify-between rounded-lg border p-3 text-xs\"\n              >\n                <div class=\"text-success flex flex-wrap items-center gap-2 font-medium\">\n                  <lucide-icon [img]=\"CheckCircle2\" class=\"size-4 shrink-0\" />\n                  <span>Suggested +15% rate applied for Sep 4-7 ($782.00/night).</span>\n                </div>\n                <button ui-button variant=\"ghost\" size=\"sm\" class=\"h-7 text-xs\" (click)=\"isPricingApplied.set(false)\">\n                  Undo\n                </button>\n              </div>\n            } @else {\n              <div class=\"flex flex-wrap items-center justify-between gap-2 pt-1\">\n                <span class=\"text-muted-foreground text-xs\">Algorithm confidence score: 96%</span>\n                <div class=\"flex flex-wrap items-center gap-2\">\n                  <button ui-button variant=\"outline\" size=\"sm\" class=\"text-xs\">Customize Rules</button>\n                  <button ui-button size=\"sm\" class=\"gap-1.5 text-xs\" (click)=\"isPricingApplied.set(true)\">\n                    <lucide-icon [img]=\"Check\" class=\"size-3.5\" />\n                    <span>Apply Suggested Rate</span>\n                  </button>\n                </div>\n              </div>\n            }\n          </div>\n        </div>\n      </div>\n\n      <!-- Monthly Revenue Breakdown Table Card -->\n      <div ui-card class=\"shadow-xs\">\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>Monthly Revenue Breakdown</h3>\n              <p ui-card-description>\n                Itemized guest reservations, cleaning fee payouts, platform service commissions, and net disbursements.\n              </p>\n            </div>\n            <span ui-badge wrap variant=\"outline\" class=\"w-fit text-xs font-normal tabular-nums\">\n              4 reservations · August 2026\n            </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 class=\"min-w-[180px]\">Guest & Reservation</th>\n                  <th ui-table-head class=\"min-w-[160px]\">Property Booked</th>\n                  <th ui-table-head>Dates Booked</th>\n                  <th ui-table-head class=\"text-right\">Nightly Rate</th>\n                  <th ui-table-head class=\"text-right\">Cleaning Fee</th>\n                  <th ui-table-head class=\"text-right\">Host Fee (3%)</th>\n                  <th ui-table-head class=\"text-right\">Net Payout</th>\n                  <th ui-table-head class=\"text-right\">Status</th>\n                </tr>\n              </thead>\n              <tbody ui-table-body>\n                @for (res of reservations; track res.id) {\n                  <tr ui-table-row class=\"hover:bg-muted/50\">\n                    <td ui-table-cell>\n                      <div class=\"flex items-center gap-3\">\n                        <ui-avatar size=\"sm\" class=\"shrink-0\">\n                          <ui-avatar-image [src]=\"res.guest.avatar\" [alt]=\"res.guest.name\" />\n                          <ui-avatar-fallback class=\"text-xs font-medium\">{{ res.guest.initials }}</ui-avatar-fallback>\n                        </ui-avatar>\n                        <div class=\"space-y-0.5\">\n                          <div class=\"text-foreground text-sm font-semibold\">{{ res.guest.name }}</div>\n                          <div class=\"text-muted-foreground font-mono text-xs tabular-nums\">\n                            {{ res.confirmationCode }}\n                          </div>\n                        </div>\n                      </div>\n                    </td>\n\n                    <td ui-table-cell>\n                      <div class=\"space-y-0.5\">\n                        <div class=\"text-foreground text-sm font-medium\">{{ res.property }}</div>\n                        <div class=\"text-muted-foreground text-xs\">{{ res.location }}</div>\n                      </div>\n                    </td>\n\n                    <td ui-table-cell>\n                      <div class=\"text-foreground text-xs font-medium tabular-nums\">{{ res.datesBooked }}</div>\n                    </td>\n\n                    <td ui-table-cell class=\"text-right\">\n                      <div class=\"text-foreground text-xs font-semibold tabular-nums\">{{ res.nightlyRate }}</div>\n                      <div class=\"text-muted-foreground text-xs tabular-nums\">{{ res.nightsCount }} nights</div>\n                    </td>\n\n                    <td ui-table-cell class=\"text-muted-foreground text-right text-xs tabular-nums\">\n                      {{ res.cleaningFee }}\n                    </td>\n\n                    <td ui-table-cell class=\"text-muted-foreground text-right text-xs tabular-nums\">\n                      {{ res.hostServiceFee }}\n                    </td>\n\n                    <td ui-table-cell class=\"text-foreground text-right text-sm font-bold tabular-nums\">\n                      {{ res.netPayout }}\n                    </td>\n\n                    <td ui-table-cell class=\"text-right\">\n                      <span ui-badge variant=\"outline\" [class]=\"statusBadgeClass(res)\">\n                        @if (res.status === 'paid') {\n                          <span class=\"flex items-center gap-1\">\n                            <lucide-icon [img]=\"Check\" class=\"size-3\" />\n                            Paid\n                          </span>\n                        } @else {\n                          <span class=\"flex items-center gap-1\">\n                            <lucide-icon [img]=\"Clock\" class=\"size-3\" />\n                            Processing\n                          </span>\n                        }\n                      </span>\n                    </td>\n                  </tr>\n                }\n              </tbody>\n            </table>\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class UiAirbnbHostEarningsComponent {\n  protected readonly Building2 = Building2\n  protected readonly Calendar = Calendar\n  protected readonly CalendarCheck = CalendarCheck\n  protected readonly Check = Check\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Clock = Clock\n  protected readonly DollarSign = DollarSign\n  protected readonly Download = Download\n  protected readonly Home = Home\n  protected readonly Landmark = Landmark\n  protected readonly TrendingUp = TrendingUp\n\n  protected readonly reservations = reservations\n\n  @Input() set initialProperty(v: string | undefined) {\n    this.selectedProperty.set(v ?? 'all')\n  }\n  @Input() set initialTimeframe(v: string | undefined) {\n    this.selectedTimeframe.set(v ?? 'this-month')\n  }\n  @Input('class') className?: string\n\n  readonly selectedProperty = signal('all')\n  readonly selectedTimeframe = signal('this-month')\n  readonly isPricingApplied = signal(false)\n\n  get rootClass(): string {\n    return cn('mx-auto w-full max-w-6xl space-y-6', this.className)\n  }\n\n  statusBadgeClass(res: ReservationPayout): string {\n    return cn(\n      'text-xs font-semibold tabular-nums',\n      res.status === 'paid' && 'border-success/20 bg-success/10 text-success',\n      res.status === 'processing' && 'border-info/20 bg-info/10 text-info',\n    )\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/airbnb-host-earnings/airbnb-host-earnings.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/airbnb-host-earnings/index.ts",
      "content": "export {\n  UiAirbnbHostEarningsComponent,\n  type ReservationGuest,\n  type ReservationPayout,\n  type ReservationPayoutStatus,\n} from './airbnb-host-earnings.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/airbnb-host-earnings/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/progress.json",
    "https://uipkge.dev/r/angular/select.json",
    "https://uipkge.dev/r/angular/table.json"
  ],
  "description": "Short-term rental host revenue dashboard: gross earnings with month-over-month growth, occupancy rate progress, ADR & RevPAR metrics, automated direct deposit payout schedule card, dynamic pricing AI rate recommendations, and an itemized reservation payout breakdown table.",
  "categories": [
    "real-estate",
    "dashboard",
    "hospitality",
    "analytics",
    "finance",
    "app"
  ]
}