@conciso/design-system-angular 2.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conciso-design-system-angular.mjs","sources":["../../../projects/design-system-angular/src/lib/area.ts","../../../projects/design-system-angular/src/lib/theme-switch/theme-mode.ts","../../../projects/design-system-angular/src/lib/button/button.component.ts","../../../projects/design-system-angular/src/lib/icons/cds-icons.ts","../../../projects/design-system-angular/src/lib/theme-switch/cycle-button.component.ts","../../../projects/design-system-angular/src/lib/topnav/topnav.component.ts","../../../projects/design-system-angular/src/lib/area-badge/area-badge.component.ts","../../../projects/design-system-angular/src/lib/status-badge/status-badge.component.ts","../../../projects/design-system-angular/src/lib/chip/chip.component.ts","../../../projects/design-system-angular/src/lib/pill/pill.component.ts","../../../projects/design-system-angular/src/lib/shared/cva-base.directive.ts","../../../projects/design-system-angular/src/lib/field/field-base.directive.ts","../../../projects/design-system-angular/src/lib/field/field-shell.component.ts","../../../projects/design-system-angular/src/lib/field/text-field.component.ts","../../../projects/design-system-angular/src/lib/field/textarea-field.component.ts","../../../projects/design-system-angular/src/lib/field/select-field.component.ts","../../../projects/design-system-angular/src/lib/checkbox/checkbox.component.ts","../../../projects/design-system-angular/src/lib/radio-group/radio-group.component.ts","../../../projects/design-system-angular/src/lib/shared/disposable-timeout.ts","../../../projects/design-system-angular/src/lib/select/select.component.ts","../../../projects/design-system-angular/src/lib/combobox/combobox.component.ts","../../../projects/design-system-angular/src/lib/slider/slider.component.ts","../../../projects/design-system-angular/src/lib/footer/footer.component.ts","../../../projects/design-system-angular/src/lib/footer/footer-main.component.ts","../../../projects/design-system-angular/src/lib/footer/footer-bottom.component.ts","../../../projects/design-system-angular/src/lib/area-tabs/area-tab.component.ts","../../../projects/design-system-angular/src/lib/area-tabs/area-tabs.component.ts","../../../projects/design-system-angular/src/lib/logo/logo.component.ts","../../../projects/design-system-angular/src/lib/shared/dots-keyboard.ts","../../../projects/design-system-angular/src/lib/logo-carousel/logo-carousel.component.ts","../../../projects/design-system-angular/src/lib/carousel/carousel.component.ts","../../../projects/design-system-angular/src/lib/theme-switch/segment-tri.component.ts","../../../projects/design-system-angular/src/lib/theme-switch/select.component.ts","../../../projects/design-system-angular/src/lib/icons.ts","../../../projects/design-system-angular/src/lib/card/card.component.ts","../../../projects/design-system-angular/src/lib/stat-card/stat-card.component.ts","../../../projects/design-system-angular/src/lib/stat-strip/stat-strip.component.ts","../../../projects/design-system-angular/src/lib/blockquote/blockquote.component.ts","../../../projects/design-system-angular/src/lib/code-block/code-block.component.ts","../../../projects/design-system-angular/src/lib/faq/faq.component.ts","../../../projects/design-system-angular/src/lib/scale/scale.component.ts","../../../projects/design-system-angular/src/lib/snackbar/snackbar.component.ts","../../../projects/design-system-angular/src/lib/testimonial/testimonial.component.ts","../../../projects/design-system-angular/src/lib/team-voice/team-voice.component.ts","../../../projects/design-system-angular/src/lib/download-cta/download-cta.component.ts","../../../projects/design-system-angular/src/lib/section/section.component.ts","../../../projects/design-system-angular/src/lib/hero-image/hero-image.component.ts","../../../projects/design-system-angular/src/lib/stoerer/stoerer.component.ts","../../../projects/design-system-angular/src/lib/stoerer/stoerer-set.component.ts","../../../projects/design-system-angular/src/lib/link-card/link-card.component.ts","../../../projects/design-system-angular/src/lib/featured-card/featured-card.component.ts","../../../projects/design-system-angular/src/lib/icon-card/icon-card.component.ts","../../../projects/design-system-angular/src/lib/feature/feature.component.ts","../../../projects/design-system-angular/src/lib/cta-band/cta-band.component.ts","../../../projects/design-system-angular/src/lib/tier/tier.component.ts","../../../projects/design-system-angular/src/lib/facts/facts.component.ts","../../../projects/design-system-angular/src/lib/table/table.component.ts","../../../projects/design-system-angular/src/lib/compare/compare.component.ts","../../../projects/design-system-angular/src/lib/avatar/avatar.component.ts","../../../projects/design-system-angular/src/lib/avatar/avatar-stack.component.ts","../../../projects/design-system-angular/src/lib/article-header/article-header.component.ts","../../../projects/design-system-angular/src/lib/article-toc/article-toc.component.ts","../../../projects/design-system-angular/src/lib/article-callout/article-callout.component.ts","../../../projects/design-system-angular/src/lib/article-figure/article-figure.component.ts","../../../projects/design-system-angular/src/lib/article-pullquote/article-pullquote.component.ts","../../../projects/design-system-angular/src/lib/author-card/author-card.component.ts","../../../projects/design-system-angular/src/lib/author-card/author-card-group.component.ts","../../../projects/design-system-angular/src/public-api.ts","../../../projects/design-system-angular/src/conciso-design-system-angular.ts"],"sourcesContent":["/**\n * Die vier Markenbereiche des Conciso Design Systems. Sie steuern in der CSS-Schicht\n * die Bereichsfarben (Tokens --co-* / --ki-* / --es-* / --wo-*) und werden je nach\n * Komponente entweder über eine Modifier-Klasse (z. B. .btn-co) oder ein\n * data-area-Attribut (z. B. .badge[data-area=\"co\"]) angewandt.\n */\nexport type CdsArea = 'co' | 'ki' | 'es' | 'wo';\n\nexport const CDS_AREAS: CdsArea[] = ['co', 'ki', 'es', 'wo'];\n\nexport const CDS_AREA_LABELS: Record<CdsArea, string> = {\n co: 'Corporate',\n ki: 'AI.Applied',\n es: 'Effektive Software',\n wo: 'Wirksame Organisationen',\n};\n","import { Injectable, signal } from '@angular/core';\n\n/** Drei Theme-Modi. „system“ folgt der OS-Einstellung (prefers-color-scheme). */\nexport type CdsThemeMode = 'light' | 'dark' | 'system';\n\n/** Reihenfolge (Cycle-Button, Segment, Dropdown). */\nexport const CDS_THEME_ORDER: CdsThemeMode[] = ['light', 'dark', 'system'];\n\n/** Icon-Name je Modus. Registriert über die zentrale Icon-Registry (lib/icons/cds-icons);\n * für diese drei Chrome-Icons hat das DS-Set kein eigenes Glyph → Heroicons. */\nexport const CDS_THEME_ICON: Record<CdsThemeMode, string> = {\n light: 'heroSun',\n dark: 'heroMoon',\n system: 'heroComputerDesktop',\n};\n\n/** Deutsches Label je Modus. */\nexport const CDS_THEME_LABEL: Record<CdsThemeMode, string> = {\n light: 'Hell',\n dark: 'Dunkel',\n system: 'System',\n};\n\n/** tri = alle drei, binär = ohne „System“. Basis des `showSystem`-Parameters. */\nexport function cdsThemeModes(showSystem: boolean): CdsThemeMode[] {\n return showSystem ? CDS_THEME_ORDER : CDS_THEME_ORDER.filter((m) => m !== 'system');\n}\n\n// ── Modul-globale Theme-Quelle ──────────────────────────────────────────────\n// EIN Zustand, geteilt von den Switcher-Komponenten (über ThemeModeService) UND\n// der Storybook-Glue in preview.ts (Toolbar-Sync). Angular-DI allein würde das\n// nicht leisten, da jede Story eine eigene App-Instanz (eigenen Root-Injector)\n// hat — die modul-globale Quelle ist über alle hinweg dieselbe.\nconst _mode = signal<CdsThemeMode>('light');\nlet _mql: MediaQueryList | null = null;\nconst _subs = new Set<(m: CdsThemeMode) => void>();\n\nconst onSystemChange = (e: MediaQueryListEvent): void => reflect(e.matches);\n\n/**\n * Aufgelösten Zustand ans <html> schreiben (light = kein Attribut).\n *\n * Der `document`-Guard ist für SSR/Prerender: Setzt ein Konsument den Modus dort\n * (etwa ein persistiertes Theme in einem Initializer), gibt es kein `document`.\n * Das Attribut wird dann übersprungen — der Modus bleibt im Signal erhalten und\n * greift, sobald im Browser das nächste `apply()` läuft. Die Lib fasst den\n * globalen Cascade sonst nicht an (siehe docs/adr/0001).\n */\nfunction reflect(dark: boolean): void {\n if (typeof document === 'undefined') return;\n const root = document.documentElement;\n if (dark) root.setAttribute('data-theme', 'dark');\n else root.removeAttribute('data-theme');\n}\n\n/** Aktuellen Modus anwenden; „system“ live an prefers-color-scheme koppeln. */\nfunction apply(): void {\n _mql?.removeEventListener('change', onSystemChange);\n _mql = null;\n // `matchMedia` existiert nur im Browser; ohne diesen Guard bricht SSR/Prerender\n // mit \"window is not defined\", sobald der Modus dort gesetzt wird.\n if (\n _mode() === 'system' &&\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function'\n ) {\n _mql = window.matchMedia('(prefers-color-scheme: dark)');\n _mql.addEventListener('change', onSystemChange);\n reflect(_mql.matches);\n } else {\n reflect(_mode() === 'dark');\n }\n}\n\nexport const themeStore = {\n /** Readonly-Signal des aktuellen Modus (Komponenten lesen hierüber). */\n mode: _mode.asReadonly(),\n\n /** Setzen + anwenden + Abonnenten benachrichtigen (z. B. Toolbar-Sync). */\n set(mode: CdsThemeMode): void {\n if (_mode() === mode) return;\n _mode.set(mode);\n apply();\n _subs.forEach((cb) => cb(mode));\n },\n\n /** Wie set(), aber OHNE Broadcast — für Toolbar→Store, um eine Emit-Rückkopplung\n * zu vermeiden (die Toolbar hat den Wert ja bereits). */\n setSilent(mode: CdsThemeMode): void {\n if (_mode() === mode) return;\n _mode.set(mode);\n apply();\n },\n\n /** Auf Modus-Änderungen hören (gibt eine Abmelde-Funktion zurück). */\n subscribe(cb: (m: CdsThemeMode) => void): () => void {\n _subs.add(cb);\n return () => _subs.delete(cb);\n },\n};\n\n/**\n * Dünner Angular-Service über der modul-globalen Quelle — damit die Komponenten\n * wie gewohnt `inject(ThemeModeService)` nutzen können. Setzt/entfernt letztlich\n * `data-theme=\"dark\"` am <html> (genau wie der DS es erwartet). Alle Switcher UND\n * der globale Theme-Toolbar-Schalter bleiben so synchron.\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeModeService {\n readonly mode = themeStore.mode;\n set(mode: CdsThemeMode): void {\n themeStore.set(mode);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * Stil-Varianten des Buttons. `filled-on-band` ist der invertierte Filled-Button\n * für farbige Bereichs-Bänder (Doku: „On-Band-Modifier“) — er wird hier als\n * eigener Variant-Wert geführt statt als abhängiges Flag, da das Invertieren nur\n * in Kombination mit `filled` je sinnvoll ist.\n */\nexport type CdsButtonVariant =\n 'filled' | 'tonal' | 'elevated' | 'outlined' | 'text' | 'filled-on-band';\nexport type CdsButtonSize = 'sm' | 'md' | 'lg';\n/**\n * Ton des Buttons. `err` markiert eine destruktive Aktion, die sich nicht rückgängig machen\n * lässt (Löschen, Verwerfen), und ersetzt dann die Bereichsfarbe. Kürzel wie bei `CdsSnackTone`.\n */\nexport type CdsButtonTone = 'def' | 'err';\n\n/**\n * Button — dünner Angular-Wrapper um die bestehende `.btn`-CSS-Familie.\n *\n * Erfindet KEINE Styles: setzt ausschließlich die im Design System vorhandenen\n * Klassen (.btn, .btn-filled/.btn-tonal/.btn-elevated/.btn-outlined/.btn-text,\n * .btn-sm/.btn-lg, .btn-co/.btn-ki/.btn-es/.btn-wo, .btn-full, .btn-on-band)\n * zusammen. Siehe css/components.css → „Buttons“. Der Klick wird als `clicked`\n * ausgegeben (für Nutzung außerhalb reiner Formular-Submits).\n */\n@Component({\n selector: 'cds-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // .btn-full setzt width:100% auf dem <button> — greift aber nur, wenn auch der\n // Host die Zeile füllt (Custom Elements sind display:inline und schrumpfen auf\n // Inhaltsbreite). Bei full=true daher den Host auf block stellen.\n host: { '[style.display]': \"full() ? 'block' : null\" },\n template: `\n <button\n [class]=\"classes()\"\n [disabled]=\"disabled()\"\n [attr.type]=\"type()\"\n (click)=\"clicked.emit($event)\"\n >\n {{ label() }}\n </button>\n `,\n})\nexport class ButtonComponent {\n /** Sichtbarer Text des Buttons. */\n readonly label = input('Button');\n /** Visuelle Variante → .btn-filled / .btn-tonal / .btn-elevated / .btn-outlined /\n * .btn-text; `filled-on-band` → .btn-filled + .btn-on-band (invertiert). */\n readonly variant = input<CdsButtonVariant>('filled');\n /** Markenbereich → .btn-co / .btn-ki / .btn-es / .btn-wo. Wirkungslos bei `tone=\"err\"`. */\n readonly area = input<CdsArea>('co');\n /** Ton → `err` setzt .btn-err (destruktive Aktion) statt der Bereichsklasse. */\n readonly tone = input<CdsButtonTone>('def');\n /** Größe → .btn-sm / (md = Default) / .btn-lg */\n readonly size = input<CdsButtonSize>('md');\n /** Volle Breite → .btn-full (Host wird block, damit 100% greifen). */\n readonly full = input(false);\n readonly disabled = input(false);\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n\n /** Klick auf den Button (feuert nicht, wenn `disabled`). */\n readonly clicked = output<MouseEvent>();\n\n /** @internal */\n protected readonly classes = computed(() => {\n // filled-on-band = invertierter Filled-Button; rendert .btn-filled + .btn-on-band.\n const onBand = this.variant() === 'filled-on-band';\n // Ton ersetzt den Bereich, statt ihn zu überlagern: so hängt das Ergebnis nicht an der\n // Reihenfolge der Regeln in components.css und dark-mode.css.\n const color = this.tone() === 'err' ? 'err' : this.area();\n const cls = ['btn', `btn-${onBand ? 'filled' : this.variant()}`, `btn-${color}`];\n if (this.size() === 'sm') cls.push('btn-sm');\n if (this.size() === 'lg') cls.push('btn-lg');\n if (this.full()) cls.push('btn-full');\n if (onBand) cls.push('btn-on-band');\n return cls.join(' ');\n });\n}\n","/**\n * Zentrale Icon-Registry des Storybooks — die EINZIGE Import-Fläche für\n * Komponenten-Icons. Zwei bewusst getrennte Quellen:\n *\n * 1. **DS-eigene Glyphen** (`ui*`): aus dem generierten DS-Icon-Export\n * (Paket `@conciso/design-system/icons`, Single Source of Truth). Nur dort, wo das\n * DS ein eigenes Glyph definiert, das KEIN bzw. ein abweichendes Heroicon-Pendant hat:\n * · `ui-caret-down` — kräftiger Caret (10er-viewBox), kein Heroicon-Pendant.\n * · `ui-check` — eigener Haken (12er-viewBox), weicht vom heroCheck (24er) ab.\n *\n * Importiert werden ausschließlich die BENANNTEN Exporte der beiden gebrauchten Glyphen\n * (`uiCaretDown`, `uiCheck`), nie das aggregierte `icons`-Objekt — ein Property-Zugriff\n * darauf (`icons['ui-caret-down']`) ist für Bundler nicht tree-shakable und zöge alle\n * alle DS-Icons in jedes Consumer-Bundle (siehe icons/README.md „Verwendung“).\n *\n * 2. **Heroicons**: für Glyphen, die im DS mit dem Heroicon glyph-identisch sind\n * (chevron-down, magnifying-glass — gleicher Pfad, das DS setzt nur einen dünneren\n * Stroke) sowie für die im DS-Set (noch) fehlenden Chrome-Icons (bars-3, x-mark,\n * moon, sun, computer-desktop).\n *\n * Bekommt ein Heroicon später ein DS-Pendant, wird es HIER umgestellt — die\n * Komponenten importieren ausschließlich aus dieser Datei, nie direkt aus\n * `@ng-icons/heroicons`.\n */\nimport { uiCaretDown as dsUiCaretDown, uiCheck as dsUiCheck } from '@conciso/design-system/icons';\n\n// Heroicons: glyph-identische (chevron/magnifying) + im DS fehlende Chrome-Icons.\nexport {\n heroBars3,\n heroChevronDown,\n heroComputerDesktop,\n heroMagnifyingGlass,\n heroMoon,\n heroSun,\n heroXMark,\n} from '@ng-icons/heroicons/outline';\n\n// DS-eigene Glyphen aus dem generierten, benannten Export (kein Duplizieren des SVG-Markups).\n// Als @ng-icons-Custom-Icons registrierbar: der Wert ist das komplette <svg>-Markup.\nexport const uiCaretDown = dsUiCaretDown.svg;\nexport const uiCheck = dsUiCheck.svg;\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroComputerDesktop, heroMoon, heroSun } from '../icons/cds-icons';\nimport { CDS_THEME_ICON, CDS_THEME_LABEL, cdsThemeModes, ThemeModeService } from './theme-mode';\n\n/**\n * Theme-Cycle-Button — ein einzelner Icon-Button (Stil `.ep-nav-icon-btn` aus der\n * Topnav), der bei Klick durch die Modi zyklt. Das Icon zeigt den aktuellen Modus.\n * Vorgesehener Einsatz: im Header. Icons über die zentrale Registry (lib/icons/cds-icons).\n *\n * `showSystem` schaltet zwischen tri (Hell→Dunkel→System) und binär (Hell→Dunkel).\n */\n@Component({\n selector: 'cds-theme-cycle',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgIcon],\n viewProviders: [provideIcons({ heroSun, heroMoon, heroComputerDesktop })],\n template: `\n <button\n class=\"ep-nav-icon-btn\"\n type=\"button\"\n [attr.aria-label]=\"'Farbthema: ' + label() + ' — klicken zum Wechseln'\"\n (click)=\"next()\"\n >\n <ng-icon [name]=\"icon()\" size=\"22px\" aria-hidden=\"true\" />\n </button>\n `,\n})\nexport class ThemeCycleComponent {\n /** true → Hell/Dunkel/System, false → nur Hell/Dunkel. */\n readonly showSystem = input(true);\n\n /** @internal */\n protected readonly svc = inject(ThemeModeService);\n /** @internal */\n protected readonly icon = computed(() => CDS_THEME_ICON[this.svc.mode()]);\n /** @internal */\n protected readonly label = computed(() => CDS_THEME_LABEL[this.svc.mode()]);\n\n /** @internal */\n protected next(): void {\n const order = cdsThemeModes(this.showSystem());\n const i = order.indexOf(this.svc.mode());\n this.svc.set(order[(i + 1) % order.length]);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroBars3, heroMagnifyingGlass, heroXMark, uiCaretDown } from '../icons/cds-icons';\nimport { ThemeCycleComponent } from '../theme-switch/cycle-button.component';\n\n/** Eindeutige IDs je Topnav-Instanz (Such-Feld ↔ sr-only-Label). */\nlet cdsTopnavUid = 0;\n\nexport interface CdsNavSubItem {\n label: string;\n href: string;\n}\n\nexport interface CdsNavItem {\n label: string;\n href?: string;\n sub?: CdsNavSubItem[];\n}\n\n/**\n * Topnav — Wrapper um `.ep-topnav` aus css/components.css → „Topnav“.\n *\n * Customer-Navigation: Logo, Top-Level-Links mit optionalem Klapp-Submenü\n * (.ep-nav-has-sub / .ep-nav-sub, aria-expanded), rechts gebündelte Aktionen\n * (Such-Popover .ep-nav-search + Theme-Cycle-Button) und ein CTA-Button.\n * Disclosure-Logik in Angular: nur ein Menü offen, Escape und Außenklick schließen.\n *\n * Der Theme-Umschalter ist fest der Cycle-Button (cds-theme-cycle); ob er auch\n * „System“ anbietet, steuert `showSystemTheme` (durchgereicht an dessen showSystem).\n */\n@Component({\n selector: 'cds-topnav',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ThemeCycleComponent, NgIcon],\n viewProviders: [provideIcons({ heroBars3, heroMagnifyingGlass, heroXMark, uiCaretDown })],\n // ng-icon rendert sein <svg> inline (vertical-align:baseline) → im 24px-Toggle säße der\n // 10px-Caret zu tief. Host auf Flex stellen zentriert das SVG unabhängig von der Baseline.\n // Wirkt nur hier (emulated); die portable .ep-nav-item-caret aus components.css bleibt unberührt.\n styles: `\n .ep-nav-item-caret {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n `,\n host: {\n '(document:click)': 'onDocumentClick($event)',\n '(document:keydown.escape)': 'onEscape()',\n },\n template: `\n <header class=\"ep-topnav\" [class.nav-open]=\"navOpen()\">\n <a class=\"ep-logo\" href=\"#\" (click)=\"$event.preventDefault()\">\n @if (logoSrc()) {\n <!-- Größe (24px) + Theme-Swap kommen aus der portablen css/components.css\n (.ep-logo img, .logo-themed-default/-light via [data-theme]). -->\n <img\n [class.logo-themed-default]=\"!!logoDarkSrc()\"\n [src]=\"logoSrc()\"\n [alt]=\"logoAlt() || logo()\"\n />\n @if (logoDarkSrc()) {\n <img class=\"logo-themed-light\" [src]=\"logoDarkSrc()\" [alt]=\"logoAlt() || logo()\" />\n }\n } @else {\n {{ logo() }}\n }\n </a>\n\n <nav class=\"ep-nav-links\" [id]=\"navId\" aria-label=\"Hauptnavigation\">\n @for (item of links(); track $index; let i = $index) {\n @if (item.sub?.length) {\n <div class=\"ep-nav-item ep-nav-has-sub\" [class.is-open]=\"openIndex() === i\">\n <!-- Label = eigener Link (führt z. B. auf eine Übersichtsseite), NICHT der Toggle.\n Der Caret ist ein separater Button daneben — so wie in der portablen Vorlage\n (docs/index.html). Ohne href bleibt es ein Platzhalter-Link (#, kein Sprung). -->\n <a\n class=\"ep-nav-btn\"\n [href]=\"item.href || '#'\"\n [attr.aria-current]=\"item.href && item.href === activeHref() ? 'page' : null\"\n (click)=\"item.href || $event.preventDefault()\"\n >\n {{ item.label }}\n </a>\n <button\n class=\"ep-nav-item-toggle\"\n type=\"button\"\n [attr.aria-label]=\"'Untermenü ' + item.label\"\n [attr.aria-expanded]=\"openIndex() === i\"\n [attr.aria-controls]=\"subId(i)\"\n (click)=\"toggleSub(i)\"\n >\n <ng-icon\n class=\"ep-nav-item-caret\"\n name=\"uiCaretDown\"\n size=\"10px\"\n aria-hidden=\"true\"\n />\n </button>\n <div class=\"ep-nav-sub\" [id]=\"subId(i)\">\n @for (s of item.sub; track $index) {\n <a\n class=\"ep-nav-sub-btn\"\n [href]=\"s.href\"\n [attr.aria-current]=\"s.href === activeHref() ? 'page' : null\"\n (click)=\"closeAll()\"\n >\n {{ s.label }}\n </a>\n }\n </div>\n </div>\n } @else {\n <a\n class=\"ep-nav-btn\"\n [href]=\"item.href || '#'\"\n [attr.aria-current]=\"item.href && item.href === activeHref() ? 'page' : null\"\n >\n {{ item.label }}\n </a>\n }\n }\n </nav>\n\n <div class=\"ep-nav-actions\">\n @if (showSearch()) {\n <div class=\"ep-nav-search\" [class.is-open]=\"searchOpen()\">\n <button\n class=\"ep-nav-icon-btn ep-nav-search-toggle\"\n type=\"button\"\n aria-label=\"Suche\"\n [attr.aria-expanded]=\"searchOpen()\"\n (click)=\"toggleSearch()\"\n >\n <ng-icon name=\"heroMagnifyingGlass\" size=\"22px\" aria-hidden=\"true\" />\n </button>\n <div class=\"ep-nav-search-pop\">\n <form class=\"ep-nav-search-form\" role=\"search\" (submit)=\"$event.preventDefault()\">\n <label class=\"sr-only\" [attr.for]=\"searchId\">Suchbegriff</label>\n <input\n class=\"ep-nav-search-input\"\n [id]=\"searchId\"\n type=\"search\"\n placeholder=\"Wonach suchst Du?\"\n autocomplete=\"off\"\n />\n <button class=\"btn btn-filled btn-sm btn-co\" type=\"submit\">Suchen</button>\n </form>\n </div>\n </div>\n }\n\n <cds-theme-cycle [showSystem]=\"showSystemTheme()\" />\n </div>\n\n <!-- Hamburger: nur unter dem Mobile-Breakpoint sichtbar (CSS .ep-nav-burger), schaltet\n .nav-open am Header → .ep-nav-links klappt auf. Icons via .icon-menu/.icon-close. -->\n <button\n class=\"ep-nav-burger\"\n type=\"button\"\n [attr.aria-label]=\"navOpen() ? 'Menü schließen' : 'Menü öffnen'\"\n [attr.aria-expanded]=\"navOpen()\"\n [attr.aria-controls]=\"navId\"\n (click)=\"toggleNav()\"\n >\n <ng-icon class=\"icon-menu\" name=\"heroBars3\" size=\"24px\" aria-hidden=\"true\" />\n <ng-icon class=\"icon-close\" name=\"heroXMark\" size=\"24px\" aria-hidden=\"true\" />\n </button>\n\n @if (showCta()) {\n <a class=\"btn btn-filled btn-sm btn-co\" href=\"#\" (click)=\"$event.preventDefault()\">{{\n ctaLabel()\n }}</a>\n }\n </header>\n `,\n})\nexport class TopnavComponent {\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly document = inject(DOCUMENT);\n\n private readonly uid = ++cdsTopnavUid;\n /** @internal */\n protected readonly searchId = `cds-topnav-search-${this.uid}`;\n /** @internal */\n protected readonly navId = `cds-topnav-nav-${this.uid}`;\n\n readonly logo = input('conciso.');\n /** Optionales Logo-Bild/-Icon (URL oder Data-URI). Gesetzt → statt des Text-Logos.\n * Doku: immer SVG (logo-conciso.svg), Default-Variante für helle Hintergründe. */\n readonly logoSrc = input<string>();\n /** Optionale helle Logo-Variante für den Dark Mode (Doku: logo-conciso-light.svg).\n * Gesetzt → Theme-Swap via .logo-themed-* (schaltet über [data-theme] um);\n * sonst wird logoSrc in beiden Themes gezeigt. */\n readonly logoDarkSrc = input<string>();\n /** Alt-Text des Logo-Bilds (Fallback: der Text aus `logo`). */\n readonly logoAlt = input('');\n readonly ctaLabel = input('Kontakt');\n /** Suche (Icon + Popover) rechts anzeigen. */\n readonly showSearch = input(true);\n /** Kontakt-/CTA-Button anzeigen. */\n readonly showCta = input(true);\n /** Bietet der Theme-Cycle-Button im Header auch „System“ an (tri) oder nur Hell/Dunkel? */\n readonly showSystemTheme = input(true);\n /** Href des aktuell aktiven Eintrags (Single Source of Truth). Nur der Eintrag\n * — Top-Level ODER Sub — mit passendem href erhält aria-current=\"page\". Dadurch\n * kann strukturell höchstens EINER aktiv sein (statt mehrerer current-Flags). */\n readonly activeHref = input<string>();\n readonly links = input<CdsNavItem[]>([\n {\n label: 'Leistungen',\n sub: [\n { label: 'Angewandte KI', href: '#ki' },\n { label: 'Effektive Software', href: '#software' },\n { label: 'Wirksame Organisationen', href: '#organisationen' },\n ],\n },\n {\n label: 'Unternehmen',\n sub: [\n { label: 'Über uns', href: '#ueber-uns' },\n { label: 'Team', href: '#team' },\n { label: 'Jobs', href: '#jobs' },\n ],\n },\n { label: 'Beiträge', href: '#beitraege' },\n { label: 'Kontakt', href: '#kontakt' },\n ]);\n\n /** @internal */\n protected readonly openIndex = signal(-1);\n /** @internal */\n protected readonly searchOpen = signal(false);\n /**\n * Mobile-Menü offen? Schaltet .nav-open am Header (→ .ep-nav-links sichtbar).\n *\n * @internal\n */\n protected readonly navOpen = signal(false);\n\n /**\n * Eindeutige ID des Submenüs zu Eintrag i (Toggle aria-controls ↔ .ep-nav-sub).\n *\n * @internal\n */\n protected subId(i: number): string {\n return `cds-topnav-sub-${this.uid}-${i}`;\n }\n\n /** @internal */\n protected toggleSub(i: number): void {\n this.openIndex.set(this.openIndex() === i ? -1 : i);\n this.searchOpen.set(false);\n }\n\n /** @internal */\n protected toggleSearch(): void {\n this.searchOpen.set(!this.searchOpen());\n this.openIndex.set(-1);\n }\n\n /** @internal */\n protected toggleNav(): void {\n this.navOpen.set(!this.navOpen());\n this.openIndex.set(-1);\n this.searchOpen.set(false);\n }\n\n /** @internal */\n protected closeAll(): void {\n this.openIndex.set(-1);\n this.searchOpen.set(false);\n this.navOpen.set(false);\n }\n\n /** @internal */\n protected onDocumentClick(event: MouseEvent): void {\n // Außenklick: NICHT den Fokus umsetzen — der Nutzer hat bewusst woanders\n // hingeklickt, dorthin den Fokus zu ziehen wäre ein eigener Fehler.\n if (!this.host.nativeElement.contains(event.target as Node)) this.closeAll();\n }\n\n /** @internal */\n protected onEscape(): void {\n this.closeWithFocusReturn();\n }\n\n /**\n * Wie `closeAll()`, gibt den Fokus aber an den öffnenden Toggle zurück (Submenü-\n * bzw. Such-Toggle) — NUR wenn der Fokus beim Schließen tatsächlich innerhalb des\n * schließenden Bereichs lag. `css/components.css:1148` setzt `.ep-nav-sub{display:\n * none}`, `:1189` dasselbe für `.ep-nav-search-pop`: das fokussierte Element\n * verschwindet damit aus dem Fokus-Baum und der Fokus fiele sonst ans `<body>`\n * (WCAG 2.4.3). Nur für den Escape-Pfad gedacht.\n *\n * @internal\n */\n private closeWithFocusReturn(): void {\n const active = this.document.activeElement;\n let toggle: HTMLElement | null = null;\n const i = this.openIndex();\n if (i >= 0) {\n const sub = this.host.nativeElement.querySelector(`#${this.subId(i)}`);\n if (sub && active && sub.contains(active)) {\n toggle = this.host.nativeElement.querySelector<HTMLElement>(\n `[aria-controls=\"${this.subId(i)}\"]`,\n );\n }\n } else if (this.searchOpen()) {\n const pop = this.host.nativeElement.querySelector('.ep-nav-search-pop');\n if (pop && active && pop.contains(active)) {\n toggle = this.host.nativeElement.querySelector<HTMLElement>('.ep-nav-search-toggle');\n }\n }\n if (!toggle && this.navOpen()) {\n const nav = this.host.nativeElement.querySelector(`#${this.navId}`);\n if (nav && active && nav.contains(active)) {\n toggle = this.host.nativeElement.querySelector<HTMLElement>('.ep-nav-burger');\n }\n }\n this.closeAll();\n toggle?.focus();\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * Bereichs-Badge — passive Bereichs-Kennzeichnung auf Basis von `.badge` +\n * `[data-area]` aus css/components.css.\n *\n * Ordnet ein Element einer der vier Brand Areas zu (50er-Grund, 800er-Text).\n * Nicht interaktiv. Für Zustände die Status-Badge, für einen redaktionellen\n * Anker im Lesefluss die Pill nutzen; für interaktive Filter den Chip.\n */\n@Component({\n selector: 'cds-area-badge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<span class=\"badge\" [attr.data-area]=\"area()\">{{ label() }}</span>`,\n})\nexport class AreaBadgeComponent {\n /** Sichtbarer Text der Badge. */\n readonly label = input.required<string>();\n /** Brand Area → data-area (bestimmt die Bereichsfarbe). */\n readonly area = input<CdsArea>('co');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** Status-Töne der Badge-Klassen (.badge-ok / .badge-warn / .badge-err / .badge-neu). */\nexport type CdsBadgeTone = 'ok' | 'warn' | 'err' | 'neu';\n\n/**\n * Status-Badge — passive Zustands-Kennzeichnung auf Basis von `.badge` +\n * `.badge-{ok|warn|err|neu}` aus css/components.css.\n *\n * Trägt einen Zustand über semantische Farben (OK, Warnung, Fehler, Neutral) —\n * z. B. „Live“, „Beta“, „Deprecated“, „Draft“. Nicht interaktiv. Für die\n * Zuordnung zu einer Brand Area die Bereichs-Badge, für einen redaktionellen\n * Anker im Lesefluss die Pill nutzen; für interaktive Filter den Chip.\n */\n@Component({\n selector: 'cds-status-badge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<span class=\"badge badge-{{ tone() }}\">{{ label() }}</span>`,\n})\nexport class StatusBadgeComponent {\n /** Sichtbarer Text der Badge. */\n readonly label = input.required<string>();\n /** Status-Ton → semantische Farbe. */\n readonly tone = input<CdsBadgeTone>('ok');\n}\n","import { ChangeDetectionStrategy, Component, input, model } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * Chip — Wrapper um `.chip` aus css/components.css → „Badges & Chips“.\n *\n * Interaktiver Filter-Chip auf Basis von `aria-pressed` (.chip[aria-pressed],\n * optional area-aware über [data-area]). Klick schaltet den Zustand um.\n *\n * Chips sind interaktive Elemente (Filter/Einstellungen), KEINE statischen Tags.\n * Für nicht-interaktive Bereichs-Labels die Badge- bzw. Pill-Komponente nutzen.\n */\n@Component({\n selector: 'cds-chip',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <button\n class=\"chip\"\n type=\"button\"\n [attr.data-area]=\"area() || null\"\n [attr.aria-pressed]=\"pressed()\"\n (click)=\"toggle()\"\n >\n {{ label() }}\n </button>\n `,\n})\nexport class ChipComponent {\n /** Sichtbarer Text des Chips. */\n readonly label = input.required<string>();\n /** Markenbereich → data-area (area-aware Outline). */\n readonly area = input<CdsArea>();\n /** Gedrückt/aktiv → aria-pressed. Two-Way (`[(pressed)]`) + pressedChange via model(). */\n readonly pressed = model(false);\n\n /** @internal */\n protected toggle(): void {\n this.pressed.set(!this.pressed());\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * Pill — Wrapper um `.pill` aus css/components.css → „Badges & Chips“ (Pill).\n *\n * Passive, redaktionelle Bereichs-Markierung, typografisch als Eyebrow (uppercase,\n * letter-spacing .09em, label-xs) — sitzt typischerweise oberhalb eines Titels und\n * ordnet einen Inhalt einer Brand Area zu. Abgrenzung zur Badge: die Pill ist der\n * thematische „Was für ein Inhalt ist das?“-Anker im Lesefluss; die Badge die\n * punktuelle Status-/Bereichs-Kennzeichnung neben Elementen. Nicht interaktiv.\n *\n * a11y: Der reine Bereichsname klingt im Screenreader-Fluss leicht wie eine\n * Überschrift — daher trägt die Pill ein explizites `aria-label` (Default\n * „Bereich <label>“, überschreibbar), genau wie in der Doku vorgegeben.\n */\n@Component({\n selector: 'cds-pill',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<span class=\"pill\" [attr.data-area]=\"area()\" [attr.aria-label]=\"computedAriaLabel()\">{{\n label()\n }}</span>`,\n})\nexport class PillComponent {\n /** Sichtbarer Bereichsname. */\n readonly label = input.required<string>();\n /** Brand Area → data-area (Farbton; ohne Angabe greift der Corporate-Default). */\n readonly area = input<CdsArea>('ki');\n /** aria-label überschreiben; Default „Bereich <label>“. */\n readonly ariaLabel = input<string>();\n\n /** @internal */\n protected readonly computedAriaLabel = computed(\n () => this.ariaLabel() ?? `Bereich ${this.label()}`,\n );\n}\n","import { Directive } from '@angular/core';\nimport type { ControlValueAccessor } from '@angular/forms';\n\n/**\n * ControlValueAccessor-Kitt OHNE Markup- oder Werttyp-Annahmen: hält NUR, was bei\n * `checkbox`, `radio-group`, `slider`, `scale` (und, über `FieldBase`, den drei\n * Field-Komponenten) wortgleich war — die `onChange`/`onTouched`-Callbacks plus\n * `writeValue`, `registerOnChange`, `registerOnTouched`, `setDisabledState`.\n *\n * Generisch über den Werttyp `T` (boolean bei Checkbox, string bei RadioGroup/\n * FieldBase, number bei Slider/Scale). Die defensive Normalisierung eines\n * eingehenden Formularwerts (Klemmen auf [min, max], `!!`-Cast, `NaN`-Abfang, …)\n * ist komponentenspezifisch und bleibt darum bewusst NICHT hier: `writeValue` ruft\n * den überschreibbaren Hook `normalizeValue` auf (Default: unverändert), die\n * konkrete Komponente überschreibt ihn UND `applyValue`/`applyDisabled` (schreiben\n * in ihr eigenes `model()`-Signal — die Basis kennt dessen Namen nicht).\n */\n@Directive()\nexport abstract class CvaBase<T> implements ControlValueAccessor {\n /** @internal */\n protected onChange: (value: T) => void = () => {\n /* von Angular-Forms via registerOnChange gesetzt */\n };\n /** @internal */\n protected onTouched: () => void = () => {\n /* von Angular-Forms via registerOnTouched gesetzt */\n };\n\n /**\n * Rohen Formularwert in einen gültigen Komponentenwert übersetzen (Klemmen,\n * Typ-Cast, `NaN`-Abfang, …). Default: unverändert durchreichen.\n *\n * @internal\n */\n protected normalizeValue(value: T): T {\n return value;\n }\n\n /** Normalisierten Wert ins eigene `model()`-Signal der Komponente schreiben. @internal */\n protected abstract applyValue(value: T): void;\n /** `disabled`-Zustand ins eigene `model()`-Signal der Komponente schreiben. @internal */\n protected abstract applyDisabled(disabled: boolean): void;\n\n /** @internal */\n writeValue(value: T): void {\n this.applyValue(this.normalizeValue(value));\n }\n /** @internal */\n registerOnChange(fn: (value: T) => void): void {\n this.onChange = fn;\n }\n /** @internal */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n /** @internal */\n setDisabledState(isDisabled: boolean): void {\n this.applyDisabled(isDisabled);\n }\n}\n","import { computed, Directive, input, model } from '@angular/core';\nimport { CvaBase } from '../shared/cva-base.directive';\n\n// Modulweiter Zähler → jede Instanz bekommt per Default eine EINDEUTIGE id.\n// Ein konstanter Default würde bei mehreren Feldern kollidieren (doppelte id →\n// kaputte label/for- und aria-describedby-Verknüpfung).\nlet uid = 0;\n\n/**\n * Gemeinsame Basis der Field-Komponenten (Textfeld / Textbereich / Auswahlfeld).\n *\n * Bündelt die geteilten Inputs, die a11y-Verdrahtung UND die Wert-Anbindung. Als\n * `ControlValueAccessor` binden sich die Felder direkt an Angular-Formulare\n * (`[(ngModel)]`, `formControlName`) — der übliche Weg für eine Komponenten-\n * bibliothek. Zusätzlich ist `value` ein `model()`, sodass ohne Formular auch\n * `[(value)]` und der `valueChange`-Output funktionieren. Den ControlValueAccessor-\n * Kitt (onChange/onTouched, writeValue, registerOnChange/-Touched, setDisabledState)\n * erbt sie von `CvaBase` (`lib/shared/cva-base.directive.ts`) — geteilt mit\n * Checkbox/RadioGroup/Slider/Scale, die dieselbe Boilerplate wortgleich hatten.\n *\n * Angular vererbt Inputs/Logik über eine mit `@Directive()` dekorierte abstrakte\n * Basisklasse — deshalb steht die LOGIK hier. Das gemeinsame MARKUP (Label/Helper/\n * Fehler) wird NICHT vererbt (Angular vererbt keine Templates); dafür teilen sich\n * die Komponenten die FieldShellComponent per Komposition. Den `NG_VALUE_ACCESSOR`-\n * Provider setzt jede konkrete Komponente selbst (forwardRef auf ihre Klasse).\n */\n@Directive()\nexport abstract class FieldBase extends CvaBase<string> {\n /** Sichtbares Label. */\n readonly label = input('');\n /** Optionaler Hilfetext unter dem Feld. */\n readonly helper = input('');\n /** Gesetzt = Fehlerzustand (.has-error + .error-msg). */\n readonly error = input('');\n /** Pflichtfeld → .req-Asterisk + aria-required. */\n readonly required = input(false);\n /** id für die label/for- und aria-describedby-Verknüpfung. Default eindeutig. */\n readonly fieldId = input(`cds-field-${++uid}`);\n\n /** Feldwert — Two-Way (`[(value)]`) UND Angular-Forms (ngModel/formControlName). */\n readonly value = model('');\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n\n /** @internal */\n protected override normalizeValue(value: string): string {\n return value ?? '';\n }\n /** @internal */\n protected override applyValue(value: string): void {\n this.value.set(value);\n }\n /** @internal */\n protected override applyDisabled(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n /**\n * Vom Template bei Eingabe/Änderung des nativen Controls aufgerufen.\n *\n * @internal\n */\n protected handleInput(event: Event): void {\n const value = (event.target as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement)\n .value;\n this.value.set(value);\n this.onChange(value);\n }\n /**\n * Vom Template bei Verlassen des Felds → markiert das Control als „touched“.\n *\n * @internal\n */\n protected handleBlur(): void {\n this.onTouched();\n }\n\n /** @internal */\n protected readonly errorId = computed(() => `${this.fieldId()}-error`);\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Präsentations-Hülle für alle Field-Komponenten (intern, nicht als eigene Story).\n *\n * Rendert die gemeinsame `.field`-Struktur aus css/components.css — Label mit\n * optionalem Pflicht-Asterisk, Hilfetext und Fehlermeldung — und projiziert das\n * eigentliche Steuerelement via `<ng-content>`. So teilen sich Textfeld,\n * Textbereich und Auswahlfeld dieses Markup per Komposition, ohne Duplikat.\n */\n@Component({\n selector: 'cds-field-shell',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"field\" [class.has-error]=\"!!error()\">\n <label [attr.for]=\"fieldId()\">\n {{ label() }}\n @if (required()) {\n <span class=\"req\" aria-hidden=\"true\">*</span>\n }\n </label>\n\n <ng-content></ng-content>\n\n @if (helper() && !error()) {\n <span class=\"helper\">{{ helper() }}</span>\n }\n @if (error()) {\n <span class=\"error-msg\" [id]=\"errorId()\" role=\"alert\">\n <!-- Exclamation-Circle-Icon wie docs/index.html. Noch inline: das Icon\n liegt nicht im Register (icons/icons.js); die externe Icon-Lib folgt\n auf feat/theme-switch, dann hier ersetzen. -->\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n aria-hidden=\"true\"\n style=\"flex-shrink:0\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z\"\n />\n </svg>\n {{ error() }}\n </span>\n }\n </div>\n `,\n})\nexport class FieldShellComponent {\n readonly label = input('');\n readonly required = input(false);\n readonly helper = input('');\n readonly error = input('');\n /** id des projizierten Steuerelements (für label/for). */\n readonly fieldId = input('');\n /** id der Fehlermeldung (für aria-describedby am Steuerelement). */\n readonly errorId = input('');\n}\n","import { ChangeDetectionStrategy, Component, forwardRef, input } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FieldBase } from './field-base.directive';\nimport { FieldShellComponent } from './field-shell.component';\n\n/**\n * Textfeld — einzeiliges `<input>` im `.field`-Gerüst (E-Mail, Text, Tel, … über\n * `type`). Pflichtfelder tragen aria-required; im Fehlerzustand wird die Meldung\n * über aria-describedby/aria-invalid verknüpft — wie docs/index.html.\n *\n * Als `ControlValueAccessor` (siehe FieldBase) direkt an Angular-Formulare\n * anbindbar (`[(ngModel)]`, `formControlName`) bzw. ohne Formular per `[(value)]`.\n */\n@Component({\n selector: 'cds-text-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldShellComponent],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TextFieldComponent), multi: true },\n ],\n template: `\n <cds-field-shell\n [label]=\"label()\"\n [required]=\"required()\"\n [helper]=\"helper()\"\n [error]=\"error()\"\n [fieldId]=\"fieldId()\"\n [errorId]=\"errorId()\"\n >\n <!-- required nativ zusätzlich zu aria-required: natives HTML5-required für die\n Formular-Validierung im Browser, aria-required für den Screenreader-Zustand. -->\n <input\n [id]=\"fieldId()\"\n [type]=\"type()\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.required]=\"required() ? '' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"error() ? errorId() : null\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n />\n </cds-field-shell>\n `,\n})\nexport class TextFieldComponent extends FieldBase {\n /** input[type] (text, email, tel, …). */\n readonly type = input('text');\n readonly placeholder = input('');\n}\n","import { ChangeDetectionStrategy, Component, forwardRef, input } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FieldBase } from './field-base.directive';\nimport { FieldShellComponent } from './field-shell.component';\n\n/**\n * Textbereich — mehrzeiliges `<textarea>` im `.field`-Gerüst. Gleiche a11y-\n * Verdrahtung wie das Textfeld (aria-required/-invalid/-describedby).\n *\n * Als `ControlValueAccessor` (siehe FieldBase) direkt an Angular-Formulare\n * anbindbar (`[(ngModel)]`, `formControlName`) bzw. ohne Formular per `[(value)]`.\n */\n@Component({\n selector: 'cds-textarea-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldShellComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TextareaFieldComponent),\n multi: true,\n },\n ],\n template: `\n <cds-field-shell\n [label]=\"label()\"\n [required]=\"required()\"\n [helper]=\"helper()\"\n [error]=\"error()\"\n [fieldId]=\"fieldId()\"\n [errorId]=\"errorId()\"\n >\n <!-- required nativ zusätzlich zu aria-required: natives HTML5-required für die\n Formular-Validierung im Browser, aria-required für den Screenreader-Zustand. -->\n <textarea\n [id]=\"fieldId()\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.required]=\"required() ? '' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"error() ? errorId() : null\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n ></textarea>\n </cds-field-shell>\n `,\n})\nexport class TextareaFieldComponent extends FieldBase {\n readonly placeholder = input('');\n}\n","import { ChangeDetectionStrategy, Component, forwardRef, input } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FieldBase } from './field-base.directive';\nimport { FieldShellComponent } from './field-shell.component';\n\n/**\n * Auswahlfeld — `<select>` im `.field`-Gerüst. Die Optionen kommen über `options`;\n * a11y-Verdrahtung wie beim Textfeld (aria-required/-invalid/-describedby).\n *\n * Als `ControlValueAccessor` (siehe FieldBase) direkt an Angular-Formulare\n * anbindbar (`[(ngModel)]`, `formControlName`) bzw. ohne Formular per `[(value)]`.\n */\n@Component({\n selector: 'cds-select-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldShellComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectFieldComponent),\n multi: true,\n },\n ],\n template: `\n <cds-field-shell\n [label]=\"label()\"\n [required]=\"required()\"\n [helper]=\"helper()\"\n [error]=\"error()\"\n [fieldId]=\"fieldId()\"\n [errorId]=\"errorId()\"\n >\n <!-- required nativ zusätzlich zu aria-required: natives HTML5-required für die\n Formular-Validierung im Browser, aria-required für den Screenreader-Zustand. -->\n <select\n [id]=\"fieldId()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.required]=\"required() ? '' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"error() ? errorId() : null\"\n (change)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n >\n @for (opt of options(); track opt) {\n <option>{{ opt }}</option>\n }\n </select>\n </cds-field-shell>\n `,\n})\nexport class SelectFieldComponent extends FieldBase {\n /** Auswahloptionen (erste dient üblicherweise als Platzhalter, z. B. „Bitte wählen“). */\n readonly options = input<string[]>([]);\n}\n","import { ChangeDetectionStrategy, Component, forwardRef, input, model } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { CdsArea } from '../area';\nimport { CvaBase } from '../shared/cva-base.directive';\n\n/**\n * Checkbox — Einwilligungs-/Consent-Feld nach docs/index.html („Forms“).\n *\n * Bewusst KEIN nachgebautes Kästchen: ein natives `<input type=\"checkbox\">` mit\n * `accent-color` in der Bereichsfarbe (genau wie die Doku), umschlossen von einem\n * `<label>` mit dem Einwilligungstext und optional verlinktem Datenschutzhinweis.\n * Dokumentierte Verwendung: Newsletter-/DSGVO-Einwilligung, i. d. R. `required`.\n *\n * Als `ControlValueAccessor` direkt an Angular-Formulare anbindbar (`[(ngModel)]`,\n * `formControlName`); ohne Formular geht `[(checked)]` (checkedChange via model()).\n */\n@Component({\n selector: 'cds-checkbox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CheckboxComponent), multi: true },\n ],\n template: `\n <label style=\"display:flex;align-items:flex-start;gap:var(--s3);cursor:pointer\">\n <input\n type=\"checkbox\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [attr.required]=\"required() ? '' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [style.accent-color]=\"'var(--' + area() + '-500)'\"\n style=\"width:18px;height:18px;margin-top:2px;flex-shrink:0;cursor:pointer\"\n (change)=\"onCheckboxChange($event)\"\n (blur)=\"markTouched()\"\n />\n <!-- prettier-ignore -->\n <span style=\"font:var(--ty-body-md);color:var(--tx-secondary)\"\n >{{ label() }}@if (linkLabel()) { <a class=\"body-link\" [href]=\"linkHref()\">{{ linkLabel() }}</a>}@if (required()) { <span class=\"req\" aria-hidden=\"true\">*</span>}</span\n >\n </label>\n `,\n})\nexport class CheckboxComponent extends CvaBase<boolean> {\n /** Einwilligungstext neben der Checkbox. */\n readonly label = input('Ich bin einverstanden.');\n /** Optionaler verlinkter Hinweis am Ende des Labels (z. B. „Datenschutzhinweise“). */\n readonly linkLabel = input('');\n /** Ziel des verlinkten Hinweises. */\n readonly linkHref = input('#');\n /** Pflicht-Einwilligung → required + aria-required + .req-Sternchen am Label-Ende. */\n readonly required = input(false);\n /** Gesetzt/aktiv → checked. Two-Way (`[(checked)]`) UND Angular-Forms. */\n readonly checked = model(false);\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n /** Brand Area → accent-color der Checkbox. */\n readonly area = input<CdsArea>('co');\n\n /** @internal */\n protected override normalizeValue(value: boolean): boolean {\n return !!value;\n }\n /** @internal */\n protected override applyValue(value: boolean): void {\n this.checked.set(value);\n }\n /** @internal */\n protected override applyDisabled(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n /** @internal */\n protected onCheckboxChange(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n this.checked.set(checked);\n this.onChange(checked);\n }\n /** @internal */\n protected markTouched(): void {\n this.onTouched();\n }\n}\n","import { ChangeDetectionStrategy, Component, forwardRef, input, model } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { CdsArea } from '../area';\nimport { CvaBase } from '../shared/cva-base.directive';\n\n// Modulweiter Zähler → jede Gruppe bekommt per Default einen EINDEUTIGEN name.\n// Gleiche names über Gruppen hinweg würden deren Radios fälschlich koppeln.\nlet uid = 0;\n\n/**\n * Radio-Gruppe (Optionsfelder) nach docs/index.html („Forms“).\n *\n * Für 2–6 sich gegenseitig ausschließende Optionen (mehr → Select). Bewusst KEIN\n * nachgebauter Kreis: native `<input type=\"radio\">` mit `accent-color` in der\n * Bereichsfarbe, gruppiert in `<fieldset>`/`<legend>` (Gruppen-Label wie ein\n * Feld-Label), alle Optionen teilen denselben `name`.\n *\n * Als `ControlValueAccessor` direkt an Angular-Formulare anbindbar (`[(ngModel)]`,\n * `formControlName`); ohne Formular geht `[(value)]` (valueChange via model()).\n */\n@Component({\n selector: 'cds-radio-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroupComponent), multi: true },\n ],\n template: `\n <fieldset style=\"border:0;padding:0;margin:0;min-inline-size:0\">\n <!-- prettier-ignore -->\n <legend\n style=\"font:var(--ty-label-sm);text-transform:uppercase;letter-spacing:.06em;color:var(--tx-secondary);margin-bottom:var(--s2);padding:0\"\n >{{ legend() }}@if (required()) { <span class=\"req\" aria-hidden=\"true\">*</span>}</legend\n >\n <div style=\"display:flex;flex-direction:column;gap:var(--s3)\">\n @for (opt of options(); track opt) {\n <label\n style=\"display:flex;align-items:center;gap:var(--s3);cursor:pointer;font:var(--ty-body-md);color:var(--tx-primary)\"\n >\n <input\n type=\"radio\"\n [name]=\"name()\"\n [value]=\"opt\"\n [checked]=\"opt === value()\"\n [disabled]=\"disabled()\"\n [attr.required]=\"required() ? '' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [style.accent-color]=\"'var(--' + area() + '-500)'\"\n style=\"width:18px;height:18px;flex-shrink:0;cursor:pointer\"\n (change)=\"onRadioChange(opt)\"\n (blur)=\"markTouched()\"\n />\n <span>{{ opt }}</span>\n </label>\n }\n </div>\n </fieldset>\n `,\n})\nexport class RadioGroupComponent extends CvaBase<string> {\n /** Gruppen-Label (die Frage) → <legend>. */\n readonly legend = input('Optionen');\n /** Auswahloptionen (Label = Wert). */\n readonly options = input<string[]>([]);\n /** Aktuell gewählter Wert. Two-Way (`[(value)]`) UND Angular-Forms. */\n readonly value = model('');\n /** Gemeinsamer name aller Radios der Gruppe. Default eindeutig. */\n readonly name = input(`cds-radio-${++uid}`);\n /** Pflichtauswahl → required + .req-Asterisk. */\n readonly required = input(false);\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n /** Brand Area → accent-color der Radios. */\n readonly area = input<CdsArea>('co');\n\n /** @internal */\n protected override normalizeValue(value: string): string {\n return value ?? '';\n }\n /** @internal */\n protected override applyValue(value: string): void {\n this.value.set(value);\n }\n /** @internal */\n protected override applyDisabled(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n /** @internal */\n protected onRadioChange(opt: string): void {\n this.value.set(opt);\n this.onChange(opt);\n this.onTouched();\n }\n /** @internal */\n protected markTouched(): void {\n this.onTouched();\n }\n}\n","import { DestroyRef, inject } from '@angular/core';\n\n/**\n * `setTimeout`-Wrapper, der beim Zerstören der aufrufenden Komponente/Direktive\n * automatisch aufräumt (`DestroyRef.onDestroy`) — muss darum im Injektionskontext\n * erzeugt werden (Feld-Initializer/Konstruktor), wie `inject()` selbst.\n *\n * Deckt zwei Vorkommen ab, die `select.component.ts` und `combobox.component.ts`\n * (WP5 §5.5) wortgleich hatten: „scroll aktives Element in Sicht“ (Fire-and-forget,\n * ein Aufruf reicht) UND „Type-ahead-Puffer nach 500 ms leeren“ (Debounce — ein\n * erneuter `schedule()`-Aufruf ersetzt den noch laufenden Timer, stapelt also\n * nicht). Beides ist derselbe Bedarf: „terminiert, aber nicht über das Ende der\n * Komponente hinaus“.\n */\nexport function disposableTimeout(): {\n /** Vorherigen Timer verwerfen und `fn` neu terminieren. */\n schedule(fn: () => void, ms?: number): void;\n /** Laufenden Timer verwerfen, ohne neu zu terminieren. */\n clear(): void;\n} {\n const destroyRef = inject(DestroyRef);\n let handle: ReturnType<typeof setTimeout> | undefined;\n const clear = (): void => clearTimeout(handle);\n destroyRef.onDestroy(clear);\n return {\n schedule(fn: () => void, ms?: number): void {\n clear();\n handle = setTimeout(fn, ms);\n },\n clear,\n };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n forwardRef,\n inject,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroChevronDown, uiCheck } from '../icons/cds-icons';\nimport type { CdsArea } from '../area';\nimport { disposableTimeout } from '../shared/disposable-timeout';\n\nexport interface CdsSelectOption {\n value: string;\n label: string;\n}\n\nlet uid = 0;\n\n/**\n * Custom Select (cds-select) — gestylte Einzelauswahl über `.ep-select` aus\n * css/components.css → Doku „Dropdowns“.\n *\n * Trigger-Button + Listbox-Popup mit Häkchen und Bereichs-Akzent (data-area).\n * Anders als die dünnen Wrapper trägt diese Komponente das Verhalten selbst — das\n * ist ihr Zweck (das native <select> reicht dafür nicht): volle Tastatur (↑↓,\n * Pos1/Ende, Type-ahead, Enter wählt, Esc schließt) und die dokumentierte a11y\n * (role=listbox/option, aria-haspopup, aria-expanded, aria-activedescendant,\n * aria-selected). Für kurze Listen in Formularen bleibt das native cds-select-field\n * der Standard; dies hier ist für bereichs-akzentuierte Auswahl.\n *\n * Als `ControlValueAccessor` direkt an Angular-Formulare anbindbar (`[(ngModel)]`,\n * `formControlName`); ohne Formular geht `[(value)]` (valueChange via model()).\n */\n@Component({\n selector: 'cds-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgIcon],\n viewProviders: [provideIcons({ heroChevronDown, uiCheck })],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SelectComponent), multi: true },\n ],\n host: {\n '(focusout)': 'onFocusOut($event)',\n '(document:pointerdown)': 'onDocPointerDown($event)',\n },\n template: `\n <div\n class=\"ep-select\"\n [class.is-open]=\"open()\"\n [class.is-disabled]=\"disabled()\"\n [attr.data-area]=\"area() || null\"\n >\n <span class=\"ep-select-label\" [id]=\"ids.label\">{{ label() }}</span>\n <button\n #trigger\n type=\"button\"\n class=\"ep-select-trigger\"\n [class.is-placeholder]=\"!selectedOption()\"\n [disabled]=\"disabled()\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"ids.menu\"\n [attr.aria-labelledby]=\"ids.label + ' ' + ids.value\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"ep-select-value\" [id]=\"ids.value\" [attr.data-placeholder]=\"placeholder()\">{{\n selectedOption()?.label ?? placeholder()\n }}</span>\n <ng-icon class=\"ep-select-caret\" name=\"heroChevronDown\" size=\"24px\" aria-hidden=\"true\" />\n </button>\n <ul\n #menu\n class=\"ep-select-menu\"\n role=\"listbox\"\n [id]=\"ids.menu\"\n [attr.aria-labelledby]=\"ids.label\"\n tabindex=\"-1\"\n [attr.aria-activedescendant]=\"\n open() && activeIndex() >= 0 ? ids.option(activeIndex()) : null\n \"\n (keydown)=\"onMenuKeydown($event)\"\n >\n @for (opt of options(); track opt.value; let i = $index) {\n <!-- Listbox-Muster: Optionen sind bewusst NICHT einzeln fokussierbar; die\n Tastatur läuft über den Trigger (aria-activedescendant). Klick ist reine\n Maus-Bequemlichkeit — daher die a11y-Regeln hier gezielt deaktiviert. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <li\n class=\"ep-select-option\"\n role=\"option\"\n [id]=\"ids.option(i)\"\n [attr.data-value]=\"opt.value\"\n [class.is-active]=\"i === activeIndex()\"\n [attr.aria-selected]=\"opt.value === value()\"\n (click)=\"select(i)\"\n (mouseenter)=\"activeIndex.set(i)\"\n >\n <ng-icon class=\"ep-select-check\" name=\"uiCheck\" size=\"20px\" aria-hidden=\"true\" />\n {{ opt.label }}\n </li>\n }\n </ul>\n @if (name()) {\n <input type=\"hidden\" [name]=\"name()\" [value]=\"value() ?? ''\" />\n }\n </div>\n `,\n})\nexport class SelectComponent implements ControlValueAccessor {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n private readonly menu = viewChild<ElementRef<HTMLUListElement>>('menu');\n\n readonly label = input('Bereich');\n readonly options = input<CdsSelectOption[]>([]);\n /** Aktuell gewählter Wert (value der Option). Two-Way (`[(value)]`) UND Angular-Forms. */\n readonly value = model<string | undefined>(undefined);\n readonly area = input<CdsArea>();\n readonly placeholder = input('Bitte wählen…');\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n /** Optionaler Feldname → verstecktes Input für den Formular-Submit. */\n readonly name = input<string>();\n\n /** @internal */\n protected readonly open = signal(false);\n /** @internal */\n protected readonly activeIndex = signal(-1);\n\n private onChange: (value: string) => void = () => {\n /* von Angular-Forms via registerOnChange gesetzt */\n };\n private onTouched: () => void = () => {\n /* von Angular-Forms via registerOnTouched gesetzt */\n };\n\n /** @internal */\n writeValue(value: string | null): void {\n this.value.set(value ?? undefined);\n }\n /** @internal */\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n /** @internal */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n /** @internal */\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n private readonly instance = ++uid;\n /** @internal */\n protected readonly ids = {\n label: `cds-select-${this.instance}-label`,\n value: `cds-select-${this.instance}-value`,\n menu: `cds-select-${this.instance}-menu`,\n option: (i: number) => `cds-select-${this.instance}-opt-${i}`,\n };\n\n private typeBuffer = '';\n // Timer über DestroyRef aufgeräumt (WP5 §5.5) — dieselbe `disposableTimeout()`\n // deckt sowohl Fire-and-forget (Fokus/Scroll) als auch Debounce (Type-ahead) ab.\n private readonly menuFocusTimer = disposableTimeout();\n private readonly scrollTimer = disposableTimeout();\n private readonly typeaheadTimer = disposableTimeout();\n\n /** @internal */\n protected selectedOption(): CdsSelectOption | undefined {\n return this.options().find((o) => o.value === this.value());\n }\n\n /** @internal */\n protected toggle(): void {\n if (this.open()) this.close();\n else this.openMenu();\n }\n\n private openMenu(): void {\n if (this.disabled()) return;\n const sel = this.options().findIndex((o) => o.value === this.value());\n this.activeIndex.set(sel >= 0 ? sel : 0);\n this.open.set(true);\n // Fokus in die Listbox (nach Render, wenn sie sichtbar ist) — APG-Listbox-\n // Muster: aria-activedescendant liegt dort, nicht auf dem Button.\n this.menuFocusTimer.schedule(() => this.menu()?.nativeElement.focus());\n }\n\n /** @internal */\n protected close(focusTrigger = true): void {\n this.open.set(false);\n this.activeIndex.set(-1);\n if (focusTrigger) this.trigger()?.nativeElement.focus();\n }\n\n /** @internal */\n protected select(i: number): void {\n const opt = this.options()[i];\n if (!opt) return;\n this.value.set(opt.value);\n this.onChange(opt.value);\n this.onTouched();\n this.close();\n }\n\n /** @internal */\n protected markTouched(): void {\n this.onTouched();\n }\n\n /**\n * `onTouched` erst, wenn der Fokus die GESAMTE Komponente verlässt — nicht schon beim\n * Öffnen, wenn er vom Trigger in die Listbox wandert (beides liegt im Host). Sonst\n * wäre das Control „touched“, bevor überhaupt ausgewählt wurde.\n *\n * @internal\n */\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (!next || !this.host.nativeElement.contains(next)) this.markTouched();\n }\n\n /**\n * Tastatur am Trigger-Button: nur Öffnen (im offenen Zustand hat die Listbox Fokus).\n *\n * @internal\n */\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.open()) return;\n const key = event.key;\n if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter' || key === ' ') {\n event.preventDefault();\n this.openMenu();\n }\n }\n\n /**\n * Tastatur in der offenen Listbox: Navigation, Auswahl, Schließen, Type-ahead.\n *\n * @internal\n */\n protected onMenuKeydown(event: KeyboardEvent): void {\n const key = event.key;\n switch (key) {\n case 'ArrowDown':\n event.preventDefault();\n this.move(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.move(-1);\n break;\n case 'Home':\n event.preventDefault();\n this.setActive(0);\n break;\n case 'End':\n event.preventDefault();\n this.setActive(this.options().length - 1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (this.activeIndex() >= 0) this.select(this.activeIndex());\n break;\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n case 'Tab':\n this.close(false);\n break;\n default:\n if (key.length === 1 && /\\S/.test(key)) this.typeahead(key);\n }\n }\n\n private move(delta: number): void {\n const n = this.options().length;\n if (!n) return;\n const next = Math.min(n - 1, Math.max(0, this.activeIndex() + delta));\n this.setActive(next);\n }\n\n private setActive(i: number): void {\n this.activeIndex.set(i);\n // Aktiven Eintrag in Sicht scrollen (lange Listen).\n this.scrollTimer.schedule(() => {\n this.host.nativeElement\n .querySelector(`#${CSS.escape(this.ids.option(i))}`)\n ?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n private typeahead(char: string): void {\n this.typeBuffer += char.toLowerCase();\n this.typeaheadTimer.schedule(() => (this.typeBuffer = ''), 500);\n const match = this.options().findIndex((o) =>\n o.label.toLowerCase().startsWith(this.typeBuffer),\n );\n if (match >= 0) this.setActive(match);\n }\n\n /** @internal */\n protected onDocPointerDown(event: PointerEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) this.close(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n linkedSignal,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroChevronDown, heroXMark } from '../icons/cds-icons';\nimport type { CdsArea } from '../area';\nimport type { CdsSelectOption } from '../select/select.component';\nimport { disposableTimeout } from '../shared/disposable-timeout';\n\nlet uid = 0;\n\n/**\n * Combobox (cds-combobox) — Tipp-Filter über `.ep-combobox` aus css/components.css\n * → Doku „Dropdowns“. Wie der Custom Select, aber mit Substring-Filter im Feld (für\n * lange Listen). Optional Multi-Select mit Chips (`multi`).\n *\n * Verhalten/a11y selbst getragen: Input mit role=combobox (dort ist\n * aria-activedescendant erlaubt), aria-expanded/-controls/-autocomplete; Listbox mit\n * role=listbox/option; ↓ öffnet/navigiert, Enter wählt, Esc schließt, Rücktaste bei\n * leerem Feld entfernt im Multi-Modus den letzten Chip. Beim Schließen ohne Auswahl\n * fällt die Einzelauswahl auf das gewählte Label zurück (kein loser Filtertext).\n *\n * Als `ControlValueAccessor` direkt an Angular-Formulare anbindbar (`[(ngModel)]`,\n * `formControlName`); der Formularwert ist im Multi-Modus `string[]`, sonst `string`.\n * Ohne Formular gehen `[(value)]` / `[(values)]` (valueChange/valuesChange via model()).\n */\n@Component({\n selector: 'cds-combobox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgIcon],\n viewProviders: [provideIcons({ heroChevronDown, heroXMark })],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ComboboxComponent), multi: true },\n ],\n host: {\n '(document:pointerdown)': 'onDocPointerDown($event)',\n },\n template: `\n <div\n class=\"ep-combobox\"\n [class.is-multi]=\"multi()\"\n [class.is-open]=\"open()\"\n [class.is-disabled]=\"disabled()\"\n [attr.data-area]=\"area() || null\"\n >\n <span class=\"ep-select-label\" [id]=\"ids.label\">{{ label() }}</span>\n <!-- Klick auf die Feldfläche fokussiert das Input (cursor:text); das Input selbst\n ist direkt tastaturfokussierbar — daher a11y-Regeln hier gezielt aus. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"ep-combobox-control\"\n [class.has-clear]=\"query().length > 0\"\n (click)=\"focusInput()\"\n >\n @if (multi()) {\n @for (opt of selectedOptions(); track opt.value) {\n <span class=\"ep-combobox-token\">\n <span class=\"ep-combobox-token-label\">{{ opt.label }}</span>\n <button\n type=\"button\"\n class=\"ep-combobox-token-remove\"\n [attr.aria-label]=\"'Entfernen: ' + opt.label\"\n (click)=\"removeValue(opt.value, $event)\"\n >\n <ng-icon name=\"heroXMark\" size=\"14px\" aria-hidden=\"true\" />\n </button>\n </span>\n }\n }\n <input\n #input\n class=\"ep-combobox-input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-labelledby]=\"ids.label\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"ids.menu\"\n aria-autocomplete=\"list\"\n [attr.aria-activedescendant]=\"\n open() && activeIndex() >= 0 ? ids.option(activeIndex()) : null\n \"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [value]=\"query()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (focus)=\"openMenu()\"\n (blur)=\"markTouched()\"\n />\n @if (query().length > 0) {\n <button\n type=\"button\"\n class=\"ep-combobox-clear\"\n aria-label=\"Eingabe löschen\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" size=\"16px\" aria-hidden=\"true\" />\n </button>\n }\n <ng-icon class=\"ep-select-caret\" name=\"heroChevronDown\" size=\"24px\" aria-hidden=\"true\" />\n </div>\n <ul\n class=\"ep-combobox-menu\"\n role=\"listbox\"\n [id]=\"ids.menu\"\n [attr.aria-labelledby]=\"ids.label\"\n >\n @for (opt of filtered(); track opt.value; let i = $index) {\n <!-- Listbox-Muster: Optionen bewusst nicht einzeln fokussierbar; Tastatur\n läuft über das Input (aria-activedescendant). -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <li\n class=\"ep-select-option\"\n role=\"option\"\n [id]=\"ids.option(i)\"\n [attr.data-value]=\"opt.value\"\n [class.is-active]=\"i === activeIndex()\"\n [attr.aria-selected]=\"isSelected(opt.value)\"\n (click)=\"select(opt)\"\n (mouseenter)=\"activeIndex.set(i)\"\n >\n {{ opt.label }}\n </li>\n }\n @if (!filtered().length) {\n <li class=\"ep-combobox-empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ emptyText() }}\n </li>\n }\n </ul>\n </div>\n `,\n})\nexport class ComboboxComponent implements ControlValueAccessor {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly input = viewChild<ElementRef<HTMLInputElement>>('input');\n\n readonly label = input('Thema');\n readonly options = input<CdsSelectOption[]>([]);\n /** Einzelauswahl: gewählter Wert. Two-Way (`[(value)]`) UND Angular-Forms. */\n readonly value = model<string | undefined>(undefined);\n /** Mehrfachauswahl: gewählte Werte (nur bei multi). Two-Way UND Angular-Forms. */\n readonly values = model<string[]>([]);\n readonly multi = input(false);\n readonly area = input<CdsArea>();\n readonly placeholder = input('Suchen…');\n readonly emptyText = input('Kein Treffer');\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n\n /** @internal */\n protected readonly open = signal(false);\n /** @internal */\n protected readonly activeIndex = signal(0);\n\n /**\n * Aktuell gewählte Werte — reiner Ableitungszustand aus `[(value)]`/`[(values)]`,\n * je nach Modus (WP5 §5.3: vorher ein per `effect()` nachgeführtes Signal; die\n * `effect()`-Zustandsableitung ist das Anti-Muster, das die Angular-Doku\n * ausdrücklich nennt). Alle Schreibpfade (`select()`, `removeValue()`,\n * `writeValue()`) schreiben seitdem direkt in `value`/`values` — die Quelle,\n * nicht mehr in dieses abgeleitete Signal.\n *\n * @internal\n */\n protected readonly selected = computed<string[]>(() =>\n this.multi() ? this.values() : this.value() ? [this.value() as string] : [],\n );\n\n /** Label der aktuellen Einzelauswahl (leer bei Multi/keiner Auswahl). */\n private readonly selectedLabel = computed(\n () => this.options().find((o) => o.value === this.value())?.label ?? '',\n );\n\n /**\n * Sichtbarer Filtertext im Feld. Vorgabe: leer im Multi-Modus, sonst das Label\n * der aktuellen Auswahl — lokal überschreibbar (Tippen via `onInput`,\n * `select()`/`clear()`/`close()` setzen ihn ebenfalls direkt). Aktualisiert sich\n * NICHT von der Vorgabe her, während das Menü offen ist (Nutzer tippt gerade);\n * erst das nächste Schließen übernimmt die neue Vorgabe. Ersetzt den Teil des\n * bisherigen `effect()`, der `query` außerhalb des offenen Menüs nachführte\n * (WP5 §5.3).\n *\n * @internal\n */\n protected readonly query = linkedSignal<{ open: boolean; multi: boolean; label: string }, string>(\n {\n source: () => ({ open: this.open(), multi: this.multi(), label: this.selectedLabel() }),\n computation: (src, previous) => {\n // Offenes Menü: laufende Eingabe nicht überschreiben (entspricht dem alten\n // `if (!this.open())`-Gate). Geschlossen: Multi zeigt nie ein Label (leeren),\n // Einzelauswahl übernimmt das Label der aktuellen Auswahl.\n if (src.open) return previous?.value ?? '';\n return src.multi ? '' : src.label;\n },\n },\n );\n\n private onChange: (value: string | string[]) => void = () => {\n /* von Angular-Forms via registerOnChange gesetzt */\n };\n private onTouched: () => void = () => {\n /* von Angular-Forms via registerOnTouched gesetzt */\n };\n\n private readonly instance = ++uid;\n /** @internal */\n protected readonly ids = {\n label: `cds-combobox-${this.instance}-label`,\n menu: `cds-combobox-${this.instance}-menu`,\n option: (i: number) => `cds-combobox-${this.instance}-opt-${i}`,\n };\n\n /**\n * ControlValueAccessor — Formularwert ist string[] (multi) bzw. string (single).\n *\n * @internal\n */\n writeValue(value: string | string[] | null): void {\n if (this.multi()) {\n const arr = Array.isArray(value) ? [...value] : [];\n this.values.set(arr);\n } else {\n const v = typeof value === 'string' ? value : undefined;\n this.value.set(v);\n this.query.set(v ? (this.options().find((o) => o.value === v)?.label ?? '') : '');\n }\n }\n /** @internal */\n registerOnChange(fn: (value: string | string[]) => void): void {\n this.onChange = fn;\n }\n /** @internal */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n /** @internal */\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n /**\n * Aktuell gewählte Optionen (für die Chips im Multi-Modus).\n *\n * @internal\n */\n protected selectedOptions(): CdsSelectOption[] {\n return this.selected()\n .map((v) => this.options().find((o) => o.value === v))\n .filter((o): o is CdsSelectOption => !!o);\n }\n\n /**\n * Gefilterte Optionen: Substring (case-insensitiv); im Multi-Modus ohne bereits Gewählte.\n *\n * @internal\n */\n protected filtered(): CdsSelectOption[] {\n const q = this.query().trim().toLowerCase();\n const chosen = this.selected();\n return this.options().filter((o) => {\n if (this.multi() && chosen.includes(o.value)) return false;\n return !q || o.label.toLowerCase().includes(q);\n });\n }\n\n /** @internal */\n protected isSelected(value: string): boolean {\n return this.selected().includes(value);\n }\n\n /** @internal */\n protected focusInput(): void {\n if (!this.disabled()) this.input()?.nativeElement.focus();\n }\n\n /** @internal */\n protected openMenu(): void {\n if (this.disabled() || this.open()) return;\n this.open.set(true);\n this.activeIndex.set(0);\n }\n\n /** @internal */\n protected close(): void {\n this.open.set(false);\n if (this.multi()) {\n // Multi-Modus: keinen losen Filtertext stehen lassen, der zu keiner Auswahl\n // gehört (Auswahl läuft über die Chips, nicht über das Feld).\n this.query.set('');\n } else {\n // Einzelauswahl: keinen losen Filtertext stehen lassen.\n const label = this.options().find((o) => o.value === this.value())?.label ?? '';\n this.query.set(label);\n }\n }\n\n /** @internal */\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.open.set(true);\n this.activeIndex.set(0);\n }\n\n /** @internal */\n protected select(opt: CdsSelectOption): void {\n if (this.multi()) {\n const next = [...this.selected(), opt.value];\n this.values.set(next);\n this.onChange(next);\n this.onTouched();\n this.query.set('');\n this.activeIndex.set(0);\n this.focusInput(); // offen lassen, weiter hinzufügen\n } else {\n this.value.set(opt.value);\n this.onChange(opt.value);\n this.onTouched();\n this.query.set(opt.label);\n this.open.set(false);\n }\n }\n\n /** @internal */\n protected removeValue(value: string, event?: Event): void {\n event?.stopPropagation();\n const next = this.selected().filter((v) => v !== value);\n this.values.set(next);\n this.onChange(next);\n this.onTouched();\n }\n\n /** @internal */\n protected clear(event?: Event): void {\n event?.stopPropagation();\n this.query.set('');\n this.activeIndex.set(0);\n this.focusInput();\n }\n\n /** @internal */\n protected markTouched(): void {\n this.onTouched();\n }\n\n /** @internal */\n protected onKeydown(event: KeyboardEvent): void {\n const opts = this.filtered();\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this.open()) this.openMenu();\n else this.activeIndex.set(Math.min(opts.length - 1, this.activeIndex() + 1));\n this.scrollActive();\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (!this.open()) this.openMenu();\n else this.activeIndex.set(Math.max(0, this.activeIndex() - 1));\n this.scrollActive();\n break;\n case 'Home':\n // Nur bei offenem Menü abfangen (erste gefilterte Option) — bei\n // geschlossenem Feld bleibt die native Cursor-Bewegung im Text erhalten.\n if (!this.open()) return;\n event.preventDefault();\n this.activeIndex.set(0);\n this.scrollActive();\n break;\n case 'End':\n // Analog zu Home: nur bei offenem Menü (letzte gefilterte Option).\n if (!this.open()) return;\n event.preventDefault();\n this.activeIndex.set(opts.length - 1);\n this.scrollActive();\n break;\n case 'Enter': {\n const opt = opts[this.activeIndex()];\n if (this.open() && opt) {\n event.preventDefault();\n this.select(opt);\n }\n break;\n }\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n case 'Backspace':\n if (this.multi() && this.query().length === 0 && this.selected().length) {\n this.removeValue(this.selected()[this.selected().length - 1]);\n }\n break;\n }\n }\n\n // Timer über DestroyRef aufgeräumt (WP5 §5.5).\n private readonly scrollTimer = disposableTimeout();\n\n private scrollActive(): void {\n this.scrollTimer.schedule(() => {\n this.host.nativeElement\n .querySelector(`#${CSS.escape(this.ids.option(this.activeIndex()))}`)\n ?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n /** @internal */\n protected onDocPointerDown(event: PointerEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) this.close();\n }\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n forwardRef,\n inject,\n input,\n model,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { CdsArea } from '../area';\nimport { CvaBase } from '../shared/cva-base.directive';\n\n// Modulweiter Zähler → jede Instanz bekommt per Default eine EINDEUTIGE id.\n// Ein konstanter Default würde bei mehreren Slidern kollidieren (doppelte id →\n// kaputte label/for-, output/for- und aria-describedby-Verknüpfung).\nlet uid = 0;\n\n/**\n * Slider — Wrapper um `.field-slider` / `.slider` aus css/components.css → „Slider“.\n *\n * Range-Eingabe mit Label + Live-Ausgabe, bereichsgefärbtem Thumb/Output\n * (.slider-<area> setzt --sl-color), automatisch berechneten Ticks und Helper-Text.\n *\n * Ticks: Es wird nur eine gewünschte ANZAHL (`tickCount`) angegeben; die Positionen/\n * Labels werden gleichmäßig aus [min, max] berechnet (space-between wie das CSS-\n * Layout). Wird der Slider zu schmal, reduziert die Komponente die Tick-Zahl reaktiv\n * (ResizeObserver), sodass die Labels nicht überlappen — Endpunkte bleiben erhalten.\n *\n * Als `ControlValueAccessor` direkt an Angular-Formulare anbindbar (`[(ngModel)]`,\n * `formControlName`); ohne Formular geht `[(value)]` (valueChange via model()).\n */\n@Component({\n selector: 'cds-slider',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SliderComponent), multi: true },\n ],\n template: `\n <div class=\"field-slider\">\n <div class=\"field-slider-header\">\n <label class=\"field-slider-label\" [attr.for]=\"sliderId()\">{{ label() }}</label>\n <output [class]=\"outputClasses()\" [attr.for]=\"sliderId()\" [id]=\"sliderId() + '-out'\">\n {{ formatted() }}\n </output>\n </div>\n <input\n [class]=\"sliderClasses()\"\n type=\"range\"\n [id]=\"sliderId()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.aria-valuetext]=\"formatted()\"\n [attr.aria-describedby]=\"helper() ? sliderId() + '-hint' : null\"\n (input)=\"onInput($event)\"\n (blur)=\"markTouched()\"\n />\n @if (tickItems().length) {\n <!-- Ticks exakt auf die Thumb-Position ausgerichtet: der Thumb (22px, siehe\n css/components.css) läuft mittig von 11px bis (Breite − 11px). Das\n space-between des Kern-CSS träfe die Label-MITTEN nicht (bei vielen Ticks\n sichtbar), daher hier absolut positioniert und zentriert. -->\n <div\n class=\"field-slider-ticks\"\n aria-hidden=\"true\"\n style=\"position:relative;display:block;padding:0;height:16px\"\n >\n @for (t of tickItems(); track $index) {\n <span\n [style.left]=\"t.left\"\n style=\"position:absolute;transform:translateX(-50%);white-space:nowrap\"\n >{{ t.label }}</span\n >\n }\n </div>\n }\n @if (helper()) {\n <span class=\"helper\" [id]=\"sliderId() + '-hint'\">{{ helper() }}</span>\n }\n </div>\n `,\n})\nexport class SliderComponent extends CvaBase<number> {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n /** Gemessene Slider-Breite (px); treibt die reaktive Tick-Reduktion. */\n private readonly width = signal(0);\n\n readonly label = input('Budget-Rahmen');\n /** Markenbereich → .slider-<area> (Thumb- + Output-Farbe). */\n readonly area = input<CdsArea>('co');\n readonly min = input(10000, { transform: numberAttribute });\n readonly max = input(100000, { transform: numberAttribute });\n readonly step = input(5000, { transform: numberAttribute });\n /** Aktueller Wert. Two-Way (`[(value)]`) UND Angular-Forms. */\n readonly value = model(50000);\n /** Einheit, an den formatierten Wert angehängt (z. B. ' €'). */\n readonly unit = input(' €');\n /** Gewünschte Anzahl Ticks (inkl. Endpunkte). 0 = keine. Wird bei zu schmalem\n * Slider automatisch reduziert. */\n readonly tickCount = input(3, { transform: numberAttribute });\n /** Mindestbreite (px) pro Tick-Label, ab der reduziert wird. */\n readonly minTickSpacing = input(56, { transform: numberAttribute });\n readonly helper = input('Schritte: 5.000 €');\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n readonly sliderId = input(`cds-slider-${++uid}`);\n\n constructor() {\n super();\n // Erstmessung + ResizeObserver-Setup: reine Browser-Angelegenheit (Layout gibt es\n // beim serverseitigen Rendern nicht) und läuft genau einmal nach dem ersten Render —\n // afterNextRender ist der Ersatz für ngAfterViewInit + direktem DOM-Zugriff, der\n // (anders als ngAfterViewInit) NIE beim SSR ausgeführt wird.\n afterNextRender(() => {\n const el = this.host.nativeElement.querySelector<HTMLElement>('.field-slider');\n if (!el) return;\n this.width.set(el.getBoundingClientRect().width);\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver((entries) => {\n this.width.set(entries[0].contentRect.width);\n });\n ro.observe(el);\n this.destroyRef.onDestroy(() => ro.disconnect());\n }\n });\n }\n\n /** @internal */\n protected override normalizeValue(value: number): number {\n // Auf [min, max] klemmen: ein Formularwert außerhalb des Bereichs würde sonst im\n // <output> stehen, während der native Thumb an min/max klemmt (Modell/UI-Mismatch).\n const n = typeof value === 'number' && !Number.isNaN(value) ? value : this.min();\n return this.clamp(n);\n }\n private clamp(v: number): number {\n return Math.min(this.max(), Math.max(this.min(), v));\n }\n /** @internal */\n protected override applyValue(value: number): void {\n this.value.set(value);\n }\n /** @internal */\n protected override applyDisabled(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n /** @internal */\n protected readonly sliderClasses = computed(() => `slider slider-${this.area()}`);\n /** @internal */\n protected readonly outputClasses = computed(() => `field-slider-output slider-${this.area()}`);\n /** @internal */\n protected readonly formatted = computed(\n () => `${this.value().toLocaleString('de-DE')}${this.unit()}`,\n );\n\n /** Effektive Tick-Anzahl: Wunsch, aber auf das reduziert, was in die Breite passt. */\n private effectiveTickCount(): number {\n const tickCount = this.tickCount();\n if (tickCount < 2) return Math.max(0, Math.trunc(tickCount));\n const w = this.width();\n if (!w) return tickCount; // vor der Messung: Wunschanzahl\n const maxFit = Math.max(2, Math.floor(w / this.minTickSpacing()));\n return Math.min(tickCount, maxFit);\n }\n\n /**\n * Gleichmäßig über [min, max] verteilte Ticks: Label (kompakt formatiert) plus\n * absolute Ziel-Position (left), zentriert auf die echte Thumb-Position.\n *\n * @internal\n */\n protected readonly tickItems = computed<{ label: string; left: string }[]>(() => {\n const n = this.effectiveTickCount();\n if (n < 1) return [];\n // left so, dass die Label-MITTE auf dem Thumb-Mittelpunkt liegt (Thumb 22px →\n // von 11px bis Breite−11px). translateX(-50%) zentriert das Label darüber.\n const at = (p: number) => `calc(11px + ${p} * (100% - 22px))`;\n const min = this.min();\n const max = this.max();\n if (n === 1) return [{ label: this.formatTick(min), left: at(0.5) }];\n return Array.from({ length: n }, (_, i) => {\n const p = i / (n - 1);\n return { label: this.formatTick(min + (max - min) * p), left: at(p) };\n });\n });\n\n /** Kompakte Tick-Beschriftung: k/M-Kurzform (de-DE), z. B. 32500 → „32,5k“. */\n private formatTick(v: number): string {\n const abs = Math.abs(v);\n const fmt = (x: number) => x.toLocaleString('de-DE', { maximumFractionDigits: 1 });\n if (abs >= 1_000_000) return `${fmt(v / 1_000_000)}M`;\n if (abs >= 1_000) return `${fmt(v / 1_000)}k`;\n return fmt(v);\n }\n\n /** @internal */\n protected onInput(event: Event): void {\n const value = Number((event.target as HTMLInputElement).value);\n this.value.set(value);\n this.onChange(value);\n }\n /** @internal */\n protected markTouched(): void {\n this.onTouched();\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n// Re-Export für Konsumenten, die die Typen weiter aus footer.component beziehen.\nexport type { CdsFooterLink, CdsSocialLink, CdsSocialPlatform } from './footer-bottom.component';\n\n/**\n * Footer — `<footer>`-Landmark (`.footer`, Zwei-Band-Stack) als schlanke Hülle. Die\n * beiden Bänder werden als `<cds-footer-main>` und `<cds-footer-bottom>` projiziert:\n *\n * ```html\n * <cds-footer>\n * <cds-footer-main ...></cds-footer-main>\n * <cds-footer-bottom ...></cds-footer-bottom>\n * </cds-footer>\n * ```\n *\n * So lassen sich oberer und unterer Teil einzeln betrachten und unabhängig\n * konfigurieren; `.footer` stapelt sie (flex column) im Seitenfuß-Landmark.\n */\n@Component({\n selector: 'cds-footer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <footer class=\"footer\" aria-label=\"Seitenfuß\">\n <ng-content></ng-content>\n </footer>\n `,\n})\nexport class FooterComponent {}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Footer — oberer Teil (`.footer-main`): helles Band als **generisches Spalten-Layout**.\n * Der Inhalt wird als beliebige Spalten projiziert (jedes Top-Level-Kind = eine\n * Grid-Spalte), statt fester Adresse/Nav/Newsletter-Struktur — so eignet es sich für\n * Website- UND App-Footer ohne Marketing-Lock-in.\n *\n * ```html\n * <cds-footer-main>\n * <div>…Spalte 1…</div>\n * <div>…Spalte 2…</div>\n * </cds-footer-main>\n * ```\n *\n * Die Host-Klasse `footer-main` trägt Hintergrund/Padding aus css/components.css;\n * `:host{display:block}` macht das Band auch standalone zum Block. Spaltenanzahl/-breiten\n * über `columns` (grid-template-columns); ohne Angabe gilt das 3-Spalten-Default.\n */\n@Component({\n selector: 'cds-footer-main',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'footer-main' },\n styles: [':host{display:block}'],\n template: `\n <div class=\"footer-grid\" [style.grid-template-columns]=\"columns() || null\">\n <ng-content></ng-content>\n </div>\n `,\n})\nexport class FooterMainComponent {\n /**\n * Optionale `grid-template-columns` (z. B. `'repeat(4, 1fr)'` oder `'2fr 1fr'`).\n * Ohne Angabe gilt das Default aus `.footer-grid` (1.2fr 1fr 1.3fr, 3 Spalten).\n */\n readonly columns = input<string>();\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\nexport interface CdsFooterLink {\n label: string;\n href: string;\n}\n\n/** Built-in-Plattformen mit verifiziertem Icon. Weitere über `iconPath` möglich. */\nexport type CdsSocialPlatform = 'linkedin' | 'youtube';\n\nexport interface CdsSocialLink {\n href: string;\n /** Built-in-Plattform (bringt Icon + Label mit). */\n platform?: CdsSocialPlatform;\n /** Aria-Label; Default: das Label der Plattform. */\n label?: string;\n /** Eigenes SVG-Pfad-`d` (viewBox 0 0 24, weiß) — für Plattformen ohne Built-in. */\n iconPath?: string;\n}\n\n/**\n * Footer — unterer Teil (`.footer-btm`): dunkler Streifen mit Copyright, Rechts-Links\n * und Social-Profilen. Die Host-Klasse `footer-btm` trägt Hintergrund/Flex-Layout aus\n * css/components.css. Social-Glyphen sind schlanke Inline-SVGs in Weiß; verifizierte\n * Built-in-Icons (linkedin, youtube) via `platform`, beliebige weitere via `iconPath`.\n */\n@Component({\n selector: 'cds-footer-bottom',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'footer-btm' },\n template: `\n <!-- prettier-ignore -->\n <span\n >{{ copyright() }}@if (version()) {<span aria-hidden=\"true\"> · </span>{{ version() }}}</span\n >\n <nav aria-label=\"Rechtliche Hinweise\" style=\"display:flex;gap:var(--s4);flex-wrap:wrap\">\n @for (link of legalLinks(); track $index) {\n <a class=\"footer-btm-link\" [href]=\"link.href\">{{ link.label }}</a>\n }\n </nav>\n @if (support(); as sup) {\n <a class=\"footer-btm-link\" [href]=\"sup.href\">{{ sup.label }}</a>\n }\n @if (socialLinks().length) {\n <!-- Glyphen explizit weiß (fill=\"#fff\") wie die -light-Logo-Assets der Doku:\n currentColor würde die Link-/n-300-Farbe erben (LinkedIn erschiene blau). -->\n <nav class=\"footer-social\" aria-label=\"Soziale Netzwerke\">\n @for (s of socialLinks(); track $index) {\n <a\n [href]=\"s.href\"\n target=\"_blank\"\n rel=\"noopener\"\n [attr.aria-label]=\"socialLabel(s) + ' (öffnet in neuem Tab)'\"\n >\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"#fff\" aria-hidden=\"true\">\n <path [attr.d]=\"socialPath(s)\" />\n </svg>\n </a>\n }\n </nav>\n }\n `,\n})\nexport class FooterBottomComponent {\n readonly copyright = input('© 2026 Conciso GmbH · Dortmund');\n /** Optionale Versionsangabe (z. B. „Version 1.4.2“), hinter dem Copyright. */\n readonly version = input<string>();\n /** Optionaler Support-/Hilfe-Link neben den Rechts-Links. */\n readonly support = input<CdsFooterLink>();\n readonly legalLinks = input<CdsFooterLink[]>([\n { label: 'Datenschutz', href: '#' },\n { label: 'Impressum', href: '#' },\n ]);\n readonly socialLinks = input<CdsSocialLink[]>([\n { platform: 'linkedin', href: '#' },\n { platform: 'youtube', href: '#' },\n ]);\n\n /** Verifizierte Built-in-Social-Icons (viewBox 0 0 24, weiß). */\n private readonly socialIcons: Record<CdsSocialPlatform, { d: string; label: string }> = {\n linkedin: {\n label: 'LinkedIn',\n d: 'M4.98 3.5a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5zM3 9h4v12H3zM10 9h3.8v1.7h.05c.53-1 1.83-2.05 3.77-2.05 4.03 0 4.78 2.65 4.78 6.1V21h-4v-5.4c0-1.3 0-2.96-1.8-2.96s-2.08 1.4-2.08 2.86V21h-4z',\n },\n youtube: {\n label: 'YouTube',\n d: 'M23 12s0-3.2-.4-4.7a2.5 2.5 0 0 0-1.77-1.77C19.3 5.1 12 5.1 12 5.1s-7.3 0-8.83.43A2.5 2.5 0 0 0 1.4 7.3C1 8.8 1 12 1 12s0 3.2.4 4.7a2.5 2.5 0 0 0 1.77 1.77C4.7 18.9 12 18.9 12 18.9s7.3 0 8.83-.43a2.5 2.5 0 0 0 1.77-1.77C23 15.2 23 12 23 12zM9.75 15.02V8.98L15 12z',\n },\n };\n\n /** @internal */\n protected socialPath(s: CdsSocialLink): string {\n return s.iconPath ?? (s.platform ? this.socialIcons[s.platform].d : '');\n }\n /** @internal */\n protected socialLabel(s: CdsSocialLink): string {\n return s.label ?? (s.platform ? this.socialIcons[s.platform].label : '');\n }\n}\n","import { ChangeDetectionStrategy, Component, TemplateRef, input, viewChild } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * Einzelner Tab für `<cds-area-tabs>`. Trägt Label + Bereich; sein Inhalt ist\n * BELIEBIGES projiziertes Markup (Text, Listen, Komponenten, CTAs …), das die\n * Elternkomponente ins zugehörige Panel rendert.\n *\n * Der Inhalt wird in ein internes `<ng-template>` projiziert (via `<ng-content>`)\n * und über einen TemplateRef bereitgestellt — so kann `cds-area-tabs` ihn getrennt\n * vom Tab-Button an der Panel-Position ausgeben (ngTemplateOutlet), passend zur\n * `.area-tabs` / `.atab-content`-Struktur aus css/components.css.\n */\n@Component({\n selector: 'cds-area-tab',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<ng-template><ng-content></ng-content></ng-template>`,\n})\nexport class AreaTabComponent {\n /** Markenbereich → Tab-Punkt (Bereichs-500) + aktiver Text/Unterstrich. */\n readonly area = input.required<CdsArea>();\n /** Beschriftung im Tab-Button. */\n readonly label = input('');\n\n /**\n * Projizierter Panel-Inhalt; von der Elternkomponente via Outlet gerendert.\n *\n * Bleibt `public`, weil `cds-area-tabs` ihn von außen liest — anders als die\n * internen Signale, die ADR-0007 auf `protected` stellt. `@internal` hält ihn\n * trotzdem aus Props-Tabelle und Manifest heraus: Input/Output ist er nicht.\n *\n * @internal\n */\n readonly content = viewChild.required<TemplateRef<unknown>>(TemplateRef);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n contentChildren,\n inject,\n input,\n model,\n} from '@angular/core';\nimport type { CdsArea } from '../area';\nimport { AreaTabComponent } from './area-tab.component';\n\n// Modulweiter Zähler → eindeutige IDs je Instanz. Ein konstanter Präfix würde bei\n// mehreren AreaTabs kollidieren (doppelte tab-/panel-id → kaputte aria-controls/\n// -labelledby-Verknüpfung und falsches Fokus-Ziel bei der Tastatur-Navigation).\nlet uid = 0;\n\n/**\n * AreaTabs — Wrapper um `.area-tabs` / `.atab` / `.atab-content` aus\n * css/components.css → „Area Tabs“. Bereichsgefärbte Tab-Leiste: der aktive Tab\n * setzt `--atab-color` (Bereichs-700) für Text + Unterstrich, der Punkt nutzt\n * Bereichs-500. Umschalten per Klick (aria-selected / sichtbares Panel).\n *\n * Tabs werden deklarativ als `<cds-area-tab>`-Kinder projiziert; jeder Tab trägt\n * `area` + `label` und BELIEBIGEN Inhalt (Markup/Komponenten), der ins Panel\n * gerendert wird. Der aktive Index ist über `[(active)]` steuerbar.\n */\n@Component({\n selector: 'cds-area-tabs',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n template: `\n <div class=\"area-tabs\" role=\"tablist\" [attr.aria-label]=\"ariaLabel()\">\n @for (tab of tabs(); track tab; let i = $index) {\n <button\n class=\"atab\"\n type=\"button\"\n role=\"tab\"\n [class.active]=\"i === active()\"\n [attr.aria-selected]=\"i === active()\"\n [attr.tabindex]=\"i === active() ? 0 : -1\"\n [attr.data-area]=\"tab.area()\"\n [id]=\"tabId(i)\"\n [attr.aria-controls]=\"panelId(i)\"\n [style]=\"'--atab-color:' + atabAccent(tab.area())\"\n (click)=\"active.set(i)\"\n (keydown)=\"onKeydown($event)\"\n >\n <span class=\"area-dot\" [style.background]=\"'var(--' + tab.area() + '-500)'\"></span>\n {{ tab.label() }}\n </button>\n }\n </div>\n\n @for (tab of tabs(); track tab; let i = $index) {\n <div\n class=\"atab-content\"\n role=\"tabpanel\"\n [class.visible]=\"i === active()\"\n [id]=\"panelId(i)\"\n [attr.aria-labelledby]=\"tabId(i)\"\n >\n <ng-container [ngTemplateOutlet]=\"tab.content()\"></ng-container>\n </div>\n }\n `,\n})\nexport class AreaTabsComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly instance = ++uid;\n\n /**\n * Die Tabs kommen als projizierte `<cds-area-tab>`-Kinder.\n *\n * @internal\n */\n protected readonly tabs = contentChildren(AreaTabComponent);\n /** Index des aktiven Tabs. Two-Way (`[(active)]`). */\n readonly active = model(0);\n /** Zugänglicher Name der Tab-Leiste (WAI-ARIA verlangt aria-label/-labelledby). */\n readonly ariaLabel = input('Bereiche');\n\n /**\n * Aktiv-Akzent je Bereich: ki braucht -800 (700 reißt AA), sonst -700 (wie .t-*).\n *\n * @internal\n */\n protected atabAccent(area: CdsArea): string {\n return area === 'ki' ? 'var(--ki-800)' : `var(--${area}-700)`;\n }\n\n /** @internal */\n protected tabId(i: number): string {\n return `cds-atab-${this.instance}-${i}`;\n }\n /** @internal */\n protected panelId(i: number): string {\n return `cds-atab-${this.instance}-panel-${i}`;\n }\n\n /**\n * WAI-ARIA-Tabs-Tastatur (horizontal, automatische Aktivierung): ←/→ bewegen mit\n * Umlauf, Home/End springen an die Enden. Der Fokus wird mitgeführt (Roving\n * Tabindex: nur der aktive Tab ist per Tab erreichbar). Panels laden sofort, daher\n * ist Auswahl = Fokus (APG-empfohlen).\n *\n * @internal\n */\n protected onKeydown(event: KeyboardEvent): void {\n const n = this.tabs().length;\n if (!n) return;\n const cur = this.active();\n let next: number;\n switch (event.key) {\n case 'ArrowRight':\n next = (cur + 1) % n;\n break;\n case 'ArrowLeft':\n next = (cur - 1 + n) % n;\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = n - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n this.active.set(next);\n this.host.nativeElement.querySelector<HTMLElement>(`#${CSS.escape(this.tabId(next))}`)?.focus();\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** Ein Logo: in der Regel ein Bild; der Text dient als Alt-Fallback und als Platzhalter. */\nexport interface CdsLogo {\n /** Firmen-/Markenname. Pflicht – dient als Alt-Text-Fallback UND als Text-Platzhalter,\n * falls (noch) kein Bild vorliegt. */\n label: string;\n /** Bildquelle (URL oder Data-URI). Gesetzt → Bild wird gezeigt, sonst der Text-Platzhalter. */\n src?: string;\n /** Alt-Text des Bilds (Fallback: `label`). */\n alt?: string;\n}\n\n/**\n * Logo — einzelne Logo-Kachel (`.logo-tile` aus css/components.css).\n *\n * Rendert bevorzugt ein **Bild** (`src`); ohne Bild fällt es auf den Text-`label`\n * als Platzhalter zurück (`.logo-placeholder`). So lässt es sich sowohl im\n * Logo-Carousel als auch eigenständig verwenden (Partner-Leiste, „Bekannt aus“-Reihe,\n * Footer). Die Host-Klasse `logo-tile` trägt Flex-Zentrierung/Padding aus der portablen CSS.\n */\n@Component({\n selector: 'cds-logo',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'logo-tile' },\n template: `\n @if (src()) {\n <img [src]=\"src()\" [alt]=\"alt() || label()\" />\n } @else {\n <span class=\"logo-placeholder\">{{ label() }}</span>\n }\n `,\n})\nexport class LogoComponent {\n readonly label = input.required<string>();\n /** Bildquelle; gesetzt → Bild statt Text-Platzhalter. */\n readonly src = input<string>();\n /** Alt-Text des Bilds (Fallback: `label`). */\n readonly alt = input('');\n}\n","/**\n * Geteilte Tastatur-Logik für Dot-Leisten mit `role=\"tab\"` in `role=\"tablist\"`\n * (Carousel, LogoCarousel): ←/→ mit Umlauf, Home/End an die Enden, automatische\n * Aktivierung (WAI-ARIA-Tabs-Muster). Reine Funktion, kein State — der Aufrufer\n * hält Länge/aktiven Index selbst und setzt bei einem Treffer den neuen Index\n * sowie den Fokus (Roving Tabindex).\n *\n * NICHT über `public-api.ts` exportiert: reines internes Implementierungsdetail\n * der Lib, keine öffentliche API.\n */\nexport function nextDotsIndex(length: number, current: number, key: string): number | null {\n if (!length) return null;\n switch (key) {\n case 'ArrowRight':\n return (current + 1) % length;\n case 'ArrowLeft':\n return (current - 1 + length) % length;\n case 'Home':\n return 0;\n case 'End':\n return length - 1;\n default:\n return null;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n effect,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { CdsLogo, LogoComponent } from '../logo/logo.component';\nimport { nextDotsIndex } from '../shared/dots-keyboard';\n\nexport type { CdsLogo } from '../logo/logo.component';\n\n/** Eindeutige IDs je Instanz (Dot aria-controls ↔ Slide-id). */\nlet cdsLogoCarouselUid = 0;\n\n/**\n * LogoCarousel — Wrapper um `.logo-carousel` aus css/components.css → „Logo-Carousel“.\n *\n * Diskrete Sets von je fünf Logos, die automatisch per Crossfade wechseln\n * (`[aria-hidden]` je Slide). Das Autoplay pausiert bei Maus-Hover und Tastatur-Fokus\n * (damit Nutzer in Ruhe lesen/bedienen können), zusätzlich dauerhaft über den\n * Pause-Button (.logo-carousel-pause, sichtbar bei Hover/Fokus bzw. im .paused-Zustand);\n * Dots wählen ein Set direkt. Autoplay respektiert prefers-reduced-motion.\n *\n * Der Timer wird zentral über ein `effect` gesteuert: er läuft nur, wenn NICHT\n * pausiert, NICHT gehovert, NICHT fokussiert und reduzierte Bewegung nicht gewünscht\n * ist. Eine Änderung des `interval` startet ihn automatisch neu.\n *\n * Jede Kachel ist ein `cds-logo`: bevorzugt ein Bild (`src`), sonst der Text als\n * Platzhalter/Fallback. Standardmäßig sind reine Text-Platzhalter gesetzt – reale\n * Anwendungen übergeben ihre Kundenlogos als Bilder.\n */\n@Component({\n selector: 'cds-logo-carousel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LogoComponent],\n template: `\n <div\n class=\"logo-carousel\"\n [class.paused]=\"paused()\"\n (mouseenter)=\"hovered.set(true)\"\n (mouseleave)=\"hovered.set(false)\"\n (focusin)=\"focused.set(true)\"\n (focusout)=\"onFocusOut($event)\"\n >\n <button\n class=\"logo-carousel-pause\"\n type=\"button\"\n [attr.aria-label]=\"paused() ? 'Abspielen' : 'Pausieren'\"\n (click)=\"togglePause()\"\n >\n <svg\n class=\"icon-pause\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"10\" rx=\"1\" />\n <rect x=\"8\" y=\"2\" width=\"3\" height=\"10\" rx=\"1\" />\n </svg>\n <svg\n class=\"icon-play\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 2.5v9l7-4.5z\" />\n </svg>\n </button>\n\n <div class=\"logo-carousel-track\">\n @for (set of sets(); track $index; let i = $index) {\n <div\n class=\"logo-carousel-slide\"\n [id]=\"slideId(i)\"\n role=\"group\"\n aria-roledescription=\"Logo-Set\"\n [attr.aria-label]=\"'Set ' + (i + 1) + ' von ' + sets().length\"\n [attr.aria-hidden]=\"i !== active()\"\n >\n @for (logo of set; track $index) {\n <cds-logo [label]=\"logo.label\" [src]=\"logo.src\" [alt]=\"logo.alt || ''\" />\n }\n </div>\n }\n </div>\n\n <div class=\"logo-carousel-dots\" role=\"tablist\" aria-label=\"Logo-Set auswählen\">\n @for (set of sets(); track $index; let i = $index) {\n <button\n class=\"logo-carousel-dot\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"i === active()\"\n [attr.tabindex]=\"i === active() ? 0 : -1\"\n [attr.aria-controls]=\"slideId(i)\"\n [attr.aria-label]=\"'Set ' + (i + 1) + ' von ' + sets().length\"\n (click)=\"goTo(i)\"\n (keydown)=\"onDotsKeydown($event)\"\n ></button>\n }\n </div>\n </div>\n `,\n})\nexport class LogoCarouselComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Logo-Sets, die im Wechsel angezeigt werden (mind. ein Eintrag je Set). */\n readonly sets = input.required<CdsLogo[][]>();\n /** Autoplay-Intervall in **Millisekunden** (Standard 6000 = 6 s). */\n readonly interval = input(6000);\n /** Aktives Set. Two-Way (`[(active)]`) via model(). */\n readonly active = model(0);\n\n /**\n * Vom Nutzer explizit pausiert (Pause-Button).\n *\n * @internal\n */\n protected readonly paused = signal(false);\n /**\n * Transiente Pause: Maus über dem Carousel.\n *\n * @internal\n */\n protected readonly hovered = signal(false);\n /**\n * Transiente Pause: Tastatur-Fokus innerhalb des Carousels.\n *\n * @internal\n */\n protected readonly focused = signal(false);\n /** Reduzierte Bewegung gewünscht → kein Autoplay. Einmal beim Erzeugen ermittelt. */\n private readonly reducedMotion = signal(\n typeof window !== 'undefined' &&\n !!window.matchMedia?.('(prefers-reduced-motion: reduce)').matches,\n );\n private readonly uid = ++cdsLogoCarouselUid;\n\n constructor() {\n // Zentrale Timer-Steuerung: Der Effect legt bei jeder relevanten Änderung\n // (paused/hovered/focused/interval/reduced-motion) den Intervall-Timer neu an und\n // räumt den alten via onCleanup auf. Der aktive Index wird nur IM Callback gelesen\n // und ist daher keine Effect-Abhängigkeit (kein Neustart bei jedem Wechsel).\n effect((onCleanup) => {\n const play = !this.reducedMotion() && !this.paused() && !this.hovered() && !this.focused();\n const ms = this.interval();\n if (!play || typeof window === 'undefined') return;\n const timer = setInterval(() => {\n this.active.set((this.active() + 1) % this.sets().length);\n }, ms);\n onCleanup(() => clearInterval(timer));\n });\n }\n\n /**\n * Stabile Slide-id für die aria-controls-Verknüpfung der Dots.\n *\n * @internal\n */\n protected slideId(i: number): string {\n return `cds-logo-set-${this.uid}-${i + 1}`;\n }\n\n /** @internal */\n protected togglePause(): void {\n this.paused.set(!this.paused());\n }\n\n /** @internal */\n protected goTo(i: number): void {\n this.active.set(i);\n }\n\n /**\n * WAI-ARIA-Tabs-Tastatur auf der Dot-Leiste (horizontal, automatische Aktivierung):\n * ←/→ mit Umlauf, Home/End an die Enden; der Fokus wird mitgeführt (Roving Tabindex).\n * 1:1 übernommen von `carousel.component.ts` (Indexberechnung in\n * `../shared/dots-keyboard.ts`, identisch für beide Komponenten).\n *\n * @internal\n */\n protected onDotsKeydown(event: KeyboardEvent): void {\n const next = nextDotsIndex(this.sets().length, this.active(), event.key);\n if (next === null) return;\n event.preventDefault();\n this.goTo(next);\n this.host.nativeElement.querySelectorAll<HTMLElement>('.logo-carousel-dot')[next]?.focus();\n }\n\n /**\n * Fokus-Pause nur aufheben, wenn der Fokus das Carousel ganz verlässt (nicht bei\n * Wechsel zwischen Kind-Elementen).\n *\n * @internal\n */\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (!next || !this.host.nativeElement.contains(next)) this.focused.set(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { nextDotsIndex } from '../shared/dots-keyboard';\n\nexport interface CdsSlide {\n image?: string;\n title: string;\n text: string;\n}\n\n// Modulweiter Zähler → eindeutige Slide-IDs je Instanz für die aria-controls-\n// Verknüpfung der Dots (doppelte IDs bei mehreren Carousels brächen die Zuordnung).\nlet uid = 0;\n\n/**\n * Carousel — Wrapper um `.img-slider` aus css/components.css → „Bild-Slider“.\n *\n * Crossfade-Carousel: alle Slides liegen gestapelt im Grid, die aktive trägt\n * `.active` (opacity). Inaktive Slides bekommen zusätzlich `[aria-hidden]`, sonst\n * läse ein Screenreader Titel und Text jeder Folie vor, obwohl visuell nur eine\n * sichtbar ist (identisches Muster wie beim LogoCarousel). Prev/Next-Buttons\n * (.img-slider-btn) und Dots (.img-dot) steuern den Index. Optionale Hero-Variante\n * (.img-slider-hero). Ohne Bild-URL wird ein neutraler Platzhalter gezeigt. Der\n * aktive Index ist über `[(active)]` (model) beobacht-/steuerbar.\n */\n@Component({\n selector: 'cds-carousel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n [class]=\"wrapClasses()\"\n role=\"region\"\n aria-roledescription=\"Bildschirmpräsentation\"\n aria-label=\"Bildstrecke\"\n >\n <div class=\"img-slider-track\">\n @for (slide of slides(); track $index; let i = $index) {\n <div\n class=\"img-slide\"\n role=\"group\"\n aria-roledescription=\"Folie\"\n [id]=\"slideId(i)\"\n [attr.aria-label]=\"'Folie ' + (i + 1) + ' von ' + slides().length\"\n [attr.aria-hidden]=\"i !== active()\"\n [class.active]=\"i === active()\"\n >\n <div class=\"img-slide-media\">\n <img [src]=\"slide.image || placeholder\" [alt]=\"slide.title\" />\n </div>\n <div class=\"img-slide-caption\">\n <p class=\"img-slide-caption-title\">{{ slide.title }}</p>\n <p class=\"img-slide-caption-text\">{{ slide.text }}</p>\n </div>\n </div>\n }\n </div>\n\n <button\n class=\"img-slider-btn img-slider-prev\"\n type=\"button\"\n aria-label=\"Vorherige Slide\"\n (click)=\"prev()\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m15.75 19.5-7.5-7.5 7.5-7.5\" />\n </svg>\n </button>\n <button\n class=\"img-slider-btn img-slider-next\"\n type=\"button\"\n aria-label=\"Nächste Slide\"\n (click)=\"next()\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m8.25 4.5 7.5 7.5-7.5 7.5\" />\n </svg>\n </button>\n\n <div class=\"img-slider-dots\" role=\"tablist\" aria-label=\"Folien-Navigation\">\n @for (slide of slides(); track $index; let i = $index) {\n <button\n class=\"img-dot\"\n type=\"button\"\n role=\"tab\"\n [class.active]=\"i === active()\"\n [attr.aria-selected]=\"i === active()\"\n [attr.tabindex]=\"i === active() ? 0 : -1\"\n [attr.aria-controls]=\"slideId(i)\"\n [attr.aria-label]=\"'Folie ' + (i + 1) + ' von ' + slides().length\"\n (click)=\"active.set(i)\"\n (keydown)=\"onDotsKeydown($event)\"\n ></button>\n }\n </div>\n </div>\n `,\n})\nexport class CarouselComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly instance = ++uid;\n\n /** Anzuzeigende Slides (Bild optional, Titel/Text je Slide Pflicht). */\n readonly slides = input.required<CdsSlide[]>();\n /** Aktiver Slide-Index. Two-Way (`[(active)]`) via model(). */\n readonly active = model(0);\n /** Hero-Variante (vollflächig, 21:9, Caption als Overlay) → .img-slider-hero. */\n readonly hero = input(false);\n\n /** @internal */\n protected readonly wrapClasses = computed(() =>\n this.hero() ? 'img-slider img-slider-hero' : 'img-slider',\n );\n\n /** @internal */\n protected prev(): void {\n this.active.set((this.active() - 1 + this.slides().length) % this.slides().length);\n }\n /** @internal */\n protected next(): void {\n this.active.set((this.active() + 1) % this.slides().length);\n }\n\n /** @internal */\n protected slideId(i: number): string {\n return `cds-carousel-${this.instance}-slide-${i}`;\n }\n\n /**\n * WAI-ARIA-Tabs-Tastatur auf der Dot-Leiste (horizontal, automatische Aktivierung):\n * ←/→ mit Umlauf, Home/End an die Enden; der Fokus wird mitgeführt (Roving Tabindex).\n * Indexberechnung in `../shared/dots-keyboard.ts` (identisch mit LogoCarousel).\n *\n * @internal\n */\n protected onDotsKeydown(event: KeyboardEvent): void {\n const next = nextDotsIndex(this.slides().length, this.active(), event.key);\n if (next === null) return;\n event.preventDefault();\n this.active.set(next);\n this.host.nativeElement.querySelectorAll<HTMLElement>('.img-dot')[next]?.focus();\n }\n\n /** @internal */\n protected readonly placeholder =\n \"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='800'%20height='450'%3E%3Crect%20width='800'%20height='450'%20fill='%23E8EDED'/%3E%3Ctext%20x='400'%20y='225'%20font-family='sans-serif'%20font-size='24'%20fill='%236E8585'%20text-anchor='middle'%20dominant-baseline='middle'%3EBild%3C/text%3E%3C/svg%3E\";\n}\n","import {\n afterNextRender,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroComputerDesktop, heroMoon, heroSun } from '../icons/cds-icons';\nimport { CDS_THEME_ICON, CDS_THEME_LABEL, cdsThemeModes, ThemeModeService } from './theme-mode';\n\n/**\n * Theme-Segment — Segment-Switch für das Farbthema. Vorgesehener Einsatz: als\n * eigenständiges Element zum Hovern. Ist daher IMMER responsiv (unter 640px\n * Icon-only) und IMMER animiert (Aktiv-Markierung gleitet als Thumb) — beides\n * fest, nicht konfigurierbar. Icon + Textlabel stehen immer nebeneinander.\n *\n * Einzige Konfiguration: `showSystem` (tri Hell/Dunkel/System vs. binär Hell/Dunkel).\n *\n * Baut auf den CSS-Kern-Klassen `.theme-bar`/`.tbtn` auf. Jeder Button trägt ein\n * `aria-label`, ist also auch im Icon-only-Modus benannt. Der Thumb wird per\n * getBoundingClientRect an die aktive Zelle gesetzt (ResizeObserver misst bei\n * Breakpoint-/Font-Änderungen nach).\n */\n@Component({\n selector: 'cds-theme-segment',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgIcon],\n viewProviders: [provideIcons({ heroSun, heroMoon, heroComputerDesktop })],\n template: `\n <div #bar class=\"theme-bar is-responsive is-animated\" role=\"group\" aria-label=\"Farbthema\">\n <span #thumb class=\"cds-thumb\" aria-hidden=\"true\"></span>\n @for (m of order(); track m) {\n <button\n #opt\n class=\"tbtn\"\n type=\"button\"\n [class.active]=\"svc.mode() === m\"\n [attr.aria-pressed]=\"svc.mode() === m\"\n [attr.aria-label]=\"label[m]\"\n (click)=\"svc.set(m)\"\n >\n <ng-icon [name]=\"icon[m]\" size=\"14px\" aria-hidden=\"true\" />\n <span class=\"tbtn__label\">{{ label[m] }}</span>\n </button>\n }\n </div>\n `,\n styles: `\n .theme-bar {\n position: static;\n display: inline-flex;\n }\n .tbtn {\n display: inline-flex;\n align-items: center;\n gap: var(--s1);\n }\n /* Responsive: unter 640px Label ausblenden → Icon-only. Das aria-label bleibt. */\n @media (max-width: 640px) {\n .theme-bar.is-responsive .tbtn__label {\n display: none;\n }\n }\n /* Animiert: ein Thumb gleitet hinter den Buttons. */\n .theme-bar.is-animated {\n position: relative;\n inset: auto;\n }\n .theme-bar.is-animated .cds-thumb {\n position: absolute;\n top: 0;\n left: 0;\n border-radius: var(--r-full);\n /* wie .tbtn.active im Kern (--co-700): weißer Text darauf erfüllt WCAG AA;\n --co-500 wäre zu hell (nur ~2,3:1). */\n background: var(--co-700);\n transition:\n transform var(--m-fast),\n width var(--m-fast),\n height var(--m-fast);\n pointer-events: none;\n z-index: 0;\n }\n .theme-bar.is-animated .tbtn {\n position: relative;\n z-index: 1;\n }\n .theme-bar.is-animated .tbtn.active {\n background: transparent;\n }\n `,\n})\nexport class ThemeSegmentComponent {\n /** true → Hell/Dunkel/System (tri), false → nur Hell/Dunkel (binär). */\n readonly showSystem = input(true);\n\n /** @internal */\n protected readonly svc = inject(ThemeModeService);\n /** @internal */\n protected readonly icon = CDS_THEME_ICON;\n /** @internal */\n protected readonly label = CDS_THEME_LABEL;\n\n /** @internal */\n protected readonly order = computed(() => cdsThemeModes(this.showSystem()));\n\n private readonly bar = viewChild<ElementRef<HTMLElement>>('bar');\n private readonly thumb = viewChild<ElementRef<HTMLElement>>('thumb');\n private readonly opts = viewChildren<ElementRef<HTMLButtonElement>>('opt');\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n // Thumb nach jedem Render neu setzen (Modus/Optionen als Abhängigkeiten lesen).\n // In Phasen aufgeteilt (WP5 §5.4): erst LESEN (earlyRead), dann SCHREIBEN (write) —\n // das vermeidet Layout-Thrashing (Read/Write im selben Durchlauf), das\n // afterRenderEffect mit seinen Phasen genau dafür anbietet.\n afterRenderEffect({\n earlyRead: () => {\n this.svc.mode();\n this.order();\n return this.measureThumb();\n },\n write: (rect) => this.applyThumb(rect()),\n });\n\n // Layout-Änderungen ohne Signal (Breakpoint, Font-Load) → Thumb nachmessen. Der\n // ResizeObserver-Callback läuft außerhalb von Angulars Render-Zyklus — dafür gibt\n // es keine Phasen-API; Messen+Schreiben bleibt hier in einem Zug (unvermeidlich,\n // da kein afterRenderEffect-Durchlauf beteiligt ist).\n afterNextRender(() => {\n const bar = this.bar()?.nativeElement;\n if (!bar) return;\n const ro = new ResizeObserver(() => this.applyThumb(this.measureThumb()));\n ro.observe(bar);\n this.destroyRef.onDestroy(() => ro.disconnect());\n });\n }\n\n /** Thumb-Geometrie relativ zur Leiste messen (reines Lesen, keine Schreibzugriffe). */\n private measureThumb(): { width: number; height: number; x: number; y: number } | null {\n const thumb = this.thumb()?.nativeElement;\n const bar = this.bar()?.nativeElement;\n const el = this.opts()[this.order().indexOf(this.svc.mode())]?.nativeElement;\n if (!thumb || !bar || !el) return null;\n\n const barRect = bar.getBoundingClientRect();\n const r = el.getBoundingClientRect();\n const cs = getComputedStyle(bar);\n const bx = parseFloat(cs.borderLeftWidth) || 0;\n const by = parseFloat(cs.borderTopWidth) || 0;\n\n return {\n width: r.width,\n height: r.height,\n x: r.left - barRect.left - bx,\n y: r.top - barRect.top - by,\n };\n }\n\n /** Gemessene Geometrie auf den Thumb schreiben (reines Schreiben, kein Lesen). */\n private applyThumb(rect: { width: number; height: number; x: number; y: number } | null): void {\n const thumb = this.thumb()?.nativeElement;\n if (!thumb || !rect) return;\n thumb.style.width = `${rect.width}px`;\n thumb.style.height = `${rect.height}px`;\n thumb.style.transform = `translate(${rect.x}px, ${rect.y}px)`;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { type CdsSelectOption, SelectComponent } from '../select/select.component';\nimport { CDS_THEME_LABEL, cdsThemeModes, type CdsThemeMode, ThemeModeService } from './theme-mode';\n\n/**\n * Theme-Dropdown — Theme-Umschalter auf Basis unseres Custom Select (cds-select):\n * gestylte Einzelauswahl mit Listbox-Popup und Häkchen. Vorgesehener Einsatz: nur in\n * den Einstellungen (Settings), NICHT als persistentes Element auf allen Seiten.\n *\n * `showSystem` schaltet zwischen Hell/Dunkel/System und binär Hell/Dunkel.\n */\n@Component({\n selector: 'cds-theme-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SelectComponent],\n template: `\n <cds-select\n label=\"Farbthema\"\n [options]=\"options()\"\n [value]=\"svc.mode()\"\n (valueChange)=\"onChange($event)\"\n />\n `,\n})\nexport class ThemeSelectComponent {\n /** true → Hell/Dunkel/System, false → nur Hell/Dunkel. */\n readonly showSystem = input(true);\n\n /** @internal */\n protected readonly svc = inject(ThemeModeService);\n /** @internal */\n protected readonly options = computed<CdsSelectOption[]>(() =>\n cdsThemeModes(this.showSystem()).map((m) => ({ value: m, label: CDS_THEME_LABEL[m] })),\n );\n\n /** @internal */\n protected onChange(value: string | undefined): void {\n if (value) this.svc.set(value as CdsThemeMode);\n }\n}\n","// Bereichs-Glyphen + Zitat-Icon — VERBATIM übernommen aus icons/icons.js (Quelle der\n// Wahrheit, generiert aus icons/source/*.svg). Wird NICHT manuell editiert: bei Icon-Änderungen\n// neu aus icons/icons.js übernehmen. So konsumieren die Angular-Komponenten dieselben Glyphen\n// wie docs/index.html, statt eigene zu erfinden.\nimport type { CdsArea } from './area';\n\nexport interface CdsIcon {\n viewBox: string;\n /** Innerer SVG-Markup (Pfade), fill=currentColor → nimmt die Bereichsfarbe an. */\n body: string;\n}\n\n/** Bereichs-Glyphe je Markenbereich (co/ki/es/wo). */\nexport const CDS_AREA_ICONS: Record<CdsArea, CdsIcon> = {\n // co-building — Corporate / Unternehmen – Bereichs-Glyphe (Gebäude)\n co: {\n viewBox: '0 0 24 24',\n body: '<path d=\"M18.1513 4.54221C18.4965 4.54624 18.773 4.82931 18.769 5.17446C18.765 5.51348 18.4921 5.78462 18.1553 5.79038L17.9998 19.1L18.5877 19.1069C18.9328 19.1109 19.2094 19.394 19.2053 19.7391C19.2012 20.0842 18.9182 20.3608 18.5731 20.3568L5.22927 20.201C4.8842 20.1969 4.60772 19.9137 4.61162 19.5687C4.61565 19.2235 4.89872 18.947 5.24387 18.951L5.83172 18.9579L5.98717 5.64827C5.65081 5.63442 5.38409 5.35706 5.38805 5.01818C5.39208 4.67308 5.67522 4.39657 6.0203 4.40052L18.1513 4.54221ZM13.7415 16.9457C13.7433 16.7887 13.6176 16.6592 13.4607 16.6572L10.4277 16.6218C10.2706 16.6199 10.141 16.7465 10.1392 16.9036L10.1146 19.0079L13.7169 19.05L13.7415 16.9457ZM10.7804 12.3424C11.1256 12.3464 11.4021 12.6295 11.3981 12.9747C11.394 13.3198 11.111 13.5963 10.7658 13.5923L9.55301 13.5781C9.2079 13.5741 8.93132 13.291 8.93535 12.9459C8.9394 12.6008 9.2225 12.3242 9.56761 12.3282L10.7804 12.3424ZM14.4198 12.3849C14.765 12.3889 15.0415 12.672 15.0375 13.0172C15.0334 13.3623 14.7504 13.6388 14.4052 13.6348L13.1924 13.6207C12.8473 13.6166 12.5707 13.3335 12.5748 12.9884C12.5788 12.6433 12.8619 12.3667 13.207 12.3707L14.4198 12.3849ZM10.8088 9.9158C11.1538 9.91983 11.4302 10.2031 11.4264 10.5481C11.4224 10.8932 11.1393 11.1698 10.7942 11.1657L9.58135 11.1516C9.23624 11.1475 8.95966 10.8644 8.96369 10.5193C8.96793 10.1744 9.25097 9.89766 9.59595 9.90164L10.8088 9.9158ZM14.4482 9.95831C14.7932 9.96234 15.0696 10.2456 15.0658 10.5906C15.0618 10.9357 14.7787 11.2123 14.4336 11.2082L13.2207 11.1941C12.8756 11.19 12.5991 10.9069 12.6031 10.5618C12.6073 10.2168 12.8903 9.94013 13.2353 9.94415L14.4482 9.95831ZM10.8371 7.49019C11.1822 7.49422 11.4588 7.77729 11.4547 8.12245C11.4506 8.4675 11.1676 8.74413 10.8225 8.7401L9.60968 8.72594C9.26464 8.72186 8.98811 8.43871 8.99202 8.09368C8.99605 7.74856 9.27916 7.47204 9.62428 7.47602L10.8371 7.49019ZM14.4765 7.53269C14.8216 7.53673 15.0982 7.8198 15.0941 8.16495C15.09 8.51001 14.807 8.78664 14.4619 8.78261L13.2491 8.76844C12.904 8.7644 12.6275 8.48124 12.6314 8.13619C12.6355 7.79104 12.9185 7.51451 13.2637 7.51853L14.4765 7.53269ZM14.9668 19.0646L16.7499 19.0854L16.9054 5.77774L7.23706 5.66482L7.08164 18.9725L8.86472 18.9933L8.8893 16.889C8.89919 16.0416 9.59489 15.362 10.4423 15.3719L13.4753 15.4073C14.3225 15.4174 15.0013 16.113 14.9914 16.9603L14.9668 19.0646Z\" fill=\"currentColor\"/>',\n },\n // ki-bot — Angewandte KI – Bereichs-Glyphe (Tablet/Bot)\n ki: {\n viewBox: '0 0 24 24',\n body: '<path d=\"M18.1682 10.4063C18.1682 9.64701 17.5524 9.03148 16.7932 9.03126H7.20728C6.44789 9.03126 5.83228 9.64687 5.83228 10.4063V18.25C5.83228 19.0094 6.44788 19.625 7.20728 19.625H16.7932C17.5524 19.6248 18.1682 19.0093 18.1682 18.25V10.4063ZM19.4182 18.25C19.4182 19.6996 18.2428 20.8748 16.7932 20.875H7.20728C5.75753 20.875 4.58228 19.6998 4.58228 18.25V10.4063C4.58228 8.95651 5.75753 7.78126 7.20728 7.78126H16.7932C18.2428 7.78148 19.4182 8.95665 19.4182 10.4063V18.25Z\" fill=\"currentColor\"/><path d=\"M12.4325 5.0625C12.4325 4.6828 12.1247 4.375 11.745 4.375C11.3653 4.375 11.0575 4.6828 11.0575 5.0625C11.0575 5.4422 11.3653 5.75 11.745 5.75C12.1247 5.75 12.4325 5.4422 12.4325 5.0625ZM13.6825 5.0625C13.6825 6.13255 12.815 7 11.745 7C10.6749 7 9.80746 6.13255 9.80746 5.0625C9.80746 3.99245 10.6749 3.125 11.745 3.125C12.815 3.125 13.6825 3.99245 13.6825 5.0625Z\" fill=\"currentColor\"/><path d=\"M9.31253 12.8539C9.31253 12.4742 9.00473 12.1664 8.62503 12.1664C8.24533 12.1664 7.93753 12.4742 7.93753 12.8539C7.93753 13.2336 8.24533 13.5414 8.62503 13.5414C9.00473 13.5414 9.31253 13.2336 9.31253 12.8539ZM10.5625 12.8539C10.5625 13.9239 9.69508 14.7914 8.62503 14.7914C7.55498 14.7914 6.68753 13.9239 6.68753 12.8539C6.68753 11.7838 7.55498 10.9164 8.62503 10.9164C9.69508 10.9164 10.5625 11.7838 10.5625 12.8539Z\" fill=\"currentColor\"/><path d=\"M16.0625 12.8539C16.0625 12.4742 15.7547 12.1664 15.375 12.1664C14.9953 12.1664 14.6875 12.4742 14.6875 12.8539C14.6875 13.2336 14.9953 13.5414 15.375 13.5414C15.7547 13.5414 16.0625 13.2336 16.0625 12.8539ZM17.3125 12.8539C17.3125 13.9239 16.4451 14.7914 15.375 14.7914C14.305 14.7914 13.4375 13.9239 13.4375 12.8539C13.4375 11.7838 14.305 10.9164 15.375 10.9164C16.4451 10.9164 17.3125 11.7838 17.3125 12.8539Z\" fill=\"currentColor\"/><path d=\"M8.25003 16.125C8.25003 16.5392 7.91424 16.875 7.50003 16.875C7.08582 16.875 6.75003 16.5392 6.75003 16.125C6.75003 15.7108 7.08582 15.375 7.50003 15.375C7.91424 15.375 8.25003 15.7108 8.25003 16.125Z\" fill=\"currentColor\"/><path d=\"M10.3125 17.4C10.3125 17.8142 9.97674 18.15 9.56253 18.15C9.14832 18.15 8.81253 17.8142 8.81253 17.4C8.81253 16.9858 9.14832 16.65 9.56253 16.65C9.97674 16.65 10.3125 16.9858 10.3125 17.4Z\" fill=\"currentColor\"/><path d=\"M15.1875 17.4C15.1875 17.8142 14.8517 18.15 14.4375 18.15C14.0233 18.15 13.6875 17.8142 13.6875 17.4C13.6875 16.9858 14.0233 16.65 14.4375 16.65C14.8517 16.65 15.1875 16.9858 15.1875 17.4Z\" fill=\"currentColor\"/><path d=\"M12.75 17.55C12.75 17.9642 12.4142 18.3 12 18.3C11.5858 18.3 11.25 17.9642 11.25 17.55C11.25 17.1358 11.5858 16.8 12 16.8C12.4142 16.8 12.75 17.1358 12.75 17.55Z\" fill=\"currentColor\"/><path d=\"M17.25 16.125C17.25 16.5392 16.9142 16.875 16.5 16.875C16.0858 16.875 15.75 16.5392 15.75 16.125C15.75 15.7108 16.0858 15.375 16.5 15.375C16.9142 15.375 17.25 15.7108 17.25 16.125Z\" fill=\"currentColor\"/><path d=\"M11.2108 8.30187V6.59484C11.2108 6.24966 11.4906 5.96984 11.8358 5.96984C12.181 5.96984 12.4608 6.24966 12.4608 6.59484V8.30187C12.4607 8.64699 12.1809 8.92687 11.8358 8.92687C11.4907 8.92687 11.2109 8.64699 11.2108 8.30187Z\" fill=\"currentColor\"/>',\n },\n // es-window-check — Effektive Software – Bereichs-Glyphe (Fenster + Check)\n es: {\n viewBox: '0 0 24 24',\n body: '<path d=\"M4.50018 9.27394C4.15501 9.27394 3.87518 8.99412 3.87518 8.64894C3.87518 8.30376 4.15501 8.02394 4.50018 8.02394H19.1808C19.526 8.02394 19.8058 8.30376 19.8058 8.64894C19.8058 8.99412 19.526 9.27394 19.1808 9.27394H4.50018Z\" fill=\"currentColor\"/><path d=\"M18.875 6.5C18.875 5.74061 18.2594 5.125 17.5 5.125H6.5C5.74061 5.125 5.125 5.74061 5.125 6.5V17.5C5.125 18.2594 5.74061 18.875 6.5 18.875H17.5C18.2594 18.875 18.875 18.2594 18.875 17.5V6.5ZM20.125 17.5C20.125 18.9497 18.9497 20.125 17.5 20.125H6.5C5.05025 20.125 3.875 18.9497 3.875 17.5V6.5C3.875 5.05025 5.05025 3.875 6.5 3.875H17.5C18.9497 3.875 20.125 5.05025 20.125 6.5V17.5Z\" fill=\"currentColor\"/><path d=\"M7.5 6.59999C7.5 7.0142 7.16421 7.34999 6.75 7.34999C6.33579 7.34999 6 7.0142 6 6.59999C6 6.18578 6.33579 5.84999 6.75 5.84999C7.16421 5.84999 7.5 6.18578 7.5 6.59999Z\" fill=\"currentColor\"/><path d=\"M9.89996 6.59999C9.89996 7.0142 9.56418 7.34999 9.14996 7.34999C8.73575 7.34999 8.39996 7.0142 8.39996 6.59999C8.39996 6.18578 8.73575 5.84999 9.14996 5.84999C9.56418 5.84999 9.89996 6.18578 9.89996 6.59999Z\" fill=\"currentColor\"/><path d=\"M12.2999 6.59999C12.2999 7.0142 11.9641 7.34999 11.5499 7.34999C11.1357 7.34999 10.7999 7.0142 10.7999 6.59999C10.7999 6.18578 11.1357 5.84999 11.5499 5.84999C11.9641 5.84999 12.2999 6.18578 12.2999 6.59999Z\" fill=\"currentColor\"/><path d=\"M15.4175 10.892C15.6768 10.6644 16.0716 10.6904 16.2993 10.9496C16.5269 11.2089 16.5019 11.6037 16.2427 11.8314L11.5044 15.9945C10.9598 16.4731 10.1372 16.4466 9.62454 15.934L7.40872 13.7182C7.16508 13.4741 7.16486 13.0783 7.40872 12.8344C7.6528 12.5903 8.04941 12.5903 8.29349 12.8344L10.5083 15.0502C10.5548 15.0967 10.6297 15.0993 10.6792 15.0561L15.4175 10.892Z\" fill=\"currentColor\"/>',\n },\n // wo-network — Wirksame Organisationen – Bereichs-Glyphe (Netzwerk)\n wo: {\n viewBox: '0 0 24 24',\n body: '<path d=\"M13.4753 7.64954C13.4751 6.83509 12.8143 6.17493 11.9998 6.17493C11.1855 6.17515 10.5254 6.83523 10.5251 7.64954C10.5251 8.46403 11.1853 9.1249 11.9998 9.12512C12.8144 9.12512 13.4753 8.46417 13.4753 7.64954ZM14.7253 7.64954C14.7253 9.15452 13.5047 10.3751 11.9998 10.3751C10.495 10.3749 9.27515 9.15439 9.27515 7.64954C9.27537 6.14488 10.4951 4.92515 11.9998 4.92493C13.5046 4.92493 14.7251 6.14474 14.7253 7.64954Z\" fill=\"currentColor\"/><path d=\"M8.0752 16.3497C8.07497 15.5352 7.4141 14.875 6.59961 14.875C5.7853 14.8753 5.12522 15.5354 5.125 16.3497C5.125 17.1641 5.78517 17.825 6.59961 17.8252C7.41424 17.8252 8.0752 17.1643 8.0752 16.3497ZM9.3252 16.3497C9.3252 17.8546 8.1046 19.0752 6.59961 19.0752C5.09481 19.075 3.875 17.8545 3.875 16.3497C3.87522 14.845 5.09495 13.6253 6.59961 13.625C8.10446 13.625 9.32497 14.8449 9.3252 16.3497Z\" fill=\"currentColor\"/><path d=\"M18.8753 16.3497C18.8751 15.5352 18.2142 14.875 17.3997 14.875C16.5854 14.8753 15.9253 15.5354 15.9251 16.3497C15.9251 17.1641 16.5853 17.825 17.3997 17.8252C18.2144 17.8252 18.8753 17.1643 18.8753 16.3497ZM20.1253 16.3497C20.1253 17.8546 18.9047 19.0752 17.3997 19.0752C15.8949 19.075 14.6751 17.8545 14.6751 16.3497C14.6753 14.845 15.8951 13.6253 17.3997 13.625C18.9046 13.625 20.1251 14.8449 20.1253 16.3497Z\" fill=\"currentColor\"/><path d=\"M12.0005 9.75L12.4419 10.1924L7.79251 14.8418L7.35013 14.4004L6.90775 13.958L11.5581 9.30762L12.0005 9.75Z\" fill=\"currentColor\"/><path d=\"M12.0005 9.75L11.5583 10.1924L16.2078 14.8418L16.6501 14.4004L17.0925 13.958L12.4421 9.30762L12.0005 9.75Z\" fill=\"currentColor\"/><path d=\"M8.85065 16.9751V15.7251L15.4503 15.7251V16.9751L8.85065 16.9751Z\" fill=\"currentColor\"/>',\n },\n};\n\n// ui-quote — Zitatzeichen (Team-Stimme): Zitat-Glyphe für Testimonials (Bereich tönt nur den Akzent).\nexport const CDS_QUOTE_ICON: CdsIcon = {\n viewBox: '0 0 24 24',\n body: '<path d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\"/>',\n};\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport type { CdsArea } from '../area';\nimport { CDS_AREA_ICONS } from '../icons';\n\n/**\n * Card — Wrapper um `.card` aus css/components.css → „Cards“.\n *\n * Die Karte rendert `<article class=\"card\">` und ruht damit flach mit Rahmen. Das folgt der\n * Konvention „Elevation = Interaktivität“: Schatten trägt eine Karte nur, wenn die Karte selbst\n * der klickbare Bereich ist. Hier liegt die Interaktion in der Footer-Aktion, nicht in der Fläche.\n * `.card-elevated` wirkt im CSS ausschließlich auf `a.card-elevated`; eine Link-Karten-Variante\n * (`<a>` mit Ziel statt `<article>` mit Button) ist deshalb eine eigene Komponente/Variante.\n *\n * Bildet die im CSS vorgesehene Struktur ab: .card-media (bereichsgefärbt via\n * [data-area]) mit der echten Bereichs-Glyphe, .card-body mit .card-eyebrow /\n * .card-title / .card-text und ein optionales .card-footer mit einer Text-Aktion.\n *\n * Alle Textteile sind optional (leer = ausgeblendet); zusätzlich nimmt `.card-body`\n * beliebigen projizierten Inhalt via `<ng-content>` auf — so eignet sich die Karte\n * auch für freie Listen-/Detail-Inhalte in SPAs, nicht nur die Marketing-Struktur.\n * Die Footer-Aktion meldet Klicks über `actionClick`.\n */\n@Component({\n selector: 'cds-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <article class=\"card\" [attr.data-area]=\"area() || null\">\n @if (showMedia()) {\n <div class=\"card-media\" [innerHTML]=\"mediaSvg()\"></div>\n }\n <div class=\"card-body\">\n @if (eyebrow()) {\n <p class=\"card-eyebrow\">{{ eyebrow() }}</p>\n }\n @if (title()) {\n <h3 class=\"card-title\">\n <span>{{ title() }}</span>\n </h3>\n }\n @if (text()) {\n <p class=\"card-text\">{{ text() }}</p>\n }\n <ng-content></ng-content>\n </div>\n @if (actionLabel()) {\n <div class=\"card-footer\">\n <button [class]=\"actionClasses()\" type=\"button\" (click)=\"actionClick.emit()\">\n {{ actionLabel() }}\n </button>\n </div>\n }\n </article>\n `,\n})\nexport class CardComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Kicker-Text oberhalb des Titels (leer = keine Eyebrow-Zeile). */\n readonly eyebrow = input('');\n /** Kartentitel. */\n readonly title = input.required<string>();\n /** Anreißer-/Beschreibungstext der Karte. */\n readonly text = input.required<string>();\n /** Markenbereich → data-area (färbt Media-Glyphe + Eyebrow). */\n readonly area = input<CdsArea>();\n /** Bereichsgefärbte Medienfläche mit Bereichs-Glyphe anzeigen. */\n readonly showMedia = input(true);\n /** Kompakte Text-Aktion im Footer (leer = kein Footer). */\n readonly actionLabel = input('');\n\n /** Klick auf die Footer-Aktion. */\n readonly actionClick = output<void>();\n\n /** @internal */\n protected readonly actionClasses = computed(\n // .btn-sm wie in docs/index.html (Card-Footer nutzt kompakte Buttons).\n () => `btn btn-text btn-sm btn-${this.area() ?? 'co'}`,\n );\n\n /**\n * Echte Bereichs-Glyphe aus icons/icons.js, als ico-48-SVG in die Media-Fläche.\n *\n * @internal\n */\n protected readonly mediaSvg = computed<SafeHtml>(() => {\n const icon = CDS_AREA_ICONS[this.area() ?? 'co'];\n return this.sanitizer.bypassSecurityTrustHtml(\n `<svg class=\"ico-48\" viewBox=\"${icon.viewBox}\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">${icon.body}</svg>`,\n );\n });\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * StatCard — Wrapper um `.card-stat` aus css/components.css → „Stat Card“.\n *\n * Flache, statische Kennzahlen-Karte mit bereichsgefärbtem Top-Akzent (data-area),\n * großem Wert (.card-stat-value), Label (.card-stat-label) und optionalem\n * Trend-Pill (.card-stat-trend.up/.down) inkl. Richtungs-Pfeil — wie docs/index.html.\n */\n@Component({\n selector: 'cds-stat-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"card-stat\" [attr.data-area]=\"area() || null\">\n <p class=\"card-stat-value\">{{ value() }}</p>\n <p class=\"card-stat-label\">{{ label() }}</p>\n @if (trend()) {\n <span\n class=\"card-stat-trend\"\n [class.up]=\"trend() === 'up'\"\n [class.down]=\"trend() === 'down'\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path [attr.d]=\"trend() === 'up' ? 'M7 14l5-5 5 5z' : 'M7 10l5 5 5-5z'\" />\n </svg>\n {{ trendText() }}\n </span>\n }\n </div>\n `,\n})\nexport class StatCardComponent {\n /** Anzeigewert der Kennzahl. */\n readonly value = input.required<string>();\n /** Beschriftung der Kennzahl. */\n readonly label = input.required<string>();\n /** Markenbereich → data-area (Top-Akzent + Wertfarbe). */\n readonly area = input<CdsArea>('co');\n /** Trendrichtung → .card-stat-trend.up / .down (leer = kein Pill). */\n readonly trend = input<'up' | 'down'>();\n /** Text neben dem Trend-Pfeil (nur sichtbar, wenn `trend` gesetzt ist). */\n readonly trendText = input('');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/** Eine Kennzahl im Stat-Strip. */\nexport interface CdsFlatStat {\n area?: CdsArea;\n value: string;\n label: string;\n}\n\n/**\n * StatStrip — Wrapper um `.card-stat-strip` + `.card-stat-flat` aus\n * css/components.css → „Stat-Strip“. Flacher Bandstreifen (auto-fit-Grid auf\n * --n-50-Grund) mit zentrierten Kennzahlen ohne Rahmen/Schatten; Wert je\n * Bereich getönt via [data-area]. Genau wie docs/index.html.\n */\n@Component({\n selector: 'cds-stat-strip',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"card-stat-strip\" [style.border-radius]=\"rounded() ? 'var(--r-lg)' : null\">\n @for (stat of stats(); track stat) {\n <div class=\"card-stat-flat\" [attr.data-area]=\"stat.area || null\">\n <p class=\"card-stat-flat-value\">{{ stat.value }}</p>\n <p class=\"card-stat-flat-label\">{{ stat.label }}</p>\n </div>\n }\n </div>\n `,\n})\nexport class StatStripComponent {\n /** Kennzahlen des Streifens. */\n readonly stats = input.required<CdsFlatStat[]>();\n /** Abgerundete Ecken (--r-lg) wie in der Doku-Verwendung. */\n readonly rounded = input(true);\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport type { CdsArea } from '../area';\nimport { CDS_QUOTE_ICON } from '../icons';\n\n/**\n * Blockquote — Wrapper um `.bq` aus css/components.css → „Blockquote“.\n *\n * Bereichsgefärbtes Zitat mit linker Akzentleiste und getöntem Grund (data-area),\n * Quote-Icon (ui-quote, dieselbe Glyphe wie docs/index.html), Zitat und\n * Caption (Name/Rolle). Nur bestehende Klassen.\n *\n * **Nicht `cds-article-pullquote` (`.article-pullquote`).** Dieses Bauteil ist\n * ein eigenständiges Zitat: eine dritte, benannte Person (`name`/`roleLabel` sind\n * Pflicht), mit getönter Akzent-Box und Quote-Icon. `cds-article-pullquote` ist\n * dagegen ein typografischer Akzent im eigenen Lauftext eines Wissensbeitrags,\n * ohne Attribution, ohne Box, ohne Icon — der Autor zitiert dort einen Satz aus\n * dem eigenen Text, nicht eine dritte Stimme. Volle Abgrenzung samt Tabelle in\n * dessen Klassendoku (`article-pullquote.component.ts`).\n */\n@Component({\n selector: 'cds-blockquote',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <figure class=\"bq\" [attr.data-area]=\"area() || null\">\n <svg\n class=\"bq-icon\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n focusable=\"false\"\n [innerHTML]=\"quoteIcon()\"\n ></svg>\n <blockquote>{{ quote() }}</blockquote>\n @if (name() || roleLabel()) {\n <figcaption class=\"bq-caption\">\n @if (name()) {\n <span class=\"bq-name\">{{ name() }}</span>\n }\n @if (roleLabel()) {\n <span class=\"bq-role\">{{ roleLabel() }}</span>\n }\n </figcaption>\n }\n </figure>\n `,\n})\nexport class BlockquoteComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Zitattext. */\n readonly quote = input.required<string>();\n /** Name der zitierten Person. */\n readonly name = input.required<string>();\n /** Rolle/Funktion der zitierten Person (leer = keine Caption-Zeile dafür). */\n readonly roleLabel = input('');\n /** Markenbereich → data-area (Akzentleiste + getönter Grund). */\n readonly area = input<CdsArea>('co');\n\n /**\n * Zitat-Icon aus der zentralen Icon-Registry (icons.ts) statt dreifach\n * dupliziertem SVG-Pfad in Blockquote/Testimonial/TeamVoice.\n *\n * @internal\n */\n protected readonly quoteIcon = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(CDS_QUOTE_ICON.body),\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n signal,\n} from '@angular/core';\n\n/**\n * CodeBlock — Wrapper um `.cb-wrap` aus css/components.css → „Code-Block“.\n *\n * Header mit Sprach-Label (.cb-lang) und optionalem Kopier-Button (.cb-copy),\n * darunter der Code in `pre.cb-body` (white-space:pre, horizontal scrollbar).\n * Optionale Terminal-Variante (.cb-terminal). Syntax-Highlighting-Spans\n * (.k/.v/.s/…) werden hier bewusst nicht gesetzt — der Code bleibt Klartext.\n *\n * A11y (siehe docs/komponenten/code-block-verwendung.mdx, Abschnitt „Barrierefreiheit“):\n * - `<code>` im `<pre>` als semantisches Grundgerüst, damit Screenreader den Inhalt\n * als „Code“ ankündigen. `.cb-body code{font:inherit}` in components.css fängt den\n * Browser-Default (`code{font-family:monospace}`) ab, sonst würde das verschachtelte\n * `<code>` eine andere Schrift als der Rest des Blocks zeigen.\n * - `tabindex=\"0\"` auf `pre.cb-body`, weil der Block bei langen Zeilen horizontal\n * scrollt und sonst per Tastatur nicht erreichbar wäre.\n * - `aria-label=\"Code kopieren\"` auf dem Kopier-Button ist **stabil** und wechselt nach\n * dem Klick nicht mehr. Ein Bedienelement trägt den Namen seiner Funktion, nicht den\n * seines letzten Ereignisses — sonst findet man den Button per Sprachsteuerung danach\n * nicht mehr, und eine Elementliste zeigt einen Button „Code kopiert“, der tatsächlich\n * kopiert. Die Erfolgsmeldung läuft stattdessen über eine eigene, visuell versteckte\n * Live-Region (`.sr-only` + `role=\"status\"`, Muster aus `snackbar.component.ts`), die\n * von Anfang an im DOM steht und nur ihren Textinhalt wechselt: `aria-live` beobachtet\n * Inhalts-, keine Attribut-Änderungen, und eine Region, die erst beim Klick entsteht,\n * kündigt bei vielen Screenreadern nichts an. Zusätzlich verhalten sich Live-Regionen\n * auf dem gerade fokussierten Element (hier: der Button nach dem Klick) uneinheitlich.\n * Der sichtbare Button-Text wechselt weiterhin „Kopieren“ ↔ „Kopiert!“, ist aber durch\n * `aria-label` für die Namensberechnung überschrieben und rein optisches Feedback.\n */\n@Component({\n selector: 'cds-code-block',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div [class]=\"wrapClasses()\">\n <div class=\"cb-header\">\n <span class=\"cb-lang\">{{ lang() }}</span>\n @if (copyable()) {\n <button class=\"cb-copy\" type=\"button\" aria-label=\"Code kopieren\" (click)=\"copy()\">\n {{ copied() ? 'Kopiert!' : 'Kopieren' }}\n </button>\n <!-- Steht von Anfang an im DOM (nicht erst ab dem ersten Klick erzeugt), sonst\n kündigen viele Screenreader die erste Statusänderung gar nicht an. -->\n <span class=\"sr-only\" role=\"status\" aria-live=\"polite\">{{ copyStatus() }}</span>\n }\n </div>\n <pre class=\"cb-body\" tabindex=\"0\"><code>{{ code() }}</code></pre>\n </div>\n `,\n})\nexport class CodeBlockComponent {\n /** Sprach-Label im Header (.cb-lang), rein informativ, ohne Syntax-Highlighting. */\n readonly lang = input('HTML');\n /** Anzuzeigender Code (Klartext, `pre`-formatiert). */\n readonly code = input.required<string>();\n /** Terminal-Optik → .cb-terminal. */\n readonly terminal = input(false);\n /** Kopier-Button anzeigen (.cb-copy). */\n readonly copyable = input(true);\n\n /** @internal */\n protected readonly copied = signal(false);\n\n private readonly destroyRef = inject(DestroyRef);\n /** Reset-Timer des „Kopiert!“-Feedbacks; gemerkt, um ihn zu clearen. */\n private resetTimer?: ReturnType<typeof setTimeout>;\n\n constructor() {\n // Verhindert, dass der Reset-Callback nach dem Zerstören der Komponente feuert.\n this.destroyRef.onDestroy(() => this.clearResetTimer());\n }\n\n /** @internal */\n protected readonly wrapClasses = computed(() =>\n this.terminal() ? 'cb-wrap cb-terminal' : 'cb-wrap',\n );\n\n /**\n * Text der Live-Region (`role=\"status\"`) neben dem Button. Leer im Ruhezustand, damit\n * ein erneuter Klick nach Ablauf des Reset-Timers wieder von „“ auf „Code kopiert.“\n * wechselt und so erneut als Änderung erkannt und angekündigt wird.\n *\n * @internal\n */\n protected readonly copyStatus = computed(() => (this.copied() ? 'Code kopiert.' : ''));\n\n /** @internal */\n protected copy(): void {\n // Clipboard-API gibt es nur in sicheren Kontexten (https/localhost). Fehlt sie,\n // brechen wir sauber ab, statt über optional chaining still ins Leere zu laufen.\n if (!navigator.clipboard) return;\n navigator.clipboard\n .writeText(this.code())\n .then(() => {\n this.copied.set(true);\n // Vor dem erneuten Arm-en clearen → schnelle Wiederholklicks stapeln keine Timer.\n this.clearResetTimer();\n this.resetTimer = setTimeout(() => this.copied.set(false), 1500);\n })\n .catch(() => {\n /* Schreiben abgelehnt (z. B. fehlende Berechtigung) → kein Feedback. */\n });\n }\n\n private clearResetTimer(): void {\n if (this.resetTimer !== undefined) {\n clearTimeout(this.resetTimer);\n this.resetTimer = undefined;\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** Ein FAQ-Eintrag. */\nexport interface CdsFaqItem {\n /** Frage (Summary-Zeile). */\n q: string;\n /** Antworttext. */\n a: string;\n}\n\n/**\n * Faq — Wrapper um `.ep-faq` aus css/components.css → „FAQ-Accordion“.\n *\n * Nutzt natives `<details>/<summary>` (kein JS nötig): Auf-/Zuklappen, Tastatur\n * und Zugänglichkeit kommen vom Browser. Der Caret (.ep-faq-caret) dreht via\n * `details[open]`. Antwort in `.ep-faq-a`.\n */\n@Component({\n selector: 'cds-faq',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ep-faq\">\n @for (item of items(); track item) {\n <!-- Kein [open]-Binding: „standardmäßig zugeklappt“ ist der Default. Ein\n gebundenes [open]=\"false\" würde den nativen Toggle bei jedem Change-\n Detection-Lauf wieder zuklappen. -->\n <details>\n <summary>\n {{ item.q }}\n <svg\n class=\"ep-faq-caret\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n aria-hidden=\"true\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m19.5 8.25-7.5 7.5-7.5-7.5\" />\n </svg>\n </summary>\n <p class=\"ep-faq-a\">{{ item.a }}</p>\n </details>\n }\n </div>\n `,\n})\nexport class FaqComponent {\n /** Fragen-/Antworten-Liste des Akkordeons. */\n readonly items = input.required<CdsFaqItem[]>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n forwardRef,\n input,\n model,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { CdsArea } from '../area';\nimport { CvaBase } from '../shared/cva-base.directive';\n\n// Modulweiter Zähler → eindeutige Default-id (label/for, output/for, aria).\nlet uid = 0;\n\n/**\n * Skala (cds-scale) — Slider für GEORDNETE (ordinale) Kategorien, deren Labels die\n * Werte SIND (z. B. Niedrig < Mittel < Hoch, nie < selten < oft < immer).\n *\n * Basiert auf dem nativen <input type=\"range\">; min=0, max=labels.length-1, step=1\n * werden intern abgeleitet und NICHT exponiert. Der aktuelle Wert erscheint als\n * LABEL im <output> und wird Screenreadern über `aria-valuetext` als Text gemeldet\n * (nicht als Zahl) — das anerkannte APG-Muster für ordinale Slider. Die Skalenpunkte\n * zeigen alle Labels, exakt auf ihre Position ausgerichtet und bewusst OHNE\n * Reduktion (jedes Label ist eine wählbare Stufe).\n *\n * NUR für geordnete Kategorien. Ungeordnete/gleichrangige Optionen (ohne natürliche\n * Reihenfolge) gehören NICHT auf einen Slider → cds-radio-group oder cds-area-tabs.\n *\n * Als `ControlValueAccessor` direkt an Angular-Formulare anbindbar (`[(ngModel)]`,\n * `formControlName`); der Formularwert ist der Stufen-INDEX. Ohne Formular geht\n * `[(value)]` (valueChange via model()).\n */\n@Component({\n selector: 'cds-scale',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ScaleComponent), multi: true },\n ],\n template: `\n <div class=\"field-slider\">\n <div class=\"field-slider-header\">\n <label class=\"field-slider-label\" [attr.for]=\"scaleId()\">{{ label() }}</label>\n <output [class]=\"outputClasses()\" [attr.for]=\"scaleId()\" [id]=\"scaleId() + '-out'\">{{\n currentLabel()\n }}</output>\n </div>\n <input\n [class]=\"sliderClasses()\"\n type=\"range\"\n [id]=\"scaleId()\"\n min=\"0\"\n [max]=\"max()\"\n step=\"1\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.aria-valuetext]=\"currentLabel()\"\n [attr.aria-describedby]=\"helper() ? scaleId() + '-hint' : null\"\n (input)=\"onInput($event)\"\n (blur)=\"markTouched()\"\n />\n @if (labels().length) {\n <!-- Alle Skalen-Labels als CSS-Grid-Spalten (Breiten: tickColumns()), bei\n ausreichend Platz exakt auf ihre Thumb-Position ausgerichtet (Thumb 22px,\n siehe css/components.css); bei schmalen Breiten gibt das Grid lieber den\n Umbruch frei, statt Labels zu überlagern oder abzuschneiden (siehe dort).\n KEINE Reduktion — jedes Label ist wählbar, PFLICHT-Inhalt (kein Dropping\n wie bei cds-slider). Statt Absolut-Positionierung Normalfluss: mehrzeilige\n Labels (lange Kategorien bei schmaler Breite) wachsen den Container in der\n Höhe und schieben nachfolgenden Inhalt nach unten, statt ihn zu\n überlagern. Self-contained positioniert (der --tick-p-Kernmechanismus liegt\n noch auf dem main-PR; nach Merge kann das vereinfacht werden). -->\n <div\n class=\"field-slider-ticks\"\n aria-hidden=\"true\"\n style=\"position:relative;display:grid;padding:0;height:auto;align-items:start\"\n [style.grid-template-columns]=\"tickColumns()\"\n >\n @for (t of tickItems(); track $index) {\n <span [style]=\"t.style\">{{ t.label }}</span>\n }\n </div>\n }\n @if (helper()) {\n <span class=\"helper\" [id]=\"scaleId() + '-hint'\">{{ helper() }}</span>\n }\n </div>\n `,\n})\nexport class ScaleComponent extends CvaBase<number> {\n /** Feld-Label (die Frage), z. B. „Zufriedenheit“. */\n readonly label = input('Bewertung');\n /** Geordnete Skalen-Labels; sie sind zugleich die Werte. */\n readonly labels = input<string[]>(['Niedrig', 'Mittel', 'Hoch']);\n /** Gewählte Stufe als Index (0-basiert). Two-Way (`[(value)]`) UND Angular-Forms. */\n readonly value = model(1);\n /** Markenbereich → Thumb-/Output-Farbe. */\n readonly area = input<CdsArea>('co');\n readonly helper = input('');\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n readonly scaleId = input(`cds-scale-${++uid}`);\n\n constructor() {\n super();\n // Index in [0, max] halten: schrumpft labels() unter den aktuellen Index, bliebe\n // sonst ein veralteter Index stehen → leeres <output>/aria-valuetext. BEWUSST als\n // effect() belassen (WP5 §5.3 geprüft, nicht auf computed()/linkedSignal\n // umgestellt): `value` ist ein öffentliches, zweiseitig gebundenes model() — ein\n // Konsument kann es per `[(value)]` DIREKT setzen, am CVA-Pfad (writeValue/\n // normalizeValue) vorbei. computed()/linkedSignal erzeugen nur ein EIGENES,\n // abgeleitetes Signal; sie können nicht in ein FREMDES, bereits bestehendes\n // Writable-Signal zurückschreiben. Die Korrektur MUSS daher das model() selbst\n // mutieren, damit die Zwei-Wege-Bindung beim Konsumenten den korrigierten Wert\n // sieht (nicht nur die Anzeige) — das leistet nur effect().\n effect(() => {\n const max = this.max();\n const v = this.value();\n if (v > max) this.value.set(max);\n else if (v < 0) this.value.set(0);\n });\n }\n\n /** @internal */\n protected override normalizeValue(value: number): number {\n // Auf gültigen Stufen-Index [0, max] klemmen (max = labels().length - 1).\n const n = typeof value === 'number' && !Number.isNaN(value) ? Math.round(value) : 0;\n return Math.min(this.max(), Math.max(0, n));\n }\n /** @internal */\n protected override applyValue(value: number): void {\n this.value.set(value);\n }\n /** @internal */\n protected override applyDisabled(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n /**\n * Oberer Index (aus der Label-Zahl abgeleitet, nicht exponiert).\n *\n * @internal\n */\n protected readonly max = computed(() => Math.max(0, this.labels().length - 1));\n /** @internal */\n protected readonly currentLabel = computed(() => this.labels()[this.value()] ?? '');\n /** @internal */\n protected readonly sliderClasses = computed(() => `slider slider-${this.area()}`);\n /** @internal */\n protected readonly outputClasses = computed(() => `field-slider-output slider-${this.area()}`);\n\n /**\n * Spaltenbreiten für das Tick-Grid, mit `minmax()` statt fixer Breiten: Bei\n * ausreichend Platz treffen die Spaltenmitten exakt die Thumb-Positionen (wie\n * bisher); wird es zu schmal, um alle Labels einzeilig zu zeigen, gibt das Grid\n * Lesbarkeit den Vorrang vor exakter Ausrichtung (Entscheidung: Umbruch statt\n * Überlappung ODER Abschneiden).\n *\n * - Rand-Spalten: `minmax(halber Schritt + 11px, max-content)`. Der Mindestwert ist\n * wie zuvor die halbe „Schritt“-Distanz `(100% − 22px) / (n − 1)` zwischen zwei\n * benachbarten Thumb-Positionen plus 11px (halbe Thumb-Breite, siehe\n * css/components.css) — das kantenbündige Rand-Label beansprucht nur EINE\n * Richtung, die Gegenseite (vor der ersten/nach der letzten Thumb-Position) fließt\n * seiner Spalte zu. Bei breiten Containern übersteigt dieser Mindestwert die\n * natürliche (einzeilige) Breite des Labels — dann klemmt `minmax()` laut Spezifikation\n * auf den Mindestwert, die Spalte verhält sich also identisch zu vorher. Erst wenn\n * der Container schmaler wird als diese Mindestbreite, wächst die Spalte auf bis\n * zu `max-content`, das Label bleibt einzeilig, solange noch Platz da ist.\n * - Mitte-Spalten: `minmax(min-content, 1fr)` — nie schmäler als das breiteste\n * unteilbare Wort, sonst gleichberechtigt (1fr) um den verbleibenden Platz. Bei\n * schmalen Breiten kann die Spalte dadurch von ihrem rechnerischen Schritt\n * abweichen; die Spaltenmitte (und damit das zentrierte Label) liegt dann\n * geringfügig neben der Thumb-Position — akzeptierter Trade-off.\n *\n * Bei nur einem Label eine volle Spalte.\n *\n * @internal\n */\n protected readonly tickColumns = computed<string>(() => {\n const n = this.labels().length;\n if (n <= 1) return '1fr';\n const gaps = n - 1;\n const edge = `minmax(calc(11px + (100% - 22px) / ${gaps} / 2), max-content)`;\n if (n === 2) return `${edge} ${edge}`;\n const mid = `repeat(${n - 2}, minmax(min-content, 1fr))`;\n return `${edge} ${mid} ${edge}`;\n });\n\n /**\n * Alle Labels + Ausrichtung innerhalb ihrer Grid-Spalte (`tickColumns()`). Mitte-\n * Labels sind in ihrer Spalte zentriert — bei ausreichend Platz liegt die\n * Spaltenmitte exakt auf der Thumb-Position; bei sehr schmalen Breiten, wenn\n * `minmax(min-content, 1fr)` eine Spalte über ihren rechnerischen Schritt hinaus\n * wachsen lässt, kann die Mitte geringfügig davon abweichen (siehe\n * `tickColumns()`). Das ERSTE/LETZTE Label wird an der jeweiligen Kante verankert\n * (linksbündig bzw. rechtsbündig, 11px Innenabstand = halbe Thumb-Breite), damit\n * lange Kategorie-Labels an den Enden nicht über den Rand hinaus abgeschnitten\n * werden.\n *\n * Zusätzlich 4px `padding-inline` an der jeweils INNEREN Seite (Mitte-Labels:\n * beidseitig — bei zentriertem Text bleibt die Mitte dadurch unverschoben):\n * Mindestabstand zwischen benachbarten Labels. Ohne das können bei mittleren\n * Breiten (Spalte klemmt schon auf `minmax()`-Mindestwert, aber Label füllt sie\n * fast aus) die Text-Ink-Boxes zweier Nachbarn exakt aneinanderstoßen (0px Lücke,\n * liest sich als ein zusammengeschriebenes Wort), obwohl sie sich nicht\n * überlappen. `box-sizing:border-box` (s. u.) sorgt dafür, dass `min-content` in\n * `tickColumns()` das Padding mit einrechnet, statt die Spalte zusätzlich zu\n * stauchen.\n *\n * `hyphens:auto` trennt einzelne Wörter, die trotz der `max-content`/\n * `min-content`-Untergrenze in `tickColumns()` noch breiter als ihre Spalte sind —\n * wirkt nur, wenn die einbettende Seite `lang=\"de\"` setzt (Storybooks Vitest-Iframe\n * tut das nicht; bei Konsumenten ist es nicht garantiert, daher rein additiv).\n * Bewusst OHNE `overflow-wrap:break-word`: das bricht mitten im Wort ohne\n * Trennzeichen (z. B. „zufriede“/„n“) und ist schlechter lesbar als ein Wort, das\n * im Ausnahmefall über seine Spalte hinausragt — Lesbarkeit vor exakter\n * Breiteneinhaltung. Ohne `white-space:nowrap` umbrechen Labels normal (zeilenweise),\n * statt sich zu überlagern.\n *\n * @internal\n */\n protected readonly tickItems = computed<{ label: string; style: Record<string, string> }[]>(\n () => {\n const labels = this.labels();\n const n = labels.length;\n // position/transform/white-space aus .field-slider-ticks>* (components.css)\n // explizit neutralisieren — sonst bleiben die Labels absolut positioniert und\n // ignorieren die Grid-Spalten, auf denen dieser Ansatz aufbaut.\n const base: Record<string, string> = {\n position: 'static',\n transform: 'none',\n 'white-space': 'normal',\n 'box-sizing': 'border-box',\n hyphens: 'auto',\n };\n return labels.map((label, i) => {\n if (n <= 1)\n return { label, style: { ...base, 'text-align': 'left', 'padding-left': '11px' } };\n if (i === 0)\n // Innere Seite (rechts, Richtung nächstes Label) zusätzlich 4px — Mindestlücke,\n // s. Kommentar oben.\n return {\n label,\n style: {\n ...base,\n 'text-align': 'left',\n 'padding-left': '11px',\n 'padding-right': '4px',\n },\n };\n if (i === n - 1)\n return {\n label,\n style: {\n ...base,\n 'text-align': 'right',\n 'padding-left': '4px',\n 'padding-right': '11px',\n },\n };\n return { label, style: { ...base, 'text-align': 'center', 'padding-inline': '4px' } };\n });\n },\n );\n\n /** @internal */\n protected onInput(event: Event): void {\n const value = Number((event.target as HTMLInputElement).value);\n this.value.set(value);\n this.onChange(value);\n }\n /** @internal */\n protected markTouched(): void {\n this.onTouched();\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\n\nexport type CdsSnackTone = 'def' | 'ok' | 'err';\n\n/**\n * Snackbar — Wrapper um `.snack` aus css/components.css → „Snackbar“.\n *\n * Kurze Statusmeldung in drei Tönen (.snack-def / .snack-ok / .snack-err) mit\n * führendem, tonfarbenem Icon (wie die Doku) und optionaler Aktion (.snack-act).\n * Ton „err“ ist eine echte Fehlermeldung → role=\"alert\" + aria-live=\"assertive\";\n * def/ok bleiben role=\"status\" + aria-live=\"polite\" (wie im Doku-Markup).\n * Konsumiert nur bestehende Klassen.\n */\n@Component({\n selector: 'cds-snackbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n [class]=\"classes()\"\n [attr.role]=\"isError() ? 'alert' : 'status'\"\n [attr.aria-live]=\"isError() ? 'assertive' : 'polite'\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n [style.stroke]=\"iconStroke()\"\n stroke-width=\"1.25\"\n aria-hidden=\"true\"\n focusable=\"false\"\n style=\"flex-shrink: 0\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" [attr.d]=\"iconPath()\" />\n </svg>\n {{ message() }}\n @if (actionLabel()) {\n <button class=\"snack-act\" type=\"button\" (click)=\"action.emit()\">{{ actionLabel() }}</button>\n }\n </div>\n `,\n})\nexport class SnackbarComponent {\n /** Anzuzeigender Statustext. */\n readonly message = input.required<string>();\n /** Ton → .snack-def / .snack-ok / .snack-err */\n readonly tone = input<CdsSnackTone>('def');\n /** Optionaler Aktions-Button (.snack-act); leer = keiner. */\n readonly actionLabel = input('');\n /** Klick auf die optionale Aktion. */\n readonly action = output<void>();\n\n /** @internal */\n protected readonly classes = computed(() => `snack snack-${this.tone()}`);\n\n /** @internal */\n protected readonly isError = computed(() => this.tone() === 'err');\n\n /**\n * Tonfarbe des Icons (wie im Doku-Markup). CSS-Variablen statt Hex (Befund 04) — als\n * [style.stroke] gesetzt, nicht als Präsentationsattribut, weil Präsentationsattribute var()\n * nicht auflösen.\n *\n * @internal\n */\n protected readonly iconStroke = computed(\n () =>\n ({\n def: 'var(--co-200)',\n ok: 'var(--c-success-strong-icon)',\n err: 'var(--c-error-strong-icon)',\n })[this.tone()],\n );\n\n /**\n * Lucide-artiger Pfad je Ton (Glühbirne / Häkchen-Kreis / Ausrufezeichen-Kreis).\n *\n * @internal\n */\n protected readonly iconPath = computed(\n () =>\n ({\n def: 'M12 18v-5.25m0 0a6.01 6.01 0 0 0 1.5-.189m-1.5.189a6.01 6.01 0 0 1-1.5-.189m3.75 7.478a12.06 12.06 0 0 1-4.5 0m3.75 2.383a14.406 14.406 0 0 1-3 0M14.25 18v-.192c0-.983.658-1.823 1.508-2.316a7.5 7.5 0 1 0-7.517 0c.85.493 1.509 1.333 1.509 2.316V18',\n ok: 'M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z',\n err: 'M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z',\n })[this.tone()],\n );\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport type { CdsArea } from '../area';\nimport { CDS_QUOTE_ICON } from '../icons';\n\n/**\n * Testimonial — Wrapper um `.testimonial` aus css/components.css → „Testimonial Card“.\n *\n * Statische Zitat-Karte mit bereichsgefärbtem Top-Akzent (data-area), Quote-Icon\n * (.testimonial-icon, fill:currentColor), Zitat (blockquote) und Footer mit Name/Rolle.\n * Nur bestehende Klassen — kein eigenes CSS.\n */\n@Component({\n selector: 'cds-testimonial',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <figure class=\"testimonial\" [attr.data-area]=\"area() || null\">\n <!-- ui-quote aus icons/icons.js — dieselbe Glyphe wie docs/index.html. -->\n <svg\n class=\"testimonial-icon\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n focusable=\"false\"\n [innerHTML]=\"quoteIcon()\"\n ></svg>\n <blockquote>{{ quote() }}</blockquote>\n <figcaption class=\"testimonial-footer\">\n <div>\n <p class=\"testimonial-name\">{{ name() }}</p>\n <p class=\"testimonial-role\">{{ roleLabel() }}</p>\n </div>\n </figcaption>\n </figure>\n `,\n})\nexport class TestimonialComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Zitattext. */\n readonly quote = input.required<string>();\n /** Name der zitierten Person. */\n readonly name = input.required<string>();\n /** Rolle/Funktion der zitierten Person (leer = keine Rollenzeile im Footer). */\n readonly roleLabel = input('');\n /** Markenbereich → data-area (Top-Akzent + Icon-Farbe). */\n readonly area = input<CdsArea>('co');\n\n /**\n * Zitat-Icon aus der zentralen Icon-Registry (icons.ts) statt dreifach\n * dupliziertem SVG-Pfad in Blockquote/Testimonial/TeamVoice.\n *\n * @internal\n */\n protected readonly quoteIcon = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(CDS_QUOTE_ICON.body),\n );\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport type { CdsArea } from '../area';\nimport { CDS_QUOTE_ICON } from '../icons';\n\n/**\n * TeamVoice — Wrapper um `.team-voice` aus css/components.css → „Team-Stimmen“.\n *\n * Editoriale Zitat-Reihe mit seitlichem Foto (im Grid abwechselnd links/rechts,\n * gesteuert per :nth-child innerhalb von `.team-voices`), bereichsgefärbtem\n * Akzent (data-area), Quote-Icon (ui-quote), Zitat und Name/Rolle. Mehrere\n * Komponenten in einen `<div class=\"team-voices\">` legen, damit das alternierende\n * Layout greift (siehe Story).\n */\n@Component({\n selector: 'cds-team-voice',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <figure class=\"team-voice\" [attr.data-area]=\"area() || null\">\n <div class=\"team-voice-media\">\n <img [src]=\"image() || placeholder\" [alt]=\"imageAlt()\" loading=\"lazy\" />\n </div>\n <figcaption class=\"team-voice-body\">\n <!-- ui-quote aus icons/icons.js — dieselbe Glyphe wie docs/index.html. -->\n <svg\n class=\"team-voice-icon\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n focusable=\"false\"\n [innerHTML]=\"quoteIcon()\"\n ></svg>\n <blockquote class=\"team-voice-quote\">{{ quote() }}</blockquote>\n <div class=\"team-voice-footer\">\n <p class=\"team-voice-name\">{{ name() }}</p>\n <p class=\"team-voice-role\">{{ roleLabel() }}</p>\n </div>\n </figcaption>\n </figure>\n `,\n})\nexport class TeamVoiceComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Zitattext. */\n readonly quote = input.required<string>();\n /** Name der zitierten Person. */\n readonly name = input.required<string>();\n /** Rolle/Funktion der zitierten Person (leer = keine Rollenzeile). */\n readonly roleLabel = input('');\n /** Markenbereich → data-area (Akzentfarbe + Rahmen). */\n readonly area = input<CdsArea>('co');\n /** Bild-URL; leer = neutraler Platzhalter (Doku-Assets sind hier nicht eingebunden). */\n readonly image = input('');\n /** Alternativtext des Fotos. */\n readonly imageAlt = input('Teamfoto');\n\n /**\n * Zitat-Icon aus der zentralen Icon-Registry (icons.ts) statt dreifach\n * dupliziertem SVG-Pfad in Blockquote/Testimonial/TeamVoice.\n *\n * @internal\n */\n protected readonly quoteIcon = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(CDS_QUOTE_ICON.body),\n );\n\n /**\n * Neutraler Inline-SVG-Platzhalter, damit Stories ohne externe Assets rendern.\n *\n * @internal\n */\n protected readonly placeholder =\n \"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='600'%20height='450'%3E%3Crect%20width='600'%20height='450'%20fill='%23E8EDED'/%3E%3Ctext%20x='300'%20y='225'%20font-family='sans-serif'%20font-size='22'%20fill='%236E8585'%20text-anchor='middle'%20dominant-baseline='middle'%3ETeamfoto%3C/text%3E%3C/svg%3E\";\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * DownloadCta — Wrapper um `.cta-dl` aus css/components.css → „Download CTA“.\n *\n * Aufmerksamkeitsstarker Download-Block mit bereichsgefärbtem Top-Akzent + Icon\n * (data-area), Eyebrow/Titel/Beschreibung/Meta und zwei Aktionen (primär/sekundär,\n * über die bestehenden `.btn`-Klassen). Konsumiert nur vorhandene Styles.\n */\n@Component({\n selector: 'cds-download-cta',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"cta-dl\" [attr.data-area]=\"area() || null\">\n <div class=\"cta-dl-icon\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\" />\n </svg>\n </div>\n <div class=\"cta-dl-body\">\n @if (eyebrow()) {\n <p class=\"cta-dl-eyebrow\">{{ eyebrow() }}</p>\n }\n <h3 class=\"cta-dl-title\">{{ title() }}</h3>\n <p class=\"cta-dl-desc\">{{ desc() }}</p>\n @if (meta()) {\n <div class=\"cta-dl-meta\">\n <span class=\"cta-strip-meta\">{{ meta() }}</span>\n </div>\n }\n </div>\n <div class=\"cta-dl-actions\">\n <!-- Klassen direkt komponiert statt cds-button: .cta-dl-actions steht auf\n flex-direction:column + align-items:stretch (css/components.css:1421) und\n streckt seine Kinder; ein cds-button-Custom-Element streckt sich darüber\n nicht mit. Die einzige Eingabe, die es zum Füllen der Spalte brächte, full,\n zentriert über .btn-full (css/components.css:53) zugleich das Label und\n würde den bisher linksbündigen Look ändern. -->\n <button\n [class]=\"'btn btn-filled btn-' + area()\"\n type=\"button\"\n [attr.aria-label]=\"primaryAriaLabel()\"\n (click)=\"primaryClick.emit($event)\"\n >\n {{ primaryLabel() }}\n </button>\n @if (secondaryLabel()) {\n <button\n [class]=\"'btn btn-text btn-' + area()\"\n type=\"button\"\n [attr.aria-label]=\"secondaryAriaLabel()\"\n (click)=\"secondaryClick.emit($event)\"\n >\n {{ secondaryLabel() }}\n </button>\n }\n </div>\n </div>\n `,\n})\nexport class DownloadCtaComponent {\n /** Markenbereich → data-area (Top-Akzent, Icon-Tönung, Button-Farbe). */\n readonly area = input<CdsArea>('co');\n /** Kicker-Text oberhalb des Titels (leer = keine Eyebrow-Zeile). */\n readonly eyebrow = input('');\n /** Titel des Download-Angebots. */\n readonly title = input.required<string>();\n /** Beschreibungstext unterhalb des Titels (leer = keine Beschreibung). */\n readonly desc = input('');\n /** Zusatzinfo unterhalb der Beschreibung, z. B. Dateiformat/-größe (leer = keine Meta-Zeile). */\n readonly meta = input('');\n /** Beschriftung der primären Aktion. */\n readonly primaryLabel = input.required<string>();\n /** Beschriftung der sekundären Aktion (leer = ausgeblendet). */\n readonly secondaryLabel = input('');\n\n /** Klick auf die primäre Aktion (Haupt-CTA). */\n readonly primaryClick = output<MouseEvent>();\n /** Klick auf die sekundäre Aktion (nur wenn `secondaryLabel` gesetzt ist). */\n readonly secondaryClick = output<MouseEvent>();\n\n /**\n * Accessible Name der primären Aktion (cta-verwendung.mdx „Barrierefreiheit“: Button-Label\n * muss Ressource und Format nennen). Der sichtbare Button-Text bleibt `primaryLabel`\n * (meist knapp, z. B. „Herunterladen“) — er selbst nennt kein Ziel, der Titel steht nur\n * visuell daneben (`<h3 class=\"cta-dl-title\">`) und erreicht den Accessible Name nicht.\n * Wer per Button-Liste navigiert, hört sonst nur die generische Aktion ohne Bezug.\n * Muster wie bei `PillComponent.computedAriaLabel`/Combobox-Remove-Buttons: „Aktion: Ziel“,\n * Format/Größe aus `meta` in Klammern angehängt, sofern gesetzt.\n *\n * @internal\n */\n protected readonly primaryAriaLabel = computed(\n () => `${this.primaryLabel()}: ${this.title()}${this.meta() ? ` (${this.meta()})` : ''}`,\n );\n\n /** Analog zu `primaryAriaLabel`, für die sekundäre Aktion.\n *\n * @internal\n */\n protected readonly secondaryAriaLabel = computed(\n () => `${this.secondaryLabel()}: ${this.title()}${this.meta() ? ` (${this.meta()})` : ''}`,\n );\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n// Modulweiter Zähler → eindeutige id für die gerenderte Überschrift (aria-labelledby),\n// analog zum Muster in area-tabs.component.ts / scale.component.ts.\nlet uid = 0;\n\n/**\n * Section (`[cdsSection]`) — Wrapper um `.ep-section` aus css/components.css\n * (css/components.css:1223–1253, mobiler Innenabstand: Zeile 1228) mit dem optionalen\n * Kopf-Trio `.ep-section-label` (Kicker) / `.ep-section-h2` (Überschrift) /\n * `.ep-section-sub` (Lead). Das strukturelle Grundgerüst, in dem auf den\n * Beispielseiten praktisch jeder andere Baustein sitzt (133 Vorkommen, 85 davon mit\n * Kopfzeile).\n *\n * Alle drei Textteile sind Beiwerk (`input('')`): eine Sektion besteht auch ganz ohne\n * Kopf, nur aus ihrem projizierten Inhalt (docs/index.html:9378). Der Inhalt selbst\n * kommt per `<ng-content>` und ist deshalb kein Input.\n *\n * **Entscheidung 1 — Attributselektor, der Konsument wählt `<section>` oder `<div>`.**\n * Erste Fassung war `cds-section` als eigenes Element, das intern selbst entschied:\n * `<section aria-labelledby=\"…\">`, wenn ein zugänglicher Name verfügbar war, sonst ein\n * namenloses `<div>`. Das setzte voraus, dass ein `background` auf einem\n * UMSCHLIESSENDEN Element sitzen musste (siehe Entscheidung 2) — gemessen im laufenden\n * Storybook (siehe `docs/adr/0008-selektortyp-der-wrapper-komponenten.md`, „Fall 2“):\n * `getComputedStyle(host).backgroundColor` und `host.getBoundingClientRect()`\n * meldeten beide „passt“, der Screenshot zeigte trotzdem keine gemalte Fläche — ein\n * unbekanntes Custom Element ohne eigene Inline-Inhalte, dessen einziges Kind als Block\n * herausgebrochen wird, hat keine eigene Box zum Malen.\n *\n * Die Komponente hängt sich deshalb als Attribut an ein vom Konsumenten geschriebenes\n * `<section>` oder `<div>`, analog zu `cds-icon-card`\n * (`icon-card/icon-card.component.ts`). Der Konsument entscheidet über das Tag, ob die\n * Sektion überhaupt eine `<section>`-Landmark werden KANN; die Komponente entscheidet\n * nur noch, ob sie `aria-labelledby` setzt (die eigene, gerenderte `.ep-section-h2` hat\n * Vorrang, sonst — wenn `heading` leer bleibt — die per `labelledBy` übergebene id einer\n * Überschrift außerhalb der Komponente). Schreibt der Konsument `<section cdsSection>`\n * ohne Namen, bleibt es bei einer `<section>` ohne `aria-labelledby`: HTML-AAM gibt ihr\n * dann keine Landmark-Rolle, aber das ist eine Entscheidung des Konsumenten, keine der\n * Komponente — sie erzwingt kein Tag mehr.\n *\n * **Entscheidung 2 — kein `background`-Input, die Fläche darf jetzt aber am Host\n * sitzen.** Das Mockup setzt Sektionsflächen inline (`style=\"background:var(--bg-surface)\"`\n * / `--co-50` / …). Das ist der Flächen-Rhythmus zwischen aufeinanderfolgenden\n * Sektionen einer SEITE (Begründung inkl. Messwerten in docs/index.html:1450, „Warum\n * nicht die Sektion senken?“) — eine Entscheidung, die nur die Seite treffen kann, weil\n * nur sie ihre Nachbar-Sektionen kennt. Ein Bauteil kennt seinen Kontext nicht\n * (CONTRIBUTING.md §7) und bekäme mit einem `background`-Input eine Zuständigkeit, die\n * ihm nicht zusteht. Der Konsument setzt die Fläche deshalb weiterhin selbst — jetzt\n * aber direkt auf dem Element, das `cdsSection` trägt (`<section cdsSection\n * style=\"background:…\">` bzw. `<div cdsSection style=\"…\">`), denn dieses Element IST\n * `.ep-section`, kein Host mehr davor. Das umschließende Element aus der ersten Fassung\n * ist damit nicht mehr nötig (siehe Story „Fläche am Host“).\n */\n@Component({\n selector: 'section[cdsSection], div[cdsSection]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ep-section',\n '[attr.aria-labelledby]': 'ariaLabelledBy()',\n },\n template: `\n @if (label()) {\n <div [class]=\"labelClasses()\">{{ label() }}</div>\n }\n @if (heading()) {\n <h2 class=\"ep-section-h2\" [id]=\"headingId\">{{ heading() }}</h2>\n }\n @if (sub()) {\n <p class=\"ep-section-sub\">{{ sub() }}</p>\n }\n <ng-content></ng-content>\n `,\n})\nexport class SectionComponent {\n /** Kicker-Text über der Überschrift (`.ep-section-label`, leer = keine Kopfzeile). */\n readonly label = input('');\n /** Sektions-Überschrift (`.ep-section-h2`, leer = keine Überschrift). */\n readonly heading = input('');\n /** Lead-Text unter der Überschrift (`.ep-section-sub`, leer = kein Lead). */\n readonly sub = input('');\n /** Markenbereich → `.t-{area}` auf dem Label (Mockup: `class=\"ep-section-label t-co\"`). */\n readonly area = input<CdsArea>();\n /**\n * Id einer Überschrift AUSSERHALB der Komponente, die als zugänglicher Name dient,\n * wenn `heading` leer bleibt (siehe Entscheidung 1 in der Klassendoku).\n */\n readonly labelledBy = input('');\n\n private readonly instance = ++uid;\n /** @internal */\n protected readonly headingId = `cds-section-${this.instance}-heading`;\n\n /**\n * Zugänglicher Name der Sektion: die eigene Überschrift hat Vorrang, sonst die von\n * außen übergebene id. `null`, wenn keins von beidem vorhanden ist — dann setzt die\n * Komponente kein `aria-labelledby`. Ob der Host dadurch eine Landmark wird, hängt\n * am Tag, das der Konsument gewählt hat (siehe Entscheidung 1 in der Klassendoku).\n *\n * @internal\n */\n protected readonly ariaLabelledBy = computed<string | null>(() =>\n this.heading() ? this.headingId : this.labelledBy() || null,\n );\n\n /** @internal */\n protected readonly labelClasses = computed(() => {\n const area = this.area();\n return area ? `ep-section-label t-${area}` : 'ep-section-label';\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * HeroImage (cds-hero-image) — Wrapper um `.hero-image` aus css/components.css\n * (css/components.css:851–878) mit optionaler Caption als Gradient-Overlay\n * (`-caption`, `-caption-eyebrow`, `-caption-title`, `-caption-text`). Vollbreites,\n * randloses `<figure>` im 21:9-Format, der Standard-Hero auf allen Customer-Pages\n * (17 Vorkommen in den Beispielseiten). Semantisch ein figure/figcaption-Pattern:\n * `alt` trägt die faktische Bildbeschreibung, die Caption die redaktionelle\n * Einordnung (Eyebrow, Titel, Text) — beide sollen sich nach `docs/index.html`\n * (Abschnitt „In-Article Figure“, dasselbe Prinzip) nicht inhaltlich decken.\n *\n * **Entscheidung 1 — kein `<figcaption>` ohne Textinhalt.** Bleiben `eyebrow`,\n * `heading` und `text` alle leer, entfällt das `<figcaption>`-Element vollständig\n * statt leer zu rendern (Variante „Hero ohne Caption“, siehe\n * `storybook-angular/src/docs/seitenmuster/wissensbeitrag.mdx` Abschnitt „Aufbau“,\n * Zeile 3: Beitrags-Heros zeigen das visuelle Versprechen ohne Marketing-Overlay).\n * Ein leeres `<figcaption>` wäre totes Markup ohne Zugänglichkeitsnutzen.\n *\n * **Entscheidung 2 — `headingLevel` statt fest verdrahtetem `<h1>`.** Das Mockup\n * (`docs/index.html:9412` u. a.) rendert `.hero-image-caption-title` durchgehend als\n * `<h1>`, weil der Hero dort das erste Überschriften-Element der Seite ist. Sitzt\n * der Hero dagegen unter einem eigenen `<h1>` — der Wissensbeitrag hat seinen\n * Titel bereits im Article-Header (`.article-title`, ebenfalls `<h1>`) —, entstünde\n * mit einem zweiten `<h1>` eine doppelte Top-Überschrift. `headingLevel` (Default\n * `1`) macht die Ebene explizit, `.hero-image-caption-title` ist reine CSS-Klasse\n * und trägt keine Heading-Semantik, das Styling bleibt in beiden Fällen identisch.\n *\n * **Entscheidung 3 — `objectPosition` als Style-Binding, die eine Ausnahme von\n * Spec-Randbedingung 6.** Der Bildausschnitt ist eine Eigenschaft des konkreten\n * Bildes (Motiv, Kopfposition), nicht der Seite — anders als z. B. eine\n * Sektionsfläche, die vom Seitenkontext abhängt. `docs/index.html` setzt ihn\n * deshalb an jedem Hero individuell direkt am `<img>` (z. B. `object-position:center\n * 70%`, Zeile 2640). Ohne diesen Input wäre die Komponente für Porträt-lastige\n * Motive unbrauchbar: `object-fit:cover` beschneidet das Bild sobald der\n * `max-height`-Cap greift (siehe `.hero-image-media`), und ohne Steuerung landet\n * der Ausschnitt zufällig in der Bildmitte. Als Style-Binding am `<img>`, nicht als\n * Klasse — es gibt in der CSS-Schicht keine Modifier-Klassen dafür, nur den\n * Inline-Weg, den das Mockup selbst nutzt.\n *\n * **Entscheidung 4 — `tabindex`/`id` sind nicht Teil der Komponente.** Das Mockup\n * setzt beides am `<figure>` (`id=\"ep-landing-main\" tabindex=\"-1\"`, z. B. Zeile\n * 9406) als Sprungziel des Skip-Links. Das Sprungziel ist eine Entscheidung der\n * Seite (welches Element „Hauptinhalt“ ist, hängt vom Seitenaufbau ab, nicht vom\n * Hero selbst), deshalb setzt der Konsument beides am `<cds-hero-image>`-Host.\n * Damit dieses Sprungziel eine eigene Box hat, ist der Host per\n * `:host{display:block}` selbst ein Block (Muster wie `cds-footer-main`): Als\n * unbekanntes Element wäre er `display:inline` mit herausgebrochenem Block-Kind\n * und hätte keine brauchbare Box für Fokus und Scroll-Position (ADR-0008, Fall 2).\n */\n@Component({\n selector: 'cds-hero-image',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [':host{display:block}'],\n template: `\n <figure class=\"hero-image\">\n <div class=\"hero-image-media\">\n <img\n [src]=\"src()\"\n [alt]=\"alt()\"\n [attr.loading]=\"eager() ? 'eager' : 'lazy'\"\n [style.object-position]=\"objectPosition() || null\"\n />\n </div>\n @if (hasCaption()) {\n <figcaption class=\"hero-image-caption\">\n @if (eyebrow()) {\n <p class=\"hero-image-caption-eyebrow\">{{ eyebrow() }}</p>\n }\n @if (heading()) {\n @if (headingLevel() === 2) {\n <h2 class=\"hero-image-caption-title\">{{ heading() }}</h2>\n } @else {\n <h1 class=\"hero-image-caption-title\">{{ heading() }}</h1>\n }\n }\n @if (text()) {\n <p class=\"hero-image-caption-text\">{{ text() }}</p>\n }\n </figcaption>\n }\n </figure>\n `,\n})\nexport class HeroImageComponent {\n /** Bildquelle. */\n readonly src = input.required<string>();\n /** Alternativtext — Pflicht, das Bild trägt Bedeutung (kein dekoratives Hero-Bild). */\n readonly alt = input.required<string>();\n /** Eyebrow-Zeile über dem Titel (`.hero-image-caption-eyebrow`, leer = keine Zeile). */\n readonly eyebrow = input('');\n /** Titel der Caption (`.hero-image-caption-title`, leer = kein Titel). */\n readonly heading = input('');\n /** Text unter dem Titel (`.hero-image-caption-text`, leer = kein Text). */\n readonly text = input('');\n /**\n * Heading-Ebene des gerenderten Titels: `1`, wenn der Hero die erste Überschrift\n * der Seite trägt (Standard auf Customer-Pages), `2`, wenn er unter einem\n * eigenen `<h1>` sitzt (Beitrags-Hero unter dem Article-Header, siehe\n * Entscheidung 2 in der Klassendoku).\n */\n readonly headingLevel = input<1 | 2>(1);\n /**\n * `loading`-Strategie des Bildes: `true` (Standard) rendert `loading=\"eager\"`,\n * weil der Hero auf Customer-Pages immer above the fold sitzt. `false` für einen\n * zweiten, weiter unten liegenden Hero (z. B. innerhalb einer Bildstrecke).\n */\n readonly eager = input(true);\n /**\n * `object-position` direkt am `<img>` (z. B. `'center 70%'`), siehe Entscheidung 3\n * in der Klassendoku. Leer = Browser-Default `center center`.\n */\n readonly objectPosition = input('');\n\n /**\n * Ob die Caption gerendert wird: nur, wenn mindestens einer der drei Textteile\n * gesetzt ist (siehe Entscheidung 1 in der Klassendoku).\n *\n * @internal\n */\n protected readonly hasCaption = computed(\n () => !!(this.eyebrow() || this.heading() || this.text()),\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n computed,\n input,\n viewChild,\n} from '@angular/core';\n\n/**\n * Stoerer (cds-stoerer) — eine Kachel für `<cds-stoerer-set>`, Wrapper um `.stoerer`\n * aus css/components.css (css/components.css:926–974): Typ-Glyph + Thema-Label\n * (`.stoerer-topic`), Titel über zwei Zeilen (`.stoerer-title`), Meta-Zeile\n * (`.stoerer-meta`). Die ganze Kachel ist ein `<a>` — Klick auf die Fläche navigiert,\n * kein Div mit Klick-Handler.\n *\n * **Nur innerhalb von `<cds-stoerer-set>` verwendbar.** Diese Komponente rendert ihr\n * Markup nicht in sich selbst, sondern in ein internes `<ng-template>` und stellt es\n * dem Set als `TemplateRef` bereit (Begründung: Entscheidung 1 in der Klassendoku von\n * `StoererSetComponent`, `stoerer-set.component.ts`) — dasselbe Muster wie\n * `AreaTabComponent` für `cds-area-tabs` (`area-tabs/area-tab.component.ts`). Ohne\n * umgebendes `<cds-stoerer-set>` bleibt eine Kachel deshalb unsichtbar: Angular hängt\n * projizierten Inhalt ohne passendes `<ng-content>`-Ziel nicht ins DOM.\n *\n * **Entscheidung — Icon als projizierter Inhalt.** Wie in Ticket 05 (`cds-icon-card`,\n * `.scratch/angular-seitenbausteine/issues/05-icon-karte.md`, Abschnitt „Entscheidung:\n * Icon als projizierter Inhalt“) sind die Störer-Icons im Mockup wechselnde\n * Heroicons, keine DS-Bereichsglyphen aus der Registry — Inhalt, nicht Chrom. Deshalb\n * Projektion über `<ng-content select=\"[cdsIcon]\">` statt eines `icon`-Inputs.\n * Abweichend von Ticket 05 trägt das projizierte `<svg>` die Klasse `stoerer-icon`\n * selbst (zusätzlich zu `cdsIcon`, `viewBox`, `aria-hidden=\"true\"`,\n * `focusable=\"false\"`): `.ep-card-icon` ist dort ein Container, der die Größe per\n * Nachfahren-Selektor (`.ep-card-icon svg`) an ein unverändertes Kind durchreicht.\n * `.stoerer-icon` (css/components.css:974) sitzt dagegen direkt auf dem SVG als\n * Flex-Kind von `.stoerer-topic` — es gibt keinen Container, der die Klasse\n * stellvertretend tragen könnte, ohne ein neues CSS-Selektorpaar zu erfinden\n * (verboten, ADR-0001). Der vollständige Kontrakt steht zusätzlich in der Story.\n */\n@Component({\n selector: 'cds-stoerer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ng-template>\n <a class=\"stoerer\" [href]=\"href()\">\n <span class=\"stoerer-topic\">\n <ng-content select=\"[cdsIcon]\"></ng-content>\n {{ topic() }}\n </span>\n <span class=\"stoerer-title\"\n ><span>{{ title() }}</span></span\n >\n @if (hasMeta()) {\n <span class=\"stoerer-meta\">\n @if (date()) {\n <time [attr.datetime]=\"date()\">{{ formattedDate() }}</time>\n }\n @if (date() && meta()) {\n <span aria-hidden=\"true\"> · </span><span class=\"sr-only\">, </span>\n }\n {{ meta() }}\n </span>\n }\n </a>\n </ng-template>\n `,\n})\nexport class StoererComponent {\n /** Thema/Inhaltstyp neben dem Icon (`.stoerer-topic`, z. B. „Nächste Veranstaltung“). */\n readonly topic = input.required<string>();\n /** Titel des verlinkten Inhalts — redaktionell auf zwei Zeilen gekürzt. */\n readonly title = input.required<string>();\n /** Linkziel; die Kachel ist vollständig klickbar. */\n readonly href = input.required<string>();\n /** Meta-Text nach dem Datum (Ort/Lesezeit/Format), leer = kein Meta-Text. */\n readonly meta = input('');\n /** ISO-Datum (`JJJJ-MM-TT`) → `<time datetime>`, gerendert vor `meta`, leer = kein Datum. */\n readonly date = input('');\n\n /**\n * Kachel-Markup als Template, das `cds-stoerer-set` per `ngTemplateOutlet` in sein\n * eigenes `<li>` einsetzt (siehe Klassendoku).\n *\n * @internal\n */\n readonly content = viewChild.required<TemplateRef<unknown>>(TemplateRef);\n\n /** @internal */\n protected readonly hasMeta = computed(() => !!(this.date() || this.meta()));\n\n /**\n * `date` als deutsches Langdatum („3. Dezember 2026“), manuell aus den\n * ISO-Komponenten gebaut statt über `new Date(iso)`: Ein reines Datums-ISO-String\n * wird von der Date-API als UTC-Mitternacht gelesen, `Intl.DateTimeFormat`\n * formatiert aber in der lokalen Zeitzone — in Zonen westlich von UTC kippt das\n * angezeigte Datum sonst einen Tag zurück.\n *\n * @internal\n */\n protected readonly formattedDate = computed(() => {\n const iso = this.date();\n if (!iso) return '';\n const [year, month, day] = iso.split('-').map(Number);\n if (!year || !month || !day) return iso;\n return new Intl.DateTimeFormat('de-DE', {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(new Date(year, month - 1, day));\n });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, contentChildren, input } from '@angular/core';\nimport { StoererComponent } from './stoerer.component';\n\n/**\n * StoererSet (cds-stoerer-set) — Wrapper um `.stoerer-set` / `.stoerer-list` aus\n * css/components.css (css/components.css:926–974): das Set aus ein bis drei\n * `<cds-stoerer>`-Kacheln, das auf der Startseite oben rechts über dem Hero-Bild\n * liegt. Der Positionsrahmen `.stoerer-hero` (umschließt Hero-Bild UND Set,\n * `container-type:inline-size` für die Container-Query-Schwelle) ist bewusst NICHT\n * Teil dieser Komponente, sondern bleibt beim Konsumenten (siehe\n * `.scratch/angular-seitenbausteine/issues/03-stoerer.md`): er umschließt Hero UND\n * Set gemeinsam, das könnte diese Komponente als internes Detail nicht leisten, ohne\n * das Hero-Bild selbst zu kennen.\n *\n * **Entscheidung — `<li>` ohne strukturelles Wrapper-Element.** `.stoerer-list` ist\n * ein `<ul>`; nach HTML-AAM bekommt ein `<li>` die implizite Rolle `listitem` nur als\n * direktes Kind eines `<ul>`/`<ol>`/`<menu>` — Screenreader kündigen die Liste sonst\n * nicht mit Anzahl an. Ein einfaches `<ng-content>` hätte `<cds-stoerer>` selbst\n * zwischen `<ul>` und `<li>` geschoben (kein direktes Kind mehr), und ein\n * `display:contents`-Wrapper verbietet sich als neues CSS (ADR-0001). Gelöst über\n * dasselbe Muster, das `cds-area-tabs`/`cds-area-tab` bereits für „projizierte\n * Kind-Komponente, deren Markup an einer selbst bestimmten Stelle im eigenen Template\n * landet“ etabliert (`area-tabs/area-tabs.component.ts`): `cds-stoerer` rendert nicht\n * in sich selbst, sondern in ein `<ng-template>` und liefert es als `TemplateRef`\n * (`stoerer.component.ts`). Diese Komponente liest die projizierten `<cds-stoerer>`\n * über `contentChildren()` und setzt ihr Template per `ngTemplateOutlet` direkt in\n * ein selbst gerendertes `<li>` ein. Im laufenden Storybook geprüft (`Komponenten/Hero/\n * Störer` → Story „Interaktiv“, DOM live im Browser per `querySelector` abgefragt,\n * zusätzlich in der Play-Funktion der Story gepinnt): `<ul class=\"stoerer-list\">`\n * hat ausschließlich `<li>` als direkte Kinder (`ul.stoerer-list > *` → `[\"LI\",\"LI\"]`),\n * `<cds-stoerer>` selbst taucht im gerenderten DOM nirgends auf — Angular hängt\n * unprojizierten Content ohne passendes `<ng-content>`-Ziel gar nicht erst ein, exakt\n * wie bei `<cds-area-tab>` innerhalb von `<cds-area-tabs>`. Ein `items`-Array (die im\n * Ticket vermerkte Alternative) hätte denselben DOM-Baum ergeben, aber den\n * Konsumenten gezwungen, das projizierte Icon jeder Kachel in ein Datenobjekt\n * umzuziehen; mit dieser Lösung bleibt die deklarative, Content-projizierende API\n * erhalten.\n */\n@Component({\n selector: 'cds-stoerer-set',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n template: `\n <aside class=\"stoerer-set\" [attr.aria-label]=\"label()\">\n <ul class=\"stoerer-list\">\n @for (tile of tiles(); track tile) {\n <li><ng-container [ngTemplateOutlet]=\"tile.content()\"></ng-container></li>\n }\n </ul>\n </aside>\n `,\n})\nexport class StoererSetComponent {\n /** Zugänglicher Name des Sets (`<aside aria-label>`); „Aktuelles“ wie im Mockup. */\n readonly label = input('Aktuelles');\n\n /**\n * Die Kacheln kommen als projizierte `<cds-stoerer>`-Kinder.\n *\n * @internal\n */\n protected readonly tiles = contentChildren(StoererComponent);\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport type { CdsArea } from '../area';\nimport { CDS_AREA_ICONS } from '../icons';\n\n/**\n * LinkCard (cds-link-card) — Wrapper um `a.card.card-elevated` aus css/components.css\n * (css/components.css:147–154) samt `.card-cta-link` (css/components.css:1347–1356).\n *\n * Die Lücke, die `CardComponent` bewusst offen lässt (siehe deren Klassendoku):\n * `.card-elevated` wirkt im CSS ausschließlich auf `a.card-elevated` (Riegel aus\n * `CONTRIBUTING.md` §4, „Elevation = Interaktivität“) — eine `<article>`/`<div>`-Karte\n * bekommt den Schatten auch mit gesetzter Klasse nicht. Diese Komponente rendert\n * deshalb ein echtes `<a>`, die ganze Fläche ist der Link, kein Klick-Handler auf\n * einem nicht-interaktiven Element.\n *\n * Struktur wie `CardComponent`: optionale bereichsgefärbte `.card-media` mit der\n * echten Bereichs-Glyphe, `.card-body` mit `.card-eyebrow` / `.card-title` /\n * `.card-text`. Neu ist der Fuß `.card-cta-link`, optional unten angeheftet\n * (`--pinned`, für gleich hohe Karten im Raster über `.card-body{flex:1}`).\n *\n * **Entscheidung — Fuß ist ein `<span>`, kein zweites `<a>`.** Die ganze Karte ist\n * bereits `a.card-elevated`; ein verschachteltes `<a>` im Fuß wäre ungültiges HTML\n * (der Browser schließt es beim Parsen vorzeitig) und würde zwei Klickziele auf\n * derselben Fläche erzeugen. `docs/index.html:4707–4716` zeigt exakt dieses Muster:\n * `<span class=\"card-cta-link card-cta-link--pinned\">…</span>` innerhalb von\n * `a.card.card-elevated`. `.card-cta-link` selbst ist nicht auf `a.` gescoped (anders\n * als `.card-elevated`), der Span trägt Farbe und Typografie also unverändert.\n *\n * **Entscheidung — Pfeil-Suffix wird von der Komponente ergänzt, nicht Teil von\n * `ctaLabel`.** Der Pfeil ist reine visuelle Affordanz, kein Inhalt — `docs/index.html`\n * (Abschnitt „Klickbare Karte“) kapselt ihn deshalb selbst in ein\n * `aria-hidden`-Span. Läge das Zeichen im `ctaLabel`-Text, müsste jeder Aufrufer\n * selbst an das `aria-hidden` denken; das wird hier stattdessen einmalig in der\n * Komponente erledigt.\n *\n * **Entscheidung — kein `data-area` auf `.card-cta-link`.** Die Doku hält die\n * CTA-Farbe in gemischten Bereichs-Listen bewusst einheitlich Corporate-Petrol\n * (`docs/index.html:8762`: „CTA-Farbe einheitlich `--co-700`“), unabhängig vom\n * `area` der Karte. Der Fuß bleibt deshalb ohne `data-area`-Bindung.\n *\n * **Entscheidung — Host als Flex-Container.** Im Raster ist der Host das\n * Grid-Kind, das `align-items:stretch` auf Zeilenhöhe zieht, nicht `a.card`. Ohne\n * eigene Regel blieb die Karte auf Inhaltshöhe, und eine Karte ohne Eyebrow endete\n * samt `--pinned`-Fuß höher als ihre Nachbarn. `:host{display:flex}` mit\n * `flex:1` an der Karte gibt die gestreckte Höhe an `a.card` weiter; Story\n * „Im Raster“ pinnt das.\n */\n@Component({\n selector: 'cds-link-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [':host{display:flex}', ':host>.card{flex:1;min-width:0}'],\n template: `\n <a class=\"card card-elevated\" [href]=\"href()\" [attr.data-area]=\"area() || null\">\n @if (showMedia()) {\n <div class=\"card-media\" [innerHTML]=\"mediaSvg()\"></div>\n }\n <div class=\"card-body\">\n @if (eyebrow()) {\n <p class=\"card-eyebrow\">{{ eyebrow() }}</p>\n }\n <h3 class=\"card-title\">\n <span>{{ title() }}</span>\n </h3>\n <p class=\"card-text\">{{ text() }}</p>\n @if (ctaLabel()) {\n <span class=\"card-cta-link\" [class.card-cta-link--pinned]=\"ctaPinned()\">\n {{ ctaLabel() }} <span aria-hidden=\"true\">→</span>\n </span>\n }\n </div>\n </a>\n `,\n})\nexport class LinkCardComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Kartentitel. */\n readonly title = input.required<string>();\n /** Anreißer-/Beschreibungstext der Karte. */\n readonly text = input.required<string>();\n /** Linkziel; die ganze Kartenfläche ist klickbar. */\n readonly href = input.required<string>();\n /** Kicker-Text oberhalb des Titels (`.card-eyebrow`, leer = keine Eyebrow-Zeile). */\n readonly eyebrow = input('');\n /** Markenbereich → `data-area` (färbt Media-Glyphe + Eyebrow). */\n readonly area = input<CdsArea>();\n /** Bereichsgefärbte Medienfläche mit Bereichs-Glyphe anzeigen. */\n readonly showMedia = input(true);\n /** Fuß-Link-Text (`.card-cta-link`, leer = kein Fuß). */\n readonly ctaLabel = input('');\n /** Fuß unten an die Kartenunterkante anheften (`.card-cta-link--pinned`, für gleich hohe Karten im Raster). */\n readonly ctaPinned = input(false);\n\n /**\n * Echte Bereichs-Glyphe aus icons/icons.js, als ico-48-SVG in die Media-Fläche —\n * identisch zu `CardComponent.mediaSvg`.\n *\n * @internal\n */\n protected readonly mediaSvg = computed<SafeHtml>(() => {\n const icon = CDS_AREA_ICONS[this.area() ?? 'co'];\n return this.sanitizer.bypassSecurityTrustHtml(\n `<svg class=\"ico-48\" viewBox=\"${icon.viewBox}\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">${icon.body}</svg>`,\n );\n });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * FeaturedCard (cds-featured-card) — Wrapper um `.card-featured` aus\n * css/components.css (css/components.css:230–249): die horizontale Großkarte für\n * **genau einen** hervorgehobenen Beitrag oder Termin (Bild links 60 %, Textspalte\n * rechts 40 % als absolut positioniertes Overlay), siehe `docs/index.html`\n * Abschnitt „Featured · horizontale Großkarte“ (`#gt-events-featured`).\n *\n * **Entscheidung 1 — `href` entscheidet zwischen `<a>` und `<article>`.** Die\n * Doku-Beispiele zeigen die Featured-Card ausschließlich als Link\n * (`a.card.card-elevated.card-featured`), das Ticket verlangt aber ausdrücklich eine\n * Variante ohne `<a>`. `.card-elevated` ist nach `CONTRIBUTING.md` §4 („Elevation =\n * Interaktivität“) im CSS auf `a.card-elevated` gescoped — eine `<article>` bekäme\n * den Schatten mit gesetzter Klasse ohnehin nicht. Die Komponente führt die Klasse\n * deshalb nur mit, wenn sie auch wirkt: mit `href` ein `<a class=\"card card-elevated\n * card-featured\">`, ohne `href` ein `<article class=\"card card-featured\">` (ruht\n * flach mit dem `--bd-strong`-Rahmen aus `.card`, wie jede statische Fläche). Media\n * und Body stehen dafür einmal in einem gemeinsamen `<ng-template>` und werden in\n * beiden Zweigen per `<ng-container [ngTemplateOutlet]>` eingesetzt — dasselbe\n * Muster wie `SectionComponent` (`section.component.ts`) für „zwei Wurzelelemente,\n * ein Körper“. `<ng-container>` rendert selbst kein Element, die Kindselektoren aus\n * Entscheidung 2 bleiben also unberührt: im laufenden Storybook erneut per\n * `querySelector`/`getBoundingClientRect` gemessen (siehe Play-Funktionen), Ergebnis\n * unverändert zur vorherigen, noch duplizierten Fassung.\n *\n * **Entscheidung 2 — die Pill ist direkt komponiertes Markup, kein `<cds-pill>`.**\n * Das CSS arbeitet mit direkten Kindselektoren: `.card-featured>.card-media`,\n * `.card-featured-body>.pill`, `.card-featured-body>.card-text`,\n * `.card-featured-body>.card-title-hero` (jeweils mit `margin`/`min-height`/\n * `line-clamp`-Übernahmen, siehe CSS-Kommentare dort). `<cds-pill>` rendert sein\n * `.pill`-`<span>` nicht auf dem eigenen Host-Element, sondern eine Ebene tiefer\n * (`pill.component.ts`: Host ist `<cds-pill>`, `.pill` sitzt im Template darunter) —\n * projiziert als `<cds-pill class=\"pill\">` stünde die Pille damit als\n * `.card-featured-body>cds-pill>.pill`, zwei Ebenen statt einer, und die\n * Kindselektoren griffen nicht mehr (leise: kein Fehler, nur falsches Layout).\n * Dieselbe Abwägung wie in `download-cta.component.ts` (Kommentar über den\n * Buttons): dort verhindert `.cta-dl-actions`, das seine Kinder per Flex streckt,\n * dass ein `<cds-button>`-Host mitstreckt; hier verhindert ein Kindselektor, dass\n * irgendein zusätzliches Host-Element dazwischentritt. In beiden Fällen werden die\n * Klassen direkt komponiert statt eine Wrapper-Komponente zu verwenden. Geprüft im\n * laufenden Storybook (`Komponenten/Cards & Teaser/Featured-Karte`): die gerenderte\n * Kette ist `.card-featured>.card-media` und `.card-featured-body` mit `.pill`,\n * `.card-text`, `.card-title-hero` als direkten Kindern, kein zusätzliches Element\n * dazwischen (siehe Play-Funktionen der Stories).\n *\n * Weil die Pille direkt komponiert wird, übernimmt diese Komponente auch die\n * `aria-label`-Regel von `PillComponent` (`pill.component.ts`) von Hand nach:\n * Default „Bereich `<pill>`“, überschreibbar über `pillAriaLabel` — nötig, weil die\n * Pille nicht immer einen Bereich benennt (siehe `pillAriaLabel`-Doku unten).\n *\n * **Entscheidung 3 — kein separates `data-area` für die Pille.** Die Doku setzt\n * Karte und Pille immer auf denselben Bereich (`docs/index.html:8979`: Karte\n * `data-area=\"es\"`, Pille `data-area=\"es\"`). Die Komponente bindet deshalb `area`\n * auf beide, statt einen zweiten Bereichs-Input zu erfinden.\n *\n * **Entscheidung 4 — kein CTA- und kein Meta-Input.** Die Doku-Vorlage zeigt\n * zusätzlich einen Meta-Strip (Datum/Ort/Format) und einen `.card-cta-link`-Fuß;\n * das Ticket benennt als API aber nur `title`/`text`/`imageSrc`/`imageAlt`/`href`/\n * `pill`/`area`. Diese Komponente bildet exakt diese Fläche ab, ohne Inputs zu\n * erfinden, die das Ticket nicht vorsieht — ein Meta-Strip oder ein CTA-Fuß wären\n * eine spätere, eigene Erweiterung.\n */\n@Component({\n selector: 'cds-featured-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n template: `\n @if (href()) {\n <a class=\"card card-elevated card-featured\" [href]=\"href()\" [attr.data-area]=\"area() || null\">\n <ng-container [ngTemplateOutlet]=\"body\"></ng-container>\n </a>\n } @else {\n <article class=\"card card-featured\" [attr.data-area]=\"area() || null\">\n <ng-container [ngTemplateOutlet]=\"body\"></ng-container>\n </article>\n }\n <ng-template #body>\n <div class=\"card-media\">\n <img [src]=\"imageSrc()\" [alt]=\"imageAlt()\" />\n </div>\n <div class=\"card-featured-body\">\n @if (pill()) {\n <span\n class=\"pill\"\n [attr.data-area]=\"area() || null\"\n [attr.aria-label]=\"computedPillAriaLabel()\"\n >{{ pill() }}</span\n >\n }\n <h3 class=\"card-title-hero\">{{ title() }}</h3>\n <p class=\"card-text\">{{ text() }}</p>\n </div>\n </ng-template>\n `,\n})\nexport class FeaturedCardComponent {\n /** Titel (`.card-title-hero`). */\n readonly title = input.required<string>();\n /** Anreißer-/Beschreibungstext (`.card-text`). */\n readonly text = input.required<string>();\n /** Bildquelle der 16:9-Medienfläche. */\n readonly imageSrc = input.required<string>();\n /** Alternativtext des Bildes — Pflicht, das Bild trägt Bedeutung. */\n readonly imageAlt = input.required<string>();\n /** Linkziel; gesetzt → `<a>` (ganze Fläche klickbar), leer → `<article>` (statisch, kein Schatten). */\n readonly href = input('');\n /** Bereichs-Pille über dem Titel (`.pill`, leer = keine Pille). */\n readonly pill = input('');\n /**\n * `aria-label` der Pille überschreiben; Default „Bereich `<pill>`“, wie\n * `PillComponent` (`pill.component.ts`). Nötig, weil `pill` nicht immer einen\n * Bereich benennt — das Mockup zeigt neben `aria-label=\"Bereich Corporate\"` auch\n * `aria-label=\"Lesezeit 12 Minuten\"` für dieselbe Klasse.\n */\n readonly pillAriaLabel = input<string>();\n /** Markenbereich → `data-area` auf Karte und Pille. */\n readonly area = input<CdsArea>();\n\n /** @internal */\n protected readonly computedPillAriaLabel = computed(\n () => this.pillAriaLabel() ?? `Bereich ${this.pill()}`,\n );\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, inject, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * IconCard (`[cdsIconCard]`) — Wrapper um `.ep-card` aus css/components.css\n * (css/components.css:1298–1340): die Icon-Kachel mit farbiger Icon-Fläche, Eyebrow,\n * Titel, Text und optionaler Pfeil-CTA-Zeile, die auf den Beispielseiten Bereichs-\n * und Angebots-Einstiege trägt (`docs/index.html:9401–9420` u. a., 81 Vorkommen).\n *\n * **Entscheidung 1 — Attributselektor, kein Element-Selektor.** Erste Fassung dieser\n * Komponente war `cds-icon-card` als eigenes Element mit `href`-Input, das intern\n * zwischen `<a class=\"ep-card ep-card-link\">` und `<div class=\"ep-card\">` wählte\n * (`@if`/`@else` + `<ng-template>`). Gemessen im laufenden Storybook: zwei Karten mit\n * unterschiedlich langem Text ergaben im `.ep-cards`-Grid ungleiche `.ep-card`-Höhen\n * (174px/270px), weil `align-items:stretch` nur den unsichtbaren `<cds-icon-card>`-Host\n * streckt, nicht das `.ep-card`-Element eine Ebene darunter. Dieselbe Messung mit\n * `.ep-card` OHNE Host-Wrapper (rohes Markup direkt in `.ep-cards`) ergab 306px/306px,\n * CTA-Unterkanten auf identischer Y-Koordinate — das CSS gleicht die Höhen korrekt aus,\n * sobald `.ep-card` selbst das Grid-Kind ist. Der Fehler saß also im Wrapper-Element,\n * nicht in der CSS-Schicht (siehe „Im Raster“-Story, dort dieselbe Messung als\n * Play-Funktion gepinnt).\n *\n * Die Lösung, analog zu Angular Materials `a[mat-button], button[mat-button]`: die\n * Komponente hängt sich als Attribut an ein vom Konsumenten geschriebenes `<a>` oder\n * `<div>`, statt ein eigenes Element zu sein. Dadurch trägt **derselbe** native Knoten,\n * den der Konsument in sein Grid schreibt, sowohl die Komponentenlogik als auch die\n * `.ep-card`-Klasse — kein Host-Element dazwischen, `align-items:stretch` trifft direkt\n * auf `.ep-card`.\n *\n * **`href` ist deshalb kein Input mehr.** Ob die Karte ein Link ist, entscheidet der\n * Konsument über das gewählte Tag (`<a cdsIconCard href=\"…\">` vs. `<div cdsIconCard>`)\n * und setzt `href` als natives Attribut direkt am `<a>` — Angular muss dafür nichts\n * verwalten. `.ep-card-link` (nur auf `a.ep-card-link` wirksam, `CONTRIBUTING.md` §4)\n * wird deshalb vom Host-Tag abgeleitet, nicht mehr per Verzweigung im Template\n * gerendert.\n *\n * **`.ep-card-link` hängt an `<a>` UND `href`, nicht am Tag allein.** Ein `<a\n * cdsIconCard>` ohne `href` ist weder fokussierbar noch hat es eine Link-Rolle —\n * `.ep-card-link` (Schatten, Hover-Anhebung, Cursor) nur am Tag festzumachen hätte\n * eine Karte erzeugt, die aussieht wie ein Link, aber keiner ist, und genau die\n * Garantie aufgegeben, die die frühere `href`-Input-Fassung strukturell hatte (leerer\n * String → zwingend der `<div>`-Zweig). `isLink()` prüft deshalb beides.\n *\n * **`isLink()` ist eine Methode im Host-Binding, kein einmalig berechnetes Feld.**\n * `href` kann nach dem Erstellen zur Laufzeit gesetzt/entfernt werden (z. B.\n * `<a cdsIconCard [attr.href]=\"urlSignal()\">`). Ein Host-Binding-Ausdruck\n * (`'[class.ep-card-link]': 'isLink()'`) wird bei JEDEM Refresh der DECLARING VIEW\n * neu ausgewertet — also der Elternvorlage, die `<a cdsIconCard>` schreibt —, nicht\n * nur bei einem Refresh der eigenen (OnPush-gesteuerten) Kindvorlage dieser\n * Komponente. Das ist kein Sonderfall wie bei einem in ADR-0007 §3 verworfenen\n * Getter (dort ging es um einen Getter in einer INTERPOLATION der eigenen\n * Kindvorlage, die unter OnPush nur bei eigenen Signal-Änderungen neu läuft):\n * Host-Bindings werden unabhängig vom OnPush-Status der Komponente selbst\n * mitgeführt, wenn die Elternansicht aktualisiert wird — reagiert also auf\n * `[attr.href]`/`[href]`-Bindungen des Konsumenten, ob Signal- oder\n * Zone.js-getrieben, ohne `effect()` (ADR-0007 §4) und ohne `MutationObserver`.\n * Empirisch geprüft (Spike-Story mit `[attr.href]=\"signal()\"`-Toggle zur Laufzeit,\n * seither wieder gelöscht): Setzen des Signals nach Erstrender schaltet\n * `.ep-card-link` zuverlässig um. Einzige Grenze: eine Änderung, die AUSSERHALB von\n * Angular direkt am nativen Element vorgenommen wird (z. B. `el.setAttribute\n * ('href', …)` von Fremdcode), löst keinen Refresh aus — das gilt aber für jede\n * Angular-Bindung gleichermaßen und ist kein Sonderfall dieser Komponente.\n *\n * **Entscheidung 2 — Icon als projizierter Inhalt, OHNE dass das SVG eine eigene\n * Größenklasse tragen muss.** Wie bei `cds-stoerer` (siehe dessen Klassendoku) sind\n * die Icons auf den Beispielseiten wechselnde Heroicons, keine DS-Bereichsglyphen aus\n * der Registry `icons/cds-icons.ts` — Inhalt, nicht Chrom. Deshalb Projektion über\n * `<ng-content select=\"[cdsIcon]\">` statt eines `icon`-Strings. Anders als beim Störer\n * ist `.ep-card-icon` hier aber ein echter CONTAINER: css/components.css:1310+1318\n * setzt Maße und Stroke über den Nachfahren-Selektor `.ep-card-icon svg{width:32px;\n * height:32px;stroke-width:var(--icon-stroke-sm)}`, nicht über eine Klasse auf dem\n * SVG selbst. Der Konsument liefert deshalb ein unverändertes `<svg cdsIcon\n * viewBox=\"…\" aria-hidden=\"true\" focusable=\"false\">…</svg>` OHNE zusätzliche Klasse —\n * das Verhältnis Größe/Stroke kommt allein aus dem Container. Geprüft an\n * css/components.css:1298–1318 (Kommentar dort: „Farbe kommt aus der Komponente,\n * nicht aus … inline gesetzten style-Attributen“) und in der Story „Interaktiv“\n * gepinnt (Play-Funktion misst die gerenderte SVG-Breite).\n *\n * **`data-area` sitzt auf drei Elementen** (`.ep-card` (Host), `.ep-card-icon`,\n * `.ep-card-eyebrow`, wie im Mockup, `docs/index.html:4681–4686`): die CTA-Farbe\n * braucht dagegen KEIN eigenes `data-area`, sie kommt über den Nachfahren-Selektor\n * `.ep-card[data-area=\"…\"] .ep-card-cta` (css/components.css:1336–1339) vom\n * `data-area` der Karte selbst.\n *\n * **Kein erfundener `aria-label`.** Der Pfeil-Suffix der CTA-Zeile ist reine visuelle\n * Affordanz (`docs/index.html:4686`: `<span aria-hidden=\"true\">→</span>`) und steht\n * deshalb `aria-hidden`, unverändert zum Mockup — kein zusätzlicher, selbst\n * ausgedachter zugänglicher Name.\n *\n * **Entscheidung 3 — kein `cdsIconCards`-Raster.** `.ep-cards` ist ein reines\n * `display:grid` ohne Struktur oder Verhalten (dieselbe Begründung wie beim Verzicht\n * auf einen `layout-grid`-Wrapper, siehe `spec.md`). Konsumenten schreiben\n * `<div class=\"ep-cards\">` von Hand (siehe Story „Im Raster“).\n */\n@Component({\n selector: 'a[cdsIconCard], div[cdsIconCard]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ep-card',\n '[class.ep-card-link]': 'isLink()',\n '[attr.data-area]': 'area() || null',\n },\n template: `\n <div class=\"ep-card-icon\" [attr.data-area]=\"area() || null\">\n <ng-content select=\"[cdsIcon]\"></ng-content>\n </div>\n @if (eyebrow()) {\n <p class=\"ep-card-eyebrow\" [attr.data-area]=\"area() || null\">{{ eyebrow() }}</p>\n }\n <h3 class=\"ep-card-title\">{{ title() }}</h3>\n <p class=\"ep-card-text\">{{ text() }}</p>\n @if (ctaLabel()) {\n <div class=\"ep-card-cta\">{{ ctaLabel() }} <span aria-hidden=\"true\">→</span></div>\n }\n `,\n})\nexport class IconCardComponent {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Kartentitel (`.ep-card-title`). */\n readonly title = input.required<string>();\n /** Anreißer-/Beschreibungstext (`.ep-card-text`). */\n readonly text = input.required<string>();\n /** Kicker-Text oberhalb des Titels (`.ep-card-eyebrow`, leer = keine Eyebrow-Zeile). */\n readonly eyebrow = input('');\n /** Markenbereich → `data-area` auf Karte, Icon-Kachel und Eyebrow. */\n readonly area = input<CdsArea>();\n /** CTA-Zeile am Kartenfuß (`.ep-card-cta`, leer = keine CTA-Zeile). */\n readonly ctaLabel = input('');\n\n /**\n * Ob der Host ein `<a>` MIT `href` ist → schaltet `.ep-card-link` (Schatten/Hover,\n * `CONTRIBUTING.md` §4). Als Methode im Host-Binding aufgerufen (nicht einmalig in\n * ein Feld geschrieben), damit ein zur Laufzeit gesetztes/entferntes `href` erkannt\n * wird — Begründung und Grenzen in der Klassendoku oben.\n *\n * @internal\n */\n protected isLink(): boolean {\n const el = this.elementRef.nativeElement;\n return el.tagName === 'A' && el.hasAttribute('href');\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * Feature (`[cdsFeature]`) — Wrapper um `.ep-feature` aus css/components.css\n * (css/components.css:1363–1379): die flache Feature-Zeile ohne Box und ohne\n * Schatten (Icon-Kachel links, Titel/Text rechts) — die „Offene Feature-Liste“ der\n * Beispielseiten (Doku-Sektion `docs/index.html:4882` ff., Beispielseiten u. a.\n * `docs/index.html:10405–10415`, `11582–11588`; 40 Vorkommen als\n * `class=\"ep-feature col-4\"` im `.layout-grid`).\n *\n * **Attributselektor, kein eigenes Element (ADR-0008).** Das Mockup setzt die\n * Spaltenklasse am selben Element wie `.ep-feature` (`class=\"ep-feature col-4\"`).\n * Das Bauteil ist damit selbst Grid-Kind UND Ziel einer Layout-Klasse des\n * Konsumenten — exakt das Kriterium aus\n * [ADR-0008](../../../../../../docs/adr/0008-selektortyp-der-wrapper-komponenten.md).\n * Ein eigenes `<cds-feature>`-Element mit innerem `<div class=\"ep-feature\">` würde\n * `.layout-grid>[class*=\"col-\"]` (css/base.css:214) brechen: der `col-*`-Selektor\n * träfe den unsichtbaren Host, nicht `.ep-feature`, das `.layout-grid` gibt seinem\n * Kind (dem Host) dann zwar per `align-items:stretch` (Grid-Default) die volle\n * Zeilenhöhe, aber `.ep-feature` darunter bliebe auf Inhaltshöhe — derselbe Fehler,\n * den ADR-0008 Fall 1 für `.ep-card`/`.ep-cards` gemessen hat (174px/270px statt\n * 306px/306px). Die Komponente hängt sich deshalb als Attribut an ein vom\n * Konsumenten geschriebenes `<div>` (`<div cdsFeature class=\"col-4\">`), analog zu\n * `cds-icon-card` (siehe dessen Klassendoku). Gemessen für dieses Bauteil in der\n * Story „Dreispalter“ (Play-Funktion): drei `.ep-feature` mit stark\n * unterschiedlich langem Text als `col-4`-Geschwister in einem `.layout-grid`\n * ergeben identische Höhen und deckungsgleiche Unterkanten (Messwerte in der\n * Story-Doku dort).\n *\n * **Icon-Kontrakt: `.ep-feature-icon` ist ein Container, keine Klasse auf dem\n * SVG — UND reicht zusätzlich die Farbe durch, anders als `.ep-card-icon`.** Wie\n * `.ep-card-icon` (siehe `icon-card.component.ts`, Entscheidung 2) setzt\n * css/components.css:1369 Maße und Stroke über den Nachfahren-Selektor\n * `.ep-feature-icon svg{width:26px;height:26px;stroke-width:var(--icon-stroke-md)}`\n * — NICHT über eine Klasse auf dem SVG selbst, anders als `.stoerer-icon`\n * (`stoerer.component.ts`), das direkt auf dem projizierten `<svg>` sitzt. Der\n * Konsument liefert deshalb ein unverändertes\n * `<svg cdsIcon viewBox=\"…\" aria-hidden=\"true\" focusable=\"false\">…</svg>` OHNE\n * zusätzliche Größenklasse, projiziert über `<ng-content select=\"[cdsIcon]\">`\n * (Kontrakt in der Story „Interaktiv“ per `getBoundingClientRect()` gepinnt).\n * Anders als `.ep-card-icon` (nur `background`, kein `color`) setzt\n * `.ep-feature-icon` UND ihre vier `[data-area]`-Varianten (css/components.css:\n * 1367–1372) zusätzlich `color` auf dem Container selbst. Das Mockup nutzt das\n * aktiv aus: die projizierten SVGs dort (`docs/index.html:10406` u. a.) tragen\n * `stroke=\"currentColor\"` statt eines hart codierten Bereichstons — die Farbe\n * kommt allein aus dem Container, ein Icon-Autor muss den Bereich der Kachel gar\n * nicht kennen. Bei `cds-icon-card` ist das nicht möglich (kein `color` am\n * Container), dort trägt jedes Icon seinen Bereichston selbst im `stroke`-Attribut.\n * Story „Interaktiv“ demonstriert das mit `stroke=\"currentColor\"` und prüft die\n * geerbte Farbe per `getComputedStyle()`. Die Icon-Kachel selbst ist im Mockup\n * (`docs/index.html:4883` u. a.) ein `<span aria-hidden=\"true\">`, kein `<div>` —\n * rein dekorativ, das SVG trägt bereits sein eigenes `aria-hidden`; die Komponente\n * übernimmt beides unverändert.\n *\n * **CTA: `<a>` mit `href`, sonst `<span>` — nie ein `<a>` ohne `href`.**\n * css/components.css:1376 zielt mit `.ep-feature-body>.card-cta-link` auf den\n * direkten Nachfahren; Angulars `@if`/`@else` fügt dafür kein Wrapper-Element ein\n * (kompiliert zu Kommentar-Ankern, kein Element), der Kindselektor bleibt also in\n * beiden Zweigen erhalten. Ausgezählt in `docs/index.html`: alle 13 Vorkommen von\n * `.card-cta-link` innerhalb von `.ep-feature-body` sind entweder ein `<a\n * href=\"…\">` (12×) oder ein `<span>` (1×, `docs/index.html:13216`,\n * „Landingpage folgt“ — Platzhalter für ein Ziel, das noch fehlt). Ein `<a>` OHNE\n * `href` kommt kein einziges Mal vor — dieselbe Falle, die `cds-icon-card` über\n * `isLink()` schließt (ein Link-Tag ohne `href` ist weder fokussierbar noch hat\n * es eine Link-Rolle, sieht mit der `.card-cta-link`-Optik aber trotzdem wie ein\n * bedienbares Element aus). Hier entscheidet sich das nicht am Host-Tag (der ist\n * bei `cdsFeature` immer `<div>`), sondern strukturell im eigenen Template:\n * `ctaHref` gesetzt → `<a class=\"card-cta-link\" [href]=\"ctaHref()\">`, leer →\n * `<span class=\"card-cta-link\">` mit identischer Optik und identischem Pfeil,\n * aber ohne Link-Rolle (siehe Story „Ohne Href“). Ein `[attr.href]`-Nullwert wäre\n * dieselbe Krücke gewesen wie ein `<a>` ohne `href` zu tolerieren; der\n * `@if`/`@else`-Zweig macht den Fall stattdessen unmöglich, statt ihn nur\n * abzufedern. `data-area` sitzt auf beiden Zweigen, weil `.card-cta-link[data-area]`\n * (css/components.css:1363–1366) ein direkter Attributselektor ist, keine\n * Nachfahren-Regel wie `.ep-card[data-area] .ep-card-cta` bei der Icon-Karte —\n * ohne eigenes `data-area` bliebe der Link/Span auf der CSS-Vorgabefarbe, auch bei\n * gesetztem `area`.\n *\n * **`ctaAriaLabel` — der zugängliche Name ist im Mockup die Regel, nicht die\n * Ausnahme.** Erster Anlauf dieser Komponente hatte keinen solchen Input, mit der\n * (falschen) Annahme, das Mockup verzichte meist auf einen zusätzlichen\n * `aria-label`. Ausgezählt: von den 12 `<a class=\"card-cta-link\">` in\n * `.ep-feature-body` tragen 11 einen `aria-label`, nur einer nicht\n * („Contentletter abonnieren“, `docs/index.html:15203` — der sichtbare Text ist\n * dort bereits eindeutig). Grund: nur 3 verschiedene sichtbare Texte verteilen\n * sich auf diese 12 Links, „Zur Landingpage“ allein zehnmal\n * (`docs/index.html:11587` u. a.) — eine Screenreader-Linkliste hörte sonst\n * zehnmal denselben Namen ohne Unterscheidung. Das Mockup disambiguiert\n * durchgängig mit der Form `<sichtbarer Text>: <Ziel>`\n * (`aria-label=\"Zur Landingpage: KI Kickstart Workshops\"`). `ctaAriaLabel` ist\n * deshalb Beiwerk (Default `''`): leer bleibt der sichtbare `ctaLabel`-Text der\n * zugängliche Name (passt für einen eindeutigen CTA-Text wie „Contentletter\n * abonnieren“), gesetzt überschreibt er ihn — Konsumenten mit einer Liste\n * gleichlautender CTA-Texte (wie den zehn „Zur Landingpage“ im Mockup) setzen ihn\n * pro Instanz auf `<ctaLabel>: <Ziel>`. Wirkt nur am `<a>`-Zweig: `aria-label` an\n * einem `<span>` ohne Rolle hat keinen verlässlichen Effekt im\n * Accessibility-Baum, und der `<span>`-Zweig ist ohnehin nicht interaktiv.\n */\n@Component({\n selector: 'div[cdsFeature]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ep-feature',\n },\n template: `\n <span class=\"ep-feature-icon\" [attr.data-area]=\"area() || null\" aria-hidden=\"true\">\n <ng-content select=\"[cdsIcon]\"></ng-content>\n </span>\n <div class=\"ep-feature-body\">\n <h3 class=\"ep-feature-title\">{{ title() }}</h3>\n <p class=\"ep-feature-text\">{{ text() }}</p>\n @if (ctaLabel()) {\n @if (ctaHref()) {\n <a\n class=\"card-cta-link\"\n [attr.data-area]=\"area() || null\"\n [href]=\"ctaHref()\"\n [attr.aria-label]=\"ctaAriaLabel() || null\"\n >\n {{ ctaLabel() }} <span aria-hidden=\"true\">→</span>\n </a>\n } @else {\n <span class=\"card-cta-link\" [attr.data-area]=\"area() || null\">\n {{ ctaLabel() }} <span aria-hidden=\"true\">→</span>\n </span>\n }\n }\n </div>\n `,\n})\nexport class FeatureComponent {\n /** Titel (`.ep-feature-title`). */\n readonly title = input.required<string>();\n /** Beschreibungstext (`.ep-feature-text`). */\n readonly text = input.required<string>();\n /** Markenbereich → `data-area` auf Icon-Kachel und CTA-Link. */\n readonly area = input<CdsArea>();\n /** CTA-Linktext (`.card-cta-link` als direktes Kind von `.ep-feature-body`, leer = kein CTA). */\n readonly ctaLabel = input('');\n /** CTA-Linkziel; gesetzt → `<a href>`, leer → `<span>` ohne Link-Rolle (siehe Klassendoku). */\n readonly ctaHref = input('');\n /**\n * Zugänglicher Name des CTA-Links, überschreibt den sichtbaren `ctaLabel`-Text.\n * Nötig, wenn derselbe sichtbare CTA-Text mehrfach auf einer Seite steht (siehe\n * Klassendoku); Form aus dem Mockup: `<ctaLabel>: <Ziel>`. Leer (Default) = kein\n * `aria-label`, der sichtbare `ctaLabel`-Text bleibt der zugängliche Name. Wirkt\n * nur, wenn `ctaHref` gesetzt ist (nur der `<a>`-Zweig hat eine Link-Rolle).\n */\n readonly ctaAriaLabel = input('');\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * CtaBand (`[cdsCtaBand]`) — Wrapper um `.ep-cta-band` aus css/components.css\n * (css/components.css:1456, Kopf-Duo `.ep-cta-h2`/`.ep-cta-sub` ebenda): das\n * bereichsgefärbte Page-End-CTA-Band, das laut Doku-Site (`docs/index.html:6237`,\n * Anker `gt-cta-band`) am Ende jeder Customer-Page direkt vor dem Footer steht — die\n * „letzte Einladung“, wenn die Nutzerin die Seite durchgelesen hat. Ausgezählt: 22\n * Vorkommen auf den Beispielseiten, ausnahmslos als `<div class=\"ep-cta-band\"\n * style=\"background:…\">` mit genau einer Aktion.\n *\n * **Entscheidung 1 — Attributselektor, kein eigenes Element (ADR-0008, derselbe\n * „Fläche am Host“-Fall wie `cds-section`).** `css/components.css` trägt für\n * `.ep-cta-band` KEIN `[data-area]` (per Grep geprüft, keine einzige Regel dieser\n * Form existiert). Die Bandfläche kommt in allen 22 Vorkommen als Inline-Style\n * DIREKT am `.ep-cta-band`-Element (`style=\"background:var(--co-700);color:#fff\"`,\n * docs/index.html:6304 u. a.), dem Bereich der Page folgend, nie aus einem\n * `data-area`-Attribut. Ein Element-Selektor würde exakt den in ADR-0008 „Fall 2“\n * gemessenen Fehler wiederholen: der `<cds-cta-band>`-Host ist ein unbekanntes\n * Custom Element (`display:inline`), sein einziges Kind würde als Block\n * herausgebrochen, ein am Host gesetzter Inline-`background` hätte keine eigene Box\n * zum Malen. Die Komponente hängt sich deshalb als Attribut an ein vom Konsumenten\n * geschriebenes `<div>` (`<div cdsCtaBand style=\"background:…\">`) — das Element, das\n * den Style trägt, und `.ep-cta-band` sind derselbe Knoten. Nur `<div>`, kein\n * `<section>`-Zwilling wie bei `cds-section`: alle 22 Vorkommen benutzen\n * ausnahmslos ein `<div>`, keines variiert das Tag.\n *\n * **Entscheidung 2 — `area` färbt nur die Aktion, nicht das Band.** Aus demselben\n * Grund wie bei `cds-section` (siehe dessen Klassendoku, Entscheidung 2) bleibt die\n * Bandfläche Sache des Konsumenten: welche Bereichsfarbe ein Band trägt, ist eine\n * Entscheidung der Seite (Bereichszugehörigkeit der Customer-Page), keine\n * Bauteil-Eigenschaft — und das CSS bietet an dieser Klasse ohnehin keinen\n * `[data-area]`-Haken an (siehe Entscheidung 1). `area` steuert deshalb\n * ausschließlich die Button-Farbklasse (`.btn-{area}`), nicht die Füllung des Bands.\n *\n * **Entscheidung 3 — `.btn-on-band` + `.btn-filled` direkt komponiert, nicht über\n * `cds-button` projiziert.** `cds-button` KENNT den Modifier\n * (`variant=\"filled-on-band\"`, geprüft über `npx storybook tools docs show --id\n * komponenten-buttons-button` — die Story „Auf Bereichs-Band“ existiert dort\n * bereits). Trotzdem baut diese Komponente die `.btn`-Klassen direkt zusammen\n * (Präzedenzfall `download-cta.component.ts`), aus einem härteren Grund als dort:\n * `cds-button` rendert IMMER ein `<button>` — sein Input-Vertrag\n * (`ButtonComponentInputs`) kennt kein `href` — und kann die vom Ticket geforderte\n * Verzweigung „`primaryHref` gesetzt → `<a>`“ strukturell gar nicht erfüllen. Ein\n * projiziertes `<cds-button>` brächte hier also kein Custom-Element-Layoutproblem\n * (kein Kindselektor an `.ep-cta-band` hängt von der DOM-Tiefe ab), sondern schlicht\n * die falsche Fähigkeit.\n *\n * **Entscheidung 4 — bewusst nur EINE Aktion, kein `secondaryLabel`.** Eine frühere\n * Fassung bot `secondaryLabel`/`secondaryHref` an, ungeprüft gegen das Mockup. Beide\n * Belege dagegen: erstens zeigt KEINES der 22 `.ep-cta-band`-Vorkommen in\n * `docs/index.html` eine zweite Aktion — der Zwei-Aktionen-Fall hat keine Vorlage.\n * Zweitens (der schwerere Grund) lässt sich eine zweite, optisch zurückhaltendere\n * Aktion mit den vorhandenen Klassen gar nicht bauen: `.btn-{area}.btn-on-band{color:\n * …}` (css/components.css:47–51) überschreibt die Textfarbe JEDER Variante auf den\n * Bereichston — genau den Ton, den die Doku durchgängig als Bandhintergrund nennt.\n * Nur `.btn-filled` tauscht zusätzlich die Füllung gegen Weiß; `.btn-outlined`,\n * `.btn-tonal` und `.btn-text` blieben transparent und zeigten Text in derselben\n * Farbe wie das Band darunter — unsichtbar. Eine zweite Aktion hätte deshalb\n * zwangsläufig dieselbe Optik wie die erste getragen, keine Hierarchie, nur zwei\n * gleich gewichtete Buttons. Das ist eine CSS-Lücke (kein kontrastsicherer\n * sekundärer On-Band-Stil), festgehalten in\n * `.scratch/angular-seitenbausteine/issues/16-css-luecke-zweite-aktion-auf-band.md`\n * — gemeldet, nicht in diesem Wrapper improvisiert. Solange sie besteht, trägt\n * `cds-cta-band` nur eine Aktion; ein Konsument mit echtem Bedarf für eine zweite\n * schreibt sie außerhalb der Komponente ins Band hinein (`<ng-content>` gibt es\n * hier bewusst nicht, um genau das nicht als unterstützten Pfad zu suggerieren).\n * Ohne zweite Aktion braucht es auch keinen eigenen Container: die einzelne Aktion\n * zentriert sich über das ererbte `.ep-cta-band{text-align:center}` von selbst,\n * genau wie in allen 22 Mockup-Vorkommen — ein zusätzliches Flex-Layout im Wrapper\n * hätte eine Darstellung erfunden, die die CSS-Schicht so nicht kennt (ADR-0001;\n * die einzige existierende Deklaration dieser Form ist `.ep-hero-ctas`,\n * css/components.css:1222, eine andere Klasse für einen anderen Bauteiltyp).\n *\n * **Kein `aria-label` auf der Aktion.** Anders als bei `cds-feature`\n * (`ctaAriaLabel`, 11 von 12 Vorkommen mit `aria-label`) zeigt keines der 22\n * Band-Vorkommen einen `aria-label` auf seiner Aktion — ausgezählt, nicht\n * geschätzt. Die sichtbaren Texte sind durchgängig konkrete Verben mit Ziel\n * („Termin buchen“, „Gespräch anfragen“, „Offene Stellen ansehen“ …) und stehen je\n * Seite nur einmal; anders als bei einer Karten-Liste braucht es hier keine\n * Disambiguierung. Kein entsprechender Input.\n */\n@Component({\n selector: 'div[cdsCtaBand]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ep-cta-band',\n },\n template: `\n <h2 class=\"ep-cta-h2\">{{ heading() }}</h2>\n @if (sub()) {\n <p class=\"ep-cta-sub\">{{ sub() }}</p>\n }\n @if (primaryHref()) {\n <a [class]=\"actionClasses()\" [href]=\"primaryHref()\">{{ primaryLabel() }}</a>\n } @else {\n <button [class]=\"actionClasses()\" type=\"button\" (click)=\"primaryClick.emit($event)\">\n {{ primaryLabel() }}\n </button>\n }\n `,\n})\nexport class CtaBandComponent {\n /** Headline (`.ep-cta-h2`) — das konkrete Angebot, keine Marketing-Floskel. */\n readonly heading = input.required<string>();\n /** Beschriftung der (einzigen) Aktion. */\n readonly primaryLabel = input.required<string>();\n /** Unterzeile (`.ep-cta-sub`, leer = keine Unterzeile). */\n readonly sub = input('');\n /** Markenbereich → `.btn-{area}` auf der Aktion (nicht die Bandfläche, siehe Klassendoku). */\n readonly area = input<CdsArea>('co');\n /** Ziel der Aktion; gesetzt → `<a href>`, leer → `<button>` mit `primaryClick`. */\n readonly primaryHref = input('');\n\n /** Klick auf die Aktion (feuert nur, wenn `primaryHref` leer ist). */\n readonly primaryClick = output<MouseEvent>();\n\n /** @internal */\n protected readonly actionClasses = computed(\n () => `btn btn-filled btn-${this.area()} btn-on-band`,\n );\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Tier (`cds-tier`) — Wrapper um `.ep-tier` aus css/components.css\n * (css/components.css:1381–1384): der Stufen-Trenner (Label + Haarlinie), der eine\n * Offene Feature-Liste in Pakete gliedert (z. B. „In jedem Paket enthalten“ /\n * „Zusätzlich mit Pro“, Doku-Sektion `docs/index.html:4880`, Beispielseiten\n * `docs/index.html:11855–11857`, `11883–11885`, `12576–12578`).\n *\n * **Element-Selektor, kein Attribut (ADR-0008-Standardfall).** Ausgezählt: alle 4\n * `.ep-tier`-Vorkommen in `docs/index.html` stehen als eigenständiger `<div>` VOR\n * einem `.layout-grid` oder einer Karten-Reihe, nie als deren Kind — keines trägt\n * eine `col-*`-Spaltenklasse, keines liegt in einem Grid/Flex, das seine Kinder\n * dehnt. Das Tag variiert ebenfalls nicht (immer `<div>`). Keines der drei\n * ADR-0008-Kriterien (Grid-/Flex-Kind, Ziel einer Layout-Klasse, wechselndes Tag)\n * trifft zu, der Element-Selektor bleibt deshalb der Standardfall. `.ep-tier{\n * display:flex}` sitzt direkt auf dem Host (`host: { class: 'ep-tier' }`), kein\n * inneres Wrapper-Element darunter — anders als bei `cds-section` (ADR-0008 Fall 2)\n * ist hier nichts von außen auf eine bestimmte DOM-Tiefe angewiesen: kein\n * Nachfahren-Selektor zielt auf `.ep-tier`, keine Fläche hängt am Host.\n *\n * **`area` ist auf `'ki'` typisiert, nicht auf `CdsArea`.** `css/components.css:1383`\n * kennt nur die eine Regel `.ep-tier-label[data-area=\"ki\"]` (Dark-Override\n * `css/dark-mode.css:476`) — für `co`/`es`/`wo` existiert keine einzige\n * `[data-area]`-Regel auf `.ep-tier-label`, per Grep über `css/*.css` geprüft.\n * Ausgezählt in `docs/index.html`: von 4 `.ep-tier-label`-Vorkommen tragen 3\n * `data-area=\"ki\"` (4880, 11884, 12577), eines trägt gar kein `data-area` (11856),\n * keines der Werte `co`/`es`/`wo` kommt vor. Ein `area`-Input vom Typ `CdsArea`\n * würde für drei von vier gültigen Werten ein `data-area`-Attribut schreiben, das\n * im CSS folgenlos bleibt — die Falle, die genau dann entsteht, wenn eine Eingabe\n * mehr verspricht, als die Stilschicht einlöst. Der Typ ist deshalb auf den einen\n * Wert eingeschränkt, den das CSS tatsächlich kennt; der Compiler verhindert damit\n * strukturell, dass jemand `co`/`es`/`wo` setzt und ein wirkungsloses Attribut\n * bekommt, statt es nur im JSDoc zu behaupten.\n */\n@Component({\n selector: 'cds-tier',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ep-tier',\n },\n template: `\n <span class=\"ep-tier-label\" [attr.data-area]=\"area() || null\">{{ label() }}</span>\n <span class=\"ep-tier-rule\" aria-hidden=\"true\"></span>\n `,\n})\nexport class TierComponent {\n /** Beschriftung des Trenners (`.ep-tier-label`), z. B. „In jedem Paket enthalten“. */\n readonly label = input.required<string>();\n /**\n * Einzige vom CSS unterstützte Tönung → `data-area=\"ki\"` auf `.ep-tier-label`.\n * Ungesetzt (Default) bleibt das Label neutral (`--tx-secondary`), siehe Klassendoku.\n */\n readonly area = input<'ki'>();\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/** Ein Fakten-Paar der Angebots-Rahmendaten (`<dt>`/`<dd>`). */\nexport interface CdsFactsItem {\n /** Label (`<dt>`), z. B. „Dauer“. */\n term: string;\n /** Wert (`<dd>`), z. B. „2 Tage, 9–17 Uhr“. */\n value: string;\n}\n\n/**\n * Facts (`cds-facts`) — Wrapper um `.ep-facts` aus css/components.css\n * (css/components.css:1261–1272): die Definitionsliste für die harten Eckdaten\n * eines Angebots (Termin, Dauer, Ort, Preis), einspaltig mit Haarlinie zwischen\n * den Paaren oder als `.is-grid` zweispaltig für Kästen, die neben Inhalt stehen.\n * Bewusst ohne eigenen Rahmen und ohne Fläche, sie zieht in einen vorhandenen\n * Container ein (Angebots-Box, Sticky-Sidebar) — Doku-Sektion\n * `docs/index.html:9069` (`gt-seminar-fakten`), Beispielseiten `docs/index.html:\n * 9076–9082`, `13718–13726`, `16293–16300`.\n *\n * **Element-Selektor, kein Attribut (ADR-0008-Standardfall).** Ausgezählt: keines\n * der 3 `.ep-facts`-Vorkommen in `docs/index.html` sitzt in einem `.layout-grid`\n * mit `col-*`, keines wird von einem Grid-/Flex-Elternteil in der Höhe gedehnt\n * (der Flex-Fall in Zeile 16290 ist `flex-direction:column`, dort füllen Block-\n * Elemente die Breite ihres Containers unabhängig von einer zusätzlichen\n * Wrapper-Ebene — anders als bei `.ep-card`/ADR-0008 Fall 1 geht es dort um Höhe,\n * die durch Block-Layout NICHT automatisch nach unten durchgereicht wird). Das\n * Tag variiert nicht (immer `<dl>`). Analog zu `cds-faq` (`faq.component.ts`, das\n * intern `<details>` in einem `<div class=\"ep-faq\">` rendert) trägt hier die\n * INNERE `<dl class=\"ep-facts\">` die CSS-Klasse, nicht der `<cds-facts>`-Host: die\n * Semantik einer Definitionsliste hängt am `<dl>`-Tag selbst, ein Custom-Element\n * kann dieses Tag nicht annehmen. Da `.ep-facts > div + div` ausschließlich\n * Nachfahren INNERHALB der eigenen Vorlage anspricht, bricht eine zusätzliche\n * Host-Ebene darüber nichts — anders als bei `cds-section` (Fall 2) hängt hier\n * keine von außen gesetzte Fläche oder ein von außen adressierter Nachfahre an\n * dieser Tiefe.\n *\n * **`<dl>`/`<div>`/`<dt>`/`<dd>` exakt wie vom CSS erwartet.** `.ep-facts > div +\n * div` (css/components.css:1262) setzt Haarlinie und Abstand ab dem ZWEITEN Paar;\n * ohne das umschließende `<div>` pro Paar griffe der Selektor nicht. Jedes\n * `items()`-Element wird deshalb zu genau einem `<div><dt>…</dt><dd>…</dd></div>`.\n *\n * **`area` färbt `<dt>` über `.t-{area}`, nicht über `data-area`.** Anders als bei\n * `cds-feature`/`cds-icon-card` kennt `.ep-facts` selbst kein `[data-area]`; der\n * CSS-Kommentar zu dieser Klasse (`css/components.css:1259`) benennt\n * stattdessen ausdrücklich „Bereichston der Labels über `.t-XX` im Markup\n * (dark-safe), nie als Inline-Farbe“ als sanktionierten Weg. Ausgezählt: alle 3\n * `.ep-facts`-Vorkommen in `docs/index.html` setzen `.t-wo` auf JEDEM `<dt>`\n * derselben Liste (nie gemischt, nie eine andere Bereichsfarbe) — ein optionaler\n * `area`-Input, der `.t-{area}` einheitlich auf alle `<dt>` der Instanz anwendet,\n * bildet dieses Muster nach, ohne einen Farbwert zu erfinden (`.t-XX` ist eine\n * bestehende, bereits kontrast- und dark-mode-geprüfte Utility, `css/components.css\n * :638–642`). Ungesetzt (Default) bleibt `<dt>` ohne zusätzliche Klasse, erbt also\n * die umgebende Textfarbe — das deckt Kontexte ohne Bereichsbindung ab.\n *\n * **Über die Ticket-API hinaus:** `area` stand nicht in der ursprünglichen\n * API-Skizze von Ticket 08. Ergänzt, weil ohne ihn KEINES der 3 realen\n * `.ep-facts`-Vorkommen originalgetreu nachgebaut werden könnte — anders als bei\n * `cds-tier`s `area` (dort deckt die Einschränkung eine tatsächliche CSS-Lücke\n * ab) fehlt hier keine CSS-Regel, nur ein API-Hook auf eine bereits vollständige\n * Klasse. Siehe Ticket-Bericht für die Abwägung.\n */\n@Component({\n selector: 'cds-facts',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <dl class=\"ep-facts\" [class.is-grid]=\"grid()\">\n @for (item of items(); track $index) {\n <div>\n <dt [class]=\"area() ? 't-' + area() : null\">{{ item.term }}</dt>\n <dd>{{ item.value }}</dd>\n </div>\n }\n </dl>\n `,\n})\nexport class FactsComponent {\n /** Fakten-Paare (`<dt>`/`<dd>`), in Darstellungsreihenfolge. */\n readonly items = input.required<CdsFactsItem[]>();\n /** Zweispaltige Rasterung ohne Haarlinien (`.is-grid`) statt der einspaltigen Grundform. */\n readonly grid = input(false);\n /** Markenbereich → `.t-{area}` auf jedem `<dt>` (siehe Klassendoku). Ungesetzt = neutral. */\n readonly area = input<CdsArea>();\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * Table (`cds-table`) — Wrapper um `.tbl`/`.tbl-wrap` aus css/components.css\n * (css/components.css:1462–1480): die Datentabelle der Doku-Site (`sec-table`,\n * Nav-Einträge „Standard“ und „Gestreift“). Ausgezählt: außerhalb von `sec-table`\n * selbst kommt `.tbl-wrap` nur zweimal vor, beide auf Beitragsseiten\n * (`docs/index.html:8622`, `15080`) — keine der 24 Beispielseiten außerhalb von\n * Wissensbeiträgen setzt aktuell eine Tabelle ein. Neuntes Ticket der\n * Seitenbausteine-Serie.\n *\n * **Kein Daten-Input.** Eine `columns`/`rows`-API würde Zellinhalte auf Strings\n * festlegen; die Beispielseiten setzen darin Badges, Links und `data-num`\n * (`docs/index.html:5076–5177`). Der Konsument projiziert `<thead>`/`<tbody>`/\n * `<tfoot>` unverändert per `<ng-content>`, die Komponente liefert nur die\n * Hülle: `.tbl-wrap`, `.tbl`, `<caption>` und die Striped-Klasse.\n *\n * **`caption` ist Pflicht (`input.required<string>()`), abweichend von der\n * Ticket-Skizze (dort `caption? = ''`).** Die eigene Doku dieser Komponente\n * (`storybook-angular/src/docs/komponenten/tabelle.mdx:137`) nennt `<caption>`\n * ausdrücklich „Pflicht, Screenreader lesen den Titel vor, bevor die Zellen\n * vorgelesen werden“ und wiederholt das in den Dos (`tabelle.mdx:147`:\n * „`<caption>` und `scope`-Attribute immer setzen, auch bei einfachen\n * Tabellen“). Ausgezählt: alle 5 realen `.tbl`-Vorkommen in `docs/index.html`\n * haben eine `<caption>`, ausnahmslos. Ein optionaler Input mit Default `''`\n * hätte genau den Fall erlaubt, den die eigene Doku verbietet — nach\n * ADR-0007 §2 ist `caption` damit Inhalt, nicht Beiwerk: ohne sie ist eine\n * `cds-table` eine Tabelle, die die eigenen Barrierefreiheitsregeln bricht,\n * also sinnlos. Ein vergessenes Binding wirft jetzt `NG0950`, statt eine\n * unbeschriftete Tabelle still auszuliefern.\n *\n * **Element-Selektor, `.tbl-wrap`/`.tbl` sitzen im eigenen Template, nicht am\n * Host (ADR-0008-Standardfall, analog zu `cds-facts`/`cds-faq`).** Ausgezählt:\n * alle 5 `.tbl-wrap`-Vorkommen in `docs/index.html` (Zeilen 5061, 5116, 5236,\n * 8622, 15080). Keines ist selbst ein direktes Grid-/Flex-Kind — das einzige\n * Vorkommen in einem `.layout-grid` (Zeile 5236) sitzt eine Ebene tiefer in\n * einem `.col-8`, das seinerseits der Grid-Child ist; `.tbl-wrap` ist dort ein\n * gewöhnlicher Block-Nachfahre, dessen Breite vom umschließenden `.col-8`\n * kommt, nicht von `align-items:stretch` auf einer bestimmten DOM-Tiefe (kein\n * `.ep-card`-Fall). Keines trägt eine `col-*`-Klasse selbst, keines variiert\n * das Tag (immer `<div class=\"tbl-wrap\">`). Ein `<cds-table>`-Host ohne eigene\n * Klasse und ohne eigenes `background` gerät deshalb nicht in den „Fläche am\n * Host“-Fall aus ADR-0008 Fall 2: die Komponente setzt nichts auf dem Host,\n * das eine eigene Box bräuchte, `.tbl-wrap` bleibt ein normaler Block-Nachfahre\n * unabhängig vom `display` des `<cds-table>`-Hosts (derselbe Grund, warum\n * `cds-facts`/`cds-faq` als Element-Selektor funktionieren).\n *\n * Eine Attributselektor-Variante direkt am `<table>` (`table[cdsTable]`, analog\n * zu `cdsSection`) wurde erwogen und verworfen: `<table>` ist als Tag ohnehin\n * fix (kein Tag-Wechsel wie bei `cdsIconCard`), aber `.tbl-wrap` bräuchte dann\n * ein ZWEITES Element, das der Konsument von Hand um die Tabelle schreiben\n * müsste (`<div class=\"tbl-wrap\" tabindex=\"0\" role=\"region\" aria-label=\"…\">\n * <table cdsTable>…`) — genau die beiden Aufgaben, die laut Ticket am ehesten\n * vergessen werden (fokussierbarer, benannter Scroll-Container), blieben dann\n * beim Konsumenten statt bei der Komponente. Der Element-Selektor hält Wrap und\n * Tabelle zusammen in einem Template.\n *\n * **Geprüft im laufenden Storybook (Story „Interaktiv“, Play-Funktion):**\n * `<table class=\"tbl\">` liegt direkt unter `<div class=\"tbl-wrap\">`, `<caption>`\n * ist ihr erstes Kind, danach folgen ohne zusätzlichen Knoten dazwischen genau\n * die projizierten `<thead>`/`<tbody>`-Elemente — `<ng-content>` fügt selbst\n * kein DOM-Element ein, es verschiebt nur die vom Konsumenten geschriebenen\n * nativen Elemente an ihre Stelle. Damit bleibt die Tabellenstruktur (`<table>`\n * → `<caption>` + `<thead>` + `<tbody>` + optional `<tfoot>`, keine fremde\n * Ebene dazwischen) exakt so gültig wie im rohen Markup.\n *\n * **`.tbl-wrap` ist immer fokussierbar UND immer benannt.** Das CSS gibt dem\n * Scroll-Container einen eigenen `:focus-visible`-Ring\n * (css/components.css:1463) — ein scrollbarer Bereich muss per Tastatur\n * erreichbar sein (WCAG 2.1.1), `tabindex=\"0\"` steht deshalb fest im Template.\n * `role=\"region\"` braucht laut HTML-AAM einen zugänglichen Namen, sonst bekäme\n * der Bereich keine Landmark-Rolle — weil `caption` jetzt Pflicht ist, kann\n * `accessibleName()` (`scrollLabel() || caption()`) nicht mehr leer werden,\n * `role`/`aria-label` sind deshalb unbedingt gesetzt, kein Nullfall mehr zu\n * behandeln. `scrollLabel` bleibt eine optionale Überschreibung (Vorrang vor\n * `caption`) für Fälle, in denen der sichtbare Tabellentitel für den\n * Scroll-Container zu lang oder zu unspezifisch wäre.\n *\n * **`.tbl-sort` bleibt außen vor.** Die Klasse existiert\n * (css/components.css:1477–1482), die Sortierlogik nicht — kein zugehöriges\n * JS in `docs/main.js` für die Beispielseiten. Ein Wrapper, der nur den\n * Button-Look lieferte, täuschte Funktion vor, die es nicht gibt. Siehe\n * `.scratch/angular-seitenbausteine/issues/19-fehlende-sortierlogik-tbl-sort.md`.\n */\n@Component({\n selector: 'cds-table',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"tbl-wrap\" tabindex=\"0\" role=\"region\" [attr.aria-label]=\"accessibleName()\">\n <table class=\"tbl\" [class.tbl--striped]=\"striped()\">\n <caption>\n {{\n caption()\n }}\n </caption>\n <ng-content></ng-content>\n </table>\n </div>\n `,\n})\nexport class TableComponent {\n /** Überschrift der Tabelle (`<caption>`, erstes Kind) — Pflicht, siehe Klassendoku. */\n readonly caption = input.required<string>();\n /** Alternierende Zeilenfarbe für Tabellen mit vielen Zeilen (`.tbl--striped`). */\n readonly striped = input(false);\n /**\n * Zugänglicher Name des Scroll-Containers (`aria-label` auf `.tbl-wrap`), hat\n * Vorrang vor `caption`. Leer = `caption` wird zum Namen (siehe Klassendoku).\n */\n readonly scrollLabel = input('');\n\n /**\n * Name des Scroll-Containers: `scrollLabel` hat Vorrang, sonst `caption` —\n * dank Pflicht-`caption` nie leer (siehe Klassendoku).\n *\n * @internal\n */\n protected readonly accessibleName = computed(() => this.scrollLabel() || this.caption());\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\n\n/** Eine Vergleichsspalte (Paket/Tarif) der Vergleichstabelle. */\nexport interface CdsCompareColumn {\n /** Spaltenüberschrift, z. B. „Core“ oder „Pro“. */\n label: string;\n /** Hervorgehobene Spalte (`.ep-compare-pro`), z. B. das empfohlene Paket. */\n pro?: boolean;\n}\n\n/** Eine Vergleichszeile: das verglichene Merkmal plus eine Zelle je Spalte. */\nexport interface CdsCompareRow {\n /** Zeilenüberschrift (`<th scope=\"row\">`), das verglichene Merkmal. */\n label: string;\n /**\n * Eine Zelle je Eintrag in `columns`, in derselben Reihenfolge. `boolean` → Ja/Nein-Glyphe\n * (`.ep-compare-yes`/`-no`) mit Screenreader-Text, `string` → die kurze Angabe als Text\n * (z. B. „bis 70 Mrd. Param.“).\n */\n cells: (boolean | string)[];\n}\n\n/**\n * Compare (`cds-compare`) — Wrapper um `.ep-compare*` aus css/components.css\n * (css/components.css:1275–1294): die aufklappbare Vergleichstabelle für den zeilenweisen\n * Direktvergleich mehrerer Pakete/Tarife (Doku-Site `sec-table`, Nav-Eintrag\n * „Vergleichstabelle (aufklappbar)“, `docs/index.html:5182–5204`). Zehntes Ticket der\n * Seitenbausteine-Serie, nach `cds-table` (Ticket 09).\n *\n * **Mit Daten-Input, anders als `cds-table`.** `cds-table` projiziert `<thead>`/`<tbody>`\n * unverändert per `<ng-content>`, weil seine Zellen Badges, Links und `data-num` tragen können\n * (siehe dessen Klassendoku). Hier ist der Zellinhalt strukturell auf Ja/Nein oder eine kurze\n * Angabe begrenzt — ausgezählt: alle 22 Datenzellen des einzigen realen Vorkommens\n * (`docs/index.html:11970–12038`, 11 Zeilen × 2 Spalten, ohne die Zeilenüberschriften) sind\n * entweder ein `.ep-compare-yes`/`-no`-Marker (18×, davon 14× „Ja“, 4× „Nein“) oder ein kurzer\n * Text wie „bis 70 Mrd. Param.“ bzw. „30 Min.“ (4×) — nie ein Badge, Link oder anderes Markup.\n * Weil Spaltenzahl, `pro`-Spalte und Zellinhalt damit vollständig aus zwei Arrays (`columns`,\n * `rows`) hervorgehen, würde `<ng-content>` beim Konsumenten nur denselben `@for`-Code\n * duplizieren, ohne eine Freiheit zu gewinnen, die die Zell-Typisierung (`boolean | string`)\n * ohnehin ausschließt.\n *\n * **Ja/Nein-Zellen tragen einen Screenreader-Text, übernommen statt erfunden.** Im einzigen\n * realen Vorkommen steht hinter jeder Glyphe ein `.sr-only`-Text, ausnahmslos:\n * `<span class=\"ep-compare-yes\" aria-hidden=\"true\">✓</span><span class=\"sr-only\">Enthalten</span>`\n * (14×) bzw. `<span class=\"ep-compare-no\" aria-hidden=\"true\">−</span><span class=\"sr-only\">Nicht\n * enthalten</span>` (4×, „−“ ist U+2212 Minus, kein Bindestrich). Genau diese Zeichen und dieser\n * Wortlaut, keine eigene Formulierung — Farbe und Glyphe allein tragen keine Bedeutung\n * (WCAG 1.4.1), der `.sr-only`-Text ist deshalb kein optionaler Zusatz, sondern fest verdrahtet,\n * nicht per Input überschreibbar.\n *\n * **`caption` ist Pflicht (`input.required<string>()`), abweichend von der Ticket-Skizze (dort\n * kein Input dafür vorgesehen) — dieselbe Begründung wie bei `cds-table`.** Die eigene Doku\n * (`storybook-angular/src/docs/komponenten/tabelle.mdx:91`) nennt `<caption class=\"sr-only\">`\n * ausdrücklich als Teil des Bauteils, und das einzige reale Vorkommen hat eine. Anders als bei\n * `cds-table` ist sie hier `.sr-only`, nicht sichtbar: der Klartext steht schon im `<summary>`\n * (`summary`-Input), die `<caption>` wiederholt ihn nur für Screenreader, die nach dem Aufklappen\n * direkt in die Tabelle springen, ohne den Summary-Text erneut vorgelesen zu bekommen.\n *\n * **`rowsLabel` (erste Kopfzelle, `<th scope=\"col\">Funktion</th>` im Mockup) ist dagegen Beiwerk,\n * optional mit Default `''`.** Auch dafür sieht die Ticket-Skizze keinen Input vor. Den Text fest\n * im Template zu verdrahten hieße, AI.Box-Copy in einen wiederverwendbaren Wrapper zu backen\n * (ADR-0007 §2); ihn ganz wegzulassen wich ohne CSS-Befund vom einzigen Beleg ab, ohne dass die\n * Doku das verlangt. Anders als `caption` ist die Kopfzelle nicht barrierefreiheitsrelevant\n * Pflicht: ein leeres `<th scope=\"col\">` bleibt eine gültige, in Vergleichsmatrizen verbreitete\n * Ecke ohne eigenen Namen. Deshalb Beiwerk, kein Inhalt — das Beispielwort „Funktion“ steht in\n * der Story, nicht in der Klasse.\n *\n * **Natives `<details>`/`<summary>` bleibt erhalten, kein nachgebautes Disclosure** (Ticket-\n * Vorgabe, analog `cds-faq`): Tastaturbedienung und Toggle-Verhalten kommen vom Browser, das CSS\n * hängt direkt an `[open]` (`.ep-compare[open] .ep-compare-caret`). `<details class=\"ep-compare\">`\n * sitzt deshalb im TEMPLATE, nicht am Host — derselbe Grund wie bei `cds-table`s\n * `.tbl-wrap`/`.tbl`: ein `<cds-compare>`-Host ist ein unbekanntes Custom Element, kein echtes\n * `<details>`, und kann dessen native Disclosure-Semantik nicht annehmen.\n *\n * **Element-Selektor (ADR-0008-Standardfall).** `.ep-compare` sitzt im einzigen realen Vorkommen\n * als gewöhnlicher Block-Nachfahre in `.ep-section` (`docs/index.html:11969`) — kein Grid-/\n * Flex-Kind, keine `col-*`-Klasse vom Konsumenten, kein Tag-Wechsel (immer `<details>`). Keines\n * der drei ADR-0008-Kriterien greift, ein Attributselektor brächte hier nichts.\n *\n * **`open` ist ein reiner Anfangszustand, keine Zwei-Wege-Bindung.** Gebunden über\n * `[attr.open]=\"open() ? '' : null\"`: Angular schreibt das Attribut nur, wenn sich der GEPRÜFTE\n * Ausdruckswert seit dem letzten Change-Detection-Lauf ändert. `open()` bleibt nach dem ersten\n * Rendern konstant (die Komponente schreibt nie in dieses Signal zurück), ein nachfolgender\n * nativer Toggle wird deshalb nicht rückgängig gemacht — geprüft in der Story „Interaktiv“\n * (Play-Funktion: Klick öffnet, `toggled` feuert `true`, ein zweiter, vom Toggle unabhängiger\n * Interaktionsschritt lässt die Tabelle weiterhin offen).\n */\n@Component({\n selector: 'cds-compare',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <details class=\"ep-compare\" [attr.open]=\"open() ? '' : null\" (toggle)=\"onToggle($event)\">\n <summary class=\"ep-compare-summary\">\n {{ summary() }}\n <svg\n class=\"ep-compare-caret\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m19.5 8.25-7.5 7.5-7.5-7.5\" />\n </svg>\n </summary>\n <div class=\"ep-compare-table-wrap\">\n <table class=\"ep-compare-table\">\n <caption class=\"sr-only\">\n {{\n caption()\n }}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ rowsLabel() }}</th>\n @for (column of columns(); track $index) {\n <th scope=\"col\" [class.ep-compare-pro]=\"column.pro\">{{ column.label }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows(); track $index) {\n <tr>\n <th scope=\"row\">{{ row.label }}</th>\n @for (cell of row.cells; track $index) {\n <td [class.ep-compare-pro]=\"columns()[$index].pro\">\n @if (cell === true) {\n <span class=\"ep-compare-yes\" aria-hidden=\"true\">✓</span\n ><span class=\"sr-only\">Enthalten</span>\n } @else if (cell === false) {\n <span class=\"ep-compare-no\" aria-hidden=\"true\">−</span\n ><span class=\"sr-only\">Nicht enthalten</span>\n } @else {\n {{ cell }}\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </details>\n `,\n})\nexport class CompareComponent {\n /** Text im `<summary>`, z. B. „Alle Funktionen vergleichen“. */\n readonly summary = input.required<string>();\n /** `<caption class=\"sr-only\">` der Tabelle — Pflicht, siehe Klassendoku. */\n readonly caption = input.required<string>();\n /** Überschrift der ersten Spalte (Zeilentitel, z. B. „Funktion“) — Beiwerk, siehe Klassendoku. */\n readonly rowsLabel = input('');\n /** Anfangszustand des `<details>` — reine Vorbelegung, siehe Klassendoku. */\n readonly open = input(false);\n /** Vergleichsspalten (Pakete/Tarife), in Render-Reihenfolge. */\n readonly columns = input.required<CdsCompareColumn[]>();\n /** Vergleichszeilen; `cells` hat je Zeile genau einen Eintrag pro Spalte in `columns`. */\n readonly rows = input.required<CdsCompareRow[]>();\n\n /** Feuert bei jedem Auf- oder Zuklappen mit dem neuen Zustand. */\n readonly toggled = output<boolean>();\n\n /** @internal */\n protected onToggle(event: Event): void {\n this.toggled.emit((event.target as HTMLDetailsElement).open);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/** Größenvarianten von `cds-avatar` (`.article-avatar` / `-lg` / `-xl`). */\nexport type CdsAvatarSize = 'sm' | 'lg' | 'xl';\n\n/**\n * Avatar (`div[cdsAvatar]`) — Wrapper um `.article-avatar` aus css/components.css\n * (css/components.css:1520–1536): der Initialen-/Foto-Kreis im Meta-Strip eines\n * Wissensbeitrags (`.article-meta-author`), in der Author-Card (`-lg`) und im\n * Team-Tile-Grid (`-xl`). Elftes Ticket der Seitenbausteine-Serie.\n *\n * **Attributselektor (ADR-0008), gemessen an der Geschwister-Kette.** Ausgezählt in\n * `docs/index.html`: 8 der 11 Instanzen der Grundgröße sitzen als direkte, adjazente\n * Geschwister in einer von 3 `.article-avatar-stack`-Kacheln (2 Avatare in Zeilen\n * 8343–8344, je 3 in Zeilen 8373–8375 und 8404–8406) — genau dort greift\n * `.article-avatar-stack .article-avatar + .article-avatar`\n * (css/components.css:1540–1541), eine Geschwister-Kette (Kriterium `spec.md` 2b).\n * Ein Element-Selektor `cds-avatar`, der `.article-avatar` auf einem INNEREN Element\n * rendert (wie `cds-facts` es mit `<dl>` tut, weil `<dl>` ein Custom Element nicht\n * annehmen kann), würde diese Kette brechen: die beiden `.article-avatar`-Knoten\n * lägen dann je eine Ebene UNTER ihrem eigenen `<cds-avatar>`-Host und wären keine\n * Geschwister mehr — `+` verlangt denselben Elternknoten, egal wie dicht die Hosts\n * selbst nebeneinanderstehen. Eine zweite, ebenfalls tragfähige Variante\n * (Element-Selektor MIT `host: { class: 'article-avatar' }`, ohne innere\n * Wrapper-Ebene) hätte dieselbe Geschwister-Kette ebenso erfüllt — verworfen zugunsten\n * des Attributselektors nur wegen des zweiten, unabhängigen Grundes unten, nicht weil\n * sie die Kette nicht gelöst hätte.\n *\n * **Gemessen, nicht nur hergeleitet.** Story „Avatar-Stapel“ (Play-Funktion) rendert\n * drei `div[cdsAvatar]` in einem `cds-avatar-stack` und misst\n * `getBoundingClientRect()` der drei `.article-avatar`-Knoten: bei 40 px Kachelbreite\n * und `margin-left:-12px` (css/components.css:1541) überlappen der zweite und dritte\n * Kreis den jeweils vorherigen um 12 px (Differenz der `left`-Koordinaten = 28 px,\n * nicht 40 px) — plus Screenshot-Baseline (`visual-snapshots/…avatar-stapel.png`) als\n * visuelle Bestätigung, nicht nur die Zahl.\n *\n * **Zweiter, unabhängiger Grund: Wiederverwendung als Projektions-Selektor.**\n * `cds-article-header` projiziert den Avatar über\n * `<ng-content select=\"[cdsAvatar]\">` (siehe dessen Klassendoku) — dasselbe Attribut,\n * das hier den Host selektiert, dient dem Elternteil zugleich als\n * Content-Projection-Selektor. Ein Element-Selektor bräuchte dafür eine zusätzliche,\n * eigens erfundene Marker-Klasse; der Attributselektor liefert die Zielscheibe für\n * beide Zwecke aus einer Hand, ohne dass der Konsument zwei Attribute schreiben muss.\n *\n * **Initialen werden aus `name` abgeleitet, kein eigener Input** (Ticket-Vorgabe):\n * erstes Zeichen des ersten und des letzten durch Whitespace getrennten Worts, groß\n * — ein einzelnes Wort liefert dessen erste zwei Zeichen. Zwei Inputs für dieselbe\n * Information (Name UND Initialen) könnten auseinanderlaufen, sobald nur eines\n * gepflegt wird.\n *\n * **`aria-hidden=\"true\"` fest verdrahtet, kein Input.** Ausgezählt: von 53\n * `.article-avatar`-Instanzen (11 Grundgröße + 17 `-lg` + 25 `-xl`) tragen 45 das\n * Attribut direkt am Element; die restlichen 8 sind genau die Grundgrößen-Avatare\n * INNERHALB von `.article-avatar-stack`, wo bereits der Stack-Container selbst\n * `aria-hidden=\"true\"` trägt (siehe `AvatarStackComponent`) — dort wäre ein zweites\n * `aria-hidden` am Kind redundant, aber unschädlich: verschachteltes `aria-hidden`\n * ändert nichts am Ergebnis, der Teilbaum ist so oder so für Assistenztechnologie\n * unsichtbar. Der Avatar trägt es deshalb immer: 100 % Deckung mit dem Mockup im\n * Alleinstand, harmlose Redundanz im Stapel.\n */\n@Component({\n selector: 'div[cdsAvatar]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'article-avatar',\n '[class.article-avatar-lg]': \"size() === 'lg'\",\n '[class.article-avatar-xl]': \"size() === 'xl'\",\n '[attr.data-area]': 'area() || null',\n 'aria-hidden': 'true',\n },\n template: `\n @if (src()) {\n <img [src]=\"src()\" [alt]=\"name()\" />\n } @else {\n {{ initials() }}\n }\n `,\n})\nexport class AvatarComponent {\n /** Voller Name — Quelle der Initialen und des Bild-`alt`-Texts. */\n readonly name = input.required<string>();\n /** Größe (`.article-avatar` = sm, `-lg`, `-xl`). */\n readonly size = input<CdsAvatarSize>('sm');\n /** Markenbereich → `data-area` (Füllfarbe der Initialen-Kachel). */\n readonly area = input<CdsArea>();\n /** Bildquelle; gesetzt → `<img>` ersetzt die Initialen. */\n readonly src = input('');\n\n /**\n * Erstes Zeichen des ersten und letzten Worts aus `name`, groß — bei einem\n * einzelnen Wort dessen erste zwei Zeichen.\n *\n * @internal\n */\n protected readonly initials = computed(() => {\n const parts = this.name().trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase();\n return (parts[0]![0] + parts[parts.length - 1]![0]).toUpperCase();\n });\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * AvatarStack (`cds-avatar-stack`) — Wrapper um `.article-avatar-stack` aus\n * css/components.css (css/components.css:1538–1545): mehrere `div[cdsAvatar]`\n * überlappend für Mehrfach-Autor:innen im Meta-Strip, mit optionalem\n * „+N“-Indikator (`.article-avatar-more`) ab vier Personen (siehe\n * `wissensbeitrag.mdx`, Abschnitt „Mehrere Autor:innen“).\n *\n * **Element-Selektor, ADR-0008-Standardfall.** `.article-avatar-stack` ist selbst\n * nie Grid-/Flex-Kind mit Stretch-Bedarf — sein einziger reale Elternkontext,\n * `.article-meta-author`, ist `display:flex;align-items:center` (center, nicht\n * stretch, css/components.css:1514), variiert nicht das Tag und ist selbst nie Teil\n * einer `+`-Kette (nur SEINE Kinder sind das, siehe `AvatarComponent`). Die Klasse\n * darf deshalb direkt am `<cds-avatar-stack>`-Host sitzen.\n *\n * **`<ng-content>` fügt kein eigenes Element ein**, die projizierten\n * `div[cdsAvatar]` bleiben deshalb direkte, adjazente Geschwister des optionalen\n * `.article-avatar-more`-Kreises — Voraussetzung für\n * `.article-avatar-stack .article-avatar + .article-avatar-more`\n * (css/components.css:1541).\n *\n * **`aria-hidden=\"true\"` fest verdrahtet.** Ausgezählt: alle 3 realen\n * `.article-avatar-stack`-Vorkommen (`docs/index.html:8342,8372,8403`) tragen es —\n * dieselbe Begründung wie in `wissensbeitrag.mdx` („Barrierefreiheit“): Namen stehen\n * vollständig als Text in `.article-meta-name`, der Stapel selbst trägt keine eigene\n * Information, der „+N“-Kreis ebenfalls nicht (die Restzahl steht redundant im\n * Namenstext, siehe Story).\n */\n@Component({\n selector: 'cds-avatar-stack',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'article-avatar-stack', 'aria-hidden': 'true' },\n template: `\n <ng-content></ng-content>\n @if (more() > 0) {\n <div class=\"article-avatar-more\">+{{ more() }}</div>\n }\n `,\n})\nexport class AvatarStackComponent {\n /** Restzahl für den „+N“-Kreis (`.article-avatar-more`); 0 = kein Indikator. */\n readonly more = input(0);\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { CdsArea } from '../area';\nimport { PillComponent } from '../pill/pill.component';\n\n/** Ein Eintrag der Breadcrumb-Leiste (`.article-breadcrumb`). */\nexport interface CdsArticleBreadcrumbItem {\n /** Sichtbarer Text. */\n label: string;\n /** Linkziel. Am letzten Eintrag wirkungslos, siehe Klassendoku. */\n href?: string;\n}\n\n/**\n * ArticleHeader (`cds-article-header`) — Wrapper um `.article-header` aus\n * css/components.css (css/components.css:1486–1490, 1508–1519): der zentrierte Kopf\n * eines Wissensbeitrags (Breadcrumb, optionale Pill, H1, Lead, Meta-Strip). Elftes\n * Ticket der Seitenbausteine-Serie. Hauptvorlage ist\n * `storybook-angular/src/docs/seitenmuster/wissensbeitrag.mdx`, Abschnitt „Article\n * Header“ — dort steht das für dieses Ticket verbindliche Markup samt Begründung,\n * nicht nur das Mockup in `docs/index.html`.\n *\n * **Breadcrumb sitzt im Header — abweichend von der allgemeinen Navigationsregel,\n * bewusst der Ticket-Vorlage folgend.** `docs/index.html:2423` dokumentiert für\n * Unterseiten allgemein, wörtlich: „Den Breadcrumb nicht in einen zentrierten\n * `.article-header` einbetten, sonst wird er mittig ausgerichtet und bekommt einen\n * abweichenden Abstand zur Nav“ (Tabellenzeile „Nicht“ der Breadcrumb-Doku) — und\n * ausgezählt\n * sind es genau die beiden EINZIGEN vollständigen Beispielseiten mit\n * `.article-header` (Stellenanzeige `docs/index.html:11035`, Wissensbeitrag · KI\n * `docs/index.html:15020`), die dieser Regel folgen: beide setzen den Breadcrumb in\n * eine EIGENE, linksbündige `.ep-section` VOR dem Header (`docs/index.html:\n * 11023–11031` bzw. `15010–15015`). Dem stehen 6 ISOLIERTE Doku-Demos gegenüber, die\n * den Breadcrumb INNERHALB von `.article-header` zeigen: 5 kleine Referenz-Boxen in\n * der Doku-Sektion selbst (`docs/index.html:7850`, `8304`, `8331`, `8361`, `8392` —\n * ohne Topnav/Hero/Footer, reine Bauteil-Illustrationen) plus das Code-Beispiel in\n * `wissensbeitrag.mdx`. Das Ticket benennt genau diese Doku (nicht die\n * Beispielseiten) als Hauptvorlage. Diese Komponente folgt der Ticket-Vorgabe\n * (Breadcrumb als Input, im Header) und dokumentiert den Widerspruch als eigenen\n * Befund\n * (`.scratch/angular-seitenbausteine/issues/20-breadcrumb-in-oder-vor-article-header.md`).\n * Konsumenten, die der allgemeinen Regel folgen wollen (wie die beiden echten\n * Beispielseiten), lassen `breadcrumb` leer und setzen die Leiste selbst davor\n * (siehe Story „Ohne Breadcrumb“).\n *\n * **Letzter Breadcrumb-Eintrag immer ohne Link, mit `aria-current=\"page\"`** — so vom\n * Ticket als Akzeptanzkriterium gefordert. Die beiden Wissensbeitrag-Inline-Beispiele\n * (`docs/index.html:7850–7856`, `wissensbeitrag.mdx`) zeigen dafür nur 2 Einträge,\n * BEIDE als `<a>`, ohne `aria-current` — eine zur Kürze vereinfachte Doku-Skizze,\n * kein vollständiges Barrierefreiheits-Beispiel. Das volle, korrekte Muster (Trenner\n * dekorativ, letzter Eintrag `<span aria-current=\"page\">` ohne Link) steht an\n * anderer Stelle exakt so vor (`docs/index.html:2406–2412` allgemeine\n * Breadcrumb-Doku, `docs/index.html:11023–11030` Stellenanzeige) und ist zusätzlich\n * eine explizite Akzeptanzbedingung des Tickets — die Komponente folgt deshalb\n * diesem Muster für den letzten Array-Eintrag, unabhängig von einem dort eventuell\n * gesetzten `href`.\n *\n * **Keine bereichsgefärbte Breadcrumb-Verlinkung (`.t-{area}`).** Die\n * Inline-Beispiele färben ihren zweiten (dort letzten) Eintrag mit `.t-ki`/`.t-es`/\n * `.t-wo`; das Ticket sieht dafür aber kein API-Feld vor (`{label, href?}`, kein\n * `area` pro Eintrag), und eine Zuordnung „Bereichsfarbe auf den vorletzten\n * Eintrag“ wäre geraten, nicht aus der Doku ableitbar — zumal der gefärbte Eintrag\n * dort ein Link ist, kein `aria-current`-Element, also nicht deckungsgleich mit dem\n * oben umgesetzten Muster. Bleibt bewusst außen vor.\n *\n * **Pill über `cds-pill`, kein direkt komponiertes `<span class=\"pill\">`.** Geprüft\n * per `npx storybook tools docs show --id komponenten-chips-badges-pills-pill`:\n * `PillComponent`s Host ist `<cds-pill>`, `.pill` sitzt eine Ebene darunter auf\n * einem inneren `<span>` (anders als bei `FeaturedCardComponent`, wo genau das wegen\n * `.card-featured-body>.pill`-Kindselektoren nicht ginge). `.article-header`/`.pill`\n * haben keinen solchen Kindselektor (css/components.css:1486–1507 geprüft) — die\n * zusätzliche Ebene ist hier folgenlos, deshalb bleibt `cds-pill` als echte\n * Komponente eingesetzt, keine Klassen-Duplikation nötig.\n *\n * **Pille rendert nur, wenn `area` UND `pill` gesetzt sind — kein erfundener\n * Default.** `PillComponent.area` ist als `CdsArea` mit einem eigenen Default\n * (`'ki'`) typisiert; diese Komponente führt `area` dagegen als `CdsArea | undefined`\n * (keine Konfigurations-Vorgabe laut Ticket-API). Ein erster Entwurf reichte\n * `area()` per `as CdsArea`-Cast durch, damit ein `undefined`-Binding\n * `cds-pill`s eigenen Default überschreiben kann — eine Typ-Lüge, um einen Fall\n * abzudecken, der beim Nachzählen gar nicht vorkommt: **alle 9** `.pill`-Vorkommen\n * im Article-Header-Kontext (`docs/index.html:7856, 7912–7914, 8310, 8337, 8367,\n * 8398, 15021`) tragen ein `data-area`, keines ohne Bereich. Die Pille rendert\n * deshalb nur innerhalb von `@if (area(); as pillArea)` (narrowt `CdsArea |\n * undefined` sauber auf `CdsArea`, ohne Cast) — ist `pill()` gesetzt, `area()`\n * aber nicht, bleibt die Pille schlicht weg, statt eine geratene Bereichsfarbe zu\n * zeigen. Gepinnt in der Story „Pille ohne Bereich“.\n *\n * **`pillAriaLabel`, wie bei `FeaturedCardComponent`.** `PillComponent`s eigener\n * Default („Bereich `<label>`“) passt nur, wenn die Pille einen Bereichsnamen trägt\n * (Stellenanzeige, `docs/index.html:11036`: „Bereich Effektive Software“). Im\n * Wissensbeitrag trägt die Pille dagegen die Lesezeit (`wissensbeitrag.mdx`,\n * Abschnitt „Pill · Lesezeit“: `aria-label=\"Lesezeit 8 Minuten\"`) — ein Text, den\n * die Komponente nicht zuverlässig aus einem freien `pill`-String wie\n * „8 min Lesezeit“ herleiten kann (keine Zahl zu parsen, keine Garantie, dass der\n * Text überhaupt eine Lesezeit ist). `pillAriaLabel` bleibt deshalb optional, ohne\n * eigenen Default: ungesetzt geht `undefined` direkt an `cds-pill`s `ariaLabel`\n * durch, das dann auf seinen eigenen Default („Bereich `<pill>`“) zurückfällt —\n * keine Logik-Duplikation nötig, weil hier die echte `PillComponent` verwendet\n * wird, keine Klassen-Nachbildung.\n *\n * **`date`/`dateLabel` getrennt, ANDERS als `cds-stoerer`.** `cds-stoerer`\n * formatiert ein reines ISO-Datum selbst nach `de-DE`\n * (`stoerer.component.ts:formattedDate`, inkl. manuellem Aufbau der\n * `Date`-Komponenten gegen den UTC-Mitternacht-Fallstrick von `new Date(iso)`).\n * Diese Komponente tut das NICHT: `date` liefert nur den maschinenlesbaren\n * `datetime`-Wert, `dateLabel` die sichtbare Schreibweise — vom Ticket ausdrücklich\n * als zwei getrennte Inputs vorgegeben. Begründung der Abweichung: Erstens deckt\n * sich das mit jeder realen Instanz (6 von 6 `.article-meta-date`-Vorkommen tragen\n * einen redaktionell gesetzten Text wie „13. Mai 2026“, keinen von\n * `Intl.DateTimeFormat` erzeugten) — anders als der Störer, dessen Kacheln NUR ein\n * ISO-Datum ohne separaten Text führen. Zweitens umgeht die Trennung den\n * Zeitzonen-Fallstrick vollständig, statt ihn zu beheben: ohne eigene Formatierung\n * konstruiert diese Komponente nie ein `Date`-Objekt aus `date()`, die\n * UTC-Mitternacht-Falle kann hier gar nicht erst auftreten. Ist `dateLabel` leer,\n * zeigt die Komponente `date()` unverändert als sichtbaren Text (bewusst als\n * ISO-Form, nicht geraten formatiert) — in der Story „Interaktiv“ als Warnfall extra\n * benannt, damit niemand das versehentlich auf eine Produktionsseite bringt.\n *\n * **Meta-Strip nur, wenn es etwas zu zeigen gibt.** `authorName`/`date` sind laut\n * Ticket-API Beiwerk (Default `''`); ausgezählt haben alle 6 realen\n * `.article-meta`-Vorkommen sowohl Autor als auch Datum, eine Stellenanzeige\n * (`docs/index.html:11035`) nutzt `.article-header` dagegen KOMPLETT OHNE\n * `.article-meta` (dort ein `<dl>` aus Job-Fakten statt Autor/Datum) — dieser\n * abweichenden Verwendung folgt diese Komponente nicht (sie hat in der Ticket-API\n * keinen Platz), sie belegt aber, dass ein leerer Meta-Strip ein realer Fall ist.\n * `.article-meta` (und darin `.article-meta-author`/`.article-meta-sep`) rendern\n * deshalb nur, wenn `authorName()` bzw. `date()` tatsächlich etwas liefern; der\n * Trenner nur, wenn beide Seiten vorhanden sind.\n *\n * **Avatar projiziert über `[cdsAvatar]`, PLUS `cds-avatar-stack`.** Die\n * Ticket-Skizze nennt nur `<ng-content select=\"[cdsAvatar]\">`; ergänzt um den\n * Tag-Selektor `cds-avatar-stack`, weil `AvatarStackComponent` (siehe dort) ein\n * Element-Selektor ist, kein `[cdsAvatar]`-Attribut trägt und sonst nicht in den\n * Meta-Strip projiziert werden könnte — nötig für die vom Ticket geforderte Story\n * „Mehrere Autor:innen“.\n *\n * **Host als Block.** `.article-header` sitzt am Host und setzt nur\n * `max-width:880px;margin:0 auto`. An einem unbekannten, also `display:inline`\n * gerenderten Element greift beides nicht, die Block-Kinder liefen über die\n * 880 px hinaus. `:host{display:block}` wie bei `cds-hero-image` und\n * `cds-footer-main`; Story „Breite begrenzt“ pinnt das.\n */\n@Component({\n selector: 'cds-article-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [PillComponent],\n host: { class: 'article-header' },\n styles: [':host{display:block}'],\n template: `\n @if (breadcrumb().length) {\n <nav class=\"article-breadcrumb\" aria-label=\"Breadcrumb\">\n @for (item of breadcrumb(); track $index; let last = $last) {\n @if (last) {\n <span aria-current=\"page\">{{ item.label }}</span>\n } @else {\n @if (item.href) {\n <a [href]=\"item.href\">{{ item.label }}</a>\n } @else {\n <span>{{ item.label }}</span>\n }\n <span class=\"article-breadcrumb-sep\" aria-hidden=\"true\">/</span>\n }\n }\n </nav>\n }\n @if (area(); as pillArea) {\n @if (pill()) {\n <cds-pill [label]=\"pill()\" [area]=\"pillArea\" [ariaLabel]=\"pillAriaLabel()\" />\n }\n }\n <h1 class=\"article-title\">{{ title() }}</h1>\n @if (lead()) {\n <p class=\"article-lead\">{{ lead() }}</p>\n }\n @if (hasAuthor() || hasDate()) {\n <div class=\"article-meta\">\n @if (hasAuthor()) {\n <div class=\"article-meta-author\">\n <ng-content select=\"[cdsAvatar], cds-avatar-stack\"></ng-content>\n <div class=\"article-meta-text\">\n <p class=\"article-meta-name\">{{ authorName() }}</p>\n @if (authorRole()) {\n <p class=\"article-meta-role\">{{ authorRole() }}</p>\n }\n </div>\n </div>\n }\n @if (hasAuthor() && hasDate()) {\n <span class=\"article-meta-sep\" aria-hidden=\"true\"></span>\n }\n @if (hasDate()) {\n <time class=\"article-meta-date\" [attr.datetime]=\"date()\">{{\n dateLabel() || date()\n }}</time>\n }\n </div>\n }\n `,\n})\nexport class ArticleHeaderComponent {\n /** Titel (`.article-title`, `<h1>`). */\n readonly title = input.required<string>();\n /** Anreißer unter dem Titel (`.article-lead`), leer = kein Lead. */\n readonly lead = input('');\n /** Breadcrumb-Pfad; letzter Eintrag rendert ohne Link mit `aria-current=\"page\"`. */\n readonly breadcrumb = input<CdsArticleBreadcrumbItem[]>([]);\n /** Pille über dem Titel (`.pill`, via `cds-pill`), leer = keine Pille. */\n readonly pill = input('');\n /** `aria-label` der Pille überschreiben, siehe Klassendoku. */\n readonly pillAriaLabel = input<string>();\n /** Markenbereich → `data-area` der Pille; ungesetzt = keine Pille (siehe Klassendoku). */\n readonly area = input<CdsArea>();\n /** Name im Meta-Strip (`.article-meta-name`), leer = kein Meta-Strip-Autorblock. */\n readonly authorName = input('');\n /** Rolle im Meta-Strip (`.article-meta-role`), leer = keine Rollenzeile. */\n readonly authorRole = input('');\n /** ISO-Datum (`JJJJ-MM-TT`) → `<time datetime>`, leer = kein Datum. */\n readonly date = input('');\n /** Sichtbare Schreibweise des Datums; leer = `date` steht unverändert sichtbar. */\n readonly dateLabel = input('');\n\n /** @internal */\n protected readonly hasAuthor = computed(() => !!this.authorName());\n /** @internal */\n protected readonly hasDate = computed(() => !!this.date());\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** Ein Eintrag des Inhaltsverzeichnisses (`.article-toc-list li`). */\nexport interface CdsArticleTocItem {\n /** Sichtbarer Linktext, i. d. R. die Überschrift des Abschnitts. */\n label: string;\n /** Sprungziel, i. d. R. der Anker der zugehörigen `<h2>` im Article Body. */\n href: string;\n}\n\n/**\n * ArticleToc (`cds-article-toc`) — Wrapper um `.article-toc*` aus css/components.css\n * (css/components.css:1577–1589): das aufklappbare Inhaltsverzeichnis am Anfang eines\n * Wissensbeitrags. Zwölftes Ticket der Seitenbausteine-Serie („Artikel-Körper“).\n * Ausgezählt: genau 2 reale Vorkommen, beide mit 5 Einträgen und identischem\n * sichtbarem Text „Inhalt“ plus identischem `aria-label`\n * (`docs/index.html:7948–7960`, Doku-Sektion mit Platzhalter-Hrefs `#gt-article-toc`;\n * `docs/index.html:15049–15061`, reale Beispielseite Wissensbeitrag · KI mit echten\n * Abschnittsankern wie `#wb-ki-demo`).\n *\n * **Element-Selektor, ADR-0008-Standardfall.** `.article-toc` sitzt in beiden\n * Vorkommen als gewöhnlicher Block-Nachfahre direkt in `.article-body`\n * (`docs/index.html:7950`, `15051` je eine Ebene über dem `<details>`) — kein\n * Grid-/Flex-Kind, keine Layout-Klasse (`col-*`) vom Konsumenten, kein\n * Geschwister-Kombinator (`.article-toc` kommt in keiner CSS-Regel mit `+`/`~`\n * vor), kein Tag-Wechsel (immer `<details>`). Keines der drei ADR-0008-Kriterien\n * greift; ein Attributselektor brächte hier nichts. Die einzige direkte\n * Kind-Regel von `.article-body` (`.article-body > p`, css/components.css:1566)\n * zielt auf `p`, nicht auf `details` — ein `<cds-article-toc>`-Host zwischen\n * `.article-body` und dem `<details>` bricht deshalb keine Selektorkette.\n *\n * **Natives `<details>`/`<summary>`, kein nachgebautes Disclosure** (Ticket-Vorgabe,\n * Akzeptanzkriterium): Tastaturbedienung (Enter/Space auf `<summary>`) und\n * Toggle-Zustand kommen vollständig vom Browser, das CSS hängt direkt an `[open]`\n * (`.article-toc[open] .article-toc-caret`, css/components.css:1583). `<details\n * class=\"article-toc\">` sitzt deshalb im TEMPLATE, nicht am Host — derselbe Grund\n * wie bei `cds-compare`s `<details class=\"ep-compare\">` (`compare.component.ts`):\n * ein `<cds-article-toc>`-Host ist ein unbekanntes Custom Element und kann native\n * Disclosure-Semantik nicht annehmen.\n *\n * **Zweites Vorkommen des `<details>`-mit-drehendem-Caret-Musters, nicht\n * zusammengezogen mit `cds-compare` (ADR-0007 §5).** Beide Bauteile teilen die\n * Form (natives `<details>`, SVG-Caret, `[open]`-Rotation über\n * `transition:transform`), aber nicht die Aufgabe: `cds-compare` trägt eine\n * Vergleichstabelle mit `columns`/`rows`/`toggled`-Output, dieses Bauteil trägt\n * eine reine Link-Liste ohne Output (siehe API-Vorgabe des Tickets, die für dieses\n * Bauteil bewusst keinen `toggled` vorsieht). Zwei gleiche Stellen sind ein\n * Zufall, kein Muster — eine gemeinsame Basisklasse für zwei Vorkommen hätte nur\n * das `<details>`+Caret-Skelett gebündelt und dabei entweder Verhalten\n * vereinheitlicht (ein erzwungener `toggled`-Output ohne Zweck hier) oder so viel\n * parametrisiert, dass nichts gewonnen wäre.\n *\n * **`aria-label` am `<summary>` ist fest verdrahtet, kein Input.** Ausgezählt:\n * beide realen Vorkommen tragen wortgleich\n * `aria-label=\"Inhaltsverzeichnis ein- und ausklappen\"` — der sichtbare Text\n * „Inhalt“ (`summary`-Input) allein wäre außerhalb des Beitragskontexts nicht\n * eindeutig, das `aria-label` schreibt deshalb aus, was das Element tut. Genau\n * dieser Wortlaut aus dem Mockup übernommen, kein erfundener zugänglicher Name.\n *\n * **Keine Nummerierung im Markup.** Die sichtbaren Ziffern vor jedem Eintrag\n * kommen aus `counter(toc)` auf `.article-toc-list li::before`\n * (css/components.css:1586), nicht aus dem `<ol>`-Default (`list-style:none` setzt\n * ihn zurück) — die Komponente muss dafür nichts weiter tun als `<ol\n * class=\"article-toc-list\">` zu rendern.\n */\n@Component({\n selector: 'cds-article-toc',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <details class=\"article-toc\" [attr.open]=\"open() ? '' : null\">\n <summary class=\"article-toc-summary\" aria-label=\"Inhaltsverzeichnis ein- und ausklappen\">\n <span>{{ summary() }}</span>\n <svg\n class=\"article-toc-caret\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n aria-hidden=\"true\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m19.5 8.25-7.5 7.5-7.5-7.5\" />\n </svg>\n </summary>\n <ol class=\"article-toc-list\">\n @for (item of items(); track $index) {\n <li>\n <a [href]=\"item.href\">{{ item.label }}</a>\n </li>\n }\n </ol>\n </details>\n `,\n})\nexport class ArticleTocComponent {\n /** Sichtbarer Text im `<summary>`, z. B. „Inhalt“. */\n readonly summary = input('Inhalt');\n /** Anfangszustand des `<details>` — reine Vorbelegung, kein Zwei-Wege-Zustand. */\n readonly open = input(false);\n /** Abschnitte des Beitrags, in Anzeige-Reihenfolge. */\n readonly items = input.required<CdsArticleTocItem[]>();\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n// Modulweiter Zähler → eindeutige id für die Eyebrow (aria-labelledby), analog zum Muster in\n// section.component.ts / area-tabs.component.ts / scale.component.ts.\nlet uid = 0;\n\n/**\n * ArticleCallout (`cds-article-callout`) — Wrapper um `.article-callout*` aus\n * css/components.css (css/components.css:1591–1600): der bereichsgetönte\n * Aside-Block für Praxis-Beispiele und „In der Realität“-Einschübe im Lauftext\n * eines Wissensbeitrags. Zwölftes Ticket der Seitenbausteine-Serie\n * („Artikel-Körper“). Ausgezählt: 5 reale Vorkommen, je eines pro Bereich in der\n * Doku-Sektion (`docs/index.html:8086–8115`, co/ki/es/wo) plus eines in der realen\n * Beispielseite Wissensbeitrag · KI (`docs/index.html:15110–15114`).\n *\n * **Element-Selektor, ADR-0008-Standardfall.** `.article-callout` sitzt in allen 5\n * Vorkommen als gewöhnlicher Block-Nachfahre — die 4 Doku-Boxen je in einem\n * schlichten `<div>` innerhalb eines `display:flex;flex-direction:column`-Stapels\n * (kein Stretch-Bedarf in Spaltenrichtung), die reale Instanz direkt in\n * `.article-body`. Keines ist ein Grid-/Flex-Kind mit Streckungsbedarf, keines\n * trägt eine `col-*`-Klasse, `.article-callout` kommt in keiner CSS-Regel mit\n * einem Geschwister-Kombinator (`+`/`~`) vor, das Tag variiert nicht (immer\n * `<aside>`). Keines der drei ADR-0008-Kriterien greift. Die einzige direkte\n * Kind-Regel von `.article-body` (`.article-body > p`, css/components.css:1566)\n * zielt auf `p`, nicht auf `aside` — ein `<cds-article-callout>`-Host zwischen\n * `.article-body` und dem `<aside>` bricht deshalb keine Selektorkette.\n *\n * **Projizierte Absätze bleiben direkte Kinder von `.article-callout`, kein\n * `<div>` um `<ng-content>`** (Ticket-Vorgabe: `.article-callout > p` ist ein\n * Kindselektor, css/components.css:1600). `<ng-content>` selbst fügt kein\n * DOM-Element ein — es verschiebt nur die vom Konsumenten geschriebenen\n * `<p>`-Elemente an ihre Stelle direkt im `<aside>`, eine Ebene unter dem\n * `<cds-article-callout>`-Host, aber ohne zusätzlichen Knoten dazwischen. Geprüft\n * im laufenden Storybook (Story „Interaktiv“, Play-Funktion):\n * `aside.article-callout > p` liefert sowohl die Eyebrow als auch jeden\n * projizierten Absatz, `:scope > *` zählt keine fremde Zwischenebene.\n *\n * **`eyebrow` ist Beiwerk (Default `''`), `area` ist Konfiguration mit\n * verteidigbarer Vorgabe (`'co'`).** Die Basisregel `.article-callout` selbst\n * (ohne `[data-area]`) rendert bereits exakt wie `[data-area=\"co\"]`\n * (`background:var(--co-50)`, `border-left-color:var(--co-500)`, beide Werte\n * identisch an beiden Stellen, css/components.css:1591–1592) — `'co'` ist damit\n * keine erfundene Markenfarbe, sondern der reale CSS-Fallback ohne Attribut.\n * Anders als bei `cds-pill` (dessen `.pill` ohne `data-area` gar keine Füllfarbe\n * hat) gibt es hier keinen sinnvollen „kein Bereich“-Zustand.\n *\n * **Bekannter CSS-Befund, nicht im Wrapper geflickt (ADR-0001):**\n * `.article-callout-eyebrow` (Spezifität 0,1,0) verliert gegen\n * `.article-callout > p` (Spezifität 0,1,1, css/components.css:1600), weil die\n * Eyebrow selbst ein `<p>` UND ein direktes Kind von `.article-callout` ist.\n * Gemessen in rohem Markup ohne Angular (Playwright/Chromium,\n * `getComputedStyle`): die Eyebrow rendert in JEDEM Bereich mit `font-size:16px`\n * statt `12px` und `margin-bottom:0` statt `4px`; die Akzentfarbe geht zusätzlich\n * verloren, wenn kein bereichsspezifischer Override existiert (`co` und „kein\n * `data-area`“ zeigen `--tx-primary` statt `--co-700`). Diese Komponente\n * reproduziert exakt die Klassen und die Struktur des Mockups und zeigt deshalb\n * denselben, vorbestehenden Fehler wie rohes HTML — siehe\n * `.scratch/angular-seitenbausteine/issues/22-css-luecke-callout-eyebrow-spezifitaet.md`.\n *\n * **`aria-labelledby` auf `<aside>`, sobald `eyebrow` gesetzt ist — Zusatz zum\n * Mockup, keine CSS-Änderung.** `<aside>` hat implizit die Landmark-Rolle\n * `complementary`; ein Wissensbeitrag mit mehr als einem Callout hat damit\n * mehrere gleichnamige Landmarks ohne zugänglichen Namen. Gemessen mit\n * axe-core an rohem Markup ohne Angular (zwei `<aside class=\"article-callout\">`\n * ohne Auszeichnung): `landmark-unique` schlägt fehl, unabhängig von dieser\n * Komponente — das Mockup selbst kennt diese Auszeichnung nicht (siehe\n * `.scratch/angular-seitenbausteine/issues/23-doku-luecke-callout-landmark-label.md`).\n * Die Eyebrow ist bereits ein prägnanter, vom Redakteur gepflegter Kurztext\n * genau für diesen Zweck (z. B. „In der Praxis“) — sie bekommt deshalb eine\n * generierte `id`, auf die `aria-labelledby` zeigt, sobald sie existiert. Ohne\n * Eyebrow bleibt das `<aside>` unbenannt wie im Mockup: ein zugänglicher Name\n * ließe sich sonst nur aus dem projizierten Absatztext raten, und das wäre eine\n * erfundene Bezeichnung, keine reale.\n */\n@Component({\n selector: 'cds-article-callout',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <aside\n class=\"article-callout\"\n [attr.data-area]=\"area() || null\"\n [attr.aria-labelledby]=\"eyebrowId()\"\n >\n @if (eyebrow(); as eyebrowText) {\n <p class=\"article-callout-eyebrow\" [id]=\"eyebrowId()\">{{ eyebrowText }}</p>\n }\n <ng-content></ng-content>\n </aside>\n `,\n})\nexport class ArticleCalloutComponent {\n private readonly instanceId = `cds-article-callout-${uid++}`;\n\n /** Kicker über dem Absatztext (`.article-callout-eyebrow`), leer = keine Eyebrow. */\n readonly eyebrow = input('');\n /** Markenbereich → `data-area` (Hintergrund + Akzentfarbe), siehe Klassendoku. */\n readonly area = input<CdsArea>('co');\n\n /**\n * `id` der Eyebrow für `aria-labelledby`, nur wenn eine Eyebrow existiert —\n * siehe Klassendoku.\n *\n * @internal\n */\n protected readonly eyebrowId = computed(() =>\n this.eyebrow() ? `${this.instanceId}-eyebrow` : null,\n );\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * ArticleFigure (`cds-article-figure`) — Wrapper um `.article-figure`/\n * `.article-figcaption` aus css/components.css (css/components.css:1573–1575):\n * das redaktionelle Inline-Bild mit optionaler Bildunterschrift im Lauftext eines\n * Wissensbeitrags. Zwölftes Ticket der Seitenbausteine-Serie („Artikel-Körper“).\n * Ausgezählt: 3 reale Vorkommen — Doku-Demo mit Caption\n * (`docs/index.html:8028–8031`), reales Body-Bild mit Caption in der Beispielseite\n * Wissensbeitrag · KI (`docs/index.html:15115–15118`, identischer Bild- und\n * Caption-Text wie die Doku-Demo) und ein dritter, captionsloser Sonderfall direkt\n * unter dem Article Header derselben Beispielseite (`docs/index.html:15040–15042`,\n * dazu unten mehr).\n *\n * **Element-Selektor, ADR-0008-Standardfall.** In allen 3 Vorkommen sitzt\n * `.article-figure` als gewöhnlicher Block-Nachfahre (zwei in `.article-body`,\n * eines direkt in einer eigenen `.ep-section`) — kein Grid-/Flex-Kind, keine\n * `col-*`-Klasse vom Konsumenten, kein Tag-Wechsel (immer `<figure>`), kein\n * Vorkommen von `.article-figure` mit einem Geschwister-Kombinator in\n * css/components.css. Die einzige direkte Kind-Regel von `.article-body`\n * (`.article-body > p`, css/components.css:1566) zielt auf `p`, nicht auf\n * `figure` — ein `<cds-article-figure>`-Host zwischen `.article-body` und dem\n * `<figure>` bricht deshalb keine Selektorkette.\n *\n * **`loading=\"lazy\"` ist fest verdrahtet, kein Input — bewusst NUR der\n * In-Article-Fall, nicht der dritte Mockup-Beleg.** Ausgezählt tragen 2 der 3\n * Vorkommen `loading=\"lazy\"` (die beiden Bilder MIT Caption, mittig im\n * Lauftext, „below the fold“ — genau der in `wissensbeitrag.mdx`, Abschnitt\n * „In-Article Figure“, dokumentierte Dos-Punkt). Das dritte Vorkommen\n * (`docs/index.html:15040–15042`) trägt stattdessen `loading=\"eager\"\n * fetchpriority=\"high\"` UND hat keine Caption — es ist das erste Bild direkt\n * unter dem Article Header (Kommentar im Mockup: „Hero-Bild auf Body-Breite …\n * identisches Bild wie Vorschaubild für Wiedererkennung“), sitzt außerhalb von\n * `.article-body` und bekommt seine 720-px-Breite über ein\n * Inline-`style=\"max-width:720px;margin:0 auto\"` am Konsumenten, nicht über die\n * Komponente (Randbedingung 6 der Spec: Mockup-Inline-Styles wandern nicht in\n * den Wrapper). Die Ticket-API sieht dafür kein `loading`/`fetchpriority`-Input\n * vor; dieses Bauteil deckt deshalb den (häufigeren, dokumentierten) In-Body-Fall\n * ab. Für den Lead-Bild-Sonderfall bleibt `<figure class=\"article-figure\">` roh\n * schreibbar oder — sofern die Semantik passt — `cds-hero-image` (Ticket 02) zu\n * prüfen.\n *\n * **`alt` und `caption` sind bewusst getrennte Pflicht-/Beiwerk-Inputs, keine\n * Prüfung auf inhaltliche Überschneidung.** `wissensbeitrag.mdx` dokumentiert die\n * beiden Rollen ausdrücklich als unterschiedliche Jobs\n * (Dont: „Alt-Text und Caption inhaltlich identisch, Screenreader liest\n * doppelt“) — Vorgabe an den Konsumenten, nicht etwas, das eine Wrapper-Komponente\n * zur Laufzeit sinnvoll erzwingen könnte.\n */\n@Component({\n selector: 'cds-article-figure',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <figure class=\"article-figure\">\n <img [src]=\"src()\" [alt]=\"alt()\" loading=\"lazy\" />\n @if (caption()) {\n <figcaption class=\"article-figcaption\">{{ caption() }}</figcaption>\n }\n </figure>\n `,\n})\nexport class ArticleFigureComponent {\n /** Bildquelle. */\n readonly src = input.required<string>();\n /** Faktische Bildbeschreibung für Screenreader, siehe Klassendoku. */\n readonly alt = input.required<string>();\n /** Redaktionelle Bildunterschrift (`.article-figcaption`), leer = keine Caption. */\n readonly caption = input('');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * ArticlePullquote (`cds-article-pullquote`) — Wrapper um `.article-pullquote` aus\n * css/components.css (css/components.css:1608–1612): die typografische\n * Hervorhebung eines Satzes aus dem eigenen Lauftext eines Wissensbeitrags.\n * Zwölftes Ticket der Seitenbausteine-Serie („Artikel-Körper“). Ausgezählt: 2\n * reale Vorkommen, wortgleich, beide `data-area=\"ki\"` — Doku-Demo\n * (`docs/index.html:8136`) und reale Beispielseite Wissensbeitrag · KI\n * (`docs/index.html:15075`).\n *\n * **Nicht `cds-blockquote` (`BlockquoteComponent`, `.bq`) — Ticket-Vorgabe, im\n * JSDoc beider Bauteile wechselseitig abgegrenzt.** Pull-Quote und Blockquote\n * teilen die typografische Familie (Serif, bereichsgefärbter Linksakzent in\n * `{area}-500`), aber nicht den Zweck, dokumentiert in `wissensbeitrag.mdx`,\n * Abschnitt „Pull-Quote gegen Blockquote“:\n *\n * | | Pull-Quote (dieses Bauteil) | Blockquote (`cds-blockquote`) |\n * |---|---|---|\n * | Wessen Stimme? | Der Beitrag zitiert sich selbst — ein Schlüsselsatz aus dem eigenen Lauftext | Eine dritte, benannte Person (Kund:in, Forschungsstimme, Branchen-Statement) |\n * | Attribution | Keine (`quote` ist der einzige Input) | Pflicht (`name`, `roleLabel`) |\n * | Hintergrund/Icon | Keiner — `quotes:none`, kein Quote-Icon, bewusst „offen“ statt umrahmt | Getönte Akzent-Box (`--bq-bg`) mit Quote-Icon (`.bq-icon`) |\n * | Tag | `<blockquote class=\"article-pullquote\">` direkt, kein umschließendes `<figure>` | `<figure class=\"bq\">` außen, `<blockquote>` (ohne eigene Klasse) innen für den Zitattext |\n *\n * Ein Self-Quote im eigenen Beitrag (Blockquote-Optik auf einem Satz des\n * Autors) wirkt sonst absurd — der Autor zitiert die Person, die den Beitrag\n * schreibt. Wer eine externe Stimme mit Namen und Rolle zeigen will, verwendet\n * `cds-blockquote`.\n *\n * **`quote` enthält die deutschen Anführungszeichen bereits als Teil des Texts,\n * die Komponente ergänzt keine.** `.article-pullquote{quotes:none}`\n * (css/components.css:1608) — es gibt keine `content:open-quote`/`close-quote`-Regel\n * in der CSS-Schicht, weder hier noch bei `.bq blockquote` oder\n * `.testimonial blockquote`. Ausgezählt stehen die Anführungszeichen in BEIDEN\n * realen Vorkommen als literale Zeichen im Text\n * („KI scheitert selten an der Technologie. …“), nicht CSS-generiert. Wie bei\n * `cds-compare`/`cds-table` ist Copy-Text Sache des Konsumenten (ADR-0007 §2) —\n * die Story liefert deshalb `quote` bereits mit „…“ (CONTRIBUTING.md §6), die\n * Komponente rendert den String unverändert, ohne eigene Anführungszeichen zu\n * erfinden.\n *\n * **Element-Selektor, ADR-0008-Standardfall.** `.article-pullquote` sitzt in\n * beiden Vorkommen als gewöhnlicher Block-Nachfahre in `.article-body` — kein\n * Grid-/Flex-Kind, keine `col-*`-Klasse vom Konsumenten, kein\n * Geschwister-Kombinator in css/components.css, kein Tag-Wechsel (immer\n * `<blockquote>`). Die einzige direkte Kind-Regel von `.article-body`\n * (`.article-body > p`, css/components.css:1566) zielt auf `p`, nicht auf\n * `blockquote` — ein `<cds-article-pullquote>`-Host zwischen `.article-body` und\n * dem `<blockquote>` bricht deshalb keine Selektorkette.\n *\n * **`area` ist Konfiguration mit verteidigbarer Vorgabe (`'co'`), keine\n * erfundene Bereichsfarbe.** Die Basisregel `.article-pullquote` selbst (ohne\n * `[data-area]`) setzt bereits exakt denselben Wert wie `[data-area=\"co\"]`\n * (`border-left-color:var(--co-500)`, css/components.css:1608–1609) — `'co'` ist\n * damit der reale CSS-Fallback ohne Attribut, nicht geraten.\n */\n@Component({\n selector: 'cds-article-pullquote',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<blockquote class=\"article-pullquote\" [attr.data-area]=\"area() || null\">\n {{ quote() }}\n </blockquote>`,\n})\nexport class ArticlePullquoteComponent {\n /** Hervorgehobener Satz, inklusive deutscher Anführungszeichen, siehe Klassendoku. */\n readonly quote = input.required<string>();\n /** Markenbereich → `data-area` (Linksakzent), siehe Klassendoku. */\n readonly area = input<CdsArea>('co');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * AuthorCard (`div[cdsAuthorCard]`) — Wrapper um `.author-card` aus css/components.css\n * (css/components.css:1602–1606): der Avatar-plus-Bio-Strip am Ende eines\n * Wissensbeitrags, einzeln oder mehrfach in `cds-author-card-group`. Dreizehntes und\n * letztes Ticket der Seitenbausteine-Serie. Ausgezählt: 17 reale Vorkommen in\n * `docs/index.html` — 4 einzelstehend (2 Doku-Demos `docs/index.html:8193,8207`, 1\n * Artikel-Demo `8424`, 1 reale Beispielseite `15179`) und 13 in fünf Gruppen (siehe\n * `AuthorCardGroupComponent`).\n *\n * **Attributselektor (ADR-0008), gemessen im `is-grid`-Fall statt nur hergeleitet.**\n * `.author-card-group.is-grid` (css/components.css:1555) ist `display:grid` ohne\n * eigenes `align-items` — der CSS-Default `stretch` gleicht die Kartenhöhen einer\n * Reihe deshalb NUR aus, wenn `.author-card` selbst das Grid-Kind ist. Spike-Story\n * (zwei Karten, 600-px-Raster, kurze gegen deutlich längere Bio, seither wieder\n * gelöscht) hat beide Varianten nebeneinander gebaut und mit `getBoundingClientRect()`\n * gemessen:\n *\n * | Variante | Grid-Kind (Tag) | `.author-card`-Höhen | Bio-Rect (kurz / lang) |\n * |---|---|---|---|\n * | Element-Selektor `<cds-author-card-naive>` | `CDS-AUTHOR-CARD-NAIVE`, 204/204 px (gestreckt) | **84 / 204 px** (ungleich) | 24×73 / 144×200 px |\n * | Attributselektor `div[cdsAuthorCardSpike]` | `DIV.author-card`, 204/204 px | **204 / 204 px** (gleich) | — |\n *\n * Beim Element-Selektor wird der UNSICHTBARE `<cds-author-card-naive>`-Host auf 204 px\n * gestreckt, die sichtbare `.author-card`-Box eine Ebene darunter bleibt bei ihrer\n * Inhaltshöhe (84 px) — exakt der Fehler aus ADR-0008 Fall 1. Mit dem Attributselektor\n * IST `.author-card` das Grid-Kind, `align-items:stretch` trifft direkt zu.\n *\n * **Ehrlicher Zusatz, anders als bei `cds-icon-card`: die Baseline-Screenshots beider\n * Spike-Varianten waren byte-identisch** (`sha1` gleich). `.author-card` trägt (anders\n * als `.ep-card`) weder Hintergrund noch Rahmen noch Schatten — der zusätzliche,\n * unsichtbare Leerraum unter der kurzen Bio malt in keiner der beiden Varianten ein\n * Pixel. Der Fehler ist damit heute rein strukturell (falsches Boxmodell, `getBoundingClientRect()`\n * auf `.author-card` lügt), nicht optisch sichtbar. Er wird real, sobald `.author-card`\n * künftig einen Rahmen/Hintergrund/Hover-Zustand bekommt, und er verfälscht schon\n * heute jede Messung/Positionierung, die sich auf die tatsächliche Kartenhöhe verlässt\n * (u. a. die Story „Als Raster“ unten, die genau das pinnt). Das ADR-0008-Kriterium\n * ist strukturell formuliert („die Stelle im DOM einnehmen, die es ohne Angular\n * einnähme“), nicht optisch — der Attributselektor bleibt deshalb die richtige Wahl,\n * obwohl der Effekt heute unsichtbar ist.\n *\n * **`area` ist bewusst NICHT Teil der API — CSS-Befund, nicht erfundene Konfiguration.**\n * Alle 17 realen `.author-card`-Vorkommen tragen `data-area`, und sowohl\n * `docs/index.html:8185` als auch `wissensbeitrag.mdx:199` behaupten wörtlich, das\n * färbe „nur den Avatar“. Ausgezählt gibt es aber in `css/components.css` (Light UND\n * Dark) KEINE einzige `.author-card[data-area=\"…\"]`-Regel — weder direkt noch über\n * einen Nachfahren-Selektor auf `.article-avatar`, dessen eigene\n * `[data-area]`-Färbung (css/components.css:1523–1526) ein Element-Selektor auf dem\n * Avatar selbst ist, unabhängig vom Vorfahren. `data-area` auf `.author-card` ist\n * damit, gegen die Doku-Aussage, komplett wirkungslos — die Bereichsfarbe kommt\n * ausschließlich vom `area`-Input, den der Konsument direkt an das projizierte\n * `[cdsAvatar]` bindet (siehe unten). Ein `area`-Input, der hier nur `data-area` ohne\n * jede CSS-Wirkung setzt, wäre eine erfundene Konfiguration ohne Gegenwert — Befund\n * gemeldet, nicht im Wrapper geflickt (ADR-0001):\n * `.scratch/angular-seitenbausteine/issues/24-css-luecke-author-card-data-area.md`.\n *\n * **Avatar projiziert über `[cdsAvatar]`, wie bei `cds-article-header`.** Der\n * Konsument setzt Größe (`size=\"lg\"`, css/components.css:1527) und Bereich\n * (`area=\"…\"`) direkt am projizierten `<div cdsAvatar>` — diese Komponente reicht\n * nichts durch, exakt die Trennung, die `cds-article-header` bereits etabliert\n * (siehe dessen Klassendoku, Abschnitt „Avatar projiziert über `[cdsAvatar]`“).\n *\n * **Eyebrow als `<h3>`, nur wenn gesetzt** (Beiwerk, Default `''`) — deckungsgleich\n * mit allen 4 einzelstehenden realen Vorkommen: 2 tragen `<h3 class=\"author-card-eyebrow\">`\n * (`docs/index.html:8196,8427`, „Über den Autor“/„Über die Autorin“, Ticket-Vorgabe:\n * eine Ebene unter dem `<h2>` des Article-Body), die anderen 2 (Doku-Demos ohne\n * umgebende Artikelstruktur) haben gar keinen. Innerhalb einer Gruppe trägt laut\n * `wissensbeitrag.mdx` („Eyebrow-Konvention“) keine einzelne Karte mehr einen eigenen\n * Eyebrow — die Gruppen-Überschrift ersetzt sie (siehe `AuthorCardGroupComponent`);\n * Konsumenten lassen `eyebrow` dafür einfach leer.\n *\n * **`roleLabel`, NICHT `role` wie im Ticket-Text — gemessene Abweichung, kein\n * Freihand-Entscheid.** Ein erster Entwurf folgte der Ticket-API wörtlich\n * (`role`-Input, mit `role=\"…\"` als schlichtem Attribut in den Stories gesetzt, wie\n * `name`/`bio`/`eyebrow`). Storybooks eingebauter a11y-Check (`aria-roles`) schlug\n * darauf für JEDE Story mit echtem Rollentext fehl: `role` ist ein globales\n * HTML-/ARIA-Attribut, und ein Angular-Input MIT DIESEM NAMEN wird bei einem\n * ungebundenen `role=\"Senior AI Engineer …\"` zwar als Startwert an den Input\n * durchgereicht, bleibt aber ZUSÄTZLICH als echtes `role`-Attribut im DOM stehen —\n * axe meldete wörtlich „Roles must be one of the valid ARIA roles: Senior, AI,\n * Engineer, …“, weil der Freitext als ARIA-Rolle interpretiert wird. Exakt dieselbe\n * Kollision umgehen `BlockquoteComponent`, `TestimonialComponent` und\n * `TeamVoiceComponent` bereits mit `roleLabel` statt `role`\n * (`grep -rn \"readonly role\" angular-lib/projects/design-system-angular/src/lib/`\n * zeigt nur diese drei). Diese Komponente folgt demselben, bereits etablierten\n * Muster statt die Kollision ein viertes Mal zu wiederholen — CSS-Klasse bleibt\n * unverändert `.author-card-role`, nur der Input-Name weicht vom Ticket-Text ab.\n */\n@Component({\n selector: 'div[cdsAuthorCard]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'author-card' },\n template: `\n <ng-content select=\"[cdsAvatar]\"></ng-content>\n <div>\n @if (eyebrow()) {\n <h3 class=\"author-card-eyebrow\">{{ eyebrow() }}</h3>\n }\n <p class=\"author-card-name\">{{ name() }}</p>\n @if (roleLabel()) {\n <p class=\"author-card-role\">{{ roleLabel() }}</p>\n }\n @if (bio()) {\n <p class=\"author-card-bio\">{{ bio() }}</p>\n }\n </div>\n `,\n})\nexport class AuthorCardComponent {\n /** Name (`.author-card-name`). */\n readonly name = input.required<string>();\n /**\n * Rolle/Position (`.author-card-role`), leer = keine Rollenzeile. Heißt bewusst\n * `roleLabel`, nicht `role` (Kollision mit dem ARIA-Attribut `role`), siehe\n * Klassendoku.\n */\n readonly roleLabel = input('');\n /** Bio-Text (`.author-card-bio`), leer = kein Bio-Absatz. */\n readonly bio = input('');\n /** Kicker über dem Namen (`.author-card-eyebrow`, `<h3>`), leer = keine Eyebrow. */\n readonly eyebrow = input('');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * AuthorCardGroup (`cds-author-card-group`) — Wrapper um `.author-card-group` aus\n * css/components.css (css/components.css:1547–1563): bündelt mehrere `[cdsAuthorCard]`\n * am Ende eines Wissensbeitrags, gestapelt (Default) oder als zweispaltiges Raster\n * (`is-grid`, css/components.css:1555). Dreizehntes und letztes Ticket der\n * Seitenbausteine-Serie. Ausgezählt: 5 reale Gruppen — 2 gestapelt in der\n * Artikel-Demo (`docs/index.html:8440,8465`, je 2 bzw. 3 Karten), 2 `is-grid`\n * (Doku-Demo `9112`, reale Beispielseite Scrum-Training `13811`, je 4 Karten) und 0\n * `is-grid`-Vorkommen im Wissensbeitrag selbst — `wissensbeitrag.mdx` verweist für\n * `is-grid` ausdrücklich auf `Seitenmuster/Seminar · Training`, „weil sie dort und\n * nicht in Wissensbeiträgen vorkommt“.\n *\n * **Element-Selektor, ADR-0008-Standardfall FÜR DIE GRUPPE SELBST** — anders als die\n * projizierte Karte. `.author-card-group` ist in keinem der 5 realen Vorkommen\n * selbst ein Grid-/Flex-Kind mit Streckungsbedarf (jedes sitzt direkt in einer\n * `.ep-section`/einem einfachen `<div>`), trägt nie eine `col-*`-Klasse vom\n * Konsumenten und kommt in keiner CSS-Regel mit einem Geschwister-Kombinator vor. Das\n * Tag variiert nicht (immer `<div>`). Ein `<cds-author-card-group>`-Host darüber\n * bricht deshalb selbst keine Selektorkette — die Karten dagegen brauchen ihren\n * eigenen Attributselektor, siehe `AuthorCardComponent`.\n *\n * **Die Klasse `.author-card-group` sitzt trotzdem NICHT auf dem Host, sondern auf\n * einem inneren `<div>` — das ist eine eigene, von den Karten unabhängige\n * Randbedingung.** Grund: `.author-card-group-eyebrow:has(+ .author-card-group.is-grid)`\n * (css/components.css:1563) ist ein Geschwister-Selektor: die Eyebrow-Überschrift\n * muss ein UNMITTELBARES Geschwister von `.author-card-group` sein, damit sie im\n * `is-grid`-Fall die breitere `max-width:960px` statt der Basis-`720px`\n * (css/components.css:1560) bekommt — sonst „sitzt sie bei der Raster-Variante 120 px\n * links neben der ersten Karte“ (Kommentar im CSS selbst). Läge `.author-card-group`\n * auf dem Host, könnte diese Komponente die Eyebrow nicht als Geschwister VOR dem\n * Host rendern (ein Angular-Template füllt ausschließlich das Innere seines eigenen\n * Hosts, nie dessen Umgebung) — die Eyebrow müsste dann ALS KIND in `.author-card-group`\n * selbst stehen und würde im Raster zur eigenen Grid-Zelle neben der ersten Karte,\n * sichtbar falsch. Mit der Klasse auf einem inneren `<div>` rendert das Template\n * `<h3 class=\"author-card-group-eyebrow\">` und `<div class=\"author-card-group …\">`\n * als echte, unmittelbare Geschwister IM Host `<cds-author-card-group>` — der\n * CSS-Selektor sieht nur diese beiden Geschwister, der zusätzliche äußere Host\n * ändert daran nichts, weil `:has(+ …)` ausschließlich den unmittelbaren\n * Elternknoten der beiden betrachtet, nicht dessen Vorfahren. Ohne diese zweite\n * Ebene bräuchte die Eyebrow denselben Attributselektor-Trick wie die Karte, obwohl\n * `.author-card-group` selbst kein Grid-/Flex-Kind ist — das eigentliche Problem hier\n * ist ein Geschwister-, kein Eltern-Kind-Kriterium, deshalb reicht die einfachere\n * Lösung (innere Klasse statt Host-Klasse).\n *\n * **Direkte Kinder bleiben gewahrt, `is-grid` inklusive.** `<ng-content>` fügt kein\n * eigenes Element ein: die projizierten `div[cdsAuthorCard]` (bereits selbst\n * `.author-card` am eigenen Host, siehe dort) landen unverändert als direkte Kinder\n * des inneren `.author-card-group`-`<div>` — Voraussetzung für den\n * Höhenausgleich im `is-grid`-Fall (`AuthorCardComponent`) und für den\n * Nachfahren-Selektor `.author-card-group .author-card` (css/components.css:1548).\n *\n * **`eyebrow` als `<h3>`, deckungsgleich mit den beiden realen, VOLLSTÄNDIGEN\n * Seiten-Vorkommen der gestapelten Variante** (`docs/index.html:8439,8464`, „Über die\n * Autor:innen“) — nicht mit der isolierten Doku-Illustration (`9111`, `<p>`,\n * dokumentiert ohne umgebende `<h2>`-Hierarchie). Die einzige reale `is-grid`-Seite\n * (Scrum-Training, `13811`) verzichtet auf die Gruppen-Eyebrow komplett, weil die\n * Sektion bereits `.ep-section-label` plus `<h2>` trägt — exakt der in\n * `wissensbeitrag.mdx` („Trägt die Sektion bereits ein `.ep-section-label` plus H2,\n * entfällt sie“) dokumentierte Fall. Konsumenten mit eigener Sektionsüberschrift\n * lassen `eyebrow` dafür leer, statt eine zweite `<h3>` zu erzwingen.\n *\n * **Konsequenz der inneren Klasse: der Host `<cds-author-card-group>` selbst trägt\n * weder `.author-card-group` noch `.is-grid`.** Ein `class`/`style` direkt am\n * `<cds-author-card-group>`-Tag landet auf dem unbekannten, standardmäßig\n * `display:inline` gerenderten Custom Element, NICHT auf der tatsächlichen\n * Layout-Box (dem inneren `<div>` mit `max-width`/Grid). Wer Layout-Eigenschaften\n * setzen will (z. B. `margin-top` wie im Trainer-Beispiel,\n * `docs/index.html:13811`), setzt sie am umgebenden Konsumenten-Markup, nicht am\n * Host — dieselbe Einschränkung, die ADR-0008 für Attributselektor-Komponenten\n * beschreibt, hier aber aus einem Geschwister- statt einem Eltern-Kind-Grund.\n */\n@Component({\n selector: 'cds-author-card-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (eyebrow()) {\n <h3 class=\"author-card-group-eyebrow\">{{ eyebrow() }}</h3>\n }\n <div class=\"author-card-group\" [class.is-grid]=\"grid()\">\n <ng-content></ng-content>\n </div>\n `,\n})\nexport class AuthorCardGroupComponent {\n /** Gemeinsame Überschrift (`.author-card-group-eyebrow`, `<h3>`), leer = keine. */\n readonly eyebrow = input('');\n /** Zweispaltiges Raster statt gestapelter Liste (`.is-grid`). */\n readonly grid = input(false);\n}\n","/*\n * Public API Surface von @conciso/design-system-angular\n *\n * Der einzige Einstiegspunkt der Angular-Lib. Alle Wrapper-Komponenten und ihre\n * öffentlichen Typen (CdsArea, CdsButtonVariant, CdsButtonSize, CdsThemeMode, …) werden\n * ausschließlich von hier re-exportiert — es gibt keine sekundären Entry-Points\n * (siehe docs/adr/0004-verteilung-und-versionierung.md).\n *\n * Vollständig umgezogen (Tickets 01–09, siehe docs/adr/0002 und 0003): alle\n * Komponenten leben hier in der Lib, storybook-angular enthält nur noch\n * Stories und importiert ausschließlich von hier.\n */\n\nexport * from './lib/area';\nexport * from './lib/theme-switch/theme-mode';\nexport * from './lib/button/button.component';\nexport * from './lib/topnav/topnav.component';\nexport * from './lib/theme-switch/cycle-button.component';\nexport * from './lib/area-badge/area-badge.component';\nexport * from './lib/status-badge/status-badge.component';\nexport * from './lib/chip/chip.component';\nexport * from './lib/pill/pill.component';\n\n// Bulk-Batch A: Form-Felder & Eingaben (Ticket 05)\nexport * from './lib/field/text-field.component';\nexport * from './lib/field/textarea-field.component';\nexport * from './lib/field/select-field.component';\nexport * from './lib/checkbox/checkbox.component';\nexport * from './lib/radio-group/radio-group.component';\nexport * from './lib/select/select.component';\nexport * from './lib/combobox/combobox.component';\nexport * from './lib/slider/slider.component';\n\n// Bulk-Batch B (Ticket 06): Layout & Navigation\nexport * from './lib/footer/footer.component';\nexport * from './lib/footer/footer-main.component';\nexport * from './lib/footer/footer-bottom.component';\nexport * from './lib/area-tabs/area-tab.component';\nexport * from './lib/area-tabs/area-tabs.component';\nexport * from './lib/logo/logo.component';\nexport * from './lib/logo-carousel/logo-carousel.component';\nexport * from './lib/carousel/carousel.component';\nexport * from './lib/theme-switch/segment-tri.component';\nexport * from './lib/theme-switch/select.component';\n\n// Bulk-Batch C (Ticket 07): Content & Daten-Anzeige.\nexport * from './lib/card/card.component';\nexport * from './lib/stat-card/stat-card.component';\nexport * from './lib/stat-strip/stat-strip.component';\nexport * from './lib/blockquote/blockquote.component';\nexport * from './lib/code-block/code-block.component';\nexport * from './lib/faq/faq.component';\nexport * from './lib/scale/scale.component';\nexport * from './lib/snackbar/snackbar.component';\nexport * from './lib/testimonial/testimonial.component';\nexport * from './lib/team-voice/team-voice.component';\nexport * from './lib/download-cta/download-cta.component';\n\n// Angular-Seitenbausteine (.scratch/angular-seitenbausteine, Ticket 01): Sektions-Gerüst\nexport * from './lib/section/section.component';\n// Angular-Seitenbausteine (Ticket 02): Hero-Bild\nexport * from './lib/hero-image/hero-image.component';\n// Angular-Seitenbausteine (Ticket 03): Störer-Kacheln über dem Hero\nexport * from './lib/stoerer/stoerer.component';\nexport * from './lib/stoerer/stoerer-set.component';\n// Angular-Seitenbausteine (Ticket 04): Klickbare Karte und Featured-Karte\nexport * from './lib/link-card/link-card.component';\nexport * from './lib/featured-card/featured-card.component';\n// Angular-Seitenbausteine (Ticket 05): Icon-Karte\nexport * from './lib/icon-card/icon-card.component';\n// Angular-Seitenbausteine (Ticket 06): Feature-Liste\nexport * from './lib/feature/feature.component';\n// Angular-Seitenbausteine (Ticket 07): Page-End-CTA-Band\nexport * from './lib/cta-band/cta-band.component';\n// Angular-Seitenbausteine (Ticket 08): Tier-Trenner und Fakten-Liste (cds-award-list\n// zurückgestellt, siehe .scratch/angular-seitenbausteine/issues/08-angebots-bausteine.md)\nexport * from './lib/tier/tier.component';\nexport * from './lib/facts/facts.component';\n// Angular-Seitenbausteine (Ticket 09): Datentabelle\nexport * from './lib/table/table.component';\n// Angular-Seitenbausteine (Ticket 10): aufklappbare Vergleichstabelle\nexport * from './lib/compare/compare.component';\n// Angular-Seitenbausteine (Ticket 11): Beitrags-Kopf und Avatare\nexport * from './lib/avatar/avatar.component';\nexport * from './lib/avatar/avatar-stack.component';\nexport * from './lib/article-header/article-header.component';\n// Angular-Seitenbausteine (Ticket 12): Artikel-Körper (Inhaltsverzeichnis, Callout,\n// Figure, Pull-Quote)\nexport * from './lib/article-toc/article-toc.component';\nexport * from './lib/article-callout/article-callout.component';\nexport * from './lib/article-figure/article-figure.component';\nexport * from './lib/article-pullquote/article-pullquote.component';\n// Angular-Seitenbausteine (Ticket 13): Autoren-Karte und -Gruppe\nexport * from './lib/author-card/author-card.component';\nexport * from './lib/author-card/author-card-group.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["dsUiCaretDown","dsUiCheck","uid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conciso-design-system-angular.mjs","sources":["../../../projects/design-system-angular/src/lib/area.ts","../../../projects/design-system-angular/src/lib/theme-switch/theme-mode.ts","../../../projects/design-system-angular/src/lib/button/button.component.ts","../../../projects/design-system-angular/src/lib/icons/cds-icons.ts","../../../projects/design-system-angular/src/lib/theme-switch/cycle-button.component.ts","../../../projects/design-system-angular/src/lib/topnav/topnav.component.ts","../../../projects/design-system-angular/src/lib/area-badge/area-badge.component.ts","../../../projects/design-system-angular/src/lib/status-badge/status-badge.component.ts","../../../projects/design-system-angular/src/lib/chip/chip.component.ts","../../../projects/design-system-angular/src/lib/pill/pill.component.ts","../../../projects/design-system-angular/src/lib/shared/cva-base.directive.ts","../../../projects/design-system-angular/src/lib/field/field-base.directive.ts","../../../projects/design-system-angular/src/lib/field/field-shell.component.ts","../../../projects/design-system-angular/src/lib/field/text-field.component.ts","../../../projects/design-system-angular/src/lib/field/textarea-field.component.ts","../../../projects/design-system-angular/src/lib/field/select-field.component.ts","../../../projects/design-system-angular/src/lib/checkbox/checkbox.component.ts","../../../projects/design-system-angular/src/lib/radio-group/radio-group.component.ts","../../../projects/design-system-angular/src/lib/shared/disposable-timeout.ts","../../../projects/design-system-angular/src/lib/select/select.component.ts","../../../projects/design-system-angular/src/lib/combobox/combobox.component.ts","../../../projects/design-system-angular/src/lib/slider/slider.component.ts","../../../projects/design-system-angular/src/lib/footer/footer.component.ts","../../../projects/design-system-angular/src/lib/footer/footer-main.component.ts","../../../projects/design-system-angular/src/lib/footer/footer-bottom.component.ts","../../../projects/design-system-angular/src/lib/area-tabs/area-tab.component.ts","../../../projects/design-system-angular/src/lib/area-tabs/area-tabs.component.ts","../../../projects/design-system-angular/src/lib/logo/logo.component.ts","../../../projects/design-system-angular/src/lib/shared/dots-keyboard.ts","../../../projects/design-system-angular/src/lib/logo-carousel/logo-carousel.component.ts","../../../projects/design-system-angular/src/lib/carousel/carousel.component.ts","../../../projects/design-system-angular/src/lib/theme-switch/segment-tri.component.ts","../../../projects/design-system-angular/src/lib/theme-switch/select.component.ts","../../../projects/design-system-angular/src/lib/icons.ts","../../../projects/design-system-angular/src/lib/card/card.component.ts","../../../projects/design-system-angular/src/lib/stat-card/stat-card.component.ts","../../../projects/design-system-angular/src/lib/stat-strip/stat-strip.component.ts","../../../projects/design-system-angular/src/lib/blockquote/blockquote.component.ts","../../../projects/design-system-angular/src/lib/code-block/code-block.component.ts","../../../projects/design-system-angular/src/lib/faq/faq.component.ts","../../../projects/design-system-angular/src/lib/scale/scale.component.ts","../../../projects/design-system-angular/src/lib/snackbar/snackbar.component.ts","../../../projects/design-system-angular/src/lib/testimonial/testimonial.component.ts","../../../projects/design-system-angular/src/lib/team-voice/team-voice.component.ts","../../../projects/design-system-angular/src/lib/download-cta/download-cta.component.ts","../../../projects/design-system-angular/src/lib/section/section.component.ts","../../../projects/design-system-angular/src/lib/hero-image/hero-image.component.ts","../../../projects/design-system-angular/src/lib/stoerer/stoerer.component.ts","../../../projects/design-system-angular/src/lib/stoerer/stoerer-set.component.ts","../../../projects/design-system-angular/src/lib/link-card/link-card.component.ts","../../../projects/design-system-angular/src/lib/featured-card/featured-card.component.ts","../../../projects/design-system-angular/src/lib/icon-card/icon-card.component.ts","../../../projects/design-system-angular/src/lib/feature/feature.component.ts","../../../projects/design-system-angular/src/lib/cta-band/cta-band.component.ts","../../../projects/design-system-angular/src/lib/tier/tier.component.ts","../../../projects/design-system-angular/src/lib/facts/facts.component.ts","../../../projects/design-system-angular/src/lib/table/table.component.ts","../../../projects/design-system-angular/src/lib/compare/compare.component.ts","../../../projects/design-system-angular/src/lib/avatar/avatar.component.ts","../../../projects/design-system-angular/src/lib/avatar/avatar-stack.component.ts","../../../projects/design-system-angular/src/lib/article-header/article-header.component.ts","../../../projects/design-system-angular/src/lib/article-toc/article-toc.component.ts","../../../projects/design-system-angular/src/lib/article-callout/article-callout.component.ts","../../../projects/design-system-angular/src/lib/article-figure/article-figure.component.ts","../../../projects/design-system-angular/src/lib/article-pullquote/article-pullquote.component.ts","../../../projects/design-system-angular/src/lib/author-card/author-card.component.ts","../../../projects/design-system-angular/src/lib/author-card/author-card-group.component.ts","../../../projects/design-system-angular/src/public-api.ts","../../../projects/design-system-angular/src/conciso-design-system-angular.ts"],"sourcesContent":["/**\n * Die vier Markenbereiche des Conciso Design Systems. Sie steuern in der CSS-Schicht\n * die Bereichsfarben (Tokens --co-* / --ki-* / --es-* / --wo-*) und werden je nach\n * Komponente entweder über eine Modifier-Klasse (z. B. .btn-co) oder ein\n * data-area-Attribut (z. B. .badge[data-area=\"co\"]) angewandt.\n */\nexport type CdsArea = 'co' | 'ki' | 'es' | 'wo';\n\nexport const CDS_AREAS: CdsArea[] = ['co', 'ki', 'es', 'wo'];\n\nexport const CDS_AREA_LABELS: Record<CdsArea, string> = {\n co: 'Corporate',\n ki: 'AI.Applied',\n es: 'Effektive Software',\n wo: 'Wirksame Organisationen',\n};\n","import { Injectable, signal } from '@angular/core';\n\n/** Drei Theme-Modi. „system“ folgt der OS-Einstellung (prefers-color-scheme). */\nexport type CdsThemeMode = 'light' | 'dark' | 'system';\n\n/** Reihenfolge (Cycle-Button, Segment, Dropdown). */\nexport const CDS_THEME_ORDER: CdsThemeMode[] = ['light', 'dark', 'system'];\n\n/** Icon-Name je Modus. Registriert über die zentrale Icon-Registry (lib/icons/cds-icons);\n * für diese drei Chrome-Icons hat das DS-Set kein eigenes Glyph → Heroicons. */\nexport const CDS_THEME_ICON: Record<CdsThemeMode, string> = {\n light: 'heroSun',\n dark: 'heroMoon',\n system: 'heroComputerDesktop',\n};\n\n/** Deutsches Label je Modus. */\nexport const CDS_THEME_LABEL: Record<CdsThemeMode, string> = {\n light: 'Hell',\n dark: 'Dunkel',\n system: 'System',\n};\n\n/** tri = alle drei, binär = ohne „System“. Basis des `showSystem`-Parameters. */\nexport function cdsThemeModes(showSystem: boolean): CdsThemeMode[] {\n return showSystem ? CDS_THEME_ORDER : CDS_THEME_ORDER.filter((m) => m !== 'system');\n}\n\n// ── Modul-globale Theme-Quelle ──────────────────────────────────────────────\n// EIN Zustand, geteilt von den Switcher-Komponenten (über ThemeModeService) UND\n// der Storybook-Glue in preview.ts (Toolbar-Sync). Angular-DI allein würde das\n// nicht leisten, da jede Story eine eigene App-Instanz (eigenen Root-Injector)\n// hat — die modul-globale Quelle ist über alle hinweg dieselbe.\nconst _mode = signal<CdsThemeMode>('light');\nlet _mql: MediaQueryList | null = null;\nconst _subs = new Set<(m: CdsThemeMode) => void>();\n\nconst onSystemChange = (e: MediaQueryListEvent): void => reflect(e.matches);\n\n/**\n * Aufgelösten Zustand ans <html> schreiben (light = kein Attribut).\n *\n * Der `document`-Guard ist für SSR/Prerender: Setzt ein Konsument den Modus dort\n * (etwa ein persistiertes Theme in einem Initializer), gibt es kein `document`.\n * Das Attribut wird dann übersprungen — der Modus bleibt im Signal erhalten und\n * greift, sobald im Browser das nächste `apply()` läuft. Die Lib fasst den\n * globalen Cascade sonst nicht an (siehe docs/adr/0001).\n */\nfunction reflect(dark: boolean): void {\n if (typeof document === 'undefined') return;\n const root = document.documentElement;\n if (dark) root.setAttribute('data-theme', 'dark');\n else root.removeAttribute('data-theme');\n}\n\n/** Aktuellen Modus anwenden; „system“ live an prefers-color-scheme koppeln. */\nfunction apply(): void {\n _mql?.removeEventListener('change', onSystemChange);\n _mql = null;\n // `matchMedia` existiert nur im Browser; ohne diesen Guard bricht SSR/Prerender\n // mit \"window is not defined\", sobald der Modus dort gesetzt wird.\n if (\n _mode() === 'system' &&\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function'\n ) {\n _mql = window.matchMedia('(prefers-color-scheme: dark)');\n _mql.addEventListener('change', onSystemChange);\n reflect(_mql.matches);\n } else {\n reflect(_mode() === 'dark');\n }\n}\n\nexport const themeStore = {\n /** Readonly-Signal des aktuellen Modus (Komponenten lesen hierüber). */\n mode: _mode.asReadonly(),\n\n /** Setzen + anwenden + Abonnenten benachrichtigen (z. B. Toolbar-Sync). */\n set(mode: CdsThemeMode): void {\n if (_mode() === mode) return;\n _mode.set(mode);\n apply();\n _subs.forEach((cb) => cb(mode));\n },\n\n /** Wie set(), aber OHNE Broadcast — für Toolbar→Store, um eine Emit-Rückkopplung\n * zu vermeiden (die Toolbar hat den Wert ja bereits). */\n setSilent(mode: CdsThemeMode): void {\n if (_mode() === mode) return;\n _mode.set(mode);\n apply();\n },\n\n /** Auf Modus-Änderungen hören (gibt eine Abmelde-Funktion zurück). */\n subscribe(cb: (m: CdsThemeMode) => void): () => void {\n _subs.add(cb);\n return () => _subs.delete(cb);\n },\n};\n\n/**\n * Dünner Angular-Service über der modul-globalen Quelle — damit die Komponenten\n * wie gewohnt `inject(ThemeModeService)` nutzen können. Setzt/entfernt letztlich\n * `data-theme=\"dark\"` am <html> (genau wie der DS es erwartet). Alle Switcher UND\n * der globale Theme-Toolbar-Schalter bleiben so synchron.\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeModeService {\n readonly mode = themeStore.mode;\n set(mode: CdsThemeMode): void {\n themeStore.set(mode);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * Stil-Varianten des Buttons. `filled-on-band` ist der invertierte Filled-Button\n * für farbige Bereichs-Bänder (Doku: „On-Band-Modifier“) — er wird hier als\n * eigener Variant-Wert geführt statt als abhängiges Flag, da das Invertieren nur\n * in Kombination mit `filled` je sinnvoll ist.\n */\nexport type CdsButtonVariant =\n 'filled' | 'tonal' | 'elevated' | 'outlined' | 'text' | 'filled-on-band';\nexport type CdsButtonSize = 'sm' | 'md' | 'lg';\n/**\n * Ton des Buttons. `err` markiert eine destruktive Aktion, die sich nicht rückgängig machen\n * lässt (Löschen, Verwerfen), und ersetzt dann die Bereichsfarbe. Kürzel wie bei `CdsSnackTone`.\n */\nexport type CdsButtonTone = 'def' | 'err';\n\n/**\n * Button — dünner Angular-Wrapper um die bestehende `.btn`-CSS-Familie.\n *\n * Erfindet KEINE Styles: setzt ausschließlich die im Design System vorhandenen\n * Klassen (.btn, .btn-filled/.btn-tonal/.btn-elevated/.btn-outlined/.btn-text,\n * .btn-sm/.btn-lg, .btn-co/.btn-ki/.btn-es/.btn-wo, .btn-full, .btn-on-band)\n * zusammen. Siehe css/components.css → „Buttons“. Der Klick wird als `clicked`\n * ausgegeben (für Nutzung außerhalb reiner Formular-Submits).\n */\n@Component({\n selector: 'cds-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // .btn-full setzt width:100% auf dem <button> — greift aber nur, wenn auch der\n // Host die Zeile füllt (Custom Elements sind display:inline und schrumpfen auf\n // Inhaltsbreite). Bei full=true daher den Host auf block stellen.\n host: { '[style.display]': \"full() ? 'block' : null\" },\n template: `\n <button\n [class]=\"classes()\"\n [disabled]=\"disabled()\"\n [attr.type]=\"type()\"\n (click)=\"clicked.emit($event)\"\n >\n {{ label() }}\n </button>\n `,\n})\nexport class ButtonComponent {\n /** Sichtbarer Text des Buttons. */\n readonly label = input('Button');\n /** Visuelle Variante → .btn-filled / .btn-tonal / .btn-elevated / .btn-outlined /\n * .btn-text; `filled-on-band` → .btn-filled + .btn-on-band (invertiert). */\n readonly variant = input<CdsButtonVariant>('filled');\n /** Markenbereich → .btn-co / .btn-ki / .btn-es / .btn-wo. Wirkungslos bei `tone=\"err\"`. */\n readonly area = input<CdsArea>('co');\n /** Ton → `err` setzt .btn-err (destruktive Aktion) statt der Bereichsklasse. */\n readonly tone = input<CdsButtonTone>('def');\n /** Größe → .btn-sm / (md = Default) / .btn-lg */\n readonly size = input<CdsButtonSize>('md');\n /** Volle Breite → .btn-full (Host wird block, damit 100% greifen). */\n readonly full = input(false);\n readonly disabled = input(false);\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n\n /** Klick auf den Button (feuert nicht, wenn `disabled`). */\n readonly clicked = output<MouseEvent>();\n\n /** @internal */\n protected readonly classes = computed(() => {\n // filled-on-band = invertierter Filled-Button; rendert .btn-filled + .btn-on-band.\n const onBand = this.variant() === 'filled-on-band';\n // Ton ersetzt den Bereich, statt ihn zu überlagern: so hängt das Ergebnis nicht an der\n // Reihenfolge der Regeln in components.css und dark-mode.css.\n const color = this.tone() === 'err' ? 'err' : this.area();\n const cls = ['btn', `btn-${onBand ? 'filled' : this.variant()}`, `btn-${color}`];\n if (this.size() === 'sm') cls.push('btn-sm');\n if (this.size() === 'lg') cls.push('btn-lg');\n if (this.full()) cls.push('btn-full');\n if (onBand) cls.push('btn-on-band');\n return cls.join(' ');\n });\n}\n","/**\n * Zentrale Icon-Registry des Storybooks — die EINZIGE Import-Fläche für\n * Komponenten-Icons. Zwei bewusst getrennte Quellen:\n *\n * 1. **DS-eigene Glyphen** (`ui*`): aus dem generierten DS-Icon-Export\n * (Paket `@conciso/design-system/icons`, Single Source of Truth). Nur dort, wo das\n * DS ein eigenes Glyph definiert, das KEIN bzw. ein abweichendes Heroicon-Pendant hat:\n * · `ui-caret-down` — kräftiger Caret (10er-viewBox), kein Heroicon-Pendant.\n * · `ui-check` — eigener Haken (12er-viewBox), weicht vom heroCheck (24er) ab.\n *\n * Importiert werden ausschließlich die BENANNTEN Exporte der beiden gebrauchten Glyphen\n * (`uiCaretDown`, `uiCheck`), nie das aggregierte `icons`-Objekt — ein Property-Zugriff\n * darauf (`icons['ui-caret-down']`) ist für Bundler nicht tree-shakable und zöge alle\n * alle DS-Icons in jedes Consumer-Bundle (siehe icons/README.md „Verwendung“).\n *\n * 2. **Heroicons**: für Glyphen, die im DS mit dem Heroicon glyph-identisch sind\n * (chevron-down, magnifying-glass — gleicher Pfad, das DS setzt nur einen dünneren\n * Stroke) sowie für die im DS-Set (noch) fehlenden Chrome-Icons (bars-3, x-mark,\n * moon, sun, computer-desktop).\n *\n * Bekommt ein Heroicon später ein DS-Pendant, wird es HIER umgestellt — die\n * Komponenten importieren ausschließlich aus dieser Datei, nie direkt aus\n * `@ng-icons/heroicons`.\n */\nimport { uiCaretDown as dsUiCaretDown, uiCheck as dsUiCheck } from '@conciso/design-system/icons';\n\n// Heroicons: glyph-identische (chevron/magnifying) + im DS fehlende Chrome-Icons.\nexport {\n heroBars3,\n heroChevronDown,\n heroComputerDesktop,\n heroMagnifyingGlass,\n heroMoon,\n heroSun,\n heroXMark,\n} from '@ng-icons/heroicons/outline';\n\n// DS-eigene Glyphen aus dem generierten, benannten Export (kein Duplizieren des SVG-Markups).\n// Als @ng-icons-Custom-Icons registrierbar: der Wert ist das komplette <svg>-Markup.\nexport const uiCaretDown = dsUiCaretDown.svg;\nexport const uiCheck = dsUiCheck.svg;\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroComputerDesktop, heroMoon, heroSun } from '../icons/cds-icons';\nimport { CDS_THEME_ICON, CDS_THEME_LABEL, cdsThemeModes, ThemeModeService } from './theme-mode';\n\n/**\n * Theme-Cycle-Button — ein einzelner Icon-Button (Stil `.ep-nav-icon-btn` aus der\n * Topnav), der bei Klick durch die Modi zyklt. Das Icon zeigt den aktuellen Modus.\n * Vorgesehener Einsatz: im Header. Icons über die zentrale Registry (lib/icons/cds-icons).\n *\n * `showSystem` schaltet zwischen tri (Hell→Dunkel→System) und binär (Hell→Dunkel).\n */\n@Component({\n selector: 'cds-theme-cycle',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgIcon],\n viewProviders: [provideIcons({ heroSun, heroMoon, heroComputerDesktop })],\n template: `\n <button\n class=\"ep-nav-icon-btn\"\n type=\"button\"\n [attr.aria-label]=\"'Farbthema: ' + label() + ' — klicken zum Wechseln'\"\n (click)=\"next()\"\n >\n <ng-icon [name]=\"icon()\" size=\"22px\" aria-hidden=\"true\" />\n </button>\n `,\n})\nexport class ThemeCycleComponent {\n /** true → Hell/Dunkel/System, false → nur Hell/Dunkel. */\n readonly showSystem = input(true);\n\n /** @internal */\n protected readonly svc = inject(ThemeModeService);\n /** @internal */\n protected readonly icon = computed(() => CDS_THEME_ICON[this.svc.mode()]);\n /** @internal */\n protected readonly label = computed(() => CDS_THEME_LABEL[this.svc.mode()]);\n\n /** @internal */\n protected next(): void {\n const order = cdsThemeModes(this.showSystem());\n const i = order.indexOf(this.svc.mode());\n this.svc.set(order[(i + 1) % order.length]);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroBars3, heroMagnifyingGlass, heroXMark, uiCaretDown } from '../icons/cds-icons';\nimport { ThemeCycleComponent } from '../theme-switch/cycle-button.component';\n\n/** Eindeutige IDs je Topnav-Instanz (Such-Feld ↔ sr-only-Label). */\nlet cdsTopnavUid = 0;\n\nexport interface CdsNavSubItem {\n label: string;\n href: string;\n}\n\nexport interface CdsNavItem {\n label: string;\n href?: string;\n sub?: CdsNavSubItem[];\n}\n\n/**\n * Topnav — Wrapper um `.ep-topnav` aus css/components.css → „Topnav“.\n *\n * Customer-Navigation: Logo, Top-Level-Links mit optionalem Klapp-Submenü\n * (.ep-nav-has-sub / .ep-nav-sub, aria-expanded), rechts gebündelte Aktionen\n * (Such-Popover .ep-nav-search + Theme-Cycle-Button) und ein CTA-Button.\n * Disclosure-Logik in Angular: nur ein Menü offen, Escape und Außenklick schließen.\n *\n * Der Theme-Umschalter ist fest der Cycle-Button (cds-theme-cycle); ob er auch\n * „System“ anbietet, steuert `showSystemTheme` (durchgereicht an dessen showSystem).\n */\n@Component({\n selector: 'cds-topnav',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ThemeCycleComponent, NgIcon],\n viewProviders: [provideIcons({ heroBars3, heroMagnifyingGlass, heroXMark, uiCaretDown })],\n // ng-icon rendert sein <svg> inline (vertical-align:baseline) → im 24px-Toggle säße der\n // 10px-Caret zu tief. Host auf Flex stellen zentriert das SVG unabhängig von der Baseline.\n // Wirkt nur hier (emulated); die portable .ep-nav-item-caret aus components.css bleibt unberührt.\n styles: `\n .ep-nav-item-caret {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n `,\n host: {\n '(document:click)': 'onDocumentClick($event)',\n '(document:keydown.escape)': 'onEscape()',\n },\n template: `\n <header class=\"ep-topnav\" [class.nav-open]=\"navOpen()\">\n <a class=\"ep-logo\" href=\"#\" (click)=\"$event.preventDefault()\">\n @if (logoSrc()) {\n <!-- Größe (24px) + Theme-Swap kommen aus der portablen css/components.css\n (.ep-logo img, .logo-themed-default/-light via [data-theme]). -->\n <img\n [class.logo-themed-default]=\"!!logoDarkSrc()\"\n [src]=\"logoSrc()\"\n [alt]=\"logoAlt() || logo()\"\n />\n @if (logoDarkSrc()) {\n <img class=\"logo-themed-light\" [src]=\"logoDarkSrc()\" [alt]=\"logoAlt() || logo()\" />\n }\n } @else {\n {{ logo() }}\n }\n </a>\n\n <nav class=\"ep-nav-links\" [id]=\"navId\" aria-label=\"Hauptnavigation\">\n @for (item of links(); track $index; let i = $index) {\n @if (item.sub?.length) {\n <div class=\"ep-nav-item ep-nav-has-sub\" [class.is-open]=\"openIndex() === i\">\n <!-- Label = eigener Link (führt z. B. auf eine Übersichtsseite), NICHT der Toggle.\n Der Caret ist ein separater Button daneben — so wie in der portablen Vorlage\n (docs/index.html). Ohne href bleibt es ein Platzhalter-Link (#, kein Sprung). -->\n <a\n class=\"ep-nav-btn\"\n [href]=\"item.href || '#'\"\n [attr.aria-current]=\"item.href && item.href === activeHref() ? 'page' : null\"\n (click)=\"item.href || $event.preventDefault()\"\n >\n {{ item.label }}\n </a>\n <button\n class=\"ep-nav-item-toggle\"\n type=\"button\"\n [attr.aria-label]=\"'Untermenü ' + item.label\"\n [attr.aria-expanded]=\"openIndex() === i\"\n [attr.aria-controls]=\"subId(i)\"\n (click)=\"toggleSub(i)\"\n >\n <ng-icon\n class=\"ep-nav-item-caret\"\n name=\"uiCaretDown\"\n size=\"10px\"\n aria-hidden=\"true\"\n />\n </button>\n <div class=\"ep-nav-sub\" [id]=\"subId(i)\">\n @for (s of item.sub; track $index) {\n <a\n class=\"ep-nav-sub-btn\"\n [href]=\"s.href\"\n [attr.aria-current]=\"s.href === activeHref() ? 'page' : null\"\n (click)=\"closeAll()\"\n >\n {{ s.label }}\n </a>\n }\n </div>\n </div>\n } @else {\n <a\n class=\"ep-nav-btn\"\n [href]=\"item.href || '#'\"\n [attr.aria-current]=\"item.href && item.href === activeHref() ? 'page' : null\"\n >\n {{ item.label }}\n </a>\n }\n }\n </nav>\n\n <div class=\"ep-nav-actions\">\n @if (showSearch()) {\n <div class=\"ep-nav-search\" [class.is-open]=\"searchOpen()\">\n <button\n class=\"ep-nav-icon-btn ep-nav-search-toggle\"\n type=\"button\"\n aria-label=\"Suche\"\n [attr.aria-expanded]=\"searchOpen()\"\n (click)=\"toggleSearch()\"\n >\n <ng-icon name=\"heroMagnifyingGlass\" size=\"22px\" aria-hidden=\"true\" />\n </button>\n <div class=\"ep-nav-search-pop\">\n <form class=\"ep-nav-search-form\" role=\"search\" (submit)=\"$event.preventDefault()\">\n <label class=\"sr-only\" [attr.for]=\"searchId\">Suchbegriff</label>\n <input\n class=\"ep-nav-search-input\"\n [id]=\"searchId\"\n type=\"search\"\n placeholder=\"Wonach suchst Du?\"\n autocomplete=\"off\"\n />\n <button class=\"btn btn-filled btn-sm btn-co\" type=\"submit\">Suchen</button>\n </form>\n </div>\n </div>\n }\n\n <cds-theme-cycle [showSystem]=\"showSystemTheme()\" />\n </div>\n\n <!-- Hamburger: nur unter dem Mobile-Breakpoint sichtbar (CSS .ep-nav-burger), schaltet\n .nav-open am Header → .ep-nav-links klappt auf. Icons via .icon-menu/.icon-close. -->\n <button\n class=\"ep-nav-burger\"\n type=\"button\"\n [attr.aria-label]=\"navOpen() ? 'Menü schließen' : 'Menü öffnen'\"\n [attr.aria-expanded]=\"navOpen()\"\n [attr.aria-controls]=\"navId\"\n (click)=\"toggleNav()\"\n >\n <ng-icon class=\"icon-menu\" name=\"heroBars3\" size=\"24px\" aria-hidden=\"true\" />\n <ng-icon class=\"icon-close\" name=\"heroXMark\" size=\"24px\" aria-hidden=\"true\" />\n </button>\n\n @if (showCta()) {\n <a class=\"btn btn-filled btn-sm btn-co\" href=\"#\" (click)=\"$event.preventDefault()\">{{\n ctaLabel()\n }}</a>\n }\n </header>\n `,\n})\nexport class TopnavComponent {\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly document = inject(DOCUMENT);\n\n private readonly uid = ++cdsTopnavUid;\n /** @internal */\n protected readonly searchId = `cds-topnav-search-${this.uid}`;\n /** @internal */\n protected readonly navId = `cds-topnav-nav-${this.uid}`;\n\n readonly logo = input('conciso.');\n /** Optionales Logo-Bild/-Icon (URL oder Data-URI). Gesetzt → statt des Text-Logos.\n * Doku: immer SVG (logo-conciso.svg), Default-Variante für helle Hintergründe. */\n readonly logoSrc = input<string>();\n /** Optionale helle Logo-Variante für den Dark Mode (Doku: logo-conciso-light.svg).\n * Gesetzt → Theme-Swap via .logo-themed-* (schaltet über [data-theme] um);\n * sonst wird logoSrc in beiden Themes gezeigt. */\n readonly logoDarkSrc = input<string>();\n /** Alt-Text des Logo-Bilds (Fallback: der Text aus `logo`). */\n readonly logoAlt = input('');\n readonly ctaLabel = input('Kontakt');\n /** Suche (Icon + Popover) rechts anzeigen. */\n readonly showSearch = input(true);\n /** Kontakt-/CTA-Button anzeigen. */\n readonly showCta = input(true);\n /** Bietet der Theme-Cycle-Button im Header auch „System“ an (tri) oder nur Hell/Dunkel? */\n readonly showSystemTheme = input(true);\n /** Href des aktuell aktiven Eintrags (Single Source of Truth). Nur der Eintrag\n * — Top-Level ODER Sub — mit passendem href erhält aria-current=\"page\". Dadurch\n * kann strukturell höchstens EINER aktiv sein (statt mehrerer current-Flags). */\n readonly activeHref = input<string>();\n readonly links = input<CdsNavItem[]>([\n {\n label: 'Leistungen',\n sub: [\n { label: 'Angewandte KI', href: '#ki' },\n { label: 'Effektive Software', href: '#software' },\n { label: 'Wirksame Organisationen', href: '#organisationen' },\n ],\n },\n {\n label: 'Unternehmen',\n sub: [\n { label: 'Über uns', href: '#ueber-uns' },\n { label: 'Team', href: '#team' },\n { label: 'Jobs', href: '#jobs' },\n ],\n },\n { label: 'Beiträge', href: '#beitraege' },\n { label: 'Kontakt', href: '#kontakt' },\n ]);\n\n /** @internal */\n protected readonly openIndex = signal(-1);\n /** @internal */\n protected readonly searchOpen = signal(false);\n /**\n * Mobile-Menü offen? Schaltet .nav-open am Header (→ .ep-nav-links sichtbar).\n *\n * @internal\n */\n protected readonly navOpen = signal(false);\n\n /**\n * Eindeutige ID des Submenüs zu Eintrag i (Toggle aria-controls ↔ .ep-nav-sub).\n *\n * @internal\n */\n protected subId(i: number): string {\n return `cds-topnav-sub-${this.uid}-${i}`;\n }\n\n /** @internal */\n protected toggleSub(i: number): void {\n this.openIndex.set(this.openIndex() === i ? -1 : i);\n this.searchOpen.set(false);\n }\n\n /** @internal */\n protected toggleSearch(): void {\n this.searchOpen.set(!this.searchOpen());\n this.openIndex.set(-1);\n }\n\n /** @internal */\n protected toggleNav(): void {\n this.navOpen.set(!this.navOpen());\n this.openIndex.set(-1);\n this.searchOpen.set(false);\n }\n\n /** @internal */\n protected closeAll(): void {\n this.openIndex.set(-1);\n this.searchOpen.set(false);\n this.navOpen.set(false);\n }\n\n /** @internal */\n protected onDocumentClick(event: MouseEvent): void {\n // Außenklick: NICHT den Fokus umsetzen — der Nutzer hat bewusst woanders\n // hingeklickt, dorthin den Fokus zu ziehen wäre ein eigener Fehler.\n if (!this.host.nativeElement.contains(event.target as Node)) this.closeAll();\n }\n\n /** @internal */\n protected onEscape(): void {\n this.closeWithFocusReturn();\n }\n\n /**\n * Wie `closeAll()`, gibt den Fokus aber an den öffnenden Toggle zurück (Submenü-\n * bzw. Such-Toggle) — NUR wenn der Fokus beim Schließen tatsächlich innerhalb des\n * schließenden Bereichs lag. `css/components.css:1148` setzt `.ep-nav-sub{display:\n * none}`, `:1189` dasselbe für `.ep-nav-search-pop`: das fokussierte Element\n * verschwindet damit aus dem Fokus-Baum und der Fokus fiele sonst ans `<body>`\n * (WCAG 2.4.3). Nur für den Escape-Pfad gedacht.\n *\n * @internal\n */\n private closeWithFocusReturn(): void {\n const active = this.document.activeElement;\n let toggle: HTMLElement | null = null;\n const i = this.openIndex();\n if (i >= 0) {\n const sub = this.host.nativeElement.querySelector(`#${this.subId(i)}`);\n if (sub && active && sub.contains(active)) {\n toggle = this.host.nativeElement.querySelector<HTMLElement>(\n `[aria-controls=\"${this.subId(i)}\"]`,\n );\n }\n } else if (this.searchOpen()) {\n const pop = this.host.nativeElement.querySelector('.ep-nav-search-pop');\n if (pop && active && pop.contains(active)) {\n toggle = this.host.nativeElement.querySelector<HTMLElement>('.ep-nav-search-toggle');\n }\n }\n if (!toggle && this.navOpen()) {\n const nav = this.host.nativeElement.querySelector(`#${this.navId}`);\n if (nav && active && nav.contains(active)) {\n toggle = this.host.nativeElement.querySelector<HTMLElement>('.ep-nav-burger');\n }\n }\n this.closeAll();\n toggle?.focus();\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * Bereichs-Badge — passive Bereichs-Kennzeichnung auf Basis von `.badge` +\n * `[data-area]` aus css/components.css.\n *\n * Ordnet ein Element einer der vier Brand Areas zu (50er-Grund, 800er-Text).\n * Nicht interaktiv. Für Zustände die Status-Badge, für einen redaktionellen\n * Anker im Lesefluss die Pill nutzen; für interaktive Filter den Chip.\n *\n * Verwendungsguidance dieser Gruppe: siehe Chip (`komponenten-chips-badges-pills-chip--verwendung`).\n */\n@Component({\n selector: 'cds-area-badge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<span class=\"badge\" [attr.data-area]=\"area()\">{{ label() }}</span>`,\n})\nexport class AreaBadgeComponent {\n /** Sichtbarer Text der Badge. */\n readonly label = input.required<string>();\n /** Brand Area → data-area (bestimmt die Bereichsfarbe). */\n readonly area = input<CdsArea>('co');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** Status-Töne der Badge-Klassen (.badge-ok / .badge-warn / .badge-err / .badge-neu). */\nexport type CdsBadgeTone = 'ok' | 'warn' | 'err' | 'neu';\n\n/**\n * Status-Badge — passive Zustands-Kennzeichnung auf Basis von `.badge` +\n * `.badge-{ok|warn|err|neu}` aus css/components.css.\n *\n * Trägt einen Zustand über semantische Farben (OK, Warnung, Fehler, Neutral) —\n * z. B. „Live“, „Beta“, „Deprecated“, „Draft“. Nicht interaktiv. Für die\n * Zuordnung zu einer Brand Area die Bereichs-Badge, für einen redaktionellen\n * Anker im Lesefluss die Pill nutzen; für interaktive Filter den Chip.\n *\n * Verwendungsguidance dieser Gruppe: siehe Chip (`komponenten-chips-badges-pills-chip--verwendung`).\n */\n@Component({\n selector: 'cds-status-badge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<span class=\"badge badge-{{ tone() }}\">{{ label() }}</span>`,\n})\nexport class StatusBadgeComponent {\n /** Sichtbarer Text der Badge. */\n readonly label = input.required<string>();\n /** Status-Ton → semantische Farbe. */\n readonly tone = input<CdsBadgeTone>('ok');\n}\n","import { ChangeDetectionStrategy, Component, input, model } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * Chip — Wrapper um `.chip` aus css/components.css → „Badges & Chips“.\n *\n * Interaktiver Filter-Chip auf Basis von `aria-pressed` (.chip[aria-pressed],\n * optional area-aware über [data-area]). Klick schaltet den Zustand um.\n *\n * Chips sind interaktive Elemente (Filter/Einstellungen), KEINE statischen Tags.\n * Für nicht-interaktive Bereichs-Labels die Badge- bzw. Pill-Komponente nutzen.\n */\n@Component({\n selector: 'cds-chip',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <button\n class=\"chip\"\n type=\"button\"\n [attr.data-area]=\"area() || null\"\n [attr.aria-pressed]=\"pressed()\"\n (click)=\"toggle()\"\n >\n {{ label() }}\n </button>\n `,\n})\nexport class ChipComponent {\n /** Sichtbarer Text des Chips. */\n readonly label = input.required<string>();\n /** Markenbereich → data-area (area-aware Outline). */\n readonly area = input<CdsArea>();\n /** Gedrückt/aktiv → aria-pressed. Two-Way (`[(pressed)]`) + pressedChange via model(). */\n readonly pressed = model(false);\n\n /** @internal */\n protected toggle(): void {\n this.pressed.set(!this.pressed());\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * Pill — Wrapper um `.pill` aus css/components.css → „Badges & Chips“ (Pill).\n *\n * Passive, redaktionelle Bereichs-Markierung, typografisch als Eyebrow (uppercase,\n * letter-spacing .09em, label-xs) — sitzt typischerweise oberhalb eines Titels und\n * ordnet einen Inhalt einer Brand Area zu. Abgrenzung zur Badge: die Pill ist der\n * thematische „Was für ein Inhalt ist das?“-Anker im Lesefluss; die Badge die\n * punktuelle Status-/Bereichs-Kennzeichnung neben Elementen. Nicht interaktiv.\n *\n * a11y: Der reine Bereichsname klingt im Screenreader-Fluss leicht wie eine\n * Überschrift — daher trägt die Pill ein explizites `aria-label` (Default\n * „Bereich <label>“, überschreibbar), genau wie in der Doku vorgegeben.\n *\n * Verwendungsguidance dieser Gruppe: siehe Chip (`komponenten-chips-badges-pills-chip--verwendung`).\n */\n@Component({\n selector: 'cds-pill',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<span class=\"pill\" [attr.data-area]=\"area()\" [attr.aria-label]=\"computedAriaLabel()\">{{\n label()\n }}</span>`,\n})\nexport class PillComponent {\n /** Sichtbarer Bereichsname. */\n readonly label = input.required<string>();\n /** Brand Area → data-area (Farbton; ohne Angabe greift der Corporate-Default). */\n readonly area = input<CdsArea>('ki');\n /** aria-label überschreiben; Default „Bereich <label>“. */\n readonly ariaLabel = input<string>();\n\n /** @internal */\n protected readonly computedAriaLabel = computed(\n () => this.ariaLabel() ?? `Bereich ${this.label()}`,\n );\n}\n","import { Directive } from '@angular/core';\nimport type { ControlValueAccessor } from '@angular/forms';\n\n/**\n * ControlValueAccessor-Kitt OHNE Markup- oder Werttyp-Annahmen: hält NUR, was bei\n * `checkbox`, `radio-group`, `slider`, `scale` (und, über `FieldBase`, den drei\n * Field-Komponenten) wortgleich war — die `onChange`/`onTouched`-Callbacks plus\n * `writeValue`, `registerOnChange`, `registerOnTouched`, `setDisabledState`.\n *\n * Generisch über den Werttyp `T` (boolean bei Checkbox, string bei RadioGroup/\n * FieldBase, number bei Slider/Scale). Die defensive Normalisierung eines\n * eingehenden Formularwerts (Klemmen auf [min, max], `!!`-Cast, `NaN`-Abfang, …)\n * ist komponentenspezifisch und bleibt darum bewusst NICHT hier: `writeValue` ruft\n * den überschreibbaren Hook `normalizeValue` auf (Default: unverändert), die\n * konkrete Komponente überschreibt ihn UND `applyValue`/`applyDisabled` (schreiben\n * in ihr eigenes `model()`-Signal — die Basis kennt dessen Namen nicht).\n */\n@Directive()\nexport abstract class CvaBase<T> implements ControlValueAccessor {\n /** @internal */\n protected onChange: (value: T) => void = () => {\n /* von Angular-Forms via registerOnChange gesetzt */\n };\n /** @internal */\n protected onTouched: () => void = () => {\n /* von Angular-Forms via registerOnTouched gesetzt */\n };\n\n /**\n * Rohen Formularwert in einen gültigen Komponentenwert übersetzen (Klemmen,\n * Typ-Cast, `NaN`-Abfang, …). Default: unverändert durchreichen.\n *\n * @internal\n */\n protected normalizeValue(value: T): T {\n return value;\n }\n\n /** Normalisierten Wert ins eigene `model()`-Signal der Komponente schreiben. @internal */\n protected abstract applyValue(value: T): void;\n /** `disabled`-Zustand ins eigene `model()`-Signal der Komponente schreiben. @internal */\n protected abstract applyDisabled(disabled: boolean): void;\n\n /** @internal */\n writeValue(value: T): void {\n this.applyValue(this.normalizeValue(value));\n }\n /** @internal */\n registerOnChange(fn: (value: T) => void): void {\n this.onChange = fn;\n }\n /** @internal */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n /** @internal */\n setDisabledState(isDisabled: boolean): void {\n this.applyDisabled(isDisabled);\n }\n}\n","import { computed, Directive, input, model } from '@angular/core';\nimport { CvaBase } from '../shared/cva-base.directive';\n\n// Modulweiter Zähler → jede Instanz bekommt per Default eine EINDEUTIGE id.\n// Ein konstanter Default würde bei mehreren Feldern kollidieren (doppelte id →\n// kaputte label/for- und aria-describedby-Verknüpfung).\nlet uid = 0;\n\n/**\n * Gemeinsame Basis der Field-Komponenten (Textfeld / Textbereich / Auswahlfeld).\n *\n * Bündelt die geteilten Inputs, die a11y-Verdrahtung UND die Wert-Anbindung. Als\n * `ControlValueAccessor` binden sich die Felder direkt an Angular-Formulare\n * (`[(ngModel)]`, `formControlName`) — der übliche Weg für eine Komponenten-\n * bibliothek. Zusätzlich ist `value` ein `model()`, sodass ohne Formular auch\n * `[(value)]` und der `valueChange`-Output funktionieren. Den ControlValueAccessor-\n * Kitt (onChange/onTouched, writeValue, registerOnChange/-Touched, setDisabledState)\n * erbt sie von `CvaBase` (`lib/shared/cva-base.directive.ts`) — geteilt mit\n * Checkbox/RadioGroup/Slider/Scale, die dieselbe Boilerplate wortgleich hatten.\n *\n * Angular vererbt Inputs/Logik über eine mit `@Directive()` dekorierte abstrakte\n * Basisklasse — deshalb steht die LOGIK hier. Das gemeinsame MARKUP (Label/Helper/\n * Fehler) wird NICHT vererbt (Angular vererbt keine Templates); dafür teilen sich\n * die Komponenten die FieldShellComponent per Komposition. Den `NG_VALUE_ACCESSOR`-\n * Provider setzt jede konkrete Komponente selbst (forwardRef auf ihre Klasse).\n */\n@Directive()\nexport abstract class FieldBase extends CvaBase<string> {\n /** Sichtbares Label. */\n readonly label = input('');\n /** Optionaler Hilfetext unter dem Feld. */\n readonly helper = input('');\n /** Gesetzt = Fehlerzustand (.has-error + .error-msg). */\n readonly error = input('');\n /** Pflichtfeld → .req-Asterisk + aria-required. */\n readonly required = input(false);\n /** id für die label/for- und aria-describedby-Verknüpfung. Default eindeutig. */\n readonly fieldId = input(`cds-field-${++uid}`);\n\n /** Feldwert — Two-Way (`[(value)]`) UND Angular-Forms (ngModel/formControlName). */\n readonly value = model('');\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n\n /** @internal */\n protected override normalizeValue(value: string): string {\n return value ?? '';\n }\n /** @internal */\n protected override applyValue(value: string): void {\n this.value.set(value);\n }\n /** @internal */\n protected override applyDisabled(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n /**\n * Vom Template bei Eingabe/Änderung des nativen Controls aufgerufen.\n *\n * @internal\n */\n protected handleInput(event: Event): void {\n const value = (event.target as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement)\n .value;\n this.value.set(value);\n this.onChange(value);\n }\n /**\n * Vom Template bei Verlassen des Felds → markiert das Control als „touched“.\n *\n * @internal\n */\n protected handleBlur(): void {\n this.onTouched();\n }\n\n /** @internal */\n protected readonly errorId = computed(() => `${this.fieldId()}-error`);\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Präsentations-Hülle für alle Field-Komponenten (intern, nicht als eigene Story).\n *\n * Rendert die gemeinsame `.field`-Struktur aus css/components.css — Label mit\n * optionalem Pflicht-Asterisk, Hilfetext und Fehlermeldung — und projiziert das\n * eigentliche Steuerelement via `<ng-content>`. So teilen sich Textfeld,\n * Textbereich und Auswahlfeld dieses Markup per Komposition, ohne Duplikat.\n */\n@Component({\n selector: 'cds-field-shell',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"field\" [class.has-error]=\"!!error()\">\n <label [attr.for]=\"fieldId()\">\n {{ label() }}\n @if (required()) {\n <span class=\"req\" aria-hidden=\"true\">*</span>\n }\n </label>\n\n <ng-content></ng-content>\n\n @if (helper() && !error()) {\n <span class=\"helper\">{{ helper() }}</span>\n }\n @if (error()) {\n <span class=\"error-msg\" [id]=\"errorId()\" role=\"alert\">\n <!-- Exclamation-Circle-Icon wie docs/index.html. Noch inline: das Icon\n liegt nicht im Register (icons/icons.js); die externe Icon-Lib folgt\n auf feat/theme-switch, dann hier ersetzen. -->\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n aria-hidden=\"true\"\n style=\"flex-shrink:0\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z\"\n />\n </svg>\n {{ error() }}\n </span>\n }\n </div>\n `,\n})\nexport class FieldShellComponent {\n readonly label = input('');\n readonly required = input(false);\n readonly helper = input('');\n readonly error = input('');\n /** id des projizierten Steuerelements (für label/for). */\n readonly fieldId = input('');\n /** id der Fehlermeldung (für aria-describedby am Steuerelement). */\n readonly errorId = input('');\n}\n","import { ChangeDetectionStrategy, Component, forwardRef, input } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FieldBase } from './field-base.directive';\nimport { FieldShellComponent } from './field-shell.component';\n\n/**\n * Textfeld — einzeiliges `<input>` im `.field`-Gerüst (E-Mail, Text, Tel, … über\n * `type`). Pflichtfelder tragen aria-required; im Fehlerzustand wird die Meldung\n * über aria-describedby/aria-invalid verknüpft — wie docs/index.html.\n *\n * Als `ControlValueAccessor` (siehe FieldBase) direkt an Angular-Formulare\n * anbindbar (`[(ngModel)]`, `formControlName`) bzw. ohne Formular per `[(value)]`.\n */\n@Component({\n selector: 'cds-text-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldShellComponent],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TextFieldComponent), multi: true },\n ],\n template: `\n <cds-field-shell\n [label]=\"label()\"\n [required]=\"required()\"\n [helper]=\"helper()\"\n [error]=\"error()\"\n [fieldId]=\"fieldId()\"\n [errorId]=\"errorId()\"\n >\n <!-- required nativ zusätzlich zu aria-required: natives HTML5-required für die\n Formular-Validierung im Browser, aria-required für den Screenreader-Zustand. -->\n <input\n [id]=\"fieldId()\"\n [type]=\"type()\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.required]=\"required() ? '' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"error() ? errorId() : null\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n />\n </cds-field-shell>\n `,\n})\nexport class TextFieldComponent extends FieldBase {\n /** input[type] (text, email, tel, …). */\n readonly type = input('text');\n readonly placeholder = input('');\n}\n","import { ChangeDetectionStrategy, Component, forwardRef, input } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FieldBase } from './field-base.directive';\nimport { FieldShellComponent } from './field-shell.component';\n\n/**\n * Textbereich — mehrzeiliges `<textarea>` im `.field`-Gerüst. Gleiche a11y-\n * Verdrahtung wie das Textfeld (aria-required/-invalid/-describedby).\n *\n * Als `ControlValueAccessor` (siehe FieldBase) direkt an Angular-Formulare\n * anbindbar (`[(ngModel)]`, `formControlName`) bzw. ohne Formular per `[(value)]`.\n *\n * Verwendungsguidance dieser Gruppe: siehe Textfeld (`komponenten-inputs-forms-textfeld--verwendung`).\n */\n@Component({\n selector: 'cds-textarea-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldShellComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TextareaFieldComponent),\n multi: true,\n },\n ],\n template: `\n <cds-field-shell\n [label]=\"label()\"\n [required]=\"required()\"\n [helper]=\"helper()\"\n [error]=\"error()\"\n [fieldId]=\"fieldId()\"\n [errorId]=\"errorId()\"\n >\n <!-- required nativ zusätzlich zu aria-required: natives HTML5-required für die\n Formular-Validierung im Browser, aria-required für den Screenreader-Zustand. -->\n <textarea\n [id]=\"fieldId()\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.required]=\"required() ? '' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"error() ? errorId() : null\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n ></textarea>\n </cds-field-shell>\n `,\n})\nexport class TextareaFieldComponent extends FieldBase {\n readonly placeholder = input('');\n}\n","import { ChangeDetectionStrategy, Component, forwardRef, input } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FieldBase } from './field-base.directive';\nimport { FieldShellComponent } from './field-shell.component';\n\n/**\n * Auswahlfeld — `<select>` im `.field`-Gerüst. Die Optionen kommen über `options`;\n * a11y-Verdrahtung wie beim Textfeld (aria-required/-invalid/-describedby).\n *\n * Als `ControlValueAccessor` (siehe FieldBase) direkt an Angular-Formulare\n * anbindbar (`[(ngModel)]`, `formControlName`) bzw. ohne Formular per `[(value)]`.\n *\n * Verwendungsguidance dieser Gruppe: siehe Textfeld (`komponenten-inputs-forms-textfeld--verwendung`).\n */\n@Component({\n selector: 'cds-select-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldShellComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectFieldComponent),\n multi: true,\n },\n ],\n template: `\n <cds-field-shell\n [label]=\"label()\"\n [required]=\"required()\"\n [helper]=\"helper()\"\n [error]=\"error()\"\n [fieldId]=\"fieldId()\"\n [errorId]=\"errorId()\"\n >\n <!-- required nativ zusätzlich zu aria-required: natives HTML5-required für die\n Formular-Validierung im Browser, aria-required für den Screenreader-Zustand. -->\n <select\n [id]=\"fieldId()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.required]=\"required() ? '' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"error() ? errorId() : null\"\n (change)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n >\n @for (opt of options(); track opt) {\n <option>{{ opt }}</option>\n }\n </select>\n </cds-field-shell>\n `,\n})\nexport class SelectFieldComponent extends FieldBase {\n /** Auswahloptionen (erste dient üblicherweise als Platzhalter, z. B. „Bitte wählen“). */\n readonly options = input<string[]>([]);\n}\n","import { ChangeDetectionStrategy, Component, forwardRef, input, model } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { CdsArea } from '../area';\nimport { CvaBase } from '../shared/cva-base.directive';\n\n/**\n * Checkbox — Einwilligungs-/Consent-Feld nach docs/index.html („Forms“).\n *\n * Bewusst KEIN nachgebautes Kästchen: ein natives `<input type=\"checkbox\">` mit\n * `accent-color` in der Bereichsfarbe (genau wie die Doku), umschlossen von einem\n * `<label>` mit dem Einwilligungstext und optional verlinktem Datenschutzhinweis.\n * Dokumentierte Verwendung: Newsletter-/DSGVO-Einwilligung, i. d. R. `required`.\n *\n * Als `ControlValueAccessor` direkt an Angular-Formulare anbindbar (`[(ngModel)]`,\n * `formControlName`); ohne Formular geht `[(checked)]` (checkedChange via model()).\n *\n * Verwendungsguidance dieser Gruppe: siehe Textfeld (`komponenten-inputs-forms-textfeld--verwendung`).\n */\n@Component({\n selector: 'cds-checkbox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CheckboxComponent), multi: true },\n ],\n template: `\n <label style=\"display:flex;align-items:flex-start;gap:var(--s3);cursor:pointer\">\n <input\n type=\"checkbox\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [attr.required]=\"required() ? '' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [style.accent-color]=\"'var(--' + area() + '-500)'\"\n style=\"width:18px;height:18px;margin-top:2px;flex-shrink:0;cursor:pointer\"\n (change)=\"onCheckboxChange($event)\"\n (blur)=\"markTouched()\"\n />\n <!-- prettier-ignore -->\n <span style=\"font:var(--ty-body-md);color:var(--tx-secondary)\"\n >{{ label() }}@if (linkLabel()) { <a class=\"body-link\" [href]=\"linkHref()\">{{ linkLabel() }}</a>}@if (required()) { <span class=\"req\" aria-hidden=\"true\">*</span>}</span\n >\n </label>\n `,\n})\nexport class CheckboxComponent extends CvaBase<boolean> {\n /** Einwilligungstext neben der Checkbox. */\n readonly label = input('Ich bin einverstanden.');\n /** Optionaler verlinkter Hinweis am Ende des Labels (z. B. „Datenschutzhinweise“). */\n readonly linkLabel = input('');\n /** Ziel des verlinkten Hinweises. */\n readonly linkHref = input('#');\n /** Pflicht-Einwilligung → required + aria-required + .req-Sternchen am Label-Ende. */\n readonly required = input(false);\n /** Gesetzt/aktiv → checked. Two-Way (`[(checked)]`) UND Angular-Forms. */\n readonly checked = model(false);\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n /** Brand Area → accent-color der Checkbox. */\n readonly area = input<CdsArea>('co');\n\n /** @internal */\n protected override normalizeValue(value: boolean): boolean {\n return !!value;\n }\n /** @internal */\n protected override applyValue(value: boolean): void {\n this.checked.set(value);\n }\n /** @internal */\n protected override applyDisabled(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n /** @internal */\n protected onCheckboxChange(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n this.checked.set(checked);\n this.onChange(checked);\n }\n /** @internal */\n protected markTouched(): void {\n this.onTouched();\n }\n}\n","import { ChangeDetectionStrategy, Component, forwardRef, input, model } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { CdsArea } from '../area';\nimport { CvaBase } from '../shared/cva-base.directive';\n\n// Modulweiter Zähler → jede Gruppe bekommt per Default einen EINDEUTIGEN name.\n// Gleiche names über Gruppen hinweg würden deren Radios fälschlich koppeln.\nlet uid = 0;\n\n/**\n * Radio-Gruppe (Optionsfelder) nach docs/index.html („Forms“).\n *\n * Für 2–6 sich gegenseitig ausschließende Optionen (mehr → Select). Bewusst KEIN\n * nachgebauter Kreis: native `<input type=\"radio\">` mit `accent-color` in der\n * Bereichsfarbe, gruppiert in `<fieldset>`/`<legend>` (Gruppen-Label wie ein\n * Feld-Label), alle Optionen teilen denselben `name`.\n *\n * Als `ControlValueAccessor` direkt an Angular-Formulare anbindbar (`[(ngModel)]`,\n * `formControlName`); ohne Formular geht `[(value)]` (valueChange via model()).\n *\n * Verwendungsguidance dieser Gruppe: siehe Textfeld (`komponenten-inputs-forms-textfeld--verwendung`).\n */\n@Component({\n selector: 'cds-radio-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroupComponent), multi: true },\n ],\n template: `\n <fieldset style=\"border:0;padding:0;margin:0;min-inline-size:0\">\n <!-- prettier-ignore -->\n <legend\n style=\"font:var(--ty-label-sm);text-transform:uppercase;letter-spacing:.06em;color:var(--tx-secondary);margin-bottom:var(--s2);padding:0\"\n >{{ legend() }}@if (required()) { <span class=\"req\" aria-hidden=\"true\">*</span>}</legend\n >\n <div style=\"display:flex;flex-direction:column;gap:var(--s3)\">\n @for (opt of options(); track opt) {\n <label\n style=\"display:flex;align-items:center;gap:var(--s3);cursor:pointer;font:var(--ty-body-md);color:var(--tx-primary)\"\n >\n <input\n type=\"radio\"\n [name]=\"name()\"\n [value]=\"opt\"\n [checked]=\"opt === value()\"\n [disabled]=\"disabled()\"\n [attr.required]=\"required() ? '' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [style.accent-color]=\"'var(--' + area() + '-500)'\"\n style=\"width:18px;height:18px;flex-shrink:0;cursor:pointer\"\n (change)=\"onRadioChange(opt)\"\n (blur)=\"markTouched()\"\n />\n <span>{{ opt }}</span>\n </label>\n }\n </div>\n </fieldset>\n `,\n})\nexport class RadioGroupComponent extends CvaBase<string> {\n /** Gruppen-Label (die Frage) → <legend>. */\n readonly legend = input('Optionen');\n /** Auswahloptionen (Label = Wert). */\n readonly options = input<string[]>([]);\n /** Aktuell gewählter Wert. Two-Way (`[(value)]`) UND Angular-Forms. */\n readonly value = model('');\n /** Gemeinsamer name aller Radios der Gruppe. Default eindeutig. */\n readonly name = input(`cds-radio-${++uid}`);\n /** Pflichtauswahl → required + .req-Asterisk. */\n readonly required = input(false);\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n /** Brand Area → accent-color der Radios. */\n readonly area = input<CdsArea>('co');\n\n /** @internal */\n protected override normalizeValue(value: string): string {\n return value ?? '';\n }\n /** @internal */\n protected override applyValue(value: string): void {\n this.value.set(value);\n }\n /** @internal */\n protected override applyDisabled(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n /** @internal */\n protected onRadioChange(opt: string): void {\n this.value.set(opt);\n this.onChange(opt);\n this.onTouched();\n }\n /** @internal */\n protected markTouched(): void {\n this.onTouched();\n }\n}\n","import { DestroyRef, inject } from '@angular/core';\n\n/**\n * `setTimeout`-Wrapper, der beim Zerstören der aufrufenden Komponente/Direktive\n * automatisch aufräumt (`DestroyRef.onDestroy`) — muss darum im Injektionskontext\n * erzeugt werden (Feld-Initializer/Konstruktor), wie `inject()` selbst.\n *\n * Deckt zwei Vorkommen ab, die `select.component.ts` und `combobox.component.ts`\n * (WP5 §5.5) wortgleich hatten: „scroll aktives Element in Sicht“ (Fire-and-forget,\n * ein Aufruf reicht) UND „Type-ahead-Puffer nach 500 ms leeren“ (Debounce — ein\n * erneuter `schedule()`-Aufruf ersetzt den noch laufenden Timer, stapelt also\n * nicht). Beides ist derselbe Bedarf: „terminiert, aber nicht über das Ende der\n * Komponente hinaus“.\n */\nexport function disposableTimeout(): {\n /** Vorherigen Timer verwerfen und `fn` neu terminieren. */\n schedule(fn: () => void, ms?: number): void;\n /** Laufenden Timer verwerfen, ohne neu zu terminieren. */\n clear(): void;\n} {\n const destroyRef = inject(DestroyRef);\n let handle: ReturnType<typeof setTimeout> | undefined;\n const clear = (): void => clearTimeout(handle);\n destroyRef.onDestroy(clear);\n return {\n schedule(fn: () => void, ms?: number): void {\n clear();\n handle = setTimeout(fn, ms);\n },\n clear,\n };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n forwardRef,\n inject,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroChevronDown, uiCheck } from '../icons/cds-icons';\nimport type { CdsArea } from '../area';\nimport { disposableTimeout } from '../shared/disposable-timeout';\n\nexport interface CdsSelectOption {\n value: string;\n label: string;\n}\n\nlet uid = 0;\n\n/**\n * Custom Select (cds-select) — gestylte Einzelauswahl über `.ep-select` aus\n * css/components.css → Doku „Dropdowns“.\n *\n * Trigger-Button + Listbox-Popup mit Häkchen und Bereichs-Akzent (data-area).\n * Anders als die dünnen Wrapper trägt diese Komponente das Verhalten selbst — das\n * ist ihr Zweck (das native <select> reicht dafür nicht): volle Tastatur (↑↓,\n * Pos1/Ende, Type-ahead, Enter wählt, Esc schließt) und die dokumentierte a11y\n * (role=listbox/option, aria-haspopup, aria-expanded, aria-activedescendant,\n * aria-selected). Für kurze Listen in Formularen bleibt das native cds-select-field\n * der Standard; dies hier ist für bereichs-akzentuierte Auswahl.\n *\n * Als `ControlValueAccessor` direkt an Angular-Formulare anbindbar (`[(ngModel)]`,\n * `formControlName`); ohne Formular geht `[(value)]` (valueChange via model()).\n */\n@Component({\n selector: 'cds-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgIcon],\n viewProviders: [provideIcons({ heroChevronDown, uiCheck })],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SelectComponent), multi: true },\n ],\n host: {\n '(focusout)': 'onFocusOut($event)',\n '(document:pointerdown)': 'onDocPointerDown($event)',\n },\n template: `\n <div\n class=\"ep-select\"\n [class.is-open]=\"open()\"\n [class.is-disabled]=\"disabled()\"\n [attr.data-area]=\"area() || null\"\n >\n <span class=\"ep-select-label\" [id]=\"ids.label\">{{ label() }}</span>\n <button\n #trigger\n type=\"button\"\n class=\"ep-select-trigger\"\n [class.is-placeholder]=\"!selectedOption()\"\n [disabled]=\"disabled()\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"ids.menu\"\n [attr.aria-labelledby]=\"ids.label + ' ' + ids.value\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"ep-select-value\" [id]=\"ids.value\" [attr.data-placeholder]=\"placeholder()\">{{\n selectedOption()?.label ?? placeholder()\n }}</span>\n <ng-icon class=\"ep-select-caret\" name=\"heroChevronDown\" size=\"24px\" aria-hidden=\"true\" />\n </button>\n <ul\n #menu\n class=\"ep-select-menu\"\n role=\"listbox\"\n [id]=\"ids.menu\"\n [attr.aria-labelledby]=\"ids.label\"\n tabindex=\"-1\"\n [attr.aria-activedescendant]=\"\n open() && activeIndex() >= 0 ? ids.option(activeIndex()) : null\n \"\n (keydown)=\"onMenuKeydown($event)\"\n >\n @for (opt of options(); track opt.value; let i = $index) {\n <!-- Listbox-Muster: Optionen sind bewusst NICHT einzeln fokussierbar; die\n Tastatur läuft über den Trigger (aria-activedescendant). Klick ist reine\n Maus-Bequemlichkeit — daher die a11y-Regeln hier gezielt deaktiviert. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <li\n class=\"ep-select-option\"\n role=\"option\"\n [id]=\"ids.option(i)\"\n [attr.data-value]=\"opt.value\"\n [class.is-active]=\"i === activeIndex()\"\n [attr.aria-selected]=\"opt.value === value()\"\n (click)=\"select(i)\"\n (mouseenter)=\"activeIndex.set(i)\"\n >\n <ng-icon class=\"ep-select-check\" name=\"uiCheck\" size=\"20px\" aria-hidden=\"true\" />\n {{ opt.label }}\n </li>\n }\n </ul>\n @if (name()) {\n <input type=\"hidden\" [name]=\"name()\" [value]=\"value() ?? ''\" />\n }\n </div>\n `,\n})\nexport class SelectComponent implements ControlValueAccessor {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n private readonly menu = viewChild<ElementRef<HTMLUListElement>>('menu');\n\n readonly label = input('Bereich');\n readonly options = input<CdsSelectOption[]>([]);\n /** Aktuell gewählter Wert (value der Option). Two-Way (`[(value)]`) UND Angular-Forms. */\n readonly value = model<string | undefined>(undefined);\n readonly area = input<CdsArea>();\n readonly placeholder = input('Bitte wählen…');\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n /** Optionaler Feldname → verstecktes Input für den Formular-Submit. */\n readonly name = input<string>();\n\n /** @internal */\n protected readonly open = signal(false);\n /** @internal */\n protected readonly activeIndex = signal(-1);\n\n private onChange: (value: string) => void = () => {\n /* von Angular-Forms via registerOnChange gesetzt */\n };\n private onTouched: () => void = () => {\n /* von Angular-Forms via registerOnTouched gesetzt */\n };\n\n /** @internal */\n writeValue(value: string | null): void {\n this.value.set(value ?? undefined);\n }\n /** @internal */\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n /** @internal */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n /** @internal */\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n private readonly instance = ++uid;\n /** @internal */\n protected readonly ids = {\n label: `cds-select-${this.instance}-label`,\n value: `cds-select-${this.instance}-value`,\n menu: `cds-select-${this.instance}-menu`,\n option: (i: number) => `cds-select-${this.instance}-opt-${i}`,\n };\n\n private typeBuffer = '';\n // Timer über DestroyRef aufgeräumt (WP5 §5.5) — dieselbe `disposableTimeout()`\n // deckt sowohl Fire-and-forget (Fokus/Scroll) als auch Debounce (Type-ahead) ab.\n private readonly menuFocusTimer = disposableTimeout();\n private readonly scrollTimer = disposableTimeout();\n private readonly typeaheadTimer = disposableTimeout();\n\n /** @internal */\n protected selectedOption(): CdsSelectOption | undefined {\n return this.options().find((o) => o.value === this.value());\n }\n\n /** @internal */\n protected toggle(): void {\n if (this.open()) this.close();\n else this.openMenu();\n }\n\n private openMenu(): void {\n if (this.disabled()) return;\n const sel = this.options().findIndex((o) => o.value === this.value());\n this.activeIndex.set(sel >= 0 ? sel : 0);\n this.open.set(true);\n // Fokus in die Listbox (nach Render, wenn sie sichtbar ist) — APG-Listbox-\n // Muster: aria-activedescendant liegt dort, nicht auf dem Button.\n this.menuFocusTimer.schedule(() => this.menu()?.nativeElement.focus());\n }\n\n /** @internal */\n protected close(focusTrigger = true): void {\n this.open.set(false);\n this.activeIndex.set(-1);\n if (focusTrigger) this.trigger()?.nativeElement.focus();\n }\n\n /** @internal */\n protected select(i: number): void {\n const opt = this.options()[i];\n if (!opt) return;\n this.value.set(opt.value);\n this.onChange(opt.value);\n this.onTouched();\n this.close();\n }\n\n /** @internal */\n protected markTouched(): void {\n this.onTouched();\n }\n\n /**\n * `onTouched` erst, wenn der Fokus die GESAMTE Komponente verlässt — nicht schon beim\n * Öffnen, wenn er vom Trigger in die Listbox wandert (beides liegt im Host). Sonst\n * wäre das Control „touched“, bevor überhaupt ausgewählt wurde.\n *\n * @internal\n */\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (!next || !this.host.nativeElement.contains(next)) this.markTouched();\n }\n\n /**\n * Tastatur am Trigger-Button: nur Öffnen (im offenen Zustand hat die Listbox Fokus).\n *\n * @internal\n */\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.open()) return;\n const key = event.key;\n if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter' || key === ' ') {\n event.preventDefault();\n this.openMenu();\n }\n }\n\n /**\n * Tastatur in der offenen Listbox: Navigation, Auswahl, Schließen, Type-ahead.\n *\n * @internal\n */\n protected onMenuKeydown(event: KeyboardEvent): void {\n const key = event.key;\n switch (key) {\n case 'ArrowDown':\n event.preventDefault();\n this.move(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.move(-1);\n break;\n case 'Home':\n event.preventDefault();\n this.setActive(0);\n break;\n case 'End':\n event.preventDefault();\n this.setActive(this.options().length - 1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (this.activeIndex() >= 0) this.select(this.activeIndex());\n break;\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n case 'Tab':\n this.close(false);\n break;\n default:\n if (key.length === 1 && /\\S/.test(key)) this.typeahead(key);\n }\n }\n\n private move(delta: number): void {\n const n = this.options().length;\n if (!n) return;\n const next = Math.min(n - 1, Math.max(0, this.activeIndex() + delta));\n this.setActive(next);\n }\n\n private setActive(i: number): void {\n this.activeIndex.set(i);\n // Aktiven Eintrag in Sicht scrollen (lange Listen).\n this.scrollTimer.schedule(() => {\n this.host.nativeElement\n .querySelector(`#${CSS.escape(this.ids.option(i))}`)\n ?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n private typeahead(char: string): void {\n this.typeBuffer += char.toLowerCase();\n this.typeaheadTimer.schedule(() => (this.typeBuffer = ''), 500);\n const match = this.options().findIndex((o) =>\n o.label.toLowerCase().startsWith(this.typeBuffer),\n );\n if (match >= 0) this.setActive(match);\n }\n\n /** @internal */\n protected onDocPointerDown(event: PointerEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) this.close(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n linkedSignal,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroChevronDown, heroXMark } from '../icons/cds-icons';\nimport type { CdsArea } from '../area';\nimport type { CdsSelectOption } from '../select/select.component';\nimport { disposableTimeout } from '../shared/disposable-timeout';\n\nlet uid = 0;\n\n/**\n * Combobox (cds-combobox) — Tipp-Filter über `.ep-combobox` aus css/components.css\n * → Doku „Dropdowns“. Wie der Custom Select, aber mit Substring-Filter im Feld (für\n * lange Listen). Optional Multi-Select mit Chips (`multi`).\n *\n * Verhalten/a11y selbst getragen: Input mit role=combobox (dort ist\n * aria-activedescendant erlaubt), aria-expanded/-controls/-autocomplete; Listbox mit\n * role=listbox/option; ↓ öffnet/navigiert, Enter wählt, Esc schließt, Rücktaste bei\n * leerem Feld entfernt im Multi-Modus den letzten Chip. Beim Schließen ohne Auswahl\n * fällt die Einzelauswahl auf das gewählte Label zurück (kein loser Filtertext).\n *\n * Als `ControlValueAccessor` direkt an Angular-Formulare anbindbar (`[(ngModel)]`,\n * `formControlName`); der Formularwert ist im Multi-Modus `string[]`, sonst `string`.\n * Ohne Formular gehen `[(value)]` / `[(values)]` (valueChange/valuesChange via model()).\n *\n * Verwendungsguidance dieser Gruppe: siehe Custom Select (`komponenten-dropdowns-custom-select--verwendung`).\n */\n@Component({\n selector: 'cds-combobox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgIcon],\n viewProviders: [provideIcons({ heroChevronDown, heroXMark })],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ComboboxComponent), multi: true },\n ],\n host: {\n '(document:pointerdown)': 'onDocPointerDown($event)',\n },\n template: `\n <div\n class=\"ep-combobox\"\n [class.is-multi]=\"multi()\"\n [class.is-open]=\"open()\"\n [class.is-disabled]=\"disabled()\"\n [attr.data-area]=\"area() || null\"\n >\n <span class=\"ep-select-label\" [id]=\"ids.label\">{{ label() }}</span>\n <!-- Klick auf die Feldfläche fokussiert das Input (cursor:text); das Input selbst\n ist direkt tastaturfokussierbar — daher a11y-Regeln hier gezielt aus. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"ep-combobox-control\"\n [class.has-clear]=\"query().length > 0\"\n (click)=\"focusInput()\"\n >\n @if (multi()) {\n @for (opt of selectedOptions(); track opt.value) {\n <span class=\"ep-combobox-token\">\n <span class=\"ep-combobox-token-label\">{{ opt.label }}</span>\n <button\n type=\"button\"\n class=\"ep-combobox-token-remove\"\n [attr.aria-label]=\"'Entfernen: ' + opt.label\"\n (click)=\"removeValue(opt.value, $event)\"\n >\n <ng-icon name=\"heroXMark\" size=\"14px\" aria-hidden=\"true\" />\n </button>\n </span>\n }\n }\n <input\n #input\n class=\"ep-combobox-input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-labelledby]=\"ids.label\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"ids.menu\"\n aria-autocomplete=\"list\"\n [attr.aria-activedescendant]=\"\n open() && activeIndex() >= 0 ? ids.option(activeIndex()) : null\n \"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [value]=\"query()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (focus)=\"openMenu()\"\n (blur)=\"markTouched()\"\n />\n @if (query().length > 0) {\n <button\n type=\"button\"\n class=\"ep-combobox-clear\"\n aria-label=\"Eingabe löschen\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" size=\"16px\" aria-hidden=\"true\" />\n </button>\n }\n <ng-icon class=\"ep-select-caret\" name=\"heroChevronDown\" size=\"24px\" aria-hidden=\"true\" />\n </div>\n <ul\n class=\"ep-combobox-menu\"\n role=\"listbox\"\n [id]=\"ids.menu\"\n [attr.aria-labelledby]=\"ids.label\"\n >\n @for (opt of filtered(); track opt.value; let i = $index) {\n <!-- Listbox-Muster: Optionen bewusst nicht einzeln fokussierbar; Tastatur\n läuft über das Input (aria-activedescendant). -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <li\n class=\"ep-select-option\"\n role=\"option\"\n [id]=\"ids.option(i)\"\n [attr.data-value]=\"opt.value\"\n [class.is-active]=\"i === activeIndex()\"\n [attr.aria-selected]=\"isSelected(opt.value)\"\n (click)=\"select(opt)\"\n (mouseenter)=\"activeIndex.set(i)\"\n >\n {{ opt.label }}\n </li>\n }\n @if (!filtered().length) {\n <li class=\"ep-combobox-empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ emptyText() }}\n </li>\n }\n </ul>\n </div>\n `,\n})\nexport class ComboboxComponent implements ControlValueAccessor {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly input = viewChild<ElementRef<HTMLInputElement>>('input');\n\n readonly label = input('Thema');\n readonly options = input<CdsSelectOption[]>([]);\n /** Einzelauswahl: gewählter Wert. Two-Way (`[(value)]`) UND Angular-Forms. */\n readonly value = model<string | undefined>(undefined);\n /** Mehrfachauswahl: gewählte Werte (nur bei multi). Two-Way UND Angular-Forms. */\n readonly values = model<string[]>([]);\n readonly multi = input(false);\n readonly area = input<CdsArea>();\n readonly placeholder = input('Suchen…');\n readonly emptyText = input('Kein Treffer');\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n\n /** @internal */\n protected readonly open = signal(false);\n /** @internal */\n protected readonly activeIndex = signal(0);\n\n /**\n * Aktuell gewählte Werte — reiner Ableitungszustand aus `[(value)]`/`[(values)]`,\n * je nach Modus (WP5 §5.3: vorher ein per `effect()` nachgeführtes Signal; die\n * `effect()`-Zustandsableitung ist das Anti-Muster, das die Angular-Doku\n * ausdrücklich nennt). Alle Schreibpfade (`select()`, `removeValue()`,\n * `writeValue()`) schreiben seitdem direkt in `value`/`values` — die Quelle,\n * nicht mehr in dieses abgeleitete Signal.\n *\n * @internal\n */\n protected readonly selected = computed<string[]>(() =>\n this.multi() ? this.values() : this.value() ? [this.value() as string] : [],\n );\n\n /** Label der aktuellen Einzelauswahl (leer bei Multi/keiner Auswahl). */\n private readonly selectedLabel = computed(\n () => this.options().find((o) => o.value === this.value())?.label ?? '',\n );\n\n /**\n * Sichtbarer Filtertext im Feld. Vorgabe: leer im Multi-Modus, sonst das Label\n * der aktuellen Auswahl — lokal überschreibbar (Tippen via `onInput`,\n * `select()`/`clear()`/`close()` setzen ihn ebenfalls direkt). Aktualisiert sich\n * NICHT von der Vorgabe her, während das Menü offen ist (Nutzer tippt gerade);\n * erst das nächste Schließen übernimmt die neue Vorgabe. Ersetzt den Teil des\n * bisherigen `effect()`, der `query` außerhalb des offenen Menüs nachführte\n * (WP5 §5.3).\n *\n * @internal\n */\n protected readonly query = linkedSignal<{ open: boolean; multi: boolean; label: string }, string>(\n {\n source: () => ({ open: this.open(), multi: this.multi(), label: this.selectedLabel() }),\n computation: (src, previous) => {\n // Offenes Menü: laufende Eingabe nicht überschreiben (entspricht dem alten\n // `if (!this.open())`-Gate). Geschlossen: Multi zeigt nie ein Label (leeren),\n // Einzelauswahl übernimmt das Label der aktuellen Auswahl.\n if (src.open) return previous?.value ?? '';\n return src.multi ? '' : src.label;\n },\n },\n );\n\n private onChange: (value: string | string[]) => void = () => {\n /* von Angular-Forms via registerOnChange gesetzt */\n };\n private onTouched: () => void = () => {\n /* von Angular-Forms via registerOnTouched gesetzt */\n };\n\n private readonly instance = ++uid;\n /** @internal */\n protected readonly ids = {\n label: `cds-combobox-${this.instance}-label`,\n menu: `cds-combobox-${this.instance}-menu`,\n option: (i: number) => `cds-combobox-${this.instance}-opt-${i}`,\n };\n\n /**\n * ControlValueAccessor — Formularwert ist string[] (multi) bzw. string (single).\n *\n * @internal\n */\n writeValue(value: string | string[] | null): void {\n if (this.multi()) {\n const arr = Array.isArray(value) ? [...value] : [];\n this.values.set(arr);\n } else {\n const v = typeof value === 'string' ? value : undefined;\n this.value.set(v);\n this.query.set(v ? (this.options().find((o) => o.value === v)?.label ?? '') : '');\n }\n }\n /** @internal */\n registerOnChange(fn: (value: string | string[]) => void): void {\n this.onChange = fn;\n }\n /** @internal */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n /** @internal */\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n /**\n * Aktuell gewählte Optionen (für die Chips im Multi-Modus).\n *\n * @internal\n */\n protected selectedOptions(): CdsSelectOption[] {\n return this.selected()\n .map((v) => this.options().find((o) => o.value === v))\n .filter((o): o is CdsSelectOption => !!o);\n }\n\n /**\n * Gefilterte Optionen: Substring (case-insensitiv); im Multi-Modus ohne bereits Gewählte.\n *\n * @internal\n */\n protected filtered(): CdsSelectOption[] {\n const q = this.query().trim().toLowerCase();\n const chosen = this.selected();\n return this.options().filter((o) => {\n if (this.multi() && chosen.includes(o.value)) return false;\n return !q || o.label.toLowerCase().includes(q);\n });\n }\n\n /** @internal */\n protected isSelected(value: string): boolean {\n return this.selected().includes(value);\n }\n\n /** @internal */\n protected focusInput(): void {\n if (!this.disabled()) this.input()?.nativeElement.focus();\n }\n\n /** @internal */\n protected openMenu(): void {\n if (this.disabled() || this.open()) return;\n this.open.set(true);\n this.activeIndex.set(0);\n }\n\n /** @internal */\n protected close(): void {\n this.open.set(false);\n if (this.multi()) {\n // Multi-Modus: keinen losen Filtertext stehen lassen, der zu keiner Auswahl\n // gehört (Auswahl läuft über die Chips, nicht über das Feld).\n this.query.set('');\n } else {\n // Einzelauswahl: keinen losen Filtertext stehen lassen.\n const label = this.options().find((o) => o.value === this.value())?.label ?? '';\n this.query.set(label);\n }\n }\n\n /** @internal */\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.open.set(true);\n this.activeIndex.set(0);\n }\n\n /** @internal */\n protected select(opt: CdsSelectOption): void {\n if (this.multi()) {\n const next = [...this.selected(), opt.value];\n this.values.set(next);\n this.onChange(next);\n this.onTouched();\n this.query.set('');\n this.activeIndex.set(0);\n this.focusInput(); // offen lassen, weiter hinzufügen\n } else {\n this.value.set(opt.value);\n this.onChange(opt.value);\n this.onTouched();\n this.query.set(opt.label);\n this.open.set(false);\n }\n }\n\n /** @internal */\n protected removeValue(value: string, event?: Event): void {\n event?.stopPropagation();\n const next = this.selected().filter((v) => v !== value);\n this.values.set(next);\n this.onChange(next);\n this.onTouched();\n }\n\n /** @internal */\n protected clear(event?: Event): void {\n event?.stopPropagation();\n this.query.set('');\n this.activeIndex.set(0);\n this.focusInput();\n }\n\n /** @internal */\n protected markTouched(): void {\n this.onTouched();\n }\n\n /** @internal */\n protected onKeydown(event: KeyboardEvent): void {\n const opts = this.filtered();\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this.open()) this.openMenu();\n else this.activeIndex.set(Math.min(opts.length - 1, this.activeIndex() + 1));\n this.scrollActive();\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (!this.open()) this.openMenu();\n else this.activeIndex.set(Math.max(0, this.activeIndex() - 1));\n this.scrollActive();\n break;\n case 'Home':\n // Nur bei offenem Menü abfangen (erste gefilterte Option) — bei\n // geschlossenem Feld bleibt die native Cursor-Bewegung im Text erhalten.\n if (!this.open()) return;\n event.preventDefault();\n this.activeIndex.set(0);\n this.scrollActive();\n break;\n case 'End':\n // Analog zu Home: nur bei offenem Menü (letzte gefilterte Option).\n if (!this.open()) return;\n event.preventDefault();\n this.activeIndex.set(opts.length - 1);\n this.scrollActive();\n break;\n case 'Enter': {\n const opt = opts[this.activeIndex()];\n if (this.open() && opt) {\n event.preventDefault();\n this.select(opt);\n }\n break;\n }\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n case 'Backspace':\n if (this.multi() && this.query().length === 0 && this.selected().length) {\n this.removeValue(this.selected()[this.selected().length - 1]);\n }\n break;\n }\n }\n\n // Timer über DestroyRef aufgeräumt (WP5 §5.5).\n private readonly scrollTimer = disposableTimeout();\n\n private scrollActive(): void {\n this.scrollTimer.schedule(() => {\n this.host.nativeElement\n .querySelector(`#${CSS.escape(this.ids.option(this.activeIndex()))}`)\n ?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n /** @internal */\n protected onDocPointerDown(event: PointerEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) this.close();\n }\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n forwardRef,\n inject,\n input,\n model,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { CdsArea } from '../area';\nimport { CvaBase } from '../shared/cva-base.directive';\n\n// Modulweiter Zähler → jede Instanz bekommt per Default eine EINDEUTIGE id.\n// Ein konstanter Default würde bei mehreren Slidern kollidieren (doppelte id →\n// kaputte label/for-, output/for- und aria-describedby-Verknüpfung).\nlet uid = 0;\n\n/**\n * Slider — Wrapper um `.field-slider` / `.slider` aus css/components.css → „Slider“.\n *\n * Range-Eingabe mit Label + Live-Ausgabe, bereichsgefärbtem Thumb/Output\n * (.slider-<area> setzt --sl-color), automatisch berechneten Ticks und Helper-Text.\n *\n * Ticks: Es wird nur eine gewünschte ANZAHL (`tickCount`) angegeben; die Positionen/\n * Labels werden gleichmäßig aus [min, max] berechnet (space-between wie das CSS-\n * Layout). Wird der Slider zu schmal, reduziert die Komponente die Tick-Zahl reaktiv\n * (ResizeObserver), sodass die Labels nicht überlappen — Endpunkte bleiben erhalten.\n *\n * Als `ControlValueAccessor` direkt an Angular-Formulare anbindbar (`[(ngModel)]`,\n * `formControlName`); ohne Formular geht `[(value)]` (valueChange via model()).\n *\n * Verwendungsguidance dieser Gruppe: siehe Textfeld (`komponenten-inputs-forms-textfeld--verwendung`).\n */\n@Component({\n selector: 'cds-slider',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SliderComponent), multi: true },\n ],\n template: `\n <div class=\"field-slider\">\n <div class=\"field-slider-header\">\n <label class=\"field-slider-label\" [attr.for]=\"sliderId()\">{{ label() }}</label>\n <output [class]=\"outputClasses()\" [attr.for]=\"sliderId()\" [id]=\"sliderId() + '-out'\">\n {{ formatted() }}\n </output>\n </div>\n <input\n [class]=\"sliderClasses()\"\n type=\"range\"\n [id]=\"sliderId()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.aria-valuetext]=\"formatted()\"\n [attr.aria-describedby]=\"helper() ? sliderId() + '-hint' : null\"\n (input)=\"onInput($event)\"\n (blur)=\"markTouched()\"\n />\n @if (tickItems().length) {\n <!-- Ticks exakt auf die Thumb-Position ausgerichtet: der Thumb (22px, siehe\n css/components.css) läuft mittig von 11px bis (Breite − 11px). Das\n space-between des Kern-CSS träfe die Label-MITTEN nicht (bei vielen Ticks\n sichtbar), daher hier absolut positioniert und zentriert. -->\n <div\n class=\"field-slider-ticks\"\n aria-hidden=\"true\"\n style=\"position:relative;display:block;padding:0;height:16px\"\n >\n @for (t of tickItems(); track $index) {\n <span\n [style.left]=\"t.left\"\n style=\"position:absolute;transform:translateX(-50%);white-space:nowrap\"\n >{{ t.label }}</span\n >\n }\n </div>\n }\n @if (helper()) {\n <span class=\"helper\" [id]=\"sliderId() + '-hint'\">{{ helper() }}</span>\n }\n </div>\n `,\n})\nexport class SliderComponent extends CvaBase<number> {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n /** Gemessene Slider-Breite (px); treibt die reaktive Tick-Reduktion. */\n private readonly width = signal(0);\n\n readonly label = input('Budget-Rahmen');\n /** Markenbereich → .slider-<area> (Thumb- + Output-Farbe). */\n readonly area = input<CdsArea>('co');\n readonly min = input(10000, { transform: numberAttribute });\n readonly max = input(100000, { transform: numberAttribute });\n readonly step = input(5000, { transform: numberAttribute });\n /** Aktueller Wert. Two-Way (`[(value)]`) UND Angular-Forms. */\n readonly value = model(50000);\n /** Einheit, an den formatierten Wert angehängt (z. B. ' €'). */\n readonly unit = input(' €');\n /** Gewünschte Anzahl Ticks (inkl. Endpunkte). 0 = keine. Wird bei zu schmalem\n * Slider automatisch reduziert. */\n readonly tickCount = input(3, { transform: numberAttribute });\n /** Mindestbreite (px) pro Tick-Label, ab der reduziert wird. */\n readonly minTickSpacing = input(56, { transform: numberAttribute });\n readonly helper = input('Schritte: 5.000 €');\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n readonly sliderId = input(`cds-slider-${++uid}`);\n\n constructor() {\n super();\n // Erstmessung + ResizeObserver-Setup: reine Browser-Angelegenheit (Layout gibt es\n // beim serverseitigen Rendern nicht) und läuft genau einmal nach dem ersten Render —\n // afterNextRender ist der Ersatz für ngAfterViewInit + direktem DOM-Zugriff, der\n // (anders als ngAfterViewInit) NIE beim SSR ausgeführt wird.\n afterNextRender(() => {\n const el = this.host.nativeElement.querySelector<HTMLElement>('.field-slider');\n if (!el) return;\n this.width.set(el.getBoundingClientRect().width);\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver((entries) => {\n this.width.set(entries[0].contentRect.width);\n });\n ro.observe(el);\n this.destroyRef.onDestroy(() => ro.disconnect());\n }\n });\n }\n\n /** @internal */\n protected override normalizeValue(value: number): number {\n // Auf [min, max] klemmen: ein Formularwert außerhalb des Bereichs würde sonst im\n // <output> stehen, während der native Thumb an min/max klemmt (Modell/UI-Mismatch).\n const n = typeof value === 'number' && !Number.isNaN(value) ? value : this.min();\n return this.clamp(n);\n }\n private clamp(v: number): number {\n return Math.min(this.max(), Math.max(this.min(), v));\n }\n /** @internal */\n protected override applyValue(value: number): void {\n this.value.set(value);\n }\n /** @internal */\n protected override applyDisabled(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n /** @internal */\n protected readonly sliderClasses = computed(() => `slider slider-${this.area()}`);\n /** @internal */\n protected readonly outputClasses = computed(() => `field-slider-output slider-${this.area()}`);\n /** @internal */\n protected readonly formatted = computed(\n () => `${this.value().toLocaleString('de-DE')}${this.unit()}`,\n );\n\n /** Effektive Tick-Anzahl: Wunsch, aber auf das reduziert, was in die Breite passt. */\n private effectiveTickCount(): number {\n const tickCount = this.tickCount();\n if (tickCount < 2) return Math.max(0, Math.trunc(tickCount));\n const w = this.width();\n if (!w) return tickCount; // vor der Messung: Wunschanzahl\n const maxFit = Math.max(2, Math.floor(w / this.minTickSpacing()));\n return Math.min(tickCount, maxFit);\n }\n\n /**\n * Gleichmäßig über [min, max] verteilte Ticks: Label (kompakt formatiert) plus\n * absolute Ziel-Position (left), zentriert auf die echte Thumb-Position.\n *\n * @internal\n */\n protected readonly tickItems = computed<{ label: string; left: string }[]>(() => {\n const n = this.effectiveTickCount();\n if (n < 1) return [];\n // left so, dass die Label-MITTE auf dem Thumb-Mittelpunkt liegt (Thumb 22px →\n // von 11px bis Breite−11px). translateX(-50%) zentriert das Label darüber.\n const at = (p: number) => `calc(11px + ${p} * (100% - 22px))`;\n const min = this.min();\n const max = this.max();\n if (n === 1) return [{ label: this.formatTick(min), left: at(0.5) }];\n return Array.from({ length: n }, (_, i) => {\n const p = i / (n - 1);\n return { label: this.formatTick(min + (max - min) * p), left: at(p) };\n });\n });\n\n /** Kompakte Tick-Beschriftung: k/M-Kurzform (de-DE), z. B. 32500 → „32,5k“. */\n private formatTick(v: number): string {\n const abs = Math.abs(v);\n const fmt = (x: number) => x.toLocaleString('de-DE', { maximumFractionDigits: 1 });\n if (abs >= 1_000_000) return `${fmt(v / 1_000_000)}M`;\n if (abs >= 1_000) return `${fmt(v / 1_000)}k`;\n return fmt(v);\n }\n\n /** @internal */\n protected onInput(event: Event): void {\n const value = Number((event.target as HTMLInputElement).value);\n this.value.set(value);\n this.onChange(value);\n }\n /** @internal */\n protected markTouched(): void {\n this.onTouched();\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n// Re-Export für Konsumenten, die die Typen weiter aus footer.component beziehen.\nexport type { CdsFooterLink, CdsSocialLink, CdsSocialPlatform } from './footer-bottom.component';\n\n/**\n * Footer — `<footer>`-Landmark (`.footer`, Zwei-Band-Stack) als schlanke Hülle. Die\n * beiden Bänder werden als `<cds-footer-main>` und `<cds-footer-bottom>` projiziert:\n *\n * ```html\n * <cds-footer>\n * <cds-footer-main ...></cds-footer-main>\n * <cds-footer-bottom ...></cds-footer-bottom>\n * </cds-footer>\n * ```\n *\n * So lassen sich oberer und unterer Teil einzeln betrachten und unabhängig\n * konfigurieren; `.footer` stapelt sie (flex column) im Seitenfuß-Landmark.\n */\n@Component({\n selector: 'cds-footer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <footer class=\"footer\" aria-label=\"Seitenfuß\">\n <ng-content></ng-content>\n </footer>\n `,\n})\nexport class FooterComponent {}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Footer — oberer Teil (`.footer-main`): helles Band als **generisches Spalten-Layout**.\n * Der Inhalt wird als beliebige Spalten projiziert (jedes Top-Level-Kind = eine\n * Grid-Spalte), statt fester Adresse/Nav/Newsletter-Struktur — so eignet es sich für\n * Website- UND App-Footer ohne Marketing-Lock-in.\n *\n * ```html\n * <cds-footer-main>\n * <div>…Spalte 1…</div>\n * <div>…Spalte 2…</div>\n * </cds-footer-main>\n * ```\n *\n * Die Host-Klasse `footer-main` trägt Hintergrund/Padding aus css/components.css;\n * `:host{display:block}` macht das Band auch standalone zum Block. Spaltenanzahl/-breiten\n * über `columns` (grid-template-columns); ohne Angabe gilt das 3-Spalten-Default.\n *\n * Verwendungsguidance dieser Gruppe: siehe Footer, Komplett (`komponenten-footer-komplett--verwendung`).\n */\n@Component({\n selector: 'cds-footer-main',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'footer-main' },\n styles: [':host{display:block}'],\n template: `\n <div class=\"footer-grid\" [style.grid-template-columns]=\"columns() || null\">\n <ng-content></ng-content>\n </div>\n `,\n})\nexport class FooterMainComponent {\n /**\n * Optionale `grid-template-columns` (z. B. `'repeat(4, 1fr)'` oder `'2fr 1fr'`).\n * Ohne Angabe gilt das Default aus `.footer-grid` (1.2fr 1fr 1.3fr, 3 Spalten).\n */\n readonly columns = input<string>();\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\nexport interface CdsFooterLink {\n label: string;\n href: string;\n}\n\n/** Built-in-Plattformen mit verifiziertem Icon. Weitere über `iconPath` möglich. */\nexport type CdsSocialPlatform = 'linkedin' | 'youtube';\n\nexport interface CdsSocialLink {\n href: string;\n /** Built-in-Plattform (bringt Icon + Label mit). */\n platform?: CdsSocialPlatform;\n /** Aria-Label; Default: das Label der Plattform. */\n label?: string;\n /** Eigenes SVG-Pfad-`d` (viewBox 0 0 24, weiß) — für Plattformen ohne Built-in. */\n iconPath?: string;\n}\n\n/**\n * Footer — unterer Teil (`.footer-btm`): dunkler Streifen mit Copyright, Rechts-Links\n * und Social-Profilen. Die Host-Klasse `footer-btm` trägt Hintergrund/Flex-Layout aus\n * css/components.css. Social-Glyphen sind schlanke Inline-SVGs in Weiß; verifizierte\n * Built-in-Icons (linkedin, youtube) via `platform`, beliebige weitere via `iconPath`.\n *\n * Verwendungsguidance dieser Gruppe: siehe Footer, Komplett (`komponenten-footer-komplett--verwendung`).\n */\n@Component({\n selector: 'cds-footer-bottom',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'footer-btm' },\n template: `\n <!-- prettier-ignore -->\n <span\n >{{ copyright() }}@if (version()) {<span aria-hidden=\"true\"> · </span>{{ version() }}}</span\n >\n <nav aria-label=\"Rechtliche Hinweise\" style=\"display:flex;gap:var(--s4);flex-wrap:wrap\">\n @for (link of legalLinks(); track $index) {\n <a class=\"footer-btm-link\" [href]=\"link.href\">{{ link.label }}</a>\n }\n </nav>\n @if (support(); as sup) {\n <a class=\"footer-btm-link\" [href]=\"sup.href\">{{ sup.label }}</a>\n }\n @if (socialLinks().length) {\n <!-- Glyphen explizit weiß (fill=\"#fff\") wie die -light-Logo-Assets der Doku:\n currentColor würde die Link-/n-300-Farbe erben (LinkedIn erschiene blau). -->\n <nav class=\"footer-social\" aria-label=\"Soziale Netzwerke\">\n @for (s of socialLinks(); track $index) {\n <a\n [href]=\"s.href\"\n target=\"_blank\"\n rel=\"noopener\"\n [attr.aria-label]=\"socialLabel(s) + ' (öffnet in neuem Tab)'\"\n >\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"#fff\" aria-hidden=\"true\">\n <path [attr.d]=\"socialPath(s)\" />\n </svg>\n </a>\n }\n </nav>\n }\n `,\n})\nexport class FooterBottomComponent {\n readonly copyright = input('© 2026 Conciso GmbH · Dortmund');\n /** Optionale Versionsangabe (z. B. „Version 1.4.2“), hinter dem Copyright. */\n readonly version = input<string>();\n /** Optionaler Support-/Hilfe-Link neben den Rechts-Links. */\n readonly support = input<CdsFooterLink>();\n readonly legalLinks = input<CdsFooterLink[]>([\n { label: 'Datenschutz', href: '#' },\n { label: 'Impressum', href: '#' },\n ]);\n readonly socialLinks = input<CdsSocialLink[]>([\n { platform: 'linkedin', href: '#' },\n { platform: 'youtube', href: '#' },\n ]);\n\n /** Verifizierte Built-in-Social-Icons (viewBox 0 0 24, weiß). */\n private readonly socialIcons: Record<CdsSocialPlatform, { d: string; label: string }> = {\n linkedin: {\n label: 'LinkedIn',\n d: 'M4.98 3.5a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5zM3 9h4v12H3zM10 9h3.8v1.7h.05c.53-1 1.83-2.05 3.77-2.05 4.03 0 4.78 2.65 4.78 6.1V21h-4v-5.4c0-1.3 0-2.96-1.8-2.96s-2.08 1.4-2.08 2.86V21h-4z',\n },\n youtube: {\n label: 'YouTube',\n d: 'M23 12s0-3.2-.4-4.7a2.5 2.5 0 0 0-1.77-1.77C19.3 5.1 12 5.1 12 5.1s-7.3 0-8.83.43A2.5 2.5 0 0 0 1.4 7.3C1 8.8 1 12 1 12s0 3.2.4 4.7a2.5 2.5 0 0 0 1.77 1.77C4.7 18.9 12 18.9 12 18.9s7.3 0 8.83-.43a2.5 2.5 0 0 0 1.77-1.77C23 15.2 23 12 23 12zM9.75 15.02V8.98L15 12z',\n },\n };\n\n /** @internal */\n protected socialPath(s: CdsSocialLink): string {\n return s.iconPath ?? (s.platform ? this.socialIcons[s.platform].d : '');\n }\n /** @internal */\n protected socialLabel(s: CdsSocialLink): string {\n return s.label ?? (s.platform ? this.socialIcons[s.platform].label : '');\n }\n}\n","import { ChangeDetectionStrategy, Component, TemplateRef, input, viewChild } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * Einzelner Tab für `<cds-area-tabs>`. Trägt Label + Bereich; sein Inhalt ist\n * BELIEBIGES projiziertes Markup (Text, Listen, Komponenten, CTAs …), das die\n * Elternkomponente ins zugehörige Panel rendert.\n *\n * Der Inhalt wird in ein internes `<ng-template>` projiziert (via `<ng-content>`)\n * und über einen TemplateRef bereitgestellt — so kann `cds-area-tabs` ihn getrennt\n * vom Tab-Button an der Panel-Position ausgeben (ngTemplateOutlet), passend zur\n * `.area-tabs` / `.atab-content`-Struktur aus css/components.css.\n */\n@Component({\n selector: 'cds-area-tab',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<ng-template><ng-content></ng-content></ng-template>`,\n})\nexport class AreaTabComponent {\n /** Markenbereich → Tab-Punkt (Bereichs-500) + aktiver Text/Unterstrich. */\n readonly area = input.required<CdsArea>();\n /** Beschriftung im Tab-Button. */\n readonly label = input('');\n\n /**\n * Projizierter Panel-Inhalt; von der Elternkomponente via Outlet gerendert.\n *\n * Bleibt `public`, weil `cds-area-tabs` ihn von außen liest — anders als die\n * internen Signale, die ADR-0007 auf `protected` stellt. `@internal` hält ihn\n * trotzdem aus Props-Tabelle und Manifest heraus: Input/Output ist er nicht.\n *\n * @internal\n */\n readonly content = viewChild.required<TemplateRef<unknown>>(TemplateRef);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n contentChildren,\n inject,\n input,\n model,\n} from '@angular/core';\nimport type { CdsArea } from '../area';\nimport { AreaTabComponent } from './area-tab.component';\n\n// Modulweiter Zähler → eindeutige IDs je Instanz. Ein konstanter Präfix würde bei\n// mehreren AreaTabs kollidieren (doppelte tab-/panel-id → kaputte aria-controls/\n// -labelledby-Verknüpfung und falsches Fokus-Ziel bei der Tastatur-Navigation).\nlet uid = 0;\n\n/**\n * AreaTabs — Wrapper um `.area-tabs` / `.atab` / `.atab-content` aus\n * css/components.css → „Area Tabs“. Bereichsgefärbte Tab-Leiste: der aktive Tab\n * setzt `--atab-color` (Bereichs-700) für Text + Unterstrich, der Punkt nutzt\n * Bereichs-500. Umschalten per Klick (aria-selected / sichtbares Panel).\n *\n * Tabs werden deklarativ als `<cds-area-tab>`-Kinder projiziert; jeder Tab trägt\n * `area` + `label` und BELIEBIGEN Inhalt (Markup/Komponenten), der ins Panel\n * gerendert wird. Der aktive Index ist über `[(active)]` steuerbar.\n */\n@Component({\n selector: 'cds-area-tabs',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n template: `\n <div class=\"area-tabs\" role=\"tablist\" [attr.aria-label]=\"ariaLabel()\">\n @for (tab of tabs(); track tab; let i = $index) {\n <button\n class=\"atab\"\n type=\"button\"\n role=\"tab\"\n [class.active]=\"i === active()\"\n [attr.aria-selected]=\"i === active()\"\n [attr.tabindex]=\"i === active() ? 0 : -1\"\n [attr.data-area]=\"tab.area()\"\n [id]=\"tabId(i)\"\n [attr.aria-controls]=\"panelId(i)\"\n [style]=\"'--atab-color:' + atabAccent(tab.area())\"\n (click)=\"active.set(i)\"\n (keydown)=\"onKeydown($event)\"\n >\n <span class=\"area-dot\" [style.background]=\"'var(--' + tab.area() + '-500)'\"></span>\n {{ tab.label() }}\n </button>\n }\n </div>\n\n @for (tab of tabs(); track tab; let i = $index) {\n <div\n class=\"atab-content\"\n role=\"tabpanel\"\n [class.visible]=\"i === active()\"\n [id]=\"panelId(i)\"\n [attr.aria-labelledby]=\"tabId(i)\"\n >\n <ng-container [ngTemplateOutlet]=\"tab.content()\"></ng-container>\n </div>\n }\n `,\n})\nexport class AreaTabsComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly instance = ++uid;\n\n /**\n * Die Tabs kommen als projizierte `<cds-area-tab>`-Kinder.\n *\n * @internal\n */\n protected readonly tabs = contentChildren(AreaTabComponent);\n /** Index des aktiven Tabs. Two-Way (`[(active)]`). */\n readonly active = model(0);\n /** Zugänglicher Name der Tab-Leiste (WAI-ARIA verlangt aria-label/-labelledby). */\n readonly ariaLabel = input('Bereiche');\n\n /**\n * Aktiv-Akzent je Bereich: ki braucht -800 (700 reißt AA), sonst -700 (wie .t-*).\n *\n * @internal\n */\n protected atabAccent(area: CdsArea): string {\n return area === 'ki' ? 'var(--ki-800)' : `var(--${area}-700)`;\n }\n\n /** @internal */\n protected tabId(i: number): string {\n return `cds-atab-${this.instance}-${i}`;\n }\n /** @internal */\n protected panelId(i: number): string {\n return `cds-atab-${this.instance}-panel-${i}`;\n }\n\n /**\n * WAI-ARIA-Tabs-Tastatur (horizontal, automatische Aktivierung): ←/→ bewegen mit\n * Umlauf, Home/End springen an die Enden. Der Fokus wird mitgeführt (Roving\n * Tabindex: nur der aktive Tab ist per Tab erreichbar). Panels laden sofort, daher\n * ist Auswahl = Fokus (APG-empfohlen).\n *\n * @internal\n */\n protected onKeydown(event: KeyboardEvent): void {\n const n = this.tabs().length;\n if (!n) return;\n const cur = this.active();\n let next: number;\n switch (event.key) {\n case 'ArrowRight':\n next = (cur + 1) % n;\n break;\n case 'ArrowLeft':\n next = (cur - 1 + n) % n;\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = n - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n this.active.set(next);\n this.host.nativeElement.querySelector<HTMLElement>(`#${CSS.escape(this.tabId(next))}`)?.focus();\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** Ein Logo: in der Regel ein Bild; der Text dient als Alt-Fallback und als Platzhalter. */\nexport interface CdsLogo {\n /** Firmen-/Markenname. Pflicht – dient als Alt-Text-Fallback UND als Text-Platzhalter,\n * falls (noch) kein Bild vorliegt. */\n label: string;\n /** Bildquelle (URL oder Data-URI). Gesetzt → Bild wird gezeigt, sonst der Text-Platzhalter. */\n src?: string;\n /** Alt-Text des Bilds (Fallback: `label`). */\n alt?: string;\n}\n\n/**\n * Logo — einzelne Logo-Kachel (`.logo-tile` aus css/components.css).\n *\n * Rendert bevorzugt ein **Bild** (`src`); ohne Bild fällt es auf den Text-`label`\n * als Platzhalter zurück (`.logo-placeholder`). So lässt es sich sowohl im\n * Logo-Carousel als auch eigenständig verwenden (Partner-Leiste, „Bekannt aus“-Reihe,\n * Footer). Die Host-Klasse `logo-tile` trägt Flex-Zentrierung/Padding aus der portablen CSS.\n */\n@Component({\n selector: 'cds-logo',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'logo-tile' },\n template: `\n @if (src()) {\n <img [src]=\"src()\" [alt]=\"alt() || label()\" />\n } @else {\n <span class=\"logo-placeholder\">{{ label() }}</span>\n }\n `,\n})\nexport class LogoComponent {\n readonly label = input.required<string>();\n /** Bildquelle; gesetzt → Bild statt Text-Platzhalter. */\n readonly src = input<string>();\n /** Alt-Text des Bilds (Fallback: `label`). */\n readonly alt = input('');\n}\n","/**\n * Geteilte Tastatur-Logik für Dot-Leisten mit `role=\"tab\"` in `role=\"tablist\"`\n * (Carousel, LogoCarousel): ←/→ mit Umlauf, Home/End an die Enden, automatische\n * Aktivierung (WAI-ARIA-Tabs-Muster). Reine Funktion, kein State — der Aufrufer\n * hält Länge/aktiven Index selbst und setzt bei einem Treffer den neuen Index\n * sowie den Fokus (Roving Tabindex).\n *\n * NICHT über `public-api.ts` exportiert: reines internes Implementierungsdetail\n * der Lib, keine öffentliche API.\n */\nexport function nextDotsIndex(length: number, current: number, key: string): number | null {\n if (!length) return null;\n switch (key) {\n case 'ArrowRight':\n return (current + 1) % length;\n case 'ArrowLeft':\n return (current - 1 + length) % length;\n case 'Home':\n return 0;\n case 'End':\n return length - 1;\n default:\n return null;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n effect,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { CdsLogo, LogoComponent } from '../logo/logo.component';\nimport { nextDotsIndex } from '../shared/dots-keyboard';\n\nexport type { CdsLogo } from '../logo/logo.component';\n\n/** Eindeutige IDs je Instanz (Dot aria-controls ↔ Slide-id). */\nlet cdsLogoCarouselUid = 0;\n\n/**\n * LogoCarousel — Wrapper um `.logo-carousel` aus css/components.css → „Logo-Carousel“.\n *\n * Diskrete Sets von je fünf Logos, die automatisch per Crossfade wechseln\n * (`[aria-hidden]` je Slide). Das Autoplay pausiert bei Maus-Hover und Tastatur-Fokus\n * (damit Nutzer in Ruhe lesen/bedienen können), zusätzlich dauerhaft über den\n * Pause-Button (.logo-carousel-pause, sichtbar bei Hover/Fokus bzw. im .paused-Zustand);\n * Dots wählen ein Set direkt. Autoplay respektiert prefers-reduced-motion.\n *\n * Der Timer wird zentral über ein `effect` gesteuert: er läuft nur, wenn NICHT\n * pausiert, NICHT gehovert, NICHT fokussiert und reduzierte Bewegung nicht gewünscht\n * ist. Eine Änderung des `interval` startet ihn automatisch neu.\n *\n * Jede Kachel ist ein `cds-logo`: bevorzugt ein Bild (`src`), sonst der Text als\n * Platzhalter/Fallback. Standardmäßig sind reine Text-Platzhalter gesetzt – reale\n * Anwendungen übergeben ihre Kundenlogos als Bilder.\n *\n * Verwendungsguidance dieser Gruppe: siehe Carousel (`komponenten-slider-carousel-carousel--verwendung`).\n */\n@Component({\n selector: 'cds-logo-carousel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LogoComponent],\n template: `\n <div\n class=\"logo-carousel\"\n [class.paused]=\"paused()\"\n (mouseenter)=\"hovered.set(true)\"\n (mouseleave)=\"hovered.set(false)\"\n (focusin)=\"focused.set(true)\"\n (focusout)=\"onFocusOut($event)\"\n >\n <button\n class=\"logo-carousel-pause\"\n type=\"button\"\n [attr.aria-label]=\"paused() ? 'Abspielen' : 'Pausieren'\"\n (click)=\"togglePause()\"\n >\n <svg\n class=\"icon-pause\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"10\" rx=\"1\" />\n <rect x=\"8\" y=\"2\" width=\"3\" height=\"10\" rx=\"1\" />\n </svg>\n <svg\n class=\"icon-play\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 2.5v9l7-4.5z\" />\n </svg>\n </button>\n\n <div class=\"logo-carousel-track\">\n @for (set of sets(); track $index; let i = $index) {\n <div\n class=\"logo-carousel-slide\"\n [id]=\"slideId(i)\"\n role=\"group\"\n aria-roledescription=\"Logo-Set\"\n [attr.aria-label]=\"'Set ' + (i + 1) + ' von ' + sets().length\"\n [attr.aria-hidden]=\"i !== active()\"\n >\n @for (logo of set; track $index) {\n <cds-logo [label]=\"logo.label\" [src]=\"logo.src\" [alt]=\"logo.alt || ''\" />\n }\n </div>\n }\n </div>\n\n <div class=\"logo-carousel-dots\" role=\"tablist\" aria-label=\"Logo-Set auswählen\">\n @for (set of sets(); track $index; let i = $index) {\n <button\n class=\"logo-carousel-dot\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"i === active()\"\n [attr.tabindex]=\"i === active() ? 0 : -1\"\n [attr.aria-controls]=\"slideId(i)\"\n [attr.aria-label]=\"'Set ' + (i + 1) + ' von ' + sets().length\"\n (click)=\"goTo(i)\"\n (keydown)=\"onDotsKeydown($event)\"\n ></button>\n }\n </div>\n </div>\n `,\n})\nexport class LogoCarouselComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Logo-Sets, die im Wechsel angezeigt werden (mind. ein Eintrag je Set). */\n readonly sets = input.required<CdsLogo[][]>();\n /** Autoplay-Intervall in **Millisekunden** (Standard 6000 = 6 s). */\n readonly interval = input(6000);\n /** Aktives Set. Two-Way (`[(active)]`) via model(). */\n readonly active = model(0);\n\n /**\n * Vom Nutzer explizit pausiert (Pause-Button).\n *\n * @internal\n */\n protected readonly paused = signal(false);\n /**\n * Transiente Pause: Maus über dem Carousel.\n *\n * @internal\n */\n protected readonly hovered = signal(false);\n /**\n * Transiente Pause: Tastatur-Fokus innerhalb des Carousels.\n *\n * @internal\n */\n protected readonly focused = signal(false);\n /** Reduzierte Bewegung gewünscht → kein Autoplay. Einmal beim Erzeugen ermittelt. */\n private readonly reducedMotion = signal(\n typeof window !== 'undefined' &&\n !!window.matchMedia?.('(prefers-reduced-motion: reduce)').matches,\n );\n private readonly uid = ++cdsLogoCarouselUid;\n\n constructor() {\n // Zentrale Timer-Steuerung: Der Effect legt bei jeder relevanten Änderung\n // (paused/hovered/focused/interval/reduced-motion) den Intervall-Timer neu an und\n // räumt den alten via onCleanup auf. Der aktive Index wird nur IM Callback gelesen\n // und ist daher keine Effect-Abhängigkeit (kein Neustart bei jedem Wechsel).\n effect((onCleanup) => {\n const play = !this.reducedMotion() && !this.paused() && !this.hovered() && !this.focused();\n const ms = this.interval();\n if (!play || typeof window === 'undefined') return;\n const timer = setInterval(() => {\n this.active.set((this.active() + 1) % this.sets().length);\n }, ms);\n onCleanup(() => clearInterval(timer));\n });\n }\n\n /**\n * Stabile Slide-id für die aria-controls-Verknüpfung der Dots.\n *\n * @internal\n */\n protected slideId(i: number): string {\n return `cds-logo-set-${this.uid}-${i + 1}`;\n }\n\n /** @internal */\n protected togglePause(): void {\n this.paused.set(!this.paused());\n }\n\n /** @internal */\n protected goTo(i: number): void {\n this.active.set(i);\n }\n\n /**\n * WAI-ARIA-Tabs-Tastatur auf der Dot-Leiste (horizontal, automatische Aktivierung):\n * ←/→ mit Umlauf, Home/End an die Enden; der Fokus wird mitgeführt (Roving Tabindex).\n * 1:1 übernommen von `carousel.component.ts` (Indexberechnung in\n * `../shared/dots-keyboard.ts`, identisch für beide Komponenten).\n *\n * @internal\n */\n protected onDotsKeydown(event: KeyboardEvent): void {\n const next = nextDotsIndex(this.sets().length, this.active(), event.key);\n if (next === null) return;\n event.preventDefault();\n this.goTo(next);\n this.host.nativeElement.querySelectorAll<HTMLElement>('.logo-carousel-dot')[next]?.focus();\n }\n\n /**\n * Fokus-Pause nur aufheben, wenn der Fokus das Carousel ganz verlässt (nicht bei\n * Wechsel zwischen Kind-Elementen).\n *\n * @internal\n */\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (!next || !this.host.nativeElement.contains(next)) this.focused.set(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { nextDotsIndex } from '../shared/dots-keyboard';\n\nexport interface CdsSlide {\n image?: string;\n title: string;\n text: string;\n}\n\n// Modulweiter Zähler → eindeutige Slide-IDs je Instanz für die aria-controls-\n// Verknüpfung der Dots (doppelte IDs bei mehreren Carousels brächen die Zuordnung).\nlet uid = 0;\n\n/**\n * Carousel — Wrapper um `.img-slider` aus css/components.css → „Bild-Slider“.\n *\n * Crossfade-Carousel: alle Slides liegen gestapelt im Grid, die aktive trägt\n * `.active` (opacity). Inaktive Slides bekommen zusätzlich `[aria-hidden]`, sonst\n * läse ein Screenreader Titel und Text jeder Folie vor, obwohl visuell nur eine\n * sichtbar ist (identisches Muster wie beim LogoCarousel). Prev/Next-Buttons\n * (.img-slider-btn) und Dots (.img-dot) steuern den Index. Optionale Hero-Variante\n * (.img-slider-hero). Ohne Bild-URL wird ein neutraler Platzhalter gezeigt. Der\n * aktive Index ist über `[(active)]` (model) beobacht-/steuerbar.\n */\n@Component({\n selector: 'cds-carousel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n [class]=\"wrapClasses()\"\n role=\"region\"\n aria-roledescription=\"Bildschirmpräsentation\"\n aria-label=\"Bildstrecke\"\n >\n <div class=\"img-slider-track\">\n @for (slide of slides(); track $index; let i = $index) {\n <div\n class=\"img-slide\"\n role=\"group\"\n aria-roledescription=\"Folie\"\n [id]=\"slideId(i)\"\n [attr.aria-label]=\"'Folie ' + (i + 1) + ' von ' + slides().length\"\n [attr.aria-hidden]=\"i !== active()\"\n [class.active]=\"i === active()\"\n >\n <div class=\"img-slide-media\">\n <img [src]=\"slide.image || placeholder\" [alt]=\"slide.title\" />\n </div>\n <div class=\"img-slide-caption\">\n <p class=\"img-slide-caption-title\">{{ slide.title }}</p>\n <p class=\"img-slide-caption-text\">{{ slide.text }}</p>\n </div>\n </div>\n }\n </div>\n\n <button\n class=\"img-slider-btn img-slider-prev\"\n type=\"button\"\n aria-label=\"Vorherige Slide\"\n (click)=\"prev()\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m15.75 19.5-7.5-7.5 7.5-7.5\" />\n </svg>\n </button>\n <button\n class=\"img-slider-btn img-slider-next\"\n type=\"button\"\n aria-label=\"Nächste Slide\"\n (click)=\"next()\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m8.25 4.5 7.5 7.5-7.5 7.5\" />\n </svg>\n </button>\n\n <div class=\"img-slider-dots\" role=\"tablist\" aria-label=\"Folien-Navigation\">\n @for (slide of slides(); track $index; let i = $index) {\n <button\n class=\"img-dot\"\n type=\"button\"\n role=\"tab\"\n [class.active]=\"i === active()\"\n [attr.aria-selected]=\"i === active()\"\n [attr.tabindex]=\"i === active() ? 0 : -1\"\n [attr.aria-controls]=\"slideId(i)\"\n [attr.aria-label]=\"'Folie ' + (i + 1) + ' von ' + slides().length\"\n (click)=\"active.set(i)\"\n (keydown)=\"onDotsKeydown($event)\"\n ></button>\n }\n </div>\n </div>\n `,\n})\nexport class CarouselComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly instance = ++uid;\n\n /** Anzuzeigende Slides (Bild optional, Titel/Text je Slide Pflicht). */\n readonly slides = input.required<CdsSlide[]>();\n /** Aktiver Slide-Index. Two-Way (`[(active)]`) via model(). */\n readonly active = model(0);\n /** Hero-Variante (vollflächig, 21:9, Caption als Overlay) → .img-slider-hero. */\n readonly hero = input(false);\n\n /** @internal */\n protected readonly wrapClasses = computed(() =>\n this.hero() ? 'img-slider img-slider-hero' : 'img-slider',\n );\n\n /** @internal */\n protected prev(): void {\n this.active.set((this.active() - 1 + this.slides().length) % this.slides().length);\n }\n /** @internal */\n protected next(): void {\n this.active.set((this.active() + 1) % this.slides().length);\n }\n\n /** @internal */\n protected slideId(i: number): string {\n return `cds-carousel-${this.instance}-slide-${i}`;\n }\n\n /**\n * WAI-ARIA-Tabs-Tastatur auf der Dot-Leiste (horizontal, automatische Aktivierung):\n * ←/→ mit Umlauf, Home/End an die Enden; der Fokus wird mitgeführt (Roving Tabindex).\n * Indexberechnung in `../shared/dots-keyboard.ts` (identisch mit LogoCarousel).\n *\n * @internal\n */\n protected onDotsKeydown(event: KeyboardEvent): void {\n const next = nextDotsIndex(this.slides().length, this.active(), event.key);\n if (next === null) return;\n event.preventDefault();\n this.active.set(next);\n this.host.nativeElement.querySelectorAll<HTMLElement>('.img-dot')[next]?.focus();\n }\n\n /** @internal */\n protected readonly placeholder =\n \"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='800'%20height='450'%3E%3Crect%20width='800'%20height='450'%20fill='%23E8EDED'/%3E%3Ctext%20x='400'%20y='225'%20font-family='sans-serif'%20font-size='24'%20fill='%236E8585'%20text-anchor='middle'%20dominant-baseline='middle'%3EBild%3C/text%3E%3C/svg%3E\";\n}\n","import {\n afterNextRender,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroComputerDesktop, heroMoon, heroSun } from '../icons/cds-icons';\nimport { CDS_THEME_ICON, CDS_THEME_LABEL, cdsThemeModes, ThemeModeService } from './theme-mode';\n\n/**\n * Theme-Segment — Segment-Switch für das Farbthema. Vorgesehener Einsatz: als\n * eigenständiges Element zum Hovern. Ist daher IMMER responsiv (unter 640px\n * Icon-only) und IMMER animiert (Aktiv-Markierung gleitet als Thumb) — beides\n * fest, nicht konfigurierbar. Icon + Textlabel stehen immer nebeneinander.\n *\n * Einzige Konfiguration: `showSystem` (tri Hell/Dunkel/System vs. binär Hell/Dunkel).\n *\n * Baut auf den CSS-Kern-Klassen `.theme-bar`/`.tbtn` auf. Jeder Button trägt ein\n * `aria-label`, ist also auch im Icon-only-Modus benannt. Der Thumb wird per\n * getBoundingClientRect an die aktive Zelle gesetzt (ResizeObserver misst bei\n * Breakpoint-/Font-Änderungen nach).\n *\n * Verwendungsguidance dieser Gruppe: siehe Cycle-Button (`komponenten-theme-umschalter-cycle-button--verwendung`).\n */\n@Component({\n selector: 'cds-theme-segment',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgIcon],\n viewProviders: [provideIcons({ heroSun, heroMoon, heroComputerDesktop })],\n template: `\n <div #bar class=\"theme-bar is-responsive is-animated\" role=\"group\" aria-label=\"Farbthema\">\n <span #thumb class=\"cds-thumb\" aria-hidden=\"true\"></span>\n @for (m of order(); track m) {\n <button\n #opt\n class=\"tbtn\"\n type=\"button\"\n [class.active]=\"svc.mode() === m\"\n [attr.aria-pressed]=\"svc.mode() === m\"\n [attr.aria-label]=\"label[m]\"\n (click)=\"svc.set(m)\"\n >\n <ng-icon [name]=\"icon[m]\" size=\"14px\" aria-hidden=\"true\" />\n <span class=\"tbtn__label\">{{ label[m] }}</span>\n </button>\n }\n </div>\n `,\n styles: `\n .theme-bar {\n position: static;\n display: inline-flex;\n }\n .tbtn {\n display: inline-flex;\n align-items: center;\n gap: var(--s1);\n }\n /* Responsive: unter 640px Label ausblenden → Icon-only. Das aria-label bleibt. */\n @media (max-width: 640px) {\n .theme-bar.is-responsive .tbtn__label {\n display: none;\n }\n }\n /* Animiert: ein Thumb gleitet hinter den Buttons. */\n .theme-bar.is-animated {\n position: relative;\n inset: auto;\n }\n .theme-bar.is-animated .cds-thumb {\n position: absolute;\n top: 0;\n left: 0;\n border-radius: var(--r-full);\n /* wie .tbtn.active im Kern (--co-700): weißer Text darauf erfüllt WCAG AA;\n --co-500 wäre zu hell (nur ~2,3:1). */\n background: var(--co-700);\n transition:\n transform var(--m-fast),\n width var(--m-fast),\n height var(--m-fast);\n pointer-events: none;\n z-index: 0;\n }\n .theme-bar.is-animated .tbtn {\n position: relative;\n z-index: 1;\n }\n .theme-bar.is-animated .tbtn.active {\n background: transparent;\n }\n `,\n})\nexport class ThemeSegmentComponent {\n /** true → Hell/Dunkel/System (tri), false → nur Hell/Dunkel (binär). */\n readonly showSystem = input(true);\n\n /** @internal */\n protected readonly svc = inject(ThemeModeService);\n /** @internal */\n protected readonly icon = CDS_THEME_ICON;\n /** @internal */\n protected readonly label = CDS_THEME_LABEL;\n\n /** @internal */\n protected readonly order = computed(() => cdsThemeModes(this.showSystem()));\n\n private readonly bar = viewChild<ElementRef<HTMLElement>>('bar');\n private readonly thumb = viewChild<ElementRef<HTMLElement>>('thumb');\n private readonly opts = viewChildren<ElementRef<HTMLButtonElement>>('opt');\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n // Thumb nach jedem Render neu setzen (Modus/Optionen als Abhängigkeiten lesen).\n // In Phasen aufgeteilt (WP5 §5.4): erst LESEN (earlyRead), dann SCHREIBEN (write) —\n // das vermeidet Layout-Thrashing (Read/Write im selben Durchlauf), das\n // afterRenderEffect mit seinen Phasen genau dafür anbietet.\n afterRenderEffect({\n earlyRead: () => {\n this.svc.mode();\n this.order();\n return this.measureThumb();\n },\n write: (rect) => this.applyThumb(rect()),\n });\n\n // Layout-Änderungen ohne Signal (Breakpoint, Font-Load) → Thumb nachmessen. Der\n // ResizeObserver-Callback läuft außerhalb von Angulars Render-Zyklus — dafür gibt\n // es keine Phasen-API; Messen+Schreiben bleibt hier in einem Zug (unvermeidlich,\n // da kein afterRenderEffect-Durchlauf beteiligt ist).\n afterNextRender(() => {\n const bar = this.bar()?.nativeElement;\n if (!bar) return;\n const ro = new ResizeObserver(() => this.applyThumb(this.measureThumb()));\n ro.observe(bar);\n this.destroyRef.onDestroy(() => ro.disconnect());\n });\n }\n\n /** Thumb-Geometrie relativ zur Leiste messen (reines Lesen, keine Schreibzugriffe). */\n private measureThumb(): { width: number; height: number; x: number; y: number } | null {\n const thumb = this.thumb()?.nativeElement;\n const bar = this.bar()?.nativeElement;\n const el = this.opts()[this.order().indexOf(this.svc.mode())]?.nativeElement;\n if (!thumb || !bar || !el) return null;\n\n const barRect = bar.getBoundingClientRect();\n const r = el.getBoundingClientRect();\n const cs = getComputedStyle(bar);\n const bx = parseFloat(cs.borderLeftWidth) || 0;\n const by = parseFloat(cs.borderTopWidth) || 0;\n\n return {\n width: r.width,\n height: r.height,\n x: r.left - barRect.left - bx,\n y: r.top - barRect.top - by,\n };\n }\n\n /** Gemessene Geometrie auf den Thumb schreiben (reines Schreiben, kein Lesen). */\n private applyThumb(rect: { width: number; height: number; x: number; y: number } | null): void {\n const thumb = this.thumb()?.nativeElement;\n if (!thumb || !rect) return;\n thumb.style.width = `${rect.width}px`;\n thumb.style.height = `${rect.height}px`;\n thumb.style.transform = `translate(${rect.x}px, ${rect.y}px)`;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { type CdsSelectOption, SelectComponent } from '../select/select.component';\nimport { CDS_THEME_LABEL, cdsThemeModes, type CdsThemeMode, ThemeModeService } from './theme-mode';\n\n/**\n * Theme-Dropdown — Theme-Umschalter auf Basis unseres Custom Select (cds-select):\n * gestylte Einzelauswahl mit Listbox-Popup und Häkchen. Vorgesehener Einsatz: nur in\n * den Einstellungen (Settings), NICHT als persistentes Element auf allen Seiten.\n *\n * `showSystem` schaltet zwischen Hell/Dunkel/System und binär Hell/Dunkel.\n *\n * Verwendungsguidance dieser Gruppe: siehe Cycle-Button (`komponenten-theme-umschalter-cycle-button--verwendung`).\n */\n@Component({\n selector: 'cds-theme-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SelectComponent],\n template: `\n <cds-select\n label=\"Farbthema\"\n [options]=\"options()\"\n [value]=\"svc.mode()\"\n (valueChange)=\"onChange($event)\"\n />\n `,\n})\nexport class ThemeSelectComponent {\n /** true → Hell/Dunkel/System, false → nur Hell/Dunkel. */\n readonly showSystem = input(true);\n\n /** @internal */\n protected readonly svc = inject(ThemeModeService);\n /** @internal */\n protected readonly options = computed<CdsSelectOption[]>(() =>\n cdsThemeModes(this.showSystem()).map((m) => ({ value: m, label: CDS_THEME_LABEL[m] })),\n );\n\n /** @internal */\n protected onChange(value: string | undefined): void {\n if (value) this.svc.set(value as CdsThemeMode);\n }\n}\n","// Bereichs-Glyphen + Zitat-Icon — VERBATIM übernommen aus icons/icons.js (Quelle der\n// Wahrheit, generiert aus icons/source/*.svg). Wird NICHT manuell editiert: bei Icon-Änderungen\n// neu aus icons/icons.js übernehmen. So konsumieren die Angular-Komponenten dieselben Glyphen\n// wie docs/index.html, statt eigene zu erfinden.\nimport type { CdsArea } from './area';\n\nexport interface CdsIcon {\n viewBox: string;\n /** Innerer SVG-Markup (Pfade), fill=currentColor → nimmt die Bereichsfarbe an. */\n body: string;\n}\n\n/** Bereichs-Glyphe je Markenbereich (co/ki/es/wo). */\nexport const CDS_AREA_ICONS: Record<CdsArea, CdsIcon> = {\n // co-building — Corporate / Unternehmen – Bereichs-Glyphe (Gebäude)\n co: {\n viewBox: '0 0 24 24',\n body: '<path d=\"M18.1513 4.54221C18.4965 4.54624 18.773 4.82931 18.769 5.17446C18.765 5.51348 18.4921 5.78462 18.1553 5.79038L17.9998 19.1L18.5877 19.1069C18.9328 19.1109 19.2094 19.394 19.2053 19.7391C19.2012 20.0842 18.9182 20.3608 18.5731 20.3568L5.22927 20.201C4.8842 20.1969 4.60772 19.9137 4.61162 19.5687C4.61565 19.2235 4.89872 18.947 5.24387 18.951L5.83172 18.9579L5.98717 5.64827C5.65081 5.63442 5.38409 5.35706 5.38805 5.01818C5.39208 4.67308 5.67522 4.39657 6.0203 4.40052L18.1513 4.54221ZM13.7415 16.9457C13.7433 16.7887 13.6176 16.6592 13.4607 16.6572L10.4277 16.6218C10.2706 16.6199 10.141 16.7465 10.1392 16.9036L10.1146 19.0079L13.7169 19.05L13.7415 16.9457ZM10.7804 12.3424C11.1256 12.3464 11.4021 12.6295 11.3981 12.9747C11.394 13.3198 11.111 13.5963 10.7658 13.5923L9.55301 13.5781C9.2079 13.5741 8.93132 13.291 8.93535 12.9459C8.9394 12.6008 9.2225 12.3242 9.56761 12.3282L10.7804 12.3424ZM14.4198 12.3849C14.765 12.3889 15.0415 12.672 15.0375 13.0172C15.0334 13.3623 14.7504 13.6388 14.4052 13.6348L13.1924 13.6207C12.8473 13.6166 12.5707 13.3335 12.5748 12.9884C12.5788 12.6433 12.8619 12.3667 13.207 12.3707L14.4198 12.3849ZM10.8088 9.9158C11.1538 9.91983 11.4302 10.2031 11.4264 10.5481C11.4224 10.8932 11.1393 11.1698 10.7942 11.1657L9.58135 11.1516C9.23624 11.1475 8.95966 10.8644 8.96369 10.5193C8.96793 10.1744 9.25097 9.89766 9.59595 9.90164L10.8088 9.9158ZM14.4482 9.95831C14.7932 9.96234 15.0696 10.2456 15.0658 10.5906C15.0618 10.9357 14.7787 11.2123 14.4336 11.2082L13.2207 11.1941C12.8756 11.19 12.5991 10.9069 12.6031 10.5618C12.6073 10.2168 12.8903 9.94013 13.2353 9.94415L14.4482 9.95831ZM10.8371 7.49019C11.1822 7.49422 11.4588 7.77729 11.4547 8.12245C11.4506 8.4675 11.1676 8.74413 10.8225 8.7401L9.60968 8.72594C9.26464 8.72186 8.98811 8.43871 8.99202 8.09368C8.99605 7.74856 9.27916 7.47204 9.62428 7.47602L10.8371 7.49019ZM14.4765 7.53269C14.8216 7.53673 15.0982 7.8198 15.0941 8.16495C15.09 8.51001 14.807 8.78664 14.4619 8.78261L13.2491 8.76844C12.904 8.7644 12.6275 8.48124 12.6314 8.13619C12.6355 7.79104 12.9185 7.51451 13.2637 7.51853L14.4765 7.53269ZM14.9668 19.0646L16.7499 19.0854L16.9054 5.77774L7.23706 5.66482L7.08164 18.9725L8.86472 18.9933L8.8893 16.889C8.89919 16.0416 9.59489 15.362 10.4423 15.3719L13.4753 15.4073C14.3225 15.4174 15.0013 16.113 14.9914 16.9603L14.9668 19.0646Z\" fill=\"currentColor\"/>',\n },\n // ki-bot — Angewandte KI – Bereichs-Glyphe (Tablet/Bot)\n ki: {\n viewBox: '0 0 24 24',\n body: '<path d=\"M18.1682 10.4063C18.1682 9.64701 17.5524 9.03148 16.7932 9.03126H7.20728C6.44789 9.03126 5.83228 9.64687 5.83228 10.4063V18.25C5.83228 19.0094 6.44788 19.625 7.20728 19.625H16.7932C17.5524 19.6248 18.1682 19.0093 18.1682 18.25V10.4063ZM19.4182 18.25C19.4182 19.6996 18.2428 20.8748 16.7932 20.875H7.20728C5.75753 20.875 4.58228 19.6998 4.58228 18.25V10.4063C4.58228 8.95651 5.75753 7.78126 7.20728 7.78126H16.7932C18.2428 7.78148 19.4182 8.95665 19.4182 10.4063V18.25Z\" fill=\"currentColor\"/><path d=\"M12.4325 5.0625C12.4325 4.6828 12.1247 4.375 11.745 4.375C11.3653 4.375 11.0575 4.6828 11.0575 5.0625C11.0575 5.4422 11.3653 5.75 11.745 5.75C12.1247 5.75 12.4325 5.4422 12.4325 5.0625ZM13.6825 5.0625C13.6825 6.13255 12.815 7 11.745 7C10.6749 7 9.80746 6.13255 9.80746 5.0625C9.80746 3.99245 10.6749 3.125 11.745 3.125C12.815 3.125 13.6825 3.99245 13.6825 5.0625Z\" fill=\"currentColor\"/><path d=\"M9.31253 12.8539C9.31253 12.4742 9.00473 12.1664 8.62503 12.1664C8.24533 12.1664 7.93753 12.4742 7.93753 12.8539C7.93753 13.2336 8.24533 13.5414 8.62503 13.5414C9.00473 13.5414 9.31253 13.2336 9.31253 12.8539ZM10.5625 12.8539C10.5625 13.9239 9.69508 14.7914 8.62503 14.7914C7.55498 14.7914 6.68753 13.9239 6.68753 12.8539C6.68753 11.7838 7.55498 10.9164 8.62503 10.9164C9.69508 10.9164 10.5625 11.7838 10.5625 12.8539Z\" fill=\"currentColor\"/><path d=\"M16.0625 12.8539C16.0625 12.4742 15.7547 12.1664 15.375 12.1664C14.9953 12.1664 14.6875 12.4742 14.6875 12.8539C14.6875 13.2336 14.9953 13.5414 15.375 13.5414C15.7547 13.5414 16.0625 13.2336 16.0625 12.8539ZM17.3125 12.8539C17.3125 13.9239 16.4451 14.7914 15.375 14.7914C14.305 14.7914 13.4375 13.9239 13.4375 12.8539C13.4375 11.7838 14.305 10.9164 15.375 10.9164C16.4451 10.9164 17.3125 11.7838 17.3125 12.8539Z\" fill=\"currentColor\"/><path d=\"M8.25003 16.125C8.25003 16.5392 7.91424 16.875 7.50003 16.875C7.08582 16.875 6.75003 16.5392 6.75003 16.125C6.75003 15.7108 7.08582 15.375 7.50003 15.375C7.91424 15.375 8.25003 15.7108 8.25003 16.125Z\" fill=\"currentColor\"/><path d=\"M10.3125 17.4C10.3125 17.8142 9.97674 18.15 9.56253 18.15C9.14832 18.15 8.81253 17.8142 8.81253 17.4C8.81253 16.9858 9.14832 16.65 9.56253 16.65C9.97674 16.65 10.3125 16.9858 10.3125 17.4Z\" fill=\"currentColor\"/><path d=\"M15.1875 17.4C15.1875 17.8142 14.8517 18.15 14.4375 18.15C14.0233 18.15 13.6875 17.8142 13.6875 17.4C13.6875 16.9858 14.0233 16.65 14.4375 16.65C14.8517 16.65 15.1875 16.9858 15.1875 17.4Z\" fill=\"currentColor\"/><path d=\"M12.75 17.55C12.75 17.9642 12.4142 18.3 12 18.3C11.5858 18.3 11.25 17.9642 11.25 17.55C11.25 17.1358 11.5858 16.8 12 16.8C12.4142 16.8 12.75 17.1358 12.75 17.55Z\" fill=\"currentColor\"/><path d=\"M17.25 16.125C17.25 16.5392 16.9142 16.875 16.5 16.875C16.0858 16.875 15.75 16.5392 15.75 16.125C15.75 15.7108 16.0858 15.375 16.5 15.375C16.9142 15.375 17.25 15.7108 17.25 16.125Z\" fill=\"currentColor\"/><path d=\"M11.2108 8.30187V6.59484C11.2108 6.24966 11.4906 5.96984 11.8358 5.96984C12.181 5.96984 12.4608 6.24966 12.4608 6.59484V8.30187C12.4607 8.64699 12.1809 8.92687 11.8358 8.92687C11.4907 8.92687 11.2109 8.64699 11.2108 8.30187Z\" fill=\"currentColor\"/>',\n },\n // es-window-check — Effektive Software – Bereichs-Glyphe (Fenster + Check)\n es: {\n viewBox: '0 0 24 24',\n body: '<path d=\"M4.50018 9.27394C4.15501 9.27394 3.87518 8.99412 3.87518 8.64894C3.87518 8.30376 4.15501 8.02394 4.50018 8.02394H19.1808C19.526 8.02394 19.8058 8.30376 19.8058 8.64894C19.8058 8.99412 19.526 9.27394 19.1808 9.27394H4.50018Z\" fill=\"currentColor\"/><path d=\"M18.875 6.5C18.875 5.74061 18.2594 5.125 17.5 5.125H6.5C5.74061 5.125 5.125 5.74061 5.125 6.5V17.5C5.125 18.2594 5.74061 18.875 6.5 18.875H17.5C18.2594 18.875 18.875 18.2594 18.875 17.5V6.5ZM20.125 17.5C20.125 18.9497 18.9497 20.125 17.5 20.125H6.5C5.05025 20.125 3.875 18.9497 3.875 17.5V6.5C3.875 5.05025 5.05025 3.875 6.5 3.875H17.5C18.9497 3.875 20.125 5.05025 20.125 6.5V17.5Z\" fill=\"currentColor\"/><path d=\"M7.5 6.59999C7.5 7.0142 7.16421 7.34999 6.75 7.34999C6.33579 7.34999 6 7.0142 6 6.59999C6 6.18578 6.33579 5.84999 6.75 5.84999C7.16421 5.84999 7.5 6.18578 7.5 6.59999Z\" fill=\"currentColor\"/><path d=\"M9.89996 6.59999C9.89996 7.0142 9.56418 7.34999 9.14996 7.34999C8.73575 7.34999 8.39996 7.0142 8.39996 6.59999C8.39996 6.18578 8.73575 5.84999 9.14996 5.84999C9.56418 5.84999 9.89996 6.18578 9.89996 6.59999Z\" fill=\"currentColor\"/><path d=\"M12.2999 6.59999C12.2999 7.0142 11.9641 7.34999 11.5499 7.34999C11.1357 7.34999 10.7999 7.0142 10.7999 6.59999C10.7999 6.18578 11.1357 5.84999 11.5499 5.84999C11.9641 5.84999 12.2999 6.18578 12.2999 6.59999Z\" fill=\"currentColor\"/><path d=\"M15.4175 10.892C15.6768 10.6644 16.0716 10.6904 16.2993 10.9496C16.5269 11.2089 16.5019 11.6037 16.2427 11.8314L11.5044 15.9945C10.9598 16.4731 10.1372 16.4466 9.62454 15.934L7.40872 13.7182C7.16508 13.4741 7.16486 13.0783 7.40872 12.8344C7.6528 12.5903 8.04941 12.5903 8.29349 12.8344L10.5083 15.0502C10.5548 15.0967 10.6297 15.0993 10.6792 15.0561L15.4175 10.892Z\" fill=\"currentColor\"/>',\n },\n // wo-network — Wirksame Organisationen – Bereichs-Glyphe (Netzwerk)\n wo: {\n viewBox: '0 0 24 24',\n body: '<path d=\"M13.4753 7.64954C13.4751 6.83509 12.8143 6.17493 11.9998 6.17493C11.1855 6.17515 10.5254 6.83523 10.5251 7.64954C10.5251 8.46403 11.1853 9.1249 11.9998 9.12512C12.8144 9.12512 13.4753 8.46417 13.4753 7.64954ZM14.7253 7.64954C14.7253 9.15452 13.5047 10.3751 11.9998 10.3751C10.495 10.3749 9.27515 9.15439 9.27515 7.64954C9.27537 6.14488 10.4951 4.92515 11.9998 4.92493C13.5046 4.92493 14.7251 6.14474 14.7253 7.64954Z\" fill=\"currentColor\"/><path d=\"M8.0752 16.3497C8.07497 15.5352 7.4141 14.875 6.59961 14.875C5.7853 14.8753 5.12522 15.5354 5.125 16.3497C5.125 17.1641 5.78517 17.825 6.59961 17.8252C7.41424 17.8252 8.0752 17.1643 8.0752 16.3497ZM9.3252 16.3497C9.3252 17.8546 8.1046 19.0752 6.59961 19.0752C5.09481 19.075 3.875 17.8545 3.875 16.3497C3.87522 14.845 5.09495 13.6253 6.59961 13.625C8.10446 13.625 9.32497 14.8449 9.3252 16.3497Z\" fill=\"currentColor\"/><path d=\"M18.8753 16.3497C18.8751 15.5352 18.2142 14.875 17.3997 14.875C16.5854 14.8753 15.9253 15.5354 15.9251 16.3497C15.9251 17.1641 16.5853 17.825 17.3997 17.8252C18.2144 17.8252 18.8753 17.1643 18.8753 16.3497ZM20.1253 16.3497C20.1253 17.8546 18.9047 19.0752 17.3997 19.0752C15.8949 19.075 14.6751 17.8545 14.6751 16.3497C14.6753 14.845 15.8951 13.6253 17.3997 13.625C18.9046 13.625 20.1251 14.8449 20.1253 16.3497Z\" fill=\"currentColor\"/><path d=\"M12.0005 9.75L12.4419 10.1924L7.79251 14.8418L7.35013 14.4004L6.90775 13.958L11.5581 9.30762L12.0005 9.75Z\" fill=\"currentColor\"/><path d=\"M12.0005 9.75L11.5583 10.1924L16.2078 14.8418L16.6501 14.4004L17.0925 13.958L12.4421 9.30762L12.0005 9.75Z\" fill=\"currentColor\"/><path d=\"M8.85065 16.9751V15.7251L15.4503 15.7251V16.9751L8.85065 16.9751Z\" fill=\"currentColor\"/>',\n },\n};\n\n// ui-quote — Zitatzeichen (Team-Stimme): Zitat-Glyphe für Testimonials (Bereich tönt nur den Akzent).\nexport const CDS_QUOTE_ICON: CdsIcon = {\n viewBox: '0 0 24 24',\n body: '<path d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\"/>',\n};\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport type { CdsArea } from '../area';\nimport { CDS_AREA_ICONS } from '../icons';\n\n/**\n * Card — Wrapper um `.card` aus css/components.css → „Cards“.\n *\n * Die Karte rendert `<article class=\"card\">` und ruht damit flach mit Rahmen. Das folgt der\n * Konvention „Elevation = Interaktivität“: Schatten trägt eine Karte nur, wenn die Karte selbst\n * der klickbare Bereich ist. Hier liegt die Interaktion in der Footer-Aktion, nicht in der Fläche.\n * `.card-elevated` wirkt im CSS ausschließlich auf `a.card-elevated`; eine Link-Karten-Variante\n * (`<a>` mit Ziel statt `<article>` mit Button) ist deshalb eine eigene Komponente/Variante.\n *\n * Bildet die im CSS vorgesehene Struktur ab: .card-media (bereichsgefärbt via\n * [data-area]) mit der echten Bereichs-Glyphe, .card-body mit .card-eyebrow /\n * .card-title / .card-text und ein optionales .card-footer mit einer Text-Aktion.\n *\n * Alle Textteile sind optional (leer = ausgeblendet); zusätzlich nimmt `.card-body`\n * beliebigen projizierten Inhalt via `<ng-content>` auf — so eignet sich die Karte\n * auch für freie Listen-/Detail-Inhalte in SPAs, nicht nur die Marketing-Struktur.\n * Die Footer-Aktion meldet Klicks über `actionClick`.\n */\n@Component({\n selector: 'cds-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <article class=\"card\" [attr.data-area]=\"area() || null\">\n @if (showMedia()) {\n <div class=\"card-media\" [innerHTML]=\"mediaSvg()\"></div>\n }\n <div class=\"card-body\">\n @if (eyebrow()) {\n <p class=\"card-eyebrow\">{{ eyebrow() }}</p>\n }\n @if (title()) {\n <h3 class=\"card-title\">\n <span>{{ title() }}</span>\n </h3>\n }\n @if (text()) {\n <p class=\"card-text\">{{ text() }}</p>\n }\n <ng-content></ng-content>\n </div>\n @if (actionLabel()) {\n <div class=\"card-footer\">\n <button [class]=\"actionClasses()\" type=\"button\" (click)=\"actionClick.emit()\">\n {{ actionLabel() }}\n </button>\n </div>\n }\n </article>\n `,\n})\nexport class CardComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Kicker-Text oberhalb des Titels (leer = keine Eyebrow-Zeile). */\n readonly eyebrow = input('');\n /** Kartentitel. */\n readonly title = input.required<string>();\n /** Anreißer-/Beschreibungstext der Karte. */\n readonly text = input.required<string>();\n /** Markenbereich → data-area (färbt Media-Glyphe + Eyebrow). */\n readonly area = input<CdsArea>();\n /** Bereichsgefärbte Medienfläche mit Bereichs-Glyphe anzeigen. */\n readonly showMedia = input(true);\n /** Kompakte Text-Aktion im Footer (leer = kein Footer). */\n readonly actionLabel = input('');\n\n /** Klick auf die Footer-Aktion. */\n readonly actionClick = output<void>();\n\n /** @internal */\n protected readonly actionClasses = computed(\n // .btn-sm wie in docs/index.html (Card-Footer nutzt kompakte Buttons).\n () => `btn btn-text btn-sm btn-${this.area() ?? 'co'}`,\n );\n\n /**\n * Echte Bereichs-Glyphe aus icons/icons.js, als ico-48-SVG in die Media-Fläche.\n *\n * @internal\n */\n protected readonly mediaSvg = computed<SafeHtml>(() => {\n const icon = CDS_AREA_ICONS[this.area() ?? 'co'];\n return this.sanitizer.bypassSecurityTrustHtml(\n `<svg class=\"ico-48\" viewBox=\"${icon.viewBox}\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">${icon.body}</svg>`,\n );\n });\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * StatCard — Wrapper um `.card-stat` aus css/components.css → „Stat Card“.\n *\n * Flache, statische Kennzahlen-Karte mit bereichsgefärbtem Top-Akzent (data-area),\n * großem Wert (.card-stat-value), Label (.card-stat-label) und optionalem\n * Trend-Pill (.card-stat-trend.up/.down) inkl. Richtungs-Pfeil — wie docs/index.html.\n *\n * Verwendungsguidance dieser Gruppe: siehe Card (`komponenten-cards-teaser-card--verwendung`).\n */\n@Component({\n selector: 'cds-stat-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"card-stat\" [attr.data-area]=\"area() || null\">\n <p class=\"card-stat-value\">{{ value() }}</p>\n <p class=\"card-stat-label\">{{ label() }}</p>\n @if (trend()) {\n <span\n class=\"card-stat-trend\"\n [class.up]=\"trend() === 'up'\"\n [class.down]=\"trend() === 'down'\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path [attr.d]=\"trend() === 'up' ? 'M7 14l5-5 5 5z' : 'M7 10l5 5 5-5z'\" />\n </svg>\n {{ trendText() }}\n </span>\n }\n </div>\n `,\n})\nexport class StatCardComponent {\n /** Anzeigewert der Kennzahl. */\n readonly value = input.required<string>();\n /** Beschriftung der Kennzahl. */\n readonly label = input.required<string>();\n /** Markenbereich → data-area (Top-Akzent + Wertfarbe). */\n readonly area = input<CdsArea>('co');\n /** Trendrichtung → .card-stat-trend.up / .down (leer = kein Pill). */\n readonly trend = input<'up' | 'down'>();\n /** Text neben dem Trend-Pfeil (nur sichtbar, wenn `trend` gesetzt ist). */\n readonly trendText = input('');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/** Eine Kennzahl im Stat-Strip. */\nexport interface CdsFlatStat {\n area?: CdsArea;\n value: string;\n label: string;\n}\n\n/**\n * StatStrip — Wrapper um `.card-stat-strip` + `.card-stat-flat` aus\n * css/components.css → „Stat-Strip“. Flacher Bandstreifen (auto-fit-Grid auf\n * --n-50-Grund) mit zentrierten Kennzahlen ohne Rahmen/Schatten; Wert je\n * Bereich getönt via [data-area]. Genau wie docs/index.html.\n *\n * Verwendungsguidance dieser Gruppe: siehe Card (`komponenten-cards-teaser-card--verwendung`).\n */\n@Component({\n selector: 'cds-stat-strip',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"card-stat-strip\" [style.border-radius]=\"rounded() ? 'var(--r-lg)' : null\">\n @for (stat of stats(); track stat) {\n <div class=\"card-stat-flat\" [attr.data-area]=\"stat.area || null\">\n <p class=\"card-stat-flat-value\">{{ stat.value }}</p>\n <p class=\"card-stat-flat-label\">{{ stat.label }}</p>\n </div>\n }\n </div>\n `,\n})\nexport class StatStripComponent {\n /** Kennzahlen des Streifens. */\n readonly stats = input.required<CdsFlatStat[]>();\n /** Abgerundete Ecken (--r-lg) wie in der Doku-Verwendung. */\n readonly rounded = input(true);\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport type { CdsArea } from '../area';\nimport { CDS_QUOTE_ICON } from '../icons';\n\n/**\n * Blockquote — Wrapper um `.bq` aus css/components.css → „Blockquote“.\n *\n * Bereichsgefärbtes Zitat mit linker Akzentleiste und getöntem Grund (data-area),\n * Quote-Icon (ui-quote, dieselbe Glyphe wie docs/index.html), Zitat und\n * Caption (Name/Rolle). Nur bestehende Klassen.\n *\n * **Nicht `cds-article-pullquote` (`.article-pullquote`).** Dieses Bauteil ist\n * ein eigenständiges Zitat: eine dritte, benannte Person (`name`/`roleLabel` sind\n * Pflicht), mit getönter Akzent-Box und Quote-Icon. `cds-article-pullquote` ist\n * dagegen ein typografischer Akzent im eigenen Lauftext eines Wissensbeitrags,\n * ohne Attribution, ohne Box, ohne Icon — der Autor zitiert dort einen Satz aus\n * dem eigenen Text, nicht eine dritte Stimme. Volle Abgrenzung samt Tabelle in\n * dessen Klassendoku (`article-pullquote.component.ts`).\n */\n@Component({\n selector: 'cds-blockquote',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <figure class=\"bq\" [attr.data-area]=\"area() || null\">\n <svg\n class=\"bq-icon\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n focusable=\"false\"\n [innerHTML]=\"quoteIcon()\"\n ></svg>\n <blockquote>{{ quote() }}</blockquote>\n @if (name() || roleLabel()) {\n <figcaption class=\"bq-caption\">\n @if (name()) {\n <span class=\"bq-name\">{{ name() }}</span>\n }\n @if (roleLabel()) {\n <span class=\"bq-role\">{{ roleLabel() }}</span>\n }\n </figcaption>\n }\n </figure>\n `,\n})\nexport class BlockquoteComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Zitattext. */\n readonly quote = input.required<string>();\n /** Name der zitierten Person. */\n readonly name = input.required<string>();\n /** Rolle/Funktion der zitierten Person (leer = keine Caption-Zeile dafür). */\n readonly roleLabel = input('');\n /** Markenbereich → data-area (Akzentleiste + getönter Grund). */\n readonly area = input<CdsArea>('co');\n\n /**\n * Zitat-Icon aus der zentralen Icon-Registry (icons.ts) statt dreifach\n * dupliziertem SVG-Pfad in Blockquote/Testimonial/TeamVoice.\n *\n * @internal\n */\n protected readonly quoteIcon = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(CDS_QUOTE_ICON.body),\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n signal,\n} from '@angular/core';\n\n/**\n * CodeBlock — Wrapper um `.cb-wrap` aus css/components.css → „Code-Block“.\n *\n * Header mit Sprach-Label (.cb-lang) und optionalem Kopier-Button (.cb-copy),\n * darunter der Code in `pre.cb-body` (white-space:pre, horizontal scrollbar).\n * Optionale Terminal-Variante (.cb-terminal). Syntax-Highlighting-Spans\n * (.k/.v/.s/…) werden hier bewusst nicht gesetzt — der Code bleibt Klartext.\n *\n * A11y (siehe docs/komponenten/code-block-verwendung.mdx, Abschnitt „Barrierefreiheit“):\n * - `<code>` im `<pre>` als semantisches Grundgerüst, damit Screenreader den Inhalt\n * als „Code“ ankündigen. `.cb-body code{font:inherit}` in components.css fängt den\n * Browser-Default (`code{font-family:monospace}`) ab, sonst würde das verschachtelte\n * `<code>` eine andere Schrift als der Rest des Blocks zeigen.\n * - `tabindex=\"0\"` auf `pre.cb-body`, weil der Block bei langen Zeilen horizontal\n * scrollt und sonst per Tastatur nicht erreichbar wäre.\n * - `aria-label=\"Code kopieren\"` auf dem Kopier-Button ist **stabil** und wechselt nach\n * dem Klick nicht mehr. Ein Bedienelement trägt den Namen seiner Funktion, nicht den\n * seines letzten Ereignisses — sonst findet man den Button per Sprachsteuerung danach\n * nicht mehr, und eine Elementliste zeigt einen Button „Code kopiert“, der tatsächlich\n * kopiert. Die Erfolgsmeldung läuft stattdessen über eine eigene, visuell versteckte\n * Live-Region (`.sr-only` + `role=\"status\"`, Muster aus `snackbar.component.ts`), die\n * von Anfang an im DOM steht und nur ihren Textinhalt wechselt: `aria-live` beobachtet\n * Inhalts-, keine Attribut-Änderungen, und eine Region, die erst beim Klick entsteht,\n * kündigt bei vielen Screenreadern nichts an. Zusätzlich verhalten sich Live-Regionen\n * auf dem gerade fokussierten Element (hier: der Button nach dem Klick) uneinheitlich.\n * Der sichtbare Button-Text wechselt weiterhin „Kopieren“ ↔ „Kopiert!“, ist aber durch\n * `aria-label` für die Namensberechnung überschrieben und rein optisches Feedback.\n */\n@Component({\n selector: 'cds-code-block',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div [class]=\"wrapClasses()\">\n <div class=\"cb-header\">\n <span class=\"cb-lang\">{{ lang() }}</span>\n @if (copyable()) {\n <button class=\"cb-copy\" type=\"button\" aria-label=\"Code kopieren\" (click)=\"copy()\">\n {{ copied() ? 'Kopiert!' : 'Kopieren' }}\n </button>\n <!-- Steht von Anfang an im DOM (nicht erst ab dem ersten Klick erzeugt), sonst\n kündigen viele Screenreader die erste Statusänderung gar nicht an. -->\n <span class=\"sr-only\" role=\"status\" aria-live=\"polite\">{{ copyStatus() }}</span>\n }\n </div>\n <pre class=\"cb-body\" tabindex=\"0\"><code>{{ code() }}</code></pre>\n </div>\n `,\n})\nexport class CodeBlockComponent {\n /** Sprach-Label im Header (.cb-lang), rein informativ, ohne Syntax-Highlighting. */\n readonly lang = input('HTML');\n /** Anzuzeigender Code (Klartext, `pre`-formatiert). */\n readonly code = input.required<string>();\n /** Terminal-Optik → .cb-terminal. */\n readonly terminal = input(false);\n /** Kopier-Button anzeigen (.cb-copy). */\n readonly copyable = input(true);\n\n /** @internal */\n protected readonly copied = signal(false);\n\n private readonly destroyRef = inject(DestroyRef);\n /** Reset-Timer des „Kopiert!“-Feedbacks; gemerkt, um ihn zu clearen. */\n private resetTimer?: ReturnType<typeof setTimeout>;\n\n constructor() {\n // Verhindert, dass der Reset-Callback nach dem Zerstören der Komponente feuert.\n this.destroyRef.onDestroy(() => this.clearResetTimer());\n }\n\n /** @internal */\n protected readonly wrapClasses = computed(() =>\n this.terminal() ? 'cb-wrap cb-terminal' : 'cb-wrap',\n );\n\n /**\n * Text der Live-Region (`role=\"status\"`) neben dem Button. Leer im Ruhezustand, damit\n * ein erneuter Klick nach Ablauf des Reset-Timers wieder von „“ auf „Code kopiert.“\n * wechselt und so erneut als Änderung erkannt und angekündigt wird.\n *\n * @internal\n */\n protected readonly copyStatus = computed(() => (this.copied() ? 'Code kopiert.' : ''));\n\n /** @internal */\n protected copy(): void {\n // Clipboard-API gibt es nur in sicheren Kontexten (https/localhost). Fehlt sie,\n // brechen wir sauber ab, statt über optional chaining still ins Leere zu laufen.\n if (!navigator.clipboard) return;\n navigator.clipboard\n .writeText(this.code())\n .then(() => {\n this.copied.set(true);\n // Vor dem erneuten Arm-en clearen → schnelle Wiederholklicks stapeln keine Timer.\n this.clearResetTimer();\n this.resetTimer = setTimeout(() => this.copied.set(false), 1500);\n })\n .catch(() => {\n /* Schreiben abgelehnt (z. B. fehlende Berechtigung) → kein Feedback. */\n });\n }\n\n private clearResetTimer(): void {\n if (this.resetTimer !== undefined) {\n clearTimeout(this.resetTimer);\n this.resetTimer = undefined;\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** Ein FAQ-Eintrag. */\nexport interface CdsFaqItem {\n /** Frage (Summary-Zeile). */\n q: string;\n /** Antworttext. */\n a: string;\n}\n\n/**\n * Faq — Wrapper um `.ep-faq` aus css/components.css → „FAQ-Accordion“.\n *\n * Nutzt natives `<details>/<summary>` (kein JS nötig): Auf-/Zuklappen, Tastatur\n * und Zugänglichkeit kommen vom Browser. Der Caret (.ep-faq-caret) dreht via\n * `details[open]`. Antwort in `.ep-faq-a`.\n */\n@Component({\n selector: 'cds-faq',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ep-faq\">\n @for (item of items(); track item) {\n <!-- Kein [open]-Binding: „standardmäßig zugeklappt“ ist der Default. Ein\n gebundenes [open]=\"false\" würde den nativen Toggle bei jedem Change-\n Detection-Lauf wieder zuklappen. -->\n <details>\n <summary>\n {{ item.q }}\n <svg\n class=\"ep-faq-caret\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n aria-hidden=\"true\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m19.5 8.25-7.5 7.5-7.5-7.5\" />\n </svg>\n </summary>\n <p class=\"ep-faq-a\">{{ item.a }}</p>\n </details>\n }\n </div>\n `,\n})\nexport class FaqComponent {\n /** Fragen-/Antworten-Liste des Akkordeons. */\n readonly items = input.required<CdsFaqItem[]>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n forwardRef,\n input,\n model,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { CdsArea } from '../area';\nimport { CvaBase } from '../shared/cva-base.directive';\n\n// Modulweiter Zähler → eindeutige Default-id (label/for, output/for, aria).\nlet uid = 0;\n\n/**\n * Skala (cds-scale) — Slider für GEORDNETE (ordinale) Kategorien, deren Labels die\n * Werte SIND (z. B. Niedrig < Mittel < Hoch, nie < selten < oft < immer).\n *\n * Basiert auf dem nativen <input type=\"range\">; min=0, max=labels.length-1, step=1\n * werden intern abgeleitet und NICHT exponiert. Der aktuelle Wert erscheint als\n * LABEL im <output> und wird Screenreadern über `aria-valuetext` als Text gemeldet\n * (nicht als Zahl) — das anerkannte APG-Muster für ordinale Slider. Die Skalenpunkte\n * zeigen alle Labels, exakt auf ihre Position ausgerichtet und bewusst OHNE\n * Reduktion (jedes Label ist eine wählbare Stufe).\n *\n * NUR für geordnete Kategorien. Ungeordnete/gleichrangige Optionen (ohne natürliche\n * Reihenfolge) gehören NICHT auf einen Slider → cds-radio-group oder cds-area-tabs.\n *\n * Als `ControlValueAccessor` direkt an Angular-Formulare anbindbar (`[(ngModel)]`,\n * `formControlName`); der Formularwert ist der Stufen-INDEX. Ohne Formular geht\n * `[(value)]` (valueChange via model()).\n *\n * Verwendungsguidance dieser Gruppe: siehe Textfeld (`komponenten-inputs-forms-textfeld--verwendung`).\n */\n@Component({\n selector: 'cds-scale',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ScaleComponent), multi: true },\n ],\n template: `\n <div class=\"field-slider\">\n <div class=\"field-slider-header\">\n <label class=\"field-slider-label\" [attr.for]=\"scaleId()\">{{ label() }}</label>\n <output [class]=\"outputClasses()\" [attr.for]=\"scaleId()\" [id]=\"scaleId() + '-out'\">{{\n currentLabel()\n }}</output>\n </div>\n <input\n [class]=\"sliderClasses()\"\n type=\"range\"\n [id]=\"scaleId()\"\n min=\"0\"\n [max]=\"max()\"\n step=\"1\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.aria-valuetext]=\"currentLabel()\"\n [attr.aria-describedby]=\"helper() ? scaleId() + '-hint' : null\"\n (input)=\"onInput($event)\"\n (blur)=\"markTouched()\"\n />\n @if (labels().length) {\n <!-- Alle Skalen-Labels als CSS-Grid-Spalten (Breiten: tickColumns()), bei\n ausreichend Platz exakt auf ihre Thumb-Position ausgerichtet (Thumb 22px,\n siehe css/components.css); bei schmalen Breiten gibt das Grid lieber den\n Umbruch frei, statt Labels zu überlagern oder abzuschneiden (siehe dort).\n KEINE Reduktion — jedes Label ist wählbar, PFLICHT-Inhalt (kein Dropping\n wie bei cds-slider). Statt Absolut-Positionierung Normalfluss: mehrzeilige\n Labels (lange Kategorien bei schmaler Breite) wachsen den Container in der\n Höhe und schieben nachfolgenden Inhalt nach unten, statt ihn zu\n überlagern. Self-contained positioniert (der --tick-p-Kernmechanismus liegt\n noch auf dem main-PR; nach Merge kann das vereinfacht werden). -->\n <div\n class=\"field-slider-ticks\"\n aria-hidden=\"true\"\n style=\"position:relative;display:grid;padding:0;height:auto;align-items:start\"\n [style.grid-template-columns]=\"tickColumns()\"\n >\n @for (t of tickItems(); track $index) {\n <span [style]=\"t.style\">{{ t.label }}</span>\n }\n </div>\n }\n @if (helper()) {\n <span class=\"helper\" [id]=\"scaleId() + '-hint'\">{{ helper() }}</span>\n }\n </div>\n `,\n})\nexport class ScaleComponent extends CvaBase<number> {\n /** Feld-Label (die Frage), z. B. „Zufriedenheit“. */\n readonly label = input('Bewertung');\n /** Geordnete Skalen-Labels; sie sind zugleich die Werte. */\n readonly labels = input<string[]>(['Niedrig', 'Mittel', 'Hoch']);\n /** Gewählte Stufe als Index (0-basiert). Two-Way (`[(value)]`) UND Angular-Forms. */\n readonly value = model(1);\n /** Markenbereich → Thumb-/Output-Farbe. */\n readonly area = input<CdsArea>('co');\n readonly helper = input('');\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n readonly disabled = model(false);\n readonly scaleId = input(`cds-scale-${++uid}`);\n\n constructor() {\n super();\n // Index in [0, max] halten: schrumpft labels() unter den aktuellen Index, bliebe\n // sonst ein veralteter Index stehen → leeres <output>/aria-valuetext. BEWUSST als\n // effect() belassen (WP5 §5.3 geprüft, nicht auf computed()/linkedSignal\n // umgestellt): `value` ist ein öffentliches, zweiseitig gebundenes model() — ein\n // Konsument kann es per `[(value)]` DIREKT setzen, am CVA-Pfad (writeValue/\n // normalizeValue) vorbei. computed()/linkedSignal erzeugen nur ein EIGENES,\n // abgeleitetes Signal; sie können nicht in ein FREMDES, bereits bestehendes\n // Writable-Signal zurückschreiben. Die Korrektur MUSS daher das model() selbst\n // mutieren, damit die Zwei-Wege-Bindung beim Konsumenten den korrigierten Wert\n // sieht (nicht nur die Anzeige) — das leistet nur effect().\n effect(() => {\n const max = this.max();\n const v = this.value();\n if (v > max) this.value.set(max);\n else if (v < 0) this.value.set(0);\n });\n }\n\n /** @internal */\n protected override normalizeValue(value: number): number {\n // Auf gültigen Stufen-Index [0, max] klemmen (max = labels().length - 1).\n const n = typeof value === 'number' && !Number.isNaN(value) ? Math.round(value) : 0;\n return Math.min(this.max(), Math.max(0, n));\n }\n /** @internal */\n protected override applyValue(value: number): void {\n this.value.set(value);\n }\n /** @internal */\n protected override applyDisabled(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n /**\n * Oberer Index (aus der Label-Zahl abgeleitet, nicht exponiert).\n *\n * @internal\n */\n protected readonly max = computed(() => Math.max(0, this.labels().length - 1));\n /** @internal */\n protected readonly currentLabel = computed(() => this.labels()[this.value()] ?? '');\n /** @internal */\n protected readonly sliderClasses = computed(() => `slider slider-${this.area()}`);\n /** @internal */\n protected readonly outputClasses = computed(() => `field-slider-output slider-${this.area()}`);\n\n /**\n * Spaltenbreiten für das Tick-Grid, mit `minmax()` statt fixer Breiten: Bei\n * ausreichend Platz treffen die Spaltenmitten exakt die Thumb-Positionen (wie\n * bisher); wird es zu schmal, um alle Labels einzeilig zu zeigen, gibt das Grid\n * Lesbarkeit den Vorrang vor exakter Ausrichtung (Entscheidung: Umbruch statt\n * Überlappung ODER Abschneiden).\n *\n * - Rand-Spalten: `minmax(halber Schritt + 11px, max-content)`. Der Mindestwert ist\n * wie zuvor die halbe „Schritt“-Distanz `(100% − 22px) / (n − 1)` zwischen zwei\n * benachbarten Thumb-Positionen plus 11px (halbe Thumb-Breite, siehe\n * css/components.css) — das kantenbündige Rand-Label beansprucht nur EINE\n * Richtung, die Gegenseite (vor der ersten/nach der letzten Thumb-Position) fließt\n * seiner Spalte zu. Bei breiten Containern übersteigt dieser Mindestwert die\n * natürliche (einzeilige) Breite des Labels — dann klemmt `minmax()` laut Spezifikation\n * auf den Mindestwert, die Spalte verhält sich also identisch zu vorher. Erst wenn\n * der Container schmaler wird als diese Mindestbreite, wächst die Spalte auf bis\n * zu `max-content`, das Label bleibt einzeilig, solange noch Platz da ist.\n * - Mitte-Spalten: `minmax(min-content, 1fr)` — nie schmäler als das breiteste\n * unteilbare Wort, sonst gleichberechtigt (1fr) um den verbleibenden Platz. Bei\n * schmalen Breiten kann die Spalte dadurch von ihrem rechnerischen Schritt\n * abweichen; die Spaltenmitte (und damit das zentrierte Label) liegt dann\n * geringfügig neben der Thumb-Position — akzeptierter Trade-off.\n *\n * Bei nur einem Label eine volle Spalte.\n *\n * @internal\n */\n protected readonly tickColumns = computed<string>(() => {\n const n = this.labels().length;\n if (n <= 1) return '1fr';\n const gaps = n - 1;\n const edge = `minmax(calc(11px + (100% - 22px) / ${gaps} / 2), max-content)`;\n if (n === 2) return `${edge} ${edge}`;\n const mid = `repeat(${n - 2}, minmax(min-content, 1fr))`;\n return `${edge} ${mid} ${edge}`;\n });\n\n /**\n * Alle Labels + Ausrichtung innerhalb ihrer Grid-Spalte (`tickColumns()`). Mitte-\n * Labels sind in ihrer Spalte zentriert — bei ausreichend Platz liegt die\n * Spaltenmitte exakt auf der Thumb-Position; bei sehr schmalen Breiten, wenn\n * `minmax(min-content, 1fr)` eine Spalte über ihren rechnerischen Schritt hinaus\n * wachsen lässt, kann die Mitte geringfügig davon abweichen (siehe\n * `tickColumns()`). Das ERSTE/LETZTE Label wird an der jeweiligen Kante verankert\n * (linksbündig bzw. rechtsbündig, 11px Innenabstand = halbe Thumb-Breite), damit\n * lange Kategorie-Labels an den Enden nicht über den Rand hinaus abgeschnitten\n * werden.\n *\n * Zusätzlich 4px `padding-inline` an der jeweils INNEREN Seite (Mitte-Labels:\n * beidseitig — bei zentriertem Text bleibt die Mitte dadurch unverschoben):\n * Mindestabstand zwischen benachbarten Labels. Ohne das können bei mittleren\n * Breiten (Spalte klemmt schon auf `minmax()`-Mindestwert, aber Label füllt sie\n * fast aus) die Text-Ink-Boxes zweier Nachbarn exakt aneinanderstoßen (0px Lücke,\n * liest sich als ein zusammengeschriebenes Wort), obwohl sie sich nicht\n * überlappen. `box-sizing:border-box` (s. u.) sorgt dafür, dass `min-content` in\n * `tickColumns()` das Padding mit einrechnet, statt die Spalte zusätzlich zu\n * stauchen.\n *\n * `hyphens:auto` trennt einzelne Wörter, die trotz der `max-content`/\n * `min-content`-Untergrenze in `tickColumns()` noch breiter als ihre Spalte sind —\n * wirkt nur, wenn die einbettende Seite `lang=\"de\"` setzt (Storybooks Vitest-Iframe\n * tut das nicht; bei Konsumenten ist es nicht garantiert, daher rein additiv).\n * Bewusst OHNE `overflow-wrap:break-word`: das bricht mitten im Wort ohne\n * Trennzeichen (z. B. „zufriede“/„n“) und ist schlechter lesbar als ein Wort, das\n * im Ausnahmefall über seine Spalte hinausragt — Lesbarkeit vor exakter\n * Breiteneinhaltung. Ohne `white-space:nowrap` umbrechen Labels normal (zeilenweise),\n * statt sich zu überlagern.\n *\n * @internal\n */\n protected readonly tickItems = computed<{ label: string; style: Record<string, string> }[]>(\n () => {\n const labels = this.labels();\n const n = labels.length;\n // position/transform/white-space aus .field-slider-ticks>* (components.css)\n // explizit neutralisieren — sonst bleiben die Labels absolut positioniert und\n // ignorieren die Grid-Spalten, auf denen dieser Ansatz aufbaut.\n const base: Record<string, string> = {\n position: 'static',\n transform: 'none',\n 'white-space': 'normal',\n 'box-sizing': 'border-box',\n hyphens: 'auto',\n };\n return labels.map((label, i) => {\n if (n <= 1)\n return { label, style: { ...base, 'text-align': 'left', 'padding-left': '11px' } };\n if (i === 0)\n // Innere Seite (rechts, Richtung nächstes Label) zusätzlich 4px — Mindestlücke,\n // s. Kommentar oben.\n return {\n label,\n style: {\n ...base,\n 'text-align': 'left',\n 'padding-left': '11px',\n 'padding-right': '4px',\n },\n };\n if (i === n - 1)\n return {\n label,\n style: {\n ...base,\n 'text-align': 'right',\n 'padding-left': '4px',\n 'padding-right': '11px',\n },\n };\n return { label, style: { ...base, 'text-align': 'center', 'padding-inline': '4px' } };\n });\n },\n );\n\n /** @internal */\n protected onInput(event: Event): void {\n const value = Number((event.target as HTMLInputElement).value);\n this.value.set(value);\n this.onChange(value);\n }\n /** @internal */\n protected markTouched(): void {\n this.onTouched();\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\n\nexport type CdsSnackTone = 'def' | 'ok' | 'err';\n\n/**\n * Snackbar — Wrapper um `.snack` aus css/components.css → „Snackbar“.\n *\n * Kurze Statusmeldung in drei Tönen (.snack-def / .snack-ok / .snack-err) mit\n * führendem, tonfarbenem Icon (wie die Doku) und optionaler Aktion (.snack-act).\n * Ton „err“ ist eine echte Fehlermeldung → role=\"alert\" + aria-live=\"assertive\";\n * def/ok bleiben role=\"status\" + aria-live=\"polite\" (wie im Doku-Markup).\n * Konsumiert nur bestehende Klassen.\n */\n@Component({\n selector: 'cds-snackbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n [class]=\"classes()\"\n [attr.role]=\"isError() ? 'alert' : 'status'\"\n [attr.aria-live]=\"isError() ? 'assertive' : 'polite'\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n [style.stroke]=\"iconStroke()\"\n stroke-width=\"1.25\"\n aria-hidden=\"true\"\n focusable=\"false\"\n style=\"flex-shrink: 0\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" [attr.d]=\"iconPath()\" />\n </svg>\n {{ message() }}\n @if (actionLabel()) {\n <button class=\"snack-act\" type=\"button\" (click)=\"action.emit()\">{{ actionLabel() }}</button>\n }\n </div>\n `,\n})\nexport class SnackbarComponent {\n /** Anzuzeigender Statustext. */\n readonly message = input.required<string>();\n /** Ton → .snack-def / .snack-ok / .snack-err */\n readonly tone = input<CdsSnackTone>('def');\n /** Optionaler Aktions-Button (.snack-act); leer = keiner. */\n readonly actionLabel = input('');\n /** Klick auf die optionale Aktion. */\n readonly action = output<void>();\n\n /** @internal */\n protected readonly classes = computed(() => `snack snack-${this.tone()}`);\n\n /** @internal */\n protected readonly isError = computed(() => this.tone() === 'err');\n\n /**\n * Tonfarbe des Icons (wie im Doku-Markup). CSS-Variablen statt Hex (Befund 04) — als\n * [style.stroke] gesetzt, nicht als Präsentationsattribut, weil Präsentationsattribute var()\n * nicht auflösen.\n *\n * @internal\n */\n protected readonly iconStroke = computed(\n () =>\n ({\n def: 'var(--co-200)',\n ok: 'var(--c-success-strong-icon)',\n err: 'var(--c-error-strong-icon)',\n })[this.tone()],\n );\n\n /**\n * Lucide-artiger Pfad je Ton (Glühbirne / Häkchen-Kreis / Ausrufezeichen-Kreis).\n *\n * @internal\n */\n protected readonly iconPath = computed(\n () =>\n ({\n def: 'M12 18v-5.25m0 0a6.01 6.01 0 0 0 1.5-.189m-1.5.189a6.01 6.01 0 0 1-1.5-.189m3.75 7.478a12.06 12.06 0 0 1-4.5 0m3.75 2.383a14.406 14.406 0 0 1-3 0M14.25 18v-.192c0-.983.658-1.823 1.508-2.316a7.5 7.5 0 1 0-7.517 0c.85.493 1.509 1.333 1.509 2.316V18',\n ok: 'M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z',\n err: 'M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z',\n })[this.tone()],\n );\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport type { CdsArea } from '../area';\nimport { CDS_QUOTE_ICON } from '../icons';\n\n/**\n * Testimonial — Wrapper um `.testimonial` aus css/components.css → „Testimonial Card“.\n *\n * Statische Zitat-Karte mit bereichsgefärbtem Top-Akzent (data-area), Quote-Icon\n * (.testimonial-icon, fill:currentColor), Zitat (blockquote) und Footer mit Name/Rolle.\n * Nur bestehende Klassen — kein eigenes CSS.\n *\n * Verwendungsguidance dieser Gruppe: siehe Blockquote (`komponenten-zitate-testimonials-blockquote--verwendung`).\n */\n@Component({\n selector: 'cds-testimonial',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <figure class=\"testimonial\" [attr.data-area]=\"area() || null\">\n <!-- ui-quote aus icons/icons.js — dieselbe Glyphe wie docs/index.html. -->\n <svg\n class=\"testimonial-icon\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n focusable=\"false\"\n [innerHTML]=\"quoteIcon()\"\n ></svg>\n <blockquote>{{ quote() }}</blockquote>\n <figcaption class=\"testimonial-footer\">\n <div>\n <p class=\"testimonial-name\">{{ name() }}</p>\n <p class=\"testimonial-role\">{{ roleLabel() }}</p>\n </div>\n </figcaption>\n </figure>\n `,\n})\nexport class TestimonialComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Zitattext. */\n readonly quote = input.required<string>();\n /** Name der zitierten Person. */\n readonly name = input.required<string>();\n /** Rolle/Funktion der zitierten Person (leer = keine Rollenzeile im Footer). */\n readonly roleLabel = input('');\n /** Markenbereich → data-area (Top-Akzent + Icon-Farbe). */\n readonly area = input<CdsArea>('co');\n\n /**\n * Zitat-Icon aus der zentralen Icon-Registry (icons.ts) statt dreifach\n * dupliziertem SVG-Pfad in Blockquote/Testimonial/TeamVoice.\n *\n * @internal\n */\n protected readonly quoteIcon = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(CDS_QUOTE_ICON.body),\n );\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport type { CdsArea } from '../area';\nimport { CDS_QUOTE_ICON } from '../icons';\n\n/**\n * TeamVoice — Wrapper um `.team-voice` aus css/components.css → „Team-Stimmen“.\n *\n * Editoriale Zitat-Reihe mit seitlichem Foto (im Grid abwechselnd links/rechts,\n * gesteuert per :nth-child innerhalb von `.team-voices`), bereichsgefärbtem\n * Akzent (data-area), Quote-Icon (ui-quote), Zitat und Name/Rolle. Mehrere\n * Komponenten in einen `<div class=\"team-voices\">` legen, damit das alternierende\n * Layout greift (siehe Story).\n *\n * Verwendungsguidance dieser Gruppe: siehe Blockquote (`komponenten-zitate-testimonials-blockquote--verwendung`).\n */\n@Component({\n selector: 'cds-team-voice',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <figure class=\"team-voice\" [attr.data-area]=\"area() || null\">\n <div class=\"team-voice-media\">\n <img [src]=\"image() || placeholder\" [alt]=\"imageAlt()\" loading=\"lazy\" />\n </div>\n <figcaption class=\"team-voice-body\">\n <!-- ui-quote aus icons/icons.js — dieselbe Glyphe wie docs/index.html. -->\n <svg\n class=\"team-voice-icon\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n focusable=\"false\"\n [innerHTML]=\"quoteIcon()\"\n ></svg>\n <blockquote class=\"team-voice-quote\">{{ quote() }}</blockquote>\n <div class=\"team-voice-footer\">\n <p class=\"team-voice-name\">{{ name() }}</p>\n <p class=\"team-voice-role\">{{ roleLabel() }}</p>\n </div>\n </figcaption>\n </figure>\n `,\n})\nexport class TeamVoiceComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Zitattext. */\n readonly quote = input.required<string>();\n /** Name der zitierten Person. */\n readonly name = input.required<string>();\n /** Rolle/Funktion der zitierten Person (leer = keine Rollenzeile). */\n readonly roleLabel = input('');\n /** Markenbereich → data-area (Akzentfarbe + Rahmen). */\n readonly area = input<CdsArea>('co');\n /** Bild-URL; leer = neutraler Platzhalter (Doku-Assets sind hier nicht eingebunden). */\n readonly image = input('');\n /** Alternativtext des Fotos. */\n readonly imageAlt = input('Teamfoto');\n\n /**\n * Zitat-Icon aus der zentralen Icon-Registry (icons.ts) statt dreifach\n * dupliziertem SVG-Pfad in Blockquote/Testimonial/TeamVoice.\n *\n * @internal\n */\n protected readonly quoteIcon = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(CDS_QUOTE_ICON.body),\n );\n\n /**\n * Neutraler Inline-SVG-Platzhalter, damit Stories ohne externe Assets rendern.\n *\n * @internal\n */\n protected readonly placeholder =\n \"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='600'%20height='450'%3E%3Crect%20width='600'%20height='450'%20fill='%23E8EDED'/%3E%3Ctext%20x='300'%20y='225'%20font-family='sans-serif'%20font-size='22'%20fill='%236E8585'%20text-anchor='middle'%20dominant-baseline='middle'%3ETeamfoto%3C/text%3E%3C/svg%3E\";\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * DownloadCta — Wrapper um `.cta-dl` aus css/components.css → „Download CTA“.\n *\n * Aufmerksamkeitsstarker Download-Block mit bereichsgefärbtem Top-Akzent + Icon\n * (data-area), Eyebrow/Titel/Beschreibung/Meta und zwei Aktionen (primär/sekundär,\n * über die bestehenden `.btn`-Klassen). Konsumiert nur vorhandene Styles.\n *\n * Verwendungsguidance dieser Gruppe: siehe CTA-Band (`komponenten-call-to-action-cta-band--verwendung`).\n */\n@Component({\n selector: 'cds-download-cta',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"cta-dl\" [attr.data-area]=\"area() || null\">\n <div class=\"cta-dl-icon\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\" />\n </svg>\n </div>\n <div class=\"cta-dl-body\">\n @if (eyebrow()) {\n <p class=\"cta-dl-eyebrow\">{{ eyebrow() }}</p>\n }\n <h3 class=\"cta-dl-title\">{{ title() }}</h3>\n <p class=\"cta-dl-desc\">{{ desc() }}</p>\n @if (meta()) {\n <div class=\"cta-dl-meta\">\n <span class=\"cta-strip-meta\">{{ meta() }}</span>\n </div>\n }\n </div>\n <div class=\"cta-dl-actions\">\n <!-- Klassen direkt komponiert statt cds-button: .cta-dl-actions steht auf\n flex-direction:column + align-items:stretch (css/components.css:1421) und\n streckt seine Kinder; ein cds-button-Custom-Element streckt sich darüber\n nicht mit. Die einzige Eingabe, die es zum Füllen der Spalte brächte, full,\n zentriert über .btn-full (css/components.css:53) zugleich das Label und\n würde den bisher linksbündigen Look ändern. -->\n <button\n [class]=\"'btn btn-filled btn-' + area()\"\n type=\"button\"\n [attr.aria-label]=\"primaryAriaLabel()\"\n (click)=\"primaryClick.emit($event)\"\n >\n {{ primaryLabel() }}\n </button>\n @if (secondaryLabel()) {\n <button\n [class]=\"'btn btn-text btn-' + area()\"\n type=\"button\"\n [attr.aria-label]=\"secondaryAriaLabel()\"\n (click)=\"secondaryClick.emit($event)\"\n >\n {{ secondaryLabel() }}\n </button>\n }\n </div>\n </div>\n `,\n})\nexport class DownloadCtaComponent {\n /** Markenbereich → data-area (Top-Akzent, Icon-Tönung, Button-Farbe). */\n readonly area = input<CdsArea>('co');\n /** Kicker-Text oberhalb des Titels (leer = keine Eyebrow-Zeile). */\n readonly eyebrow = input('');\n /** Titel des Download-Angebots. */\n readonly title = input.required<string>();\n /** Beschreibungstext unterhalb des Titels (leer = keine Beschreibung). */\n readonly desc = input('');\n /** Zusatzinfo unterhalb der Beschreibung, z. B. Dateiformat/-größe (leer = keine Meta-Zeile). */\n readonly meta = input('');\n /** Beschriftung der primären Aktion. */\n readonly primaryLabel = input.required<string>();\n /** Beschriftung der sekundären Aktion (leer = ausgeblendet). */\n readonly secondaryLabel = input('');\n\n /** Klick auf die primäre Aktion (Haupt-CTA). */\n readonly primaryClick = output<MouseEvent>();\n /** Klick auf die sekundäre Aktion (nur wenn `secondaryLabel` gesetzt ist). */\n readonly secondaryClick = output<MouseEvent>();\n\n /**\n * Accessible Name der primären Aktion (cta-verwendung.mdx „Barrierefreiheit“: Button-Label\n * muss Ressource und Format nennen). Der sichtbare Button-Text bleibt `primaryLabel`\n * (meist knapp, z. B. „Herunterladen“) — er selbst nennt kein Ziel, der Titel steht nur\n * visuell daneben (`<h3 class=\"cta-dl-title\">`) und erreicht den Accessible Name nicht.\n * Wer per Button-Liste navigiert, hört sonst nur die generische Aktion ohne Bezug.\n * Muster wie bei `PillComponent.computedAriaLabel`/Combobox-Remove-Buttons: „Aktion: Ziel“,\n * Format/Größe aus `meta` in Klammern angehängt, sofern gesetzt.\n *\n * @internal\n */\n protected readonly primaryAriaLabel = computed(\n () => `${this.primaryLabel()}: ${this.title()}${this.meta() ? ` (${this.meta()})` : ''}`,\n );\n\n /** Analog zu `primaryAriaLabel`, für die sekundäre Aktion.\n *\n * @internal\n */\n protected readonly secondaryAriaLabel = computed(\n () => `${this.secondaryLabel()}: ${this.title()}${this.meta() ? ` (${this.meta()})` : ''}`,\n );\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n// Modulweiter Zähler → eindeutige id für die gerenderte Überschrift (aria-labelledby),\n// analog zum Muster in area-tabs.component.ts / scale.component.ts.\nlet uid = 0;\n\n/**\n * Section (`[cdsSection]`) — Wrapper um `.ep-section` aus css/components.css\n * (css/components.css:1223–1253, mobiler Innenabstand: Zeile 1228) mit dem optionalen\n * Kopf-Trio `.ep-section-label` (Kicker) / `.ep-section-h2` (Überschrift) /\n * `.ep-section-sub` (Lead). Das strukturelle Grundgerüst, in dem auf den\n * Beispielseiten praktisch jeder andere Baustein sitzt (133 Vorkommen, 85 davon mit\n * Kopfzeile).\n *\n * Alle drei Textteile sind Beiwerk (`input('')`): eine Sektion besteht auch ganz ohne\n * Kopf, nur aus ihrem projizierten Inhalt (docs/index.html:9378). Der Inhalt selbst\n * kommt per `<ng-content>` und ist deshalb kein Input.\n *\n * **Entscheidung 1 — Attributselektor, der Konsument wählt `<section>` oder `<div>`.**\n * Erste Fassung war `cds-section` als eigenes Element, das intern selbst entschied:\n * `<section aria-labelledby=\"…\">`, wenn ein zugänglicher Name verfügbar war, sonst ein\n * namenloses `<div>`. Das setzte voraus, dass ein `background` auf einem\n * UMSCHLIESSENDEN Element sitzen musste (siehe Entscheidung 2) — gemessen im laufenden\n * Storybook (siehe `docs/adr/0008-selektortyp-der-wrapper-komponenten.md`, „Fall 2“):\n * `getComputedStyle(host).backgroundColor` und `host.getBoundingClientRect()`\n * meldeten beide „passt“, der Screenshot zeigte trotzdem keine gemalte Fläche — ein\n * unbekanntes Custom Element ohne eigene Inline-Inhalte, dessen einziges Kind als Block\n * herausgebrochen wird, hat keine eigene Box zum Malen.\n *\n * Die Komponente hängt sich deshalb als Attribut an ein vom Konsumenten geschriebenes\n * `<section>` oder `<div>`, analog zu `cds-icon-card`\n * (`icon-card/icon-card.component.ts`). Der Konsument entscheidet über das Tag, ob die\n * Sektion überhaupt eine `<section>`-Landmark werden KANN; die Komponente entscheidet\n * nur noch, ob sie `aria-labelledby` setzt (die eigene, gerenderte `.ep-section-h2` hat\n * Vorrang, sonst — wenn `heading` leer bleibt — die per `labelledBy` übergebene id einer\n * Überschrift außerhalb der Komponente). Schreibt der Konsument `<section cdsSection>`\n * ohne Namen, bleibt es bei einer `<section>` ohne `aria-labelledby`: HTML-AAM gibt ihr\n * dann keine Landmark-Rolle, aber das ist eine Entscheidung des Konsumenten, keine der\n * Komponente — sie erzwingt kein Tag mehr.\n *\n * **Entscheidung 2 — kein `background`-Input, die Fläche darf jetzt aber am Host\n * sitzen.** Das Mockup setzt Sektionsflächen inline (`style=\"background:var(--bg-surface)\"`\n * / `--co-50` / …). Das ist der Flächen-Rhythmus zwischen aufeinanderfolgenden\n * Sektionen einer SEITE (Begründung inkl. Messwerten in docs/index.html:1450, „Warum\n * nicht die Sektion senken?“) — eine Entscheidung, die nur die Seite treffen kann, weil\n * nur sie ihre Nachbar-Sektionen kennt. Ein Bauteil kennt seinen Kontext nicht\n * (CONTRIBUTING.md §7) und bekäme mit einem `background`-Input eine Zuständigkeit, die\n * ihm nicht zusteht. Der Konsument setzt die Fläche deshalb weiterhin selbst — jetzt\n * aber direkt auf dem Element, das `cdsSection` trägt (`<section cdsSection\n * style=\"background:…\">` bzw. `<div cdsSection style=\"…\">`), denn dieses Element IST\n * `.ep-section`, kein Host mehr davor. Das umschließende Element aus der ersten Fassung\n * ist damit nicht mehr nötig (siehe Story „Fläche am Host“).\n */\n@Component({\n selector: 'section[cdsSection], div[cdsSection]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ep-section',\n '[attr.aria-labelledby]': 'ariaLabelledBy()',\n },\n template: `\n @if (label()) {\n <div [class]=\"labelClasses()\">{{ label() }}</div>\n }\n @if (heading()) {\n <h2 class=\"ep-section-h2\" [id]=\"headingId\">{{ heading() }}</h2>\n }\n @if (sub()) {\n <p class=\"ep-section-sub\">{{ sub() }}</p>\n }\n <ng-content></ng-content>\n `,\n})\nexport class SectionComponent {\n /** Kicker-Text über der Überschrift (`.ep-section-label`, leer = keine Kopfzeile). */\n readonly label = input('');\n /** Sektions-Überschrift (`.ep-section-h2`, leer = keine Überschrift). */\n readonly heading = input('');\n /** Lead-Text unter der Überschrift (`.ep-section-sub`, leer = kein Lead). */\n readonly sub = input('');\n /** Markenbereich → `.t-{area}` auf dem Label (Mockup: `class=\"ep-section-label t-co\"`). */\n readonly area = input<CdsArea>();\n /**\n * Id einer Überschrift AUSSERHALB der Komponente, die als zugänglicher Name dient,\n * wenn `heading` leer bleibt (siehe Entscheidung 1 in der Klassendoku).\n */\n readonly labelledBy = input('');\n\n private readonly instance = ++uid;\n /** @internal */\n protected readonly headingId = `cds-section-${this.instance}-heading`;\n\n /**\n * Zugänglicher Name der Sektion: die eigene Überschrift hat Vorrang, sonst die von\n * außen übergebene id. `null`, wenn keins von beidem vorhanden ist — dann setzt die\n * Komponente kein `aria-labelledby`. Ob der Host dadurch eine Landmark wird, hängt\n * am Tag, das der Konsument gewählt hat (siehe Entscheidung 1 in der Klassendoku).\n *\n * @internal\n */\n protected readonly ariaLabelledBy = computed<string | null>(() =>\n this.heading() ? this.headingId : this.labelledBy() || null,\n );\n\n /** @internal */\n protected readonly labelClasses = computed(() => {\n const area = this.area();\n return area ? `ep-section-label t-${area}` : 'ep-section-label';\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * HeroImage (cds-hero-image) — Wrapper um `.hero-image` aus css/components.css\n * (css/components.css:851–878) mit optionaler Caption als Gradient-Overlay\n * (`-caption`, `-caption-eyebrow`, `-caption-title`, `-caption-text`). Vollbreites,\n * randloses `<figure>` im 21:9-Format, der Standard-Hero auf allen Customer-Pages\n * (17 Vorkommen in den Beispielseiten). Semantisch ein figure/figcaption-Pattern:\n * `alt` trägt die faktische Bildbeschreibung, die Caption die redaktionelle\n * Einordnung (Eyebrow, Titel, Text) — beide sollen sich nach `docs/index.html`\n * (Abschnitt „In-Article Figure“, dasselbe Prinzip) nicht inhaltlich decken.\n *\n * **Entscheidung 1 — kein `<figcaption>` ohne Textinhalt.** Bleiben `eyebrow`,\n * `heading` und `text` alle leer, entfällt das `<figcaption>`-Element vollständig\n * statt leer zu rendern (Variante „Hero ohne Caption“, siehe\n * `storybook-angular/src/docs/seitenmuster/wissensbeitrag.mdx` Abschnitt „Aufbau“,\n * Zeile 3: Beitrags-Heros zeigen das visuelle Versprechen ohne Marketing-Overlay).\n * Ein leeres `<figcaption>` wäre totes Markup ohne Zugänglichkeitsnutzen.\n *\n * **Entscheidung 2 — `headingLevel` statt fest verdrahtetem `<h1>`.** Das Mockup\n * (`docs/index.html:9412` u. a.) rendert `.hero-image-caption-title` durchgehend als\n * `<h1>`, weil der Hero dort das erste Überschriften-Element der Seite ist. Sitzt\n * der Hero dagegen unter einem eigenen `<h1>` — der Wissensbeitrag hat seinen\n * Titel bereits im Article-Header (`.article-title`, ebenfalls `<h1>`) —, entstünde\n * mit einem zweiten `<h1>` eine doppelte Top-Überschrift. `headingLevel` (Default\n * `1`) macht die Ebene explizit, `.hero-image-caption-title` ist reine CSS-Klasse\n * und trägt keine Heading-Semantik, das Styling bleibt in beiden Fällen identisch.\n *\n * **Entscheidung 3 — `objectPosition` als Style-Binding, die eine Ausnahme von\n * Spec-Randbedingung 6.** Der Bildausschnitt ist eine Eigenschaft des konkreten\n * Bildes (Motiv, Kopfposition), nicht der Seite — anders als z. B. eine\n * Sektionsfläche, die vom Seitenkontext abhängt. `docs/index.html` setzt ihn\n * deshalb an jedem Hero individuell direkt am `<img>` (z. B. `object-position:center\n * 70%`, Zeile 2640). Ohne diesen Input wäre die Komponente für Porträt-lastige\n * Motive unbrauchbar: `object-fit:cover` beschneidet das Bild sobald der\n * `max-height`-Cap greift (siehe `.hero-image-media`), und ohne Steuerung landet\n * der Ausschnitt zufällig in der Bildmitte. Als Style-Binding am `<img>`, nicht als\n * Klasse — es gibt in der CSS-Schicht keine Modifier-Klassen dafür, nur den\n * Inline-Weg, den das Mockup selbst nutzt.\n *\n * **Entscheidung 4 — `tabindex`/`id` sind nicht Teil der Komponente.** Das Mockup\n * setzt beides am `<figure>` (`id=\"ep-landing-main\" tabindex=\"-1\"`, z. B. Zeile\n * 9406) als Sprungziel des Skip-Links. Das Sprungziel ist eine Entscheidung der\n * Seite (welches Element „Hauptinhalt“ ist, hängt vom Seitenaufbau ab, nicht vom\n * Hero selbst), deshalb setzt der Konsument beides am `<cds-hero-image>`-Host.\n * Damit dieses Sprungziel eine eigene Box hat, ist der Host per\n * `:host{display:block}` selbst ein Block (Muster wie `cds-footer-main`): Als\n * unbekanntes Element wäre er `display:inline` mit herausgebrochenem Block-Kind\n * und hätte keine brauchbare Box für Fokus und Scroll-Position (ADR-0008, Fall 2).\n */\n@Component({\n selector: 'cds-hero-image',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [':host{display:block}'],\n template: `\n <figure class=\"hero-image\">\n <div class=\"hero-image-media\">\n <img\n [src]=\"src()\"\n [alt]=\"alt()\"\n [attr.loading]=\"eager() ? 'eager' : 'lazy'\"\n [style.object-position]=\"objectPosition() || null\"\n />\n </div>\n @if (hasCaption()) {\n <figcaption class=\"hero-image-caption\">\n @if (eyebrow()) {\n <p class=\"hero-image-caption-eyebrow\">{{ eyebrow() }}</p>\n }\n @if (heading()) {\n @if (headingLevel() === 2) {\n <h2 class=\"hero-image-caption-title\">{{ heading() }}</h2>\n } @else {\n <h1 class=\"hero-image-caption-title\">{{ heading() }}</h1>\n }\n }\n @if (text()) {\n <p class=\"hero-image-caption-text\">{{ text() }}</p>\n }\n </figcaption>\n }\n </figure>\n `,\n})\nexport class HeroImageComponent {\n /** Bildquelle. */\n readonly src = input.required<string>();\n /** Alternativtext — Pflicht, das Bild trägt Bedeutung (kein dekoratives Hero-Bild). */\n readonly alt = input.required<string>();\n /** Eyebrow-Zeile über dem Titel (`.hero-image-caption-eyebrow`, leer = keine Zeile). */\n readonly eyebrow = input('');\n /** Titel der Caption (`.hero-image-caption-title`, leer = kein Titel). */\n readonly heading = input('');\n /** Text unter dem Titel (`.hero-image-caption-text`, leer = kein Text). */\n readonly text = input('');\n /**\n * Heading-Ebene des gerenderten Titels: `1`, wenn der Hero die erste Überschrift\n * der Seite trägt (Standard auf Customer-Pages), `2`, wenn er unter einem\n * eigenen `<h1>` sitzt (Beitrags-Hero unter dem Article-Header, siehe\n * Entscheidung 2 in der Klassendoku).\n */\n readonly headingLevel = input<1 | 2>(1);\n /**\n * `loading`-Strategie des Bildes: `true` (Standard) rendert `loading=\"eager\"`,\n * weil der Hero auf Customer-Pages immer above the fold sitzt. `false` für einen\n * zweiten, weiter unten liegenden Hero (z. B. innerhalb einer Bildstrecke).\n */\n readonly eager = input(true);\n /**\n * `object-position` direkt am `<img>` (z. B. `'center 70%'`), siehe Entscheidung 3\n * in der Klassendoku. Leer = Browser-Default `center center`.\n */\n readonly objectPosition = input('');\n\n /**\n * Ob die Caption gerendert wird: nur, wenn mindestens einer der drei Textteile\n * gesetzt ist (siehe Entscheidung 1 in der Klassendoku).\n *\n * @internal\n */\n protected readonly hasCaption = computed(\n () => !!(this.eyebrow() || this.heading() || this.text()),\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n computed,\n input,\n viewChild,\n} from '@angular/core';\n\n/**\n * Stoerer (cds-stoerer) — eine Kachel für `<cds-stoerer-set>`, Wrapper um `.stoerer`\n * aus css/components.css (css/components.css:926–974): Typ-Glyph + Thema-Label\n * (`.stoerer-topic`), Titel über zwei Zeilen (`.stoerer-title`), Meta-Zeile\n * (`.stoerer-meta`). Die ganze Kachel ist ein `<a>` — Klick auf die Fläche navigiert,\n * kein Div mit Klick-Handler.\n *\n * **Nur innerhalb von `<cds-stoerer-set>` verwendbar.** Diese Komponente rendert ihr\n * Markup nicht in sich selbst, sondern in ein internes `<ng-template>` und stellt es\n * dem Set als `TemplateRef` bereit (Begründung: Entscheidung 1 in der Klassendoku von\n * `StoererSetComponent`, `stoerer-set.component.ts`) — dasselbe Muster wie\n * `AreaTabComponent` für `cds-area-tabs` (`area-tabs/area-tab.component.ts`). Ohne\n * umgebendes `<cds-stoerer-set>` bleibt eine Kachel deshalb unsichtbar: Angular hängt\n * projizierten Inhalt ohne passendes `<ng-content>`-Ziel nicht ins DOM.\n *\n * **Entscheidung — Icon als projizierter Inhalt.** Wie in Ticket 05 (`cds-icon-card`,\n * `.scratch/angular-seitenbausteine/issues/05-icon-karte.md`, Abschnitt „Entscheidung:\n * Icon als projizierter Inhalt“) sind die Störer-Icons im Mockup wechselnde\n * Heroicons, keine DS-Bereichsglyphen aus der Registry — Inhalt, nicht Chrom. Deshalb\n * Projektion über `<ng-content select=\"[cdsIcon]\">` statt eines `icon`-Inputs.\n * Abweichend von Ticket 05 trägt das projizierte `<svg>` die Klasse `stoerer-icon`\n * selbst (zusätzlich zu `cdsIcon`, `viewBox`, `aria-hidden=\"true\"`,\n * `focusable=\"false\"`): `.ep-card-icon` ist dort ein Container, der die Größe per\n * Nachfahren-Selektor (`.ep-card-icon svg`) an ein unverändertes Kind durchreicht.\n * `.stoerer-icon` (css/components.css:974) sitzt dagegen direkt auf dem SVG als\n * Flex-Kind von `.stoerer-topic` — es gibt keinen Container, der die Klasse\n * stellvertretend tragen könnte, ohne ein neues CSS-Selektorpaar zu erfinden\n * (verboten, ADR-0001). Der vollständige Kontrakt steht zusätzlich in der Story.\n */\n@Component({\n selector: 'cds-stoerer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ng-template>\n <a class=\"stoerer\" [href]=\"href()\">\n <span class=\"stoerer-topic\">\n <ng-content select=\"[cdsIcon]\"></ng-content>\n {{ topic() }}\n </span>\n <span class=\"stoerer-title\"\n ><span>{{ title() }}</span></span\n >\n @if (hasMeta()) {\n <span class=\"stoerer-meta\">\n @if (date()) {\n <time [attr.datetime]=\"date()\">{{ formattedDate() }}</time>\n }\n @if (date() && meta()) {\n <span aria-hidden=\"true\"> · </span><span class=\"sr-only\">, </span>\n }\n {{ meta() }}\n </span>\n }\n </a>\n </ng-template>\n `,\n})\nexport class StoererComponent {\n /** Thema/Inhaltstyp neben dem Icon (`.stoerer-topic`, z. B. „Nächste Veranstaltung“). */\n readonly topic = input.required<string>();\n /** Titel des verlinkten Inhalts — redaktionell auf zwei Zeilen gekürzt. */\n readonly title = input.required<string>();\n /** Linkziel; die Kachel ist vollständig klickbar. */\n readonly href = input.required<string>();\n /** Meta-Text nach dem Datum (Ort/Lesezeit/Format), leer = kein Meta-Text. */\n readonly meta = input('');\n /** ISO-Datum (`JJJJ-MM-TT`) → `<time datetime>`, gerendert vor `meta`, leer = kein Datum. */\n readonly date = input('');\n\n /**\n * Kachel-Markup als Template, das `cds-stoerer-set` per `ngTemplateOutlet` in sein\n * eigenes `<li>` einsetzt (siehe Klassendoku).\n *\n * @internal\n */\n readonly content = viewChild.required<TemplateRef<unknown>>(TemplateRef);\n\n /** @internal */\n protected readonly hasMeta = computed(() => !!(this.date() || this.meta()));\n\n /**\n * `date` als deutsches Langdatum („3. Dezember 2026“), manuell aus den\n * ISO-Komponenten gebaut statt über `new Date(iso)`: Ein reines Datums-ISO-String\n * wird von der Date-API als UTC-Mitternacht gelesen, `Intl.DateTimeFormat`\n * formatiert aber in der lokalen Zeitzone — in Zonen westlich von UTC kippt das\n * angezeigte Datum sonst einen Tag zurück.\n *\n * @internal\n */\n protected readonly formattedDate = computed(() => {\n const iso = this.date();\n if (!iso) return '';\n const [year, month, day] = iso.split('-').map(Number);\n if (!year || !month || !day) return iso;\n return new Intl.DateTimeFormat('de-DE', {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(new Date(year, month - 1, day));\n });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, contentChildren, input } from '@angular/core';\nimport { StoererComponent } from './stoerer.component';\n\n/**\n * StoererSet (cds-stoerer-set) — Wrapper um `.stoerer-set` / `.stoerer-list` aus\n * css/components.css (css/components.css:926–974): das Set aus ein bis drei\n * `<cds-stoerer>`-Kacheln, das auf der Startseite oben rechts über dem Hero-Bild\n * liegt. Der Positionsrahmen `.stoerer-hero` (umschließt Hero-Bild UND Set,\n * `container-type:inline-size` für die Container-Query-Schwelle) ist bewusst NICHT\n * Teil dieser Komponente, sondern bleibt beim Konsumenten (siehe\n * `.scratch/angular-seitenbausteine/issues/03-stoerer.md`): er umschließt Hero UND\n * Set gemeinsam, das könnte diese Komponente als internes Detail nicht leisten, ohne\n * das Hero-Bild selbst zu kennen.\n *\n * **Entscheidung — `<li>` ohne strukturelles Wrapper-Element.** `.stoerer-list` ist\n * ein `<ul>`; nach HTML-AAM bekommt ein `<li>` die implizite Rolle `listitem` nur als\n * direktes Kind eines `<ul>`/`<ol>`/`<menu>` — Screenreader kündigen die Liste sonst\n * nicht mit Anzahl an. Ein einfaches `<ng-content>` hätte `<cds-stoerer>` selbst\n * zwischen `<ul>` und `<li>` geschoben (kein direktes Kind mehr), und ein\n * `display:contents`-Wrapper verbietet sich als neues CSS (ADR-0001). Gelöst über\n * dasselbe Muster, das `cds-area-tabs`/`cds-area-tab` bereits für „projizierte\n * Kind-Komponente, deren Markup an einer selbst bestimmten Stelle im eigenen Template\n * landet“ etabliert (`area-tabs/area-tabs.component.ts`): `cds-stoerer` rendert nicht\n * in sich selbst, sondern in ein `<ng-template>` und liefert es als `TemplateRef`\n * (`stoerer.component.ts`). Diese Komponente liest die projizierten `<cds-stoerer>`\n * über `contentChildren()` und setzt ihr Template per `ngTemplateOutlet` direkt in\n * ein selbst gerendertes `<li>` ein. Im laufenden Storybook geprüft (`Komponenten/Hero/\n * Störer` → Story „Interaktiv“, DOM live im Browser per `querySelector` abgefragt,\n * zusätzlich in der Play-Funktion der Story gepinnt): `<ul class=\"stoerer-list\">`\n * hat ausschließlich `<li>` als direkte Kinder (`ul.stoerer-list > *` → `[\"LI\",\"LI\"]`),\n * `<cds-stoerer>` selbst taucht im gerenderten DOM nirgends auf — Angular hängt\n * unprojizierten Content ohne passendes `<ng-content>`-Ziel gar nicht erst ein, exakt\n * wie bei `<cds-area-tab>` innerhalb von `<cds-area-tabs>`. Ein `items`-Array (die im\n * Ticket vermerkte Alternative) hätte denselben DOM-Baum ergeben, aber den\n * Konsumenten gezwungen, das projizierte Icon jeder Kachel in ein Datenobjekt\n * umzuziehen; mit dieser Lösung bleibt die deklarative, Content-projizierende API\n * erhalten.\n *\n * Verwendungsguidance dieser Gruppe: siehe Hero-Bild (`komponenten-hero-hero-bild--verwendung`).\n */\n@Component({\n selector: 'cds-stoerer-set',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n template: `\n <aside class=\"stoerer-set\" [attr.aria-label]=\"label()\">\n <ul class=\"stoerer-list\">\n @for (tile of tiles(); track tile) {\n <li><ng-container [ngTemplateOutlet]=\"tile.content()\"></ng-container></li>\n }\n </ul>\n </aside>\n `,\n})\nexport class StoererSetComponent {\n /** Zugänglicher Name des Sets (`<aside aria-label>`); „Aktuelles“ wie im Mockup. */\n readonly label = input('Aktuelles');\n\n /**\n * Die Kacheln kommen als projizierte `<cds-stoerer>`-Kinder.\n *\n * @internal\n */\n protected readonly tiles = contentChildren(StoererComponent);\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport type { CdsArea } from '../area';\nimport { CDS_AREA_ICONS } from '../icons';\n\n/**\n * LinkCard (cds-link-card) — Wrapper um `a.card.card-elevated` aus css/components.css\n * (css/components.css:147–154) samt `.card-cta-link` (css/components.css:1347–1356).\n *\n * Die Lücke, die `CardComponent` bewusst offen lässt (siehe deren Klassendoku):\n * `.card-elevated` wirkt im CSS ausschließlich auf `a.card-elevated` (Riegel aus\n * `CONTRIBUTING.md` §4, „Elevation = Interaktivität“) — eine `<article>`/`<div>`-Karte\n * bekommt den Schatten auch mit gesetzter Klasse nicht. Diese Komponente rendert\n * deshalb ein echtes `<a>`, die ganze Fläche ist der Link, kein Klick-Handler auf\n * einem nicht-interaktiven Element.\n *\n * Struktur wie `CardComponent`: optionale bereichsgefärbte `.card-media` mit der\n * echten Bereichs-Glyphe, `.card-body` mit `.card-eyebrow` / `.card-title` /\n * `.card-text`. Neu ist der Fuß `.card-cta-link`, optional unten angeheftet\n * (`--pinned`, für gleich hohe Karten im Raster über `.card-body{flex:1}`).\n *\n * **Entscheidung — Fuß ist ein `<span>`, kein zweites `<a>`.** Die ganze Karte ist\n * bereits `a.card-elevated`; ein verschachteltes `<a>` im Fuß wäre ungültiges HTML\n * (der Browser schließt es beim Parsen vorzeitig) und würde zwei Klickziele auf\n * derselben Fläche erzeugen. `docs/index.html:4707–4716` zeigt exakt dieses Muster:\n * `<span class=\"card-cta-link card-cta-link--pinned\">…</span>` innerhalb von\n * `a.card.card-elevated`. `.card-cta-link` selbst ist nicht auf `a.` gescoped (anders\n * als `.card-elevated`), der Span trägt Farbe und Typografie also unverändert.\n *\n * **Entscheidung — Pfeil-Suffix wird von der Komponente ergänzt, nicht Teil von\n * `ctaLabel`.** Der Pfeil ist reine visuelle Affordanz, kein Inhalt — `docs/index.html`\n * (Abschnitt „Klickbare Karte“) kapselt ihn deshalb selbst in ein\n * `aria-hidden`-Span. Läge das Zeichen im `ctaLabel`-Text, müsste jeder Aufrufer\n * selbst an das `aria-hidden` denken; das wird hier stattdessen einmalig in der\n * Komponente erledigt.\n *\n * **Entscheidung — kein `data-area` auf `.card-cta-link`.** Die Doku hält die\n * CTA-Farbe in gemischten Bereichs-Listen bewusst einheitlich Corporate-Petrol\n * (`docs/index.html:8762`: „CTA-Farbe einheitlich `--co-700`“), unabhängig vom\n * `area` der Karte. Der Fuß bleibt deshalb ohne `data-area`-Bindung.\n *\n * **Entscheidung — Host als Flex-Container.** Im Raster ist der Host das\n * Grid-Kind, das `align-items:stretch` auf Zeilenhöhe zieht, nicht `a.card`. Ohne\n * eigene Regel blieb die Karte auf Inhaltshöhe, und eine Karte ohne Eyebrow endete\n * samt `--pinned`-Fuß höher als ihre Nachbarn. `:host{display:flex}` mit\n * `flex:1` an der Karte gibt die gestreckte Höhe an `a.card` weiter; Story\n * „Im Raster“ pinnt das.\n *\n * Verwendungsguidance dieser Gruppe: siehe Card (`komponenten-cards-teaser-card--verwendung`).\n */\n@Component({\n selector: 'cds-link-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [':host{display:flex}', ':host>.card{flex:1;min-width:0}'],\n template: `\n <a class=\"card card-elevated\" [href]=\"href()\" [attr.data-area]=\"area() || null\">\n @if (showMedia()) {\n <div class=\"card-media\" [innerHTML]=\"mediaSvg()\"></div>\n }\n <div class=\"card-body\">\n @if (eyebrow()) {\n <p class=\"card-eyebrow\">{{ eyebrow() }}</p>\n }\n <h3 class=\"card-title\">\n <span>{{ title() }}</span>\n </h3>\n <p class=\"card-text\">{{ text() }}</p>\n @if (ctaLabel()) {\n <span class=\"card-cta-link\" [class.card-cta-link--pinned]=\"ctaPinned()\">\n {{ ctaLabel() }} <span aria-hidden=\"true\">→</span>\n </span>\n }\n </div>\n </a>\n `,\n})\nexport class LinkCardComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Kartentitel. */\n readonly title = input.required<string>();\n /** Anreißer-/Beschreibungstext der Karte. */\n readonly text = input.required<string>();\n /** Linkziel; die ganze Kartenfläche ist klickbar. */\n readonly href = input.required<string>();\n /** Kicker-Text oberhalb des Titels (`.card-eyebrow`, leer = keine Eyebrow-Zeile). */\n readonly eyebrow = input('');\n /** Markenbereich → `data-area` (färbt Media-Glyphe + Eyebrow). */\n readonly area = input<CdsArea>();\n /** Bereichsgefärbte Medienfläche mit Bereichs-Glyphe anzeigen. */\n readonly showMedia = input(true);\n /** Fuß-Link-Text (`.card-cta-link`, leer = kein Fuß). */\n readonly ctaLabel = input('');\n /** Fuß unten an die Kartenunterkante anheften (`.card-cta-link--pinned`, für gleich hohe Karten im Raster). */\n readonly ctaPinned = input(false);\n\n /**\n * Echte Bereichs-Glyphe aus icons/icons.js, als ico-48-SVG in die Media-Fläche —\n * identisch zu `CardComponent.mediaSvg`.\n *\n * @internal\n */\n protected readonly mediaSvg = computed<SafeHtml>(() => {\n const icon = CDS_AREA_ICONS[this.area() ?? 'co'];\n return this.sanitizer.bypassSecurityTrustHtml(\n `<svg class=\"ico-48\" viewBox=\"${icon.viewBox}\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">${icon.body}</svg>`,\n );\n });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * FeaturedCard (cds-featured-card) — Wrapper um `.card-featured` aus\n * css/components.css (css/components.css:230–249): die horizontale Großkarte für\n * **genau einen** hervorgehobenen Beitrag oder Termin (Bild links 60 %, Textspalte\n * rechts 40 % als absolut positioniertes Overlay), siehe `docs/index.html`\n * Abschnitt „Featured · horizontale Großkarte“ (`#gt-events-featured`).\n *\n * **Entscheidung 1 — `href` entscheidet zwischen `<a>` und `<article>`.** Die\n * Doku-Beispiele zeigen die Featured-Card ausschließlich als Link\n * (`a.card.card-elevated.card-featured`), das Ticket verlangt aber ausdrücklich eine\n * Variante ohne `<a>`. `.card-elevated` ist nach `CONTRIBUTING.md` §4 („Elevation =\n * Interaktivität“) im CSS auf `a.card-elevated` gescoped — eine `<article>` bekäme\n * den Schatten mit gesetzter Klasse ohnehin nicht. Die Komponente führt die Klasse\n * deshalb nur mit, wenn sie auch wirkt: mit `href` ein `<a class=\"card card-elevated\n * card-featured\">`, ohne `href` ein `<article class=\"card card-featured\">` (ruht\n * flach mit dem `--bd-strong`-Rahmen aus `.card`, wie jede statische Fläche). Media\n * und Body stehen dafür einmal in einem gemeinsamen `<ng-template>` und werden in\n * beiden Zweigen per `<ng-container [ngTemplateOutlet]>` eingesetzt — dasselbe\n * Muster wie `SectionComponent` (`section.component.ts`) für „zwei Wurzelelemente,\n * ein Körper“. `<ng-container>` rendert selbst kein Element, die Kindselektoren aus\n * Entscheidung 2 bleiben also unberührt: im laufenden Storybook erneut per\n * `querySelector`/`getBoundingClientRect` gemessen (siehe Play-Funktionen), Ergebnis\n * unverändert zur vorherigen, noch duplizierten Fassung.\n *\n * **Entscheidung 2 — die Pill ist direkt komponiertes Markup, kein `<cds-pill>`.**\n * Das CSS arbeitet mit direkten Kindselektoren: `.card-featured>.card-media`,\n * `.card-featured-body>.pill`, `.card-featured-body>.card-text`,\n * `.card-featured-body>.card-title-hero` (jeweils mit `margin`/`min-height`/\n * `line-clamp`-Übernahmen, siehe CSS-Kommentare dort). `<cds-pill>` rendert sein\n * `.pill`-`<span>` nicht auf dem eigenen Host-Element, sondern eine Ebene tiefer\n * (`pill.component.ts`: Host ist `<cds-pill>`, `.pill` sitzt im Template darunter) —\n * projiziert als `<cds-pill class=\"pill\">` stünde die Pille damit als\n * `.card-featured-body>cds-pill>.pill`, zwei Ebenen statt einer, und die\n * Kindselektoren griffen nicht mehr (leise: kein Fehler, nur falsches Layout).\n * Dieselbe Abwägung wie in `download-cta.component.ts` (Kommentar über den\n * Buttons): dort verhindert `.cta-dl-actions`, das seine Kinder per Flex streckt,\n * dass ein `<cds-button>`-Host mitstreckt; hier verhindert ein Kindselektor, dass\n * irgendein zusätzliches Host-Element dazwischentritt. In beiden Fällen werden die\n * Klassen direkt komponiert statt eine Wrapper-Komponente zu verwenden. Geprüft im\n * laufenden Storybook (`Komponenten/Cards & Teaser/Featured-Karte`): die gerenderte\n * Kette ist `.card-featured>.card-media` und `.card-featured-body` mit `.pill`,\n * `.card-text`, `.card-title-hero` als direkten Kindern, kein zusätzliches Element\n * dazwischen (siehe Play-Funktionen der Stories).\n *\n * Weil die Pille direkt komponiert wird, übernimmt diese Komponente auch die\n * `aria-label`-Regel von `PillComponent` (`pill.component.ts`) von Hand nach:\n * Default „Bereich `<pill>`“, überschreibbar über `pillAriaLabel` — nötig, weil die\n * Pille nicht immer einen Bereich benennt (siehe `pillAriaLabel`-Doku unten).\n *\n * **Entscheidung 3 — kein separates `data-area` für die Pille.** Die Doku setzt\n * Karte und Pille immer auf denselben Bereich (`docs/index.html:8979`: Karte\n * `data-area=\"es\"`, Pille `data-area=\"es\"`). Die Komponente bindet deshalb `area`\n * auf beide, statt einen zweiten Bereichs-Input zu erfinden.\n *\n * **Entscheidung 4 — kein CTA- und kein Meta-Input.** Die Doku-Vorlage zeigt\n * zusätzlich einen Meta-Strip (Datum/Ort/Format) und einen `.card-cta-link`-Fuß;\n * das Ticket benennt als API aber nur `title`/`text`/`imageSrc`/`imageAlt`/`href`/\n * `pill`/`area`. Diese Komponente bildet exakt diese Fläche ab, ohne Inputs zu\n * erfinden, die das Ticket nicht vorsieht — ein Meta-Strip oder ein CTA-Fuß wären\n * eine spätere, eigene Erweiterung.\n *\n * Verwendungsguidance dieser Gruppe: siehe Card (`komponenten-cards-teaser-card--verwendung`).\n */\n@Component({\n selector: 'cds-featured-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n template: `\n @if (href()) {\n <a class=\"card card-elevated card-featured\" [href]=\"href()\" [attr.data-area]=\"area() || null\">\n <ng-container [ngTemplateOutlet]=\"body\"></ng-container>\n </a>\n } @else {\n <article class=\"card card-featured\" [attr.data-area]=\"area() || null\">\n <ng-container [ngTemplateOutlet]=\"body\"></ng-container>\n </article>\n }\n <ng-template #body>\n <div class=\"card-media\">\n <img [src]=\"imageSrc()\" [alt]=\"imageAlt()\" />\n </div>\n <div class=\"card-featured-body\">\n @if (pill()) {\n <span\n class=\"pill\"\n [attr.data-area]=\"area() || null\"\n [attr.aria-label]=\"computedPillAriaLabel()\"\n >{{ pill() }}</span\n >\n }\n <h3 class=\"card-title-hero\">{{ title() }}</h3>\n <p class=\"card-text\">{{ text() }}</p>\n </div>\n </ng-template>\n `,\n})\nexport class FeaturedCardComponent {\n /** Titel (`.card-title-hero`). */\n readonly title = input.required<string>();\n /** Anreißer-/Beschreibungstext (`.card-text`). */\n readonly text = input.required<string>();\n /** Bildquelle der 16:9-Medienfläche. */\n readonly imageSrc = input.required<string>();\n /** Alternativtext des Bildes — Pflicht, das Bild trägt Bedeutung. */\n readonly imageAlt = input.required<string>();\n /** Linkziel; gesetzt → `<a>` (ganze Fläche klickbar), leer → `<article>` (statisch, kein Schatten). */\n readonly href = input('');\n /** Bereichs-Pille über dem Titel (`.pill`, leer = keine Pille). */\n readonly pill = input('');\n /**\n * `aria-label` der Pille überschreiben; Default „Bereich `<pill>`“, wie\n * `PillComponent` (`pill.component.ts`). Nötig, weil `pill` nicht immer einen\n * Bereich benennt — das Mockup zeigt neben `aria-label=\"Bereich Corporate\"` auch\n * `aria-label=\"Lesezeit 12 Minuten\"` für dieselbe Klasse.\n */\n readonly pillAriaLabel = input<string>();\n /** Markenbereich → `data-area` auf Karte und Pille. */\n readonly area = input<CdsArea>();\n\n /** @internal */\n protected readonly computedPillAriaLabel = computed(\n () => this.pillAriaLabel() ?? `Bereich ${this.pill()}`,\n );\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, inject, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * IconCard (`[cdsIconCard]`) — Wrapper um `.ep-card` aus css/components.css\n * (css/components.css:1298–1340): die Icon-Kachel mit farbiger Icon-Fläche, Eyebrow,\n * Titel, Text und optionaler Pfeil-CTA-Zeile, die auf den Beispielseiten Bereichs-\n * und Angebots-Einstiege trägt (`docs/index.html:9401–9420` u. a., 81 Vorkommen).\n *\n * **Entscheidung 1 — Attributselektor, kein Element-Selektor.** Erste Fassung dieser\n * Komponente war `cds-icon-card` als eigenes Element mit `href`-Input, das intern\n * zwischen `<a class=\"ep-card ep-card-link\">` und `<div class=\"ep-card\">` wählte\n * (`@if`/`@else` + `<ng-template>`). Gemessen im laufenden Storybook: zwei Karten mit\n * unterschiedlich langem Text ergaben im `.ep-cards`-Grid ungleiche `.ep-card`-Höhen\n * (174px/270px), weil `align-items:stretch` nur den unsichtbaren `<cds-icon-card>`-Host\n * streckt, nicht das `.ep-card`-Element eine Ebene darunter. Dieselbe Messung mit\n * `.ep-card` OHNE Host-Wrapper (rohes Markup direkt in `.ep-cards`) ergab 306px/306px,\n * CTA-Unterkanten auf identischer Y-Koordinate — das CSS gleicht die Höhen korrekt aus,\n * sobald `.ep-card` selbst das Grid-Kind ist. Der Fehler saß also im Wrapper-Element,\n * nicht in der CSS-Schicht (siehe „Im Raster“-Story, dort dieselbe Messung als\n * Play-Funktion gepinnt).\n *\n * Die Lösung, analog zu Angular Materials `a[mat-button], button[mat-button]`: die\n * Komponente hängt sich als Attribut an ein vom Konsumenten geschriebenes `<a>` oder\n * `<div>`, statt ein eigenes Element zu sein. Dadurch trägt **derselbe** native Knoten,\n * den der Konsument in sein Grid schreibt, sowohl die Komponentenlogik als auch die\n * `.ep-card`-Klasse — kein Host-Element dazwischen, `align-items:stretch` trifft direkt\n * auf `.ep-card`.\n *\n * **`href` ist deshalb kein Input mehr.** Ob die Karte ein Link ist, entscheidet der\n * Konsument über das gewählte Tag (`<a cdsIconCard href=\"…\">` vs. `<div cdsIconCard>`)\n * und setzt `href` als natives Attribut direkt am `<a>` — Angular muss dafür nichts\n * verwalten. `.ep-card-link` (nur auf `a.ep-card-link` wirksam, `CONTRIBUTING.md` §4)\n * wird deshalb vom Host-Tag abgeleitet, nicht mehr per Verzweigung im Template\n * gerendert.\n *\n * **`.ep-card-link` hängt an `<a>` UND `href`, nicht am Tag allein.** Ein `<a\n * cdsIconCard>` ohne `href` ist weder fokussierbar noch hat es eine Link-Rolle —\n * `.ep-card-link` (Schatten, Hover-Anhebung, Cursor) nur am Tag festzumachen hätte\n * eine Karte erzeugt, die aussieht wie ein Link, aber keiner ist, und genau die\n * Garantie aufgegeben, die die frühere `href`-Input-Fassung strukturell hatte (leerer\n * String → zwingend der `<div>`-Zweig). `isLink()` prüft deshalb beides.\n *\n * **`isLink()` ist eine Methode im Host-Binding, kein einmalig berechnetes Feld.**\n * `href` kann nach dem Erstellen zur Laufzeit gesetzt/entfernt werden (z. B.\n * `<a cdsIconCard [attr.href]=\"urlSignal()\">`). Ein Host-Binding-Ausdruck\n * (`'[class.ep-card-link]': 'isLink()'`) wird bei JEDEM Refresh der DECLARING VIEW\n * neu ausgewertet — also der Elternvorlage, die `<a cdsIconCard>` schreibt —, nicht\n * nur bei einem Refresh der eigenen (OnPush-gesteuerten) Kindvorlage dieser\n * Komponente. Das ist kein Sonderfall wie bei einem in ADR-0007 §3 verworfenen\n * Getter (dort ging es um einen Getter in einer INTERPOLATION der eigenen\n * Kindvorlage, die unter OnPush nur bei eigenen Signal-Änderungen neu läuft):\n * Host-Bindings werden unabhängig vom OnPush-Status der Komponente selbst\n * mitgeführt, wenn die Elternansicht aktualisiert wird — reagiert also auf\n * `[attr.href]`/`[href]`-Bindungen des Konsumenten, ob Signal- oder\n * Zone.js-getrieben, ohne `effect()` (ADR-0007 §4) und ohne `MutationObserver`.\n * Empirisch geprüft (Spike-Story mit `[attr.href]=\"signal()\"`-Toggle zur Laufzeit,\n * seither wieder gelöscht): Setzen des Signals nach Erstrender schaltet\n * `.ep-card-link` zuverlässig um. Einzige Grenze: eine Änderung, die AUSSERHALB von\n * Angular direkt am nativen Element vorgenommen wird (z. B. `el.setAttribute\n * ('href', …)` von Fremdcode), löst keinen Refresh aus — das gilt aber für jede\n * Angular-Bindung gleichermaßen und ist kein Sonderfall dieser Komponente.\n *\n * **Entscheidung 2 — Icon als projizierter Inhalt, OHNE dass das SVG eine eigene\n * Größenklasse tragen muss.** Wie bei `cds-stoerer` (siehe dessen Klassendoku) sind\n * die Icons auf den Beispielseiten wechselnde Heroicons, keine DS-Bereichsglyphen aus\n * der Registry `icons/cds-icons.ts` — Inhalt, nicht Chrom. Deshalb Projektion über\n * `<ng-content select=\"[cdsIcon]\">` statt eines `icon`-Strings. Anders als beim Störer\n * ist `.ep-card-icon` hier aber ein echter CONTAINER: css/components.css:1310+1318\n * setzt Maße und Stroke über den Nachfahren-Selektor `.ep-card-icon svg{width:32px;\n * height:32px;stroke-width:var(--icon-stroke-sm)}`, nicht über eine Klasse auf dem\n * SVG selbst. Der Konsument liefert deshalb ein unverändertes `<svg cdsIcon\n * viewBox=\"…\" aria-hidden=\"true\" focusable=\"false\">…</svg>` OHNE zusätzliche Klasse —\n * das Verhältnis Größe/Stroke kommt allein aus dem Container. Geprüft an\n * css/components.css:1298–1318 (Kommentar dort: „Farbe kommt aus der Komponente,\n * nicht aus … inline gesetzten style-Attributen“) und in der Story „Interaktiv“\n * gepinnt (Play-Funktion misst die gerenderte SVG-Breite).\n *\n * **`data-area` sitzt auf drei Elementen** (`.ep-card` (Host), `.ep-card-icon`,\n * `.ep-card-eyebrow`, wie im Mockup, `docs/index.html:4681–4686`): die CTA-Farbe\n * braucht dagegen KEIN eigenes `data-area`, sie kommt über den Nachfahren-Selektor\n * `.ep-card[data-area=\"…\"] .ep-card-cta` (css/components.css:1336–1339) vom\n * `data-area` der Karte selbst.\n *\n * **Kein erfundener `aria-label`.** Der Pfeil-Suffix der CTA-Zeile ist reine visuelle\n * Affordanz (`docs/index.html:4686`: `<span aria-hidden=\"true\">→</span>`) und steht\n * deshalb `aria-hidden`, unverändert zum Mockup — kein zusätzlicher, selbst\n * ausgedachter zugänglicher Name.\n *\n * **Entscheidung 3 — kein `cdsIconCards`-Raster.** `.ep-cards` ist ein reines\n * `display:grid` ohne Struktur oder Verhalten (dieselbe Begründung wie beim Verzicht\n * auf einen `layout-grid`-Wrapper, siehe `spec.md`). Konsumenten schreiben\n * `<div class=\"ep-cards\">` von Hand (siehe Story „Im Raster“).\n *\n * Verwendungsguidance dieser Gruppe: siehe Card (`komponenten-cards-teaser-card--verwendung`).\n */\n@Component({\n selector: 'a[cdsIconCard], div[cdsIconCard]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ep-card',\n '[class.ep-card-link]': 'isLink()',\n '[attr.data-area]': 'area() || null',\n },\n template: `\n <div class=\"ep-card-icon\" [attr.data-area]=\"area() || null\">\n <ng-content select=\"[cdsIcon]\"></ng-content>\n </div>\n @if (eyebrow()) {\n <p class=\"ep-card-eyebrow\" [attr.data-area]=\"area() || null\">{{ eyebrow() }}</p>\n }\n <h3 class=\"ep-card-title\">{{ title() }}</h3>\n <p class=\"ep-card-text\">{{ text() }}</p>\n @if (ctaLabel()) {\n <div class=\"ep-card-cta\">{{ ctaLabel() }} <span aria-hidden=\"true\">→</span></div>\n }\n `,\n})\nexport class IconCardComponent {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Kartentitel (`.ep-card-title`). */\n readonly title = input.required<string>();\n /** Anreißer-/Beschreibungstext (`.ep-card-text`). */\n readonly text = input.required<string>();\n /** Kicker-Text oberhalb des Titels (`.ep-card-eyebrow`, leer = keine Eyebrow-Zeile). */\n readonly eyebrow = input('');\n /** Markenbereich → `data-area` auf Karte, Icon-Kachel und Eyebrow. */\n readonly area = input<CdsArea>();\n /** CTA-Zeile am Kartenfuß (`.ep-card-cta`, leer = keine CTA-Zeile). */\n readonly ctaLabel = input('');\n\n /**\n * Ob der Host ein `<a>` MIT `href` ist → schaltet `.ep-card-link` (Schatten/Hover,\n * `CONTRIBUTING.md` §4). Als Methode im Host-Binding aufgerufen (nicht einmalig in\n * ein Feld geschrieben), damit ein zur Laufzeit gesetztes/entferntes `href` erkannt\n * wird — Begründung und Grenzen in der Klassendoku oben.\n *\n * @internal\n */\n protected isLink(): boolean {\n const el = this.elementRef.nativeElement;\n return el.tagName === 'A' && el.hasAttribute('href');\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * Feature (`[cdsFeature]`) — Wrapper um `.ep-feature` aus css/components.css\n * (css/components.css:1363–1379): die flache Feature-Zeile ohne Box und ohne\n * Schatten (Icon-Kachel links, Titel/Text rechts) — die „Offene Feature-Liste“ der\n * Beispielseiten (Doku-Sektion `docs/index.html:4882` ff., Beispielseiten u. a.\n * `docs/index.html:10405–10415`, `11582–11588`; 40 Vorkommen als\n * `class=\"ep-feature col-4\"` im `.layout-grid`).\n *\n * **Attributselektor, kein eigenes Element (ADR-0008).** Das Mockup setzt die\n * Spaltenklasse am selben Element wie `.ep-feature` (`class=\"ep-feature col-4\"`).\n * Das Bauteil ist damit selbst Grid-Kind UND Ziel einer Layout-Klasse des\n * Konsumenten — exakt das Kriterium aus\n * [ADR-0008](../../../../../../docs/adr/0008-selektortyp-der-wrapper-komponenten.md).\n * Ein eigenes `<cds-feature>`-Element mit innerem `<div class=\"ep-feature\">` würde\n * `.layout-grid>[class*=\"col-\"]` (css/base.css:214) brechen: der `col-*`-Selektor\n * träfe den unsichtbaren Host, nicht `.ep-feature`, das `.layout-grid` gibt seinem\n * Kind (dem Host) dann zwar per `align-items:stretch` (Grid-Default) die volle\n * Zeilenhöhe, aber `.ep-feature` darunter bliebe auf Inhaltshöhe — derselbe Fehler,\n * den ADR-0008 Fall 1 für `.ep-card`/`.ep-cards` gemessen hat (174px/270px statt\n * 306px/306px). Die Komponente hängt sich deshalb als Attribut an ein vom\n * Konsumenten geschriebenes `<div>` (`<div cdsFeature class=\"col-4\">`), analog zu\n * `cds-icon-card` (siehe dessen Klassendoku). Gemessen für dieses Bauteil in der\n * Story „Dreispalter“ (Play-Funktion): drei `.ep-feature` mit stark\n * unterschiedlich langem Text als `col-4`-Geschwister in einem `.layout-grid`\n * ergeben identische Höhen und deckungsgleiche Unterkanten (Messwerte in der\n * Story-Doku dort).\n *\n * **Icon-Kontrakt: `.ep-feature-icon` ist ein Container, keine Klasse auf dem\n * SVG — UND reicht zusätzlich die Farbe durch, anders als `.ep-card-icon`.** Wie\n * `.ep-card-icon` (siehe `icon-card.component.ts`, Entscheidung 2) setzt\n * css/components.css:1369 Maße und Stroke über den Nachfahren-Selektor\n * `.ep-feature-icon svg{width:26px;height:26px;stroke-width:var(--icon-stroke-md)}`\n * — NICHT über eine Klasse auf dem SVG selbst, anders als `.stoerer-icon`\n * (`stoerer.component.ts`), das direkt auf dem projizierten `<svg>` sitzt. Der\n * Konsument liefert deshalb ein unverändertes\n * `<svg cdsIcon viewBox=\"…\" aria-hidden=\"true\" focusable=\"false\">…</svg>` OHNE\n * zusätzliche Größenklasse, projiziert über `<ng-content select=\"[cdsIcon]\">`\n * (Kontrakt in der Story „Interaktiv“ per `getBoundingClientRect()` gepinnt).\n * Anders als `.ep-card-icon` (nur `background`, kein `color`) setzt\n * `.ep-feature-icon` UND ihre vier `[data-area]`-Varianten (css/components.css:\n * 1367–1372) zusätzlich `color` auf dem Container selbst. Das Mockup nutzt das\n * aktiv aus: die projizierten SVGs dort (`docs/index.html:10406` u. a.) tragen\n * `stroke=\"currentColor\"` statt eines hart codierten Bereichstons — die Farbe\n * kommt allein aus dem Container, ein Icon-Autor muss den Bereich der Kachel gar\n * nicht kennen. Bei `cds-icon-card` ist das nicht möglich (kein `color` am\n * Container), dort trägt jedes Icon seinen Bereichston selbst im `stroke`-Attribut.\n * Story „Interaktiv“ demonstriert das mit `stroke=\"currentColor\"` und prüft die\n * geerbte Farbe per `getComputedStyle()`. Die Icon-Kachel selbst ist im Mockup\n * (`docs/index.html:4883` u. a.) ein `<span aria-hidden=\"true\">`, kein `<div>` —\n * rein dekorativ, das SVG trägt bereits sein eigenes `aria-hidden`; die Komponente\n * übernimmt beides unverändert.\n *\n * **CTA: `<a>` mit `href`, sonst `<span>` — nie ein `<a>` ohne `href`.**\n * css/components.css:1376 zielt mit `.ep-feature-body>.card-cta-link` auf den\n * direkten Nachfahren; Angulars `@if`/`@else` fügt dafür kein Wrapper-Element ein\n * (kompiliert zu Kommentar-Ankern, kein Element), der Kindselektor bleibt also in\n * beiden Zweigen erhalten. Ausgezählt in `docs/index.html`: alle 13 Vorkommen von\n * `.card-cta-link` innerhalb von `.ep-feature-body` sind entweder ein `<a\n * href=\"…\">` (12×) oder ein `<span>` (1×, `docs/index.html:13216`,\n * „Landingpage folgt“ — Platzhalter für ein Ziel, das noch fehlt). Ein `<a>` OHNE\n * `href` kommt kein einziges Mal vor — dieselbe Falle, die `cds-icon-card` über\n * `isLink()` schließt (ein Link-Tag ohne `href` ist weder fokussierbar noch hat\n * es eine Link-Rolle, sieht mit der `.card-cta-link`-Optik aber trotzdem wie ein\n * bedienbares Element aus). Hier entscheidet sich das nicht am Host-Tag (der ist\n * bei `cdsFeature` immer `<div>`), sondern strukturell im eigenen Template:\n * `ctaHref` gesetzt → `<a class=\"card-cta-link\" [href]=\"ctaHref()\">`, leer →\n * `<span class=\"card-cta-link\">` mit identischer Optik und identischem Pfeil,\n * aber ohne Link-Rolle (siehe Story „Ohne Href“). Ein `[attr.href]`-Nullwert wäre\n * dieselbe Krücke gewesen wie ein `<a>` ohne `href` zu tolerieren; der\n * `@if`/`@else`-Zweig macht den Fall stattdessen unmöglich, statt ihn nur\n * abzufedern. `data-area` sitzt auf beiden Zweigen, weil `.card-cta-link[data-area]`\n * (css/components.css:1363–1366) ein direkter Attributselektor ist, keine\n * Nachfahren-Regel wie `.ep-card[data-area] .ep-card-cta` bei der Icon-Karte —\n * ohne eigenes `data-area` bliebe der Link/Span auf der CSS-Vorgabefarbe, auch bei\n * gesetztem `area`.\n *\n * **`ctaAriaLabel` — der zugängliche Name ist im Mockup die Regel, nicht die\n * Ausnahme.** Erster Anlauf dieser Komponente hatte keinen solchen Input, mit der\n * (falschen) Annahme, das Mockup verzichte meist auf einen zusätzlichen\n * `aria-label`. Ausgezählt: von den 12 `<a class=\"card-cta-link\">` in\n * `.ep-feature-body` tragen 11 einen `aria-label`, nur einer nicht\n * („Contentletter abonnieren“, `docs/index.html:15203` — der sichtbare Text ist\n * dort bereits eindeutig). Grund: nur 3 verschiedene sichtbare Texte verteilen\n * sich auf diese 12 Links, „Zur Landingpage“ allein zehnmal\n * (`docs/index.html:11587` u. a.) — eine Screenreader-Linkliste hörte sonst\n * zehnmal denselben Namen ohne Unterscheidung. Das Mockup disambiguiert\n * durchgängig mit der Form `<sichtbarer Text>: <Ziel>`\n * (`aria-label=\"Zur Landingpage: KI Kickstart Workshops\"`). `ctaAriaLabel` ist\n * deshalb Beiwerk (Default `''`): leer bleibt der sichtbare `ctaLabel`-Text der\n * zugängliche Name (passt für einen eindeutigen CTA-Text wie „Contentletter\n * abonnieren“), gesetzt überschreibt er ihn — Konsumenten mit einer Liste\n * gleichlautender CTA-Texte (wie den zehn „Zur Landingpage“ im Mockup) setzen ihn\n * pro Instanz auf `<ctaLabel>: <Ziel>`. Wirkt nur am `<a>`-Zweig: `aria-label` an\n * einem `<span>` ohne Rolle hat keinen verlässlichen Effekt im\n * Accessibility-Baum, und der `<span>`-Zweig ist ohnehin nicht interaktiv.\n *\n * Verwendungsguidance dieser Gruppe: siehe Card (`komponenten-cards-teaser-card--verwendung`).\n */\n@Component({\n selector: 'div[cdsFeature]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ep-feature',\n },\n template: `\n <span class=\"ep-feature-icon\" [attr.data-area]=\"area() || null\" aria-hidden=\"true\">\n <ng-content select=\"[cdsIcon]\"></ng-content>\n </span>\n <div class=\"ep-feature-body\">\n <h3 class=\"ep-feature-title\">{{ title() }}</h3>\n <p class=\"ep-feature-text\">{{ text() }}</p>\n @if (ctaLabel()) {\n @if (ctaHref()) {\n <a\n class=\"card-cta-link\"\n [attr.data-area]=\"area() || null\"\n [href]=\"ctaHref()\"\n [attr.aria-label]=\"ctaAriaLabel() || null\"\n >\n {{ ctaLabel() }} <span aria-hidden=\"true\">→</span>\n </a>\n } @else {\n <span class=\"card-cta-link\" [attr.data-area]=\"area() || null\">\n {{ ctaLabel() }} <span aria-hidden=\"true\">→</span>\n </span>\n }\n }\n </div>\n `,\n})\nexport class FeatureComponent {\n /** Titel (`.ep-feature-title`). */\n readonly title = input.required<string>();\n /** Beschreibungstext (`.ep-feature-text`). */\n readonly text = input.required<string>();\n /** Markenbereich → `data-area` auf Icon-Kachel und CTA-Link. */\n readonly area = input<CdsArea>();\n /** CTA-Linktext (`.card-cta-link` als direktes Kind von `.ep-feature-body`, leer = kein CTA). */\n readonly ctaLabel = input('');\n /** CTA-Linkziel; gesetzt → `<a href>`, leer → `<span>` ohne Link-Rolle (siehe Klassendoku). */\n readonly ctaHref = input('');\n /**\n * Zugänglicher Name des CTA-Links, überschreibt den sichtbaren `ctaLabel`-Text.\n * Nötig, wenn derselbe sichtbare CTA-Text mehrfach auf einer Seite steht (siehe\n * Klassendoku); Form aus dem Mockup: `<ctaLabel>: <Ziel>`. Leer (Default) = kein\n * `aria-label`, der sichtbare `ctaLabel`-Text bleibt der zugängliche Name. Wirkt\n * nur, wenn `ctaHref` gesetzt ist (nur der `<a>`-Zweig hat eine Link-Rolle).\n */\n readonly ctaAriaLabel = input('');\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * CtaBand (`[cdsCtaBand]`) — Wrapper um `.ep-cta-band` aus css/components.css\n * (css/components.css:1456, Kopf-Duo `.ep-cta-h2`/`.ep-cta-sub` ebenda): das\n * bereichsgefärbte Page-End-CTA-Band, das laut Doku-Site (`docs/index.html:6237`,\n * Anker `gt-cta-band`) am Ende jeder Customer-Page direkt vor dem Footer steht — die\n * „letzte Einladung“, wenn die Nutzerin die Seite durchgelesen hat. Ausgezählt: 22\n * Vorkommen auf den Beispielseiten, ausnahmslos als `<div class=\"ep-cta-band\"\n * style=\"background:…\">` mit genau einer Aktion.\n *\n * **Entscheidung 1 — Attributselektor, kein eigenes Element (ADR-0008, derselbe\n * „Fläche am Host“-Fall wie `cds-section`).** `css/components.css` trägt für\n * `.ep-cta-band` KEIN `[data-area]` (per Grep geprüft, keine einzige Regel dieser\n * Form existiert). Die Bandfläche kommt in allen 22 Vorkommen als Inline-Style\n * DIREKT am `.ep-cta-band`-Element (`style=\"background:var(--co-700);color:#fff\"`,\n * docs/index.html:6304 u. a.), dem Bereich der Page folgend, nie aus einem\n * `data-area`-Attribut. Ein Element-Selektor würde exakt den in ADR-0008 „Fall 2“\n * gemessenen Fehler wiederholen: der `<cds-cta-band>`-Host ist ein unbekanntes\n * Custom Element (`display:inline`), sein einziges Kind würde als Block\n * herausgebrochen, ein am Host gesetzter Inline-`background` hätte keine eigene Box\n * zum Malen. Die Komponente hängt sich deshalb als Attribut an ein vom Konsumenten\n * geschriebenes `<div>` (`<div cdsCtaBand style=\"background:…\">`) — das Element, das\n * den Style trägt, und `.ep-cta-band` sind derselbe Knoten. Nur `<div>`, kein\n * `<section>`-Zwilling wie bei `cds-section`: alle 22 Vorkommen benutzen\n * ausnahmslos ein `<div>`, keines variiert das Tag.\n *\n * **Entscheidung 2 — `area` färbt nur die Aktion, nicht das Band.** Aus demselben\n * Grund wie bei `cds-section` (siehe dessen Klassendoku, Entscheidung 2) bleibt die\n * Bandfläche Sache des Konsumenten: welche Bereichsfarbe ein Band trägt, ist eine\n * Entscheidung der Seite (Bereichszugehörigkeit der Customer-Page), keine\n * Bauteil-Eigenschaft — und das CSS bietet an dieser Klasse ohnehin keinen\n * `[data-area]`-Haken an (siehe Entscheidung 1). `area` steuert deshalb\n * ausschließlich die Button-Farbklasse (`.btn-{area}`), nicht die Füllung des Bands.\n *\n * **Entscheidung 3 — `.btn-on-band` + `.btn-filled` direkt komponiert, nicht über\n * `cds-button` projiziert.** `cds-button` KENNT den Modifier\n * (`variant=\"filled-on-band\"`, geprüft über `npx storybook tools docs show --id\n * komponenten-buttons-button` — die Story „Auf Bereichs-Band“ existiert dort\n * bereits). Trotzdem baut diese Komponente die `.btn`-Klassen direkt zusammen\n * (Präzedenzfall `download-cta.component.ts`), aus einem härteren Grund als dort:\n * `cds-button` rendert IMMER ein `<button>` — sein Input-Vertrag\n * (`ButtonComponentInputs`) kennt kein `href` — und kann die vom Ticket geforderte\n * Verzweigung „`primaryHref` gesetzt → `<a>`“ strukturell gar nicht erfüllen. Ein\n * projiziertes `<cds-button>` brächte hier also kein Custom-Element-Layoutproblem\n * (kein Kindselektor an `.ep-cta-band` hängt von der DOM-Tiefe ab), sondern schlicht\n * die falsche Fähigkeit.\n *\n * **Entscheidung 4 — bewusst nur EINE Aktion, kein `secondaryLabel`.** Eine frühere\n * Fassung bot `secondaryLabel`/`secondaryHref` an, ungeprüft gegen das Mockup. Beide\n * Belege dagegen: erstens zeigt KEINES der 22 `.ep-cta-band`-Vorkommen in\n * `docs/index.html` eine zweite Aktion — der Zwei-Aktionen-Fall hat keine Vorlage.\n * Zweitens (der schwerere Grund) lässt sich eine zweite, optisch zurückhaltendere\n * Aktion mit den vorhandenen Klassen gar nicht bauen: `.btn-{area}.btn-on-band{color:\n * …}` (css/components.css:47–51) überschreibt die Textfarbe JEDER Variante auf den\n * Bereichston — genau den Ton, den die Doku durchgängig als Bandhintergrund nennt.\n * Nur `.btn-filled` tauscht zusätzlich die Füllung gegen Weiß; `.btn-outlined`,\n * `.btn-tonal` und `.btn-text` blieben transparent und zeigten Text in derselben\n * Farbe wie das Band darunter — unsichtbar. Eine zweite Aktion hätte deshalb\n * zwangsläufig dieselbe Optik wie die erste getragen, keine Hierarchie, nur zwei\n * gleich gewichtete Buttons. Das ist eine CSS-Lücke (kein kontrastsicherer\n * sekundärer On-Band-Stil), festgehalten in\n * `.scratch/angular-seitenbausteine/issues/16-css-luecke-zweite-aktion-auf-band.md`\n * — gemeldet, nicht in diesem Wrapper improvisiert. Solange sie besteht, trägt\n * `cds-cta-band` nur eine Aktion; ein Konsument mit echtem Bedarf für eine zweite\n * schreibt sie außerhalb der Komponente ins Band hinein (`<ng-content>` gibt es\n * hier bewusst nicht, um genau das nicht als unterstützten Pfad zu suggerieren).\n * Ohne zweite Aktion braucht es auch keinen eigenen Container: die einzelne Aktion\n * zentriert sich über das ererbte `.ep-cta-band{text-align:center}` von selbst,\n * genau wie in allen 22 Mockup-Vorkommen — ein zusätzliches Flex-Layout im Wrapper\n * hätte eine Darstellung erfunden, die die CSS-Schicht so nicht kennt (ADR-0001;\n * die einzige existierende Deklaration dieser Form ist `.ep-hero-ctas`,\n * css/components.css:1222, eine andere Klasse für einen anderen Bauteiltyp).\n *\n * **Kein `aria-label` auf der Aktion.** Anders als bei `cds-feature`\n * (`ctaAriaLabel`, 11 von 12 Vorkommen mit `aria-label`) zeigt keines der 22\n * Band-Vorkommen einen `aria-label` auf seiner Aktion — ausgezählt, nicht\n * geschätzt. Die sichtbaren Texte sind durchgängig konkrete Verben mit Ziel\n * („Termin buchen“, „Gespräch anfragen“, „Offene Stellen ansehen“ …) und stehen je\n * Seite nur einmal; anders als bei einer Karten-Liste braucht es hier keine\n * Disambiguierung. Kein entsprechender Input.\n */\n@Component({\n selector: 'div[cdsCtaBand]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ep-cta-band',\n },\n template: `\n <h2 class=\"ep-cta-h2\">{{ heading() }}</h2>\n @if (sub()) {\n <p class=\"ep-cta-sub\">{{ sub() }}</p>\n }\n @if (primaryHref()) {\n <a [class]=\"actionClasses()\" [href]=\"primaryHref()\">{{ primaryLabel() }}</a>\n } @else {\n <button [class]=\"actionClasses()\" type=\"button\" (click)=\"primaryClick.emit($event)\">\n {{ primaryLabel() }}\n </button>\n }\n `,\n})\nexport class CtaBandComponent {\n /** Headline (`.ep-cta-h2`) — das konkrete Angebot, keine Marketing-Floskel. */\n readonly heading = input.required<string>();\n /** Beschriftung der (einzigen) Aktion. */\n readonly primaryLabel = input.required<string>();\n /** Unterzeile (`.ep-cta-sub`, leer = keine Unterzeile). */\n readonly sub = input('');\n /** Markenbereich → `.btn-{area}` auf der Aktion (nicht die Bandfläche, siehe Klassendoku). */\n readonly area = input<CdsArea>('co');\n /** Ziel der Aktion; gesetzt → `<a href>`, leer → `<button>` mit `primaryClick`. */\n readonly primaryHref = input('');\n\n /** Klick auf die Aktion (feuert nur, wenn `primaryHref` leer ist). */\n readonly primaryClick = output<MouseEvent>();\n\n /** @internal */\n protected readonly actionClasses = computed(\n () => `btn btn-filled btn-${this.area()} btn-on-band`,\n );\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Tier (`cds-tier`) — Wrapper um `.ep-tier` aus css/components.css\n * (css/components.css:1381–1384): der Stufen-Trenner (Label + Haarlinie), der eine\n * Offene Feature-Liste in Pakete gliedert (z. B. „In jedem Paket enthalten“ /\n * „Zusätzlich mit Pro“, Doku-Sektion `docs/index.html:4880`, Beispielseiten\n * `docs/index.html:11855–11857`, `11883–11885`, `12576–12578`).\n *\n * **Element-Selektor, kein Attribut (ADR-0008-Standardfall).** Ausgezählt: alle 4\n * `.ep-tier`-Vorkommen in `docs/index.html` stehen als eigenständiger `<div>` VOR\n * einem `.layout-grid` oder einer Karten-Reihe, nie als deren Kind — keines trägt\n * eine `col-*`-Spaltenklasse, keines liegt in einem Grid/Flex, das seine Kinder\n * dehnt. Das Tag variiert ebenfalls nicht (immer `<div>`). Keines der drei\n * ADR-0008-Kriterien (Grid-/Flex-Kind, Ziel einer Layout-Klasse, wechselndes Tag)\n * trifft zu, der Element-Selektor bleibt deshalb der Standardfall. `.ep-tier{\n * display:flex}` sitzt direkt auf dem Host (`host: { class: 'ep-tier' }`), kein\n * inneres Wrapper-Element darunter — anders als bei `cds-section` (ADR-0008 Fall 2)\n * ist hier nichts von außen auf eine bestimmte DOM-Tiefe angewiesen: kein\n * Nachfahren-Selektor zielt auf `.ep-tier`, keine Fläche hängt am Host.\n *\n * **`area` ist auf `'ki'` typisiert, nicht auf `CdsArea`.** `css/components.css:1383`\n * kennt nur die eine Regel `.ep-tier-label[data-area=\"ki\"]` (Dark-Override\n * `css/dark-mode.css:476`) — für `co`/`es`/`wo` existiert keine einzige\n * `[data-area]`-Regel auf `.ep-tier-label`, per Grep über `css/*.css` geprüft.\n * Ausgezählt in `docs/index.html`: von 4 `.ep-tier-label`-Vorkommen tragen 3\n * `data-area=\"ki\"` (4880, 11884, 12577), eines trägt gar kein `data-area` (11856),\n * keines der Werte `co`/`es`/`wo` kommt vor. Ein `area`-Input vom Typ `CdsArea`\n * würde für drei von vier gültigen Werten ein `data-area`-Attribut schreiben, das\n * im CSS folgenlos bleibt — die Falle, die genau dann entsteht, wenn eine Eingabe\n * mehr verspricht, als die Stilschicht einlöst. Der Typ ist deshalb auf den einen\n * Wert eingeschränkt, den das CSS tatsächlich kennt; der Compiler verhindert damit\n * strukturell, dass jemand `co`/`es`/`wo` setzt und ein wirkungsloses Attribut\n * bekommt, statt es nur im JSDoc zu behaupten.\n *\n * Verwendungsguidance dieser Gruppe: siehe Card (`komponenten-cards-teaser-card--verwendung`).\n */\n@Component({\n selector: 'cds-tier',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ep-tier',\n },\n template: `\n <span class=\"ep-tier-label\" [attr.data-area]=\"area() || null\">{{ label() }}</span>\n <span class=\"ep-tier-rule\" aria-hidden=\"true\"></span>\n `,\n})\nexport class TierComponent {\n /** Beschriftung des Trenners (`.ep-tier-label`), z. B. „In jedem Paket enthalten“. */\n readonly label = input.required<string>();\n /**\n * Einzige vom CSS unterstützte Tönung → `data-area=\"ki\"` auf `.ep-tier-label`.\n * Ungesetzt (Default) bleibt das Label neutral (`--tx-secondary`), siehe Klassendoku.\n */\n readonly area = input<'ki'>();\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/** Ein Fakten-Paar der Angebots-Rahmendaten (`<dt>`/`<dd>`). */\nexport interface CdsFactsItem {\n /** Label (`<dt>`), z. B. „Dauer“. */\n term: string;\n /** Wert (`<dd>`), z. B. „2 Tage, 9–17 Uhr“. */\n value: string;\n}\n\n/**\n * Facts (`cds-facts`) — Wrapper um `.ep-facts` aus css/components.css\n * (css/components.css:1261–1272): die Definitionsliste für die harten Eckdaten\n * eines Angebots (Termin, Dauer, Ort, Preis), einspaltig mit Haarlinie zwischen\n * den Paaren oder als `.is-grid` zweispaltig für Kästen, die neben Inhalt stehen.\n * Bewusst ohne eigenen Rahmen und ohne Fläche, sie zieht in einen vorhandenen\n * Container ein (Angebots-Box, Sticky-Sidebar) — Doku-Sektion\n * `docs/index.html:9069` (`gt-seminar-fakten`), Beispielseiten `docs/index.html:\n * 9076–9082`, `13718–13726`, `16293–16300`.\n *\n * **Element-Selektor, kein Attribut (ADR-0008-Standardfall).** Ausgezählt: keines\n * der 3 `.ep-facts`-Vorkommen in `docs/index.html` sitzt in einem `.layout-grid`\n * mit `col-*`, keines wird von einem Grid-/Flex-Elternteil in der Höhe gedehnt\n * (der Flex-Fall in Zeile 16290 ist `flex-direction:column`, dort füllen Block-\n * Elemente die Breite ihres Containers unabhängig von einer zusätzlichen\n * Wrapper-Ebene — anders als bei `.ep-card`/ADR-0008 Fall 1 geht es dort um Höhe,\n * die durch Block-Layout NICHT automatisch nach unten durchgereicht wird). Das\n * Tag variiert nicht (immer `<dl>`). Analog zu `cds-faq` (`faq.component.ts`, das\n * intern `<details>` in einem `<div class=\"ep-faq\">` rendert) trägt hier die\n * INNERE `<dl class=\"ep-facts\">` die CSS-Klasse, nicht der `<cds-facts>`-Host: die\n * Semantik einer Definitionsliste hängt am `<dl>`-Tag selbst, ein Custom-Element\n * kann dieses Tag nicht annehmen. Da `.ep-facts > div + div` ausschließlich\n * Nachfahren INNERHALB der eigenen Vorlage anspricht, bricht eine zusätzliche\n * Host-Ebene darüber nichts — anders als bei `cds-section` (Fall 2) hängt hier\n * keine von außen gesetzte Fläche oder ein von außen adressierter Nachfahre an\n * dieser Tiefe.\n *\n * **`<dl>`/`<div>`/`<dt>`/`<dd>` exakt wie vom CSS erwartet.** `.ep-facts > div +\n * div` (css/components.css:1262) setzt Haarlinie und Abstand ab dem ZWEITEN Paar;\n * ohne das umschließende `<div>` pro Paar griffe der Selektor nicht. Jedes\n * `items()`-Element wird deshalb zu genau einem `<div><dt>…</dt><dd>…</dd></div>`.\n *\n * **`area` färbt `<dt>` über `.t-{area}`, nicht über `data-area`.** Anders als bei\n * `cds-feature`/`cds-icon-card` kennt `.ep-facts` selbst kein `[data-area]`; der\n * CSS-Kommentar zu dieser Klasse (`css/components.css:1259`) benennt\n * stattdessen ausdrücklich „Bereichston der Labels über `.t-XX` im Markup\n * (dark-safe), nie als Inline-Farbe“ als sanktionierten Weg. Ausgezählt: alle 3\n * `.ep-facts`-Vorkommen in `docs/index.html` setzen `.t-wo` auf JEDEM `<dt>`\n * derselben Liste (nie gemischt, nie eine andere Bereichsfarbe) — ein optionaler\n * `area`-Input, der `.t-{area}` einheitlich auf alle `<dt>` der Instanz anwendet,\n * bildet dieses Muster nach, ohne einen Farbwert zu erfinden (`.t-XX` ist eine\n * bestehende, bereits kontrast- und dark-mode-geprüfte Utility, `css/components.css\n * :638–642`). Ungesetzt (Default) bleibt `<dt>` ohne zusätzliche Klasse, erbt also\n * die umgebende Textfarbe — das deckt Kontexte ohne Bereichsbindung ab.\n *\n * **Über die Ticket-API hinaus:** `area` stand nicht in der ursprünglichen\n * API-Skizze von Ticket 08. Ergänzt, weil ohne ihn KEINES der 3 realen\n * `.ep-facts`-Vorkommen originalgetreu nachgebaut werden könnte — anders als bei\n * `cds-tier`s `area` (dort deckt die Einschränkung eine tatsächliche CSS-Lücke\n * ab) fehlt hier keine CSS-Regel, nur ein API-Hook auf eine bereits vollständige\n * Klasse. Siehe Ticket-Bericht für die Abwägung.\n */\n@Component({\n selector: 'cds-facts',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <dl class=\"ep-facts\" [class.is-grid]=\"grid()\">\n @for (item of items(); track $index) {\n <div>\n <dt [class]=\"area() ? 't-' + area() : null\">{{ item.term }}</dt>\n <dd>{{ item.value }}</dd>\n </div>\n }\n </dl>\n `,\n})\nexport class FactsComponent {\n /** Fakten-Paare (`<dt>`/`<dd>`), in Darstellungsreihenfolge. */\n readonly items = input.required<CdsFactsItem[]>();\n /** Zweispaltige Rasterung ohne Haarlinien (`.is-grid`) statt der einspaltigen Grundform. */\n readonly grid = input(false);\n /** Markenbereich → `.t-{area}` auf jedem `<dt>` (siehe Klassendoku). Ungesetzt = neutral. */\n readonly area = input<CdsArea>();\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * Table (`cds-table`) — Wrapper um `.tbl`/`.tbl-wrap` aus css/components.css\n * (css/components.css:1462–1480): die Datentabelle der Doku-Site (`sec-table`,\n * Nav-Einträge „Standard“ und „Gestreift“). Ausgezählt: außerhalb von `sec-table`\n * selbst kommt `.tbl-wrap` nur zweimal vor, beide auf Beitragsseiten\n * (`docs/index.html:8622`, `15080`) — keine der 24 Beispielseiten außerhalb von\n * Wissensbeiträgen setzt aktuell eine Tabelle ein. Neuntes Ticket der\n * Seitenbausteine-Serie.\n *\n * **Kein Daten-Input.** Eine `columns`/`rows`-API würde Zellinhalte auf Strings\n * festlegen; die Beispielseiten setzen darin Badges, Links und `data-num`\n * (`docs/index.html:5076–5177`). Der Konsument projiziert `<thead>`/`<tbody>`/\n * `<tfoot>` unverändert per `<ng-content>`, die Komponente liefert nur die\n * Hülle: `.tbl-wrap`, `.tbl`, `<caption>` und die Striped-Klasse.\n *\n * **`caption` ist Pflicht (`input.required<string>()`), abweichend von der\n * Ticket-Skizze (dort `caption? = ''`).** Die eigene Doku dieser Komponente\n * (`storybook-angular/src/docs/komponenten/tabelle.mdx:137`) nennt `<caption>`\n * ausdrücklich „Pflicht, Screenreader lesen den Titel vor, bevor die Zellen\n * vorgelesen werden“ und wiederholt das in den Dos (`tabelle.mdx:147`:\n * „`<caption>` und `scope`-Attribute immer setzen, auch bei einfachen\n * Tabellen“). Ausgezählt: alle 5 realen `.tbl`-Vorkommen in `docs/index.html`\n * haben eine `<caption>`, ausnahmslos. Ein optionaler Input mit Default `''`\n * hätte genau den Fall erlaubt, den die eigene Doku verbietet — nach\n * ADR-0007 §2 ist `caption` damit Inhalt, nicht Beiwerk: ohne sie ist eine\n * `cds-table` eine Tabelle, die die eigenen Barrierefreiheitsregeln bricht,\n * also sinnlos. Ein vergessenes Binding wirft jetzt `NG0950`, statt eine\n * unbeschriftete Tabelle still auszuliefern.\n *\n * **Element-Selektor, `.tbl-wrap`/`.tbl` sitzen im eigenen Template, nicht am\n * Host (ADR-0008-Standardfall, analog zu `cds-facts`/`cds-faq`).** Ausgezählt:\n * alle 5 `.tbl-wrap`-Vorkommen in `docs/index.html` (Zeilen 5061, 5116, 5236,\n * 8622, 15080). Keines ist selbst ein direktes Grid-/Flex-Kind — das einzige\n * Vorkommen in einem `.layout-grid` (Zeile 5236) sitzt eine Ebene tiefer in\n * einem `.col-8`, das seinerseits der Grid-Child ist; `.tbl-wrap` ist dort ein\n * gewöhnlicher Block-Nachfahre, dessen Breite vom umschließenden `.col-8`\n * kommt, nicht von `align-items:stretch` auf einer bestimmten DOM-Tiefe (kein\n * `.ep-card`-Fall). Keines trägt eine `col-*`-Klasse selbst, keines variiert\n * das Tag (immer `<div class=\"tbl-wrap\">`). Ein `<cds-table>`-Host ohne eigene\n * Klasse und ohne eigenes `background` gerät deshalb nicht in den „Fläche am\n * Host“-Fall aus ADR-0008 Fall 2: die Komponente setzt nichts auf dem Host,\n * das eine eigene Box bräuchte, `.tbl-wrap` bleibt ein normaler Block-Nachfahre\n * unabhängig vom `display` des `<cds-table>`-Hosts (derselbe Grund, warum\n * `cds-facts`/`cds-faq` als Element-Selektor funktionieren).\n *\n * Eine Attributselektor-Variante direkt am `<table>` (`table[cdsTable]`, analog\n * zu `cdsSection`) wurde erwogen und verworfen: `<table>` ist als Tag ohnehin\n * fix (kein Tag-Wechsel wie bei `cdsIconCard`), aber `.tbl-wrap` bräuchte dann\n * ein ZWEITES Element, das der Konsument von Hand um die Tabelle schreiben\n * müsste (`<div class=\"tbl-wrap\" tabindex=\"0\" role=\"region\" aria-label=\"…\">\n * <table cdsTable>…`) — genau die beiden Aufgaben, die laut Ticket am ehesten\n * vergessen werden (fokussierbarer, benannter Scroll-Container), blieben dann\n * beim Konsumenten statt bei der Komponente. Der Element-Selektor hält Wrap und\n * Tabelle zusammen in einem Template.\n *\n * **Geprüft im laufenden Storybook (Story „Interaktiv“, Play-Funktion):**\n * `<table class=\"tbl\">` liegt direkt unter `<div class=\"tbl-wrap\">`, `<caption>`\n * ist ihr erstes Kind, danach folgen ohne zusätzlichen Knoten dazwischen genau\n * die projizierten `<thead>`/`<tbody>`-Elemente — `<ng-content>` fügt selbst\n * kein DOM-Element ein, es verschiebt nur die vom Konsumenten geschriebenen\n * nativen Elemente an ihre Stelle. Damit bleibt die Tabellenstruktur (`<table>`\n * → `<caption>` + `<thead>` + `<tbody>` + optional `<tfoot>`, keine fremde\n * Ebene dazwischen) exakt so gültig wie im rohen Markup.\n *\n * **`.tbl-wrap` ist immer fokussierbar UND immer benannt.** Das CSS gibt dem\n * Scroll-Container einen eigenen `:focus-visible`-Ring\n * (css/components.css:1463) — ein scrollbarer Bereich muss per Tastatur\n * erreichbar sein (WCAG 2.1.1), `tabindex=\"0\"` steht deshalb fest im Template.\n * `role=\"region\"` braucht laut HTML-AAM einen zugänglichen Namen, sonst bekäme\n * der Bereich keine Landmark-Rolle — weil `caption` jetzt Pflicht ist, kann\n * `accessibleName()` (`scrollLabel() || caption()`) nicht mehr leer werden,\n * `role`/`aria-label` sind deshalb unbedingt gesetzt, kein Nullfall mehr zu\n * behandeln. `scrollLabel` bleibt eine optionale Überschreibung (Vorrang vor\n * `caption`) für Fälle, in denen der sichtbare Tabellentitel für den\n * Scroll-Container zu lang oder zu unspezifisch wäre.\n *\n * **`.tbl-sort` bleibt außen vor.** Die Klasse existiert\n * (css/components.css:1477–1482), die Sortierlogik nicht — kein zugehöriges\n * JS in `docs/main.js` für die Beispielseiten. Ein Wrapper, der nur den\n * Button-Look lieferte, täuschte Funktion vor, die es nicht gibt. Siehe\n * `.scratch/angular-seitenbausteine/issues/19-fehlende-sortierlogik-tbl-sort.md`.\n */\n@Component({\n selector: 'cds-table',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"tbl-wrap\" tabindex=\"0\" role=\"region\" [attr.aria-label]=\"accessibleName()\">\n <table class=\"tbl\" [class.tbl--striped]=\"striped()\">\n <caption>\n {{\n caption()\n }}\n </caption>\n <ng-content></ng-content>\n </table>\n </div>\n `,\n})\nexport class TableComponent {\n /** Überschrift der Tabelle (`<caption>`, erstes Kind) — Pflicht, siehe Klassendoku. */\n readonly caption = input.required<string>();\n /** Alternierende Zeilenfarbe für Tabellen mit vielen Zeilen (`.tbl--striped`). */\n readonly striped = input(false);\n /**\n * Zugänglicher Name des Scroll-Containers (`aria-label` auf `.tbl-wrap`), hat\n * Vorrang vor `caption`. Leer = `caption` wird zum Namen (siehe Klassendoku).\n */\n readonly scrollLabel = input('');\n\n /**\n * Name des Scroll-Containers: `scrollLabel` hat Vorrang, sonst `caption` —\n * dank Pflicht-`caption` nie leer (siehe Klassendoku).\n *\n * @internal\n */\n protected readonly accessibleName = computed(() => this.scrollLabel() || this.caption());\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\n\n/** Eine Vergleichsspalte (Paket/Tarif) der Vergleichstabelle. */\nexport interface CdsCompareColumn {\n /** Spaltenüberschrift, z. B. „Core“ oder „Pro“. */\n label: string;\n /** Hervorgehobene Spalte (`.ep-compare-pro`), z. B. das empfohlene Paket. */\n pro?: boolean;\n}\n\n/** Eine Vergleichszeile: das verglichene Merkmal plus eine Zelle je Spalte. */\nexport interface CdsCompareRow {\n /** Zeilenüberschrift (`<th scope=\"row\">`), das verglichene Merkmal. */\n label: string;\n /**\n * Eine Zelle je Eintrag in `columns`, in derselben Reihenfolge. `boolean` → Ja/Nein-Glyphe\n * (`.ep-compare-yes`/`-no`) mit Screenreader-Text, `string` → die kurze Angabe als Text\n * (z. B. „bis 70 Mrd. Param.“).\n */\n cells: (boolean | string)[];\n}\n\n/**\n * Compare (`cds-compare`) — Wrapper um `.ep-compare*` aus css/components.css\n * (css/components.css:1275–1294): die aufklappbare Vergleichstabelle für den zeilenweisen\n * Direktvergleich mehrerer Pakete/Tarife (Doku-Site `sec-table`, Nav-Eintrag\n * „Vergleichstabelle (aufklappbar)“, `docs/index.html:5182–5204`). Zehntes Ticket der\n * Seitenbausteine-Serie, nach `cds-table` (Ticket 09).\n *\n * **Mit Daten-Input, anders als `cds-table`.** `cds-table` projiziert `<thead>`/`<tbody>`\n * unverändert per `<ng-content>`, weil seine Zellen Badges, Links und `data-num` tragen können\n * (siehe dessen Klassendoku). Hier ist der Zellinhalt strukturell auf Ja/Nein oder eine kurze\n * Angabe begrenzt — ausgezählt: alle 22 Datenzellen des einzigen realen Vorkommens\n * (`docs/index.html:11970–12038`, 11 Zeilen × 2 Spalten, ohne die Zeilenüberschriften) sind\n * entweder ein `.ep-compare-yes`/`-no`-Marker (18×, davon 14× „Ja“, 4× „Nein“) oder ein kurzer\n * Text wie „bis 70 Mrd. Param.“ bzw. „30 Min.“ (4×) — nie ein Badge, Link oder anderes Markup.\n * Weil Spaltenzahl, `pro`-Spalte und Zellinhalt damit vollständig aus zwei Arrays (`columns`,\n * `rows`) hervorgehen, würde `<ng-content>` beim Konsumenten nur denselben `@for`-Code\n * duplizieren, ohne eine Freiheit zu gewinnen, die die Zell-Typisierung (`boolean | string`)\n * ohnehin ausschließt.\n *\n * **Ja/Nein-Zellen tragen einen Screenreader-Text, übernommen statt erfunden.** Im einzigen\n * realen Vorkommen steht hinter jeder Glyphe ein `.sr-only`-Text, ausnahmslos:\n * `<span class=\"ep-compare-yes\" aria-hidden=\"true\">✓</span><span class=\"sr-only\">Enthalten</span>`\n * (14×) bzw. `<span class=\"ep-compare-no\" aria-hidden=\"true\">−</span><span class=\"sr-only\">Nicht\n * enthalten</span>` (4×, „−“ ist U+2212 Minus, kein Bindestrich). Genau diese Zeichen und dieser\n * Wortlaut, keine eigene Formulierung — Farbe und Glyphe allein tragen keine Bedeutung\n * (WCAG 1.4.1), der `.sr-only`-Text ist deshalb kein optionaler Zusatz, sondern fest verdrahtet,\n * nicht per Input überschreibbar.\n *\n * **`caption` ist Pflicht (`input.required<string>()`), abweichend von der Ticket-Skizze (dort\n * kein Input dafür vorgesehen) — dieselbe Begründung wie bei `cds-table`.** Die eigene Doku\n * (`storybook-angular/src/docs/komponenten/tabelle.mdx:91`) nennt `<caption class=\"sr-only\">`\n * ausdrücklich als Teil des Bauteils, und das einzige reale Vorkommen hat eine. Anders als bei\n * `cds-table` ist sie hier `.sr-only`, nicht sichtbar: der Klartext steht schon im `<summary>`\n * (`summary`-Input), die `<caption>` wiederholt ihn nur für Screenreader, die nach dem Aufklappen\n * direkt in die Tabelle springen, ohne den Summary-Text erneut vorgelesen zu bekommen.\n *\n * **`rowsLabel` (erste Kopfzelle, `<th scope=\"col\">Funktion</th>` im Mockup) ist dagegen Beiwerk,\n * optional mit Default `''`.** Auch dafür sieht die Ticket-Skizze keinen Input vor. Den Text fest\n * im Template zu verdrahten hieße, AI.Box-Copy in einen wiederverwendbaren Wrapper zu backen\n * (ADR-0007 §2); ihn ganz wegzulassen wich ohne CSS-Befund vom einzigen Beleg ab, ohne dass die\n * Doku das verlangt. Anders als `caption` ist die Kopfzelle nicht barrierefreiheitsrelevant\n * Pflicht: ein leeres `<th scope=\"col\">` bleibt eine gültige, in Vergleichsmatrizen verbreitete\n * Ecke ohne eigenen Namen. Deshalb Beiwerk, kein Inhalt — das Beispielwort „Funktion“ steht in\n * der Story, nicht in der Klasse.\n *\n * **Natives `<details>`/`<summary>` bleibt erhalten, kein nachgebautes Disclosure** (Ticket-\n * Vorgabe, analog `cds-faq`): Tastaturbedienung und Toggle-Verhalten kommen vom Browser, das CSS\n * hängt direkt an `[open]` (`.ep-compare[open] .ep-compare-caret`). `<details class=\"ep-compare\">`\n * sitzt deshalb im TEMPLATE, nicht am Host — derselbe Grund wie bei `cds-table`s\n * `.tbl-wrap`/`.tbl`: ein `<cds-compare>`-Host ist ein unbekanntes Custom Element, kein echtes\n * `<details>`, und kann dessen native Disclosure-Semantik nicht annehmen.\n *\n * **Element-Selektor (ADR-0008-Standardfall).** `.ep-compare` sitzt im einzigen realen Vorkommen\n * als gewöhnlicher Block-Nachfahre in `.ep-section` (`docs/index.html:11969`) — kein Grid-/\n * Flex-Kind, keine `col-*`-Klasse vom Konsumenten, kein Tag-Wechsel (immer `<details>`). Keines\n * der drei ADR-0008-Kriterien greift, ein Attributselektor brächte hier nichts.\n *\n * **`open` ist ein reiner Anfangszustand, keine Zwei-Wege-Bindung.** Gebunden über\n * `[attr.open]=\"open() ? '' : null\"`: Angular schreibt das Attribut nur, wenn sich der GEPRÜFTE\n * Ausdruckswert seit dem letzten Change-Detection-Lauf ändert. `open()` bleibt nach dem ersten\n * Rendern konstant (die Komponente schreibt nie in dieses Signal zurück), ein nachfolgender\n * nativer Toggle wird deshalb nicht rückgängig gemacht — geprüft in der Story „Interaktiv“\n * (Play-Funktion: Klick öffnet, `toggled` feuert `true`, ein zweiter, vom Toggle unabhängiger\n * Interaktionsschritt lässt die Tabelle weiterhin offen).\n *\n * Verwendungsguidance dieser Gruppe: siehe Tabelle (`komponenten-tabelle-tabelle--verwendung`).\n */\n@Component({\n selector: 'cds-compare',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <details class=\"ep-compare\" [attr.open]=\"open() ? '' : null\" (toggle)=\"onToggle($event)\">\n <summary class=\"ep-compare-summary\">\n {{ summary() }}\n <svg\n class=\"ep-compare-caret\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m19.5 8.25-7.5 7.5-7.5-7.5\" />\n </svg>\n </summary>\n <div class=\"ep-compare-table-wrap\">\n <table class=\"ep-compare-table\">\n <caption class=\"sr-only\">\n {{\n caption()\n }}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ rowsLabel() }}</th>\n @for (column of columns(); track $index) {\n <th scope=\"col\" [class.ep-compare-pro]=\"column.pro\">{{ column.label }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows(); track $index) {\n <tr>\n <th scope=\"row\">{{ row.label }}</th>\n @for (cell of row.cells; track $index) {\n <td [class.ep-compare-pro]=\"columns()[$index].pro\">\n @if (cell === true) {\n <span class=\"ep-compare-yes\" aria-hidden=\"true\">✓</span\n ><span class=\"sr-only\">Enthalten</span>\n } @else if (cell === false) {\n <span class=\"ep-compare-no\" aria-hidden=\"true\">−</span\n ><span class=\"sr-only\">Nicht enthalten</span>\n } @else {\n {{ cell }}\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </details>\n `,\n})\nexport class CompareComponent {\n /** Text im `<summary>`, z. B. „Alle Funktionen vergleichen“. */\n readonly summary = input.required<string>();\n /** `<caption class=\"sr-only\">` der Tabelle — Pflicht, siehe Klassendoku. */\n readonly caption = input.required<string>();\n /** Überschrift der ersten Spalte (Zeilentitel, z. B. „Funktion“) — Beiwerk, siehe Klassendoku. */\n readonly rowsLabel = input('');\n /** Anfangszustand des `<details>` — reine Vorbelegung, siehe Klassendoku. */\n readonly open = input(false);\n /** Vergleichsspalten (Pakete/Tarife), in Render-Reihenfolge. */\n readonly columns = input.required<CdsCompareColumn[]>();\n /** Vergleichszeilen; `cells` hat je Zeile genau einen Eintrag pro Spalte in `columns`. */\n readonly rows = input.required<CdsCompareRow[]>();\n\n /** Feuert bei jedem Auf- oder Zuklappen mit dem neuen Zustand. */\n readonly toggled = output<boolean>();\n\n /** @internal */\n protected onToggle(event: Event): void {\n this.toggled.emit((event.target as HTMLDetailsElement).open);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/** Größenvarianten von `cds-avatar` (`.article-avatar` / `-lg` / `-xl`). */\nexport type CdsAvatarSize = 'sm' | 'lg' | 'xl';\n\n/**\n * Avatar (`div[cdsAvatar]`) — Wrapper um `.article-avatar` aus css/components.css\n * (css/components.css:1520–1536): der Initialen-/Foto-Kreis im Meta-Strip eines\n * Wissensbeitrags (`.article-meta-author`), in der Author-Card (`-lg`) und im\n * Team-Tile-Grid (`-xl`). Elftes Ticket der Seitenbausteine-Serie.\n *\n * **Attributselektor (ADR-0008), gemessen an der Geschwister-Kette.** Ausgezählt in\n * `docs/index.html`: 8 der 11 Instanzen der Grundgröße sitzen als direkte, adjazente\n * Geschwister in einer von 3 `.article-avatar-stack`-Kacheln (2 Avatare in Zeilen\n * 8343–8344, je 3 in Zeilen 8373–8375 und 8404–8406) — genau dort greift\n * `.article-avatar-stack .article-avatar + .article-avatar`\n * (css/components.css:1540–1541), eine Geschwister-Kette (Kriterium `spec.md` 2b).\n * Ein Element-Selektor `cds-avatar`, der `.article-avatar` auf einem INNEREN Element\n * rendert (wie `cds-facts` es mit `<dl>` tut, weil `<dl>` ein Custom Element nicht\n * annehmen kann), würde diese Kette brechen: die beiden `.article-avatar`-Knoten\n * lägen dann je eine Ebene UNTER ihrem eigenen `<cds-avatar>`-Host und wären keine\n * Geschwister mehr — `+` verlangt denselben Elternknoten, egal wie dicht die Hosts\n * selbst nebeneinanderstehen. Eine zweite, ebenfalls tragfähige Variante\n * (Element-Selektor MIT `host: { class: 'article-avatar' }`, ohne innere\n * Wrapper-Ebene) hätte dieselbe Geschwister-Kette ebenso erfüllt — verworfen zugunsten\n * des Attributselektors nur wegen des zweiten, unabhängigen Grundes unten, nicht weil\n * sie die Kette nicht gelöst hätte.\n *\n * **Gemessen, nicht nur hergeleitet.** Story „Avatar-Stapel“ (Play-Funktion) rendert\n * drei `div[cdsAvatar]` in einem `cds-avatar-stack` und misst\n * `getBoundingClientRect()` der drei `.article-avatar`-Knoten: bei 40 px Kachelbreite\n * und `margin-left:-12px` (css/components.css:1541) überlappen der zweite und dritte\n * Kreis den jeweils vorherigen um 12 px (Differenz der `left`-Koordinaten = 28 px,\n * nicht 40 px) — plus Screenshot-Baseline (`visual-snapshots/…avatar-stapel.png`) als\n * visuelle Bestätigung, nicht nur die Zahl.\n *\n * **Zweiter, unabhängiger Grund: Wiederverwendung als Projektions-Selektor.**\n * `cds-article-header` projiziert den Avatar über\n * `<ng-content select=\"[cdsAvatar]\">` (siehe dessen Klassendoku) — dasselbe Attribut,\n * das hier den Host selektiert, dient dem Elternteil zugleich als\n * Content-Projection-Selektor. Ein Element-Selektor bräuchte dafür eine zusätzliche,\n * eigens erfundene Marker-Klasse; der Attributselektor liefert die Zielscheibe für\n * beide Zwecke aus einer Hand, ohne dass der Konsument zwei Attribute schreiben muss.\n *\n * **Initialen werden aus `name` abgeleitet, kein eigener Input** (Ticket-Vorgabe):\n * erstes Zeichen des ersten und des letzten durch Whitespace getrennten Worts, groß\n * — ein einzelnes Wort liefert dessen erste zwei Zeichen. Zwei Inputs für dieselbe\n * Information (Name UND Initialen) könnten auseinanderlaufen, sobald nur eines\n * gepflegt wird.\n *\n * **`aria-hidden=\"true\"` fest verdrahtet, kein Input.** Ausgezählt: von 53\n * `.article-avatar`-Instanzen (11 Grundgröße + 17 `-lg` + 25 `-xl`) tragen 45 das\n * Attribut direkt am Element; die restlichen 8 sind genau die Grundgrößen-Avatare\n * INNERHALB von `.article-avatar-stack`, wo bereits der Stack-Container selbst\n * `aria-hidden=\"true\"` trägt (siehe `AvatarStackComponent`) — dort wäre ein zweites\n * `aria-hidden` am Kind redundant, aber unschädlich: verschachteltes `aria-hidden`\n * ändert nichts am Ergebnis, der Teilbaum ist so oder so für Assistenztechnologie\n * unsichtbar. Der Avatar trägt es deshalb immer: 100 % Deckung mit dem Mockup im\n * Alleinstand, harmlose Redundanz im Stapel.\n */\n@Component({\n selector: 'div[cdsAvatar]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'article-avatar',\n '[class.article-avatar-lg]': \"size() === 'lg'\",\n '[class.article-avatar-xl]': \"size() === 'xl'\",\n '[attr.data-area]': 'area() || null',\n 'aria-hidden': 'true',\n },\n template: `\n @if (src()) {\n <img [src]=\"src()\" [alt]=\"name()\" />\n } @else {\n {{ initials() }}\n }\n `,\n})\nexport class AvatarComponent {\n /** Voller Name — Quelle der Initialen und des Bild-`alt`-Texts. */\n readonly name = input.required<string>();\n /** Größe (`.article-avatar` = sm, `-lg`, `-xl`). */\n readonly size = input<CdsAvatarSize>('sm');\n /** Markenbereich → `data-area` (Füllfarbe der Initialen-Kachel). */\n readonly area = input<CdsArea>();\n /** Bildquelle; gesetzt → `<img>` ersetzt die Initialen. */\n readonly src = input('');\n\n /**\n * Erstes Zeichen des ersten und letzten Worts aus `name`, groß — bei einem\n * einzelnen Wort dessen erste zwei Zeichen.\n *\n * @internal\n */\n protected readonly initials = computed(() => {\n const parts = this.name().trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase();\n return (parts[0]![0] + parts[parts.length - 1]![0]).toUpperCase();\n });\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * AvatarStack (`cds-avatar-stack`) — Wrapper um `.article-avatar-stack` aus\n * css/components.css (css/components.css:1538–1545): mehrere `div[cdsAvatar]`\n * überlappend für Mehrfach-Autor:innen im Meta-Strip, mit optionalem\n * „+N“-Indikator (`.article-avatar-more`) ab vier Personen (siehe\n * `wissensbeitrag.mdx`, Abschnitt „Mehrere Autor:innen“).\n *\n * **Element-Selektor, ADR-0008-Standardfall.** `.article-avatar-stack` ist selbst\n * nie Grid-/Flex-Kind mit Stretch-Bedarf — sein einziger reale Elternkontext,\n * `.article-meta-author`, ist `display:flex;align-items:center` (center, nicht\n * stretch, css/components.css:1514), variiert nicht das Tag und ist selbst nie Teil\n * einer `+`-Kette (nur SEINE Kinder sind das, siehe `AvatarComponent`). Die Klasse\n * darf deshalb direkt am `<cds-avatar-stack>`-Host sitzen.\n *\n * **`<ng-content>` fügt kein eigenes Element ein**, die projizierten\n * `div[cdsAvatar]` bleiben deshalb direkte, adjazente Geschwister des optionalen\n * `.article-avatar-more`-Kreises — Voraussetzung für\n * `.article-avatar-stack .article-avatar + .article-avatar-more`\n * (css/components.css:1541).\n *\n * **`aria-hidden=\"true\"` fest verdrahtet.** Ausgezählt: alle 3 realen\n * `.article-avatar-stack`-Vorkommen (`docs/index.html:8342,8372,8403`) tragen es —\n * dieselbe Begründung wie in `wissensbeitrag.mdx` („Barrierefreiheit“): Namen stehen\n * vollständig als Text in `.article-meta-name`, der Stapel selbst trägt keine eigene\n * Information, der „+N“-Kreis ebenfalls nicht (die Restzahl steht redundant im\n * Namenstext, siehe Story).\n */\n@Component({\n selector: 'cds-avatar-stack',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'article-avatar-stack', 'aria-hidden': 'true' },\n template: `\n <ng-content></ng-content>\n @if (more() > 0) {\n <div class=\"article-avatar-more\">+{{ more() }}</div>\n }\n `,\n})\nexport class AvatarStackComponent {\n /** Restzahl für den „+N“-Kreis (`.article-avatar-more`); 0 = kein Indikator. */\n readonly more = input(0);\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { CdsArea } from '../area';\nimport { PillComponent } from '../pill/pill.component';\n\n/** Ein Eintrag der Breadcrumb-Leiste (`.article-breadcrumb`). */\nexport interface CdsArticleBreadcrumbItem {\n /** Sichtbarer Text. */\n label: string;\n /** Linkziel. Am letzten Eintrag wirkungslos, siehe Klassendoku. */\n href?: string;\n}\n\n/**\n * ArticleHeader (`cds-article-header`) — Wrapper um `.article-header` aus\n * css/components.css (css/components.css:1486–1490, 1508–1519): der zentrierte Kopf\n * eines Wissensbeitrags (Breadcrumb, optionale Pill, H1, Lead, Meta-Strip). Elftes\n * Ticket der Seitenbausteine-Serie. Hauptvorlage ist\n * `storybook-angular/src/docs/seitenmuster/wissensbeitrag.mdx`, Abschnitt „Article\n * Header“ — dort steht das für dieses Ticket verbindliche Markup samt Begründung,\n * nicht nur das Mockup in `docs/index.html`.\n *\n * **Breadcrumb sitzt im Header — abweichend von der allgemeinen Navigationsregel,\n * bewusst der Ticket-Vorlage folgend.** `docs/index.html:2423` dokumentiert für\n * Unterseiten allgemein, wörtlich: „Den Breadcrumb nicht in einen zentrierten\n * `.article-header` einbetten, sonst wird er mittig ausgerichtet und bekommt einen\n * abweichenden Abstand zur Nav“ (Tabellenzeile „Nicht“ der Breadcrumb-Doku) — und\n * ausgezählt\n * sind es genau die beiden EINZIGEN vollständigen Beispielseiten mit\n * `.article-header` (Stellenanzeige `docs/index.html:11035`, Wissensbeitrag · KI\n * `docs/index.html:15020`), die dieser Regel folgen: beide setzen den Breadcrumb in\n * eine EIGENE, linksbündige `.ep-section` VOR dem Header (`docs/index.html:\n * 11023–11031` bzw. `15010–15015`). Dem stehen 6 ISOLIERTE Doku-Demos gegenüber, die\n * den Breadcrumb INNERHALB von `.article-header` zeigen: 5 kleine Referenz-Boxen in\n * der Doku-Sektion selbst (`docs/index.html:7850`, `8304`, `8331`, `8361`, `8392` —\n * ohne Topnav/Hero/Footer, reine Bauteil-Illustrationen) plus das Code-Beispiel in\n * `wissensbeitrag.mdx`. Das Ticket benennt genau diese Doku (nicht die\n * Beispielseiten) als Hauptvorlage. Diese Komponente folgt der Ticket-Vorgabe\n * (Breadcrumb als Input, im Header) und dokumentiert den Widerspruch als eigenen\n * Befund\n * (`.scratch/angular-seitenbausteine/issues/20-breadcrumb-in-oder-vor-article-header.md`).\n * Konsumenten, die der allgemeinen Regel folgen wollen (wie die beiden echten\n * Beispielseiten), lassen `breadcrumb` leer und setzen die Leiste selbst davor\n * (siehe Story „Ohne Breadcrumb“).\n *\n * **Letzter Breadcrumb-Eintrag immer ohne Link, mit `aria-current=\"page\"`** — so vom\n * Ticket als Akzeptanzkriterium gefordert. Die beiden Wissensbeitrag-Inline-Beispiele\n * (`docs/index.html:7850–7856`, `wissensbeitrag.mdx`) zeigen dafür nur 2 Einträge,\n * BEIDE als `<a>`, ohne `aria-current` — eine zur Kürze vereinfachte Doku-Skizze,\n * kein vollständiges Barrierefreiheits-Beispiel. Das volle, korrekte Muster (Trenner\n * dekorativ, letzter Eintrag `<span aria-current=\"page\">` ohne Link) steht an\n * anderer Stelle exakt so vor (`docs/index.html:2406–2412` allgemeine\n * Breadcrumb-Doku, `docs/index.html:11023–11030` Stellenanzeige) und ist zusätzlich\n * eine explizite Akzeptanzbedingung des Tickets — die Komponente folgt deshalb\n * diesem Muster für den letzten Array-Eintrag, unabhängig von einem dort eventuell\n * gesetzten `href`.\n *\n * **Keine bereichsgefärbte Breadcrumb-Verlinkung (`.t-{area}`).** Die\n * Inline-Beispiele färben ihren zweiten (dort letzten) Eintrag mit `.t-ki`/`.t-es`/\n * `.t-wo`; das Ticket sieht dafür aber kein API-Feld vor (`{label, href?}`, kein\n * `area` pro Eintrag), und eine Zuordnung „Bereichsfarbe auf den vorletzten\n * Eintrag“ wäre geraten, nicht aus der Doku ableitbar — zumal der gefärbte Eintrag\n * dort ein Link ist, kein `aria-current`-Element, also nicht deckungsgleich mit dem\n * oben umgesetzten Muster. Bleibt bewusst außen vor.\n *\n * **Pill über `cds-pill`, kein direkt komponiertes `<span class=\"pill\">`.** Geprüft\n * per `npx storybook tools docs show --id komponenten-chips-badges-pills-pill`:\n * `PillComponent`s Host ist `<cds-pill>`, `.pill` sitzt eine Ebene darunter auf\n * einem inneren `<span>` (anders als bei `FeaturedCardComponent`, wo genau das wegen\n * `.card-featured-body>.pill`-Kindselektoren nicht ginge). `.article-header`/`.pill`\n * haben keinen solchen Kindselektor (css/components.css:1486–1507 geprüft) — die\n * zusätzliche Ebene ist hier folgenlos, deshalb bleibt `cds-pill` als echte\n * Komponente eingesetzt, keine Klassen-Duplikation nötig.\n *\n * **Pille rendert nur, wenn `area` UND `pill` gesetzt sind — kein erfundener\n * Default.** `PillComponent.area` ist als `CdsArea` mit einem eigenen Default\n * (`'ki'`) typisiert; diese Komponente führt `area` dagegen als `CdsArea | undefined`\n * (keine Konfigurations-Vorgabe laut Ticket-API). Ein erster Entwurf reichte\n * `area()` per `as CdsArea`-Cast durch, damit ein `undefined`-Binding\n * `cds-pill`s eigenen Default überschreiben kann — eine Typ-Lüge, um einen Fall\n * abzudecken, der beim Nachzählen gar nicht vorkommt: **alle 9** `.pill`-Vorkommen\n * im Article-Header-Kontext (`docs/index.html:7856, 7912–7914, 8310, 8337, 8367,\n * 8398, 15021`) tragen ein `data-area`, keines ohne Bereich. Die Pille rendert\n * deshalb nur innerhalb von `@if (area(); as pillArea)` (narrowt `CdsArea |\n * undefined` sauber auf `CdsArea`, ohne Cast) — ist `pill()` gesetzt, `area()`\n * aber nicht, bleibt die Pille schlicht weg, statt eine geratene Bereichsfarbe zu\n * zeigen. Gepinnt in der Story „Pille ohne Bereich“.\n *\n * **`pillAriaLabel`, wie bei `FeaturedCardComponent`.** `PillComponent`s eigener\n * Default („Bereich `<label>`“) passt nur, wenn die Pille einen Bereichsnamen trägt\n * (Stellenanzeige, `docs/index.html:11036`: „Bereich Effektive Software“). Im\n * Wissensbeitrag trägt die Pille dagegen die Lesezeit (`wissensbeitrag.mdx`,\n * Abschnitt „Pill · Lesezeit“: `aria-label=\"Lesezeit 8 Minuten\"`) — ein Text, den\n * die Komponente nicht zuverlässig aus einem freien `pill`-String wie\n * „8 min Lesezeit“ herleiten kann (keine Zahl zu parsen, keine Garantie, dass der\n * Text überhaupt eine Lesezeit ist). `pillAriaLabel` bleibt deshalb optional, ohne\n * eigenen Default: ungesetzt geht `undefined` direkt an `cds-pill`s `ariaLabel`\n * durch, das dann auf seinen eigenen Default („Bereich `<pill>`“) zurückfällt —\n * keine Logik-Duplikation nötig, weil hier die echte `PillComponent` verwendet\n * wird, keine Klassen-Nachbildung.\n *\n * **`date`/`dateLabel` getrennt, ANDERS als `cds-stoerer`.** `cds-stoerer`\n * formatiert ein reines ISO-Datum selbst nach `de-DE`\n * (`stoerer.component.ts:formattedDate`, inkl. manuellem Aufbau der\n * `Date`-Komponenten gegen den UTC-Mitternacht-Fallstrick von `new Date(iso)`).\n * Diese Komponente tut das NICHT: `date` liefert nur den maschinenlesbaren\n * `datetime`-Wert, `dateLabel` die sichtbare Schreibweise — vom Ticket ausdrücklich\n * als zwei getrennte Inputs vorgegeben. Begründung der Abweichung: Erstens deckt\n * sich das mit jeder realen Instanz (6 von 6 `.article-meta-date`-Vorkommen tragen\n * einen redaktionell gesetzten Text wie „13. Mai 2026“, keinen von\n * `Intl.DateTimeFormat` erzeugten) — anders als der Störer, dessen Kacheln NUR ein\n * ISO-Datum ohne separaten Text führen. Zweitens umgeht die Trennung den\n * Zeitzonen-Fallstrick vollständig, statt ihn zu beheben: ohne eigene Formatierung\n * konstruiert diese Komponente nie ein `Date`-Objekt aus `date()`, die\n * UTC-Mitternacht-Falle kann hier gar nicht erst auftreten. Ist `dateLabel` leer,\n * zeigt die Komponente `date()` unverändert als sichtbaren Text (bewusst als\n * ISO-Form, nicht geraten formatiert) — in der Story „Interaktiv“ als Warnfall extra\n * benannt, damit niemand das versehentlich auf eine Produktionsseite bringt.\n *\n * **Meta-Strip nur, wenn es etwas zu zeigen gibt.** `authorName`/`date` sind laut\n * Ticket-API Beiwerk (Default `''`); ausgezählt haben alle 6 realen\n * `.article-meta`-Vorkommen sowohl Autor als auch Datum, eine Stellenanzeige\n * (`docs/index.html:11035`) nutzt `.article-header` dagegen KOMPLETT OHNE\n * `.article-meta` (dort ein `<dl>` aus Job-Fakten statt Autor/Datum) — dieser\n * abweichenden Verwendung folgt diese Komponente nicht (sie hat in der Ticket-API\n * keinen Platz), sie belegt aber, dass ein leerer Meta-Strip ein realer Fall ist.\n * `.article-meta` (und darin `.article-meta-author`/`.article-meta-sep`) rendern\n * deshalb nur, wenn `authorName()` bzw. `date()` tatsächlich etwas liefern; der\n * Trenner nur, wenn beide Seiten vorhanden sind.\n *\n * **Avatar projiziert über `[cdsAvatar]`, PLUS `cds-avatar-stack`.** Die\n * Ticket-Skizze nennt nur `<ng-content select=\"[cdsAvatar]\">`; ergänzt um den\n * Tag-Selektor `cds-avatar-stack`, weil `AvatarStackComponent` (siehe dort) ein\n * Element-Selektor ist, kein `[cdsAvatar]`-Attribut trägt und sonst nicht in den\n * Meta-Strip projiziert werden könnte — nötig für die vom Ticket geforderte Story\n * „Mehrere Autor:innen“.\n *\n * **Host als Block.** `.article-header` sitzt am Host und setzt nur\n * `max-width:880px;margin:0 auto`. An einem unbekannten, also `display:inline`\n * gerenderten Element greift beides nicht, die Block-Kinder liefen über die\n * 880 px hinaus. `:host{display:block}` wie bei `cds-hero-image` und\n * `cds-footer-main`; Story „Breite begrenzt“ pinnt das.\n */\n@Component({\n selector: 'cds-article-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [PillComponent],\n host: { class: 'article-header' },\n styles: [':host{display:block}'],\n template: `\n @if (breadcrumb().length) {\n <nav class=\"article-breadcrumb\" aria-label=\"Breadcrumb\">\n @for (item of breadcrumb(); track $index; let last = $last) {\n @if (last) {\n <span aria-current=\"page\">{{ item.label }}</span>\n } @else {\n @if (item.href) {\n <a [href]=\"item.href\">{{ item.label }}</a>\n } @else {\n <span>{{ item.label }}</span>\n }\n <span class=\"article-breadcrumb-sep\" aria-hidden=\"true\">/</span>\n }\n }\n </nav>\n }\n @if (area(); as pillArea) {\n @if (pill()) {\n <cds-pill [label]=\"pill()\" [area]=\"pillArea\" [ariaLabel]=\"pillAriaLabel()\" />\n }\n }\n <h1 class=\"article-title\">{{ title() }}</h1>\n @if (lead()) {\n <p class=\"article-lead\">{{ lead() }}</p>\n }\n @if (hasAuthor() || hasDate()) {\n <div class=\"article-meta\">\n @if (hasAuthor()) {\n <div class=\"article-meta-author\">\n <ng-content select=\"[cdsAvatar], cds-avatar-stack\"></ng-content>\n <div class=\"article-meta-text\">\n <p class=\"article-meta-name\">{{ authorName() }}</p>\n @if (authorRole()) {\n <p class=\"article-meta-role\">{{ authorRole() }}</p>\n }\n </div>\n </div>\n }\n @if (hasAuthor() && hasDate()) {\n <span class=\"article-meta-sep\" aria-hidden=\"true\"></span>\n }\n @if (hasDate()) {\n <time class=\"article-meta-date\" [attr.datetime]=\"date()\">{{\n dateLabel() || date()\n }}</time>\n }\n </div>\n }\n `,\n})\nexport class ArticleHeaderComponent {\n /** Titel (`.article-title`, `<h1>`). */\n readonly title = input.required<string>();\n /** Anreißer unter dem Titel (`.article-lead`), leer = kein Lead. */\n readonly lead = input('');\n /** Breadcrumb-Pfad; letzter Eintrag rendert ohne Link mit `aria-current=\"page\"`. */\n readonly breadcrumb = input<CdsArticleBreadcrumbItem[]>([]);\n /** Pille über dem Titel (`.pill`, via `cds-pill`), leer = keine Pille. */\n readonly pill = input('');\n /** `aria-label` der Pille überschreiben, siehe Klassendoku. */\n readonly pillAriaLabel = input<string>();\n /** Markenbereich → `data-area` der Pille; ungesetzt = keine Pille (siehe Klassendoku). */\n readonly area = input<CdsArea>();\n /** Name im Meta-Strip (`.article-meta-name`), leer = kein Meta-Strip-Autorblock. */\n readonly authorName = input('');\n /** Rolle im Meta-Strip (`.article-meta-role`), leer = keine Rollenzeile. */\n readonly authorRole = input('');\n /** ISO-Datum (`JJJJ-MM-TT`) → `<time datetime>`, leer = kein Datum. */\n readonly date = input('');\n /** Sichtbare Schreibweise des Datums; leer = `date` steht unverändert sichtbar. */\n readonly dateLabel = input('');\n\n /** @internal */\n protected readonly hasAuthor = computed(() => !!this.authorName());\n /** @internal */\n protected readonly hasDate = computed(() => !!this.date());\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** Ein Eintrag des Inhaltsverzeichnisses (`.article-toc-list li`). */\nexport interface CdsArticleTocItem {\n /** Sichtbarer Linktext, i. d. R. die Überschrift des Abschnitts. */\n label: string;\n /** Sprungziel, i. d. R. der Anker der zugehörigen `<h2>` im Article Body. */\n href: string;\n}\n\n/**\n * ArticleToc (`cds-article-toc`) — Wrapper um `.article-toc*` aus css/components.css\n * (css/components.css:1577–1589): das aufklappbare Inhaltsverzeichnis am Anfang eines\n * Wissensbeitrags. Zwölftes Ticket der Seitenbausteine-Serie („Artikel-Körper“).\n * Ausgezählt: genau 2 reale Vorkommen, beide mit 5 Einträgen und identischem\n * sichtbarem Text „Inhalt“ plus identischem `aria-label`\n * (`docs/index.html:7948–7960`, Doku-Sektion mit Platzhalter-Hrefs `#gt-article-toc`;\n * `docs/index.html:15049–15061`, reale Beispielseite Wissensbeitrag · KI mit echten\n * Abschnittsankern wie `#wb-ki-demo`).\n *\n * **Element-Selektor, ADR-0008-Standardfall.** `.article-toc` sitzt in beiden\n * Vorkommen als gewöhnlicher Block-Nachfahre direkt in `.article-body`\n * (`docs/index.html:7950`, `15051` je eine Ebene über dem `<details>`) — kein\n * Grid-/Flex-Kind, keine Layout-Klasse (`col-*`) vom Konsumenten, kein\n * Geschwister-Kombinator (`.article-toc` kommt in keiner CSS-Regel mit `+`/`~`\n * vor), kein Tag-Wechsel (immer `<details>`). Keines der drei ADR-0008-Kriterien\n * greift; ein Attributselektor brächte hier nichts. Die einzige direkte\n * Kind-Regel von `.article-body` (`.article-body > p`, css/components.css:1566)\n * zielt auf `p`, nicht auf `details` — ein `<cds-article-toc>`-Host zwischen\n * `.article-body` und dem `<details>` bricht deshalb keine Selektorkette.\n *\n * **Natives `<details>`/`<summary>`, kein nachgebautes Disclosure** (Ticket-Vorgabe,\n * Akzeptanzkriterium): Tastaturbedienung (Enter/Space auf `<summary>`) und\n * Toggle-Zustand kommen vollständig vom Browser, das CSS hängt direkt an `[open]`\n * (`.article-toc[open] .article-toc-caret`, css/components.css:1583). `<details\n * class=\"article-toc\">` sitzt deshalb im TEMPLATE, nicht am Host — derselbe Grund\n * wie bei `cds-compare`s `<details class=\"ep-compare\">` (`compare.component.ts`):\n * ein `<cds-article-toc>`-Host ist ein unbekanntes Custom Element und kann native\n * Disclosure-Semantik nicht annehmen.\n *\n * **Zweites Vorkommen des `<details>`-mit-drehendem-Caret-Musters, nicht\n * zusammengezogen mit `cds-compare` (ADR-0007 §5).** Beide Bauteile teilen die\n * Form (natives `<details>`, SVG-Caret, `[open]`-Rotation über\n * `transition:transform`), aber nicht die Aufgabe: `cds-compare` trägt eine\n * Vergleichstabelle mit `columns`/`rows`/`toggled`-Output, dieses Bauteil trägt\n * eine reine Link-Liste ohne Output (siehe API-Vorgabe des Tickets, die für dieses\n * Bauteil bewusst keinen `toggled` vorsieht). Zwei gleiche Stellen sind ein\n * Zufall, kein Muster — eine gemeinsame Basisklasse für zwei Vorkommen hätte nur\n * das `<details>`+Caret-Skelett gebündelt und dabei entweder Verhalten\n * vereinheitlicht (ein erzwungener `toggled`-Output ohne Zweck hier) oder so viel\n * parametrisiert, dass nichts gewonnen wäre.\n *\n * **`aria-label` am `<summary>` ist fest verdrahtet, kein Input.** Ausgezählt:\n * beide realen Vorkommen tragen wortgleich\n * `aria-label=\"Inhaltsverzeichnis ein- und ausklappen\"` — der sichtbare Text\n * „Inhalt“ (`summary`-Input) allein wäre außerhalb des Beitragskontexts nicht\n * eindeutig, das `aria-label` schreibt deshalb aus, was das Element tut. Genau\n * dieser Wortlaut aus dem Mockup übernommen, kein erfundener zugänglicher Name.\n *\n * **Keine Nummerierung im Markup.** Die sichtbaren Ziffern vor jedem Eintrag\n * kommen aus `counter(toc)` auf `.article-toc-list li::before`\n * (css/components.css:1586), nicht aus dem `<ol>`-Default (`list-style:none` setzt\n * ihn zurück) — die Komponente muss dafür nichts weiter tun als `<ol\n * class=\"article-toc-list\">` zu rendern.\n */\n@Component({\n selector: 'cds-article-toc',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <details class=\"article-toc\" [attr.open]=\"open() ? '' : null\">\n <summary class=\"article-toc-summary\" aria-label=\"Inhaltsverzeichnis ein- und ausklappen\">\n <span>{{ summary() }}</span>\n <svg\n class=\"article-toc-caret\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n aria-hidden=\"true\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m19.5 8.25-7.5 7.5-7.5-7.5\" />\n </svg>\n </summary>\n <ol class=\"article-toc-list\">\n @for (item of items(); track $index) {\n <li>\n <a [href]=\"item.href\">{{ item.label }}</a>\n </li>\n }\n </ol>\n </details>\n `,\n})\nexport class ArticleTocComponent {\n /** Sichtbarer Text im `<summary>`, z. B. „Inhalt“. */\n readonly summary = input('Inhalt');\n /** Anfangszustand des `<details>` — reine Vorbelegung, kein Zwei-Wege-Zustand. */\n readonly open = input(false);\n /** Abschnitte des Beitrags, in Anzeige-Reihenfolge. */\n readonly items = input.required<CdsArticleTocItem[]>();\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n// Modulweiter Zähler → eindeutige id für die Eyebrow (aria-labelledby), analog zum Muster in\n// section.component.ts / area-tabs.component.ts / scale.component.ts.\nlet uid = 0;\n\n/**\n * ArticleCallout (`cds-article-callout`) — Wrapper um `.article-callout*` aus\n * css/components.css (css/components.css:1591–1600): der bereichsgetönte\n * Aside-Block für Praxis-Beispiele und „In der Realität“-Einschübe im Lauftext\n * eines Wissensbeitrags. Zwölftes Ticket der Seitenbausteine-Serie\n * („Artikel-Körper“). Ausgezählt: 5 reale Vorkommen, je eines pro Bereich in der\n * Doku-Sektion (`docs/index.html:8086–8115`, co/ki/es/wo) plus eines in der realen\n * Beispielseite Wissensbeitrag · KI (`docs/index.html:15110–15114`).\n *\n * **Element-Selektor, ADR-0008-Standardfall.** `.article-callout` sitzt in allen 5\n * Vorkommen als gewöhnlicher Block-Nachfahre — die 4 Doku-Boxen je in einem\n * schlichten `<div>` innerhalb eines `display:flex;flex-direction:column`-Stapels\n * (kein Stretch-Bedarf in Spaltenrichtung), die reale Instanz direkt in\n * `.article-body`. Keines ist ein Grid-/Flex-Kind mit Streckungsbedarf, keines\n * trägt eine `col-*`-Klasse, `.article-callout` kommt in keiner CSS-Regel mit\n * einem Geschwister-Kombinator (`+`/`~`) vor, das Tag variiert nicht (immer\n * `<aside>`). Keines der drei ADR-0008-Kriterien greift. Die einzige direkte\n * Kind-Regel von `.article-body` (`.article-body > p`, css/components.css:1566)\n * zielt auf `p`, nicht auf `aside` — ein `<cds-article-callout>`-Host zwischen\n * `.article-body` und dem `<aside>` bricht deshalb keine Selektorkette.\n *\n * **Projizierte Absätze bleiben direkte Kinder von `.article-callout`, kein\n * `<div>` um `<ng-content>`** (Ticket-Vorgabe: `.article-callout > p` ist ein\n * Kindselektor, css/components.css:1600). `<ng-content>` selbst fügt kein\n * DOM-Element ein — es verschiebt nur die vom Konsumenten geschriebenen\n * `<p>`-Elemente an ihre Stelle direkt im `<aside>`, eine Ebene unter dem\n * `<cds-article-callout>`-Host, aber ohne zusätzlichen Knoten dazwischen. Geprüft\n * im laufenden Storybook (Story „Interaktiv“, Play-Funktion):\n * `aside.article-callout > p` liefert sowohl die Eyebrow als auch jeden\n * projizierten Absatz, `:scope > *` zählt keine fremde Zwischenebene.\n *\n * **`eyebrow` ist Beiwerk (Default `''`), `area` ist Konfiguration mit\n * verteidigbarer Vorgabe (`'co'`).** Die Basisregel `.article-callout` selbst\n * (ohne `[data-area]`) rendert bereits exakt wie `[data-area=\"co\"]`\n * (`background:var(--co-50)`, `border-left-color:var(--co-500)`, beide Werte\n * identisch an beiden Stellen, css/components.css:1591–1592) — `'co'` ist damit\n * keine erfundene Markenfarbe, sondern der reale CSS-Fallback ohne Attribut.\n * Anders als bei `cds-pill` (dessen `.pill` ohne `data-area` gar keine Füllfarbe\n * hat) gibt es hier keinen sinnvollen „kein Bereich“-Zustand.\n *\n * **Bekannter CSS-Befund, nicht im Wrapper geflickt (ADR-0001):**\n * `.article-callout-eyebrow` (Spezifität 0,1,0) verliert gegen\n * `.article-callout > p` (Spezifität 0,1,1, css/components.css:1600), weil die\n * Eyebrow selbst ein `<p>` UND ein direktes Kind von `.article-callout` ist.\n * Gemessen in rohem Markup ohne Angular (Playwright/Chromium,\n * `getComputedStyle`): die Eyebrow rendert in JEDEM Bereich mit `font-size:16px`\n * statt `12px` und `margin-bottom:0` statt `4px`; die Akzentfarbe geht zusätzlich\n * verloren, wenn kein bereichsspezifischer Override existiert (`co` und „kein\n * `data-area`“ zeigen `--tx-primary` statt `--co-700`). Diese Komponente\n * reproduziert exakt die Klassen und die Struktur des Mockups und zeigt deshalb\n * denselben, vorbestehenden Fehler wie rohes HTML — siehe\n * `.scratch/angular-seitenbausteine/issues/22-css-luecke-callout-eyebrow-spezifitaet.md`.\n *\n * **`aria-labelledby` auf `<aside>`, sobald `eyebrow` gesetzt ist — Zusatz zum\n * Mockup, keine CSS-Änderung.** `<aside>` hat implizit die Landmark-Rolle\n * `complementary`; ein Wissensbeitrag mit mehr als einem Callout hat damit\n * mehrere gleichnamige Landmarks ohne zugänglichen Namen. Gemessen mit\n * axe-core an rohem Markup ohne Angular (zwei `<aside class=\"article-callout\">`\n * ohne Auszeichnung): `landmark-unique` schlägt fehl, unabhängig von dieser\n * Komponente — das Mockup selbst kennt diese Auszeichnung nicht (siehe\n * `.scratch/angular-seitenbausteine/issues/23-doku-luecke-callout-landmark-label.md`).\n * Die Eyebrow ist bereits ein prägnanter, vom Redakteur gepflegter Kurztext\n * genau für diesen Zweck (z. B. „In der Praxis“) — sie bekommt deshalb eine\n * generierte `id`, auf die `aria-labelledby` zeigt, sobald sie existiert. Ohne\n * Eyebrow bleibt das `<aside>` unbenannt wie im Mockup: ein zugänglicher Name\n * ließe sich sonst nur aus dem projizierten Absatztext raten, und das wäre eine\n * erfundene Bezeichnung, keine reale.\n */\n@Component({\n selector: 'cds-article-callout',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <aside\n class=\"article-callout\"\n [attr.data-area]=\"area() || null\"\n [attr.aria-labelledby]=\"eyebrowId()\"\n >\n @if (eyebrow(); as eyebrowText) {\n <p class=\"article-callout-eyebrow\" [id]=\"eyebrowId()\">{{ eyebrowText }}</p>\n }\n <ng-content></ng-content>\n </aside>\n `,\n})\nexport class ArticleCalloutComponent {\n private readonly instanceId = `cds-article-callout-${uid++}`;\n\n /** Kicker über dem Absatztext (`.article-callout-eyebrow`), leer = keine Eyebrow. */\n readonly eyebrow = input('');\n /** Markenbereich → `data-area` (Hintergrund + Akzentfarbe), siehe Klassendoku. */\n readonly area = input<CdsArea>('co');\n\n /**\n * `id` der Eyebrow für `aria-labelledby`, nur wenn eine Eyebrow existiert —\n * siehe Klassendoku.\n *\n * @internal\n */\n protected readonly eyebrowId = computed(() =>\n this.eyebrow() ? `${this.instanceId}-eyebrow` : null,\n );\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * ArticleFigure (`cds-article-figure`) — Wrapper um `.article-figure`/\n * `.article-figcaption` aus css/components.css (css/components.css:1573–1575):\n * das redaktionelle Inline-Bild mit optionaler Bildunterschrift im Lauftext eines\n * Wissensbeitrags. Zwölftes Ticket der Seitenbausteine-Serie („Artikel-Körper“).\n * Ausgezählt: 3 reale Vorkommen — Doku-Demo mit Caption\n * (`docs/index.html:8028–8031`), reales Body-Bild mit Caption in der Beispielseite\n * Wissensbeitrag · KI (`docs/index.html:15115–15118`, identischer Bild- und\n * Caption-Text wie die Doku-Demo) und ein dritter, captionsloser Sonderfall direkt\n * unter dem Article Header derselben Beispielseite (`docs/index.html:15040–15042`,\n * dazu unten mehr).\n *\n * **Element-Selektor, ADR-0008-Standardfall.** In allen 3 Vorkommen sitzt\n * `.article-figure` als gewöhnlicher Block-Nachfahre (zwei in `.article-body`,\n * eines direkt in einer eigenen `.ep-section`) — kein Grid-/Flex-Kind, keine\n * `col-*`-Klasse vom Konsumenten, kein Tag-Wechsel (immer `<figure>`), kein\n * Vorkommen von `.article-figure` mit einem Geschwister-Kombinator in\n * css/components.css. Die einzige direkte Kind-Regel von `.article-body`\n * (`.article-body > p`, css/components.css:1566) zielt auf `p`, nicht auf\n * `figure` — ein `<cds-article-figure>`-Host zwischen `.article-body` und dem\n * `<figure>` bricht deshalb keine Selektorkette.\n *\n * **`loading=\"lazy\"` ist fest verdrahtet, kein Input — bewusst NUR der\n * In-Article-Fall, nicht der dritte Mockup-Beleg.** Ausgezählt tragen 2 der 3\n * Vorkommen `loading=\"lazy\"` (die beiden Bilder MIT Caption, mittig im\n * Lauftext, „below the fold“ — genau der in `wissensbeitrag.mdx`, Abschnitt\n * „In-Article Figure“, dokumentierte Dos-Punkt). Das dritte Vorkommen\n * (`docs/index.html:15040–15042`) trägt stattdessen `loading=\"eager\"\n * fetchpriority=\"high\"` UND hat keine Caption — es ist das erste Bild direkt\n * unter dem Article Header (Kommentar im Mockup: „Hero-Bild auf Body-Breite …\n * identisches Bild wie Vorschaubild für Wiedererkennung“), sitzt außerhalb von\n * `.article-body` und bekommt seine 720-px-Breite über ein\n * Inline-`style=\"max-width:720px;margin:0 auto\"` am Konsumenten, nicht über die\n * Komponente (Randbedingung 6 der Spec: Mockup-Inline-Styles wandern nicht in\n * den Wrapper). Die Ticket-API sieht dafür kein `loading`/`fetchpriority`-Input\n * vor; dieses Bauteil deckt deshalb den (häufigeren, dokumentierten) In-Body-Fall\n * ab. Für den Lead-Bild-Sonderfall bleibt `<figure class=\"article-figure\">` roh\n * schreibbar oder — sofern die Semantik passt — `cds-hero-image` (Ticket 02) zu\n * prüfen.\n *\n * **`alt` und `caption` sind bewusst getrennte Pflicht-/Beiwerk-Inputs, keine\n * Prüfung auf inhaltliche Überschneidung.** `wissensbeitrag.mdx` dokumentiert die\n * beiden Rollen ausdrücklich als unterschiedliche Jobs\n * (Dont: „Alt-Text und Caption inhaltlich identisch, Screenreader liest\n * doppelt“) — Vorgabe an den Konsumenten, nicht etwas, das eine Wrapper-Komponente\n * zur Laufzeit sinnvoll erzwingen könnte.\n */\n@Component({\n selector: 'cds-article-figure',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <figure class=\"article-figure\">\n <img [src]=\"src()\" [alt]=\"alt()\" loading=\"lazy\" />\n @if (caption()) {\n <figcaption class=\"article-figcaption\">{{ caption() }}</figcaption>\n }\n </figure>\n `,\n})\nexport class ArticleFigureComponent {\n /** Bildquelle. */\n readonly src = input.required<string>();\n /** Faktische Bildbeschreibung für Screenreader, siehe Klassendoku. */\n readonly alt = input.required<string>();\n /** Redaktionelle Bildunterschrift (`.article-figcaption`), leer = keine Caption. */\n readonly caption = input('');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { CdsArea } from '../area';\n\n/**\n * ArticlePullquote (`cds-article-pullquote`) — Wrapper um `.article-pullquote` aus\n * css/components.css (css/components.css:1608–1612): die typografische\n * Hervorhebung eines Satzes aus dem eigenen Lauftext eines Wissensbeitrags.\n * Zwölftes Ticket der Seitenbausteine-Serie („Artikel-Körper“). Ausgezählt: 2\n * reale Vorkommen, wortgleich, beide `data-area=\"ki\"` — Doku-Demo\n * (`docs/index.html:8136`) und reale Beispielseite Wissensbeitrag · KI\n * (`docs/index.html:15075`).\n *\n * **Nicht `cds-blockquote` (`BlockquoteComponent`, `.bq`) — Ticket-Vorgabe, im\n * JSDoc beider Bauteile wechselseitig abgegrenzt.** Pull-Quote und Blockquote\n * teilen die typografische Familie (Serif, bereichsgefärbter Linksakzent in\n * `{area}-500`), aber nicht den Zweck, dokumentiert in `wissensbeitrag.mdx`,\n * Abschnitt „Pull-Quote gegen Blockquote“:\n *\n * | | Pull-Quote (dieses Bauteil) | Blockquote (`cds-blockquote`) |\n * |---|---|---|\n * | Wessen Stimme? | Der Beitrag zitiert sich selbst — ein Schlüsselsatz aus dem eigenen Lauftext | Eine dritte, benannte Person (Kund:in, Forschungsstimme, Branchen-Statement) |\n * | Attribution | Keine (`quote` ist der einzige Input) | Pflicht (`name`, `roleLabel`) |\n * | Hintergrund/Icon | Keiner — `quotes:none`, kein Quote-Icon, bewusst „offen“ statt umrahmt | Getönte Akzent-Box (`--bq-bg`) mit Quote-Icon (`.bq-icon`) |\n * | Tag | `<blockquote class=\"article-pullquote\">` direkt, kein umschließendes `<figure>` | `<figure class=\"bq\">` außen, `<blockquote>` (ohne eigene Klasse) innen für den Zitattext |\n *\n * Ein Self-Quote im eigenen Beitrag (Blockquote-Optik auf einem Satz des\n * Autors) wirkt sonst absurd — der Autor zitiert die Person, die den Beitrag\n * schreibt. Wer eine externe Stimme mit Namen und Rolle zeigen will, verwendet\n * `cds-blockquote`.\n *\n * **`quote` enthält die deutschen Anführungszeichen bereits als Teil des Texts,\n * die Komponente ergänzt keine.** `.article-pullquote{quotes:none}`\n * (css/components.css:1608) — es gibt keine `content:open-quote`/`close-quote`-Regel\n * in der CSS-Schicht, weder hier noch bei `.bq blockquote` oder\n * `.testimonial blockquote`. Ausgezählt stehen die Anführungszeichen in BEIDEN\n * realen Vorkommen als literale Zeichen im Text\n * („KI scheitert selten an der Technologie. …“), nicht CSS-generiert. Wie bei\n * `cds-compare`/`cds-table` ist Copy-Text Sache des Konsumenten (ADR-0007 §2) —\n * die Story liefert deshalb `quote` bereits mit „…“ (CONTRIBUTING.md §6), die\n * Komponente rendert den String unverändert, ohne eigene Anführungszeichen zu\n * erfinden.\n *\n * **Element-Selektor, ADR-0008-Standardfall.** `.article-pullquote` sitzt in\n * beiden Vorkommen als gewöhnlicher Block-Nachfahre in `.article-body` — kein\n * Grid-/Flex-Kind, keine `col-*`-Klasse vom Konsumenten, kein\n * Geschwister-Kombinator in css/components.css, kein Tag-Wechsel (immer\n * `<blockquote>`). Die einzige direkte Kind-Regel von `.article-body`\n * (`.article-body > p`, css/components.css:1566) zielt auf `p`, nicht auf\n * `blockquote` — ein `<cds-article-pullquote>`-Host zwischen `.article-body` und\n * dem `<blockquote>` bricht deshalb keine Selektorkette.\n *\n * **`area` ist Konfiguration mit verteidigbarer Vorgabe (`'co'`), keine\n * erfundene Bereichsfarbe.** Die Basisregel `.article-pullquote` selbst (ohne\n * `[data-area]`) setzt bereits exakt denselben Wert wie `[data-area=\"co\"]`\n * (`border-left-color:var(--co-500)`, css/components.css:1608–1609) — `'co'` ist\n * damit der reale CSS-Fallback ohne Attribut, nicht geraten.\n */\n@Component({\n selector: 'cds-article-pullquote',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<blockquote class=\"article-pullquote\" [attr.data-area]=\"area() || null\">\n {{ quote() }}\n </blockquote>`,\n})\nexport class ArticlePullquoteComponent {\n /** Hervorgehobener Satz, inklusive deutscher Anführungszeichen, siehe Klassendoku. */\n readonly quote = input.required<string>();\n /** Markenbereich → `data-area` (Linksakzent), siehe Klassendoku. */\n readonly area = input<CdsArea>('co');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * AuthorCard (`div[cdsAuthorCard]`) — Wrapper um `.author-card` aus css/components.css\n * (css/components.css:1602–1606): der Avatar-plus-Bio-Strip am Ende eines\n * Wissensbeitrags, einzeln oder mehrfach in `cds-author-card-group`. Dreizehntes und\n * letztes Ticket der Seitenbausteine-Serie. Ausgezählt: 17 reale Vorkommen in\n * `docs/index.html` — 4 einzelstehend (2 Doku-Demos `docs/index.html:8193,8207`, 1\n * Artikel-Demo `8424`, 1 reale Beispielseite `15179`) und 13 in fünf Gruppen (siehe\n * `AuthorCardGroupComponent`).\n *\n * **Attributselektor (ADR-0008), gemessen im `is-grid`-Fall statt nur hergeleitet.**\n * `.author-card-group.is-grid` (css/components.css:1555) ist `display:grid` ohne\n * eigenes `align-items` — der CSS-Default `stretch` gleicht die Kartenhöhen einer\n * Reihe deshalb NUR aus, wenn `.author-card` selbst das Grid-Kind ist. Spike-Story\n * (zwei Karten, 600-px-Raster, kurze gegen deutlich längere Bio, seither wieder\n * gelöscht) hat beide Varianten nebeneinander gebaut und mit `getBoundingClientRect()`\n * gemessen:\n *\n * | Variante | Grid-Kind (Tag) | `.author-card`-Höhen | Bio-Rect (kurz / lang) |\n * |---|---|---|---|\n * | Element-Selektor `<cds-author-card-naive>` | `CDS-AUTHOR-CARD-NAIVE`, 204/204 px (gestreckt) | **84 / 204 px** (ungleich) | 24×73 / 144×200 px |\n * | Attributselektor `div[cdsAuthorCardSpike]` | `DIV.author-card`, 204/204 px | **204 / 204 px** (gleich) | — |\n *\n * Beim Element-Selektor wird der UNSICHTBARE `<cds-author-card-naive>`-Host auf 204 px\n * gestreckt, die sichtbare `.author-card`-Box eine Ebene darunter bleibt bei ihrer\n * Inhaltshöhe (84 px) — exakt der Fehler aus ADR-0008 Fall 1. Mit dem Attributselektor\n * IST `.author-card` das Grid-Kind, `align-items:stretch` trifft direkt zu.\n *\n * **Ehrlicher Zusatz, anders als bei `cds-icon-card`: die Baseline-Screenshots beider\n * Spike-Varianten waren byte-identisch** (`sha1` gleich). `.author-card` trägt (anders\n * als `.ep-card`) weder Hintergrund noch Rahmen noch Schatten — der zusätzliche,\n * unsichtbare Leerraum unter der kurzen Bio malt in keiner der beiden Varianten ein\n * Pixel. Der Fehler ist damit heute rein strukturell (falsches Boxmodell, `getBoundingClientRect()`\n * auf `.author-card` lügt), nicht optisch sichtbar. Er wird real, sobald `.author-card`\n * künftig einen Rahmen/Hintergrund/Hover-Zustand bekommt, und er verfälscht schon\n * heute jede Messung/Positionierung, die sich auf die tatsächliche Kartenhöhe verlässt\n * (u. a. die Story „Als Raster“ unten, die genau das pinnt). Das ADR-0008-Kriterium\n * ist strukturell formuliert („die Stelle im DOM einnehmen, die es ohne Angular\n * einnähme“), nicht optisch — der Attributselektor bleibt deshalb die richtige Wahl,\n * obwohl der Effekt heute unsichtbar ist.\n *\n * **`area` ist bewusst NICHT Teil der API — CSS-Befund, nicht erfundene Konfiguration.**\n * Alle 17 realen `.author-card`-Vorkommen tragen `data-area`, und sowohl\n * `docs/index.html:8185` als auch `wissensbeitrag.mdx:199` behaupten wörtlich, das\n * färbe „nur den Avatar“. Ausgezählt gibt es aber in `css/components.css` (Light UND\n * Dark) KEINE einzige `.author-card[data-area=\"…\"]`-Regel — weder direkt noch über\n * einen Nachfahren-Selektor auf `.article-avatar`, dessen eigene\n * `[data-area]`-Färbung (css/components.css:1523–1526) ein Element-Selektor auf dem\n * Avatar selbst ist, unabhängig vom Vorfahren. `data-area` auf `.author-card` ist\n * damit, gegen die Doku-Aussage, komplett wirkungslos — die Bereichsfarbe kommt\n * ausschließlich vom `area`-Input, den der Konsument direkt an das projizierte\n * `[cdsAvatar]` bindet (siehe unten). Ein `area`-Input, der hier nur `data-area` ohne\n * jede CSS-Wirkung setzt, wäre eine erfundene Konfiguration ohne Gegenwert — Befund\n * gemeldet, nicht im Wrapper geflickt (ADR-0001):\n * `.scratch/angular-seitenbausteine/issues/24-css-luecke-author-card-data-area.md`.\n *\n * **Avatar projiziert über `[cdsAvatar]`, wie bei `cds-article-header`.** Der\n * Konsument setzt Größe (`size=\"lg\"`, css/components.css:1527) und Bereich\n * (`area=\"…\"`) direkt am projizierten `<div cdsAvatar>` — diese Komponente reicht\n * nichts durch, exakt die Trennung, die `cds-article-header` bereits etabliert\n * (siehe dessen Klassendoku, Abschnitt „Avatar projiziert über `[cdsAvatar]`“).\n *\n * **Eyebrow als `<h3>`, nur wenn gesetzt** (Beiwerk, Default `''`) — deckungsgleich\n * mit allen 4 einzelstehenden realen Vorkommen: 2 tragen `<h3 class=\"author-card-eyebrow\">`\n * (`docs/index.html:8196,8427`, „Über den Autor“/„Über die Autorin“, Ticket-Vorgabe:\n * eine Ebene unter dem `<h2>` des Article-Body), die anderen 2 (Doku-Demos ohne\n * umgebende Artikelstruktur) haben gar keinen. Innerhalb einer Gruppe trägt laut\n * `wissensbeitrag.mdx` („Eyebrow-Konvention“) keine einzelne Karte mehr einen eigenen\n * Eyebrow — die Gruppen-Überschrift ersetzt sie (siehe `AuthorCardGroupComponent`);\n * Konsumenten lassen `eyebrow` dafür einfach leer.\n *\n * **`roleLabel`, NICHT `role` wie im Ticket-Text — gemessene Abweichung, kein\n * Freihand-Entscheid.** Ein erster Entwurf folgte der Ticket-API wörtlich\n * (`role`-Input, mit `role=\"…\"` als schlichtem Attribut in den Stories gesetzt, wie\n * `name`/`bio`/`eyebrow`). Storybooks eingebauter a11y-Check (`aria-roles`) schlug\n * darauf für JEDE Story mit echtem Rollentext fehl: `role` ist ein globales\n * HTML-/ARIA-Attribut, und ein Angular-Input MIT DIESEM NAMEN wird bei einem\n * ungebundenen `role=\"Senior AI Engineer …\"` zwar als Startwert an den Input\n * durchgereicht, bleibt aber ZUSÄTZLICH als echtes `role`-Attribut im DOM stehen —\n * axe meldete wörtlich „Roles must be one of the valid ARIA roles: Senior, AI,\n * Engineer, …“, weil der Freitext als ARIA-Rolle interpretiert wird. Exakt dieselbe\n * Kollision umgehen `BlockquoteComponent`, `TestimonialComponent` und\n * `TeamVoiceComponent` bereits mit `roleLabel` statt `role`\n * (`grep -rn \"readonly role\" angular-lib/projects/design-system-angular/src/lib/`\n * zeigt nur diese drei). Diese Komponente folgt demselben, bereits etablierten\n * Muster statt die Kollision ein viertes Mal zu wiederholen — CSS-Klasse bleibt\n * unverändert `.author-card-role`, nur der Input-Name weicht vom Ticket-Text ab.\n */\n@Component({\n selector: 'div[cdsAuthorCard]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'author-card' },\n template: `\n <ng-content select=\"[cdsAvatar]\"></ng-content>\n <div>\n @if (eyebrow()) {\n <h3 class=\"author-card-eyebrow\">{{ eyebrow() }}</h3>\n }\n <p class=\"author-card-name\">{{ name() }}</p>\n @if (roleLabel()) {\n <p class=\"author-card-role\">{{ roleLabel() }}</p>\n }\n @if (bio()) {\n <p class=\"author-card-bio\">{{ bio() }}</p>\n }\n </div>\n `,\n})\nexport class AuthorCardComponent {\n /** Name (`.author-card-name`). */\n readonly name = input.required<string>();\n /**\n * Rolle/Position (`.author-card-role`), leer = keine Rollenzeile. Heißt bewusst\n * `roleLabel`, nicht `role` (Kollision mit dem ARIA-Attribut `role`), siehe\n * Klassendoku.\n */\n readonly roleLabel = input('');\n /** Bio-Text (`.author-card-bio`), leer = kein Bio-Absatz. */\n readonly bio = input('');\n /** Kicker über dem Namen (`.author-card-eyebrow`, `<h3>`), leer = keine Eyebrow. */\n readonly eyebrow = input('');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * AuthorCardGroup (`cds-author-card-group`) — Wrapper um `.author-card-group` aus\n * css/components.css (css/components.css:1547–1563): bündelt mehrere `[cdsAuthorCard]`\n * am Ende eines Wissensbeitrags, gestapelt (Default) oder als zweispaltiges Raster\n * (`is-grid`, css/components.css:1555). Dreizehntes und letztes Ticket der\n * Seitenbausteine-Serie. Ausgezählt: 5 reale Gruppen — 2 gestapelt in der\n * Artikel-Demo (`docs/index.html:8440,8465`, je 2 bzw. 3 Karten), 2 `is-grid`\n * (Doku-Demo `9112`, reale Beispielseite Scrum-Training `13811`, je 4 Karten) und 0\n * `is-grid`-Vorkommen im Wissensbeitrag selbst — `wissensbeitrag.mdx` verweist für\n * `is-grid` ausdrücklich auf `Seitenmuster/Seminar · Training`, „weil sie dort und\n * nicht in Wissensbeiträgen vorkommt“.\n *\n * **Element-Selektor, ADR-0008-Standardfall FÜR DIE GRUPPE SELBST** — anders als die\n * projizierte Karte. `.author-card-group` ist in keinem der 5 realen Vorkommen\n * selbst ein Grid-/Flex-Kind mit Streckungsbedarf (jedes sitzt direkt in einer\n * `.ep-section`/einem einfachen `<div>`), trägt nie eine `col-*`-Klasse vom\n * Konsumenten und kommt in keiner CSS-Regel mit einem Geschwister-Kombinator vor. Das\n * Tag variiert nicht (immer `<div>`). Ein `<cds-author-card-group>`-Host darüber\n * bricht deshalb selbst keine Selektorkette — die Karten dagegen brauchen ihren\n * eigenen Attributselektor, siehe `AuthorCardComponent`.\n *\n * **Die Klasse `.author-card-group` sitzt trotzdem NICHT auf dem Host, sondern auf\n * einem inneren `<div>` — das ist eine eigene, von den Karten unabhängige\n * Randbedingung.** Grund: `.author-card-group-eyebrow:has(+ .author-card-group.is-grid)`\n * (css/components.css:1563) ist ein Geschwister-Selektor: die Eyebrow-Überschrift\n * muss ein UNMITTELBARES Geschwister von `.author-card-group` sein, damit sie im\n * `is-grid`-Fall die breitere `max-width:960px` statt der Basis-`720px`\n * (css/components.css:1560) bekommt — sonst „sitzt sie bei der Raster-Variante 120 px\n * links neben der ersten Karte“ (Kommentar im CSS selbst). Läge `.author-card-group`\n * auf dem Host, könnte diese Komponente die Eyebrow nicht als Geschwister VOR dem\n * Host rendern (ein Angular-Template füllt ausschließlich das Innere seines eigenen\n * Hosts, nie dessen Umgebung) — die Eyebrow müsste dann ALS KIND in `.author-card-group`\n * selbst stehen und würde im Raster zur eigenen Grid-Zelle neben der ersten Karte,\n * sichtbar falsch. Mit der Klasse auf einem inneren `<div>` rendert das Template\n * `<h3 class=\"author-card-group-eyebrow\">` und `<div class=\"author-card-group …\">`\n * als echte, unmittelbare Geschwister IM Host `<cds-author-card-group>` — der\n * CSS-Selektor sieht nur diese beiden Geschwister, der zusätzliche äußere Host\n * ändert daran nichts, weil `:has(+ …)` ausschließlich den unmittelbaren\n * Elternknoten der beiden betrachtet, nicht dessen Vorfahren. Ohne diese zweite\n * Ebene bräuchte die Eyebrow denselben Attributselektor-Trick wie die Karte, obwohl\n * `.author-card-group` selbst kein Grid-/Flex-Kind ist — das eigentliche Problem hier\n * ist ein Geschwister-, kein Eltern-Kind-Kriterium, deshalb reicht die einfachere\n * Lösung (innere Klasse statt Host-Klasse).\n *\n * **Direkte Kinder bleiben gewahrt, `is-grid` inklusive.** `<ng-content>` fügt kein\n * eigenes Element ein: die projizierten `div[cdsAuthorCard]` (bereits selbst\n * `.author-card` am eigenen Host, siehe dort) landen unverändert als direkte Kinder\n * des inneren `.author-card-group`-`<div>` — Voraussetzung für den\n * Höhenausgleich im `is-grid`-Fall (`AuthorCardComponent`) und für den\n * Nachfahren-Selektor `.author-card-group .author-card` (css/components.css:1548).\n *\n * **`eyebrow` als `<h3>`, deckungsgleich mit den beiden realen, VOLLSTÄNDIGEN\n * Seiten-Vorkommen der gestapelten Variante** (`docs/index.html:8439,8464`, „Über die\n * Autor:innen“) — nicht mit der isolierten Doku-Illustration (`9111`, `<p>`,\n * dokumentiert ohne umgebende `<h2>`-Hierarchie). Die einzige reale `is-grid`-Seite\n * (Scrum-Training, `13811`) verzichtet auf die Gruppen-Eyebrow komplett, weil die\n * Sektion bereits `.ep-section-label` plus `<h2>` trägt — exakt der in\n * `wissensbeitrag.mdx` („Trägt die Sektion bereits ein `.ep-section-label` plus H2,\n * entfällt sie“) dokumentierte Fall. Konsumenten mit eigener Sektionsüberschrift\n * lassen `eyebrow` dafür leer, statt eine zweite `<h3>` zu erzwingen.\n *\n * **Konsequenz der inneren Klasse: der Host `<cds-author-card-group>` selbst trägt\n * weder `.author-card-group` noch `.is-grid`.** Ein `class`/`style` direkt am\n * `<cds-author-card-group>`-Tag landet auf dem unbekannten, standardmäßig\n * `display:inline` gerenderten Custom Element, NICHT auf der tatsächlichen\n * Layout-Box (dem inneren `<div>` mit `max-width`/Grid). Wer Layout-Eigenschaften\n * setzen will (z. B. `margin-top` wie im Trainer-Beispiel,\n * `docs/index.html:13811`), setzt sie am umgebenden Konsumenten-Markup, nicht am\n * Host — dieselbe Einschränkung, die ADR-0008 für Attributselektor-Komponenten\n * beschreibt, hier aber aus einem Geschwister- statt einem Eltern-Kind-Grund.\n */\n@Component({\n selector: 'cds-author-card-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (eyebrow()) {\n <h3 class=\"author-card-group-eyebrow\">{{ eyebrow() }}</h3>\n }\n <div class=\"author-card-group\" [class.is-grid]=\"grid()\">\n <ng-content></ng-content>\n </div>\n `,\n})\nexport class AuthorCardGroupComponent {\n /** Gemeinsame Überschrift (`.author-card-group-eyebrow`, `<h3>`), leer = keine. */\n readonly eyebrow = input('');\n /** Zweispaltiges Raster statt gestapelter Liste (`.is-grid`). */\n readonly grid = input(false);\n}\n","/*\n * Public API Surface von @conciso/design-system-angular\n *\n * Der einzige Einstiegspunkt der Angular-Lib. Alle Wrapper-Komponenten und ihre\n * öffentlichen Typen (CdsArea, CdsButtonVariant, CdsButtonSize, CdsThemeMode, …) werden\n * ausschließlich von hier re-exportiert — es gibt keine sekundären Entry-Points\n * (siehe docs/adr/0004-verteilung-und-versionierung.md).\n *\n * Vollständig umgezogen (Tickets 01–09, siehe docs/adr/0002 und 0003): alle\n * Komponenten leben hier in der Lib, storybook-angular enthält nur noch\n * Stories und importiert ausschließlich von hier.\n */\n\nexport * from './lib/area';\nexport * from './lib/theme-switch/theme-mode';\nexport * from './lib/button/button.component';\nexport * from './lib/topnav/topnav.component';\nexport * from './lib/theme-switch/cycle-button.component';\nexport * from './lib/area-badge/area-badge.component';\nexport * from './lib/status-badge/status-badge.component';\nexport * from './lib/chip/chip.component';\nexport * from './lib/pill/pill.component';\n\n// Bulk-Batch A: Form-Felder & Eingaben (Ticket 05)\nexport * from './lib/field/text-field.component';\nexport * from './lib/field/textarea-field.component';\nexport * from './lib/field/select-field.component';\nexport * from './lib/checkbox/checkbox.component';\nexport * from './lib/radio-group/radio-group.component';\nexport * from './lib/select/select.component';\nexport * from './lib/combobox/combobox.component';\nexport * from './lib/slider/slider.component';\n\n// Bulk-Batch B (Ticket 06): Layout & Navigation\nexport * from './lib/footer/footer.component';\nexport * from './lib/footer/footer-main.component';\nexport * from './lib/footer/footer-bottom.component';\nexport * from './lib/area-tabs/area-tab.component';\nexport * from './lib/area-tabs/area-tabs.component';\nexport * from './lib/logo/logo.component';\nexport * from './lib/logo-carousel/logo-carousel.component';\nexport * from './lib/carousel/carousel.component';\nexport * from './lib/theme-switch/segment-tri.component';\nexport * from './lib/theme-switch/select.component';\n\n// Bulk-Batch C (Ticket 07): Content & Daten-Anzeige.\nexport * from './lib/card/card.component';\nexport * from './lib/stat-card/stat-card.component';\nexport * from './lib/stat-strip/stat-strip.component';\nexport * from './lib/blockquote/blockquote.component';\nexport * from './lib/code-block/code-block.component';\nexport * from './lib/faq/faq.component';\nexport * from './lib/scale/scale.component';\nexport * from './lib/snackbar/snackbar.component';\nexport * from './lib/testimonial/testimonial.component';\nexport * from './lib/team-voice/team-voice.component';\nexport * from './lib/download-cta/download-cta.component';\n\n// Angular-Seitenbausteine (.scratch/angular-seitenbausteine, Ticket 01): Sektions-Gerüst\nexport * from './lib/section/section.component';\n// Angular-Seitenbausteine (Ticket 02): Hero-Bild\nexport * from './lib/hero-image/hero-image.component';\n// Angular-Seitenbausteine (Ticket 03): Störer-Kacheln über dem Hero\nexport * from './lib/stoerer/stoerer.component';\nexport * from './lib/stoerer/stoerer-set.component';\n// Angular-Seitenbausteine (Ticket 04): Klickbare Karte und Featured-Karte\nexport * from './lib/link-card/link-card.component';\nexport * from './lib/featured-card/featured-card.component';\n// Angular-Seitenbausteine (Ticket 05): Icon-Karte\nexport * from './lib/icon-card/icon-card.component';\n// Angular-Seitenbausteine (Ticket 06): Feature-Liste\nexport * from './lib/feature/feature.component';\n// Angular-Seitenbausteine (Ticket 07): Page-End-CTA-Band\nexport * from './lib/cta-band/cta-band.component';\n// Angular-Seitenbausteine (Ticket 08): Tier-Trenner und Fakten-Liste (cds-award-list\n// zurückgestellt, siehe .scratch/angular-seitenbausteine/issues/08-angebots-bausteine.md)\nexport * from './lib/tier/tier.component';\nexport * from './lib/facts/facts.component';\n// Angular-Seitenbausteine (Ticket 09): Datentabelle\nexport * from './lib/table/table.component';\n// Angular-Seitenbausteine (Ticket 10): aufklappbare Vergleichstabelle\nexport * from './lib/compare/compare.component';\n// Angular-Seitenbausteine (Ticket 11): Beitrags-Kopf und Avatare\nexport * from './lib/avatar/avatar.component';\nexport * from './lib/avatar/avatar-stack.component';\nexport * from './lib/article-header/article-header.component';\n// Angular-Seitenbausteine (Ticket 12): Artikel-Körper (Inhaltsverzeichnis, Callout,\n// Figure, Pull-Quote)\nexport * from './lib/article-toc/article-toc.component';\nexport * from './lib/article-callout/article-callout.component';\nexport * from './lib/article-figure/article-figure.component';\nexport * from './lib/article-pullquote/article-pullquote.component';\n// Angular-Seitenbausteine (Ticket 13): Autoren-Karte und -Gruppe\nexport * from './lib/author-card/author-card.component';\nexport * from './lib/author-card/author-card-group.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["dsUiCaretDown","dsUiCheck","uid"],"mappings":"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"}
|