@camp2gether/c2g-ui 0.0.7
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 +95 -0
- package/charts/index.d.ts +199 -0
- package/fesm2022/camp2gether-c2g-ui-beach-animation-ipi3OoKW.mjs +54156 -0
- package/fesm2022/camp2gether-c2g-ui-beach-animation-ipi3OoKW.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-camping-animation-DY6XWXyF.mjs +35807 -0
- package/fesm2022/camp2gether-c2g-ui-camping-animation-DY6XWXyF.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-car-animation-DnDp7WfG.mjs +45189 -0
- package/fesm2022/camp2gether-c2g-ui-car-animation-DnDp7WfG.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-car-driving-landscape-animation-CawNeMKD.mjs +43833 -0
- package/fesm2022/camp2gether-c2g-ui-car-driving-landscape-animation-CawNeMKD.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-cat-love-animation-ewC7fZyY.mjs +30789 -0
- package/fesm2022/camp2gether-c2g-ui-cat-love-animation-ewC7fZyY.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-charts.mjs +404 -0
- package/fesm2022/camp2gether-c2g-ui-charts.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-checklist-animation-DqUkcLqI.mjs +19868 -0
- package/fesm2022/camp2gether-c2g-ui-checklist-animation-DqUkcLqI.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-coffee-time-animation-DQilaE0A.mjs +6816 -0
- package/fesm2022/camp2gether-c2g-ui-coffee-time-animation-DQilaE0A.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-error-404-pdjg-EHb.mjs +49742 -0
- package/fesm2022/camp2gether-c2g-ui-error-404-pdjg-EHb.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-fishing-animation-DwE3IF-V.mjs +38941 -0
- package/fesm2022/camp2gether-c2g-ui-fishing-animation-DwE3IF-V.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-layout.mjs +768 -0
- package/fesm2022/camp2gether-c2g-ui-layout.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-maps.mjs +223 -0
- package/fesm2022/camp2gether-c2g-ui-maps.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-mountain-search-animation-TebM1gS4.mjs +69245 -0
- package/fesm2022/camp2gether-c2g-ui-mountain-search-animation-TebM1gS4.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-planning-animation-D8QSsZk6.mjs +28330 -0
- package/fesm2022/camp2gether-c2g-ui-planning-animation-D8QSsZk6.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-presets.mjs +2855 -0
- package/fesm2022/camp2gether-c2g-ui-presets.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-share-animation-qgqs-k59.mjs +59129 -0
- package/fesm2022/camp2gether-c2g-ui-share-animation-qgqs-k59.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-summer-camp-animation-DPzirVNH.mjs +89317 -0
- package/fesm2022/camp2gether-c2g-ui-summer-camp-animation-DPzirVNH.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-theme.mjs +479 -0
- package/fesm2022/camp2gether-c2g-ui-theme.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-thinking-animation--X3er_pf.mjs +27929 -0
- package/fesm2022/camp2gether-c2g-ui-thinking-animation--X3er_pf.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-walking-avocado-animation-CQMU2C9-.mjs +4064 -0
- package/fesm2022/camp2gether-c2g-ui-walking-avocado-animation-CQMU2C9-.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-walking-orange-animation-CTJniCsF.mjs +3113 -0
- package/fesm2022/camp2gether-c2g-ui-walking-orange-animation-CTJniCsF.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-weather-partly-cloudy-animation-Cnw3W4cS.mjs +1731 -0
- package/fesm2022/camp2gether-c2g-ui-weather-partly-cloudy-animation-Cnw3W4cS.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui.mjs +2099 -0
- package/fesm2022/camp2gether-c2g-ui.mjs.map +1 -0
- package/index.d.ts +578 -0
- package/layout/index.d.ts +443 -0
- package/maps/index.d.ts +62 -0
- package/package.json +51 -0
- package/presets/index.d.ts +1437 -0
- package/src/lib/styles/design-tokens.css +153 -0
- package/src/lib/styles/themes.scss +346 -0
- package/theme/index.d.ts +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camp2gether-c2g-ui-layout.mjs","sources":["../../../projects/c2g-ui/layout/content-panel/content-panel.component.ts","../../../projects/c2g-ui/layout/content-panel/content-panel.component.html","../../../projects/c2g-ui/layout/hero/coverage-kpi.component.ts","../../../projects/c2g-ui/layout/hero/coverage-kpi.component.html","../../../projects/c2g-ui/layout/hero/hero.component.ts","../../../projects/c2g-ui/layout/hero/hero.component.html","../../../projects/c2g-ui/layout/hero/kpi-card.component.ts","../../../projects/c2g-ui/layout/hero/kpi-card.component.html","../../../projects/c2g-ui/layout/danger-zone/danger-zone-item.component.ts","../../../projects/c2g-ui/layout/danger-zone/danger-zone-item.component.html","../../../projects/c2g-ui/layout/danger-zone/danger-zone.component.ts","../../../projects/c2g-ui/layout/danger-zone/danger-zone.component.html","../../../projects/c2g-ui/layout/list-item/list-item.component.ts","../../../projects/c2g-ui/layout/list-item/list-item.component.html","../../../projects/c2g-ui/layout/stat-card/stat-card.component.ts","../../../projects/c2g-ui/layout/stat-card/stat-card.component.html","../../../projects/c2g-ui/layout/action-card/action-card.component.ts","../../../projects/c2g-ui/layout/action-card/action-card.component.html","../../../projects/c2g-ui/layout/view-toggle/view-toggle.component.ts","../../../projects/c2g-ui/layout/view-toggle/view-toggle.component.html","../../../projects/c2g-ui/layout/segmented-toggle/segmented-toggle.component.ts","../../../projects/c2g-ui/layout/search-input/search-input.component.ts","../../../projects/c2g-ui/layout/search-input/search-input.component.html","../../../projects/c2g-ui/layout/empty-state/empty-state.component.ts","../../../projects/c2g-ui/layout/empty-state/empty-state.component.html","../../../projects/c2g-ui/layout/pagination/pagination.component.ts","../../../projects/c2g-ui/layout/pagination/pagination.component.html","../../../projects/c2g-ui/layout/table/table.component.ts","../../../projects/c2g-ui/layout/table/table.component.html","../../../projects/c2g-ui/layout/tabs/tabs.component.ts","../../../projects/c2g-ui/layout/tabs/tabs.component.html","../../../projects/c2g-ui/layout/breadcrumb/breadcrumb.component.ts","../../../projects/c2g-ui/layout/breadcrumb/breadcrumb.component.html","../../../projects/c2g-ui/layout/stepper/stepper.component.ts","../../../projects/c2g-ui/layout/stepper/stepper.component.html","../../../projects/c2g-ui/layout/kpi-card/kpi-card.component.ts","../../../projects/c2g-ui/layout/kpi-card/kpi-card.component.html","../../../projects/c2g-ui/layout/filter-bar/filter-bar.component.ts","../../../projects/c2g-ui/layout/filter-bar/filter-bar.component.html","../../../projects/c2g-ui/layout/skeleton-table/skeleton-table.component.ts","../../../projects/c2g-ui/layout/skeleton-table/skeleton-table.component.html","../../../projects/c2g-ui/layout/camp2gether-c2g-ui-layout.ts"],"sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n input\n} from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@Component({\n selector: 'app-content-panel',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule],\n templateUrl: './content-panel.component.html',\n styleUrls: ['./content-panel.component.scss']\n})\nexport class ContentPanelComponent {\n eyebrow = input<string>('');\n title = input<string>('');\n}\n","<article class=\"content-panel\">\n @if (eyebrow() || title()) {\n <header class=\"content-panel__header\">\n <div class=\"content-panel__header-text\">\n @if (eyebrow()) {\n <span class=\"content-panel__eyebrow\">{{ eyebrow() | translate }}</span>\n }\n @if (title()) {\n <h2 class=\"content-panel__title\">{{ title() | translate }}</h2>\n }\n </div>\n <div class=\"content-panel__actions\">\n <ng-content select=\"[panel-actions]\" />\n </div>\n </header>\n }\n <ng-content />\n</article>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\n@Component({\n selector: 'app-coverage-kpi',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [],\n templateUrl: './coverage-kpi.component.html',\n styleUrls: ['./coverage-kpi.component.scss'],\n})\nexport class CoverageKpiComponent {\n label = input.required<string>();\n coveragePercent = input<number>(0);\n\n readonly ringCircumference = 125.66;\n\n readonly ringOffset = computed(\n () => this.ringCircumference * (1 - this.coveragePercent() / 100),\n );\n}","<div class=\"coverage-kpi\" role=\"listitem\">\n <div class=\"coverage-kpi__content\">\n <div class=\"coverage-kpi__ring\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 48 48\">\n <circle class=\"coverage-kpi__ring-bg\" cx=\"24\" cy=\"24\" r=\"20\" />\n <circle\n class=\"coverage-kpi__ring-fill\"\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n [style.stroke-dasharray]=\"ringCircumference\"\n [style.stroke-dashoffset]=\"ringOffset()\"\n />\n </svg>\n <span class=\"coverage-kpi__percent\">{{ coveragePercent() }}%</span>\n </div>\n\n <span class=\"coverage-kpi__label\">{{ label() }}</span>\n </div>\n</div>","import {\n Component,\n ChangeDetectionStrategy,\n input\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@Component({\n selector: 'app-hero',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatIconModule, TranslateModule],\n templateUrl: './hero.component.html',\n styleUrls: ['./hero.component.scss']\n})\nexport class HeroComponent {\n eyebrow = input<string>();\n title = input<string>();\n lead = input<string>();\n}\n","<section class=\"hero\">\n @if (eyebrow()) {\n <div class=\"hero__eyebrow\">\n <mat-icon class=\"hero__icon\">backpack</mat-icon>\n <span>{{ eyebrow() }}</span>\n </div>\n }\n\n <h1 class=\"hero__title\">{{ title() }}</h1>\n <p class=\"hero__lead\">{{ lead() }}</p>\n\n <ng-content></ng-content>\n</section>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\n\nexport type KpiCardTone = 'owned' | 'missing' | 'total';\n\n@Component({\n selector: 'app-kpi-card',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatIconModule],\n templateUrl: './kpi-card.component.html',\n styleUrls: ['./kpi-card.component.scss'],\n})\nexport class KpiCardComponent {\n value = input.required<number>();\n label = input.required<string>();\n icon = input.required<string>();\n tone = input.required<KpiCardTone>();\n}","<div class=\"kpi-card\" [class]=\"'kpi-card kpi-card--' + tone()\" role=\"listitem\">\n <div class=\"kpi-card__content\">\n <span class=\"kpi-card__value\">{{ value() }}</span>\n <span class=\"kpi-card__label\">{{ label() }}</span>\n </div>\n <mat-icon class=\"kpi-card__icon\">{{ icon() }}</mat-icon>\n</div>","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ButtonComponent } from '@humbeldore/c2g-ui';\nimport { DangerZoneItem } from './danger-zone.component';\n\n@Component({\n selector: 'c2g-danger-zone-item',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ButtonComponent, TranslateModule],\n templateUrl: './danger-zone-item.component.html',\n styleUrls: ['./danger-zone-item.component.scss']\n})\nexport class DangerZoneItemComponent {\n readonly item = input.required<DangerZoneItem>();\n readonly triggered = output<DangerZoneItem>();\n\n titleKey(): string {\n return this.item().titleKey ?? this.item().title ?? '';\n }\n\n descriptionKey(): string | null {\n return this.item().descriptionKey ?? this.item().description ?? null;\n }\n\n actionLabelKey(): string {\n return this.item().action.labelKey ?? this.item().action.label ?? '';\n }\n\n actionAriaLabelKey(): string {\n return this.item().action.ariaLabelKey ?? this.item().action.labelKey ?? this.item().action.ariaLabel ?? this.item().action.label ?? '';\n }\n\n onTriggered(): void {\n this.triggered.emit(this.item());\n }\n}\n","<div class=\"c2g-danger-zone-item\">\n <div class=\"c2g-danger-zone-item__info\">\n <span class=\"c2g-danger-zone-item__label\">{{ titleKey() | translate }}</span>\n @if (descriptionKey(); as descriptionKey) {\n <span class=\"c2g-danger-zone-item__hint\">{{ descriptionKey | translate }}</span>\n }\n </div>\n\n <c2g-button\n [variant]=\"item().action.variant ?? 'secondary'\"\n [icon]=\"item().action.icon ?? ''\"\n [ariaLabel]=\"actionAriaLabelKey() | translate\"\n [disabled]=\"item().action.disabled ?? false\"\n (clicked)=\"onTriggered()\"\n >\n {{ actionLabelKey() | translate }}\n </c2g-button>\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { DangerZoneItemComponent } from './danger-zone-item.component';\n\nexport interface DangerZoneAction {\n labelKey?: string;\n variant?: 'primary' | 'secondary' | 'ghost' | 'destructive';\n icon?: string;\n ariaLabelKey?: string;\n disabled?: boolean;\n // Legacy fallback fields\n label?: string;\n ariaLabel?: string;\n}\n\nexport interface DangerZoneItem {\n id: string;\n titleKey?: string;\n descriptionKey?: string;\n action: DangerZoneAction;\n onTrigger?: (item: DangerZoneItem) => void;\n // Legacy fallback fields\n title?: string;\n description?: string;\n}\n\n@Component({\n selector: 'c2g-danger-zone',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [DangerZoneItemComponent, TranslateModule],\n templateUrl: './danger-zone.component.html',\n styleUrls: ['./danger-zone.component.scss']\n})\nexport class DangerZoneComponent {\n readonly headingKey = input<string>('c2g.danger_zone.default.heading');\n readonly items = input.required<DangerZoneItem[]>();\n\n /**\n * Emits the clicked item id so consumers can map actions in their container.\n *\n * Prefer the per-item callback (`item.onTrigger`) when you want action logic to\n * live directly on each item config.\n *\n * Output binding:\n * ```html\n * <c2g-danger-zone [items]=\"dangerItems\" (itemTriggered)=\"onDangerAction($event)\" />\n * ```\n *\n * Example mapping:\n * ```ts\n * onDangerAction(id: string) {\n * if (id === 'delete-project') {\n * this.openDeleteDialog();\n * }\n * }\n * ```\n */\n readonly itemTriggered = output<string>();\n\n readonly resolvedHeadingKey = computed(() => this.headingKey());\n\n onItemTriggered(item: DangerZoneItem): void {\n item.onTrigger?.(item);\n this.itemTriggered.emit(item.id);\n }\n}\n","<section class=\"c2g-danger-zone\" aria-labelledby=\"c2g-danger-zone-heading\">\n <h2 id=\"c2g-danger-zone-heading\" class=\"c2g-danger-zone__heading\">\n {{ resolvedHeadingKey() | translate }}\n </h2>\n\n <div class=\"c2g-danger-zone__content\">\n @for (item of items(); track item.id; let last = $last) {\n <c2g-danger-zone-item [item]=\"item\" (triggered)=\"onItemTriggered($event)\" />\n\n @if (!last) {\n <div class=\"c2g-danger-zone__divider\" aria-hidden=\"true\"></div>\n }\n }\n </div>\n</section>","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TranslateModule } from '@ngx-translate/core';\n\nexport interface C2gListItemData {\n name: string;\n description?: string | null;\n memberCount?: number | null;\n members?: unknown[];\n}\n\n@Component({\n selector: 'c2g-list-item',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatButtonModule, MatIconModule, MatTooltipModule, TranslateModule],\n templateUrl: './list-item.component.html',\n styleUrls: ['./list-item.component.scss']\n})\nexport class ListItemComponent {\n readonly group = input<C2gListItemData | null>(null);\n readonly active = input<boolean>(false);\n\n readonly selected = output<C2gListItemData | null>();\n readonly opened = output<C2gListItemData | null>();\n}\n","<li\n class=\"c2g-list-item\"\n [class.c2g-list-item--active]=\"active()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"group()?.name\"\n (click)=\"selected.emit(group())\"\n (keyup.enter)=\"selected.emit(group())\"\n (keydown.space)=\"$event.preventDefault(); selected.emit(group())\"\n>\n <div class=\"c2g-list-item__avatar\">\n <mat-icon>group</mat-icon>\n </div>\n\n <div class=\"c2g-list-item__info\">\n <span class=\"c2g-list-item__name\">{{ group()?.name }}</span>\n @if (group()?.description) {\n <span class=\"c2g-list-item__desc\">{{ group()?.description }}</span>\n }\n </div>\n\n <div class=\"c2g-list-item__end\">\n <span class=\"c2g-list-item__members\">\n <mat-icon>group</mat-icon>\n {{ group()?.memberCount ?? group()?.members?.length ?? 0 }}\n </span>\n <button\n mat-icon-button\n class=\"c2g-list-item__open-btn\"\n [matTooltip]=\"'groups.open' | translate\"\n [attr.aria-label]=\"'groups.open' | translate\"\n (click)=\"$event.stopPropagation(); opened.emit(group())\"\n >\n <mat-icon>arrow_forward</mat-icon>\n </button>\n </div>\n</li>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIcon } from '@angular/material/icon';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { LottieLoaderComponent } from '@humbeldore/c2g-ui';\nimport { C2gLottieLoaderPreset } from '@humbeldore/c2g-ui';\n\nexport interface StatCardBackground {\n type: 'gradient' | 'image';\n value: string;\n overlay?: string;\n}\n\nexport interface StatCardData {\n value: string | number;\n label: string;\n icon?: string;\n lottiePreset?: C2gLottieLoaderPreset;\n iconBackgroundTone?: 'primary' | 'secondary' | 'neutral';\n background?: StatCardBackground;\n disabled?: boolean;\n trend?: {\n direction: 'up' | 'down' | 'neutral';\n value: string | number;\n };\n}\n\n@Component({\n selector: 'c2g-stat-card',\n standalone: true,\n imports: [CommonModule, MatIcon, TranslateModule, LottieLoaderComponent],\n templateUrl: './stat-card.component.html',\n styleUrl: './stat-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StatCardComponent {\n readonly data = input.required<StatCardData>();\n\n readonly cardBackgroundStyle = computed((): Record<string, string> | null => {\n const background = this.data().background;\n\n if (!background) {\n return null;\n }\n\n if (background.type === 'gradient') {\n return { backgroundImage: background.value };\n }\n\n const imageUrl = background.value.startsWith('url(')\n ? background.value\n : `url('${background.value}')`;\n const overlay = background.overlay ?? 'linear-gradient(rgba(0, 0, 0, 0.34), rgba(0, 0, 0, 0.34))';\n\n return {\n backgroundImage: `${overlay}, ${imageUrl}`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n };\n });\n}\n","<div\n class=\"stat-card\"\n [class]=\"'stat-card--' + (data().iconBackgroundTone || 'neutral')\"\n [class.stat-card--disabled]=\"data().disabled\"\n [class.stat-card--custom-bg]=\"!!data().background\"\n [ngStyle]=\"cardBackgroundStyle()\"\n>\n @if (data().lottiePreset) {\n <div class=\"stat-icon-wrapper stat-icon-wrapper--lottie\">\n <c2g-lottie-loader\n [preset]=\"data().lottiePreset!\"\n width=\"28px\"\n height=\"28px\"\n [showLabel]=\"false\"\n label=\"Animation\"\n ></c2g-lottie-loader>\n </div>\n } @else if (data().icon) {\n <div class=\"stat-icon-wrapper\">\n <mat-icon class=\"stat-icon\">{{ data().icon }}</mat-icon>\n </div>\n }\n\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ data().value }}</div>\n <div class=\"stat-label\">{{ data().label | translate }}</div>\n </div>\n\n @if (data().trend) {\n <div class=\"stat-trend\" [class]=\"'stat-trend--' + data().trend!.direction\">\n <mat-icon class=\"trend-icon\">\n @switch (data().trend!.direction) {\n @case ('up') {\n trending_up\n }\n @case ('down') {\n trending_down\n }\n @case ('neutral') {\n trending_flat\n }\n }\n </mat-icon>\n <span class=\"trend-value\">{{ data().trend!.value }}</span>\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { MatCard } from '@angular/material/card';\nimport { MatIcon } from '@angular/material/icon';\nimport { ButtonComponent } from '@humbeldore/c2g-ui';\nimport { LottieLoaderComponent } from '@humbeldore/c2g-ui';\nimport { C2gLottieLoaderPreset } from '@humbeldore/c2g-ui';\n\nexport type ActionCardLayout = 'icon-left' | 'hero-top' | 'icon-detail';\n\nexport interface ActionCardData {\n icon?: string;\n title: string;\n text?: string;\n description?: string;\n image?: string;\n lottiePreset?: C2gLottieLoaderPreset;\n disabled?: boolean;\n iconBackgroundTone?: 'primary' | 'secondary' | 'neutral';\n ctaLabel?: string;\n}\n\n@Component({\n selector: 'c2g-action-card',\n standalone: true,\n imports: [\n CommonModule,\n TranslateModule,\n MatCard,\n MatIcon,\n ButtonComponent,\n LottieLoaderComponent\n ],\n templateUrl: './action-card.component.html',\n styleUrl: './action-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ActionCardComponent {\n readonly data = input.required<ActionCardData>();\n readonly clickable = input(true);\n readonly variant = input<ActionCardLayout>('icon-left');\n\n readonly cardClicked = output<void>();\n\n readonly effectiveText = computed(() => this.data().text ?? this.data().description ?? '');\n\n readonly supportingDescription = computed(() => {\n const d = this.data();\n return d.text ? (d.description ?? '') : '';\n });\n\n readonly isInteractive = computed(() => this.clickable() && !this.data().disabled);\n\n readonly iconToneClass = computed(() => this.data().iconBackgroundTone ?? 'neutral');\n\n onCardClick() {\n if (this.isInteractive()) {\n this.cardClicked.emit();\n }\n }\n\n onKeyDown(event: KeyboardEvent) {\n if (!this.isInteractive()) {\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.cardClicked.emit();\n }\n }\n}\n","<mat-card\n class=\"action-card\"\n [class.clickable]=\"isInteractive()\"\n [class.disabled]=\"data().disabled\"\n [class.variant-icon-left]=\"variant() === 'icon-left'\"\n [class.variant-hero-top]=\"variant() === 'hero-top'\"\n [class.variant-icon-detail]=\"variant() === 'icon-detail'\"\n (click)=\"onCardClick()\"\n (keydown)=\"onKeyDown($event)\"\n [attr.role]=\"isInteractive() ? 'button' : null\"\n [attr.tabindex]=\"isInteractive() ? '0' : null\">\n\n @if (variant() === 'hero-top') {\n <div class=\"hero-top-header\" [class.has-image]=\"data().image || data().lottiePreset\">\n @if (data().lottiePreset) {\n <div class=\"hero-image hero-image--lottie\">\n <c2g-lottie-loader\n [preset]=\"data().lottiePreset!\"\n [showLabel]=\"false\"\n width=\"100%\"\n height=\"100%\"\n ></c2g-lottie-loader>\n </div>\n } @else if (data().image) {\n <div class=\"hero-image\">\n <img [src]=\"data().image\" [alt]=\"data().title | translate\" />\n </div>\n }\n\n <div class=\"hero-top-title-wrap\">\n <h3 class=\"hero-top-title\">{{ data().title | translate }}</h3>\n @if (effectiveText()) {\n <p class=\"hero-top-description\">{{ effectiveText() | translate }}</p>\n }\n </div>\n </div>\n } @else if (variant() === 'icon-detail') {\n <div class=\"icon-detail-layout\">\n @if (data().icon) {\n <div class=\"icon-chip\" [ngClass]=\"iconToneClass()\">\n <mat-icon class=\"hero-icon\">{{ data().icon }}</mat-icon>\n </div>\n }\n <div class=\"icon-detail-body\">\n <h3 class=\"hero-title\">{{ data().title | translate }}</h3>\n @if (effectiveText()) {\n <p class=\"hero-description\">{{ effectiveText() | translate }}</p>\n }\n <div class=\"icon-detail-cta\" (click)=\"$event.stopPropagation()\">\n @if (data().ctaLabel) {\n <c2g-button variant=\"ghost\" size=\"sm\">{{ data().ctaLabel! | translate }}</c2g-button>\n }\n <ng-content select=\"[ctas]\"></ng-content>\n </div>\n </div>\n </div>\n } @else {\n <div class=\"icon-left-header\">\n @if (data().icon) {\n <div class=\"icon-chip\" [ngClass]=\"iconToneClass()\">\n <mat-icon class=\"hero-icon\">{{ data().icon }}</mat-icon>\n </div>\n }\n\n <div class=\"icon-left-title-wrap\">\n <h3 class=\"hero-title\">{{ data().title | translate }}</h3>\n </div>\n </div>\n }\n\n @if (variant() !== 'icon-detail') {\n <div class=\"content-section\">\n @if (variant() !== 'hero-top' && effectiveText()) {\n <p class=\"hero-description\">{{ effectiveText() | translate }}</p>\n }\n\n @if (supportingDescription()) {\n <p class=\"hero-description supporting\">{{ supportingDescription() | translate }}</p>\n }\n\n <ng-content></ng-content>\n </div>\n }\n\n @if (variant() !== 'icon-detail') {\n <div class=\"cta-section\" (click)=\"$event.stopPropagation()\">\n @if (data().ctaLabel) {\n <c2g-button variant=\"ghost\" size=\"sm\">{{ data().ctaLabel! | translate }}</c2g-button>\n }\n\n <ng-content select=\"[ctas]\"></ng-content>\n </div>\n }\n\n</mat-card>\n","import {\n Component,\n ChangeDetectionStrategy,\n input,\n output\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ViewToggleOption } from './view-toggle.model';\n\n@Component({\n selector: 'app-view-toggle',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatIconModule,\n MatButtonModule,\n MatTooltipModule,\n TranslateModule\n ],\n templateUrl: './view-toggle.component.html',\n styleUrls: ['./view-toggle.component.scss']\n})\nexport class ViewToggleComponent<T extends string = string> {\n options = input.required<ViewToggleOption<T>[]>();\n activeValue = input<T | null>(null);\n valueChange = output<T>();\n}\n","<div class=\"view-toggle\" role=\"group\">\n @for (option of options(); track option.value) {\n <button\n mat-icon-button\n [class.active]=\"activeValue() === option.value\"\n (click)=\"valueChange.emit(option.value)\"\n [matTooltip]=\"option.label | translate\"\n [attr.aria-label]=\"option.label | translate\"\n [attr.aria-pressed]=\"activeValue() === option.value\"\n >\n <mat-icon>{{ option.icon }}</mat-icon>\n </button>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { SegmentedToggleOption } from './segmented-toggle.model';\n\n@Component({\n selector: 'c2g-segmented-toggle',\n standalone: true,\n imports: [MatIconModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SegmentedToggleComponent),\n multi: true,\n },\n ],\n template: `\n <div class=\"c2g-segmented\" role=\"radiogroup\" [attr.aria-label]=\"ariaLabel()\">\n @for (option of options(); track option.value; let index = $index) {\n <button\n type=\"button\"\n role=\"radio\"\n class=\"c2g-segmented__item\"\n [class.c2g-segmented__item--active]=\"value() === option.value\"\n [attr.aria-checked]=\"value() === option.value ? 'true' : 'false'\"\n [disabled]=\"isDisabled() || !!option.disabled\"\n [attr.tabindex]=\"tabIndexFor(option.value)\"\n (click)=\"select(option.value)\"\n (keydown)=\"onKeydown($event, index)\"\n >\n @if (option.icon || option.iconFontIcon) {\n <mat-icon\n class=\"c2g-segmented__icon\"\n [fontSet]=\"option.iconFontSet || ''\"\n [fontIcon]=\"option.iconFontIcon || ''\"\n [attr.aria-label]=\"option.iconAriaLabel || null\"\n [attr.aria-hidden]=\"option.iconAriaLabel ? null : 'true'\"\n >\n {{ option.icon || '' }}\n </mat-icon>\n }\n <span [class.c2g-segmented__sr-only]=\"iconOnly()\">{{ option.label }}</span>\n </button>\n }\n </div>\n `,\n styles: `\n .c2g-segmented {\n display: inline-flex;\n align-items: center;\n border: 1px solid var(--c2g-color-border-subtle, rgba(74, 66, 59, 0.18));\n border-radius: var(--c2g-radius-md, 0.625rem);\n padding: var(--c2g-space-1, 0.25rem);\n background: var(--c2g-color-surface, #ffffff);\n gap: var(--c2g-space-1, 0.25rem);\n font-family: var(--c2g-font-family-base, \"Quicksand\", \"Segoe UI\", sans-serif);\n }\n .c2g-segmented__item {\n border: none;\n background: transparent;\n border-radius: var(--c2g-radius-sm, 0.375rem);\n padding: var(--c2g-space-2, 0.5rem) var(--c2g-space-3, 0.75rem);\n display: inline-flex;\n align-items: center;\n gap: var(--c2g-space-2, 0.5rem);\n font-size: var(--c2g-font-size-sm, 0.875rem);\n color: var(--c2g-color-text-secondary, #4a423b);\n cursor: pointer;\n transition: all var(--c2g-motion-duration-fast, 120ms) var(--c2g-motion-ease-standard, ease);\n }\n .c2g-segmented__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1rem;\n height: 1rem;\n font-size: 0.875rem;\n line-height: 1;\n }\n .c2g-segmented__sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n .c2g-segmented__item--active {\n background: var(--c2g-color-primary, #ff6b35);\n color: var(--c2g-color-text-primary, #1a1714);\n font-weight: var(--c2g-font-weight-semibold, 600);\n }\n .c2g-segmented__item:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--c2g-color-focus, #e55623) 24%, transparent);\n }\n .c2g-segmented__item:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n `,\n})\nexport class SegmentedToggleComponent<T extends string = string> implements ControlValueAccessor {\n readonly options = input<SegmentedToggleOption<T>[]>([]);\n readonly disabled = input(false);\n readonly ariaLabel = input('Auswahl');\n readonly iconOnly = input(false);\n\n readonly valueChange = output<T>();\n\n readonly value = signal<T | null>(null);\n readonly cvaDisabled = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n private onChange: (value: T) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(value: T | null): void {\n this.value.set(value);\n }\n\n registerOnChange(fn: (value: T) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n tabIndexFor(option: T): number {\n if (this.value() === option) {\n return 0;\n }\n if (this.value() === null && this.options()[0]?.value === option) {\n return 0;\n }\n return -1;\n }\n\n select(next: T): void {\n if (this.isDisabled()) {\n return;\n }\n this.value.set(next);\n this.onChange(next);\n this.valueChange.emit(next);\n this.onTouched();\n }\n\n onKeydown(event: KeyboardEvent, index: number): void {\n if (\n event.key !== 'ArrowRight' &&\n event.key !== 'ArrowLeft' &&\n event.key !== 'ArrowUp' &&\n event.key !== 'ArrowDown' &&\n event.key !== 'Home' &&\n event.key !== 'End'\n ) {\n return;\n }\n event.preventDefault();\n\n const enabled = this.options().filter((option) => !option.disabled);\n if (enabled.length === 0) {\n return;\n }\n\n if (event.key === 'Home') {\n const next = enabled[0].value;\n this.select(next);\n this.focusValue(next, event.currentTarget);\n return;\n }\n\n if (event.key === 'End') {\n const next = enabled[enabled.length - 1].value;\n this.select(next);\n this.focusValue(next, event.currentTarget);\n return;\n }\n\n const selectedValue = this.value();\n const fallbackValue = this.options()[index]?.value ?? null;\n const baseValue = selectedValue ?? fallbackValue;\n const currentEnabledIndex = enabled.findIndex((option) => option.value === baseValue);\n const start = currentEnabledIndex >= 0 ? currentEnabledIndex : 0;\n const delta = event.key === 'ArrowRight' || event.key === 'ArrowDown' ? 1 : -1;\n const nextIndex = (start + delta + enabled.length) % enabled.length;\n const next = enabled[nextIndex].value;\n\n this.select(next);\n this.focusValue(next, event.currentTarget);\n }\n\n private focusValue(next: T, eventTarget: EventTarget | null): void {\n const trigger = eventTarget instanceof HTMLElement ? eventTarget : null;\n const root = trigger?.closest('.c2g-segmented');\n const allButtons = root?.querySelectorAll<HTMLButtonElement>('button[role=\"radio\"]');\n if (!allButtons) {\n return;\n }\n\n const optionIndex = this.options().findIndex((option) => option.value === next);\n if (optionIndex >= 0) {\n allButtons[optionIndex]?.focus();\n }\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n output\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@Component({\n selector: 'app-search-input',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatIconModule,\n TranslateModule\n ],\n templateUrl: './search-input.component.html',\n styleUrls: ['./search-input.component.scss']\n})\nexport class SearchInputComponent {\n searchChange = output<string>();\n\n onInput(event: Event): void {\n const inputEl = event.target as HTMLInputElement;\n this.searchChange.emit(inputEl.value);\n }\n}\n","<div class=\"search-input\">\n <mat-icon class=\"search-input__icon\">search</mat-icon>\n <input\n class=\"search-input__field\"\n type=\"text\"\n [placeholder]=\"'equipment.workspace.search' | translate\"\n [attr.aria-label]=\"'equipment.workspace.search' | translate\"\n (input)=\"onInput($event)\"\n />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n output\n} from '@angular/core';\nimport { LottieLoaderComponent } from '@humbeldore/c2g-ui';\nimport { EmptyStateData } from './empty-state.models';\n\n@Component({\n selector: 'c2g-empty-state',\n standalone: true,\n imports: [LottieLoaderComponent],\n templateUrl: './empty-state.component.html',\n styleUrls: ['./empty-state.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EmptyStateComponent {\n readonly data = input.required<EmptyStateData>();\n\n readonly actionClicked = output<void>();\n}\n","<div class=\"c2g-empty-state\">\n @if (data().lottiePreset) {\n <div class=\"c2g-empty-state__lottie\">\n <c2g-lottie-loader\n [preset]=\"data().lottiePreset!\"\n width=\"120px\"\n height=\"120px\"\n [showLabel]=\"false\"\n label=\"Illustration\"\n />\n </div>\n } @else if (data().icon) {\n <span class=\"c2g-empty-state__icon\" aria-hidden=\"true\">{{ data().icon }}</span>\n }\n\n <h3 class=\"c2g-empty-state__title\">{{ data().title }}</h3>\n\n @if (data().description) {\n <p class=\"c2g-empty-state__description\">{{ data().description }}</p>\n }\n\n @if (data().actionLabel) {\n <button\n class=\"c2g-empty-state__action\"\n type=\"button\"\n (click)=\"actionClicked.emit()\">\n {{ data().actionLabel }}\n </button>\n }\n\n <ng-content />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output\n} from '@angular/core';\nimport { PaginationState } from './pagination.models';\n\nconst MAX_VISIBLE_PAGES = 5;\n\n@Component({\n selector: 'c2g-pagination',\n standalone: true,\n imports: [],\n templateUrl: './pagination.component.html',\n styleUrls: ['./pagination.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PaginationComponent {\n readonly state = input.required<PaginationState>();\n readonly ariaLabel = input('Seitennavigation');\n\n readonly pageChanged = output<number>();\n\n readonly currentPage = computed(() => this.state().currentPage);\n readonly totalPages = computed(() => this.state().totalPages);\n\n readonly hasPrev = computed(() => this.currentPage() > 1);\n readonly hasNext = computed(() => this.currentPage() < this.totalPages());\n\n readonly visiblePages = computed(() => {\n const total = this.totalPages();\n const current = this.currentPage();\n const half = Math.floor(MAX_VISIBLE_PAGES / 2);\n\n let start = Math.max(1, current - half);\n let end = Math.min(total, start + MAX_VISIBLE_PAGES - 1);\n\n if (end - start < MAX_VISIBLE_PAGES - 1) {\n start = Math.max(1, end - MAX_VISIBLE_PAGES + 1);\n }\n\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n });\n\n readonly showStartEllipsis = computed(() => (this.visiblePages()[0] ?? 1) > 1);\n readonly showEndEllipsis = computed(() => (this.visiblePages().at(-1) ?? this.totalPages()) < this.totalPages());\n\n go(page: number): void {\n if (page < 1 || page > this.totalPages() || page === this.currentPage()) return;\n this.pageChanged.emit(page);\n }\n}\n","<nav class=\"c2g-pagination\" [attr.aria-label]=\"ariaLabel()\">\n <button\n class=\"c2g-pagination__btn c2g-pagination__btn--nav\"\n type=\"button\"\n aria-label=\"Vorherige Seite\"\n [disabled]=\"!hasPrev()\"\n (click)=\"go(currentPage() - 1)\">\n ‹\n </button>\n\n @if (showStartEllipsis()) {\n <button\n class=\"c2g-pagination__btn\"\n type=\"button\"\n [attr.aria-label]=\"'Seite 1'\"\n (click)=\"go(1)\">\n 1\n </button>\n <span class=\"c2g-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n }\n\n @for (page of visiblePages(); track page) {\n <button\n class=\"c2g-pagination__btn\"\n [class.c2g-pagination__btn--active]=\"page === currentPage()\"\n type=\"button\"\n [attr.aria-label]=\"'Seite ' + page\"\n [attr.aria-current]=\"page === currentPage() ? 'page' : null\"\n (click)=\"go(page)\">\n {{ page }}\n </button>\n }\n\n @if (showEndEllipsis()) {\n <span class=\"c2g-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n <button\n class=\"c2g-pagination__btn\"\n type=\"button\"\n [attr.aria-label]=\"'Seite ' + totalPages()\"\n (click)=\"go(totalPages())\">\n {{ totalPages() }}\n </button>\n }\n\n <button\n class=\"c2g-pagination__btn c2g-pagination__btn--nav\"\n type=\"button\"\n aria-label=\"Nächste Seite\"\n [disabled]=\"!hasNext()\"\n (click)=\"go(currentPage() + 1)\">\n ›\n </button>\n</nav>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n signal\n} from '@angular/core';\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { C2gTableColumn, C2gSortState, C2gSortDirection } from './table.models';\n\n@Component({\n selector: 'c2g-table',\n standalone: true,\n imports: [ScrollingModule, NgClass, NgTemplateOutlet],\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TableComponent<T extends Record<string, any> = Record<string, any>> {\n readonly rows = input.required<T[]>();\n readonly columns = input.required<C2gTableColumn<T>[]>();\n readonly rowHeight = input(48);\n readonly maxHeight = input('480px');\n readonly selectable = input(false);\n readonly virtualScroll = input(true);\n\n readonly sortChanged = output<C2gSortState>();\n readonly rowSelected = output<T>();\n\n readonly sortState = signal<C2gSortState>({ key: '', direction: null });\n readonly selectedRow = signal<T | null>(null);\n\n readonly sortedRows = computed(() => {\n const { key, direction } = this.sortState();\n const rows = [...this.rows()];\n if (!key || !direction) return rows;\n return rows.sort((a, b) => {\n const col = this.columns().find(c => c.key === key);\n const av = col?.valueGetter ? col.valueGetter(a) : a[key];\n const bv = col?.valueGetter ? col.valueGetter(b) : b[key];\n const cmp = av < bv ? -1 : av > bv ? 1 : 0;\n return direction === 'asc' ? cmp : -cmp;\n });\n });\n\n getCellValue(row: T, col: C2gTableColumn<T>): string | number {\n return col.valueGetter ? col.valueGetter(row) : row[col.key] ?? '';\n }\n\n sort(key: string): void {\n const current = this.sortState();\n const direction: C2gSortDirection =\n current.key === key\n ? current.direction === 'asc' ? 'desc' : current.direction === 'desc' ? null : 'asc'\n : 'asc';\n const next: C2gSortState = { key, direction };\n this.sortState.set(next);\n this.sortChanged.emit(next);\n }\n\n select(row: T): void {\n if (!this.selectable()) return;\n this.selectedRow.set(row);\n this.rowSelected.emit(row);\n }\n\n isSelected(row: T): boolean {\n return this.selectedRow() === row;\n }\n\n sortIcon(key: string): string {\n const s = this.sortState();\n if (s.key !== key || !s.direction) return '↕';\n return s.direction === 'asc' ? '↑' : '↓';\n }\n}\n","<div class=\"c2g-table-wrapper\" [style.maxHeight]=\"maxHeight()\">\n @if (virtualScroll()) {\n <cdk-virtual-scroll-viewport [itemSize]=\"rowHeight()\" class=\"c2g-table-viewport\" [style.height]=\"maxHeight()\">\n <table class=\"c2g-table\" role=\"grid\">\n <thead class=\"c2g-table__head\">\n <tr>\n @for (col of columns(); track col.key) {\n <th\n class=\"c2g-table__th\"\n [class.c2g-table__th--sortable]=\"col.sortable\"\n [class.c2g-table__th--sorted]=\"sortState().key === col.key\"\n (click)=\"col.sortable && sort(col.key)\"\n [attr.aria-sort]=\"col.sortable ? (sortState().key === col.key ? (sortState().direction ?? 'none') : 'none') : null\"\n >\n <span class=\"c2g-table__th-label\">{{ col.label }}</span>\n @if (col.sortable) {\n <span class=\"c2g-table__sort-icon\" aria-hidden=\"true\">{{ sortIcon(col.key) }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n <tr\n *cdkVirtualFor=\"let row of sortedRows()\"\n class=\"c2g-table__row\"\n [class.c2g-table__row--selectable]=\"selectable()\"\n [class.c2g-table__row--selected]=\"selectedRow() === row\"\n (click)=\"select(row)\"\n [attr.tabindex]=\"selectable() ? 0 : null\"\n (keydown.enter)=\"selectable() && select(row)\"\n >\n @for (col of columns(); track col.key) {\n <td class=\"c2g-table__td\">{{ getCellValue(row, col) }}</td>\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n } @else {\n <table class=\"c2g-table\" role=\"grid\">\n <thead class=\"c2g-table__head\">\n <tr>\n @for (col of columns(); track col.key) {\n <th\n class=\"c2g-table__th\"\n [class.c2g-table__th--sortable]=\"col.sortable\"\n [class.c2g-table__th--sorted]=\"sortState().key === col.key\"\n (click)=\"col.sortable && sort(col.key)\"\n [attr.aria-sort]=\"col.sortable ? (sortState().key === col.key ? (sortState().direction ?? 'none') : 'none') : null\"\n >\n <span class=\"c2g-table__th-label\">{{ col.label }}</span>\n @if (col.sortable) {\n <span class=\"c2g-table__sort-icon\" aria-hidden=\"true\">{{ sortIcon(col.key) }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of sortedRows(); track $index) {\n <tr\n class=\"c2g-table__row\"\n [class.c2g-table__row--selectable]=\"selectable()\"\n [class.c2g-table__row--selected]=\"selectedRow() === row\"\n (click)=\"select(row)\"\n [attr.tabindex]=\"selectable() ? 0 : null\"\n (keydown.enter)=\"selectable() && select(row)\"\n >\n @for (col of columns(); track col.key) {\n <td class=\"c2g-table__td\">{{ getCellValue(row, col) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n output\n} from '@angular/core';\nimport { C2gTab } from './tabs.models';\n\n@Component({\n selector: 'c2g-tabs',\n standalone: true,\n imports: [],\n templateUrl: './tabs.component.html',\n styleUrls: ['./tabs.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TabsComponent {\n readonly tabs = input.required<C2gTab[]>();\n readonly activeKey = model<string>('');\n\n readonly tabChanged = output<C2gTab>();\n\n readonly activeTab = computed(() =>\n this.tabs().find(t => t.key === this.activeKey()) ?? this.tabs()[0]\n );\n\n select(tab: C2gTab): void {\n if (tab.disabled) return;\n this.activeKey.set(tab.key);\n this.tabChanged.emit(tab);\n }\n\n isActive(tab: C2gTab): boolean {\n const key = this.activeKey();\n return key ? tab.key === key : tab === this.tabs()[0];\n }\n}\n","<div class=\"c2g-tabs\" role=\"tablist\" [attr.aria-label]=\"'Tabs'\">\n <div class=\"c2g-tabs__nav\">\n @for (tab of tabs(); track tab.key) {\n <button\n class=\"c2g-tabs__tab\"\n role=\"tab\"\n [class.c2g-tabs__tab--active]=\"isActive(tab)\"\n [class.c2g-tabs__tab--disabled]=\"tab.disabled\"\n [attr.aria-selected]=\"isActive(tab)\"\n [attr.aria-disabled]=\"tab.disabled || null\"\n [disabled]=\"tab.disabled || null\"\n (click)=\"select(tab)\"\n >\n @if (tab.icon) {\n <span class=\"c2g-tabs__tab-icon\" aria-hidden=\"true\">{{ tab.icon }}</span>\n }\n <span class=\"c2g-tabs__tab-label\">{{ tab.label }}</span>\n @if (tab.badge !== undefined) {\n <span class=\"c2g-tabs__tab-badge\">{{ tab.badge }}</span>\n }\n </button>\n }\n </div>\n\n <div class=\"c2g-tabs__indicator-bar\" aria-hidden=\"true\"></div>\n\n <div class=\"c2g-tabs__panel\" role=\"tabpanel\">\n <ng-content></ng-content>\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { C2gBreadcrumbItem } from './breadcrumb.models';\n\n@Component({\n selector: 'c2g-breadcrumb',\n standalone: true,\n imports: [],\n templateUrl: './breadcrumb.component.html',\n styleUrls: ['./breadcrumb.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class BreadcrumbComponent {\n readonly items = input.required<C2gBreadcrumbItem[]>();\n readonly separator = input('›');\n\n readonly itemClicked = output<C2gBreadcrumbItem>();\n\n navigate(event: Event, item: C2gBreadcrumbItem): void {\n if (!item.href) {\n event.preventDefault();\n this.itemClicked.emit(item);\n }\n }\n}\n","<nav class=\"c2g-breadcrumb\" aria-label=\"Breadcrumb\">\n <ol class=\"c2g-breadcrumb__list\">\n @for (item of items(); track item.label; let last = $last) {\n <li class=\"c2g-breadcrumb__item\">\n @if (!last) {\n <a\n class=\"c2g-breadcrumb__link\"\n [href]=\"item.href || '#'\"\n (click)=\"navigate($event, item)\"\n >\n @if (item.icon) {\n <span class=\"c2g-breadcrumb__icon\" aria-hidden=\"true\">{{ item.icon }}</span>\n }\n {{ item.label }}\n </a>\n <span class=\"c2g-breadcrumb__separator\" aria-hidden=\"true\">{{ separator() }}</span>\n } @else {\n <span class=\"c2g-breadcrumb__current\" aria-current=\"page\">\n @if (item.icon) {\n <span class=\"c2g-breadcrumb__icon\" aria-hidden=\"true\">{{ item.icon }}</span>\n }\n {{ item.label }}\n </span>\n }\n </li>\n }\n </ol>\n</nav>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n output\n} from '@angular/core';\nimport { C2gStep, C2gStepState } from './stepper.models';\n\n@Component({\n selector: 'c2g-stepper',\n standalone: true,\n imports: [],\n templateUrl: './stepper.component.html',\n styleUrls: ['./stepper.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class StepperComponent {\n readonly steps = input.required<C2gStep[]>();\n readonly activeIndex = model(0);\n readonly completedIndices = input<number[]>([]);\n readonly errorIndices = input<number[]>([]);\n readonly orientation = input<'horizontal' | 'vertical'>('horizontal');\n\n readonly stepChanged = output<{ step: C2gStep; index: number }>();\n\n readonly canGoNext = computed(() => this.activeIndex() < this.steps().length - 1);\n readonly canGoPrev = computed(() => this.activeIndex() > 0);\n\n getState(index: number): C2gStepState {\n if (this.errorIndices().includes(index)) return 'error';\n if (this.completedIndices().includes(index)) return 'completed';\n if (index === this.activeIndex()) return 'active';\n return 'pending';\n }\n\n goTo(index: number): void {\n if (index < 0 || index >= this.steps().length) return;\n this.activeIndex.set(index);\n this.stepChanged.emit({ step: this.steps()[index], index });\n }\n\n next(): void { this.goTo(this.activeIndex() + 1); }\n prev(): void { this.goTo(this.activeIndex() - 1); }\n}\n","<div\n class=\"c2g-stepper\"\n [class.c2g-stepper--horizontal]=\"orientation() === 'horizontal'\"\n [class.c2g-stepper--vertical]=\"orientation() === 'vertical'\"\n role=\"list\"\n [attr.aria-label]=\"'Steps'\"\n>\n @for (step of steps(); track step.label; let i = $index; let last = $last) {\n <div\n class=\"c2g-stepper__step\"\n [class.c2g-stepper__step--active]=\"getState(i) === 'active'\"\n [class.c2g-stepper__step--completed]=\"getState(i) === 'completed'\"\n [class.c2g-stepper__step--error]=\"getState(i) === 'error'\"\n [class.c2g-stepper__step--pending]=\"getState(i) === 'pending'\"\n role=\"listitem\"\n >\n <div class=\"c2g-stepper__header\">\n <button\n class=\"c2g-stepper__marker\"\n type=\"button\"\n [attr.aria-label]=\"'Step ' + (i + 1) + ': ' + step.label\"\n [attr.aria-current]=\"getState(i) === 'active' ? 'step' : null\"\n (click)=\"goTo(i)\"\n >\n @if (getState(i) === 'completed') {\n <span class=\"c2g-stepper__check\" aria-hidden=\"true\">✓</span>\n } @else if (getState(i) === 'error') {\n <span class=\"c2g-stepper__error-icon\" aria-hidden=\"true\">!</span>\n } @else {\n <span class=\"c2g-stepper__index\" aria-hidden=\"true\">{{ i + 1 }}</span>\n }\n </button>\n\n <div class=\"c2g-stepper__label-group\">\n <span class=\"c2g-stepper__label\">{{ step.label }}</span>\n @if (step.description) {\n <span class=\"c2g-stepper__description\">{{ step.description }}</span>\n }\n </div>\n </div>\n\n @if (!last) {\n <div class=\"c2g-stepper__connector\" aria-hidden=\"true\">\n <div\n class=\"c2g-stepper__connector-line\"\n [class.c2g-stepper__connector-line--filled]=\"getState(i) === 'completed'\"\n ></div>\n </div>\n }\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n computed,\n effect,\n input,\n signal,\n} from '@angular/core';\nimport { C2gKpiCardData } from './kpi-card.models';\n\n@Component({\n selector: 'c2g-kpi-card',\n standalone: true,\n imports: [],\n templateUrl: './kpi-card.component.html',\n styleUrls: ['./kpi-card.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClass()',\n '(mousemove)': 'onMouseMove($event)',\n '(mouseleave)': 'onMouseLeave()',\n }\n})\nexport class C2gKpiCardComponent implements OnDestroy {\n readonly data = input.required<C2gKpiCardData>();\n\n readonly color = computed(() => this.data().color ?? 'neutral');\n readonly hostClass = computed(() => `c2g-kpi-card c2g-kpi-card--${this.color()}`);\n\n // Count-up animation\n readonly displayValue = signal('');\n private countUpRaf = 0;\n\n constructor(private el: ElementRef<HTMLElement>) {\n effect(() => {\n const raw = this.data().value;\n this.startCountUp(raw);\n });\n }\n\n private startCountUp(raw: string | number): void {\n cancelAnimationFrame(this.countUpRaf);\n const target = parseFloat(String(raw).replace(/[^0-9.-]/g, ''));\n if (isNaN(target)) { this.displayValue.set(String(raw)); return; }\n\n const isFloat = String(raw).includes('.');\n const decimals = isFloat ? (String(raw).split('.')[1]?.length ?? 1) : 0;\n const suffix = String(raw).replace(/^[0-9.,\\s-]+/, '');\n const prefix = String(raw).replace(/[0-9.,\\s]+.*$/, '');\n const duration = 900;\n const start = performance.now();\n\n const tick = (now: number) => {\n const progress = Math.min((now - start) / duration, 1);\n const ease = 1 - Math.pow(1 - progress, 3); // ease-out cubic\n const current = ease * target;\n const formatted = decimals > 0\n ? current.toFixed(decimals)\n : Math.round(current).toLocaleString('de-DE');\n this.displayValue.set(`${prefix}${formatted}${suffix}`);\n if (progress < 1) this.countUpRaf = requestAnimationFrame(tick);\n };\n this.countUpRaf = requestAnimationFrame(tick);\n }\n\n // Sparkline SVG path\n readonly sparklinePath = computed(() => {\n const pts = this.data().sparkline;\n if (!pts || pts.length < 2) return null;\n const w = 80, h = 28;\n const min = Math.min(...pts);\n const max = Math.max(...pts);\n const range = max - min || 1;\n const coords = pts.map((v, i) => ({\n x: (i / (pts.length - 1)) * w,\n y: h - ((v - min) / range) * h,\n }));\n // Smooth bezier\n const d = coords.reduce((acc, p, i) => {\n if (i === 0) return `M ${p.x} ${p.y}`;\n const prev = coords[i - 1];\n const cpx = (prev.x + p.x) / 2;\n return `${acc} C ${cpx} ${prev.y} ${cpx} ${p.y} ${p.x} ${p.y}`;\n }, '');\n // Area fill path\n const area = `${d} L ${coords[coords.length-1].x} ${h} L 0 ${h} Z`;\n return { line: d, area, lastX: coords[coords.length-1].x, lastY: coords[coords.length-1].y };\n });\n\n // 3D tilt\n readonly tilt = signal({ x: 0, y: 0 });\n\n onMouseMove(e: MouseEvent): void {\n const rect = this.el.nativeElement.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const maxTilt = 6;\n this.tilt.set({\n x: ((e.clientY - cy) / (rect.height / 2)) * -maxTilt,\n y: ((e.clientX - cx) / (rect.width / 2)) * maxTilt,\n });\n }\n\n onMouseLeave(): void {\n this.tilt.set({ x: 0, y: 0 });\n }\n\n readonly tiltStyle = computed(() => {\n const { x, y } = this.tilt();\n return `perspective(600px) rotateX(${x}deg) rotateY(${y}deg) translateZ(0)`;\n });\n\n readonly trendArrow = computed(() => {\n const t = this.data().trend;\n if (t === 'up') return '↑';\n if (t === 'down') return '↓';\n return '→';\n });\n\n ngOnDestroy(): void {\n cancelAnimationFrame(this.countUpRaf);\n }\n}\n","<div class=\"c2g-kpi-card__inner\" [style.transform]=\"tiltStyle()\">\n\n <!-- Glassmorphism icon orb -->\n @if (data().icon) {\n <div class=\"c2g-kpi-card__orb\" aria-hidden=\"true\">\n <span class=\"c2g-kpi-card__orb-icon\">{{ data().icon }}</span>\n </div>\n }\n\n <!-- Decorative blob -->\n <div class=\"c2g-kpi-card__blob\" aria-hidden=\"true\"></div>\n\n <!-- Label -->\n <p class=\"c2g-kpi-card__label\">{{ data().label }}</p>\n\n <!-- Main value -->\n <div class=\"c2g-kpi-card__value-row\">\n <span class=\"c2g-kpi-card__value\">{{ displayValue() }}</span>\n @if (data().unit) {\n <span class=\"c2g-kpi-card__unit\">{{ data().unit }}</span>\n }\n </div>\n\n <!-- Sparkline -->\n @if (sparklinePath(); as sp) {\n <div class=\"c2g-kpi-card__sparkline\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 80 28\" preserveAspectRatio=\"none\" width=\"100%\" height=\"28\">\n <defs>\n <linearGradient [id]=\"'spark-grad-' + color()\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" class=\"c2g-kpi-card__spark-stop-top\" />\n <stop offset=\"100%\" class=\"c2g-kpi-card__spark-stop-bottom\" />\n </linearGradient>\n </defs>\n <path class=\"c2g-kpi-card__spark-area\"\n [attr.d]=\"sp.area\"\n [attr.fill]=\"'url(#spark-grad-' + color() + ')'\" />\n <path class=\"c2g-kpi-card__spark-line\" [attr.d]=\"sp.line\" fill=\"none\" />\n <!-- Dot at latest value -->\n <circle class=\"c2g-kpi-card__spark-dot\"\n [attr.cx]=\"sp.lastX\" [attr.cy]=\"sp.lastY\" r=\"2.5\" />\n </svg>\n </div>\n }\n\n <!-- Trend footer -->\n @if (data().trend || data().change !== undefined) {\n <div class=\"c2g-kpi-card__footer\"\n [class.c2g-kpi-card__footer--up]=\"data().trend === 'up'\"\n [class.c2g-kpi-card__footer--down]=\"data().trend === 'down'\">\n <span class=\"c2g-kpi-card__arrow\">{{ trendArrow() }}</span>\n @if (data().change !== undefined) {\n <span class=\"c2g-kpi-card__change\">{{ data().change }}</span>\n }\n @if (data().changeLabel) {\n <span class=\"c2g-kpi-card__change-label\">{{ data().changeLabel }}</span>\n }\n </div>\n }\n\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n output,\n signal\n} from '@angular/core';\nimport { C2gFilterGroup, C2gFilterState } from './filter-bar.models';\n\n@Component({\n selector: 'c2g-filter-bar',\n standalone: true,\n imports: [],\n templateUrl: './filter-bar.component.html',\n styleUrls: ['./filter-bar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FilterBarComponent {\n readonly groups = input.required<C2gFilterGroup[]>();\n readonly searchPlaceholder = input('Suchen...');\n readonly showSearch = input(true);\n\n readonly search = model('');\n readonly activeFilters = model<C2gFilterState>({});\n\n readonly filterChanged = output<C2gFilterState>();\n readonly searchChanged = output<string>();\n\n readonly activeCount = computed(() =>\n Object.values(this.activeFilters()).reduce((sum, v) => sum + v.length, 0)\n );\n\n readonly hasActiveFilters = computed(() => this.activeCount() > 0);\n\n isSelected(groupKey: string, optionKey: string): boolean {\n return (this.activeFilters()[groupKey] ?? []).includes(optionKey);\n }\n\n toggle(groupKey: string, optionKey: string, multiple: boolean): void {\n const current = { ...this.activeFilters() };\n const selected = current[groupKey] ?? [];\n if (multiple) {\n current[groupKey] = selected.includes(optionKey)\n ? selected.filter(k => k !== optionKey)\n : [...selected, optionKey];\n } else {\n current[groupKey] = selected.includes(optionKey) ? [] : [optionKey];\n }\n this.activeFilters.set(current);\n this.filterChanged.emit(current);\n }\n\n clearAll(): void {\n this.activeFilters.set({});\n this.search.set('');\n this.filterChanged.emit({});\n this.searchChanged.emit('');\n }\n\n onSearch(value: string): void {\n this.search.set(value);\n this.searchChanged.emit(value);\n }\n}\n","<div class=\"c2g-filter-bar\">\n @if (showSearch()) {\n <div class=\"c2g-filter-bar__search\">\n <input\n class=\"c2g-filter-bar__search-input\"\n type=\"search\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"search()\"\n (input)=\"onSearch($any($event.target).value)\"\n aria-label=\"Suchen\"\n />\n <span class=\"c2g-filter-bar__search-icon\" aria-hidden=\"true\">🔍</span>\n </div>\n }\n\n <div class=\"c2g-filter-bar__groups\">\n @for (group of groups(); track group.key) {\n <div class=\"c2g-filter-bar__group\">\n @if (group.label) {\n <span class=\"c2g-filter-bar__group-label\">{{ group.label }}</span>\n }\n <div class=\"c2g-filter-bar__options\" role=\"group\" [attr.aria-label]=\"group.label\">\n @for (option of group.options; track option.key) {\n <button\n class=\"c2g-filter-bar__option\"\n type=\"button\"\n [class.c2g-filter-bar__option--active]=\"isSelected(group.key, option.key)\"\n [attr.aria-pressed]=\"isSelected(group.key, option.key)\"\n (click)=\"toggle(group.key, option.key, group.multiple ?? true)\"\n >\n @if (option.icon) {\n <span class=\"c2g-filter-bar__option-icon\" aria-hidden=\"true\">{{ option.icon }}</span>\n }\n {{ option.label }}\n @if (option.count !== undefined) {\n <span class=\"c2g-filter-bar__option-count\">{{ option.count }}</span>\n }\n </button>\n }\n </div>\n </div>\n }\n </div>\n\n @if (hasActiveFilters()) {\n <button\n class=\"c2g-filter-bar__clear\"\n type=\"button\"\n (click)=\"clearAll()\"\n >\n Filter zurücksetzen\n <span class=\"c2g-filter-bar__clear-badge\">{{ activeCount() }}</span>\n </button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n@Component({\n selector: 'c2g-skeleton-table',\n standalone: true,\n imports: [],\n templateUrl: './skeleton-table.component.html',\n styleUrls: ['./skeleton-table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SkeletonTableComponent {\n readonly rows = input(5);\n readonly columns = input(4);\n readonly showHeader = input(true);\n\n readonly rowIndices = Array.from({ length: 10 }).map((_, i) => i);\n readonly colIndices = Array.from({ length: 10 }).map((_, i) => i);\n}\n","<div class=\"c2g-skeleton-table\">\n <table class=\"c2g-skeleton-table__table\" aria-busy=\"true\" aria-label=\"Wird geladen...\">\n @if (showHeader()) {\n <thead class=\"c2g-skeleton-table__head\">\n <tr>\n @for (c of colIndices.slice(0, columns()); track c) {\n <th class=\"c2g-skeleton-table__th\">\n <span class=\"c2g-skeleton c2g-skeleton--header\"></span>\n </th>\n }\n </tr>\n </thead>\n }\n <tbody>\n @for (r of rowIndices.slice(0, rows()); track r) {\n <tr class=\"c2g-skeleton-table__row\">\n @for (c of colIndices.slice(0, columns()); track c; let first = $first) {\n <td class=\"c2g-skeleton-table__td\">\n <span\n class=\"c2g-skeleton\"\n [class.c2g-skeleton--wide]=\"first\"\n ></span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i4"],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, output, effect, ViewChild, ViewEncapsulation, ChangeDetectionStrategy, Component, computed } from '@angular/core';
|
|
3
|
+
import { CommonModule } from '@angular/common';
|
|
4
|
+
import * as L from 'leaflet';
|
|
5
|
+
|
|
6
|
+
class MapComponent {
|
|
7
|
+
mapContainer;
|
|
8
|
+
center = input([47.6, 9.6], ...(ngDevMode ? [{ debugName: "center" }] : []));
|
|
9
|
+
zoom = input(7, ...(ngDevMode ? [{ debugName: "zoom" }] : []));
|
|
10
|
+
height = input('400px', ...(ngDevMode ? [{ debugName: "height" }] : []));
|
|
11
|
+
width = input('100%', ...(ngDevMode ? [{ debugName: "width" }] : []));
|
|
12
|
+
markers = input([], ...(ngDevMode ? [{ debugName: "markers" }] : []));
|
|
13
|
+
interactive = input(true, ...(ngDevMode ? [{ debugName: "interactive" }] : []));
|
|
14
|
+
mapReady = output();
|
|
15
|
+
mapClick = output();
|
|
16
|
+
markerClick = output();
|
|
17
|
+
map;
|
|
18
|
+
markerGroup;
|
|
19
|
+
constructor() {
|
|
20
|
+
effect(() => {
|
|
21
|
+
const currentMarkers = this.markers();
|
|
22
|
+
if (this.markerGroup) {
|
|
23
|
+
this.updateMarkers(currentMarkers);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
effect(() => {
|
|
27
|
+
const currentCenter = this.center();
|
|
28
|
+
const currentZoom = this.zoom();
|
|
29
|
+
if (this.map) {
|
|
30
|
+
this.map.setView(L.latLng(currentCenter[0], currentCenter[1]), currentZoom, {
|
|
31
|
+
animate: true,
|
|
32
|
+
duration: 0.5
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
ngAfterViewInit() {
|
|
38
|
+
this.initializeMap();
|
|
39
|
+
}
|
|
40
|
+
ngOnDestroy() {
|
|
41
|
+
// ViewEncapsulation.None is required for Leaflet to render tile layers and popups correctly
|
|
42
|
+
// outside Angular's shadow DOM — clean up the instance explicitly to prevent memory leaks
|
|
43
|
+
if (this.map) {
|
|
44
|
+
this.map.remove();
|
|
45
|
+
this.map = undefined;
|
|
46
|
+
}
|
|
47
|
+
this.markerGroup = undefined;
|
|
48
|
+
}
|
|
49
|
+
initializeMap() {
|
|
50
|
+
this.markerGroup = L.layerGroup();
|
|
51
|
+
this.map = L.map(this.mapContainer.nativeElement, {
|
|
52
|
+
center: L.latLng(this.center()[0], this.center()[1]),
|
|
53
|
+
zoom: this.zoom(),
|
|
54
|
+
zoomControl: this.interactive(),
|
|
55
|
+
dragging: this.interactive(),
|
|
56
|
+
touchZoom: this.interactive(),
|
|
57
|
+
doubleClickZoom: this.interactive(),
|
|
58
|
+
scrollWheelZoom: this.interactive(),
|
|
59
|
+
boxZoom: this.interactive(),
|
|
60
|
+
keyboard: this.interactive(),
|
|
61
|
+
attributionControl: true
|
|
62
|
+
});
|
|
63
|
+
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
|
64
|
+
attribution: '© OpenStreetMap contributors',
|
|
65
|
+
maxZoom: 19
|
|
66
|
+
}).addTo(this.map);
|
|
67
|
+
this.markerGroup.addTo(this.map);
|
|
68
|
+
if (this.interactive()) {
|
|
69
|
+
this.map.on('click', (event) => {
|
|
70
|
+
this.mapClick.emit(event);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
this.updateMarkers(this.markers());
|
|
74
|
+
this.mapReady.emit(this.map);
|
|
75
|
+
}
|
|
76
|
+
updateMarkers(currentMarkers) {
|
|
77
|
+
if (!this.markerGroup) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.markerGroup.clearLayers();
|
|
81
|
+
currentMarkers.forEach((markerData) => {
|
|
82
|
+
const icon = L.divIcon({
|
|
83
|
+
className: 'c2g-map-div-icon',
|
|
84
|
+
html: this.buildMarkerHtml(markerData),
|
|
85
|
+
iconSize: this.markerSize(markerData.size),
|
|
86
|
+
iconAnchor: this.markerAnchor(markerData.size)
|
|
87
|
+
});
|
|
88
|
+
const marker = L.marker([markerData.latitude, markerData.longitude], { icon });
|
|
89
|
+
marker.on('click', (event) => {
|
|
90
|
+
this.markerClick.emit({ marker: markerData, event });
|
|
91
|
+
});
|
|
92
|
+
if (markerData.title) {
|
|
93
|
+
marker.bindTooltip(markerData.title, {
|
|
94
|
+
className: 'c2g-map-tooltip',
|
|
95
|
+
direction: 'top',
|
|
96
|
+
offset: [0, -16]
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
this.markerGroup.addLayer(marker);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
buildMarkerHtml(marker) {
|
|
103
|
+
const markerType = marker.tourStatus ? `status-${marker.tourStatus}` : (marker.activityType ?? 'adventure');
|
|
104
|
+
const markerSize = marker.size ?? 'medium';
|
|
105
|
+
const markerVariant = marker.variant ?? 'default';
|
|
106
|
+
const selectedClass = marker.selected ? ' c2g-map-marker--selected' : '';
|
|
107
|
+
const variantClass = markerVariant === 'new-tour' ? ' c2g-map-marker--new-tour' : '';
|
|
108
|
+
return `
|
|
109
|
+
<div class="c2g-map-marker c2g-map-marker--${markerSize} c2g-map-marker--${markerType}${selectedClass}${variantClass}">
|
|
110
|
+
<div class="c2g-map-marker__pin">
|
|
111
|
+
<div class="c2g-map-marker__circle">
|
|
112
|
+
<span class="c2g-map-marker__icon material-icons">${this.markerIcon(marker)}</span>
|
|
113
|
+
</div>
|
|
114
|
+
<div class="c2g-map-marker__point"></div>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
markerIcon(marker) {
|
|
120
|
+
if (marker.variant === 'new-tour') {
|
|
121
|
+
return 'add';
|
|
122
|
+
}
|
|
123
|
+
if (marker.tourStatus) {
|
|
124
|
+
const statusIconMap = {
|
|
125
|
+
declined: 'close',
|
|
126
|
+
completed: 'check',
|
|
127
|
+
current: 'radio_button_checked',
|
|
128
|
+
upcoming: 'radio_button_unchecked'
|
|
129
|
+
};
|
|
130
|
+
return statusIconMap[marker.tourStatus];
|
|
131
|
+
}
|
|
132
|
+
const activity = marker.activityType ?? 'adventure';
|
|
133
|
+
const activityIconMap = {
|
|
134
|
+
water: 'waves',
|
|
135
|
+
forest: 'park',
|
|
136
|
+
mountain: 'terrain',
|
|
137
|
+
desert: 'wb_sunny',
|
|
138
|
+
urban: 'location_city',
|
|
139
|
+
adventure: 'outdoor_grill',
|
|
140
|
+
'point-of-interest': 'star'
|
|
141
|
+
};
|
|
142
|
+
return activityIconMap[activity];
|
|
143
|
+
}
|
|
144
|
+
markerSize(size) {
|
|
145
|
+
switch (size) {
|
|
146
|
+
case 'small':
|
|
147
|
+
return [24, 36];
|
|
148
|
+
case 'large':
|
|
149
|
+
return [40, 56];
|
|
150
|
+
default:
|
|
151
|
+
return [32, 46];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
markerAnchor(size) {
|
|
155
|
+
switch (size) {
|
|
156
|
+
case 'small':
|
|
157
|
+
return [12, 36];
|
|
158
|
+
case 'large':
|
|
159
|
+
return [20, 56];
|
|
160
|
+
default:
|
|
161
|
+
return [16, 46];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MapComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
165
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.19", type: MapComponent, isStandalone: true, selector: "c2g-map", inputs: { center: { classPropertyName: "center", publicName: "center", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, markers: { classPropertyName: "markers", publicName: "markers", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mapReady: "mapReady", mapClick: "mapClick", markerClick: "markerClick" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true, static: true }], ngImport: i0, template: "<div\n #mapContainer\n class=\"c2g-map\"\n [style.height]=\"height()\"\n [style.width]=\"width()\"\n></div>\n", styles: [".c2g-map-marker{position:relative;cursor:pointer;transition:all var(--c2g-transition-fast, .15s ease)}.c2g-map-marker--small .c2g-map-marker__pin{width:24px;height:36px}.c2g-map-marker--small .c2g-map-marker__circle{width:24px;height:24px}.c2g-map-marker--small .c2g-map-marker__icon{font-size:14px}.c2g-map-marker--small .c2g-map-marker__point{border-left-width:5px;border-right-width:5px;border-top-width:7.5px}.c2g-map-marker--small .c2g-map-marker__point:before{border-left-width:3px;border-right-width:3px;border-top-width:4.5px}.c2g-map-marker--medium .c2g-map-marker__pin{width:32px;height:46px}.c2g-map-marker--medium .c2g-map-marker__circle{width:32px;height:32px}.c2g-map-marker--medium .c2g-map-marker__icon{font-size:18px}.c2g-map-marker--medium .c2g-map-marker__point{border-left-width:6px;border-right-width:6px;border-top-width:9px}.c2g-map-marker--medium .c2g-map-marker__point:before{border-left-width:4px;border-right-width:4px;border-top-width:6px}.c2g-map-marker--large .c2g-map-marker__pin{width:40px;height:56px}.c2g-map-marker--large .c2g-map-marker__circle{width:40px;height:40px}.c2g-map-marker--large .c2g-map-marker__icon{font-size:22px}.c2g-map-marker--large .c2g-map-marker__point{border-left-width:8px;border-right-width:8px;border-top-width:12px}.c2g-map-marker--large .c2g-map-marker__point:before{border-left-width:6px;border-right-width:6px;border-top-width:9px}.c2g-map-marker__pin{position:relative;filter:drop-shadow(var(--c2g-shadow-md, 0 3px 8px rgba(0, 0, 0, .2)));transition:all var(--c2g-transition-fast, .15s ease)}.c2g-map-marker__circle{position:absolute;top:0;left:50%;transform:translate(-50%);z-index:2;border-radius:50%;border:2px solid #fff;display:flex;align-items:center;justify-content:center}.c2g-map-marker__point{position:absolute;bottom:0;left:50%;transform:translate(-50%);z-index:1;width:0;height:0;border-style:solid;border-color:transparent;border-top-color:#fff}.c2g-map-marker__point:before{content:\"\";position:absolute;bottom:2px;left:50%;transform:translate(-50%);width:0;height:0;border-style:solid;border-color:transparent}.c2g-map-marker__icon{color:#fff;font-weight:700;line-height:1}.c2g-map-marker--water .c2g-map-marker__circle{background:var(--c2g-activity-water, #1976d2)}.c2g-map-marker--water .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-water, #1976d2)}.c2g-map-marker--forest .c2g-map-marker__circle{background:var(--c2g-activity-forest, #2e7d32)}.c2g-map-marker--forest .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-forest, #2e7d32)}.c2g-map-marker--mountain .c2g-map-marker__circle{background:var(--c2g-activity-mountain, #6d4c41)}.c2g-map-marker--mountain .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-mountain, #6d4c41)}.c2g-map-marker--desert .c2g-map-marker__circle{background:var(--c2g-activity-desert, #f9a825)}.c2g-map-marker--desert .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-desert, #f9a825)}.c2g-map-marker--urban .c2g-map-marker__circle{background:var(--c2g-activity-urban, #546e7a)}.c2g-map-marker--urban .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-urban, #546e7a)}.c2g-map-marker--adventure .c2g-map-marker__circle{background:var(--c2g-activity-adventure, #8e24aa)}.c2g-map-marker--adventure .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-adventure, #8e24aa)}.c2g-map-marker--point-of-interest .c2g-map-marker__circle{background:var(--c2g-activity-point-of-interest, #d81b60)}.c2g-map-marker--point-of-interest .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-point-of-interest, #d81b60)}.c2g-map-marker--status-declined .c2g-map-marker__circle{background:var(--c2g-tour-declined, #b71c1c)}.c2g-map-marker--status-declined .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-declined, #b71c1c)}.c2g-map-marker--status-completed .c2g-map-marker__circle{background:var(--c2g-tour-completed, #2e7d32)}.c2g-map-marker--status-completed .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-completed, #2e7d32)}.c2g-map-marker--status-current .c2g-map-marker__circle{background:var(--c2g-tour-current, #ef6c00)}.c2g-map-marker--status-current .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-current, #ef6c00)}.c2g-map-marker--status-upcoming .c2g-map-marker__circle{background:var(--c2g-tour-upcoming, #1565c0)}.c2g-map-marker--status-upcoming .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-upcoming, #1565c0)}.c2g-map-marker--new-tour .c2g-map-marker__circle{background:var(--c2g-primary, #16213e)}.c2g-map-marker--new-tour .c2g-map-marker__point:before{border-top-color:var(--c2g-primary, #16213e)}.c2g-map-marker--new-tour .c2g-map-marker__circle{border:2px solid #fff}.c2g-map-marker--selected{z-index:10}.c2g-map-marker--selected .c2g-map-marker__pin{transform:scale(1.15)}.c2g-map{border-radius:var(--c2g-radius-md, 12px);overflow:hidden;background-color:var(--c2g-neutral-100, #f2f2f2)}.c2g-map .leaflet-control-attribution{background:#fffc;font-size:10px;padding:2px 4px;border-radius:var(--c2g-radius-sm, 6px)}.c2g-map .leaflet-control-zoom{border:none;border-radius:var(--c2g-radius-md, 12px);overflow:hidden;box-shadow:var(--c2g-shadow-md, 0 3px 8px rgba(0, 0, 0, .15))}.c2g-map .leaflet-control-zoom a{background-color:var(--c2g-neutral-50, #fff);color:var(--c2g-neutral-700, #444);border:none}.c2g-map-div-icon{background:transparent;border:none}.c2g-map-tooltip{background:var(--c2g-neutral-900, #111);color:var(--c2g-neutral-50, #fff);border:none;border-radius:var(--c2g-radius-sm, 6px);padding:2px 6px;font-size:12px;font-weight:500}.c2g-map-tooltip:before{border-top-color:var(--c2g-neutral-900, #111)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
166
|
+
}
|
|
167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MapComponent, decorators: [{
|
|
168
|
+
type: Component,
|
|
169
|
+
args: [{ selector: 'c2g-map', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n #mapContainer\n class=\"c2g-map\"\n [style.height]=\"height()\"\n [style.width]=\"width()\"\n></div>\n", styles: [".c2g-map-marker{position:relative;cursor:pointer;transition:all var(--c2g-transition-fast, .15s ease)}.c2g-map-marker--small .c2g-map-marker__pin{width:24px;height:36px}.c2g-map-marker--small .c2g-map-marker__circle{width:24px;height:24px}.c2g-map-marker--small .c2g-map-marker__icon{font-size:14px}.c2g-map-marker--small .c2g-map-marker__point{border-left-width:5px;border-right-width:5px;border-top-width:7.5px}.c2g-map-marker--small .c2g-map-marker__point:before{border-left-width:3px;border-right-width:3px;border-top-width:4.5px}.c2g-map-marker--medium .c2g-map-marker__pin{width:32px;height:46px}.c2g-map-marker--medium .c2g-map-marker__circle{width:32px;height:32px}.c2g-map-marker--medium .c2g-map-marker__icon{font-size:18px}.c2g-map-marker--medium .c2g-map-marker__point{border-left-width:6px;border-right-width:6px;border-top-width:9px}.c2g-map-marker--medium .c2g-map-marker__point:before{border-left-width:4px;border-right-width:4px;border-top-width:6px}.c2g-map-marker--large .c2g-map-marker__pin{width:40px;height:56px}.c2g-map-marker--large .c2g-map-marker__circle{width:40px;height:40px}.c2g-map-marker--large .c2g-map-marker__icon{font-size:22px}.c2g-map-marker--large .c2g-map-marker__point{border-left-width:8px;border-right-width:8px;border-top-width:12px}.c2g-map-marker--large .c2g-map-marker__point:before{border-left-width:6px;border-right-width:6px;border-top-width:9px}.c2g-map-marker__pin{position:relative;filter:drop-shadow(var(--c2g-shadow-md, 0 3px 8px rgba(0, 0, 0, .2)));transition:all var(--c2g-transition-fast, .15s ease)}.c2g-map-marker__circle{position:absolute;top:0;left:50%;transform:translate(-50%);z-index:2;border-radius:50%;border:2px solid #fff;display:flex;align-items:center;justify-content:center}.c2g-map-marker__point{position:absolute;bottom:0;left:50%;transform:translate(-50%);z-index:1;width:0;height:0;border-style:solid;border-color:transparent;border-top-color:#fff}.c2g-map-marker__point:before{content:\"\";position:absolute;bottom:2px;left:50%;transform:translate(-50%);width:0;height:0;border-style:solid;border-color:transparent}.c2g-map-marker__icon{color:#fff;font-weight:700;line-height:1}.c2g-map-marker--water .c2g-map-marker__circle{background:var(--c2g-activity-water, #1976d2)}.c2g-map-marker--water .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-water, #1976d2)}.c2g-map-marker--forest .c2g-map-marker__circle{background:var(--c2g-activity-forest, #2e7d32)}.c2g-map-marker--forest .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-forest, #2e7d32)}.c2g-map-marker--mountain .c2g-map-marker__circle{background:var(--c2g-activity-mountain, #6d4c41)}.c2g-map-marker--mountain .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-mountain, #6d4c41)}.c2g-map-marker--desert .c2g-map-marker__circle{background:var(--c2g-activity-desert, #f9a825)}.c2g-map-marker--desert .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-desert, #f9a825)}.c2g-map-marker--urban .c2g-map-marker__circle{background:var(--c2g-activity-urban, #546e7a)}.c2g-map-marker--urban .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-urban, #546e7a)}.c2g-map-marker--adventure .c2g-map-marker__circle{background:var(--c2g-activity-adventure, #8e24aa)}.c2g-map-marker--adventure .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-adventure, #8e24aa)}.c2g-map-marker--point-of-interest .c2g-map-marker__circle{background:var(--c2g-activity-point-of-interest, #d81b60)}.c2g-map-marker--point-of-interest .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-point-of-interest, #d81b60)}.c2g-map-marker--status-declined .c2g-map-marker__circle{background:var(--c2g-tour-declined, #b71c1c)}.c2g-map-marker--status-declined .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-declined, #b71c1c)}.c2g-map-marker--status-completed .c2g-map-marker__circle{background:var(--c2g-tour-completed, #2e7d32)}.c2g-map-marker--status-completed .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-completed, #2e7d32)}.c2g-map-marker--status-current .c2g-map-marker__circle{background:var(--c2g-tour-current, #ef6c00)}.c2g-map-marker--status-current .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-current, #ef6c00)}.c2g-map-marker--status-upcoming .c2g-map-marker__circle{background:var(--c2g-tour-upcoming, #1565c0)}.c2g-map-marker--status-upcoming .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-upcoming, #1565c0)}.c2g-map-marker--new-tour .c2g-map-marker__circle{background:var(--c2g-primary, #16213e)}.c2g-map-marker--new-tour .c2g-map-marker__point:before{border-top-color:var(--c2g-primary, #16213e)}.c2g-map-marker--new-tour .c2g-map-marker__circle{border:2px solid #fff}.c2g-map-marker--selected{z-index:10}.c2g-map-marker--selected .c2g-map-marker__pin{transform:scale(1.15)}.c2g-map{border-radius:var(--c2g-radius-md, 12px);overflow:hidden;background-color:var(--c2g-neutral-100, #f2f2f2)}.c2g-map .leaflet-control-attribution{background:#fffc;font-size:10px;padding:2px 4px;border-radius:var(--c2g-radius-sm, 6px)}.c2g-map .leaflet-control-zoom{border:none;border-radius:var(--c2g-radius-md, 12px);overflow:hidden;box-shadow:var(--c2g-shadow-md, 0 3px 8px rgba(0, 0, 0, .15))}.c2g-map .leaflet-control-zoom a{background-color:var(--c2g-neutral-50, #fff);color:var(--c2g-neutral-700, #444);border:none}.c2g-map-div-icon{background:transparent;border:none}.c2g-map-tooltip{background:var(--c2g-neutral-900, #111);color:var(--c2g-neutral-50, #fff);border:none;border-radius:var(--c2g-radius-sm, 6px);padding:2px 6px;font-size:12px;font-weight:500}.c2g-map-tooltip:before{border-top-color:var(--c2g-neutral-900, #111)}\n"] }]
|
|
170
|
+
}], ctorParameters: () => [], propDecorators: { mapContainer: [{
|
|
171
|
+
type: ViewChild,
|
|
172
|
+
args: ['mapContainer', { static: true }]
|
|
173
|
+
}], center: [{ type: i0.Input, args: [{ isSignal: true, alias: "center", required: false }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], markers: [{ type: i0.Input, args: [{ isSignal: true, alias: "markers", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], mapReady: [{ type: i0.Output, args: ["mapReady"] }], mapClick: [{ type: i0.Output, args: ["mapClick"] }], markerClick: [{ type: i0.Output, args: ["markerClick"] }] } });
|
|
174
|
+
|
|
175
|
+
class MapMarkerComponent {
|
|
176
|
+
activityType = input('adventure', ...(ngDevMode ? [{ debugName: "activityType" }] : []));
|
|
177
|
+
tourStatus = input(null, ...(ngDevMode ? [{ debugName: "tourStatus" }] : []));
|
|
178
|
+
selected = input(false, ...(ngDevMode ? [{ debugName: "selected" }] : []));
|
|
179
|
+
size = input('medium', ...(ngDevMode ? [{ debugName: "size" }] : []));
|
|
180
|
+
variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : []));
|
|
181
|
+
markerType = computed(() => {
|
|
182
|
+
const status = this.tourStatus();
|
|
183
|
+
return status ? `status-${status}` : this.activityType();
|
|
184
|
+
}, ...(ngDevMode ? [{ debugName: "markerType" }] : []));
|
|
185
|
+
markerIcon = computed(() => {
|
|
186
|
+
if (this.variant() === 'new-tour') {
|
|
187
|
+
return 'add';
|
|
188
|
+
}
|
|
189
|
+
const status = this.tourStatus();
|
|
190
|
+
if (status) {
|
|
191
|
+
const statusIconMap = {
|
|
192
|
+
declined: 'close',
|
|
193
|
+
completed: 'check',
|
|
194
|
+
current: 'radio_button_checked',
|
|
195
|
+
upcoming: 'radio_button_unchecked'
|
|
196
|
+
};
|
|
197
|
+
return statusIconMap[status];
|
|
198
|
+
}
|
|
199
|
+
const activityIconMap = {
|
|
200
|
+
water: 'waves',
|
|
201
|
+
forest: 'park',
|
|
202
|
+
mountain: 'terrain',
|
|
203
|
+
desert: 'wb_sunny',
|
|
204
|
+
urban: 'location_city',
|
|
205
|
+
adventure: 'outdoor_grill',
|
|
206
|
+
'point-of-interest': 'star'
|
|
207
|
+
};
|
|
208
|
+
return activityIconMap[this.activityType()];
|
|
209
|
+
}, ...(ngDevMode ? [{ debugName: "markerIcon" }] : []));
|
|
210
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MapMarkerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
211
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.19", type: MapMarkerComponent, isStandalone: true, selector: "c2g-map-marker", inputs: { activityType: { classPropertyName: "activityType", publicName: "activityType", isSignal: true, isRequired: false, transformFunction: null }, tourStatus: { classPropertyName: "tourStatus", publicName: "tourStatus", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"c2g-map-marker\"\n [class.c2g-map-marker--selected]=\"selected()\"\n [class.c2g-map-marker--small]=\"size() === 'small'\"\n [class.c2g-map-marker--medium]=\"size() === 'medium'\"\n [class.c2g-map-marker--large]=\"size() === 'large'\"\n [class.c2g-map-marker--new-tour]=\"variant() === 'new-tour'\"\n [class]=\"'c2g-map-marker--' + markerType()\"\n>\n <div class=\"c2g-map-marker__pin\">\n <div class=\"c2g-map-marker__circle\">\n <span class=\"c2g-map-marker__icon material-icons\">{{ markerIcon() }}</span>\n </div>\n <div class=\"c2g-map-marker__point\"></div>\n </div>\n</div>\n", styles: [".c2g-map-marker{position:relative;cursor:pointer;transition:all var(--c2g-transition-fast, .15s ease)}.c2g-map-marker--small .c2g-map-marker__pin{width:24px;height:36px}.c2g-map-marker--small .c2g-map-marker__circle{width:24px;height:24px}.c2g-map-marker--small .c2g-map-marker__icon{font-size:14px}.c2g-map-marker--small .c2g-map-marker__point{border-left-width:5px;border-right-width:5px;border-top-width:7.5px}.c2g-map-marker--small .c2g-map-marker__point:before{border-left-width:3px;border-right-width:3px;border-top-width:4.5px}.c2g-map-marker--medium .c2g-map-marker__pin{width:32px;height:46px}.c2g-map-marker--medium .c2g-map-marker__circle{width:32px;height:32px}.c2g-map-marker--medium .c2g-map-marker__icon{font-size:18px}.c2g-map-marker--medium .c2g-map-marker__point{border-left-width:6px;border-right-width:6px;border-top-width:9px}.c2g-map-marker--medium .c2g-map-marker__point:before{border-left-width:4px;border-right-width:4px;border-top-width:6px}.c2g-map-marker--large .c2g-map-marker__pin{width:40px;height:56px}.c2g-map-marker--large .c2g-map-marker__circle{width:40px;height:40px}.c2g-map-marker--large .c2g-map-marker__icon{font-size:22px}.c2g-map-marker--large .c2g-map-marker__point{border-left-width:8px;border-right-width:8px;border-top-width:12px}.c2g-map-marker--large .c2g-map-marker__point:before{border-left-width:6px;border-right-width:6px;border-top-width:9px}.c2g-map-marker__pin{position:relative;filter:drop-shadow(var(--c2g-shadow-md, 0 3px 8px rgba(0, 0, 0, .2)));transition:all var(--c2g-transition-fast, .15s ease)}.c2g-map-marker__circle{position:absolute;top:0;left:50%;transform:translate(-50%);z-index:2;border-radius:50%;border:2px solid #fff;display:flex;align-items:center;justify-content:center}.c2g-map-marker__point{position:absolute;bottom:0;left:50%;transform:translate(-50%);z-index:1;width:0;height:0;border-style:solid;border-color:transparent;border-top-color:#fff}.c2g-map-marker__point:before{content:\"\";position:absolute;bottom:2px;left:50%;transform:translate(-50%);width:0;height:0;border-style:solid;border-color:transparent}.c2g-map-marker__icon{color:#fff;font-weight:700;line-height:1}.c2g-map-marker--water .c2g-map-marker__circle{background:var(--c2g-activity-water, #1976d2)}.c2g-map-marker--water .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-water, #1976d2)}.c2g-map-marker--forest .c2g-map-marker__circle{background:var(--c2g-activity-forest, #2e7d32)}.c2g-map-marker--forest .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-forest, #2e7d32)}.c2g-map-marker--mountain .c2g-map-marker__circle{background:var(--c2g-activity-mountain, #6d4c41)}.c2g-map-marker--mountain .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-mountain, #6d4c41)}.c2g-map-marker--desert .c2g-map-marker__circle{background:var(--c2g-activity-desert, #f9a825)}.c2g-map-marker--desert .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-desert, #f9a825)}.c2g-map-marker--urban .c2g-map-marker__circle{background:var(--c2g-activity-urban, #546e7a)}.c2g-map-marker--urban .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-urban, #546e7a)}.c2g-map-marker--adventure .c2g-map-marker__circle{background:var(--c2g-activity-adventure, #8e24aa)}.c2g-map-marker--adventure .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-adventure, #8e24aa)}.c2g-map-marker--point-of-interest .c2g-map-marker__circle{background:var(--c2g-activity-point-of-interest, #d81b60)}.c2g-map-marker--point-of-interest .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-point-of-interest, #d81b60)}.c2g-map-marker--status-declined .c2g-map-marker__circle{background:var(--c2g-tour-declined, #b71c1c)}.c2g-map-marker--status-declined .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-declined, #b71c1c)}.c2g-map-marker--status-completed .c2g-map-marker__circle{background:var(--c2g-tour-completed, #2e7d32)}.c2g-map-marker--status-completed .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-completed, #2e7d32)}.c2g-map-marker--status-current .c2g-map-marker__circle{background:var(--c2g-tour-current, #ef6c00)}.c2g-map-marker--status-current .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-current, #ef6c00)}.c2g-map-marker--status-upcoming .c2g-map-marker__circle{background:var(--c2g-tour-upcoming, #1565c0)}.c2g-map-marker--status-upcoming .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-upcoming, #1565c0)}.c2g-map-marker--new-tour .c2g-map-marker__circle{background:var(--c2g-primary, #16213e)}.c2g-map-marker--new-tour .c2g-map-marker__point:before{border-top-color:var(--c2g-primary, #16213e)}.c2g-map-marker--new-tour .c2g-map-marker__circle{border:2px solid #fff}.c2g-map-marker--selected{z-index:10}.c2g-map-marker--selected .c2g-map-marker__pin{transform:scale(1.15)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
212
|
+
}
|
|
213
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MapMarkerComponent, decorators: [{
|
|
214
|
+
type: Component,
|
|
215
|
+
args: [{ selector: 'c2g-map-marker', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"c2g-map-marker\"\n [class.c2g-map-marker--selected]=\"selected()\"\n [class.c2g-map-marker--small]=\"size() === 'small'\"\n [class.c2g-map-marker--medium]=\"size() === 'medium'\"\n [class.c2g-map-marker--large]=\"size() === 'large'\"\n [class.c2g-map-marker--new-tour]=\"variant() === 'new-tour'\"\n [class]=\"'c2g-map-marker--' + markerType()\"\n>\n <div class=\"c2g-map-marker__pin\">\n <div class=\"c2g-map-marker__circle\">\n <span class=\"c2g-map-marker__icon material-icons\">{{ markerIcon() }}</span>\n </div>\n <div class=\"c2g-map-marker__point\"></div>\n </div>\n</div>\n", styles: [".c2g-map-marker{position:relative;cursor:pointer;transition:all var(--c2g-transition-fast, .15s ease)}.c2g-map-marker--small .c2g-map-marker__pin{width:24px;height:36px}.c2g-map-marker--small .c2g-map-marker__circle{width:24px;height:24px}.c2g-map-marker--small .c2g-map-marker__icon{font-size:14px}.c2g-map-marker--small .c2g-map-marker__point{border-left-width:5px;border-right-width:5px;border-top-width:7.5px}.c2g-map-marker--small .c2g-map-marker__point:before{border-left-width:3px;border-right-width:3px;border-top-width:4.5px}.c2g-map-marker--medium .c2g-map-marker__pin{width:32px;height:46px}.c2g-map-marker--medium .c2g-map-marker__circle{width:32px;height:32px}.c2g-map-marker--medium .c2g-map-marker__icon{font-size:18px}.c2g-map-marker--medium .c2g-map-marker__point{border-left-width:6px;border-right-width:6px;border-top-width:9px}.c2g-map-marker--medium .c2g-map-marker__point:before{border-left-width:4px;border-right-width:4px;border-top-width:6px}.c2g-map-marker--large .c2g-map-marker__pin{width:40px;height:56px}.c2g-map-marker--large .c2g-map-marker__circle{width:40px;height:40px}.c2g-map-marker--large .c2g-map-marker__icon{font-size:22px}.c2g-map-marker--large .c2g-map-marker__point{border-left-width:8px;border-right-width:8px;border-top-width:12px}.c2g-map-marker--large .c2g-map-marker__point:before{border-left-width:6px;border-right-width:6px;border-top-width:9px}.c2g-map-marker__pin{position:relative;filter:drop-shadow(var(--c2g-shadow-md, 0 3px 8px rgba(0, 0, 0, .2)));transition:all var(--c2g-transition-fast, .15s ease)}.c2g-map-marker__circle{position:absolute;top:0;left:50%;transform:translate(-50%);z-index:2;border-radius:50%;border:2px solid #fff;display:flex;align-items:center;justify-content:center}.c2g-map-marker__point{position:absolute;bottom:0;left:50%;transform:translate(-50%);z-index:1;width:0;height:0;border-style:solid;border-color:transparent;border-top-color:#fff}.c2g-map-marker__point:before{content:\"\";position:absolute;bottom:2px;left:50%;transform:translate(-50%);width:0;height:0;border-style:solid;border-color:transparent}.c2g-map-marker__icon{color:#fff;font-weight:700;line-height:1}.c2g-map-marker--water .c2g-map-marker__circle{background:var(--c2g-activity-water, #1976d2)}.c2g-map-marker--water .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-water, #1976d2)}.c2g-map-marker--forest .c2g-map-marker__circle{background:var(--c2g-activity-forest, #2e7d32)}.c2g-map-marker--forest .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-forest, #2e7d32)}.c2g-map-marker--mountain .c2g-map-marker__circle{background:var(--c2g-activity-mountain, #6d4c41)}.c2g-map-marker--mountain .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-mountain, #6d4c41)}.c2g-map-marker--desert .c2g-map-marker__circle{background:var(--c2g-activity-desert, #f9a825)}.c2g-map-marker--desert .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-desert, #f9a825)}.c2g-map-marker--urban .c2g-map-marker__circle{background:var(--c2g-activity-urban, #546e7a)}.c2g-map-marker--urban .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-urban, #546e7a)}.c2g-map-marker--adventure .c2g-map-marker__circle{background:var(--c2g-activity-adventure, #8e24aa)}.c2g-map-marker--adventure .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-adventure, #8e24aa)}.c2g-map-marker--point-of-interest .c2g-map-marker__circle{background:var(--c2g-activity-point-of-interest, #d81b60)}.c2g-map-marker--point-of-interest .c2g-map-marker__point:before{border-top-color:var(--c2g-activity-point-of-interest, #d81b60)}.c2g-map-marker--status-declined .c2g-map-marker__circle{background:var(--c2g-tour-declined, #b71c1c)}.c2g-map-marker--status-declined .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-declined, #b71c1c)}.c2g-map-marker--status-completed .c2g-map-marker__circle{background:var(--c2g-tour-completed, #2e7d32)}.c2g-map-marker--status-completed .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-completed, #2e7d32)}.c2g-map-marker--status-current .c2g-map-marker__circle{background:var(--c2g-tour-current, #ef6c00)}.c2g-map-marker--status-current .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-current, #ef6c00)}.c2g-map-marker--status-upcoming .c2g-map-marker__circle{background:var(--c2g-tour-upcoming, #1565c0)}.c2g-map-marker--status-upcoming .c2g-map-marker__point:before{border-top-color:var(--c2g-tour-upcoming, #1565c0)}.c2g-map-marker--new-tour .c2g-map-marker__circle{background:var(--c2g-primary, #16213e)}.c2g-map-marker--new-tour .c2g-map-marker__point:before{border-top-color:var(--c2g-primary, #16213e)}.c2g-map-marker--new-tour .c2g-map-marker__circle{border:2px solid #fff}.c2g-map-marker--selected{z-index:10}.c2g-map-marker--selected .c2g-map-marker__pin{transform:scale(1.15)}\n"] }]
|
|
216
|
+
}], propDecorators: { activityType: [{ type: i0.Input, args: [{ isSignal: true, alias: "activityType", required: false }] }], tourStatus: [{ type: i0.Input, args: [{ isSignal: true, alias: "tourStatus", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Generated bundle index. Do not edit.
|
|
220
|
+
*/
|
|
221
|
+
|
|
222
|
+
export { MapComponent, MapMarkerComponent };
|
|
223
|
+
//# sourceMappingURL=camp2gether-c2g-ui-maps.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camp2gether-c2g-ui-maps.mjs","sources":["../../../projects/c2g-ui/maps/map/map.component.ts","../../../projects/c2g-ui/maps/map/map.component.html","../../../projects/c2g-ui/maps/map/map-marker.component.ts","../../../projects/c2g-ui/maps/map/map-marker.component.html","../../../projects/c2g-ui/maps/camp2gether-c2g-ui-maps.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewChild,\n ViewEncapsulation,\n effect,\n input,\n output\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport * as L from 'leaflet';\nimport { C2gMapMarkerData } from './map.types';\n\n@Component({\n selector: 'c2g-map',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './map.component.html',\n styleUrls: ['./map.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class MapComponent implements AfterViewInit, OnDestroy {\n @ViewChild('mapContainer', { static: true }) mapContainer!: ElementRef<HTMLDivElement>;\n\n readonly center = input<[number, number]>([47.6, 9.6]);\n readonly zoom = input<number>(7);\n readonly height = input<string>('400px');\n readonly width = input<string>('100%');\n readonly markers = input<C2gMapMarkerData[]>([]);\n readonly interactive = input<boolean>(true);\n\n readonly mapReady = output<L.Map>();\n readonly mapClick = output<L.LeafletMouseEvent>();\n readonly markerClick = output<{ marker: C2gMapMarkerData; event: L.LeafletMouseEvent }>();\n\n private map?: L.Map;\n private markerGroup?: L.LayerGroup;\n\n constructor() {\n effect(() => {\n const currentMarkers = this.markers();\n if (this.markerGroup) {\n this.updateMarkers(currentMarkers);\n }\n });\n\n effect(() => {\n const currentCenter = this.center();\n const currentZoom = this.zoom();\n if (this.map) {\n this.map.setView(L.latLng(currentCenter[0], currentCenter[1]), currentZoom, {\n animate: true,\n duration: 0.5\n });\n }\n });\n }\n\n ngAfterViewInit(): void {\n this.initializeMap();\n }\n\n ngOnDestroy(): void {\n // ViewEncapsulation.None is required for Leaflet to render tile layers and popups correctly\n // outside Angular's shadow DOM — clean up the instance explicitly to prevent memory leaks\n if (this.map) {\n this.map.remove();\n this.map = undefined;\n }\n this.markerGroup = undefined;\n }\n\n private initializeMap(): void {\n this.markerGroup = L.layerGroup();\n\n this.map = L.map(this.mapContainer.nativeElement, {\n center: L.latLng(this.center()[0], this.center()[1]),\n zoom: this.zoom(),\n zoomControl: this.interactive(),\n dragging: this.interactive(),\n touchZoom: this.interactive(),\n doubleClickZoom: this.interactive(),\n scrollWheelZoom: this.interactive(),\n boxZoom: this.interactive(),\n keyboard: this.interactive(),\n attributionControl: true\n });\n\n L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n attribution: '© OpenStreetMap contributors',\n maxZoom: 19\n }).addTo(this.map);\n\n this.markerGroup.addTo(this.map);\n\n if (this.interactive()) {\n this.map.on('click', (event: L.LeafletMouseEvent) => {\n this.mapClick.emit(event);\n });\n }\n\n this.updateMarkers(this.markers());\n this.mapReady.emit(this.map);\n }\n\n private updateMarkers(currentMarkers: C2gMapMarkerData[]): void {\n if (!this.markerGroup) {\n return;\n }\n\n this.markerGroup.clearLayers();\n\n currentMarkers.forEach((markerData) => {\n const icon = L.divIcon({\n className: 'c2g-map-div-icon',\n html: this.buildMarkerHtml(markerData),\n iconSize: this.markerSize(markerData.size),\n iconAnchor: this.markerAnchor(markerData.size)\n });\n\n const marker = L.marker([markerData.latitude, markerData.longitude], { icon });\n\n marker.on('click', (event: L.LeafletMouseEvent) => {\n this.markerClick.emit({ marker: markerData, event });\n });\n\n if (markerData.title) {\n marker.bindTooltip(markerData.title, {\n className: 'c2g-map-tooltip',\n direction: 'top',\n offset: [0, -16]\n });\n }\n\n this.markerGroup!.addLayer(marker);\n });\n }\n\n private buildMarkerHtml(marker: C2gMapMarkerData): string {\n const markerType = marker.tourStatus ? `status-${marker.tourStatus}` : (marker.activityType ?? 'adventure');\n const markerSize = marker.size ?? 'medium';\n const markerVariant = marker.variant ?? 'default';\n const selectedClass = marker.selected ? ' c2g-map-marker--selected' : '';\n const variantClass = markerVariant === 'new-tour' ? ' c2g-map-marker--new-tour' : '';\n\n return `\n <div class=\"c2g-map-marker c2g-map-marker--${markerSize} c2g-map-marker--${markerType}${selectedClass}${variantClass}\">\n <div class=\"c2g-map-marker__pin\">\n <div class=\"c2g-map-marker__circle\">\n <span class=\"c2g-map-marker__icon material-icons\">${this.markerIcon(marker)}</span>\n </div>\n <div class=\"c2g-map-marker__point\"></div>\n </div>\n </div>\n `;\n }\n\n private markerIcon(marker: C2gMapMarkerData): string {\n if (marker.variant === 'new-tour') {\n return 'add';\n }\n\n if (marker.tourStatus) {\n const statusIconMap: Record<NonNullable<C2gMapMarkerData['tourStatus']>, string> = {\n declined: 'close',\n completed: 'check',\n current: 'radio_button_checked',\n upcoming: 'radio_button_unchecked'\n };\n return statusIconMap[marker.tourStatus];\n }\n\n const activity = marker.activityType ?? 'adventure';\n const activityIconMap: Record<NonNullable<C2gMapMarkerData['activityType']>, string> = {\n water: 'waves',\n forest: 'park',\n mountain: 'terrain',\n desert: 'wb_sunny',\n urban: 'location_city',\n adventure: 'outdoor_grill',\n 'point-of-interest': 'star'\n };\n\n return activityIconMap[activity];\n }\n\n private markerSize(size: C2gMapMarkerData['size']): L.PointExpression {\n switch (size) {\n case 'small':\n return [24, 36];\n case 'large':\n return [40, 56];\n default:\n return [32, 46];\n }\n }\n\n private markerAnchor(size: C2gMapMarkerData['size']): L.PointExpression {\n switch (size) {\n case 'small':\n return [12, 36];\n case 'large':\n return [20, 56];\n default:\n return [16, 46];\n }\n }\n}\n","<div\n #mapContainer\n class=\"c2g-map\"\n [style.height]=\"height()\"\n [style.width]=\"width()\"\n></div>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { ActivityType, MarkerSize, TourStatus } from './map.types';\n\n@Component({\n selector: 'c2g-map-marker',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './map-marker.component.html',\n styleUrls: ['./map-marker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MapMarkerComponent {\n readonly activityType = input<ActivityType>('adventure');\n readonly tourStatus = input<TourStatus | null>(null);\n readonly selected = input<boolean>(false);\n readonly size = input<MarkerSize>('medium');\n readonly variant = input<'default' | 'new-tour'>('default');\n\n readonly markerType = computed(() => {\n const status = this.tourStatus();\n return status ? `status-${status}` : this.activityType();\n });\n\n readonly markerIcon = computed(() => {\n if (this.variant() === 'new-tour') {\n return 'add';\n }\n\n const status = this.tourStatus();\n if (status) {\n const statusIconMap: Record<TourStatus, string> = {\n declined: 'close',\n completed: 'check',\n current: 'radio_button_checked',\n upcoming: 'radio_button_unchecked'\n };\n return statusIconMap[status];\n }\n\n const activityIconMap: Record<ActivityType, string> = {\n water: 'waves',\n forest: 'park',\n mountain: 'terrain',\n desert: 'wb_sunny',\n urban: 'location_city',\n adventure: 'outdoor_grill',\n 'point-of-interest': 'star'\n };\n\n return activityIconMap[this.activityType()];\n });\n}\n","<div\n class=\"c2g-map-marker\"\n [class.c2g-map-marker--selected]=\"selected()\"\n [class.c2g-map-marker--small]=\"size() === 'small'\"\n [class.c2g-map-marker--medium]=\"size() === 'medium'\"\n [class.c2g-map-marker--large]=\"size() === 'large'\"\n [class.c2g-map-marker--new-tour]=\"variant() === 'new-tour'\"\n [class]=\"'c2g-map-marker--' + markerType()\"\n>\n <div class=\"c2g-map-marker__pin\">\n <div class=\"c2g-map-marker__circle\">\n <span class=\"c2g-map-marker__icon material-icons\">{{ markerIcon() }}</span>\n </div>\n <div class=\"c2g-map-marker__point\"></div>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|