@c-code/c-code-fw 1.3.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -104
- package/fesm2022/c-code-c-code-fw-ui.mjs +622 -141
- package/fesm2022/c-code-c-code-fw-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/ui/lib/components/button/button.component.d.ts +24 -0
- package/ui/lib/components/category-menu/category-menu.component.d.ts +12 -3
- package/ui/lib/components/faq/faq.component.d.ts +11 -4
- package/ui/lib/components/faq-item/faq-item.component.d.ts +21 -0
- package/ui/lib/components/gallery/gallery.component.d.ts +7 -3
- package/ui/lib/components/info-item/info-item.component.d.ts +10 -2
- package/ui/lib/components/lightbox/lightbox.component.d.ts +18 -3
- package/ui/lib/components/notice/notice.component.d.ts +17 -0
- package/ui/lib/components/page-banner/page-banner.component.d.ts +9 -3
- package/ui/lib/components/plan-card/plan-card.component.d.ts +29 -6
- package/ui/lib/components/plan-catalog/plan-catalog.component.d.ts +43 -19
- package/ui/lib/components/plan-details/plan-details.component.d.ts +26 -11
- package/ui/lib/components/plan-filter-form/plan-filter-form.component.d.ts +15 -5
- package/ui/lib/components/promo-modal/promo-modal.component.d.ts +39 -7
- package/ui/lib/components/search-box/search-box.component.d.ts +6 -1
- package/ui/lib/components/section-heading/section-heading.component.d.ts +34 -0
- package/ui/lib/components/social-links/social-links.component.d.ts +10 -6
- package/ui/lib/components/whatsapp-button/whatsapp-button.component.d.ts +12 -2
- package/ui/lib/models/promo.models.d.ts +25 -0
- package/ui/lib/utils/promo.utils.d.ts +18 -0
- package/ui/lib/utils/text.utils.d.ts +10 -0
- package/ui/public-api.d.ts +6 -0
- package/ui/theme/component-base.css +136 -0
- package/ui/theme/tokens.css +111 -45
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c-code-c-code-fw-ui.mjs","sources":["../../../projects/core/ui/src/lib/models/plan.models.ts","../../../projects/core/ui/src/lib/utils/text.utils.ts","../../../projects/core/ui/src/lib/utils/plan.utils.ts","../../../projects/core/ui/src/lib/services/plan-catalog.service.ts","../../../projects/core/ui/src/lib/services/seo.service.ts","../../../projects/core/ui/src/lib/components/whatsapp-button/whatsapp-button.component.ts","../../../projects/core/ui/src/lib/components/whatsapp-button/whatsapp-button.component.html","../../../projects/core/ui/src/lib/components/promo-modal/promo-modal.component.ts","../../../projects/core/ui/src/lib/components/promo-modal/promo-modal.component.html","../../../projects/core/ui/src/lib/components/page-banner/page-banner.component.ts","../../../projects/core/ui/src/lib/components/page-banner/page-banner.component.html","../../../projects/core/ui/src/lib/components/info-item/info-item.component.ts","../../../projects/core/ui/src/lib/components/info-item/info-item.component.html","../../../projects/core/ui/src/lib/components/faq/faq.component.ts","../../../projects/core/ui/src/lib/components/faq/faq.component.html","../../../projects/core/ui/src/lib/components/social-links/social-links.component.ts","../../../projects/core/ui/src/lib/components/social-links/social-links.component.html","../../../projects/core/ui/src/lib/components/plan-card/plan-card.component.ts","../../../projects/core/ui/src/lib/components/plan-card/plan-card.component.html","../../../projects/core/ui/src/lib/components/category-menu/category-menu.component.ts","../../../projects/core/ui/src/lib/components/category-menu/category-menu.component.html","../../../projects/core/ui/src/lib/components/search-box/search-box.component.ts","../../../projects/core/ui/src/lib/components/search-box/search-box.component.html","../../../projects/core/ui/src/lib/components/plan-filter-form/plan-filter-form.component.ts","../../../projects/core/ui/src/lib/components/plan-filter-form/plan-filter-form.component.html","../../../projects/core/ui/src/lib/components/plan-catalog/plan-catalog.component.ts","../../../projects/core/ui/src/lib/components/plan-catalog/plan-catalog.component.html","../../../projects/core/ui/src/lib/components/plan-details/plan-details.component.ts","../../../projects/core/ui/src/lib/components/plan-details/plan-details.component.html","../../../projects/core/ui/src/lib/components/lightbox/lightbox.component.ts","../../../projects/core/ui/src/lib/components/lightbox/lightbox.component.html","../../../projects/core/ui/src/lib/components/gallery/gallery.component.ts","../../../projects/core/ui/src/lib/components/gallery/gallery.component.html","../../../projects/core/ui/src/public-api.ts","../../../projects/core/ui/src/c-code-c-code-fw-ui.ts"],"sourcesContent":["/**\n * Plan category. The numeric values match the `category` field stored in the sites' `plans.json`.\n */\nexport enum PlanCategory {\n Individual = 0,\n Couple = 1,\n Group = 2,\n None = 3,\n}\n\n/** Add-on service that a plan includes (an entry in `additionals.json`). */\nexport interface AdditionalService {\n id: number;\n iconPath: string;\n name: string;\n}\n\n/** A spa plan (an entry in `plans.json`). */\nexport interface Plan {\n id: number;\n name: string;\n description: string;\n duration: string;\n price: number;\n /** Number of people the plan is for. The spelling matches the existing JSON files. */\n cuantity: number;\n imgPath: string;\n category: PlanCategory | number;\n additionalServicesId: number[];\n /** Filled in by `PlanCatalogService` by joining `additionalServicesId` with `additionals.json`. */\n additionalServices?: AdditionalService[];\n}\n\n/** Price range option for the filter form (an entry in `priceRanges.json`). */\nexport interface PriceRange {\n description: string;\n min: number;\n max: number;\n}\n\n/** Filter produced by `cc-plan-filter-form`. Empty fields are not applied. */\nexport interface PlanFilter {\n service?: AdditionalService | null;\n priceRange?: PriceRange | null;\n}\n\n/** Entry in `cc-category-menu`. */\nexport interface CategoryOption<T = PlanCategory | number> {\n value: T;\n label: string;\n /** Number shown next to the label. Leave it empty to hide it. */\n count?: number;\n}\n\n/** Default Spanish labels for the plan categories. */\nexport const DEFAULT_PLAN_CATEGORIES: CategoryOption[] = [\n { value: PlanCategory.Individual, label: 'Individual' },\n { value: PlanCategory.Couple, label: 'Pareja' },\n { value: PlanCategory.Group, label: 'Grupal' },\n];\n","/**\n * Turns a text into a URL-safe slug: \"PLAN FLOR DE LOTTO 3\" -> \"plan-flor-de-lotto-3\".\n * Accents are removed, so \"Jacuzzi Mágico\" -> \"jacuzzi-magico\".\n */\nexport function slugify(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/** \"PLAN GARDENIA\" -> \"Plan Gardenia\". */\nexport function titleCase(text: string): string {\n return text.toLowerCase().replace(/(^|\\s)\\S/g, (c) => c.toUpperCase());\n}\n\n/** Cuts a text at the last whole word that fits in `max` characters and adds \"…\". */\nexport function truncateText(text: string, max = 160): string {\n if (text.length <= max) return text;\n const cut = text.lastIndexOf(' ', max - 1);\n return text.slice(0, cut > 0 ? cut : max - 1) + '…';\n}\n\n/**\n * Builds a WhatsApp chat link.\n * @param phone Number with country code, with or without \"+\" and spaces: \"57 310 494 8884\".\n * @param message Pre-filled message, optional.\n */\nexport function whatsappUrl(phone: string, message?: string): string {\n const params = new URLSearchParams({ phone: phone.replace(/\\D/g, '') });\n if (message) params.set('text', message);\n params.set('type', 'phone_number');\n params.set('app_absent', '0');\n return `https://api.whatsapp.com/send/?${params.toString()}`;\n}\n","import {\n AdditionalService,\n CategoryOption,\n Plan,\n PlanCategory,\n PlanFilter,\n} from '../models/plan.models';\nimport { slugify } from './text.utils';\n\n/** Fills `plan.additionalServices` from `additionalServicesId`. Unknown ids are skipped. */\nexport function joinAdditionalServices(\n plans: Plan[],\n additionals: AdditionalService[]\n): Plan[] {\n const byId = new Map<number, AdditionalService>();\n // First entry wins, so a repeated id in the JSON keeps the original behavior of `Array.find`.\n for (const service of additionals) {\n if (!byId.has(service.id)) byId.set(service.id, service);\n }\n return plans.map((plan) => ({\n ...plan,\n additionalServices: plan.additionalServicesId\n .map((id) => byId.get(id))\n .filter((s): s is AdditionalService => !!s),\n }));\n}\n\n/** URL slug of a plan, derived from its name. */\nexport function planSlug(plan: Plan | string): string {\n return slugify(typeof plan === 'string' ? plan : plan.name);\n}\n\nexport function findPlanBySlug(plans: Plan[], slug: string): Plan | undefined {\n return plans.find((plan) => planSlug(plan) === slug);\n}\n\nexport function filterPlansByCategory(\n plans: Plan[],\n category: PlanCategory | number\n): Plan[] {\n return plans.filter((plan) => plan.category === category);\n}\n\n/** Case- and accent-insensitive search on the plan name. An empty query returns every plan. */\nexport function searchPlansByName(plans: Plan[], query: string): Plan[] {\n const q = slugify(query);\n if (!q) return plans;\n return plans.filter((plan) => planSlug(plan).includes(q));\n}\n\n/**\n * Applies a `PlanFilter`. Price uses `min < price <= max`, the same rule the sites had,\n * except that `min = 0` also includes free plans.\n */\nexport function filterPlans(plans: Plan[], filter: PlanFilter): Plan[] {\n const { service, priceRange } = filter;\n return plans.filter((plan) => {\n const matchesService =\n !service ||\n (plan.additionalServices ?? []).some((s) => s.id === service.id) ||\n plan.additionalServicesId.includes(service.id);\n const matchesPrice =\n !priceRange ||\n (plan.price <= priceRange.max &&\n (plan.price > priceRange.min || (priceRange.min === 0 && plan.price === 0)));\n return matchesService && matchesPrice;\n });\n}\n\n/** Returns the options with `count` set to the number of plans in each category. */\nexport function withCategoryCounts<T extends PlanCategory | number>(\n options: CategoryOption<T>[],\n plans: Plan[]\n): CategoryOption<T>[] {\n return options.map((option) => ({\n ...option,\n count: plans.filter((plan) => plan.category === option.value).length,\n }));\n}\n","import { HttpClient } from '@angular/common/http';\nimport {\n EnvironmentProviders,\n inject,\n Injectable,\n InjectionToken,\n makeEnvironmentProviders,\n} from '@angular/core';\nimport { forkJoin, map, Observable, of, shareReplay } from 'rxjs';\nimport {\n AdditionalService,\n Plan,\n PlanCategory,\n PlanFilter,\n PriceRange,\n} from '../models/plan.models';\nimport {\n filterPlans,\n filterPlansByCategory,\n findPlanBySlug,\n joinAdditionalServices,\n searchPlansByName,\n} from '../utils/plan.utils';\n\n/** Where `PlanCatalogService` loads the JSON files from. */\nexport interface PlanCatalogConfig {\n plansUrl: string;\n additionalsUrl: string;\n /** Leave it empty if the site has no `priceRanges.json`; `getPriceRanges()` then returns `[]`. */\n priceRangesUrl?: string | null;\n}\n\nexport const DEFAULT_PLAN_CATALOG_CONFIG: PlanCatalogConfig = {\n plansUrl: 'assets/data/plans.json',\n additionalsUrl: 'assets/data/additionals.json',\n priceRangesUrl: 'assets/data/priceRanges.json',\n};\n\nexport const PLAN_CATALOG_CONFIG = new InjectionToken<PlanCatalogConfig>(\n 'PLAN_CATALOG_CONFIG',\n { providedIn: 'root', factory: () => DEFAULT_PLAN_CATALOG_CONFIG }\n);\n\n/**\n * Overrides the JSON locations. Without it, the service reads `assets/data/*.json`.\n *\n * ```ts\n * providers: [provideHttpClient(withFetch()), providePlanCatalog({ priceRangesUrl: null })]\n * ```\n */\nexport function providePlanCatalog(\n config: Partial<PlanCatalogConfig> = {}\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: PLAN_CATALOG_CONFIG,\n useValue: { ...DEFAULT_PLAN_CATALOG_CONFIG, ...config },\n },\n ]);\n}\n\n/**\n * Reads plans, add-on services and price ranges from static JSON.\n * Each file is requested once and cached; filtering happens in memory.\n * Needs `provideHttpClient()` in the app.\n */\n@Injectable({ providedIn: 'root' })\nexport class PlanCatalogService {\n private http = inject(HttpClient);\n private config = inject(PLAN_CATALOG_CONFIG);\n\n private additionals$ = this.http\n .get<AdditionalService[]>(this.config.additionalsUrl)\n .pipe(shareReplay(1));\n\n private plans$ = forkJoin({\n plans: this.http.get<Plan[]>(this.config.plansUrl),\n additionals: this.additionals$,\n }).pipe(\n map(({ plans, additionals }) => joinAdditionalServices(plans, additionals)),\n shareReplay(1)\n );\n\n private priceRanges$ = (\n this.config.priceRangesUrl\n ? this.http.get<PriceRange[]>(this.config.priceRangesUrl)\n : of<PriceRange[]>([])\n ).pipe(shareReplay(1));\n\n /** Every plan, with `additionalServices` filled in. */\n getPlans(): Observable<Plan[]> {\n return this.plans$;\n }\n\n getAdditionalServices(): Observable<AdditionalService[]> {\n return this.additionals$;\n }\n\n getPriceRanges(): Observable<PriceRange[]> {\n return this.priceRanges$;\n }\n\n getPlansByCategory(category: PlanCategory | number): Observable<Plan[]> {\n return this.plans$.pipe(map((plans) => filterPlansByCategory(plans, category)));\n }\n\n getPlansByFilter(filter: PlanFilter): Observable<Plan[]> {\n return this.plans$.pipe(map((plans) => filterPlans(plans, filter)));\n }\n\n getPlansByName(name: string): Observable<Plan[]> {\n return this.plans$.pipe(map((plans) => searchPlansByName(plans, name)));\n }\n\n getPlanBySlug(slug: string): Observable<Plan | undefined> {\n return this.plans$.pipe(map((plans) => findPlanBySlug(plans, slug)));\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n EnvironmentProviders,\n inject,\n Injectable,\n InjectionToken,\n makeEnvironmentProviders,\n} from '@angular/core';\nimport { Meta, Title } from '@angular/platform-browser';\n\nexport interface SeoConfig {\n /** Production domain without a trailing slash: \"https://www.laurelspamedellin.com\". */\n siteUrl: string;\n /** Image used when a page does not set one. Relative paths are resolved against `siteUrl`. */\n defaultImage?: string;\n}\n\nexport interface SeoData {\n title: string;\n description: string;\n /** Page path, for example \"/planes\". */\n path: string;\n /** Image for the share preview. Defaults to `SeoConfig.defaultImage`. */\n image?: string;\n}\n\nexport const SEO_CONFIG = new InjectionToken<SeoConfig>('SEO_CONFIG');\n\n/** Registers the site data `SeoService` needs. */\nexport function provideSeo(config: SeoConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: SEO_CONFIG,\n useValue: { ...config, siteUrl: config.siteUrl.replace(/\\/+$/, '') },\n },\n ]);\n}\n\n/**\n * Sets the title, description, canonical URL, Open Graph and Twitter tags, and JSON-LD blocks.\n * Works during SSR and prerendering. Requires `provideSeo()`.\n */\n@Injectable({ providedIn: 'root' })\nexport class SeoService {\n private title = inject(Title);\n private meta = inject(Meta);\n private document = inject(DOCUMENT);\n private config = inject(SEO_CONFIG);\n\n get siteUrl(): string {\n return this.config.siteUrl;\n }\n\n /** Turns a site path or relative asset into an absolute URL. Absolute URLs are returned unchanged. */\n absoluteUrl(pathOrUrl: string): string {\n if (/^https?:\\/\\//.test(pathOrUrl)) return pathOrUrl;\n return this.config.siteUrl + (pathOrUrl.startsWith('/') ? pathOrUrl : '/' + pathOrUrl);\n }\n\n update({ title, description, path, image }: SeoData): void {\n const url = this.absoluteUrl(path);\n const imageSrc = image ?? this.config.defaultImage;\n\n this.title.setTitle(title);\n this.meta.updateTag({ name: 'description', content: description });\n\n this.meta.updateTag({ property: 'og:title', content: title });\n this.meta.updateTag({ property: 'og:description', content: description });\n this.meta.updateTag({ property: 'og:url', content: url });\n\n this.meta.updateTag({ name: 'twitter:title', content: title });\n this.meta.updateTag({ name: 'twitter:description', content: description });\n\n if (imageSrc) {\n const imageUrl = this.absoluteUrl(imageSrc);\n this.meta.updateTag({ property: 'og:image', content: imageUrl });\n this.meta.updateTag({ name: 'twitter:image', content: imageUrl });\n }\n\n this.setCanonical(url);\n }\n\n /** Adds or replaces a `<script type=\"application/ld+json\">` with the given id. */\n setJsonLd(id: string, data: object): void {\n let script = this.document.getElementById(id);\n if (!script) {\n script = this.document.createElement('script');\n script.id = id;\n script.setAttribute('type', 'application/ld+json');\n this.document.head.appendChild(script);\n }\n script.textContent = JSON.stringify(data);\n }\n\n removeJsonLd(id: string): void {\n this.document.getElementById(id)?.remove();\n }\n\n private setCanonical(url: string): void {\n let link = this.document.head.querySelector<HTMLLinkElement>('link[rel=\"canonical\"]');\n if (!link) {\n link = this.document.createElement('link');\n link.setAttribute('rel', 'canonical');\n this.document.head.appendChild(link);\n }\n link.setAttribute('href', url);\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Floating WhatsApp button, fixed to a corner of the screen.\n *\n * ```html\n * <cc-whatsapp-button [href]=\"whatsappLink\" />\n * <cc-whatsapp-button [href]=\"whatsappLink\" iconSrc=\"assets/icons/whatsapp.png\" position=\"left\" />\n * ```\n */\n@Component({\n selector: 'cc-whatsapp-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './whatsapp-button.component.html',\n styleUrl: './whatsapp-button.component.css',\n})\nexport class WhatsappButtonComponent {\n /** WhatsApp link. Build it with `whatsappUrl(phone, message)`. */\n readonly href = input.required<string>();\n /** Custom icon. Without it, the WhatsApp logo is drawn as SVG. */\n readonly iconSrc = input<string>('');\n readonly label = input<string>('Escríbenos por WhatsApp');\n readonly position = input<'right' | 'left'>('right');\n}\n","<a\n class=\"cc-wa\"\n [class.cc-wa--left]=\"position() === 'left'\"\n [href]=\"href()\"\n target=\"_blank\"\n rel=\"noopener\"\n [attr.aria-label]=\"label()\"\n>\n @if (iconSrc()) {\n <img [src]=\"iconSrc()\" alt=\"\" class=\"cc-wa__img\" />\n } @else {\n <svg class=\"cc-wa__svg\" viewBox=\"0 0 32 32\" aria-hidden=\"true\">\n <circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"#25D366\" />\n <path\n fill=\"#fff\"\n d=\"M23.3 8.7A10.3 10.3 0 0 0 7 21.1L5.6 26.4l5.4-1.4a10.3 10.3 0 0 0 4.9 1.3 10.3 10.3 0 0 0 7.4-17.6Zm-7.3 15.8a8.5 8.5 0 0 1-4.3-1.2l-.3-.2-3.2.8.9-3.1-.2-.3a8.5 8.5 0 1 1 7.1 4Zm4.7-6.4c-.3-.1-1.5-.7-1.8-.8-.2-.1-.4-.1-.6.1l-.8 1c-.2.2-.3.2-.6.1a7 7 0 0 1-3.5-3c-.3-.5.3-.4.7-1.4.1-.2 0-.3 0-.4l-.8-2c-.2-.5-.4-.4-.6-.4h-.5a1 1 0 0 0-.7.3 3 3 0 0 0-.9 2.2 5.2 5.2 0 0 0 1.1 2.8 11.9 11.9 0 0 0 4.6 4c1.7.7 2.4.8 3.2.7a2.8 2.8 0 0 0 1.8-1.3 2.3 2.3 0 0 0 .2-1.3c-.1-.1-.3-.2-.6-.3Z\"\n />\n </svg>\n }\n</a>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n model,\n output,\n} from '@angular/core';\n\n/**\n * Modal over the page, for example a promotion shown when the site opens.\n * Shows `imageSrc`, or the projected content when there is no image.\n * Closes with the ✕ button, a backdrop click or the Escape key.\n *\n * ```html\n * <cc-promo-modal [(open)]=\"showPromo\" imageSrc=\"assets/images/pop.jpeg\" imageAlt=\"Promoción\" />\n * ```\n */\n@Component({\n selector: 'cc-promo-modal',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '(document:keydown.escape)': 'open() && close()' },\n templateUrl: './promo-modal.component.html',\n styleUrl: './promo-modal.component.css',\n})\nexport class PromoModalComponent {\n /** Whether the modal is visible. Use `[(open)]` to bind both ways. */\n readonly open = model<boolean>(true);\n readonly imageSrc = input<string>('');\n readonly imageAlt = input<string>('');\n /** Makes the image a link, for example to WhatsApp. */\n readonly link = input<string>('');\n readonly closeOnBackdrop = input<boolean>(true);\n readonly closeLabel = input<string>('Cerrar');\n readonly closed = output<void>();\n\n close(): void {\n this.open.set(false);\n this.closed.emit();\n }\n}\n","@if (open()) {\n <div class=\"cc-modal\" (click)=\"closeOnBackdrop() && close()\">\n <div\n class=\"cc-modal__box\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"imageAlt() || null\"\n (click)=\"$event.stopPropagation()\"\n >\n <button type=\"button\" class=\"cc-modal__close\" [attr.aria-label]=\"closeLabel()\" (click)=\"close()\">\n ✕\n </button>\n @if (imageSrc()) {\n @if (link()) {\n <a [href]=\"link()\" target=\"_blank\" rel=\"noopener\">\n <img [src]=\"imageSrc()\" [alt]=\"imageAlt()\" class=\"cc-modal__img\" />\n </a>\n } @else {\n <img [src]=\"imageSrc()\" [alt]=\"imageAlt()\" class=\"cc-modal__img\" />\n }\n } @else {\n <ng-content />\n }\n </div>\n </div>\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { LinkTarget } from '../../models/ui.models';\n\n/**\n * Title strip at the top of a page, with an optional back link and icon.\n * Renders the page's `<h1>`.\n *\n * ```html\n * <cc-page-banner title=\"Reserva tu plan - Pareja\" />\n * <cc-page-banner [title]=\"plan.name\" backLink=\"/planes\" iconSrc=\"assets/icons/hoja.png\" variant=\"plain\" />\n * ```\n */\n@Component({\n selector: 'cc-page-banner',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './page-banner.component.html',\n styleUrl: './page-banner.component.css',\n})\nexport class PageBannerComponent {\n readonly title = input.required<string>();\n /** `band` uses the surface color; `plain` uses the page background. */\n readonly variant = input<'band' | 'plain'>('band');\n readonly iconSrc = input<string>('');\n /** Shows a back arrow that links here. */\n readonly backLink = input<LinkTarget | null>(null);\n readonly backIconSrc = input<string>('');\n readonly backLabel = input<string>('Volver');\n}\n","<div class=\"cc-banner\" [class.cc-banner--plain]=\"variant() === 'plain'\" [class.cc-banner--split]=\"!!backLink()\">\n @if (backLink()) {\n <a class=\"cc-banner__back\" [routerLink]=\"backLink()\" [attr.aria-label]=\"backLabel()\">\n @if (backIconSrc()) {\n <img [src]=\"backIconSrc()\" alt=\"\" />\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M15 18l-6-6 6-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n </a>\n }\n <div class=\"cc-banner__title\">\n <h1>{{ title() }}</h1>\n @if (iconSrc()) {\n <img [src]=\"iconSrc()\" alt=\"\" class=\"cc-banner__icon\" />\n }\n </div>\n @if (backLink()) {\n <span class=\"cc-banner__spacer\"></span>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Title with a paragraph, used for policy sections.\n * Extra content (lists, notes) can be projected under the text.\n *\n * ```html\n * <cc-info-item title=\"Pagos\" text=\"Aceptamos Nequi, Daviplata y efectivo.\" />\n * <cc-info-item title=\"Reservaciones\" [text]=\"texto\">\n * <ul><li>…</li></ul>\n * </cc-info-item>\n * ```\n */\n@Component({\n selector: 'cc-info-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './info-item.component.html',\n styleUrl: './info-item.component.css',\n})\nexport class InfoItemComponent {\n readonly title = input.required<string>();\n readonly text = input<string>('');\n}\n","<h2 class=\"cc-info__title\">{{ title() }}</h2>\n@if (text()) {\n <p class=\"cc-info__text\">{{ text() }}</p>\n}\n<ng-content />\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { FaqItem } from '../../models/ui.models';\n\n/**\n * Frequently asked questions as native `<details>` elements, so the answers\n * stay in the prerendered HTML for search engines.\n *\n * ```html\n * <cc-faq title=\"PREGUNTAS FRECUENTES\" [items]=\"faq\" />\n * ```\n */\n@Component({\n selector: 'cc-faq',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './faq.component.html',\n styleUrl: './faq.component.css',\n})\nexport class FaqComponent {\n readonly items = input.required<FaqItem[]>();\n readonly title = input<string>('');\n}\n","@if (title()) {\n <h2 class=\"cc-faq__title\">{{ title() }}</h2>\n}\n@for (item of items(); track item.question) {\n <details class=\"cc-faq__item\">\n <summary>{{ item.question }}</summary>\n <p>{{ item.answer }}</p>\n </details>\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { SocialLink } from '../../models/ui.models';\n\n/**\n * Row of social network icons that open in a new tab.\n *\n * ```html\n * <cc-social-links [links]=\"socials\" size=\"1.25rem\" />\n * ```\n */\n@Component({\n selector: 'cc-social-links',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './social-links.component.html',\n styleUrl: './social-links.component.css',\n})\nexport class SocialLinksComponent {\n readonly links = input.required<SocialLink[]>();\n /** Icon width, any CSS length. */\n readonly size = input<string>('1rem');\n readonly gap = input<string>('1.25rem');\n}\n","<ul class=\"cc-social\" [style.gap]=\"gap()\">\n @for (link of links(); track link.href) {\n <li>\n <a [href]=\"link.href\" target=\"_blank\" rel=\"noopener\" [attr.aria-label]=\"link.label\">\n <img [src]=\"link.iconSrc\" alt=\"\" [style.width]=\"size()\" />\n </a>\n </li>\n }\n</ul>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { LinkTarget } from '../../models/ui.models';\n\n/**\n * Plan card: image, name and a button.\n * With `link` the button navigates with the router; without it, it emits `ctaClick`.\n *\n * ```html\n * <cc-plan-card [name]=\"plan.name\" [imageSrc]=\"plan.imgPath\" [link]=\"['/planes', slug]\" />\n * ```\n */\n@Component({\n selector: 'cc-plan-card',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './plan-card.component.html',\n styleUrl: './plan-card.component.css',\n})\nexport class PlanCardComponent {\n readonly name = input.required<string>();\n readonly imageSrc = input.required<string>();\n /** Defaults to `name`. */\n readonly imageAlt = input<string>('');\n /** Optional line under the name, for example the formatted price. */\n readonly subtitle = input<string>('');\n readonly link = input<LinkTarget | null>(null);\n readonly ctaLabel = input<string>('Saber más');\n readonly ctaClick = output<void>();\n}\n","<article class=\"cc-card\">\n <img\n class=\"cc-card__img\"\n [src]=\"imageSrc()\"\n [alt]=\"imageAlt() || name()\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n <h2 class=\"cc-card__name\">{{ name() }}</h2>\n @if (subtitle()) {\n <p class=\"cc-card__subtitle\">{{ subtitle() }}</p>\n }\n @if (link()) {\n <a class=\"cc-card__cta\" [routerLink]=\"link()\" (click)=\"ctaClick.emit()\">{{ ctaLabel() }}</a>\n } @else {\n <button type=\"button\" class=\"cc-card__cta\" (click)=\"ctaClick.emit()\">{{ ctaLabel() }}</button>\n }\n</article>\n","import { ChangeDetectionStrategy, Component, input, model } from '@angular/core';\nimport { CategoryOption } from '../../models/plan.models';\n\n/**\n * Vertical category list with a single selected option.\n * Replaces the `appElementActive` markup the sites used for plan categories.\n *\n * ```html\n * <cc-category-menu [options]=\"categories\" [(selected)]=\"category\" />\n * ```\n */\n@Component({\n selector: 'cc-category-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './category-menu.component.html',\n styleUrl: './category-menu.component.css',\n})\nexport class CategoryMenuComponent<T = unknown> {\n readonly options = input.required<CategoryOption<T>[]>();\n /** Selected value. Use `[(selected)]` to bind both ways. */\n readonly selected = model<T | null>(null);\n readonly title = input<string>('CATEGORÍA DE PLANES');\n\n select(value: T): void {\n this.selected.set(value);\n }\n}\n","<ul class=\"cc-cat\" role=\"listbox\" [attr.aria-label]=\"title() || null\">\n @if (title()) {\n <li class=\"cc-cat__title\" role=\"presentation\">{{ title() }}</li>\n }\n @for (option of options(); track option.value) {\n <li\n class=\"cc-cat__item\"\n role=\"option\"\n tabindex=\"0\"\n [class.cc-cat__item--active]=\"option.value === selected()\"\n [attr.aria-selected]=\"option.value === selected()\"\n (click)=\"select(option.value)\"\n (keydown.enter)=\"select(option.value)\"\n (keydown.space)=\"$event.preventDefault(); select(option.value)\"\n >\n <span>{{ option.label }}</span>\n @if (option.count !== undefined && option.count !== null) {\n <small>{{ option.count }}</small>\n }\n </li>\n }\n</ul>\n","import { ChangeDetectionStrategy, Component, input, model, output } from '@angular/core';\n\n/**\n * Text field with a search button. Emits `search` on Enter or on the button.\n *\n * ```html\n * <cc-search-box placeholder=\"Buscar plan\" [(value)]=\"query\" (search)=\"onSearch($event)\" />\n * ```\n */\n@Component({\n selector: 'cc-search-box',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './search-box.component.html',\n styleUrl: './search-box.component.css',\n})\nexport class SearchBoxComponent {\n readonly value = model<string>('');\n readonly placeholder = input<string>('Buscar plan');\n readonly buttonLabel = input<string>('Buscar');\n readonly iconSrc = input<string>('');\n readonly search = output<string>();\n\n onInput(event: Event): void {\n this.value.set((event.target as HTMLInputElement).value);\n }\n}\n","<form class=\"cc-search\" role=\"search\" (submit)=\"$event.preventDefault(); search.emit(value())\">\n <input\n type=\"search\"\n class=\"cc-search__input\"\n [placeholder]=\"placeholder()\"\n [attr.aria-label]=\"placeholder()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n />\n <button type=\"submit\" class=\"cc-search__btn\" [attr.aria-label]=\"buttonLabel()\">\n @if (iconSrc()) {\n <img [src]=\"iconSrc()\" alt=\"\" />\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\n <path d=\"m20 20-3.5-3.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </svg>\n }\n </button>\n</form>\n","import { ChangeDetectionStrategy, Component, input, output, signal } from '@angular/core';\nimport { AdditionalService, PlanFilter, PriceRange } from '../../models/plan.models';\n\n/**\n * Filter by included service and price range. The options come in as inputs,\n * so the form does not load data by itself.\n *\n * ```html\n * <cc-plan-filter-form [services]=\"services\" [priceRanges]=\"ranges\" (filterChange)=\"apply($event)\" />\n * ```\n */\n@Component({\n selector: 'cc-plan-filter-form',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './plan-filter-form.component.html',\n styleUrl: './plan-filter-form.component.css',\n})\nexport class PlanFilterFormComponent {\n readonly services = input<AdditionalService[]>([]);\n readonly priceRanges = input<PriceRange[]>([]);\n readonly serviceLabel = input<string>('Servicio incluido');\n readonly priceLabel = input<string>('Rango de precio');\n readonly anyLabel = input<string>('Todos');\n readonly submitLabel = input<string>('Filtrar');\n readonly resetLabel = input<string>('Limpiar');\n /** Emits on submit, and with an empty filter on reset. */\n readonly filterChange = output<PlanFilter>();\n\n protected serviceIndex = signal(-1);\n protected rangeIndex = signal(-1);\n\n protected toIndex(event: Event): number {\n return Number((event.target as HTMLSelectElement).value);\n }\n\n submit(): void {\n this.filterChange.emit({\n service: this.services()[this.serviceIndex()] ?? null,\n priceRange: this.priceRanges()[this.rangeIndex()] ?? null,\n });\n }\n\n reset(): void {\n this.serviceIndex.set(-1);\n this.rangeIndex.set(-1);\n this.filterChange.emit({ service: null, priceRange: null });\n }\n}\n","<form class=\"cc-filter\" (submit)=\"$event.preventDefault(); submit()\">\n @if (services().length) {\n <label class=\"cc-filter__field\">\n <span>{{ serviceLabel() }}</span>\n <select (change)=\"serviceIndex.set(toIndex($event))\">\n <option value=\"-1\" [selected]=\"serviceIndex() === -1\">{{ anyLabel() }}</option>\n @for (service of services(); track $index) {\n <option [value]=\"$index\" [selected]=\"serviceIndex() === $index\">{{ service.name }}</option>\n }\n </select>\n </label>\n }\n @if (priceRanges().length) {\n <label class=\"cc-filter__field\">\n <span>{{ priceLabel() }}</span>\n <select (change)=\"rangeIndex.set(toIndex($event))\">\n <option value=\"-1\" [selected]=\"rangeIndex() === -1\">{{ anyLabel() }}</option>\n @for (range of priceRanges(); track $index) {\n <option [value]=\"$index\" [selected]=\"rangeIndex() === $index\">{{ range.description }}</option>\n }\n </select>\n </label>\n }\n <div class=\"cc-filter__actions\">\n <button type=\"submit\" class=\"cc-filter__submit\">{{ submitLabel() }}</button>\n <button type=\"button\" class=\"cc-filter__reset\" (click)=\"reset()\">{{ resetLabel() }}</button>\n </div>\n</form>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n effect,\n input,\n output,\n signal,\n TemplateRef,\n untracked,\n} from '@angular/core';\nimport {\n AdditionalService,\n CategoryOption,\n DEFAULT_PLAN_CATEGORIES,\n Plan,\n PlanCategory,\n PlanFilter,\n PriceRange,\n} from '../../models/plan.models';\nimport { LinkTarget } from '../../models/ui.models';\nimport {\n filterPlans,\n filterPlansByCategory,\n planSlug,\n searchPlansByName,\n withCategoryCounts,\n} from '../../utils/plan.utils';\nimport { CategoryMenuComponent } from '../category-menu/category-menu.component';\nimport { PageBannerComponent } from '../page-banner/page-banner.component';\nimport { PlanCardComponent } from '../plan-card/plan-card.component';\nimport { PlanFilterFormComponent } from '../plan-filter-form/plan-filter-form.component';\nimport { SearchBoxComponent } from '../search-box/search-box.component';\n\n/** Context of a custom card template: `<ng-template ccPlanCard let-plan let-link=\"link\">`. */\nexport interface PlanCardContext {\n $implicit: Plan;\n link: LinkTarget;\n}\n\n/** Marks an `<ng-template>` inside `cc-plan-catalog` as the card to render for each plan. */\n@Directive({ selector: 'ng-template[ccPlanCard]' })\nexport class PlanCardTemplateDirective {\n static ngTemplateContextGuard(_dir: PlanCardTemplateDirective, ctx: unknown): ctx is PlanCardContext {\n return true;\n }\n}\n\n/**\n * Full plan list page: title, name search, category menu, filter and card grid.\n * It only needs the plans; the rest has Spanish defaults you can override.\n *\n * Selecting a category shows its plans. Searching by name or applying the filter\n * looks across every category, as the sites already did.\n *\n * ```html\n * <cc-plan-catalog\n * [plans]=\"plans()\"\n * [services]=\"services()\"\n * [priceRanges]=\"ranges()\"\n * imageAltSuffix=\" - Laurel Spa Medellín\"\n * />\n * ```\n */\n@Component({\n selector: 'cc-plan-catalog',\n imports: [\n NgTemplateOutlet,\n PageBannerComponent,\n SearchBoxComponent,\n CategoryMenuComponent,\n PlanFilterFormComponent,\n PlanCardComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './plan-catalog.component.html',\n styleUrl: './plan-catalog.component.css',\n})\nexport class PlanCatalogComponent {\n readonly plans = input.required<Plan[]>();\n readonly categories = input<CategoryOption[]>(DEFAULT_PLAN_CATEGORIES);\n readonly initialCategory = input<PlanCategory | number>(PlanCategory.Individual);\n /** Shows how many plans each category has, counted from `plans`. */\n readonly showCounts = input<boolean>(true);\n /** Options for the filter form. The filter is hidden when both are empty. */\n readonly services = input<AdditionalService[]>([]);\n readonly priceRanges = input<PriceRange[]>([]);\n /** Where each card links to. Defaults to `/planes/<slug>`. */\n readonly detailsLink = input<(plan: Plan) => LinkTarget>((plan) => ['/planes', planSlug(plan)]);\n\n readonly showBanner = input<boolean>(true);\n readonly showSearch = input<boolean>(true);\n readonly titlePrefix = input<string>('Reserva tu plan');\n readonly resultsTitle = input<string>('Resultados');\n readonly categoriesTitle = input<string>('CATEGORÍA DE PLANES');\n readonly searchPlaceholder = input<string>('Buscar plan');\n readonly searchIconSrc = input<string>('');\n readonly filterTitle = input<string>('Filtrar');\n readonly filterIconSrc = input<string>('');\n readonly ctaLabel = input<string>('Saber más');\n /** Added after the plan name in each image's alt text. */\n readonly imageAltSuffix = input<string>('');\n readonly emptyMessage = input<string>('No encontramos planes con esos criterios.');\n\n readonly categoryChange = output<PlanCategory | number>();\n\n protected readonly cardTemplate = contentChild(PlanCardTemplateDirective, { read: TemplateRef });\n\n protected readonly category = signal<PlanCategory | number | null>(null);\n protected readonly query = signal('');\n protected readonly filter = signal<PlanFilter | null>(null);\n protected readonly filterOpen = signal(false);\n /** Set when the user searched or filtered; results then cover every category. */\n protected readonly searching = signal(false);\n /** Category that was open before searching, to return to it when the search is cleared. */\n private lastCategory: PlanCategory | number | null = null;\n\n constructor() {\n // Apply `initialCategory` until the user picks one.\n effect(() => {\n const initial = this.initialCategory();\n untracked(() => {\n if (!this.searching()) this.category.set(initial);\n });\n });\n }\n\n protected readonly categoryOptions = computed(() =>\n this.showCounts() ? withCategoryCounts(this.categories(), this.plans()) : this.categories()\n );\n\n protected readonly hasFilter = computed(\n () => this.services().length > 0 || this.priceRanges().length > 0\n );\n\n protected readonly visiblePlans = computed(() => {\n const plans = this.plans();\n if (!this.searching()) {\n const category = this.category();\n return category === null ? plans : filterPlansByCategory(plans, category);\n }\n const byName = searchPlansByName(plans, this.query());\n const filter = this.filter();\n return filter ? filterPlans(byName, filter) : byName;\n });\n\n protected readonly title = computed(() => {\n if (this.searching()) return `${this.titlePrefix()} - ${this.resultsTitle()}`;\n const option = this.categories().find((c) => c.value === this.category());\n return option ? `${this.titlePrefix()} - ${option.label}` : this.titlePrefix();\n });\n\n protected selectCategory(value: PlanCategory | number | null): void {\n if (value === null) return;\n this.searching.set(false);\n this.query.set('');\n this.filter.set(null);\n this.category.set(value);\n this.categoryChange.emit(value);\n }\n\n protected onSearch(query: string): void {\n this.query.set(query);\n if (!query.trim() && !this.filter()) {\n this.selectCategory(this.lastCategory ?? this.initialCategory());\n return;\n }\n this.startSearch();\n }\n\n protected onFilter(filter: PlanFilter): void {\n const empty = !filter.service && !filter.priceRange;\n this.filter.set(empty ? null : filter);\n if (empty && !this.query().trim()) {\n this.selectCategory(this.lastCategory ?? this.initialCategory());\n return;\n }\n this.startSearch();\n }\n\n protected linkFor(plan: Plan): LinkTarget {\n return this.detailsLink()(plan);\n }\n\n private startSearch(): void {\n if (!this.searching()) this.lastCategory = this.category();\n this.searching.set(true);\n this.category.set(null);\n }\n}\n","@if (showBanner()) {\n <cc-page-banner [title]=\"title()\" />\n}\n\n<div class=\"cc-catalog\">\n <aside class=\"cc-catalog__side\">\n @if (showSearch()) {\n <cc-search-box\n [placeholder]=\"searchPlaceholder()\"\n [iconSrc]=\"searchIconSrc()\"\n [(value)]=\"query\"\n (search)=\"onSearch($event)\"\n />\n }\n\n <div class=\"cc-catalog__panel\">\n <cc-category-menu\n [title]=\"categoriesTitle()\"\n [options]=\"categoryOptions()\"\n [selected]=\"category()\"\n (selectedChange)=\"selectCategory($event)\"\n />\n\n @if (hasFilter()) {\n <hr class=\"cc-catalog__rule\" />\n <button\n type=\"button\"\n class=\"cc-catalog__filter-toggle\"\n [attr.aria-expanded]=\"filterOpen()\"\n (click)=\"filterOpen.set(!filterOpen())\"\n >\n <span>{{ filterTitle() }}</span>\n @if (filterIconSrc()) {\n <img [src]=\"filterIconSrc()\" alt=\"\" />\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M3 5h18l-7 8v6l-4-2v-4L3 5Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\" />\n </svg>\n }\n </button>\n @if (filterOpen()) {\n <cc-plan-filter-form\n [services]=\"services()\"\n [priceRanges]=\"priceRanges()\"\n (filterChange)=\"onFilter($event)\"\n />\n }\n }\n </div>\n </aside>\n\n @if (visiblePlans().length) {\n <div class=\"cc-catalog__grid\">\n @for (plan of visiblePlans(); track plan.id) {\n @if (cardTemplate(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl; context: { $implicit: plan, link: linkFor(plan) }\" />\n } @else {\n <cc-plan-card\n [name]=\"plan.name\"\n [imageSrc]=\"plan.imgPath\"\n [imageAlt]=\"plan.name + imageAltSuffix()\"\n [link]=\"linkFor(plan)\"\n [ctaLabel]=\"ctaLabel()\"\n />\n }\n }\n </div>\n } @else {\n <p class=\"cc-catalog__empty\">{{ emptyMessage() }}</p>\n }\n</div>\n","import { CurrencyPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { Plan } from '../../models/plan.models';\nimport { LinkTarget } from '../../models/ui.models';\nimport { PageBannerComponent } from '../page-banner/page-banner.component';\n\n/**\n * Plan detail view: title with a back link, photo, price, description, duration,\n * number of people, included services, and a gift box with the booking button.\n * It only renders; the page loads the plan and handles SEO.\n *\n * ```html\n * <cc-plan-details [plan]=\"plan\" [bookingUrl]=\"whatsappLink\" imageAltSuffix=\" en Laurel Spa Medellín\" />\n * ```\n */\n@Component({\n selector: 'cc-plan-details',\n imports: [CurrencyPipe, PageBannerComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './plan-details.component.html',\n styleUrl: './plan-details.component.css',\n})\nexport class PlanDetailsComponent {\n readonly plan = input.required<Plan>();\n /** Link of the booking button, usually WhatsApp. */\n readonly bookingUrl = input.required<string>();\n readonly bookingLabel = input<string>('¡RESERVAR AHORA!');\n\n readonly showBanner = input<boolean>(true);\n readonly backLink = input<LinkTarget | null>('/planes');\n readonly backLabel = input<string>('Volver a los planes');\n readonly backIconSrc = input<string>('');\n readonly titleIconSrc = input<string>('');\n /** Added after the plan name in the photo's alt text. */\n readonly imageAltSuffix = input<string>('');\n\n /** Arguments of Angular's `currency` pipe. */\n readonly currencyCode = input<string>('COP');\n readonly currencyDisplay = input<string>('COP$ ');\n readonly currencyDigits = input<string>('1.0-0');\n\n readonly durationIconSrc = input<string>('');\n readonly personIconSrc = input<string>('');\n readonly peopleIconSrc = input<string>('');\n readonly personLabel = input<string>('persona');\n readonly peopleLabel = input<string>('Personas');\n readonly includesLabel = input<string>('Incluye:');\n\n /** Gift box. It is hidden when `perks` is empty. */\n readonly perksTitle = input<string>('Recibe con nuestro plan');\n readonly perks = input<string[]>([\n 'Gift Card de invitación en PDF para regalo.',\n 'Decoración según la ocasión que celebres.',\n ]);\n readonly perksImageSrc = input<string>('');\n readonly perksImageAlt = input<string>('Gift card de regalo');\n\n protected readonly people = computed(() => Math.max(this.plan().cuantity || 1, 1));\n protected readonly services = computed(() => this.plan().additionalServices ?? []);\n}\n","@if (showBanner()) {\n <cc-page-banner\n variant=\"plain\"\n [title]=\"plan().name\"\n [iconSrc]=\"titleIconSrc()\"\n [backLink]=\"backLink()\"\n [backLabel]=\"backLabel()\"\n [backIconSrc]=\"backIconSrc()\"\n />\n}\n\n<div class=\"cc-details\">\n <div class=\"cc-details__media\">\n <img class=\"cc-details__photo\" [src]=\"plan().imgPath\" [alt]=\"plan().name + imageAltSuffix()\" />\n <ng-content select=\"[ccDetailsMedia]\" />\n </div>\n\n <div class=\"cc-details__panel\">\n <div class=\"cc-details__info\">\n <div class=\"cc-details__price\">\n <p>{{ plan().price | currency: currencyCode() : currencyDisplay() : currencyDigits() }}</p>\n </div>\n\n <p class=\"cc-details__description\">{{ plan().description }}</p>\n\n <div class=\"cc-details__facts\">\n <div class=\"cc-details__fact\">\n @if (durationIconSrc()) {\n <img [src]=\"durationIconSrc()\" alt=\"Duración\" />\n } @else {\n <svg viewBox=\"0 0 24 24\" role=\"img\" aria-label=\"Duración\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\n <path d=\"M12 7v5l3 2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </svg>\n }\n <small>{{ plan().duration }}</small>\n </div>\n\n <div class=\"cc-details__fact\">\n @if (people() > 1) {\n @if (peopleIconSrc()) {\n <img [src]=\"peopleIconSrc()\" alt=\"\" />\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle cx=\"9\" cy=\"8\" r=\"3.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\n <circle cx=\"17\" cy=\"9\" r=\"2.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\n <path d=\"M2.5 20a6.5 6.5 0 0 1 13 0M15 14.5a5 5 0 0 1 6.5 4.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </svg>\n }\n <small>{{ people() }} {{ peopleLabel() }}</small>\n } @else {\n @if (personIconSrc()) {\n <img [src]=\"personIconSrc()\" alt=\"\" />\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"8\" r=\"4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\n <path d=\"M4.5 20a7.5 7.5 0 0 1 15 0\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </svg>\n }\n <small>1 {{ personLabel() }}</small>\n }\n </div>\n </div>\n\n @if (services().length) {\n <h2 class=\"cc-details__includes\">{{ includesLabel() }}</h2>\n <ul class=\"cc-details__services\">\n @for (service of services(); track $index) {\n <li>\n <img [src]=\"service.iconPath\" alt=\"\" />\n <small>{{ service.name }}</small>\n </li>\n }\n </ul>\n }\n\n <ng-content />\n\n <div class=\"cc-details__gift\" [class.cc-details__gift--solo]=\"!perks().length\">\n @if (perks().length) {\n @if (perksImageSrc()) {\n <img class=\"cc-details__gift-img\" [src]=\"perksImageSrc()\" [alt]=\"perksImageAlt()\" loading=\"lazy\" />\n }\n <div class=\"cc-details__perks\">\n <h2>{{ perksTitle() }}</h2>\n <ul>\n @for (perk of perks(); track $index) {\n <li>{{ perk }}</li>\n }\n </ul>\n </div>\n }\n <div class=\"cc-details__cta-wrap\">\n <a class=\"cc-details__cta\" [href]=\"bookingUrl()\" target=\"_blank\" rel=\"noopener\">{{ bookingLabel() }}</a>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { GalleryImage } from '../../models/ui.models';\n\n/**\n * Full-screen image viewer. It is open while `index` is not null.\n * Arrow keys move between images and Escape closes it.\n *\n * ```html\n * <cc-lightbox [images]=\"images\" [(index)]=\"openIndex\" />\n * ```\n */\n@Component({\n selector: 'cc-lightbox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(document:keydown.escape)': 'close()',\n '(document:keydown.arrowright)': 'next()',\n '(document:keydown.arrowleft)': 'prev()',\n },\n templateUrl: './lightbox.component.html',\n styleUrl: './lightbox.component.css',\n})\nexport class LightboxComponent {\n readonly images = input.required<GalleryImage[]>();\n /** Index of the open image, or null when closed. Use `[(index)]`. */\n readonly index = model<number | null>(null);\n readonly closeLabel = input<string>('Cerrar');\n readonly prevLabel = input<string>('Imagen anterior');\n readonly nextLabel = input<string>('Imagen siguiente');\n\n protected readonly current = computed(() => {\n const i = this.index();\n return i === null ? null : (this.images()[i] ?? null);\n });\n\n private document = inject(DOCUMENT);\n\n constructor() {\n // Stop the page behind from scrolling while the viewer is open.\n effect((onCleanup) => {\n if (this.current() === null) return;\n const body = this.document.body;\n const previous = body.style.overflow;\n body.style.overflow = 'hidden';\n onCleanup(() => (body.style.overflow = previous));\n });\n }\n\n close(): void {\n if (this.index() !== null) this.index.set(null);\n }\n\n next(): void {\n const i = this.index();\n const total = this.images().length;\n if (i !== null && total) this.index.set((i + 1) % total);\n }\n\n prev(): void {\n const i = this.index();\n const total = this.images().length;\n if (i !== null && total) this.index.set((i - 1 + total) % total);\n }\n}\n","@if (current(); as image) {\n <div class=\"cc-lb\" role=\"dialog\" aria-modal=\"true\" [attr.aria-label]=\"image.caption || image.alt || null\" (click)=\"close()\">\n <button type=\"button\" class=\"cc-lb__btn cc-lb__close\" [attr.aria-label]=\"closeLabel()\" (click)=\"close()\">✕</button>\n @if (images().length > 1) {\n <button type=\"button\" class=\"cc-lb__btn cc-lb__prev\" [attr.aria-label]=\"prevLabel()\" (click)=\"$event.stopPropagation(); prev()\">‹</button>\n }\n <img class=\"cc-lb__img\" [src]=\"image.src\" [alt]=\"image.alt ?? image.caption ?? ''\" (click)=\"$event.stopPropagation()\" />\n @if (images().length > 1) {\n <button type=\"button\" class=\"cc-lb__btn cc-lb__next\" [attr.aria-label]=\"nextLabel()\" (click)=\"$event.stopPropagation(); next()\">›</button>\n }\n @if (image.caption) {\n <p class=\"cc-lb__caption\">{{ image.caption }}</p>\n }\n </div>\n}\n","import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\nimport { GalleryImage } from '../../models/ui.models';\nimport { LightboxComponent } from '../lightbox/lightbox.component';\n\n/**\n * Thumbnail grid that opens a lightbox on click.\n *\n * ```html\n * <cc-gallery [images]=\"images\" />\n * ```\n *\n * `numberedImages()` builds the list for folders named 1.jpeg, 2.jpeg, …\n */\n@Component({\n selector: 'cc-gallery',\n imports: [LightboxComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './gallery.component.html',\n styleUrl: './gallery.component.css',\n})\nexport class GalleryComponent {\n readonly images = input.required<GalleryImage[]>();\n readonly backgroundImage = input<string>('');\n readonly openLabel = input<string>('Ver imagen');\n\n protected readonly open = signal<number | null>(null);\n}\n\n/**\n * Builds a gallery list for numbered files.\n *\n * ```ts\n * numberedImages(18, (i) => `assets/images/galery/${i}.jpeg`, (i) => `Instalaciones - foto ${i}`)\n * ```\n */\nexport function numberedImages(\n count: number,\n src: (n: number) => string,\n caption?: (n: number) => string\n): GalleryImage[] {\n return Array.from({ length: count }, (_, i) => {\n const n = i + 1;\n return { src: src(n), caption: caption?.(n) };\n });\n}\n","<ul class=\"cc-gallery\" [style.background-image]=\"backgroundImage() ? 'url(' + backgroundImage() + ')' : null\">\n @for (image of images(); track image.src; let i = $index) {\n <li>\n <button type=\"button\" class=\"cc-gallery__item\" [attr.aria-label]=\"openLabel() + ': ' + (image.alt ?? image.caption ?? i + 1)\" (click)=\"open.set(i)\">\n <img [src]=\"image.thumb ?? image.src\" [alt]=\"image.alt ?? image.caption ?? ''\" loading=\"lazy\" decoding=\"async\" />\n </button>\n </li>\n }\n</ul>\n<cc-lightbox [images]=\"images()\" [(index)]=\"open\" />\n","/*\n * Public API Surface of @c-code/c-code-fw/ui\n */\n\n// Models\nexport * from './lib/models/plan.models';\nexport * from './lib/models/ui.models';\n\n// Utilities\nexport * from './lib/utils/text.utils';\nexport * from './lib/utils/plan.utils';\n\n// Services\nexport * from './lib/services/plan-catalog.service';\nexport * from './lib/services/seo.service';\n\n// Components\nexport * from './lib/components/whatsapp-button/whatsapp-button.component';\nexport * from './lib/components/promo-modal/promo-modal.component';\nexport * from './lib/components/page-banner/page-banner.component';\nexport * from './lib/components/info-item/info-item.component';\nexport * from './lib/components/faq/faq.component';\nexport * from './lib/components/social-links/social-links.component';\nexport * from './lib/components/plan-card/plan-card.component';\nexport * from './lib/components/category-menu/category-menu.component';\nexport * from './lib/components/search-box/search-box.component';\nexport * from './lib/components/plan-filter-form/plan-filter-form.component';\nexport * from './lib/components/plan-catalog/plan-catalog.component';\nexport * from './lib/components/plan-details/plan-details.component';\nexport * from './lib/components/lightbox/lightbox.component';\nexport * from './lib/components/gallery/gallery.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c-code-c-code-fw-ui.mjs","sources":["../../../projects/core/ui/src/lib/models/plan.models.ts","../../../projects/core/ui/src/lib/utils/text.utils.ts","../../../projects/core/ui/src/lib/utils/plan.utils.ts","../../../projects/core/ui/src/lib/utils/promo.utils.ts","../../../projects/core/ui/src/lib/services/plan-catalog.service.ts","../../../projects/core/ui/src/lib/services/seo.service.ts","../../../projects/core/ui/src/lib/components/button/button.component.ts","../../../projects/core/ui/src/lib/components/button/button.component.html","../../../projects/core/ui/src/lib/components/section-heading/section-heading.component.ts","../../../projects/core/ui/src/lib/components/section-heading/section-heading.component.html","../../../projects/core/ui/src/lib/components/notice/notice.component.ts","../../../projects/core/ui/src/lib/components/notice/notice.component.html","../../../projects/core/ui/src/lib/components/faq-item/faq-item.component.ts","../../../projects/core/ui/src/lib/components/faq-item/faq-item.component.html","../../../projects/core/ui/src/lib/components/whatsapp-button/whatsapp-button.component.ts","../../../projects/core/ui/src/lib/components/whatsapp-button/whatsapp-button.component.html","../../../projects/core/ui/src/lib/components/promo-modal/promo-modal.component.ts","../../../projects/core/ui/src/lib/components/promo-modal/promo-modal.component.html","../../../projects/core/ui/src/lib/components/page-banner/page-banner.component.ts","../../../projects/core/ui/src/lib/components/page-banner/page-banner.component.html","../../../projects/core/ui/src/lib/components/info-item/info-item.component.ts","../../../projects/core/ui/src/lib/components/info-item/info-item.component.html","../../../projects/core/ui/src/lib/components/faq/faq.component.ts","../../../projects/core/ui/src/lib/components/faq/faq.component.html","../../../projects/core/ui/src/lib/components/social-links/social-links.component.ts","../../../projects/core/ui/src/lib/components/social-links/social-links.component.html","../../../projects/core/ui/src/lib/components/plan-card/plan-card.component.ts","../../../projects/core/ui/src/lib/components/plan-card/plan-card.component.html","../../../projects/core/ui/src/lib/components/category-menu/category-menu.component.ts","../../../projects/core/ui/src/lib/components/category-menu/category-menu.component.html","../../../projects/core/ui/src/lib/components/search-box/search-box.component.ts","../../../projects/core/ui/src/lib/components/search-box/search-box.component.html","../../../projects/core/ui/src/lib/components/plan-filter-form/plan-filter-form.component.ts","../../../projects/core/ui/src/lib/components/plan-filter-form/plan-filter-form.component.html","../../../projects/core/ui/src/lib/components/plan-catalog/plan-catalog.component.ts","../../../projects/core/ui/src/lib/components/plan-catalog/plan-catalog.component.html","../../../projects/core/ui/src/lib/components/plan-details/plan-details.component.ts","../../../projects/core/ui/src/lib/components/plan-details/plan-details.component.html","../../../projects/core/ui/src/lib/components/lightbox/lightbox.component.ts","../../../projects/core/ui/src/lib/components/lightbox/lightbox.component.html","../../../projects/core/ui/src/lib/components/gallery/gallery.component.ts","../../../projects/core/ui/src/lib/components/gallery/gallery.component.html","../../../projects/core/ui/src/public-api.ts","../../../projects/core/ui/src/c-code-c-code-fw-ui.ts"],"sourcesContent":["/**\r\n * Plan category. The numeric values match the `category` field stored in the sites' `plans.json`.\r\n */\r\nexport enum PlanCategory {\r\n Individual = 0,\r\n Couple = 1,\r\n Group = 2,\r\n None = 3,\r\n}\r\n\r\n/** Add-on service that a plan includes (an entry in `additionals.json`). */\r\nexport interface AdditionalService {\r\n id: number;\r\n iconPath: string;\r\n name: string;\r\n}\r\n\r\n/** A spa plan (an entry in `plans.json`). */\r\nexport interface Plan {\r\n id: number;\r\n name: string;\r\n description: string;\r\n duration: string;\r\n price: number;\r\n /** Number of people the plan is for. The spelling matches the existing JSON files. */\r\n cuantity: number;\r\n imgPath: string;\r\n category: PlanCategory | number;\r\n additionalServicesId: number[];\r\n /** Filled in by `PlanCatalogService` by joining `additionalServicesId` with `additionals.json`. */\r\n additionalServices?: AdditionalService[];\r\n}\r\n\r\n/** Price range option for the filter form (an entry in `priceRanges.json`). */\r\nexport interface PriceRange {\r\n description: string;\r\n min: number;\r\n max: number;\r\n}\r\n\r\n/** Filter produced by `cc-plan-filter-form`. Empty fields are not applied. */\r\nexport interface PlanFilter {\r\n service?: AdditionalService | null;\r\n priceRange?: PriceRange | null;\r\n}\r\n\r\n/** Entry in `cc-category-menu`. */\r\nexport interface CategoryOption<T = PlanCategory | number> {\r\n value: T;\r\n label: string;\r\n /** Number shown next to the label. Leave it empty to hide it. */\r\n count?: number;\r\n}\r\n\r\n/** Default Spanish labels for the plan categories. */\r\nexport const DEFAULT_PLAN_CATEGORIES: CategoryOption[] = [\r\n { value: PlanCategory.Individual, label: 'Individual' },\r\n { value: PlanCategory.Couple, label: 'Pareja' },\r\n { value: PlanCategory.Group, label: 'Grupal' },\r\n];\r\n","/**\r\n * Turns a text into a URL-safe slug: \"PLAN FLOR DE LOTTO 3\" -> \"plan-flor-de-lotto-3\".\r\n * Accents are removed, so \"Jacuzzi Mágico\" -> \"jacuzzi-magico\".\r\n */\r\nexport function slugify(text: string): string {\r\n return text\r\n .normalize('NFD')\r\n .replace(/[̀-ͯ]/g, '')\r\n .toLowerCase()\r\n .trim()\r\n .replace(/[^a-z0-9]+/g, '-')\r\n .replace(/^-+|-+$/g, '');\r\n}\r\n\r\n/** \"PLAN GARDENIA\" -> \"Plan Gardenia\". */\r\nexport function titleCase(text: string): string {\r\n return text.toLowerCase().replace(/(^|\\s)\\S/g, (c) => c.toUpperCase());\r\n}\r\n\r\n/** Cuts a text at the last whole word that fits in `max` characters and adds \"…\". */\r\nexport function truncateText(text: string, max = 160): string {\r\n if (text.length <= max) return text;\r\n const cut = text.lastIndexOf(' ', max - 1);\r\n return text.slice(0, cut > 0 ? cut : max - 1) + '…';\r\n}\r\n\r\n/**\r\n * Builds a WhatsApp chat link.\r\n * @param phone Number with country code, with or without \"+\" and spaces: \"57 310 494 8884\".\r\n * @param message Pre-filled message, optional.\r\n */\r\nexport function whatsappUrl(phone: string, message?: string): string {\r\n const params = new URLSearchParams({ phone: phone.replace(/\\D/g, '') });\r\n if (message) params.set('text', message);\r\n params.set('type', 'phone_number');\r\n params.set('app_absent', '0');\r\n return `https://api.whatsapp.com/send/?${params.toString()}`;\r\n}\r\n\r\nexport interface PriceFormat {\r\n /** BCP 47 locale. Defaults to \"es-CO\", which prints 259900 as \"$ 259.900\". */\r\n locale?: string;\r\n /** ISO 4217 code. Defaults to \"COP\". */\r\n currency?: string;\r\n /** Decimals to show. Defaults to 0. */\r\n digits?: number;\r\n}\r\n\r\n/** Formats a price with `Intl.NumberFormat`: formatPrice(259900) -> \"$ 259.900\". */\r\nexport function formatPrice(value: number, { locale = 'es-CO', currency = 'COP', digits = 0 }: PriceFormat = {}): string {\r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency,\r\n currencyDisplay: 'narrowSymbol',\r\n minimumFractionDigits: digits,\r\n maximumFractionDigits: digits,\r\n }).format(value);\r\n}\r\n","import {\r\n AdditionalService,\r\n CategoryOption,\r\n Plan,\r\n PlanCategory,\r\n PlanFilter,\r\n} from '../models/plan.models';\r\nimport { slugify } from './text.utils';\r\n\r\n/** Fills `plan.additionalServices` from `additionalServicesId`. Unknown ids are skipped. */\r\nexport function joinAdditionalServices(\r\n plans: Plan[],\r\n additionals: AdditionalService[]\r\n): Plan[] {\r\n const byId = new Map<number, AdditionalService>();\r\n // First entry wins, so a repeated id in the JSON keeps the original behavior of `Array.find`.\r\n for (const service of additionals) {\r\n if (!byId.has(service.id)) byId.set(service.id, service);\r\n }\r\n return plans.map((plan) => ({\r\n ...plan,\r\n additionalServices: plan.additionalServicesId\r\n .map((id) => byId.get(id))\r\n .filter((s): s is AdditionalService => !!s),\r\n }));\r\n}\r\n\r\n/** URL slug of a plan, derived from its name. */\r\nexport function planSlug(plan: Plan | string): string {\r\n return slugify(typeof plan === 'string' ? plan : plan.name);\r\n}\r\n\r\nexport function findPlanBySlug(plans: Plan[], slug: string): Plan | undefined {\r\n return plans.find((plan) => planSlug(plan) === slug);\r\n}\r\n\r\nexport function filterPlansByCategory(\r\n plans: Plan[],\r\n category: PlanCategory | number\r\n): Plan[] {\r\n return plans.filter((plan) => plan.category === category);\r\n}\r\n\r\n/** Case- and accent-insensitive search on the plan name. An empty query returns every plan. */\r\nexport function searchPlansByName(plans: Plan[], query: string): Plan[] {\r\n const q = slugify(query);\r\n if (!q) return plans;\r\n return plans.filter((plan) => planSlug(plan).includes(q));\r\n}\r\n\r\n/**\r\n * Applies a `PlanFilter`. Price uses `min < price <= max`, the same rule the sites had,\r\n * except that `min = 0` also includes free plans.\r\n */\r\nexport function filterPlans(plans: Plan[], filter: PlanFilter): Plan[] {\r\n const { service, priceRange } = filter;\r\n return plans.filter((plan) => {\r\n const matchesService =\r\n !service ||\r\n (plan.additionalServices ?? []).some((s) => s.id === service.id) ||\r\n plan.additionalServicesId.includes(service.id);\r\n const matchesPrice =\r\n !priceRange ||\r\n (plan.price <= priceRange.max &&\r\n (plan.price > priceRange.min || (priceRange.min === 0 && plan.price === 0)));\r\n return matchesService && matchesPrice;\r\n });\r\n}\r\n\r\n/** Returns the options with `count` set to the number of plans in each category. */\r\nexport function withCategoryCounts<T extends PlanCategory | number>(\r\n options: CategoryOption<T>[],\r\n plans: Plan[]\r\n): CategoryOption<T>[] {\r\n return options.map((option) => ({\r\n ...option,\r\n count: plans.filter((plan) => plan.category === option.value).length,\r\n }));\r\n}\r\n","import { PromoConfig, PromoState } from '../models/promo.models';\nimport { slugify } from './text.utils';\n\n/** Today's date as YYYY-MM-DD in the local time zone. */\nexport function localDate(now: Date = new Date()): string {\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;\n}\n\n/**\n * Where the promotion is on a given day:\n * - `off`: switched off.\n * - `incomplete`: on, but without an image.\n * - `scheduled`: before `startDate`.\n * - `ended`: after `endDate`.\n * - `running`: shows.\n */\nexport function promoState(promo: PromoConfig | null | undefined, now: Date = new Date()): PromoState {\n if (!promo || !promo.active) return 'off';\n if (!promo.imageSrc) return 'incomplete';\n const today = localDate(now);\n if (promo.startDate && today < promo.startDate) return 'scheduled';\n if (promo.endDate && today > promo.endDate) return 'ended';\n return 'running';\n}\n\nexport function isPromoRunning(promo: PromoConfig | null | undefined, now: Date = new Date()): boolean {\n return promoState(promo, now) === 'running';\n}\n\n/**\n * localStorage key that remembers who closed the popup. It changes when the image or the\n * dates change, so a new promotion shows again to people who closed the previous one.\n */\nexport function promoRememberKey(promo: PromoConfig): string {\n return 'promo-' + slugify(`${promo.imageSrc} ${promo.startDate} ${promo.endDate}`).slice(0, 80);\n}\n","import { HttpClient } from '@angular/common/http';\r\nimport {\r\n EnvironmentProviders,\r\n inject,\r\n Injectable,\r\n InjectionToken,\r\n makeEnvironmentProviders,\r\n} from '@angular/core';\r\nimport { forkJoin, map, Observable, of, shareReplay } from 'rxjs';\r\nimport {\r\n AdditionalService,\r\n Plan,\r\n PlanCategory,\r\n PlanFilter,\r\n PriceRange,\r\n} from '../models/plan.models';\r\nimport {\r\n filterPlans,\r\n filterPlansByCategory,\r\n findPlanBySlug,\r\n joinAdditionalServices,\r\n searchPlansByName,\r\n} from '../utils/plan.utils';\r\n\r\n/** Where `PlanCatalogService` loads the JSON files from. */\r\nexport interface PlanCatalogConfig {\r\n plansUrl: string;\r\n additionalsUrl: string;\r\n /** Leave it empty if the site has no `priceRanges.json`; `getPriceRanges()` then returns `[]`. */\r\n priceRangesUrl?: string | null;\r\n}\r\n\r\nexport const DEFAULT_PLAN_CATALOG_CONFIG: PlanCatalogConfig = {\r\n plansUrl: 'assets/data/plans.json',\r\n additionalsUrl: 'assets/data/additionals.json',\r\n priceRangesUrl: 'assets/data/priceRanges.json',\r\n};\r\n\r\nexport const PLAN_CATALOG_CONFIG = new InjectionToken<PlanCatalogConfig>(\r\n 'PLAN_CATALOG_CONFIG',\r\n { providedIn: 'root', factory: () => DEFAULT_PLAN_CATALOG_CONFIG }\r\n);\r\n\r\n/**\r\n * Overrides the JSON locations. Without it, the service reads `assets/data/*.json`.\r\n *\r\n * ```ts\r\n * providers: [provideHttpClient(withFetch()), providePlanCatalog({ priceRangesUrl: null })]\r\n * ```\r\n */\r\nexport function providePlanCatalog(\r\n config: Partial<PlanCatalogConfig> = {}\r\n): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: PLAN_CATALOG_CONFIG,\r\n useValue: { ...DEFAULT_PLAN_CATALOG_CONFIG, ...config },\r\n },\r\n ]);\r\n}\r\n\r\n/**\r\n * Reads plans, add-on services and price ranges from static JSON.\r\n * Each file is requested once and cached; filtering happens in memory.\r\n * Needs `provideHttpClient()` in the app.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class PlanCatalogService {\r\n private http = inject(HttpClient);\r\n private config = inject(PLAN_CATALOG_CONFIG);\r\n\r\n private additionals$ = this.http\r\n .get<AdditionalService[]>(this.config.additionalsUrl)\r\n .pipe(shareReplay(1));\r\n\r\n private plans$ = forkJoin({\r\n plans: this.http.get<Plan[]>(this.config.plansUrl),\r\n additionals: this.additionals$,\r\n }).pipe(\r\n map(({ plans, additionals }) => joinAdditionalServices(plans, additionals)),\r\n shareReplay(1)\r\n );\r\n\r\n private priceRanges$ = (\r\n this.config.priceRangesUrl\r\n ? this.http.get<PriceRange[]>(this.config.priceRangesUrl)\r\n : of<PriceRange[]>([])\r\n ).pipe(shareReplay(1));\r\n\r\n /** Every plan, with `additionalServices` filled in. */\r\n getPlans(): Observable<Plan[]> {\r\n return this.plans$;\r\n }\r\n\r\n getAdditionalServices(): Observable<AdditionalService[]> {\r\n return this.additionals$;\r\n }\r\n\r\n getPriceRanges(): Observable<PriceRange[]> {\r\n return this.priceRanges$;\r\n }\r\n\r\n getPlansByCategory(category: PlanCategory | number): Observable<Plan[]> {\r\n return this.plans$.pipe(map((plans) => filterPlansByCategory(plans, category)));\r\n }\r\n\r\n getPlansByFilter(filter: PlanFilter): Observable<Plan[]> {\r\n return this.plans$.pipe(map((plans) => filterPlans(plans, filter)));\r\n }\r\n\r\n getPlansByName(name: string): Observable<Plan[]> {\r\n return this.plans$.pipe(map((plans) => searchPlansByName(plans, name)));\r\n }\r\n\r\n getPlanBySlug(slug: string): Observable<Plan | undefined> {\r\n return this.plans$.pipe(map((plans) => findPlanBySlug(plans, slug)));\r\n }\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n EnvironmentProviders,\r\n inject,\r\n Injectable,\r\n InjectionToken,\r\n makeEnvironmentProviders,\r\n} from '@angular/core';\r\nimport { Meta, Title } from '@angular/platform-browser';\r\n\r\nexport interface SeoConfig {\r\n /** Production domain without a trailing slash: \"https://www.laurelspamedellin.com\". */\r\n siteUrl: string;\r\n /** Image used when a page does not set one. Relative paths are resolved against `siteUrl`. */\r\n defaultImage?: string;\r\n}\r\n\r\nexport interface SeoData {\r\n title: string;\r\n description: string;\r\n /** Page path, for example \"/planes\". */\r\n path: string;\r\n /** Image for the share preview. Defaults to `SeoConfig.defaultImage`. */\r\n image?: string;\r\n}\r\n\r\nexport const SEO_CONFIG = new InjectionToken<SeoConfig>('SEO_CONFIG');\r\n\r\n/** Registers the site data `SeoService` needs. */\r\nexport function provideSeo(config: SeoConfig): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: SEO_CONFIG,\r\n useValue: { ...config, siteUrl: config.siteUrl.replace(/\\/+$/, '') },\r\n },\r\n ]);\r\n}\r\n\r\n/**\r\n * Sets the title, description, canonical URL, Open Graph and Twitter tags, and JSON-LD blocks.\r\n * Works during SSR and prerendering. Requires `provideSeo()`.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class SeoService {\r\n private title = inject(Title);\r\n private meta = inject(Meta);\r\n private document = inject(DOCUMENT);\r\n private config = inject(SEO_CONFIG);\r\n\r\n get siteUrl(): string {\r\n return this.config.siteUrl;\r\n }\r\n\r\n /** Turns a site path or relative asset into an absolute URL. Absolute URLs are returned unchanged. */\r\n absoluteUrl(pathOrUrl: string): string {\r\n if (/^https?:\\/\\//.test(pathOrUrl)) return pathOrUrl;\r\n return this.config.siteUrl + (pathOrUrl.startsWith('/') ? pathOrUrl : '/' + pathOrUrl);\r\n }\r\n\r\n update({ title, description, path, image }: SeoData): void {\r\n const url = this.absoluteUrl(path);\r\n const imageSrc = image ?? this.config.defaultImage;\r\n\r\n this.title.setTitle(title);\r\n this.meta.updateTag({ name: 'description', content: description });\r\n\r\n this.meta.updateTag({ property: 'og:title', content: title });\r\n this.meta.updateTag({ property: 'og:description', content: description });\r\n this.meta.updateTag({ property: 'og:url', content: url });\r\n\r\n this.meta.updateTag({ name: 'twitter:title', content: title });\r\n this.meta.updateTag({ name: 'twitter:description', content: description });\r\n\r\n if (imageSrc) {\r\n const imageUrl = this.absoluteUrl(imageSrc);\r\n this.meta.updateTag({ property: 'og:image', content: imageUrl });\r\n this.meta.updateTag({ name: 'twitter:image', content: imageUrl });\r\n }\r\n\r\n this.setCanonical(url);\r\n }\r\n\r\n /** Adds or replaces a `<script type=\"application/ld+json\">` with the given id. */\r\n setJsonLd(id: string, data: object): void {\r\n let script = this.document.getElementById(id);\r\n if (!script) {\r\n script = this.document.createElement('script');\r\n script.id = id;\r\n script.setAttribute('type', 'application/ld+json');\r\n this.document.head.appendChild(script);\r\n }\r\n script.textContent = JSON.stringify(data);\r\n }\r\n\r\n removeJsonLd(id: string): void {\r\n this.document.getElementById(id)?.remove();\r\n }\r\n\r\n private setCanonical(url: string): void {\r\n let link = this.document.head.querySelector<HTMLLinkElement>('link[rel=\"canonical\"]');\r\n if (!link) {\r\n link = this.document.createElement('link');\r\n link.setAttribute('rel', 'canonical');\r\n this.document.head.appendChild(link);\r\n }\r\n link.setAttribute('href', url);\r\n }\r\n}\r\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';\r\n\r\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'whatsapp' | 'inverse';\r\nexport type ButtonSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * Shared button look for links and buttons. Every component in the library uses it,\r\n * so all calls to action share size, focus and colors.\r\n *\r\n * ```html\r\n * <a ccButton [href]=\"whatsapp\" target=\"_blank\">Reservar</a>\r\n * <button ccButton variant=\"secondary\" size=\"sm\" type=\"button\">Limpiar</button>\r\n * ```\r\n *\r\n * Tokens: --cc-btn-bg, --cc-btn-color, --cc-btn-hover-bg, --cc-btn-hover-color,\r\n * --cc-btn-border, --cc-btn-radius, --cc-btn-padding-x, --cc-btn-font-weight,\r\n * --cc-btn-letter-spacing, --cc-btn-text-transform.\r\n */\r\n@Component({\r\n selector: 'a[ccButton], button[ccButton]',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'cc-btn',\r\n '[class.cc-btn--secondary]': \"variant() === 'secondary'\",\r\n '[class.cc-btn--ghost]': \"variant() === 'ghost'\",\r\n '[class.cc-btn--whatsapp]': \"variant() === 'whatsapp'\",\r\n '[class.cc-btn--inverse]': \"variant() === 'inverse'\",\r\n '[class.cc-btn--sm]': \"size() === 'sm'\",\r\n '[class.cc-btn--lg]': \"size() === 'lg'\",\r\n '[class.cc-btn--block]': 'block()',\r\n },\r\n templateUrl: './button.component.html',\r\n styleUrls: ['../../theme/component-base.css', './button.component.css'],\r\n})\r\nexport class ButtonComponent {\r\n readonly variant = input<ButtonVariant>('primary');\r\n readonly size = input<ButtonSize>('md');\r\n /** Full width. */\r\n readonly block = input(false, { transform: booleanAttribute });\r\n}\r\n","<ng-content />\r\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';\r\n\r\n/**\r\n * Section title with optional eyebrow, icon, subtitle and decorative rule.\r\n * Use one per page section so every page shares the same heading rhythm.\r\n *\r\n * ```html\r\n * <cc-section-heading title=\"Planes\" subtitle=\"Para ti, en pareja o en grupo\" iconSrc=\"assets/images/trebol.png\" />\r\n * <cc-section-heading title=\"Contacto\" tone=\"inverse\" align=\"center\" level=\"h3\" />\r\n * ```\r\n *\r\n * Tokens: --cc-section-heading-color, --cc-section-heading-size, --cc-section-heading-rule,\r\n * --cc-section-heading-gap, --cc-section-heading-icon-size.\r\n */\r\n@Component({\r\n selector: 'cc-section-heading',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class.cc-sh--center]': \"align() === 'center'\",\r\n '[class.cc-sh--inverse]': \"tone() === 'inverse'\",\r\n '[class.cc-sh--accent]': \"tone() === 'accent'\",\r\n '[class.cc-sh--rule]': 'rule()',\r\n '[class.cc-sh--sm]': \"size() === 'sm'\",\r\n '[class.cc-sh--lg]': \"size() === 'lg'\",\r\n '[class.cc-sh--italic]': 'italic()',\r\n },\r\n templateUrl: './section-heading.component.html',\r\n styleUrls: ['../../theme/component-base.css', './section-heading.component.css'],\r\n})\r\nexport class SectionHeadingComponent {\r\n readonly title = input.required<string>();\r\n readonly subtitle = input<string>('');\r\n /** Small text above the title. */\r\n readonly eyebrow = input<string>('');\r\n readonly iconSrc = input<string>('');\r\n /** Heading level. The visual size does not change with the level. */\r\n readonly level = input<'h1' | 'h2' | 'h3'>('h2');\r\n readonly align = input<'start' | 'center'>('start');\r\n /** `default` for light backgrounds, `inverse` for dark ones, `accent` for brand-colored titles. */\r\n readonly tone = input<'default' | 'inverse' | 'accent'>('default');\r\n /** Shows a short accent line under the title. */\r\n readonly rule = input(false, { transform: booleanAttribute });\r\n /** `sm` for sub-sections, `md` (default) for page sections, `lg` for heroes. */\r\n readonly size = input<'sm' | 'md' | 'lg'>('md');\r\n readonly italic = input(false, { transform: booleanAttribute });\r\n /** Id of the heading element, for anchors. */\r\n readonly headingId = input<string | null>(null);\r\n}\r\n","<div class=\"cc-sh\">\r\n @if (eyebrow()) {\r\n <p class=\"cc-sh__eyebrow\">{{ eyebrow() }}</p>\r\n }\r\n <div class=\"cc-sh__row\">\r\n @if (iconSrc()) {\r\n <img class=\"cc-sh__icon\" [src]=\"iconSrc()\" alt=\"\" />\r\n }\r\n @switch (level()) {\r\n @case ('h1') {\r\n <h1 class=\"cc-sh__title\" [attr.id]=\"headingId()\">{{ title() }}</h1>\r\n }\r\n @case ('h3') {\r\n <h3 class=\"cc-sh__title\" [attr.id]=\"headingId()\">{{ title() }}</h3>\r\n }\r\n @default {\r\n <h2 class=\"cc-sh__title\" [attr.id]=\"headingId()\">{{ title() }}</h2>\r\n }\r\n }\r\n </div>\r\n @if (rule()) {\r\n <span class=\"cc-sh__rule\" aria-hidden=\"true\"></span>\r\n }\r\n @if (subtitle()) {\r\n <p class=\"cc-sh__subtitle\">{{ subtitle() }}</p>\r\n }\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\n\r\n/**\r\n * Highlighted note for important conditions, warnings or tips. The content is projected.\r\n *\r\n * ```html\r\n * <cc-notice tone=\"warning\" title=\"Importante\">Su bono tiene vigencia de 30 días.</cc-notice>\r\n * ```\r\n *\r\n * Tokens: --cc-notice-bg, --cc-notice-border, --cc-notice-color.\r\n */\r\n@Component({\r\n selector: 'cc-notice',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n role: 'note',\r\n '[class.cc-notice--warning]': \"tone() === 'warning'\",\r\n '[class.cc-notice--success]': \"tone() === 'success'\",\r\n },\r\n templateUrl: './notice.component.html',\r\n styleUrls: ['../../theme/component-base.css', './notice.component.css'],\r\n})\r\nexport class NoticeComponent {\r\n /** `info` uses the brand colors, `warning` a red accent, `success` the primary color. */\r\n readonly tone = input<'info' | 'warning' | 'success'>('info');\r\n readonly title = input<string>('');\r\n}\r\n","@if (title()) {\r\n <p class=\"cc-notice__title\">{{ title() }}</p>\r\n}\r\n<div class=\"cc-notice__body\"><ng-content /></div>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\n\r\n/**\r\n * One question of `cc-faq`. The answer is projected, so it can contain links.\r\n *\r\n * ```html\r\n * <cc-faq title=\"Preguntas frecuentes\">\r\n * <cc-faq-item question=\"¿Qué planes tienen?\">\r\n * Míralos todos en <a routerLink=\"/planes\">planes</a>.\r\n * </cc-faq-item>\r\n * </cc-faq>\r\n * ```\r\n *\r\n * Tokens: --cc-faq-bg, --cc-faq-question-color, --cc-faq-answer-color.\r\n */\r\n@Component({\r\n selector: 'cc-faq-item',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './faq-item.component.html',\r\n styleUrls: ['../../theme/component-base.css', './faq-item.component.css'],\r\n})\r\nexport class FaqItemComponent {\r\n readonly question = input.required<string>();\r\n /** Starts expanded. */\r\n readonly open = input<boolean>(false);\r\n}\r\n","<details class=\"cc-faq-item\" [open]=\"open()\">\r\n <summary>\r\n <span>{{ question() }}</span>\r\n <svg class=\"cc-faq-item__chevron\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n <path d=\"m6 9 6 6 6-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </summary>\r\n <div class=\"cc-faq-item__answer\"><ng-content /></div>\r\n</details>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\n\r\n/**\r\n * Floating WhatsApp button, fixed to a corner of the screen.\r\n *\r\n * `variant`:\r\n * - `icon` (default): round button with the logo.\r\n * - `extended`: pill with the logo and `label` as visible text.\r\n *\r\n * ```html\r\n * <cc-whatsapp-button [href]=\"whatsappLink\" />\r\n * <cc-whatsapp-button [href]=\"whatsappLink\" variant=\"extended\" label=\"Reservar\" position=\"left\" />\r\n * ```\r\n *\r\n * Tokens: --cc-whatsapp, --cc-whatsapp-hover, --cc-whatsapp-size, --cc-whatsapp-offset-x,\r\n * --cc-whatsapp-offset-y.\r\n */\r\n@Component({\r\n selector: 'cc-whatsapp-button',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class.cc-wa--left]': \"position() === 'left'\",\r\n '[class.cc-wa--extended]': \"variant() === 'extended'\",\r\n '[class.cc-wa--sm]': \"size() === 'sm'\",\r\n },\r\n templateUrl: './whatsapp-button.component.html',\r\n styleUrls: ['../../theme/component-base.css', './whatsapp-button.component.css'],\r\n})\r\nexport class WhatsappButtonComponent {\r\n /** WhatsApp link. Build it with `whatsappUrl(phone, message)`. */\r\n readonly href = input.required<string>();\r\n /** Custom icon. Without it, the WhatsApp logo is drawn as SVG. */\r\n readonly iconSrc = input<string>('');\r\n /** Accessible name, and the visible text in the `extended` variant. */\r\n readonly label = input<string>('Escríbenos por WhatsApp');\r\n readonly variant = input<'icon' | 'extended'>('icon');\r\n readonly size = input<'sm' | 'md'>('md');\r\n readonly position = input<'right' | 'left'>('right');\r\n}\r\n","<a class=\"cc-wa\" [href]=\"href()\" target=\"_blank\" rel=\"noopener\" [attr.aria-label]=\"variant() === 'icon' ? label() : null\">\r\n @if (iconSrc()) {\r\n <img [src]=\"iconSrc()\" alt=\"\" class=\"cc-wa__icon\" />\r\n } @else {\r\n <svg class=\"cc-wa__icon\" viewBox=\"0 0 32 32\" aria-hidden=\"true\">\r\n <circle cx=\"16\" cy=\"16\" r=\"16\" style=\"fill: var(--_whatsapp)\" />\r\n <path\r\n fill=\"#fff\"\r\n d=\"M23.3 8.7A10.3 10.3 0 0 0 7 21.1L5.6 26.4l5.4-1.4a10.3 10.3 0 0 0 4.9 1.3 10.3 10.3 0 0 0 7.4-17.6Zm-7.3 15.8a8.5 8.5 0 0 1-4.3-1.2l-.3-.2-3.2.8.9-3.1-.2-.3a8.5 8.5 0 1 1 7.1 4Zm4.7-6.4c-.3-.1-1.5-.7-1.8-.8-.2-.1-.4-.1-.6.1l-.8 1c-.2.2-.3.2-.6.1a7 7 0 0 1-3.5-3c-.3-.5.3-.4.7-1.4.1-.2 0-.3 0-.4l-.8-2c-.2-.5-.4-.4-.6-.4h-.5a1 1 0 0 0-.7.3 3 3 0 0 0-.9 2.2 5.2 5.2 0 0 0 1.1 2.8 11.9 11.9 0 0 0 4.6 4c1.7.7 2.4.8 3.2.7a2.8 2.8 0 0 0 1.8-1.3 2.3 2.3 0 0 0 .2-1.3c-.1-.1-.3-.2-.6-.3Z\"\r\n />\r\n </svg>\r\n }\r\n @if (variant() === 'extended') {\r\n <span class=\"cc-wa__label\">{{ label() }}</span>\r\n }\r\n</a>\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n afterNextRender,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ButtonComponent, ButtonVariant } from '../button/button.component';\r\n\r\n/**\r\n * Modal over the page, for example a promotion. Shows `imageSrc`, or the projected\r\n * content when there is no image, plus an optional call to action.\r\n *\r\n * It decides by itself when to open:\r\n * - `autoOpen` opens it in the browser after `delayMs` (never during SSR, so it is not\r\n * part of the prerendered page).\r\n * - `rememberKey` stores the dismissal in localStorage for `rememberDays` days, so it\r\n * does not reopen on every visit.\r\n *\r\n * Closes with the ✕ button, a backdrop click or Escape. Focus moves into the modal,\r\n * stays inside while open and returns to the previous element on close.\r\n *\r\n * ```html\r\n * <cc-promo-modal imageSrc=\"assets/images/pop.jpeg\" imageAlt=\"Promoción\" [delayMs]=\"6000\"\r\n * rememberKey=\"promo-octubre\" ctaLabel=\"Reservar la promo\" [ctaHref]=\"whatsapp\" />\r\n * ```\r\n *\r\n * Tokens: --cc-modal-backdrop, --cc-modal-radius, --cc-modal-close-bg, --cc-modal-close-color.\r\n */\r\n@Component({\r\n selector: 'cc-promo-modal',\r\n imports: [ButtonComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { '(document:keydown.escape)': 'open() && close()' },\r\n templateUrl: './promo-modal.component.html',\r\n styleUrls: ['../../theme/component-base.css', './promo-modal.component.css'],\r\n})\r\nexport class PromoModalComponent {\r\n /** Whether the modal is visible. Use `[(open)]` to control it from outside. */\r\n readonly open = model<boolean>(false);\r\n /** Opens the modal by itself in the browser after `delayMs`. */\r\n readonly autoOpen = input<boolean>(false);\r\n readonly delayMs = input<number>(0);\r\n /** localStorage key to remember the dismissal. Change it for each new promotion. */\r\n readonly rememberKey = input<string>('');\r\n readonly rememberDays = input<number>(7);\r\n\r\n readonly imageSrc = input<string>('');\r\n readonly imageAlt = input<string>('');\r\n /** Makes the image a link. */\r\n readonly link = input<string>('');\r\n /** Button under the image. Hidden when `ctaHref` is empty. */\r\n readonly ctaLabel = input<string>('Quiero esta promoción');\r\n readonly ctaHref = input<string>('');\r\n readonly ctaVariant = input<ButtonVariant>('primary');\r\n readonly closeOnBackdrop = input<boolean>(true);\r\n readonly closeLabel = input<string>('Cerrar');\r\n readonly closed = output<void>();\r\n\r\n private readonly document = inject(DOCUMENT);\r\n private readonly box = viewChild<ElementRef<HTMLElement>>('box');\r\n private readonly closeButton = viewChild<ElementRef<HTMLButtonElement>>('closeButton');\r\n private readonly isOpen = computed(() => this.open());\r\n\r\n constructor() {\r\n const destroyRef = inject(DestroyRef);\r\n\r\n afterNextRender(() => {\r\n if (!this.autoOpen() || this.wasDismissed()) return;\r\n const timer = setTimeout(() => this.open.set(true), Math.max(this.delayMs(), 0));\r\n destroyRef.onDestroy(() => clearTimeout(timer));\r\n });\r\n\r\n effect((onCleanup) => {\r\n if (!this.isOpen()) return;\r\n untracked(() => {\r\n const body = this.document.body;\r\n const previousOverflow = body.style.overflow;\r\n const opener = this.document.activeElement as HTMLElement | null;\r\n body.style.overflow = 'hidden';\r\n queueMicrotask(() => this.closeButton()?.nativeElement.focus());\r\n onCleanup(() => {\r\n body.style.overflow = previousOverflow;\r\n opener?.focus?.();\r\n });\r\n });\r\n });\r\n }\r\n\r\n close(): void {\r\n this.open.set(false);\r\n this.remember();\r\n this.closed.emit();\r\n }\r\n\r\n /** Keeps Tab and Shift+Tab inside the modal. */\r\n protected trapFocus(event: KeyboardEvent): void {\r\n if (event.key !== 'Tab') return;\r\n const focusable = this.box()?.nativeElement.querySelectorAll<HTMLElement>('a[href], button');\r\n if (!focusable?.length) return;\r\n const first = focusable[0];\r\n const last = focusable[focusable.length - 1];\r\n const active = this.document.activeElement;\r\n if (event.shiftKey && active === first) {\r\n event.preventDefault();\r\n last.focus();\r\n } else if (!event.shiftKey && active === last) {\r\n event.preventDefault();\r\n first.focus();\r\n }\r\n }\r\n\r\n private storage(): Storage | null {\r\n try {\r\n return this.document.defaultView?.localStorage ?? null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private wasDismissed(): boolean {\r\n const key = this.rememberKey();\r\n if (!key) return false;\r\n try {\r\n const until = Number(this.storage()?.getItem(`cc-promo:${key}`) ?? 0);\r\n return until > Date.now();\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private remember(): void {\r\n const key = this.rememberKey();\r\n if (!key) return;\r\n try {\r\n const until = Date.now() + this.rememberDays() * 24 * 60 * 60 * 1000;\r\n this.storage()?.setItem(`cc-promo:${key}`, String(until));\r\n } catch {\r\n // Storage can be unavailable (private mode, blocked cookies); the modal still works.\r\n }\r\n }\r\n}\r\n","@if (open()) {\r\n <div class=\"cc-modal\" (click)=\"closeOnBackdrop() && close()\">\r\n <div\r\n #box\r\n class=\"cc-modal__box\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-label]=\"imageAlt() || null\"\r\n (click)=\"$event.stopPropagation()\"\r\n (keydown)=\"trapFocus($event)\"\r\n >\r\n <button #closeButton type=\"button\" class=\"cc-modal__close\" [attr.aria-label]=\"closeLabel()\" (click)=\"close()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6 6 18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>\r\n </button>\r\n @if (imageSrc()) {\r\n @if (link()) {\r\n <a [href]=\"link()\" target=\"_blank\" rel=\"noopener\" class=\"cc-modal__media\">\r\n <img [src]=\"imageSrc()\" [alt]=\"imageAlt()\" class=\"cc-modal__img\" />\r\n </a>\r\n } @else {\r\n <img [src]=\"imageSrc()\" [alt]=\"imageAlt()\" class=\"cc-modal__img\" />\r\n }\r\n } @else {\r\n <div class=\"cc-modal__content\"><ng-content /></div>\r\n }\r\n @if (ctaHref()) {\r\n <a ccButton [variant]=\"ctaVariant()\" size=\"lg\" block class=\"cc-modal__cta\" [href]=\"ctaHref()\" target=\"_blank\" rel=\"noopener\" (click)=\"close()\">\r\n {{ ctaLabel() }}\r\n </a>\r\n }\r\n </div>\r\n </div>\r\n}\r\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\nimport { LinkTarget } from '../../models/ui.models';\r\n\r\n/**\r\n * Title strip at the top of a page, with an optional back link and icon.\r\n * Renders the page's `<h1>`.\r\n *\r\n * ```html\r\n * <cc-page-banner title=\"Reserva tu plan - Pareja\" />\r\n * <cc-page-banner [title]=\"plan.name\" backLink=\"/planes\" iconSrc=\"assets/icons/hoja.png\" size=\"lg\" italic />\r\n * ```\r\n *\r\n * Tokens: --cc-banner-bg, --cc-banner-color, --cc-banner-padding.\r\n */\r\n@Component({\r\n selector: 'cc-page-banner',\r\n imports: [RouterLink],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class.cc-banner--plain]': \"variant() === 'plain'\",\r\n '[class.cc-banner--sm]': \"size() === 'sm'\",\r\n '[class.cc-banner--lg]': \"size() === 'lg'\",\r\n '[class.cc-banner--italic]': 'italic()',\r\n '[class.cc-banner--start]': \"align() === 'start'\",\r\n },\r\n templateUrl: './page-banner.component.html',\r\n styleUrls: ['../../theme/component-base.css', './page-banner.component.css'],\r\n})\r\nexport class PageBannerComponent {\r\n readonly title = input.required<string>();\r\n readonly subtitle = input<string>('');\r\n /** `band` draws a surface-colored strip; `plain` has no background. */\r\n readonly variant = input<'band' | 'plain'>('band');\r\n readonly size = input<'sm' | 'md' | 'lg'>('md');\r\n readonly italic = input(false, { transform: booleanAttribute });\r\n readonly align = input<'center' | 'start'>('center');\r\n readonly iconSrc = input<string>('');\r\n /** Shows a back arrow that links here. */\r\n readonly backLink = input<LinkTarget | null>(null);\r\n readonly backIconSrc = input<string>('');\r\n readonly backLabel = input<string>('Volver');\r\n}\r\n","<div class=\"cc-banner\">\r\n @if (backLink()) {\r\n <a class=\"cc-banner__back\" [routerLink]=\"backLink()\" [attr.aria-label]=\"backLabel()\">\r\n @if (backIconSrc()) {\r\n <img [src]=\"backIconSrc()\" alt=\"\" />\r\n } @else {\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n <path d=\"M15 18l-6-6 6-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </a>\r\n }\r\n <div class=\"cc-banner__text\">\r\n <div class=\"cc-banner__title\">\r\n <h1>{{ title() }}</h1>\r\n @if (iconSrc()) {\r\n <img [src]=\"iconSrc()\" alt=\"\" class=\"cc-banner__icon\" />\r\n }\r\n </div>\r\n @if (subtitle()) {\r\n <p class=\"cc-banner__subtitle\">{{ subtitle() }}</p>\r\n }\r\n </div>\r\n @if (backLink()) {\r\n <span class=\"cc-banner__spacer\" aria-hidden=\"true\"></span>\r\n }\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\n\r\n/**\r\n * Title with a paragraph, used for policy sections.\r\n * Extra content (lists, notes) can be projected under the text.\r\n *\r\n * ```html\r\n * <cc-info-item title=\"Pagos\" text=\"Aceptamos Nequi, Daviplata y efectivo.\" />\r\n * <cc-info-item title=\"Bonos Spa\" [text]=\"texto\" headingId=\"bonos\">\r\n * <ul><li>…</li></ul>\r\n * </cc-info-item>\r\n * ```\r\n *\r\n * Tokens: --cc-info-title-color, --cc-info-text-color, --cc-info-text-align, --cc-info-max-width.\r\n */\r\n@Component({\r\n selector: 'cc-info-item',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class.cc-info--neutral]': \"tone() === 'neutral'\",\r\n '[class.cc-info--sm]': \"size() === 'sm'\",\r\n },\r\n templateUrl: './info-item.component.html',\r\n styleUrls: ['../../theme/component-base.css', './info-item.component.css'],\r\n})\r\nexport class InfoItemComponent {\r\n readonly title = input.required<string>();\r\n readonly text = input<string>('');\r\n /** `accent` colors the title with the accent text color, `neutral` with the heading color. */\r\n readonly tone = input<'accent' | 'neutral'>('accent');\r\n readonly size = input<'sm' | 'md'>('md');\r\n readonly headingLevel = input<'h2' | 'h3'>('h2');\r\n /** Id of the heading, for anchors from a table of contents. */\r\n readonly headingId = input<string | null>(null);\r\n}\r\n","@if (headingLevel() === 'h3') {\r\n <h3 class=\"cc-info__title\" [attr.id]=\"headingId()\">{{ title() }}</h3>\r\n} @else {\r\n <h2 class=\"cc-info__title\" [attr.id]=\"headingId()\">{{ title() }}</h2>\r\n}\r\n@if (text()) {\r\n <p class=\"cc-info__text\">{{ text() }}</p>\r\n}\r\n<div class=\"cc-info__extra\"><ng-content /></div>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { FaqItem } from '../../models/ui.models';\r\nimport { FaqItemComponent } from '../faq-item/faq-item.component';\r\n\r\n/**\r\n * Frequently asked questions as native `<details>` elements, so the answers stay in\r\n * the prerendered HTML for search engines. Pass plain `items`, or project\r\n * `<cc-faq-item>` elements when an answer needs links.\r\n *\r\n * ```html\r\n * <cc-faq title=\"Preguntas frecuentes\" [items]=\"faq\" />\r\n * <cc-faq title=\"Preguntas frecuentes\">\r\n * <cc-faq-item question=\"¿Qué planes tienen?\">Míralos en <a routerLink=\"/planes\">planes</a>.</cc-faq-item>\r\n * </cc-faq>\r\n * ```\r\n *\r\n * Tokens: --cc-faq-title-color, --cc-faq-gap, plus the ones of `cc-faq-item`.\r\n */\r\n@Component({\r\n selector: 'cc-faq',\r\n imports: [FaqItemComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './faq.component.html',\r\n styleUrls: ['../../theme/component-base.css', './faq.component.css'],\r\n})\r\nexport class FaqComponent {\r\n readonly items = input<FaqItem[]>([]);\r\n readonly title = input<string>('');\r\n readonly headingLevel = input<'h2' | 'h3'>('h2');\r\n}\r\n","@if (title()) {\r\n @if (headingLevel() === 'h3') {\r\n <h3 class=\"cc-faq__title\">{{ title() }}</h3>\r\n } @else {\r\n <h2 class=\"cc-faq__title\">{{ title() }}</h2>\r\n }\r\n}\r\n<div class=\"cc-faq__list\">\r\n @for (item of items(); track item.question) {\r\n <cc-faq-item [question]=\"item.question\">{{ item.answer }}</cc-faq-item>\r\n }\r\n <ng-content />\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { SocialLink } from '../../models/ui.models';\r\n\r\n/**\r\n * Row of social network icons that open in a new tab. Each link has a 44px tap area\r\n * even when the icon is smaller.\r\n *\r\n * ```html\r\n * <cc-social-links [links]=\"socials\" size=\"sm\" tone=\"inverse\" />\r\n * ```\r\n *\r\n * Tokens: --cc-social-icon-size, --cc-social-gap.\r\n */\r\n@Component({\r\n selector: 'cc-social-links',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class.cc-social--sm]': \"size() === 'sm'\",\r\n '[class.cc-social--lg]': \"size() === 'lg'\",\r\n '[class.cc-social--inverse]': \"tone() === 'inverse'\",\r\n },\r\n templateUrl: './social-links.component.html',\r\n styleUrls: ['../../theme/component-base.css', './social-links.component.css'],\r\n})\r\nexport class SocialLinksComponent {\r\n readonly links = input.required<SocialLink[]>();\r\n /** Icon size: `sm` 1rem, `md` 1.5rem, `lg` 2.5rem. */\r\n readonly size = input<'sm' | 'md' | 'lg'>('md');\r\n /** `inverse` for dark backgrounds: changes the hover and focus colors. */\r\n readonly tone = input<'default' | 'inverse'>('default');\r\n}\r\n","<ul class=\"cc-social\">\r\n @for (link of links(); track link.href) {\r\n <li>\r\n <a class=\"cc-social__link\" [href]=\"link.href\" target=\"_blank\" rel=\"noopener\" [attr.aria-label]=\"link.label\">\r\n <img [src]=\"link.iconSrc\" alt=\"\" />\r\n </a>\r\n </li>\r\n }\r\n</ul>\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\nimport { LinkTarget } from '../../models/ui.models';\r\nimport { formatPrice, PriceFormat } from '../../utils/text.utils';\r\nimport { ButtonComponent, ButtonVariant } from '../button/button.component';\r\n\r\n/**\r\n * Plan card: photo, name, details, price and a call to action.\r\n * With `link`, the whole card is clickable and navigates with the router; without it,\r\n * the button emits `ctaClick`. With `skeleton`, it renders a loading placeholder.\r\n *\r\n * ```html\r\n * <cc-plan-card [name]=\"plan.name\" [imageSrc]=\"plan.imgPath\" [price]=\"plan.price\"\r\n * meta=\"2 h · 2 personas\" [link]=\"['/planes', slug]\" />\r\n * ```\r\n *\r\n * Tokens: --cc-plan-card-bg, --cc-plan-card-color, --cc-plan-card-border,\r\n * --cc-plan-card-radius, --cc-plan-card-shadow, --cc-plan-card-image-ratio,\r\n * --cc-plan-card-price-color.\r\n */\r\n@Component({\r\n selector: 'cc-plan-card',\r\n imports: [RouterLink, ButtonComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class.cc-card--outlined]': \"appearance() === 'outlined'\",\r\n '[class.cc-card--plain]': \"appearance() === 'plain'\",\r\n '[class.cc-card--skeleton]': 'skeleton()',\r\n '[attr.aria-busy]': 'skeleton() || null',\r\n },\r\n templateUrl: './plan-card.component.html',\r\n styleUrls: ['../../theme/component-base.css', './plan-card.component.css'],\r\n})\r\nexport class PlanCardComponent {\r\n readonly name = input<string>('');\r\n readonly imageSrc = input<string>('');\r\n /** Defaults to `name`. */\r\n readonly imageAlt = input<string>('');\r\n /** Short line under the name, for example \"2 h 20 min · 2 personas\". */\r\n readonly meta = input<string>('');\r\n /** Price to show. Leave it null to hide it. */\r\n readonly price = input<number | null>(null);\r\n /** Text before the price, for example \"Desde\". */\r\n readonly priceLabel = input<string>('');\r\n readonly priceFormat = input<PriceFormat>({});\r\n readonly link = input<LinkTarget | null>(null);\r\n /** Query params of `link`, for example `{ categoria: 'pareja' }`. */\r\n readonly queryParams = input<Record<string, string> | null>(null);\r\n readonly ctaLabel = input<string>('Ver plan');\r\n readonly ctaVariant = input<ButtonVariant>('primary');\r\n /** `filled` uses the surface color, `outlined` a border on white, `plain` no box. */\r\n readonly appearance = input<'filled' | 'outlined' | 'plain'>('filled');\r\n /** Heading level of the name inside the page outline. */\r\n readonly headingLevel = input<'h2' | 'h3'>('h2');\r\n /** Renders a loading placeholder instead of the content. */\r\n readonly skeleton = input<boolean>(false);\r\n readonly ctaClick = output<void>();\r\n\r\n protected readonly formattedPrice = computed(() => {\r\n const price = this.price();\r\n return price === null ? '' : formatPrice(price, this.priceFormat());\r\n });\r\n}\r\n","@if (skeleton()) {\r\n <article class=\"cc-card\" aria-hidden=\"true\">\r\n <div class=\"cc-card__media cc-card__shimmer\"></div>\r\n <div class=\"cc-card__body\">\r\n <span class=\"cc-card__line cc-card__shimmer\"></span>\r\n <span class=\"cc-card__line cc-card__line--short cc-card__shimmer\"></span>\r\n <span class=\"cc-card__line cc-card__line--button cc-card__shimmer\"></span>\r\n </div>\r\n </article>\r\n} @else {\r\n <article class=\"cc-card\" [class.cc-card--linked]=\"!!link()\">\r\n <div class=\"cc-card__media\">\r\n <img\r\n class=\"cc-card__img\"\r\n [src]=\"imageSrc()\"\r\n [alt]=\"imageAlt() || name()\"\r\n width=\"400\"\r\n height=\"400\"\r\n loading=\"lazy\"\r\n decoding=\"async\"\r\n />\r\n </div>\r\n <div class=\"cc-card__body\">\r\n @if (headingLevel() === 'h3') {\r\n <h3 class=\"cc-card__name\">{{ name() }}</h3>\r\n } @else {\r\n <h2 class=\"cc-card__name\">{{ name() }}</h2>\r\n }\r\n @if (meta()) {\r\n <p class=\"cc-card__meta\">{{ meta() }}</p>\r\n }\r\n @if (formattedPrice()) {\r\n <p class=\"cc-card__price\">\r\n @if (priceLabel()) {\r\n <span class=\"cc-card__price-label\">{{ priceLabel() }}</span>\r\n }\r\n {{ formattedPrice() }}\r\n </p>\r\n }\r\n <div class=\"cc-card__actions\">\r\n @if (link()) {\r\n <a ccButton [variant]=\"ctaVariant()\" block class=\"cc-card__cta\" [routerLink]=\"link()\" [queryParams]=\"queryParams()\" (click)=\"ctaClick.emit()\">\r\n {{ ctaLabel() }}<span class=\"cc-sr-only\">: {{ name() }}</span>\r\n </a>\r\n } @else {\r\n <button ccButton [variant]=\"ctaVariant()\" block type=\"button\" (click)=\"ctaClick.emit()\">{{ ctaLabel() }}</button>\r\n }\r\n </div>\r\n </div>\r\n </article>\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, model } from '@angular/core';\r\nimport { CategoryOption } from '../../models/plan.models';\r\n\r\n/**\r\n * Category selector with a single selected option. Each option is a toggle button\r\n * (`aria-pressed`), so it works with Tab and Enter/Space.\r\n *\r\n * `layout`:\r\n * - `list`: vertical list, for sidebars.\r\n * - `chips`: one scrollable row of pills, for small screens.\r\n * - `auto` (default): chips below 1024px, list from 1024px.\r\n *\r\n * ```html\r\n * <cc-category-menu [options]=\"categories\" [(selected)]=\"category\" />\r\n * ```\r\n *\r\n * Tokens: --cc-category-color, --cc-category-hover-bg, --cc-category-active-bg,\r\n * --cc-category-active-color, --cc-category-chip-border.\r\n */\r\n@Component({\r\n selector: 'cc-category-menu',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class.cc-cat--list]': \"layout() === 'list'\",\r\n '[class.cc-cat--chips]': \"layout() === 'chips'\",\r\n '[class.cc-cat--auto]': \"layout() === 'auto'\",\r\n },\r\n templateUrl: './category-menu.component.html',\r\n styleUrls: ['../../theme/component-base.css', './category-menu.component.css'],\r\n})\r\nexport class CategoryMenuComponent<T = unknown> {\r\n readonly options = input.required<CategoryOption<T>[]>();\r\n /** Selected value. Use `[(selected)]` to bind both ways. */\r\n readonly selected = model<T | null>(null);\r\n readonly title = input<string>('Categorías');\r\n readonly layout = input<'auto' | 'list' | 'chips'>('auto');\r\n\r\n select(value: T): void {\r\n this.selected.set(value);\r\n }\r\n}\r\n","<nav class=\"cc-cat\" [attr.aria-label]=\"title() || null\">\r\n @if (title()) {\r\n <p class=\"cc-cat__title\">{{ title() }}</p>\r\n }\r\n <ul class=\"cc-cat__list\">\r\n @for (option of options(); track option.value) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"cc-cat__item\"\r\n [class.cc-cat__item--active]=\"option.value === selected()\"\r\n [attr.aria-pressed]=\"option.value === selected()\"\r\n (click)=\"select(option.value)\"\r\n >\r\n <span>{{ option.label }}</span>\r\n @if (option.count !== undefined && option.count !== null) {\r\n <span class=\"cc-cat__count\"><span class=\"cc-sr-only\">(</span>{{ option.count }}<span class=\"cc-sr-only\"> planes)</span></span>\r\n }\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n</nav>\r\n","import { ChangeDetectionStrategy, Component, input, model, output } from '@angular/core';\r\n\r\n/**\r\n * Text field with a search button. Emits `search` on Enter or on the button.\r\n *\r\n * ```html\r\n * <cc-search-box placeholder=\"Buscar plan\" [(value)]=\"query\" (search)=\"onSearch($event)\" />\r\n * ```\r\n *\r\n * Tokens: --cc-search-bg, --cc-search-border, --cc-search-btn-bg, --cc-search-btn-color,\r\n * --cc-search-radius.\r\n */\r\n@Component({\r\n selector: 'cc-search-box',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './search-box.component.html',\r\n styleUrls: ['../../theme/component-base.css', './search-box.component.css'],\r\n})\r\nexport class SearchBoxComponent {\r\n readonly value = model<string>('');\r\n readonly placeholder = input<string>('Buscar plan');\r\n /** Accessible name of the field. Defaults to `placeholder`. */\r\n readonly label = input<string>('');\r\n readonly buttonLabel = input<string>('Buscar');\r\n readonly iconSrc = input<string>('');\r\n readonly search = output<string>();\r\n\r\n onInput(event: Event): void {\r\n this.value.set((event.target as HTMLInputElement).value);\r\n }\r\n}\r\n","<form class=\"cc-search\" role=\"search\" (submit)=\"$event.preventDefault(); search.emit(value())\">\r\n <input\r\n type=\"search\"\r\n class=\"cc-search__input\"\r\n [placeholder]=\"placeholder()\"\r\n [attr.aria-label]=\"label() || placeholder()\"\r\n [value]=\"value()\"\r\n (input)=\"onInput($event)\"\r\n />\r\n <button type=\"submit\" class=\"cc-search__btn\" [attr.aria-label]=\"buttonLabel()\">\r\n @if (iconSrc()) {\r\n <img [src]=\"iconSrc()\" alt=\"\" />\r\n } @else {\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n <path d=\"m20 20-3.5-3.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n </svg>\r\n }\r\n </button>\r\n</form>\r\n","import { ChangeDetectionStrategy, Component, computed, input, output, signal } from '@angular/core';\r\nimport { AdditionalService, PlanFilter, PriceRange } from '../../models/plan.models';\r\nimport { ButtonComponent } from '../button/button.component';\r\n\r\n/**\r\n * Filter by included service and price range. The options come in as inputs,\r\n * so the form does not load data by itself.\r\n *\r\n * `mode`:\r\n * - `instant` (default): emits `filterChange` as soon as an option changes.\r\n * - `submit`: emits when the user presses the submit button.\r\n *\r\n * ```html\r\n * <cc-plan-filter-form [services]=\"services\" [priceRanges]=\"ranges\" (filterChange)=\"apply($event)\" />\r\n * ```\r\n *\r\n * Tokens: --cc-filter-field-bg, --cc-filter-field-border, --cc-filter-label-color.\r\n */\r\n@Component({\r\n selector: 'cc-plan-filter-form',\r\n imports: [ButtonComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './plan-filter-form.component.html',\r\n styleUrls: ['../../theme/component-base.css', './plan-filter-form.component.css'],\r\n})\r\nexport class PlanFilterFormComponent {\r\n readonly services = input<AdditionalService[]>([]);\r\n readonly priceRanges = input<PriceRange[]>([]);\r\n readonly mode = input<'instant' | 'submit'>('instant');\r\n readonly serviceLabel = input<string>('Servicio incluido');\r\n readonly priceLabel = input<string>('Rango de precio');\r\n readonly anyLabel = input<string>('Todos');\r\n readonly submitLabel = input<string>('Filtrar');\r\n readonly resetLabel = input<string>('Limpiar filtros');\r\n /** Emits the current filter, and an empty filter on reset. */\r\n readonly filterChange = output<PlanFilter>();\r\n\r\n protected readonly serviceIndex = signal(-1);\r\n protected readonly rangeIndex = signal(-1);\r\n protected readonly hasSelection = computed(() => this.serviceIndex() !== -1 || this.rangeIndex() !== -1);\r\n\r\n protected onServiceChange(event: Event): void {\r\n this.serviceIndex.set(this.toIndex(event));\r\n if (this.mode() === 'instant') this.submit();\r\n }\r\n\r\n protected onRangeChange(event: Event): void {\r\n this.rangeIndex.set(this.toIndex(event));\r\n if (this.mode() === 'instant') this.submit();\r\n }\r\n\r\n submit(): void {\r\n this.filterChange.emit({\r\n service: this.services()[this.serviceIndex()] ?? null,\r\n priceRange: this.priceRanges()[this.rangeIndex()] ?? null,\r\n });\r\n }\r\n\r\n reset(): void {\r\n this.serviceIndex.set(-1);\r\n this.rangeIndex.set(-1);\r\n this.filterChange.emit({ service: null, priceRange: null });\r\n }\r\n\r\n private toIndex(event: Event): number {\r\n return Number((event.target as HTMLSelectElement).value);\r\n }\r\n}\r\n","<form class=\"cc-filter\" (submit)=\"$event.preventDefault(); submit()\">\r\n @if (services().length) {\r\n <label class=\"cc-filter__field\">\r\n <span>{{ serviceLabel() }}</span>\r\n <select (change)=\"onServiceChange($event)\">\r\n <option value=\"-1\" [selected]=\"serviceIndex() === -1\">{{ anyLabel() }}</option>\r\n @for (service of services(); track $index) {\r\n <option [value]=\"$index\" [selected]=\"serviceIndex() === $index\">{{ service.name }}</option>\r\n }\r\n </select>\r\n </label>\r\n }\r\n @if (priceRanges().length) {\r\n <label class=\"cc-filter__field\">\r\n <span>{{ priceLabel() }}</span>\r\n <select (change)=\"onRangeChange($event)\">\r\n <option value=\"-1\" [selected]=\"rangeIndex() === -1\">{{ anyLabel() }}</option>\r\n @for (range of priceRanges(); track $index) {\r\n <option [value]=\"$index\" [selected]=\"rangeIndex() === $index\">{{ range.description }}</option>\r\n }\r\n </select>\r\n </label>\r\n }\r\n <div class=\"cc-filter__actions\">\r\n @if (mode() === 'submit') {\r\n <button ccButton size=\"sm\" type=\"submit\">{{ submitLabel() }}</button>\r\n }\r\n @if (mode() === 'submit' || hasSelection()) {\r\n <button ccButton variant=\"ghost\" size=\"sm\" type=\"button\" (click)=\"reset()\">{{ resetLabel() }}</button>\r\n }\r\n </div>\r\n</form>\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n Directive,\r\n input,\r\n model,\r\n signal,\r\n TemplateRef,\r\n viewChild,\r\n} from '@angular/core';\r\nimport {\r\n AdditionalService,\r\n CategoryOption,\r\n DEFAULT_PLAN_CATEGORIES,\r\n Plan,\r\n PlanCategory,\r\n PlanFilter,\r\n PriceRange,\r\n} from '../../models/plan.models';\r\nimport { LinkTarget } from '../../models/ui.models';\r\nimport {\r\n filterPlans,\r\n filterPlansByCategory,\r\n planSlug,\r\n searchPlansByName,\r\n withCategoryCounts,\r\n} from '../../utils/plan.utils';\r\nimport { PriceFormat } from '../../utils/text.utils';\r\nimport { ButtonComponent, ButtonVariant } from '../button/button.component';\r\nimport { CategoryMenuComponent } from '../category-menu/category-menu.component';\r\nimport { PageBannerComponent } from '../page-banner/page-banner.component';\r\nimport { PlanCardComponent } from '../plan-card/plan-card.component';\r\nimport { PlanFilterFormComponent } from '../plan-filter-form/plan-filter-form.component';\r\nimport { SearchBoxComponent } from '../search-box/search-box.component';\r\n\r\n/** Context of a custom card template: `<ng-template ccPlanCard let-plan let-link=\"link\">`. */\r\nexport interface PlanCardContext {\r\n $implicit: Plan;\r\n link: LinkTarget;\r\n}\r\n\r\n/** Marks an `<ng-template>` inside `cc-plan-catalog` as the card to render for each plan. */\r\n@Directive({ selector: 'ng-template[ccPlanCard]' })\r\nexport class PlanCardTemplateDirective {\r\n static ngTemplateContextGuard(_dir: PlanCardTemplateDirective, ctx: unknown): ctx is PlanCardContext {\r\n return true;\r\n }\r\n}\r\n\r\n/** Default detail line of a card: \"2 horas 20 minutos · 2 personas\". */\r\nexport function defaultPlanMeta(plan: Plan): string {\r\n const people = Math.max(plan.cuantity || 1, 1);\r\n const duration = plan.duration ? plan.duration.toLowerCase() : '';\r\n return [duration, `${people} ${people > 1 ? 'personas' : 'persona'}`].filter(Boolean).join(' · ');\r\n}\r\n\r\n/**\r\n * Full plan list page: title, name search, category menu, filter and card grid.\r\n * It only needs the plans; the rest has Spanish defaults you can override.\r\n *\r\n * - `plans` set to `null` means \"loading\" and shows placeholder cards.\r\n * - `[(category)]` is two-way, so a page can keep it in the URL (`?categoria=pareja`).\r\n * - Selecting a category shows its plans. Searching by name or filtering looks across\r\n * every category; clearing the search goes back to the selected category.\r\n *\r\n * ```html\r\n * <cc-plan-catalog [plans]=\"plans()\" [services]=\"services()\" [priceRanges]=\"ranges()\" [(category)]=\"category\" />\r\n * ```\r\n *\r\n * Tokens: --cc-catalog-panel-bg, --cc-catalog-sidebar-width, --cc-catalog-column-min,\r\n * --cc-catalog-gap.\r\n */\r\n@Component({\r\n selector: 'cc-plan-catalog',\r\n imports: [\r\n NgTemplateOutlet,\r\n ButtonComponent,\r\n PageBannerComponent,\r\n SearchBoxComponent,\r\n CategoryMenuComponent,\r\n PlanFilterFormComponent,\r\n PlanCardComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './plan-catalog.component.html',\r\n styleUrls: ['../../theme/component-base.css', './plan-catalog.component.css'],\r\n})\r\nexport class PlanCatalogComponent {\r\n /** The plans, or `null` while they load. */\r\n readonly plans = input.required<Plan[] | null>();\r\n readonly categories = input<CategoryOption[]>(DEFAULT_PLAN_CATEGORIES);\r\n /** Selected category. Use `[(category)]` to bind it; `null` means `initialCategory`. */\r\n readonly category = model<PlanCategory | number | null>(null);\r\n readonly initialCategory = input<PlanCategory | number>(PlanCategory.Individual);\r\n /** Shows how many plans each category has, counted from `plans`. */\r\n readonly showCounts = input<boolean>(true);\r\n /** Options for the filter form. The filter is hidden when both are empty. */\r\n readonly services = input<AdditionalService[]>([]);\r\n readonly priceRanges = input<PriceRange[]>([]);\r\n /** Where each card links to. Defaults to `/planes/<slug>`. */\r\n readonly detailsLink = input<(plan: Plan) => LinkTarget>((plan) => ['/planes', planSlug(plan)]);\r\n\r\n // Cards\r\n readonly showPrice = input<boolean>(true);\r\n readonly priceLabel = input<string>('');\r\n readonly priceFormat = input<PriceFormat>({});\r\n /** Detail line of each card. Defaults to duration and number of people. */\r\n readonly planMeta = input<(plan: Plan) => string>(defaultPlanMeta);\r\n readonly cardAppearance = input<'filled' | 'outlined' | 'plain'>('filled');\r\n readonly ctaLabel = input<string>('Ver plan');\r\n readonly ctaVariant = input<ButtonVariant>('primary');\r\n /** Added after the plan name in each image's alt text. */\r\n readonly imageAltSuffix = input<string>('');\r\n readonly skeletonCount = input<number>(6);\r\n\r\n // Texts and layout\r\n readonly showBanner = input<boolean>(true);\r\n readonly showSearch = input<boolean>(true);\r\n readonly titlePrefix = input<string>('Reserva tu plan');\r\n readonly resultsTitle = input<string>('Resultados');\r\n readonly categoriesTitle = input<string>('Categorías');\r\n readonly categoriesLayout = input<'auto' | 'list' | 'chips'>('auto');\r\n readonly searchPlaceholder = input<string>('Buscar plan');\r\n readonly searchIconSrc = input<string>('');\r\n readonly filterTitle = input<string>('Filtrar');\r\n readonly filterIconSrc = input<string>('');\r\n readonly emptyMessage = input<string>('No encontramos planes con esos criterios.');\r\n readonly emptyActionLabel = input<string>('Ver todos los planes');\r\n /** Optional contact link shown in the empty state, for example WhatsApp. */\r\n readonly contactHref = input<string>('');\r\n readonly contactLabel = input<string>('Pregúntanos por WhatsApp');\r\n\r\n protected readonly cardTemplate = contentChild(PlanCardTemplateDirective, { read: TemplateRef });\r\n private readonly filterForm = viewChild(PlanFilterFormComponent);\r\n\r\n protected readonly query = signal('');\r\n protected readonly filter = signal<PlanFilter | null>(null);\r\n protected readonly filterOpen = signal(false);\r\n /** Set when the user searched or filtered; results then cover every category. */\r\n protected readonly searching = signal(false);\r\n\r\n protected readonly loading = computed(() => this.plans() === null);\r\n protected readonly skeletons = computed(() => Array.from({ length: this.skeletonCount() }, (_, i) => i));\r\n\r\n /** Category shown in the menu: none while searching. */\r\n protected readonly activeCategory = computed(() =>\r\n this.searching() ? null : (this.category() ?? this.initialCategory())\r\n );\r\n\r\n protected readonly categoryOptions = computed(() =>\r\n this.showCounts() ? withCategoryCounts(this.categories(), this.plans() ?? []) : this.categories()\r\n );\r\n\r\n protected readonly hasFilter = computed(\r\n () => this.services().length > 0 || this.priceRanges().length > 0\r\n );\r\n\r\n protected readonly visiblePlans = computed(() => {\r\n const plans = this.plans() ?? [];\r\n if (!this.searching()) {\r\n return filterPlansByCategory(plans, this.category() ?? this.initialCategory());\r\n }\r\n const byName = searchPlansByName(plans, this.query());\r\n const filter = this.filter();\r\n return filter ? filterPlans(byName, filter) : byName;\r\n });\r\n\r\n protected readonly title = computed(() => {\r\n if (this.searching()) return `${this.titlePrefix()} - ${this.resultsTitle()}`;\r\n const option = this.categories().find((c) => c.value === this.activeCategory());\r\n return option ? `${this.titlePrefix()} - ${option.label}` : this.titlePrefix();\r\n });\r\n\r\n protected selectCategory(value: PlanCategory | number | null): void {\r\n if (value === null) return;\r\n this.clearSearch();\r\n this.category.set(value);\r\n }\r\n\r\n protected onSearch(query: string): void {\r\n this.query.set(query);\r\n this.updateSearching();\r\n }\r\n\r\n protected onFilter(filter: PlanFilter): void {\r\n const empty = !filter.service && !filter.priceRange;\r\n this.filter.set(empty ? null : filter);\r\n this.updateSearching();\r\n }\r\n\r\n /** Clears search and filter and shows the selected category again. */\r\n protected showAll(): void {\r\n this.filterForm()?.reset();\r\n this.clearSearch();\r\n }\r\n\r\n protected linkFor(plan: Plan): LinkTarget {\r\n return this.detailsLink()(plan);\r\n }\r\n\r\n protected metaFor(plan: Plan): string {\r\n return this.planMeta()(plan);\r\n }\r\n\r\n private clearSearch(): void {\r\n this.query.set('');\r\n this.filter.set(null);\r\n this.searching.set(false);\r\n }\r\n\r\n private updateSearching(): void {\r\n this.searching.set(!!this.query().trim() || !!this.filter());\r\n }\r\n}\r\n","@if (showBanner()) {\r\n <cc-page-banner [title]=\"title()\" />\r\n}\r\n\r\n<div class=\"cc-catalog\">\r\n <aside class=\"cc-catalog__side\">\r\n <div class=\"cc-catalog__panel\">\r\n @if (showSearch()) {\r\n <cc-search-box\r\n [placeholder]=\"searchPlaceholder()\"\r\n [iconSrc]=\"searchIconSrc()\"\r\n [(value)]=\"query\"\r\n (search)=\"onSearch($event)\"\r\n />\r\n }\r\n\r\n <cc-category-menu\r\n [title]=\"categoriesTitle()\"\r\n [layout]=\"categoriesLayout()\"\r\n [options]=\"categoryOptions()\"\r\n [selected]=\"activeCategory()\"\r\n (selectedChange)=\"selectCategory($event)\"\r\n />\r\n\r\n @if (hasFilter()) {\r\n <div class=\"cc-catalog__filter\">\r\n <button\r\n type=\"button\"\r\n class=\"cc-catalog__filter-toggle\"\r\n aria-controls=\"cc-catalog-filter\"\r\n [attr.aria-expanded]=\"filterOpen()\"\r\n (click)=\"filterOpen.set(!filterOpen())\"\r\n >\r\n <span>{{ filterTitle() }}</span>\r\n @if (filterIconSrc()) {\r\n <img [src]=\"filterIconSrc()\" alt=\"\" />\r\n } @else {\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n <path d=\"M3 5h18l-7 8v6l-4-2v-4L3 5Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </button>\r\n @if (filterOpen()) {\r\n <cc-plan-filter-form\r\n id=\"cc-catalog-filter\"\r\n [services]=\"services()\"\r\n [priceRanges]=\"priceRanges()\"\r\n (filterChange)=\"onFilter($event)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </aside>\r\n\r\n <section class=\"cc-catalog__results\" [attr.aria-busy]=\"loading()\" aria-live=\"polite\">\r\n @if (loading()) {\r\n <div class=\"cc-catalog__grid\">\r\n @for (i of skeletons(); track i) {\r\n <cc-plan-card [skeleton]=\"true\" />\r\n }\r\n </div>\r\n } @else if (visiblePlans().length) {\r\n <div class=\"cc-catalog__grid\">\r\n @for (plan of visiblePlans(); track plan.id) {\r\n @if (cardTemplate(); as tpl) {\r\n <ng-container *ngTemplateOutlet=\"tpl; context: { $implicit: plan, link: linkFor(plan) }\" />\r\n } @else {\r\n <cc-plan-card\r\n [name]=\"plan.name\"\r\n [imageSrc]=\"plan.imgPath\"\r\n [imageAlt]=\"plan.name + imageAltSuffix()\"\r\n [meta]=\"metaFor(plan)\"\r\n [price]=\"showPrice() ? plan.price : null\"\r\n [priceLabel]=\"priceLabel()\"\r\n [priceFormat]=\"priceFormat()\"\r\n [link]=\"linkFor(plan)\"\r\n [ctaLabel]=\"ctaLabel()\"\r\n [ctaVariant]=\"ctaVariant()\"\r\n [appearance]=\"cardAppearance()\"\r\n />\r\n }\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"cc-catalog__empty\">\r\n <p>{{ emptyMessage() }}</p>\r\n <div class=\"cc-catalog__empty-actions\">\r\n <button ccButton type=\"button\" (click)=\"showAll()\">{{ emptyActionLabel() }}</button>\r\n @if (contactHref()) {\r\n <a ccButton variant=\"secondary\" [href]=\"contactHref()\" target=\"_blank\" rel=\"noopener\">{{ contactLabel() }}</a>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </section>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\r\nimport { Plan } from '../../models/plan.models';\r\nimport { LinkTarget } from '../../models/ui.models';\r\nimport { formatPrice, PriceFormat } from '../../utils/text.utils';\r\nimport { ButtonComponent, ButtonVariant } from '../button/button.component';\r\nimport { PageBannerComponent } from '../page-banner/page-banner.component';\r\n\r\n/**\r\n * Plan detail view: title with a back link, photo, price with an early booking button,\r\n * description, duration, number of people, included services and a gift box.\r\n * On screens below 1024px a bar with the price and the booking button stays fixed at\r\n * the bottom while the plan is on screen. It only renders; the page loads the plan and\r\n * handles SEO.\r\n *\r\n * ```html\r\n * <cc-plan-details [plan]=\"plan\" [bookingUrl]=\"bookingFor\" imageAltSuffix=\" en Laurel Spa\" />\r\n * ```\r\n *\r\n * Tokens: --cc-details-panel-bg, --cc-details-price-bg, --cc-details-price-color,\r\n * --cc-details-gift-border, --cc-details-bar-bg, --cc-details-image-ratio.\r\n */\r\n@Component({\r\n selector: 'cc-plan-details',\r\n imports: [ButtonComponent, PageBannerComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './plan-details.component.html',\r\n styleUrls: ['../../theme/component-base.css', './plan-details.component.css'],\r\n})\r\nexport class PlanDetailsComponent {\r\n readonly plan = input.required<Plan>();\r\n /** Booking link, usually WhatsApp. A function receives the plan, to mention it in the message. */\r\n readonly bookingUrl = input.required<string | ((plan: Plan) => string)>();\r\n readonly bookingLabel = input<string>('Reservar por WhatsApp');\r\n /** Shorter label for the bottom bar on small screens. */\r\n readonly barBookingLabel = input<string>('Reservar');\r\n readonly bookingVariant = input<ButtonVariant>('primary');\r\n /** Keeps a bar with price and booking button at the bottom on small screens. */\r\n readonly stickyBar = input<boolean>(true);\r\n\r\n readonly showBanner = input<boolean>(true);\r\n readonly backLink = input<LinkTarget | null>('/planes');\r\n readonly backLabel = input<string>('Volver a los planes');\r\n readonly backIconSrc = input<string>('');\r\n readonly titleIconSrc = input<string>('');\r\n /** Added after the plan name in the photo's alt text. */\r\n readonly imageAltSuffix = input<string>('');\r\n\r\n readonly priceFormat = input<PriceFormat>({});\r\n /** Small text under the price. Defaults to \"Precio por plan\". */\r\n readonly priceNote = input<string>('Precio por plan');\r\n\r\n readonly durationIconSrc = input<string>('');\r\n readonly personIconSrc = input<string>('');\r\n readonly peopleIconSrc = input<string>('');\r\n readonly durationLabel = input<string>('Duración');\r\n readonly peopleCaption = input<string>('Personas');\r\n readonly personLabel = input<string>('persona');\r\n readonly peopleLabel = input<string>('personas');\r\n readonly includesLabel = input<string>('Incluye');\r\n\r\n /** Gift box. It is hidden when `perks` is empty. */\r\n readonly perksTitle = input<string>('Recibe con tu plan');\r\n readonly perks = input<string[]>([\r\n 'Gift Card de invitación en PDF para regalo.',\r\n 'Decoración según la ocasión que celebres.',\r\n ]);\r\n readonly perksImageSrc = input<string>('');\r\n readonly perksImageAlt = input<string>('');\r\n\r\n protected readonly people = computed(() => Math.max(this.plan().cuantity || 1, 1));\r\n protected readonly services = computed(() => this.plan().additionalServices ?? []);\r\n protected readonly price = computed(() => formatPrice(this.plan().price, this.priceFormat()));\r\n protected readonly booking = computed(() => {\r\n const url = this.bookingUrl();\r\n return typeof url === 'function' ? url(this.plan()) : url;\r\n });\r\n}\r\n","@if (showBanner()) {\r\n <cc-page-banner\r\n [title]=\"plan().name\"\r\n [iconSrc]=\"titleIconSrc()\"\r\n [backLink]=\"backLink()\"\r\n [backLabel]=\"backLabel()\"\r\n [backIconSrc]=\"backIconSrc()\"\r\n />\r\n}\r\n\r\n<div class=\"cc-details\">\r\n <div class=\"cc-details__media\">\r\n <img\r\n class=\"cc-details__photo\"\r\n [src]=\"plan().imgPath\"\r\n [alt]=\"plan().name + imageAltSuffix()\"\r\n width=\"800\"\r\n height=\"800\"\r\n />\r\n <ng-content select=\"[ccDetailsMedia]\" />\r\n </div>\r\n\r\n <div class=\"cc-details__panel\">\r\n <div class=\"cc-details__buy\">\r\n <p class=\"cc-details__price\">{{ price() }}</p>\r\n @if (priceNote()) {\r\n <p class=\"cc-details__price-note\">{{ priceNote() }}</p>\r\n }\r\n <a ccButton [variant]=\"bookingVariant()\" size=\"lg\" class=\"cc-details__cta-top\" [href]=\"booking()\" target=\"_blank\" rel=\"noopener\">\r\n {{ bookingLabel() }}\r\n </a>\r\n </div>\r\n\r\n <p class=\"cc-details__description\">{{ plan().description }}</p>\r\n\r\n <dl class=\"cc-details__facts\">\r\n <div class=\"cc-details__fact\">\r\n @if (durationIconSrc()) {\r\n <img [src]=\"durationIconSrc()\" alt=\"\" />\r\n } @else {\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n <circle cx=\"12\" cy=\"12\" r=\"9\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n <path d=\"M12 7v5l3 2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n </svg>\r\n }\r\n <dt class=\"cc-sr-only\">{{ durationLabel() }}</dt>\r\n <dd>{{ plan().duration }}</dd>\r\n </div>\r\n\r\n <div class=\"cc-details__fact\">\r\n @if (people() > 1) {\r\n @if (peopleIconSrc()) {\r\n <img [src]=\"peopleIconSrc()\" alt=\"\" />\r\n } @else {\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n <circle cx=\"9\" cy=\"8\" r=\"3.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n <circle cx=\"17\" cy=\"9\" r=\"2.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n <path d=\"M2.5 20a6.5 6.5 0 0 1 13 0M15 14.5a5 5 0 0 1 6.5 4.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n </svg>\r\n }\r\n } @else {\r\n @if (personIconSrc()) {\r\n <img [src]=\"personIconSrc()\" alt=\"\" />\r\n } @else {\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n <circle cx=\"12\" cy=\"8\" r=\"4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n <path d=\"M4.5 20a7.5 7.5 0 0 1 15 0\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n </svg>\r\n }\r\n }\r\n <dt class=\"cc-sr-only\">{{ peopleCaption() }}</dt>\r\n <dd>{{ people() }} {{ people() > 1 ? peopleLabel() : personLabel() }}</dd>\r\n </div>\r\n </dl>\r\n\r\n @if (services().length) {\r\n <section class=\"cc-details__section\">\r\n <h2 class=\"cc-details__heading\">{{ includesLabel() }}</h2>\r\n <ul class=\"cc-details__services\">\r\n @for (service of services(); track $index) {\r\n <li>\r\n <img [src]=\"service.iconPath\" alt=\"\" width=\"36\" height=\"36\" />\r\n <span>{{ service.name }}</span>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n }\r\n\r\n <ng-content />\r\n\r\n @if (perks().length) {\r\n <section class=\"cc-details__gift\">\r\n @if (perksImageSrc()) {\r\n <img class=\"cc-details__gift-img\" [src]=\"perksImageSrc()\" [alt]=\"perksImageAlt()\" loading=\"lazy\" />\r\n }\r\n <div class=\"cc-details__perks\">\r\n <h2 class=\"cc-details__heading cc-details__heading--accent\">{{ perksTitle() }}</h2>\r\n <ul>\r\n @for (perk of perks(); track $index) {\r\n <li>{{ perk }}</li>\r\n }\r\n </ul>\r\n </div>\r\n </section>\r\n }\r\n\r\n <div class=\"cc-details__cta-bottom\">\r\n <a ccButton [variant]=\"bookingVariant()\" size=\"lg\" [href]=\"booking()\" target=\"_blank\" rel=\"noopener\">{{ bookingLabel() }}</a>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (stickyBar()) {\r\n <div class=\"cc-details__bar\">\r\n <div class=\"cc-details__bar-price\">\r\n <span class=\"cc-details__bar-amount\">{{ price() }}</span>\r\n <span class=\"cc-details__bar-name\">{{ plan().name }}</span>\r\n </div>\r\n <a ccButton [variant]=\"bookingVariant()\" class=\"cc-details__bar-cta\" [href]=\"booking()\" target=\"_blank\" rel=\"noopener\">{{ barBookingLabel() }}</a>\r\n </div>\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n model,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { GalleryImage } from '../../models/ui.models';\r\n\r\n/**\r\n * Full-screen image viewer. It is open while `index` is not null.\r\n * Arrow keys and swipe move between images; Escape and the backdrop close it.\r\n * Focus moves into the viewer on open, stays inside while open, and returns to the\r\n * element that opened it on close.\r\n *\r\n * ```html\r\n * <cc-lightbox [images]=\"images\" [(index)]=\"openIndex\" />\r\n * ```\r\n *\r\n * Tokens: --cc-lightbox-backdrop, --cc-lightbox-control-bg, --cc-lightbox-color.\r\n */\r\n@Component({\r\n selector: 'cc-lightbox',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '(document:keydown.escape)': 'close()',\r\n '(document:keydown.arrowright)': 'next()',\r\n '(document:keydown.arrowleft)': 'prev()',\r\n },\r\n templateUrl: './lightbox.component.html',\r\n styleUrls: ['../../theme/component-base.css', './lightbox.component.css'],\r\n})\r\nexport class LightboxComponent {\r\n readonly images = input.required<GalleryImage[]>();\r\n /** Index of the open image, or null when closed. Use `[(index)]`. */\r\n readonly index = model<number | null>(null);\r\n readonly closeLabel = input<string>('Cerrar');\r\n readonly prevLabel = input<string>('Imagen anterior');\r\n readonly nextLabel = input<string>('Imagen siguiente');\r\n /** Text of the position counter, for example \"3 de 18\". */\r\n readonly counterSeparator = input<string>('de');\r\n\r\n protected readonly current = computed(() => {\r\n const i = this.index();\r\n return i === null ? null : (this.images()[i] ?? null);\r\n });\r\n\r\n /** Changes only on open/close, not when moving between images. */\r\n private readonly isOpen = computed(() => this.current() !== null);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly dialog = viewChild<ElementRef<HTMLElement>>('dialog');\r\n private readonly closeButton = viewChild<ElementRef<HTMLButtonElement>>('closeButton');\r\n private touchStartX: number | null = null;\r\n\r\n constructor() {\r\n // Lock page scroll and manage focus while the viewer is open.\r\n effect((onCleanup) => {\r\n if (!this.isOpen()) return;\r\n untracked(() => {\r\n const body = this.document.body;\r\n const previousOverflow = body.style.overflow;\r\n const opener = this.document.activeElement as HTMLElement | null;\r\n body.style.overflow = 'hidden';\r\n queueMicrotask(() => this.closeButton()?.nativeElement.focus());\r\n onCleanup(() => {\r\n body.style.overflow = previousOverflow;\r\n opener?.focus?.();\r\n });\r\n });\r\n });\r\n }\r\n\r\n close(): void {\r\n if (this.index() !== null) this.index.set(null);\r\n }\r\n\r\n next(): void {\r\n const i = this.index();\r\n const total = this.images().length;\r\n if (i !== null && total) this.index.set((i + 1) % total);\r\n }\r\n\r\n prev(): void {\r\n const i = this.index();\r\n const total = this.images().length;\r\n if (i !== null && total) this.index.set((i - 1 + total) % total);\r\n }\r\n\r\n /** Keeps Tab and Shift+Tab inside the viewer. */\r\n protected trapFocus(event: KeyboardEvent): void {\r\n if (event.key !== 'Tab') return;\r\n const focusable = this.dialog()?.nativeElement.querySelectorAll<HTMLElement>('button');\r\n if (!focusable?.length) return;\r\n const first = focusable[0];\r\n const last = focusable[focusable.length - 1];\r\n const active = this.document.activeElement;\r\n if (event.shiftKey && active === first) {\r\n event.preventDefault();\r\n last.focus();\r\n } else if (!event.shiftKey && active === last) {\r\n event.preventDefault();\r\n first.focus();\r\n }\r\n }\r\n\r\n protected onTouchStart(event: TouchEvent): void {\r\n this.touchStartX = event.touches[0]?.clientX ?? null;\r\n }\r\n\r\n protected onTouchEnd(event: TouchEvent): void {\r\n if (this.touchStartX === null) return;\r\n const delta = (event.changedTouches[0]?.clientX ?? this.touchStartX) - this.touchStartX;\r\n this.touchStartX = null;\r\n if (Math.abs(delta) < 40) return;\r\n if (delta < 0) this.next();\r\n else this.prev();\r\n }\r\n}\r\n","@if (current(); as image) {\r\n <div\r\n #dialog\r\n class=\"cc-lb\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-label]=\"image.caption || image.alt || null\"\r\n (click)=\"close()\"\r\n (keydown)=\"trapFocus($event)\"\r\n (touchstart)=\"onTouchStart($event)\"\r\n (touchend)=\"onTouchEnd($event)\"\r\n >\r\n <div class=\"cc-lb__top\" (click)=\"$event.stopPropagation()\">\r\n <span class=\"cc-lb__counter\">{{ (index() ?? 0) + 1 }} {{ counterSeparator() }} {{ images().length }}</span>\r\n <button #closeButton type=\"button\" class=\"cc-lb__btn\" [attr.aria-label]=\"closeLabel()\" (click)=\"close()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6 6 18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>\r\n </button>\r\n </div>\r\n\r\n <figure class=\"cc-lb__figure\" (click)=\"$event.stopPropagation()\">\r\n <img class=\"cc-lb__img\" [src]=\"image.src\" [alt]=\"image.alt ?? image.caption ?? ''\" />\r\n @if (image.caption) {\r\n <figcaption class=\"cc-lb__caption\">{{ image.caption }}</figcaption>\r\n }\r\n </figure>\r\n\r\n @if (images().length > 1) {\r\n <div class=\"cc-lb__nav\" (click)=\"$event.stopPropagation()\">\r\n <button type=\"button\" class=\"cc-lb__btn\" [attr.aria-label]=\"prevLabel()\" (click)=\"prev()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 18l-6-6 6-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"cc-lb__btn\" [attr.aria-label]=\"nextLabel()\" (click)=\"next()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m9 18 6-6-6-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" /></svg>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\r\nimport { GalleryImage } from '../../models/ui.models';\r\nimport { LightboxComponent } from '../lightbox/lightbox.component';\r\n\r\n/**\r\n * Grid of square thumbnails that opens a lightbox on click.\r\n *\r\n * ```html\r\n * <cc-gallery [images]=\"images\" [columns]=\"4\" />\r\n * ```\r\n *\r\n * `numberedImages()` builds the list for folders named 1.jpeg, 2.jpeg, …\r\n *\r\n * Tokens: --cc-gallery-gap, --cc-gallery-radius, --cc-gallery-bg.\r\n */\r\n@Component({\r\n selector: 'cc-gallery',\r\n imports: [LightboxComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { '[style.--_gallery-columns]': 'columns()' },\r\n templateUrl: './gallery.component.html',\r\n styleUrls: ['../../theme/component-base.css', './gallery.component.css'],\r\n})\r\nexport class GalleryComponent {\r\n readonly images = input.required<GalleryImage[]>();\r\n /** Columns from 1024px. Small screens use 2, tablets 3. */\r\n readonly columns = input<number>(4);\r\n readonly backgroundImage = input<string>('');\r\n readonly openLabel = input<string>('Ver imagen');\r\n\r\n protected readonly open = signal<number | null>(null);\r\n}\r\n\r\n/**\r\n * Builds a gallery list for numbered files.\r\n *\r\n * ```ts\r\n * numberedImages(18, (i) => `assets/images/galery/${i}.jpeg`, (i) => `Instalaciones - foto ${i}`)\r\n * ```\r\n */\r\nexport function numberedImages(\r\n count: number,\r\n src: (n: number) => string,\r\n caption?: (n: number) => string\r\n): GalleryImage[] {\r\n return Array.from({ length: count }, (_, i) => {\r\n const n = i + 1;\r\n return { src: src(n), caption: caption?.(n) };\r\n });\r\n}\r\n","<ul class=\"cc-gallery\" [class.cc-gallery--bg]=\"!!backgroundImage()\" [style.background-image]=\"backgroundImage() ? 'url(' + backgroundImage() + ')' : null\">\r\n @for (image of images(); track image.src; let i = $index) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"cc-gallery__item\"\r\n [attr.aria-label]=\"openLabel() + ': ' + (image.alt ?? image.caption ?? i + 1)\"\r\n (click)=\"open.set(i)\"\r\n >\r\n <img [src]=\"image.thumb ?? image.src\" [alt]=\"image.alt ?? image.caption ?? ''\" width=\"400\" height=\"400\" loading=\"lazy\" decoding=\"async\" />\r\n </button>\r\n </li>\r\n }\r\n</ul>\r\n<cc-lightbox [images]=\"images()\" [(index)]=\"open\" />\r\n","/*\n * Public API Surface of @c-code/c-code-fw/ui\n */\n\n// Models\nexport * from './lib/models/plan.models';\nexport * from './lib/models/ui.models';\nexport * from './lib/models/promo.models';\n\n// Utilities\nexport * from './lib/utils/text.utils';\nexport * from './lib/utils/plan.utils';\nexport * from './lib/utils/promo.utils';\n\n// Services\nexport * from './lib/services/plan-catalog.service';\nexport * from './lib/services/seo.service';\n\n// Components\nexport * from './lib/components/button/button.component';\nexport * from './lib/components/section-heading/section-heading.component';\nexport * from './lib/components/notice/notice.component';\nexport * from './lib/components/faq-item/faq-item.component';\nexport * from './lib/components/whatsapp-button/whatsapp-button.component';\nexport * from './lib/components/promo-modal/promo-modal.component';\nexport * from './lib/components/page-banner/page-banner.component';\nexport * from './lib/components/info-item/info-item.component';\nexport * from './lib/components/faq/faq.component';\nexport * from './lib/components/social-links/social-links.component';\nexport * from './lib/components/plan-card/plan-card.component';\nexport * from './lib/components/category-menu/category-menu.component';\nexport * from './lib/components/search-box/search-box.component';\nexport * from './lib/components/plan-filter-form/plan-filter-form.component';\nexport * from './lib/components/plan-catalog/plan-catalog.component';\nexport * from './lib/components/plan-details/plan-details.component';\nexport * from './lib/components/lightbox/lightbox.component';\nexport * from './lib/components/gallery/gallery.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|