{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "property-amenities-grid",
  "title": "Property Amenities Grid",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/property-amenities-grid/property-amenities-grid.component.ts",
      "content": "// Building and luxury residential amenities matrix: categorized lifestyle zones,\n// interactive category tabs, instant keyword search, and detailed feature cards with a\n// pool photography thumbnail. Port of the Vue block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, computed, signal } from '@angular/core'\nimport {\n  ArrowRight,\n  Building2,\n  Calendar,\n  Car,\n  Check,\n  CircleDot,\n  Clock,\n  Compass,\n  ConciergeBell,\n  Dumbbell,\n  FileText,\n  Flame,\n  HeartPulse,\n  Laptop,\n  LucideAngularModule,\n  MapPin,\n  Package,\n  PawPrint,\n  Search,\n  ShieldCheck,\n  Shirt,\n  Video,\n  Wifi,\n  X,\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'\n\ntype CategoryId = 'all' | 'wellness' | 'work' | 'services' | 'parking'\n\ninterface AmenityCategory {\n  id: CategoryId\n  label: string\n  count: number\n  icon: typeof Building2\n  description: string\n}\n\nconst categories: AmenityCategory[] = [\n  {\n    id: 'all',\n    label: 'All Amenities',\n    count: 24,\n    icon: Building2,\n    description: 'Explore the full suite of resident services, wellness facilities, and private lounges.',\n  },\n  {\n    id: 'wellness',\n    label: 'Wellness & Recreation',\n    count: 4,\n    icon: HeartPulse,\n    description: 'Resort-inspired spaces to rejuvenate body and mind, featuring sky-high fitness and hydrotherapy.',\n  },\n  {\n    id: 'work',\n    label: 'Work & Productivity',\n    count: 3,\n    icon: Laptop,\n    description: 'High-speed professional environments for focused execution, remote meetings, and collaboration.',\n  },\n  {\n    id: 'services',\n    label: 'Convenience & Services',\n    count: 3,\n    icon: ConciergeBell,\n    description: 'White-glove 24/7 concierge, contactless cold storage lockers, and on-demand valet care.',\n  },\n  {\n    id: 'parking',\n    label: 'Parking & Pet Care',\n    count: 2,\n    icon: Car,\n    description: 'Subterranean EV charging and a dedicated pet-care suite.',\n  },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-property-amenities-grid, [ui-property-amenities-grid]',\n  standalone: true,\n  // Vue renders the root <section> itself: the host stays out of layout and `class` goes to the root.\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [\n    LucideAngularModule,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardDescriptionComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiSeparatorComponent,\n  ],\n  template: `\n    <section data-slot=\"property-amenities-grid\" [class]=\"rootClass\">\n      <div class=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8\">\n        <!-- Top Section Header -->\n        <div class=\"flex flex-col items-start justify-between gap-6 lg:flex-row lg:items-end\">\n          <div class=\"max-w-2xl space-y-3\">\n            <div class=\"flex flex-wrap items-center gap-2\">\n              <span\n                ui-badge\n                variant=\"outline\"\n                class=\"border-primary/30 bg-primary/5 text-primary gap-1.5 px-3 py-1 text-xs font-medium\"\n              >\n                <lucide-icon [img]=\"Compass\" class=\"size-3.5\" />\n                {{ badge }}\n              </span>\n              <span ui-badge variant=\"secondary\" class=\"gap-1 px-2.5 py-1 text-xs font-medium\">\n                <lucide-icon [img]=\"Building2\" class=\"size-3\" />\n                24 Total Amenities\n              </span>\n            </div>\n            <h2 class=\"text-foreground text-3xl font-bold tracking-tight sm:text-4xl\">\n              {{ title }}\n            </h2>\n            <p class=\"text-muted-foreground text-base sm:text-lg\">\n              {{ subtitle }}\n            </p>\n          </div>\n\n          <!-- Quick Summary Stats Bar -->\n          <div class=\"grid grid-cols-2 gap-3 sm:grid-cols-4 sm:gap-4\">\n            <div class=\"bg-card border-border rounded-xl border p-3 shadow-xs\">\n              <p class=\"text-foreground font-mono text-xl font-bold\">24</p>\n              <p class=\"text-muted-foreground text-xs font-medium\">Curated Amenities</p>\n            </div>\n            <div class=\"bg-card border-border rounded-xl border p-3 shadow-xs\">\n              <p class=\"text-foreground font-mono text-xl font-bold\">4</p>\n              <p class=\"text-muted-foreground text-xs font-medium\">Lifestyle Zones</p>\n            </div>\n            <div class=\"bg-card border-border rounded-xl border p-3 shadow-xs\">\n              <p class=\"text-foreground font-mono text-xl font-bold\">24/7</p>\n              <p class=\"text-muted-foreground text-xs font-medium\">Concierge Access</p>\n            </div>\n            <div class=\"bg-card border-border rounded-xl border p-3 shadow-xs\">\n              <p class=\"text-foreground font-mono text-xl font-bold\">100%</p>\n              <p class=\"text-muted-foreground text-xs font-medium\">Pet Friendly</p>\n            </div>\n          </div>\n        </div>\n\n        <div ui-separator class=\"my-8\"></div>\n\n        <!-- Interactive Controls: Category Filter Tabs & Quick Search -->\n        <div class=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n          <!-- Category Filter Pills -->\n          <div class=\"flex flex-wrap items-center gap-2\">\n            @for (cat of categoryList; track cat.id) {\n              <button\n                ui-button\n                size=\"sm\"\n                [variant]=\"activeCategory() === cat.id ? 'default' : 'outline'\"\n                class=\"h-8 gap-1.5 rounded-full px-3.5 text-xs font-medium\"\n                (click)=\"activeCategory.set(cat.id)\"\n              >\n                <lucide-icon [img]=\"cat.icon\" class=\"size-3.5\" />\n                <span>{{ cat.label }}</span>\n                <span [class]=\"pillCountClass(cat.id)\">\n                  {{ cat.count }}\n                </span>\n              </button>\n            }\n          </div>\n\n          <!-- Keyword Search Input -->\n          <div class=\"relative w-full sm:w-72\">\n            <lucide-icon\n              [img]=\"Search\"\n              class=\"text-muted-foreground pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2\"\n            />\n            <input\n              [value]=\"searchQuery()\"\n              (input)=\"searchQuery.set($any($event.target).value)\"\n              type=\"text\"\n              placeholder=\"Search amenities...\"\n              class=\"bg-card border-border placeholder:text-muted-foreground focus-visible:ring-primary h-9 w-full min-w-0 rounded-lg border pr-8 pl-9 text-xs transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n            />\n            @if (searchQuery()) {\n              <button\n                type=\"button\"\n                class=\"text-muted-foreground hover:text-foreground absolute top-1/2 right-2.5 -translate-y-1/2\"\n                aria-label=\"Clear search\"\n                (click)=\"searchQuery.set('')\"\n              >\n                <lucide-icon [img]=\"X\" class=\"size-3.5\" />\n              </button>\n            }\n          </div>\n        </div>\n\n        <!-- Search Results Indicator -->\n        @if (isSearching()) {\n          <div\n            class=\"bg-muted/40 border-border mt-4 flex items-center justify-between rounded-lg border px-4 py-2 text-xs\"\n          >\n            <span class=\"text-muted-foreground\">\n              Showing matching results for <strong class=\"text-foreground\">\"{{ searchQuery() }}\"</strong>\n            </span>\n            <button\n              type=\"button\"\n              class=\"text-primary font-medium hover:underline\"\n              (click)=\"searchQuery.set('')\"\n            >\n              Reset Filter\n            </button>\n          </div>\n        }\n\n        <!-- Categories Container -->\n        <div class=\"mt-10 space-y-14\">\n          <!-- CATEGORY 1: WELLNESS & RECREATION -->\n          @if (showWellness()) {\n            <div class=\"space-y-6\">\n              <div class=\"flex flex-col items-start justify-between gap-2 sm:flex-row sm:items-center\">\n                <div class=\"flex items-center gap-3\">\n                  <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                    <lucide-icon [img]=\"HeartPulse\" class=\"size-5\" />\n                  </div>\n                  <div>\n                    <h3 class=\"text-foreground text-xl font-bold tracking-tight\">Wellness & Recreation</h3>\n                    <p class=\"text-muted-foreground text-xs sm:text-sm\">\n                      Resort-inspired spaces to rejuvenate body and mind with skyline views and recovery hydrotherapy.\n                    </p>\n                  </div>\n                </div>\n                <span ui-badge variant=\"outline\" class=\"border-border text-muted-foreground text-xs font-medium\">\n                  4 Featured Amenities\n                </span>\n              </div>\n\n              <div class=\"grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3\">\n                @if (matchesQuery('Heated Rooftop Infinity Pool pool skyline swim cabana')) {\n                  <div\n                    ui-card\n                    class=\"group border-border bg-card relative flex flex-col justify-between overflow-hidden shadow-xs transition-colors duration-300 hover:shadow-md md:col-span-2 lg:col-span-2\"\n                  >\n                    <div class=\"relative h-64 w-full overflow-hidden sm:h-72\">\n                      <img\n                        src=\"https://images.unsplash.com/photo-1576013551627-0cc20b96c2a7?w=1200&auto=format&fit=crop&q=80\"\n                        alt=\"Heated Rooftop Infinity Pool\"\n                        class=\"size-full object-cover transition-transform duration-500 ease-out group-hover:scale-105\"\n                      />\n                      <div class=\"absolute inset-0 bg-gradient-to-t from-black/85 via-black/35 to-transparent\"></div>\n                      <div class=\"absolute top-4 left-4 flex flex-wrap gap-2\">\n                        <span\n                          ui-badge\n                          class=\"bg-primary text-primary-foreground border-transparent text-xs font-medium shadow-xs\"\n                        >\n                          Featured Highlight\n                        </span>\n                        <span\n                          ui-badge\n                          variant=\"secondary\"\n                          class=\"bg-background/80 text-foreground border-white/20 text-xs font-medium backdrop-blur-md\"\n                        >\n                          Year-Round Heated (84°F)\n                        </span>\n                      </div>\n                      <div class=\"absolute right-4 bottom-4 left-4 text-white\">\n                        <div class=\"flex items-center gap-1.5 text-xs text-zinc-300\">\n                          <lucide-icon [img]=\"MapPin\" class=\"size-3.5 text-zinc-300\" />\n                          <span>Level 42 Sky Deck</span>\n                          <span class=\"mx-1.5\">·</span>\n                          <lucide-icon [img]=\"Clock\" class=\"size-3.5 text-zinc-300\" />\n                          <span>6:00 AM – 10:00 PM Daily</span>\n                        </div>\n                      </div>\n                    </div>\n\n                    <div ui-card-content class=\"flex flex-1 flex-col justify-between p-6\">\n                      <div class=\"space-y-2\">\n                        <h4 ui-card-title class=\"text-foreground text-xl font-bold\">Heated Rooftop Infinity Pool</h4>\n                        <p ui-card-description class=\"text-muted-foreground text-sm leading-relaxed\">\n                          50-meter temperature-controlled infinity pool on the 42nd floor featuring private cabanas,\n                          teak daybeds, outdoor sun deck, and poolside refreshment bar with 360-degree panoramic skyline\n                          views.\n                        </p>\n                      </div>\n\n                      <div class=\"border-border mt-6 flex flex-wrap items-center gap-2 border-t pt-4\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/30 text-xs font-normal\">\n                          <lucide-icon [img]=\"Check\" class=\"text-success mr-1 size-3\" />\n                          Panoramic Views\n                        </span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/30 text-xs font-normal\">\n                          <lucide-icon [img]=\"Check\" class=\"text-success mr-1 size-3\" />\n                          Private Cabanas\n                        </span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/30 text-xs font-normal\">\n                          <lucide-icon [img]=\"Check\" class=\"text-success mr-1 size-3\" />\n                          Towel Valet\n                        </span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/30 text-xs font-normal\">\n                          <lucide-icon [img]=\"Check\" class=\"text-success mr-1 size-3\" />\n                          Poolside Bar\n                        </span>\n                      </div>\n                    </div>\n                  </div>\n                }\n\n                @if (matchesQuery('Equinox-style Fitness Center & Yoga Studio gym pilates workout')) {\n                  <div\n                    ui-card\n                    class=\"border-border bg-card hover:border-primary/30 flex flex-col justify-between shadow-xs transition-colors duration-300 hover:shadow-md\"\n                  >\n                    <div ui-card-header class=\"space-y-3 p-6 pb-2\">\n                      <div class=\"flex items-center justify-between\">\n                        <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                          <lucide-icon [img]=\"Dumbbell\" class=\"size-5\" />\n                        </div>\n                        <span ui-badge variant=\"secondary\" class=\"text-xs font-medium\">24/7 Access</span>\n                      </div>\n                      <div class=\"space-y-1\">\n                        <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                          <lucide-icon [img]=\"MapPin\" class=\"text-primary size-3\" />\n                          Levels 3 & 4\n                        </div>\n                        <h4 ui-card-title class=\"text-foreground text-lg font-bold\">\n                          Equinox-style Fitness Center & Yoga Studio\n                        </h4>\n                      </div>\n                    </div>\n\n                    <div ui-card-content class=\"space-y-4 p-6 pt-2\">\n                      <p ui-card-description class=\"text-muted-foreground text-sm leading-relaxed\">\n                        Multi-level 4,500 sq ft strength and conditioning training facility outfitted with Woodway\n                        treadmills, Peloton bikes, Olympic lifting racks, and a dedicated sunlit yoga and reformer\n                        Pilates studio.\n                      </p>\n\n                      <div class=\"flex flex-wrap gap-1.5 pt-2\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Woodway & Peloton</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Reformer Pilates</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Personal Trainers</span>\n                      </div>\n                    </div>\n                  </div>\n                }\n\n                @if (matchesQuery('Nordic Sauna & Cold Plunge Spa steam therapy recovery')) {\n                  <div\n                    ui-card\n                    class=\"border-border bg-card hover:border-primary/30 flex flex-col justify-between shadow-xs transition-colors duration-300 hover:shadow-md\"\n                  >\n                    <div ui-card-header class=\"space-y-3 p-6 pb-2\">\n                      <div class=\"flex items-center justify-between\">\n                        <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                          <lucide-icon [img]=\"Flame\" class=\"size-5\" />\n                        </div>\n                        <span ui-badge variant=\"secondary\" class=\"text-xs font-medium\">Hydrotherapy</span>\n                      </div>\n                      <div class=\"space-y-1\">\n                        <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                          <lucide-icon [img]=\"MapPin\" class=\"text-primary size-3\" />\n                          Level 3 Spa Suite\n                        </div>\n                        <h4 ui-card-title class=\"text-foreground text-lg font-bold\">Nordic Sauna & Cold Plunge Spa</h4>\n                      </div>\n                    </div>\n\n                    <div ui-card-content class=\"space-y-4 p-6 pt-2\">\n                      <p ui-card-description class=\"text-muted-foreground text-sm leading-relaxed\">\n                        Therapeutic cedarwood dry sauna, aromatic eucalyptus steam room, and dual 48°F contrast therapy\n                        cold plunge pools engineered for post-workout muscle recovery and immune resilience.\n                      </p>\n\n                      <div class=\"flex flex-wrap gap-1.5 pt-2\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">48°F Cold Plunge</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Cedar Dry Sauna</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Eucalyptus Steam</span>\n                      </div>\n                    </div>\n                  </div>\n                }\n\n                @if (matchesQuery('Private Tennis & Pickleball Court sports rooftop court')) {\n                  <div\n                    ui-card\n                    class=\"border-border bg-card hover:border-primary/30 flex flex-col justify-between shadow-xs transition-colors duration-300 hover:shadow-md md:col-span-2 lg:col-span-2\"\n                  >\n                    <div ui-card-header class=\"space-y-3 p-6 pb-2\">\n                      <div class=\"flex items-center justify-between\">\n                        <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                          <lucide-icon [img]=\"CircleDot\" class=\"size-5\" />\n                        </div>\n                        <span ui-badge variant=\"secondary\" class=\"text-xs font-medium\">Rooftop Court</span>\n                      </div>\n                      <div class=\"space-y-1\">\n                        <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                          <lucide-icon [img]=\"MapPin\" class=\"text-primary size-3\" />\n                          Level 43 Sports Deck\n                        </div>\n                        <h4 ui-card-title class=\"text-foreground text-lg font-bold\">\n                          Private Tennis & Pickleball Court\n                        </h4>\n                      </div>\n                    </div>\n\n                    <div ui-card-content class=\"space-y-4 p-6 pt-2\">\n                      <p ui-card-description class=\"text-muted-foreground text-sm leading-relaxed\">\n                        Championship-grade rooftop regulation court with multi-sport cushioned acrylic surface,\n                        tournament-spec LED night illumination, automated Spinshot ball machines, and resident league\n                        reservations.\n                      </p>\n\n                      <div class=\"flex flex-wrap gap-2 pt-2\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Tournament LEDs</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Ball Machine Loan</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">App Reservation</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Skyline Backdrop</span>\n                      </div>\n                    </div>\n                  </div>\n                }\n              </div>\n            </div>\n          }\n\n          <!-- CATEGORY 2: WORK & PRODUCTIVITY -->\n          @if (showWork()) {\n            <div class=\"space-y-6\">\n              <div class=\"flex flex-col items-start justify-between gap-2 sm:flex-row sm:items-center\">\n                <div class=\"flex items-center gap-3\">\n                  <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                    <lucide-icon [img]=\"Laptop\" class=\"size-5\" />\n                  </div>\n                  <div>\n                    <h3 class=\"text-foreground text-xl font-bold tracking-tight\">Work & Productivity</h3>\n                    <p class=\"text-muted-foreground text-xs sm:text-sm\">\n                      Executive business facilities, private acoustic pods, and ultra-high-speed fiber network.\n                    </p>\n                  </div>\n                </div>\n                <span ui-badge variant=\"outline\" class=\"border-border text-muted-foreground text-xs font-medium\">\n                  3 Featured Amenities\n                </span>\n              </div>\n\n              <div class=\"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3\">\n                @if (matchesQuery('Resident Co-Working Lounge with Private Pods workspace zoom office')) {\n                  <div\n                    ui-card\n                    class=\"border-border bg-card hover:border-primary/30 flex flex-col justify-between shadow-xs transition-colors duration-300 hover:shadow-md\"\n                  >\n                    <div ui-card-header class=\"space-y-3 p-6 pb-2\">\n                      <div class=\"flex items-center justify-between\">\n                        <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                          <lucide-icon [img]=\"Laptop\" class=\"size-5\" />\n                        </div>\n                        <span ui-badge variant=\"secondary\" class=\"text-xs font-medium\">Quiet Focus</span>\n                      </div>\n                      <div class=\"space-y-1\">\n                        <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                          <lucide-icon [img]=\"MapPin\" class=\"text-primary size-3\" />\n                          Level 2 Mezzanine\n                        </div>\n                        <h4 ui-card-title class=\"text-foreground text-lg font-bold\">\n                          Resident Co-Working Lounge with Private Pods\n                        </h4>\n                      </div>\n                    </div>\n\n                    <div ui-card-content class=\"space-y-4 p-6 pt-2\">\n                      <p ui-card-description class=\"text-muted-foreground text-sm leading-relaxed\">\n                        Spacious communal workspace with Herman Miller ergonomic seating, acoustic focus booths, private\n                        soundproof Zoom phone pods, and complimentary artisan espresso and nitro cold brew bar.\n                      </p>\n\n                      <div class=\"flex flex-wrap gap-1.5 pt-2\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Soundproof Pods</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Herman Miller Chairs</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Espresso Bar</span>\n                      </div>\n                    </div>\n                  </div>\n                }\n\n                @if (matchesQuery('Executive Conference Room with AV boardroom meeting video presentation')) {\n                  <div\n                    ui-card\n                    class=\"border-border bg-card hover:border-primary/30 flex flex-col justify-between shadow-xs transition-colors duration-300 hover:shadow-md\"\n                  >\n                    <div ui-card-header class=\"space-y-3 p-6 pb-2\">\n                      <div class=\"flex items-center justify-between\">\n                        <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                          <lucide-icon [img]=\"Video\" class=\"size-5\" />\n                        </div>\n                        <span ui-badge variant=\"secondary\" class=\"text-xs font-medium\">App Booking</span>\n                      </div>\n                      <div class=\"space-y-1\">\n                        <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                          <lucide-icon [img]=\"MapPin\" class=\"text-primary size-3\" />\n                          Level 2 North Wing\n                        </div>\n                        <h4 ui-card-title class=\"text-foreground text-lg font-bold\">\n                          Executive Conference Room with AV\n                        </h4>\n                      </div>\n                    </div>\n\n                    <div ui-card-content class=\"space-y-4 p-6 pt-2\">\n                      <p ui-card-description class=\"text-muted-foreground text-sm leading-relaxed\">\n                        16-person board room equipped with 85-inch 4K HDR video conferencing displays, spatial\n                        beamforming microphone arrays, digital whiteboard, and integrated presentation hub.\n                      </p>\n\n                      <div class=\"flex flex-wrap gap-1.5 pt-2\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">16-Seat Capacity</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">4K Video Suite</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Digital Whiteboard</span>\n                      </div>\n                    </div>\n                  </div>\n                }\n\n                @if (matchesQuery('High-Speed 10 Gbps Fiber WiFi throughout wifi internet mesh')) {\n                  <div\n                    ui-card\n                    class=\"border-border bg-card hover:border-primary/30 flex flex-col justify-between shadow-xs transition-colors duration-300 hover:shadow-md sm:col-span-2 lg:col-span-1\"\n                  >\n                    <div ui-card-header class=\"space-y-3 p-6 pb-2\">\n                      <div class=\"flex items-center justify-between\">\n                        <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                          <lucide-icon [img]=\"Wifi\" class=\"size-5\" />\n                        </div>\n                        <span ui-badge variant=\"secondary\" class=\"text-xs font-medium\">Ultra-Fast</span>\n                      </div>\n                      <div class=\"space-y-1\">\n                        <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                          <lucide-icon [img]=\"MapPin\" class=\"text-primary size-3\" />\n                          Building-wide Coverage\n                        </div>\n                        <h4 ui-card-title class=\"text-foreground text-lg font-bold\">\n                          High-Speed 10 Gbps Fiber WiFi throughout\n                        </h4>\n                      </div>\n                    </div>\n\n                    <div ui-card-content class=\"space-y-4 p-6 pt-2\">\n                      <p ui-card-description class=\"text-muted-foreground text-sm leading-relaxed\">\n                        Enterprise-grade symmetrical 10 Gbps redundant fiber backbone with Wi-Fi 7 access points\n                        delivering uninterrupted zero-drop roaming across all indoor lounges and outdoor terraces.\n                      </p>\n\n                      <div class=\"flex flex-wrap gap-1.5 pt-2\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Wi-Fi 7 Mesh</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">10 Gbps Symmetrical</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Zero Roam Handoff</span>\n                      </div>\n                    </div>\n                  </div>\n                }\n              </div>\n            </div>\n          }\n\n          <!-- CATEGORY 3: CONVENIENCE & SERVICES -->\n          @if (showServices()) {\n            <div class=\"space-y-6\">\n              <div class=\"flex flex-col items-start justify-between gap-2 sm:flex-row sm:items-center\">\n                <div class=\"flex items-center gap-3\">\n                  <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                    <lucide-icon [img]=\"ConciergeBell\" class=\"size-5\" />\n                  </div>\n                  <div>\n                    <h3 class=\"text-foreground text-xl font-bold tracking-tight\">Convenience & Services</h3>\n                    <p class=\"text-muted-foreground text-xs sm:text-sm\">\n                      White-glove hospitality, smart package handling, and premium garment care at your fingertips.\n                    </p>\n                  </div>\n                </div>\n                <span ui-badge variant=\"outline\" class=\"border-border text-muted-foreground text-xs font-medium\">\n                  3 Featured Amenities\n                </span>\n              </div>\n\n              <div class=\"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3\">\n                @if (matchesQuery('24/7 Doorman & Concierge Desk doorman front desk hospitality security')) {\n                  <div\n                    ui-card\n                    class=\"border-border bg-card hover:border-primary/30 flex flex-col justify-between shadow-xs transition-colors duration-300 hover:shadow-md\"\n                  >\n                    <div ui-card-header class=\"space-y-3 p-6 pb-2\">\n                      <div class=\"flex items-center justify-between\">\n                        <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                          <lucide-icon [img]=\"ConciergeBell\" class=\"size-5\" />\n                        </div>\n                        <span ui-badge variant=\"secondary\" class=\"text-xs font-medium\">24/7 Attended</span>\n                      </div>\n                      <div class=\"space-y-1\">\n                        <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                          <lucide-icon [img]=\"MapPin\" class=\"text-primary size-3\" />\n                          Main Lobby Entrance\n                        </div>\n                        <h4 ui-card-title class=\"text-foreground text-lg font-bold\">24/7 Doorman & Concierge Desk</h4>\n                      </div>\n                    </div>\n\n                    <div ui-card-content class=\"space-y-4 p-6 pt-2\">\n                      <p ui-card-description class=\"text-muted-foreground text-sm leading-relaxed\">\n                        Round-the-clock uniform concierge team providing white-glove resident hospitality, verified\n                        visitor check-in, key holding, luggage assistance, taxi dispatch, and dining reservations.\n                      </p>\n\n                      <div class=\"flex flex-wrap gap-1.5 pt-2\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">White-Glove Staff</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Key Holding</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Guest Escort</span>\n                      </div>\n                    </div>\n                  </div>\n                }\n\n                @if (matchesQuery('Automated Package Lockers & Cold Storage Delivery parcel grocery refrigerated')) {\n                  <div\n                    ui-card\n                    class=\"border-border bg-card hover:border-primary/30 flex flex-col justify-between shadow-xs transition-colors duration-300 hover:shadow-md\"\n                  >\n                    <div ui-card-header class=\"space-y-3 p-6 pb-2\">\n                      <div class=\"flex items-center justify-between\">\n                        <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                          <lucide-icon [img]=\"Package\" class=\"size-5\" />\n                        </div>\n                        <span ui-badge variant=\"secondary\" class=\"text-xs font-medium\">Smart Storage</span>\n                      </div>\n                      <div class=\"space-y-1\">\n                        <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                          <lucide-icon [img]=\"MapPin\" class=\"text-primary size-3\" />\n                          Lobby Concourse\n                        </div>\n                        <h4 ui-card-title class=\"text-foreground text-lg font-bold\">\n                          Automated Package Lockers & Cold Storage Delivery\n                        </h4>\n                      </div>\n                    </div>\n\n                    <div ui-card-content class=\"space-y-4 p-6 pt-2\">\n                      <p ui-card-description class=\"text-muted-foreground text-sm leading-relaxed\">\n                        Contactless Luxer One smart package room with digital PIN and barcode pickup alerts, secure\n                        oversized parcel rooms, and commercial-grade refrigerated storage for fresh grocery deliveries.\n                      </p>\n\n                      <div class=\"flex flex-wrap gap-1.5 pt-2\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Cold Grocery Lockers</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">24/7 App QR Pickup</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Oversized Item Vault</span>\n                      </div>\n                    </div>\n                  </div>\n                }\n\n                @if (matchesQuery('Dry Cleaning Valet & Laundry Services garment tailoring wash')) {\n                  <div\n                    ui-card\n                    class=\"border-border bg-card hover:border-primary/30 flex flex-col justify-between shadow-xs transition-colors duration-300 hover:shadow-md sm:col-span-2 lg:col-span-1\"\n                  >\n                    <div ui-card-header class=\"space-y-3 p-6 pb-2\">\n                      <div class=\"flex items-center justify-between\">\n                        <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                          <lucide-icon [img]=\"Shirt\" class=\"size-5\" />\n                        </div>\n                        <span ui-badge variant=\"secondary\" class=\"text-xs font-medium\">Valet Care</span>\n                      </div>\n                      <div class=\"space-y-1\">\n                        <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                          <lucide-icon [img]=\"MapPin\" class=\"text-primary size-3\" />\n                          Service Concourse B1\n                        </div>\n                        <h4 ui-card-title class=\"text-foreground text-lg font-bold\">\n                          Dry Cleaning Valet & Laundry Services\n                        </h4>\n                      </div>\n                    </div>\n\n                    <div ui-card-content class=\"space-y-4 p-6 pt-2\">\n                      <p ui-card-description class=\"text-muted-foreground text-sm leading-relaxed\">\n                        On-demand eco-friendly dry cleaning drop-off lockers with 24-hour turnaround, garment pressing,\n                        shoe shining, tailored alterations, and in-locker contactless delivery return.\n                      </p>\n\n                      <div class=\"flex flex-wrap gap-1.5 pt-2\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">24h Turnaround</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Eco-Friendly Cleaning</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Tailored Alterations</span>\n                      </div>\n                    </div>\n                  </div>\n                }\n              </div>\n            </div>\n          }\n\n          <!-- CATEGORY 4: PARKING & PET CARE -->\n          @if (showParking()) {\n            <div class=\"space-y-6\">\n              <div class=\"flex flex-col items-start justify-between gap-2 sm:flex-row sm:items-center\">\n                <div class=\"flex items-center gap-3\">\n                  <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                    <lucide-icon [img]=\"Car\" class=\"size-5\" />\n                  </div>\n                  <div>\n                    <h3 class=\"text-foreground text-xl font-bold tracking-tight\">Parking & Pet Care</h3>\n                    <p class=\"text-muted-foreground text-xs sm:text-sm\">\n                      Subterranean EV charging bays and private rooftop pet facilities for four-legged residents.\n                    </p>\n                  </div>\n                </div>\n                <span ui-badge variant=\"outline\" class=\"border-border text-muted-foreground text-xs font-medium\">\n                  2 Featured Amenities\n                </span>\n              </div>\n\n              <div class=\"grid grid-cols-1 gap-6 md:grid-cols-2\">\n                @if (matchesQuery('Secure Underground Parking with EV Chargers electric vehicle garage stall')) {\n                  <div\n                    ui-card\n                    class=\"border-border bg-card hover:border-primary/30 flex flex-col justify-between shadow-xs transition-colors duration-300 hover:shadow-md\"\n                  >\n                    <div ui-card-header class=\"space-y-3 p-6 pb-2\">\n                      <div class=\"flex items-center justify-between\">\n                        <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                          <lucide-icon [img]=\"Car\" class=\"size-5\" />\n                        </div>\n                        <span ui-badge variant=\"secondary\" class=\"text-xs font-medium\">EV Ready</span>\n                      </div>\n                      <div class=\"space-y-1\">\n                        <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                          <lucide-icon [img]=\"MapPin\" class=\"text-primary size-3\" />\n                          Levels P1 – P3 Subterranean\n                        </div>\n                        <h4 ui-card-title class=\"text-foreground text-lg font-bold\">\n                          Secure Underground Parking with EV Chargers\n                        </h4>\n                      </div>\n                    </div>\n\n                    <div ui-card-content class=\"space-y-4 p-6 pt-2\">\n                      <p ui-card-description class=\"text-muted-foreground text-sm leading-relaxed\">\n                        Gated subterranean multi-level garage featuring automated license plate recognition entry gates,\n                        assigned private stalls, 48 universal Level 2 EV charging stations, and dedicated bike storage.\n                      </p>\n\n                      <div class=\"flex flex-wrap gap-1.5 pt-2\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">48 EV Charging Ports</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">LPR Auto-Gate</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Covered Bike Vault</span>\n                      </div>\n                    </div>\n                  </div>\n                }\n\n                @if (matchesQuery('Private Rooftop Dog Park & Pet Spa Station canine grooming wash animal')) {\n                  <div\n                    ui-card\n                    class=\"border-border bg-card hover:border-primary/30 flex flex-col justify-between shadow-xs transition-colors duration-300 hover:shadow-md\"\n                  >\n                    <div ui-card-header class=\"space-y-3 p-6 pb-2\">\n                      <div class=\"flex items-center justify-between\">\n                        <div class=\"bg-primary/10 text-primary flex size-10 items-center justify-center rounded-xl\">\n                          <lucide-icon [img]=\"PawPrint\" class=\"size-5\" />\n                        </div>\n                        <span ui-badge variant=\"secondary\" class=\"text-xs font-medium\">Pet Friendly</span>\n                      </div>\n                      <div class=\"space-y-1\">\n                        <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                          <lucide-icon [img]=\"MapPin\" class=\"text-primary size-3\" />\n                          Level 44 Sky Deck\n                        </div>\n                        <h4 ui-card-title class=\"text-foreground text-lg font-bold\">\n                          Private Rooftop Dog Park & Pet Spa Station\n                        </h4>\n                      </div>\n                    </div>\n\n                    <div ui-card-content class=\"space-y-4 p-6 pt-2\">\n                      <p ui-card-description class=\"text-muted-foreground text-sm leading-relaxed\">\n                        Enclosed rooftop canine park with anti-microbial synthetic turf and agility obstacles, paired\n                        with an indoor heated pet wash spa featuring stainless steel wash tubs and pro blow dry station.\n                      </p>\n\n                      <div class=\"flex flex-wrap gap-1.5 pt-2\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Anti-Microbial Turf</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Heated Wash Tubs</span>\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/20 text-xs\">Pro Blow Dryers</span>\n                      </div>\n                    </div>\n                  </div>\n                }\n              </div>\n            </div>\n          }\n        </div>\n\n        <!-- Bottom Callout Card: Resident Keycard App & Tour Booking -->\n        <div ui-card class=\"bg-muted/30 border-border mt-16 overflow-hidden border shadow-xs\">\n          <div\n            ui-card-content\n            class=\"flex flex-col items-start justify-between gap-6 p-6 sm:p-8 md:flex-row md:items-center\"\n          >\n            <div class=\"flex items-start gap-4\">\n              <div class=\"bg-primary/10 text-primary flex size-12 shrink-0 items-center justify-center rounded-xl\">\n                <lucide-icon [img]=\"ShieldCheck\" class=\"size-6\" />\n              </div>\n              <div class=\"space-y-1\">\n                <h4 class=\"text-foreground text-base font-semibold sm:text-lg\">\n                  Keyless Resident Access & Mobile App Integration\n                </h4>\n                <p class=\"text-muted-foreground max-w-2xl text-xs sm:text-sm\">\n                  All 24 building amenities are digitally accessible via NFC mobile key, offering instant cabana and\n                  conference room reservations, real-time fitness occupancy, and automated guest passes.\n                </p>\n              </div>\n            </div>\n\n            <div class=\"flex flex-wrap items-center gap-3\">\n              <button ui-button variant=\"outline\" size=\"sm\" class=\"gap-1.5 text-xs\">\n                <lucide-icon [img]=\"FileText\" class=\"size-3.5\" />\n                Amenity Guide PDF\n              </button>\n              <button ui-button size=\"sm\" class=\"gap-1.5 text-xs\">\n                <lucide-icon [img]=\"Calendar\" class=\"size-3.5\" />\n                Schedule a Tour\n                <lucide-icon [img]=\"ArrowRight\" class=\"size-3.5\" />\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    </section>\n  `,\n})\nexport class UiPropertyAmenitiesGridComponent {\n  protected readonly ArrowRight = ArrowRight\n  protected readonly Building2 = Building2\n  protected readonly Calendar = Calendar\n  protected readonly Car = Car\n  protected readonly Check = Check\n  protected readonly CircleDot = CircleDot\n  protected readonly Clock = Clock\n  protected readonly Compass = Compass\n  protected readonly ConciergeBell = ConciergeBell\n  protected readonly Dumbbell = Dumbbell\n  protected readonly FileText = FileText\n  protected readonly Flame = Flame\n  protected readonly HeartPulse = HeartPulse\n  protected readonly Laptop = Laptop\n  protected readonly MapPin = MapPin\n  protected readonly Package = Package\n  protected readonly PawPrint = PawPrint\n  protected readonly Search = Search\n  protected readonly ShieldCheck = ShieldCheck\n  protected readonly Shirt = Shirt\n  protected readonly Video = Video\n  protected readonly Wifi = Wifi\n  protected readonly X = X\n  protected readonly cn = cn\n\n  protected readonly categoryList = categories\n\n  @Input() title = 'World-Class Amenities & Services'\n  @Input() subtitle = 'Designed for wellness, productivity, and quiet luxury living.'\n  @Input() badge = 'Building Features & Lifestyle'\n  @Input('class') className?: string\n\n  readonly activeCategory = signal<CategoryId>('all')\n  readonly searchQuery = signal('')\n\n  readonly isSearching = computed(() => this.searchQuery().trim().length > 0)\n\n  get rootClass(): string {\n    return cn('bg-background text-foreground w-full py-12 sm:py-16 lg:py-20', this.className)\n  }\n\n  pillCountClass(id: CategoryId): string {\n    return cn(\n      'py-0.2 ml-1 rounded-full px-1.5 font-mono text-xs',\n      this.activeCategory() === id\n        ? 'bg-primary-foreground/20 text-primary-foreground'\n        : 'bg-muted text-muted-foreground',\n    )\n  }\n\n  matchesQuery(text: string): boolean {\n    if (!this.isSearching()) return true\n    return text.toLowerCase().includes(this.searchQuery().toLowerCase().trim())\n  }\n\n  readonly showWellness = computed(() => {\n    if (this.activeCategory() !== 'all' && this.activeCategory() !== 'wellness') return false\n    if (!this.isSearching()) return true\n    return (\n      this.matchesQuery('Heated Rooftop Infinity Pool') ||\n      this.matchesQuery('Equinox-style Fitness Center & Yoga Studio') ||\n      this.matchesQuery('Nordic Sauna & Cold Plunge Spa') ||\n      this.matchesQuery('Private Tennis & Pickleball Court') ||\n      this.matchesQuery('wellness recreation pool gym sauna')\n    )\n  })\n\n  readonly showWork = computed(() => {\n    if (this.activeCategory() !== 'all' && this.activeCategory() !== 'work') return false\n    if (!this.isSearching()) return true\n    return (\n      this.matchesQuery('Resident Co-Working Lounge with Private Pods') ||\n      this.matchesQuery('Executive Conference Room with AV') ||\n      this.matchesQuery('High-Speed 10 Gbps Fiber WiFi throughout') ||\n      this.matchesQuery('work productivity office wifi conference')\n    )\n  })\n\n  readonly showServices = computed(() => {\n    if (this.activeCategory() !== 'all' && this.activeCategory() !== 'services') return false\n    if (!this.isSearching()) return true\n    return (\n      this.matchesQuery('24/7 Doorman & Concierge Desk') ||\n      this.matchesQuery('Automated Package Lockers & Cold Storage Delivery') ||\n      this.matchesQuery('Dry Cleaning Valet & Laundry Services') ||\n      this.matchesQuery('convenience services concierge doorman package laundry')\n    )\n  })\n\n  readonly showParking = computed(() => {\n    if (this.activeCategory() !== 'all' && this.activeCategory() !== 'parking') return false\n    if (!this.isSearching()) return true\n    return (\n      this.matchesQuery('Secure Underground Parking with EV Chargers') ||\n      this.matchesQuery('Private Rooftop Dog Park & Pet Spa Station') ||\n      this.matchesQuery('parking ev charger pet care dog park')\n    )\n  })\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/property-amenities-grid/property-amenities-grid.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/property-amenities-grid/index.ts",
      "content": "export { UiPropertyAmenitiesGridComponent } from './property-amenities-grid.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/property-amenities-grid/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/badge.json",
    "https://uipkge.dev/r/angular/button.json",
    "https://uipkge.dev/r/angular/card.json",
    "https://uipkge.dev/r/angular/separator.json"
  ],
  "description": "Building and luxury residential amenities matrix featuring categorized lifestyle zones, interactive category tabs, instant keyword search, and detailed feature cards with pool photography thumbnail.",
  "categories": [
    "real-estate",
    "hospitality",
    "marketing"
  ]
}