@zenit-hosting/zenit-ui 0.1.0 → 0.2.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":"zenit-hosting-zenit-ui.mjs","sources":["../../../projects/zenit-ui/src/lib/icon/icon.ts","../../../projects/zenit-ui/src/lib/a11y/host-attribute.ts","../../../projects/zenit-ui/src/lib/spinner/spinner.ts","../../../projects/zenit-ui/src/lib/button/button.ts","../../../projects/zenit-ui/src/lib/badge/badge.ts","../../../projects/zenit-ui/src/lib/field/field.ts","../../../projects/zenit-ui/src/lib/field/input.ts","../../../projects/zenit-ui/src/lib/field/input-group.ts","../../../projects/zenit-ui/src/lib/field/select.ts","../../../projects/zenit-ui/src/lib/panel/panel.ts","../../../projects/zenit-ui/src/lib/skip-link/skip-link.ts","../../../projects/zenit-ui/src/lib/checkbox/checkbox.ts","../../../projects/zenit-ui/src/lib/toggle/toggle.ts","../../../projects/zenit-ui/src/lib/toggle/setting.ts","../../../projects/zenit-ui/src/lib/labels/labels.ts","../../../projects/zenit-ui/src/lib/slider/slider.ts","../../../projects/zenit-ui/src/lib/segment/segment.ts","../../../projects/zenit-ui/src/lib/pakete/formulare.ts","../../../projects/zenit-ui/src/lib/navigation/tabs.ts","../../../projects/zenit-ui/src/lib/navigation/tab-group.ts","../../../projects/zenit-ui/src/lib/navigation/stepper.ts","../../../projects/zenit-ui/src/lib/navigation/sidebar.ts","../../../projects/zenit-ui/src/lib/navigation/app-header.ts","../../../projects/zenit-ui/src/lib/navigation/page-header.ts","../../../projects/zenit-ui/src/lib/navigation/footer.ts","../../../projects/zenit-ui/src/lib/pakete/navigation.ts","../../../projects/zenit-ui/src/lib/metric/metric.ts","../../../projects/zenit-ui/src/lib/rows/rows.ts","../../../projects/zenit-ui/src/lib/table/table.ts","../../../projects/zenit-ui/src/lib/table/sort-header.ts","../../../projects/zenit-ui/src/lib/pagination/pagination.ts","../../../projects/zenit-ui/src/lib/pakete/daten.ts","../../../projects/zenit-ui/src/lib/feedback/alert.ts","../../../projects/zenit-ui/src/lib/feedback/empty-state.ts","../../../projects/zenit-ui/src/lib/feedback/skeleton.ts","../../../projects/zenit-ui/src/lib/toast/toast.ts","../../../projects/zenit-ui/src/lib/toast/toast-outlet.ts","../../../projects/zenit-ui/src/lib/tooltip/tooltip-panel.ts","../../../projects/zenit-ui/src/lib/tooltip/tooltip.ts","../../../projects/zenit-ui/src/lib/pakete/rueckmeldung.ts","../../../projects/zenit-ui/src/lib/dialog/dialog-layout.ts","../../../projects/zenit-ui/src/lib/dialog/confirm-dialog.ts","../../../projects/zenit-ui/src/lib/dialog/dialog.ts","../../../projects/zenit-ui/src/lib/menu/menu.ts","../../../projects/zenit-ui/src/lib/pakete/overlays.ts","../../../projects/zenit-ui/src/lib/console/console.ts","../../../projects/zenit-ui/src/lib/marketing/hero.ts","../../../projects/zenit-ui/src/lib/marketing/game-tile.ts","../../../projects/zenit-ui/src/lib/marketing/price-summary.ts","../../../projects/zenit-ui/src/lib/marketing/spec-list.ts","../../../projects/zenit-ui/src/lib/marketing/faq.ts","../../../projects/zenit-ui/src/lib/pakete/werkzeuge.ts","../../../projects/zenit-ui/src/lib/configurator/option-group.ts","../../../projects/zenit-ui/src/lib/configurator/combobox.ts","../../../projects/zenit-ui/src/lib/configurator/wizard.ts","../../../projects/zenit-ui/src/lib/configurator/config.ts","../../../projects/zenit-ui/src/lib/configurator/sticky-bar.ts","../../../projects/zenit-ui/src/lib/configurator/included-list.ts","../../../projects/zenit-ui/src/lib/configurator/disclosure.ts","../../../projects/zenit-ui/src/lib/configurator/input-action.ts","../../../projects/zenit-ui/src/lib/cost-chart/cost-chart-rules.ts","../../../projects/zenit-ui/src/lib/cost-chart/cost-chart-math.ts","../../../projects/zenit-ui/src/lib/cost-chart/cost-chart.ts","../../../projects/zenit-ui/src/lib/cost-chart/index.ts","../../../projects/zenit-ui/src/lib/pakete/konfigurator.ts","../../../projects/zenit-ui/src/lib/theme/init-script.ts","../../../projects/zenit-ui/src/lib/theme/theme.ts","../../../projects/zenit-ui/src/lib/pakete/theming.ts","../../../projects/zenit-ui/src/public-api.ts","../../../projects/zenit-ui/src/zenit-hosting-zenit-ui.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Material Icons ligature. The icon is always decorative: the host carries a\n * fixed `aria-hidden=\"true\"`, so the meaning has to come from the visible text\n * next to it or from an `aria-label` on the surrounding control.\n *\n * Renders the ligature name as the host's text content, with the classes\n * `material-icons z-icon` and `z-icon--sm` for the small size. An icon belongs\n * only where it helps to find something again: sidebar, toolbars, buttons with\n * an action. Not in front of headings, panel titles or facts.\n *\n * @example\n * ```html\n * <button zBtn=\"primary\"><z-icon name=\"add\" />Server erstellen</button>\n * <z-badge status=\"success\" dot>Online</z-badge>\n * <z-icon name=\"dns\" size=\"sm\" />\n * ```\n */\n@Component({\n selector: 'z-icon',\n template: `{{ name() }}`,\n host: {\n class: 'material-icons z-icon',\n '[class.z-icon--sm]': `size() === 'sm'`,\n 'aria-hidden': 'true',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZIcon {\n /**\n * Name of the Material Icons ligature, for example `dns`, `restart_alt` or\n * `more_vert`. Required.\n */\n readonly name = input.required<string>();\n\n /**\n * Rendered size: `md` is the regular 20px icon, `sm` the 16px variant used\n * inside badges and small buttons. Adds `z-icon--sm` for `sm`.\n *\n * @default 'md'\n */\n readonly size = input<'sm' | 'md'>('md');\n}\n","import { DestroyRef, effect, ElementRef, inject } from '@angular/core';\n\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * An attribute a caller may plausibly write is never owned by a host binding.\n * `[attr.role]`, `[attr.aria-label]` or `[attr.tabindex]` with an expression\n * that evaluates to `null` **removes** the attribute, so a value the caller\n * wrote, static or bound, is silently deleted the moment the library has\n * nothing of its own to say there. The two helpers here are the two ways out.\n *\n * @module\n */\n\n/**\n * Borrows a single-valued attribute: the library writes it only while it has a\n * value, and gives back the **latest** value of the caller when it no longer\n * does.\n *\n * The rule for the caller: while the library input is set the library value\n * wins, while it is unset the caller's attribute stands, static as well as\n * bound. A binding of the caller keeps writing while the library holds the\n * attribute, and every value it writes would otherwise win, so a\n * `MutationObserver` runs for as long as the value is borrowed: it notes the\n * new value as the one to give back and asserts the library value again. It\n * runs only while borrowed, and writing the value that already stands there is\n * skipped, so it cannot answer its own record; `takeRecords` drops the echo of\n * an own write for the same reason.\n *\n * Runs in an injection context on the host element and reads `wert`\n * reactively, so it belongs in a field initialiser or a constructor.\n *\n * @internal Wiring inside the library, not part of the public API.\n */\nexport function leiheAttribut(attribut: string, wert: () => string | null): void {\n const wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n /** What the caller last wrote, and what it gets back; `undefined` while free. */\n let geliehen: string | null | undefined;\n /** The library value currently asserted, `null` while nothing is borrowed. */\n let meins: string | null = null;\n let beobachter: MutationObserver | undefined;\n\n /** A write of the caller landed while the library held the attribute. */\n const halte = (): void => {\n const steht = wirt.getAttribute(attribut);\n if (meins === null || steht === meins) {\n return;\n }\n geliehen = steht;\n wirt.setAttribute(attribut, meins);\n beobachter?.takeRecords();\n };\n\n effect(() => {\n const neu = wert();\n if (neu !== null) {\n const steht = wirt.getAttribute(attribut);\n // Anything but the library's own value is the caller's latest word, also\n // when the observer has not been called for it yet.\n if (geliehen === undefined || steht !== meins) {\n geliehen = steht;\n }\n meins = neu;\n if (steht !== neu) {\n wirt.setAttribute(attribut, neu);\n beobachter?.takeRecords();\n }\n // Not every environment has a MutationObserver: on the server the value\n // is written, only the re-assertion against a caller is missing.\n if (!beobachter && typeof MutationObserver !== 'undefined') {\n beobachter = new MutationObserver(halte);\n }\n beobachter?.observe(wirt, { attributes: true, attributeFilter: [attribut] });\n return;\n }\n beobachter?.disconnect();\n if (geliehen === undefined) {\n return;\n }\n // A value the caller wrote after the last observer run still counts.\n if (wirt.getAttribute(attribut) !== meins) {\n geliehen = wirt.getAttribute(attribut);\n }\n const zurueck = geliehen;\n geliehen = undefined;\n meins = null;\n if (zurueck === null) {\n wirt.removeAttribute(attribut);\n } else {\n wirt.setAttribute(attribut, zurueck);\n }\n });\n\n inject(DestroyRef).onDestroy(() => beobachter?.disconnect());\n}\n\n/**\n * Which end of which attribute is taken on an element, so a second writer on\n * the same end is caught instead of freezing the page. Development only; the\n * element is the key, so nothing is kept alive by it.\n */\nconst BELEGT = new WeakMap<Element, Set<string>>();\n\n/**\n * One token of the library inside an attribute that holds a list of them,\n * `aria-describedby` above all. Several writers share such an attribute: the\n * caller writes its own ids, a `z-field` links its hint or error, a `zTooltip`\n * adds the id of its panel while it stands. Each of them owns exactly one\n * token and leaves the others alone.\n *\n * The token keeps a fixed end of the list, which is what makes two writers on\n * the same element settle instead of pushing each other around: a description\n * that belongs to the control sits at the front, a passing addition such as a\n * tooltip at the back, and the caller's own tokens keep their order in\n * between.\n *\n * **The invariant: at most one writer per attribute and end on one element.**\n * Two writers claiming the same end move the token past each other for as long\n * as the page lives, which is a frozen tab, not a wrong attribute. A second\n * claim on the same end therefore throws in development; in production the\n * check is compiled away, so keep it covered by a test.\n *\n * While a token stands, a `MutationObserver` watches the attribute, because\n * the caller may rewrite it as a whole: a binding of its own going to another\n * value deletes every foreign token in one go, and the token is put back then.\n * Writing is skipped when nothing changes and the record of an own write is\n * dropped with `takeRecords`, so the observer cannot answer itself: Chromium\n * queues a record for a `setAttribute` with an unchanged value as well, and\n * answering that record with another write freezes the tab in the microtask\n * checkpoint.\n *\n * @internal Wiring inside the library, not part of the public API.\n */\nexport class ZTokenAttribut {\n /** The token this writer currently has in the list, `null` for none. */\n private meins: string | null = null;\n /** Lives only while a token stands. */\n private beobachter?: MutationObserver;\n /** Whether this writer currently holds the end; see {@link BELEGT}. */\n private beansprucht = false;\n private readonly schluessel: string;\n\n constructor(\n private readonly wirt: HTMLElement,\n private readonly attribut: string,\n /** Which end of the list this token keeps. */\n private readonly platz: 'vorn' | 'hinten',\n ) {\n this.schluessel = `${attribut}:${platz}`;\n }\n\n /**\n * Puts this writer's token into the list, or takes it out again with `null`.\n * Every other token stays, and none appears twice.\n */\n setze(token: string | null): void {\n this.beanspruche(token !== null);\n const steht = this.wirt.getAttribute(this.attribut);\n const werte = (steht ?? '')\n .split(/\\s+/)\n .filter((wert) => wert && wert !== this.meins && wert !== token);\n if (token) {\n if (this.platz === 'vorn') {\n werte.unshift(token);\n } else {\n werte.push(token);\n }\n }\n this.meins = token;\n const soll = werte.join(' ');\n if (soll !== (steht ?? '')) {\n if (soll) {\n this.wirt.setAttribute(this.attribut, soll);\n } else if (steht !== null) {\n this.wirt.removeAttribute(this.attribut);\n }\n // The record of this write is the observer's own echo and would call it\n // one more time for nothing. `takeRecords` drops exactly that one: no\n // other script can have run since the write, and everything the caller\n // queued before was already delivered to the callback that is running.\n this.beobachter?.takeRecords();\n }\n if (!token) {\n this.loese();\n return;\n }\n // Not every environment has a MutationObserver: on the server the token is\n // written, only the answer to a caller rewriting the attribute is missing.\n if (!this.beobachter && typeof MutationObserver !== 'undefined') {\n this.beobachter = new MutationObserver(() => this.setze(this.meins));\n }\n this.beobachter?.observe(this.wirt, { attributes: true, attributeFilter: [this.attribut] });\n }\n\n /** Claims this end of the list, or lets it go. Development only. */\n private beanspruche(dazu: boolean): void {\n if (typeof ngDevMode !== 'undefined' && !ngDevMode) {\n return;\n }\n if (this.beansprucht === dazu) {\n return;\n }\n const belegt = BELEGT.get(this.wirt) ?? new Set<string>();\n if (dazu && belegt.has(this.schluessel)) {\n throw new Error(\n `zenit-ui: two writers keep the ${this.platz === 'vorn' ? 'front' : 'back'} of ` +\n `\"${this.attribut}\" on the same element. One of them has to take the other end, ` +\n `otherwise the two move their token past each other for as long as the page lives.`,\n );\n }\n if (dazu) {\n belegt.add(this.schluessel);\n BELEGT.set(this.wirt, belegt);\n } else {\n belegt.delete(this.schluessel);\n }\n this.beansprucht = dazu;\n }\n\n /** Stops watching. Whatever stands in the attribute stays there. */\n loese(): void {\n this.beobachter?.disconnect();\n this.beobachter = undefined;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\nimport { leiheAttribut } from '../a11y/host-attribute';\n\n/**\n * Loading indicator. Renders an empty host with the class `z-spinner`; the ring\n * itself comes from the stylesheet.\n *\n * Accessibility depends on `label`: with a label the host becomes a status\n * message (`role=\"status\"` plus that label as `aria-label`), without one it is\n * decorative and carries `aria-hidden=\"true\"`. A caller that writes its own\n * `role` or `aria-label` on `<z-spinner>` keeps them: the input wins while it\n * holds a value, the caller's attributes stand while it does not, and a\n * spinner the caller named itself is not hidden either. A button that is working shows\n * its own spinner through `loading` on `zBtn`; lists use `z-skeleton` instead.\n * The one list that does not is the panel of `z-combobox`: a `role=\"listbox\"`\n * takes options, and a skeleton row has no accessible name, so the waiting row\n * there carries a decorative spinner beside its word.\n *\n * @example\n * ```html\n * <z-panel title=\"Auslastung\" busy>\n * <z-spinner label=\"Wird geladen\" />\n * </z-panel>\n * ```\n */\n@Component({\n selector: 'z-spinner',\n template: ``,\n host: {\n class: 'z-spinner',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSpinner {\n /**\n * Text announced while loading, for example `Wird geladen`. An empty string\n * keeps the spinner decorative and hidden from assistive technology, unless\n * the caller named the spinner itself.\n *\n * @default ''\n */\n readonly label = input('');\n\n constructor() {\n const wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n // Both as borrowed attributes, not as host bindings: a host binding writes\n // `null` as soon as `label` is empty and thereby deletes the `role` and\n // the `aria-label` of the caller.\n leiheAttribut('role', () => (this.label() ? 'status' : null));\n leiheAttribut('aria-label', () => this.label() || null);\n\n /**\n * Only a spinner that nobody names is decorative. The question is asked of\n * the element, not of the static attributes at construction: a caller that\n * binds `[attr.aria-label]` has written nothing yet at that point, and its\n * name would be hidden behind `aria-hidden=\"true\"` for good.\n */\n const messen = (): void => {\n if (this.label() || wirt.hasAttribute('role') || wirt.hasAttribute('aria-label')) {\n wirt.removeAttribute('aria-hidden');\n } else {\n wirt.setAttribute('aria-hidden', 'true');\n }\n };\n // Third effect on purpose: effects of one injection context run in the\n // order they were created, so both borrows above have given their\n // attributes back by the time this one reads the element.\n effect(messen);\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n // The caller may name the spinner at any time, and take the name back.\n const beobachter = new MutationObserver(messen);\n beobachter.observe(wirt, { attributes: true, attributeFilter: ['role', 'aria-label'] });\n inject(DestroyRef).onDestroy(() => beobachter.disconnect());\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\nimport { leiheAttribut } from '../a11y/host-attribute';\nimport { ZSpinner } from '../spinner';\n\n/**\n * The four button variants. `primary` is the one main action per screen,\n * `secondary` every further action, `ghost` cancel and icon actions in\n * toolbars, `danger` only irreversible actions.\n */\nexport type ZButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';\n\n/**\n * Triggers an action, on a native `<button>` or on an `<a>`. The component\n * brings no element of its own: it attaches to the host through the attribute\n * `zBtn`, so links keep their `href` and their routing.\n *\n * Renders the class `z-btn` on the host plus one variant class\n * (`z-btn--primary`, `z-btn--secondary`, `z-btn--ghost`, `z-btn--danger`) and,\n * where set, `z-btn--sm`, `z-btn--lg`, `z-btn--icon` and `z-btn--block`. Size\n * `md` adds no class. The content is projected as is; while {@link loading} is\n * set a `z-spinner` sits in front of it.\n *\n * Accessibility: on a `<button>`, {@link disabled} sets the native `disabled`\n * attribute, so a deliberately locked button leaves the tab order.\n * {@link loading} sets `aria-busy=\"true\"` and `aria-disabled=\"true\"` instead\n * and swallows click, Enter and Space, but leaves the button focusable: the\n * button that triggered the action keeps the focus while it spins, and a\n * submit button in a form blocks the implicit submission from Enter in a field\n * as well. With both set, `disabled` wins and the lock is native. An `<a>`\n * cannot be disabled natively, so it gets `aria-disabled=\"true\"` and\n * `tabindex=\"-1\"` instead, and the click is swallowed. A caller may also write\n * `aria-disabled=\"true\"` onto a `<button>`, statically or through\n * `[attr.aria-disabled]`: the button then stays focusable and can explain the\n * reason in a tooltip, which a real `disabled` would prevent, and its click is\n * swallowed as well. The attribute is only borrowed while the library locks:\n * its `\"true\"` wins then, and the caller's latest value comes back when the\n * lock goes. Icon-only buttons need an `aria-label` from the caller.\n *\n * The component never touches `type`: the native default stays, so a\n * `<button zBtn>` inside a form submits it. A button that only triggers an\n * action therefore carries `type=\"button\"` from the caller.\n *\n * @example\n * ```html\n * <button zBtn=\"primary\" size=\"lg\" [loading]=\"laeuft()\">Server erstellen</button>\n * <button zBtn=\"ghost\" iconOnly size=\"sm\" aria-label=\"Mehr\"><z-icon name=\"more_vert\" /></button>\n * <a zBtn routerLink=\"/user/server\">Alle anzeigen</a>\n * ```\n */\n@Component({\n selector: 'button[zBtn], a[zBtn]',\n imports: [ZSpinner],\n template: `@if (loading()) {\n <z-spinner />\n }\n <ng-content />`,\n host: {\n class: 'z-btn',\n '[class.z-btn--primary]': `variante() === 'primary'`,\n '[class.z-btn--secondary]': `variante() === 'secondary'`,\n '[class.z-btn--ghost]': `variante() === 'ghost'`,\n '[class.z-btn--danger]': `variante() === 'danger'`,\n '[class.z-btn--sm]': `size() === 'sm'`,\n '[class.z-btn--lg]': `size() === 'lg'`,\n '[class.z-btn--icon]': `iconOnly()`,\n '[class.z-btn--block]': `block()`,\n '[attr.disabled]': `istLink || !disabled() ? null : \"\"`,\n '[attr.aria-busy]': `loading() ? \"true\" : null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZButton {\n /**\n * Variant of the button. The bare attribute `zBtn` carries the empty string,\n * which counts as `secondary`, so `<button zBtn>` is the secondary button.\n *\n * @default 'secondary'\n */\n readonly zBtn = input<ZButtonVariant | ''>('secondary');\n\n /**\n * Height of the button: `sm` for toolbars, `md` everywhere, `lg` only in the\n * hero and in the closing call to action. `md` adds no class.\n *\n * @default 'md'\n */\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n\n /**\n * Stretches the button over the full width of its container, for a form on a\n * phone. Boolean attribute.\n *\n * @default false\n */\n readonly block = input(false, { transform: booleanAttribute });\n\n /**\n * Square button that holds an icon and no text. The caller supplies the\n * `aria-label`. Boolean attribute.\n *\n * @default false\n */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n\n /**\n * Shows a spinner in front of the content, sets `aria-busy=\"true\"` and locks\n * the button without taking it out of the tab order: `aria-disabled=\"true\"`\n * and a swallowed click, Enter and Space instead of the native `disabled`,\n * so the button that triggered the action keeps the focus. Together with\n * {@link disabled} the native lock wins. Boolean attribute.\n *\n * @default false\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Locks the button. On a `<button>` this is the native `disabled` attribute,\n * on an `<a>` it is `aria-disabled=\"true\"` with `tabindex=\"-1\"` and a\n * swallowed click; a `tabindex` of the caller's own comes back when the lock\n * goes. Boolean attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly istLink =\n inject<ElementRef<HTMLElement>>(ElementRef).nativeElement.nodeName === 'A';\n protected readonly variante = computed<ZButtonVariant>(() => this.zBtn() || 'secondary');\n protected readonly gesperrt = computed(() => this.disabled() || this.loading());\n /**\n * Locked without the native `disabled`: every locked link, and a loading\n * button that is not also `disabled`. It stays focusable, carries\n * `aria-disabled=\"true\"` and its activation is swallowed.\n */\n protected readonly weich = computed(() =>\n this.istLink ? this.gesperrt() : this.loading() && !this.disabled(),\n );\n\n constructor() {\n const wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n // Borrowed, not bound: a host binding would delete an `aria-disabled` of\n // the caller, static or bound, on every change detection run while the\n // button is not soft-locked. The caller's value stands while the library\n // has none, and its latest value comes back when the lock goes.\n leiheAttribut('aria-disabled', () => (this.weich() ? 'true' : null));\n /** What the caller last wrote, and what it gets back when the lock goes. */\n let geliehen: string | null = null;\n let gesetzt = false;\n const sperren = (): void => {\n if (!gesetzt) {\n geliehen = wirt.getAttribute('tabindex');\n gesetzt = true;\n }\n if (wirt.getAttribute('tabindex') !== '-1') {\n wirt.setAttribute('tabindex', '-1');\n }\n };\n // A binding of the caller keeps writing while the link is locked, and every\n // value it writes would put the locked link back into the tab order. The\n // observer notes the new value and asserts the lock again; it runs only\n // while the link is locked, and writing `-1` over `-1` is skipped, so it\n // cannot answer its own record.\n let beobachter: MutationObserver | undefined;\n const halte = (): void => {\n geliehen = wirt.getAttribute('tabindex');\n if (geliehen === '-1') {\n return;\n }\n sperren();\n };\n // A locked link is taken out of the tab order, and only then is `tabindex`\n // touched at all: a host binding would write on every change and thereby\n // delete a `tabindex` the caller wrote, static or bound. The lock borrows\n // the attribute and gives back what stood there last.\n effect(() => {\n if (this.istLink && this.gesperrt()) {\n sperren();\n // Not every environment has a MutationObserver: on the server the lock\n // writes `tabindex=\"-1\"` into the rendered HTML, only the re-assertion\n // against a caller is missing. Constructing it eagerly threw a\n // ReferenceError there and took every page with a locked link down.\n if (!beobachter && typeof MutationObserver !== 'undefined') {\n beobachter = new MutationObserver(halte);\n }\n beobachter?.observe(wirt, { attributes: true, attributeFilter: ['tabindex'] });\n return;\n }\n beobachter?.disconnect();\n if (!gesetzt) {\n return;\n }\n gesetzt = false;\n if (geliehen === null) {\n wirt.removeAttribute('tabindex');\n } else {\n wirt.setAttribute('tabindex', geliehen);\n }\n });\n inject(DestroyRef).onDestroy(() => beobachter?.disconnect());\n\n // Whatever carries `aria-disabled=\"true\"` stays clickable: a locked link, a\n // loading button, a button the caller locked that way. Its activation is\n // caught in the capture phase, which runs before every listener on the\n // element in the bubble phase, so neither a `(click)` of the caller nor\n // `routerLink` sees it, and `preventDefault` keeps a submit button from\n // submitting its form. The implicit submission from Enter in a text field\n // is a click on the default button as well, so it is caught here too.\n // Enter and Space are caught on `keydown`, before they turn into a click.\n // `href` is left untouched.\n const schlucke = (ereignis: Event): void => {\n const taste = (ereignis as KeyboardEvent).key;\n if (\n wirt.getAttribute('aria-disabled') !== 'true' ||\n (ereignis.type === 'keydown' && taste !== 'Enter' && taste !== ' ')\n ) {\n return;\n }\n ereignis.preventDefault();\n ereignis.stopImmediatePropagation();\n };\n wirt.addEventListener('click', schlucke, true);\n wirt.addEventListener('keydown', schlucke, true);\n }\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Status of a badge. `neutral` is the plain tag and the state \"Gestoppt\",\n * `success` stands for Online or Aktiv, `warning` for a running change such as\n * \"Neustart läuft\", `danger` for Fehlgeschlagen or Offline, `info` for\n * something planned or being installed.\n */\nexport type ZBadgeStatus = 'neutral' | 'success' | 'warning' | 'danger' | 'info';\n\n/**\n * Status or tag in one word. A badge is never clickable and never carries a\n * meaning that only its color conveys: the state is always written out.\n *\n * Renders the projected content on a host with the class `z-badge` plus one of\n * `z-badge--success`, `--warning`, `--danger`, `--info`. With `dot` a leading\n * `span.z-badge__dot` is added. Two uses: a status with dot and color, or a\n * neutral tag without dot (Tarif, Loader, Version, Rechte). At most three tags\n * per row, and in a list the status always stays in the same column.\n *\n * @example\n * ```html\n * <z-badge status=\"success\" dot>Online</z-badge>\n * <z-badge status=\"danger\" dot>Fehlgeschlagen</z-badge>\n * <z-badge>PaperMC</z-badge>\n * ```\n */\n@Component({\n selector: 'z-badge',\n template: `@if (dot()) {\n <span class=\"z-badge__dot\"></span>\n }\n <ng-content />`,\n host: {\n class: 'z-badge',\n '[class.z-badge--success]': `status() === 'success'`,\n '[class.z-badge--warning]': `status() === 'warning'`,\n '[class.z-badge--danger]': `status() === 'danger'`,\n '[class.z-badge--info]': `status() === 'info'`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZBadge {\n /**\n * Color of the badge. `neutral` renders without a modifier class.\n *\n * @default 'neutral'\n */\n readonly status = input<ZBadgeStatus>('neutral');\n\n /**\n * Shows the leading dot. Set it for a server or job state, leave it off for a\n * plain tag. Boolean attribute, so `dot` alone is enough.\n *\n * @default false\n */\n readonly dot = input(false, { transform: booleanAttribute });\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * Wrapper around a form control: label above, hint or error below. The label\n * always stands above the control, never only as a placeholder.\n *\n * Renders a host with the class `z-field`, an optional `label.z-field__label`,\n * the projected control, and below it either `span.z-field__error` or, if there\n * is no error, `span.z-field__hint`. Error and hint are mutually exclusive; the\n * error wins.\n *\n * Accessibility: `for` links the label to the id of the control and is also the\n * root of the ids for hint (`<for>-hint`) and error (`<for>-error`). Without\n * `for` there are no ids and no `aria-describedby`. A projected `input zInput`,\n * `textarea zInput` or `z-select` picks that id up by itself.\n *\n * @example\n * ```html\n * <z-field label=\"Servername\" for=\"in-name\" hint=\"Nur für dich sichtbar.\">\n * <input zInput id=\"in-name\" value=\"Beispiel-Server 1\" />\n * </z-field>\n *\n * <z-field label=\"Maximale Spieler\" for=\"in-max\" error=\"Dein Tarif erlaubt höchstens 100 Spieler.\">\n * <input zInput mono invalid id=\"in-max\" value=\"200\" />\n * </z-field>\n * ```\n */\n@Component({\n selector: 'z-field',\n template: `\n @if (label()) {\n <label class=\"z-field__label\" [attr.for]=\"fuer() || null\">{{ label() }}</label>\n }\n <ng-content />\n @if (error()) {\n <span class=\"z-field__error\" [attr.id]=\"fehlerId()\">{{ error() }}</span>\n } @else if (hint()) {\n <span class=\"z-field__hint\" [attr.id]=\"hinweisId()\">{{ hint() }}</span>\n }\n `,\n host: { class: 'z-field' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZField {\n /**\n * Visible label above the control. Empty means no label element is rendered.\n *\n * @default ''\n */\n readonly label = input('');\n\n /**\n * id of the control inside the field. Connects the label with the control and\n * serves as the prefix for the hint and error ids. Empty means no `for`\n * attribute and no `aria-describedby` wiring.\n *\n * @default ''\n */\n readonly for = input('');\n\n /**\n * Helper text below the control. Only shown while `error` is empty.\n *\n * @default ''\n */\n readonly hint = input('');\n\n /**\n * Error message below the control. Non-empty replaces the hint. The message\n * names the cause and the next step; the control itself is marked with\n * `invalid`.\n *\n * @default ''\n */\n readonly error = input('');\n\n /** `for` is a keyword in the template, hence this second name. */\n protected readonly fuer = this.for;\n\n protected readonly hinweisId = computed(() => (this.for() ? `${this.for()}-hint` : null));\n protected readonly fehlerId = computed(() => (this.for() ? `${this.for()}-error` : null));\n\n /**\n * id of the currently visible accompanying text: the error id while `error`\n * is set, otherwise the hint id, and `null` if neither is shown or `for` is\n * empty. The projected control binds its `aria-describedby` to this.\n *\n * @internal Wiring between `z-field` and the controls inside it, not meant to\n * be read by applications.\n */\n readonly beschreibung = computed(() => {\n if (this.error()) {\n return this.fehlerId();\n }\n return this.hint() ? this.hinweisId() : null;\n });\n}\n","import {\n booleanAttribute,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\nimport { leiheAttribut, ZTokenAttribut } from '../a11y/host-attribute';\nimport { ZField } from './field';\n\n/**\n * Native `<input>` or `<textarea>` in Zenit style. The element stays native,\n * the directive only adds classes and accessibility state.\n *\n * Adds the class `z-input`, plus `z-input--sm` for the small size and\n * `z-input--mono` for monospace values. The error state is expressed as\n * `aria-invalid=\"true\"`, and the danger border hooks onto that attribute.\n * Inside a `z-field` the `aria-describedby` attribute points at that field's\n * hint or error. The native `size` attribute is removed from the host, because\n * the input `size` carries `sm`/`md` here, which would be invalid HTML.\n *\n * Both attributes belong to the caller as much as to the library, so neither\n * is a host binding. The id of the field is one token in front of whatever the\n * caller wrote in `aria-describedby`, and it is removed again when hint and\n * error are gone; a `zTooltip` on the same element adds its own token at the\n * back, so caller, field and tooltip write the same attribute without deleting\n * one another. `aria-invalid` is borrowed the same way: while {@link invalid}\n * holds, the library value stands, and afterwards the caller's own value comes\n * back.\n *\n * @example\n * ```html\n * <z-field label=\"Adresse\" for=\"in-addr\" hint=\"IP und Port deines Servers.\">\n * <input zInput mono id=\"in-addr\" value=\"203.0.113.10:25565\" readonly />\n * </z-field>\n *\n * <z-field label=\"Notiz\" for=\"in-note\">\n * <textarea zInput id=\"in-note\" placeholder=\"Was hast du zuletzt geändert?\"></textarea>\n * </z-field>\n * ```\n */\n@Directive({\n selector: 'input[zInput], textarea[zInput]',\n host: {\n class: 'z-input',\n '[class.z-input--sm]': `size() === 'sm'`,\n '[class.z-input--mono]': `mono()`,\n // size is the name from the API table, but as a native attribute on the\n // <input> the value \"sm\" would be invalid HTML.\n '[attr.size]': `null`,\n },\n})\nexport class ZInput {\n /**\n * Height of the control: `md` for forms, `sm` for fields in toolbars and\n * filter rows. Adds `z-input--sm` for `sm`.\n *\n * @default 'md'\n */\n readonly size = input<'sm' | 'md'>('md');\n\n /**\n * Sets the monospace font with tabular figures. For numbers, ports, IP\n * addresses, file names and configuration values. Boolean attribute.\n *\n * @default false\n */\n readonly mono = input(false, { transform: booleanAttribute });\n\n /**\n * Marks the value as invalid: sets `aria-invalid=\"true\"` and with it the\n * danger border, while {@link touched} holds too. Goes together with `error`\n * on the surrounding `z-field`. The Signal Forms `[formField]` on the same\n * element sets it from the field state, and Angular then rejects an own\n * `[invalid]` binding. Boolean attribute.\n *\n * @default false\n */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the user has left the field, which gates {@link invalid}, so an\n * empty required field does not start out with a danger border. Set by\n * `[formField]`; outside Signal Forms it stays `true` and {@link invalid}\n * alone decides. Boolean attribute.\n *\n * @default true\n */\n readonly touched = input(true, { transform: booleanAttribute });\n\n private readonly feld = inject(ZField, { optional: true });\n\n constructor() {\n leiheAttribut('aria-invalid', () => (this.invalid() && this.touched() ? 'true' : null));\n const beschreibung = new ZTokenAttribut(\n inject<ElementRef<HTMLElement>>(ElementRef).nativeElement,\n 'aria-describedby',\n 'vorn',\n );\n effect(() => beschreibung.setze(this.feld?.beschreibung() ?? null));\n // The element may outlive the directive, so it keeps every token the\n // caller and a tooltip put there and loses only the one of the field.\n inject(DestroyRef).onDestroy(() => beschreibung.setze(null));\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ZIcon } from '../icon';\n\n/**\n * Field with a leading icon, for example a search box. Renders a\n * `div.z-input-wrap` (host) with a `z-icon` in front of the projected\n * `input zInput`.\n *\n * Accessibility: the icon is decorative and `aria-hidden`, so the field still\n * needs its own label, usually from the surrounding `z-field`.\n *\n * @example\n * ```html\n * <z-field label=\"Suche\" for=\"in-search\">\n * <z-input-group icon=\"search\">\n * <input zInput id=\"in-search\" placeholder=\"Name, Spiel oder Adresse\" />\n * </z-input-group>\n * </z-field>\n * ```\n */\n@Component({\n selector: 'z-input-group',\n imports: [ZIcon],\n template: `<z-icon [name]=\"icon()\" /><ng-content />`,\n host: { class: 'z-input-wrap' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZInputGroup {\n /**\n * Name of the Material Icons ligature in front of the field, for example\n * `search`. Required.\n */\n readonly icon = input.required<string>();\n}\n","import {\n AfterContentChecked,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\nimport { ZTokenAttribut } from '../a11y/host-attribute';\nimport { ZField } from './field';\n\n/**\n * Wrapper around a native `<select>`. The select stays native because of\n * keyboard handling, screen readers and the system wheel on mobile devices;\n * the component only provides the surface with the classes `z-select` and\n * `z-select--sm`, which looks the same as an input.\n *\n * Accessibility: inside a `z-field` the projected `<select>` receives that\n * field's `aria-describedby` pointing at the hint or error. Use a select for a\n * short, fixed list; up to four options that are meant to be compared are a\n * segment, and from about 15 options on a search field is needed.\n *\n * @example\n * ```html\n * <z-field label=\"Status\" for=\"sel-status\">\n * <z-select>\n * <select id=\"sel-status\">\n * <option>Alle Status</option>\n * <option>Online</option>\n * <option>Gestoppt</option>\n * </select>\n * </z-select>\n * </z-field>\n * ```\n */\n@Component({\n selector: 'z-select',\n template: `<ng-content />`,\n host: {\n class: 'z-select',\n '[class.z-select--sm]': `size() === 'sm'`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSelect implements AfterContentChecked {\n /**\n * Height of the control: `md` for forms, `sm` for filter rows next to the\n * search field. Adds `z-select--sm` for `sm`.\n *\n * @default 'md'\n */\n readonly size = input<'sm' | 'md'>('md');\n\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly feld = inject(ZField, { optional: true });\n private ziel?: HTMLSelectElement;\n private beschreibung?: ZTokenAttribut;\n\n constructor() {\n // The `<select>` belongs to the caller and may outlive the component, so\n // it keeps its own description and loses only the id of the field.\n inject(DestroyRef).onDestroy(() => this.beschreibung?.setze(null));\n }\n\n /**\n * Keeps the id of the hint or the error of the surrounding `z-field` in the\n * `aria-describedby` of the projected `<select>`.\n *\n * The `<select>` is projected content, so a host binding cannot reach it.\n * Content hooks run in the view that declares the content, so this hook\n * covers both cases: error or hint changing, and the `<select>` appearing\n * later behind an `@if`. No signal tracking needed, hence no race with the\n * change detection guard.\n *\n * The id is one token among whatever the caller wrote on the `<select>`, not\n * the whole attribute: writing the attribute as a whole used to delete a\n * `aria-describedby` of the caller's own.\n *\n * Angular lifecycle hook. Deliberately without the internal tag: `stripInternal` removed it from the\n * typings, and consumers with `skipLibCheck: false` got TS2420 (implements without the method).\n */\n ngAfterContentChecked(): void {\n const ziel = this.el.nativeElement.querySelector('select');\n if (!ziel) {\n return;\n }\n if (ziel !== this.ziel) {\n this.beschreibung?.setze(null);\n this.beschreibung = new ZTokenAttribut(ziel, 'aria-describedby', 'vorn');\n this.ziel = ziel;\n }\n this.beschreibung?.setze(this.feld?.beschreibung() ?? null);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChild,\n Directive,\n input,\n} from '@angular/core';\n\n/**\n * Marks the element that is projected into the panel header, to the right of\n * the title: a link or one action. Adds no markup and no classes of its own.\n *\n * @example\n * ```html\n * <z-panel title=\"Zahlungsmittel\">\n * <span zPanelActions>\n * <button zBtn=\"secondary\" size=\"sm\"><z-icon name=\"add\" size=\"sm\" />Hinzufügen</button>\n * </span>\n * </z-panel>\n * ```\n */\n@Directive({ selector: '[zPanelActions]' })\nexport class ZPanelActions {}\n\n/**\n * The only container with a border. Groups data or a tool into one block:\n * server list, activities, payment methods, file manager, settings group. Not\n * for feature texts, facts or FAQ on public pages, and never a panel inside a\n * panel.\n *\n * Renders a host with the class `z-panel`. If there is a title or a\n * `[zPanelActions]` element, a `div.z-panel__header` with `.z-panel__title` in\n * the tag {@link headingLevel} names (`h3` by default)\n * comes first, then `div.z-panel__body` (plus `z-panel__body--flush` for lists\n * and tables) with the projected content, and finally a projected\n * `z-pagination` after the body.\n *\n * Accessibility: `busy` sets `aria-busy=\"true\"` on the host while content is\n * loading; the panel then also carries its own `aria-label`. The native `title`\n * attribute is suppressed so the browser does not show its own tooltip for the\n * title input.\n *\n * @example\n * ```html\n * <z-panel title=\"Meine Server\" flush>\n * <a zPanelActions href=\"/user/server\">Alle anzeigen</a>\n * <ul class=\"demo-list\">…</ul>\n * </z-panel>\n * ```\n */\n@Component({\n selector: 'z-panel',\n template: `\n @if (title() || aktionen()) {\n <div class=\"z-panel__header\">\n @if (title()) {\n @switch (headingLevel()) {\n @case (2) {\n <h2 class=\"z-panel__title\" [class.z-mono]=\"titleMono()\">{{ title() }}</h2>\n }\n @case (4) {\n <h4 class=\"z-panel__title\" [class.z-mono]=\"titleMono()\">{{ title() }}</h4>\n }\n @default {\n <h3 class=\"z-panel__title\" [class.z-mono]=\"titleMono()\">{{ title() }}</h3>\n }\n }\n }\n <ng-content select=\"[zPanelActions]\" />\n </div>\n }\n <div class=\"z-panel__body\" [class.z-panel__body--flush]=\"flush()\">\n <ng-content />\n </div>\n <ng-content select=\"z-pagination\" />\n `,\n host: {\n class: 'z-panel',\n '[attr.title]': `null`,\n '[attr.aria-busy]': `busy() ? \"true\" : null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZPanel {\n /**\n * Panel title in normal capitalization, without an icon. Empty means no\n * header, unless a `[zPanelActions]` element is projected.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Tag of the title: `2`, `3` or `4`. The reference markup has `h3`, which\n * fits a panel below a section heading. Raise it to `2` where the panel sits\n * directly under the page `<h1>` and is a section of its own, as the panels\n * of a customer-area page are. The visual size never changes with it.\n *\n * @default 3\n */\n readonly headingLevel = input<2 | 3 | 4, 2 | 3 | 4 | '2' | '3' | '4'>(3, {\n transform: (wert) => Number(wert) as 2 | 3 | 4,\n });\n\n /**\n * Sets the title in the mono face, for a title that is a technical value as\n * a whole, such as an endpoint (`GET /api/v1/gameservers`), a file name or a\n * configuration key. Adds `z-mono` to the heading; tag and size stay the\n * same. Boolean attribute.\n *\n * @default false\n */\n readonly titleMono = input(false, { transform: booleanAttribute });\n\n /**\n * Removes the padding of the body so lists and tables can reach the border.\n * Boolean attribute.\n *\n * @default false\n */\n readonly flush = input(false, { transform: booleanAttribute });\n\n /**\n * Marks the panel as loading and sets `aria-busy=\"true\"`. Boolean attribute.\n *\n * @default false\n */\n readonly busy = input(false, { transform: booleanAttribute });\n\n protected readonly aktionen = contentChild(ZPanelActions);\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * The first tab stop of a page: a link that jumps past header and navigation\n * straight to the main content. Every page has one; it is the keyboard's way\n * out of a header that carries a dozen links.\n *\n * The directive adds the class `z-skip-link` and nothing else. Text, `href` and\n * position in the document belong to the caller, because only the application\n * knows what its main content is called and where it starts. Put the link first\n * in the body, before the header.\n *\n * The class is what makes it work: `.z-root a` weighs (0,1,1) and beats any\n * application class on a link (0,1,0), so a skip link styled by hand keeps\n * `accent-text` and ends up red on red. The library's own rule\n * `.z-root a.z-skip-link` weighs (0,2,1) and wins.\n *\n * The link is invisible until it takes focus; then it becomes a block at the\n * top left, above everything else on the page.\n *\n * **The target needs `tabindex=\"-1\"`.** Without it the browser moves the\n * viewport but leaves the focus where it was, and the next Tab goes back to the\n * second link of the header. In dev mode the directive checks the target on the\n * first focus and warns when it is missing or cannot take focus.\n *\n * @example\n * ```html\n * <a zSkipLink href=\"#inhalt\">Zum Hauptinhalt springen</a>\n * <header>…</header>\n * <main id=\"inhalt\" tabindex=\"-1\">…</main>\n * ```\n */\n@Directive({\n selector: 'a[zSkipLink]',\n host: {\n class: 'z-skip-link',\n '(focus)': 'zielPruefen()',\n },\n})\nexport class ZSkipLink {\n private readonly element = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n\n /** The check runs once; a skip link is focused on every page visit. */\n private geprueft = false;\n\n /**\n * Dev-mode check of the link target, on the first focus. It runs that late on\n * purpose: the target usually lives in the same template, and at construction\n * time it is not in the document yet.\n */\n protected zielPruefen(): void {\n if (this.geprueft || (typeof ngDevMode !== 'undefined' && !ngDevMode)) {\n return;\n }\n this.geprueft = true;\n\n const element = this.element.nativeElement;\n // getAttribute, not .hash: a router link writes the fragment through the\n // property, and both spellings end up in the attribute anyway.\n const fragment = (element.getAttribute('href') ?? '').split('#')[1];\n if (!fragment) {\n console.warn(\n `zenit-ui: zSkipLink without a target fragment (href=\"${element.getAttribute('href') ?? ''}\").`,\n );\n return;\n }\n\n // decodeURIComponent throws URIError on a broken escape such as \"#%\", and\n // this runs inside a focus handler, where an exception would surface as an\n // unhandled error while the user is only pressing Tab. A fragment that\n // cannot be decoded is taken as written; the browser does not resolve it\n // either, so the warning below is the right answer for it.\n let id = fragment;\n try {\n id = decodeURIComponent(fragment);\n } catch {\n // Keep the raw fragment.\n }\n\n const ziel = element.ownerDocument.getElementById(id);\n if (!ziel) {\n console.warn(`zenit-ui: zSkipLink points at #${fragment}, which is not in the document.`);\n return;\n }\n\n // Anything that can take focus either is focusable by default or says so\n // with tabindex. A skip link target is a <main> or a <div>, so in practice\n // this is the missing tabindex=\"-1\".\n const fokussierbar =\n ziel.hasAttribute('tabindex') ||\n ziel.matches(\n 'a[href], area[href], button, input, select, textarea, iframe, [contenteditable]',\n );\n if (!fokussierbar) {\n console.warn(\n `zenit-ui: the target #${fragment} of zSkipLink cannot take focus. Give it tabindex=\"-1\", otherwise only the viewport moves.`,\n );\n }\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormCheckboxControl } from '@angular/forms/signals';\n\n/**\n * Selects entries for a bulk action or confirms a statement, on a native\n * `<input type=\"checkbox\">`. It never switches anything immediately; for\n * settings that take effect at once use `z-toggle`.\n *\n * Renders `<label class=\"z-check\">` with the native checkbox and a `<span>`\n * holding the projected text. Because the whole thing is a label, a click on\n * the text toggles the box.\n *\n * Accessibility: without visible text, for example in a table row, the caller\n * passes {@link ariaLabel}; the attribute is only written when it is not empty.\n * The checked state lives directly on the native element, written in an\n * `effect`, so a control that rejects an input still keeps element and model in\n * sync.\n *\n * An error or hint sentence next to the checkbox is tied in through\n * {@link ariaDescribedby}. {@link indeterminate} shows the mixed state of a\n * \"select all\" box; the native property implies `aria-checked=\"mixed\"`.\n *\n * Forms: implements `ControlValueAccessor`, so `ngModel` and `formControl`\n * work, and has the shape of a Signal Forms `FormCheckboxControl`, so\n * `[formField]` works and feeds {@link disabled}, {@link required},\n * {@link invalid} and {@link touched} from the field state.\n * `setDisabledState` from forms and the {@link disabled} input are\n * independent; either one locks the checkbox.\n *\n * @example\n * ```html\n * <z-checkbox [(checked)]=\"alleGewaehlt\" [(indeterminate)]=\"teilweise\">Alle auswählen</z-checkbox>\n * <z-checkbox [formField]=\"formular.agb\" ariaDescribedby=\"agb-fehler\">Ich stimme den Bedingungen zu</z-checkbox>\n * <z-checkbox [formControl]=\"agb\">Ich stimme den Bedingungen zu</z-checkbox>\n * <z-checkbox ariaLabel=\"Beispiel-Server 1 auswählen\" />\n * ```\n */\n@Component({\n selector: 'z-checkbox',\n template: `\n <label class=\"z-check\">\n <input\n #feld\n type=\"checkbox\"\n [disabled]=\"gesperrt()\"\n [required]=\"required()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"ariaDescribedby() || null\"\n [attr.aria-invalid]=\"invalid() && touched() ? 'true' : null\"\n (change)=\"aufAenderung($event)\"\n (blur)=\"beruehrt()\"\n /><span><ng-content /></span>\n </label>\n `,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ZCheckbox), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZCheckbox implements ControlValueAccessor, FormCheckboxControl {\n /**\n * Checked state, two-way bindable. Also the value seen by `ngModel` and\n * `formControl`.\n *\n * @default false\n */\n readonly checked = model(false);\n\n /**\n * Locks the checkbox. Independent of `setDisabledState` from forms; either\n * one is enough. Boolean attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * `aria-label` of the native input, for a checkbox without visible text.\n * Empty writes no attribute.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * `aria-describedby` of the native input: the `id`s of the error or hint\n * sentence that belongs to the checkbox, separated by spaces. Empty writes no\n * attribute.\n *\n * @default ''\n */\n readonly ariaDescribedby = input('');\n\n /**\n * Mixed state of a \"select all\" checkbox, two-way bindable. Mirrored onto the\n * native `indeterminate` property, which a screen reader reads as\n * `aria-checked=\"mixed\"`. It is no value: forms never see it, and a user\n * interaction clears it, the way the browser does on the element.\n *\n * @default false\n */\n readonly indeterminate = model(false);\n\n /**\n * Marks the native input as `required`. Set by `[formField]` from a\n * `required()` rule. Boolean attribute.\n *\n * @default false\n */\n readonly required = input(false, { transform: booleanAttribute });\n\n /**\n * Validation failed. Writes `aria-invalid=\"true\"` onto the native input while\n * {@link touched} holds too; there is no error colour for a checkbox. Set by\n * `[formField]` from the field state. Boolean attribute.\n *\n * @default false\n */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the user has left the checkbox, which gates {@link invalid}, so an\n * untouched form does not start out in error. Set by `[formField]`; outside\n * Signal Forms it stays `true` and {@link invalid} alone decides.\n *\n * @default true\n */\n readonly touched = input(true, { transform: booleanAttribute });\n\n /** Lock coming from forms, independent of the `disabled` input. Either one is enough. */\n private readonly formsGesperrt = signal(false);\n protected readonly gesperrt = computed(() => this.disabled() || this.formsGesperrt());\n\n private melde?: (wert: boolean) => void;\n private aufBeruehrt?: () => void;\n\n private readonly feld = viewChild.required<ElementRef<HTMLInputElement>>('feld');\n\n constructor() {\n // The check mark is written straight onto the element, not through a\n // [checked] binding. A click changes the checkedness on the element\n // itself. If a control reverts the input before a change detection ran,\n // the expression still holds the same value as last rendered and the\n // binding would not write: field and control would drift apart. That is\n // why Angular's own accessors write straight onto the element too.\n effect(() => {\n const feld = this.feld().nativeElement;\n feld.checked = this.checked();\n feld.indeterminate = this.indeterminate();\n });\n }\n\n protected aufAenderung(ereignis: Event): void {\n const wert = (ereignis.target as HTMLInputElement).checked;\n this.checked.set(wert);\n this.indeterminate.set(false);\n this.melde?.(wert);\n }\n\n protected beruehrt(): void {\n this.aufBeruehrt?.();\n }\n\n /**\n * `ControlValueAccessor`: takes the value from the form. `null` and\n * `undefined` count as unchecked.\n */\n writeValue(wert: boolean): void {\n this.checked.set(!!wert);\n }\n\n /**\n * `ControlValueAccessor`: registers the callback that reports a new value to\n * the form. It fires on a change of the native checkbox, not on writes\n * through {@link checked}.\n */\n registerOnChange(fn: (wert: boolean) => void): void {\n this.melde = fn;\n }\n\n /** `ControlValueAccessor`: registers the callback fired when the checkbox loses focus. */\n registerOnTouched(fn: () => void): void {\n this.aufBeruehrt = fn;\n }\n\n /** `ControlValueAccessor`: locks or unlocks the checkbox from the form side. */\n setDisabledState(gesperrt: boolean): void {\n this.formsGesperrt.set(gesperrt);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormCheckboxControl } from '@angular/forms/signals';\n\n/**\n * Switches a setting that takes effect without a save button, on a native\n * `<input type=\"checkbox\" role=\"switch\">`. For choices that only take effect\n * on submit use `z-checkbox`.\n *\n * Renders that single input with the class `z-toggle` and nothing else; the\n * label belongs to the surrounding `z-setting` row. Off is `surface` with\n * `border-control`, on is `success`, because \"on\" is a state and not an\n * action.\n *\n * Accessibility: `role=\"switch\"` makes the state readable as on or off. Inside\n * a `z-setting` row the caller points {@link ariaLabelledby} at the `titleId`\n * of the row title; standing alone the toggle carries {@link ariaLabel}.\n * Either attribute is only written when it is not empty. The switch state\n * lives directly on the native element, written in an `effect`, so a control\n * that rejects a switch still keeps element and model in sync.\n *\n * Forms: implements `ControlValueAccessor`, so `ngModel` and `formControl`\n * work, and has the shape of a Signal Forms `FormCheckboxControl`, so\n * `[formField]` works and feeds {@link disabled}, {@link invalid} and\n * {@link touched} from the field state. `setDisabledState` from forms and the\n * {@link disabled} input are independent; either one locks the toggle.\n *\n * @example\n * ```html\n * <z-setting title=\"PvP\" key=\"pvp\" description=\"Spieler können sich gegenseitig angreifen.\" titleId=\"pvp-titel\">\n * <z-toggle [(checked)]=\"pvp\" ariaLabelledby=\"pvp-titel\" />\n * </z-setting>\n * ```\n */\n@Component({\n selector: 'z-toggle',\n template: `\n <input\n #feld\n class=\"z-toggle\"\n type=\"checkbox\"\n role=\"switch\"\n [disabled]=\"gesperrt()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [attr.aria-describedby]=\"ariaDescribedby() || null\"\n [attr.aria-invalid]=\"invalid() && touched() ? 'true' : null\"\n (change)=\"aufAenderung($event)\"\n (blur)=\"beruehrt()\"\n />\n `,\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ZToggle), multi: true }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZToggle implements ControlValueAccessor, FormCheckboxControl {\n /**\n * Switch state, two-way bindable: `true` is on. Also the value seen by\n * `ngModel` and `formControl`.\n *\n * @default false\n */\n readonly checked = model(false);\n\n /**\n * Locks the toggle. Independent of `setDisabledState` from forms; either one\n * is enough. Boolean attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * `aria-label` of the switch, for a toggle without a row title. Empty writes\n * no attribute.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * `aria-labelledby` of the switch, normally the `titleId` of the surrounding\n * `z-setting` row. Takes precedence over {@link ariaLabel} in a screen\n * reader. Empty writes no attribute.\n *\n * @default ''\n */\n readonly ariaLabelledby = input('');\n\n /**\n * `aria-describedby` of the switch: the `id`s of the error or hint sentence\n * that belongs to it, separated by spaces, for example the description of\n * the `z-setting` row. Empty writes no attribute.\n *\n * @default ''\n */\n readonly ariaDescribedby = input('');\n\n /**\n * Validation failed. Writes `aria-invalid=\"true\"` onto the switch while\n * {@link touched} holds too; there is no error colour for a toggle. Set by\n * `[formField]` from the field state. Boolean attribute.\n *\n * @default false\n */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the user has left the toggle, which gates {@link invalid}, so an\n * untouched form does not start out in error. Set by `[formField]`; outside\n * Signal Forms it stays `true` and {@link invalid} alone decides.\n *\n * @default true\n */\n readonly touched = input(true, { transform: booleanAttribute });\n\n /** Lock coming from forms, independent of the `disabled` input. Either one is enough. */\n private readonly formsGesperrt = signal(false);\n protected readonly gesperrt = computed(() => this.disabled() || this.formsGesperrt());\n\n private melde?: (wert: boolean) => void;\n private aufBeruehrt?: () => void;\n\n private readonly feld = viewChild.required<ElementRef<HTMLInputElement>>('feld');\n\n constructor() {\n // The switch state is written straight onto the element, not through a\n // [checked] binding. A click changes the checkedness on the element\n // itself. If a control reverts the input before a change detection ran,\n // the expression still holds the same value as last rendered and the\n // binding would not write: field and control would drift apart.\n effect(() => {\n this.feld().nativeElement.checked = this.checked();\n });\n }\n\n protected aufAenderung(ereignis: Event): void {\n const wert = (ereignis.target as HTMLInputElement).checked;\n this.checked.set(wert);\n this.melde?.(wert);\n }\n\n protected beruehrt(): void {\n this.aufBeruehrt?.();\n }\n\n /**\n * `ControlValueAccessor`: takes the value from the form. `null` and\n * `undefined` count as off.\n */\n writeValue(wert: boolean): void {\n this.checked.set(!!wert);\n }\n\n /**\n * `ControlValueAccessor`: registers the callback that reports a new value to\n * the form. It fires on a change of the switch, not on writes through\n * {@link checked}.\n */\n registerOnChange(fn: (wert: boolean) => void): void {\n this.melde = fn;\n }\n\n /** `ControlValueAccessor`: registers the callback fired when the toggle loses focus. */\n registerOnTouched(fn: () => void): void {\n this.aufBeruehrt = fn;\n }\n\n /** `ControlValueAccessor`: locks or unlocks the toggle from the form side. */\n setDisabledState(gesperrt: boolean): void {\n this.formsGesperrt.set(gesperrt);\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * One row of a settings list: title, configuration key and effect on the left,\n * the control itself on the right as projected content.\n *\n * Renders the class `z-setting` on the host and inside it a\n * `div.z-setting__text` with `span.z-setting__title`, optionally the key in\n * `span.z-subtle.z-mono.caption` and the description in `span.z-muted`. The\n * projected control follows that block. Key and description only appear when\n * they are not empty.\n *\n * Accessibility: {@link titleId} puts an `id` on the title so the control in\n * the row can point at it, which is how `z-toggle` gets its name through\n * `ariaLabelledby`. The native `title` attribute is suppressed on the host, so\n * the browser does not hang its own tooltip on the whole row because of the\n * {@link title} input.\n *\n * @example\n * ```html\n * <z-setting\n * title=\"PvP\"\n * key=\"pvp\"\n * description=\"Spieler können sich gegenseitig angreifen.\"\n * titleId=\"pvp-titel\"\n * >\n * <z-toggle [(checked)]=\"pvp\" ariaLabelledby=\"pvp-titel\" />\n * </z-setting>\n * ```\n */\n@Component({\n selector: 'z-setting',\n template: `\n <div class=\"z-setting__text\">\n <span class=\"z-setting__title\" [attr.id]=\"titleId() || null\">{{ title() }}</span>\n @if (key()) {\n <span class=\"z-subtle z-mono caption\">{{ key() }}</span>\n }\n @if (description()) {\n <span class=\"z-muted\">{{ description() }}</span>\n }\n </div>\n <ng-content />\n `,\n host: {\n class: 'z-setting',\n // Otherwise the browser hangs its own tooltip on the whole row because of\n // the static attribute title=\"…\".\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSetting {\n /**\n * Name of the setting in normal capitalization, without an icon.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Configuration key belonging to the setting, for example `pvp`. Shown in the\n * mono face below the title; empty renders nothing.\n *\n * @default ''\n */\n readonly key = input('');\n\n /**\n * One sentence on what the setting does. If the change only takes effect\n * after a restart, that belongs here. Empty renders nothing.\n *\n * @default ''\n */\n readonly description = input('');\n\n /**\n * `id` written onto the title, so the control in the row can name itself\n * through `aria-labelledby`. Empty writes no attribute.\n *\n * @default ''\n */\n readonly titleId = input('');\n}\n","import {\n EnvironmentProviders,\n InjectionToken,\n inject,\n makeEnvironmentProviders,\n} from '@angular/core';\n\n/**\n * Every default text the library ships, in one place.\n *\n * The library holds no copy of its own beyond these: they are the accessible\n * names and the one visible sentence that a component cannot leave empty\n * without breaking screen readers. Everything else comes from the caller as an\n * input.\n *\n * A key is a plain `string` when the text is fixed and a function when it takes\n * parameters. Components read the registry through {@link Z_LABELS}; an input\n * set on the element still wins over the registry value.\n *\n * @see {@link Z_LABELS_DE} for the German defaults, {@link Z_LABELS_EN} for the\n * English ones and {@link provideZenitLabels} to override single keys.\n */\nexport interface ZLabels {\n /** `aria-label` of the back button in `z-pagination`. */\n paginationPrev: string;\n\n /** `aria-label` of the forward button in `z-pagination`. */\n paginationNext: string;\n\n /** Accessible name of the `<nav>` landmark around the pager in `z-pagination`. */\n paginationNav: string;\n\n /**\n * The sentence in front of the pagination buttons.\n *\n * @param from Number of the first entry on the current page, 1-based.\n * @param to Number of the last entry on the current page.\n * @param total Number of entries in the whole list.\n * @param itemLabel What the list contains, for example \"Rechnungen\".\n * @returns The rendered sentence, for example `1 bis 25 von 118 Rechnungen`.\n */\n paginationRange: (from: number, to: number, total: number, itemLabel: string) => string;\n\n /** Visible label of the page size select in `z-pagination`. */\n paginationPageSize: string;\n\n /** `aria-label` of the minus button of `z-slider`, shown with `steppers`. */\n sliderDecrease: string;\n\n /** `aria-label` of the plus button of `z-slider`, shown with `steppers`. */\n sliderIncrease: string;\n\n /** `aria-label` of the log region in `z-console`. */\n consoleLog: string;\n\n /** `aria-label` of the command input in `z-console`. */\n consoleInput: string;\n\n /** Caption of the button that jumps back to the end of the log in `z-console`. */\n consoleJumpToEnd: string;\n\n /** `aria-label` of the menu button of `z-app-header`, shown below 900px. */\n headerMenu: string;\n\n /** `aria-label` of the close button on every toast in `z-toast-outlet`. */\n toastClose: string;\n\n /** Accessible name of the scrollable region `z-table-container`. */\n tableRegion: string;\n\n /** Caption of the \"Ändern\" button on a finished step of `z-wizard-step`. */\n wizardEdit: string;\n\n /** The one line `z-combobox` shows when nothing matches and `emptyText` is empty. */\n comboboxEmpty: string;\n\n /**\n * How many entries are left after filtering in `z-combobox`, for the live\n * region that a screen reader hears while the list itself stays unseen.\n *\n * @param count Number of entries in the open panel, always 1 or more.\n * @returns The rendered sentence, for example `3 Treffer`.\n */\n comboboxResults: (count: number) => string;\n\n /** The row and the announcement of `z-combobox` while `loading` is set. */\n comboboxLoading: string;\n\n /**\n * The row of `z-combobox` that commits the typed text as the value, shown\n * with `allowCustom` when the text matches no entry.\n *\n * @param text What the visitor typed, trimmed.\n * @returns The rendered row, for example `„Hardware“ übernehmen`.\n */\n comboboxUseCustom: (text: string) => string;\n\n /**\n * The row of `z-combobox` that stands in for the list while the typed text\n * is shorter than `minQueryLength`.\n *\n * @param count The least number of characters, `minQueryLength`.\n * @returns The rendered row, for example `Mindestens 2 Zeichen eingeben`.\n */\n comboboxMinQuery: (count: number) => string;\n\n /** Caption of the retry button in `z-price-summary`, used when `retryLabel` is empty. */\n summaryRetry: string;\n\n /** `<title>` of the SVG in `z-cost-chart`, and the accessible name of the plot. */\n chartTitle: string;\n\n /**\n * `<desc>` of the SVG in `z-cost-chart`: the chart in one sentence.\n *\n * @param base Base amount per month.\n * @param rate Price per hour, unrounded.\n * @param cap Upper limit per month.\n * @param capHours Hour at which the cap takes over, rounded for display.\n * @returns The rendered sentence.\n */\n chartDesc: (base: number, rate: number, cap: number, capHours: number) => string;\n\n /**\n * `<desc>` of the SVG in `z-cost-chart` where no cap is reached on the axis:\n * a flat price per hour, or a cap past the last hour shown.\n *\n * @param base Base amount per month.\n * @param rate Price per hour, unrounded.\n * @returns The rendered sentence.\n */\n chartDescOpen: (base: number, rate: number) => string;\n\n /** Label of the first figure above the chart in `z-cost-chart`. */\n chartPerHour: string;\n\n /** Label of the second figure above the chart in `z-cost-chart`. */\n chartCapPerMonth: string;\n\n /**\n * An amount in `z-cost-chart`, in full: comma as the decimal mark, a\n * non-breaking space before the currency.\n *\n * @param value The amount.\n * @returns The rendered amount, for example `5,90 €`.\n */\n chartMoney: (value: number) => string;\n\n /**\n * An amount on the value axis of `z-cost-chart`, without the decimals.\n *\n * @param value The amount.\n * @returns The rendered tick, for example `10 €`.\n */\n chartAxisMoney: (value: number) => string;\n\n /**\n * An hour on the time axis of `z-cost-chart`.\n *\n * @param hours The hour.\n * @returns The rendered tick, for example `100 h`.\n */\n chartAxisHours: (hours: number) => string;\n\n /**\n * The direct label at the start of the line in `z-cost-chart`.\n *\n * @param base Base amount per month.\n * @returns The rendered label, for example `1,50 € Grundbetrag`.\n */\n chartBaseLabel: (base: number) => string;\n\n /**\n * The direct label at the point where the cap takes over in `z-cost-chart`.\n *\n * @param hours That hour, rounded for display.\n * @returns The rendered label, for example `ab 100 h gedeckelt`.\n */\n chartCapLabel: (hours: number) => string;\n\n /**\n * The hours in the tooltip and in `aria-valuetext` of `z-cost-chart`.\n *\n * @param hours The hour under the cursor.\n * @returns The rendered text, for example `50 h gespielt`.\n */\n chartPlayed: (hours: number) => string;\n\n /** Caption of the disclosure that holds the table in `z-cost-chart`. */\n chartTable: string;\n\n /** Header of the hours column in that table. */\n chartTableHours: string;\n\n /** Header of the cost column in that table. */\n chartTableCost: string;\n\n /**\n * The last row of that table, which stands for every hour from the cap on.\n *\n * @param hours The hour at which the cap takes over.\n * @returns The rendered cell, for example `100 und mehr`.\n */\n chartTableCapRow: (hours: number) => string;\n}\n\n/** German amount: comma as the decimal mark, non-breaking space before the currency. */\nfunction euroDe(wert: number, stellen: number): string {\n return `${wert.toFixed(stellen).replace('.', ',')}\\u00a0€`;\n}\n\n/**\n * Unit price (E-61): two or three decimals, exact to the tenth of a cent. 0.045 stays 0.045,\n * 0.05 stays 0.05, never rounded to two places.\n */\nfunction einzelpreis(wert: number): string {\n const drei = wert.toFixed(3);\n return drei.endsWith('0') ? wert.toFixed(2) : drei;\n}\n\nconst einzelpreisDe = (wert: number) => `${einzelpreis(wert).replace('.', ',')}\\u00a0€`;\nconst einzelpreisEn = (wert: number) => `€${einzelpreis(wert)}`;\n\n/** English amount: the currency in front, point as the decimal mark. */\nfunction euroEn(wert: number, stellen: number): string {\n return `€${wert.toFixed(stellen)}`;\n}\n\n/**\n * German defaults, the value {@link Z_LABELS} falls back to. They match the\n * wording of the design system: normal capitalisation, no slogans.\n */\nexport const Z_LABELS_DE = {\n paginationPrev: 'Vorherige Seite',\n paginationNext: 'Nächste Seite',\n paginationNav: 'Seitennavigation',\n paginationRange: (from, to, total, itemLabel) => `${from} bis ${to} von ${total} ${itemLabel}`,\n paginationPageSize: 'Einträge pro Seite',\n sliderDecrease: 'Verringern',\n sliderIncrease: 'Erhöhen',\n consoleLog: 'Serverlog',\n consoleInput: 'Befehl',\n consoleJumpToEnd: 'Zum Ende',\n headerMenu: 'Menü',\n toastClose: 'Schließen',\n tableRegion: 'Tabelle, seitlich scrollbar',\n wizardEdit: 'Ändern',\n comboboxEmpty: 'Kein Treffer',\n comboboxResults: (count) => (count === 1 ? '1 Treffer' : `${count} Treffer`),\n comboboxLoading: 'Lädt',\n comboboxUseCustom: (text) => `„${text}“ übernehmen`,\n comboboxMinQuery: (count) => `Mindestens ${count} Zeichen eingeben`,\n summaryRetry: 'Erneut versuchen',\n chartTitle: 'Monatliche Kosten nach gespielten Stunden',\n chartDesc: (base, rate, cap, capHours) =>\n `Start bei ${euroDe(base, 2)} Grundbetrag, plus ${einzelpreisDe(rate)} je Stunde, ` +\n `ab ${capHours} Stunden gedeckelt bei ${euroDe(cap, 2)}.`,\n chartDescOpen: (base, rate) =>\n `Start bei ${euroDe(base, 2)} Grundbetrag, plus ${einzelpreisDe(rate)} je Stunde, ohne Deckel auf dieser Achse.`,\n chartPerHour: 'Pro Stunde',\n chartCapPerMonth: 'Höchstens im Monat',\n chartMoney: (value) => euroDe(value, 2),\n chartAxisMoney: (value) => euroDe(value, 0),\n chartAxisHours: (hours) => `${hours}\\u00a0h`,\n chartBaseLabel: (base) => `${euroDe(base, 2)} Grundbetrag`,\n chartCapLabel: (hours) => `ab ${hours}\\u00a0h gedeckelt`,\n chartPlayed: (hours) => `${hours}\\u00a0h gespielt`,\n chartTable: 'Als Tabelle',\n chartTableHours: 'Gespielte Stunden',\n chartTableCost: 'Kosten im Monat',\n chartTableCapRow: (hours) => `${hours} und mehr`,\n} satisfies ZLabels;\n\n/**\n * English equivalents of {@link Z_LABELS_DE}, complete and ready to hand to\n * {@link provideZenitLabels}.\n *\n * @example\n * ```ts\n * providers: [provideZenitLabels(Z_LABELS_EN)];\n * ```\n */\nexport const Z_LABELS_EN = {\n paginationPrev: 'Previous page',\n paginationNext: 'Next page',\n paginationNav: 'Pagination',\n paginationRange: (from, to, total, itemLabel) => `${from} to ${to} of ${total} ${itemLabel}`,\n paginationPageSize: 'Items per page',\n sliderDecrease: 'Decrease',\n sliderIncrease: 'Increase',\n consoleLog: 'Server log',\n consoleInput: 'Command',\n consoleJumpToEnd: 'Jump to end',\n headerMenu: 'Menu',\n toastClose: 'Close',\n tableRegion: 'Table, scrollable horizontally',\n wizardEdit: 'Change',\n comboboxEmpty: 'No match',\n comboboxResults: (count) => (count === 1 ? '1 result' : `${count} results`),\n comboboxLoading: 'Loading',\n comboboxUseCustom: (text) => `Use “${text}”`,\n comboboxMinQuery: (count) => `Type at least ${count} characters`,\n summaryRetry: 'Try again',\n chartTitle: 'Monthly cost by hours played',\n chartDesc: (base, rate, cap, capHours) =>\n `Starts at ${euroEn(base, 2)} base, plus ${einzelpreisEn(rate)} per hour, ` +\n `capped at ${euroEn(cap, 2)} from ${capHours} hours on.`,\n chartDescOpen: (base, rate) =>\n `Starts at ${euroEn(base, 2)} base, plus ${einzelpreisEn(rate)} per hour, with no cap on this axis.`,\n chartPerHour: 'Per hour',\n chartCapPerMonth: 'At most per month',\n chartMoney: (value) => euroEn(value, 2),\n chartAxisMoney: (value) => euroEn(value, 0),\n chartAxisHours: (hours) => `${hours}\\u00a0h`,\n chartBaseLabel: (base) => `${euroEn(base, 2)} base`,\n chartCapLabel: (hours) => `capped from ${hours}\\u00a0h`,\n chartPlayed: (hours) => `${hours}\\u00a0h played`,\n chartTable: 'As a table',\n chartTableHours: 'Hours played',\n chartTableCost: 'Cost per month',\n chartTableCapRow: (hours) => `${hours} and more`,\n} satisfies ZLabels;\n\n/**\n * The label registry the components read. Without a provider it resolves to\n * {@link Z_LABELS_DE}.\n *\n * Provide it directly on a component to change the texts for that subtree\n * only, or through {@link provideZenitLabels} for the application or a route.\n * Read it with {@link injectZLabels}, not with `inject(Z_LABELS)`: a provider\n * written by hand may be incomplete, and only the function fills the gaps.\n *\n * @example\n * ```ts\n * @Component({\n * providers: [{ provide: Z_LABELS, useValue: Z_LABELS_EN }],\n * })\n * ```\n */\nexport const Z_LABELS = new InjectionToken<ZLabels>('Z_LABELS', {\n providedIn: 'root',\n factory: () => Z_LABELS_DE,\n});\n\n/**\n * Overrides label defaults, for the whole application or for a route. Keys\n * that are left out keep the value of the enclosing injector: a route that\n * overrides one key inside an English application stays English otherwise.\n * Without an enclosing provider they keep their German default, so a partial\n * translation stays valid.\n *\n * **Two calls in the same `providers` array do not stack.** The factory reads\n * the enclosing injector with `skipSelf`, and both calls sit in the same\n * injector, so the second one never sees the first: it merges over the parent,\n * which at the root is `Z_LABELS_DE`. `[provideZenitLabels(Z_LABELS_EN),\n * provideZenitLabels({ tableRegion: 'Invoices, scrollable' })]` therefore gives\n * German labels with one English key, not English with one override. Stacking\n * only works across injectors: application root, then a route.\n *\n * For \"English plus one override\" make it one call with a spread.\n *\n * @param labels The keys to replace.\n * @returns Providers for `bootstrapApplication` or a route's `providers`.\n *\n * @example\n * ```ts\n * bootstrapApplication(App, {\n * providers: [\n * // One call, one object: English everywhere, one key of our own.\n * provideZenitLabels({ ...Z_LABELS_EN, tableRegion: 'Invoices, scrollable' }),\n * ],\n * });\n * ```\n */\nexport function provideZenitLabels(labels: Partial<ZLabels>): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: Z_LABELS,\n useFactory: (): ZLabels => ({\n ...(inject(Z_LABELS, { skipSelf: true, optional: true }) ?? Z_LABELS_DE),\n ...labels,\n }),\n },\n ]);\n}\n\n/**\n * Reads the label registry of the current injector, complete. This is what the\n * components of the library call, and what your own components should call.\n *\n * `{ provide: Z_LABELS, useValue: { toastClose: 'Close' } }` compiles when the\n * value is cast or comes from JSON, and would leave every other key\n * `undefined`: an icon-only button without `aria-label`, a `TypeError` for\n * `paginationRange`. The function therefore lays the provided value over\n * {@link Z_LABELS_DE}. Call it in an injection context.\n *\n * @returns Every key of {@link ZLabels}, the German default where the provider has none.\n *\n * @example\n * ```ts\n * export class Pager {\n * private readonly labels = injectZLabels();\n * }\n * ```\n */\nexport function injectZLabels(): ZLabels {\n return { ...Z_LABELS_DE, ...inject(Z_LABELS) };\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n input,\n model,\n numberAttribute,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ZIcon } from '../icon';\nimport { injectZLabels } from '../labels';\n\n/** Set by the Angular build; a production build drops the branch around it. */\ndeclare const ngDevMode: boolean | undefined;\n\nlet laufendeNummer = 0;\n\n/**\n * Sets an amount on a fixed scale, on a native `<input type=\"range\">`: RAM,\n * slots, storage. The current value always stands next to the track as a\n * number with its unit, so the slider never is the only place the amount\n * appears.\n *\n * Renders the class `z-range` on the host, inside it `div.z-range__head` with\n * the `label.z-field__label` and the value in `span.z-range__value`, then the\n * range input, then `div.z-range__ticks` with one `<span>` per entry of\n * {@link ticks} and finally `span.z-field__hint`. Head label, ticks and hint\n * only appear when their input is filled.\n *\n * {@link steppers} adds a minus and a plus button left and right of the track,\n * which the design system requires beyond twelve steps and on devices without a\n * mouse. They are siblings of the range input, and the host class\n * `z-range--steppers` lays the three out in one grid row; without\n * {@link steppers} the markup is exactly the one from before the buttons\n * existed, so the input stays a direct grid item of `.z-range`. Each of them moves the value by one {@link step} on the grid from\n * {@link min}, clamped to the last value of that grid that fits below\n * {@link max}, and writes through the same path as the track, so model,\n * form and `valueChange` see exactly one change. The scale stays what it is; the\n * buttons only add a second way to reach it, and the range input keeps its own\n * arrow keys, Home and End. A development build warns once per instance when a\n * scale has more than twelve steps and {@link steppers} is off.\n *\n * Accessibility: the label is tied to the input through a generated `id`. With\n * no visible label the input takes {@link ariaLabel} instead, and only then.\n * `aria-valuetext` carries the value with its unit, so a screen reader reads\n * \"8 GB\" and not just \"8\". {@link hint} is referenced through\n * `aria-describedby`, while the tick row is `aria-hidden=\"true\"`, since it only\n * repeats the scale the input already reports. Without {@link label} and\n * without {@link ariaLabel} the slider has no name at all, which a development\n * build reports once per instance as a `console.warn`.\n *\n * Scale and value are written straight onto the native element in an `effect`,\n * `min`, `max` and `step` included, because the browser would otherwise clamp\n * the value to the default scale 0 to 100. The same effect reads the value back\n * from the element afterwards: the element clamps to the scale and snaps to the\n * step, and that corrected value becomes the model and is reported to the form,\n * so thumb, display and value never drift apart. A {@link max} below\n * {@link min} is written onto the element as `min`, the way the browsers read\n * it anyway, so the scale collapses onto `min` and the value is `min`.\n *\n * Forms: implements `ControlValueAccessor`, so `ngModel` and `formControl`\n * work, and so does the Signal Forms `[formField]`, which binds through the\n * same accessor. There the scale comes from the schema: Angular rejects\n * `[min]`, `[max]` and `[disabled]` next to `[formField]` and feeds\n * {@link min}, {@link max}, {@link disabled}, {@link invalid} and\n * {@link touched} from the `min()`, `max()` and `disabled()` rules and the\n * field state. `setDisabledState` from forms and the {@link disabled} input\n * are independent; either one locks the slider.\n *\n * @example\n * ```html\n * <z-slider\n * label=\"Arbeitsspeicher\"\n * unit=\"GB\"\n * [min]=\"2\"\n * [max]=\"16\"\n * [step]=\"2\"\n * [ticks]=\"[2, 4, 8, 16]\"\n * hint=\"Für Minecraft mit Mods sind 8 GB empfohlen.\"\n * [(value)]=\"ram\"\n * />\n * ```\n */\n@Component({\n selector: 'z-slider',\n imports: [ZIcon],\n template: `\n <div class=\"z-range__head\">\n @if (label()) {\n <label class=\"z-field__label\" [attr.for]=\"id\">{{ label() }}</label>\n }\n <span class=\"z-range__value\">{{ anzeige() }}</span>\n </div>\n @if (steppers()) {\n <button\n type=\"button\"\n class=\"z-btn z-btn--ghost z-btn--icon z-btn--sm\"\n [attr.aria-label]=\"wenigerText\"\n [disabled]=\"gesperrt()\"\n [attr.aria-disabled]=\"amMinimum() ? 'true' : null\"\n (click)=\"stufe(-1)\"\n >\n <z-icon name=\"remove\" />\n </button>\n }\n <input\n #feld\n type=\"range\"\n [id]=\"id\"\n [attr.aria-label]=\"label() ? null : ariaLabel() || null\"\n [disabled]=\"gesperrt()\"\n [attr.aria-valuetext]=\"anzeige()\"\n [attr.aria-describedby]=\"hint() ? hinweisId : null\"\n [attr.aria-invalid]=\"invalid() && touched() ? 'true' : null\"\n (input)=\"aufEingabe($event)\"\n (blur)=\"beruehrt()\"\n />\n @if (steppers()) {\n <button\n type=\"button\"\n class=\"z-btn z-btn--ghost z-btn--icon z-btn--sm\"\n [attr.aria-label]=\"mehrText\"\n [disabled]=\"gesperrt()\"\n [attr.aria-disabled]=\"amMaximum() ? 'true' : null\"\n (click)=\"stufe(1)\"\n >\n <z-icon name=\"add\" />\n </button>\n }\n @if (ticks().length) {\n <div class=\"z-range__ticks\" aria-hidden=\"true\">\n @for (marke of ticks(); track $index) {\n <span>{{ marke }}</span>\n }\n </div>\n }\n @if (hint()) {\n <span class=\"z-field__hint\" [id]=\"hinweisId\">{{ hint() }}</span>\n }\n `,\n host: { class: 'z-range', '[class.z-range--steppers]': 'steppers()' },\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ZSlider), multi: true }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSlider implements ControlValueAccessor {\n /**\n * Visible label above the track, tied to the input through a generated `id`.\n * Empty renders no label, and then {@link ariaLabel} names the input.\n *\n * @default ''\n */\n readonly label = input('');\n\n /**\n * `aria-label` of the input, used only while {@link label} stays empty. A\n * visible label always wins.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * Lower end of the scale. With `[formField]` it comes from the `min()` rule\n * of the schema; without such a rule, `undefined`, it is the default.\n *\n * @default 0\n */\n readonly min = input(0, { transform: (wert: unknown) => numberAttribute(wert, 0) });\n\n /**\n * Upper end of the scale. With `[formField]` it comes from the `max()` rule\n * of the schema; without such a rule, `undefined`, it is the default.\n *\n * @default 100\n */\n readonly max = input(100, { transform: (wert: unknown) => numberAttribute(wert, 100) });\n\n /**\n * Distance between two bookable steps. Only steps that can actually be\n * ordered belong on the scale.\n *\n * @default 1\n */\n readonly step = input(1, { transform: numberAttribute });\n\n /**\n * Unit behind the value, for example `GB`. Shown next to the number with a\n * non-breaking space and read out through `aria-valuetext`. Empty shows the\n * bare number.\n *\n * @default ''\n */\n readonly unit = input('');\n\n /**\n * Adds a minus and a plus button left and right of the track, each moving the\n * value by one {@link step}. The design system requires them beyond twelve\n * steps and on devices without a mouse. Explicit on purpose:\n * the component never switches them on by itself, because a slider that grows\n * a pair of buttons the moment a `max` changes is a layout that moves without\n * anyone asking for it. A development build warns once per instance when\n * `(max - min) / step` is above twelve and this is still off. Boolean\n * attribute.\n *\n * @default false\n */\n readonly steppers = input(false, { transform: booleanAttribute });\n\n /**\n * Scale values printed below the track, for example `[2, 4, 8, 16]`. Purely\n * visual: the row is `aria-hidden`, and the values change nothing about the\n * scale itself. An empty list renders no tick row.\n *\n * @default []\n */\n readonly ticks = input<readonly (string | number)[]>([]);\n\n /**\n * One sentence below the track, normally the recommendation for the chosen\n * game. Referenced through `aria-describedby`; empty renders nothing.\n *\n * @default ''\n */\n readonly hint = input('');\n\n /**\n * Current value, two-way bindable. Also the value seen by `ngModel` and\n * `formControl`. A value outside {@link min} and {@link max} or between two\n * steps is corrected to the value the element really holds, and that\n * correction is written back here and reported to the form.\n *\n * @default 0\n */\n readonly value = model(0);\n\n /**\n * Locks the slider. Independent of `setDisabledState` from forms; either one\n * is enough. Boolean attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Validation failed. Writes `aria-invalid=\"true\"` onto the range input while\n * {@link touched} holds too; there is no error colour for a slider. Set by\n * `[formField]` from the field state. Boolean attribute.\n *\n * @default false\n */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the user has left the slider, which gates {@link invalid}, so an\n * untouched form does not start out in error. Set by `[formField]`; outside\n * Signal Forms it stays `true` and {@link invalid} alone decides.\n *\n * @default true\n */\n readonly touched = input(true, { transform: booleanAttribute });\n\n protected readonly id = `z-slider-${++laufendeNummer}`;\n protected readonly hinweisId = `${this.id}-hint`;\n\n /** Value with its unit, separated by a non-breaking space. */\n protected readonly anzeige = computed(() =>\n this.unit() ? `${this.value()}\\u{00a0}${this.unit()}` : `${this.value()}`,\n );\n\n /** Lock coming from forms, independent of the `disabled` input. Either one is enough. */\n private readonly formsGesperrt = signal(false);\n protected readonly gesperrt = computed(() => this.disabled() || this.formsGesperrt());\n\n private readonly labels = injectZLabels();\n /** Names of the two buttons; the registry is the only place they come from. */\n protected readonly wenigerText = this.labels.sliderDecrease;\n protected readonly mehrText = this.labels.sliderIncrease;\n\n /**\n * Upper end as the browsers read it: a `max` below `min` collapses the scale\n * onto `min`, the same way the effect writes it onto the element.\n */\n protected readonly obergrenze = computed(() => Math.max(this.min(), this.max()));\n protected readonly amMinimum = computed(() => this.value() <= this.min());\n protected readonly amMaximum = computed(() => this.value() >= this.letzterWert());\n\n /** The step the buttons move by; `0` and `NaN` would otherwise freeze them. */\n private readonly schrittweite = computed(() => Math.abs(this.step()) || 1);\n\n /**\n * Highest value on the step grid from `min`: `max` itself only when it lies\n * on the grid (0 to 10 in steps of 3 ends at 9, as the element snaps it). The\n * `1e-9` keeps a fractional step from losing its last step to float error.\n */\n private readonly letzterWert = computed(() =>\n this.aufRaster(Math.floor((this.obergrenze() - this.min()) / this.schrittweite() + 1e-9)),\n );\n\n private melde?: (wert: number) => void;\n private aufBeruehrt?: () => void;\n\n private readonly feld = viewChild.required<ElementRef<HTMLInputElement>>('feld');\n\n constructor() {\n // Scale and value are written straight onto the element, not through\n // bindings. A pointer input changes the value on the element itself. If a\n // control reverts it before a change detection ran, the expression still\n // holds the same value as last rendered and a [value] binding would not\n // write: track and control would drift apart. min, max and step are part\n // of the same effect, because the browser would otherwise clamp the value\n // to the still unset default scale 0 to 100.\n effect(() => {\n const schiene = this.feld().nativeElement;\n schiene.min = String(this.min());\n // A max below min is an authoring mistake. The browsers resolve it as\n // \"the maximum is at least the minimum\", so the scale collapses onto min;\n // it is written that way, because the engines disagree on which of the\n // two clamps wins otherwise and the value would then keep flipping\n // between min and max.\n schiene.max = String(Math.max(this.min(), this.max()));\n schiene.step = String(this.step());\n schiene.value = String(this.value());\n // The element keeps itself on the scale: it clamps to min and max and\n // rounds onto the step. Without reading that back, thumb, aria-valuetext\n // and model would name three different numbers. The correction runs at\n // most once, because the next pass reads back exactly the value it has\n // just written.\n //\n // `Number.isFinite`, not `!Number.isNaN`: only an engine that really\n // parses the value answers with a number at all. The server has no\n // layout and no value parsing, so `valueAsNumber` is `undefined` there —\n // and `Number.isNaN(undefined)` is `false`, so the old guard let it\n // through and the slider reported `undefined` to the form, which dropped\n // the field out of the model and took `[formField]` down with it.\n const echt = schiene.valueAsNumber;\n if (Number.isFinite(echt) && echt !== untracked(this.value)) {\n this.value.set(echt);\n this.melde?.(echt);\n }\n });\n\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n // After the first render, so a name arriving through a binding is there.\n afterNextRender(() => {\n if (!this.label() && !this.ariaLabel()) {\n console.warn(\n 'ZSlider: Der Regler hat keinen zugänglichen Namen. Setze label=\"…\" für ein sichtbares Label oder ariaLabel=\"…\" ohne sichtbares Label.',\n );\n }\n const stufen = (this.obergrenze() - this.min()) / this.schrittweite();\n if (!this.steppers() && stufen > 12) {\n console.warn(\n `ZSlider: ${Math.round(stufen)} Stufen ohne steppers. ` +\n 'spec/components/Slider/README.md: \"Bei mehr als 12 Stufen oder auf Geräten ohne ' +\n 'Maus zusätzlich Plus- und Minus-Buttons anbieten.\" Setze steppers am z-slider.',\n );\n }\n });\n }\n }\n\n /**\n * One step up or down, the way the two buttons move the value: clamped to the\n * scale and reported through the same path as an input on the track, so model,\n * form and `valueChange` see exactly one change. A button that is only marked\n * `aria-disabled` keeps the focus, so its click is swallowed here.\n */\n protected stufe(richtung: 1 | -1): void {\n if (this.gesperrt() || (richtung < 0 ? this.amMinimum() : this.amMaximum())) {\n return;\n }\n const k = Math.round((untracked(this.value) - this.min()) / this.schrittweite()) + richtung;\n const ziel = Math.min(Math.max(this.aufRaster(k), this.min()), this.letzterWert());\n if (ziel === untracked(this.value)) {\n return;\n }\n this.value.set(ziel);\n this.melde?.(ziel);\n }\n\n /**\n * Grid value number `k`, `min + k * step`, without the float error of the\n * product (`3 * 0.1` is `0.30000000000000004`), so the element never has to\n * correct a value the buttons wrote.\n */\n private aufRaster(k: number): number {\n return Number((this.min() + k * this.schrittweite()).toPrecision(12));\n }\n\n protected aufEingabe(ereignis: Event): void {\n const wert = (ereignis.target as HTMLInputElement).valueAsNumber;\n this.value.set(wert);\n this.melde?.(wert);\n }\n\n protected beruehrt(): void {\n this.aufBeruehrt?.();\n }\n\n /**\n * `ControlValueAccessor`: takes the value from the form. `null` and\n * `undefined` fall back to {@link min}.\n */\n writeValue(wert: number): void {\n this.value.set(Number(wert ?? this.min()));\n }\n\n /**\n * `ControlValueAccessor`: registers the callback that reports a new value to\n * the form. It fires on every `input` of the track, so while dragging, not on\n * writes through {@link value}.\n */\n registerOnChange(fn: (wert: number) => void): void {\n this.melde = fn;\n }\n\n /** `ControlValueAccessor`: registers the callback fired when the track loses focus. */\n registerOnTouched(fn: () => void): void {\n this.aufBeruehrt = fn;\n }\n\n /** `ControlValueAccessor`: locks or unlocks the slider from the form side. */\n setDisabledState(gesperrt: boolean): void {\n this.formsGesperrt.set(gesperrt);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { leiheAttribut } from '../a11y/host-attribute';\n\n/** One view in a segment. */\nexport interface ZSegmentOption {\n /** The value reported through `value`. Also the tracking key of the list. */\n value: string;\n /** Short noun shown on the button, without an icon. */\n label: string;\n}\n\n/**\n * Segment switches the view on the same data, at most four options: the period\n * in the billing view, open versus closed in support, filters. For sub-pages\n * with a URL of their own use `ZTabs` instead.\n *\n * Renders one `<button type=\"button\">` per option and puts the class\n * `z-segment` on the host.\n *\n * Accessibility: the host is a `role=\"group\"` named by {@link ariaLabel}; the\n * chosen option carries `aria-pressed=\"true\"`, all others `\"false\"`. Without\n * {@link ariaLabel} an `aria-label` the caller wrote on `<z-segment>` itself\n * names the group, static or bound: the input wins while it holds a value, and\n * the caller's attribute stands while it does not. `aria-labelledby` is never\n * written by the component, so it always belongs to the caller. The\n * buttons are ordinary tab stops, so the Tab key moves between them and Enter\n * or Space picks one. While disabled every button is `disabled` and therefore\n * out of the tab order.\n *\n * Implements `ControlValueAccessor`, so `ngModel` and reactive forms work\n * alongside the two-way binding on {@link value}, and has the shape of a\n * Signal Forms `FormValueControl<string>`, so `[formField]` works and feeds\n * {@link disabled} from the field state. A segment picks a view and has no\n * invalid state: `role=\"group\"` does not take `aria-invalid`.\n *\n * @example\n * ```html\n * <z-segment\n * [options]=\"[{ value: '1', label: '1 Monat' }, { value: '12', label: '12 Monate' }]\"\n * [(value)]=\"zeitraum\"\n * ariaLabel=\"Zeitraum\"\n * />\n * ```\n */\n@Component({\n selector: 'z-segment',\n template: `\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n [attr.aria-pressed]=\"option.value === value()\"\n [disabled]=\"gesperrt()\"\n (click)=\"waehle(option.value)\"\n (blur)=\"beruehrt()\"\n >\n {{ option.label }}\n </button>\n }\n `,\n host: {\n class: 'z-segment',\n role: 'group',\n },\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ZSegment), multi: true }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSegment implements ControlValueAccessor, FormValueControl<string> {\n /**\n * The options in display order, at most four. Tracked by `value`, so those\n * have to be unique.\n *\n * @default []\n */\n readonly options = input<readonly ZSegmentOption[]>([]);\n\n /**\n * The chosen option's `value`, two-way bindable. A value that matches no\n * option leaves every button unpressed.\n *\n * @default ''\n */\n readonly value = model('');\n\n /**\n * Accessible name of the group, for example \"Zeitraum\". Empty leaves the\n * naming to the caller: an `aria-label` or `aria-labelledby` written on\n * `<z-segment>` stays where it is.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * Disables every button. Independent of the disabled state that reactive\n * forms set; either one is enough to lock the segment.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Lock coming from forms, independent of the `disabled` input. Either one suffices. */\n private readonly formsGesperrt = signal(false);\n protected readonly gesperrt = computed(() => this.disabled() || this.formsGesperrt());\n\n private melde?: (wert: string) => void;\n private aufBeruehrt?: () => void;\n\n constructor() {\n // `[attr.aria-label]` as a host binding would write `null` whenever the\n // input is empty and thereby delete the `aria-label` the caller wrote on\n // `<z-segment>`, which used to leave the group without any name at all.\n leiheAttribut('aria-label', () => this.ariaLabel() || null);\n }\n\n protected waehle(wert: string): void {\n if (wert === this.value()) {\n return;\n }\n this.value.set(wert);\n this.melde?.(wert);\n }\n\n protected beruehrt(): void {\n this.aufBeruehrt?.();\n }\n\n /**\n * `ControlValueAccessor`: takes the value from the form. `null` and\n * `undefined` become the empty string, which selects nothing.\n */\n writeValue(wert: string): void {\n this.value.set(wert ?? '');\n }\n\n /**\n * `ControlValueAccessor`: registers the callback that reports a new value to\n * the form. It fires on a click on a different option, not on writes through\n * {@link value}.\n */\n registerOnChange(fn: (wert: string) => void): void {\n this.melde = fn;\n }\n\n /** `ControlValueAccessor`: registers the callback fired when a button loses focus. */\n registerOnTouched(fn: () => void): void {\n this.aufBeruehrt = fn;\n }\n\n /** `ControlValueAccessor`: locks or unlocks the segment from the form side. */\n setDisabledState(gesperrt: boolean): void {\n this.formsGesperrt.set(gesperrt);\n }\n}\n","/* Package formulare: Checkbox, Toggle, Setting, Slider and Segment. */\n\nexport * from '../checkbox';\nexport * from '../toggle';\nexport * from '../slider';\nexport * from '../segment';\n","import { booleanAttribute, Directive, input } from '@angular/core';\n\n/**\n * Tab bar for the sub-pages of one area. Every tab is a link with its own URL.\n *\n * Adds the class `z-tabs` to the host `<nav>` and renders no markup of its own.\n * On narrow screens the bar scrolls horizontally, it never wraps. Put an\n * `aria-label` on the `<nav>` naming the area the tabs belong to, so the\n * landmark is distinguishable from the other navigations on the page.\n *\n * Use `ZSegment` instead when the options only switch the view on the same data.\n *\n * @example\n * ```html\n * <nav zTabs aria-label=\"Hosting\">\n * <a zTab routerLink=\"uebersicht\" [active]=\"true\">Übersicht</a>\n * <a zTab routerLink=\"apps\">Apps</a>\n * <a zTab routerLink=\"speicher\">Speicher</a>\n * </nav>\n * ```\n */\n@Directive({\n selector: 'nav[zTabs]',\n host: { class: 'z-tabs' },\n})\nexport class ZTabs {}\n\n/**\n * One tab inside `nav[zTabs]`, always a link. Carries the class `z-tab`.\n *\n * When `active` is set the host gets `aria-current=\"page\"`; that attribute is\n * both what assistive technology announces and what the stylesheet draws the\n * 2px underline from. The library does not read the router, so the caller\n * decides which tab is active. The link itself brings keyboard support, the\n * directive adds none.\n *\n * @example\n * ```html\n * <a zTab routerLink=\"speicher\" [active]=\"bereich() === 'speicher'\">Speicher</a>\n * ```\n */\n@Directive({\n selector: 'a[zTab]',\n host: {\n class: 'z-tab',\n '[attr.aria-current]': `active() ? \"page\" : null`,\n },\n})\nexport class ZTab {\n /**\n * Whether this tab points at the page currently shown. Written as a bare\n * attribute (`active`) it counts as `true`.\n *\n * @default false\n */\n readonly active = input(false, { transform: booleanAttribute });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n untracked,\n viewChildren,\n} from '@angular/core';\n\n/** Counts up once per panel, so two groups on one page never share an id. */\nlet panelZaehler = 0;\n\n/**\n * One view of a `z-tab-group`: its caption in the tab bar and its content below\n * it. The caption is the {@link label} input, the content is projected.\n *\n * Renders the host as `role=\"tabpanel\"` with `tabindex=\"0\"` and\n * `aria-labelledby` pointing at its own tab. While the panel is not the active\n * one the host carries the `hidden` attribute, so it is out of the layout and\n * out of the accessibility tree.\n *\n * The content is wrapped in an `ng-template` and rendered through\n * `ngTemplateOutlet`, so only the active panel's content stands in the\n * document. What that saves and what it does not: the elements are removed\n * from the document, the component instances behind them are not destroyed,\n * because Angular creates projected nodes together with the view that declares\n * them. So this saves DOM and layout work, never a request or a constructor.\n * Set {@link ZTabGroup.keepAlive} when the elements themselves have to survive\n * a tab change, for example a scroll position, a playing `<video>` or an\n * `<iframe>` that must not reload.\n *\n * @example\n * ```html\n * <z-tab-panel value=\"speicher\" label=\"Speicher\" disabled>\n * <p>12,4 GB von 40 GB belegt.</p>\n * </z-tab-panel>\n * ```\n */\n@Component({\n selector: 'z-tab-panel',\n imports: [NgTemplateOutlet],\n template: `<ng-template #inhalt><ng-content /></ng-template>\n @if (sichtbar()) {\n <ng-container [ngTemplateOutlet]=\"inhalt\" />\n }`,\n host: {\n role: 'tabpanel',\n // Always a tab stop instead of checking after every render whether the\n // panel holds something focusable: the content is whatever the caller\n // projects, so such a check would have to run again on every change of it\n // and would still be wrong in between. An extra tab stop is what the\n // WAI-ARIA Tabs pattern asks for when the panel has no focusable element,\n // and it is harmless when it has one.\n tabindex: '0',\n '[id]': 'panelId',\n '[attr.aria-labelledby]': 'tabId',\n '[attr.hidden]': `aktiv() ? null : ''`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZTabPanel {\n /**\n * Identifies the panel. This is what `z-tab-group` reports through its\n * `value` model and what the caller binds against, instead of an index that\n * moves as soon as a panel is added. Unique within one group.\n */\n readonly value = input.required<string>();\n\n /**\n * Caption of the tab, a short noun without an icon. The text comes from the\n * caller; the library holds no German strings.\n */\n readonly label = input.required<string>();\n\n /**\n * Locks the tab: it is a natively `disabled` button, so it cannot be clicked\n * and the arrow keys skip it. A locked control never says why by itself, so\n * write the reason next to the group as visible text. Boolean attribute, so\n * `disabled` alone counts as `true`.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Id of the tab that opens this panel, rendered by the group.\n *\n * @internal Wiring between `z-tab-group` and its panels.\n */\n readonly tabId = `z-tab-${++panelZaehler}`;\n\n /**\n * Id of this panel, pointed at by `aria-controls` of its tab.\n *\n * @internal Wiring between `z-tab-group` and its panels.\n */\n readonly panelId = `z-tabpanel-${panelZaehler}`;\n\n private readonly gruppe = inject(ZTabGroup, { optional: true });\n\n /**\n * Whether this is the panel the group currently shows.\n *\n * An empty `value` on the group means \"the first enabled panel\", and that\n * question is answered here from `disabled` alone. The panel deliberately\n * never reads the `value` of its siblings: a `@for` creates every panel\n * before it binds the inputs of any of them, and the first panel renders\n * while the last one still has no `value`, which would throw NG0950. The one\n * case that does need all values, a `value` that matches no panel, is\n * corrected by `ZTabGroup` after the render.\n *\n * @internal Read by `z-tab-group` for `aria-selected` and the roving tabindex.\n */\n readonly aktiv = computed(() => {\n const gruppe = this.gruppe;\n if (!gruppe) {\n return true;\n }\n const wert = gruppe.value();\n return wert ? wert === this.value() : gruppe.erstesOffenes() === this;\n });\n\n /** Stays `true` once the panel has been active, which is what `keepAlive` keeps. */\n private readonly besucht = linkedSignal<boolean, boolean>({\n source: this.aktiv,\n computation: (aktiv, vorher) => aktiv || (vorher?.value ?? false),\n });\n\n /**\n * Whether the panel's content stands in the document.\n *\n * @internal Read by `z-tab-group`, which points `aria-controls` only at a\n * panel that is really there.\n */\n readonly sichtbar = computed(() => {\n // Read first and not behind the `||`: a linkedSignal only remembers what it\n // has been evaluated for, and behind the short circuit it would first be\n // read once the panel is already inactive, which is a panel that counts as\n // never visited.\n const besucht = this.besucht();\n return this.aktiv() || (this.gruppe?.keepAlive() === true && besucht);\n });\n}\n\n/**\n * Tabs for views that have no address of their own: the WAI-ARIA Tabs pattern\n * as `role=\"tablist\"` with `role=\"tab\"` buttons and one `role=\"tabpanel\"` per\n * view.\n *\n * Use `ZTabs` with `a[zTab]` instead whenever each view can have its own URL.\n * Links are the better tabs: they can be bookmarked, opened in a new tab and\n * the back button works on them. Reach for `z-tab-group` only where adding a\n * route is not possible or not wanted, for example a dialog with two forms or\n * a panel section that must not appear in the history.\n *\n * Renders `div.z-tabs[role=\"tablist\"]` with one `button.z-tab[role=\"tab\"]` per\n * projected `z-tab-panel`, and below it the panels themselves. The active tab\n * carries `aria-selected=\"true\"`, which is what the stylesheet draws the 2px\n * underline from.\n *\n * Accessibility: automatic activation, so an arrow key moves the focus and\n * switches the view in one step. Arrow Left and Right step through the tabs and\n * wrap around, Home and End jump to the first and the last one, disabled tabs\n * are skipped, and in a right-to-left context the two arrows swap. Only the\n * active tab is a tab stop (roving `tabindex`), so Tab leads from the bar into\n * the panel. Name the bar with {@link ariaLabel} or {@link ariaLabelledby}.\n *\n * @example\n * ```html\n * <z-tab-group ariaLabel=\"Serveransichten\" [(value)]=\"ansicht\">\n * <z-tab-panel value=\"uebersicht\" label=\"Übersicht\">\n * <p>2 von 20 Spielern online.</p>\n * </z-tab-panel>\n * <z-tab-panel value=\"speicher\" label=\"Speicher\">\n * <p>12,4 GB von 40 GB belegt.</p>\n * </z-tab-panel>\n * </z-tab-group>\n * ```\n */\n@Component({\n selector: 'z-tab-group',\n template: `<div\n class=\"z-tabs\"\n role=\"tablist\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n >\n @for (panel of panels(); track panel) {\n <button\n #knopf\n class=\"z-tab\"\n type=\"button\"\n role=\"tab\"\n [id]=\"panel.tabId\"\n [disabled]=\"panel.disabled()\"\n [attr.aria-selected]=\"panel.aktiv()\"\n [attr.aria-controls]=\"panel.sichtbar() ? panel.panelId : null\"\n [attr.tabindex]=\"panel.aktiv() ? 0 : -1\"\n (click)=\"waehle(panel)\"\n (keydown)=\"aufTaste($event)\"\n >\n {{ panel.label() }}\n </button>\n }\n </div>\n <ng-content />`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZTabGroup {\n /**\n * Accessible name of the tab bar, for example \"Serveransichten\". Empty\n * writes no `aria-label`; use {@link ariaLabelledby} instead when a visible\n * heading already names the group.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * Id of the element that names the tab bar, usually the heading above it.\n * Empty writes no `aria-labelledby`.\n *\n * @default ''\n */\n readonly ariaLabelledby = input('');\n\n /**\n * The active panel's {@link ZTabPanel.value}, two-way bindable. Empty or a\n * value that matches no enabled panel falls back to the first enabled one,\n * and that fallback is written back, so the caller never holds a value the\n * group does not show. With no panel at all the value is left alone.\n *\n * @default ''\n */\n readonly value = model('');\n\n /**\n * Keeps every panel that has been active in the document and hides the\n * inactive ones with the `hidden` attribute, instead of rendering the active\n * one alone. Turn it on when the elements of a panel have to survive a tab\n * change: a scroll position, a playing `<video>`, an `<iframe>` that must not\n * reload. Boolean attribute.\n *\n * @default false\n */\n readonly keepAlive = input(false, { transform: booleanAttribute });\n\n protected readonly panels = contentChildren(ZTabPanel);\n private readonly knoepfe = viewChildren<ElementRef<HTMLButtonElement>>('knopf');\n private readonly wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n /** The panels an arrow key may land on. */\n private readonly bedienbar = computed(() => this.panels().filter((p) => !p.disabled()));\n\n /**\n * The panel an empty {@link value} means. Reads `disabled` only, never a\n * `value`, so a panel may ask for it while its siblings are still unbound.\n *\n * @internal Read by `z-tab-panel`.\n */\n readonly erstesOffenes = computed(() => this.bedienbar()[0]);\n\n /**\n * The value actually shown: {@link value} when an enabled panel carries it,\n * otherwise the first enabled panel. Reads the `value` of every panel and is\n * therefore only read after the render and from event handlers, never while\n * the panels are being created.\n */\n private readonly aktiverWert = computed(() => {\n const offen = this.bedienbar();\n const gewaehlt = offen.find((panel) => panel.value() === this.value());\n return (gewaehlt ?? offen[0])?.value() ?? '';\n });\n\n constructor() {\n // Writes the fallback back into the model of the parent, the same case as\n // the clamped page of ZPagination (docs/signals.md, \"Effects\", case 3): a\n // computed cannot write. It runs when the group starts without a value and\n // when the active panel disappears. Without any panel nothing is written,\n // so a value set before the panels arrive survives.\n // After the render and not in a plain effect(): a plain effect runs while\n // the content query already holds a panel that a `@for` has just created\n // whose required `value` is still unbound, and reading it throws NG0950.\n // After the render every panel is bound.\n afterRenderEffect(() => {\n const wert = this.aktiverWert();\n if (this.bedienbar().length && untracked(this.value) !== wert) {\n this.value.set(wert);\n }\n });\n }\n\n /** Activates a panel, moves the focus onto its tab and scrolls it into view. */\n protected waehle(panel: ZTabPanel): void {\n this.value.set(panel.value());\n const knopf = this.knoepfe()[this.panels().indexOf(panel)]?.nativeElement;\n knopf?.focus();\n // Optional because a test environment without layout does not implement it.\n knopf?.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n }\n\n protected aufTaste(ereignis: KeyboardEvent): void {\n const offen = this.bedienbar();\n if (!offen.length) {\n return;\n }\n // The dir attribute, the same source the CDK's Directionality reads, and\n // the one a document has to set anyway for the text to run the right way.\n const rtl = this.wirt.closest('[dir]')?.getAttribute('dir') === 'rtl';\n const jetzt = Math.max(\n 0,\n offen.findIndex((panel) => panel.value() === this.aktiverWert()),\n );\n const ziel: Record<string, number> = {\n ArrowRight: jetzt + (rtl ? -1 : 1),\n ArrowLeft: jetzt + (rtl ? 1 : -1),\n Home: 0,\n End: offen.length - 1,\n };\n if (!(ereignis.key in ziel)) {\n return;\n }\n ereignis.preventDefault();\n this.waehle(offen[(ziel[ereignis.key] + offen.length) % offen.length]);\n }\n}\n","import { ChangeDetectionStrategy, Component, input, numberAttribute } from '@angular/core';\n\n/**\n * Step indicator for a multi-step flow. Belongs in the order assistant, where\n * the steps really do follow one another.\n *\n * Renders an `<ol class=\"z-steps\">` with one `<li class=\"z-step\">` per entry of\n * `steps`, each opened by its position in `.z-step__num`. Steps before `current`\n * get `z-step--done`, the current one carries `aria-current=\"step\"`. The ordered\n * list conveys the sequence to assistive technology; the component is static\n * text and adds no focus or keyboard handling of its own.\n *\n * @example\n * ```html\n * <z-stepper [steps]=\"['Spiel', 'Leistung', 'Bezahlen']\" [current]=\"1\" />\n * ```\n */\n@Component({\n selector: 'z-stepper',\n template: `\n <ol class=\"z-steps\">\n @for (schritt of steps(); track $index) {\n <li\n class=\"z-step\"\n [class.z-step--done]=\"$index < current()\"\n [attr.aria-current]=\"$index === current() ? 'step' : null\"\n >\n <span class=\"z-step__num\">{{ $index + 1 }}</span\n >{{ schritt }}\n </li>\n }\n </ol>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZStepper {\n /**\n * Labels of the steps in order, one short noun each. The spec asks for two to\n * four steps. An empty array renders an empty list.\n *\n * @default []\n */\n readonly steps = input<string[]>([]);\n\n /**\n * Zero-based index of the current step; every step with a lower index counts\n * as done. An index past the last step marks all steps done and none current.\n *\n * @default 0\n */\n readonly current = input(0, { transform: numberAttribute });\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChildren,\n DestroyRef,\n ElementRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ZSelect } from '../field';\nimport { ZIcon } from '../icon';\n\n/**\n * One entry of the sidebar, a Material Icon plus a noun. Sits on a `<button>`\n * or on an `<a>` through the attribute `zSidebarItem`, so links keep their\n * `href` and their routing.\n *\n * Renders the class `z-side__item` on the host and inside it the optional\n * `z-icon`, the projected text and, when {@link count} is not `null`, a\n * `span.z-side__count`.\n *\n * Accessibility: the active entry carries `aria-current=\"page\"` and is the only\n * one whose icon is coloured; the active surface is `surface-hover`, never a\n * green or red fill.\n *\n * @example\n * ```html\n * <a zSidebarItem icon=\"dashboard\" routerLink=\"/server/1\" [active]=\"true\">Übersicht</a>\n * <a zSidebarItem icon=\"report\" routerLink=\"/server/1/abstuerze\" [count]=\"3\">Abstürze</a>\n * ```\n */\n@Component({\n // The API table prescribes the selector `[zSidebarItem]` without an element:\n // the entry is a `<button>` or an `<a>`. Icon and counter need a template,\n // hence a component instead of a directive.\n selector: '[zSidebarItem]',\n imports: [ZIcon],\n // No whitespace between the parts: .z-side__item is flex with gap, so every\n // text node would otherwise be an item of its own in the row.\n template: `@if (icon()) {\n <z-icon [name]=\"icon()\" />\n }\n <ng-content />\n @if (count() !== null) {\n <span class=\"z-side__count\">{{ count() }}</span>\n }`,\n host: {\n class: 'z-side__item',\n '[attr.aria-current]': `active() ? \"page\" : null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSidebarItem {\n /**\n * Name of the Material Icon in front of the text. Empty renders no icon.\n *\n * @default ''\n */\n readonly icon = input('');\n\n /**\n * Marks the entry as the current page: `aria-current=\"page\"`, coloured icon,\n * `surface-hover` behind it. At most one entry per sidebar. Boolean\n * attribute.\n *\n * @default false\n */\n readonly active = input(false, { transform: booleanAttribute });\n\n /**\n * Counter at the right edge of the entry, for example the number of crashes.\n * `null` renders nothing, `0` renders the digit.\n *\n * @default null\n */\n readonly count = input<number | null>(null);\n\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Visible text without icon and counter, for the select below 900px. Only\n * the projected text nodes are read; if the label sits inside an element, the\n * result stays empty.\n *\n * @internal Read by `ZSidebar` to mirror the entries; not part of the\n * documented API.\n */\n beschriftung(): string {\n return Array.from(this.el.nativeElement.childNodes)\n .filter((knoten) => knoten.nodeType === Node.TEXT_NODE)\n .map((knoten) => knoten.textContent ?? '')\n .join('')\n .trim();\n }\n\n /**\n * Triggers the entry when it is picked in the select below 900px, by\n * clicking the host element, so a `routerLink` or a click handler on it runs\n * as if the user had hit the entry itself.\n *\n * @internal Called by `ZSidebar`; not part of the documented API.\n */\n klicke(): void {\n this.el.nativeElement.click();\n }\n}\n\n/**\n * Group of sidebar entries with one word as its heading. At most four groups\n * per sidebar.\n *\n * Renders the class `z-side__group` on the host, inside it the optional\n * `span.z-side__label` and the projected entries. The first group normally has\n * no label. Groups disappear in the select below 900px, so a group heading\n * must never carry meaning the entries do not.\n *\n * @example\n * ```html\n * <z-sidebar-group label=\"Betrieb\">\n * <a zSidebarItem icon=\"backup\" routerLink=\"/server/1/backups\">Backups</a>\n * </z-sidebar-group>\n * ```\n */\n@Component({\n selector: 'z-sidebar-group',\n template: `@if (label()) {\n <span class=\"z-side__label\">{{ label() }}</span>\n }\n <ng-content />`,\n host: { class: 'z-side__group' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSidebarGroup {\n /**\n * Heading of the group, one word in normal capitalization. Empty renders no\n * heading, which is how the first group usually stands.\n *\n * @default ''\n */\n readonly label = input('');\n}\n\n/**\n * Navigation inside a server panel: at most four groups with 12 to 14 entries\n * together.\n *\n * Renders `nav.z-side` with the projected groups and entries, and next to it a\n * `z-select` holding a native `<select>`. The stylesheet shows exactly one of\n * the two: above 900px the list, below it the select over the content. The\n * select mirrors the same entries, one `<option>` per `[zSidebarItem]` in\n * document order, and on a change it triggers the click of the chosen entry,\n * so routing works the same in both. The groups fall away in the select, which\n * is why a group heading must not be the only carrier of a fact.\n *\n * Accessibility: {@link ariaLabel} names both the `nav` and the select, so the\n * navigation is announced with a name at either width. The entry labels are\n * projected text and can only be read after rendering, so they are collected\n * once after the first render and from then on whenever a `MutationObserver`\n * reports a change below the sidebar, which is how a label that changes at\n * runtime still reaches the select.\n *\n * @example\n * ```html\n * <z-sidebar ariaLabel=\"Server-Navigation\">\n * <z-sidebar-group>\n * <a zSidebarItem icon=\"dashboard\" routerLink=\"/server/1\" [active]=\"true\">Übersicht</a>\n * </z-sidebar-group>\n * <z-sidebar-group label=\"Spiel\">\n * <a zSidebarItem icon=\"group\" routerLink=\"/server/1/spieler\">Spieler</a>\n * </z-sidebar-group>\n * </z-sidebar>\n * ```\n */\n@Component({\n selector: 'z-sidebar',\n imports: [ZSelect],\n template: `\n <nav class=\"z-side\" [attr.aria-label]=\"ariaLabel() || null\"><ng-content /></nav>\n <z-select>\n <select [attr.aria-label]=\"ariaLabel() || null\" (change)=\"waehle($event)\">\n @for (eintrag of eintraege(); track eintrag; let i = $index) {\n <option [selected]=\"eintrag.active()\">{{ beschriftungen()[i] }}</option>\n }\n </select>\n </z-select>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSidebar {\n /**\n * `aria-label` of the navigation, written onto the `nav` as well as onto the\n * select, for example \"Server-Navigation\". Empty writes no attribute.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n protected readonly eintraege = contentChildren(ZSidebarItem, { descendants: true });\n protected readonly beschriftungen = signal<string[]>([]);\n\n constructor() {\n const wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const zerstoerung = inject(DestroyRef);\n // The labels are projected text in the DOM and can only be read after\n // rendering, hence the detour through a signal. An interpolated label\n // changes without the item query changing, and the only thing that can\n // change it is text or child nodes below the sidebar: a MutationObserver\n // reports exactly that and costs nothing in between, while a callback after\n // every render of the application would walk every item every time. The\n // result is only written back when it really differs, otherwise every write\n // would schedule the next render. afterNextRender gives the first read once\n // the items stand and keeps the observer out of the server.\n afterNextRender(() => {\n const lies = (): void => {\n const neu = this.eintraege().map((eintrag) => eintrag.beschriftung());\n const alt = this.beschriftungen();\n if (neu.length !== alt.length || neu.some((text, i) => text !== alt[i])) {\n this.beschriftungen.set(neu);\n }\n };\n lies();\n const beobachter = new MutationObserver(lies);\n beobachter.observe(wirt, { characterData: true, childList: true, subtree: true });\n zerstoerung.onDestroy(() => beobachter.disconnect());\n });\n }\n\n protected waehle(ereignis: Event): void {\n const ziel = ereignis.target as HTMLSelectElement;\n this.eintraege()[ziel.selectedIndex]?.klicke();\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n Directive,\n ElementRef,\n input,\n model,\n viewChild,\n} from '@angular/core';\nimport { ZButton } from '../button';\nimport { ZIcon } from '../icon';\nimport { injectZLabels } from '../labels';\n\n/** Counts up once per header so that `aria-controls` stays unique. */\nlet laufendeNummer = 0;\n\n/**\n * Brand slot of the header: plain text in the `display` face, no logo image.\n *\n * Adds the class `z-header__brand` and renders nothing itself, so the caller\n * decides the element. A link back to the start page is the usual choice.\n *\n * @example\n * ```html\n * <a zBrand href=\"/\">Zenit</a>\n * ```\n */\n@Directive({\n selector: '[zBrand]',\n host: { class: 'z-header__brand' },\n})\nexport class ZBrand {}\n\n/**\n * One link of the main navigation, carrying the class `z-header__link`.\n *\n * The active link gets `aria-current=\"page\"`, which announces it as the current\n * page and drives the `accent-subtle` background. The library does not read the\n * router, so the caller decides which link is active.\n *\n * @example\n * ```html\n * <a zHeaderLink routerLink=\"/gameserver\" [active]=\"true\">Gameserver</a>\n * ```\n */\n@Directive({\n selector: 'a[zHeaderLink]',\n host: {\n class: 'z-header__link',\n '[attr.aria-current]': `active() ? \"page\" : null`,\n },\n})\nexport class ZHeaderLink {\n /**\n * Whether this link points at the page currently shown. Written as a bare\n * attribute (`active`) it counts as `true`.\n *\n * @default false\n */\n readonly active = input(false, { transform: booleanAttribute });\n}\n\n/**\n * Marks content for the right-hand end of the header: credit, avatar or\n * buttons. Pure slot marker, it adds no class and no markup.\n *\n * @example\n * ```html\n * <a zHeaderLink zHeaderEnd class=\"z-mono\" href=\"/abrechnung\">25,00&nbsp;€</a>\n * <span zHeaderEnd class=\"z-avatar\" aria-hidden=\"true\">K</span>\n * ```\n */\n@Directive({ selector: '[zHeaderEnd]' })\nexport class ZHeaderEnd {}\n\n/**\n * Header of the customer area and of the public pages. Same component both\n * times, only the links differ.\n *\n * Renders, in order: the `[zBrand]` slot, an icon-only ghost button that\n * toggles the navigation below 900px, a `<nav class=\"z-header__nav\">` holding\n * the projected links, and a `<div class=\"z-header__end\">` with the\n * `[zHeaderEnd]` slot. The host carries `z-header` and, while the navigation is\n * open, `z-header--open`.\n *\n * The open state is {@link open}, two-way bindable. It closes itself when a\n * projected link inside the `<nav>` is clicked, so a single-page application\n * does not keep the menu over the new page, and on Escape while the focus is\n * inside the header.\n *\n * Accessibility: the toggle is a `<button type=\"button\">` with `aria-label`\n * from {@link menuLabel}, `aria-expanded` reflecting the open state and\n * `aria-controls` pointing at the generated id of the `<nav>`. The `<nav>` is a\n * navigation landmark and takes its name from {@link navLabel}, and the host is\n * the `banner` landmark of the page unless {@link landmark} is off. Above 900px\n * the links are visible and the end slot stays visible at every width.\n *\n * It centres nothing: the header runs the full width of whatever contains it,\n * so put it inside a `div.z-container`, the same one `<main>` and `z-footer`\n * get, or brand and page title stand on different lines.\n *\n * @example\n * ```html\n * <z-app-header navLabel=\"Hauptnavigation\">\n * <a zBrand href=\"/\">Zenit</a>\n * <a zHeaderLink routerLink=\"/gameserver\" [active]=\"true\">Gameserver</a>\n * <a zHeaderLink routerLink=\"/abrechnung\">Abrechnung</a>\n * <a zBtn=\"primary\" size=\"sm\" zHeaderEnd routerLink=\"/neu\">Server erstellen</a>\n * </z-app-header>\n * ```\n */\n@Component({\n selector: 'z-app-header',\n imports: [ZButton, ZIcon],\n template: `\n <ng-content select=\"[zBrand]\" />\n <button\n #knopf\n zBtn=\"ghost\"\n iconOnly\n type=\"button\"\n class=\"z-header__menu\"\n [attr.aria-label]=\"menuText()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"navId\"\n (click)=\"open.set(!open())\"\n >\n <z-icon name=\"menu\" />\n </button>\n <!-- The click handler is delegation for the projected links, not an\n interaction of the <nav> itself: the keyboard already reaches every\n link, and Enter on a link fires this very click event. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <nav\n class=\"z-header__nav\"\n [id]=\"navId\"\n [attr.aria-label]=\"navLabel() || null\"\n (click)=\"aufNavKlick($event)\"\n >\n <ng-content />\n </nav>\n <div class=\"z-header__end\"><ng-content select=\"[zHeaderEnd]\" /></div>\n `,\n host: {\n class: 'z-header',\n '[class.z-header--open]': `open()`,\n '[attr.role]': `landmark() ? \"banner\" : null`,\n '(keydown.escape)': `aufEscape()`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZAppHeader {\n /**\n * Accessible name of the `<nav>` landmark. Empty means no `aria-label` at\n * all; set it whenever the page has more than one navigation.\n *\n * @default ''\n */\n readonly navLabel = input('');\n\n /**\n * Whether the host is the `banner` landmark of the page. The reference markup\n * is a `<header>` at page level, so this is on. Switch it off with\n * `[landmark]=\"false\"` wherever the header is not the page header but a\n * preview inside `<main>`: a banner must not sit inside the main content.\n *\n * @default true\n */\n readonly landmark = input(true, { transform: booleanAttribute });\n\n /**\n * `aria-label` of the menu button shown below 900px. Unset, the component\n * uses {@link ZLabels.headerMenu} from the label registry.\n *\n * @default undefined\n */\n readonly menuLabel = input<string>();\n\n /**\n * Whether the menu below 900px is open, two-way bindable as `[(open)]`. The\n * burger button toggles it, a click on a projected link inside the `<nav>`\n * and Escape close it. Above 900px the links are visible regardless, so the\n * value only matters on a phone.\n *\n * @default false\n */\n readonly open = model(false);\n\n private readonly labels = injectZLabels();\n // read: ElementRef, because the menu button is a ZButton host and the plain\n // query would hand out that component instead of the element.\n private readonly knopf = viewChild.required('knopf', { read: ElementRef<HTMLButtonElement> });\n\n protected readonly menuText = computed(() => this.menuLabel() ?? this.labels.headerMenu);\n protected readonly navId = `z-header-nav-${++laufendeNummer}`;\n\n /**\n * Closes the menu when the click came from a link, so following a projected\n * link does not leave the menu open over the new page. Delegation instead of\n * a listener per link, and the library stays free of `@angular/router`: what\n * counts is the `<a>`, not the directive on it. A button inside the nav, a\n * menu trigger for example, leaves the menu open.\n *\n * Two cases stay open on purpose. A link found above the `<nav>` does not\n * count, because `closest()` walks past the nav into whatever surrounds the\n * header. And Ctrl, Meta or Shift open the link in a new tab or window while\n * this page stays where it is, so the menu stays with it. The middle mouse\n * button needs no check: it fires `auxclick`, not `click`.\n */\n protected aufNavKlick(ereignis: MouseEvent): void {\n if (ereignis.ctrlKey || ereignis.metaKey || ereignis.shiftKey) return;\n const link = (ereignis.target as Element | null)?.closest('a');\n if (link && (ereignis.currentTarget as Element).contains(link)) this.open.set(false);\n }\n\n /**\n * Escape closes the open menu and puts the focus back on the burger button,\n * which is where the keyboard came from. Runs on the host, so it only sees\n * keys pressed inside the header, and does nothing while the menu is closed:\n * a header that is not menu-like must never swallow Escape or take focus.\n */\n protected aufEscape(): void {\n if (!this.open()) return;\n this.open.set(false);\n this.knopf().nativeElement.focus();\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Head of a page in the customer area: title on the left, actions on the right.\n * The projected content is the actions, at most two buttons.\n *\n * Renders the title as the page `<h1 class=\"z-pagehead__title\">`, the optional\n * second line as `<p class=\"z-pagehead__sub\">` and the projected content in\n * `<div class=\"z-pagehead__actions\">`. The host carries `z-pagehead` and its\n * native `title` attribute is cleared, so the {@link title} input never turns\n * into a browser tooltip over the whole header.\n *\n * Below 640px the row wraps and the actions move under the title.\n *\n * @example\n * ```html\n * <z-page-header title=\"Gameserver\" sub=\"3 Server, 2 online\">\n * <button zBtn=\"secondary\" type=\"button\">Bestellungen</button>\n * <button zBtn=\"primary\" type=\"button\">Server erstellen</button>\n * </z-page-header>\n * ```\n */\n@Component({\n selector: 'z-page-header',\n template: `\n <div>\n <h1 class=\"z-pagehead__title\">{{ title() }}</h1>\n @if (sub()) {\n <p class=\"z-pagehead__sub\">{{ sub() }}</p>\n }\n </div>\n <div class=\"z-pagehead__actions\"><ng-content /></div>\n `,\n host: {\n class: 'z-pagehead',\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZPageHeader {\n /**\n * Page title, rendered as the `<h1>`. Use the same wording as the navigation\n * link that leads here.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * One line with the most important fact of the page, for example\n * \"3 Server, 2 online\". Empty leaves the line out.\n *\n * @default ''\n */\n readonly sub = input('');\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n Directive,\n input,\n} from '@angular/core';\n\n/**\n * Marks the bottom row of the footer: copyright on the left, the legal links on\n * the right. Pure slot marker, it adds no class and no markup. The legal links\n * are mandatory on every page, including the panels.\n *\n * @example\n * ```html\n * <div zFooterBase>\n * <span>© 2026 Zenit-Hosting</span>\n * <a href=\"/impressum\">Impressum</a>\n * </div>\n * ```\n */\n@Directive({ selector: '[zFooterBase]' })\nexport class ZFooterBase {}\n\n/**\n * One link column of the public footer.\n *\n * Renders an optional `<h2 class=\"z-footer__head\">` and a\n * `<ul class=\"z-footer__list\">` around the projected content, so the content is\n * the `<li>` elements. Only usable inside `z-footer`, which selects these\n * elements into its column grid.\n *\n * @example\n * ```html\n * <z-footer-col heading=\"Hosting\">\n * <li><a href=\"/minecraft\">Minecraft</a></li>\n * <li><a href=\"/preise\">Preise</a></li>\n * </z-footer-col>\n * ```\n */\n@Component({\n selector: 'z-footer-col',\n template: `\n @if (heading()) {\n <h2 class=\"z-footer__head\">{{ heading() }}</h2>\n }\n <ul class=\"z-footer__list\">\n <ng-content />\n </ul>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZFooterCol {\n /**\n * Heading of the column, one word. Empty leaves the `<h2>` out, which keeps\n * the heading outline free of empty levels.\n *\n * @default ''\n */\n readonly heading = input('');\n}\n\n/**\n * Footer of every page. Public pages use the columns, the customer area shows\n * the bottom row only.\n *\n * Renders `<div class=\"z-footer__cols\">` with the projected `z-footer-col`\n * elements and `<div class=\"z-footer__base\">` with the `[zFooterBase]` slot;\n * the host carries `z-footer` and, unless {@link landmark} is off, the\n * `contentinfo` role of the page. Without columns the grid stays empty and\n * collapses, so the same element serves both cases. Content that matches\n * neither slot is not rendered.\n *\n * It centres nothing: the footer runs the full width of whatever contains it,\n * so put it inside a `div.z-container`, the same one `z-app-header` and\n * `<main>` get, or the copyright ends up at the left edge of the window while\n * the page above it is centred.\n *\n * @example\n * ```html\n * <z-footer>\n * <z-footer-col heading=\"Hosting\">\n * <li><a href=\"/minecraft\">Minecraft</a></li>\n * </z-footer-col>\n * <div zFooterBase>\n * <span>© 2026 Zenit-Hosting</span>\n * <a href=\"/impressum\">Impressum</a>\n * </div>\n * </z-footer>\n * ```\n */\n@Component({\n selector: 'z-footer',\n template: `\n <div class=\"z-footer__cols\"><ng-content select=\"z-footer-col\" /></div>\n <div class=\"z-footer__base\"><ng-content select=\"[zFooterBase]\" /></div>\n `,\n host: {\n class: 'z-footer',\n '[attr.role]': `landmark() ? \"contentinfo\" : null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZFooter {\n /**\n * Whether the host is the `contentinfo` landmark of the page. The reference\n * markup is a `<footer>` at page level, so this is on. Switch it off with\n * `[landmark]=\"false\"` wherever the footer is not the page footer but a\n * preview inside `<main>`: a contentinfo must not sit inside the main\n * content.\n *\n * @default true\n */\n readonly landmark = input(true, { transform: booleanAttribute });\n}\n","/* Package navigation: Tabs, Stepper, Sidebar, AppHeader, PageHeader and Footer. */\nexport * from '../navigation';\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * Row of metrics inside ONE panel, laid out as columns separated by 1px lines.\n *\n * Renders only the projected content and puts the class `z-metrics` on the\n * host. Several figures belong in one `z-metrics`, never in single tiles of\n * their own. Usually placed inside `<z-panel flush>`.\n *\n * @example\n * ```html\n * <z-panel flush>\n * <z-metrics>\n * <z-metric label=\"CPU\" value=\"0,2\" unit=\"%\" [percent]=\"0.2\" />\n * <z-metric label=\"Laufzeit\" value=\"2d 21h\" sub=\"TPS 20 · Ping 91 ms\" />\n * </z-metrics>\n * </z-panel>\n * ```\n */\n@Component({\n selector: 'z-metrics',\n template: `<ng-content />`,\n host: { 'class': 'z-metrics' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZMetrics {}\n\n/**\n * A single figure with its unit, optionally with a usage bar.\n *\n * Renders `.z-metric__label`, `.z-metric__value` (with the unit in a `<small>`\n * preceded by a non-breaking space), the optional bar and `.z-metric__sub`. The\n * host carries `z-metric`.\n *\n * The bar is `<div class=\"z-meter\" role=\"meter\">` with `aria-valuemin=\"0\"`,\n * `aria-valuemax=\"100\"`, `aria-valuenow` set to the clamped percentage and\n * `aria-label` taken from {@link label}. From 80 percent it adds\n * `z-meter--warning`, from 95 percent `z-meter--danger`. Colour never carries\n * the meaning alone: the caller repeats the value in {@link sub}.\n *\n * @example\n * ```html\n * <z-metric label=\"Speicher\" value=\"21,4\" unit=\"/ 24&nbsp;GB\" [percent]=\"89\" sub=\"89&nbsp;% belegt\" />\n * ```\n */\n@Component({\n selector: 'z-metric',\n template: `\n <span class=\"z-metric__label\">{{ label() }}</span>\n <span class=\"z-metric__value\"\n >{{ value() }}@if (unit()) {<small>&#160;{{ unit() }}</small>}</span\n >\n @if (anteil() !== null) {\n <div\n class=\"z-meter\"\n [class.z-meter--warning]=\"warnung()\"\n [class.z-meter--danger]=\"fehler()\"\n role=\"meter\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"anteil()\"\n [attr.aria-label]=\"label()\"\n >\n <span class=\"z-meter__fill\" [style.width.%]=\"anteil()\"></span>\n </div>\n }\n @if (sub()) {\n <span class=\"z-metric__sub\">{{ sub() }}</span>\n }\n `,\n host: { 'class': 'z-metric' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZMetric {\n /**\n * Name of the figure, for example \"CPU\". Also serves as the `aria-label` of\n * the bar.\n *\n * @default ''\n */\n readonly label = input('');\n\n /**\n * The figure itself, already formatted by the caller: comma as the decimal\n * mark, German number format.\n *\n * @default ''\n */\n readonly value = input('');\n\n /**\n * Unit or upper bound rendered after the value, for example `%` or\n * `/ 24&nbsp;GB`. Empty leaves the `<small>` out.\n *\n * @default ''\n */\n readonly unit = input('');\n\n /**\n * Second line under the figure. Carries the percentage in words whenever the\n * bar warns, so the state does not depend on colour.\n *\n * @default ''\n */\n readonly sub = input('');\n\n /**\n * Usage in percent, 0 to 100. Values outside that range are clamped, values\n * that are not a number render no bar. `null`, `undefined` and the empty\n * string mean no bar at all.\n *\n * @default null\n */\n readonly percent = input<number | null, number | string | null | undefined>(null, {\n transform: (wert) => (wert === null || wert === undefined || wert === '' ? null : Number(wert)),\n });\n\n protected readonly anteil = computed(() => {\n const wert = this.percent();\n return wert === null || Number.isNaN(wert) ? null : Math.min(100, Math.max(0, wert));\n });\n protected readonly fehler = computed(() => (this.anteil() ?? 0) >= 95);\n protected readonly warnung = computed(() => (this.anteil() ?? 0) >= 80 && !this.fehler());\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n input,\n linkedSignal,\n} from '@angular/core';\n\n/**\n * Row pattern for everything the customer owns: servers, domains, tickets,\n * payment methods, files.\n *\n * Renders only the projected content and puts the class `z-rows` on the host.\n * {@link columns} feeds the custom property `--z-cols`, which head and rows\n * share, so status, plan and cost line up in fixed columns.\n *\n * @example\n * ```html\n * <z-rows columns=\"minmax(0, 2fr) 128px 40px\">\n * <z-rows-head>\n * <span>Server</span>\n * <span>Status</span>\n * <span></span>\n * </z-rows-head>\n * <a zRow routerLink=\"/server/1\">\n * <z-row-main title=\"Beispiel-Server 1\" meta=\"Minecraft · 203.0.113.10\" />\n * <span><z-badge status=\"success\" dot>Online</z-badge></span>\n * <z-icon name=\"chevron_right\" />\n * </a>\n * </z-rows>\n * ```\n */\n@Component({\n selector: 'z-rows',\n template: `<ng-content />`,\n host: {\n class: 'z-rows',\n '[style.--z-cols]': `columns() || null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZRows {\n /**\n * Value for `grid-template-columns`, shared by head and rows through\n * `--z-cols`, for example `minmax(0, 2fr) 128px 40px`. Empty keeps the\n * default grid from the stylesheet.\n *\n * @default ''\n */\n readonly columns = input('');\n}\n\n/**\n * Column head of the list, carrying the class `z-rows__head`. Renders only the\n * projected content, one element per column. The head disappears below 640px,\n * so it must never hold the only copy of a fact.\n *\n * @example\n * ```html\n * <z-rows-head>\n * <span>Server</span>\n * <span>Status</span>\n * <span style=\"text-align:right\">Bisher</span>\n * </z-rows-head>\n * ```\n */\n@Component({\n selector: 'z-rows-head',\n template: `<ng-content />`,\n host: { class: 'z-rows__head' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZRowsHead {}\n\n/**\n * One row, carrying the class `z-row`. Renders nothing itself.\n *\n * As an `<a>` the whole row is the link to the detail page and brings its own\n * focus ring and keyboard handling. As a `<div>` the row is not clickable and\n * holds its own actions, each of which is a tab stop of its own.\n *\n * A row that needs both, a target and its own actions, is a `<div>` with an\n * {@link ZRowLink} on the title and {@link ZRowAction} on the buttons: a\n * `<button>` inside an `<a>` would be invalid markup.\n *\n * @example\n * ```html\n * <a zRow routerLink=\"/server/1\">…</a>\n * <div zRow>…</div>\n * ```\n */\n@Directive({\n selector: 'a[zRow], div[zRow]',\n host: { class: 'z-row' },\n})\nexport class ZRow {}\n\n/**\n * Pure slot marker for the title of a row, so `z-row-main` can hold a link or\n * any other markup instead of its {@link ZRowMain.title} text. It adds no class\n * and no markup. Without it the row falls back to the `title` input.\n *\n * @example\n * ```html\n * <z-row-main title=\"Beispiel-Server 1\" meta=\"Minecraft · 203.0.113.10\">\n * <a zRowTitle zRowLink routerLink=\"/user/server/1\">Beispiel-Server 1</a>\n * </z-row-main>\n * ```\n */\n@Directive({ selector: '[zRowTitle]' })\nexport class ZRowTitle {}\n\n/**\n * Slot for the meta line of a row when that line is more than plain text. It\n * carries the class `z-row__meta` and lands under the title, in place of the\n * {@link ZRowMain.meta} input, so that an address, a port or a file name inside\n * it can take `z-mono` while the rest of the line stays in the body face.\n *\n * Use a block element: the meta line clips with an ellipsis, which an inline\n * element cannot do. Without it the row falls back to the `meta` input.\n *\n * @example\n * ```html\n * <z-row-main title=\"Beispiel-Server 1\">\n * <div zRowMeta>Minecraft · PaperMC 26.3 · <span class=\"z-mono\">203.0.113.10:25565</span></div>\n * </z-row-main>\n * ```\n */\n@Directive({\n selector: '[zRowMeta]',\n host: { class: 'z-row__meta' },\n})\nexport class ZRowMeta {}\n\n/**\n * Link inside a `div[zRow]` that makes the whole row clickable: the link sits\n * on the title and carries the class `z-row__link`, whose stretched `::after`\n * covers the row. The row keeps its hover colour, and the focus ring of the\n * link is drawn around the whole row rather than around the title text.\n *\n * Everything the row holds stays under that overlay, so buttons and menus in\n * the row need {@link ZRowAction} to stay clickable and keep their own tab\n * stop. As with any stretched link, text in the row cannot be selected by\n * dragging, exactly as in an `a[zRow]`.\n *\n * @example\n * ```html\n * <div zRow>\n * <z-row-main title=\"Beispiel-Server 1\" meta=\"Minecraft · 203.0.113.10\">\n * <a zRowTitle zRowLink routerLink=\"/user/server/1\">Beispiel-Server 1</a>\n * </z-row-main>\n * <span><z-badge status=\"success\" dot>Online</z-badge></span>\n * <button zRowAction zBtn=\"ghost\" iconOnly aria-label=\"Aktionen für Beispiel-Server 1\">\n * <z-icon name=\"more_vert\" />\n * </button>\n * </div>\n * ```\n */\n@Directive({\n selector: 'a[zRowLink]',\n host: { class: 'z-row__link' },\n})\nexport class ZRowLink {}\n\n/**\n * Action inside a row that holds an {@link ZRowLink}: adds the class\n * `z-row__action`, which lifts the element above the stretched link overlay so\n * it stays clickable and remains a tab stop of its own. It renders nothing\n * itself and needs its own `aria-label` when it shows only an icon.\n *\n * @example\n * ```html\n * <button zRowAction zBtn=\"ghost\" iconOnly aria-label=\"Freigabe entfernen\">\n * <z-icon name=\"close\" />\n * </button>\n * ```\n */\n@Directive({\n selector: '[zRowAction]',\n host: { class: 'z-row__action' },\n})\nexport class ZRowAction {}\n\n/**\n * Pure slot marker for an own medium in the thumbnail of a row, an icon or an\n * image the caller renders itself. It lands in `.z-row__thumb` and replaces\n * both the {@link ZRowMain.image} and the initial. It adds no class and no\n * markup. Without it the row falls back to the `image` input. The thumbnail is\n * `aria-hidden`, so the content is decoration: what it shows has to stand as\n * text in the row as well, usually in {@link ZRowMeta}. Nothing focusable goes\n * into the slot, no link, button or input: it would stay a tab stop inside\n * `aria-hidden`.\n *\n * @example\n * ```html\n * <z-row-main title=\"beispiel.de\" meta=\"Domain · läuft bis 18.09.2027\">\n * <z-icon zRowThumb name=\"language\" />\n * </z-row-main>\n * ```\n */\n@Directive({ selector: '[zRowThumb]' })\nexport class ZRowThumb {}\n\n/**\n * First column of a row: thumbnail, title and one meta line.\n *\n * Renders `<span class=\"z-row__thumb\">` with the image or, without one, the\n * uppercased first character of {@link thumbText} or else of the title, then\n * `.z-row__title` and the optional `.z-row__meta`. An image whose URL fails to\n * load drops into the same initial, so no broken-image icon is shown. A\n * {@link ZRowThumb} element replaces image and initial, and {@link thumb} set\n * to `false` leaves the thumbnail out. The host carries `z-row__main` and its native\n * `title` attribute is cleared, so the {@link title} input never becomes a\n * browser tooltip. The thumbnail is decoration: `.z-row__thumb` carries\n * `aria-hidden=\"true\"` and the image an empty `alt`, so a link row is read as\n * title and meta only. Whatever the thumbnail shows, a game for example,\n * therefore also belongs into the meta line as text.\n *\n * A `[zRowTitle]` element takes the place of the title text, which is how a\n * link gets into the title of a row, and a {@link ZRowMeta} element takes the\n * place of the meta text, which is how an address reaches the mono face.\n * {@link title} still feeds the initial of the thumbnail unless\n * {@link thumbText} is set, so it stays set either way.\n *\n * @example\n * ```html\n * <z-row-main title=\"Beispiel-Server 1\" meta=\"Minecraft · PaperMC 26.3 · 203.0.113.10\" />\n * ```\n */\n@Component({\n selector: 'z-row-main',\n template: `\n @if (thumb()) {\n <span class=\"z-row__thumb\" aria-hidden=\"true\">\n <ng-content select=\"[zRowThumb]\" />\n @if (!eigenesMedium()) {\n @if (image() && !imageFailed()) {\n <img [src]=\"image()\" alt=\"\" (error)=\"imageFailed.set(true)\" />\n } @else {\n {{ initiale() }}\n }\n }\n </span>\n }\n <div class=\"z-row__text\">\n <div class=\"z-row__title\">\n <ng-content select=\"[zRowTitle]\">{{ title() }}</ng-content>\n </div>\n <ng-content select=\"[zRowMeta]\" />\n @if (meta()) {\n <div class=\"z-row__meta\">{{ meta() }}</div>\n }\n </div>\n `,\n host: {\n class: 'z-row__main',\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZRowMain {\n /**\n * Name of the entry. Without an image and without {@link thumbText} its\n * first character, uppercased, fills the thumbnail.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * One line under the title with the details of the entry, for example game,\n * version and address. Empty leaves the line out. A projected\n * {@link ZRowMeta} element replaces it, for a line that mixes faces.\n *\n * @default ''\n */\n readonly meta = input('');\n\n /**\n * URL of the thumbnail. Empty falls back to the initial, and so does a URL\n * that fails to load.\n *\n * @default ''\n */\n readonly image = input('');\n\n /**\n * Text whose first character, uppercased, fills the thumbnail when there is\n * no image or it fails to load, for example the game of a server whose\n * {@link title} is its own name. Empty takes the initial of the title.\n *\n * @default ''\n */\n readonly thumbText = input('');\n\n /**\n * Shows the thumbnail. `false` leaves `.z-row__thumb` out, so the row starts\n * with its title. Boolean attribute.\n *\n * @default true\n */\n readonly thumb = input(true, { transform: booleanAttribute });\n\n /**\n * True once the browser reported `error` for the current {@link image}. A new\n * URL is tried again, so the flag falls back to `false` with it.\n */\n protected readonly imageFailed = linkedSignal<string, boolean>({\n source: this.image,\n computation: () => false,\n });\n\n /**\n * The projected {@link ZRowThumb}, if one is rendered right now. A query and\n * not the fallback content of `<ng-content>`: a slot element inside an `@if`\n * occupies the slot even while the condition is false, which would leave an\n * empty thumbnail instead of image or initial.\n */\n protected readonly eigenesMedium = contentChild(ZRowThumb);\n\n protected readonly initiale = computed(() =>\n (this.thumbText().trim() || this.title().trim()).charAt(0).toUpperCase(),\n );\n}\n\n/**\n * Amount or number inside a row: right-aligned in the mono face. Adds the class\n * `z-row__num` and renders nothing itself.\n *\n * @example\n * ```html\n * <span zRowNum>0,90&nbsp;€</span>\n * ```\n */\n@Directive({\n selector: '[zRowNum]',\n host: { class: 'z-row__num' },\n})\nexport class ZRowNum {}\n","import {\n afterNextRender,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { leiheAttribut } from '../a11y/host-attribute';\nimport { injectZLabels } from '../labels';\n\n/**\n * Which column a table is sorted by and in which direction, the value of\n * {@link ZTable.sort}.\n */\nexport interface ZSort {\n /** Key of the sorted column: the value of `zSortHeader` on its header cell. */\n key: string;\n\n /** Direction of the sort, ascending or descending. */\n direction: 'asc' | 'desc';\n}\n\n/**\n * Table for files, invoices, backups and databases: everything with several\n * equal columns and bulk actions. Adds the class `z-table` to a native\n * `<table>` and renders nothing itself, so semantics, header cells and keyboard\n * behaviour stay the browser's.\n *\n * It also holds the sort state of the table, which the header cells marked with\n * `zSortHeader` read and write. The library does not sort: it reports what the\n * user asked for through {@link sort}, the caller orders the rows.\n *\n * @example\n * ```html\n * <table zTable [(sort)]=\"sortierung\">\n * <thead>…</thead>\n * <tbody>…</tbody>\n * </table>\n * ```\n */\n@Directive({\n selector: 'table[zTable]',\n host: { class: 'z-table' },\n})\nexport class ZTable {\n /**\n * Column the table is sorted by, two-way bindable. `null` means unsorted,\n * which is also the third step of the cycle a `th[zSortHeader]` runs through.\n * Only one column is sorted at a time, because the whole table shares this\n * one value.\n *\n * @default null\n */\n readonly sort = model<ZSort | null>(null);\n}\n\n/**\n * Wrapper around `table[zTable]`. Below 640px the table scrolls sideways in\n * here, the page itself never does.\n *\n * Renders only the projected content and puts `z-table-wrap` on the host. While\n * the table is actually wider than the wrapper, the host becomes a\n * `role=\"region\"` with `tabindex=\"0\"` and an `aria-label`, so the scrollable\n * area is reachable and scrollable by keyboard alone. While everything fits, all\n * three are left off: a table that cannot scroll would otherwise be a tab stop\n * that does nothing, on every desktop screen.\n *\n * The three attributes are borrowed, not bound: what the caller wrote on\n * `<z-table-container>` comes back when the overflow is gone, so a `role`, an\n * `aria-label` or a `tabindex` of the caller's own survives a window that is\n * resized wide enough.\n *\n * @example\n * ```html\n * <z-table-container ariaLabel=\"Dateien, seitlich scrollbar\">\n * <table zTable>\n * <thead>\n * <tr><th>Name</th><th style=\"text-align:right\">Größe</th></tr>\n * </thead>\n * <tbody>\n * <tr>\n * <td><span zTableName><z-icon name=\"description\" />server.jar</span></td>\n * <td zNum>61,25 MB</td>\n * </tr>\n * </tbody>\n * </table>\n * </z-table-container>\n * ```\n */\n@Component({\n selector: 'z-table-container',\n template: `<ng-content />`,\n host: {\n class: 'z-table-wrap',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZTableContainer {\n /**\n * Accessible name of the scrollable region, meant to be overridden with the\n * content of the table. Unset, the component uses\n * {@link ZLabels.tableRegion} from the label registry.\n *\n * @default undefined\n */\n readonly ariaLabel = input<string>();\n\n private readonly labels = injectZLabels();\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n // The predicate lands in the static partial declaration, which a JIT consumer\n // evaluates while this class is defined: ZTable has to be declared above.\n private readonly tabelle = contentChild(ZTable, { read: ElementRef });\n private beobachter?: ResizeObserver;\n\n protected readonly bereichText = computed(() => this.ariaLabel() ?? this.labels.tableRegion);\n /** Whether the content is wider than the wrapper, so there is something to scroll. */\n protected readonly ueberlauf = signal(false);\n\n constructor() {\n // Only while there is something to scroll does the library own these\n // three. As host bindings they wrote `null` on every other change and\n // deleted whatever the caller had put there; borrowed, the caller's values\n // come back.\n leiheAttribut('role', () => (this.ueberlauf() ? 'region' : null));\n leiheAttribut('tabindex', () => (this.ueberlauf() ? '0' : null));\n leiheAttribut('aria-label', () => (this.ueberlauf() ? this.bereichText() : null));\n\n const destroyRef = inject(DestroyRef);\n afterNextRender(() => {\n // Not every environment has a ResizeObserver; without one the wrapper\n // keeps the state of the last measurement.\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n this.beobachter = new ResizeObserver(() => this.messen());\n this.beobachter.observe(this.el.nativeElement);\n destroyRef.onDestroy(() => this.beobachter?.disconnect());\n });\n\n // A changed table is wider or narrower without the wrapper changing size,\n // so the observer alone would miss it: measure after the render as well,\n // and watch the table itself from then on.\n afterRenderEffect({\n earlyRead: () => {\n const tabelle = this.tabelle()?.nativeElement;\n if (tabelle) {\n this.beobachter?.observe(tabelle);\n }\n this.messen();\n },\n });\n }\n\n private messen(): void {\n const el = this.el.nativeElement;\n this.ueberlauf.set(el.scrollWidth > el.clientWidth);\n }\n}\n\n/**\n * Right-aligned cell in the mono face: size, date, amount. Adds the class\n * `z-table__num` and renders nothing itself.\n *\n * @example\n * ```html\n * <td zNum>61,25 MB</td>\n * ```\n */\n@Directive({\n selector: '[zNum]',\n host: { class: 'z-table__num' },\n})\nexport class ZNum {}\n\n/**\n * Name cell: icon and name in the mono face. Adds the class `z-table__name` and\n * renders nothing itself; the icon comes from the caller and is `folder` or\n * `description`.\n *\n * @example\n * ```html\n * <td><span zTableName><z-icon name=\"folder\" />plugins</span></td>\n * ```\n */\n@Directive({\n selector: '[zTableName]',\n host: { class: 'z-table__name' },\n})\nexport class ZTableName {}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { ZIcon } from '../icon';\nimport { ZSort, ZTable } from './table';\n\n/**\n * Header cell that sorts its column. Sits on a `<th>` inside a\n * `table[zTable]` and renders a real `<button>` around the projected header\n * text, so the cell is reachable by keyboard, has a focus ring and is\n * announced as a button.\n *\n * A click cycles through three steps: {@link sortStart}, the opposite\n * direction, unsorted. The state lives on the table\n * ({@link ZTable.sort}), so only one column is ever sorted; this component\n * only reads and writes it. The library does not sort the rows, the caller\n * does, usually in a `computed()`.\n *\n * Accessibility: the `<th>` carries `aria-sort`, `ascending` or `descending`\n * on the sorted column and `none` on every other sortable one, which is the\n * WAI-ARIA pattern for a sortable table. The accessible name of the button is\n * the header text itself, so no extra label and no `title` is needed. While\n * {@link disabled} is set the column takes no part in sorting: the button is\n * natively disabled and the cell carries no `aria-sort` at all, so it reads\n * like the plain header it is.\n *\n * @example\n * ```html\n * <table zTable [(sort)]=\"sortierung\">\n * <thead>\n * <tr>\n * <th zSortHeader=\"name\">Name</th>\n * <th zNum zSortHeader=\"groesse\" sortStart=\"desc\">Größe</th>\n * </tr>\n * </thead>\n * <tbody>…</tbody>\n * </table>\n * ```\n */\n@Component({\n selector: 'th[zSortHeader]',\n imports: [ZIcon],\n template: `<button type=\"button\" class=\"z-table__sort\" [disabled]=\"disabled()\" (click)=\"weiter()\">\n <ng-content />\n @if (richtung()) {\n <z-icon [name]=\"richtung() === 'asc' ? 'arrow_upward' : 'arrow_downward'\" size=\"sm\" />\n }\n </button>`,\n host: {\n '[attr.aria-sort]': 'sortierstand()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSortHeader {\n /**\n * Key of this column, the value that ends up in {@link ZSort.key}. It only\n * has to be unique inside the table; the caller matches it against its own\n * field when it orders the rows.\n */\n readonly zSortHeader = input.required<string>();\n\n /**\n * Direction of the first click. `desc` suits columns where the largest value\n * is the interesting one, for example a size or an amount.\n *\n * @default 'asc'\n */\n readonly sortStart = input<'asc' | 'desc'>('asc');\n\n /**\n * Whether this column cannot be sorted. The button is natively disabled and\n * the cell carries no `aria-sort`.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n private readonly tabelle = inject(ZTable);\n\n /** Direction this column is sorted in, or `null` while it is not the sorted one. */\n protected readonly richtung = computed<'asc' | 'desc' | null>(() => {\n const sortierung = this.tabelle.sort();\n if (this.disabled() || sortierung?.key !== this.zSortHeader()) {\n return null;\n }\n return sortierung.direction;\n });\n\n /** `aria-sort` of the cell, left off entirely while the column is disabled. */\n protected readonly sortierstand = computed(() => {\n if (this.disabled()) {\n return null;\n }\n const richtung = this.richtung();\n if (!richtung) {\n return 'none';\n }\n return richtung === 'asc' ? 'ascending' : 'descending';\n });\n\n /** One step of the cycle: start direction, opposite direction, unsorted. */\n protected weiter(): void {\n const start = this.sortStart();\n const jetzt = this.richtung();\n const gegenrichtung = start === 'asc' ? 'desc' : 'asc';\n const naechste: ZSort | null =\n jetzt === null\n ? { key: this.zSortHeader(), direction: start }\n : jetzt === start\n ? { key: this.zSortHeader(), direction: gegenrichtung }\n : null;\n this.tabelle.sort.set(naechste);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n model,\n numberAttribute,\n untracked,\n} from '@angular/core';\nimport { ZSelect } from '../field';\nimport { ZIcon } from '../icon';\nimport { injectZLabels } from '../labels';\n\n/** Counter for the id that ties the size selector to its label. */\nlet zaehler = 0;\n\n/**\n * Pages through lists with more than {@link pageSize} entries and sits as the\n * last row inside a panel.\n *\n * Renders a `<nav>` with an accessible name around `<div class=\"z-pager\">`: the\n * range sentence on the left and `.z-pager__nav` on the right, with a back\n * button, `page / pages` in the mono face and a forward button. Both buttons are\n * icon-only ghost buttons in size `sm` with an `aria-label`. As long as\n * everything fits on one page the component renders nothing at all, so an empty\n * list shows no pager.\n *\n * With {@link pageSizeOptions} a labelled `<select>` for the page size stands\n * in front of the range sentence. Without it nothing changes, so a pager that\n * does not want a picker renders exactly as before.\n *\n * Accessibility: on the first and the last page the matching arrow carries\n * `aria-disabled=\"true\"` instead of the native `disabled`, and its click is\n * swallowed. A native `disabled` on the button that was just used would throw\n * the focus back to `<body>`; this way the focus stays where the user put it and\n * the state is still announced. The range sentence is an `aria-live=\"polite\"`\n * region, so paging is reported even though nothing moves the focus.\n *\n * The component does not slice the data. It reports the wanted page through\n * {@link page}, the caller cuts the list.\n *\n * @example\n * ```html\n * <z-panel title=\"Transaktionen\" flush>\n * <z-rows>…</z-rows>\n * <z-pagination [(page)]=\"seite\" [total]=\"118\" itemLabel=\"Transaktionen\" />\n * </z-panel>\n * ```\n */\n@Component({\n selector: 'z-pagination',\n imports: [ZIcon, ZSelect],\n template: `\n @if (sichtbar()) {\n <nav [attr.aria-label]=\"navText()\">\n <div class=\"z-pager\">\n @if (groesseSichtbar()) {\n <div class=\"z-pager__size\">\n <label [attr.for]=\"groesseId\">{{ groesseText() }}</label>\n <z-select size=\"sm\">\n <select [id]=\"groesseId\" (change)=\"aufGroesse($event)\">\n @for (option of optionen(); track option) {\n <option [value]=\"option\" [selected]=\"option === proSeite()\">\n {{ option }}\n </option>\n }\n </select>\n </z-select>\n </div>\n }\n @if (blaettern()) {\n <span aria-live=\"polite\">{{ bereich()(von(), bis(), total(), itemLabel()) }}</span>\n <div class=\"z-pager__nav\">\n <button\n type=\"button\"\n class=\"z-btn z-btn--ghost z-btn--icon z-btn--sm\"\n [attr.aria-label]=\"zurueckText()\"\n [attr.aria-disabled]=\"seite() <= 1 ? 'true' : null\"\n (click)=\"zuSeite(seite() - 1)\"\n >\n <z-icon name=\"chevron_left\" />\n </button>\n <span class=\"z-mono\">{{ seite() }} / {{ seiten() }}</span>\n <button\n type=\"button\"\n class=\"z-btn z-btn--ghost z-btn--icon z-btn--sm\"\n [attr.aria-label]=\"weiterText()\"\n [attr.aria-disabled]=\"seite() >= seiten() ? 'true' : null\"\n (click)=\"zuSeite(seite() + 1)\"\n >\n <z-icon name=\"chevron_right\" />\n </button>\n </div>\n }\n </div>\n </nav>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZPagination {\n /**\n * Current page, 1-based and two-way bindable. The component keeps it inside\n * the valid range: a page below 1 or beyond the last one is written back\n * clamped, which also happens when {@link total} or {@link pageSize} change.\n *\n * @default 1\n */\n readonly page = model(1);\n\n /**\n * Entries per page, two-way bindable. A one-way `[pageSize]` keeps working\n * exactly as before; `[(pageSize)]` additionally receives what the user\n * picks from {@link pageSizeOptions}. A value below 1 and a value that is\n * not a finite number both count as 1, everywhere: in the page count as well\n * as in the range sentence.\n *\n * @default 25\n */\n readonly pageSize = model(25);\n\n /**\n * Sizes the user may choose from. Empty, the default, means no picker at\n * all. The rendered list is these options plus the current {@link pageSize},\n * de-duplicated and sorted, so the select never shows a size the pager is\n * not actually using.\n *\n * @default []\n */\n readonly pageSizeOptions = input<number[]>([]);\n\n /**\n * Visible label in front of the size select. Unset, the component uses\n * {@link ZLabels.paginationPageSize} from the label registry (\"Einträge pro\n * Seite\" in German).\n *\n * @default undefined\n */\n readonly pageSizeLabel = input<string>();\n\n /**\n * Number of entries in the whole list, not just on the current page.\n *\n * @default 0\n */\n readonly total = input(0, { transform: numberAttribute });\n\n /**\n * What the list contains, for example \"Rechnungen\". Passed to\n * {@link rangeLabel} as the last argument.\n *\n * @default ''\n */\n readonly itemLabel = input('');\n\n /**\n * Builds the sentence in front of the buttons from the first and last entry\n * number of the current page, the total and {@link itemLabel}. Unset, the\n * component uses {@link ZLabels.paginationRange} from the label registry\n * (\"1 bis 25 von 112 Rechnungen\" in German).\n *\n * @default undefined\n */\n readonly rangeLabel =\n input<(von: number, bis: number, total: number, itemLabel: string) => string>();\n\n /**\n * Accessible name of the `<nav>` around the pager, which tells a screen\n * reader what this navigation landmark is for. Unset, the component uses\n * {@link ZLabels.paginationNav} from the label registry.\n *\n * @default undefined\n */\n readonly ariaLabel = input<string>();\n\n /**\n * `aria-label` of the back button. Unset, the component uses\n * {@link ZLabels.paginationPrev} from the label registry.\n *\n * @default undefined\n */\n readonly ariaLabelPrev = input<string>();\n\n /**\n * `aria-label` of the forward button. Unset, the component uses\n * {@link ZLabels.paginationNext} from the label registry.\n *\n * @default undefined\n */\n readonly ariaLabelNext = input<string>();\n\n private readonly labels = injectZLabels();\n\n protected readonly bereich = computed(() => this.rangeLabel() ?? this.labels.paginationRange);\n protected readonly navText = computed(() => this.ariaLabel() ?? this.labels.paginationNav);\n protected readonly zurueckText = computed(\n () => this.ariaLabelPrev() ?? this.labels.paginationPrev,\n );\n protected readonly weiterText = computed(\n () => this.ariaLabelNext() ?? this.labels.paginationNext,\n );\n protected readonly groesseText = computed(\n () => this.pageSizeLabel() ?? this.labels.paginationPageSize,\n );\n\n /** Ties the size select to its label; unique per instance on the page. */\n protected readonly groesseId = `z-pager-size-${++zaehler}`;\n\n /** {@link pageSize} as a whole number of at least 1, used by every count. */\n protected readonly proSeite = computed(() => {\n const roh = Math.trunc(this.pageSize());\n return Number.isFinite(roh) ? Math.max(1, roh) : 1;\n });\n\n protected readonly seiten = computed(() =>\n Math.max(1, Math.ceil(this.total() / this.proSeite())),\n );\n /** The page shown is always inside the valid range. */\n protected readonly seite = computed(() =>\n Math.min(Math.max(1, Math.trunc(this.page())), this.seiten()),\n );\n\n /**\n * The sizes the select offers: the given options plus the size in use,\n * de-duplicated and sorted, so a `pageSize` outside the options still shows\n * the right value instead of a wrong one.\n */\n protected readonly optionen = computed(() => {\n const gegeben = this.pageSizeOptions();\n if (gegeben.length === 0) {\n return [];\n }\n return [...new Set([...gegeben, this.proSeite()])].sort((a, b) => a - b);\n });\n\n /** Arrows and range sentence, the rule of the reference: more than one page. */\n protected readonly blaettern = computed(() => this.total() > 0 && this.total() > this.proSeite());\n\n /**\n * The size select, which follows a rule of its own: it stands while the list\n * is longer than the smallest option, that is while at least one of the\n * offered sizes would split it into pages. Tying it to {@link blaettern}\n * instead would strand the user on a size that fits everything onto one page:\n * the arrows go, the select goes with them, and there is no way back to a\n * smaller size.\n */\n protected readonly groesseSichtbar = computed(() => {\n const optionen = this.optionen();\n return optionen.length > 0 && this.total() > optionen[0];\n });\n\n protected readonly sichtbar = computed(() => this.blaettern() || this.groesseSichtbar());\n protected readonly von = computed(() => (this.seite() - 1) * this.proSeite() + 1);\n protected readonly bis = computed(() => Math.min(this.seite() * this.proSeite(), this.total()));\n\n constructor() {\n // When total or pageSize change, a page beyond the end moves back into the\n // valid range.\n effect(() => {\n const geklemmt = this.seite();\n if (untracked(this.page) !== geklemmt) {\n this.page.set(geklemmt);\n }\n });\n }\n\n /**\n * A click on an arrow that is marked `aria-disabled` is swallowed: the button\n * keeps the focus and nothing else happens.\n */\n protected zuSeite(ziel: number): void {\n if (ziel < 1 || ziel > this.seiten()) {\n return;\n }\n this.page.set(ziel);\n }\n\n /**\n * Takes the size the user picked and keeps the first entry of the current\n * page in view: the new page is the one that entry falls on. Both models are\n * written once, so a caller bound to either sees one change.\n */\n protected aufGroesse(ereignis: Event): void {\n const neu = Math.trunc(Number((ereignis.target as HTMLSelectElement).value));\n if (!Number.isFinite(neu) || neu < 1) {\n return;\n }\n const ersterEintrag = (this.seite() - 1) * this.proSeite();\n this.pageSize.set(neu);\n this.page.set(Math.floor(ersterEintrag / neu) + 1);\n }\n}\n","/* Package daten: Metric, ServerList, FileTable and Pagination. */\nexport * from '../metric';\nexport * from '../rows';\nexport * from '../table';\nexport * from '../pagination';\n","import { ChangeDetectionStrategy, Component, Directive, input } from '@angular/core';\nimport { ZIcon } from '../icon';\n\n/**\n * Status of an alert. `neutral` is a plain note, `info` a hint, `success` a\n * finished operation, `warning` something the customer should act on soon, and\n * `danger` something that failed. The color only covers the surface and the\n * icon.\n */\nexport type ZAlertStatus = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\n/**\n * Marks the single action of an alert, projected next to the text: one button,\n * secondary and `size=\"sm\"`. Adds no markup and no classes of its own.\n *\n * @example\n * ```html\n * <z-alert status=\"warning\" title=\"2 Änderungen greifen erst nach einem Neustart\">\n * PvP und maximale Spieler.\n * <button zAlertAction zBtn=\"secondary\" size=\"sm\">Jetzt neu starten</button>\n * </z-alert>\n * ```\n */\n@Directive({ selector: '[zAlertAction]' })\nexport class ZAlertAction {}\n\n/**\n * Note in the page flow: title as a full sentence, the detail below it, at most\n * one button next to it. Error texts say what happened and what the customer\n * can do. At most one alert per page, above the content.\n *\n * Renders a host with the class `z-alert` plus one of `z-alert--info`,\n * `--success`, `--warning`, `--danger`, an optional leading `z-icon`, a\n * `div.z-alert__text` with `span.z-alert__title` and `span.z-alert__body`\n * around the projected content, and the projected `[zAlertAction]` element.\n *\n * Accessibility: an alert is static page content and not a live region. What\n * arrives while the page is being read is announced by a toast with\n * `role=\"alert\"`. The native `title` attribute is suppressed so the browser\n * does not show its own tooltip for the title input.\n *\n * @example\n * ```html\n * <z-alert status=\"danger\" title=\"Installation fehlgeschlagen\" icon=\"error\">\n * SteamCMD hat nach 120 Sekunden nicht geantwortet. Starte die Installation erneut.\n * <button zAlertAction zBtn=\"secondary\" size=\"sm\">Erneut installieren</button>\n * </z-alert>\n * ```\n */\n@Component({\n selector: 'z-alert',\n imports: [ZIcon],\n template: `\n @if (icon()) {\n <z-icon [name]=\"icon()\" />\n }\n <div class=\"z-alert__text\">\n @if (title()) {\n <span class=\"z-alert__title\">{{ title() }}</span>\n }\n <span class=\"z-alert__body\"><ng-content /></span>\n </div>\n <ng-content select=\"[zAlertAction]\" />\n `,\n host: {\n class: 'z-alert',\n '[class.z-alert--info]': `status() === 'info'`,\n '[class.z-alert--success]': `status() === 'success'`,\n '[class.z-alert--warning]': `status() === 'warning'`,\n '[class.z-alert--danger]': `status() === 'danger'`,\n /* Without this the title would also sit on the element as a native title\n attribute and the browser would show its own tooltip (measured). */\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZAlert {\n /**\n * Color of the alert. `neutral` renders without a modifier class.\n *\n * @default 'neutral'\n */\n readonly status = input<ZAlertStatus>('neutral');\n\n /**\n * Title as a full sentence. Empty means no title line.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Name of the Material Icons ligature, for example `error` or `restart_alt`.\n * Empty means no icon in the alert.\n *\n * @default ''\n */\n readonly icon = input('');\n}\n","import { ChangeDetectionStrategy, Component, Directive, input } from '@angular/core';\n\n/**\n * Marks the single action of an empty state: one secondary button for the first\n * entry. It stays secondary even when the page header already shows a primary\n * button for the same action. Adds no markup and no classes of its own.\n *\n * @example\n * ```html\n * <z-empty-state title=\"Keine offenen Tickets\">\n * Wir antworten in der Regel innerhalb von 24 Stunden.\n * <button zEmptyAction zBtn=\"secondary\">Ticket erstellen</button>\n * </z-empty-state>\n * ```\n */\n@Directive({ selector: '[zEmptyAction]' })\nexport class ZEmptyAction {}\n\n/**\n * Fills a list that has no entries: a title naming the state, one sentence that\n * helps on, one action. No large grey icon, the text carries the state. An\n * empty list shows no pagination and no filters; data that is missing because\n * of an error is an alert, not an empty state.\n *\n * Renders a host with the class `z-empty`, an optional `span.z-empty__title`\n * (a heading `h1` to `h4` with {@link headingLevel}), a\n * `span.z-empty__body` around the projected text, and the projected\n * `[zEmptyAction]` element. The native `title` attribute is suppressed so the\n * browser does not show its own tooltip for the title input.\n *\n * @example\n * ```html\n * <z-panel title=\"Tickets\" flush>\n * <z-empty-state title=\"Keine offenen Tickets\">\n * Wir antworten in der Regel innerhalb von 24 Stunden, auf Discord oft schneller.\n * <button zEmptyAction zBtn=\"secondary\">Ticket erstellen</button>\n * </z-empty-state>\n * </z-panel>\n * ```\n */\n@Component({\n selector: 'z-empty-state',\n template: `\n @if (title()) {\n @switch (headingLevel()) {\n @case (1) {\n <h1 class=\"z-empty__title\">{{ title() }}</h1>\n }\n @case (2) {\n <h2 class=\"z-empty__title\">{{ title() }}</h2>\n }\n @case (3) {\n <h3 class=\"z-empty__title\">{{ title() }}</h3>\n }\n @case (4) {\n <h4 class=\"z-empty__title\">{{ title() }}</h4>\n }\n @default {\n <span class=\"z-empty__title\">{{ title() }}</span>\n }\n }\n }\n <span class=\"z-empty__body\"><ng-content /></span>\n <ng-content select=\"[zEmptyAction]\" />\n `,\n host: {\n class: 'z-empty',\n /* Without this the title would also sit on the element as a native title\n attribute and the browser would show its own tooltip (measured). */\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZEmptyState {\n /**\n * Title that names the state, for example `Keine offenen Tickets`. Empty\n * means no title line.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Makes the title a heading: `1` to `4` for `h1` to `h4`. Unset, the title\n * stays a `span`, which fits an empty list inside a panel whose own title is\n * the heading. A page that is nothing but this state, a 404 for example,\n * sets `1`. The visual size never changes with it.\n *\n * @default undefined\n */\n readonly headingLevel = input<\n 1 | 2 | 3 | 4 | undefined,\n 1 | 2 | 3 | 4 | '1' | '2' | '3' | '4' | undefined\n >(undefined, {\n transform: (wert) => (wert === undefined ? undefined : (Number(wert) as 1 | 2 | 3 | 4)),\n });\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Placeholder that holds the space while a list or metric loads. Renders an\n * empty host with the class `z-skel`, plus `z-skel--thumb` for the square\n * variant and an inline `width`. With {@link tile} it renders `z-skel--tile`\n * and inside it `span.z-skel__cover` and two `span.z-skel__line`, the geometry\n * of a `button[zGameTile]`, so it takes exactly the cell of a tile in a\n * `z-game-grid`.\n *\n * Accessibility: purely decorative, hence the fixed `aria-hidden=\"true\"`. The\n * surrounding container carries `aria-busy=\"true\"` and an `aria-label`. Show as\n * many placeholder rows as are normally expected (two or three) in the same\n * grid as the real rows, so nothing jumps when the data arrives. Show it only\n * after 300ms; a button that is working uses a spinner instead.\n *\n * @example\n * ```html\n * <z-panel title=\"Meine Server\" busy aria-label=\"Server werden geladen\">\n * <z-skeleton thumb />\n * <z-skeleton width=\"40%\" />\n * <z-skeleton width=\"64px\" />\n * </z-panel>\n * <z-game-grid role=\"group\" aria-busy=\"true\" aria-label=\"Spiele werden geladen\">\n * <z-skeleton tile />\n * <z-skeleton tile />\n * </z-game-grid>\n * ```\n */\n@Component({\n selector: 'z-skeleton',\n template: `@if (tile()) {\n <span class=\"z-skel__cover\"></span>\n <span class=\"z-skel__line z-skel__line--title\"></span>\n <span class=\"z-skel__line z-skel__line--price\"></span>\n }`,\n host: {\n class: 'z-skel',\n '[class.z-skel--thumb]': `thumb()`,\n '[class.z-skel--tile]': `tile()`,\n '[style.width]': `tile() ? null : width() || null`,\n 'aria-hidden': 'true',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSkeleton {\n /**\n * CSS length for the placeholder, for example `40%` or `64px`. Empty means\n * full width.\n *\n * @default ''\n */\n readonly width = input('');\n\n /**\n * Renders a square instead of a line, for the image area of a row. Boolean\n * attribute.\n *\n * @default false\n */\n readonly thumb = input(false, { transform: booleanAttribute });\n\n /**\n * Renders the placeholder of a `button[zGameTile]`: the landscape cover area, a\n * title line and a price line with the gaps of the tile, for a\n * `z-game-grid` that is still loading. The grid cell sets its width, so\n * {@link width} does not apply. Boolean attribute.\n *\n * @default false\n */\n readonly tile = input(false, { transform: booleanAttribute });\n}\n","import {\n DestroyRef,\n EnvironmentProviders,\n inject,\n InjectionToken,\n makeEnvironmentProviders,\n Service,\n signal,\n} from '@angular/core';\n\n/**\n * Status of a toast. `neutral` confirms, `info` adds a hint, `success` reports\n * a completed operation, `warning` something to act on soon and `danger` a\n * failed one. Only `danger` is announced as `role=\"alert\"`; the other four are\n * announced politely, unless {@link ZToastOptions.live} says otherwise.\n *\n * The status is never the colour alone: the toast text itself says what\n * happened, so a colour-blind reader and a screen reader get the same message.\n */\nexport type ZToastStatus = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\n/**\n * Live region a toast is announced in: `polite` waits until the screen reader\n * is idle, `assertive` interrupts it (`role=\"alert\"`).\n */\nexport type ZToastLive = 'polite' | 'assertive';\n\n/**\n * Options for a single toast, passed to `show`, `info`, `success`, `warning`\n * and `error`.\n */\nexport interface ZToastOptions {\n /** Color and announcement of the toast. Defaults to `neutral`. */\n status?: ZToastStatus;\n /**\n * Line above the message, as a full sentence or a short heading. Omitted\n * means the toast stays a single line, exactly as before.\n */\n title?: string;\n /** Name of the Material Icons ligature. Omitted means no icon. */\n icon?: string;\n /** Label of the extra action, for example `Rückgängig`. Omitted means no action button. */\n actionLabel?: string;\n /** Called when the action is used. The toast closes afterwards. */\n action?: () => void;\n /**\n * Milliseconds the toast stays visible. 0 means it stays until it is closed.\n * Without a value: 5000, or 8000 when `actionLabel` is set.\n */\n duration?: number;\n /**\n * Live region of the toast. Without a value `danger` is `assertive` and the\n * other four are `polite`. `assertive` for a `warning` is what an application\n * sets when its warnings used to interrupt the screen reader.\n */\n live?: ZToastLive;\n}\n\n/** A toast as it is currently shown. Read from `ZToast.toasts` by the outlet. */\nexport interface ZToastItem {\n /** Running number, also the handle for `dismiss`. */\n readonly id: number;\n /** The message, one sentence without a full stop. */\n readonly text: string;\n /** Line above the message, empty for a single-line toast. */\n readonly title: string;\n /**\n * Which of the five looks the toast has. Without {@link live} it also picks\n * the live region: `danger` goes into the assertive one, the other four into\n * the polite one; `live` overrides that. Always set here; `show()` falls\n * back to `neutral`.\n */\n readonly status: ZToastStatus;\n /** Name of the Material Icons ligature, empty for no icon. */\n readonly icon: string;\n /** Label of the action button, empty for no action. */\n readonly actionLabel: string;\n /** Called when the action is used. */\n readonly action?: () => void;\n /**\n * Live region the outlet puts the toast into. `ZToast` always sets it;\n * without it the outlet derives it from {@link status} as before.\n */\n readonly live?: ZToastLive;\n}\n\n/**\n * Configuration of {@link provideZenitToast}. Every field is optional; the\n * defaults are the behaviour without the provider.\n */\nexport interface ZToastConfig {\n /**\n * How many toasts are visible at a time, at least 1.\n *\n * @default 3\n */\n readonly maxVisible?: number;\n /**\n * What a new toast does while {@link maxVisible} toasts are visible.\n * `'replace'` closes the oldest toast that is not standing and waits only\n * when every visible toast is standing. `'queue'` never closes one: the new\n * toast waits until a place is free. Standing means `duration: 0` or an\n * action; such a toast is never closed to make room, in either mode.\n *\n * @default 'replace'\n */\n readonly overflow?: 'replace' | 'queue';\n}\n\nconst Z_TOAST_CONFIG = new InjectionToken<ZToastConfig>('Z_TOAST_CONFIG', {\n providedIn: 'root',\n factory: () => ({}),\n});\n\n/**\n * Sets how many toasts `ZToast` shows at once and what happens to the ones\n * beyond that. Application root only: `ZToast` is a root service and reads\n * the config of the root injector once.\n *\n * @param config Deviations from the defaults; see {@link ZToastConfig}.\n * @returns Providers for the application root (`bootstrapApplication`).\n *\n * @example\n * ```ts\n * // app.config.ts: no toast is ever closed to make room\n * export const appConfig: ApplicationConfig = {\n * providers: [provideZenitToast({ overflow: 'queue' })],\n * };\n * ```\n */\nexport function provideZenitToast(config: ZToastConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: Z_TOAST_CONFIG, useValue: config }]);\n}\n\nconst DAUER = 5000;\nconst DAUER_MIT_AKTION = 8000;\n\n/** A toast that waits for a place, with the duration it gets once visible. */\ninterface Wartend {\n readonly toast: ZToastItem;\n readonly dauer: number;\n}\n\n/**\n * Short feedback above the content: confirms that something happened and\n * disappears by itself. The visible part is `z-toast-outlet`, which stands once\n * in the root template.\n *\n * At most three toasts at a time, the newest at the bottom; a fourth one closes\n * the oldest toast that is not standing. A standing toast, one with\n * `duration: 0` or an action, is never closed to make room: while only\n * standing toasts are visible, the new one waits and appears as soon as a\n * place is free. {@link provideZenitToast} changes the number and can make\n * every toast wait instead of closing one. An error that requires an action on\n * the page is an alert and not a toast.\n *\n * A toast is one sentence by default. `title` adds a line above it, so a\n * service that carries a title, a message and a type of its own can hand all\n * three over: `title` to `title`, the message to `text`, the type to `status`.\n * The status never stands in the colour alone; the text says what happened.\n *\n * @example\n * ```html\n * <!-- once in the root template -->\n * <z-toast-outlet />\n * <button zBtn=\"secondary\" (click)=\"toast.success('Eigenschaften gespeichert')\">Speichern</button>\n * ```\n */\n@Service()\nexport class ZToast {\n private letzteId = 0;\n private readonly timer = new Map<number, ReturnType<typeof setTimeout>>();\n private readonly liste = signal<readonly ZToastItem[]>([]);\n private warteschlange: readonly Wartend[] = [];\n private readonly config = inject(Z_TOAST_CONFIG);\n private readonly hoechstens = Math.max(\n 1,\n Number.isFinite(this.config.maxVisible) ? Number(this.config.maxVisible) : 3,\n );\n /** Ids of the standing toasts, visible or waiting: never closed to make room. */\n private readonly stehend = new Set<number>();\n\n /**\n * The visible toasts, oldest first. Read by `z-toast-outlet`. A waiting toast\n * is not in here; its timer starts when it moves in.\n */\n readonly toasts = this.liste.asReadonly();\n\n constructor() {\n // Closes all toasts so no timer keeps running when the application is torn\n // down.\n inject(DestroyRef).onDestroy(() => this.dismiss());\n }\n\n /**\n * Shows a toast and returns its id for `dismiss`. While three toasts are\n * already visible, the oldest one that is not standing is closed first; if\n * every visible toast is standing, or with `overflow: 'queue'`, the new one\n * waits for a place instead.\n *\n * @param text Message, one sentence without a full stop, in the past\n * participle, for example `Eigenschaften gespeichert`.\n * @param optionen Status, title, icon, action and duration. Default duration:\n * 5000ms, 8000ms with `actionLabel`, 0 keeps the toast until it is closed.\n * @returns id of the new toast.\n */\n show(text: string, optionen: ZToastOptions = {}): number {\n const id = ++this.letzteId;\n const status = optionen.status ?? 'neutral';\n const dauer = optionen.duration ?? (optionen.actionLabel ? DAUER_MIT_AKTION : DAUER);\n if (dauer <= 0 || optionen.actionLabel) {\n this.stehend.add(id);\n }\n const toast: ZToastItem = {\n id,\n text,\n title: optionen.title ?? '',\n status,\n icon: optionen.icon ?? '',\n actionLabel: optionen.actionLabel ?? '',\n action: optionen.action,\n live: optionen.live ?? (status === 'danger' ? 'assertive' : 'polite'),\n };\n this.warteschlange = [...this.warteschlange, { toast, dauer }];\n if (this.config.overflow !== 'queue') {\n this.platzMachen();\n }\n this.nachruecken();\n return id;\n }\n\n /**\n * Shows a hint: status `info` and the icon `info`, both overridable through\n * `optionen`. Duration and live region are those of a neutral toast: 5000ms,\n * 8000ms with `actionLabel`, announced politely.\n *\n * @returns id of the new toast.\n */\n info(text: string, optionen: ZToastOptions = {}): number {\n return this.show(text, { status: 'info', icon: 'info', ...optionen });\n }\n\n /**\n * Shows a success toast: status `success` and the icon `check_circle`, both\n * overridable through `optionen`.\n *\n * @returns id of the new toast.\n */\n success(text: string, optionen: ZToastOptions = {}): number {\n return this.show(text, { status: 'success', icon: 'check_circle', ...optionen });\n }\n\n /**\n * Shows a warning: status `warning` and the icon `warning`, both overridable\n * through `optionen`. A warning is not an error, so duration and live region\n * stay those of a neutral toast: 5000ms, 8000ms with `actionLabel`, announced\n * politely. Something the customer has to act on right now is an alert on the\n * page, not a toast.\n *\n * @returns id of the new toast.\n */\n warning(text: string, optionen: ZToastOptions = {}): number {\n return this.show(text, { status: 'warning', icon: 'warning', ...optionen });\n }\n\n /**\n * Shows an error toast: status `danger`, the icon `error` and `duration: 0`,\n * so it stays until it is closed. The outlet announces it with\n * `role=\"alert\"`. All three values are overridable through `optionen`.\n *\n * @returns id of the new toast.\n */\n error(text: string, optionen: ZToastOptions = {}): number {\n return this.show(text, { status: 'danger', icon: 'error', duration: 0, ...optionen });\n }\n\n /**\n * Closes a toast and stops its timer, or takes it out of the queue before it\n * was ever shown. The next waiting toast moves into the free place.\n *\n * @param id id from `show`, `info`, `success`, `warning` or `error`. Without\n * an id all toasts are closed, the waiting ones included.\n */\n dismiss(id?: number): void {\n if (id === undefined) {\n this.timer.forEach((timer) => clearTimeout(timer));\n this.timer.clear();\n this.stehend.clear();\n this.warteschlange = [];\n this.liste.set([]);\n return;\n }\n clearTimeout(this.timer.get(id));\n this.timer.delete(id);\n this.stehend.delete(id);\n this.warteschlange = this.warteschlange.filter((w) => w.toast.id !== id);\n this.liste.update((alt) => alt.filter((t) => t.id !== id));\n this.nachruecken();\n }\n\n /**\n * `'replace'`: one new toast frees at most one place. While every place is\n * taken, the oldest visible toast that is not standing gives way, and the\n * head of the queue moves in, which is the new toast only when nothing else\n * waits. One and not a loop: a loop would also close the toast that just\n * moved in, and every further one after it, so a waiting toast could vanish\n * without ever having been in `toasts`. Only visible toasts give way; a\n * waiting one is never dropped.\n */\n private platzMachen(): void {\n if (this.warteschlange.length === 0 || this.liste().length < this.hoechstens) {\n return;\n }\n const aeltester = this.liste().find((t) => !this.stehend.has(t.id));\n if (aeltester) {\n this.dismiss(aeltester.id);\n }\n }\n\n /** Moves waiting toasts in while places are free and starts their timers. */\n private nachruecken(): void {\n while (this.warteschlange.length > 0 && this.liste().length < this.hoechstens) {\n const [{ toast, dauer }, ...rest] = this.warteschlange;\n this.warteschlange = rest;\n this.liste.update((alt) => [...alt, toast]);\n if (dauer > 0) {\n this.timer.set(\n toast.id,\n setTimeout(() => this.dismiss(toast.id), dauer),\n );\n }\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { ZButton } from '../button';\nimport { ZIcon } from '../icon';\nimport { injectZLabels } from '../labels';\nimport { ZToast, ZToastItem } from './toast';\n\n/**\n * Stands once in the root template and renders the toasts of the `ZToast`\n * service. Sits `position: fixed` in the bottom right corner, on mobile at the\n * bottom across the full width.\n *\n * Renders a host with the class `z-toast-outlet` holding two permanent\n * `div.z-toast-outlet__live` regions, and per toast a `div.z-toast` plus\n * `z-toast--info`, `--success`, `--warning` or `--danger`, an optional `z-icon`,\n * the text, an optional `button.z-toast__action` and the close button\n * `button.z-toast__close` (ghost, `sm`, icon only).\n *\n * Without a title the text is a bare `span`, as it has always been. With a\n * title the two lines share one column: `div.z-toast__text` with\n * `span.z-toast__title` above `span.z-toast__body`, the same structure as\n * `z-alert`.\n *\n * Accessibility: a screen reader announces a change *inside* an existing live\n * region, not a region that appears together with its content. The outlet\n * therefore renders the two regions from the start, empty, and puts each toast\n * into the matching one: `role=\"status\"` with `aria-live=\"polite\"` for neutral,\n * info, success and warning, `role=\"alert\"` with `aria-live=\"assertive\"` for\n * danger, because only a failure is worth interrupting for. The option `live`\n * of a toast overrides that, for example to announce a warning assertively. The toast\n * elements carry no `role` of their own, because a live region nested in a live\n * region is announced twice. Both regions set `aria-atomic=\"false\"`, which\n * overrides the `true` implied by `status` and `alert`: with up to three toasts\n * open, only the one that was just added is read out instead of all of them.\n * The `aria-label` of the close button comes from the label registry, key\n * `toastClose`: German without a provider, English with\n * `provideZenitLabels(Z_LABELS_EN)`, and `closeLabel` on this component wins\n * over both. Using the action runs it and closes that toast.\n *\n * Both regions are `display: contents`, so the toasts stay the grid items of\n * `.z-toast-outlet`; the `order` bound per toast keeps the visual sequence of\n * the service list (newest at the bottom) across the two regions.\n *\n * @example\n * ```html\n * <z-toast-outlet />\n * <z-toast-outlet closeLabel=\"Close\" />\n * ```\n */\n@Component({\n selector: 'z-toast-outlet',\n imports: [ZButton, ZIcon],\n template: `\n @for (gruppe of gruppen(); track gruppe.rolle) {\n <div\n class=\"z-toast-outlet__live\"\n [attr.role]=\"gruppe.rolle\"\n [attr.aria-live]=\"gruppe.live\"\n aria-atomic=\"false\"\n >\n @for (eintrag of gruppe.toasts; track eintrag.toast.id) {\n @let toast = eintrag.toast;\n <div\n class=\"z-toast\"\n [class.z-toast--info]=\"toast.status === 'info'\"\n [class.z-toast--success]=\"toast.status === 'success'\"\n [class.z-toast--warning]=\"toast.status === 'warning'\"\n [class.z-toast--danger]=\"toast.status === 'danger'\"\n [style.order]=\"eintrag.reihe\"\n >\n @if (toast.icon) {\n <z-icon [name]=\"toast.icon\" />\n }\n @if (toast.title) {\n <div class=\"z-toast__text\">\n <span class=\"z-toast__title\">{{ toast.title }}</span>\n <span class=\"z-toast__body\">{{ toast.text }}</span>\n </div>\n } @else {\n <span>{{ toast.text }}</span>\n }\n @if (toast.actionLabel) {\n <button type=\"button\" class=\"z-toast__action\" (click)=\"aufAktion(toast)\">\n {{ toast.actionLabel }}\n </button>\n }\n <button\n zBtn=\"ghost\"\n size=\"sm\"\n iconOnly\n type=\"button\"\n class=\"z-toast__close\"\n [attr.aria-label]=\"schliessenText()\"\n (click)=\"dienst.dismiss(toast.id)\"\n >\n <z-icon name=\"close\" size=\"sm\" />\n </button>\n </div>\n }\n </div>\n }\n `,\n host: { class: 'z-toast-outlet' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZToastOutlet {\n /**\n * `aria-label` of the close button on every toast. Unset, the component uses\n * {@link ZLabels.toastClose} from the label registry.\n *\n * @default undefined\n */\n readonly closeLabel = input<string>();\n\n private readonly labels = injectZLabels();\n\n protected readonly schliessenText = computed(() => this.closeLabel() ?? this.labels.toastClose);\n protected readonly dienst = inject(ZToast);\n protected readonly toasts = this.dienst.toasts;\n\n /**\n * The two live regions with their toasts. `reihe` is the position in the\n * service list and becomes the CSS `order`, so splitting the list over two\n * regions does not change what the eye sees.\n */\n protected readonly gruppen = computed(() => {\n const mitReihe = this.toasts().map((toast, reihe) => ({\n toast,\n reihe,\n live: toast.live ?? (toast.status === 'danger' ? 'assertive' : 'polite'),\n }));\n return [\n {\n rolle: 'status',\n live: 'polite',\n toasts: mitReihe.filter((eintrag) => eintrag.live === 'polite'),\n },\n {\n rolle: 'alert',\n live: 'assertive',\n toasts: mitReihe.filter((eintrag) => eintrag.live === 'assertive'),\n },\n ];\n });\n\n protected aufAktion(toast: ZToastItem): void {\n toast.action?.();\n this.dienst.dismiss(toast.id);\n }\n}\n","import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\n\n/**\n * The tooltip panel: renders its text on a host with the class `z-tooltip`,\n * `role=\"tooltip\"` and the id the trigger points its `aria-describedby` at.\n * It hangs in the CDK overlay on the body, not in the page flow, and is only\n * created by the `zTooltip` directive.\n *\n * @internal Exported for the directive only; not part of the public API and not\n * re-exported from the entry point.\n */\n@Component({\n selector: 'z-tooltip',\n template: `{{ text() }}`,\n host: {\n class: 'z-tooltip',\n role: 'tooltip',\n '[attr.id]': `id()`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZTooltipPanel {\n /** Text of the tooltip, set by the directive when the panel is attached. */\n readonly text = signal('');\n\n /** id the trigger refers to through `aria-describedby`. */\n readonly id = signal('');\n}\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n ComponentRef,\n DestroyRef,\n Directive,\n DOCUMENT,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ZTokenAttribut } from '../a11y/host-attribute';\nimport { ZTooltipPanel } from './tooltip-panel';\n\n/**\n * Grace period between leaving trigger or panel and closing. Long enough to\n * cross the gap with the pointer, short enough not to feel stuck.\n */\nconst NACHLAUF = 100;\n\nlet zaehler = 0;\n\n/** The values of `overflow` that cut a child off at the edge of its box. */\nconst KLEMMT = new Set(['auto', 'scroll', 'hidden', 'clip', 'overlay']);\n\n/** One box entirely beyond one of the edges of the other. */\nfunction ausserhalb(\n kasten: DOMRect,\n rolle: { top: number; left: number; bottom: number; right: number },\n): boolean {\n return (\n kasten.bottom <= rolle.top ||\n kasten.top >= rolle.bottom ||\n kasten.right <= rolle.left ||\n kasten.left >= rolle.right\n );\n}\n\n/** Two boxes at the same place on the screen: nothing moved the trigger. */\nfunction unbewegt(a: DOMRect, b: DOMRect): boolean {\n return a.top === b.top && a.left === b.left && a.width === b.width && a.height === b.height;\n}\n\n/**\n * Short addition to a control. Opens the tooltip panel in a CDK overlay,\n * centered above the trigger with 8px gap, below it as the fallback position.\n * A scroll of a container the trigger sits in takes the panel back, in the page\n * as well as in an inner container such as the body of a scrolling dialog;\n * another scroller on the same screen leaves it alone. While the trigger holds\n * the focus the panel follows that scroll instead, steps aside while the\n * scroller covers the trigger and comes back once it can be seen again.\n *\n * Accessibility: the panel appears on pointer and focus. On leaving it does not\n * disappear at once but after 100ms, and entering the panel itself stops that\n * timer again, so the text can be read, selected and scrolled (WCAG 2.1\n * SC 1.4.13 \"Hoverable\"). The 8px between trigger and panel are the transparent\n * padding of the overlay pane (`.z-tooltip-pane`), so the pointer crosses the\n * panel instead of nothing; the position therefore carries no offset. While the\n * trigger holds the focus, the pointer leaving keeps the panel standing, since\n * it belongs to the focus then; `focusout` closes it at once unless the pointer\n * rests on trigger or panel, and Escape always closes at once, and only the\n * tooltip: the key stops there, so a dialog behind it needs a second Escape.\n * The id of the panel is added to `aria-describedby` of the trigger while the\n * panel hangs in the DOM and taken out again afterwards, because a permanent\n * reference would point at a missing id most of the time. Whatever the trigger\n * already carries there, a hint or an error of a `z-field` for example, stays\n * untouched. A\n * disabled button fires no events, so the surrounding element carries the\n * tooltip, and the same reason also stands as a sentence for keyboard users.\n *\n * @example\n * ```html\n * <button zBtn=\"ghost\" iconOnly aria-label=\"Aktualisieren\" zTooltip=\"Aktualisieren\">\n * <z-icon name=\"refresh\" />\n * </button>\n *\n * <span zTooltip=\"Beispiel-Server 1 ist bereits gestoppt\">\n * <button zBtn=\"secondary\" type=\"button\" disabled>Stoppen</button>\n * </span>\n * ```\n */\n@Directive({\n selector: '[zTooltip]',\n host: {\n '(mouseenter)': `aufZeiger(true)`,\n '(mouseleave)': `aufZeiger(false)`,\n '(focusin)': `zeige()`,\n '(focusout)': `aufFokusVerlust()`,\n },\n})\nexport class ZTooltip {\n /**\n * The tooltip text, given as the value of the attribute. A change while the\n * panel is open reaches the panel. Empty means no tooltip: the panel is not\n * opened at all, and an open one closes.\n *\n * @default ''\n */\n readonly zTooltip = input('');\n\n protected readonly tooltipId = `z-tooltip-${++zaehler}`;\n protected readonly sichtbar = signal(false);\n\n private readonly overlay = inject(Overlay);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly dokument = inject(DOCUMENT);\n /**\n * The id of the panel inside `aria-describedby` of the trigger, while the\n * panel stands. The attribute is a list of ids and belongs to the caller: a\n * static one, a binding, or the hint and the error that a `z-field` links to\n * its control. Overwriting it would silently cut the control off from its\n * own description, so only this one token is added and removed, and it keeps\n * the back of the list, where a passing addition is read last.\n */\n private readonly beschreibung = new ZTokenAttribut(\n this.host.nativeElement,\n 'aria-describedby',\n 'hinten',\n );\n private overlayRef?: OverlayRef;\n private flaeche?: ComponentRef<ZTooltipPanel>;\n\n /** Where the pointer currently rests; both keep the panel open. */\n private ueberHost = false;\n private ueberPanel = false;\n private timer?: ReturnType<typeof setTimeout>;\n /** Takes the panel listeners with it on destroy. */\n private readonly abbruch = new AbortController();\n /** Lives only while the panel stands; see {@link horcheWaehrendOffen}. */\n private horcher?: AbortController;\n /** The trigger box the panel was hung on; a scroll that leaves it is none. */\n private verankert?: DOMRect;\n\n constructor() {\n // The text can change while the panel hangs in the overlay, for example\n // when the reason for a disabled button changes. Empty closes the panel,\n // because an empty tooltip opens none either.\n effect(() => {\n const text = this.zTooltip();\n if (!this.sichtbar()) {\n return;\n }\n if (text) {\n this.flaeche?.instance.text.set(text);\n } else {\n this.verstecke();\n }\n });\n\n // The overlay goes together with the trigger and takes the pending timer\n // and the panel listeners with it.\n inject(DestroyRef).onDestroy(() => {\n this.stoppeTimer();\n this.abbruch.abort();\n this.horcher?.abort();\n // The trigger may outlive the directive, so it keeps its own description\n // and loses only the id of the panel.\n this.beschreibung.setze(null);\n this.overlayRef?.dispose();\n });\n }\n\n protected aufZeiger(drueber: boolean): void {\n this.ueberHost = drueber;\n if (drueber) {\n this.zeige();\n } else {\n this.planeSchliessen();\n }\n }\n\n /**\n * The focus leaves the trigger. With the pointer still on trigger or panel\n * the hover keeps the panel and only leaving both takes it back.\n */\n protected aufFokusVerlust(): void {\n if (!this.ueberHost && !this.ueberPanel) {\n this.verstecke();\n }\n }\n\n protected zeige(): void {\n const text = this.zTooltip();\n if (!text) {\n return;\n }\n this.stoppeTimer();\n if (this.sichtbar()) {\n return;\n }\n // A trigger that is already cut off by a container around it gets no panel\n // yet: `overflow: clip` never sends a scroll event, so the first paint is\n // the only moment to ask. The listeners start anyway, so a scroll that\n // brings the trigger back into view brings the panel with it.\n const kasten = this.host.nativeElement.getBoundingClientRect();\n if ((kasten.width || kasten.height) && this.verdeckt(kasten)) {\n this.verankert = kasten;\n this.horcheWaehrendOffen();\n return;\n }\n this.zeigeFlaeche(text);\n this.horcheWaehrendOffen();\n }\n\n protected verstecke(): void {\n this.stoppeTimer();\n this.horcher?.abort();\n this.horcher = undefined;\n this.verankert = undefined;\n this.ueberPanel = false;\n this.verbergeFlaeche();\n }\n\n /** Panel into the overlay; the trigger box it belongs to is noted with it. */\n private zeigeFlaeche(text: string): void {\n this.overlayRef ??= this.erzeugeOverlay();\n this.flaeche = this.overlayRef.attach(new ComponentPortal(ZTooltipPanel));\n this.flaeche.instance.text.set(text);\n this.flaeche.instance.id.set(this.tooltipId);\n // The panel is rendered here and now: `aria-describedby` of the trigger\n // points at its id from this moment on, and a reference into nothing is\n // what a screen reader would read out.\n this.flaeche.changeDetectorRef.detectChanges();\n this.verankert = this.host.nativeElement.getBoundingClientRect();\n this.sichtbar.set(true);\n // The caller may rewrite the attribute while the panel stands: a binding of\n // its own, or the hint and the error of a `z-field` around the control.\n // `ZTokenAttribut` watches for that and puts the id back.\n this.beschreibung.setze(this.tooltipId);\n }\n\n /** Panel out of the overlay. Whoever keeps listening stays listening. */\n private verbergeFlaeche(): void {\n if (!this.sichtbar()) {\n return;\n }\n this.beschreibung.setze(null);\n this.overlayRef?.detach();\n this.flaeche = undefined;\n this.sichtbar.set(false);\n }\n\n /**\n * While the panel stands, every scroller around the trigger is listened to,\n * and Escape is caught before anything else sees it.\n *\n * Both listeners hang on the document in the CAPTURE phase. For the scroll\n * because an event on an inner element does not bubble: the `reposition`\n * strategy of the overlay builds on `ScrollDispatcher`, which only ever hears\n * the window and the containers a caller marked `cdkScrollable`, so a tooltip\n * inside the body of a dialog used to stand still while its trigger moved\n * away under it. For Escape because the keyboard dispatcher of the CDK sits\n * on `document.body` and would otherwise close the dialog behind the tooltip\n * with the same key press (WAI-ARIA Practices: the first Escape dismisses the\n * tooltip, the second the dialog).\n */\n private horcheWaehrendOffen(): void {\n if (this.horcher) {\n return;\n }\n this.horcher = new AbortController();\n const signal = this.horcher.signal;\n this.dokument.addEventListener('scroll', (ereignis) => this.aufScrollen(ereignis), {\n capture: true,\n passive: true,\n signal,\n });\n this.dokument.addEventListener(\n 'keydown',\n (ereignis) => {\n if (ereignis.key !== 'Escape' || !this.sichtbar()) {\n return;\n }\n ereignis.stopPropagation();\n this.verstecke();\n },\n { capture: true, signal },\n );\n }\n\n /**\n * A scroll under the pointer takes the panel back, the way the native `title`\n * tooltip goes: one that lags behind its trigger is worse than none.\n *\n * Only a scroller the trigger sits in counts. `document` contains it too,\n * which is how a scroll of the page arrives, while the panel and every other\n * scroller of the screen (a console that follows its own log, a table beside\n * the trigger) do not move the trigger and are therefore ignored. An event\n * that leaves the trigger box exactly where it was changes nothing either:\n * the scroll that brought the trigger into view has already happened when the\n * panel goes up, and its event only arrives afterwards.\n *\n * The focus is the exception to closing. WCAG 2.1 SC 1.4.13 asks the content\n * to stand as long as the trigger keeps hover or focus, and the browser\n * itself scrolls a focused control into view, so the panel of a focused\n * trigger follows the scroll, steps aside while the scroller covers the\n * trigger and comes back once it can be seen again.\n */\n private aufScrollen(ereignis: Event): void {\n const ziel = ereignis.target as Node | null;\n const wirt = this.host.nativeElement;\n if (!this.overlayRef || !ziel?.contains(wirt)) {\n return;\n }\n const kasten = wirt.getBoundingClientRect();\n if (this.verankert && unbewegt(this.verankert, kasten)) {\n return;\n }\n this.verankert = kasten;\n if (!wirt.contains(this.dokument.activeElement)) {\n this.verstecke();\n return;\n }\n if (this.verdeckt(kasten)) {\n this.verbergeFlaeche();\n } else if (!this.sichtbar()) {\n this.zeigeFlaeche(this.zTooltip());\n } else {\n this.overlayRef.updatePosition();\n }\n }\n\n /**\n * Has the trigger left the visible part of anything that clips it? Not only\n * the scroller the event came from: with two scrollers inside each other the\n * inner one can hold the trigger out of sight while the outer one moves, and\n * a panel brought back then would float over foreign content. The viewport\n * counts as the outermost clip.\n */\n private verdeckt(kasten: DOMRect): boolean {\n const fenster = this.dokument.defaultView;\n if (\n ausserhalb(kasten, {\n top: 0,\n left: 0,\n bottom: fenster?.innerHeight ?? 0,\n right: fenster?.innerWidth ?? 0,\n })\n ) {\n return true;\n }\n for (\n let element = this.host.nativeElement.parentElement;\n element;\n element = element.parentElement\n ) {\n const stil = fenster?.getComputedStyle(element);\n const klemmt = !!stil && (KLEMMT.has(stil.overflowX) || KLEMMT.has(stil.overflowY));\n if (klemmt && ausserhalb(kasten, element.getBoundingClientRect())) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Closes after the grace period instead of at once, so the pointer can reach\n * the panel. A trigger holding the focus keeps the panel: the panel belongs\n * to that focus then and only `focusout` or Escape takes it back.\n */\n private planeSchliessen(): void {\n this.stoppeTimer();\n if (this.host.nativeElement.contains(this.dokument.activeElement)) {\n return;\n }\n this.timer = setTimeout(() => this.verstecke(), NACHLAUF);\n }\n\n private stoppeTimer(): void {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n\n /** Centered above, below as the fallback position. */\n private erzeugeOverlay(): OverlayRef {\n const ref = this.overlay.create({\n panelClass: 'z-tooltip-pane',\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions([\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom' },\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top' },\n ]),\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n });\n // The panel hangs on the body, far outside the trigger, so it has to report\n // its own hover: entering stops the pending close, leaving starts a new\n // one. The listeners live as long as the overlay and go with the\n // AbortController on destroy.\n ref.overlayElement.addEventListener(\n 'mouseenter',\n () => {\n this.ueberPanel = true;\n this.stoppeTimer();\n },\n { signal: this.abbruch.signal },\n );\n ref.overlayElement.addEventListener(\n 'mouseleave',\n () => {\n this.ueberPanel = false;\n this.planeSchliessen();\n },\n { signal: this.abbruch.signal },\n );\n return ref;\n }\n}\n","/* Package rueckmeldung: Alert, EmptyState, Skeleton, Toast and Tooltip. */\nexport * from '../feedback';\nexport * from '../toast';\nexport * from '../tooltip';\n","import { InteractivityChecker } from '@angular/cdk/a11y';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n contentChild,\n DestroyRef,\n Directive,\n DOCUMENT,\n ElementRef,\n inject,\n InjectionToken,\n input,\n signal,\n viewChild,\n} from '@angular/core';\n\n/**\n * Carries the id of a dialog heading down to `ZDialogLayout`. `ZDialog.open()`\n * generates the id, provides it under this token and puts the same id on the\n * CDK container as `aria-labelledby`, which is what gives the dialog its\n * accessible name.\n *\n * @internal Exported so that `dialog.ts` can provide it; not part of the\n * documented API.\n */\nexport const Z_DIALOG_TITLE_ID = new InjectionToken<string>('Z_DIALOG_TITLE_ID');\n\nlet laufendeNummer = 0;\n\n/**\n * Returns `<prefix>-<n>` with `n` counting up once per call, used for the ids\n * of a dialog heading and of the confirmation field.\n *\n * @param praefix Prefix of the id, for example `z-dialog-title`.\n * @returns The prefix followed by a dash and a number unique in this document.\n * @internal Exported for use inside the dialog package only.\n */\nexport function naechsteId(praefix: string): string {\n return `${praefix}-${++laufendeNummer}`;\n}\n\n/**\n * Marks the buttons in the footer of a dialog. Pure slot marker, it adds no\n * class and no markup. Without it `z-dialog` renders no footer at all.\n *\n * @example\n * ```html\n * <ng-container zDialogActions>\n * <button zBtn=\"ghost\" (click)=\"ref.close(false)\">Abbrechen</button>\n * <button zBtn=\"primary\" (click)=\"ref.close(true)\">Speichern</button>\n * </ng-container>\n * ```\n */\n@Directive({ selector: '[zDialogActions]' })\nexport class ZDialogActions {}\n\n/**\n * Switched off by something around the control, which the checker of the CDK\n * does not read: it only knows the `disabled` of the control itself. `:disabled`\n * covers a disabled `fieldset` the way the HTML standard defines it, including\n * the exception that the controls in its first `<legend>` stay operable, and the\n * `closest` behind it catches the browsers that do not.\n */\nfunction ausserBetrieb(element: HTMLElement): boolean {\n if (element.closest('[inert]')) {\n return true;\n }\n if (element.matches(':disabled')) {\n return true;\n }\n return (\n !!element.closest('fieldset:disabled') &&\n !element.closest('fieldset:disabled > legend:first-of-type')\n );\n}\n\n/**\n * Everything that could be a tab stop. Whether it really is one is decided by\n * `InteractivityChecker`, which knows the dozen reasons why it might not be.\n */\nconst KANDIDATEN = 'a[href], button, input, select, textarea, [tabindex], [contenteditable]';\n\n/**\n * Layout of a dialog: header with the heading, body, footer with the actions.\n * Use it as the root element of the component handed to `ZDialog.open()`.\n *\n * Renders `.z-dialog__header` with `<h2 class=\"z-dialog__title\">`,\n * `.z-dialog__body` with the projected content and, only when a\n * `[zDialogActions]` element is present, `.z-dialog__footer`. The host carries\n * `z-dialog` and its native `title` attribute is cleared, so the {@link title}\n * input never becomes a browser tooltip.\n *\n * Opened through `ZDialog`, the dialog is limited to the height of the screen\n * and the body is the part that scrolls: heading and actions stay in place, and\n * a body that scrolls without holding a tabbable element becomes a tab stop of\n * its own, a `role=\"group\"` named by the heading. Both are watched while the\n * dialog stands, so a body that only grows later gets its stop as well.\n *\n * Accessibility: `role=\"dialog\"`, `aria-modal`, the focus trap, Escape and\n * returning focus to the trigger all come from the container of\n * `@angular/cdk/dialog`. This component only supplies the heading and the id\n * that the container's `aria-labelledby` points at.\n *\n * @example\n * ```html\n * <z-dialog title=\"Notiz zu Beispiel-Server 1\">\n * <z-field label=\"Notiz\" for=\"notiz\">\n * <textarea zInput id=\"notiz\"></textarea>\n * </z-field>\n * <ng-container zDialogActions>\n * <button zBtn=\"ghost\" (click)=\"ref.close()\">Abbrechen</button>\n * <button zBtn=\"primary\" (click)=\"ref.close(true)\">Speichern</button>\n * </ng-container>\n * </z-dialog>\n * ```\n */\n@Component({\n selector: 'z-dialog',\n // CdkScrollable registers the body with the ScrollDispatcher of the CDK, so\n // an overlay anchored inside it, a menu or a tooltip, follows its trigger\n // while the body scrolls instead of standing still.\n imports: [CdkScrollable],\n template: `\n <div class=\"z-dialog__header\">\n <h2 class=\"z-dialog__title\" [id]=\"titleId\">{{ title() }}</h2>\n </div>\n <div\n #rumpf\n cdkScrollable\n class=\"z-dialog__body\"\n [attr.tabindex]=\"rumpfTabIndex()\"\n [attr.role]=\"rumpfTabIndex() === null ? null : 'group'\"\n [attr.aria-labelledby]=\"rumpfTabIndex() === null ? null : titleId\"\n >\n <ng-content />\n </div>\n @if (aktionen()) {\n <div class=\"z-dialog__footer\"><ng-content select=\"[zDialogActions]\" /></div>\n }\n `,\n host: {\n class: 'z-dialog',\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZDialogLayout {\n /**\n * Heading of the dialog, a question or a task. Required: without it the\n * dialog has no accessible name.\n */\n readonly title = input.required<string>();\n\n /**\n * id of the `<h2>` that the container's `aria-labelledby` points at. Taken\n * from `Z_DIALOG_TITLE_ID` when `ZDialog.open()` opened this dialog,\n * otherwise generated, so the layout also works standalone.\n */\n readonly titleId = inject(Z_DIALOG_TITLE_ID, { optional: true }) ?? naechsteId('z-dialog-title');\n\n protected readonly aktionen = contentChild(ZDialogActions);\n\n /** `0` only for a scrolling body that holds nothing focusable; see below. */\n protected readonly rumpfTabIndex = signal<0 | null>(null);\n\n private readonly rumpf = viewChild.required<ElementRef<HTMLElement>>('rumpf');\n /** Takes the blur listener of the body with it on destroy. */\n private readonly abbruch = new AbortController();\n\n private readonly pruefer = inject(InteractivityChecker);\n private readonly dokument = inject(DOCUMENT);\n\n constructor() {\n const zerstoerung = inject(DestroyRef);\n const fenster = this.dokument.defaultView;\n // A dialog longer than the screen scrolls in its body, and what scrolls has\n // to be reachable by keyboard (WCAG 2.1 SC 2.1.1). Controls inside the body\n // are reached by Tab and the browser scrolls them into view, so a form\n // needs nothing. A body that scrolls without holding a single tabbable\n // element does: a confirmation with a long text would otherwise be\n // unreadable without a mouse. Chrome and Firefox give such a scroller a tab\n // stop by themselves, Safari does not, and a second stop on the same\n // element does no harm. It carries `role=\"group\"` with the dialog heading\n // as its name, so it is not an unnamed stop on the way to the actions.\n //\n // Both halves of the question change while the dialog stands: the box with\n // the window (ResizeObserver) and the content with what the caller renders\n // into it (MutationObserver), a log that grows or a field that appears.\n afterNextRender(() => {\n const element = this.rumpf().nativeElement;\n const pruefe = (): void => {\n const scrollt = element.scrollHeight > element.clientHeight;\n // Focus lives on the stop itself while the content shrinks? Then it\n // stays: taking the tabindex away would drop the focus onto <body>,\n // outside the focus trap of the dialog. `blur` asks again.\n const behalten = element === this.dokument.activeElement && this.rumpfTabIndex() === 0;\n this.rumpfTabIndex.set(behalten || (scrollt && !this.hatTabStopp(element)) ? 0 : null);\n };\n // One check per frame, not one per mutation: every check reads\n // scrollHeight and therefore forces a layout. Measured on 3000 appended\n // log lines, one per task: 3000 layouts and 54.9s against 3 layouts and\n // 32ms once they are coalesced.\n let geplant = 0;\n const rahmen = fenster?.requestAnimationFrame?.bind(fenster);\n const plane = (): void => {\n if (!rahmen) {\n pruefe();\n return;\n }\n geplant ||= rahmen(() => {\n geplant = 0;\n pruefe();\n });\n };\n pruefe();\n // ResizeObserver is missing on the server, where no box changes either.\n // It already reports once per frame, so it checks directly.\n const groesse =\n typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(pruefe);\n groesse?.observe(element);\n const inhalt = new MutationObserver(plane);\n inhalt.observe(element, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true,\n attributeFilter: ['class', 'disabled', 'hidden', 'href', 'inert', 'style', 'tabindex'],\n });\n element.addEventListener('blur', plane, { signal: this.abbruch.signal });\n zerstoerung.onDestroy(() => {\n groesse?.disconnect();\n inhalt.disconnect();\n this.abbruch.abort();\n if (geplant) {\n fenster?.cancelAnimationFrame?.(geplant);\n }\n });\n });\n }\n\n /**\n * Does Tab reach anything inside the body? `InteractivityChecker` is what the\n * focus trap of the CDK asks, so the answer is the same one the trap gives:\n * it knows `tabindex=\"-1\"`, `disabled`, `hidden`, `display: none`,\n * `visibility: hidden`, `inert` and a disabled `fieldset` around the control.\n */\n private hatTabStopp(rumpf: HTMLElement): boolean {\n return Array.from(rumpf.querySelectorAll<HTMLElement>(KANDIDATEN)).some(\n (element) =>\n // isTabbable answers for the tabindex, isFocusable for `disabled` and\n // for everything invisible.\n this.pruefer.isTabbable(element) &&\n this.pruefer.isFocusable(element) &&\n !ausserBetrieb(element),\n );\n }\n}\n","import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { ZButton } from '../button';\nimport { ZField, ZInput } from '../field';\nimport { naechsteId, ZDialogActions, ZDialogLayout } from './dialog-layout';\n\n/**\n * Where focus lands after a dialog closes, on top of the CDK default of\n * returning it to the element that was focused before the dialog opened.\n *\n * An `HTMLElement` or an `ElementRef` names the element directly, a `string` is\n * a CSS selector resolved against the document when the dialog closes.\n */\nexport type ZRestoreFocusTarget = HTMLElement | ElementRef<HTMLElement> | string;\n\n/**\n * Texts and behaviour of a confirmation, passed to `ZDialog.confirm()`. Every\n * text comes from the caller, the library holds none.\n */\nexport interface ZConfirmConfig {\n /** Heading of the dialog, phrased as a question or a task. */\n title: string;\n /** The concrete consequences: what is lost, what it costs. */\n body: string;\n /** Label of the confirming button. It repeats the verb from `title`. */\n confirmLabel: string;\n /** Label of the cancelling ghost button. */\n cancelLabel: string;\n /**\n * Renders the confirming button as `danger` instead of `primary`. Use it for\n * deleting, cancelling a contract and removing a payment method.\n *\n * @default false\n */\n danger?: boolean;\n /**\n * Text that has to be typed exactly, usually the name of the object being\n * deleted. It shows up as the placeholder, and the confirming button stays\n * disabled until the input matches character for character. Without it the\n * dialog has no input field.\n */\n requireText?: string;\n /**\n * Label of that input field. Without it the field takes `requireText` as its\n * `aria-label` instead, so it is never unlabelled.\n */\n requireLabel?: string;\n /**\n * Element focus returns to when the dialog closes, whichever way it closes.\n * Without it focus goes back to whatever was focused before the dialog\n * opened, which is the CDK default.\n *\n * Set it when the trigger is gone by then, for example a row that the\n * confirmed action deletes. A dialog opened from a menu item needs nothing:\n * `ZDialog` returns focus to the menu trigger by itself.\n *\n * A template reference on a component host, `<button zBtn #werkzeuge>` for\n * example, yields the component instance and not its element, so read it as\n * an `ElementRef`. Something without `focus()` is dropped with a warning in\n * the development build.\n *\n * @example\n * ```html\n * <div #werkzeuge class=\"z-cluster\">…</div>\n * ```\n * ```ts\n * readonly werkzeuge = viewChild.required('werkzeuge', { read: ElementRef });\n *\n * loeschen(): void {\n * this.dialog\n * .confirm({ …, restoreFocusTo: this.werkzeuge() })\n * .subscribe((ja) => (ja ? this.entferne() : undefined));\n * }\n * ```\n */\n restoreFocusTo?: ZRestoreFocusTarget;\n}\n\n/**\n * The confirmation behind `ZDialog.confirm()`. Built from `z-dialog` with a\n * cancel and a confirm button and, with `requireText`, an input field whose\n * value gates the confirm button.\n *\n * The result is `true` only through the confirming button; cancel, Escape and a\n * click on the backdrop leave the dialog without a result, which\n * `ZDialog.confirm()` maps to `false`.\n *\n * @internal Not part of the documented API. Open it through\n * `ZDialog.confirm()`.\n */\n@Component({\n selector: 'z-confirm-dialog',\n imports: [ZButton, ZDialogActions, ZDialogLayout, ZField, ZInput],\n template: `\n <z-dialog [title]=\"daten.title\">\n <span>{{ daten.body }}</span>\n @if (daten.requireText) {\n <z-field [label]=\"daten.requireLabel ?? ''\" [for]=\"eingabeId\">\n <input\n zInput\n mono\n [id]=\"eingabeId\"\n [placeholder]=\"daten.requireText\"\n [attr.aria-label]=\"daten.requireLabel ? null : daten.requireText\"\n (input)=\"aufEingabe($event)\"\n />\n </z-field>\n }\n <ng-container zDialogActions>\n <button type=\"button\" zBtn=\"ghost\" (click)=\"ref.close(false)\">\n {{ daten.cancelLabel }}\n </button>\n <button\n type=\"button\"\n [zBtn]=\"daten.danger ? 'danger' : 'primary'\"\n [disabled]=\"gesperrt()\"\n (click)=\"ref.close(true)\"\n >\n {{ daten.confirmLabel }}\n </button>\n </ng-container>\n </z-dialog>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZConfirmDialog {\n protected readonly daten = inject<ZConfirmConfig>(DIALOG_DATA);\n protected readonly ref = inject<DialogRef<boolean>>(DialogRef);\n protected readonly eingabeId = naechsteId('z-confirm-input');\n\n private readonly eingabe = signal('');\n\n /** Confirming stays disabled until the input matches exactly. */\n protected readonly gesperrt = computed(\n () => !!this.daten.requireText && this.eingabe() !== this.daten.requireText,\n );\n\n protected aufEingabe(ereignis: Event): void {\n this.eingabe.set((ereignis.target as HTMLInputElement).value);\n }\n}\n","import { Dialog, DialogConfig, DialogRef } from '@angular/cdk/dialog';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { DOCUMENT, ElementRef, inject, Service } from '@angular/core';\nimport { map, Observable } from 'rxjs';\nimport { ZConfirmConfig, ZConfirmDialog, ZRestoreFocusTarget } from './confirm-dialog';\nimport { naechsteId, Z_DIALOG_TITLE_ID } from './dialog-layout';\n\n/**\n * Options of `@angular/cdk/dialog` plus {@link ZDialogConfig.restoreFocusTo}.\n */\nexport type ZDialogConfig<D, R> = DialogConfig<D, R> & {\n /**\n * Element focus returns to when the dialog closes, mapped onto the CDK's\n * `restoreFocus`. Without it focus goes back to whatever was focused before\n * the dialog opened, which is the CDK default. Set it when the trigger is\n * gone by then. A dialog opened from a menu item needs nothing: the service\n * finds the menu trigger by itself.\n *\n * A template reference on a component host, `<button zBtn #trigger>` for\n * example, yields the component instance: read it as an `ElementRef`\n * (`viewChild('trigger', { read: ElementRef })`), otherwise there is nothing\n * to focus. Something without `focus()` is dropped with a warning in the\n * development build, and focus returns the way it would have without it.\n */\n restoreFocusTo?: ZRestoreFocusTarget;\n};\n\ndeclare const ngDevMode: boolean | undefined;\n\n/** The warning about an unusable `restoreFocusTo` is worth saying once. */\nlet gewarnt = false;\n\n/** Caller classes as a list, so the library's own ones keep coming first. */\nfunction alsListe(klassen: string | string[] | undefined): string[] {\n if (!klassen) {\n return [];\n }\n return Array.isArray(klassen) ? klassen : [klassen];\n}\n\n/**\n * `restoreFocusTo` as the `boolean | string | HTMLElement` the CDK takes.\n *\n * Anything that cannot take the focus is dropped, and the CDK default applies\n * instead. The usual way to get here is `viewChild('trigger')` on a component\n * host such as `<button zBtn #trigger>`: that yields the `ZButton` instance,\n * not its element, and the CDK would silently focus nothing at all.\n */\nfunction fokusZiel(ziel: ZRestoreFocusTarget | undefined): HTMLElement | string | undefined {\n const element = ziel instanceof ElementRef ? ziel.nativeElement : ziel;\n if (element === undefined || typeof element === 'string') {\n return element;\n }\n if (typeof element.focus === 'function') {\n return element;\n }\n if (!gewarnt && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n gewarnt = true;\n console.warn(\n 'zenit-ui: restoreFocusTo takes an element, an ElementRef or a CSS selector, and got ' +\n 'something without focus(). A template reference on a component host needs ' +\n \"viewChild('trigger', { read: ElementRef }). Focus returns to where it was instead.\",\n );\n }\n return undefined;\n}\n\n/**\n * The trigger of the menu the focus stands in, or `undefined` when it stands\n * anywhere else.\n *\n * A dialog opened from a menu item would otherwise return focus to that item:\n * the CDK closes the menu with the click, so the item is gone by the time the\n * dialog closes and focus falls to the body. `CdkMenuTrigger` carries the id of\n * its menu as `aria-controls`, which leads from the open menu back to the\n * button that opened it.\n */\nfunction menueAusloeser(dokument: Document): HTMLElement | undefined {\n const menue = (dokument.activeElement as HTMLElement | null)?.closest('.cdk-menu[id]');\n return menue\n ? (dokument.querySelector<HTMLElement>(`[aria-controls=\"${menue.id}\"]`) ?? undefined)\n : undefined;\n}\n\n/**\n * Thin wrapper around `Dialog` from `@angular/cdk/dialog`, provided in root.\n *\n * The focus trap, Escape, the backdrop and returning focus to the trigger come\n * from the CDK. This service only adds the fixed classes `z-dialog-panel` and\n * `z-backdrop`, sets `aria-modal`, links the heading of `z-dialog` to the\n * container through `aria-labelledby`, and offers `restoreFocusTo` for the case\n * where the trigger is gone by the time the dialog closes. Focus lands on the\n * first tabbable element when the dialog opens, which is the first field or\n * otherwise the cancel button.\n *\n * One case is taken care of without `restoreFocusTo`: a dialog opened from a\n * menu item. The CDK closes the menu with the click, so the item no longer\n * exists when the dialog closes and focus would fall to the body; the service\n * therefore returns it to the menu trigger.\n *\n * Use a dialog for a decision that cannot be undone or for a short form, not\n * for \"stop\" or \"restart\".\n *\n * @example\n * ```ts\n * private readonly dialog = inject(ZDialog);\n *\n * loeschen(name: string): void {\n * this.dialog\n * .confirm({\n * title: `Server \"${name}\" löschen?`,\n * body: 'Alle Welten und Backups gehen verloren. Das lässt sich nicht rückgängig machen.',\n * confirmLabel: 'Löschen',\n * cancelLabel: 'Abbrechen',\n * danger: true,\n * requireText: name,\n * })\n * .subscribe((bestaetigt) => {\n * if (bestaetigt) {\n * this.entferne(name);\n * }\n * });\n * }\n * ```\n */\n@Service()\nexport class ZDialog {\n private readonly cdk = inject(Dialog);\n private readonly dokument = inject(DOCUMENT);\n\n /**\n * Opens a component of your own, as a rule one whose root element is\n * `<z-dialog title=\"…\">`.\n *\n * Generates the id of the heading, provides it under `Z_DIALOG_TITLE_ID` and\n * puts the same id on the container as `aria-labelledby` unless the config\n * already names one. Own `panelClass` and `backdropClass` entries are\n * appended after the library's, all other options of the CDK stay untouched.\n *\n * @typeParam R Result type the dialog closes with.\n * @typeParam D Type of `config.data` handed to the component via\n * `DIALOG_DATA`.\n * @typeParam C Type of the component.\n * @param component The component to render inside the dialog.\n * @param config Options of `@angular/cdk/dialog`, for example `data`, `width`\n * or `disableClose`, plus `restoreFocusTo`.\n * @returns The `DialogRef` of the CDK. Its `closed` observable emits the\n * result once and then completes, `undefined` when the dialog was dismissed\n * by Escape or by a click on the backdrop.\n *\n * @example\n * ```ts\n * import { ChangeDetectionStrategy, Component, ElementRef, inject, viewChild } from '@angular/core';\n * import { ZButton, ZDialog } from 'zenit-ui';\n * import { NotizDialog } from './notiz-dialog';\n *\n * @Component({\n * selector: 'app-serverzeile',\n * imports: [ZButton],\n * template: `\n * <div #werkzeuge class=\"z-cluster\">\n * <button zBtn=\"secondary\" type=\"button\">Hochladen</button>\n * </div>\n * <button zBtn=\"ghost\" type=\"button\" (click)=\"notiz()\">Notiz bearbeiten</button>\n * `,\n * changeDetection: ChangeDetectionStrategy.OnPush,\n * })\n * export class Serverzeile {\n * private readonly dialog = inject(ZDialog);\n *\n * // `read: ElementRef` is the point: on `<button zBtn #werkzeuge>` the\n * // reference would otherwise yield the ZButton instance, which has no\n * // focus(), and the focus would silently land on <body>.\n * private readonly werkzeuge = viewChild.required('werkzeuge', { read: ElementRef });\n *\n * // The row that carried the trigger is gone once the dialog confirms the\n * // deletion, so focus goes to the toolbar above the list instead.\n * protected notiz(): void {\n * this.dialog.open(NotizDialog, { restoreFocusTo: this.werkzeuge() });\n * }\n * }\n * ```\n */\n open<R = unknown, D = unknown, C = unknown>(\n component: ComponentType<C>,\n config?: ZDialogConfig<D, DialogRef<R, C>>,\n ): DialogRef<R, C> {\n const titelId = naechsteId('z-dialog-title');\n const titelProvider = { provide: Z_DIALOG_TITLE_ID, useValue: titelId };\n const fremde = config?.providers;\n // Without a target of its own, a dialog opened from a menu item goes back\n // to the menu trigger, because the item itself is gone by then.\n const ziel = fokusZiel(config?.restoreFocusTo) ?? menueAusloeser(this.dokument);\n return this.cdk.open<R, D, C>(component, {\n // autoFocus 'first-tabbable' (first field, otherwise \"Abbrechen\"),\n // restoreFocus and Escape are the defaults of the CDK.\n ...config,\n // Only when given, so an absent restoreFocusTo keeps the CDK default.\n ...(ziel === undefined ? {} : { restoreFocus: ziel }),\n panelClass: ['z-dialog-panel', ...alsListe(config?.panelClass)],\n backdropClass: ['z-backdrop', ...alsListe(config?.backdropClass)],\n ariaModal: true,\n ariaLabelledBy: config?.ariaLabelledBy ?? titelId,\n providers:\n typeof fremde === 'function'\n ? (ref, cfg, container) => [titelProvider, ...fremde(ref, cfg, container)]\n : [titelProvider, ...(fremde ?? [])],\n });\n }\n\n /**\n * Confirmation with two buttons, built from {@link ZConfirmConfig}. With\n * `requireText` the confirming button stays disabled until that text is typed\n * exactly.\n *\n * The dialog opens as soon as this method is called, not on subscribe.\n * `restoreFocusTo` of the config names where focus lands afterwards.\n *\n * @param config Texts and behaviour of the confirmation.\n * @returns An `Observable<boolean>` that emits exactly once and then\n * completes: `true` only through the confirming button, `false` through\n * \"Abbrechen\", Escape and a click on the backdrop.\n */\n confirm(config: ZConfirmConfig): Observable<boolean> {\n return this.open<boolean, ZConfirmConfig, ZConfirmDialog>(ZConfirmDialog, {\n data: config,\n restoreFocusTo: config.restoreFocusTo,\n }).closed.pipe(map((ergebnis) => ergebnis === true));\n }\n}\n","import { CdkMenu, CdkMenuItem } from '@angular/cdk/menu';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n DOCUMENT,\n ElementRef,\n inject,\n Injector,\n input,\n} from '@angular/core';\nimport { ZIcon } from '../icon';\n\n/**\n * Surface of the menu, which collects the rarer actions of an object behind a\n * button. Three to seven entries; destructive ones sit at the bottom behind a\n * separator.\n *\n * Renders the class `z-menu` on the host and only the projected content.\n * Keyboard handling, roles and closing come from `CdkMenu` in\n * `@angular/cdk/menu`, which runs as a host directive: arrow keys move through\n * the entries, a click outside and Escape close the menu. The surface is\n * `surface-raised` with `shadow-overlay` and no scrim. The menu is opened from\n * a button carrying `[cdkMenuTriggerFor]`.\n *\n * A scroll of a container the trigger sits in closes the menu, the way a menu\n * of the operating system goes: the page as well as an inner container such as\n * the body of a scrolling dialog. Another scroller on the same screen leaves\n * the menu alone, and so does the scroll that was still running when the menu\n * opened. Focus returns to the trigger only when it was inside the menu, so\n * scrolling with the pointer does not pull it away from whatever the visitor\n * was typing in.\n *\n * @example\n * ```html\n * <button zBtn=\"ghost\" iconOnly aria-label=\"Mehr\" [cdkMenuTriggerFor]=\"mehr\">\n * <z-icon name=\"more_vert\" />\n * </button>\n * <ng-template #mehr>\n * <z-menu>\n * <button zMenuItem icon=\"content_copy\" (triggered)=\"kopiere()\">Adresse kopieren</button>\n * <z-menu-separator />\n * <button zMenuItem icon=\"delete\" danger (triggered)=\"loesche()\">Server löschen</button>\n * </z-menu>\n * </ng-template>\n * ```\n */\n@Component({\n selector: 'z-menu',\n template: `<ng-content />`,\n host: { class: 'z-menu' },\n hostDirectives: [CdkMenu],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZMenu {\n constructor() {\n const menue = inject(CdkMenu);\n const wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const dokument = inject(DOCUMENT);\n // The component only exists while the menu hangs in its overlay, so the\n // listener does too. It sits on the document in the CAPTURE phase, because\n // a scroll event on an inner element does not bubble: the scroll strategy\n // of the CDK builds on `ScrollDispatcher`, which only ever hears the window\n // and the containers a caller marked `cdkScrollable`. A menu in the body of\n // a dialog therefore used to stand still while its trigger moved away.\n const abbruch = new AbortController();\n const signal = abbruch.signal;\n const fenster = dokument.defaultView;\n\n // The scroll that was still running when the menu opened must not close it\n // again: a trigger reached with the keyboard is scrolled into view, and\n // those events only arrive afterwards, a smooth scroll for a whole second.\n // Closing is therefore armed once that scrolling has come to rest: at the\n // `scrollend` of the browser, or after two animation frames without a\n // scroll event, whichever comes first.\n const schliesse = (): void =>\n menue.menuStack.closeAll({ focusParentTrigger: wirt.contains(dokument.activeElement) });\n\n /** The trigger, which points at this menu through `aria-controls`. */\n const ausloeserSuchen = (): HTMLElement | null =>\n wirt.id ? dokument.querySelector<HTMLElement>(`[aria-controls=\"${wirt.id}\"]`) : null;\n\n let scharf = !fenster;\n let stille = 0;\n /** Where the trigger stood when the menu was hung on it. */\n let verankert: DOMRect | undefined;\n /** Has the trigger moved since, while the menu could not follow? */\n let verschoben = false;\n const armiere = (): void => {\n if (scharf) {\n return;\n }\n scharf = true;\n // The menu was hung on a trigger that was still moving, and the CDK locks\n // the position of an open menu: it now points where the trigger no longer\n // is, so it goes instead of standing around detached.\n if (verschoben) {\n schliesse();\n }\n };\n const beobachte = (): void => {\n if (scharf || signal.aborted) {\n return;\n }\n stille += 1;\n if (stille >= 2) {\n armiere();\n return;\n }\n fenster?.requestAnimationFrame(beobachte);\n };\n fenster?.requestAnimationFrame(beobachte);\n dokument.addEventListener('scrollend', armiere, { capture: true, signal });\n // The box of the trigger as the menu opened, read once the binding of\n // `aria-controls` has been rendered.\n afterNextRender(() => (verankert ??= ausloeserSuchen()?.getBoundingClientRect()), {\n injector: inject(Injector),\n });\n\n dokument.addEventListener(\n 'scroll',\n (ereignis) => {\n const ziel = ereignis.target as Node | null;\n // Only a scroller the trigger sits in takes the menu away from it.\n // `document` contains it too, which is how a scroll of the page\n // arrives; the menu itself and any other scroller of the screen, a\n // console following its own log for example, leave the trigger where it\n // is. Right after opening, the trigger carries no `aria-controls` yet;\n // until it does, every scroll counts, the way it did before.\n const ausloeser = ausloeserSuchen();\n if (!ziel || (ausloeser && !ziel.contains(ausloeser))) {\n return;\n }\n // A scroll that leaves the trigger where it is means nothing: a trigger\n // in a sticky or fixed header keeps its menu while the page moves, the\n // same rule the tooltip follows.\n const kasten = ausloeser?.getBoundingClientRect();\n if (kasten && verankert && unbewegt(verankert, kasten)) {\n return;\n }\n if (kasten) {\n verschoben = verschoben || verankert !== undefined;\n verankert = kasten;\n }\n if (!scharf) {\n stille = 0;\n return;\n }\n schliesse();\n },\n { capture: true, passive: true, signal },\n );\n\n // Escape closes the menu, and only the menu. `CdkMenu` listens on this same\n // host, so it still sees the key; stopping the event here keeps it from\n // reaching the keyboard dispatcher of the CDK on `document.body`, which\n // would close the dialog behind the menu with the same press. In the BUBBLE\n // phase, so the handler of the CDK comes first.\n wirt.addEventListener(\n 'keydown',\n (ereignis) => {\n if (ereignis.key === 'Escape') {\n ereignis.stopPropagation();\n }\n },\n { signal },\n );\n\n // A locked link entry must not navigate. `CdkMenuItem` does call\n // preventDefault() and stopPropagation() on the click, but `RouterLink`\n // listens on the same element and navigates regardless of\n // `defaultPrevented`, so the click is caught here in the CAPTURE phase of\n // the menu, before any listener on the entry. A click with a modifier is\n // the browser's: it opens the link in a new tab or downloads it, and the\n // menu stays where it is, exactly as a middle click already does.\n const aufKlick = (ereignis: MouseEvent): void => {\n const ziel = (ereignis.target as HTMLElement | null)?.closest('a.z-menu__item');\n if (!ziel) {\n return;\n }\n if (ziel.getAttribute('aria-disabled') === 'true') {\n ereignis.preventDefault();\n ereignis.stopPropagation();\n } else if (mitZusatztaste(ereignis)) {\n ereignis.stopPropagation();\n }\n };\n // `auxclick` is the middle click, which opens a link in a new tab: the same\n // rules apply, a locked entry leads nowhere there either.\n for (const art of ['click', 'auxclick'] as const) {\n wirt.addEventListener(art, aufKlick, { capture: true, signal });\n }\n\n // Space activates an entry (ARIA menu pattern), but the browser clicks only\n // buttons: on a link `CdkMenuItem` would close the menu without anything\n // ever navigating. This listener hangs on the menu in the CAPTURE phase, so\n // it comes before the keydown handler on the entry, and turns the key into\n // the click that `href` and `routerLink` both listen for. Enter needs\n // nothing: the browser clicks a link by itself.\n wirt.addEventListener(\n 'keydown',\n (ereignis) => {\n const ziel = (ereignis.target as HTMLElement | null)?.closest('a.z-menu__item');\n if (ereignis.key !== ' ' || !ziel || mitZusatztaste(ereignis)) {\n return;\n }\n ereignis.preventDefault();\n ereignis.stopPropagation();\n (ziel as HTMLElement).click();\n },\n { capture: true, signal },\n );\n\n inject(DestroyRef).onDestroy(() => abbruch.abort());\n }\n}\n\n/**\n * One entry of the menu, an icon plus a verb and its object (\"Adresse\n * kopieren\"). Sits on a `<button>` through the attribute `zMenuItem`, or on an\n * `<a>` when the entry leads somewhere instead of doing something.\n *\n * Renders the class `z-menu__item` on the host, plus `z-menu__item--danger`\n * while {@link danger} is set, and inside it the optional `z-icon` followed by\n * the projected text.\n *\n * A link entry keeps its `href` or `routerLink`: the library has no router and\n * touches neither. Enter and a plain click follow the link and close the menu,\n * Space does the same because `z-menu` turns it into a click. A click with\n * Ctrl, Cmd, Shift or Alt and a middle click belong to the browser: it opens a\n * new tab or downloads the target, and the menu stays open. `disabled` renders\n * `aria-disabled=\"true\"`, and `z-menu` swallows the click before `RouterLink`\n * or the `href` can act on it, so the entry leads nowhere while it is locked,\n * the same way `a[zBtn]` is.\n *\n * Accessibility: role, focus and the `disabled` input come from `CdkMenuItem`\n * as a host directive, which also provides the `(triggered)` output. The CDK\n * typeahead label is set to the text without the icon ligature, once after the\n * first render and from then on whenever a `MutationObserver` reports a change\n * in the entry, because the raw `textContent` would otherwise start with the\n * ligature (\"content_copyAdresse kopieren\") and typing the first letter would\n * not find the entry.\n *\n * @example\n * ```html\n * <button zMenuItem icon=\"content_copy\" (triggered)=\"kopiere()\">Adresse kopieren</button>\n * <a zMenuItem icon=\"dns\" routerLink=\"/user/server/1\">Server öffnen</a>\n * <button zMenuItem icon=\"delete\" danger [disabled]=\"laeuft()\" (triggered)=\"loesche()\">\n * Server löschen\n * </button>\n * ```\n */\n@Component({\n // An entry does something (button) or leads somewhere (link); both carry the\n // attribute of the API table.\n selector: 'button[zMenuItem], a[zMenuItem]',\n imports: [ZIcon],\n template: `@if (icon()) {\n <z-icon [name]=\"icon()\" />\n }\n <ng-content />`,\n host: {\n class: 'z-menu__item',\n '[class.z-menu__item--danger]': `danger()`,\n },\n hostDirectives: [\n {\n directive: CdkMenuItem,\n inputs: ['cdkMenuItemDisabled: disabled'],\n outputs: ['cdkMenuItemTriggered: triggered'],\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZMenuItem {\n /**\n * Name of the Material Icon in front of the text. Empty renders no icon.\n *\n * @default ''\n */\n readonly icon = input('');\n\n /**\n * Marks the entry as destructive, which colours it and belongs below a\n * `z-menu-separator`. A destructive entry always opens a dialog. Boolean\n * attribute.\n *\n * @default false\n */\n readonly danger = input(false, { transform: booleanAttribute });\n\n constructor() {\n const eintrag = inject(CdkMenuItem);\n const wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const zerstoerung = inject(DestroyRef);\n // Without this the CDK typeahead takes textContent, which starts with the\n // ligature of the icon (\"content_copyAdresse kopieren\"). The text can\n // change at any time, but only through the DOM, so a MutationObserver\n // carries the change instead of a callback that reads the entry again after\n // every render of the application.\n afterNextRender(() => {\n const lies = (): void => {\n eintrag.typeaheadLabel = beschriftung(wirt);\n };\n lies();\n const beobachter = new MutationObserver(lies);\n beobachter.observe(wirt, { characterData: true, childList: true, subtree: true });\n zerstoerung.onDestroy(() => beobachter.disconnect());\n });\n }\n}\n\n/** Two boxes at the same place on the screen: nothing moved the trigger. */\nfunction unbewegt(a: DOMRect, b: DOMRect): boolean {\n return a.top === b.top && a.left === b.left && a.width === b.width && a.height === b.height;\n}\n\n/**\n * A key or a click with a modifier belongs to the browser: Ctrl+Space, and\n * Ctrl+click which opens a new tab, are not an activation of the entry.\n */\nfunction mitZusatztaste(ereignis: KeyboardEvent | MouseEvent): boolean {\n return ereignis.altKey || ereignis.ctrlKey || ereignis.metaKey || ereignis.shiftKey;\n}\n\n/**\n * Text of the entry without the ligature of the icon. Comment nodes are left\n * out, because Angular puts its anchors there and `textContent` would deliver\n * their content along with it (\"container\").\n */\nfunction beschriftung(wirt: HTMLElement): string {\n return Array.from(wirt.childNodes)\n .filter(\n (knoten) =>\n knoten.nodeType !== Node.COMMENT_NODE && (knoten as Element).localName !== 'z-icon',\n )\n .map((knoten) => knoten.textContent ?? '')\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Separator in front of the destructive entries. Renders an empty host with\n * the class `z-menu__sep` and `role=\"separator\"`, so it is announced as a\n * divider and never receives focus.\n *\n * @example\n * ```html\n * <z-menu-separator />\n * ```\n */\n@Component({\n selector: 'z-menu-separator',\n template: ``,\n host: {\n class: 'z-menu__sep',\n role: 'separator',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZMenuSeparator {}\n\n/**\n * All menu building blocks at once, for the `imports` of a component: the\n * design system names this constant as the way in (\"Import über `Z_MENU`\"), so\n * it stays the documented entry point next to the three classes. The trigger\n * `CdkMenuTrigger` is not part of it and comes from `@angular/cdk/menu`.\n *\n * @example\n * ```ts\n * imports: [Z_MENU, CdkMenuTrigger];\n * ```\n */\nexport const Z_MENU = [ZMenu, ZMenuItem, ZMenuSeparator] as const;\n","/* Package overlays: Dialog and Menu. */\nexport * from '../dialog';\nexport * from '../menu';\n","import {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ZButton } from '../button';\nimport { injectZLabels } from '../labels';\n\n/**\n * Severity of a log line. `warn` is coloured `warning`, `error` is `danger`,\n * `cmd` marks a command the user sent and is coloured `text`; everything else\n * stays `text-muted`.\n */\nexport type ZConsoleLevel = 'info' | 'warn' | 'error' | 'cmd';\n\n/** One log line. */\nexport interface ZConsoleLine {\n /** Timestamp, already formatted by the caller, for example `12:07:15`. */\n time: string;\n /** The message itself. Long lines wrap, the console never scrolls sideways. */\n text: string;\n /**\n * Severity of the line. Without it the line renders in the neutral `info`\n * style.\n *\n * @default 'info'\n */\n level?: ZConsoleLevel;\n}\n\n/**\n * Live log of a server with a command line underneath.\n *\n * Renders `<pre class=\"z-console__log\">` with one `<span>` per line (timestamp\n * in `.z-log__time`, the level as `z-log--warn`, `z-log--error` or\n * `z-log--cmd`), the \"Zum Ende\" button while the log is scrolled up, and a\n * `<label class=\"z-console__input\">` holding the input. The host carries\n * `z-console`. With an empty {@link lines} the log shows the projected content\n * instead, which is where the empty state belongs.\n *\n * The log follows new lines as long as the view sits at the bottom, with four\n * pixels of slack. Scroll up and it stays put and the button appears; pressing\n * it scrolls back down and moves focus into the input.\n *\n * Accessibility: the `<pre>` is a `role=\"log\"` tab stop with an `aria-label`, so\n * the log can be scrolled by keyboard; the input is labelled by\n * {@link inputLabel}. `role=\"log\"` implies a polite live region, which\n * {@link announce} turns off by default, see there. Enter emits\n * {@link command}, Arrow Up and Arrow Down walk the commands of this session and\n * suppress the browser's caret movement.\n *\n * @example\n * ```html\n * <z-console [lines]=\"zeilen()\" placeholder=\"Befehl eingeben, Enter sendet\" (command)=\"sende($event)\">\n * Das Log ist leer. Neue Ausgaben erscheinen hier.\n * </z-console>\n * ```\n */\n@Component({\n selector: 'z-console',\n imports: [ZButton],\n template: `<pre\n #log\n class=\"z-console__log\"\n tabindex=\"0\"\n role=\"log\"\n [attr.aria-live]=\"announce() ? 'polite' : 'off'\"\n [attr.aria-label]=\"logText()\"\n (scroll)=\"aufScroll()\"\n >@for (zeile of lines(); track $index; let letzte = $last) {<span\n [class.z-log--warn]=\"zeile.level === 'warn'\"\n [class.z-log--error]=\"zeile.level === 'error'\"\n [class.z-log--cmd]=\"zeile.level === 'cmd'\"\n ><span class=\"z-log__time\">{{ zeile.time }}</span> {{ zeile.text\n }}{{ letzte ? '' : umbruch }}</span>} @empty {<ng-content />}</pre>\n @if (!amEnde()) {\n <div class=\"z-console__end\">\n <button type=\"button\" zBtn=\"secondary\" size=\"sm\" (click)=\"zumEnde()\">\n {{ endeText() }}\n </button>\n </div>\n }\n <label class=\"z-console__input\"\n ><span aria-hidden=\"true\">&gt;</span\n ><input\n #feld\n [attr.aria-label]=\"feldText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n (keydown.enter)=\"senden()\"\n (keydown.arrowup)=\"verlauf($event, -1)\"\n (keydown.arrowdown)=\"verlauf($event, 1)\"\n /></label>`,\n host: { class: 'z-console' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZConsole {\n /**\n * The log lines in display order, oldest first. The component keeps no\n * buffer: the caller owns the list and caps its length.\n *\n * @default []\n */\n readonly lines = input<ZConsoleLine[]>([]);\n\n /**\n * Disables the input, for instance while the server is stopped. The log stays\n * readable and scrollable.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Placeholder of the input. A placeholder is not a label, the accessible name\n * comes from {@link inputLabel}.\n *\n * @default ''\n */\n readonly placeholder = input('');\n\n /**\n * Lets a screen reader read out every new log line as it arrives, by\n * switching the `aria-live` of the log from `off` to `polite`.\n *\n * Off by default, deliberately: a game server writes several lines per\n * second, and the polite live region that `role=\"log\"` implies would turn\n * each of them into an announcement and bury everything else on the page. The\n * log stays a `role=\"log\"` tab stop with an accessible name, so it can be read\n * on demand at any time. Switch this on only for a console that stays quiet,\n * for example a step-by-step installer. Boolean attribute.\n *\n * @default false\n */\n readonly announce = input(false, { transform: booleanAttribute });\n\n /**\n * `aria-label` of the log region. Unset, the component uses\n * {@link ZLabels.consoleLog} from the label registry.\n *\n * @default undefined\n */\n readonly logLabel = input<string>();\n\n /**\n * `aria-label` of the input. Unset, the component uses\n * {@link ZLabels.consoleInput} from the label registry.\n *\n * @default undefined\n */\n readonly inputLabel = input<string>();\n\n /**\n * Caption of the button that jumps back to the end of the log. Unset, the\n * component uses {@link ZLabels.consoleJumpToEnd} from the label registry.\n *\n * @default undefined\n */\n readonly endLabel = input<string>();\n\n private readonly labels = injectZLabels();\n\n protected readonly logText = computed(() => this.logLabel() ?? this.labels.consoleLog);\n protected readonly feldText = computed(() => this.inputLabel() ?? this.labels.consoleInput);\n protected readonly endeText = computed(() => this.endLabel() ?? this.labels.consoleJumpToEnd);\n\n /**\n * Emits the entered command on Enter, trimmed and never empty. The input is\n * cleared right away; echoing the command as a `cmd` line is the caller's\n * job, as is everything the command does.\n */\n // (command) is what the API table calls for. Since the Commands proposal\n // there is a DOM event of the same name, which the rule reports.\n // eslint-disable-next-line @angular-eslint/no-output-native\n readonly command = output<string>();\n\n protected readonly umbruch = '\\n';\n protected readonly amEnde = signal(true);\n\n private readonly logEl = viewChild.required<ElementRef<HTMLElement>>('log');\n private readonly feldEl = viewChild.required<ElementRef<HTMLInputElement>>('feld');\n\n /** Commands of this session, `zeiger` points at the entry currently recalled. */\n private readonly bisher: string[] = [];\n private zeiger = 0;\n\n constructor() {\n // Angular's docs forbid reading layout in the write phase, so the height\n // of the log is measured in earlyRead and only written afterwards.\n afterRenderEffect({\n earlyRead: () => {\n this.lines();\n return this.amEnde() ? this.logEl().nativeElement.scrollHeight : undefined;\n },\n write: (hoehe) => {\n const ziel = hoehe();\n if (ziel !== undefined) {\n this.logEl().nativeElement.scrollTop = ziel;\n }\n },\n });\n }\n\n /** Four pixels of slack, because zoom and subpixels never hit the bottom exactly. */\n protected aufScroll(): void {\n const el = this.logEl().nativeElement;\n this.amEnde.set(el.scrollHeight - el.scrollTop - el.clientHeight <= 4);\n }\n\n protected zumEnde(): void {\n const el = this.logEl().nativeElement;\n el.scrollTop = el.scrollHeight;\n this.amEnde.set(true);\n this.feldEl().nativeElement.focus();\n }\n\n protected senden(): void {\n const el = this.feldEl().nativeElement;\n const text = el.value.trim();\n if (!text) {\n return;\n }\n this.bisher.push(text);\n this.zeiger = this.bisher.length;\n el.value = '';\n this.command.emit(text);\n }\n\n /** `richtung` is -1 for Arrow Up and 1 for Arrow Down. */\n protected verlauf(ereignis: Event, richtung: number): void {\n if (!this.bisher.length) {\n return;\n }\n ereignis.preventDefault();\n this.zeiger = Math.min(Math.max(this.zeiger + richtung, 0), this.bisher.length);\n this.feldEl().nativeElement.value = this.bisher[this.zeiger] ?? '';\n }\n}\n","import { ChangeDetectionStrategy, Component, Directive, input } from '@angular/core';\n\n/**\n * Marks the at most two buttons of the hero, one `primary` in size `lg` and\n * optionally one `secondary`. Adds the class `z-hero__actions` and renders\n * nothing itself. `z-hero` places it between the lead and the note.\n *\n * @example\n * ```html\n * <div zHeroActions>\n * <button zBtn=\"primary\" size=\"lg\">Server erstellen</button>\n * <button zBtn=\"secondary\" size=\"lg\">Preis berechnen</button>\n * </div>\n * ```\n */\n@Directive({\n selector: '[zHeroActions]',\n host: { class: 'z-hero__actions' },\n})\nexport class ZHeroActions {}\n\n/**\n * Marks the right-hand column of the hero: a price list, the configurator or a\n * screenshot of the panel, never an illustration. Pure slot marker, it adds no\n * class and no markup. Sub-pages often leave it out, and a hero without this\n * slot is one column at every width instead of keeping an empty right column.\n *\n * @example\n * ```html\n * <z-panel zHeroAside title=\"Günstigste Spiele\" flush>…</z-panel>\n * ```\n */\n@Directive({ selector: '[zHeroAside]' })\nexport class ZHeroAside {}\n\n/**\n * Head of a public page: one statement, one sentence, at most two buttons and a\n * real piece of the product on the right.\n *\n * Renders the left column as `<h1 class=\"z-hero__title\">`, the optional\n * `<p class=\"z-hero__lead\">`, the `[zHeroActions]` slot and the optional\n * `<p class=\"z-hero__note\">`, followed by the `[zHeroAside]` slot as the right\n * column. The host carries `z-hero` and its native `title` attribute is\n * cleared, so the {@link title} input never becomes a browser tooltip.\n *\n * Two columns in a 7 to 5 ratio, single column below 900px and single column at\n * every width while no `[zHeroAside]` is projected, which is the usual shape of\n * a sub-page. The lead keeps its own 52ch measure either way. The size of the\n * heading lives in `z-hero__title` and drops from `display-xl` to `display-lg`\n * below 640px, whatever {@link headingLevel} says. {@link size} picks that\n * smaller step for the whole width. On a public page the heading is the `<h1>`,\n * so there is exactly one hero per page.\n *\n * @example\n * ```html\n * <z-hero\n * title=\"Gameserver aus Nürnberg. In etwa 60 Sekunden online.\"\n * lead=\"Spiel wählen, RAM einstellen, starten. Ab 1,98&nbsp;€ im Monat, monatlich kündbar.\"\n * note=\"Keine Kreditkarte nötig · DDoS-Schutz inklusive\"\n * >\n * <div zHeroActions>\n * <button zBtn=\"primary\" size=\"lg\">Server erstellen</button>\n * </div>\n * <z-panel zHeroAside title=\"Günstigste Spiele\" flush>…</z-panel>\n * </z-hero>\n * ```\n */\n@Component({\n selector: 'z-hero',\n template: `\n <div>\n @switch (headingLevel()) {\n @case (2) {\n <h2 class=\"z-hero__title\">{{ title() }}</h2>\n }\n @case (3) {\n <h3 class=\"z-hero__title\">{{ title() }}</h3>\n }\n @default {\n <h1 class=\"z-hero__title\">{{ title() }}</h1>\n }\n }\n @if (lead()) {\n <p class=\"z-hero__lead\">{{ lead() }}</p>\n }\n <ng-content select=\"[zHeroActions]\" />\n @if (note()) {\n <p class=\"z-hero__note\">{{ note() }}</p>\n }\n </div>\n <ng-content select=\"[zHeroAside]\" />\n `,\n host: {\n class: 'z-hero',\n '[class.z-hero--lg]': `size() === 'lg'`,\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZHero {\n /**\n * The heading of the page: what there is and where it comes from. One colour\n * throughout, the second line is never tinted.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Tag of the heading: `1`, `2` or `3`. The design system prescribes `1` for\n * public pages, where the hero is the page heading. Lower it only where the\n * page already owns its `<h1>`, for example on a component page that shows a\n * hero as an example. The visual size never changes with it.\n *\n * @default 1\n */\n readonly headingLevel = input<1 | 2 | 3, 1 | 2 | 3 | '1' | '2' | '3'>(1, {\n transform: (wert) => Number(wert) as 1 | 2 | 3,\n });\n\n /**\n * Type size of the heading, independent of {@link headingLevel}: `'xl'` is\n * `display-xl` (56px), `'lg'` is `display-lg` (40px). The design system keeps\n * `'xl'` for the start page and for `/minecraft` and gives every sub-page\n * `'lg'`. `'lg'` adds `z-hero--lg` on the host, which is the only difference\n * in the rendered markup; below 640px both sizes read as `display-lg`, so\n * `'lg'` stays where it is.\n *\n * @default 'xl'\n */\n readonly size = input<'xl' | 'lg'>('xl');\n\n /**\n * One sentence with the three strongest facts (process, hardware, price).\n * Empty leaves the paragraph out.\n *\n * @default ''\n */\n readonly lead = input('');\n\n /**\n * One line with at most three promises, separated by middle dots. Empty\n * leaves the line out.\n *\n * @default ''\n */\n readonly note = input('');\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n HostAttributeToken,\n inject,\n input,\n linkedSignal,\n output,\n} from '@angular/core';\n\n/**\n * Content of a game tile, shared by {@link ZGameTile} and {@link ZGameTileLink}:\n * the cover area with image or text fallback, then title and price.\n */\nconst KACHEL = `<span class=\"z-game__cover\" aria-hidden=\"true\">\n @if (cover() && !coverFailed()) {\n <img [src]=\"cover()\" alt=\"\" (error)=\"coverFehlt()\" />\n } @else {\n <span class=\"z-game__fallback\">{{ title() }}</span>\n }\n </span>\n <span class=\"z-game__title\">{{ title() }}</span>\n <span class=\"z-game__price\">{{ price() }}</span>`;\n\n/**\n * Grid of the game tiles: `auto-fill` from 128px width, so the number of\n * columns follows the available space.\n *\n * Renders the class `z-games` on the host and only the projected tiles. From\n * about 15 games a search field belongs above the grid; the component does not\n * bring one.\n *\n * @example\n * ```html\n * <z-game-grid>\n * <button zGameTile title=\"Minecraft\" price=\"ab 1,98 € / Monat\" [selected]=\"true\"></button>\n * <button zGameTile title=\"Rust\" price=\"ab 4,98 € / Monat\"></button>\n * </z-game-grid>\n * ```\n */\n@Component({\n selector: 'z-game-grid',\n template: `<ng-content />`,\n host: { class: 'z-games' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZGameGrid {}\n\n/**\n * Selectable game tile in the price calculator on the start page, under\n * `/preise` and in the order assistant. Sits on a `<button>` through the\n * attribute `zGameTile`. A tile that leads to a page instead of changing a\n * selection is {@link ZGameTileLink}, `a[zGameTile]`.\n *\n * Renders the class `z-game` on the host and inside it `span.z-game__cover`,\n * a landscape area in the ratio of a store header (460:215), then\n * `span.z-game__title` and `span.z-game__price`. Title and price stand below\n * the cover, never on it. The image fills the area: a store header shows\n * uncropped, an image of another ratio is cut centred.\n * Without a {@link cover} the title stands as text, at most two lines in\n * `span.z-game__fallback`, on the same area instead of an image, and a cover\n * whose URL fails to load drops into that same text fallback and reports\n * {@link coverError}. Every tile has the same height either way. Selected means a 2px line in\n * `accent-text`, no glow and no scaling.\n *\n * Accessibility: the tile is a toggle button and always carries\n * `aria-pressed`, `\"true\"` when selected and `\"false\"` otherwise, so the state\n * is announced either way. The whole cover area is `aria-hidden`, because it\n * shows either an image of what the title below it already says or that title\n * as text; without it a tile with no cover, and one whose cover failed, would\n * put the title into the accessible name twice. The image keeps its empty\n * `alt` for the same reason. So the name of every tile is title plus price,\n * whatever the cover does. The native `title` attribute is suppressed on the\n * host, so the browser does not show its own tooltip because of the\n * {@link title} input. The host gets `type=\"button\"`, so a tile inside a form\n * does not submit it; a static `type` written by the caller stays.\n *\n * @example\n * ```html\n * <button\n * zGameTile\n * title=\"Minecraft\"\n * price=\"ab 1,98 € / Monat\"\n * cover=\"/covers/minecraft.jpg\"\n * [selected]=\"spiel() === 'minecraft'\"\n * (click)=\"spiel.set('minecraft')\"\n * ></button>\n * ```\n */\n@Component({\n // The API table prescribes button[zGameTile]: a component with an attribute\n // selector, like Button.\n selector: 'button[zGameTile]',\n template: KACHEL,\n host: {\n class: 'z-game',\n '[attr.type]': `typ`,\n '[attr.aria-pressed]': `selected() ? \"true\" : \"false\"`,\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZGameTile {\n /**\n * Name of the game. Stands below the cover and, without a {@link cover}, as\n * the text fallback on the cover area as well.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Starting price including the period, for example \"ab 1,98 € / Monat\",\n * shown in the mono face below the title.\n *\n * @default ''\n */\n readonly price = input('');\n\n /**\n * `src` of the cover image, ideally a store header in 460:215. It fills the\n * landscape cover area; an image of another ratio is cut centred. Empty\n * shows the title as text on the cover area instead, and so does a URL that\n * fails to load.\n *\n * @default ''\n */\n readonly cover = input('');\n\n /**\n * Fires once when the {@link cover} fails to load, so an application can log\n * the dead URL. The tile handles the failure itself and needs no answer: it\n * shows the text fallback of a missing cover from then on.\n */\n readonly coverError = output<void>();\n\n /**\n * Marks the tile as the chosen game: `aria-pressed=\"true\"` plus the 2px line\n * in `accent-text`. On load the cheapest game is preselected, so the summary\n * is never empty. Boolean attribute.\n *\n * @default false\n */\n readonly selected = input(false, { transform: booleanAttribute });\n\n /**\n * The tile picks a game, it never submits: without a `type` a `<button>`\n * inside a form is a submit button. A static `type` from the caller is read\n * here and written back, because the host binding would otherwise delete it.\n */\n protected readonly typ = inject(new HostAttributeToken('type'), { optional: true }) ?? 'button';\n\n /**\n * True once the browser reported `error` for the current cover. A new\n * {@link cover} is a new URL, so the flag falls back to `false` with it\n * instead of hiding an image that may well load.\n */\n protected readonly coverFailed = linkedSignal<string, boolean>({\n source: this.cover,\n computation: () => false,\n });\n\n /** `(error)` of the `<img>`: text fallback from now on, and one report. */\n protected coverFehlt(): void {\n this.coverFailed.set(true);\n this.coverError.emit();\n }\n}\n\n/**\n * Game tile as a link, for a grid whose tiles lead somewhere, for example to\n * the order of that game. Sits on an `<a>` through the attribute `zGameTile`\n * and looks exactly like {@link ZGameTile}: same class `z-game`, same cover\n * area with the same text fallback for a missing or failing cover, same title\n * and price, same hover and focus ring.\n *\n * It has no selected state and no `aria-pressed`: a link navigates, it does\n * not toggle. The target is the caller's: `href` or `routerLink` on the same\n * `<a>`, which the component leaves alone, so the tile is a real, crawlable\n * link. The accessible name is title plus price, \"Minecraft ab 1,98 € /\n * Monat\", because the cover area is `aria-hidden`, as on the button. The\n * native `title` attribute is suppressed on the host, so the {@link title}\n * input never becomes a browser tooltip.\n *\n * @example\n * ```html\n * <z-game-grid>\n * <a\n * zGameTile\n * title=\"Minecraft\"\n * price=\"ab 1,98 € / Monat\"\n * cover=\"/covers/minecraft.jpg\"\n * routerLink=\"/user/games/create\"\n * [queryParams]=\"{ game: 'minecraft' }\"\n * ></a>\n * </z-game-grid>\n * ```\n */\n@Component({\n selector: 'a[zGameTile]',\n template: KACHEL,\n host: {\n class: 'z-game',\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZGameTileLink {\n /**\n * Name of the game. Stands below the cover and, without a {@link cover}, as\n * the text fallback on the cover area as well.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Starting price including the period, for example \"ab 1,98 € / Monat\",\n * shown in the mono face below the title.\n *\n * @default ''\n */\n readonly price = input('');\n\n /**\n * `src` of the cover image, ideally a store header in 460:215. It fills the\n * landscape cover area; an image of another ratio is cut centred. Empty\n * shows the title as text on the cover area instead, and so does a URL that\n * fails to load.\n *\n * @default ''\n */\n readonly cover = input('');\n\n /**\n * Fires once when the {@link cover} fails to load, so an application can log\n * the dead URL. The tile already shows the text fallback by then.\n */\n readonly coverError = output<void>();\n\n /** True once the browser reported `error` for the current cover. */\n protected readonly coverFailed = linkedSignal<string, boolean>({\n source: this.cover,\n computation: () => false,\n });\n\n /** `(error)` of the `<img>`: text fallback from now on, and one report. */\n protected coverFehlt(): void {\n this.coverFailed.set(true);\n this.coverError.emit();\n }\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { ZButton } from '../button';\nimport { ZAlert, ZAlertAction } from '../feedback';\nimport { injectZLabels } from '../labels';\nimport { ZSpinner } from '../spinner';\n\n/** One line item of the summary. */\nexport interface ZPriceLine {\n /** Name of the item, for example \"Laufzeitrabatt\". */\n label: string;\n /**\n * The amount, already formatted by the caller. Discounts carry a minus sign\n * and stay a line of their own, they never become a badge.\n *\n * This is a TypeScript string, so the non-breaking space before the currency\n * is written as `'4,40\\u00a0€'`, never as `&nbsp;`: an HTML entity inside a\n * TypeScript literal is rendered as those six characters. `Intl.NumberFormat`\n * with `'de-DE'` emits the same U+00A0 by itself.\n */\n value: string;\n /**\n * Marks the line as a deduction: it gets `z-summary__discount` and the\n * amount stands in `success`. The real minus sign (U+2212) comes from the\n * caller, along with the rest of the formatting.\n */\n discount?: boolean;\n}\n\n/** The sum under the line items. */\nexport interface ZPriceTotal {\n /** What the sum is, for example \"Summe für 30 Tage\". */\n label: string;\n /** The amount, already formatted by the caller. */\n value: string;\n}\n\n/**\n * Result of the price calculator, carrying the only primary button of the\n * calculator.\n *\n * Renders an `<aside class=\"z-summary\">` with the optional\n * `.z-summary__label`, the price in `.z-summary__price` with the period in a\n * `<small>`, the items as a `<dl class=\"z-summary__lines\">` of `<dt>`/`<dd>`\n * pairs with the optional `.z-summary__total` as the last pair, then the\n * projected content and last the notes. So the projected content is the\n * button, and it sits between items and note.\n *\n * States: while {@link loading} holds, the last number stays and moves to\n * `.z-summary__price--pending` with a spinner beside it, never a dash. With\n * {@link error} a `danger` alert stands above the button, with the retry\n * button next to it, and the caller locks its own button. \"Incomplete\" is no\n * state of its own: the caller disables its button and writes into\n * {@link note} what is still missing. Validation errors of the selection\n * belong at the field, not here.\n *\n * Accessibility: the `<aside>` is a complementary landmark named by\n * {@link label}; without a label it carries no `aria-label`. The `<dl>` ties\n * every item to its amount. The price is a polite live region, so a changed\n * amount is announced instead of only redrawn; while {@link loading} holds it\n * also carries `aria-busy` and the caller keeps the last confirmed number\n * there, so nothing unconfirmed is ever read out.\n *\n * Never show it empty: on load the cheapest game is preselected. All values\n * come from the price service and are never hard-coded.\n *\n * @example\n * ```html\n * <z-price-summary\n * label=\"Minecraft, alle 30 Tage\"\n * price=\"7,74&nbsp;€\"\n * [lines]=\"posten\"\n * [total]=\"{ label: 'Summe', value: '7,74\\u00a0€' }\"\n * note=\"Wähle noch eine Bezahlmethode\"\n * legalNote=\"Gemäß § 19 UStG wird keine Umsatzsteuer berechnet.\"\n * >\n * <button zBtn=\"primary\" block type=\"button\" disabled>Kostenpflichtig bestellen</button>\n * </z-price-summary>\n * ```\n */\n@Component({\n selector: 'z-price-summary',\n imports: [ZAlert, ZAlertAction, ZButton, ZSpinner],\n template: `\n <aside class=\"z-summary\" [attr.aria-label]=\"label() || null\">\n <div>\n @if (label()) {\n <div class=\"z-summary__label\">{{ label() }}</div>\n }\n <!-- A price that changes has to be heard, not just seen. The region is\n always in the markup and only its text changes; while the\n calculation runs it says nothing, so only a confirmed amount is\n announced. -->\n <div\n class=\"z-summary__price\"\n [class.z-summary__price--pending]=\"loading()\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n >\n {{ price() }} <small>{{ period() }}</small>\n @if (loading()) {\n <z-spinner />\n }\n </div>\n </div>\n <dl class=\"z-summary__lines\">\n @for (zeile of lines(); track $index) {\n <div class=\"z-summary__line\" [class.z-summary__discount]=\"zeile.discount\">\n <dt>{{ zeile.label }}</dt>\n <dd>{{ zeile.value }}</dd>\n </div>\n }\n @if (total(); as summe) {\n <div class=\"z-summary__total\">\n <dt>{{ summe.label }}</dt>\n <dd>{{ summe.value }}</dd>\n </div>\n }\n </dl>\n @if (error()) {\n <z-alert status=\"danger\" icon=\"error\">\n {{ error() }}\n <button zAlertAction zBtn=\"secondary\" size=\"sm\" type=\"button\" (click)=\"retry.emit()\">\n {{ retryLabel() || etiketten.summaryRetry }}\n </button>\n </z-alert>\n }\n <ng-content />\n @if (note()) {\n <span class=\"z-summary__note\">{{ note() }}</span>\n }\n @if (legalNote()) {\n <span class=\"z-summary__note\">{{ legalNote() }}</span>\n }\n </aside>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZPriceSummary {\n /**\n * Game and period, for example \"Valheim, monatlich\". Also the accessible name\n * of the landmark. Empty leaves both out.\n *\n * @default ''\n */\n readonly label = input('');\n\n /**\n * The price, already formatted by the caller: comma as the decimal mark, a\n * non-breaking space before the currency.\n *\n * @default ''\n */\n readonly price = input('');\n\n /**\n * Period shown after the price, for example \"/ Monat\". Rendered in a\n * `<small>` and always present in the markup, even when empty.\n *\n * @default ''\n */\n readonly period = input('');\n\n /**\n * The line items in display order. Not tracked by `label`, so duplicate\n * labels are allowed.\n *\n * @default []\n */\n readonly lines = input<ZPriceLine[]>([]);\n\n /**\n * The sum under the items, set off by a line in `border-control`. Leave it\n * out where there is only one amount to show.\n *\n * @default null\n */\n readonly total = input<ZPriceTotal | null>(null);\n\n /**\n * While the price is being recomputed: the last number stays and turns\n * `text-muted`, with a spinner beside it. There is never a dash in place of\n * a price. Boolean attribute.\n *\n * @default false\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Why the price could not be computed, for example \"Preis konnte nicht\n * berechnet werden\". Shows a `danger` alert with the retry button. The order\n * button is locked by the caller. Empty renders nothing.\n *\n * @default ''\n */\n readonly error = input('');\n\n /**\n * Caption of that retry button. Empty falls back to the `summaryRetry` label\n * of the registry.\n *\n * @default ''\n */\n readonly retryLabel = input('');\n\n /**\n * One sentence on how billing works, or what is still missing before the\n * order can go out. Shown under the button. Empty leaves it out.\n *\n * @default ''\n */\n readonly note = input('');\n\n /**\n * The tax note, as the last line of the summary, for example \"Gemäß § 19\n * UStG wird keine Umsatzsteuer berechnet.\" Empty leaves it out.\n *\n * @default ''\n */\n readonly legalNote = input('');\n\n /** Fires on the retry button. The caller starts the computation again. */\n readonly retry = output<void>();\n\n protected readonly etiketten = injectZLabels();\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** One term and value pair of a `z-spec-list`. */\nexport interface ZSpecItem {\n /** Short term, rendered as the `<dt>`. */\n term: string;\n /** The concrete value, rendered as the `<dd>`. */\n value: string;\n /** Addition after the value, rendered in a `<small>`. Optional. */\n note?: string;\n /**\n * Sets the value in the mono face through `z-mono`. Use it for technical\n * values: addresses, ports, sizes, configuration keys.\n *\n * @default false\n */\n mono?: boolean;\n}\n\n/**\n * Facts as term and value pairs. Replaces metric tiles, chip clouds and feature\n * cards on public pages; a fact appears exactly once per page.\n *\n * Renders a `<dl class=\"z-spec\">` with one `<dt>`/`<dd>` pair per entry, which\n * is what ties every value to its term for assistive technology. No icons, no\n * cards; the rows are separated by 1px lines. Below 480px the value moves under\n * the term.\n *\n * @example\n * ```html\n * <z-spec-list\n * [items]=\"[\n * { term: 'CPU', value: 'AMD Ryzen 9 7950X', note: '16 Kerne' },\n * { term: 'Anbindung', value: '1 Gbit/s', mono: true },\n * ]\"\n * />\n * ```\n */\n@Component({\n selector: 'z-spec-list',\n template: `<dl class=\"z-spec\">\n @for (eintrag of items(); track $index) {\n <dt>{{ eintrag.term }}</dt>\n <dd>\n @if (eintrag.mono) {\n <span class=\"z-mono\">{{ eintrag.value }}</span>\n } @else {\n {{ eintrag.value }}\n }\n @if (eintrag.note) {\n <small>{{ eintrag.note }}</small>\n }\n </dd>\n }\n </dl>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSpecList {\n /**\n * The facts in display order. Tracked by index, so reordering re-renders the\n * rows. An empty array renders an empty `<dl>`.\n *\n * @default []\n */\n readonly items = input<ZSpecItem[]>([]);\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * One question of the FAQ. The answer is the projected content.\n *\n * Renders a native `<details class=\"z-faq\">` with the question in the\n * `<summary>` and the answer in `<p class=\"z-faq__body\">`. Because it is the\n * native element, opening and closing work without JavaScript, the disclosure\n * is reachable by keyboard and announced with its expanded state; the component\n * adds no keyboard handling of its own.\n *\n * Put several of them under one another, the first one open. Answers run two to\n * three sentences with concrete numbers.\n *\n * @example\n * ```html\n * <z-faq question=\"Wie schnell ist mein Server online?\" open>\n * Nach der Bestellung dauert die Einrichtung in der Regel etwa 60 Sekunden.\n * </z-faq>\n * <z-faq question=\"Kann ich später mehr RAM buchen?\">\n * Ja, im Panel unter Upgrade. Der neue Preis gilt ab der nächsten Stunde.\n * </z-faq>\n * ```\n */\n@Component({\n selector: 'z-faq',\n template: `<details class=\"z-faq\" [open]=\"open()\">\n <summary>{{ question() }}</summary>\n <p class=\"z-faq__body\"><ng-content /></p>\n </details>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZFaq {\n /**\n * The question, shown in the `<summary>`. A real question from support, not a\n * headline.\n *\n * @default ''\n */\n readonly question = input('');\n\n /**\n * Whether the answer starts out visible; the spec asks for the first question\n * to be open. Written as a bare attribute (`open`) it counts as `true`. It is\n * a one-way binding on the native `open` property, so the visitor can toggle\n * freely afterwards and a new value from the caller wins again.\n *\n * @default false\n */\n readonly open = input(false, { transform: booleanAttribute });\n}\n","/* Package werkzeuge: Console, Hero, GameTile, PriceSummary, SpecList and Faq. */\nexport * from '../console';\nexport * from '../marketing';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n input,\n model,\n signal,\n viewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { ZBadge, ZBadgeStatus } from '../badge';\n\n/**\n * One card of a `z-option-group`.\n *\n * @typeParam T The type of {@link value}. `string` for a server type, `number`\n * for a RAM step, so the caller keeps the type it computes with.\n */\nexport interface ZOption<T extends string | number = string> {\n /** The value reported through `value`. Also the tracking key of the list. */\n value: T;\n /** The name of the option, one or two words. Shown in bold, in mono while `compact`. */\n title: string;\n /** One sentence on what the option means. Optional. */\n description?: string;\n /** The price, already formatted by the caller. Shown in the mono face. Optional. */\n price?: string;\n /** Short word above the card, for example \"Empfohlen\" or \"−6 %\". Optional. */\n badge?: string;\n /**\n * Colour of that badge. \"Empfohlen\" is `info` and appears at most once per\n * group, a discount is `success`.\n *\n * @default 'info'\n */\n badgeStatus?: ZBadgeStatus;\n /** Locks this one card while the rest of the group stays usable. */\n disabled?: boolean;\n /**\n * Why it is locked, for example \"zu wenig für 1.21\". Shown in place of\n * {@link description} and tied to the radio through `aria-describedby`.\n */\n disabledReason?: string;\n}\n\nlet zaehler = 0;\n\n/**\n * Picks exactly one of a few options that are meant to be compared: server\n * type, performance class, RAM step, term, payment method. From seven options\n * on it is a `z-combobox` or a `z-slider` instead.\n *\n * Renders a `<fieldset class=\"z-options\">` with the question in\n * `<legend class=\"z-options__legend\">` and one `<label class=\"z-option\">` per\n * option, plus `z-options--compact` for short values such as RAM and term.\n *\n * Accessibility: it is a real radio group. Every card holds a visually hidden\n * native `<input type=\"radio\">` of the same `name`, so the arrow keys move the\n * selection, Tab enters the group once and leaves it again, and the state is\n * announced without any script. The focus ring hangs on the card through\n * `:has(input:focus-visible)`. A locked card names its reason in the card and\n * points at it with `aria-describedby`.\n *\n * Implements `ControlValueAccessor`, so `ngModel` and reactive forms work\n * alongside the two-way binding on {@link value}, and has the shape of a\n * Signal Forms `FormValueControl<string>`, so `[formField]` works. The group as\n * a whole is locked from the form side; a single card is locked through\n * `disabled` on that option.\n *\n * @example\n * ```html\n * <z-option-group\n * legend=\"Arbeitsspeicher\"\n * hint=\"Spielerzahlen sind Richtwerte\"\n * compact\n * [options]=\"[\n * { value: '2', title: '2 GB', disabled: true, disabledReason: 'zu wenig für 1.21' },\n * { value: '4', title: '4 GB', description: 'etwa 10 Spieler', badge: 'Empfohlen' },\n * ]\"\n * [(value)]=\"ram\"\n * />\n * ```\n */\n@Component({\n selector: 'z-option-group',\n imports: [ZBadge],\n template: `\n <fieldset class=\"z-options\" [class.z-options--compact]=\"compact()\">\n <legend class=\"z-options__legend\">\n {{ legend() }}\n @if (hint()) {\n <small>{{ hint() }}</small>\n }\n </legend>\n @for (option of options(); track option.value; let i = $index) {\n <label class=\"z-option\">\n <input\n #radio\n type=\"radio\"\n [name]=\"gruppenname\"\n [value]=\"option.value\"\n [checked]=\"option.value === value()\"\n [disabled]=\"gesperrt() || !!option.disabled\"\n [attr.aria-describedby]=\"satz(option) ? gruppenname + '-' + i : null\"\n (change)=\"waehle(option.value)\"\n (blur)=\"beruehrt()\"\n />\n @if (option.badge) {\n <z-badge class=\"z-option__badge\" [status]=\"option.badgeStatus ?? 'info'\">{{\n option.badge\n }}</z-badge>\n }\n <span class=\"z-option__title\">{{ option.title }}</span>\n @if (satz(option); as text) {\n <span class=\"z-option__desc\" [id]=\"gruppenname + '-' + i\">{{ text }}</span>\n }\n @if (option.price) {\n <span class=\"z-option__price\">{{ option.price }}</span>\n }\n </label>\n }\n </fieldset>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ZOptionGroup), multi: true },\n ],\n})\nexport class ZOptionGroup<T extends string | number = string>\n implements ControlValueAccessor, FormValueControl<T>\n{\n /**\n * The question or the term above the cards, rendered as the `<legend>`.\n *\n * @default ''\n */\n readonly legend = input('');\n\n /**\n * Addition after the legend, in a `<small>`, for example \"Spielerzahlen sind\n * Richtwerte\". Empty renders nothing.\n *\n * @default ''\n */\n readonly hint = input('');\n\n /**\n * The options in display order, at most six. Tracked by `value`, so those\n * have to be unique.\n *\n * @default []\n */\n readonly options = input<readonly ZOption<T>[]>([]);\n\n /**\n * The chosen option's `value`, two-way bindable. A value that matches no\n * option leaves every card unchecked, and so does the unset state: a radio\n * group has no neutral member of `T`, so an unbound group starts out\n * `undefined` and every card is unchecked.\n *\n * @default undefined\n */\n // The cast is the one place where the missing empty member of T is named.\n // It matches what the DOM does: no radio is checked.\n readonly value = model<T>(undefined as unknown as T);\n\n /**\n * Narrow cards with the title in the mono face, for short values such as\n * \"4 GB\" or \"90 Tage\". Adds `z-options--compact`. Boolean attribute.\n *\n * @default false\n */\n readonly compact = input(false, { transform: booleanAttribute });\n\n /**\n * Locks every card of the group. Independent of the disabled state that forms\n * set; either one is enough. A single card is locked through `disabled` on\n * its option. Boolean attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Unique `name` of the radios, which is what makes them one group. */\n protected readonly gruppenname = `z-options-${++zaehler}`;\n\n /** Lock coming from forms, independent of the `disabled` input. Either one suffices. */\n private readonly formsGesperrt = signal(false);\n protected readonly gesperrt = computed(() => this.disabled() || this.formsGesperrt());\n\n private readonly radios = viewChildren<ElementRef<HTMLInputElement>>('radio');\n /** Bumped on every native change, so the mirror below runs again. */\n private readonly spiegelzaehler = signal(0);\n\n private melde?: (wert: T) => void;\n private aufBeruehrt?: () => void;\n\n constructor() {\n // The browser checks a radio before anyone is asked. If the caller refuses\n // the new value, `value()` never changes and the binding has nothing to\n // redo, so the DOM would keep a selection the model does not have. This\n // effect writes the model back into every radio after each change, the way\n // checkbox, toggle and slider mirror their own state (docs/signals.md).\n effect(() => {\n this.spiegelzaehler();\n const wert = this.value();\n this.options();\n for (const radio of this.radios()) {\n radio.nativeElement.checked = radio.nativeElement.value === String(wert);\n }\n });\n }\n\n /** The reason wins over the description, the way the reference card shows it. */\n protected satz(option: ZOption<T>): string {\n return (option.disabled && option.disabledReason) || option.description || '';\n }\n\n protected waehle(wert: T): void {\n this.spiegelzaehler.update((zahl) => zahl + 1);\n if (wert === this.value()) {\n return;\n }\n this.value.set(wert);\n this.melde?.(wert);\n }\n\n protected beruehrt(): void {\n this.aufBeruehrt?.();\n }\n\n /**\n * `ControlValueAccessor`: takes the value from the form. `null` and\n * `undefined` leave every card unchecked.\n */\n writeValue(wert: T): void {\n this.value.set(wert ?? (undefined as unknown as T));\n this.spiegelzaehler.update((zahl) => zahl + 1);\n }\n\n /**\n * `ControlValueAccessor`: registers the callback that reports a new value to\n * the form. It fires on a real change of the radio, not on writes through\n * {@link value}.\n */\n registerOnChange(fn: (wert: T) => void): void {\n this.melde = fn;\n }\n\n /** `ControlValueAccessor`: registers the callback fired when a card loses focus. */\n registerOnTouched(fn: () => void): void {\n this.aufBeruehrt = fn;\n }\n\n /** `ControlValueAccessor`: locks or unlocks every card of the group. */\n setDisabledState(gesperrt: boolean): void {\n this.formsGesperrt.set(gesperrt);\n }\n}\n","import { ActiveDescendantKeyManager, Highlightable } from '@angular/cdk/a11y';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n DOCUMENT,\n effect,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n model,\n numberAttribute,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { ZField } from '../field';\nimport { ZIcon } from '../icon';\nimport { injectZLabels } from '../labels';\nimport { ZSpinner } from '../spinner';\n\n/** One entry of a `z-combobox`. */\nexport interface ZComboOption {\n /** The value reported through `value`. Also the tracking key of the list. */\n value: string;\n /** What the entry reads as, and what stands in the field once it is chosen. */\n label: string;\n /**\n * Consequence of the entry, for example \"mindestens 4 GB\". Shown in a\n * `<small>` and searched along with the label, so a rule never surfaces for\n * the first time in the summary.\n */\n note?: string;\n /** Heading the entry belongs under, for example \"Aktuell\" or \"Snapshots\". */\n group?: string;\n}\n\n/** One row of the open panel: the key manager walks these. */\ninterface Eintrag extends Highlightable {\n readonly option: ZComboOption;\n readonly index: number;\n /** True for the row that commits the typed text; see `allowCustom`. */\n readonly eigen: boolean;\n /**\n * Tracking key of the row. An option's `value` is unique among options, but\n * the own row carries the typed text as its value, and with ids as values\n * typing an id would collide with the entry that has it. The own row\n * therefore takes a prefix no value can have.\n */\n readonly schluessel: string;\n}\n\n/** A heading with the entries under it; an empty name means no heading. */\ninterface Gruppe {\n readonly name: string;\n readonly eintraege: readonly Eintrag[];\n}\n\nlet zaehler = 0;\n\n/**\n * Picks one value out of a long list by typing and filtering: Minecraft\n * version, modpack, Java version, a game from about fifteen on. Up to six\n * options it is a `z-option-group` instead.\n *\n * Renders a `<span class=\"z-combo\">` with an `<input class=\"z-input\">` and, in\n * a CDK overlay as wide as the field, a `<div class=\"z-listbox\">` with one\n * `.z-listbox__option` per match, headings as `.z-listbox__group` and, when\n * nothing matches, a single `.z-listbox__empty` row instead of an empty panel.\n *\n * Accessibility: the editable combobox pattern of the ARIA practices. The\n * input carries `role=\"combobox\"`, `aria-expanded`, `aria-controls`,\n * `aria-autocomplete=\"list\"` and `aria-activedescendant`; the panel is the\n * `role=\"listbox\"`, headings are `role=\"group\"` with their name. The focus\n * never leaves the input: the arrow keys, Home and End move the active entry\n * through `ActiveDescendantKeyManager`, Enter takes it, Escape closes without\n * clearing the field, and a click on an entry keeps the focus because the\n * component cancels the `mousedown`. Leaving the field with text that matches\n * nothing puts the chosen label back, so the field never shows a value that is\n * not the value. The component has no visible label of its own; it takes the\n * label and the hint or error of the surrounding `z-field` through\n * {@link inputId}, or an accessible name through {@link ariaLabel} or\n * {@link ariaLabelledby}.\n *\n * The panel hangs in a CDK overlay as wide as the field and belongs to it: it\n * follows the field when anything around it scrolls, the page as well as an\n * inner container such as the body of a scrolling dialog, and closes once the\n * field has left that container. Scrolling inside the list itself does not\n * move the field and changes nothing.\n *\n * Implements `ControlValueAccessor`, so `ngModel` and reactive forms work\n * alongside the two-way binding on {@link value}, and has the shape of a\n * Signal Forms `FormValueControl<string>`, so `[formField]` works and feeds\n * {@link disabled} from the field state.\n *\n * Three modes, all of them the same element:\n *\n * - **Local**, the default: the component filters {@link options} itself.\n * - **On the server**: {@link filterLocally} `false` shows exactly the options\n * it is given, {@link queryChange} reports every keystroke, {@link loading}\n * draws the waiting row and {@link selectedLabel} names a chosen value whose\n * option is no longer in the list. {@link minQueryLength} holds the list back\n * until the query is long enough to be worth a request. A query shorter than\n * that is still reported, so the caller decides what to do with it.\n * - **Free text**: {@link allowCustom} lets Enter, Tab, Shift+Tab and leaving\n * the field commit what was typed, so the value may be a string that is in\n * no option.\n *\n * @example\n * ```html\n * <z-field label=\"Minecraft-Version\" for=\"cb-version\" hint=\"Tippen filtert die Liste.\">\n * <z-combobox\n * inputId=\"cb-version\"\n * [options]=\"versionen\"\n * [(value)]=\"version\"\n * emptyText=\"Keine Version gefunden\"\n * />\n * </z-field>\n * ```\n */\n@Component({\n selector: 'z-combobox',\n imports: [ZIcon, ZSpinner],\n template: `\n <span class=\"z-combo\">\n <input\n #feld\n class=\"z-input z-input--mono\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [id]=\"inputId() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [attr.aria-describedby]=\"feldRahmen?.beschreibung() ?? null\"\n [attr.aria-expanded]=\"offen()\"\n [attr.aria-controls]=\"offen() ? listenId : null\"\n aria-autocomplete=\"list\"\n [attr.aria-activedescendant]=\"aktiveId()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"gesperrt()\"\n [value]=\"text()\"\n (input)=\"aufEingabe($event)\"\n (keydown)=\"aufTaste($event)\"\n (mousedown)=\"oeffne()\"\n (blur)=\"aufVerlassen()\"\n />\n </span>\n <!-- How many entries the filter left, or the sentence of the empty row.\n The region is always in the markup and only its text changes, which is\n the one way a screen reader hears the count of a list it cannot see. -->\n <span class=\"z-visually-hidden\" role=\"status\">{{ ansage() }}</span>\n\n <ng-template #panel>\n <!-- Cancelling mousedown on the whole panel, not just on an entry, is what\n keeps the focus in the field when the pointer lands on the scrollbar,\n a heading or the empty row. -->\n <div\n class=\"z-listbox\"\n [id]=\"listenId\"\n role=\"listbox\"\n [attr.aria-label]=\"listenname()\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n (mousedown)=\"$event.preventDefault()\"\n >\n @if (zuKurz()) {\n <!-- Below minQueryLength the list is held back and this row says why.\n A locked option, like the empty row, so the listbox keeps a valid\n child and there is nothing to take. -->\n <div class=\"z-listbox__empty\" role=\"option\" aria-selected=\"false\" aria-disabled=\"true\">\n {{ etiketten.comboboxMinQuery(minQueryLength()) }}\n </div>\n } @else {\n @for (gruppe of gruppen(); track gruppe.name) {\n <!-- A heading is a role=\"group\" with its name. Without one the wrapper\n is presentational, so the entries stay direct children of the listbox. -->\n <div\n [attr.role]=\"gruppe.name ? 'group' : 'presentation'\"\n [attr.aria-label]=\"gruppe.name || null\"\n >\n @if (gruppe.name) {\n <div class=\"z-listbox__group\" role=\"presentation\">{{ gruppe.name }}</div>\n }\n @for (eintrag of gruppe.eintraege; track eintrag.schluessel) {\n <!-- In the activedescendant pattern the option is deliberately not\n a tab stop and carries no key handler: the focus stays in the\n input, which owns the whole keyboard (ARIA APG, combobox). -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"z-listbox__option\"\n role=\"option\"\n [id]=\"listenId + '-' + eintrag.index\"\n [class.z-listbox__option--active]=\"eintrag.index === aktiverIndex()\"\n [attr.aria-selected]=\"eintrag.option.value === value()\"\n (click)=\"waehle(eintrag.option.value)\"\n >\n @if (eintrag.eigen) {\n <!-- Prose, not a value, so it carries no mono face. -->\n <span>{{ etiketten.comboboxUseCustom(eintrag.option.label) }}</span>\n } @else {\n <span class=\"z-mono\">{{ eintrag.option.label }}</span>\n @if (eintrag.option.value === value()) {\n <z-icon name=\"check\" size=\"sm\" />\n } @else if (eintrag.option.note) {\n <small>{{ eintrag.option.note }}</small>\n }\n }\n </div>\n }\n </div>\n }\n @if (loading()) {\n <!-- While the caller is searching, the stale options stay above this\n row: replacing them with a single line and putting them back a\n moment later is a flicker under the hand that is typing. There\n is no empty row here, because nothing is known yet. -->\n <div\n class=\"z-listbox__empty z-listbox__loading\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n >\n <z-spinner />\n <span>{{ etiketten.comboboxLoading }}</span>\n </div>\n } @else if (!eintraege().length) {\n <!-- One row instead of an empty panel. It is an option so the listbox\n keeps a valid child, and a locked one because there is nothing to\n take. -->\n <div\n class=\"z-listbox__empty\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n [id]=\"listenId + '-0'\"\n >\n {{ emptyText() || etiketten.comboboxEmpty }}\n </div>\n }\n }\n </div>\n </ng-template>\n `,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ZCombobox), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZCombobox implements ControlValueAccessor, FormValueControl<string> {\n /**\n * The entries in display order. Tracked by `value`, so those have to be\n * unique. Entries with the same `group` are shown under one heading, in the\n * order the groups first appear.\n *\n * @default []\n */\n readonly options = input<readonly ZComboOption[]>([]);\n\n /**\n * The chosen entry's `value`, two-way bindable. A value that matches no\n * entry leaves the field empty.\n *\n * @default ''\n */\n readonly value = model('');\n\n /**\n * Placeholder of the empty field. It is not a label: the label stands above\n * the field, in the surrounding `z-field`.\n *\n * @default ''\n */\n readonly placeholder = input('');\n\n /**\n * The one line the panel shows when nothing matches, for example \"Keine\n * Version gefunden\". Empty falls back to the `comboboxEmpty` label.\n *\n * @default ''\n */\n readonly emptyText = input('');\n\n /**\n * `id` of the input. This is what a surrounding `z-field` points its `for`\n * at, and it is the root of the option ids.\n *\n * @default ''\n */\n readonly inputId = input('');\n\n /**\n * Accessible name of the field where there is no `z-field` around it. An\n * empty string writes no attribute.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * `id` of the element that names the field, as an alternative to\n * {@link ariaLabel}.\n *\n * @default ''\n */\n readonly ariaLabelledby = input('');\n\n /**\n * Locks the field. Independent of the disabled state that forms set; either\n * one is enough. Boolean attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the component filters {@link options} itself. `false` hands the\n * filtering to the caller: the panel shows exactly the options it is given,\n * which is what a search on the server needs. {@link queryChange} is what\n * feeds that search. Boolean attribute.\n *\n * @default true\n */\n readonly filterLocally = input(true, { transform: booleanAttribute });\n\n /**\n * Whether the caller is fetching options right now. While the panel is open\n * it draws one waiting row and sets `aria-busy` on the listbox; options that\n * are already there stay above that row, so a running search does not blank\n * the list under the hand that is typing. No empty row while this is set.\n * Boolean attribute.\n *\n * @default false\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Whether text that matches no entry may become the value. Enter without an\n * active row, Tab, Shift+Tab and leaving the field with the pointer all\n * commit the typed text, trimmed, and a row at the top of the panel offers\n * the same thing with the pointer and the arrow keys. Text that is only\n * space commits nothing: it trims to the empty string, so the panel holds\n * the whole list and Enter takes the active row, exactly as it does without\n * this input. Escape is the one key that gives the text up.\n *\n * A value committed this way is its own label until the caller changes\n * {@link selectedLabel} or the value, so a `selectedLabel` still naming the\n * entry chosen before it does not resurface.\n *\n * @default false\n */\n readonly allowCustom = input(false, { transform: booleanAttribute });\n\n /**\n * Least number of characters before the panel shows entries at all. Below\n * it a single row says so instead, and {@link queryChange} still fires, so\n * the caller decides whether a shorter query is worth a request.\n *\n * @default 0\n */\n readonly minQueryLength = input(0, { transform: numberAttribute });\n\n /**\n * What the field shows for the current {@link value} while no entry of\n * {@link options} carries it. A search on the server holds the matches of\n * the last query, not the entry that was chosen three queries ago, and the\n * caller knows the label that belongs to the id it stores. An entry that is\n * in the list still wins over this.\n *\n * @default ''\n */\n readonly selectedLabel = input('');\n\n /**\n * The text the visitor typed, on every change of it, and the empty string\n * once the field is cleared. It does not fire when the component writes the\n * label of the value back into the field, and not on a write to\n * {@link value}, so it never answers itself.\n *\n * There is no debounce in here: the timing belongs to whoever runs the\n * search. Write the text into a signal and let a `resource()` with that\n * signal as its `params` fetch, or push it into a `Subject` and debounce\n * with RxJS; feed the result back into `options` and set `loading` while the\n * request is open.\n */\n readonly queryChange = output<string>();\n\n protected readonly etiketten = injectZLabels();\n protected readonly listenId = `z-listbox-${++zaehler}`;\n protected readonly offen = signal(false);\n\n /** What the input shows. Follows {@link value} until the visitor types. */\n protected readonly text = signal('');\n\n /** The typed filter, or `null` while the list is unfiltered. */\n private readonly suche = signal<string | null>(null);\n\n protected readonly aktiverIndex = signal(-1);\n\n /**\n * `value` of the active row, so it can be found again after the list was\n * replaced under the open panel. The index alone would move with the list.\n */\n private readonly aktiverWert = signal('');\n\n private readonly formsGesperrt = signal(false);\n protected readonly gesperrt = computed(() => this.disabled() || this.formsGesperrt());\n\n protected readonly feldRahmen = inject(ZField, { optional: true });\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly dokument = inject(DOCUMENT);\n private readonly overlay = inject(Overlay);\n private readonly ansicht = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly feld = viewChild.required<ElementRef<HTMLInputElement>>('feld');\n private readonly panel = viewChild.required<TemplateRef<unknown>>('panel');\n private overlayRef?: OverlayRef;\n /** Lives exactly as long as the open panel; see {@link horcheAufScrollen}. */\n private scrollHorcher?: AbortController;\n\n private melde?: (wert: string) => void;\n private aufBeruehrt?: () => void;\n\n /**\n * A value the component itself took from the typed text, together with the\n * {@link selectedLabel} that stood at that moment. Both have to still hold\n * for the value to be its own label; see {@link gewaehltesLabel}.\n */\n private readonly eigenerBestand = signal<{ wert: string; etikett: string } | null>(null);\n\n /**\n * The label of the chosen value, in this order: the entry that carries it,\n * the free text the component itself just committed, the\n * {@link selectedLabel} the caller supplied, and the value itself where\n * {@link allowCustom} makes a value that is in no entry a legal one. The\n * empty string for an unknown value in the plain case, which is what leaves\n * the field empty.\n *\n * The free text comes before `selectedLabel` because that input still names\n * the entry chosen before it, and showing the old name for a value the\n * visitor just typed is the worse of the two. It gives way again as soon as\n * the caller changes `selectedLabel` or the value.\n */\n private readonly gewaehltesLabel = computed(() => {\n const wert = this.value();\n const eintrag = this.options().find((o) => o.value === wert);\n if (eintrag) {\n return eintrag.label;\n }\n if (!wert) {\n return '';\n }\n const eigen = this.eigenerBestand();\n if (eigen && eigen.wert === wert && eigen.etikett === this.selectedLabel()) {\n return wert;\n }\n return this.selectedLabel() || (this.allowCustom() ? wert : '');\n });\n\n /** The typed text, trimmed; the empty string while nothing has been typed. */\n private readonly anfrage = computed(() => this.suche()?.trim() ?? '');\n\n /** True while the typed text is shorter than {@link minQueryLength}. */\n protected readonly zuKurz = computed(() => this.anfrage().length < this.minQueryLength());\n\n /**\n * Case-insensitive over label and note; no filter shows every entry. With\n * {@link filterLocally} `false` the caller has filtered already, so the\n * options are passed through as they are. Below {@link minQueryLength} there\n * is nothing to show at all.\n */\n protected readonly treffer = computed<readonly ZComboOption[]>(() => {\n if (this.zuKurz()) {\n return [];\n }\n const suche = this.filterLocally() ? this.anfrage().toLowerCase() : '';\n if (!suche) {\n return this.options();\n }\n return this.options().filter((o) => `${o.label} ${o.note ?? ''}`.toLowerCase().includes(suche));\n });\n\n /**\n * The entry whose label **or** value is exactly the typed text, ignoring\n * case and surrounding space. The value counts too because a list keyed by\n * ids is searched by id as often as by name, and two ways to one row must\n * not put two rows in the panel.\n */\n private readonly genauePassung = computed(() => {\n const text = this.anfrage().toLowerCase();\n if (!text) {\n return null;\n }\n return (\n this.treffer().find(\n (o) => o.label.toLowerCase() === text || o.value.toLowerCase() === text,\n ) ?? null\n );\n });\n\n /**\n * The value that committing the typed text would write, or the empty string\n * where there is nothing to commit. Typing the exact label of an entry\n * commits that entry's value, not the label, so the two ways to the same row\n * do not end in two different values.\n */\n private readonly eigenerWert = computed(() => {\n if (!this.allowCustom() || this.zuKurz() || !this.anfrage()) {\n return '';\n }\n return this.genauePassung()?.value ?? this.anfrage();\n });\n\n /**\n * The row that commits the typed text, or `null`. It stands only where the\n * text is not already the label of an entry: a second way to a row that is\n * right there would be a second value for the same thing.\n */\n private readonly eigeneOption = computed<ZComboOption | null>(() => {\n const text = this.anfrage();\n if (!this.allowCustom() || this.zuKurz() || !text || this.genauePassung()) {\n return null;\n }\n return { value: text, label: text };\n });\n\n /**\n * Grouped by name, in the order the names first appear. Entries of the same\n * group that stand apart in `options` land under one heading, so a name never\n * shows up twice and the tracking key of the list stays unique.\n */\n protected readonly gruppen = computed<Gruppe[]>(() => {\n const eigene = this.eigeneOption();\n const nach = new Map<string, ZComboOption[]>();\n // The own row goes first, and therefore into the group without a heading:\n // it belongs to the text in the field, not to any of the headings.\n if (eigene) {\n nach.set('', [eigene]);\n }\n for (const option of this.treffer()) {\n const name = option.group ?? '';\n const vorhanden = nach.get(name);\n if (vorhanden) {\n vorhanden.push(option);\n } else {\n nach.set(name, [option]);\n }\n }\n // Numbered in the order the rows are drawn, not in the order of `options`:\n // grouping moves rows, and the arrow keys have to follow the eye.\n let index = 0;\n return [...nach].map(([name, optionen]) => ({\n name,\n eintraege: optionen.map((option) => this.zuEintrag(option, index++, option === eigene)),\n }));\n });\n\n /** Every row of every group, in the order they are drawn. */\n protected readonly eintraege = computed<Eintrag[]>(() =>\n this.gruppen().flatMap((gruppe) => gruppe.eintraege as Eintrag[]),\n );\n\n private zuEintrag(option: ZComboOption, index: number, eigen: boolean): Eintrag {\n return {\n option,\n index,\n eigen,\n schluessel: eigen ? `\\u0000eigen` : option.value,\n getLabel: () => option.label,\n // The active row is derived from aktiverIndex, so one signal carries the\n // whole state and the counterpart has nothing left to undo. The value\n // travels along so the row can be found again in a replaced list.\n setActiveStyles: () => {\n this.aktiverIndex.set(index);\n this.aktiverWert.set(option.value);\n },\n setInactiveStyles: () => undefined,\n };\n }\n\n /**\n * What the live region says while the panel is open: how many entries the\n * filter left, or the sentence of the row that stands instead of them.\n * Closed it says nothing, so nothing is announced twice.\n *\n * The count is the matches and nothing else. The row of {@link allowCustom}\n * is an action, not a hit, so it would turn one match into \"2 Treffer\"; it\n * gets its own sentence where it stands alone, which is also what the panel\n * shows then.\n */\n protected readonly ansage = computed(() => {\n if (!this.offen()) {\n return '';\n }\n if (this.zuKurz()) {\n return this.etiketten.comboboxMinQuery(this.minQueryLength());\n }\n if (this.loading()) {\n return this.etiketten.comboboxLoading;\n }\n const anzahl = this.treffer().length;\n if (anzahl) {\n return this.etiketten.comboboxResults(anzahl);\n }\n const eigene = this.eigeneOption();\n return eigene\n ? this.etiketten.comboboxUseCustom(eigene.label)\n : this.emptyText() || this.etiketten.comboboxEmpty;\n });\n\n /**\n * The id of the active row. Bounded by the list itself, not only by the\n * index: options can be replaced under an open panel, and a reference to a\n * row that is gone is worse than none.\n */\n protected readonly aktiveId = computed(() => {\n const index = this.aktiverIndex();\n return this.offen() && index >= 0 && index < this.eintraege().length\n ? `${this.listenId}-${index}`\n : null;\n });\n\n /** Names the panel after the field, so the listbox is not an unnamed region. */\n protected readonly listenname = computed(\n () => this.ariaLabel() || this.feldRahmen?.label() || null,\n );\n\n private readonly tasten = new ActiveDescendantKeyManager(this.eintraege, this.injector)\n .withWrap()\n .withHomeAndEnd();\n\n constructor() {\n // The field shows the label of the value, never the raw value. A value set\n // from outside therefore rewrites the text, and so does a changed option\n // list. While the visitor types, the typed text stands instead.\n effect(() => {\n const label = this.gewaehltesLabel();\n if (untracked(this.suche) === null) {\n this.text.set(label);\n }\n });\n\n // A search on the server replaces `options` while the panel stands open.\n // The row the keyboard is on keeps its place when it is still in the list,\n // otherwise the first one takes over; without this the active index would\n // point into a list that has moved under it.\n effect(() => {\n const alle = this.eintraege();\n if (!untracked(this.offen)) {\n return;\n }\n const index = alle.findIndex((e) => e.option.value === untracked(this.aktiverWert));\n this.aktiviere(index >= 0 ? index : 0);\n });\n\n const abbruch = new AbortController();\n this.dokument.defaultView?.addEventListener('resize', () => this.aufGroessenwechsel(), {\n signal: abbruch.signal,\n });\n\n inject(DestroyRef).onDestroy(() => {\n abbruch.abort();\n this.scrollHorcher?.abort();\n this.tasten.destroy();\n this.overlayRef?.dispose();\n });\n }\n\n protected oeffne(): void {\n if (this.gesperrt() || this.offen()) {\n return;\n }\n this.overlayRef ??= this.erzeugeOverlay();\n this.overlayRef.updateSize({ width: this.feld().nativeElement.offsetWidth });\n this.overlayRef.attach(new TemplatePortal(this.panel(), this.ansicht));\n this.offen.set(true);\n this.setzeAktiv();\n this.horcheAufScrollen();\n }\n\n protected schliesse(): void {\n if (!this.offen()) {\n return;\n }\n this.scrollHorcher?.abort();\n this.scrollHorcher = undefined;\n this.overlayRef?.detach();\n this.offen.set(false);\n this.aktiverIndex.set(-1);\n this.aktiverWert.set('');\n this.suche.set(null);\n this.text.set(this.gewaehltesLabel());\n }\n\n /**\n * While the panel is open, every scroller around the field is listened to.\n * The listener hangs on the document in the CAPTURE phase, because a scroll\n * event on an inner element does not bubble: `ScrollDispatcher` of the CDK\n * listens without capture and therefore only ever hears the page and the\n * containers a caller marked `cdkScrollable`. The scrolling body of a dialog\n * carries that mark since `z-dialog` sets it, but a scroll container of the\n * caller's own does not, so a combobox in one used to keep a panel hanging\n * where the field no longer was. Capture hears every scroller without asking\n * any caller to annotate its container.\n */\n private horcheAufScrollen(): void {\n this.scrollHorcher = new AbortController();\n this.dokument.addEventListener('scroll', (ereignis) => this.aufScrollen(ereignis), {\n capture: true,\n passive: true,\n signal: this.scrollHorcher.signal,\n });\n }\n\n /**\n * The panel belongs to the field: it follows the field as long as the field\n * can be seen in the container that moved, and goes once the field has left\n * it. Following instead of closing at the first pixel is what the package\n * already did for the page, and it is what a scroll that is still running\n * needs: a panel opened while the browser is still scrolling a field into\n * view would otherwise close under the hand that opened it. A scroll inside\n * the list is not a scroll of the field and changes nothing.\n */\n private aufScrollen(ereignis: Event): void {\n const ziel = ereignis.target as Node | null;\n if (!this.overlayRef || (ziel && this.overlayRef.overlayElement.contains(ziel))) {\n return;\n }\n this.overlayRef.updatePosition();\n const feld = this.feld().nativeElement.getBoundingClientRect();\n const rolle = this.kasten(ziel);\n if (\n feld.bottom <= rolle.top ||\n feld.top >= rolle.bottom ||\n feld.right <= rolle.left ||\n feld.left >= rolle.right\n ) {\n this.schliesse();\n }\n }\n\n /**\n * The visible box of the scroller the event came from. The page reports its\n * scroll on the document, and in some engines on the root element or the\n * body; all three mean the viewport.\n */\n private kasten(ziel: Node | null): { top: number; bottom: number; left: number; right: number } {\n const seite =\n !ziel ||\n ziel === this.dokument ||\n ziel === this.dokument.documentElement ||\n ziel === this.dokument.body;\n if (!seite && ziel instanceof Element) {\n return ziel.getBoundingClientRect();\n }\n const fenster = this.dokument.defaultView;\n return {\n top: 0,\n left: 0,\n bottom: fenster?.innerHeight ?? 0,\n right: fenster?.innerWidth ?? 0,\n };\n }\n\n protected aufEingabe(ereignis: Event): void {\n const text = (ereignis.target as HTMLInputElement).value;\n this.text.set(text);\n this.suche.set(text);\n this.oeffne();\n this.setzeAktiv();\n // Only here, so the output carries what the visitor typed and never what\n // the component wrote back into the field.\n this.queryChange.emit(text);\n }\n\n protected aufTaste(ereignis: KeyboardEvent): void {\n if (ereignis.key === 'Escape') {\n // Closes the panel and puts the chosen label back. It never empties the\n // field, so a second Escape has nothing left to take away. While the\n // panel is open the key belongs to the panel: it stops here, or a dialog\n // around the field would close along with it.\n if (this.offen()) {\n ereignis.preventDefault();\n ereignis.stopPropagation();\n this.schliesse();\n }\n return;\n }\n if (ereignis.key === 'Enter') {\n const gewaehlt = this.eintraege()[this.aktiverIndex()];\n if (this.offen() && gewaehlt) {\n ereignis.preventDefault();\n this.waehle(gewaehlt.option.value);\n } else if (this.eigenerWert()) {\n // No row under the keyboard, but text in the field and allowCustom:\n // Enter takes that text instead of doing nothing.\n ereignis.preventDefault();\n this.waehle(this.eigenerWert());\n }\n return;\n }\n if (ereignis.key === 'Tab') {\n // Tab and Shift+Tab are both ways of leaving the field (the key is `Tab`\n // either way), so they commit what leaving commits. It has to happen\n // here: the panel closes before the focus moves, and by the time the\n // blur arrives the typed text is gone.\n this.uebernimmEigenes();\n this.schliesse();\n return;\n }\n if (['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(ereignis.key)) {\n if (!this.offen()) {\n this.oeffne();\n return;\n }\n this.tasten.onKeydown(ereignis);\n this.rolleZumAktiven();\n }\n }\n\n protected waehle(wert: string): void {\n this.uebernimm(wert);\n this.feld().nativeElement.focus();\n }\n\n /**\n * Writes a value, reports it to the form and closes the panel. Separate from\n * {@link waehle} because leaving the field also commits, and pulling the\n * focus back there would be the one thing a blur must not do.\n */\n private uebernimm(wert: string): void {\n this.suche.set(null);\n if (wert !== this.value()) {\n this.value.set(wert);\n this.melde?.(wert);\n }\n // Free text is its own label from here on, which is what keeps a stale\n // selectedLabel from naming the entry that was chosen before it.\n this.eigenerBestand.set(\n this.allowCustom() && wert && !this.options().some((o) => o.value === wert)\n ? { wert, etikett: this.selectedLabel() }\n : null,\n );\n this.text.set(this.gewaehltesLabel());\n this.schliesse();\n }\n\n /**\n * Leaving the field is the moment a text that matches nothing is undone —\n * or, with {@link allowCustom}, the moment it becomes the value.\n */\n protected aufVerlassen(): void {\n this.uebernimmEigenes();\n this.schliesse();\n this.aufBeruehrt?.();\n }\n\n /** Takes the typed text where {@link allowCustom} lets it become the value. */\n private uebernimmEigenes(): void {\n const wert = this.eigenerWert();\n if (wert) {\n this.uebernimm(wert);\n }\n }\n\n /** The chosen entry starts out active, otherwise the first one. */\n private setzeAktiv(): void {\n const index = this.eintraege().findIndex((e) => e.option.value === this.value());\n this.aktiviere(index >= 0 ? index : 0);\n }\n\n /** Makes one row active, or none at all where the list is empty. */\n private aktiviere(index: number): void {\n const alle = this.eintraege();\n const ziel = alle.length ? Math.min(Math.max(index, 0), alle.length - 1) : -1;\n this.tasten.setActiveItem(ziel);\n this.aktiverIndex.set(ziel);\n this.aktiverWert.set(ziel >= 0 ? alle[ziel].option.value : '');\n }\n\n private rolleZumAktiven(): void {\n const zeile = this.overlayRef?.overlayElement.querySelector(\n `#${this.listenId}-${this.aktiverIndex()}`,\n );\n // Optional because a test environment without layout does not implement it.\n zeile?.scrollIntoView?.({ block: 'nearest' });\n }\n\n /** As wide as the field, below it, above it as the fallback position. */\n private erzeugeOverlay(): OverlayRef {\n const position = this.overlay.position().flexibleConnectedTo(this.feld());\n const ref = this.overlay.create({\n panelClass: 'z-combo-pane',\n positionStrategy: position\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n ])\n // Without this the strategy pushes the panel back into the viewport\n // when the field leaves it: the list would stand in the page far from\n // the field it belongs to.\n .withPush(false),\n // Scrolling is answered in one place, by the capture listener of\n // horcheAufScrollen(): every CDK strategy runs on ScrollDispatcher, which\n // does not hear an unannotated inner scroller at all.\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n });\n // A pointer on the field itself is not \"outside\": it opens the panel and\n // would otherwise close it again within the same event.\n ref.outsidePointerEvents().subscribe((ereignis) => {\n if (!this.host.nativeElement.contains(ereignis.target as Node)) {\n this.schliesse();\n }\n });\n // An overlay can be detached from outside (dispose on destroy), so the\n // component learns of it here instead of keeping a state the DOM no longer\n // has.\n ref.detachments().subscribe(() => {\n this.scrollHorcher?.abort();\n this.scrollHorcher = undefined;\n if (this.offen()) {\n this.offen.set(false);\n this.aktiverIndex.set(-1);\n this.aktiverWert.set('');\n this.suche.set(null);\n this.text.set(this.gewaehltesLabel());\n }\n });\n return ref;\n }\n\n /** A resized window changes the width of the field, and with it the panel. */\n private aufGroessenwechsel(): void {\n if (!this.offen() || !this.overlayRef) {\n return;\n }\n this.overlayRef.updateSize({ width: this.feld().nativeElement.offsetWidth });\n this.overlayRef.updatePosition();\n }\n\n /**\n * `ControlValueAccessor`: takes the value from the form. `null` and\n * `undefined` become the empty string, which selects nothing.\n */\n writeValue(wert: string): void {\n this.value.set(wert ?? '');\n }\n\n /**\n * `ControlValueAccessor`: registers the callback that reports a new value to\n * the form. It fires when an entry is taken, not on writes through\n * {@link value}.\n */\n registerOnChange(fn: (wert: string) => void): void {\n this.melde = fn;\n }\n\n /** `ControlValueAccessor`: registers the callback fired when the field loses focus. */\n registerOnTouched(fn: () => void): void {\n this.aufBeruehrt = fn;\n }\n\n /** `ControlValueAccessor`: locks or unlocks the field from the form side. */\n setDisabledState(gesperrt: boolean): void {\n this.formsGesperrt.set(gesperrt);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n Directive,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { injectZLabels } from '../labels';\n\nlet schrittZaehler = 0;\n\n/** State of one step of a `z-wizard`. */\nexport type ZWizardState = 'done' | 'current' | 'locked';\n\n/**\n * Marks an action of the current step, which goes into the row at the bottom of\n * the step body: \"Zurück\" as a ghost button on the left, \"Weiter\" as a\n * secondary one on the right. The caller owns those buttons, because only the\n * caller knows what the next step is called and when it may be reached.\n *\n * @example\n * ```html\n * <button zWizardActions zBtn=\"ghost\" type=\"button\">Zurück</button>\n * <button zWizardActions zBtn=\"secondary\" type=\"button\">Weiter zu Bezahlen</button>\n * ```\n */\n@Directive({ selector: '[zWizardActions]' })\nexport class ZWizardActions {}\n\n/**\n * One step of a `z-wizard`: head with number and title, and the fields as\n * projected content while it is the current one.\n *\n * Renders the class `z-wstep` on the host, plus `z-wstep--done` or\n * `z-wstep--locked`. The head holds `.z-step__num`, the title as a heading,\n * the summary and, on a finished step, the \"Ändern\" button. The body is only\n * rendered while the step is current, with every projected\n * `[zWizardActions]` element as the last row in `.z-wstep__actions`, which is\n * the flex row that puts \"Zurück\" left and \"Weiter\" right.\n *\n * Accessibility: `role=\"listitem\"`, and `aria-current=\"step\"` while it is the\n * current one. A locked step renders no body at all, so nothing in it can be\n * reached by Tab. The title carries `tabindex=\"-1\"`, so the caller can move\n * the focus onto it after \"Weiter\" or \"Ändern\". The \"Ändern\" buttons of a\n * wizard read differently, because the accessible name is built from the\n * visible caption and the title of the step (\"Ändern Inhalt\"), which keeps the\n * written word at the start of the spoken one.\n *\n * @example\n * ```html\n * <z-wizard-step title=\"Größe\" state=\"current\">\n * <z-option-group legend=\"Arbeitsspeicher\" [options]=\"stufen\" [(value)]=\"ram\" compact />\n * <button zWizardActions zBtn=\"ghost\" type=\"button\">Zurück</button>\n * <button zWizardActions zBtn=\"secondary\" type=\"button\">Weiter zu Bezahlen</button>\n * </z-wizard-step>\n * ```\n */\n@Component({\n selector: 'z-wizard-step',\n template: `\n <div class=\"z-wstep__head\">\n <span class=\"z-step__num\">{{ nummer() }}</span>\n @switch (headingLevel()) {\n @case (2) {\n <h2 class=\"z-wstep__title\" [attr.id]=\"titelId\" tabindex=\"-1\">{{ title() }}</h2>\n }\n @case (4) {\n <h4 class=\"z-wstep__title\" [attr.id]=\"titelId\" tabindex=\"-1\">{{ title() }}</h4>\n }\n @default {\n <h3 class=\"z-wstep__title\" [attr.id]=\"titelId\" tabindex=\"-1\">{{ title() }}</h3>\n }\n }\n @if (summary()) {\n <span class=\"z-wstep__summary\">{{ summary() }}</span>\n }\n @if (state() === 'done') {\n <!-- The name is built from the visible caption and the title of the\n step, so it always starts with what is written on the button\n (WCAG 2.5.3) even when the caller renames it. -->\n <button\n class=\"z-wstep__edit\"\n type=\"button\"\n [attr.id]=\"knopfId\"\n [attr.aria-labelledby]=\"knopfId + ' ' + titelId\"\n (click)=\"edit.emit()\"\n >\n {{ editLabel() || etiketten.wizardEdit }}\n </button>\n }\n </div>\n @if (state() === 'current') {\n <div class=\"z-wstep__body\">\n <ng-content />\n <div class=\"z-wstep__actions\"><ng-content select=\"[zWizardActions]\" /></div>\n </div>\n }\n `,\n host: {\n class: 'z-wstep',\n role: 'listitem',\n '[class.z-wstep--done]': `state() === 'done'`,\n '[class.z-wstep--locked]': `state() === 'locked'`,\n '[attr.aria-current]': `state() === 'current' ? 'step' : null`,\n // Otherwise the browser hangs its own tooltip on the whole step because of\n // the static attribute title=\"…\".\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZWizardStep {\n /**\n * Title of the step, one noun. Also the accessible name of the \"Ändern\"\n * button, which is how several of them stay distinguishable.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * What the step has decided, for example \"Vanilla, neueste Version\". A\n * finished step shows it in place of its fields, a locked one shows what is\n * still to come. Empty renders nothing.\n *\n * @default ''\n */\n readonly summary = input('');\n\n /**\n * Where the step stands: `done` is collapsed with the summary and \"Ändern\",\n * `current` is open, `locked` renders no body and holds no tab stop.\n *\n * @default 'locked'\n */\n readonly state = input<ZWizardState>('locked');\n\n /**\n * Tag of the title: `2`, `3` or `4`. The reference uses `3`, which fits under\n * the `<h2>` of a section below the page's `<h1>`. The visual size never\n * changes with it.\n *\n * @default 3\n */\n readonly headingLevel = input<2 | 3 | 4, 2 | 3 | 4 | '2' | '3' | '4'>(3, {\n transform: (wert) => Number(wert) as 2 | 3 | 4,\n });\n\n /**\n * Caption of the button on a finished step. Empty falls back to the\n * `wizardEdit` label of the registry.\n *\n * @default ''\n */\n readonly editLabel = input('');\n\n /**\n * Fires when \"Ändern\" is pressed. The caller decides what follows: it usually\n * makes this step the current one again and moves the focus to its title.\n */\n readonly edit = output<void>();\n\n protected readonly etiketten = injectZLabels();\n protected readonly titelId = `z-wstep-t-${++schrittZaehler}`;\n protected readonly knopfId = `z-wstep-e-${schrittZaehler}`;\n private readonly wizard = inject(ZWizard, { optional: true });\n\n /**\n * Position in the wizard, 1-based. It is read from the parent instead of\n * being an input: two sources for the same fact drift apart as soon as a\n * step is added. Outside a wizard the step is number 1.\n */\n protected readonly nummer = computed(() => {\n const alle = this.wizard?.schritte() ?? [];\n return Math.max(alle.indexOf(this), 0) + 1;\n });\n}\n\n/**\n * The steps of an order, one below the other, with the summary next to it in a\n * `z-config`. Two to four steps, a noun as the title of each.\n *\n * Renders the class `z-wizard` on the host and projects the steps. The wizard\n * itself is the progress of the order, so there is no separate progress list\n * next to it, and it numbers its steps itself.\n *\n * Accessibility: the host is a `role=\"list\"` and every `z-wizard-step` a\n * `role=\"listitem\"`, which is what the `<ol>` and `<li>` of the reference\n * stand for. The current step carries `aria-current=\"step\"`.\n *\n * @example\n * ```html\n * <z-wizard>\n * <z-wizard-step title=\"Inhalt\" summary=\"Vanilla, neueste Version\" state=\"done\" />\n * <z-wizard-step title=\"Größe\" state=\"current\">…</z-wizard-step>\n * <z-wizard-step title=\"Bezahlen\" summary=\"Name, Laufzeit\" state=\"locked\" />\n * </z-wizard>\n * ```\n */\n@Component({\n selector: 'z-wizard',\n template: `<ng-content />`,\n host: { class: 'z-wizard', role: 'list' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZWizard {\n // The predicate lands in the static partial declaration, which a JIT consumer\n // evaluates while this class is defined: ZWizardStep has to be declared above.\n /**\n * The projected steps in document order.\n *\n * @internal Wiring between `z-wizard` and its steps, not meant to be read by\n * applications.\n */\n readonly schritte = contentChildren(ZWizardStep);\n}\n","import { ChangeDetectionStrategy, Component, Directive } from '@angular/core';\n\n/**\n * Marks the column next to the form: the `z-price-summary` and, below it, the\n * `z-included-list`. From 900px on it sticks under the header\n * (`top: header + space-5`), below that it moves under the form.\n *\n * @example\n * ```html\n * <div zConfigAside>\n * <z-price-summary price=\"7,74&nbsp;€\">…</z-price-summary>\n * </div>\n * ```\n */\n@Directive({ selector: '[zConfigAside]', host: { class: 'z-config__aside' } })\nexport class ZConfigAside {}\n\n/**\n * Layout of a configurator: the form on the left, the summary on the right.\n *\n * Renders the class `z-config` on the host, a grid of one column that becomes\n * `1fr 340px` from 900px on. Below 900px the summary stands under the form,\n * and a `z-sticky-bar` keeps price and next step in view.\n *\n * @example\n * ```html\n * <z-config>\n * <z-wizard>…</z-wizard>\n * <div zConfigAside>\n * <z-price-summary price=\"7,74&nbsp;€\">…</z-price-summary>\n * </div>\n * </z-config>\n * ```\n */\n@Component({\n selector: 'z-config',\n template: `<ng-content />`,\n host: { class: 'z-config' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZConfig {}\n","import {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n DOCUMENT,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\n\n/** Every bar on the page, so the tallest stuck one sets the room to keep clear. */\nconst lebende = new Set<HTMLElement>();\n\n/** The one scroll and resize listener all bars share, as long as one lives. */\nlet horcher: AbortController | undefined;\n\n/**\n * Marks every bar that really lies at the bottom edge of the viewport with\n * `data-stuck` and writes the height of the tallest of them, or removes the\n * property. A bar that stands in the page instead covers nothing: a framed demo\n * bar, a bar above the fold, and a `mobileOnly` bar from 900px on, which is\n * `display: none` and measures 0 everywhere.\n */\nfunction miss(dokument: Document): void {\n const fenster = dokument.defaultView;\n let hoechste = 0;\n for (const bar of lebende) {\n const kasten = bar.getBoundingClientRect();\n const klebt =\n !!fenster && kasten.height > 0 && Math.abs(kasten.bottom - fenster.innerHeight) <= 1;\n bar.toggleAttribute('data-stuck', klebt);\n if (klebt) {\n hoechste = Math.max(hoechste, kasten.height);\n }\n }\n const wurzel = dokument.documentElement;\n if (hoechste > 0) {\n wurzel.style.setProperty('--z-stickybar', `${Math.round(hoechste)}px`);\n } else {\n wurzel.style.removeProperty('--z-stickybar');\n }\n}\n\n/**\n * Keeps price and next step in view at the bottom edge of small screens, and\n * carries exactly one button.\n *\n * Renders the class `z-stickybar` on the host, the price in\n * `.z-stickybar__price` with the summary of the selection in a `<small>`, and\n * the projected button beside it. `mobileOnly` adds `z-stickybar--mobile`,\n * which hides the bar from 900px on, where the summary sticks next to the form\n * instead. It sticks at `bottom: 0` on `surface-raised` with a 1px line above,\n * and casts no shadow. While it really lies at the bottom edge of the viewport\n * it carries the attribute `data-stuck`, which is what the stylesheet keeps\n * scroll room for.\n *\n * The button is the \"Weiter\" of the current step, \"Kostenpflichtig bestellen\"\n * in the last one; it triggers the same thing as its twin in the summary. The\n * bar also carries a bulk action in a list (\"2 ausgewählt\").\n *\n * @example\n * ```html\n * <z-sticky-bar price=\"7,74&nbsp;€\" summary=\"Minecraft, 4 GB, alle 30 Tage\" mobileOnly>\n * <button zBtn=\"primary\" type=\"button\">Weiter</button>\n * </z-sticky-bar>\n * ```\n */\n@Component({\n selector: 'z-sticky-bar',\n template: `\n <div class=\"z-stickybar__price\">\n {{ price() }}\n @if (summary()) {\n <small>{{ summary() }}</small>\n }\n </div>\n <ng-content />\n `,\n host: {\n class: 'z-stickybar',\n '[class.z-stickybar--mobile]': `mobileOnly()`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZStickyBar {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly dokument = inject(DOCUMENT);\n\n constructor() {\n // A bar at the bottom edge of the viewport covers what is behind it, so a\n // control focused there would be invisible (WCAG 2.4.11). Neither the\n // height nor the fact that it sticks is a literal anywhere: every bar\n // measures both, marks itself with data-stuck while it sticks, and the\n // tallest stuck one lands in --z-stickybar, which the stylesheet turns into\n // scroll-padding. Whether a bar sticks changes with scrolling and with the\n // height of the page, so one passive listener per document watches scroll\n // (in the capture phase, so an inner scroller counts too) and resize, and a\n // ResizeObserver watches the bar and the document. ResizeObserver is\n // missing on the server, where there is no layout to keep clear either.\n const element = this.host.nativeElement;\n lebende.add(element);\n const fenster = this.dokument.defaultView;\n const beobachter =\n typeof ResizeObserver === 'undefined'\n ? undefined\n : new ResizeObserver(() => miss(this.dokument));\n\n afterRenderEffect(() => {\n beobachter?.observe(element);\n beobachter?.observe(this.dokument.documentElement);\n if (fenster && !horcher) {\n horcher = new AbortController();\n for (const art of ['scroll', 'resize'] as const) {\n fenster.addEventListener(art, () => miss(this.dokument), {\n capture: true,\n passive: true,\n signal: horcher.signal,\n });\n }\n }\n miss(this.dokument);\n });\n\n inject(DestroyRef).onDestroy(() => {\n beobachter?.disconnect();\n lebende.delete(element);\n if (!lebende.size) {\n horcher?.abort();\n horcher = undefined;\n // Nothing is left to keep room for, and saying so needs no measuring.\n this.dokument.documentElement.style.removeProperty('--z-stickybar');\n return;\n }\n // Destroying measures nothing. The bars that stay have not moved yet —\n // this runs while the view is being torn down, so their boxes are still\n // the ones from before — and on the server there is no box at all:\n // `getBoundingClientRect` does not exist there, and the application is\n // destroyed right after rendering, which made every page with two bars\n // fail. The remaining bars are measured in the next frame instead, which\n // the server never reaches, because its window has no\n // `requestAnimationFrame`.\n fenster?.requestAnimationFrame?.(() => miss(this.dokument));\n });\n }\n\n /**\n * The price, already formatted by the caller: comma as the decimal mark, a\n * non-breaking space before the currency. Shown in `mono-lg`.\n *\n * @default ''\n */\n readonly price = input('');\n\n /**\n * The selection in a few words, for example \"Minecraft, 4 GB, alle 30 Tage\".\n * Empty leaves the `<small>` out.\n *\n * @default ''\n */\n readonly summary = input('');\n\n /**\n * Hides the bar from 900px on, where `z-price-summary` sticks next to the\n * form. Leave it off for a bulk action bar, which is needed at every width.\n * Boolean attribute.\n *\n * @default false\n */\n readonly mobileOnly = input(false, { transform: booleanAttribute });\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ZIcon } from '../icon';\n\n/**\n * Lists what every plan includes without a surcharge. Three to five entries,\n * each one a concrete part of the product, directly under `z-price-summary`.\n *\n * Renders a `<ul class=\"z-included\">` with a 16px check in `success` per line\n * and the text in `text-muted`. No panel, no heading.\n *\n * Accessibility: the check is decorative (`aria-hidden`), because the list\n * item already says that the entry is included.\n *\n * Only things a customer would otherwise expect to pay extra for. \"Sofort\n * verfügbar\" and \"Jederzeit kündbar\" belong in the note of the summary, and\n * the list appears exactly once per page.\n *\n * @example\n * ```html\n * <z-included-list\n * [items]=\"[\n * 'DDoS-Schutz auf Layer 3/4',\n * 'Webpanel mit Konsole und Dateimanager',\n * 'Automatische Backups',\n * ]\"\n * />\n * ```\n */\n@Component({\n selector: 'z-included-list',\n imports: [ZIcon],\n template: `<ul class=\"z-included\">\n @for (punkt of items(); track $index) {\n <li><z-icon name=\"check\" size=\"sm\" />{{ punkt }}</li>\n }\n </ul>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZIncludedList {\n /**\n * The entries in display order, three to five of them. Tracked by index, so\n * reordering re-renders the lines. An empty array renders an empty `<ul>`.\n *\n * @default []\n */\n readonly items = input<readonly string[]>([]);\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, model, input } from '@angular/core';\n\n/**\n * Folds away settings most visitors do not need: build, Java version, start\n * script. Everything inside has a working default, so nobody has to open it in\n * order to order.\n *\n * Renders a native `<details class=\"z-disclosure\">` with the title in the\n * `<summary>`, the short line in a `<small>` next to it, plus and minus in the\n * mono face, and the projected fields in `.z-disclosure__body`. Unlike `z-faq`\n * it carries a border, because it holds controls.\n *\n * Accessibility: because it is the native element, opening and closing work\n * without JavaScript and the state is announced; the component adds no\n * keyboard handling of its own. The `title` input is kept off the host, so the\n * browser hangs no tooltip of its own on the whole block.\n *\n * Not for required fields, and not to make a long form look shorter. Once\n * something inside is changed, the caller updates {@link summary} so the\n * closed row says so (\"Java 21, eigene Startparameter\").\n *\n * @example\n * ```html\n * <z-disclosure title=\"Expertenmodus\" summary=\"Build, Java-Version, Startscript\" [(open)]=\"expert\">\n * <z-field label=\"Java-Version\" for=\"d-java\">…</z-field>\n * </z-disclosure>\n * ```\n */\n@Component({\n selector: 'z-disclosure',\n template: `<details class=\"z-disclosure\" [open]=\"open()\" (toggle)=\"aufUmschalten($event)\">\n <summary>\n @if (titleMono()) {\n <span class=\"z-mono\">{{ title() }}</span>\n } @else {\n {{ title() }}\n }\n @if (summary()) {\n <small>{{ summary() }}</small>\n }\n </summary>\n <div class=\"z-disclosure__body\"><ng-content /></div>\n </details>`,\n host: {\n // Otherwise the browser hangs its own tooltip on the whole block because\n // of the static attribute title=\"…\".\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZDisclosure {\n /**\n * Name of the section in the `<summary>`, for example \"Expertenmodus\".\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Sets the title in the mono face, for a section named by a technical value\n * such as an endpoint (`GET /api/v1/gameservers`). The title then stands in a\n * `span.z-mono` inside the `<summary>`, which keeps it as the accessible name\n * of the disclosure. Boolean attribute.\n *\n * @default false\n */\n readonly titleMono = input(false, { transform: booleanAttribute });\n\n /**\n * What is inside, in keywords, for example \"Build, Java-Version,\n * Startscript\". Once the visitor changes something in there, the caller\n * writes what that was. Empty renders nothing.\n *\n * @default ''\n */\n readonly summary = input('');\n\n /**\n * Whether the section is open, two-way bindable in both directions: a write\n * opens or closes it, and the visitor's own click reports back through the\n * native `toggle` event.\n *\n * @default false\n */\n readonly open = model(false);\n\n protected aufUmschalten(ereignis: Event): void {\n this.open.set((ereignis.target as HTMLDetailsElement).open);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n model,\n output,\n} from '@angular/core';\nimport { ZButton } from '../button';\n\nlet zaehler = 0;\n\n/**\n * A field with a button that checks or applies the value right away: voucher\n * code, subdomain, a player for the whitelist.\n *\n * Renders a `div.z-field` with the visible label, a\n * `div.z-input-action` holding the `input.z-input` and the secondary button,\n * and below it the feedback: the effect in `.z-field__success`, the reason in\n * `.z-field__error`.\n *\n * Accessibility: the label is a real `<label for>`, never only a placeholder,\n * and \"(optional)\" belongs in it. Enter in the field triggers the button, but\n * not on an empty field and not while it is loading. Success and error are\n * always in the DOM as polite live regions (`role=\"status\"`), so a sentence that\n * appears later is announced; both are tied to the field through\n * `aria-describedby`, and an error also sets `aria-invalid` on it. Polite, not\n * `role=\"alert\"`: the answer belongs to an action the visitor just took, so it\n * waits its turn instead of interrupting whatever is being read.\n *\n * @example\n * ```html\n * <z-input-action\n * label=\"Gutscheincode (optional)\"\n * actionLabel=\"Einlösen\"\n * [(value)]=\"code\"\n * [loading]=\"pruefe()\"\n * [success]=\"erfolg()\"\n * [error]=\"fehler()\"\n * (action)=\"einloesen($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'z-input-action',\n imports: [ZButton],\n template: `\n <div class=\"z-field\">\n @if (label()) {\n <label class=\"z-field__label\" [for]=\"feldId\">{{ label() }}</label>\n }\n <div class=\"z-input-action\">\n <input\n class=\"z-input z-input--mono\"\n type=\"text\"\n [id]=\"feldId\"\n [attr.aria-label]=\"label() ? null : ariaLabel() || null\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"feldId + '-success ' + feldId + '-error'\"\n (input)=\"value.set($any($event.target).value)\"\n (keydown.enter)=\"loesAus($event)\"\n />\n <button\n zBtn=\"secondary\"\n type=\"button\"\n [loading]=\"loading()\"\n [disabled]=\"disabled()\"\n (click)=\"loesAus($event)\"\n >\n {{ actionLabel() }}\n </button>\n </div>\n <!-- Both live regions stand in the markup before their sentence does,\n which is what makes a later sentence announce itself. Empty they are\n inline and generate no line box, so the block stays flat; one shared\n grid item keeps it at one gap instead of two. -->\n <div>\n <span class=\"z-field__success\" [id]=\"feldId + '-success'\" role=\"status\">{{\n success()\n }}</span>\n <span class=\"z-field__error\" [id]=\"feldId + '-error'\" role=\"status\">{{ error() }}</span>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZInputAction {\n /**\n * Visible label above the field. \"(optional)\" belongs in here, not in the\n * placeholder. Empty renders no label element.\n *\n * @default ''\n */\n readonly label = input('');\n\n /**\n * Accessible name of the field where {@link label} is empty, for example in a\n * toolbar. A visible label always wins over it.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * Caption of the button, a verb: \"Einlösen\", \"Prüfen\", \"Hinzufügen\".\n *\n * @default ''\n */\n readonly actionLabel = input('');\n\n /**\n * What stands in the field, two-way bindable. It is also what {@link action}\n * carries.\n *\n * @default ''\n */\n readonly value = model('');\n\n /**\n * The effect of a successful check, for example \"Gutschein ZENIT10\n * eingelöst: −0,77 €\". Empty leaves the line blank.\n *\n * @default ''\n */\n readonly success = input('');\n\n /**\n * Why the check failed, naming cause and next step. Also sets `aria-invalid`\n * on the field and with it the danger border. Empty leaves the line blank.\n *\n * @default ''\n */\n readonly error = input('');\n\n /**\n * While the check runs: the button shows the spinner and is locked, and\n * Enter in the field triggers nothing. Boolean attribute.\n *\n * @default false\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Locks field and button, for example while the order is being sent. Boolean\n * attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Fires with the current value when the button is pressed or Enter is hit in\n * the field. It does not fire on an empty field and not while\n * {@link loading} holds.\n */\n readonly action = output<string>();\n\n protected readonly feldId = `z-input-action-${++zaehler}`;\n\n protected loesAus(ereignis: Event): void {\n ereignis.preventDefault();\n const wert = this.value().trim();\n if (!wert || this.loading() || this.disabled()) {\n return;\n }\n // The trimmed value, because that is what was checked a line above and\n // what every caller would trim again.\n this.action.emit(wert);\n }\n}\n","/**\n * The two rules of the flex tariff, as pure functions. They are public because\n * a caller computes with them too: a sentence next to the chart, a table in a\n * panel, a check in a test. The geometry that draws the chart from them lives\n * in `cost-chart-math.ts` and is internal.\n */\n\n/** A number that can be used: not NaN, not infinite, not negative. */\nfunction zahl(wert: number): number {\n return Number.isFinite(wert) && wert > 0 ? wert : 0;\n}\n\n/**\n * What a month costs after a number of hours: the base amount plus the hourly\n * price, never more than the cap.\n *\n * @param base Base amount per month.\n * @param rate Price per hour, unrounded.\n * @param cap Upper limit per month. A cap below the base amount wins from hour 0.\n * @param hours Hours played; negative counts as 0.\n * @returns The cost, never negative.\n */\nexport function zCostAt(base: number, rate: number, cap: number, hours: number): number {\n const grund = zahl(base);\n const preis = zahl(rate);\n const deckel = zahl(cap);\n const stunden = zahl(hours);\n const offen = grund + preis * stunden;\n return deckel > 0 ? Math.min(deckel, offen) : offen;\n}\n\n/**\n * The hour from which the cap holds: `(cap - base) / rate`, with the unrounded\n * hourly price. Rounding the price first moves the point, which is why the\n * chart never computes with the displayed value: 0,09 € instead of 0,088 €\n * turns 100 hours into 98.\n *\n * @param base Base amount per month.\n * @param rate Price per hour, unrounded.\n * @param cap Upper limit per month.\n * @returns The hour, `0` when the cap is already reached at hour 0, and `null`\n * when it is never reached, which is the case for a price of 0 per hour.\n */\nexport function zCostCapHour(base: number, rate: number, cap: number): number | null {\n const grund = zahl(base);\n const preis = zahl(rate);\n const deckel = zahl(cap);\n if (deckel <= 0) {\n return null;\n }\n if (deckel <= grund) {\n return 0;\n }\n if (preis <= 0) {\n return null;\n }\n // Rounded to a millionth: (10,30 - 1,50) / 0,088 lands on 100.00000000000001\n // in binary floating point, and a cap hour of \"101\" would follow from it.\n return Math.round(((deckel - grund) / preis) * 1e6) / 1e6;\n}\n","import { zCostAt, zCostCapHour } from './cost-chart-rules';\n\n/**\n * The geometry behind `z-cost-chart`, as pure functions: where the cap takes\n * over, what an hour costs, how that maps onto the drawing area and which\n * ticks the axes get. Nothing in here touches the DOM, so every rule is\n * testable on its own and the component stays a template.\n */\n\n/** The drawing area of a chart, in viewBox units, which are CSS pixels. *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport interface ZChartArea {\n /** Width of the viewBox, which is the measured width of the plot. */\n width: number;\n /** Height of the viewBox. Fixed, so the type never scales. */\n height: number;\n /** Left edge of the plot, where the value axis stands. */\n x0: number;\n /** Right edge of the plot. */\n x1: number;\n /** Baseline of the plot, the zero of the value axis. */\n y0: number;\n /** Top edge of the plot. */\n y1: number;\n}\n\n/**\n * The drawing area of the reference (CostChart/preview.html). It is the width\n * the chart draws with before it has measured itself.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport const Z_CHART_AREA: ZChartArea = {\n width: 520,\n height: 240,\n x0: 48,\n x1: 508,\n y0: 200,\n y1: 20,\n};\n\n/**\n * The drawing area for a measured width. One viewBox unit is one CSS pixel, so\n * the 12px axis type renders at 12px at every width instead of shrinking with\n * a fixed viewBox.\n *\n * @param width Measured width of the plot in CSS pixels.\n * @returns The area; 240px is the floor, so a plot narrower than that draws\n * at 240 units and the svg scales those down rather than letting the type fall\n * below its own size everywhere else.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostArea(width: number): ZChartArea {\n const breite = Math.max(240, Number.isFinite(width) && width > 0 ? width : Z_CHART_AREA.width);\n return { ...Z_CHART_AREA, width: breite, x1: breite - 12 };\n}\n\n/** One tick of an axis: what it says and where it sits. *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport interface ZChartTick {\n /** The value the tick stands for. */\n value: number;\n /** Its coordinate in viewBox units. */\n pos: number;\n}\n\n/** Everything the template of `z-cost-chart` draws, in viewBox units. *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport interface ZChartGeometry {\n /** The drawing area this geometry was built for. */\n area: ZChartArea;\n /** Hours the time axis runs to, at least 1. */\n maxHours: number;\n /** Value the value axis runs to, always above the highest cost drawn. */\n maxValue: number;\n /** Hour from which the cap holds, or `null` when it is never reached on this axis. */\n capHour: number | null;\n /** `x` of that hour, or `null` along with {@link capHour}. */\n capX: number | null;\n /** `y` of the cap line, or `null` when the cap lies outside the value axis. */\n capY: number | null;\n /** The cost line as the `points` of a `<polyline>`. */\n line: string;\n /** `y` of the base amount at hour 0, where the first direct label sits. */\n baseY: number;\n /** Ticks of the value axis, from 0 upwards. */\n valueTicks: ZChartTick[];\n /** Ticks of the time axis, from 0 upwards. */\n hourTicks: ZChartTick[];\n /** Support points of the table below the chart, the cap hour among them. */\n tableHours: number[];\n}\n\n/** A number that can be drawn: not NaN, not infinite, not negative. */\nfunction zahl(wert: number): number {\n return Number.isFinite(wert) && wert > 0 ? wert : 0;\n}\n\n/**\n * Maps an hour onto the horizontal axis.\n *\n * @param hours The hour; outside the axis it is clamped to its edge.\n * @param maxHours Hours the axis runs to.\n * @param area The drawing area, from {@link zCostArea}.\n * @returns The `x` in viewBox units.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostX(hours: number, maxHours: number, area: ZChartArea = Z_CHART_AREA): number {\n const spanne = Math.max(1, zahl(maxHours));\n return area.x0 + (Math.min(Math.max(zahl(hours), 0), spanne) / spanne) * (area.x1 - area.x0);\n}\n\n/**\n * The distance between two ticks of the time axis, wide enough that the labels\n * do not collide: every label needs about 110px of room.\n *\n * @param maxHours Hours the axis runs to.\n * @param plotWidth Width of the plot between the two axes, in pixels. One\n * label needs about 110px of room.\n * @returns The step, always greater than 0, and never below one whole hour.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostHourStep(maxHours: number, plotWidth: number): number {\n const stunden = Math.max(1, zahl(maxHours));\n // One label needs about 110px of room, ticks included, so at 520px four of\n // them fit and at 360px the axis thins itself out instead of colliding.\n const hoechstens = Math.max(2, Math.round(zahl(plotWidth) / 110) + 1);\n let schritt = zCostStep(stunden / Math.max(1, hoechstens - 1));\n // A round step can still yield one tick too many; the next round step up\n // thins the axis without giving up the round numbers.\n while (Math.floor(stunden / schritt) + 1 > hoechstens) {\n schritt = zCostStep(schritt * 2.5);\n }\n // Hours are whole: a quarter-hour tick would read \"0.25 h\".\n return Math.max(1, schritt);\n}\n\n/**\n * Maps an amount onto the vertical axis.\n *\n * @param value The amount; outside the axis it is clamped to its edge.\n * @param maxValue Amount the axis runs to.\n * @returns The `y` in viewBox units.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostY(value: number, maxValue: number, area: ZChartArea = Z_CHART_AREA): number {\n const spanne = Math.max(Number.EPSILON, zahl(maxValue));\n return area.y0 - (Math.min(Math.max(zahl(value), 0), spanne) / spanne) * (area.y0 - area.y1);\n}\n\n/**\n * The largest \"round\" number at or below a span: 1, 2, 2.5 or 5 times a power\n * of ten. It is what makes the ticks read as 0, 5, 10 instead of 0, 4.1, 8.2.\n *\n * @param spanne The span one tick should roughly cover.\n * @returns The step, always greater than 0.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostStep(spanne: number): number {\n const weite = zahl(spanne);\n if (weite <= 0) {\n return 1;\n }\n const zehner = 10 ** Math.floor(Math.log10(weite));\n for (const teil of [5, 2.5, 2, 1]) {\n if (zehner * teil <= weite) {\n return zehner * teil;\n }\n }\n return zehner / 10;\n}\n\n/**\n * The ticks of one axis: 0, step, 2·step … up to the last one that still fits\n * into the span.\n *\n * @param spanne Highest value the axis has to show.\n * @param step Distance between two ticks, from {@link zCostStep}.\n * @returns The values, 0 first, at most twelve of them.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostTicks(spanne: number, step: number): number[] {\n const weite = zahl(spanne);\n const schritt = zahl(step) || 1;\n const ticks: number[] = [];\n for (let wert = 0; wert <= weite + schritt / 1000 && ticks.length < 12; wert += schritt) {\n // Adding a float twelve times drifts; rounding on the step grid does not.\n ticks.push(Math.round(wert / schritt) * schritt);\n }\n return ticks;\n}\n\n/**\n * Everything the chart draws, derived from the four numbers the caller gives.\n *\n * @param base Base amount per month.\n * @param rate Price per hour, unrounded.\n * @param cap Upper limit per month.\n * @param maxHours Hours the time axis runs to; anything at or below 0 becomes 1.\n * @returns The geometry in viewBox units of {@link Z_CHART_AREA}.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostGeometry(\n base: number,\n rate: number,\n cap: number,\n maxHours: number,\n width: number = Z_CHART_AREA.width,\n): ZChartGeometry {\n const area = zCostArea(width);\n const stunden = Math.max(1, zahl(maxHours));\n const grund = zahl(base);\n const deckel = zahl(cap);\n\n const hoechste = Math.max(grund, zCostAt(base, rate, cap, stunden));\n const wertSchritt = zCostStep(hoechste / 2);\n // Half a step of headroom above the highest point, so the direct label of\n // the cap has room and never leaves the plot.\n const maxValue = Math.max(hoechste + wertSchritt / 2, wertSchritt);\n\n const x = (h: number) => zCostX(h, stunden, area);\n const y = (v: number) => zCostY(v, maxValue, area);\n\n const knick = zCostCapHour(base, rate, cap);\n const knickSichtbar = knick !== null && knick <= stunden;\n const punkte = [`${x(0)},${y(zCostAt(base, rate, cap, 0))}`];\n if (knickSichtbar) {\n punkte.push(`${x(knick)},${y(deckel)}`);\n }\n punkte.push(`${x(stunden)},${y(zCostAt(base, rate, cap, stunden))}`);\n\n const stundenSchritt = zCostHourStep(stunden, area.x1 - area.x0);\n\n return {\n area,\n maxHours: stunden,\n maxValue,\n capHour: knickSichtbar ? knick : null,\n capX: knickSichtbar ? x(knick) : null,\n capY: deckel > 0 && deckel <= maxValue ? y(deckel) : null,\n line: punkte.join(' '),\n baseY: y(zCostAt(base, rate, cap, 0)),\n valueTicks: zCostTicks(hoechste, wertSchritt).map((value) => ({ value, pos: y(value) })),\n hourTicks: zCostTicks(stunden, stundenSchritt).map((value) => ({ value, pos: x(value) })),\n tableHours: zCostTableHours(knickSichtbar ? knick : null, stunden),\n };\n}\n\n/**\n * The support points of the table: four hours that carry the shape, the cap\n * hour among them when it lies on the axis.\n *\n * @param capHour The hour the cap takes over, or `null`.\n * @param maxHours Hours the time axis runs to.\n * @returns The hours in ascending order, without duplicates.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostTableHours(capHour: number | null, maxHours: number): number[] {\n // Rounded up, not to the nearest: the cap holds from the hour the line\n // reaches it, and 2,2 h rounded down to 2 would name an hour that still\n // costs less than the cap.\n const ende = capHour !== null && capHour > 0 ? Math.ceil(capHour) : Math.ceil(zahl(maxHours));\n const stufen = [0, Math.round(ende / 4), Math.round(ende / 2), ende];\n return [...new Set(stufen)].sort((a, b) => a - b);\n}\n\n/**\n * The hour a pointer or the keyboard has landed on, as a whole number on the\n * axis.\n *\n * @param anteil Position across the plot, 0 at the left edge, 1 at the right.\n * @param maxHours Hours the time axis runs to.\n * @returns The hour, between 0 and `maxHours`.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostHourAt(anteil: number, maxHours: number): number {\n const stunden = Math.max(1, zahl(maxHours));\n const teil = Number.isFinite(anteil) ? Math.min(Math.max(anteil, 0), 1) : 0;\n return Math.round(teil * stunden);\n}\n","import {\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n numberAttribute,\n signal,\n viewChild,\n} from '@angular/core';\nimport { injectZLabels } from '../labels';\nimport {\n Z_CHART_AREA,\n zCostArea,\n zCostGeometry,\n zCostHourAt,\n zCostX,\n zCostY,\n} from './cost-chart-math';\nimport { zCostAt } from './cost-chart-rules';\n\nlet zaehler = 0;\n\n/**\n * Shows how flex costs grow with the hours played and where the cap takes\n * over. One series, so no legend and no series colour: the line is 2px in\n * `text`, the cap a dashed line in `border-control`, no fill, no gradient.\n *\n * Renders the class `z-chart` on the host: the two figures above the chart,\n * a plain SVG with grid, axes, line and the two direct labels, the caption as\n * a sentence and a native `details` with the same numbers as a real table.\n *\n * The cap hour is computed, never written down: `(cap − base) / rate` with the\n * unrounded hourly price. The figure above the chart shows that price rounded\n * to the cent, and with those rounded 0,09 € the point would land on 98 hours\n * instead of 100.\n *\n * Accessibility: the SVG carries `<title>` and `<desc>` and is a `role=\"img\"`\n * named by them. The plot around it is the interactive part and therefore not\n * an image: it is a `role=\"slider\"` over the hours, which is exactly the\n * keyboard contract the chart offers (left and right move the hour, Home and\n * End jump to the ends), and `aria-valuetext` reads the tooltip out\n * (\"50 h gespielt: 5,90 €\"). Pointer and focus show the same cursor, the hit\n * area is the whole plot, and the tooltip stays inside it. Below the chart the\n * table carries every number again, for anyone who would rather read than\n * point. Nothing animates.\n *\n * @example\n * ```html\n * <z-cost-chart\n * [base]=\"1.5\"\n * [rate]=\"0.088\"\n * [cap]=\"10.3\"\n * [maxHours]=\"150\"\n * caption=\"Normal mit 4 GB: 1,50 € Grundbetrag plus 0,09 € je Stunde, nie mehr als 10,30 € im Monat.\"\n * />\n * ```\n */\n@Component({\n selector: 'z-cost-chart',\n template: `\n <div class=\"z-chart__figures\">\n <div class=\"z-chart__figure\">\n <span>{{ etiketten.chartPerHour }}</span\n ><strong>{{ etiketten.chartMoney(stundenpreis()) }}</strong>\n </div>\n @if (deckelBetrag() > 0) {\n <div class=\"z-chart__figure\">\n <span>{{ etiketten.chartCapPerMonth }}</span\n ><strong>{{ etiketten.chartMoney(deckelBetrag()) }}</strong>\n </div>\n }\n </div>\n\n <div\n #plot\n class=\"z-chart__plot\"\n tabindex=\"0\"\n role=\"slider\"\n aria-orientation=\"horizontal\"\n [attr.aria-label]=\"etiketten.chartTitle\"\n aria-valuemin=\"0\"\n [attr.aria-valuemax]=\"geometrie().maxHours\"\n [attr.aria-valuenow]=\"stunde()\"\n [attr.aria-valuetext]=\"ablesung()\"\n (pointermove)=\"aufZeiger($event)\"\n (pointerleave)=\"zeiger.set(false)\"\n (focus)=\"zeiger.set(true)\"\n (blur)=\"zeiger.set(false)\"\n (keydown)=\"aufTaste($event)\"\n >\n <svg\n [attr.viewBox]=\"'0 0 ' + flaeche().width + ' ' + flaeche().height\"\n role=\"img\"\n focusable=\"false\"\n [attr.aria-labelledby]=\"titelId + ' ' + beschreibungId\"\n >\n <title [attr.id]=\"titelId\">{{ etiketten.chartTitle }}</title>\n <desc [attr.id]=\"beschreibungId\">{{ satz() }}</desc>\n\n @for (tick of geometrie().valueTicks; track tick.value) {\n <line\n class=\"z-chart__grid\"\n [attr.x1]=\"flaeche().x0\"\n [attr.x2]=\"flaeche().x1\"\n [attr.y1]=\"tick.pos\"\n [attr.y2]=\"tick.pos\"\n />\n <text\n class=\"z-chart__axis\"\n [attr.x]=\"flaeche().x0 - 8\"\n [attr.y]=\"tick.pos + 4\"\n text-anchor=\"end\"\n >\n {{ etiketten.chartAxisMoney(tick.value) }}\n </text>\n }\n @for (tick of geometrie().hourTicks; track tick.value; let letzte = $last) {\n <text\n class=\"z-chart__axis\"\n [attr.x]=\"tick.pos\"\n [attr.y]=\"flaeche().y0 + 24\"\n [attr.text-anchor]=\"letzte ? 'end' : 'middle'\"\n >\n {{ etiketten.chartAxisHours(tick.value) }}\n </text>\n }\n\n @if (geometrie().capY !== null) {\n <line\n class=\"z-chart__cap\"\n [attr.x1]=\"flaeche().x0\"\n [attr.x2]=\"flaeche().x1\"\n [attr.y1]=\"geometrie().capY\"\n [attr.y2]=\"geometrie().capY\"\n />\n }\n <polyline class=\"z-chart__line\" [attr.points]=\"geometrie().line\" />\n @if (geometrie().capX !== null) {\n <circle\n class=\"z-chart__marker\"\n [attr.cx]=\"geometrie().capX\"\n [attr.cy]=\"geometrie().capY\"\n r=\"5\"\n />\n @if (knickStunde() > 0) {\n <text\n class=\"z-chart__label\"\n [attr.x]=\"geometrie().capX\"\n [attr.y]=\"(geometrie().capY ?? 0) - 15\"\n [attr.text-anchor]=\"knickAnker()\"\n >\n {{ etiketten.chartCapLabel(knickStunde()) }}\n </text>\n }\n }\n <text\n class=\"z-chart__label\"\n [attr.x]=\"flaeche().x0 + 8\"\n [attr.y]=\"grundY()\"\n text-anchor=\"start\"\n >\n {{ etiketten.chartBaseLabel(grundbetrag()) }}\n </text>\n\n @if (zeiger()) {\n <line\n class=\"z-chart__cross\"\n [attr.x1]=\"zeigerX()\"\n [attr.x2]=\"zeigerX()\"\n [attr.y1]=\"flaeche().y1\"\n [attr.y2]=\"flaeche().y0\"\n />\n <circle class=\"z-chart__marker\" [attr.cx]=\"zeigerX()\" [attr.cy]=\"zeigerY()\" r=\"5\" />\n }\n </svg>\n @if (zeiger()) {\n <div #tip class=\"z-chart__tip\" [style.left.px]=\"tipLinks()\" [style.top.px]=\"tipOben()\">\n {{ etiketten.chartPlayed(stunde()) }}:\n <strong>{{ etiketten.chartMoney(kostenJetzt()) }}</strong>\n </div>\n }\n </div>\n\n @if (caption()) {\n <span class=\"z-chart__caption\">{{ caption() }}</span>\n }\n\n <details class=\"z-faq\">\n <summary>{{ etiketten.chartTable }}</summary>\n <div class=\"z-table-wrap\">\n <table class=\"z-table\">\n <thead>\n <tr>\n <th scope=\"col\">{{ etiketten.chartTableHours }}</th>\n <th scope=\"col\" class=\"z-table__num\">{{ etiketten.chartTableCost }}</th>\n </tr>\n </thead>\n <tbody>\n @for (stunden of geometrie().tableHours; track stunden; let letzte = $last) {\n <tr>\n <td>\n {{\n letzte && geometrie().capHour !== null\n ? etiketten.chartTableCapRow(stunden)\n : stunden\n }}\n </td>\n <td class=\"z-table__num\">\n {{\n etiketten.chartMoney(\n letzte && geometrie().capHour !== null ? deckelBetrag() : kostenBei(stunden)\n )\n }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </details>\n `,\n host: { class: 'z-chart' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZCostChart {\n /**\n * Base amount per month, the value the line starts at.\n *\n * @default 0\n */\n readonly base = input(0, { transform: numberAttribute });\n\n /**\n * Price per hour, unrounded. The figure above the chart shows it rounded to\n * the cent; the cap hour is computed from this value, because the rounded\n * one moves the point.\n *\n * @default 0\n */\n readonly rate = input(0, { transform: numberAttribute });\n\n /**\n * Upper limit per month. From the hour it is reached the line runs flat.\n *\n * @default 0\n */\n readonly cap = input(0, { transform: numberAttribute });\n\n /**\n * Hours the time axis runs to. Anything at or below 0 becomes 1.\n *\n * @default 0\n */\n readonly maxHours = input(0, { transform: numberAttribute });\n\n /**\n * One sentence that says the chart in words, below it. Empty leaves it out;\n * the table stays either way.\n *\n * @default ''\n */\n readonly caption = input('');\n\n protected readonly etiketten = injectZLabels();\n protected readonly titelId = `z-chart-t-${++zaehler}`;\n protected readonly beschreibungId = `z-chart-d-${zaehler}`;\n\n private readonly plot = viewChild.required<ElementRef<HTMLElement>>('plot');\n private readonly tip = viewChild<ElementRef<HTMLElement>>('tip');\n\n /** Measured width of the plot. One viewBox unit is one pixel of it. */\n private readonly breite = signal(Z_CHART_AREA.width);\n /** Measured width of the tooltip, so it can be kept inside the plot. */\n private readonly tipBreite = signal(0);\n\n /** The hour the cursor asks for, before the axis has its say. */\n private readonly gewaehlteStunde = signal(0);\n /** Whether cross, dot and tooltip are shown: on hover and while focused. */\n protected readonly zeiger = signal(false);\n\n protected readonly flaeche = computed(() => zCostArea(this.breite()));\n\n protected readonly geometrie = computed(() =>\n zCostGeometry(this.base(), this.rate(), this.cap(), this.maxHours(), this.breite()),\n );\n\n /**\n * The hour under the cursor, clamped to the axis. A shrinking `maxHours`\n * would otherwise leave `aria-valuenow` past `aria-valuemax`.\n */\n protected readonly stunde = computed(() =>\n Math.min(Math.max(this.gewaehlteStunde(), 0), this.geometrie().maxHours),\n );\n\n // Rounded up, like the table: the cap holds from the hour the line reaches it.\n protected readonly knickStunde = computed(() => Math.ceil(this.geometrie().capHour ?? 0));\n\n /** The cap label leaves the plot at the right edge unless the anchor moves. */\n protected readonly knickAnker = computed(() => {\n const flaeche = this.flaeche();\n const x = this.geometrie().capX ?? 0;\n if (x > flaeche.x1 - 80) {\n return 'end';\n }\n return x < flaeche.x0 + 80 ? 'start' : 'middle';\n });\n\n /**\n * The base label sits under the start of the line, and above it where the\n * line starts so low that the label would fall out of the plot.\n */\n protected readonly grundY = computed(() => {\n const y = this.geometrie().baseY;\n return y + 16 > this.flaeche().y0 + 4 ? y - 8 : y + 16;\n });\n\n /**\n * The sentence for the screen reader. Without a cap on the axis it must not\n * claim one, so a second label carries that case. Every number goes through\n * the same guard the drawing uses, so no label ever reads \"NaN\".\n */\n protected readonly satz = computed(() => {\n const geo = this.geometrie();\n const grund = this.zahl(this.base());\n const preis = this.zahl(this.rate());\n if (geo.capHour === null) {\n return this.etiketten.chartDescOpen(grund, preis);\n }\n return this.etiketten.chartDesc(grund, preis, this.zahl(this.cap()), this.knickStunde());\n });\n\n protected readonly kostenJetzt = computed(() => this.kostenBei(this.stunde()));\n\n protected readonly ablesung = computed(\n () =>\n `${this.etiketten.chartPlayed(this.stunde())}: ${this.etiketten.chartMoney(this.kostenJetzt())}`,\n );\n\n protected readonly zeigerX = computed(() =>\n zCostX(this.stunde(), this.geometrie().maxHours, this.flaeche()),\n );\n protected readonly zeigerY = computed(() =>\n zCostY(this.kostenJetzt(), this.geometrie().maxValue, this.flaeche()),\n );\n\n /** Beside the cursor, and inside the plot: measured, not guessed. */\n protected readonly tipLinks = computed(() => {\n const abstand = 8;\n const breite = this.flaeche().width;\n const tip = this.tipBreite();\n const rechts = this.zeigerX() + abstand;\n const links = this.zeigerX() - tip - abstand;\n return Math.max(0, rechts + tip > breite ? Math.min(links, breite - tip) : rechts);\n });\n\n /** Above the dot, never past the top edge of the plot. */\n protected readonly tipOben = computed(() => Math.max(0, this.zeigerY() - 36));\n\n constructor() {\n // The viewBox follows the measured width, so one unit stays one pixel and\n // the 12px axis type is 12px at 360px too. ResizeObserver is missing on the\n // server and in a test environment without layout; the chart then keeps the\n // width of the reference, which is what it renders with anyway.\n const beobachter =\n typeof ResizeObserver === 'undefined'\n ? undefined\n : new ResizeObserver((eintraege) => {\n for (const eintrag of eintraege) {\n // The border box, not contentRect: the tooltip has a border and\n // padding, and clamping it by its content alone lets it hang out\n // of the plot by exactly that much.\n const element = eintrag.target as HTMLElement;\n const breite = element.offsetWidth || eintrag.contentRect.width;\n if (element === this.plot().nativeElement) {\n this.breite.set(breite);\n } else {\n this.tipBreite.set(breite);\n }\n }\n });\n\n afterRenderEffect(() => {\n const tip = this.tip()?.nativeElement;\n beobachter?.observe(this.plot().nativeElement);\n if (tip) {\n beobachter?.observe(tip);\n } else {\n this.tipBreite.set(0);\n }\n });\n\n inject(DestroyRef).onDestroy(() => beobachter?.disconnect());\n }\n\n /** Not NaN, not infinite, not negative: what a label may be handed. */\n private zahl(wert: number): number {\n return Number.isFinite(wert) && wert > 0 ? wert : 0;\n }\n\n protected readonly grundbetrag = computed(() => this.zahl(this.base()));\n protected readonly stundenpreis = computed(() => this.zahl(this.rate()));\n protected readonly deckelBetrag = computed(() => this.zahl(this.cap()));\n\n protected kostenBei(stunden: number): number {\n return zCostAt(this.base(), this.rate(), this.cap(), stunden);\n }\n\n protected aufZeiger(ereignis: PointerEvent): void {\n const kasten = this.plot().nativeElement.getBoundingClientRect();\n if (!kasten.width) {\n return;\n }\n const { x0, x1 } = this.flaeche();\n const inViewBox = ereignis.clientX - kasten.left;\n this.gewaehlteStunde.set(zCostHourAt((inViewBox - x0) / (x1 - x0), this.geometrie().maxHours));\n this.zeiger.set(true);\n }\n\n protected aufTaste(ereignis: KeyboardEvent): void {\n const grenze = this.geometrie().maxHours;\n // About thirty presses cross the whole axis, whatever it runs to.\n const schritt = Math.max(1, Math.round(grenze / 30));\n const ziel: Record<string, number> = {\n ArrowRight: this.stunde() + schritt,\n ArrowUp: this.stunde() + schritt,\n ArrowLeft: this.stunde() - schritt,\n ArrowDown: this.stunde() - schritt,\n Home: 0,\n End: grenze,\n };\n if (!(ereignis.key in ziel)) {\n return;\n }\n ereignis.preventDefault();\n this.gewaehlteStunde.set(Math.min(Math.max(ziel[ereignis.key], 0), grenze));\n this.zeiger.set(true);\n }\n}\n","// Only the component and the two rules a caller computes with leave the\n// package. The geometry behind the chart is marked @internal and stays in\n// cost-chart-math.ts, where the spec imports it directly.\nexport * from './cost-chart-rules';\nexport * from './cost-chart';\n","/* Package konfigurator: OptionCard, Combobox, Wizard, Config, StickyBar,\n IncludedList, Disclosure, InputAction and CostChart.\n\n The two rules of the flex tariff come from their file directly: a re-export\n one level deeper is dropped from the published types. */\nexport * from '../configurator';\nexport * from '../cost-chart';\nexport * from '../cost-chart/cost-chart-rules';\n","/*\n * Plain TypeScript without a single import, on purpose: `ng add zenit-ui`\n * needs the same script, and schematics are compiled apart from the library\n * (CommonJS, no DOM types, `rootDir: schematics`). A byte-identical copy of\n * this file therefore lives at `schematics/ng-add/init-script.ts`; the test in\n * `schematics/ng-add/index.spec.ts` fails as soon as the two differ. Edit this\n * file, then copy it over.\n */\n\n/**\n * The part of the theme configuration that decides which attributes end up on\n * the page. {@link ZThemeConfig} extends it; {@link zenitThemeInitScript}\n * takes exactly this part.\n */\nexport interface ZThemeInitConfig {\n /**\n * Ids of the selectable colour schemes. Each id is written to the target as\n * `data-theme=\"<id>\"` and needs a matching CSS block; the ids shipped with\n * the library are `dark`, `light` and `contrast`. Own ids are allowed and are\n * validated against exactly this list.\n *\n * @default ['dark', 'light', 'contrast']\n */\n readonly schemes?: readonly string[];\n\n /**\n * Ids of the selectable accents, written as `data-accent=\"<id>\"`. The entry\n * named by {@link defaultAccent} carries no attribute, because the default\n * accent already lives in `tokens.css` and in the scheme blocks.\n *\n * @default ['rot', 'blau', 'gruen', 'violett']\n */\n readonly accents?: readonly string[];\n\n /**\n * Scheme before the first choice of the user. Either one of {@link schemes}\n * or `'system'`, which follows the operating system: `contrast` while\n * `prefers-contrast: more` matches and `contrast` is one of {@link schemes},\n * otherwise `dark` or `light` after `prefers-color-scheme`.\n *\n * @default 'dark'\n */\n readonly defaultScheme?: string;\n\n /**\n * Accent before the first choice of the user. It has to be one of\n * {@link accents} and gets no `data-accent` attribute.\n *\n * @default 'rot'\n */\n readonly defaultAccent?: string;\n\n /**\n * Key under which the choice is stored in `localStorage`. `null` turns the\n * storage off: nothing is read or written, and `ZTheme` starts from the\n * `data-theme` and `data-accent` that are already on the target, which is how\n * an application with its own preference storage hands its choice over.\n * Without such attributes the theme starts from the defaults on every load.\n * The init script does not look at them, it always writes the defaults.\n *\n * @default 'zenit-theme'\n */\n readonly storageKey?: string | null;\n}\n\n/** @internal Defaults shared by `ZTheme` and the init script. */\nexport const THEME_STANDARD: Required<ZThemeInitConfig> = {\n schemes: ['dark', 'light', 'contrast'],\n accents: ['rot', 'blau', 'gruen', 'violett'],\n defaultScheme: 'dark',\n defaultAccent: 'rot',\n storageKey: 'zenit-theme',\n};\n\n/** @internal The scheme id that hands the decision to the operating system. */\nexport const SCHEMA_SYSTEM = 'system';\n/** @internal The scheme `system` resolves to while `prefers-contrast: more` matches. */\nexport const SCHEMA_KONTRAST = 'contrast';\n/** @internal */\nexport const SCHEMA_DUNKEL = 'dark';\n/** @internal */\nexport const SCHEMA_HELL = 'light';\n/** @internal */\nexport const ABFRAGE_DUNKEL = '(prefers-color-scheme: dark)';\n/** @internal */\nexport const ABFRAGE_KONTRAST = '(prefers-contrast: more)';\n/** @internal */\nexport const ATTRIBUT_SCHEMA = 'data-theme';\n/** @internal */\nexport const ATTRIBUT_AKZENT = 'data-accent';\n\n/** @internal Merges a config onto the defaults, ignoring fields left out or `undefined`. */\nexport function themeEinstellung<T extends ZThemeInitConfig>(\n config: T,\n): T & Required<ZThemeInitConfig> {\n const gesetzt = Object.fromEntries(\n Object.entries(config).filter(([, wert]) => wert !== undefined),\n ) as T;\n return { ...THEME_STANDARD, ...gesetzt };\n}\n\n/**\n * The script body. Written for every browser that can run the library and a\n * few older ones (no arrow functions, no `let`), because it runs before any\n * build step had a say. It mirrors what `ZTheme` does on start: read the stored\n * choice, drop unknown ids, resolve `system`, write `data-theme` and, unless\n * the accent is the default, `data-accent` onto `<html>`. Without `matchMedia`\n * `system` resolves to `dark`, as in the service.\n */\nconst RUMPF =\n '(function(k,S,A,ds,da){' +\n 'var s=ds,a=da,d=document.documentElement,' +\n 'm=function(q,f){try{return matchMedia(q).matches}catch(e){return f}};' +\n \"try{var v=JSON.parse((k&&localStorage.getItem(k))||'null');\" +\n \"if(v&&typeof v==='object'){\" +\n `if(v.scheme==='${SCHEMA_SYSTEM}'||S.indexOf(v.scheme)>-1)s=v.scheme;` +\n 'if(A.indexOf(v.accent)>-1)a=v.accent}}catch(e){}' +\n `if(s==='${SCHEMA_SYSTEM}')s=S.indexOf('${SCHEMA_KONTRAST}')>-1&&m('${ABFRAGE_KONTRAST}',false)?'${SCHEMA_KONTRAST}':` +\n `m('${ABFRAGE_DUNKEL}',true)?'${SCHEMA_DUNKEL}':'${SCHEMA_HELL}';` +\n `d.setAttribute('${ATTRIBUT_SCHEMA}',s);` +\n `if(a!==da)d.setAttribute('${ATTRIBUT_AKZENT}',a)` +\n '})';\n\n/**\n * JSON that is safe inside `<script>`: `<` would close the element\n * (`</script>`, `<!--`), U+2028 and U+2029 end a line in old engines. The\n * pattern is built here and not at module level, so an application that never\n * calls the function does not keep it in its bundle.\n */\nfunction alsLiteral(wert: unknown): string {\n const heikel = new RegExp('[<' + String.fromCharCode(0x2028, 0x2029) + ']', 'g');\n return JSON.stringify(wert).replace(\n heikel,\n (zeichen) => '\\\\u' + zeichen.charCodeAt(0).toString(16).padStart(4, '0'),\n );\n}\n\n/**\n * Returns the source of a small script that applies the stored or the default\n * theme before the first paint. `ZTheme` can only do that once Angular has\n * started, which is several frames late: a user who chose `light` would see\n * the dark default flash on every load.\n *\n * Put the result into a `<script>` as early in `<head>` as possible, in front\n * of every stylesheet, and pass the same config as to `provideZenitTheme`. The\n * script always writes to `<html>`; with a custom `target` it is of no use.\n * It is a pure string function: no DOM access, safe on the server and in a\n * build script, and the result contains no `eval`.\n *\n * The stylesheet has to block rendering as well. The Angular CLI inlines\n * \"critical\" CSS and loads the rest late; `[data-theme=\"light\"]` is never\n * critical, because nothing in `index.html` matches it. Set\n * `optimization.styles.inlineCritical` to `false` in the `production`\n * configuration of the build target; `ng add zenit-ui --themes` writes both\n * the script and that setting.\n *\n * With a Content Security Policy the returned string is what you hash\n * (`sha256`) or what goes into the `<script nonce=\"…\">` element.\n *\n * @param config The same values as for `provideZenitTheme`; `target` is ignored.\n * @returns The script body, without the `<script>` tags.\n *\n * @example\n * ```ts\n * // server.ts or a build script\n * const head = `<script nonce=\"${nonce}\">${zenitThemeInitScript({ defaultScheme: 'system' })}</script>`;\n * ```\n */\nexport function zenitThemeInitScript(config: ZThemeInitConfig = {}): string {\n const e = themeEinstellung(config);\n const argumente = [e.storageKey, e.schemes, e.accents, e.defaultScheme, e.defaultAccent].map(\n alsLiteral,\n );\n return `${RUMPF}(${argumente.join(',')})`;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n DestroyRef,\n DOCUMENT,\n EnvironmentProviders,\n InjectionToken,\n PLATFORM_ID,\n Service,\n computed,\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n signal,\n} from '@angular/core';\nimport {\n ABFRAGE_DUNKEL,\n ABFRAGE_KONTRAST,\n ATTRIBUT_AKZENT,\n ATTRIBUT_SCHEMA,\n SCHEMA_DUNKEL,\n SCHEMA_HELL,\n SCHEMA_KONTRAST,\n SCHEMA_SYSTEM,\n ZThemeInitConfig,\n themeEinstellung,\n} from './init-script';\n\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * Configuration of {@link provideZenitTheme}. Every field is optional; the\n * defaults match the stylesheets shipped in `zenit-ui/styles/themes.css`.\n *\n * @example\n * ```ts\n * provideZenitTheme({\n * schemes: ['dark', 'light', 'contrast', 'sepia'],\n * defaultScheme: 'system',\n * storageKey: 'meine-app-theme',\n * });\n * ```\n */\nexport interface ZThemeConfig extends ZThemeInitConfig {\n /**\n * Element that carries `data-theme` and `data-accent`. A getter, not the\n * element, so nothing touches the DOM while the providers are built; it is\n * called on the browser only. Return a stable element: when the getter\n * starts returning another one, the attributes are removed from the previous\n * element on the next change, not before. `zenitThemeInitScript` and the\n * server-side rendering of `data-theme` only know `<html>` and are skipped\n * for a custom target.\n *\n * @default () => document.documentElement\n */\n readonly target?: () => Element;\n}\n\nconst Z_THEME_CONFIG = new InjectionToken<ZThemeConfig>('Z_THEME_CONFIG', {\n providedIn: 'root',\n factory: () => ({}),\n});\n\n/** The config each service instance was built from, for the check in the provider. */\nconst GENUTZTE_CONFIG = /* @__PURE__ */ new WeakMap<object, ZThemeConfig>();\n\n/** Dev-mode only; production builds drop the branch together with `ngDevMode`. */\nfunction warnen(text: string): void {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n console.warn(`zenit-ui: ${text}`);\n }\n}\n\n/**\n * Registers the theme of the library and applies the stored or the default\n * choice as soon as the application starts. Without this provider `ZTheme`\n * still works, but with the defaults and nothing applied up front.\n *\n * Application root only. `ZTheme` is a root service and reads the config of\n * the root injector once; a second `provideZenitTheme` in the `providers` of a\n * route (or a second one at the root) is ignored, with a `console.warn` in dev\n * mode.\n *\n * \"As soon as the application starts\" is still several frames after the first\n * paint. To avoid a flash of the default scheme put the output of\n * {@link zenitThemeInitScript} as an inline `<script>` at the top of the\n * `<head>` of `index.html`, in front of every stylesheet, and pass it the same\n * config as this function.\n *\n * The stylesheets are not part of this: register\n * `zenit-ui/styles/themes.css` after `zenit-ui/styles/tokens.css` and before\n * `zenit-ui/styles/zenit-ui.css`. Without it only the `dark` scheme exists and\n * `setScheme('light')` changes nothing visible.\n *\n * **The page width is not an option here, and deliberately so.** It is the\n * custom property `--container`, the only value `.z-container` reads, and an\n * application sets it once in its own stylesheet, after `zenit-ui.css`:\n * `:root { --container: 1440px; }`. Use `:root`, not `html`: `:root` is a\n * pseudo-class and weighs as much as the block in\n * `zenit-ui/styles/tokens.css`, so the later declaration wins, while a bare\n * `html` selector weighs less and would lose wherever it stood. An option here\n * would have to write an inline style, which can never arrive earlier than\n * that stylesheet: unlike a colour scheme the width does not depend on a\n * stored user choice, so there is no flash to prevent, on the server or in the\n * browser, and `zenitThemeInitScript` takes no width either. Running text\n * keeps `--measure` (65ch) however wide the page gets; a sidebar\n * (`--sidebar`), the aside of a configurator and every overlay keep their own\n * width as well. An application that changes the width while the page is open\n * writes the inline style itself.\n *\n * @default --container 1120px, from `zenit-ui/styles/tokens.css`\n *\n * @param config Deviations from the defaults; see {@link ZThemeConfig}.\n * @returns Providers for the application root (`bootstrapApplication`).\n *\n * @example\n * ```ts\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [provideRouter(routes), provideZenitTheme({ defaultScheme: 'system' })],\n * };\n * ```\n */\nexport function provideZenitTheme(config: ZThemeConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: Z_THEME_CONFIG, useValue: config },\n provideEnvironmentInitializer(() => {\n if (GENUTZTE_CONFIG.get(inject(ZTheme)) !== config) {\n warnen(\n 'provideZenitTheme() was called more than once or outside the application root. ' +\n 'ZTheme is a root service and uses one config only; this one is ignored.',\n );\n }\n }),\n ]);\n}\n\n/**\n * Reads and switches the colour scheme and the accent. The service owns three\n * readonly signals and three methods; everything else is CSS.\n *\n * What it does on the browser: it writes `data-theme` and `data-accent` onto\n * the target element, keeps the choice in `localStorage`, follows a change made\n * in another tab (`storage` event), and while the scheme is `'system'` it\n * follows `prefers-color-scheme` and `prefers-contrast` live. With\n * `storageKey: null` it never touches `localStorage` and starts from the\n * attributes that are already on the target, if they name registered ids. On the server\n * `window`, `matchMedia` and `localStorage` are never touched, so the service\n * is safe to inject during SSR and reports the defaults. The one thing it does\n * there: a `defaultScheme` other than `'system'` is written as `data-theme`\n * onto `<html>` of the server document, so the delivered HTML already carries\n * it.\n *\n * Unknown ids are rejected: {@link setScheme} and {@link setAccent} return\n * `false` and change nothing. They do not throw, because the usual caller is a\n * `<select>` whose value comes from outside the application (a stored value, a\n * query parameter) and a broken value there must not take the page down; in\n * dev mode a `console.warn` names the id. A stored unknown id is ignored the\n * same way.\n *\n * @example\n * ```ts\n * @Component({\n * selector: 'app-theme-switch',\n * template: `\n * <select [value]=\"theme.scheme()\" (change)=\"waehlen($event)\">\n * <option value=\"dark\">Dunkel</option>\n * <option value=\"light\">Hell</option>\n * <option value=\"system\">System</option>\n * </select>\n * <p>Aktiv: {{ theme.resolvedScheme() }}</p>\n * `,\n * })\n * export class ThemeSwitch {\n * protected readonly theme = inject(ZTheme);\n *\n * protected waehlen(event: Event): void {\n * this.theme.setScheme((event.target as HTMLSelectElement).value);\n * }\n * }\n * ```\n */\n@Service()\nexport class ZTheme {\n private readonly dok = inject(DOCUMENT);\n private readonly imBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly config = inject(Z_THEME_CONFIG);\n private readonly einst = themeEinstellung(this.config);\n\n private readonly gewaehltesSchema = signal(this.einst.defaultScheme);\n private readonly gewaehlterAkzent = signal(this.einst.defaultAccent);\n private readonly systemDunkel = signal(true);\n private readonly systemKontrast = signal(false);\n\n /** The element written to last, so a changed `target` leaves no attributes behind. */\n private letztesZiel: Element | null = null;\n\n /**\n * The chosen scheme, exactly as it was set: one of `schemes`, or `'system'`\n * while the operating system decides. For what is actually on the page, read\n * {@link resolvedScheme}.\n */\n readonly scheme = this.gewaehltesSchema.asReadonly();\n\n /**\n * The chosen accent. The default accent is a value here as well, even though\n * it carries no attribute on the target.\n */\n readonly accent = this.gewaehlterAkzent.asReadonly();\n\n /**\n * The scheme that is applied. Equal to {@link scheme}, except for `'system'`:\n * that resolves to `'contrast'` while `prefers-contrast: more` matches and\n * `'contrast'` is one of `schemes`, otherwise to `'dark'` or `'light'` after\n * `prefers-color-scheme`. Both follow a change without a reload.\n */\n readonly resolvedScheme = computed(() => this.aufgeloest(this.gewaehltesSchema()));\n\n private aufgeloest(gewaehlt: string): string {\n if (gewaehlt !== SCHEMA_SYSTEM) {\n return gewaehlt;\n }\n if (this.systemKontrast() && this.einst.schemes.includes(SCHEMA_KONTRAST)) {\n return SCHEMA_KONTRAST;\n }\n return this.systemDunkel() ? SCHEMA_DUNKEL : SCHEMA_HELL;\n }\n\n constructor() {\n GENUTZTE_CONFIG.set(this, this.config);\n if (!this.kenntSchema(this.einst.defaultScheme)) {\n warnen(`defaultScheme \"${this.einst.defaultScheme}\" is neither \"system\" nor one of schemes.`);\n }\n if (!this.einst.accents.includes(this.einst.defaultAccent)) {\n warnen(`defaultAccent \"${this.einst.defaultAccent}\" is not one of accents.`);\n }\n\n if (!this.imBrowser) {\n // The server knows neither the stored choice nor the operating system,\n // so only a fixed default can go into the HTML. A custom target is a\n // browser-only getter and stays untouched.\n if (!this.einst.target && this.einst.defaultScheme !== SCHEMA_SYSTEM) {\n this.dok.documentElement?.setAttribute(ATTRIBUT_SCHEMA, this.einst.defaultScheme);\n }\n return;\n }\n\n const zerstoert = inject(DestroyRef);\n const fenster = this.dok.defaultView;\n const folgen = (abfrageText: string, ziel: { set(wert: boolean): void }) => {\n const abfrage = fenster?.matchMedia?.(abfrageText);\n if (!abfrage) {\n return;\n }\n ziel.set(abfrage.matches);\n const beiWechsel = (ereignis: MediaQueryListEvent) => {\n ziel.set(ereignis.matches);\n this.anwenden();\n };\n // Optional calls: test doubles and old engines only know addListener.\n abfrage.addEventListener?.('change', beiWechsel);\n zerstoert.onDestroy(() => abfrage.removeEventListener?.('change', beiWechsel));\n };\n folgen(ABFRAGE_DUNKEL, this.systemDunkel);\n folgen(ABFRAGE_KONTRAST, this.systemKontrast);\n\n const key = this.einst.storageKey;\n if (key && fenster) {\n // Another tab changed or dropped the choice. `key` is null after clear().\n const beiSpeicher = (ereignis: StorageEvent) => {\n if (ereignis.key === null || ereignis.key === key) {\n this.uebernehmen();\n }\n };\n fenster.addEventListener('storage', beiSpeicher);\n zerstoert.onDestroy(() => fenster.removeEventListener('storage', beiSpeicher));\n }\n\n this.uebernehmen();\n }\n\n /**\n * Switches the scheme and stores the choice.\n *\n * @param id One of `schemes`, or `'system'`.\n * @returns `false` if the id is unknown; nothing changes then.\n */\n setScheme(id: string): boolean {\n if (!this.kenntSchema(id)) {\n warnen(`setScheme(\"${id}\") ignored, the id is neither \"system\" nor one of schemes.`);\n return false;\n }\n this.gewaehltesSchema.set(id);\n this.sichern();\n this.anwenden();\n return true;\n }\n\n /**\n * Switches the accent and stores the choice.\n *\n * @param id One of `accents`.\n * @returns `false` if the id is unknown; nothing changes then.\n */\n setAccent(id: string): boolean {\n if (!this.einst.accents.includes(id)) {\n warnen(`setAccent(\"${id}\") ignored, the id is not one of accents.`);\n return false;\n }\n this.gewaehlterAkzent.set(id);\n this.sichern();\n this.anwenden();\n return true;\n }\n\n /** Back to `defaultScheme` and `defaultAccent` and drops the stored choice. */\n reset(): void {\n this.gewaehltesSchema.set(this.einst.defaultScheme);\n this.gewaehlterAkzent.set(this.einst.defaultAccent);\n this.vergessen();\n this.anwenden();\n }\n\n private kenntSchema(id: string): boolean {\n return id === SCHEMA_SYSTEM || this.einst.schemes.includes(id);\n }\n\n /** Takes the stored choice, the defaults where nothing valid is stored, and applies it. */\n private uebernehmen(): void {\n const gespeichert = this.einst.storageKey ? this.lesen() : this.vomZiel();\n const schema = gespeichert?.scheme;\n const akzent = gespeichert?.accent;\n this.gewaehltesSchema.set(\n typeof schema === 'string' && this.kenntSchema(schema) ? schema : this.einst.defaultScheme,\n );\n this.gewaehlterAkzent.set(\n typeof akzent === 'string' && this.einst.accents.includes(akzent)\n ? akzent\n : this.einst.defaultAccent,\n );\n this.anwenden();\n }\n\n /**\n * Without a storage key the attributes already on the target are the stored\n * choice: an application that keeps its own preference storage writes them\n * with its own inline script before the first paint, and overwriting them\n * with the defaults would flash the default scheme until that application\n * calls `setScheme()`.\n *\n * An attribute only carries a resolved scheme. One that equals what the\n * default resolves to is therefore no choice at all: it is what the init\n * script or the server wrote, and `system` has to stay `system` to keep\n * following the operating system.\n */\n private vomZiel(): { scheme?: unknown; accent?: unknown } {\n const ziel = this.einst.target ? this.einst.target() : this.dok.documentElement;\n const schema = ziel.getAttribute(ATTRIBUT_SCHEMA);\n return {\n scheme: schema === this.aufgeloest(this.einst.defaultScheme) ? null : schema,\n accent: ziel.getAttribute(ATTRIBUT_AKZENT),\n };\n }\n\n /**\n * Writes both attributes. The default accent gets none, so a page without a\n * choice looks exactly like a page that never heard of this service.\n */\n private anwenden(): void {\n if (!this.imBrowser) {\n return;\n }\n const ziel = this.einst.target ? this.einst.target() : this.dok.documentElement;\n if (this.letztesZiel && this.letztesZiel !== ziel) {\n this.letztesZiel.removeAttribute(ATTRIBUT_SCHEMA);\n this.letztesZiel.removeAttribute(ATTRIBUT_AKZENT);\n }\n this.letztesZiel = ziel;\n ziel.setAttribute(ATTRIBUT_SCHEMA, this.resolvedScheme());\n if (this.gewaehlterAkzent() === this.einst.defaultAccent) {\n ziel.removeAttribute(ATTRIBUT_AKZENT);\n } else {\n ziel.setAttribute(ATTRIBUT_AKZENT, this.gewaehlterAkzent());\n }\n }\n\n /**\n * `localStorage` throws in a private window and when site data is blocked,\n * and it is the property access itself that throws (`SecurityError`).\n */\n private speicher(): Storage | null {\n if (!this.imBrowser || !this.einst.storageKey) {\n return null;\n }\n try {\n return this.dok.defaultView?.localStorage ?? null;\n } catch {\n return null;\n }\n }\n\n private lesen(): { scheme?: unknown; accent?: unknown } | null {\n const key = this.einst.storageKey;\n if (!key) {\n return null;\n }\n try {\n const roh = this.speicher()?.getItem(key);\n const wert: unknown = roh ? JSON.parse(roh) : null;\n return wert && typeof wert === 'object' ? wert : null;\n } catch {\n return null;\n }\n }\n\n private sichern(): void {\n const key = this.einst.storageKey;\n if (!key) {\n return;\n }\n try {\n this.speicher()?.setItem(\n key,\n JSON.stringify({ scheme: this.gewaehltesSchema(), accent: this.gewaehlterAkzent() }),\n );\n } catch {\n // Private window, quota, blocked site data: the theme still works, it\n // just does not survive the reload.\n }\n }\n\n private vergessen(): void {\n const key = this.einst.storageKey;\n if (!key) {\n return;\n }\n try {\n this.speicher()?.removeItem(key);\n } catch {\n // See sichern().\n }\n }\n}\n","/* Package theming: ZTheme and provideZenitTheme.\n\n The colour values themselves are CSS: zenit-ui/styles/themes.css next to\n tokens.css. This package only switches between them. See docs/theming.md. */\n\nexport * from '../theme';\n","/*\n * Public API of the zenit-ui library.\n */\n\nexport * from './lib/icon';\nexport * from './lib/spinner';\nexport * from './lib/button';\nexport * from './lib/badge';\nexport * from './lib/field';\nexport * from './lib/panel';\nexport * from './lib/skip-link';\n\nexport * from './lib/pakete/formulare';\nexport * from './lib/pakete/navigation';\nexport * from './lib/pakete/daten';\nexport * from './lib/pakete/rueckmeldung';\nexport * from './lib/pakete/overlays';\nexport * from './lib/pakete/werkzeuge';\nexport * from './lib/pakete/konfigurator';\n\nexport * from './lib/labels';\nexport * from './lib/pakete/theming';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["laufendeNummer","zaehler","unbewegt","zahl"],"mappings":"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"}
1
+ {"version":3,"file":"zenit-hosting-zenit-ui.mjs","sources":["../../../projects/zenit-ui/src/lib/icon/icon.ts","../../../projects/zenit-ui/src/lib/a11y/host-attribute.ts","../../../projects/zenit-ui/src/lib/spinner/spinner.ts","../../../projects/zenit-ui/src/lib/button/button.ts","../../../projects/zenit-ui/src/lib/badge/badge.ts","../../../projects/zenit-ui/src/lib/field/field.ts","../../../projects/zenit-ui/src/lib/field/input.ts","../../../projects/zenit-ui/src/lib/field/input-group.ts","../../../projects/zenit-ui/src/lib/field/select.ts","../../../projects/zenit-ui/src/lib/panel/panel.ts","../../../projects/zenit-ui/src/lib/skip-link/skip-link.ts","../../../projects/zenit-ui/src/lib/checkbox/checkbox.ts","../../../projects/zenit-ui/src/lib/toggle/toggle.ts","../../../projects/zenit-ui/src/lib/toggle/setting.ts","../../../projects/zenit-ui/src/lib/labels/labels.ts","../../../projects/zenit-ui/src/lib/slider/slider.ts","../../../projects/zenit-ui/src/lib/segment/segment.ts","../../../projects/zenit-ui/src/lib/pakete/formulare.ts","../../../projects/zenit-ui/src/lib/navigation/tabs.ts","../../../projects/zenit-ui/src/lib/navigation/tab-group.ts","../../../projects/zenit-ui/src/lib/navigation/stepper.ts","../../../projects/zenit-ui/src/lib/navigation/sidebar.ts","../../../projects/zenit-ui/src/lib/navigation/app-header.ts","../../../projects/zenit-ui/src/lib/navigation/page-header.ts","../../../projects/zenit-ui/src/lib/navigation/footer.ts","../../../projects/zenit-ui/src/lib/pakete/navigation.ts","../../../projects/zenit-ui/src/lib/metric/metric.ts","../../../projects/zenit-ui/src/lib/rows/rows.ts","../../../projects/zenit-ui/src/lib/table/table.ts","../../../projects/zenit-ui/src/lib/table/sort-header.ts","../../../projects/zenit-ui/src/lib/pagination/pagination.ts","../../../projects/zenit-ui/src/lib/pakete/daten.ts","../../../projects/zenit-ui/src/lib/feedback/alert.ts","../../../projects/zenit-ui/src/lib/feedback/empty-state.ts","../../../projects/zenit-ui/src/lib/feedback/skeleton.ts","../../../projects/zenit-ui/src/lib/toast/toast.ts","../../../projects/zenit-ui/src/lib/toast/toast-outlet.ts","../../../projects/zenit-ui/src/lib/tooltip/tooltip-panel.ts","../../../projects/zenit-ui/src/lib/tooltip/tooltip.ts","../../../projects/zenit-ui/src/lib/pakete/rueckmeldung.ts","../../../projects/zenit-ui/src/lib/dialog/dialog-layout.ts","../../../projects/zenit-ui/src/lib/dialog/confirm-dialog.ts","../../../projects/zenit-ui/src/lib/dialog/dialog.ts","../../../projects/zenit-ui/src/lib/menu/menu.ts","../../../projects/zenit-ui/src/lib/pakete/overlays.ts","../../../projects/zenit-ui/src/lib/console/console.ts","../../../projects/zenit-ui/src/lib/marketing/hero.ts","../../../projects/zenit-ui/src/lib/marketing/game-tile.ts","../../../projects/zenit-ui/src/lib/marketing/price-summary.ts","../../../projects/zenit-ui/src/lib/marketing/spec-list.ts","../../../projects/zenit-ui/src/lib/marketing/faq.ts","../../../projects/zenit-ui/src/lib/pakete/werkzeuge.ts","../../../projects/zenit-ui/src/lib/configurator/option-group.ts","../../../projects/zenit-ui/src/lib/configurator/combobox.ts","../../../projects/zenit-ui/src/lib/configurator/wizard.ts","../../../projects/zenit-ui/src/lib/configurator/config.ts","../../../projects/zenit-ui/src/lib/configurator/sticky-bar.ts","../../../projects/zenit-ui/src/lib/configurator/included-list.ts","../../../projects/zenit-ui/src/lib/configurator/disclosure.ts","../../../projects/zenit-ui/src/lib/configurator/input-action.ts","../../../projects/zenit-ui/src/lib/cost-chart/cost-chart-rules.ts","../../../projects/zenit-ui/src/lib/cost-chart/cost-chart-math.ts","../../../projects/zenit-ui/src/lib/cost-chart/cost-chart.ts","../../../projects/zenit-ui/src/lib/cost-chart/index.ts","../../../projects/zenit-ui/src/lib/pakete/konfigurator.ts","../../../projects/zenit-ui/src/lib/theme/init-script.ts","../../../projects/zenit-ui/src/lib/theme/theme.ts","../../../projects/zenit-ui/src/lib/pakete/theming.ts","../../../projects/zenit-ui/src/public-api.ts","../../../projects/zenit-ui/src/zenit-hosting-zenit-ui.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Material Icons ligature. The icon is always decorative: the host carries a\n * fixed `aria-hidden=\"true\"`, so the meaning has to come from the visible text\n * next to it or from an `aria-label` on the surrounding control.\n *\n * Renders the ligature name as the host's text content, with the classes\n * `material-icons z-icon` and `z-icon--sm` for the small size. An icon belongs\n * only where it helps to find something again: sidebar, toolbars, buttons with\n * an action. Not in front of headings, panel titles or facts.\n *\n * @example\n * ```html\n * <button zBtn=\"primary\"><z-icon name=\"add\" />Server erstellen</button>\n * <z-badge status=\"success\" dot>Online</z-badge>\n * <z-icon name=\"dns\" size=\"sm\" />\n * ```\n */\n@Component({\n selector: 'z-icon',\n template: `{{ name() }}`,\n host: {\n class: 'material-icons z-icon',\n '[class.z-icon--sm]': `size() === 'sm'`,\n 'aria-hidden': 'true',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZIcon {\n /**\n * Name of the Material Icons ligature, for example `dns`, `restart_alt` or\n * `more_vert`. Required.\n */\n readonly name = input.required<string>();\n\n /**\n * Rendered size: `md` is the regular 20px icon, `sm` the 16px variant used\n * inside badges and small buttons. Adds `z-icon--sm` for `sm`.\n *\n * @default 'md'\n */\n readonly size = input<'sm' | 'md'>('md');\n}\n","import { DestroyRef, effect, ElementRef, inject } from '@angular/core';\n\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * An attribute a caller may plausibly write is never owned by a host binding.\n * `[attr.role]`, `[attr.aria-label]` or `[attr.tabindex]` with an expression\n * that evaluates to `null` **removes** the attribute, so a value the caller\n * wrote, static or bound, is silently deleted the moment the library has\n * nothing of its own to say there. The two helpers here are the two ways out.\n *\n * @module\n */\n\n/**\n * Borrows a single-valued attribute: the library writes it only while it has a\n * value, and gives back the **latest** value of the caller when it no longer\n * does.\n *\n * The rule for the caller: while the library input is set the library value\n * wins, while it is unset the caller's attribute stands, static as well as\n * bound. A binding of the caller keeps writing while the library holds the\n * attribute, and every value it writes would otherwise win, so a\n * `MutationObserver` runs for as long as the value is borrowed: it notes the\n * new value as the one to give back and asserts the library value again. It\n * runs only while borrowed, and writing the value that already stands there is\n * skipped, so it cannot answer its own record; `takeRecords` drops the echo of\n * an own write for the same reason.\n *\n * Runs in an injection context on the host element and reads `wert`\n * reactively, so it belongs in a field initialiser or a constructor.\n *\n * @internal Wiring inside the library, not part of the public API.\n */\nexport function leiheAttribut(attribut: string, wert: () => string | null): void {\n const wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n /** What the caller last wrote, and what it gets back; `undefined` while free. */\n let geliehen: string | null | undefined;\n /** The library value currently asserted, `null` while nothing is borrowed. */\n let meins: string | null = null;\n let beobachter: MutationObserver | undefined;\n\n /** A write of the caller landed while the library held the attribute. */\n const halte = (): void => {\n const steht = wirt.getAttribute(attribut);\n if (meins === null || steht === meins) {\n return;\n }\n geliehen = steht;\n wirt.setAttribute(attribut, meins);\n beobachter?.takeRecords();\n };\n\n effect(() => {\n const neu = wert();\n if (neu !== null) {\n const steht = wirt.getAttribute(attribut);\n // Anything but the library's own value is the caller's latest word, also\n // when the observer has not been called for it yet.\n if (geliehen === undefined || steht !== meins) {\n geliehen = steht;\n }\n meins = neu;\n if (steht !== neu) {\n wirt.setAttribute(attribut, neu);\n beobachter?.takeRecords();\n }\n // Not every environment has a MutationObserver: on the server the value\n // is written, only the re-assertion against a caller is missing.\n if (!beobachter && typeof MutationObserver !== 'undefined') {\n beobachter = new MutationObserver(halte);\n }\n beobachter?.observe(wirt, { attributes: true, attributeFilter: [attribut] });\n return;\n }\n beobachter?.disconnect();\n if (geliehen === undefined) {\n return;\n }\n // A value the caller wrote after the last observer run still counts.\n if (wirt.getAttribute(attribut) !== meins) {\n geliehen = wirt.getAttribute(attribut);\n }\n const zurueck = geliehen;\n geliehen = undefined;\n meins = null;\n if (zurueck === null) {\n wirt.removeAttribute(attribut);\n } else {\n wirt.setAttribute(attribut, zurueck);\n }\n });\n\n inject(DestroyRef).onDestroy(() => beobachter?.disconnect());\n}\n\n/**\n * Which end of which attribute is taken on an element, so a second writer on\n * the same end is caught instead of freezing the page. Development only; the\n * element is the key, so nothing is kept alive by it.\n */\nconst BELEGT = new WeakMap<Element, Set<string>>();\n\n/**\n * One token of the library inside an attribute that holds a list of them,\n * `aria-describedby` above all. Several writers share such an attribute: the\n * caller writes its own ids, a `z-field` links its hint or error, a `zTooltip`\n * adds the id of its panel while it stands. Each of them owns exactly one\n * token and leaves the others alone.\n *\n * The token keeps a fixed end of the list, which is what makes two writers on\n * the same element settle instead of pushing each other around: a description\n * that belongs to the control sits at the front, a passing addition such as a\n * tooltip at the back, and the caller's own tokens keep their order in\n * between.\n *\n * **The invariant: at most one writer per attribute and end on one element.**\n * Two writers claiming the same end move the token past each other for as long\n * as the page lives, which is a frozen tab, not a wrong attribute. A second\n * claim on the same end therefore throws in development; in production the\n * check is compiled away, so keep it covered by a test.\n *\n * While a token stands, a `MutationObserver` watches the attribute, because\n * the caller may rewrite it as a whole: a binding of its own going to another\n * value deletes every foreign token in one go, and the token is put back then.\n * Writing is skipped when nothing changes and the record of an own write is\n * dropped with `takeRecords`, so the observer cannot answer itself: Chromium\n * queues a record for a `setAttribute` with an unchanged value as well, and\n * answering that record with another write freezes the tab in the microtask\n * checkpoint.\n *\n * @internal Wiring inside the library, not part of the public API.\n */\nexport class ZTokenAttribut {\n /** The token this writer currently has in the list, `null` for none. */\n private meins: string | null = null;\n /** Lives only while a token stands. */\n private beobachter?: MutationObserver;\n /** Whether this writer currently holds the end; see {@link BELEGT}. */\n private beansprucht = false;\n private readonly schluessel: string;\n\n constructor(\n private readonly wirt: HTMLElement,\n private readonly attribut: string,\n /** Which end of the list this token keeps. */\n private readonly platz: 'vorn' | 'hinten',\n ) {\n this.schluessel = `${attribut}:${platz}`;\n }\n\n /**\n * Puts this writer's token into the list, or takes it out again with `null`.\n * Every other token stays, and none appears twice.\n */\n setze(token: string | null): void {\n this.beanspruche(token !== null);\n const steht = this.wirt.getAttribute(this.attribut);\n const werte = (steht ?? '')\n .split(/\\s+/)\n .filter((wert) => wert && wert !== this.meins && wert !== token);\n if (token) {\n if (this.platz === 'vorn') {\n werte.unshift(token);\n } else {\n werte.push(token);\n }\n }\n this.meins = token;\n const soll = werte.join(' ');\n if (soll !== (steht ?? '')) {\n if (soll) {\n this.wirt.setAttribute(this.attribut, soll);\n } else if (steht !== null) {\n this.wirt.removeAttribute(this.attribut);\n }\n // The record of this write is the observer's own echo and would call it\n // one more time for nothing. `takeRecords` drops exactly that one: no\n // other script can have run since the write, and everything the caller\n // queued before was already delivered to the callback that is running.\n this.beobachter?.takeRecords();\n }\n if (!token) {\n this.loese();\n return;\n }\n // Not every environment has a MutationObserver: on the server the token is\n // written, only the answer to a caller rewriting the attribute is missing.\n if (!this.beobachter && typeof MutationObserver !== 'undefined') {\n this.beobachter = new MutationObserver(() => this.setze(this.meins));\n }\n this.beobachter?.observe(this.wirt, { attributes: true, attributeFilter: [this.attribut] });\n }\n\n /** Claims this end of the list, or lets it go. Development only. */\n private beanspruche(dazu: boolean): void {\n if (typeof ngDevMode !== 'undefined' && !ngDevMode) {\n return;\n }\n if (this.beansprucht === dazu) {\n return;\n }\n const belegt = BELEGT.get(this.wirt) ?? new Set<string>();\n if (dazu && belegt.has(this.schluessel)) {\n throw new Error(\n `zenit-ui: two writers keep the ${this.platz === 'vorn' ? 'front' : 'back'} of ` +\n `\"${this.attribut}\" on the same element. One of them has to take the other end, ` +\n `otherwise the two move their token past each other for as long as the page lives.`,\n );\n }\n if (dazu) {\n belegt.add(this.schluessel);\n BELEGT.set(this.wirt, belegt);\n } else {\n belegt.delete(this.schluessel);\n }\n this.beansprucht = dazu;\n }\n\n /** Stops watching. Whatever stands in the attribute stays there. */\n loese(): void {\n this.beobachter?.disconnect();\n this.beobachter = undefined;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\nimport { leiheAttribut } from '../a11y/host-attribute';\n\n/**\n * Loading indicator. Renders an empty host with the class `z-spinner`; the ring\n * itself comes from the stylesheet.\n *\n * Accessibility depends on `label`: with a label the host becomes a status\n * message (`role=\"status\"` plus that label as `aria-label`), without one it is\n * decorative and carries `aria-hidden=\"true\"`. A caller that writes its own\n * `role` or `aria-label` on `<z-spinner>` keeps them: the input wins while it\n * holds a value, the caller's attributes stand while it does not, and a\n * spinner the caller named itself is not hidden either. A button that is working shows\n * its own spinner through `loading` on `zBtn`; lists use `z-skeleton` instead.\n * The one list that does not is the panel of `z-combobox`: a `role=\"listbox\"`\n * takes options, and a skeleton row has no accessible name, so the waiting row\n * there carries a decorative spinner beside its word.\n *\n * @example\n * ```html\n * <z-panel title=\"Auslastung\" busy>\n * <z-spinner label=\"Wird geladen\" />\n * </z-panel>\n * ```\n */\n@Component({\n selector: 'z-spinner',\n template: ``,\n host: {\n class: 'z-spinner',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSpinner {\n /**\n * Text announced while loading, for example `Wird geladen`. An empty string\n * keeps the spinner decorative and hidden from assistive technology, unless\n * the caller named the spinner itself.\n *\n * @default ''\n */\n readonly label = input('');\n\n constructor() {\n const wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n // Both as borrowed attributes, not as host bindings: a host binding writes\n // `null` as soon as `label` is empty and thereby deletes the `role` and\n // the `aria-label` of the caller.\n leiheAttribut('role', () => (this.label() ? 'status' : null));\n leiheAttribut('aria-label', () => this.label() || null);\n\n /**\n * Only a spinner that nobody names is decorative. The question is asked of\n * the element, not of the static attributes at construction: a caller that\n * binds `[attr.aria-label]` has written nothing yet at that point, and its\n * name would be hidden behind `aria-hidden=\"true\"` for good.\n */\n const messen = (): void => {\n if (this.label() || wirt.hasAttribute('role') || wirt.hasAttribute('aria-label')) {\n wirt.removeAttribute('aria-hidden');\n } else {\n wirt.setAttribute('aria-hidden', 'true');\n }\n };\n // Third effect on purpose: effects of one injection context run in the\n // order they were created, so both borrows above have given their\n // attributes back by the time this one reads the element.\n effect(messen);\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n // The caller may name the spinner at any time, and take the name back.\n const beobachter = new MutationObserver(messen);\n beobachter.observe(wirt, { attributes: true, attributeFilter: ['role', 'aria-label'] });\n inject(DestroyRef).onDestroy(() => beobachter.disconnect());\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\nimport { leiheAttribut } from '../a11y/host-attribute';\nimport { ZSpinner } from '../spinner';\n\n/**\n * The four button variants. `primary` is the one main action per screen,\n * `secondary` every further action, `ghost` cancel and icon actions in\n * toolbars, `danger` only irreversible actions.\n */\nexport type ZButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';\n\n/**\n * Triggers an action, on a native `<button>` or on an `<a>`. The component\n * brings no element of its own: it attaches to the host through the attribute\n * `zBtn`, so links keep their `href` and their routing.\n *\n * Renders the class `z-btn` on the host plus one variant class\n * (`z-btn--primary`, `z-btn--secondary`, `z-btn--ghost`, `z-btn--danger`) and,\n * where set, `z-btn--sm`, `z-btn--lg`, `z-btn--icon` and `z-btn--block`. Size\n * `md` adds no class. The content is projected as is; while {@link loading} is\n * set a `z-spinner` sits in front of it.\n *\n * Accessibility: on a `<button>`, {@link disabled} sets the native `disabled`\n * attribute, so a deliberately locked button leaves the tab order.\n * {@link loading} sets `aria-busy=\"true\"` and `aria-disabled=\"true\"` instead\n * and swallows click, Enter and Space, but leaves the button focusable: the\n * button that triggered the action keeps the focus while it spins, and a\n * submit button in a form blocks the implicit submission from Enter in a field\n * as well. With both set, `disabled` wins and the lock is native. An `<a>`\n * cannot be disabled natively, so it gets `aria-disabled=\"true\"` and\n * `tabindex=\"-1\"` instead, and the click is swallowed. A caller may also write\n * `aria-disabled=\"true\"` onto a `<button>`, statically or through\n * `[attr.aria-disabled]`: the button then stays focusable and can explain the\n * reason in a tooltip, which a real `disabled` would prevent, and its click is\n * swallowed as well. The attribute is only borrowed while the library locks:\n * its `\"true\"` wins then, and the caller's latest value comes back when the\n * lock goes. Icon-only buttons need an `aria-label` from the caller.\n *\n * The component never touches `type`: the native default stays, so a\n * `<button zBtn>` inside a form submits it. A button that only triggers an\n * action therefore carries `type=\"button\"` from the caller.\n *\n * @example\n * ```html\n * <button zBtn=\"primary\" size=\"lg\" [loading]=\"laeuft()\">Server erstellen</button>\n * <button zBtn=\"ghost\" iconOnly size=\"sm\" aria-label=\"Mehr\"><z-icon name=\"more_vert\" /></button>\n * <a zBtn routerLink=\"/user/server\">Alle anzeigen</a>\n * ```\n */\n@Component({\n selector: 'button[zBtn], a[zBtn]',\n imports: [ZSpinner],\n template: `@if (loading()) {\n <z-spinner />\n }\n <ng-content />`,\n host: {\n class: 'z-btn',\n '[class.z-btn--primary]': `variante() === 'primary'`,\n '[class.z-btn--secondary]': `variante() === 'secondary'`,\n '[class.z-btn--ghost]': `variante() === 'ghost'`,\n '[class.z-btn--danger]': `variante() === 'danger'`,\n '[class.z-btn--sm]': `size() === 'sm'`,\n '[class.z-btn--lg]': `size() === 'lg'`,\n '[class.z-btn--icon]': `iconOnly()`,\n '[class.z-btn--block]': `block()`,\n '[attr.disabled]': `istLink || !disabled() ? null : \"\"`,\n '[attr.aria-busy]': `loading() ? \"true\" : null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZButton {\n /**\n * Variant of the button. The bare attribute `zBtn` carries the empty string,\n * which counts as `secondary`, so `<button zBtn>` is the secondary button.\n *\n * @default 'secondary'\n */\n readonly zBtn = input<ZButtonVariant | ''>('secondary');\n\n /**\n * Height of the button: `sm` for toolbars, `md` everywhere, `lg` only in the\n * hero and in the closing call to action. `md` adds no class.\n *\n * @default 'md'\n */\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n\n /**\n * Stretches the button over the full width of its container, for a form on a\n * phone. Boolean attribute.\n *\n * @default false\n */\n readonly block = input(false, { transform: booleanAttribute });\n\n /**\n * Square button that holds an icon and no text. The caller supplies the\n * `aria-label`. Boolean attribute.\n *\n * @default false\n */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n\n /**\n * Shows a spinner in front of the content, sets `aria-busy=\"true\"` and locks\n * the button without taking it out of the tab order: `aria-disabled=\"true\"`\n * and a swallowed click, Enter and Space instead of the native `disabled`,\n * so the button that triggered the action keeps the focus. Together with\n * {@link disabled} the native lock wins. Boolean attribute.\n *\n * @default false\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Locks the button. On a `<button>` this is the native `disabled` attribute,\n * on an `<a>` it is `aria-disabled=\"true\"` with `tabindex=\"-1\"` and a\n * swallowed click; a `tabindex` of the caller's own comes back when the lock\n * goes. Boolean attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly istLink =\n inject<ElementRef<HTMLElement>>(ElementRef).nativeElement.nodeName === 'A';\n protected readonly variante = computed<ZButtonVariant>(() => this.zBtn() || 'secondary');\n protected readonly gesperrt = computed(() => this.disabled() || this.loading());\n /**\n * Locked without the native `disabled`: every locked link, and a loading\n * button that is not also `disabled`. It stays focusable, carries\n * `aria-disabled=\"true\"` and its activation is swallowed.\n */\n protected readonly weich = computed(() =>\n this.istLink ? this.gesperrt() : this.loading() && !this.disabled(),\n );\n\n constructor() {\n const wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n // Borrowed, not bound: a host binding would delete an `aria-disabled` of\n // the caller, static or bound, on every change detection run while the\n // button is not soft-locked. The caller's value stands while the library\n // has none, and its latest value comes back when the lock goes.\n leiheAttribut('aria-disabled', () => (this.weich() ? 'true' : null));\n /** What the caller last wrote, and what it gets back when the lock goes. */\n let geliehen: string | null = null;\n let gesetzt = false;\n const sperren = (): void => {\n if (!gesetzt) {\n geliehen = wirt.getAttribute('tabindex');\n gesetzt = true;\n }\n if (wirt.getAttribute('tabindex') !== '-1') {\n wirt.setAttribute('tabindex', '-1');\n }\n };\n // A binding of the caller keeps writing while the link is locked, and every\n // value it writes would put the locked link back into the tab order. The\n // observer notes the new value and asserts the lock again; it runs only\n // while the link is locked, and writing `-1` over `-1` is skipped, so it\n // cannot answer its own record.\n let beobachter: MutationObserver | undefined;\n const halte = (): void => {\n geliehen = wirt.getAttribute('tabindex');\n if (geliehen === '-1') {\n return;\n }\n sperren();\n };\n // A locked link is taken out of the tab order, and only then is `tabindex`\n // touched at all: a host binding would write on every change and thereby\n // delete a `tabindex` the caller wrote, static or bound. The lock borrows\n // the attribute and gives back what stood there last.\n effect(() => {\n if (this.istLink && this.gesperrt()) {\n sperren();\n // Not every environment has a MutationObserver: on the server the lock\n // writes `tabindex=\"-1\"` into the rendered HTML, only the re-assertion\n // against a caller is missing. Constructing it eagerly threw a\n // ReferenceError there and took every page with a locked link down.\n if (!beobachter && typeof MutationObserver !== 'undefined') {\n beobachter = new MutationObserver(halte);\n }\n beobachter?.observe(wirt, { attributes: true, attributeFilter: ['tabindex'] });\n return;\n }\n beobachter?.disconnect();\n if (!gesetzt) {\n return;\n }\n gesetzt = false;\n if (geliehen === null) {\n wirt.removeAttribute('tabindex');\n } else {\n wirt.setAttribute('tabindex', geliehen);\n }\n });\n inject(DestroyRef).onDestroy(() => beobachter?.disconnect());\n\n // Whatever carries `aria-disabled=\"true\"` stays clickable: a locked link, a\n // loading button, a button the caller locked that way. Its activation is\n // caught in the capture phase, which runs before every listener on the\n // element in the bubble phase, so neither a `(click)` of the caller nor\n // `routerLink` sees it, and `preventDefault` keeps a submit button from\n // submitting its form. The implicit submission from Enter in a text field\n // is a click on the default button as well, so it is caught here too.\n // Enter and Space are caught on `keydown`, before they turn into a click.\n // `href` is left untouched.\n const schlucke = (ereignis: Event): void => {\n const taste = (ereignis as KeyboardEvent).key;\n if (\n wirt.getAttribute('aria-disabled') !== 'true' ||\n (ereignis.type === 'keydown' && taste !== 'Enter' && taste !== ' ')\n ) {\n return;\n }\n ereignis.preventDefault();\n ereignis.stopImmediatePropagation();\n };\n wirt.addEventListener('click', schlucke, true);\n wirt.addEventListener('keydown', schlucke, true);\n }\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Status of a badge. `neutral` is the plain tag and the state \"Gestoppt\",\n * `success` stands for Online or Aktiv, `warning` for a running change such as\n * \"Neustart läuft\", `danger` for Fehlgeschlagen or Offline, `info` for\n * something planned or being installed.\n */\nexport type ZBadgeStatus = 'neutral' | 'success' | 'warning' | 'danger' | 'info';\n\n/**\n * Status or tag in one word. A badge is never clickable and never carries a\n * meaning that only its color conveys: the state is always written out.\n *\n * Renders the projected content on a host with the class `z-badge` plus one of\n * `z-badge--success`, `--warning`, `--danger`, `--info`. With `dot` a leading\n * `span.z-badge__dot` is added. Two uses: a status with dot and color, or a\n * neutral tag without dot (Tarif, Loader, Version, Rechte). At most three tags\n * per row, and in a list the status always stays in the same column.\n *\n * @example\n * ```html\n * <z-badge status=\"success\" dot>Online</z-badge>\n * <z-badge status=\"danger\" dot>Fehlgeschlagen</z-badge>\n * <z-badge>PaperMC</z-badge>\n * ```\n */\n@Component({\n selector: 'z-badge',\n template: `@if (dot()) {\n <span class=\"z-badge__dot\"></span>\n }\n <ng-content />`,\n host: {\n class: 'z-badge',\n '[class.z-badge--success]': `status() === 'success'`,\n '[class.z-badge--warning]': `status() === 'warning'`,\n '[class.z-badge--danger]': `status() === 'danger'`,\n '[class.z-badge--info]': `status() === 'info'`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZBadge {\n /**\n * Color of the badge. `neutral` renders without a modifier class.\n *\n * @default 'neutral'\n */\n readonly status = input<ZBadgeStatus>('neutral');\n\n /**\n * Shows the leading dot. Set it for a server or job state, leave it off for a\n * plain tag. Boolean attribute, so `dot` alone is enough.\n *\n * @default false\n */\n readonly dot = input(false, { transform: booleanAttribute });\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * Wrapper around a form control: label above, hint or error below. The label\n * always stands above the control, never only as a placeholder.\n *\n * Renders a host with the class `z-field`, an optional `label.z-field__label`,\n * the projected control, and below it either `span.z-field__error` or, if there\n * is no error, `span.z-field__hint`. Error and hint are mutually exclusive; the\n * error wins.\n *\n * Accessibility: `for` links the label to the id of the control and is also the\n * root of the ids for hint (`<for>-hint`) and error (`<for>-error`). Without\n * `for` there are no ids and no `aria-describedby`. A projected `input zInput`,\n * `textarea zInput` or `z-select` picks that id up by itself.\n *\n * @example\n * ```html\n * <z-field label=\"Servername\" for=\"in-name\" hint=\"Nur für dich sichtbar.\">\n * <input zInput id=\"in-name\" value=\"Beispiel-Server 1\" />\n * </z-field>\n *\n * <z-field label=\"Maximale Spieler\" for=\"in-max\" error=\"Dein Tarif erlaubt höchstens 100 Spieler.\">\n * <input zInput mono invalid id=\"in-max\" value=\"200\" />\n * </z-field>\n * ```\n */\n@Component({\n selector: 'z-field',\n template: `\n @if (label()) {\n <label class=\"z-field__label\" [attr.for]=\"fuer() || null\">{{ label() }}</label>\n }\n <ng-content />\n @if (error()) {\n <span class=\"z-field__error\" [attr.id]=\"fehlerId()\">{{ error() }}</span>\n } @else if (hint()) {\n <span class=\"z-field__hint\" [attr.id]=\"hinweisId()\">{{ hint() }}</span>\n }\n `,\n host: { class: 'z-field' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZField {\n /**\n * Visible label above the control. Empty means no label element is rendered.\n *\n * @default ''\n */\n readonly label = input('');\n\n /**\n * id of the control inside the field. Connects the label with the control and\n * serves as the prefix for the hint and error ids. Empty means no `for`\n * attribute and no `aria-describedby` wiring.\n *\n * @default ''\n */\n readonly for = input('');\n\n /**\n * Helper text below the control. Only shown while `error` is empty.\n *\n * @default ''\n */\n readonly hint = input('');\n\n /**\n * Error message below the control. Non-empty replaces the hint. The message\n * names the cause and the next step; the control itself is marked with\n * `invalid`.\n *\n * @default ''\n */\n readonly error = input('');\n\n /** `for` is a keyword in the template, hence this second name. */\n protected readonly fuer = this.for;\n\n protected readonly hinweisId = computed(() => (this.for() ? `${this.for()}-hint` : null));\n protected readonly fehlerId = computed(() => (this.for() ? `${this.for()}-error` : null));\n\n /**\n * id of the currently visible accompanying text: the error id while `error`\n * is set, otherwise the hint id, and `null` if neither is shown or `for` is\n * empty. The projected control binds its `aria-describedby` to this.\n *\n * @internal Wiring between `z-field` and the controls inside it, not meant to\n * be read by applications.\n */\n readonly beschreibung = computed(() => {\n if (this.error()) {\n return this.fehlerId();\n }\n return this.hint() ? this.hinweisId() : null;\n });\n}\n","import {\n booleanAttribute,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\nimport { leiheAttribut, ZTokenAttribut } from '../a11y/host-attribute';\nimport { ZField } from './field';\n\n/**\n * Native `<input>` or `<textarea>` in Zenit style. The element stays native,\n * the directive only adds classes and accessibility state.\n *\n * Adds the class `z-input`, plus `z-input--sm` for the small size and\n * `z-input--mono` for monospace values. The error state is expressed as\n * `aria-invalid=\"true\"`, and the danger border hooks onto that attribute.\n * Inside a `z-field` the `aria-describedby` attribute points at that field's\n * hint or error. The native `size` attribute is removed from the host, because\n * the input `size` carries `sm`/`md` here, which would be invalid HTML.\n *\n * Both attributes belong to the caller as much as to the library, so neither\n * is a host binding. The id of the field is one token in front of whatever the\n * caller wrote in `aria-describedby`, and it is removed again when hint and\n * error are gone; a `zTooltip` on the same element adds its own token at the\n * back, so caller, field and tooltip write the same attribute without deleting\n * one another. `aria-invalid` is borrowed the same way: while {@link invalid}\n * holds, the library value stands, and afterwards the caller's own value comes\n * back.\n *\n * @example\n * ```html\n * <z-field label=\"Adresse\" for=\"in-addr\" hint=\"IP und Port deines Servers.\">\n * <input zInput mono id=\"in-addr\" value=\"203.0.113.10:25565\" readonly />\n * </z-field>\n *\n * <z-field label=\"Notiz\" for=\"in-note\">\n * <textarea zInput id=\"in-note\" placeholder=\"Was hast du zuletzt geändert?\"></textarea>\n * </z-field>\n * ```\n */\n@Directive({\n selector: 'input[zInput], textarea[zInput]',\n host: {\n class: 'z-input',\n '[class.z-input--sm]': `size() === 'sm'`,\n '[class.z-input--mono]': `mono()`,\n // size is the name from the API table, but as a native attribute on the\n // <input> the value \"sm\" would be invalid HTML.\n '[attr.size]': `null`,\n },\n})\nexport class ZInput {\n /**\n * Height of the control: `md` for forms, `sm` for fields in toolbars and\n * filter rows. Adds `z-input--sm` for `sm`.\n *\n * @default 'md'\n */\n readonly size = input<'sm' | 'md'>('md');\n\n /**\n * Sets the monospace font with tabular figures. For numbers, ports, IP\n * addresses, file names and configuration values. Boolean attribute.\n *\n * @default false\n */\n readonly mono = input(false, { transform: booleanAttribute });\n\n /**\n * Marks the value as invalid: sets `aria-invalid=\"true\"` and with it the\n * danger border, while {@link touched} holds too. Goes together with `error`\n * on the surrounding `z-field`. The Signal Forms `[formField]` on the same\n * element sets it from the field state, and Angular then rejects an own\n * `[invalid]` binding. Boolean attribute.\n *\n * @default false\n */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the user has left the field, which gates {@link invalid}, so an\n * empty required field does not start out with a danger border. Set by\n * `[formField]`; outside Signal Forms it stays `true` and {@link invalid}\n * alone decides. Boolean attribute.\n *\n * @default true\n */\n readonly touched = input(true, { transform: booleanAttribute });\n\n private readonly feld = inject(ZField, { optional: true });\n\n constructor() {\n leiheAttribut('aria-invalid', () => (this.invalid() && this.touched() ? 'true' : null));\n const beschreibung = new ZTokenAttribut(\n inject<ElementRef<HTMLElement>>(ElementRef).nativeElement,\n 'aria-describedby',\n 'vorn',\n );\n effect(() => beschreibung.setze(this.feld?.beschreibung() ?? null));\n // The element may outlive the directive, so it keeps every token the\n // caller and a tooltip put there and loses only the one of the field.\n inject(DestroyRef).onDestroy(() => beschreibung.setze(null));\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ZIcon } from '../icon';\n\n/**\n * Field with a leading icon, for example a search box. Renders a\n * `div.z-input-wrap` (host) with a `z-icon` in front of the projected\n * `input zInput`.\n *\n * Accessibility: the icon is decorative and `aria-hidden`, so the field still\n * needs its own label, usually from the surrounding `z-field`.\n *\n * @example\n * ```html\n * <z-field label=\"Suche\" for=\"in-search\">\n * <z-input-group icon=\"search\">\n * <input zInput id=\"in-search\" placeholder=\"Name, Spiel oder Adresse\" />\n * </z-input-group>\n * </z-field>\n * ```\n */\n@Component({\n selector: 'z-input-group',\n imports: [ZIcon],\n template: `<z-icon [name]=\"icon()\" /><ng-content />`,\n host: { class: 'z-input-wrap' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZInputGroup {\n /**\n * Name of the Material Icons ligature in front of the field, for example\n * `search`. Required.\n */\n readonly icon = input.required<string>();\n}\n","import {\n AfterContentChecked,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\nimport { ZTokenAttribut } from '../a11y/host-attribute';\nimport { ZField } from './field';\n\n/**\n * Wrapper around a native `<select>`. The select stays native because of\n * keyboard handling, screen readers and the system wheel on mobile devices;\n * the component only provides the surface with the classes `z-select` and\n * `z-select--sm`, which looks the same as an input.\n *\n * Accessibility: inside a `z-field` the projected `<select>` receives that\n * field's `aria-describedby` pointing at the hint or error. Use a select for a\n * short, fixed list; up to four options that are meant to be compared are a\n * segment, and from about 15 options on a search field is needed.\n *\n * @example\n * ```html\n * <z-field label=\"Status\" for=\"sel-status\">\n * <z-select>\n * <select id=\"sel-status\">\n * <option>Alle Status</option>\n * <option>Online</option>\n * <option>Gestoppt</option>\n * </select>\n * </z-select>\n * </z-field>\n * ```\n */\n@Component({\n selector: 'z-select',\n template: `<ng-content />`,\n host: {\n class: 'z-select',\n '[class.z-select--sm]': `size() === 'sm'`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSelect implements AfterContentChecked {\n /**\n * Height of the control: `md` for forms, `sm` for filter rows next to the\n * search field. Adds `z-select--sm` for `sm`.\n *\n * @default 'md'\n */\n readonly size = input<'sm' | 'md'>('md');\n\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly feld = inject(ZField, { optional: true });\n private ziel?: HTMLSelectElement;\n private beschreibung?: ZTokenAttribut;\n\n constructor() {\n // The `<select>` belongs to the caller and may outlive the component, so\n // it keeps its own description and loses only the id of the field.\n inject(DestroyRef).onDestroy(() => this.beschreibung?.setze(null));\n }\n\n /**\n * Keeps the id of the hint or the error of the surrounding `z-field` in the\n * `aria-describedby` of the projected `<select>`.\n *\n * The `<select>` is projected content, so a host binding cannot reach it.\n * Content hooks run in the view that declares the content, so this hook\n * covers both cases: error or hint changing, and the `<select>` appearing\n * later behind an `@if`. No signal tracking needed, hence no race with the\n * change detection guard.\n *\n * The id is one token among whatever the caller wrote on the `<select>`, not\n * the whole attribute: writing the attribute as a whole used to delete a\n * `aria-describedby` of the caller's own.\n *\n * Angular lifecycle hook. Deliberately without the internal tag: `stripInternal` removed it from the\n * typings, and consumers with `skipLibCheck: false` got TS2420 (implements without the method).\n */\n ngAfterContentChecked(): void {\n const ziel = this.el.nativeElement.querySelector('select');\n if (!ziel) {\n return;\n }\n if (ziel !== this.ziel) {\n this.beschreibung?.setze(null);\n this.beschreibung = new ZTokenAttribut(ziel, 'aria-describedby', 'vorn');\n this.ziel = ziel;\n }\n this.beschreibung?.setze(this.feld?.beschreibung() ?? null);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChild,\n Directive,\n input,\n} from '@angular/core';\n\n/**\n * Marks the element that is projected into the panel header, to the right of\n * the title: a link or one action. Adds no markup and no classes of its own.\n *\n * @example\n * ```html\n * <z-panel title=\"Zahlungsmittel\">\n * <span zPanelActions>\n * <button zBtn=\"secondary\" size=\"sm\"><z-icon name=\"add\" size=\"sm\" />Hinzufügen</button>\n * </span>\n * </z-panel>\n * ```\n */\n@Directive({ selector: '[zPanelActions]' })\nexport class ZPanelActions {}\n\n/**\n * The only container with a border. Groups data or a tool into one block:\n * server list, activities, payment methods, file manager, settings group. Not\n * for feature texts, facts or FAQ on public pages, and never a panel inside a\n * panel.\n *\n * Renders a host with the class `z-panel`. If there is a title or a\n * `[zPanelActions]` element, a `div.z-panel__header` with `.z-panel__title` in\n * the tag {@link headingLevel} names (`h3` by default)\n * comes first, then `div.z-panel__body` (plus `z-panel__body--flush` for lists\n * and tables) with the projected content, and finally a projected\n * `z-pagination` after the body.\n *\n * Accessibility: `busy` sets `aria-busy=\"true\"` on the host while content is\n * loading; the panel then also carries its own `aria-label`. The native `title`\n * attribute is suppressed so the browser does not show its own tooltip for the\n * title input.\n *\n * @example\n * ```html\n * <z-panel title=\"Meine Server\" flush>\n * <a zPanelActions href=\"/user/server\">Alle anzeigen</a>\n * <ul class=\"demo-list\">…</ul>\n * </z-panel>\n * ```\n */\n@Component({\n selector: 'z-panel',\n template: `\n @if (title() || aktionen()) {\n <div class=\"z-panel__header\">\n @if (title()) {\n @switch (headingLevel()) {\n @case (2) {\n <h2 class=\"z-panel__title\" [class.z-mono]=\"titleMono()\">{{ title() }}</h2>\n }\n @case (4) {\n <h4 class=\"z-panel__title\" [class.z-mono]=\"titleMono()\">{{ title() }}</h4>\n }\n @default {\n <h3 class=\"z-panel__title\" [class.z-mono]=\"titleMono()\">{{ title() }}</h3>\n }\n }\n }\n <ng-content select=\"[zPanelActions]\" />\n </div>\n }\n <div class=\"z-panel__body\" [class.z-panel__body--flush]=\"flush()\">\n <ng-content />\n </div>\n <ng-content select=\"z-pagination\" />\n `,\n host: {\n class: 'z-panel',\n '[attr.title]': `null`,\n '[attr.aria-busy]': `busy() ? \"true\" : null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZPanel {\n /**\n * Panel title in normal capitalization, without an icon. Empty means no\n * header, unless a `[zPanelActions]` element is projected.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Tag of the title: `2`, `3` or `4`. The reference markup has `h3`, which\n * fits a panel below a section heading. Raise it to `2` where the panel sits\n * directly under the page `<h1>` and is a section of its own, as the panels\n * of a customer-area page are. The visual size never changes with it.\n *\n * @default 3\n */\n readonly headingLevel = input<2 | 3 | 4, 2 | 3 | 4 | '2' | '3' | '4'>(3, {\n transform: (wert) => Number(wert) as 2 | 3 | 4,\n });\n\n /**\n * Sets the title in the mono face, for a title that is a technical value as\n * a whole, such as an endpoint (`GET /api/v1/gameservers`), a file name or a\n * configuration key. Adds `z-mono` to the heading; tag and size stay the\n * same. Boolean attribute.\n *\n * @default false\n */\n readonly titleMono = input(false, { transform: booleanAttribute });\n\n /**\n * Removes the padding of the body so lists and tables can reach the border.\n * Boolean attribute.\n *\n * @default false\n */\n readonly flush = input(false, { transform: booleanAttribute });\n\n /**\n * Marks the panel as loading and sets `aria-busy=\"true\"`. Boolean attribute.\n *\n * @default false\n */\n readonly busy = input(false, { transform: booleanAttribute });\n\n protected readonly aktionen = contentChild(ZPanelActions);\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * The first tab stop of a page: a link that jumps past header and navigation\n * straight to the main content. Every page has one; it is the keyboard's way\n * out of a header that carries a dozen links.\n *\n * The directive adds the class `z-skip-link` and nothing else. Text, `href` and\n * position in the document belong to the caller, because only the application\n * knows what its main content is called and where it starts. Put the link first\n * in the body, before the header.\n *\n * The class is what makes it work: `.z-root a` weighs (0,1,1) and beats any\n * application class on a link (0,1,0), so a skip link styled by hand keeps\n * `accent-text` and ends up red on red. The library's own rule\n * `.z-root a.z-skip-link` weighs (0,2,1) and wins.\n *\n * The link is invisible until it takes focus; then it becomes a block at the\n * top left, above everything else on the page.\n *\n * **The target needs `tabindex=\"-1\"`.** Without it the browser moves the\n * viewport but leaves the focus where it was, and the next Tab goes back to the\n * second link of the header. In dev mode the directive checks the target on the\n * first focus and warns when it is missing or cannot take focus.\n *\n * @example\n * ```html\n * <a zSkipLink href=\"#inhalt\">Zum Hauptinhalt springen</a>\n * <header>…</header>\n * <main id=\"inhalt\" tabindex=\"-1\">…</main>\n * ```\n */\n@Directive({\n selector: 'a[zSkipLink]',\n host: {\n class: 'z-skip-link',\n '(focus)': 'zielPruefen()',\n },\n})\nexport class ZSkipLink {\n private readonly element = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n\n /** The check runs once; a skip link is focused on every page visit. */\n private geprueft = false;\n\n /**\n * Dev-mode check of the link target, on the first focus. It runs that late on\n * purpose: the target usually lives in the same template, and at construction\n * time it is not in the document yet.\n */\n protected zielPruefen(): void {\n if (this.geprueft || (typeof ngDevMode !== 'undefined' && !ngDevMode)) {\n return;\n }\n this.geprueft = true;\n\n const element = this.element.nativeElement;\n // getAttribute, not .hash: a router link writes the fragment through the\n // property, and both spellings end up in the attribute anyway.\n const fragment = (element.getAttribute('href') ?? '').split('#')[1];\n if (!fragment) {\n console.warn(\n `zenit-ui: zSkipLink without a target fragment (href=\"${element.getAttribute('href') ?? ''}\").`,\n );\n return;\n }\n\n // decodeURIComponent throws URIError on a broken escape such as \"#%\", and\n // this runs inside a focus handler, where an exception would surface as an\n // unhandled error while the user is only pressing Tab. A fragment that\n // cannot be decoded is taken as written; the browser does not resolve it\n // either, so the warning below is the right answer for it.\n let id = fragment;\n try {\n id = decodeURIComponent(fragment);\n } catch {\n // Keep the raw fragment.\n }\n\n const ziel = element.ownerDocument.getElementById(id);\n if (!ziel) {\n console.warn(`zenit-ui: zSkipLink points at #${fragment}, which is not in the document.`);\n return;\n }\n\n // Anything that can take focus either is focusable by default or says so\n // with tabindex. A skip link target is a <main> or a <div>, so in practice\n // this is the missing tabindex=\"-1\".\n const fokussierbar =\n ziel.hasAttribute('tabindex') ||\n ziel.matches(\n 'a[href], area[href], button, input, select, textarea, iframe, [contenteditable]',\n );\n if (!fokussierbar) {\n console.warn(\n `zenit-ui: the target #${fragment} of zSkipLink cannot take focus. Give it tabindex=\"-1\", otherwise only the viewport moves.`,\n );\n }\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormCheckboxControl } from '@angular/forms/signals';\n\n/**\n * Selects entries for a bulk action or confirms a statement, on a native\n * `<input type=\"checkbox\">`. It never switches anything immediately; for\n * settings that take effect at once use `z-toggle`.\n *\n * Renders `<label class=\"z-check\">` with the native checkbox and a `<span>`\n * holding the projected text. Because the whole thing is a label, a click on\n * the text toggles the box.\n *\n * Accessibility: without visible text, for example in a table row, the caller\n * passes {@link ariaLabel}; the attribute is only written when it is not empty.\n * The checked state lives directly on the native element, written in an\n * `effect`, so a control that rejects an input still keeps element and model in\n * sync.\n *\n * An error or hint sentence next to the checkbox is tied in through\n * {@link ariaDescribedby}. {@link indeterminate} shows the mixed state of a\n * \"select all\" box; the native property implies `aria-checked=\"mixed\"`.\n *\n * Forms: implements `ControlValueAccessor`, so `ngModel` and `formControl`\n * work, and has the shape of a Signal Forms `FormCheckboxControl`, so\n * `[formField]` works and feeds {@link disabled}, {@link required},\n * {@link invalid} and {@link touched} from the field state.\n * `setDisabledState` from forms and the {@link disabled} input are\n * independent; either one locks the checkbox.\n *\n * @example\n * ```html\n * <z-checkbox [(checked)]=\"alleGewaehlt\" [(indeterminate)]=\"teilweise\">Alle auswählen</z-checkbox>\n * <z-checkbox [formField]=\"formular.agb\" ariaDescribedby=\"agb-fehler\">Ich stimme den Bedingungen zu</z-checkbox>\n * <z-checkbox [formControl]=\"agb\">Ich stimme den Bedingungen zu</z-checkbox>\n * <z-checkbox ariaLabel=\"Beispiel-Server 1 auswählen\" />\n * ```\n */\n@Component({\n selector: 'z-checkbox',\n template: `\n <label class=\"z-check\">\n <input\n #feld\n type=\"checkbox\"\n [disabled]=\"gesperrt()\"\n [required]=\"required()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"ariaDescribedby() || null\"\n [attr.aria-invalid]=\"invalid() && touched() ? 'true' : null\"\n (change)=\"aufAenderung($event)\"\n (blur)=\"beruehrt()\"\n /><span><ng-content /></span>\n </label>\n `,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ZCheckbox), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZCheckbox implements ControlValueAccessor, FormCheckboxControl {\n /**\n * Checked state, two-way bindable. Also the value seen by `ngModel` and\n * `formControl`.\n *\n * @default false\n */\n readonly checked = model(false);\n\n /**\n * Locks the checkbox. Independent of `setDisabledState` from forms; either\n * one is enough. Boolean attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * `aria-label` of the native input, for a checkbox without visible text.\n * Empty writes no attribute.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * `aria-describedby` of the native input: the `id`s of the error or hint\n * sentence that belongs to the checkbox, separated by spaces. Empty writes no\n * attribute.\n *\n * @default ''\n */\n readonly ariaDescribedby = input('');\n\n /**\n * Mixed state of a \"select all\" checkbox, two-way bindable. Mirrored onto the\n * native `indeterminate` property, which a screen reader reads as\n * `aria-checked=\"mixed\"`. It is no value: forms never see it, and a user\n * interaction clears it, the way the browser does on the element.\n *\n * @default false\n */\n readonly indeterminate = model(false);\n\n /**\n * Marks the native input as `required`. Set by `[formField]` from a\n * `required()` rule. Boolean attribute.\n *\n * @default false\n */\n readonly required = input(false, { transform: booleanAttribute });\n\n /**\n * Validation failed. Writes `aria-invalid=\"true\"` onto the native input while\n * {@link touched} holds too; there is no error colour for a checkbox. Set by\n * `[formField]` from the field state. Boolean attribute.\n *\n * @default false\n */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the user has left the checkbox, which gates {@link invalid}, so an\n * untouched form does not start out in error. Set by `[formField]`; outside\n * Signal Forms it stays `true` and {@link invalid} alone decides.\n *\n * @default true\n */\n readonly touched = input(true, { transform: booleanAttribute });\n\n /** Lock coming from forms, independent of the `disabled` input. Either one is enough. */\n private readonly formsGesperrt = signal(false);\n protected readonly gesperrt = computed(() => this.disabled() || this.formsGesperrt());\n\n private melde?: (wert: boolean) => void;\n private aufBeruehrt?: () => void;\n\n private readonly feld = viewChild.required<ElementRef<HTMLInputElement>>('feld');\n\n constructor() {\n // The check mark is written straight onto the element, not through a\n // [checked] binding. A click changes the checkedness on the element\n // itself. If a control reverts the input before a change detection ran,\n // the expression still holds the same value as last rendered and the\n // binding would not write: field and control would drift apart. That is\n // why Angular's own accessors write straight onto the element too.\n effect(() => {\n const feld = this.feld().nativeElement;\n feld.checked = this.checked();\n feld.indeterminate = this.indeterminate();\n });\n }\n\n protected aufAenderung(ereignis: Event): void {\n const wert = (ereignis.target as HTMLInputElement).checked;\n this.checked.set(wert);\n this.indeterminate.set(false);\n this.melde?.(wert);\n }\n\n protected beruehrt(): void {\n this.aufBeruehrt?.();\n }\n\n /**\n * `ControlValueAccessor`: takes the value from the form. `null` and\n * `undefined` count as unchecked.\n */\n writeValue(wert: boolean): void {\n this.checked.set(!!wert);\n }\n\n /**\n * `ControlValueAccessor`: registers the callback that reports a new value to\n * the form. It fires on a change of the native checkbox, not on writes\n * through {@link checked}.\n */\n registerOnChange(fn: (wert: boolean) => void): void {\n this.melde = fn;\n }\n\n /** `ControlValueAccessor`: registers the callback fired when the checkbox loses focus. */\n registerOnTouched(fn: () => void): void {\n this.aufBeruehrt = fn;\n }\n\n /** `ControlValueAccessor`: locks or unlocks the checkbox from the form side. */\n setDisabledState(gesperrt: boolean): void {\n this.formsGesperrt.set(gesperrt);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormCheckboxControl } from '@angular/forms/signals';\n\n/**\n * Switches a setting that takes effect without a save button, on a native\n * `<input type=\"checkbox\" role=\"switch\">`. For choices that only take effect\n * on submit use `z-checkbox`.\n *\n * Renders that single input with the class `z-toggle` and nothing else; the\n * label belongs to the surrounding `z-setting` row. Off is `surface` with\n * `border-control`, on is `success`, because \"on\" is a state and not an\n * action.\n *\n * Accessibility: `role=\"switch\"` makes the state readable as on or off. Inside\n * a `z-setting` row the caller points {@link ariaLabelledby} at the `titleId`\n * of the row title; standing alone the toggle carries {@link ariaLabel}.\n * Either attribute is only written when it is not empty. The switch state\n * lives directly on the native element, written in an `effect`, so a control\n * that rejects a switch still keeps element and model in sync.\n *\n * Forms: implements `ControlValueAccessor`, so `ngModel` and `formControl`\n * work, and has the shape of a Signal Forms `FormCheckboxControl`, so\n * `[formField]` works and feeds {@link disabled}, {@link invalid} and\n * {@link touched} from the field state. `setDisabledState` from forms and the\n * {@link disabled} input are independent; either one locks the toggle.\n *\n * @example\n * ```html\n * <z-setting title=\"PvP\" key=\"pvp\" description=\"Spieler können sich gegenseitig angreifen.\" titleId=\"pvp-titel\">\n * <z-toggle [(checked)]=\"pvp\" ariaLabelledby=\"pvp-titel\" />\n * </z-setting>\n * ```\n */\n@Component({\n selector: 'z-toggle',\n template: `\n <input\n #feld\n class=\"z-toggle\"\n type=\"checkbox\"\n role=\"switch\"\n [disabled]=\"gesperrt()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [attr.aria-describedby]=\"ariaDescribedby() || null\"\n [attr.aria-invalid]=\"invalid() && touched() ? 'true' : null\"\n (change)=\"aufAenderung($event)\"\n (blur)=\"beruehrt()\"\n />\n `,\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ZToggle), multi: true }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZToggle implements ControlValueAccessor, FormCheckboxControl {\n /**\n * Switch state, two-way bindable: `true` is on. Also the value seen by\n * `ngModel` and `formControl`.\n *\n * @default false\n */\n readonly checked = model(false);\n\n /**\n * Locks the toggle. Independent of `setDisabledState` from forms; either one\n * is enough. Boolean attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * `aria-label` of the switch, for a toggle without a row title. Empty writes\n * no attribute.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * `aria-labelledby` of the switch, normally the `titleId` of the surrounding\n * `z-setting` row. Takes precedence over {@link ariaLabel} in a screen\n * reader. Empty writes no attribute.\n *\n * @default ''\n */\n readonly ariaLabelledby = input('');\n\n /**\n * `aria-describedby` of the switch: the `id`s of the error or hint sentence\n * that belongs to it, separated by spaces, for example the description of\n * the `z-setting` row. Empty writes no attribute.\n *\n * @default ''\n */\n readonly ariaDescribedby = input('');\n\n /**\n * Validation failed. Writes `aria-invalid=\"true\"` onto the switch while\n * {@link touched} holds too; there is no error colour for a toggle. Set by\n * `[formField]` from the field state. Boolean attribute.\n *\n * @default false\n */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the user has left the toggle, which gates {@link invalid}, so an\n * untouched form does not start out in error. Set by `[formField]`; outside\n * Signal Forms it stays `true` and {@link invalid} alone decides.\n *\n * @default true\n */\n readonly touched = input(true, { transform: booleanAttribute });\n\n /** Lock coming from forms, independent of the `disabled` input. Either one is enough. */\n private readonly formsGesperrt = signal(false);\n protected readonly gesperrt = computed(() => this.disabled() || this.formsGesperrt());\n\n private melde?: (wert: boolean) => void;\n private aufBeruehrt?: () => void;\n\n private readonly feld = viewChild.required<ElementRef<HTMLInputElement>>('feld');\n\n constructor() {\n // The switch state is written straight onto the element, not through a\n // [checked] binding. A click changes the checkedness on the element\n // itself. If a control reverts the input before a change detection ran,\n // the expression still holds the same value as last rendered and the\n // binding would not write: field and control would drift apart.\n effect(() => {\n this.feld().nativeElement.checked = this.checked();\n });\n }\n\n protected aufAenderung(ereignis: Event): void {\n const wert = (ereignis.target as HTMLInputElement).checked;\n this.checked.set(wert);\n this.melde?.(wert);\n }\n\n protected beruehrt(): void {\n this.aufBeruehrt?.();\n }\n\n /**\n * `ControlValueAccessor`: takes the value from the form. `null` and\n * `undefined` count as off.\n */\n writeValue(wert: boolean): void {\n this.checked.set(!!wert);\n }\n\n /**\n * `ControlValueAccessor`: registers the callback that reports a new value to\n * the form. It fires on a change of the switch, not on writes through\n * {@link checked}.\n */\n registerOnChange(fn: (wert: boolean) => void): void {\n this.melde = fn;\n }\n\n /** `ControlValueAccessor`: registers the callback fired when the toggle loses focus. */\n registerOnTouched(fn: () => void): void {\n this.aufBeruehrt = fn;\n }\n\n /** `ControlValueAccessor`: locks or unlocks the toggle from the form side. */\n setDisabledState(gesperrt: boolean): void {\n this.formsGesperrt.set(gesperrt);\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * One row of a settings list: title, configuration key and effect on the left,\n * the control itself on the right as projected content.\n *\n * Renders the class `z-setting` on the host and inside it a\n * `div.z-setting__text` with `span.z-setting__title`, optionally the key in\n * `span.z-subtle.z-mono.caption` and the description in `span.z-muted`. The\n * projected control follows that block. Key and description only appear when\n * they are not empty.\n *\n * Accessibility: {@link titleId} puts an `id` on the title so the control in\n * the row can point at it, which is how `z-toggle` gets its name through\n * `ariaLabelledby`. The native `title` attribute is suppressed on the host, so\n * the browser does not hang its own tooltip on the whole row because of the\n * {@link title} input.\n *\n * @example\n * ```html\n * <z-setting\n * title=\"PvP\"\n * key=\"pvp\"\n * description=\"Spieler können sich gegenseitig angreifen.\"\n * titleId=\"pvp-titel\"\n * >\n * <z-toggle [(checked)]=\"pvp\" ariaLabelledby=\"pvp-titel\" />\n * </z-setting>\n * ```\n */\n@Component({\n selector: 'z-setting',\n template: `\n <div class=\"z-setting__text\">\n <span class=\"z-setting__title\" [attr.id]=\"titleId() || null\">{{ title() }}</span>\n @if (key()) {\n <span class=\"z-subtle z-mono caption\">{{ key() }}</span>\n }\n @if (description()) {\n <span class=\"z-muted\">{{ description() }}</span>\n }\n </div>\n <ng-content />\n `,\n host: {\n class: 'z-setting',\n // Otherwise the browser hangs its own tooltip on the whole row because of\n // the static attribute title=\"…\".\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSetting {\n /**\n * Name of the setting in normal capitalization, without an icon.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Configuration key belonging to the setting, for example `pvp`. Shown in the\n * mono face below the title; empty renders nothing.\n *\n * @default ''\n */\n readonly key = input('');\n\n /**\n * One sentence on what the setting does. If the change only takes effect\n * after a restart, that belongs here. Empty renders nothing.\n *\n * @default ''\n */\n readonly description = input('');\n\n /**\n * `id` written onto the title, so the control in the row can name itself\n * through `aria-labelledby`. Empty writes no attribute.\n *\n * @default ''\n */\n readonly titleId = input('');\n}\n","import {\n EnvironmentProviders,\n InjectionToken,\n inject,\n makeEnvironmentProviders,\n} from '@angular/core';\n\n/**\n * Every default text the library ships, in one place.\n *\n * The library holds no copy of its own beyond these: they are the accessible\n * names and the one visible sentence that a component cannot leave empty\n * without breaking screen readers. Everything else comes from the caller as an\n * input.\n *\n * A key is a plain `string` when the text is fixed and a function when it takes\n * parameters. Components read the registry through {@link Z_LABELS}; an input\n * set on the element still wins over the registry value.\n *\n * @see {@link Z_LABELS_DE} for the German defaults, {@link Z_LABELS_EN} for the\n * English ones and {@link provideZenitLabels} to override single keys.\n */\nexport interface ZLabels {\n /** `aria-label` of the back button in `z-pagination`. */\n paginationPrev: string;\n\n /** `aria-label` of the forward button in `z-pagination`. */\n paginationNext: string;\n\n /** Accessible name of the `<nav>` landmark around the pager in `z-pagination`. */\n paginationNav: string;\n\n /**\n * The sentence in front of the pagination buttons.\n *\n * @param from Number of the first entry on the current page, 1-based.\n * @param to Number of the last entry on the current page.\n * @param total Number of entries in the whole list.\n * @param itemLabel What the list contains, for example \"Rechnungen\".\n * @returns The rendered sentence, for example `1 bis 25 von 118 Rechnungen`.\n */\n paginationRange: (from: number, to: number, total: number, itemLabel: string) => string;\n\n /** Visible label of the page size select in `z-pagination`. */\n paginationPageSize: string;\n\n /** `aria-label` of the minus button of `z-slider`, shown with `steppers`. */\n sliderDecrease: string;\n\n /** `aria-label` of the plus button of `z-slider`, shown with `steppers`. */\n sliderIncrease: string;\n\n /** `aria-label` of the log region in `z-console`. */\n consoleLog: string;\n\n /** `aria-label` of the command input in `z-console`. */\n consoleInput: string;\n\n /** Caption of the button that jumps back to the end of the log in `z-console`. */\n consoleJumpToEnd: string;\n\n /** `aria-label` of the menu button of `z-app-header`, shown below 900px. */\n headerMenu: string;\n\n /** `aria-label` of the close button on every toast in `z-toast-outlet`. */\n toastClose: string;\n\n /** Accessible name of the scrollable region `z-table-container`. */\n tableRegion: string;\n\n /** Caption of the \"Ändern\" button on a finished step of `z-wizard-step`. */\n wizardEdit: string;\n\n /** The one line `z-combobox` shows when nothing matches and `emptyText` is empty. */\n comboboxEmpty: string;\n\n /**\n * How many entries are left after filtering in `z-combobox`, for the live\n * region that a screen reader hears while the list itself stays unseen.\n *\n * @param count Number of entries in the open panel, always 1 or more.\n * @returns The rendered sentence, for example `3 Treffer`.\n */\n comboboxResults: (count: number) => string;\n\n /** The row and the announcement of `z-combobox` while `loading` is set. */\n comboboxLoading: string;\n\n /**\n * The row of `z-combobox` that commits the typed text as the value, shown\n * with `allowCustom` when the text matches no entry.\n *\n * @param text What the visitor typed, trimmed.\n * @returns The rendered row, for example `„Hardware“ übernehmen`.\n */\n comboboxUseCustom: (text: string) => string;\n\n /**\n * The row of `z-combobox` that stands in for the list while the typed text\n * is shorter than `minQueryLength`.\n *\n * @param count The least number of characters, `minQueryLength`.\n * @returns The rendered row, for example `Mindestens 2 Zeichen eingeben`.\n */\n comboboxMinQuery: (count: number) => string;\n\n /** Caption of the retry button in `z-price-summary`, used when `retryLabel` is empty. */\n summaryRetry: string;\n\n /** `<title>` of the SVG in `z-cost-chart`, and the accessible name of the plot. */\n chartTitle: string;\n\n /**\n * `<desc>` of the SVG in `z-cost-chart`: the chart in one sentence.\n *\n * @param base Base amount per month.\n * @param rate Price per hour, unrounded.\n * @param cap Upper limit per month.\n * @param capHours Hour at which the cap takes over, rounded for display.\n * @returns The rendered sentence.\n */\n chartDesc: (base: number, rate: number, cap: number, capHours: number) => string;\n\n /**\n * `<desc>` of the SVG in `z-cost-chart` where no cap is reached on the axis:\n * a flat price per hour, or a cap past the last hour shown.\n *\n * @param base Base amount per month.\n * @param rate Price per hour, unrounded.\n * @returns The rendered sentence.\n */\n chartDescOpen: (base: number, rate: number) => string;\n\n /** Label of the first figure above the chart in `z-cost-chart`. */\n chartPerHour: string;\n\n /** Label of the second figure above the chart in `z-cost-chart`. */\n chartCapPerMonth: string;\n\n /**\n * An amount in `z-cost-chart`, in full: comma as the decimal mark, a\n * non-breaking space before the currency.\n *\n * @param value The amount.\n * @returns The rendered amount, for example `5,90 €`.\n */\n chartMoney: (value: number) => string;\n\n /**\n * An amount on the value axis of `z-cost-chart`, without the decimals.\n *\n * @param value The amount.\n * @returns The rendered tick, for example `10 €`.\n */\n chartAxisMoney: (value: number) => string;\n\n /**\n * An hour on the time axis of `z-cost-chart`.\n *\n * @param hours The hour.\n * @returns The rendered tick, for example `100 h`.\n */\n chartAxisHours: (hours: number) => string;\n\n /**\n * The direct label at the start of the line in `z-cost-chart`.\n *\n * @param base Base amount per month.\n * @returns The rendered label, for example `1,50 € Grundbetrag`.\n */\n chartBaseLabel: (base: number) => string;\n\n /**\n * The direct label at the point where the cap takes over in `z-cost-chart`.\n *\n * @param hours That hour, rounded for display.\n * @returns The rendered label, for example `ab 100 h gedeckelt`.\n */\n chartCapLabel: (hours: number) => string;\n\n /**\n * The hours in the tooltip and in `aria-valuetext` of `z-cost-chart`.\n *\n * @param hours The hour under the cursor.\n * @returns The rendered text, for example `50 h gespielt`.\n */\n chartPlayed: (hours: number) => string;\n\n /** Caption of the disclosure that holds the table in `z-cost-chart`. */\n chartTable: string;\n\n /** Header of the hours column in that table. */\n chartTableHours: string;\n\n /** Header of the cost column in that table. */\n chartTableCost: string;\n\n /**\n * The last row of that table, which stands for every hour from the cap on.\n *\n * @param hours The hour at which the cap takes over.\n * @returns The rendered cell, for example `100 und mehr`.\n */\n chartTableCapRow: (hours: number) => string;\n}\n\n/** German amount: comma as the decimal mark, non-breaking space before the currency. */\nfunction euroDe(wert: number, stellen: number): string {\n return `${wert.toFixed(stellen).replace('.', ',')}\\u00a0€`;\n}\n\n/**\n * Unit price (E-61): two or three decimals, exact to the tenth of a cent. 0.045 stays 0.045,\n * 0.05 stays 0.05, never rounded to two places.\n */\nfunction einzelpreis(wert: number): string {\n const drei = wert.toFixed(3);\n return drei.endsWith('0') ? wert.toFixed(2) : drei;\n}\n\nconst einzelpreisDe = (wert: number) => `${einzelpreis(wert).replace('.', ',')}\\u00a0€`;\nconst einzelpreisEn = (wert: number) => `€${einzelpreis(wert)}`;\n\n/** English amount: the currency in front, point as the decimal mark. */\nfunction euroEn(wert: number, stellen: number): string {\n return `€${wert.toFixed(stellen)}`;\n}\n\n/**\n * German defaults, the value {@link Z_LABELS} falls back to. They match the\n * wording of the design system: normal capitalisation, no slogans.\n */\nexport const Z_LABELS_DE = {\n paginationPrev: 'Vorherige Seite',\n paginationNext: 'Nächste Seite',\n paginationNav: 'Seitennavigation',\n paginationRange: (from, to, total, itemLabel) => `${from} bis ${to} von ${total} ${itemLabel}`,\n paginationPageSize: 'Einträge pro Seite',\n sliderDecrease: 'Verringern',\n sliderIncrease: 'Erhöhen',\n consoleLog: 'Serverlog',\n consoleInput: 'Befehl',\n consoleJumpToEnd: 'Zum Ende',\n headerMenu: 'Menü',\n toastClose: 'Schließen',\n tableRegion: 'Tabelle, seitlich scrollbar',\n wizardEdit: 'Ändern',\n comboboxEmpty: 'Kein Treffer',\n comboboxResults: (count) => (count === 1 ? '1 Treffer' : `${count} Treffer`),\n comboboxLoading: 'Lädt',\n comboboxUseCustom: (text) => `„${text}“ übernehmen`,\n comboboxMinQuery: (count) => `Mindestens ${count} Zeichen eingeben`,\n summaryRetry: 'Erneut versuchen',\n chartTitle: 'Monatliche Kosten nach gespielten Stunden',\n chartDesc: (base, rate, cap, capHours) =>\n `Start bei ${euroDe(base, 2)} Grundbetrag, plus ${einzelpreisDe(rate)} je Stunde, ` +\n `ab ${capHours} Stunden gedeckelt bei ${euroDe(cap, 2)}.`,\n chartDescOpen: (base, rate) =>\n `Start bei ${euroDe(base, 2)} Grundbetrag, plus ${einzelpreisDe(rate)} je Stunde, ohne Deckel auf dieser Achse.`,\n chartPerHour: 'Pro Stunde',\n chartCapPerMonth: 'Höchstens im Monat',\n chartMoney: (value) => euroDe(value, 2),\n chartAxisMoney: (value) => euroDe(value, 0),\n chartAxisHours: (hours) => `${hours}\\u00a0h`,\n chartBaseLabel: (base) => `${euroDe(base, 2)} Grundbetrag`,\n chartCapLabel: (hours) => `ab ${hours}\\u00a0h gedeckelt`,\n chartPlayed: (hours) => `${hours}\\u00a0h gespielt`,\n chartTable: 'Als Tabelle',\n chartTableHours: 'Gespielte Stunden',\n chartTableCost: 'Kosten im Monat',\n chartTableCapRow: (hours) => `${hours} und mehr`,\n} satisfies ZLabels;\n\n/**\n * English equivalents of {@link Z_LABELS_DE}, complete and ready to hand to\n * {@link provideZenitLabels}.\n *\n * @example\n * ```ts\n * providers: [provideZenitLabels(Z_LABELS_EN)];\n * ```\n */\nexport const Z_LABELS_EN = {\n paginationPrev: 'Previous page',\n paginationNext: 'Next page',\n paginationNav: 'Pagination',\n paginationRange: (from, to, total, itemLabel) => `${from} to ${to} of ${total} ${itemLabel}`,\n paginationPageSize: 'Items per page',\n sliderDecrease: 'Decrease',\n sliderIncrease: 'Increase',\n consoleLog: 'Server log',\n consoleInput: 'Command',\n consoleJumpToEnd: 'Jump to end',\n headerMenu: 'Menu',\n toastClose: 'Close',\n tableRegion: 'Table, scrollable horizontally',\n wizardEdit: 'Change',\n comboboxEmpty: 'No match',\n comboboxResults: (count) => (count === 1 ? '1 result' : `${count} results`),\n comboboxLoading: 'Loading',\n comboboxUseCustom: (text) => `Use “${text}”`,\n comboboxMinQuery: (count) => `Type at least ${count} characters`,\n summaryRetry: 'Try again',\n chartTitle: 'Monthly cost by hours played',\n chartDesc: (base, rate, cap, capHours) =>\n `Starts at ${euroEn(base, 2)} base, plus ${einzelpreisEn(rate)} per hour, ` +\n `capped at ${euroEn(cap, 2)} from ${capHours} hours on.`,\n chartDescOpen: (base, rate) =>\n `Starts at ${euroEn(base, 2)} base, plus ${einzelpreisEn(rate)} per hour, with no cap on this axis.`,\n chartPerHour: 'Per hour',\n chartCapPerMonth: 'At most per month',\n chartMoney: (value) => euroEn(value, 2),\n chartAxisMoney: (value) => euroEn(value, 0),\n chartAxisHours: (hours) => `${hours}\\u00a0h`,\n chartBaseLabel: (base) => `${euroEn(base, 2)} base`,\n chartCapLabel: (hours) => `capped from ${hours}\\u00a0h`,\n chartPlayed: (hours) => `${hours}\\u00a0h played`,\n chartTable: 'As a table',\n chartTableHours: 'Hours played',\n chartTableCost: 'Cost per month',\n chartTableCapRow: (hours) => `${hours} and more`,\n} satisfies ZLabels;\n\n/**\n * The label registry the components read. Without a provider it resolves to\n * {@link Z_LABELS_DE}.\n *\n * Provide it directly on a component to change the texts for that subtree\n * only, or through {@link provideZenitLabels} for the application or a route.\n * Read it with {@link injectZLabels}, not with `inject(Z_LABELS)`: a provider\n * written by hand may be incomplete, and only the function fills the gaps.\n *\n * @example\n * ```ts\n * @Component({\n * providers: [{ provide: Z_LABELS, useValue: Z_LABELS_EN }],\n * })\n * ```\n */\nexport const Z_LABELS = new InjectionToken<ZLabels>('Z_LABELS', {\n providedIn: 'root',\n factory: () => Z_LABELS_DE,\n});\n\n/**\n * Overrides label defaults, for the whole application or for a route. Keys\n * that are left out keep the value of the enclosing injector: a route that\n * overrides one key inside an English application stays English otherwise.\n * Without an enclosing provider they keep their German default, so a partial\n * translation stays valid.\n *\n * **Two calls in the same `providers` array do not stack.** The factory reads\n * the enclosing injector with `skipSelf`, and both calls sit in the same\n * injector, so the second one never sees the first: it merges over the parent,\n * which at the root is `Z_LABELS_DE`. `[provideZenitLabels(Z_LABELS_EN),\n * provideZenitLabels({ tableRegion: 'Invoices, scrollable' })]` therefore gives\n * German labels with one English key, not English with one override. Stacking\n * only works across injectors: application root, then a route.\n *\n * For \"English plus one override\" make it one call with a spread.\n *\n * @param labels The keys to replace.\n * @returns Providers for `bootstrapApplication` or a route's `providers`.\n *\n * @example\n * ```ts\n * bootstrapApplication(App, {\n * providers: [\n * // One call, one object: English everywhere, one key of our own.\n * provideZenitLabels({ ...Z_LABELS_EN, tableRegion: 'Invoices, scrollable' }),\n * ],\n * });\n * ```\n */\nexport function provideZenitLabels(labels: Partial<ZLabels>): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: Z_LABELS,\n useFactory: (): ZLabels => ({\n ...(inject(Z_LABELS, { skipSelf: true, optional: true }) ?? Z_LABELS_DE),\n ...labels,\n }),\n },\n ]);\n}\n\n/**\n * Reads the label registry of the current injector, complete. This is what the\n * components of the library call, and what your own components should call.\n *\n * `{ provide: Z_LABELS, useValue: { toastClose: 'Close' } }` compiles when the\n * value is cast or comes from JSON, and would leave every other key\n * `undefined`: an icon-only button without `aria-label`, a `TypeError` for\n * `paginationRange`. The function therefore lays the provided value over\n * {@link Z_LABELS_DE}. Call it in an injection context.\n *\n * @returns Every key of {@link ZLabels}, the German default where the provider has none.\n *\n * @example\n * ```ts\n * export class Pager {\n * private readonly labels = injectZLabels();\n * }\n * ```\n */\nexport function injectZLabels(): ZLabels {\n return { ...Z_LABELS_DE, ...inject(Z_LABELS) };\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n input,\n model,\n numberAttribute,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ZIcon } from '../icon';\nimport { injectZLabels } from '../labels';\n\n/** Set by the Angular build; a production build drops the branch around it. */\ndeclare const ngDevMode: boolean | undefined;\n\nlet laufendeNummer = 0;\n\n/**\n * Sets an amount on a fixed scale, on a native `<input type=\"range\">`: RAM,\n * slots, storage. The current value always stands next to the track as a\n * number with its unit, so the slider never is the only place the amount\n * appears.\n *\n * Renders the class `z-range` on the host, inside it `div.z-range__head` with\n * the `label.z-field__label` and the value in `span.z-range__value`, then the\n * range input, then `div.z-range__ticks` with one `<span>` per entry of\n * {@link ticks} and finally `span.z-field__hint`. Head label, ticks and hint\n * only appear when their input is filled.\n *\n * {@link steppers} adds a minus and a plus button left and right of the track,\n * which the design system requires beyond twelve steps and on devices without a\n * mouse. They are siblings of the range input, and the host class\n * `z-range--steppers` lays the three out in one grid row; without\n * {@link steppers} the markup is exactly the one from before the buttons\n * existed, so the input stays a direct grid item of `.z-range`. Each of them moves the value by one {@link step} on the grid from\n * {@link min}, clamped to the last value of that grid that fits below\n * {@link max}, and writes through the same path as the track, so model,\n * form and `valueChange` see exactly one change. The scale stays what it is; the\n * buttons only add a second way to reach it, and the range input keeps its own\n * arrow keys, Home and End. A development build warns once per instance when a\n * scale has more than twelve steps and {@link steppers} is off.\n *\n * Accessibility: the label is tied to the input through a generated `id`. With\n * no visible label the input takes {@link ariaLabel} instead, and only then.\n * `aria-valuetext` carries the value with its unit, so a screen reader reads\n * \"8 GB\" and not just \"8\". {@link hint} is referenced through\n * `aria-describedby`, while the tick row is `aria-hidden=\"true\"`, since it only\n * repeats the scale the input already reports. Without {@link label} and\n * without {@link ariaLabel} the slider has no name at all, which a development\n * build reports once per instance as a `console.warn`.\n *\n * Scale and value are written straight onto the native element in an `effect`,\n * `min`, `max` and `step` included, because the browser would otherwise clamp\n * the value to the default scale 0 to 100. The same effect reads the value back\n * from the element afterwards: the element clamps to the scale and snaps to the\n * step, and that corrected value becomes the model and is reported to the form,\n * so thumb, display and value never drift apart. A {@link max} below\n * {@link min} is written onto the element as `min`, the way the browsers read\n * it anyway, so the scale collapses onto `min` and the value is `min`.\n *\n * Forms: implements `ControlValueAccessor`, so `ngModel` and `formControl`\n * work, and so does the Signal Forms `[formField]`, which binds through the\n * same accessor. There the scale comes from the schema: Angular rejects\n * `[min]`, `[max]` and `[disabled]` next to `[formField]` and feeds\n * {@link min}, {@link max}, {@link disabled}, {@link invalid} and\n * {@link touched} from the `min()`, `max()` and `disabled()` rules and the\n * field state. `setDisabledState` from forms and the {@link disabled} input\n * are independent; either one locks the slider.\n *\n * @example\n * ```html\n * <z-slider\n * label=\"Arbeitsspeicher\"\n * unit=\"GB\"\n * [min]=\"2\"\n * [max]=\"16\"\n * [step]=\"2\"\n * [ticks]=\"[2, 4, 8, 16]\"\n * hint=\"Für Minecraft mit Mods sind 8 GB empfohlen.\"\n * [(value)]=\"ram\"\n * />\n * ```\n */\n@Component({\n selector: 'z-slider',\n imports: [ZIcon],\n template: `\n <div class=\"z-range__head\">\n @if (label()) {\n <label class=\"z-field__label\" [attr.for]=\"id\">{{ label() }}</label>\n }\n <span class=\"z-range__value\">{{ anzeige() }}</span>\n </div>\n @if (steppers()) {\n <button\n type=\"button\"\n class=\"z-btn z-btn--ghost z-btn--icon z-btn--sm\"\n [attr.aria-label]=\"wenigerText\"\n [disabled]=\"gesperrt()\"\n [attr.aria-disabled]=\"amMinimum() ? 'true' : null\"\n (click)=\"stufe(-1)\"\n >\n <z-icon name=\"remove\" />\n </button>\n }\n <input\n #feld\n type=\"range\"\n [id]=\"id\"\n [attr.aria-label]=\"label() ? null : ariaLabel() || null\"\n [disabled]=\"gesperrt()\"\n [attr.aria-valuetext]=\"anzeige()\"\n [attr.aria-describedby]=\"hint() ? hinweisId : null\"\n [attr.aria-invalid]=\"invalid() && touched() ? 'true' : null\"\n (input)=\"aufEingabe($event)\"\n (blur)=\"beruehrt()\"\n />\n @if (steppers()) {\n <button\n type=\"button\"\n class=\"z-btn z-btn--ghost z-btn--icon z-btn--sm\"\n [attr.aria-label]=\"mehrText\"\n [disabled]=\"gesperrt()\"\n [attr.aria-disabled]=\"amMaximum() ? 'true' : null\"\n (click)=\"stufe(1)\"\n >\n <z-icon name=\"add\" />\n </button>\n }\n @if (ticks().length) {\n <div class=\"z-range__ticks\" aria-hidden=\"true\">\n @for (marke of ticks(); track $index) {\n <span>{{ marke }}</span>\n }\n </div>\n }\n @if (hint()) {\n <span class=\"z-field__hint\" [id]=\"hinweisId\">{{ hint() }}</span>\n }\n `,\n host: { class: 'z-range', '[class.z-range--steppers]': 'steppers()' },\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ZSlider), multi: true }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSlider implements ControlValueAccessor {\n /**\n * Visible label above the track, tied to the input through a generated `id`.\n * Empty renders no label, and then {@link ariaLabel} names the input.\n *\n * @default ''\n */\n readonly label = input('');\n\n /**\n * `aria-label` of the input, used only while {@link label} stays empty. A\n * visible label always wins.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * Lower end of the scale. With `[formField]` it comes from the `min()` rule\n * of the schema; without such a rule, `undefined`, it is the default.\n *\n * @default 0\n */\n readonly min = input(0, { transform: (wert: unknown) => numberAttribute(wert, 0) });\n\n /**\n * Upper end of the scale. With `[formField]` it comes from the `max()` rule\n * of the schema; without such a rule, `undefined`, it is the default.\n *\n * @default 100\n */\n readonly max = input(100, { transform: (wert: unknown) => numberAttribute(wert, 100) });\n\n /**\n * Distance between two bookable steps. Only steps that can actually be\n * ordered belong on the scale.\n *\n * @default 1\n */\n readonly step = input(1, { transform: numberAttribute });\n\n /**\n * Unit behind the value, for example `GB`. Shown next to the number with a\n * non-breaking space and read out through `aria-valuetext`. Empty shows the\n * bare number.\n *\n * @default ''\n */\n readonly unit = input('');\n\n /**\n * Adds a minus and a plus button left and right of the track, each moving the\n * value by one {@link step}. The design system requires them beyond twelve\n * steps and on devices without a mouse. Explicit on purpose:\n * the component never switches them on by itself, because a slider that grows\n * a pair of buttons the moment a `max` changes is a layout that moves without\n * anyone asking for it. A development build warns once per instance when\n * `(max - min) / step` is above twelve and this is still off. Boolean\n * attribute.\n *\n * @default false\n */\n readonly steppers = input(false, { transform: booleanAttribute });\n\n /**\n * Scale values printed below the track, for example `[2, 4, 8, 16]`. Purely\n * visual: the row is `aria-hidden`, and the values change nothing about the\n * scale itself. An empty list renders no tick row.\n *\n * @default []\n */\n readonly ticks = input<readonly (string | number)[]>([]);\n\n /**\n * One sentence below the track, normally the recommendation for the chosen\n * game. Referenced through `aria-describedby`; empty renders nothing.\n *\n * @default ''\n */\n readonly hint = input('');\n\n /**\n * Current value, two-way bindable. Also the value seen by `ngModel` and\n * `formControl`. A value outside {@link min} and {@link max} or between two\n * steps is corrected to the value the element really holds, and that\n * correction is written back here and reported to the form.\n *\n * @default 0\n */\n readonly value = model(0);\n\n /**\n * Locks the slider. Independent of `setDisabledState` from forms; either one\n * is enough. Boolean attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Validation failed. Writes `aria-invalid=\"true\"` onto the range input while\n * {@link touched} holds too; there is no error colour for a slider. Set by\n * `[formField]` from the field state. Boolean attribute.\n *\n * @default false\n */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the user has left the slider, which gates {@link invalid}, so an\n * untouched form does not start out in error. Set by `[formField]`; outside\n * Signal Forms it stays `true` and {@link invalid} alone decides.\n *\n * @default true\n */\n readonly touched = input(true, { transform: booleanAttribute });\n\n protected readonly id = `z-slider-${++laufendeNummer}`;\n protected readonly hinweisId = `${this.id}-hint`;\n\n /** Value with its unit, separated by a non-breaking space. */\n protected readonly anzeige = computed(() =>\n this.unit() ? `${this.value()}\\u{00a0}${this.unit()}` : `${this.value()}`,\n );\n\n /** Lock coming from forms, independent of the `disabled` input. Either one is enough. */\n private readonly formsGesperrt = signal(false);\n protected readonly gesperrt = computed(() => this.disabled() || this.formsGesperrt());\n\n private readonly labels = injectZLabels();\n /** Names of the two buttons; the registry is the only place they come from. */\n protected readonly wenigerText = this.labels.sliderDecrease;\n protected readonly mehrText = this.labels.sliderIncrease;\n\n /**\n * Upper end as the browsers read it: a `max` below `min` collapses the scale\n * onto `min`, the same way the effect writes it onto the element.\n */\n protected readonly obergrenze = computed(() => Math.max(this.min(), this.max()));\n protected readonly amMinimum = computed(() => this.value() <= this.min());\n protected readonly amMaximum = computed(() => this.value() >= this.letzterWert());\n\n /** The step the buttons move by; `0` and `NaN` would otherwise freeze them. */\n private readonly schrittweite = computed(() => Math.abs(this.step()) || 1);\n\n /**\n * Highest value on the step grid from `min`: `max` itself only when it lies\n * on the grid (0 to 10 in steps of 3 ends at 9, as the element snaps it). The\n * `1e-9` keeps a fractional step from losing its last step to float error.\n */\n private readonly letzterWert = computed(() =>\n this.aufRaster(Math.floor((this.obergrenze() - this.min()) / this.schrittweite() + 1e-9)),\n );\n\n private melde?: (wert: number) => void;\n private aufBeruehrt?: () => void;\n\n private readonly feld = viewChild.required<ElementRef<HTMLInputElement>>('feld');\n\n constructor() {\n // Scale and value are written straight onto the element, not through\n // bindings. A pointer input changes the value on the element itself. If a\n // control reverts it before a change detection ran, the expression still\n // holds the same value as last rendered and a [value] binding would not\n // write: track and control would drift apart. min, max and step are part\n // of the same effect, because the browser would otherwise clamp the value\n // to the still unset default scale 0 to 100.\n effect(() => {\n const schiene = this.feld().nativeElement;\n schiene.min = String(this.min());\n // A max below min is an authoring mistake. The browsers resolve it as\n // \"the maximum is at least the minimum\", so the scale collapses onto min;\n // it is written that way, because the engines disagree on which of the\n // two clamps wins otherwise and the value would then keep flipping\n // between min and max.\n schiene.max = String(Math.max(this.min(), this.max()));\n schiene.step = String(this.step());\n schiene.value = String(this.value());\n // The element keeps itself on the scale: it clamps to min and max and\n // rounds onto the step. Without reading that back, thumb, aria-valuetext\n // and model would name three different numbers. The correction runs at\n // most once, because the next pass reads back exactly the value it has\n // just written.\n //\n // `Number.isFinite`, not `!Number.isNaN`: only an engine that really\n // parses the value answers with a number at all. The server has no\n // layout and no value parsing, so `valueAsNumber` is `undefined` there —\n // and `Number.isNaN(undefined)` is `false`, so the old guard let it\n // through and the slider reported `undefined` to the form, which dropped\n // the field out of the model and took `[formField]` down with it.\n const echt = schiene.valueAsNumber;\n if (Number.isFinite(echt) && echt !== untracked(this.value)) {\n this.value.set(echt);\n this.melde?.(echt);\n }\n });\n\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n // After the first render, so a name arriving through a binding is there.\n afterNextRender(() => {\n if (!this.label() && !this.ariaLabel()) {\n console.warn(\n 'ZSlider: Der Regler hat keinen zugänglichen Namen. Setze label=\"…\" für ein sichtbares Label oder ariaLabel=\"…\" ohne sichtbares Label.',\n );\n }\n const stufen = (this.obergrenze() - this.min()) / this.schrittweite();\n if (!this.steppers() && stufen > 12) {\n console.warn(\n `ZSlider: ${Math.round(stufen)} Stufen ohne steppers. ` +\n 'spec/components/Slider/README.md: \"Bei mehr als 12 Stufen oder auf Geräten ohne ' +\n 'Maus zusätzlich Plus- und Minus-Buttons anbieten.\" Setze steppers am z-slider.',\n );\n }\n });\n }\n }\n\n /**\n * One step up or down, the way the two buttons move the value: clamped to the\n * scale and reported through the same path as an input on the track, so model,\n * form and `valueChange` see exactly one change. A button that is only marked\n * `aria-disabled` keeps the focus, so its click is swallowed here.\n */\n protected stufe(richtung: 1 | -1): void {\n if (this.gesperrt() || (richtung < 0 ? this.amMinimum() : this.amMaximum())) {\n return;\n }\n const k = Math.round((untracked(this.value) - this.min()) / this.schrittweite()) + richtung;\n const ziel = Math.min(Math.max(this.aufRaster(k), this.min()), this.letzterWert());\n if (ziel === untracked(this.value)) {\n return;\n }\n this.value.set(ziel);\n this.melde?.(ziel);\n }\n\n /**\n * Grid value number `k`, `min + k * step`, without the float error of the\n * product (`3 * 0.1` is `0.30000000000000004`), so the element never has to\n * correct a value the buttons wrote.\n */\n private aufRaster(k: number): number {\n return Number((this.min() + k * this.schrittweite()).toPrecision(12));\n }\n\n protected aufEingabe(ereignis: Event): void {\n const wert = (ereignis.target as HTMLInputElement).valueAsNumber;\n this.value.set(wert);\n this.melde?.(wert);\n }\n\n protected beruehrt(): void {\n this.aufBeruehrt?.();\n }\n\n /**\n * `ControlValueAccessor`: takes the value from the form. `null` and\n * `undefined` fall back to {@link min}.\n */\n writeValue(wert: number): void {\n this.value.set(Number(wert ?? this.min()));\n }\n\n /**\n * `ControlValueAccessor`: registers the callback that reports a new value to\n * the form. It fires on every `input` of the track, so while dragging, not on\n * writes through {@link value}.\n */\n registerOnChange(fn: (wert: number) => void): void {\n this.melde = fn;\n }\n\n /** `ControlValueAccessor`: registers the callback fired when the track loses focus. */\n registerOnTouched(fn: () => void): void {\n this.aufBeruehrt = fn;\n }\n\n /** `ControlValueAccessor`: locks or unlocks the slider from the form side. */\n setDisabledState(gesperrt: boolean): void {\n this.formsGesperrt.set(gesperrt);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { leiheAttribut } from '../a11y/host-attribute';\n\n/** One view in a segment. */\nexport interface ZSegmentOption {\n /** The value reported through `value`. Also the tracking key of the list. */\n value: string;\n /** Short noun shown on the button, without an icon. */\n label: string;\n}\n\n/**\n * Segment switches the view on the same data, at most four options: the period\n * in the billing view, open versus closed in support, filters. For sub-pages\n * with a URL of their own use `ZTabs` instead.\n *\n * Renders one `<button type=\"button\">` per option and puts the class\n * `z-segment` on the host.\n *\n * Accessibility: the host is a `role=\"group\"` named by {@link ariaLabel}; the\n * chosen option carries `aria-pressed=\"true\"`, all others `\"false\"`. Without\n * {@link ariaLabel} an `aria-label` the caller wrote on `<z-segment>` itself\n * names the group, static or bound: the input wins while it holds a value, and\n * the caller's attribute stands while it does not. `aria-labelledby` is never\n * written by the component, so it always belongs to the caller. The\n * buttons are ordinary tab stops, so the Tab key moves between them and Enter\n * or Space picks one. While disabled every button is `disabled` and therefore\n * out of the tab order.\n *\n * Implements `ControlValueAccessor`, so `ngModel` and reactive forms work\n * alongside the two-way binding on {@link value}, and has the shape of a\n * Signal Forms `FormValueControl<string>`, so `[formField]` works and feeds\n * {@link disabled} from the field state. A segment picks a view and has no\n * invalid state: `role=\"group\"` does not take `aria-invalid`.\n *\n * @example\n * ```html\n * <z-segment\n * [options]=\"[{ value: '1', label: '1 Monat' }, { value: '12', label: '12 Monate' }]\"\n * [(value)]=\"zeitraum\"\n * ariaLabel=\"Zeitraum\"\n * />\n * ```\n */\n@Component({\n selector: 'z-segment',\n template: `\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n [attr.aria-pressed]=\"option.value === value()\"\n [disabled]=\"gesperrt()\"\n (click)=\"waehle(option.value)\"\n (blur)=\"beruehrt()\"\n >\n {{ option.label }}\n </button>\n }\n `,\n host: {\n class: 'z-segment',\n role: 'group',\n },\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ZSegment), multi: true }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSegment implements ControlValueAccessor, FormValueControl<string> {\n /**\n * The options in display order, at most four. Tracked by `value`, so those\n * have to be unique.\n *\n * @default []\n */\n readonly options = input<readonly ZSegmentOption[]>([]);\n\n /**\n * The chosen option's `value`, two-way bindable. A value that matches no\n * option leaves every button unpressed.\n *\n * @default ''\n */\n readonly value = model('');\n\n /**\n * Accessible name of the group, for example \"Zeitraum\". Empty leaves the\n * naming to the caller: an `aria-label` or `aria-labelledby` written on\n * `<z-segment>` stays where it is.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * Disables every button. Independent of the disabled state that reactive\n * forms set; either one is enough to lock the segment.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Lock coming from forms, independent of the `disabled` input. Either one suffices. */\n private readonly formsGesperrt = signal(false);\n protected readonly gesperrt = computed(() => this.disabled() || this.formsGesperrt());\n\n private melde?: (wert: string) => void;\n private aufBeruehrt?: () => void;\n\n constructor() {\n // `[attr.aria-label]` as a host binding would write `null` whenever the\n // input is empty and thereby delete the `aria-label` the caller wrote on\n // `<z-segment>`, which used to leave the group without any name at all.\n leiheAttribut('aria-label', () => this.ariaLabel() || null);\n }\n\n protected waehle(wert: string): void {\n if (wert === this.value()) {\n return;\n }\n this.value.set(wert);\n this.melde?.(wert);\n }\n\n protected beruehrt(): void {\n this.aufBeruehrt?.();\n }\n\n /**\n * `ControlValueAccessor`: takes the value from the form. `null` and\n * `undefined` become the empty string, which selects nothing.\n */\n writeValue(wert: string): void {\n this.value.set(wert ?? '');\n }\n\n /**\n * `ControlValueAccessor`: registers the callback that reports a new value to\n * the form. It fires on a click on a different option, not on writes through\n * {@link value}.\n */\n registerOnChange(fn: (wert: string) => void): void {\n this.melde = fn;\n }\n\n /** `ControlValueAccessor`: registers the callback fired when a button loses focus. */\n registerOnTouched(fn: () => void): void {\n this.aufBeruehrt = fn;\n }\n\n /** `ControlValueAccessor`: locks or unlocks the segment from the form side. */\n setDisabledState(gesperrt: boolean): void {\n this.formsGesperrt.set(gesperrt);\n }\n}\n","/* Package formulare: Checkbox, Toggle, Setting, Slider and Segment. */\n\nexport * from '../checkbox';\nexport * from '../toggle';\nexport * from '../slider';\nexport * from '../segment';\n","import { booleanAttribute, Directive, input } from '@angular/core';\n\n/**\n * Tab bar for the sub-pages of one area. Every tab is a link with its own URL.\n *\n * Adds the class `z-tabs` to the host `<nav>` and renders no markup of its own.\n * On narrow screens the bar scrolls horizontally, it never wraps. Put an\n * `aria-label` on the `<nav>` naming the area the tabs belong to, so the\n * landmark is distinguishable from the other navigations on the page.\n *\n * Use `ZSegment` instead when the options only switch the view on the same data.\n *\n * @example\n * ```html\n * <nav zTabs aria-label=\"Hosting\">\n * <a zTab routerLink=\"uebersicht\" [active]=\"true\">Übersicht</a>\n * <a zTab routerLink=\"apps\">Apps</a>\n * <a zTab routerLink=\"speicher\">Speicher</a>\n * </nav>\n * ```\n */\n@Directive({\n selector: 'nav[zTabs]',\n host: { class: 'z-tabs' },\n})\nexport class ZTabs {}\n\n/**\n * One tab inside `nav[zTabs]`, always a link. Carries the class `z-tab`.\n *\n * When `active` is set the host gets `aria-current=\"page\"`; that attribute is\n * both what assistive technology announces and what the stylesheet draws the\n * 2px underline from. The library does not read the router, so the caller\n * decides which tab is active. The link itself brings keyboard support, the\n * directive adds none.\n *\n * @example\n * ```html\n * <a zTab routerLink=\"speicher\" [active]=\"bereich() === 'speicher'\">Speicher</a>\n * ```\n */\n@Directive({\n selector: 'a[zTab]',\n host: {\n class: 'z-tab',\n '[attr.aria-current]': `active() ? \"page\" : null`,\n },\n})\nexport class ZTab {\n /**\n * Whether this tab points at the page currently shown. Written as a bare\n * attribute (`active`) it counts as `true`.\n *\n * @default false\n */\n readonly active = input(false, { transform: booleanAttribute });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n untracked,\n viewChildren,\n} from '@angular/core';\n\n/** Counts up once per panel, so two groups on one page never share an id. */\nlet panelZaehler = 0;\n\n/**\n * One view of a `z-tab-group`: its caption in the tab bar and its content below\n * it. The caption is the {@link label} input, the content is projected.\n *\n * Renders the host as `role=\"tabpanel\"` with `tabindex=\"0\"` and\n * `aria-labelledby` pointing at its own tab. While the panel is not the active\n * one the host carries the `hidden` attribute, so it is out of the layout and\n * out of the accessibility tree.\n *\n * The content is wrapped in an `ng-template` and rendered through\n * `ngTemplateOutlet`, so only the active panel's content stands in the\n * document. What that saves and what it does not: the elements are removed\n * from the document, the component instances behind them are not destroyed,\n * because Angular creates projected nodes together with the view that declares\n * them. So this saves DOM and layout work, never a request or a constructor.\n * Set {@link ZTabGroup.keepAlive} when the elements themselves have to survive\n * a tab change, for example a scroll position, a playing `<video>` or an\n * `<iframe>` that must not reload.\n *\n * @example\n * ```html\n * <z-tab-panel value=\"speicher\" label=\"Speicher\" disabled>\n * <p>12,4 GB von 40 GB belegt.</p>\n * </z-tab-panel>\n * ```\n */\n@Component({\n selector: 'z-tab-panel',\n imports: [NgTemplateOutlet],\n template: `<ng-template #inhalt><ng-content /></ng-template>\n @if (sichtbar()) {\n <ng-container [ngTemplateOutlet]=\"inhalt\" />\n }`,\n host: {\n role: 'tabpanel',\n // Always a tab stop instead of checking after every render whether the\n // panel holds something focusable: the content is whatever the caller\n // projects, so such a check would have to run again on every change of it\n // and would still be wrong in between. An extra tab stop is what the\n // WAI-ARIA Tabs pattern asks for when the panel has no focusable element,\n // and it is harmless when it has one.\n tabindex: '0',\n '[id]': 'panelId',\n '[attr.aria-labelledby]': 'tabId',\n '[attr.hidden]': `aktiv() ? null : ''`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZTabPanel {\n /**\n * Identifies the panel. This is what `z-tab-group` reports through its\n * `value` model and what the caller binds against, instead of an index that\n * moves as soon as a panel is added. Unique within one group.\n */\n readonly value = input.required<string>();\n\n /**\n * Caption of the tab, a short noun without an icon. The text comes from the\n * caller; the library holds no German strings.\n */\n readonly label = input.required<string>();\n\n /**\n * Locks the tab: it is a natively `disabled` button, so it cannot be clicked\n * and the arrow keys skip it. A locked control never says why by itself, so\n * write the reason next to the group as visible text. Boolean attribute, so\n * `disabled` alone counts as `true`.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Id of the tab that opens this panel, rendered by the group.\n *\n * @internal Wiring between `z-tab-group` and its panels.\n */\n readonly tabId = `z-tab-${++panelZaehler}`;\n\n /**\n * Id of this panel, pointed at by `aria-controls` of its tab.\n *\n * @internal Wiring between `z-tab-group` and its panels.\n */\n readonly panelId = `z-tabpanel-${panelZaehler}`;\n\n private readonly gruppe = inject(ZTabGroup, { optional: true });\n\n /**\n * Whether this is the panel the group currently shows.\n *\n * An empty `value` on the group means \"the first enabled panel\", and that\n * question is answered here from `disabled` alone. The panel deliberately\n * never reads the `value` of its siblings: a `@for` creates every panel\n * before it binds the inputs of any of them, and the first panel renders\n * while the last one still has no `value`, which would throw NG0950. The one\n * case that does need all values, a `value` that matches no panel, is\n * corrected by `ZTabGroup` after the render.\n *\n * @internal Read by `z-tab-group` for `aria-selected` and the roving tabindex.\n */\n readonly aktiv = computed(() => {\n const gruppe = this.gruppe;\n if (!gruppe) {\n return true;\n }\n const wert = gruppe.value();\n return wert ? wert === this.value() : gruppe.erstesOffenes() === this;\n });\n\n /** Stays `true` once the panel has been active, which is what `keepAlive` keeps. */\n private readonly besucht = linkedSignal<boolean, boolean>({\n source: this.aktiv,\n computation: (aktiv, vorher) => aktiv || (vorher?.value ?? false),\n });\n\n /**\n * Whether the panel's content stands in the document.\n *\n * @internal Read by `z-tab-group`, which points `aria-controls` only at a\n * panel that is really there.\n */\n readonly sichtbar = computed(() => {\n // Read first and not behind the `||`: a linkedSignal only remembers what it\n // has been evaluated for, and behind the short circuit it would first be\n // read once the panel is already inactive, which is a panel that counts as\n // never visited.\n const besucht = this.besucht();\n return this.aktiv() || (this.gruppe?.keepAlive() === true && besucht);\n });\n}\n\n/**\n * Tabs for views that have no address of their own: the WAI-ARIA Tabs pattern\n * as `role=\"tablist\"` with `role=\"tab\"` buttons and one `role=\"tabpanel\"` per\n * view.\n *\n * Use `ZTabs` with `a[zTab]` instead whenever each view can have its own URL.\n * Links are the better tabs: they can be bookmarked, opened in a new tab and\n * the back button works on them. Reach for `z-tab-group` only where adding a\n * route is not possible or not wanted, for example a dialog with two forms or\n * a panel section that must not appear in the history.\n *\n * Renders `div.z-tabs[role=\"tablist\"]` with one `button.z-tab[role=\"tab\"]` per\n * projected `z-tab-panel`, and below it the panels themselves. The active tab\n * carries `aria-selected=\"true\"`, which is what the stylesheet draws the 2px\n * underline from.\n *\n * Accessibility: automatic activation, so an arrow key moves the focus and\n * switches the view in one step. Arrow Left and Right step through the tabs and\n * wrap around, Home and End jump to the first and the last one, disabled tabs\n * are skipped, and in a right-to-left context the two arrows swap. Only the\n * active tab is a tab stop (roving `tabindex`), so Tab leads from the bar into\n * the panel. Name the bar with {@link ariaLabel} or {@link ariaLabelledby}.\n *\n * @example\n * ```html\n * <z-tab-group ariaLabel=\"Serveransichten\" [(value)]=\"ansicht\">\n * <z-tab-panel value=\"uebersicht\" label=\"Übersicht\">\n * <p>2 von 20 Spielern online.</p>\n * </z-tab-panel>\n * <z-tab-panel value=\"speicher\" label=\"Speicher\">\n * <p>12,4 GB von 40 GB belegt.</p>\n * </z-tab-panel>\n * </z-tab-group>\n * ```\n */\n@Component({\n selector: 'z-tab-group',\n template: `<div\n class=\"z-tabs\"\n role=\"tablist\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n >\n @for (panel of panels(); track panel) {\n <button\n #knopf\n class=\"z-tab\"\n type=\"button\"\n role=\"tab\"\n [id]=\"panel.tabId\"\n [disabled]=\"panel.disabled()\"\n [attr.aria-selected]=\"panel.aktiv()\"\n [attr.aria-controls]=\"panel.sichtbar() ? panel.panelId : null\"\n [attr.tabindex]=\"panel.aktiv() ? 0 : -1\"\n (click)=\"waehle(panel)\"\n (keydown)=\"aufTaste($event)\"\n >\n {{ panel.label() }}\n </button>\n }\n </div>\n <ng-content />`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZTabGroup {\n /**\n * Accessible name of the tab bar, for example \"Serveransichten\". Empty\n * writes no `aria-label`; use {@link ariaLabelledby} instead when a visible\n * heading already names the group.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * Id of the element that names the tab bar, usually the heading above it.\n * Empty writes no `aria-labelledby`.\n *\n * @default ''\n */\n readonly ariaLabelledby = input('');\n\n /**\n * The active panel's {@link ZTabPanel.value}, two-way bindable. Empty or a\n * value that matches no enabled panel falls back to the first enabled one,\n * and that fallback is written back, so the caller never holds a value the\n * group does not show. With no panel at all the value is left alone.\n *\n * @default ''\n */\n readonly value = model('');\n\n /**\n * Keeps every panel that has been active in the document and hides the\n * inactive ones with the `hidden` attribute, instead of rendering the active\n * one alone. Turn it on when the elements of a panel have to survive a tab\n * change: a scroll position, a playing `<video>`, an `<iframe>` that must not\n * reload. Boolean attribute.\n *\n * @default false\n */\n readonly keepAlive = input(false, { transform: booleanAttribute });\n\n protected readonly panels = contentChildren(ZTabPanel);\n private readonly knoepfe = viewChildren<ElementRef<HTMLButtonElement>>('knopf');\n private readonly wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n /** The panels an arrow key may land on. */\n private readonly bedienbar = computed(() => this.panels().filter((p) => !p.disabled()));\n\n /**\n * The panel an empty {@link value} means. Reads `disabled` only, never a\n * `value`, so a panel may ask for it while its siblings are still unbound.\n *\n * @internal Read by `z-tab-panel`.\n */\n readonly erstesOffenes = computed(() => this.bedienbar()[0]);\n\n /**\n * The value actually shown: {@link value} when an enabled panel carries it,\n * otherwise the first enabled panel. Reads the `value` of every panel and is\n * therefore only read after the render and from event handlers, never while\n * the panels are being created.\n */\n private readonly aktiverWert = computed(() => {\n const offen = this.bedienbar();\n const gewaehlt = offen.find((panel) => panel.value() === this.value());\n return (gewaehlt ?? offen[0])?.value() ?? '';\n });\n\n constructor() {\n // Writes the fallback back into the model of the parent, the same case as\n // the clamped page of ZPagination (docs/signals.md, \"Effects\", case 3): a\n // computed cannot write. It runs when the group starts without a value and\n // when the active panel disappears. Without any panel nothing is written,\n // so a value set before the panels arrive survives.\n // After the render and not in a plain effect(): a plain effect runs while\n // the content query already holds a panel that a `@for` has just created\n // whose required `value` is still unbound, and reading it throws NG0950.\n // After the render every panel is bound.\n afterRenderEffect(() => {\n const wert = this.aktiverWert();\n if (this.bedienbar().length && untracked(this.value) !== wert) {\n this.value.set(wert);\n }\n });\n }\n\n /** Activates a panel, moves the focus onto its tab and scrolls it into view. */\n protected waehle(panel: ZTabPanel): void {\n this.value.set(panel.value());\n const knopf = this.knoepfe()[this.panels().indexOf(panel)]?.nativeElement;\n knopf?.focus();\n // Optional because a test environment without layout does not implement it.\n knopf?.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n }\n\n protected aufTaste(ereignis: KeyboardEvent): void {\n const offen = this.bedienbar();\n if (!offen.length) {\n return;\n }\n // The dir attribute, the same source the CDK's Directionality reads, and\n // the one a document has to set anyway for the text to run the right way.\n const rtl = this.wirt.closest('[dir]')?.getAttribute('dir') === 'rtl';\n const jetzt = Math.max(\n 0,\n offen.findIndex((panel) => panel.value() === this.aktiverWert()),\n );\n const ziel: Record<string, number> = {\n ArrowRight: jetzt + (rtl ? -1 : 1),\n ArrowLeft: jetzt + (rtl ? 1 : -1),\n Home: 0,\n End: offen.length - 1,\n };\n if (!(ereignis.key in ziel)) {\n return;\n }\n ereignis.preventDefault();\n this.waehle(offen[(ziel[ereignis.key] + offen.length) % offen.length]);\n }\n}\n","import { ChangeDetectionStrategy, Component, input, numberAttribute } from '@angular/core';\n\n/**\n * Step indicator for a multi-step flow. Belongs in the order assistant, where\n * the steps really do follow one another.\n *\n * Renders an `<ol class=\"z-steps\">` with one `<li class=\"z-step\">` per entry of\n * `steps`, each opened by its position in `.z-step__num`. Steps before `current`\n * get `z-step--done`, the current one carries `aria-current=\"step\"`. The ordered\n * list conveys the sequence to assistive technology; the component is static\n * text and adds no focus or keyboard handling of its own.\n *\n * @example\n * ```html\n * <z-stepper [steps]=\"['Spiel', 'Leistung', 'Bezahlen']\" [current]=\"1\" />\n * ```\n */\n@Component({\n selector: 'z-stepper',\n template: `\n <ol class=\"z-steps\">\n @for (schritt of steps(); track $index) {\n <li\n class=\"z-step\"\n [class.z-step--done]=\"$index < current()\"\n [attr.aria-current]=\"$index === current() ? 'step' : null\"\n >\n <span class=\"z-step__num\">{{ $index + 1 }}</span\n >{{ schritt }}\n </li>\n }\n </ol>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZStepper {\n /**\n * Labels of the steps in order, one short noun each. The spec asks for two to\n * four steps. An empty array renders an empty list.\n *\n * @default []\n */\n readonly steps = input<string[]>([]);\n\n /**\n * Zero-based index of the current step; every step with a lower index counts\n * as done. An index past the last step marks all steps done and none current.\n *\n * @default 0\n */\n readonly current = input(0, { transform: numberAttribute });\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChildren,\n DestroyRef,\n ElementRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ZSelect } from '../field';\nimport { ZIcon } from '../icon';\n\n/**\n * One entry of the sidebar, a Material Icon plus a noun. Sits on a `<button>`\n * or on an `<a>` through the attribute `zSidebarItem`, so links keep their\n * `href` and their routing.\n *\n * Renders the class `z-side__item` on the host and inside it the optional\n * `z-icon`, the projected text and, when {@link count} is not `null`, a\n * `span.z-side__count`.\n *\n * Accessibility: the active entry carries `aria-current=\"page\"` and is the only\n * one whose icon is coloured; the active surface is `surface-hover`, never a\n * green or red fill.\n *\n * @example\n * ```html\n * <a zSidebarItem icon=\"dashboard\" routerLink=\"/server/1\" [active]=\"true\">Übersicht</a>\n * <a zSidebarItem icon=\"report\" routerLink=\"/server/1/abstuerze\" [count]=\"3\">Abstürze</a>\n * ```\n */\n@Component({\n // The API table prescribes the selector `[zSidebarItem]` without an element:\n // the entry is a `<button>` or an `<a>`. Icon and counter need a template,\n // hence a component instead of a directive.\n selector: '[zSidebarItem]',\n imports: [ZIcon],\n // No whitespace between the parts: .z-side__item is flex with gap, so every\n // text node would otherwise be an item of its own in the row.\n template: `@if (icon()) {\n <z-icon [name]=\"icon()\" />\n }\n <ng-content />\n @if (count() !== null) {\n <span class=\"z-side__count\">{{ count() }}</span>\n }`,\n host: {\n class: 'z-side__item',\n '[attr.aria-current]': `active() ? \"page\" : null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSidebarItem {\n /**\n * Name of the Material Icon in front of the text. Empty renders no icon.\n *\n * @default ''\n */\n readonly icon = input('');\n\n /**\n * Marks the entry as the current page: `aria-current=\"page\"`, coloured icon,\n * `surface-hover` behind it. At most one entry per sidebar. Boolean\n * attribute.\n *\n * @default false\n */\n readonly active = input(false, { transform: booleanAttribute });\n\n /**\n * Counter at the right edge of the entry, for example the number of crashes.\n * `null` renders nothing, `0` renders the digit.\n *\n * @default null\n */\n readonly count = input<number | null>(null);\n\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Visible text without icon and counter, for the select below 900px. Only\n * the projected text nodes are read; if the label sits inside an element, the\n * result stays empty.\n *\n * @internal Read by `ZSidebar` to mirror the entries; not part of the\n * documented API.\n */\n beschriftung(): string {\n return Array.from(this.el.nativeElement.childNodes)\n .filter((knoten) => knoten.nodeType === Node.TEXT_NODE)\n .map((knoten) => knoten.textContent ?? '')\n .join('')\n .trim();\n }\n\n /**\n * Triggers the entry when it is picked in the select below 900px, by\n * clicking the host element, so a `routerLink` or a click handler on it runs\n * as if the user had hit the entry itself.\n *\n * @internal Called by `ZSidebar`; not part of the documented API.\n */\n klicke(): void {\n this.el.nativeElement.click();\n }\n}\n\n/**\n * Group of sidebar entries with one word as its heading. At most four groups\n * per sidebar.\n *\n * Renders the class `z-side__group` on the host, inside it the optional\n * `span.z-side__label` and the projected entries. The first group normally has\n * no label. Groups disappear in the select below 900px, so a group heading\n * must never carry meaning the entries do not.\n *\n * @example\n * ```html\n * <z-sidebar-group label=\"Betrieb\">\n * <a zSidebarItem icon=\"backup\" routerLink=\"/server/1/backups\">Backups</a>\n * </z-sidebar-group>\n * ```\n */\n@Component({\n selector: 'z-sidebar-group',\n template: `@if (label()) {\n <span class=\"z-side__label\">{{ label() }}</span>\n }\n <ng-content />`,\n host: { class: 'z-side__group' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSidebarGroup {\n /**\n * Heading of the group, one word in normal capitalization. Empty renders no\n * heading, which is how the first group usually stands.\n *\n * @default ''\n */\n readonly label = input('');\n}\n\n/**\n * Navigation inside a server panel: at most four groups with 12 to 14 entries\n * together.\n *\n * Renders `nav.z-side` with the projected groups and entries, and next to it a\n * `z-select` holding a native `<select>`. The stylesheet shows exactly one of\n * the two: above 900px the list, below it the select over the content. The\n * select mirrors the same entries, one `<option>` per `[zSidebarItem]` in\n * document order, and on a change it triggers the click of the chosen entry,\n * so routing works the same in both. The groups fall away in the select, which\n * is why a group heading must not be the only carrier of a fact.\n *\n * Accessibility: {@link ariaLabel} names both the `nav` and the select, so the\n * navigation is announced with a name at either width. The entry labels are\n * projected text and can only be read after rendering, so they are collected\n * once after the first render and from then on whenever a `MutationObserver`\n * reports a change below the sidebar, which is how a label that changes at\n * runtime still reaches the select.\n *\n * @example\n * ```html\n * <z-sidebar ariaLabel=\"Server-Navigation\">\n * <z-sidebar-group>\n * <a zSidebarItem icon=\"dashboard\" routerLink=\"/server/1\" [active]=\"true\">Übersicht</a>\n * </z-sidebar-group>\n * <z-sidebar-group label=\"Spiel\">\n * <a zSidebarItem icon=\"group\" routerLink=\"/server/1/spieler\">Spieler</a>\n * </z-sidebar-group>\n * </z-sidebar>\n * ```\n */\n@Component({\n selector: 'z-sidebar',\n imports: [ZSelect],\n template: `\n <nav class=\"z-side\" [attr.aria-label]=\"ariaLabel() || null\"><ng-content /></nav>\n <z-select>\n <select [attr.aria-label]=\"ariaLabel() || null\" (change)=\"waehle($event)\">\n @for (eintrag of eintraege(); track eintrag; let i = $index) {\n <option [selected]=\"eintrag.active()\">{{ beschriftungen()[i] }}</option>\n }\n </select>\n </z-select>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSidebar {\n /**\n * `aria-label` of the navigation, written onto the `nav` as well as onto the\n * select, for example \"Server-Navigation\". Empty writes no attribute.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n protected readonly eintraege = contentChildren(ZSidebarItem, { descendants: true });\n protected readonly beschriftungen = signal<string[]>([]);\n\n constructor() {\n const wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const zerstoerung = inject(DestroyRef);\n // The labels are projected text in the DOM and can only be read after\n // rendering, hence the detour through a signal. An interpolated label\n // changes without the item query changing, and the only thing that can\n // change it is text or child nodes below the sidebar: a MutationObserver\n // reports exactly that and costs nothing in between, while a callback after\n // every render of the application would walk every item every time. The\n // result is only written back when it really differs, otherwise every write\n // would schedule the next render. afterNextRender gives the first read once\n // the items stand and keeps the observer out of the server.\n afterNextRender(() => {\n const lies = (): void => {\n const neu = this.eintraege().map((eintrag) => eintrag.beschriftung());\n const alt = this.beschriftungen();\n if (neu.length !== alt.length || neu.some((text, i) => text !== alt[i])) {\n this.beschriftungen.set(neu);\n }\n };\n lies();\n const beobachter = new MutationObserver(lies);\n beobachter.observe(wirt, { characterData: true, childList: true, subtree: true });\n zerstoerung.onDestroy(() => beobachter.disconnect());\n });\n }\n\n protected waehle(ereignis: Event): void {\n const ziel = ereignis.target as HTMLSelectElement;\n this.eintraege()[ziel.selectedIndex]?.klicke();\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n Directive,\n ElementRef,\n input,\n model,\n viewChild,\n} from '@angular/core';\nimport { ZButton } from '../button';\nimport { ZIcon } from '../icon';\nimport { injectZLabels } from '../labels';\n\n/** Counts up once per header so that `aria-controls` stays unique. */\nlet laufendeNummer = 0;\n\n/**\n * Brand slot of the header: plain text in the `display` face, no logo image.\n *\n * Adds the class `z-header__brand` and renders nothing itself, so the caller\n * decides the element. A link back to the start page is the usual choice.\n *\n * @example\n * ```html\n * <a zBrand href=\"/\">Zenit</a>\n * ```\n */\n@Directive({\n selector: '[zBrand]',\n host: { class: 'z-header__brand' },\n})\nexport class ZBrand {}\n\n/**\n * One link of the main navigation, carrying the class `z-header__link`.\n *\n * The active link gets `aria-current=\"page\"`, which announces it as the current\n * page and drives the `accent-subtle` background. The library does not read the\n * router, so the caller decides which link is active.\n *\n * @example\n * ```html\n * <a zHeaderLink routerLink=\"/gameserver\" [active]=\"true\">Gameserver</a>\n * ```\n */\n@Directive({\n selector: 'a[zHeaderLink]',\n host: {\n class: 'z-header__link',\n '[attr.aria-current]': `active() ? \"page\" : null`,\n },\n})\nexport class ZHeaderLink {\n /**\n * Whether this link points at the page currently shown. Written as a bare\n * attribute (`active`) it counts as `true`.\n *\n * @default false\n */\n readonly active = input(false, { transform: booleanAttribute });\n}\n\n/**\n * Marks content for the right-hand end of the header: credit, avatar or\n * buttons. Pure slot marker, it adds no class and no markup.\n *\n * @example\n * ```html\n * <a zHeaderLink zHeaderEnd class=\"z-mono\" href=\"/abrechnung\">25,00&nbsp;€</a>\n * <span zHeaderEnd class=\"z-avatar\" aria-hidden=\"true\">K</span>\n * ```\n */\n@Directive({ selector: '[zHeaderEnd]' })\nexport class ZHeaderEnd {}\n\n/**\n * Header of the customer area and of the public pages. Same component both\n * times, only the links differ.\n *\n * Renders, in order: the `[zBrand]` slot, an icon-only ghost button that\n * toggles the navigation below 900px, a `<nav class=\"z-header__nav\">` holding\n * the projected links, and a `<div class=\"z-header__end\">` with the\n * `[zHeaderEnd]` slot. The host carries `z-header` and, while the navigation is\n * open, `z-header--open`.\n *\n * The open state is {@link open}, two-way bindable. It closes itself when a\n * projected link inside the `<nav>` is clicked, so a single-page application\n * does not keep the menu over the new page, and on Escape while the focus is\n * inside the header.\n *\n * Accessibility: the toggle is a `<button type=\"button\">` with `aria-label`\n * from {@link menuLabel}, `aria-expanded` reflecting the open state and\n * `aria-controls` pointing at the generated id of the `<nav>`. The `<nav>` is a\n * navigation landmark and takes its name from {@link navLabel}, and the host is\n * the `banner` landmark of the page unless {@link landmark} is off. Above 900px\n * the links are visible and the end slot stays visible at every width.\n *\n * It centres nothing: the header runs the full width of whatever contains it,\n * so put it inside a `div.z-container`, the same one `<main>` and `z-footer`\n * get, or brand and page title stand on different lines.\n *\n * @example\n * ```html\n * <z-app-header navLabel=\"Hauptnavigation\">\n * <a zBrand href=\"/\">Zenit</a>\n * <a zHeaderLink routerLink=\"/gameserver\" [active]=\"true\">Gameserver</a>\n * <a zHeaderLink routerLink=\"/abrechnung\">Abrechnung</a>\n * <a zBtn=\"primary\" size=\"sm\" zHeaderEnd routerLink=\"/neu\">Server erstellen</a>\n * </z-app-header>\n * ```\n */\n@Component({\n selector: 'z-app-header',\n imports: [ZButton, ZIcon],\n template: `\n <ng-content select=\"[zBrand]\" />\n <button\n #knopf\n zBtn=\"ghost\"\n iconOnly\n type=\"button\"\n class=\"z-header__menu\"\n [attr.aria-label]=\"menuText()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"navId\"\n (click)=\"open.set(!open())\"\n >\n <z-icon name=\"menu\" />\n </button>\n <!-- The click handler is delegation for the projected links, not an\n interaction of the <nav> itself: the keyboard already reaches every\n link, and Enter on a link fires this very click event. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <nav\n class=\"z-header__nav\"\n [id]=\"navId\"\n [attr.aria-label]=\"navLabel() || null\"\n (click)=\"aufNavKlick($event)\"\n >\n <ng-content />\n </nav>\n <div class=\"z-header__end\"><ng-content select=\"[zHeaderEnd]\" /></div>\n `,\n host: {\n class: 'z-header',\n '[class.z-header--open]': `open()`,\n '[attr.role]': `landmark() ? \"banner\" : null`,\n '(keydown.escape)': `aufEscape()`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZAppHeader {\n /**\n * Accessible name of the `<nav>` landmark. Empty means no `aria-label` at\n * all; set it whenever the page has more than one navigation.\n *\n * @default ''\n */\n readonly navLabel = input('');\n\n /**\n * Whether the host is the `banner` landmark of the page. The reference markup\n * is a `<header>` at page level, so this is on. Switch it off with\n * `[landmark]=\"false\"` wherever the header is not the page header but a\n * preview inside `<main>`: a banner must not sit inside the main content.\n *\n * @default true\n */\n readonly landmark = input(true, { transform: booleanAttribute });\n\n /**\n * `aria-label` of the menu button shown below 900px. Unset, the component\n * uses {@link ZLabels.headerMenu} from the label registry.\n *\n * @default undefined\n */\n readonly menuLabel = input<string>();\n\n /**\n * Whether the menu below 900px is open, two-way bindable as `[(open)]`. The\n * burger button toggles it, a click on a projected link inside the `<nav>`\n * and Escape close it. Above 900px the links are visible regardless, so the\n * value only matters on a phone.\n *\n * @default false\n */\n readonly open = model(false);\n\n private readonly labels = injectZLabels();\n // read: ElementRef, because the menu button is a ZButton host and the plain\n // query would hand out that component instead of the element.\n private readonly knopf = viewChild.required('knopf', { read: ElementRef<HTMLButtonElement> });\n\n protected readonly menuText = computed(() => this.menuLabel() ?? this.labels.headerMenu);\n protected readonly navId = `z-header-nav-${++laufendeNummer}`;\n\n /**\n * Closes the menu when the click came from a link, so following a projected\n * link does not leave the menu open over the new page. Delegation instead of\n * a listener per link, and the library stays free of `@angular/router`: what\n * counts is the `<a>`, not the directive on it. A button inside the nav, a\n * menu trigger for example, leaves the menu open.\n *\n * Two cases stay open on purpose. A link found above the `<nav>` does not\n * count, because `closest()` walks past the nav into whatever surrounds the\n * header. And Ctrl, Meta or Shift open the link in a new tab or window while\n * this page stays where it is, so the menu stays with it. The middle mouse\n * button needs no check: it fires `auxclick`, not `click`.\n */\n protected aufNavKlick(ereignis: MouseEvent): void {\n if (ereignis.ctrlKey || ereignis.metaKey || ereignis.shiftKey) return;\n const link = (ereignis.target as Element | null)?.closest('a');\n if (link && (ereignis.currentTarget as Element).contains(link)) this.open.set(false);\n }\n\n /**\n * Escape closes the open menu and puts the focus back on the burger button,\n * which is where the keyboard came from. Runs on the host, so it only sees\n * keys pressed inside the header, and does nothing while the menu is closed:\n * a header that is not menu-like must never swallow Escape or take focus.\n */\n protected aufEscape(): void {\n if (!this.open()) return;\n this.open.set(false);\n this.knopf().nativeElement.focus();\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Head of a page in the customer area: title on the left, actions on the right.\n * The projected content is the actions, at most two buttons.\n *\n * Renders the title as the page `<h1 class=\"z-pagehead__title\">`, the optional\n * second line as `<p class=\"z-pagehead__sub\">` and the projected content in\n * `<div class=\"z-pagehead__actions\">`. The host carries `z-pagehead` and its\n * native `title` attribute is cleared, so the {@link title} input never turns\n * into a browser tooltip over the whole header.\n *\n * Below 640px the row wraps and the actions move under the title.\n *\n * @example\n * ```html\n * <z-page-header title=\"Gameserver\" sub=\"3 Server, 2 online\">\n * <button zBtn=\"secondary\" type=\"button\">Bestellungen</button>\n * <button zBtn=\"primary\" type=\"button\">Server erstellen</button>\n * </z-page-header>\n * ```\n */\n@Component({\n selector: 'z-page-header',\n template: `\n <div>\n <h1 class=\"z-pagehead__title\">{{ title() }}</h1>\n @if (sub()) {\n <p class=\"z-pagehead__sub\">{{ sub() }}</p>\n }\n </div>\n <div class=\"z-pagehead__actions\"><ng-content /></div>\n `,\n host: {\n class: 'z-pagehead',\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZPageHeader {\n /**\n * Page title, rendered as the `<h1>`. Use the same wording as the navigation\n * link that leads here.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * One line with the most important fact of the page, for example\n * \"3 Server, 2 online\". Empty leaves the line out.\n *\n * @default ''\n */\n readonly sub = input('');\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n Directive,\n input,\n} from '@angular/core';\n\n/**\n * Marks the bottom row of the footer: copyright on the left, the legal links on\n * the right. Pure slot marker, it adds no class and no markup. The legal links\n * are mandatory on every page, including the panels.\n *\n * @example\n * ```html\n * <div zFooterBase>\n * <span>© 2026 Zenit-Hosting</span>\n * <a href=\"/impressum\">Impressum</a>\n * </div>\n * ```\n */\n@Directive({ selector: '[zFooterBase]' })\nexport class ZFooterBase {}\n\n/**\n * One link column of the public footer.\n *\n * Renders an optional `<h2 class=\"z-footer__head\">` and a\n * `<ul class=\"z-footer__list\">` around the projected content, so the content is\n * the `<li>` elements. Only usable inside `z-footer`, which selects these\n * elements into its column grid.\n *\n * @example\n * ```html\n * <z-footer-col heading=\"Hosting\">\n * <li><a href=\"/minecraft\">Minecraft</a></li>\n * <li><a href=\"/preise\">Preise</a></li>\n * </z-footer-col>\n * ```\n */\n@Component({\n selector: 'z-footer-col',\n template: `\n @if (heading()) {\n <h2 class=\"z-footer__head\">{{ heading() }}</h2>\n }\n <ul class=\"z-footer__list\">\n <ng-content />\n </ul>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZFooterCol {\n /**\n * Heading of the column, one word. Empty leaves the `<h2>` out, which keeps\n * the heading outline free of empty levels.\n *\n * @default ''\n */\n readonly heading = input('');\n}\n\n/**\n * Footer of every page. Public pages use the columns, the customer area shows\n * the bottom row only.\n *\n * Renders `<div class=\"z-footer__cols\">` with the projected `z-footer-col`\n * elements and `<div class=\"z-footer__base\">` with the `[zFooterBase]` slot;\n * the host carries `z-footer` and, unless {@link landmark} is off, the\n * `contentinfo` role of the page. Without columns the grid stays empty and\n * collapses, so the same element serves both cases. Content that matches\n * neither slot is not rendered.\n *\n * It centres nothing: the footer runs the full width of whatever contains it,\n * so put it inside a `div.z-container`, the same one `z-app-header` and\n * `<main>` get, or the copyright ends up at the left edge of the window while\n * the page above it is centred.\n *\n * @example\n * ```html\n * <z-footer>\n * <z-footer-col heading=\"Hosting\">\n * <li><a href=\"/minecraft\">Minecraft</a></li>\n * </z-footer-col>\n * <div zFooterBase>\n * <span>© 2026 Zenit-Hosting</span>\n * <a href=\"/impressum\">Impressum</a>\n * </div>\n * </z-footer>\n * ```\n */\n@Component({\n selector: 'z-footer',\n template: `\n <div class=\"z-footer__cols\"><ng-content select=\"z-footer-col\" /></div>\n <div class=\"z-footer__base\"><ng-content select=\"[zFooterBase]\" /></div>\n `,\n host: {\n class: 'z-footer',\n '[attr.role]': `landmark() ? \"contentinfo\" : null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZFooter {\n /**\n * Whether the host is the `contentinfo` landmark of the page. The reference\n * markup is a `<footer>` at page level, so this is on. Switch it off with\n * `[landmark]=\"false\"` wherever the footer is not the page footer but a\n * preview inside `<main>`: a contentinfo must not sit inside the main\n * content.\n *\n * @default true\n */\n readonly landmark = input(true, { transform: booleanAttribute });\n}\n","/* Package navigation: Tabs, Stepper, Sidebar, AppHeader, PageHeader and Footer. */\nexport * from '../navigation';\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * Row of metrics inside ONE panel, laid out as columns separated by 1px lines.\n *\n * Renders only the projected content and puts the class `z-metrics` on the\n * host. Several figures belong in one `z-metrics`, never in single tiles of\n * their own. Usually placed inside `<z-panel flush>`.\n *\n * @example\n * ```html\n * <z-panel flush>\n * <z-metrics>\n * <z-metric label=\"CPU\" value=\"0,2\" unit=\"%\" [percent]=\"0.2\" />\n * <z-metric label=\"Laufzeit\" value=\"2d 21h\" sub=\"TPS 20 · Ping 91 ms\" />\n * </z-metrics>\n * </z-panel>\n * ```\n */\n@Component({\n selector: 'z-metrics',\n template: `<ng-content />`,\n host: { 'class': 'z-metrics' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZMetrics {}\n\n/**\n * A single figure with its unit, optionally with a usage bar.\n *\n * Renders `.z-metric__label`, `.z-metric__value` (with the unit in a `<small>`\n * preceded by a non-breaking space), the optional bar and `.z-metric__sub`. The\n * host carries `z-metric`.\n *\n * The bar is `<div class=\"z-meter\" role=\"meter\">` with `aria-valuemin=\"0\"`,\n * `aria-valuemax=\"100\"`, `aria-valuenow` set to the clamped percentage and\n * `aria-label` taken from {@link label}. From 80 percent it adds\n * `z-meter--warning`, from 95 percent `z-meter--danger`. Colour never carries\n * the meaning alone: the caller repeats the value in {@link sub}.\n *\n * @example\n * ```html\n * <z-metric label=\"Speicher\" value=\"21,4\" unit=\"/ 24&nbsp;GB\" [percent]=\"89\" sub=\"89&nbsp;% belegt\" />\n * ```\n */\n@Component({\n selector: 'z-metric',\n template: `\n <span class=\"z-metric__label\">{{ label() }}</span>\n <span class=\"z-metric__value\"\n >{{ value() }}@if (unit()) {<small>&#160;{{ unit() }}</small>}</span\n >\n @if (anteil() !== null) {\n <div\n class=\"z-meter\"\n [class.z-meter--warning]=\"warnung()\"\n [class.z-meter--danger]=\"fehler()\"\n role=\"meter\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"anteil()\"\n [attr.aria-label]=\"label()\"\n >\n <span class=\"z-meter__fill\" [style.width.%]=\"anteil()\"></span>\n </div>\n }\n @if (sub()) {\n <span class=\"z-metric__sub\">{{ sub() }}</span>\n }\n `,\n host: { 'class': 'z-metric' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZMetric {\n /**\n * Name of the figure, for example \"CPU\". Also serves as the `aria-label` of\n * the bar.\n *\n * @default ''\n */\n readonly label = input('');\n\n /**\n * The figure itself, already formatted by the caller: comma as the decimal\n * mark, German number format.\n *\n * @default ''\n */\n readonly value = input('');\n\n /**\n * Unit or upper bound rendered after the value, for example `%` or\n * `/ 24&nbsp;GB`. Empty leaves the `<small>` out.\n *\n * @default ''\n */\n readonly unit = input('');\n\n /**\n * Second line under the figure. Carries the percentage in words whenever the\n * bar warns, so the state does not depend on colour.\n *\n * @default ''\n */\n readonly sub = input('');\n\n /**\n * Usage in percent, 0 to 100. Values outside that range are clamped, values\n * that are not a number render no bar. `null`, `undefined` and the empty\n * string mean no bar at all.\n *\n * @default null\n */\n readonly percent = input<number | null, number | string | null | undefined>(null, {\n transform: (wert) => (wert === null || wert === undefined || wert === '' ? null : Number(wert)),\n });\n\n protected readonly anteil = computed(() => {\n const wert = this.percent();\n return wert === null || Number.isNaN(wert) ? null : Math.min(100, Math.max(0, wert));\n });\n protected readonly fehler = computed(() => (this.anteil() ?? 0) >= 95);\n protected readonly warnung = computed(() => (this.anteil() ?? 0) >= 80 && !this.fehler());\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n input,\n linkedSignal,\n} from '@angular/core';\n\n/**\n * Row pattern for everything the customer owns: servers, domains, tickets,\n * payment methods, files.\n *\n * Renders only the projected content and puts the class `z-rows` on the host.\n * {@link columns} feeds the custom property `--z-cols`, which head and rows\n * share, so status, plan and cost line up in fixed columns.\n *\n * @example\n * ```html\n * <z-rows columns=\"minmax(0, 2fr) 128px 40px\">\n * <z-rows-head>\n * <span>Server</span>\n * <span>Status</span>\n * <span></span>\n * </z-rows-head>\n * <a zRow routerLink=\"/server/1\">\n * <z-row-main title=\"Beispiel-Server 1\" meta=\"Minecraft · 203.0.113.10\" />\n * <span><z-badge status=\"success\" dot>Online</z-badge></span>\n * <z-icon name=\"chevron_right\" />\n * </a>\n * </z-rows>\n * ```\n */\n@Component({\n selector: 'z-rows',\n template: `<ng-content />`,\n host: {\n class: 'z-rows',\n '[style.--z-cols]': `columns() || null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZRows {\n /**\n * Value for `grid-template-columns`, shared by head and rows through\n * `--z-cols`, for example `minmax(0, 2fr) 128px 40px`. Empty keeps the\n * default grid from the stylesheet.\n *\n * @default ''\n */\n readonly columns = input('');\n}\n\n/**\n * Column head of the list, carrying the class `z-rows__head`. Renders only the\n * projected content, one element per column. The head disappears below 640px,\n * so it must never hold the only copy of a fact.\n *\n * @example\n * ```html\n * <z-rows-head>\n * <span>Server</span>\n * <span>Status</span>\n * <span style=\"text-align:right\">Bisher</span>\n * </z-rows-head>\n * ```\n */\n@Component({\n selector: 'z-rows-head',\n template: `<ng-content />`,\n host: { class: 'z-rows__head' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZRowsHead {}\n\n/**\n * One row, carrying the class `z-row`. Renders nothing itself.\n *\n * As an `<a>` the whole row is the link to the detail page and brings its own\n * focus ring and keyboard handling. As a `<div>` the row is not clickable and\n * holds its own actions, each of which is a tab stop of its own.\n *\n * A row that needs both, a target and its own actions, is a `<div>` with an\n * {@link ZRowLink} on the title and {@link ZRowAction} on the buttons: a\n * `<button>` inside an `<a>` would be invalid markup.\n *\n * @example\n * ```html\n * <a zRow routerLink=\"/server/1\">…</a>\n * <div zRow>…</div>\n * ```\n */\n@Directive({\n selector: 'a[zRow], div[zRow]',\n host: { class: 'z-row' },\n})\nexport class ZRow {}\n\n/**\n * Pure slot marker for the title of a row, so `z-row-main` can hold a link or\n * any other markup instead of its {@link ZRowMain.title} text. It adds no class\n * and no markup. Without it the row falls back to the `title` input.\n *\n * @example\n * ```html\n * <z-row-main title=\"Beispiel-Server 1\" meta=\"Minecraft · 203.0.113.10\">\n * <a zRowTitle zRowLink routerLink=\"/user/server/1\">Beispiel-Server 1</a>\n * </z-row-main>\n * ```\n */\n@Directive({ selector: '[zRowTitle]' })\nexport class ZRowTitle {}\n\n/**\n * Slot for the meta line of a row when that line is more than plain text. It\n * carries the class `z-row__meta` and lands under the title, in place of the\n * {@link ZRowMain.meta} input, so that an address, a port or a file name inside\n * it can take `z-mono` while the rest of the line stays in the body face.\n *\n * Use a block element: the meta line clips with an ellipsis, which an inline\n * element cannot do. Without it the row falls back to the `meta` input.\n *\n * @example\n * ```html\n * <z-row-main title=\"Beispiel-Server 1\">\n * <div zRowMeta>Minecraft · PaperMC 26.3 · <span class=\"z-mono\">203.0.113.10:25565</span></div>\n * </z-row-main>\n * ```\n */\n@Directive({\n selector: '[zRowMeta]',\n host: { class: 'z-row__meta' },\n})\nexport class ZRowMeta {}\n\n/**\n * Link inside a `div[zRow]` that makes the whole row clickable: the link sits\n * on the title and carries the class `z-row__link`, whose stretched `::after`\n * covers the row. The row keeps its hover colour, and the focus ring of the\n * link is drawn around the whole row rather than around the title text.\n *\n * Everything the row holds stays under that overlay, so buttons and menus in\n * the row need {@link ZRowAction} to stay clickable and keep their own tab\n * stop. As with any stretched link, text in the row cannot be selected by\n * dragging, exactly as in an `a[zRow]`.\n *\n * @example\n * ```html\n * <div zRow>\n * <z-row-main title=\"Beispiel-Server 1\" meta=\"Minecraft · 203.0.113.10\">\n * <a zRowTitle zRowLink routerLink=\"/user/server/1\">Beispiel-Server 1</a>\n * </z-row-main>\n * <span><z-badge status=\"success\" dot>Online</z-badge></span>\n * <button zRowAction zBtn=\"ghost\" iconOnly aria-label=\"Aktionen für Beispiel-Server 1\">\n * <z-icon name=\"more_vert\" />\n * </button>\n * </div>\n * ```\n */\n@Directive({\n selector: 'a[zRowLink]',\n host: { class: 'z-row__link' },\n})\nexport class ZRowLink {}\n\n/**\n * Action inside a row that holds an {@link ZRowLink}: adds the class\n * `z-row__action`, which lifts the element above the stretched link overlay so\n * it stays clickable and remains a tab stop of its own. It renders nothing\n * itself and needs its own `aria-label` when it shows only an icon.\n *\n * @example\n * ```html\n * <button zRowAction zBtn=\"ghost\" iconOnly aria-label=\"Freigabe entfernen\">\n * <z-icon name=\"close\" />\n * </button>\n * ```\n */\n@Directive({\n selector: '[zRowAction]',\n host: { class: 'z-row__action' },\n})\nexport class ZRowAction {}\n\n/**\n * Pure slot marker for an own medium in the thumbnail of a row, an icon or an\n * image the caller renders itself. It lands in `.z-row__thumb` and replaces\n * both the {@link ZRowMain.image} and the initial. It adds no class and no\n * markup. Without it the row falls back to the `image` input. The thumbnail is\n * `aria-hidden`, so the content is decoration: what it shows has to stand as\n * text in the row as well, usually in {@link ZRowMeta}. Nothing focusable goes\n * into the slot, no link, button or input: it would stay a tab stop inside\n * `aria-hidden`.\n *\n * @example\n * ```html\n * <z-row-main title=\"beispiel.de\" meta=\"Domain · läuft bis 18.09.2027\">\n * <z-icon zRowThumb name=\"language\" />\n * </z-row-main>\n * ```\n */\n@Directive({ selector: '[zRowThumb]' })\nexport class ZRowThumb {}\n\n/**\n * First column of a row: thumbnail, title and one meta line.\n *\n * Renders `<span class=\"z-row__thumb\">` with the image or, without one, the\n * uppercased first character of {@link thumbText} or else of the title, then\n * `.z-row__title` and the optional `.z-row__meta`. An image whose URL fails to\n * load drops into the same initial, so no broken-image icon is shown. A\n * {@link ZRowThumb} element replaces image and initial, and {@link thumb} set\n * to `false` leaves the thumbnail out. The host carries `z-row__main` and its native\n * `title` attribute is cleared, so the {@link title} input never becomes a\n * browser tooltip. The thumbnail is decoration: `.z-row__thumb` carries\n * `aria-hidden=\"true\"` and the image an empty `alt`, so a link row is read as\n * title and meta only. Whatever the thumbnail shows, a game for example,\n * therefore also belongs into the meta line as text.\n *\n * A `[zRowTitle]` element takes the place of the title text, which is how a\n * link gets into the title of a row, and a {@link ZRowMeta} element takes the\n * place of the meta text, which is how an address reaches the mono face.\n * {@link title} still feeds the initial of the thumbnail unless\n * {@link thumbText} is set, so it stays set either way.\n *\n * @example\n * ```html\n * <z-row-main title=\"Beispiel-Server 1\" meta=\"Minecraft · PaperMC 26.3 · 203.0.113.10\" />\n * ```\n */\n@Component({\n selector: 'z-row-main',\n template: `\n @if (thumb()) {\n <span class=\"z-row__thumb\" aria-hidden=\"true\">\n <ng-content select=\"[zRowThumb]\" />\n @if (!eigenesMedium()) {\n @if (image() && !imageFailed()) {\n <img [src]=\"image()\" alt=\"\" (error)=\"imageFailed.set(true)\" />\n } @else {\n {{ initiale() }}\n }\n }\n </span>\n }\n <div class=\"z-row__text\">\n <div class=\"z-row__title\">\n <ng-content select=\"[zRowTitle]\">{{ title() }}</ng-content>\n </div>\n <ng-content select=\"[zRowMeta]\" />\n @if (meta()) {\n <div class=\"z-row__meta\">{{ meta() }}</div>\n }\n </div>\n `,\n host: {\n class: 'z-row__main',\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZRowMain {\n /**\n * Name of the entry. Without an image and without {@link thumbText} its\n * first character, uppercased, fills the thumbnail.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * One line under the title with the details of the entry, for example game,\n * version and address. Empty leaves the line out. A projected\n * {@link ZRowMeta} element replaces it, for a line that mixes faces.\n *\n * @default ''\n */\n readonly meta = input('');\n\n /**\n * URL of the thumbnail. Empty falls back to the initial, and so does a URL\n * that fails to load.\n *\n * @default ''\n */\n readonly image = input('');\n\n /**\n * Text whose first character, uppercased, fills the thumbnail when there is\n * no image or it fails to load, for example the game of a server whose\n * {@link title} is its own name. Empty takes the initial of the title.\n *\n * @default ''\n */\n readonly thumbText = input('');\n\n /**\n * Shows the thumbnail. `false` leaves `.z-row__thumb` out, so the row starts\n * with its title. Boolean attribute.\n *\n * @default true\n */\n readonly thumb = input(true, { transform: booleanAttribute });\n\n /**\n * True once the browser reported `error` for the current {@link image}. A new\n * URL is tried again, so the flag falls back to `false` with it.\n */\n protected readonly imageFailed = linkedSignal<string, boolean>({\n source: this.image,\n computation: () => false,\n });\n\n /**\n * The projected {@link ZRowThumb}, if one is rendered right now. A query and\n * not the fallback content of `<ng-content>`: a slot element inside an `@if`\n * occupies the slot even while the condition is false, which would leave an\n * empty thumbnail instead of image or initial.\n */\n protected readonly eigenesMedium = contentChild(ZRowThumb);\n\n protected readonly initiale = computed(() =>\n (this.thumbText().trim() || this.title().trim()).charAt(0).toUpperCase(),\n );\n}\n\n/**\n * Amount or number inside a row: right-aligned in the mono face. Adds the class\n * `z-row__num` and renders nothing itself.\n *\n * @example\n * ```html\n * <span zRowNum>0,90&nbsp;€</span>\n * ```\n */\n@Directive({\n selector: '[zRowNum]',\n host: { class: 'z-row__num' },\n})\nexport class ZRowNum {}\n","import {\n afterNextRender,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { leiheAttribut } from '../a11y/host-attribute';\nimport { injectZLabels } from '../labels';\n\n/**\n * Which column a table is sorted by and in which direction, the value of\n * {@link ZTable.sort}.\n */\nexport interface ZSort {\n /** Key of the sorted column: the value of `zSortHeader` on its header cell. */\n key: string;\n\n /** Direction of the sort, ascending or descending. */\n direction: 'asc' | 'desc';\n}\n\n/**\n * Table for files, invoices, backups and databases: everything with several\n * equal columns and bulk actions. Adds the class `z-table` to a native\n * `<table>` and renders nothing itself, so semantics, header cells and keyboard\n * behaviour stay the browser's.\n *\n * It also holds the sort state of the table, which the header cells marked with\n * `zSortHeader` read and write. The library does not sort: it reports what the\n * user asked for through {@link sort}, the caller orders the rows.\n *\n * @example\n * ```html\n * <table zTable [(sort)]=\"sortierung\">\n * <thead>…</thead>\n * <tbody>…</tbody>\n * </table>\n * ```\n */\n@Directive({\n selector: 'table[zTable]',\n host: { class: 'z-table' },\n})\nexport class ZTable {\n /**\n * Column the table is sorted by, two-way bindable. `null` means unsorted,\n * which is also the third step of the cycle a `th[zSortHeader]` runs through.\n * Only one column is sorted at a time, because the whole table shares this\n * one value.\n *\n * @default null\n */\n readonly sort = model<ZSort | null>(null);\n}\n\n/**\n * Wrapper around `table[zTable]`. Below 640px the table scrolls sideways in\n * here, the page itself never does.\n *\n * Renders only the projected content and puts `z-table-wrap` on the host. While\n * the table is actually wider than the wrapper, the host becomes a\n * `role=\"region\"` with `tabindex=\"0\"` and an `aria-label`, so the scrollable\n * area is reachable and scrollable by keyboard alone. While everything fits, all\n * three are left off: a table that cannot scroll would otherwise be a tab stop\n * that does nothing, on every desktop screen.\n *\n * The three attributes are borrowed, not bound: what the caller wrote on\n * `<z-table-container>` comes back when the overflow is gone, so a `role`, an\n * `aria-label` or a `tabindex` of the caller's own survives a window that is\n * resized wide enough.\n *\n * @example\n * ```html\n * <z-table-container ariaLabel=\"Dateien, seitlich scrollbar\">\n * <table zTable>\n * <thead>\n * <tr><th>Name</th><th style=\"text-align:right\">Größe</th></tr>\n * </thead>\n * <tbody>\n * <tr>\n * <td><span zTableName><z-icon name=\"description\" />server.jar</span></td>\n * <td zNum>61,25 MB</td>\n * </tr>\n * </tbody>\n * </table>\n * </z-table-container>\n * ```\n */\n@Component({\n selector: 'z-table-container',\n template: `<ng-content />`,\n host: {\n class: 'z-table-wrap',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZTableContainer {\n /**\n * Accessible name of the scrollable region, meant to be overridden with the\n * content of the table. Unset, the component uses\n * {@link ZLabels.tableRegion} from the label registry.\n *\n * @default undefined\n */\n readonly ariaLabel = input<string>();\n\n private readonly labels = injectZLabels();\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n // The predicate lands in the static partial declaration, which a JIT consumer\n // evaluates while this class is defined: ZTable has to be declared above.\n private readonly tabelle = contentChild(ZTable, { read: ElementRef });\n private beobachter?: ResizeObserver;\n\n protected readonly bereichText = computed(() => this.ariaLabel() ?? this.labels.tableRegion);\n /** Whether the content is wider than the wrapper, so there is something to scroll. */\n protected readonly ueberlauf = signal(false);\n\n constructor() {\n // Only while there is something to scroll does the library own these\n // three. As host bindings they wrote `null` on every other change and\n // deleted whatever the caller had put there; borrowed, the caller's values\n // come back.\n leiheAttribut('role', () => (this.ueberlauf() ? 'region' : null));\n leiheAttribut('tabindex', () => (this.ueberlauf() ? '0' : null));\n leiheAttribut('aria-label', () => (this.ueberlauf() ? this.bereichText() : null));\n\n const destroyRef = inject(DestroyRef);\n afterNextRender(() => {\n // Not every environment has a ResizeObserver; without one the wrapper\n // keeps the state of the last measurement.\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n this.beobachter = new ResizeObserver(() => this.messen());\n this.beobachter.observe(this.el.nativeElement);\n destroyRef.onDestroy(() => this.beobachter?.disconnect());\n });\n\n // A changed table is wider or narrower without the wrapper changing size,\n // so the observer alone would miss it: measure after the render as well,\n // and watch the table itself from then on.\n afterRenderEffect({\n earlyRead: () => {\n const tabelle = this.tabelle()?.nativeElement;\n if (tabelle) {\n this.beobachter?.observe(tabelle);\n }\n this.messen();\n },\n });\n }\n\n private messen(): void {\n const el = this.el.nativeElement;\n this.ueberlauf.set(el.scrollWidth > el.clientWidth);\n }\n}\n\n/**\n * Right-aligned cell in the mono face: size, date, amount. Adds the class\n * `z-table__num` and renders nothing itself.\n *\n * @example\n * ```html\n * <td zNum>61,25 MB</td>\n * ```\n */\n@Directive({\n selector: '[zNum]',\n host: { class: 'z-table__num' },\n})\nexport class ZNum {}\n\n/**\n * Name cell: icon and name in the mono face. Adds the class `z-table__name` and\n * renders nothing itself; the icon comes from the caller and is `folder` or\n * `description`.\n *\n * @example\n * ```html\n * <td><span zTableName><z-icon name=\"folder\" />plugins</span></td>\n * ```\n */\n@Directive({\n selector: '[zTableName]',\n host: { class: 'z-table__name' },\n})\nexport class ZTableName {}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { ZIcon } from '../icon';\nimport { ZSort, ZTable } from './table';\n\n/**\n * Header cell that sorts its column. Sits on a `<th>` inside a\n * `table[zTable]` and renders a real `<button>` around the projected header\n * text, so the cell is reachable by keyboard, has a focus ring and is\n * announced as a button.\n *\n * A click cycles through three steps: {@link sortStart}, the opposite\n * direction, unsorted. The state lives on the table\n * ({@link ZTable.sort}), so only one column is ever sorted; this component\n * only reads and writes it. The library does not sort the rows, the caller\n * does, usually in a `computed()`.\n *\n * Accessibility: the `<th>` carries `aria-sort`, `ascending` or `descending`\n * on the sorted column and `none` on every other sortable one, which is the\n * WAI-ARIA pattern for a sortable table. The accessible name of the button is\n * the header text itself, so no extra label and no `title` is needed. While\n * {@link disabled} is set the column takes no part in sorting: the button is\n * natively disabled and the cell carries no `aria-sort` at all, so it reads\n * like the plain header it is.\n *\n * @example\n * ```html\n * <table zTable [(sort)]=\"sortierung\">\n * <thead>\n * <tr>\n * <th zSortHeader=\"name\">Name</th>\n * <th zNum zSortHeader=\"groesse\" sortStart=\"desc\">Größe</th>\n * </tr>\n * </thead>\n * <tbody>…</tbody>\n * </table>\n * ```\n */\n@Component({\n selector: 'th[zSortHeader]',\n imports: [ZIcon],\n template: `<button type=\"button\" class=\"z-table__sort\" [disabled]=\"disabled()\" (click)=\"weiter()\">\n <ng-content />\n @if (richtung()) {\n <z-icon [name]=\"richtung() === 'asc' ? 'arrow_upward' : 'arrow_downward'\" size=\"sm\" />\n }\n </button>`,\n host: {\n '[attr.aria-sort]': 'sortierstand()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSortHeader {\n /**\n * Key of this column, the value that ends up in {@link ZSort.key}. It only\n * has to be unique inside the table; the caller matches it against its own\n * field when it orders the rows.\n */\n readonly zSortHeader = input.required<string>();\n\n /**\n * Direction of the first click. `desc` suits columns where the largest value\n * is the interesting one, for example a size or an amount.\n *\n * @default 'asc'\n */\n readonly sortStart = input<'asc' | 'desc'>('asc');\n\n /**\n * Whether this column cannot be sorted. The button is natively disabled and\n * the cell carries no `aria-sort`.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n private readonly tabelle = inject(ZTable);\n\n /** Direction this column is sorted in, or `null` while it is not the sorted one. */\n protected readonly richtung = computed<'asc' | 'desc' | null>(() => {\n const sortierung = this.tabelle.sort();\n if (this.disabled() || sortierung?.key !== this.zSortHeader()) {\n return null;\n }\n return sortierung.direction;\n });\n\n /** `aria-sort` of the cell, left off entirely while the column is disabled. */\n protected readonly sortierstand = computed(() => {\n if (this.disabled()) {\n return null;\n }\n const richtung = this.richtung();\n if (!richtung) {\n return 'none';\n }\n return richtung === 'asc' ? 'ascending' : 'descending';\n });\n\n /** One step of the cycle: start direction, opposite direction, unsorted. */\n protected weiter(): void {\n const start = this.sortStart();\n const jetzt = this.richtung();\n const gegenrichtung = start === 'asc' ? 'desc' : 'asc';\n const naechste: ZSort | null =\n jetzt === null\n ? { key: this.zSortHeader(), direction: start }\n : jetzt === start\n ? { key: this.zSortHeader(), direction: gegenrichtung }\n : null;\n this.tabelle.sort.set(naechste);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n model,\n numberAttribute,\n untracked,\n} from '@angular/core';\nimport { ZSelect } from '../field';\nimport { ZIcon } from '../icon';\nimport { injectZLabels } from '../labels';\n\n/** Counter for the id that ties the size selector to its label. */\nlet zaehler = 0;\n\n/**\n * Pages through lists with more than {@link pageSize} entries and sits as the\n * last row inside a panel.\n *\n * Renders a `<nav>` with an accessible name around `<div class=\"z-pager\">`: the\n * range sentence on the left and `.z-pager__nav` on the right, with a back\n * button, `page / pages` in the mono face and a forward button. Both buttons are\n * icon-only ghost buttons in size `sm` with an `aria-label`. As long as\n * everything fits on one page the component renders nothing at all, so an empty\n * list shows no pager.\n *\n * With {@link pageSizeOptions} a labelled `<select>` for the page size stands\n * in front of the range sentence. Without it nothing changes, so a pager that\n * does not want a picker renders exactly as before.\n *\n * Accessibility: on the first and the last page the matching arrow carries\n * `aria-disabled=\"true\"` instead of the native `disabled`, and its click is\n * swallowed. A native `disabled` on the button that was just used would throw\n * the focus back to `<body>`; this way the focus stays where the user put it and\n * the state is still announced. The range sentence is an `aria-live=\"polite\"`\n * region, so paging is reported even though nothing moves the focus.\n *\n * The component does not slice the data. It reports the wanted page through\n * {@link page}, the caller cuts the list.\n *\n * @example\n * ```html\n * <z-panel title=\"Transaktionen\" flush>\n * <z-rows>…</z-rows>\n * <z-pagination [(page)]=\"seite\" [total]=\"118\" itemLabel=\"Transaktionen\" />\n * </z-panel>\n * ```\n */\n@Component({\n selector: 'z-pagination',\n imports: [ZIcon, ZSelect],\n template: `\n @if (sichtbar()) {\n <nav [attr.aria-label]=\"navText()\">\n <div class=\"z-pager\">\n @if (groesseSichtbar()) {\n <div class=\"z-pager__size\">\n <label [attr.for]=\"groesseId\">{{ groesseText() }}</label>\n <z-select size=\"sm\">\n <select [id]=\"groesseId\" (change)=\"aufGroesse($event)\">\n @for (option of optionen(); track option) {\n <option [value]=\"option\" [selected]=\"option === proSeite()\">\n {{ option }}\n </option>\n }\n </select>\n </z-select>\n </div>\n }\n @if (blaettern()) {\n <span aria-live=\"polite\">{{ bereich()(von(), bis(), total(), itemLabel()) }}</span>\n <div class=\"z-pager__nav\">\n <button\n type=\"button\"\n class=\"z-btn z-btn--ghost z-btn--icon z-btn--sm\"\n [attr.aria-label]=\"zurueckText()\"\n [attr.aria-disabled]=\"seite() <= 1 ? 'true' : null\"\n (click)=\"zuSeite(seite() - 1)\"\n >\n <z-icon name=\"chevron_left\" />\n </button>\n <span class=\"z-mono\">{{ seite() }} / {{ seiten() }}</span>\n <button\n type=\"button\"\n class=\"z-btn z-btn--ghost z-btn--icon z-btn--sm\"\n [attr.aria-label]=\"weiterText()\"\n [attr.aria-disabled]=\"seite() >= seiten() ? 'true' : null\"\n (click)=\"zuSeite(seite() + 1)\"\n >\n <z-icon name=\"chevron_right\" />\n </button>\n </div>\n }\n </div>\n </nav>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZPagination {\n /**\n * Current page, 1-based and two-way bindable. The component keeps it inside\n * the valid range: a page below 1 or beyond the last one is written back\n * clamped, which also happens when {@link total} or {@link pageSize} change.\n *\n * @default 1\n */\n readonly page = model(1);\n\n /**\n * Entries per page, two-way bindable. A one-way `[pageSize]` keeps working\n * exactly as before; `[(pageSize)]` additionally receives what the user\n * picks from {@link pageSizeOptions}. A value below 1 and a value that is\n * not a finite number both count as 1, everywhere: in the page count as well\n * as in the range sentence.\n *\n * @default 25\n */\n readonly pageSize = model(25);\n\n /**\n * Sizes the user may choose from. Empty, the default, means no picker at\n * all. The rendered list is these options plus the current {@link pageSize},\n * de-duplicated and sorted, so the select never shows a size the pager is\n * not actually using.\n *\n * @default []\n */\n readonly pageSizeOptions = input<number[]>([]);\n\n /**\n * Visible label in front of the size select. Unset, the component uses\n * {@link ZLabels.paginationPageSize} from the label registry (\"Einträge pro\n * Seite\" in German).\n *\n * @default undefined\n */\n readonly pageSizeLabel = input<string>();\n\n /**\n * Number of entries in the whole list, not just on the current page.\n *\n * @default 0\n */\n readonly total = input(0, { transform: numberAttribute });\n\n /**\n * What the list contains, for example \"Rechnungen\". Passed to\n * {@link rangeLabel} as the last argument.\n *\n * @default ''\n */\n readonly itemLabel = input('');\n\n /**\n * Builds the sentence in front of the buttons from the first and last entry\n * number of the current page, the total and {@link itemLabel}. Unset, the\n * component uses {@link ZLabels.paginationRange} from the label registry\n * (\"1 bis 25 von 112 Rechnungen\" in German).\n *\n * @default undefined\n */\n readonly rangeLabel =\n input<(von: number, bis: number, total: number, itemLabel: string) => string>();\n\n /**\n * Accessible name of the `<nav>` around the pager, which tells a screen\n * reader what this navigation landmark is for. Unset, the component uses\n * {@link ZLabels.paginationNav} from the label registry.\n *\n * @default undefined\n */\n readonly ariaLabel = input<string>();\n\n /**\n * `aria-label` of the back button. Unset, the component uses\n * {@link ZLabels.paginationPrev} from the label registry.\n *\n * @default undefined\n */\n readonly ariaLabelPrev = input<string>();\n\n /**\n * `aria-label` of the forward button. Unset, the component uses\n * {@link ZLabels.paginationNext} from the label registry.\n *\n * @default undefined\n */\n readonly ariaLabelNext = input<string>();\n\n private readonly labels = injectZLabels();\n\n protected readonly bereich = computed(() => this.rangeLabel() ?? this.labels.paginationRange);\n protected readonly navText = computed(() => this.ariaLabel() ?? this.labels.paginationNav);\n protected readonly zurueckText = computed(\n () => this.ariaLabelPrev() ?? this.labels.paginationPrev,\n );\n protected readonly weiterText = computed(\n () => this.ariaLabelNext() ?? this.labels.paginationNext,\n );\n protected readonly groesseText = computed(\n () => this.pageSizeLabel() ?? this.labels.paginationPageSize,\n );\n\n /** Ties the size select to its label; unique per instance on the page. */\n protected readonly groesseId = `z-pager-size-${++zaehler}`;\n\n /** {@link pageSize} as a whole number of at least 1, used by every count. */\n protected readonly proSeite = computed(() => {\n const roh = Math.trunc(this.pageSize());\n return Number.isFinite(roh) ? Math.max(1, roh) : 1;\n });\n\n protected readonly seiten = computed(() =>\n Math.max(1, Math.ceil(this.total() / this.proSeite())),\n );\n /** The page shown is always inside the valid range. */\n protected readonly seite = computed(() =>\n Math.min(Math.max(1, Math.trunc(this.page())), this.seiten()),\n );\n\n /**\n * The sizes the select offers: the given options plus the size in use,\n * de-duplicated and sorted, so a `pageSize` outside the options still shows\n * the right value instead of a wrong one.\n */\n protected readonly optionen = computed(() => {\n const gegeben = this.pageSizeOptions();\n if (gegeben.length === 0) {\n return [];\n }\n return [...new Set([...gegeben, this.proSeite()])].sort((a, b) => a - b);\n });\n\n /** Arrows and range sentence, the rule of the reference: more than one page. */\n protected readonly blaettern = computed(() => this.total() > 0 && this.total() > this.proSeite());\n\n /**\n * The size select, which follows a rule of its own: it stands while the list\n * is longer than the smallest option, that is while at least one of the\n * offered sizes would split it into pages. Tying it to {@link blaettern}\n * instead would strand the user on a size that fits everything onto one page:\n * the arrows go, the select goes with them, and there is no way back to a\n * smaller size.\n */\n protected readonly groesseSichtbar = computed(() => {\n const optionen = this.optionen();\n return optionen.length > 0 && this.total() > optionen[0];\n });\n\n protected readonly sichtbar = computed(() => this.blaettern() || this.groesseSichtbar());\n protected readonly von = computed(() => (this.seite() - 1) * this.proSeite() + 1);\n protected readonly bis = computed(() => Math.min(this.seite() * this.proSeite(), this.total()));\n\n constructor() {\n // When total or pageSize change, a page beyond the end moves back into the\n // valid range.\n effect(() => {\n const geklemmt = this.seite();\n if (untracked(this.page) !== geklemmt) {\n this.page.set(geklemmt);\n }\n });\n }\n\n /**\n * A click on an arrow that is marked `aria-disabled` is swallowed: the button\n * keeps the focus and nothing else happens.\n */\n protected zuSeite(ziel: number): void {\n if (ziel < 1 || ziel > this.seiten()) {\n return;\n }\n this.page.set(ziel);\n }\n\n /**\n * Takes the size the user picked and keeps the first entry of the current\n * page in view: the new page is the one that entry falls on. Both models are\n * written once, so a caller bound to either sees one change.\n */\n protected aufGroesse(ereignis: Event): void {\n const neu = Math.trunc(Number((ereignis.target as HTMLSelectElement).value));\n if (!Number.isFinite(neu) || neu < 1) {\n return;\n }\n const ersterEintrag = (this.seite() - 1) * this.proSeite();\n this.pageSize.set(neu);\n this.page.set(Math.floor(ersterEintrag / neu) + 1);\n }\n}\n","/* Package daten: Metric, ServerList, FileTable and Pagination. */\nexport * from '../metric';\nexport * from '../rows';\nexport * from '../table';\nexport * from '../pagination';\n","import { ChangeDetectionStrategy, Component, Directive, input } from '@angular/core';\nimport { ZIcon } from '../icon';\n\n/**\n * Status of an alert. `neutral` is a plain note, `info` a hint, `success` a\n * finished operation, `warning` something the customer should act on soon, and\n * `danger` something that failed. The color only covers the surface and the\n * icon.\n */\nexport type ZAlertStatus = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\n/**\n * Marks the single action of an alert, projected next to the text: one button,\n * secondary and `size=\"sm\"`. Adds no markup and no classes of its own.\n *\n * @example\n * ```html\n * <z-alert status=\"warning\" title=\"2 Änderungen greifen erst nach einem Neustart\">\n * PvP und maximale Spieler.\n * <button zAlertAction zBtn=\"secondary\" size=\"sm\">Jetzt neu starten</button>\n * </z-alert>\n * ```\n */\n@Directive({ selector: '[zAlertAction]' })\nexport class ZAlertAction {}\n\n/**\n * Note in the page flow: title as a full sentence, the detail below it, at most\n * one button next to it. Error texts say what happened and what the customer\n * can do. At most one alert per page, above the content.\n *\n * Renders a host with the class `z-alert` plus one of `z-alert--info`,\n * `--success`, `--warning`, `--danger`, an optional leading `z-icon`, a\n * `div.z-alert__text` with `span.z-alert__title` and `span.z-alert__body`\n * around the projected content, and the projected `[zAlertAction]` element.\n *\n * Accessibility: an alert is static page content and not a live region. What\n * arrives while the page is being read is announced by a toast with\n * `role=\"alert\"`. The native `title` attribute is suppressed so the browser\n * does not show its own tooltip for the title input.\n *\n * @example\n * ```html\n * <z-alert status=\"danger\" title=\"Installation fehlgeschlagen\" icon=\"error\">\n * SteamCMD hat nach 120 Sekunden nicht geantwortet. Starte die Installation erneut.\n * <button zAlertAction zBtn=\"secondary\" size=\"sm\">Erneut installieren</button>\n * </z-alert>\n * ```\n */\n@Component({\n selector: 'z-alert',\n imports: [ZIcon],\n template: `\n @if (icon()) {\n <z-icon [name]=\"icon()\" />\n }\n <div class=\"z-alert__text\">\n @if (title()) {\n <span class=\"z-alert__title\">{{ title() }}</span>\n }\n <span class=\"z-alert__body\"><ng-content /></span>\n </div>\n <ng-content select=\"[zAlertAction]\" />\n `,\n host: {\n class: 'z-alert',\n '[class.z-alert--info]': `status() === 'info'`,\n '[class.z-alert--success]': `status() === 'success'`,\n '[class.z-alert--warning]': `status() === 'warning'`,\n '[class.z-alert--danger]': `status() === 'danger'`,\n /* Without this the title would also sit on the element as a native title\n attribute and the browser would show its own tooltip (measured). */\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZAlert {\n /**\n * Color of the alert. `neutral` renders without a modifier class.\n *\n * @default 'neutral'\n */\n readonly status = input<ZAlertStatus>('neutral');\n\n /**\n * Title as a full sentence. Empty means no title line.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Name of the Material Icons ligature, for example `error` or `restart_alt`.\n * Empty means no icon in the alert.\n *\n * @default ''\n */\n readonly icon = input('');\n}\n","import { ChangeDetectionStrategy, Component, Directive, input } from '@angular/core';\n\n/**\n * Marks the single action of an empty state: one secondary button for the first\n * entry. It stays secondary even when the page header already shows a primary\n * button for the same action. Adds no markup and no classes of its own.\n *\n * @example\n * ```html\n * <z-empty-state title=\"Keine offenen Tickets\">\n * Wir antworten in der Regel innerhalb von 24 Stunden.\n * <button zEmptyAction zBtn=\"secondary\">Ticket erstellen</button>\n * </z-empty-state>\n * ```\n */\n@Directive({ selector: '[zEmptyAction]' })\nexport class ZEmptyAction {}\n\n/**\n * Fills a list that has no entries: a title naming the state, one sentence that\n * helps on, one action. No large grey icon, the text carries the state. An\n * empty list shows no pagination and no filters; data that is missing because\n * of an error is an alert, not an empty state.\n *\n * Renders a host with the class `z-empty`, an optional `span.z-empty__title`\n * (a heading `h1` to `h4` with {@link headingLevel}), a\n * `span.z-empty__body` around the projected text, and the projected\n * `[zEmptyAction]` element. The native `title` attribute is suppressed so the\n * browser does not show its own tooltip for the title input.\n *\n * @example\n * ```html\n * <z-panel title=\"Tickets\" flush>\n * <z-empty-state title=\"Keine offenen Tickets\">\n * Wir antworten in der Regel innerhalb von 24 Stunden, auf Discord oft schneller.\n * <button zEmptyAction zBtn=\"secondary\">Ticket erstellen</button>\n * </z-empty-state>\n * </z-panel>\n * ```\n */\n@Component({\n selector: 'z-empty-state',\n template: `\n @if (title()) {\n @switch (headingLevel()) {\n @case (1) {\n <h1 class=\"z-empty__title\">{{ title() }}</h1>\n }\n @case (2) {\n <h2 class=\"z-empty__title\">{{ title() }}</h2>\n }\n @case (3) {\n <h3 class=\"z-empty__title\">{{ title() }}</h3>\n }\n @case (4) {\n <h4 class=\"z-empty__title\">{{ title() }}</h4>\n }\n @default {\n <span class=\"z-empty__title\">{{ title() }}</span>\n }\n }\n }\n <span class=\"z-empty__body\"><ng-content /></span>\n <ng-content select=\"[zEmptyAction]\" />\n `,\n host: {\n class: 'z-empty',\n /* Without this the title would also sit on the element as a native title\n attribute and the browser would show its own tooltip (measured). */\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZEmptyState {\n /**\n * Title that names the state, for example `Keine offenen Tickets`. Empty\n * means no title line.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Makes the title a heading: `1` to `4` for `h1` to `h4`. Unset, the title\n * stays a `span`, which fits an empty list inside a panel whose own title is\n * the heading. A page that is nothing but this state, a 404 for example,\n * sets `1`. The visual size never changes with it.\n *\n * @default undefined\n */\n readonly headingLevel = input<\n 1 | 2 | 3 | 4 | undefined,\n 1 | 2 | 3 | 4 | '1' | '2' | '3' | '4' | undefined\n >(undefined, {\n transform: (wert) => (wert === undefined ? undefined : (Number(wert) as 1 | 2 | 3 | 4)),\n });\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Placeholder that holds the space while a list or metric loads. Renders an\n * empty host with the class `z-skel`, plus `z-skel--thumb` for the square\n * variant and an inline `width`. With {@link tile} it renders `z-skel--tile`\n * and inside it `span.z-skel__cover` and two `span.z-skel__line`, the geometry\n * of a `button[zGameTile]`, so it takes exactly the cell of a tile in a\n * `z-game-grid`.\n *\n * Accessibility: purely decorative, hence the fixed `aria-hidden=\"true\"`. The\n * surrounding container carries `aria-busy=\"true\"` and an `aria-label`. Show as\n * many placeholder rows as are normally expected (two or three) in the same\n * grid as the real rows, so nothing jumps when the data arrives. Show it only\n * after 300ms; a button that is working uses a spinner instead.\n *\n * @example\n * ```html\n * <z-panel title=\"Meine Server\" busy aria-label=\"Server werden geladen\">\n * <z-skeleton thumb />\n * <z-skeleton width=\"40%\" />\n * <z-skeleton width=\"64px\" />\n * </z-panel>\n * <z-game-grid role=\"group\" aria-busy=\"true\" aria-label=\"Spiele werden geladen\">\n * <z-skeleton tile />\n * <z-skeleton tile />\n * </z-game-grid>\n * ```\n */\n@Component({\n selector: 'z-skeleton',\n template: `@if (tile()) {\n <span class=\"z-skel__cover\"></span>\n <span class=\"z-skel__line z-skel__line--title\"></span>\n <span class=\"z-skel__line z-skel__line--price\"></span>\n }`,\n host: {\n class: 'z-skel',\n '[class.z-skel--thumb]': `thumb()`,\n '[class.z-skel--tile]': `tile()`,\n '[style.width]': `tile() ? null : width() || null`,\n 'aria-hidden': 'true',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSkeleton {\n /**\n * CSS length for the placeholder, for example `40%` or `64px`. Empty means\n * full width.\n *\n * @default ''\n */\n readonly width = input('');\n\n /**\n * Renders a square instead of a line, for the image area of a row. Boolean\n * attribute.\n *\n * @default false\n */\n readonly thumb = input(false, { transform: booleanAttribute });\n\n /**\n * Renders the placeholder of a `button[zGameTile]`: the landscape cover area, a\n * title line and a price line with the gaps of the tile, for a\n * `z-game-grid` that is still loading. The grid cell sets its width, so\n * {@link width} does not apply. Boolean attribute.\n *\n * @default false\n */\n readonly tile = input(false, { transform: booleanAttribute });\n}\n","import {\n DestroyRef,\n EnvironmentProviders,\n inject,\n InjectionToken,\n makeEnvironmentProviders,\n Service,\n signal,\n} from '@angular/core';\n\n/**\n * Status of a toast. `neutral` confirms, `info` adds a hint, `success` reports\n * a completed operation, `warning` something to act on soon and `danger` a\n * failed one. Only `danger` is announced as `role=\"alert\"`; the other four are\n * announced politely, unless {@link ZToastOptions.live} says otherwise.\n *\n * The status is never the colour alone: the toast text itself says what\n * happened, so a colour-blind reader and a screen reader get the same message.\n */\nexport type ZToastStatus = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\n/**\n * Live region a toast is announced in: `polite` waits until the screen reader\n * is idle, `assertive` interrupts it (`role=\"alert\"`).\n */\nexport type ZToastLive = 'polite' | 'assertive';\n\n/**\n * Options for a single toast, passed to `show`, `info`, `success`, `warning`\n * and `error`.\n */\nexport interface ZToastOptions {\n /** Color and announcement of the toast. Defaults to `neutral`. */\n status?: ZToastStatus;\n /**\n * Line above the message, as a full sentence or a short heading. Omitted\n * means the toast stays a single line, exactly as before.\n */\n title?: string;\n /** Name of the Material Icons ligature. Omitted means no icon. */\n icon?: string;\n /** Label of the extra action, for example `Rückgängig`. Omitted means no action button. */\n actionLabel?: string;\n /** Called when the action is used. The toast closes afterwards. */\n action?: () => void;\n /**\n * Milliseconds the toast stays visible. 0 means it stays until it is closed.\n * Without a value: 5000, or 8000 when `actionLabel` is set.\n */\n duration?: number;\n /**\n * Live region of the toast. Without a value `danger` is `assertive` and the\n * other four are `polite`. `assertive` for a `warning` is what an application\n * sets when its warnings used to interrupt the screen reader.\n */\n live?: ZToastLive;\n}\n\n/** A toast as it is currently shown. Read from `ZToast.toasts` by the outlet. */\nexport interface ZToastItem {\n /** Running number, also the handle for `dismiss`. */\n readonly id: number;\n /** The message, one sentence without a full stop. */\n readonly text: string;\n /** Line above the message, empty for a single-line toast. */\n readonly title: string;\n /**\n * Which of the five looks the toast has. Without {@link live} it also picks\n * the live region: `danger` goes into the assertive one, the other four into\n * the polite one; `live` overrides that. Always set here; `show()` falls\n * back to `neutral`.\n */\n readonly status: ZToastStatus;\n /** Name of the Material Icons ligature, empty for no icon. */\n readonly icon: string;\n /** Label of the action button, empty for no action. */\n readonly actionLabel: string;\n /** Called when the action is used. */\n readonly action?: () => void;\n /**\n * Live region the outlet puts the toast into. `ZToast` always sets it;\n * without it the outlet derives it from {@link status} as before.\n */\n readonly live?: ZToastLive;\n}\n\n/**\n * Configuration of {@link provideZenitToast}. Every field is optional; the\n * defaults are the behaviour without the provider.\n */\nexport interface ZToastConfig {\n /**\n * How many toasts are visible at a time, at least 1.\n *\n * @default 3\n */\n readonly maxVisible?: number;\n /**\n * What a new toast does while {@link maxVisible} toasts are visible.\n * `'replace'` closes the oldest toast that is not standing and waits only\n * when every visible toast is standing. `'queue'` never closes one: the new\n * toast waits until a place is free. Standing means `duration: 0` or an\n * action; such a toast is never closed to make room, in either mode.\n *\n * @default 'replace'\n */\n readonly overflow?: 'replace' | 'queue';\n}\n\nconst Z_TOAST_CONFIG = new InjectionToken<ZToastConfig>('Z_TOAST_CONFIG', {\n providedIn: 'root',\n factory: () => ({}),\n});\n\n/**\n * Sets how many toasts `ZToast` shows at once and what happens to the ones\n * beyond that. Application root only: `ZToast` is a root service and reads\n * the config of the root injector once.\n *\n * @param config Deviations from the defaults; see {@link ZToastConfig}.\n * @returns Providers for the application root (`bootstrapApplication`).\n *\n * @example\n * ```ts\n * // app.config.ts: no toast is ever closed to make room\n * export const appConfig: ApplicationConfig = {\n * providers: [provideZenitToast({ overflow: 'queue' })],\n * };\n * ```\n */\nexport function provideZenitToast(config: ZToastConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: Z_TOAST_CONFIG, useValue: config }]);\n}\n\nconst DAUER = 5000;\nconst DAUER_MIT_AKTION = 8000;\n\n/** A toast that waits for a place, with the duration it gets once visible. */\ninterface Wartend {\n readonly toast: ZToastItem;\n readonly dauer: number;\n}\n\n/**\n * Short feedback above the content: confirms that something happened and\n * disappears by itself. The visible part is `z-toast-outlet`, which stands once\n * in the root template.\n *\n * At most three toasts at a time, the newest at the bottom; a fourth one closes\n * the oldest toast that is not standing. A standing toast, one with\n * `duration: 0` or an action, is never closed to make room: while only\n * standing toasts are visible, the new one waits and appears as soon as a\n * place is free. {@link provideZenitToast} changes the number and can make\n * every toast wait instead of closing one. An error that requires an action on\n * the page is an alert and not a toast.\n *\n * A toast is one sentence by default. `title` adds a line above it, so a\n * service that carries a title, a message and a type of its own can hand all\n * three over: `title` to `title`, the message to `text`, the type to `status`.\n * The status never stands in the colour alone; the text says what happened.\n *\n * @example\n * ```html\n * <!-- once in the root template -->\n * <z-toast-outlet />\n * <button zBtn=\"secondary\" (click)=\"toast.success('Eigenschaften gespeichert')\">Speichern</button>\n * ```\n */\n@Service()\nexport class ZToast {\n private letzteId = 0;\n private readonly timer = new Map<number, ReturnType<typeof setTimeout>>();\n private readonly liste = signal<readonly ZToastItem[]>([]);\n private warteschlange: readonly Wartend[] = [];\n private readonly config = inject(Z_TOAST_CONFIG);\n private readonly hoechstens = Math.max(\n 1,\n Number.isFinite(this.config.maxVisible) ? Number(this.config.maxVisible) : 3,\n );\n /** Ids of the standing toasts, visible or waiting: never closed to make room. */\n private readonly stehend = new Set<number>();\n\n /**\n * The visible toasts, oldest first. Read by `z-toast-outlet`. A waiting toast\n * is not in here; its timer starts when it moves in.\n */\n readonly toasts = this.liste.asReadonly();\n\n constructor() {\n // Closes all toasts so no timer keeps running when the application is torn\n // down.\n inject(DestroyRef).onDestroy(() => this.dismiss());\n }\n\n /**\n * Shows a toast and returns its id for `dismiss`. While three toasts are\n * already visible, the oldest one that is not standing is closed first; if\n * every visible toast is standing, or with `overflow: 'queue'`, the new one\n * waits for a place instead.\n *\n * @param text Message, one sentence without a full stop, in the past\n * participle, for example `Eigenschaften gespeichert`.\n * @param optionen Status, title, icon, action and duration. Default duration:\n * 5000ms, 8000ms with `actionLabel`, 0 keeps the toast until it is closed.\n * @returns id of the new toast.\n */\n show(text: string, optionen: ZToastOptions = {}): number {\n const id = ++this.letzteId;\n const status = optionen.status ?? 'neutral';\n const dauer = optionen.duration ?? (optionen.actionLabel ? DAUER_MIT_AKTION : DAUER);\n if (dauer <= 0 || optionen.actionLabel) {\n this.stehend.add(id);\n }\n const toast: ZToastItem = {\n id,\n text,\n title: optionen.title ?? '',\n status,\n icon: optionen.icon ?? '',\n actionLabel: optionen.actionLabel ?? '',\n action: optionen.action,\n live: optionen.live ?? (status === 'danger' ? 'assertive' : 'polite'),\n };\n this.warteschlange = [...this.warteschlange, { toast, dauer }];\n if (this.config.overflow !== 'queue') {\n this.platzMachen();\n }\n this.nachruecken();\n return id;\n }\n\n /**\n * Shows a hint: status `info` and the icon `info`, both overridable through\n * `optionen`. Duration and live region are those of a neutral toast: 5000ms,\n * 8000ms with `actionLabel`, announced politely.\n *\n * @returns id of the new toast.\n */\n info(text: string, optionen: ZToastOptions = {}): number {\n return this.show(text, { status: 'info', icon: 'info', ...optionen });\n }\n\n /**\n * Shows a success toast: status `success` and the icon `check_circle`, both\n * overridable through `optionen`.\n *\n * @returns id of the new toast.\n */\n success(text: string, optionen: ZToastOptions = {}): number {\n return this.show(text, { status: 'success', icon: 'check_circle', ...optionen });\n }\n\n /**\n * Shows a warning: status `warning` and the icon `warning`, both overridable\n * through `optionen`. A warning is not an error, so duration and live region\n * stay those of a neutral toast: 5000ms, 8000ms with `actionLabel`, announced\n * politely. Something the customer has to act on right now is an alert on the\n * page, not a toast.\n *\n * @returns id of the new toast.\n */\n warning(text: string, optionen: ZToastOptions = {}): number {\n return this.show(text, { status: 'warning', icon: 'warning', ...optionen });\n }\n\n /**\n * Shows an error toast: status `danger`, the icon `error` and `duration: 0`,\n * so it stays until it is closed. The outlet announces it with\n * `role=\"alert\"`. All three values are overridable through `optionen`.\n *\n * @returns id of the new toast.\n */\n error(text: string, optionen: ZToastOptions = {}): number {\n return this.show(text, { status: 'danger', icon: 'error', duration: 0, ...optionen });\n }\n\n /**\n * Closes a toast and stops its timer, or takes it out of the queue before it\n * was ever shown. The next waiting toast moves into the free place.\n *\n * @param id id from `show`, `info`, `success`, `warning` or `error`. Without\n * an id all toasts are closed, the waiting ones included.\n */\n dismiss(id?: number): void {\n if (id === undefined) {\n this.timer.forEach((timer) => clearTimeout(timer));\n this.timer.clear();\n this.stehend.clear();\n this.warteschlange = [];\n this.liste.set([]);\n return;\n }\n clearTimeout(this.timer.get(id));\n this.timer.delete(id);\n this.stehend.delete(id);\n this.warteschlange = this.warteschlange.filter((w) => w.toast.id !== id);\n this.liste.update((alt) => alt.filter((t) => t.id !== id));\n this.nachruecken();\n }\n\n /**\n * `'replace'`: one new toast frees at most one place. While every place is\n * taken, the oldest visible toast that is not standing gives way, and the\n * head of the queue moves in, which is the new toast only when nothing else\n * waits. One and not a loop: a loop would also close the toast that just\n * moved in, and every further one after it, so a waiting toast could vanish\n * without ever having been in `toasts`. Only visible toasts give way; a\n * waiting one is never dropped.\n */\n private platzMachen(): void {\n if (this.warteschlange.length === 0 || this.liste().length < this.hoechstens) {\n return;\n }\n const aeltester = this.liste().find((t) => !this.stehend.has(t.id));\n if (aeltester) {\n this.dismiss(aeltester.id);\n }\n }\n\n /** Moves waiting toasts in while places are free and starts their timers. */\n private nachruecken(): void {\n while (this.warteschlange.length > 0 && this.liste().length < this.hoechstens) {\n const [{ toast, dauer }, ...rest] = this.warteschlange;\n this.warteschlange = rest;\n this.liste.update((alt) => [...alt, toast]);\n if (dauer > 0) {\n this.timer.set(\n toast.id,\n setTimeout(() => this.dismiss(toast.id), dauer),\n );\n }\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { ZButton } from '../button';\nimport { ZIcon } from '../icon';\nimport { injectZLabels } from '../labels';\nimport { ZToast, ZToastItem } from './toast';\n\n/**\n * Stands once in the root template and renders the toasts of the `ZToast`\n * service. Sits `position: fixed` in the bottom right corner, on mobile at the\n * bottom across the full width.\n *\n * Renders a host with the class `z-toast-outlet` holding two permanent\n * `div.z-toast-outlet__live` regions, and per toast a `div.z-toast` plus\n * `z-toast--info`, `--success`, `--warning` or `--danger`, an optional `z-icon`,\n * the text, an optional `button.z-toast__action` and the close button\n * `button.z-toast__close` (ghost, `sm`, icon only).\n *\n * Without a title the text is a bare `span`, as it has always been. With a\n * title the two lines share one column: `div.z-toast__text` with\n * `span.z-toast__title` above `span.z-toast__body`, the same structure as\n * `z-alert`.\n *\n * Accessibility: a screen reader announces a change *inside* an existing live\n * region, not a region that appears together with its content. The outlet\n * therefore renders the two regions from the start, empty, and puts each toast\n * into the matching one: `role=\"status\"` with `aria-live=\"polite\"` for neutral,\n * info, success and warning, `role=\"alert\"` with `aria-live=\"assertive\"` for\n * danger, because only a failure is worth interrupting for. The option `live`\n * of a toast overrides that, for example to announce a warning assertively. The toast\n * elements carry no `role` of their own, because a live region nested in a live\n * region is announced twice. Both regions set `aria-atomic=\"false\"`, which\n * overrides the `true` implied by `status` and `alert`: with up to three toasts\n * open, only the one that was just added is read out instead of all of them.\n * The `aria-label` of the close button comes from the label registry, key\n * `toastClose`: German without a provider, English with\n * `provideZenitLabels(Z_LABELS_EN)`, and `closeLabel` on this component wins\n * over both. Using the action runs it and closes that toast.\n *\n * Both regions are `display: contents`, so the toasts stay the grid items of\n * `.z-toast-outlet`; the `order` bound per toast keeps the visual sequence of\n * the service list (newest at the bottom) across the two regions.\n *\n * @example\n * ```html\n * <z-toast-outlet />\n * <z-toast-outlet closeLabel=\"Close\" />\n * ```\n */\n@Component({\n selector: 'z-toast-outlet',\n imports: [ZButton, ZIcon],\n template: `\n @for (gruppe of gruppen(); track gruppe.rolle) {\n <div\n class=\"z-toast-outlet__live\"\n [attr.role]=\"gruppe.rolle\"\n [attr.aria-live]=\"gruppe.live\"\n aria-atomic=\"false\"\n >\n @for (eintrag of gruppe.toasts; track eintrag.toast.id) {\n @let toast = eintrag.toast;\n <div\n class=\"z-toast\"\n [class.z-toast--info]=\"toast.status === 'info'\"\n [class.z-toast--success]=\"toast.status === 'success'\"\n [class.z-toast--warning]=\"toast.status === 'warning'\"\n [class.z-toast--danger]=\"toast.status === 'danger'\"\n [style.order]=\"eintrag.reihe\"\n >\n @if (toast.icon) {\n <z-icon [name]=\"toast.icon\" />\n }\n @if (toast.title) {\n <div class=\"z-toast__text\">\n <span class=\"z-toast__title\">{{ toast.title }}</span>\n <span class=\"z-toast__body\">{{ toast.text }}</span>\n </div>\n } @else {\n <span>{{ toast.text }}</span>\n }\n @if (toast.actionLabel) {\n <button type=\"button\" class=\"z-toast__action\" (click)=\"aufAktion(toast)\">\n {{ toast.actionLabel }}\n </button>\n }\n <button\n zBtn=\"ghost\"\n size=\"sm\"\n iconOnly\n type=\"button\"\n class=\"z-toast__close\"\n [attr.aria-label]=\"schliessenText()\"\n (click)=\"dienst.dismiss(toast.id)\"\n >\n <z-icon name=\"close\" size=\"sm\" />\n </button>\n </div>\n }\n </div>\n }\n `,\n host: { class: 'z-toast-outlet' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZToastOutlet {\n /**\n * `aria-label` of the close button on every toast. Unset, the component uses\n * {@link ZLabels.toastClose} from the label registry.\n *\n * @default undefined\n */\n readonly closeLabel = input<string>();\n\n private readonly labels = injectZLabels();\n\n protected readonly schliessenText = computed(() => this.closeLabel() ?? this.labels.toastClose);\n protected readonly dienst = inject(ZToast);\n protected readonly toasts = this.dienst.toasts;\n\n /**\n * The two live regions with their toasts. `reihe` is the position in the\n * service list and becomes the CSS `order`, so splitting the list over two\n * regions does not change what the eye sees.\n */\n protected readonly gruppen = computed(() => {\n const mitReihe = this.toasts().map((toast, reihe) => ({\n toast,\n reihe,\n live: toast.live ?? (toast.status === 'danger' ? 'assertive' : 'polite'),\n }));\n return [\n {\n rolle: 'status',\n live: 'polite',\n toasts: mitReihe.filter((eintrag) => eintrag.live === 'polite'),\n },\n {\n rolle: 'alert',\n live: 'assertive',\n toasts: mitReihe.filter((eintrag) => eintrag.live === 'assertive'),\n },\n ];\n });\n\n protected aufAktion(toast: ZToastItem): void {\n toast.action?.();\n this.dienst.dismiss(toast.id);\n }\n}\n","import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\n\n/**\n * The tooltip panel: renders its text on a host with the class `z-tooltip`,\n * `role=\"tooltip\"` and the id the trigger points its `aria-describedby` at.\n * It hangs in the CDK overlay on the body, not in the page flow, and is only\n * created by the `zTooltip` directive.\n *\n * @internal Exported for the directive only; not part of the public API and not\n * re-exported from the entry point.\n */\n@Component({\n selector: 'z-tooltip',\n template: `{{ text() }}`,\n host: {\n class: 'z-tooltip',\n role: 'tooltip',\n '[attr.id]': `id()`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZTooltipPanel {\n /** Text of the tooltip, set by the directive when the panel is attached. */\n readonly text = signal('');\n\n /** id the trigger refers to through `aria-describedby`. */\n readonly id = signal('');\n}\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n ComponentRef,\n DestroyRef,\n Directive,\n DOCUMENT,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ZTokenAttribut } from '../a11y/host-attribute';\nimport { ZTooltipPanel } from './tooltip-panel';\n\n/**\n * Grace period between leaving trigger or panel and closing. Long enough to\n * cross the gap with the pointer, short enough not to feel stuck.\n */\nconst NACHLAUF = 100;\n\nlet zaehler = 0;\n\n/** The values of `overflow` that cut a child off at the edge of its box. */\nconst KLEMMT = new Set(['auto', 'scroll', 'hidden', 'clip', 'overlay']);\n\n/** One box entirely beyond one of the edges of the other. */\nfunction ausserhalb(\n kasten: DOMRect,\n rolle: { top: number; left: number; bottom: number; right: number },\n): boolean {\n return (\n kasten.bottom <= rolle.top ||\n kasten.top >= rolle.bottom ||\n kasten.right <= rolle.left ||\n kasten.left >= rolle.right\n );\n}\n\n/** Two boxes at the same place on the screen: nothing moved the trigger. */\nfunction unbewegt(a: DOMRect, b: DOMRect): boolean {\n return a.top === b.top && a.left === b.left && a.width === b.width && a.height === b.height;\n}\n\n/**\n * Short addition to a control. Opens the tooltip panel in a CDK overlay,\n * centered above the trigger with 8px gap, below it as the fallback position.\n * A scroll of a container the trigger sits in takes the panel back, in the page\n * as well as in an inner container such as the body of a scrolling dialog;\n * another scroller on the same screen leaves it alone. While the trigger holds\n * the focus the panel follows that scroll instead, steps aside while the\n * scroller covers the trigger and comes back once it can be seen again.\n *\n * Accessibility: the panel appears on pointer and focus. On leaving it does not\n * disappear at once but after 100ms, and entering the panel itself stops that\n * timer again, so the text can be read, selected and scrolled (WCAG 2.1\n * SC 1.4.13 \"Hoverable\"). The 8px between trigger and panel are the transparent\n * padding of the overlay pane (`.z-tooltip-pane`), so the pointer crosses the\n * panel instead of nothing; the position therefore carries no offset. While the\n * trigger holds the focus, the pointer leaving keeps the panel standing, since\n * it belongs to the focus then; `focusout` closes it at once unless the pointer\n * rests on trigger or panel, and Escape always closes at once, and only the\n * tooltip: the key stops there, so a dialog behind it needs a second Escape.\n * The id of the panel is added to `aria-describedby` of the trigger while the\n * panel hangs in the DOM and taken out again afterwards, because a permanent\n * reference would point at a missing id most of the time. Whatever the trigger\n * already carries there, a hint or an error of a `z-field` for example, stays\n * untouched. A\n * disabled button fires no events, so the surrounding element carries the\n * tooltip, and the same reason also stands as a sentence for keyboard users.\n *\n * @example\n * ```html\n * <button zBtn=\"ghost\" iconOnly aria-label=\"Aktualisieren\" zTooltip=\"Aktualisieren\">\n * <z-icon name=\"refresh\" />\n * </button>\n *\n * <span zTooltip=\"Beispiel-Server 1 ist bereits gestoppt\">\n * <button zBtn=\"secondary\" type=\"button\" disabled>Stoppen</button>\n * </span>\n * ```\n */\n@Directive({\n selector: '[zTooltip]',\n host: {\n '(mouseenter)': `aufZeiger(true)`,\n '(mouseleave)': `aufZeiger(false)`,\n '(focusin)': `zeige()`,\n '(focusout)': `aufFokusVerlust()`,\n },\n})\nexport class ZTooltip {\n /**\n * The tooltip text, given as the value of the attribute. A change while the\n * panel is open reaches the panel. Empty means no tooltip: the panel is not\n * opened at all, and an open one closes.\n *\n * @default ''\n */\n readonly zTooltip = input('');\n\n protected readonly tooltipId = `z-tooltip-${++zaehler}`;\n protected readonly sichtbar = signal(false);\n\n private readonly overlay = inject(Overlay);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly dokument = inject(DOCUMENT);\n /**\n * The id of the panel inside `aria-describedby` of the trigger, while the\n * panel stands. The attribute is a list of ids and belongs to the caller: a\n * static one, a binding, or the hint and the error that a `z-field` links to\n * its control. Overwriting it would silently cut the control off from its\n * own description, so only this one token is added and removed, and it keeps\n * the back of the list, where a passing addition is read last.\n */\n private readonly beschreibung = new ZTokenAttribut(\n this.host.nativeElement,\n 'aria-describedby',\n 'hinten',\n );\n private overlayRef?: OverlayRef;\n private flaeche?: ComponentRef<ZTooltipPanel>;\n\n /** Where the pointer currently rests; both keep the panel open. */\n private ueberHost = false;\n private ueberPanel = false;\n private timer?: ReturnType<typeof setTimeout>;\n /** Takes the panel listeners with it on destroy. */\n private readonly abbruch = new AbortController();\n /** Lives only while the panel stands; see {@link horcheWaehrendOffen}. */\n private horcher?: AbortController;\n /** The trigger box the panel was hung on; a scroll that leaves it is none. */\n private verankert?: DOMRect;\n\n constructor() {\n // The text can change while the panel hangs in the overlay, for example\n // when the reason for a disabled button changes. Empty closes the panel,\n // because an empty tooltip opens none either.\n effect(() => {\n const text = this.zTooltip();\n if (!this.sichtbar()) {\n return;\n }\n if (text) {\n this.flaeche?.instance.text.set(text);\n } else {\n this.verstecke();\n }\n });\n\n // The overlay goes together with the trigger and takes the pending timer\n // and the panel listeners with it.\n inject(DestroyRef).onDestroy(() => {\n this.stoppeTimer();\n this.abbruch.abort();\n this.horcher?.abort();\n // The trigger may outlive the directive, so it keeps its own description\n // and loses only the id of the panel.\n this.beschreibung.setze(null);\n this.overlayRef?.dispose();\n });\n }\n\n protected aufZeiger(drueber: boolean): void {\n this.ueberHost = drueber;\n if (drueber) {\n this.zeige();\n } else {\n this.planeSchliessen();\n }\n }\n\n /**\n * The focus leaves the trigger. With the pointer still on trigger or panel\n * the hover keeps the panel and only leaving both takes it back.\n */\n protected aufFokusVerlust(): void {\n if (!this.ueberHost && !this.ueberPanel) {\n this.verstecke();\n }\n }\n\n protected zeige(): void {\n const text = this.zTooltip();\n if (!text) {\n return;\n }\n this.stoppeTimer();\n if (this.sichtbar()) {\n return;\n }\n // A trigger that is already cut off by a container around it gets no panel\n // yet: `overflow: clip` never sends a scroll event, so the first paint is\n // the only moment to ask. The listeners start anyway, so a scroll that\n // brings the trigger back into view brings the panel with it.\n const kasten = this.host.nativeElement.getBoundingClientRect();\n if ((kasten.width || kasten.height) && this.verdeckt(kasten)) {\n this.verankert = kasten;\n this.horcheWaehrendOffen();\n return;\n }\n this.zeigeFlaeche(text);\n this.horcheWaehrendOffen();\n }\n\n protected verstecke(): void {\n this.stoppeTimer();\n this.horcher?.abort();\n this.horcher = undefined;\n this.verankert = undefined;\n this.ueberPanel = false;\n this.verbergeFlaeche();\n }\n\n /** Panel into the overlay; the trigger box it belongs to is noted with it. */\n private zeigeFlaeche(text: string): void {\n this.overlayRef ??= this.erzeugeOverlay();\n this.flaeche = this.overlayRef.attach(new ComponentPortal(ZTooltipPanel));\n this.flaeche.instance.text.set(text);\n this.flaeche.instance.id.set(this.tooltipId);\n // The panel is rendered here and now: `aria-describedby` of the trigger\n // points at its id from this moment on, and a reference into nothing is\n // what a screen reader would read out.\n this.flaeche.changeDetectorRef.detectChanges();\n this.verankert = this.host.nativeElement.getBoundingClientRect();\n this.sichtbar.set(true);\n // The caller may rewrite the attribute while the panel stands: a binding of\n // its own, or the hint and the error of a `z-field` around the control.\n // `ZTokenAttribut` watches for that and puts the id back.\n this.beschreibung.setze(this.tooltipId);\n }\n\n /** Panel out of the overlay. Whoever keeps listening stays listening. */\n private verbergeFlaeche(): void {\n if (!this.sichtbar()) {\n return;\n }\n this.beschreibung.setze(null);\n this.overlayRef?.detach();\n this.flaeche = undefined;\n this.sichtbar.set(false);\n }\n\n /**\n * While the panel stands, every scroller around the trigger is listened to,\n * and Escape is caught before anything else sees it.\n *\n * Both listeners hang on the document in the CAPTURE phase. For the scroll\n * because an event on an inner element does not bubble: the `reposition`\n * strategy of the overlay builds on `ScrollDispatcher`, which only ever hears\n * the window and the containers a caller marked `cdkScrollable`, so a tooltip\n * inside the body of a dialog used to stand still while its trigger moved\n * away under it. For Escape because the keyboard dispatcher of the CDK sits\n * on `document.body` and would otherwise close the dialog behind the tooltip\n * with the same key press (WAI-ARIA Practices: the first Escape dismisses the\n * tooltip, the second the dialog).\n */\n private horcheWaehrendOffen(): void {\n if (this.horcher) {\n return;\n }\n this.horcher = new AbortController();\n const signal = this.horcher.signal;\n this.dokument.addEventListener('scroll', (ereignis) => this.aufScrollen(ereignis), {\n capture: true,\n passive: true,\n signal,\n });\n this.dokument.addEventListener(\n 'keydown',\n (ereignis) => {\n if (ereignis.key !== 'Escape' || !this.sichtbar()) {\n return;\n }\n ereignis.stopPropagation();\n this.verstecke();\n },\n { capture: true, signal },\n );\n }\n\n /**\n * A scroll under the pointer takes the panel back, the way the native `title`\n * tooltip goes: one that lags behind its trigger is worse than none.\n *\n * Only a scroller the trigger sits in counts. `document` contains it too,\n * which is how a scroll of the page arrives, while the panel and every other\n * scroller of the screen (a console that follows its own log, a table beside\n * the trigger) do not move the trigger and are therefore ignored. An event\n * that leaves the trigger box exactly where it was changes nothing either:\n * the scroll that brought the trigger into view has already happened when the\n * panel goes up, and its event only arrives afterwards.\n *\n * The focus is the exception to closing. WCAG 2.1 SC 1.4.13 asks the content\n * to stand as long as the trigger keeps hover or focus, and the browser\n * itself scrolls a focused control into view, so the panel of a focused\n * trigger follows the scroll, steps aside while the scroller covers the\n * trigger and comes back once it can be seen again.\n */\n private aufScrollen(ereignis: Event): void {\n const ziel = ereignis.target as Node | null;\n const wirt = this.host.nativeElement;\n if (!this.overlayRef || !ziel?.contains(wirt)) {\n return;\n }\n const kasten = wirt.getBoundingClientRect();\n if (this.verankert && unbewegt(this.verankert, kasten)) {\n return;\n }\n this.verankert = kasten;\n if (!wirt.contains(this.dokument.activeElement)) {\n this.verstecke();\n return;\n }\n if (this.verdeckt(kasten)) {\n this.verbergeFlaeche();\n } else if (!this.sichtbar()) {\n this.zeigeFlaeche(this.zTooltip());\n } else {\n this.overlayRef.updatePosition();\n }\n }\n\n /**\n * Has the trigger left the visible part of anything that clips it? Not only\n * the scroller the event came from: with two scrollers inside each other the\n * inner one can hold the trigger out of sight while the outer one moves, and\n * a panel brought back then would float over foreign content. The viewport\n * counts as the outermost clip.\n */\n private verdeckt(kasten: DOMRect): boolean {\n const fenster = this.dokument.defaultView;\n if (\n ausserhalb(kasten, {\n top: 0,\n left: 0,\n bottom: fenster?.innerHeight ?? 0,\n right: fenster?.innerWidth ?? 0,\n })\n ) {\n return true;\n }\n for (\n let element = this.host.nativeElement.parentElement;\n element;\n element = element.parentElement\n ) {\n const stil = fenster?.getComputedStyle(element);\n const klemmt = !!stil && (KLEMMT.has(stil.overflowX) || KLEMMT.has(stil.overflowY));\n if (klemmt && ausserhalb(kasten, element.getBoundingClientRect())) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Closes after the grace period instead of at once, so the pointer can reach\n * the panel. A trigger holding the focus keeps the panel: the panel belongs\n * to that focus then and only `focusout` or Escape takes it back.\n */\n private planeSchliessen(): void {\n this.stoppeTimer();\n if (this.host.nativeElement.contains(this.dokument.activeElement)) {\n return;\n }\n this.timer = setTimeout(() => this.verstecke(), NACHLAUF);\n }\n\n private stoppeTimer(): void {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n\n /** Centered above, below as the fallback position. */\n private erzeugeOverlay(): OverlayRef {\n const ref = this.overlay.create({\n panelClass: 'z-tooltip-pane',\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions([\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom' },\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top' },\n ]),\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n });\n // The panel hangs on the body, far outside the trigger, so it has to report\n // its own hover: entering stops the pending close, leaving starts a new\n // one. The listeners live as long as the overlay and go with the\n // AbortController on destroy.\n ref.overlayElement.addEventListener(\n 'mouseenter',\n () => {\n this.ueberPanel = true;\n this.stoppeTimer();\n },\n { signal: this.abbruch.signal },\n );\n ref.overlayElement.addEventListener(\n 'mouseleave',\n () => {\n this.ueberPanel = false;\n this.planeSchliessen();\n },\n { signal: this.abbruch.signal },\n );\n return ref;\n }\n}\n","/* Package rueckmeldung: Alert, EmptyState, Skeleton, Toast and Tooltip. */\nexport * from '../feedback';\nexport * from '../toast';\nexport * from '../tooltip';\n","import { InteractivityChecker } from '@angular/cdk/a11y';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n contentChild,\n DestroyRef,\n Directive,\n DOCUMENT,\n ElementRef,\n inject,\n InjectionToken,\n input,\n signal,\n viewChild,\n} from '@angular/core';\n\n/**\n * Carries the id of a dialog heading down to `ZDialogLayout`. `ZDialog.open()`\n * generates the id, provides it under this token and puts the same id on the\n * CDK container as `aria-labelledby`, which is what gives the dialog its\n * accessible name.\n *\n * @internal Exported so that `dialog.ts` can provide it; not part of the\n * documented API.\n */\nexport const Z_DIALOG_TITLE_ID = new InjectionToken<string>('Z_DIALOG_TITLE_ID');\n\nlet laufendeNummer = 0;\n\n/**\n * Returns `<prefix>-<n>` with `n` counting up once per call, used for the ids\n * of a dialog heading and of the confirmation field.\n *\n * @param praefix Prefix of the id, for example `z-dialog-title`.\n * @returns The prefix followed by a dash and a number unique in this document.\n * @internal Exported for use inside the dialog package only.\n */\nexport function naechsteId(praefix: string): string {\n return `${praefix}-${++laufendeNummer}`;\n}\n\n/**\n * Marks the buttons in the footer of a dialog. Pure slot marker, it adds no\n * class and no markup. Without it `z-dialog` renders no footer at all.\n *\n * @example\n * ```html\n * <ng-container zDialogActions>\n * <button zBtn=\"ghost\" (click)=\"ref.close(false)\">Abbrechen</button>\n * <button zBtn=\"primary\" (click)=\"ref.close(true)\">Speichern</button>\n * </ng-container>\n * ```\n */\n@Directive({ selector: '[zDialogActions]' })\nexport class ZDialogActions {}\n\n/**\n * Switched off by something around the control, which the checker of the CDK\n * does not read: it only knows the `disabled` of the control itself. `:disabled`\n * covers a disabled `fieldset` the way the HTML standard defines it, including\n * the exception that the controls in its first `<legend>` stay operable, and the\n * `closest` behind it catches the browsers that do not.\n */\nfunction ausserBetrieb(element: HTMLElement): boolean {\n if (element.closest('[inert]')) {\n return true;\n }\n if (element.matches(':disabled')) {\n return true;\n }\n return (\n !!element.closest('fieldset:disabled') &&\n !element.closest('fieldset:disabled > legend:first-of-type')\n );\n}\n\n/**\n * Everything that could be a tab stop. Whether it really is one is decided by\n * `InteractivityChecker`, which knows the dozen reasons why it might not be.\n */\nconst KANDIDATEN = 'a[href], button, input, select, textarea, [tabindex], [contenteditable]';\n\n/**\n * Layout of a dialog: header with the heading, body, footer with the actions.\n * Use it as the root element of the component handed to `ZDialog.open()`.\n *\n * Renders `.z-dialog__header` with `<h2 class=\"z-dialog__title\">`,\n * `.z-dialog__body` with the projected content and, only when a\n * `[zDialogActions]` element is present, `.z-dialog__footer`. The host carries\n * `z-dialog` and its native `title` attribute is cleared, so the {@link title}\n * input never becomes a browser tooltip.\n *\n * Opened through `ZDialog`, the dialog is limited to the height of the screen\n * and the body is the part that scrolls: heading and actions stay in place, and\n * a body that scrolls without holding a tabbable element becomes a tab stop of\n * its own, a `role=\"group\"` named by the heading. Both are watched while the\n * dialog stands, so a body that only grows later gets its stop as well.\n *\n * Accessibility: `role=\"dialog\"`, `aria-modal`, the focus trap, Escape and\n * returning focus to the trigger all come from the container of\n * `@angular/cdk/dialog`. This component only supplies the heading and the id\n * that the container's `aria-labelledby` points at.\n *\n * @example\n * ```html\n * <z-dialog title=\"Notiz zu Beispiel-Server 1\">\n * <z-field label=\"Notiz\" for=\"notiz\">\n * <textarea zInput id=\"notiz\"></textarea>\n * </z-field>\n * <ng-container zDialogActions>\n * <button zBtn=\"ghost\" (click)=\"ref.close()\">Abbrechen</button>\n * <button zBtn=\"primary\" (click)=\"ref.close(true)\">Speichern</button>\n * </ng-container>\n * </z-dialog>\n * ```\n */\n@Component({\n selector: 'z-dialog',\n // CdkScrollable registers the body with the ScrollDispatcher of the CDK, so\n // an overlay anchored inside it, a menu or a tooltip, follows its trigger\n // while the body scrolls instead of standing still.\n imports: [CdkScrollable],\n template: `\n <div class=\"z-dialog__header\">\n <h2 class=\"z-dialog__title\" [id]=\"titleId\">{{ title() }}</h2>\n </div>\n <div\n #rumpf\n cdkScrollable\n class=\"z-dialog__body\"\n [attr.tabindex]=\"rumpfTabIndex()\"\n [attr.role]=\"rumpfTabIndex() === null ? null : 'group'\"\n [attr.aria-labelledby]=\"rumpfTabIndex() === null ? null : titleId\"\n >\n <ng-content />\n </div>\n @if (aktionen()) {\n <div class=\"z-dialog__footer\"><ng-content select=\"[zDialogActions]\" /></div>\n }\n `,\n host: {\n class: 'z-dialog',\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZDialogLayout {\n /**\n * Heading of the dialog, a question or a task. Required: without it the\n * dialog has no accessible name.\n */\n readonly title = input.required<string>();\n\n /**\n * id of the `<h2>` that the container's `aria-labelledby` points at. Taken\n * from `Z_DIALOG_TITLE_ID` when `ZDialog.open()` opened this dialog,\n * otherwise generated, so the layout also works standalone.\n */\n readonly titleId = inject(Z_DIALOG_TITLE_ID, { optional: true }) ?? naechsteId('z-dialog-title');\n\n protected readonly aktionen = contentChild(ZDialogActions);\n\n /** `0` only for a scrolling body that holds nothing focusable; see below. */\n protected readonly rumpfTabIndex = signal<0 | null>(null);\n\n private readonly rumpf = viewChild.required<ElementRef<HTMLElement>>('rumpf');\n /** Takes the blur listener of the body with it on destroy. */\n private readonly abbruch = new AbortController();\n\n private readonly pruefer = inject(InteractivityChecker);\n private readonly dokument = inject(DOCUMENT);\n\n constructor() {\n const zerstoerung = inject(DestroyRef);\n const fenster = this.dokument.defaultView;\n // A dialog longer than the screen scrolls in its body, and what scrolls has\n // to be reachable by keyboard (WCAG 2.1 SC 2.1.1). Controls inside the body\n // are reached by Tab and the browser scrolls them into view, so a form\n // needs nothing. A body that scrolls without holding a single tabbable\n // element does: a confirmation with a long text would otherwise be\n // unreadable without a mouse. Chrome and Firefox give such a scroller a tab\n // stop by themselves, Safari does not, and a second stop on the same\n // element does no harm. It carries `role=\"group\"` with the dialog heading\n // as its name, so it is not an unnamed stop on the way to the actions.\n //\n // Both halves of the question change while the dialog stands: the box with\n // the window (ResizeObserver) and the content with what the caller renders\n // into it (MutationObserver), a log that grows or a field that appears.\n afterNextRender(() => {\n const element = this.rumpf().nativeElement;\n const pruefe = (): void => {\n const scrollt = element.scrollHeight > element.clientHeight;\n // Focus lives on the stop itself while the content shrinks? Then it\n // stays: taking the tabindex away would drop the focus onto <body>,\n // outside the focus trap of the dialog. `blur` asks again.\n const behalten = element === this.dokument.activeElement && this.rumpfTabIndex() === 0;\n this.rumpfTabIndex.set(behalten || (scrollt && !this.hatTabStopp(element)) ? 0 : null);\n };\n // One check per frame, not one per mutation: every check reads\n // scrollHeight and therefore forces a layout. Measured on 3000 appended\n // log lines, one per task: 3000 layouts and 54.9s against 3 layouts and\n // 32ms once they are coalesced.\n let geplant = 0;\n const rahmen = fenster?.requestAnimationFrame?.bind(fenster);\n const plane = (): void => {\n if (!rahmen) {\n pruefe();\n return;\n }\n geplant ||= rahmen(() => {\n geplant = 0;\n pruefe();\n });\n };\n pruefe();\n // ResizeObserver is missing on the server, where no box changes either.\n // It already reports once per frame, so it checks directly.\n const groesse =\n typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(pruefe);\n groesse?.observe(element);\n const inhalt = new MutationObserver(plane);\n inhalt.observe(element, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true,\n attributeFilter: ['class', 'disabled', 'hidden', 'href', 'inert', 'style', 'tabindex'],\n });\n element.addEventListener('blur', plane, { signal: this.abbruch.signal });\n zerstoerung.onDestroy(() => {\n groesse?.disconnect();\n inhalt.disconnect();\n this.abbruch.abort();\n if (geplant) {\n fenster?.cancelAnimationFrame?.(geplant);\n }\n });\n });\n }\n\n /**\n * Does Tab reach anything inside the body? `InteractivityChecker` is what the\n * focus trap of the CDK asks, so the answer is the same one the trap gives:\n * it knows `tabindex=\"-1\"`, `disabled`, `hidden`, `display: none`,\n * `visibility: hidden`, `inert` and a disabled `fieldset` around the control.\n */\n private hatTabStopp(rumpf: HTMLElement): boolean {\n return Array.from(rumpf.querySelectorAll<HTMLElement>(KANDIDATEN)).some(\n (element) =>\n // isTabbable answers for the tabindex, isFocusable for `disabled` and\n // for everything invisible.\n this.pruefer.isTabbable(element) &&\n this.pruefer.isFocusable(element) &&\n !ausserBetrieb(element),\n );\n }\n}\n","import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { ZButton } from '../button';\nimport { ZField, ZInput } from '../field';\nimport { naechsteId, ZDialogActions, ZDialogLayout } from './dialog-layout';\n\n/**\n * Where focus lands after a dialog closes, on top of the CDK default of\n * returning it to the element that was focused before the dialog opened.\n *\n * An `HTMLElement` or an `ElementRef` names the element directly, a `string` is\n * a CSS selector resolved against the document when the dialog closes.\n */\nexport type ZRestoreFocusTarget = HTMLElement | ElementRef<HTMLElement> | string;\n\n/**\n * Texts and behaviour of a confirmation, passed to `ZDialog.confirm()`. Every\n * text comes from the caller, the library holds none.\n */\nexport interface ZConfirmConfig {\n /** Heading of the dialog, phrased as a question or a task. */\n title: string;\n /** The concrete consequences: what is lost, what it costs. */\n body: string;\n /** Label of the confirming button. It repeats the verb from `title`. */\n confirmLabel: string;\n /** Label of the cancelling ghost button. */\n cancelLabel: string;\n /**\n * Renders the confirming button as `danger` instead of `primary`. Use it for\n * deleting, cancelling a contract and removing a payment method.\n *\n * @default false\n */\n danger?: boolean;\n /**\n * Text that has to be typed exactly, usually the name of the object being\n * deleted. It shows up as the placeholder, and the confirming button stays\n * disabled until the input matches character for character. Without it the\n * dialog has no input field.\n */\n requireText?: string;\n /**\n * Label of that input field. Without it the field takes `requireText` as its\n * `aria-label` instead, so it is never unlabelled.\n */\n requireLabel?: string;\n /**\n * Element focus returns to when the dialog closes, whichever way it closes.\n * Without it focus goes back to whatever was focused before the dialog\n * opened, which is the CDK default.\n *\n * Set it when the trigger is gone by then, for example a row that the\n * confirmed action deletes. A dialog opened from a menu item needs nothing:\n * `ZDialog` returns focus to the menu trigger by itself.\n *\n * A template reference on a component host, `<button zBtn #werkzeuge>` for\n * example, yields the component instance and not its element, so read it as\n * an `ElementRef`. Something without `focus()` is dropped with a warning in\n * the development build.\n *\n * @example\n * ```html\n * <div #werkzeuge class=\"z-cluster\">…</div>\n * ```\n * ```ts\n * readonly werkzeuge = viewChild.required('werkzeuge', { read: ElementRef });\n *\n * loeschen(): void {\n * this.dialog\n * .confirm({ …, restoreFocusTo: this.werkzeuge() })\n * .subscribe((ja) => (ja ? this.entferne() : undefined));\n * }\n * ```\n */\n restoreFocusTo?: ZRestoreFocusTarget;\n}\n\n/**\n * The confirmation behind `ZDialog.confirm()`. Built from `z-dialog` with a\n * cancel and a confirm button and, with `requireText`, an input field whose\n * value gates the confirm button.\n *\n * The result is `true` only through the confirming button; cancel, Escape and a\n * click on the backdrop leave the dialog without a result, which\n * `ZDialog.confirm()` maps to `false`.\n *\n * @internal Not part of the documented API. Open it through\n * `ZDialog.confirm()`.\n */\n@Component({\n selector: 'z-confirm-dialog',\n imports: [ZButton, ZDialogActions, ZDialogLayout, ZField, ZInput],\n template: `\n <z-dialog [title]=\"daten.title\">\n <span>{{ daten.body }}</span>\n @if (daten.requireText) {\n <z-field [label]=\"daten.requireLabel ?? ''\" [for]=\"eingabeId\">\n <input\n zInput\n mono\n [id]=\"eingabeId\"\n [placeholder]=\"daten.requireText\"\n [attr.aria-label]=\"daten.requireLabel ? null : daten.requireText\"\n (input)=\"aufEingabe($event)\"\n />\n </z-field>\n }\n <ng-container zDialogActions>\n <button type=\"button\" zBtn=\"ghost\" (click)=\"ref.close(false)\">\n {{ daten.cancelLabel }}\n </button>\n <button\n type=\"button\"\n [zBtn]=\"daten.danger ? 'danger' : 'primary'\"\n [disabled]=\"gesperrt()\"\n (click)=\"ref.close(true)\"\n >\n {{ daten.confirmLabel }}\n </button>\n </ng-container>\n </z-dialog>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZConfirmDialog {\n protected readonly daten = inject<ZConfirmConfig>(DIALOG_DATA);\n protected readonly ref = inject<DialogRef<boolean>>(DialogRef);\n protected readonly eingabeId = naechsteId('z-confirm-input');\n\n private readonly eingabe = signal('');\n\n /** Confirming stays disabled until the input matches exactly. */\n protected readonly gesperrt = computed(\n () => !!this.daten.requireText && this.eingabe() !== this.daten.requireText,\n );\n\n protected aufEingabe(ereignis: Event): void {\n this.eingabe.set((ereignis.target as HTMLInputElement).value);\n }\n}\n","import { Dialog, DialogConfig, DialogRef } from '@angular/cdk/dialog';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { DOCUMENT, ElementRef, inject, Service } from '@angular/core';\nimport { map, Observable } from 'rxjs';\nimport { ZConfirmConfig, ZConfirmDialog, ZRestoreFocusTarget } from './confirm-dialog';\nimport { naechsteId, Z_DIALOG_TITLE_ID } from './dialog-layout';\n\n/**\n * Options of `@angular/cdk/dialog` plus {@link ZDialogConfig.restoreFocusTo}.\n */\nexport type ZDialogConfig<D, R> = DialogConfig<D, R> & {\n /**\n * Element focus returns to when the dialog closes, mapped onto the CDK's\n * `restoreFocus`. Without it focus goes back to whatever was focused before\n * the dialog opened, which is the CDK default. Set it when the trigger is\n * gone by then. A dialog opened from a menu item needs nothing: the service\n * finds the menu trigger by itself.\n *\n * A template reference on a component host, `<button zBtn #trigger>` for\n * example, yields the component instance: read it as an `ElementRef`\n * (`viewChild('trigger', { read: ElementRef })`), otherwise there is nothing\n * to focus. Something without `focus()` is dropped with a warning in the\n * development build, and focus returns the way it would have without it.\n */\n restoreFocusTo?: ZRestoreFocusTarget;\n};\n\ndeclare const ngDevMode: boolean | undefined;\n\n/** The warning about an unusable `restoreFocusTo` is worth saying once. */\nlet gewarnt = false;\n\n/** Caller classes as a list, so the library's own ones keep coming first. */\nfunction alsListe(klassen: string | string[] | undefined): string[] {\n if (!klassen) {\n return [];\n }\n return Array.isArray(klassen) ? klassen : [klassen];\n}\n\n/**\n * `restoreFocusTo` as the `boolean | string | HTMLElement` the CDK takes.\n *\n * Anything that cannot take the focus is dropped, and the CDK default applies\n * instead. The usual way to get here is `viewChild('trigger')` on a component\n * host such as `<button zBtn #trigger>`: that yields the `ZButton` instance,\n * not its element, and the CDK would silently focus nothing at all.\n */\nfunction fokusZiel(ziel: ZRestoreFocusTarget | undefined): HTMLElement | string | undefined {\n const element = ziel instanceof ElementRef ? ziel.nativeElement : ziel;\n if (element === undefined || typeof element === 'string') {\n return element;\n }\n if (typeof element.focus === 'function') {\n return element;\n }\n if (!gewarnt && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n gewarnt = true;\n console.warn(\n 'zenit-ui: restoreFocusTo takes an element, an ElementRef or a CSS selector, and got ' +\n 'something without focus(). A template reference on a component host needs ' +\n \"viewChild('trigger', { read: ElementRef }). Focus returns to where it was instead.\",\n );\n }\n return undefined;\n}\n\n/**\n * The trigger of the menu the focus stands in, or `undefined` when it stands\n * anywhere else.\n *\n * A dialog opened from a menu item would otherwise return focus to that item:\n * the CDK closes the menu with the click, so the item is gone by the time the\n * dialog closes and focus falls to the body. `CdkMenuTrigger` carries the id of\n * its menu as `aria-controls`, which leads from the open menu back to the\n * button that opened it.\n */\nfunction menueAusloeser(dokument: Document): HTMLElement | undefined {\n const menue = (dokument.activeElement as HTMLElement | null)?.closest('.cdk-menu[id]');\n return menue\n ? (dokument.querySelector<HTMLElement>(`[aria-controls=\"${menue.id}\"]`) ?? undefined)\n : undefined;\n}\n\n/**\n * Thin wrapper around `Dialog` from `@angular/cdk/dialog`, provided in root.\n *\n * The focus trap, Escape, the backdrop and returning focus to the trigger come\n * from the CDK. This service only adds the fixed classes `z-dialog-panel` and\n * `z-backdrop`, sets `aria-modal`, links the heading of `z-dialog` to the\n * container through `aria-labelledby`, and offers `restoreFocusTo` for the case\n * where the trigger is gone by the time the dialog closes. Focus lands on the\n * first tabbable element when the dialog opens, which is the first field or\n * otherwise the cancel button.\n *\n * One case is taken care of without `restoreFocusTo`: a dialog opened from a\n * menu item. The CDK closes the menu with the click, so the item no longer\n * exists when the dialog closes and focus would fall to the body; the service\n * therefore returns it to the menu trigger.\n *\n * Use a dialog for a decision that cannot be undone or for a short form, not\n * for \"stop\" or \"restart\".\n *\n * @example\n * ```ts\n * private readonly dialog = inject(ZDialog);\n *\n * loeschen(name: string): void {\n * this.dialog\n * .confirm({\n * title: `Server \"${name}\" löschen?`,\n * body: 'Alle Welten und Backups gehen verloren. Das lässt sich nicht rückgängig machen.',\n * confirmLabel: 'Löschen',\n * cancelLabel: 'Abbrechen',\n * danger: true,\n * requireText: name,\n * })\n * .subscribe((bestaetigt) => {\n * if (bestaetigt) {\n * this.entferne(name);\n * }\n * });\n * }\n * ```\n */\n@Service()\nexport class ZDialog {\n private readonly cdk = inject(Dialog);\n private readonly dokument = inject(DOCUMENT);\n\n /**\n * Opens a component of your own, as a rule one whose root element is\n * `<z-dialog title=\"…\">`.\n *\n * Generates the id of the heading, provides it under `Z_DIALOG_TITLE_ID` and\n * puts the same id on the container as `aria-labelledby` unless the config\n * already names one. Own `panelClass` and `backdropClass` entries are\n * appended after the library's, all other options of the CDK stay untouched.\n *\n * @typeParam R Result type the dialog closes with.\n * @typeParam D Type of `config.data` handed to the component via\n * `DIALOG_DATA`.\n * @typeParam C Type of the component.\n * @param component The component to render inside the dialog.\n * @param config Options of `@angular/cdk/dialog`, for example `data`, `width`\n * or `disableClose`, plus `restoreFocusTo`.\n * @returns The `DialogRef` of the CDK. Its `closed` observable emits the\n * result once and then completes, `undefined` when the dialog was dismissed\n * by Escape or by a click on the backdrop.\n *\n * @example\n * ```ts\n * import { ChangeDetectionStrategy, Component, ElementRef, inject, viewChild } from '@angular/core';\n * import { ZButton, ZDialog } from 'zenit-ui';\n * import { NotizDialog } from './notiz-dialog';\n *\n * @Component({\n * selector: 'app-serverzeile',\n * imports: [ZButton],\n * template: `\n * <div #werkzeuge class=\"z-cluster\">\n * <button zBtn=\"secondary\" type=\"button\">Hochladen</button>\n * </div>\n * <button zBtn=\"ghost\" type=\"button\" (click)=\"notiz()\">Notiz bearbeiten</button>\n * `,\n * changeDetection: ChangeDetectionStrategy.OnPush,\n * })\n * export class Serverzeile {\n * private readonly dialog = inject(ZDialog);\n *\n * // `read: ElementRef` is the point: on `<button zBtn #werkzeuge>` the\n * // reference would otherwise yield the ZButton instance, which has no\n * // focus(), and the focus would silently land on <body>.\n * private readonly werkzeuge = viewChild.required('werkzeuge', { read: ElementRef });\n *\n * // The row that carried the trigger is gone once the dialog confirms the\n * // deletion, so focus goes to the toolbar above the list instead.\n * protected notiz(): void {\n * this.dialog.open(NotizDialog, { restoreFocusTo: this.werkzeuge() });\n * }\n * }\n * ```\n */\n open<R = unknown, D = unknown, C = unknown>(\n component: ComponentType<C>,\n config?: ZDialogConfig<D, DialogRef<R, C>>,\n ): DialogRef<R, C> {\n const titelId = naechsteId('z-dialog-title');\n const titelProvider = { provide: Z_DIALOG_TITLE_ID, useValue: titelId };\n const fremde = config?.providers;\n // Without a target of its own, a dialog opened from a menu item goes back\n // to the menu trigger, because the item itself is gone by then.\n const ziel = fokusZiel(config?.restoreFocusTo) ?? menueAusloeser(this.dokument);\n return this.cdk.open<R, D, C>(component, {\n // autoFocus 'first-tabbable' (first field, otherwise \"Abbrechen\"),\n // restoreFocus and Escape are the defaults of the CDK.\n ...config,\n // Only when given, so an absent restoreFocusTo keeps the CDK default.\n ...(ziel === undefined ? {} : { restoreFocus: ziel }),\n panelClass: ['z-dialog-panel', ...alsListe(config?.panelClass)],\n backdropClass: ['z-backdrop', ...alsListe(config?.backdropClass)],\n ariaModal: true,\n ariaLabelledBy: config?.ariaLabelledBy ?? titelId,\n providers:\n typeof fremde === 'function'\n ? (ref, cfg, container) => [titelProvider, ...fremde(ref, cfg, container)]\n : [titelProvider, ...(fremde ?? [])],\n });\n }\n\n /**\n * Confirmation with two buttons, built from {@link ZConfirmConfig}. With\n * `requireText` the confirming button stays disabled until that text is typed\n * exactly.\n *\n * The dialog opens as soon as this method is called, not on subscribe.\n * `restoreFocusTo` of the config names where focus lands afterwards.\n *\n * @param config Texts and behaviour of the confirmation.\n * @returns An `Observable<boolean>` that emits exactly once and then\n * completes: `true` only through the confirming button, `false` through\n * \"Abbrechen\", Escape and a click on the backdrop.\n */\n confirm(config: ZConfirmConfig): Observable<boolean> {\n return this.open<boolean, ZConfirmConfig, ZConfirmDialog>(ZConfirmDialog, {\n data: config,\n restoreFocusTo: config.restoreFocusTo,\n }).closed.pipe(map((ergebnis) => ergebnis === true));\n }\n}\n","import { CdkMenu, CdkMenuItem } from '@angular/cdk/menu';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n DOCUMENT,\n ElementRef,\n inject,\n Injector,\n input,\n} from '@angular/core';\nimport { ZIcon } from '../icon';\n\n/**\n * Surface of the menu, which collects the rarer actions of an object behind a\n * button. Three to seven entries; destructive ones sit at the bottom behind a\n * separator.\n *\n * Renders the class `z-menu` on the host and only the projected content.\n * Keyboard handling, roles and closing come from `CdkMenu` in\n * `@angular/cdk/menu`, which runs as a host directive: arrow keys move through\n * the entries, a click outside and Escape close the menu. The surface is\n * `surface-raised` with `shadow-overlay` and no scrim. The menu is opened from\n * a button carrying `[cdkMenuTriggerFor]`.\n *\n * A scroll of a container the trigger sits in closes the menu, the way a menu\n * of the operating system goes: the page as well as an inner container such as\n * the body of a scrolling dialog. Another scroller on the same screen leaves\n * the menu alone, and so does the scroll that was still running when the menu\n * opened. Focus returns to the trigger only when it was inside the menu, so\n * scrolling with the pointer does not pull it away from whatever the visitor\n * was typing in.\n *\n * @example\n * ```html\n * <button zBtn=\"ghost\" iconOnly aria-label=\"Mehr\" [cdkMenuTriggerFor]=\"mehr\">\n * <z-icon name=\"more_vert\" />\n * </button>\n * <ng-template #mehr>\n * <z-menu>\n * <button zMenuItem icon=\"content_copy\" (triggered)=\"kopiere()\">Adresse kopieren</button>\n * <z-menu-separator />\n * <button zMenuItem icon=\"delete\" danger (triggered)=\"loesche()\">Server löschen</button>\n * </z-menu>\n * </ng-template>\n * ```\n */\n@Component({\n selector: 'z-menu',\n template: `<ng-content />`,\n host: { class: 'z-menu' },\n hostDirectives: [CdkMenu],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZMenu {\n constructor() {\n const menue = inject(CdkMenu);\n const wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const dokument = inject(DOCUMENT);\n // The component only exists while the menu hangs in its overlay, so the\n // listener does too. It sits on the document in the CAPTURE phase, because\n // a scroll event on an inner element does not bubble: the scroll strategy\n // of the CDK builds on `ScrollDispatcher`, which only ever hears the window\n // and the containers a caller marked `cdkScrollable`. A menu in the body of\n // a dialog therefore used to stand still while its trigger moved away.\n const abbruch = new AbortController();\n const signal = abbruch.signal;\n const fenster = dokument.defaultView;\n\n // The scroll that was still running when the menu opened must not close it\n // again: a trigger reached with the keyboard is scrolled into view, and\n // those events only arrive afterwards, a smooth scroll for a whole second.\n // Closing is therefore armed once that scrolling has come to rest: at the\n // `scrollend` of the browser, or after two animation frames without a\n // scroll event, whichever comes first.\n const schliesse = (): void =>\n menue.menuStack.closeAll({ focusParentTrigger: wirt.contains(dokument.activeElement) });\n\n /** The trigger, which points at this menu through `aria-controls`. */\n const ausloeserSuchen = (): HTMLElement | null =>\n wirt.id ? dokument.querySelector<HTMLElement>(`[aria-controls=\"${wirt.id}\"]`) : null;\n\n let scharf = !fenster;\n let stille = 0;\n /** Where the trigger stood when the menu was hung on it. */\n let verankert: DOMRect | undefined;\n /** Has the trigger moved since, while the menu could not follow? */\n let verschoben = false;\n const armiere = (): void => {\n if (scharf) {\n return;\n }\n scharf = true;\n // The menu was hung on a trigger that was still moving, and the CDK locks\n // the position of an open menu: it now points where the trigger no longer\n // is, so it goes instead of standing around detached.\n if (verschoben) {\n schliesse();\n }\n };\n const beobachte = (): void => {\n if (scharf || signal.aborted) {\n return;\n }\n stille += 1;\n if (stille >= 2) {\n armiere();\n return;\n }\n fenster?.requestAnimationFrame(beobachte);\n };\n fenster?.requestAnimationFrame(beobachte);\n dokument.addEventListener('scrollend', armiere, { capture: true, signal });\n // The box of the trigger as the menu opened, read once the binding of\n // `aria-controls` has been rendered.\n afterNextRender(() => (verankert ??= ausloeserSuchen()?.getBoundingClientRect()), {\n injector: inject(Injector),\n });\n\n dokument.addEventListener(\n 'scroll',\n (ereignis) => {\n const ziel = ereignis.target as Node | null;\n // Only a scroller the trigger sits in takes the menu away from it.\n // `document` contains it too, which is how a scroll of the page\n // arrives; the menu itself and any other scroller of the screen, a\n // console following its own log for example, leave the trigger where it\n // is. Right after opening, the trigger carries no `aria-controls` yet;\n // until it does, every scroll counts, the way it did before.\n const ausloeser = ausloeserSuchen();\n if (!ziel || (ausloeser && !ziel.contains(ausloeser))) {\n return;\n }\n // A scroll that leaves the trigger where it is means nothing: a trigger\n // in a sticky or fixed header keeps its menu while the page moves, the\n // same rule the tooltip follows.\n const kasten = ausloeser?.getBoundingClientRect();\n if (kasten && verankert && unbewegt(verankert, kasten)) {\n return;\n }\n if (kasten) {\n verschoben = verschoben || verankert !== undefined;\n verankert = kasten;\n }\n if (!scharf) {\n stille = 0;\n return;\n }\n schliesse();\n },\n { capture: true, passive: true, signal },\n );\n\n // Escape closes the menu, and only the menu. `CdkMenu` listens on this same\n // host, so it still sees the key; stopping the event here keeps it from\n // reaching the keyboard dispatcher of the CDK on `document.body`, which\n // would close the dialog behind the menu with the same press. In the BUBBLE\n // phase, so the handler of the CDK comes first.\n wirt.addEventListener(\n 'keydown',\n (ereignis) => {\n if (ereignis.key === 'Escape') {\n ereignis.stopPropagation();\n }\n },\n { signal },\n );\n\n // A locked link entry must not navigate. `CdkMenuItem` does call\n // preventDefault() and stopPropagation() on the click, but `RouterLink`\n // listens on the same element and navigates regardless of\n // `defaultPrevented`, so the click is caught here in the CAPTURE phase of\n // the menu, before any listener on the entry. A click with a modifier is\n // the browser's: it opens the link in a new tab or downloads it, and the\n // menu stays where it is, exactly as a middle click already does.\n const aufKlick = (ereignis: MouseEvent): void => {\n const ziel = (ereignis.target as HTMLElement | null)?.closest('a.z-menu__item');\n if (!ziel) {\n return;\n }\n if (ziel.getAttribute('aria-disabled') === 'true') {\n ereignis.preventDefault();\n ereignis.stopPropagation();\n } else if (mitZusatztaste(ereignis)) {\n ereignis.stopPropagation();\n }\n };\n // `auxclick` is the middle click, which opens a link in a new tab: the same\n // rules apply, a locked entry leads nowhere there either.\n for (const art of ['click', 'auxclick'] as const) {\n wirt.addEventListener(art, aufKlick, { capture: true, signal });\n }\n\n // Space activates an entry (ARIA menu pattern), but the browser clicks only\n // buttons: on a link `CdkMenuItem` would close the menu without anything\n // ever navigating. This listener hangs on the menu in the CAPTURE phase, so\n // it comes before the keydown handler on the entry, and turns the key into\n // the click that `href` and `routerLink` both listen for. Enter needs\n // nothing: the browser clicks a link by itself.\n wirt.addEventListener(\n 'keydown',\n (ereignis) => {\n const ziel = (ereignis.target as HTMLElement | null)?.closest('a.z-menu__item');\n if (ereignis.key !== ' ' || !ziel || mitZusatztaste(ereignis)) {\n return;\n }\n ereignis.preventDefault();\n ereignis.stopPropagation();\n (ziel as HTMLElement).click();\n },\n { capture: true, signal },\n );\n\n inject(DestroyRef).onDestroy(() => abbruch.abort());\n }\n}\n\n/**\n * One entry of the menu, an icon plus a verb and its object (\"Adresse\n * kopieren\"). Sits on a `<button>` through the attribute `zMenuItem`, or on an\n * `<a>` when the entry leads somewhere instead of doing something.\n *\n * Renders the class `z-menu__item` on the host, plus `z-menu__item--danger`\n * while {@link danger} is set, and inside it the optional `z-icon` followed by\n * the projected text.\n *\n * A link entry keeps its `href` or `routerLink`: the library has no router and\n * touches neither. Enter and a plain click follow the link and close the menu,\n * Space does the same because `z-menu` turns it into a click. A click with\n * Ctrl, Cmd, Shift or Alt and a middle click belong to the browser: it opens a\n * new tab or downloads the target, and the menu stays open. `disabled` renders\n * `aria-disabled=\"true\"`, and `z-menu` swallows the click before `RouterLink`\n * or the `href` can act on it, so the entry leads nowhere while it is locked,\n * the same way `a[zBtn]` is.\n *\n * Accessibility: role, focus and the `disabled` input come from `CdkMenuItem`\n * as a host directive, which also provides the `(triggered)` output. The CDK\n * typeahead label is set to the text without the icon ligature, once after the\n * first render and from then on whenever a `MutationObserver` reports a change\n * in the entry, because the raw `textContent` would otherwise start with the\n * ligature (\"content_copyAdresse kopieren\") and typing the first letter would\n * not find the entry.\n *\n * @example\n * ```html\n * <button zMenuItem icon=\"content_copy\" (triggered)=\"kopiere()\">Adresse kopieren</button>\n * <a zMenuItem icon=\"dns\" routerLink=\"/user/server/1\">Server öffnen</a>\n * <button zMenuItem icon=\"delete\" danger [disabled]=\"laeuft()\" (triggered)=\"loesche()\">\n * Server löschen\n * </button>\n * ```\n */\n@Component({\n // An entry does something (button) or leads somewhere (link); both carry the\n // attribute of the API table.\n selector: 'button[zMenuItem], a[zMenuItem]',\n imports: [ZIcon],\n template: `@if (icon()) {\n <z-icon [name]=\"icon()\" />\n }\n <ng-content />`,\n host: {\n class: 'z-menu__item',\n '[class.z-menu__item--danger]': `danger()`,\n },\n hostDirectives: [\n {\n directive: CdkMenuItem,\n inputs: ['cdkMenuItemDisabled: disabled'],\n outputs: ['cdkMenuItemTriggered: triggered'],\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZMenuItem {\n /**\n * Name of the Material Icon in front of the text. Empty renders no icon.\n *\n * @default ''\n */\n readonly icon = input('');\n\n /**\n * Marks the entry as destructive, which colours it and belongs below a\n * `z-menu-separator`. A destructive entry always opens a dialog. Boolean\n * attribute.\n *\n * @default false\n */\n readonly danger = input(false, { transform: booleanAttribute });\n\n constructor() {\n const eintrag = inject(CdkMenuItem);\n const wirt = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const zerstoerung = inject(DestroyRef);\n // Without this the CDK typeahead takes textContent, which starts with the\n // ligature of the icon (\"content_copyAdresse kopieren\"). The text can\n // change at any time, but only through the DOM, so a MutationObserver\n // carries the change instead of a callback that reads the entry again after\n // every render of the application.\n afterNextRender(() => {\n const lies = (): void => {\n eintrag.typeaheadLabel = beschriftung(wirt);\n };\n lies();\n const beobachter = new MutationObserver(lies);\n beobachter.observe(wirt, { characterData: true, childList: true, subtree: true });\n zerstoerung.onDestroy(() => beobachter.disconnect());\n });\n }\n}\n\n/** Two boxes at the same place on the screen: nothing moved the trigger. */\nfunction unbewegt(a: DOMRect, b: DOMRect): boolean {\n return a.top === b.top && a.left === b.left && a.width === b.width && a.height === b.height;\n}\n\n/**\n * A key or a click with a modifier belongs to the browser: Ctrl+Space, and\n * Ctrl+click which opens a new tab, are not an activation of the entry.\n */\nfunction mitZusatztaste(ereignis: KeyboardEvent | MouseEvent): boolean {\n return ereignis.altKey || ereignis.ctrlKey || ereignis.metaKey || ereignis.shiftKey;\n}\n\n/**\n * Text of the entry without the ligature of the icon. Comment nodes are left\n * out, because Angular puts its anchors there and `textContent` would deliver\n * their content along with it (\"container\").\n */\nfunction beschriftung(wirt: HTMLElement): string {\n return Array.from(wirt.childNodes)\n .filter(\n (knoten) =>\n knoten.nodeType !== Node.COMMENT_NODE && (knoten as Element).localName !== 'z-icon',\n )\n .map((knoten) => knoten.textContent ?? '')\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Separator in front of the destructive entries. Renders an empty host with\n * the class `z-menu__sep` and `role=\"separator\"`, so it is announced as a\n * divider and never receives focus.\n *\n * @example\n * ```html\n * <z-menu-separator />\n * ```\n */\n@Component({\n selector: 'z-menu-separator',\n template: ``,\n host: {\n class: 'z-menu__sep',\n role: 'separator',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZMenuSeparator {}\n\n/**\n * All menu building blocks at once, for the `imports` of a component: the\n * design system names this constant as the way in (\"Import über `Z_MENU`\"), so\n * it stays the documented entry point next to the three classes. The trigger\n * `CdkMenuTrigger` is not part of it and comes from `@angular/cdk/menu`.\n *\n * @example\n * ```ts\n * imports: [Z_MENU, CdkMenuTrigger];\n * ```\n */\nexport const Z_MENU = [ZMenu, ZMenuItem, ZMenuSeparator] as const;\n","/* Package overlays: Dialog and Menu. */\nexport * from '../dialog';\nexport * from '../menu';\n","import {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ZButton } from '../button';\nimport { injectZLabels } from '../labels';\n\n/**\n * Severity of a log line. `warn` is coloured `warning`, `error` is `danger`,\n * `cmd` marks a command the user sent and is coloured `text`; everything else\n * stays `text-muted`.\n */\nexport type ZConsoleLevel = 'info' | 'warn' | 'error' | 'cmd';\n\n/** One log line. */\nexport interface ZConsoleLine {\n /** Timestamp, already formatted by the caller, for example `12:07:15`. */\n time: string;\n /** The message itself. Long lines wrap, the console never scrolls sideways. */\n text: string;\n /**\n * Severity of the line. Without it the line renders in the neutral `info`\n * style.\n *\n * @default 'info'\n */\n level?: ZConsoleLevel;\n}\n\n/**\n * Live log of a server with a command line underneath.\n *\n * Renders `<pre class=\"z-console__log\">` with one `<span>` per line (timestamp\n * in `.z-log__time`, the level as `z-log--warn`, `z-log--error` or\n * `z-log--cmd`), the \"Zum Ende\" button while the log is scrolled up, and a\n * `<label class=\"z-console__input\">` holding the input. The host carries\n * `z-console`. With an empty {@link lines} the log shows the projected content\n * instead, which is where the empty state belongs.\n *\n * The log follows new lines as long as the view sits at the bottom, with four\n * pixels of slack. Scroll up and it stays put and the button appears; pressing\n * it scrolls back down and moves focus into the input.\n *\n * Accessibility: the `<pre>` is a `role=\"log\"` tab stop with an `aria-label`, so\n * the log can be scrolled by keyboard; the input is labelled by\n * {@link inputLabel}. `role=\"log\"` implies a polite live region, which\n * {@link announce} turns off by default, see there. Enter emits\n * {@link command}, Arrow Up and Arrow Down walk the commands of this session and\n * suppress the browser's caret movement.\n *\n * @example\n * ```html\n * <z-console [lines]=\"zeilen()\" placeholder=\"Befehl eingeben, Enter sendet\" (command)=\"sende($event)\">\n * Das Log ist leer. Neue Ausgaben erscheinen hier.\n * </z-console>\n * ```\n */\n@Component({\n selector: 'z-console',\n imports: [ZButton],\n template: `<pre\n #log\n class=\"z-console__log\"\n tabindex=\"0\"\n role=\"log\"\n [attr.aria-live]=\"announce() ? 'polite' : 'off'\"\n [attr.aria-label]=\"logText()\"\n (scroll)=\"aufScroll()\"\n >@for (zeile of lines(); track $index; let letzte = $last) {<span\n [class.z-log--warn]=\"zeile.level === 'warn'\"\n [class.z-log--error]=\"zeile.level === 'error'\"\n [class.z-log--cmd]=\"zeile.level === 'cmd'\"\n ><span class=\"z-log__time\">{{ zeile.time }}</span> {{ zeile.text\n }}{{ letzte ? '' : umbruch }}</span>} @empty {<ng-content />}</pre>\n @if (!amEnde()) {\n <div class=\"z-console__end\">\n <button type=\"button\" zBtn=\"secondary\" size=\"sm\" (click)=\"zumEnde()\">\n {{ endeText() }}\n </button>\n </div>\n }\n <label class=\"z-console__input\"\n ><span aria-hidden=\"true\">&gt;</span\n ><input\n #feld\n [attr.aria-label]=\"feldText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n (keydown.enter)=\"senden()\"\n (keydown.arrowup)=\"verlauf($event, -1)\"\n (keydown.arrowdown)=\"verlauf($event, 1)\"\n /></label>`,\n host: { class: 'z-console' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZConsole {\n /**\n * The log lines in display order, oldest first. The component keeps no\n * buffer: the caller owns the list and caps its length.\n *\n * @default []\n */\n readonly lines = input<ZConsoleLine[]>([]);\n\n /**\n * Disables the input, for instance while the server is stopped. The log stays\n * readable and scrollable.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Placeholder of the input. A placeholder is not a label, the accessible name\n * comes from {@link inputLabel}.\n *\n * @default ''\n */\n readonly placeholder = input('');\n\n /**\n * Lets a screen reader read out every new log line as it arrives, by\n * switching the `aria-live` of the log from `off` to `polite`.\n *\n * Off by default, deliberately: a game server writes several lines per\n * second, and the polite live region that `role=\"log\"` implies would turn\n * each of them into an announcement and bury everything else on the page. The\n * log stays a `role=\"log\"` tab stop with an accessible name, so it can be read\n * on demand at any time. Switch this on only for a console that stays quiet,\n * for example a step-by-step installer. Boolean attribute.\n *\n * @default false\n */\n readonly announce = input(false, { transform: booleanAttribute });\n\n /**\n * `aria-label` of the log region. Unset, the component uses\n * {@link ZLabels.consoleLog} from the label registry.\n *\n * @default undefined\n */\n readonly logLabel = input<string>();\n\n /**\n * `aria-label` of the input. Unset, the component uses\n * {@link ZLabels.consoleInput} from the label registry.\n *\n * @default undefined\n */\n readonly inputLabel = input<string>();\n\n /**\n * Caption of the button that jumps back to the end of the log. Unset, the\n * component uses {@link ZLabels.consoleJumpToEnd} from the label registry.\n *\n * @default undefined\n */\n readonly endLabel = input<string>();\n\n private readonly labels = injectZLabels();\n\n protected readonly logText = computed(() => this.logLabel() ?? this.labels.consoleLog);\n protected readonly feldText = computed(() => this.inputLabel() ?? this.labels.consoleInput);\n protected readonly endeText = computed(() => this.endLabel() ?? this.labels.consoleJumpToEnd);\n\n /**\n * Emits the entered command on Enter, trimmed and never empty. The input is\n * cleared right away; echoing the command as a `cmd` line is the caller's\n * job, as is everything the command does.\n */\n // (command) is what the API table calls for. Since the Commands proposal\n // there is a DOM event of the same name, which the rule reports.\n // eslint-disable-next-line @angular-eslint/no-output-native\n readonly command = output<string>();\n\n protected readonly umbruch = '\\n';\n protected readonly amEnde = signal(true);\n\n private readonly logEl = viewChild.required<ElementRef<HTMLElement>>('log');\n private readonly feldEl = viewChild.required<ElementRef<HTMLInputElement>>('feld');\n\n /** Commands of this session, `zeiger` points at the entry currently recalled. */\n private readonly bisher: string[] = [];\n private zeiger = 0;\n\n constructor() {\n // Angular's docs forbid reading layout in the write phase, so the height\n // of the log is measured in earlyRead and only written afterwards.\n afterRenderEffect({\n earlyRead: () => {\n this.lines();\n return this.amEnde() ? this.logEl().nativeElement.scrollHeight : undefined;\n },\n write: (hoehe) => {\n const ziel = hoehe();\n if (ziel !== undefined) {\n this.logEl().nativeElement.scrollTop = ziel;\n }\n },\n });\n }\n\n /** Four pixels of slack, because zoom and subpixels never hit the bottom exactly. */\n protected aufScroll(): void {\n const el = this.logEl().nativeElement;\n this.amEnde.set(el.scrollHeight - el.scrollTop - el.clientHeight <= 4);\n }\n\n protected zumEnde(): void {\n const el = this.logEl().nativeElement;\n el.scrollTop = el.scrollHeight;\n this.amEnde.set(true);\n this.feldEl().nativeElement.focus();\n }\n\n protected senden(): void {\n const el = this.feldEl().nativeElement;\n const text = el.value.trim();\n if (!text) {\n return;\n }\n this.bisher.push(text);\n this.zeiger = this.bisher.length;\n el.value = '';\n this.command.emit(text);\n }\n\n /** `richtung` is -1 for Arrow Up and 1 for Arrow Down. */\n protected verlauf(ereignis: Event, richtung: number): void {\n if (!this.bisher.length) {\n return;\n }\n ereignis.preventDefault();\n this.zeiger = Math.min(Math.max(this.zeiger + richtung, 0), this.bisher.length);\n this.feldEl().nativeElement.value = this.bisher[this.zeiger] ?? '';\n }\n}\n","import { ChangeDetectionStrategy, Component, Directive, input } from '@angular/core';\n\n/**\n * Marks the at most two buttons of the hero, one `primary` in size `lg` and\n * optionally one `secondary`. Adds the class `z-hero__actions` and renders\n * nothing itself. `z-hero` places it between the lead and the note.\n *\n * @example\n * ```html\n * <div zHeroActions>\n * <button zBtn=\"primary\" size=\"lg\">Server erstellen</button>\n * <button zBtn=\"secondary\" size=\"lg\">Preis berechnen</button>\n * </div>\n * ```\n */\n@Directive({\n selector: '[zHeroActions]',\n host: { class: 'z-hero__actions' },\n})\nexport class ZHeroActions {}\n\n/**\n * Marks the right-hand column of the hero: a price list, the configurator or a\n * screenshot of the panel, never an illustration. Pure slot marker, it adds no\n * class and no markup. Sub-pages often leave it out, and a hero without this\n * slot is one column at every width instead of keeping an empty right column.\n *\n * @example\n * ```html\n * <z-panel zHeroAside title=\"Günstigste Spiele\" flush>…</z-panel>\n * ```\n */\n@Directive({ selector: '[zHeroAside]' })\nexport class ZHeroAside {}\n\n/**\n * Head of a public page: one statement, one sentence, at most two buttons and a\n * real piece of the product on the right.\n *\n * Renders the left column as `<h1 class=\"z-hero__title\">`, the optional\n * `<p class=\"z-hero__lead\">`, the `[zHeroActions]` slot and the optional\n * `<p class=\"z-hero__note\">`, followed by the `[zHeroAside]` slot as the right\n * column. The host carries `z-hero` and its native `title` attribute is\n * cleared, so the {@link title} input never becomes a browser tooltip.\n *\n * Two columns in a 7 to 5 ratio, single column below 900px and single column at\n * every width while no `[zHeroAside]` is projected, which is the usual shape of\n * a sub-page. The lead keeps its own 52ch measure either way. The size of the\n * heading lives in `z-hero__title` and drops from `display-xl` to `display-lg`\n * below 640px, whatever {@link headingLevel} says. {@link size} picks that\n * smaller step for the whole width. On a public page the heading is the `<h1>`,\n * so there is exactly one hero per page.\n *\n * @example\n * ```html\n * <z-hero\n * title=\"Gameserver aus Nürnberg. In etwa 60 Sekunden online.\"\n * lead=\"Spiel wählen, RAM einstellen, starten. Ab 1,98&nbsp;€ im Monat, monatlich kündbar.\"\n * note=\"Keine Kreditkarte nötig · DDoS-Schutz inklusive\"\n * >\n * <div zHeroActions>\n * <button zBtn=\"primary\" size=\"lg\">Server erstellen</button>\n * </div>\n * <z-panel zHeroAside title=\"Günstigste Spiele\" flush>…</z-panel>\n * </z-hero>\n * ```\n */\n@Component({\n selector: 'z-hero',\n template: `\n <div>\n @switch (headingLevel()) {\n @case (2) {\n <h2 class=\"z-hero__title\">{{ title() }}</h2>\n }\n @case (3) {\n <h3 class=\"z-hero__title\">{{ title() }}</h3>\n }\n @default {\n <h1 class=\"z-hero__title\">{{ title() }}</h1>\n }\n }\n @if (lead()) {\n <p class=\"z-hero__lead\">{{ lead() }}</p>\n }\n <ng-content select=\"[zHeroActions]\" />\n @if (note()) {\n <p class=\"z-hero__note\">{{ note() }}</p>\n }\n </div>\n <ng-content select=\"[zHeroAside]\" />\n `,\n host: {\n class: 'z-hero',\n '[class.z-hero--lg]': `size() === 'lg'`,\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZHero {\n /**\n * The heading of the page: what there is and where it comes from. One colour\n * throughout, the second line is never tinted.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Tag of the heading: `1`, `2` or `3`. The design system prescribes `1` for\n * public pages, where the hero is the page heading. Lower it only where the\n * page already owns its `<h1>`, for example on a component page that shows a\n * hero as an example. The visual size never changes with it.\n *\n * @default 1\n */\n readonly headingLevel = input<1 | 2 | 3, 1 | 2 | 3 | '1' | '2' | '3'>(1, {\n transform: (wert) => Number(wert) as 1 | 2 | 3,\n });\n\n /**\n * Type size of the heading, independent of {@link headingLevel}: `'xl'` is\n * `display-xl` (56px), `'lg'` is `display-lg` (40px). The design system keeps\n * `'xl'` for the start page and for `/minecraft` and gives every sub-page\n * `'lg'`. `'lg'` adds `z-hero--lg` on the host, which is the only difference\n * in the rendered markup; below 640px both sizes read as `display-lg`, so\n * `'lg'` stays where it is.\n *\n * @default 'xl'\n */\n readonly size = input<'xl' | 'lg'>('xl');\n\n /**\n * One sentence with the three strongest facts (process, hardware, price).\n * Empty leaves the paragraph out.\n *\n * @default ''\n */\n readonly lead = input('');\n\n /**\n * One line with at most three promises, separated by middle dots. Empty\n * leaves the line out.\n *\n * @default ''\n */\n readonly note = input('');\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n HostAttributeToken,\n inject,\n input,\n linkedSignal,\n output,\n} from '@angular/core';\n\n/**\n * Content of a game tile, shared by {@link ZGameTile} and {@link ZGameTileLink}:\n * the cover area with image or text fallback, then title and price.\n */\nconst KACHEL = `<span class=\"z-game__cover\" aria-hidden=\"true\">\n @if (cover() && !coverFailed()) {\n <img [src]=\"cover()\" alt=\"\" (error)=\"coverFehlt()\" />\n } @else {\n <span class=\"z-game__fallback\">{{ title() }}</span>\n }\n </span>\n <span class=\"z-game__title\">{{ title() }}</span>\n <span class=\"z-game__price\">{{ price() }}</span>`;\n\n/**\n * Grid of the game tiles: `auto-fill` from 128px width, so the number of\n * columns follows the available space.\n *\n * Renders the class `z-games` on the host and only the projected tiles. From\n * about 15 games a search field belongs above the grid; the component does not\n * bring one.\n *\n * @example\n * ```html\n * <z-game-grid>\n * <button zGameTile title=\"Minecraft\" price=\"ab 1,98 € / Monat\" [selected]=\"true\"></button>\n * <button zGameTile title=\"Rust\" price=\"ab 4,98 € / Monat\"></button>\n * </z-game-grid>\n * ```\n */\n@Component({\n selector: 'z-game-grid',\n template: `<ng-content />`,\n host: { class: 'z-games' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZGameGrid {}\n\n/**\n * Selectable game tile in the price calculator on the start page, under\n * `/preise` and in the order assistant. Sits on a `<button>` through the\n * attribute `zGameTile`. A tile that leads to a page instead of changing a\n * selection is {@link ZGameTileLink}, `a[zGameTile]`.\n *\n * Renders the class `z-game` on the host and inside it `span.z-game__cover`,\n * a landscape area in the ratio of a store header (460:215), then\n * `span.z-game__title` and `span.z-game__price`. Title and price stand below\n * the cover, never on it. The image fills the area: a store header shows\n * uncropped, an image of another ratio is cut centred.\n * Without a {@link cover} the title stands as text, at most two lines in\n * `span.z-game__fallback`, on the same area instead of an image, and a cover\n * whose URL fails to load drops into that same text fallback and reports\n * {@link coverError}. Every tile has the same height either way. Selected means a 2px line in\n * `accent-text`, no glow and no scaling.\n *\n * Accessibility: the tile is a toggle button and always carries\n * `aria-pressed`, `\"true\"` when selected and `\"false\"` otherwise, so the state\n * is announced either way. The whole cover area is `aria-hidden`, because it\n * shows either an image of what the title below it already says or that title\n * as text; without it a tile with no cover, and one whose cover failed, would\n * put the title into the accessible name twice. The image keeps its empty\n * `alt` for the same reason. So the name of every tile is title plus price,\n * whatever the cover does. The native `title` attribute is suppressed on the\n * host, so the browser does not show its own tooltip because of the\n * {@link title} input. The host gets `type=\"button\"`, so a tile inside a form\n * does not submit it; a static `type` written by the caller stays.\n *\n * @example\n * ```html\n * <button\n * zGameTile\n * title=\"Minecraft\"\n * price=\"ab 1,98 € / Monat\"\n * cover=\"/covers/minecraft.jpg\"\n * [selected]=\"spiel() === 'minecraft'\"\n * (click)=\"spiel.set('minecraft')\"\n * ></button>\n * ```\n */\n@Component({\n // The API table prescribes button[zGameTile]: a component with an attribute\n // selector, like Button.\n selector: 'button[zGameTile]',\n template: KACHEL,\n host: {\n class: 'z-game',\n '[attr.type]': `typ`,\n '[attr.aria-pressed]': `selected() ? \"true\" : \"false\"`,\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZGameTile {\n /**\n * Name of the game. Stands below the cover and, without a {@link cover}, as\n * the text fallback on the cover area as well.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Starting price including the period, for example \"ab 1,98 € / Monat\",\n * shown in the mono face below the title.\n *\n * @default ''\n */\n readonly price = input('');\n\n /**\n * `src` of the cover image, ideally a store header in 460:215. It fills the\n * landscape cover area; an image of another ratio is cut centred. Empty\n * shows the title as text on the cover area instead, and so does a URL that\n * fails to load.\n *\n * @default ''\n */\n readonly cover = input('');\n\n /**\n * Fires once when the {@link cover} fails to load, so an application can log\n * the dead URL. The tile handles the failure itself and needs no answer: it\n * shows the text fallback of a missing cover from then on.\n */\n readonly coverError = output<void>();\n\n /**\n * Marks the tile as the chosen game: `aria-pressed=\"true\"` plus the 2px line\n * in `accent-text`. On load the cheapest game is preselected, so the summary\n * is never empty. Boolean attribute.\n *\n * @default false\n */\n readonly selected = input(false, { transform: booleanAttribute });\n\n /**\n * The tile picks a game, it never submits: without a `type` a `<button>`\n * inside a form is a submit button. A static `type` from the caller is read\n * here and written back, because the host binding would otherwise delete it.\n */\n protected readonly typ = inject(new HostAttributeToken('type'), { optional: true }) ?? 'button';\n\n /**\n * True once the browser reported `error` for the current cover. A new\n * {@link cover} is a new URL, so the flag falls back to `false` with it\n * instead of hiding an image that may well load.\n */\n protected readonly coverFailed = linkedSignal<string, boolean>({\n source: this.cover,\n computation: () => false,\n });\n\n /** `(error)` of the `<img>`: text fallback from now on, and one report. */\n protected coverFehlt(): void {\n this.coverFailed.set(true);\n this.coverError.emit();\n }\n}\n\n/**\n * Game tile as a link, for a grid whose tiles lead somewhere, for example to\n * the order of that game. Sits on an `<a>` through the attribute `zGameTile`\n * and looks exactly like {@link ZGameTile}: same class `z-game`, same cover\n * area with the same text fallback for a missing or failing cover, same title\n * and price, same hover and focus ring.\n *\n * It has no selected state and no `aria-pressed`: a link navigates, it does\n * not toggle. The target is the caller's: `href` or `routerLink` on the same\n * `<a>`, which the component leaves alone, so the tile is a real, crawlable\n * link. The accessible name is title plus price, \"Minecraft ab 1,98 € /\n * Monat\", because the cover area is `aria-hidden`, as on the button. The\n * native `title` attribute is suppressed on the host, so the {@link title}\n * input never becomes a browser tooltip.\n *\n * @example\n * ```html\n * <z-game-grid>\n * <a\n * zGameTile\n * title=\"Minecraft\"\n * price=\"ab 1,98 € / Monat\"\n * cover=\"/covers/minecraft.jpg\"\n * routerLink=\"/user/games/create\"\n * [queryParams]=\"{ game: 'minecraft' }\"\n * ></a>\n * </z-game-grid>\n * ```\n */\n@Component({\n selector: 'a[zGameTile]',\n template: KACHEL,\n host: {\n class: 'z-game',\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZGameTileLink {\n /**\n * Name of the game. Stands below the cover and, without a {@link cover}, as\n * the text fallback on the cover area as well.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Starting price including the period, for example \"ab 1,98 € / Monat\",\n * shown in the mono face below the title.\n *\n * @default ''\n */\n readonly price = input('');\n\n /**\n * `src` of the cover image, ideally a store header in 460:215. It fills the\n * landscape cover area; an image of another ratio is cut centred. Empty\n * shows the title as text on the cover area instead, and so does a URL that\n * fails to load.\n *\n * @default ''\n */\n readonly cover = input('');\n\n /**\n * Fires once when the {@link cover} fails to load, so an application can log\n * the dead URL. The tile already shows the text fallback by then.\n */\n readonly coverError = output<void>();\n\n /** True once the browser reported `error` for the current cover. */\n protected readonly coverFailed = linkedSignal<string, boolean>({\n source: this.cover,\n computation: () => false,\n });\n\n /** `(error)` of the `<img>`: text fallback from now on, and one report. */\n protected coverFehlt(): void {\n this.coverFailed.set(true);\n this.coverError.emit();\n }\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { ZButton } from '../button';\nimport { ZAlert, ZAlertAction } from '../feedback';\nimport { injectZLabels } from '../labels';\nimport { ZSpinner } from '../spinner';\n\n/** One line item of the summary. */\nexport interface ZPriceLine {\n /** Name of the item, for example \"Laufzeitrabatt\". */\n label: string;\n /**\n * The amount, already formatted by the caller. Discounts carry a minus sign\n * and stay a line of their own, they never become a badge.\n *\n * This is a TypeScript string, so the non-breaking space before the currency\n * is written as `'4,40\\u00a0€'`, never as `&nbsp;`: an HTML entity inside a\n * TypeScript literal is rendered as those six characters. `Intl.NumberFormat`\n * with `'de-DE'` emits the same U+00A0 by itself.\n */\n value: string;\n /**\n * Marks the line as a deduction: it gets `z-summary__discount` and the\n * amount stands in `success`. The real minus sign (U+2212) comes from the\n * caller, along with the rest of the formatting.\n */\n discount?: boolean;\n}\n\n/** The sum under the line items. */\nexport interface ZPriceTotal {\n /** What the sum is, for example \"Summe für 30 Tage\". */\n label: string;\n /** The amount, already formatted by the caller. */\n value: string;\n}\n\n/**\n * Result of the price calculator, carrying the only primary button of the\n * calculator.\n *\n * Renders an `<aside class=\"z-summary\">` with the optional\n * `.z-summary__label`, the price in `.z-summary__price` with the period in a\n * `<small>`, the items as a `<dl class=\"z-summary__lines\">` of `<dt>`/`<dd>`\n * pairs with the optional `.z-summary__total` as the last pair, then the\n * projected content and last the notes. So the projected content is the\n * button, and it sits between items and note.\n *\n * States: while {@link loading} holds, the last number stays and moves to\n * `.z-summary__price--pending` with a spinner beside it, never a dash. With\n * {@link error} a `danger` alert stands above the button, with the retry\n * button next to it, and the caller locks its own button. \"Incomplete\" is no\n * state of its own: the caller disables its button and writes into\n * {@link note} what is still missing. Validation errors of the selection\n * belong at the field, not here.\n *\n * Accessibility: the `<aside>` is a complementary landmark named by\n * {@link label}; without a label it carries no `aria-label`. The `<dl>` ties\n * every item to its amount. The price is a polite live region, so a changed\n * amount is announced instead of only redrawn; while {@link loading} holds it\n * also carries `aria-busy` and the caller keeps the last confirmed number\n * there, so nothing unconfirmed is ever read out.\n *\n * Never show it empty: on load the cheapest game is preselected. All values\n * come from the price service and are never hard-coded.\n *\n * @example\n * ```html\n * <z-price-summary\n * label=\"Minecraft, alle 30 Tage\"\n * price=\"7,74&nbsp;€\"\n * [lines]=\"posten\"\n * [total]=\"{ label: 'Summe', value: '7,74\\u00a0€' }\"\n * note=\"Wähle noch eine Bezahlmethode\"\n * legalNote=\"Gemäß § 19 UStG wird keine Umsatzsteuer berechnet.\"\n * >\n * <button zBtn=\"primary\" block type=\"button\" disabled>Kostenpflichtig bestellen</button>\n * </z-price-summary>\n * ```\n */\n@Component({\n selector: 'z-price-summary',\n imports: [ZAlert, ZAlertAction, ZButton, ZSpinner],\n template: `\n <aside class=\"z-summary\" [attr.aria-label]=\"label() || null\">\n <div>\n @if (label()) {\n <div class=\"z-summary__label\">{{ label() }}</div>\n }\n <!-- A price that changes has to be heard, not just seen. The region is\n always in the markup and only its text changes; while the\n calculation runs it says nothing, so only a confirmed amount is\n announced. -->\n <div\n class=\"z-summary__price\"\n [class.z-summary__price--pending]=\"loading()\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n >\n {{ price() }} <small>{{ period() }}</small>\n @if (loading()) {\n <z-spinner />\n }\n </div>\n </div>\n <dl class=\"z-summary__lines\">\n @for (zeile of lines(); track $index) {\n <div class=\"z-summary__line\" [class.z-summary__discount]=\"zeile.discount\">\n <dt>{{ zeile.label }}</dt>\n <dd>{{ zeile.value }}</dd>\n </div>\n }\n @if (total(); as summe) {\n <div class=\"z-summary__total\">\n <dt>{{ summe.label }}</dt>\n <dd>{{ summe.value }}</dd>\n </div>\n }\n </dl>\n @if (error()) {\n <z-alert status=\"danger\" icon=\"error\">\n {{ error() }}\n <button zAlertAction zBtn=\"secondary\" size=\"sm\" type=\"button\" (click)=\"retry.emit()\">\n {{ retryLabel() || etiketten.summaryRetry }}\n </button>\n </z-alert>\n }\n <ng-content />\n @if (note()) {\n <span class=\"z-summary__note\">{{ note() }}</span>\n }\n @if (legalNote()) {\n <span class=\"z-summary__note\">{{ legalNote() }}</span>\n }\n </aside>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZPriceSummary {\n /**\n * Game and period, for example \"Valheim, monatlich\". Also the accessible name\n * of the landmark. Empty leaves both out.\n *\n * @default ''\n */\n readonly label = input('');\n\n /**\n * The price, already formatted by the caller: comma as the decimal mark, a\n * non-breaking space before the currency.\n *\n * @default ''\n */\n readonly price = input('');\n\n /**\n * Period shown after the price, for example \"/ Monat\". Rendered in a\n * `<small>` and always present in the markup, even when empty.\n *\n * @default ''\n */\n readonly period = input('');\n\n /**\n * The line items in display order. Not tracked by `label`, so duplicate\n * labels are allowed.\n *\n * @default []\n */\n readonly lines = input<ZPriceLine[]>([]);\n\n /**\n * The sum under the items, set off by a line in `border-control`. Leave it\n * out where there is only one amount to show.\n *\n * @default null\n */\n readonly total = input<ZPriceTotal | null>(null);\n\n /**\n * While the price is being recomputed: the last number stays and turns\n * `text-muted`, with a spinner beside it. There is never a dash in place of\n * a price. Boolean attribute.\n *\n * @default false\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Why the price could not be computed, for example \"Preis konnte nicht\n * berechnet werden\". Shows a `danger` alert with the retry button. The order\n * button is locked by the caller. Empty renders nothing.\n *\n * @default ''\n */\n readonly error = input('');\n\n /**\n * Caption of that retry button. Empty falls back to the `summaryRetry` label\n * of the registry.\n *\n * @default ''\n */\n readonly retryLabel = input('');\n\n /**\n * One sentence on how billing works, or what is still missing before the\n * order can go out. Shown under the button. Empty leaves it out.\n *\n * @default ''\n */\n readonly note = input('');\n\n /**\n * The tax note, as the last line of the summary, for example \"Gemäß § 19\n * UStG wird keine Umsatzsteuer berechnet.\" Empty leaves it out.\n *\n * @default ''\n */\n readonly legalNote = input('');\n\n /** Fires on the retry button. The caller starts the computation again. */\n readonly retry = output<void>();\n\n protected readonly etiketten = injectZLabels();\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** One term and value pair of a `z-spec-list`. */\nexport interface ZSpecItem {\n /** Short term, rendered as the `<dt>`. */\n term: string;\n /** The concrete value, rendered as the `<dd>`. */\n value: string;\n /** Addition after the value, rendered in a `<small>`. Optional. */\n note?: string;\n /**\n * Sets the value in the mono face through `z-mono`. Use it for technical\n * values: addresses, ports, sizes, configuration keys.\n *\n * @default false\n */\n mono?: boolean;\n}\n\n/**\n * Facts as term and value pairs. Replaces metric tiles, chip clouds and feature\n * cards on public pages; a fact appears exactly once per page.\n *\n * Renders a `<dl class=\"z-spec\">` with one `<dt>`/`<dd>` pair per entry, which\n * is what ties every value to its term for assistive technology. No icons, no\n * cards; the rows are separated by 1px lines. Below 480px the value moves under\n * the term.\n *\n * @example\n * ```html\n * <z-spec-list\n * [items]=\"[\n * { term: 'CPU', value: 'AMD Ryzen 9 7950X', note: '16 Kerne' },\n * { term: 'Anbindung', value: '1 Gbit/s', mono: true },\n * ]\"\n * />\n * ```\n */\n@Component({\n selector: 'z-spec-list',\n template: `<dl class=\"z-spec\">\n @for (eintrag of items(); track $index) {\n <dt>{{ eintrag.term }}</dt>\n <dd>\n @if (eintrag.mono) {\n <span class=\"z-mono\">{{ eintrag.value }}</span>\n } @else {\n {{ eintrag.value }}\n }\n @if (eintrag.note) {\n <small>{{ eintrag.note }}</small>\n }\n </dd>\n }\n </dl>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZSpecList {\n /**\n * The facts in display order. Tracked by index, so reordering re-renders the\n * rows. An empty array renders an empty `<dl>`.\n *\n * @default []\n */\n readonly items = input<ZSpecItem[]>([]);\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * One question of the FAQ. The answer is the projected content.\n *\n * Renders a native `<details class=\"z-faq\">` with the question in the\n * `<summary>` and the answer in `<p class=\"z-faq__body\">`. Because it is the\n * native element, opening and closing work without JavaScript, the disclosure\n * is reachable by keyboard and announced with its expanded state; the component\n * adds no keyboard handling of its own.\n *\n * Put several of them under one another, the first one open. Answers run two to\n * three sentences with concrete numbers.\n *\n * @example\n * ```html\n * <z-faq question=\"Wie schnell ist mein Server online?\" open>\n * Nach der Bestellung dauert die Einrichtung in der Regel etwa 60 Sekunden.\n * </z-faq>\n * <z-faq question=\"Kann ich später mehr RAM buchen?\">\n * Ja, im Panel unter Upgrade. Der neue Preis gilt ab der nächsten Stunde.\n * </z-faq>\n * ```\n */\n@Component({\n selector: 'z-faq',\n template: `<details class=\"z-faq\" [open]=\"open()\">\n <summary>{{ question() }}</summary>\n <p class=\"z-faq__body\"><ng-content /></p>\n </details>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZFaq {\n /**\n * The question, shown in the `<summary>`. A real question from support, not a\n * headline.\n *\n * @default ''\n */\n readonly question = input('');\n\n /**\n * Whether the answer starts out visible; the spec asks for the first question\n * to be open. Written as a bare attribute (`open`) it counts as `true`. It is\n * a one-way binding on the native `open` property, so the visitor can toggle\n * freely afterwards and a new value from the caller wins again.\n *\n * @default false\n */\n readonly open = input(false, { transform: booleanAttribute });\n}\n","/* Package werkzeuge: Console, Hero, GameTile, PriceSummary, SpecList and Faq. */\nexport * from '../console';\nexport * from '../marketing';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n input,\n model,\n signal,\n viewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { ZBadge, ZBadgeStatus } from '../badge';\n\n/**\n * One card of a `z-option-group`.\n *\n * @typeParam T The type of {@link value}. `string` for a server type, `number`\n * for a RAM step, so the caller keeps the type it computes with.\n */\nexport interface ZOption<T extends string | number = string> {\n /** The value reported through `value`. Also the tracking key of the list. */\n value: T;\n /** The name of the option, one or two words. Shown in bold, in mono while `compact`. */\n title: string;\n /** One sentence on what the option means. Optional. */\n description?: string;\n /** The price, already formatted by the caller. Shown in the mono face. Optional. */\n price?: string;\n /** Short word above the card, for example \"Empfohlen\" or \"−6 %\". Optional. */\n badge?: string;\n /**\n * Colour of that badge. \"Empfohlen\" is `info` and appears at most once per\n * group, a discount is `success`.\n *\n * @default 'info'\n */\n badgeStatus?: ZBadgeStatus;\n /** Locks this one card while the rest of the group stays usable. */\n disabled?: boolean;\n /**\n * Why it is locked, for example \"zu wenig für 1.21\". Shown in place of\n * {@link description} and tied to the radio through `aria-describedby`.\n */\n disabledReason?: string;\n}\n\nlet zaehler = 0;\n\n/**\n * Picks exactly one of a few options that are meant to be compared: server\n * type, performance class, RAM step, term, payment method. From seven options\n * on it is a `z-combobox` or a `z-slider` instead.\n *\n * Renders a `<fieldset class=\"z-options\">` with the question in\n * `<legend class=\"z-options__legend\">` and one `<label class=\"z-option\">` per\n * option, plus `z-options--compact` for short values such as RAM and term.\n *\n * Accessibility: it is a real radio group. Every card holds a visually hidden\n * native `<input type=\"radio\">` of the same `name`, so the arrow keys move the\n * selection, Tab enters the group once and leaves it again, and the state is\n * announced without any script. The focus ring hangs on the card through\n * `:has(input:focus-visible)`. A locked card names its reason in the card and\n * points at it with `aria-describedby`.\n *\n * Implements `ControlValueAccessor`, so `ngModel` and reactive forms work\n * alongside the two-way binding on {@link value}, and has the shape of a\n * Signal Forms `FormValueControl<string>`, so `[formField]` works. The group as\n * a whole is locked from the form side; a single card is locked through\n * `disabled` on that option.\n *\n * @example\n * ```html\n * <z-option-group\n * legend=\"Arbeitsspeicher\"\n * hint=\"Spielerzahlen sind Richtwerte\"\n * compact\n * [options]=\"[\n * { value: '2', title: '2 GB', disabled: true, disabledReason: 'zu wenig für 1.21' },\n * { value: '4', title: '4 GB', description: 'etwa 10 Spieler', badge: 'Empfohlen' },\n * ]\"\n * [(value)]=\"ram\"\n * />\n * ```\n */\n@Component({\n selector: 'z-option-group',\n imports: [ZBadge],\n template: `\n <fieldset class=\"z-options\" [class.z-options--compact]=\"compact()\">\n <legend class=\"z-options__legend\">\n {{ legend() }}\n @if (hint()) {\n <small>{{ hint() }}</small>\n }\n </legend>\n @for (option of options(); track option.value; let i = $index) {\n <label class=\"z-option\">\n <input\n #radio\n type=\"radio\"\n [name]=\"gruppenname\"\n [value]=\"option.value\"\n [checked]=\"option.value === value()\"\n [disabled]=\"gesperrt() || !!option.disabled\"\n [attr.aria-describedby]=\"satz(option) ? gruppenname + '-' + i : null\"\n (change)=\"waehle(option.value)\"\n (blur)=\"beruehrt()\"\n />\n @if (option.badge) {\n <z-badge class=\"z-option__badge\" [status]=\"option.badgeStatus ?? 'info'\">{{\n option.badge\n }}</z-badge>\n }\n <span class=\"z-option__title\">{{ option.title }}</span>\n @if (satz(option); as text) {\n <span class=\"z-option__desc\" [id]=\"gruppenname + '-' + i\">{{ text }}</span>\n }\n @if (option.price) {\n <span class=\"z-option__price\">{{ option.price }}</span>\n }\n </label>\n }\n </fieldset>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ZOptionGroup), multi: true },\n ],\n})\nexport class ZOptionGroup<T extends string | number = string>\n implements ControlValueAccessor, FormValueControl<T>\n{\n /**\n * The question or the term above the cards, rendered as the `<legend>`.\n *\n * @default ''\n */\n readonly legend = input('');\n\n /**\n * Addition after the legend, in a `<small>`, for example \"Spielerzahlen sind\n * Richtwerte\". Empty renders nothing.\n *\n * @default ''\n */\n readonly hint = input('');\n\n /**\n * The options in display order, at most six. Tracked by `value`, so those\n * have to be unique.\n *\n * @default []\n */\n readonly options = input<readonly ZOption<T>[]>([]);\n\n /**\n * The chosen option's `value`, two-way bindable. A value that matches no\n * option leaves every card unchecked, and so does the unset state: a radio\n * group has no neutral member of `T`, so an unbound group starts out\n * `undefined` and every card is unchecked.\n *\n * @default undefined\n */\n // The cast is the one place where the missing empty member of T is named.\n // It matches what the DOM does: no radio is checked.\n readonly value = model<T>(undefined as unknown as T);\n\n /**\n * Narrow cards with the title in the mono face, for short values such as\n * \"4 GB\" or \"90 Tage\". Adds `z-options--compact`. Boolean attribute.\n *\n * @default false\n */\n readonly compact = input(false, { transform: booleanAttribute });\n\n /**\n * Locks every card of the group. Independent of the disabled state that forms\n * set; either one is enough. A single card is locked through `disabled` on\n * its option. Boolean attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Unique `name` of the radios, which is what makes them one group. */\n protected readonly gruppenname = `z-options-${++zaehler}`;\n\n /** Lock coming from forms, independent of the `disabled` input. Either one suffices. */\n private readonly formsGesperrt = signal(false);\n protected readonly gesperrt = computed(() => this.disabled() || this.formsGesperrt());\n\n private readonly radios = viewChildren<ElementRef<HTMLInputElement>>('radio');\n /** Bumped on every native change, so the mirror below runs again. */\n private readonly spiegelzaehler = signal(0);\n\n private melde?: (wert: T) => void;\n private aufBeruehrt?: () => void;\n\n constructor() {\n // The browser checks a radio before anyone is asked. If the caller refuses\n // the new value, `value()` never changes and the binding has nothing to\n // redo, so the DOM would keep a selection the model does not have. This\n // effect writes the model back into every radio after each change, the way\n // checkbox, toggle and slider mirror their own state (docs/signals.md).\n effect(() => {\n this.spiegelzaehler();\n const wert = this.value();\n this.options();\n for (const radio of this.radios()) {\n radio.nativeElement.checked = radio.nativeElement.value === String(wert);\n }\n });\n }\n\n /** The reason wins over the description, the way the reference card shows it. */\n protected satz(option: ZOption<T>): string {\n return (option.disabled && option.disabledReason) || option.description || '';\n }\n\n protected waehle(wert: T): void {\n this.spiegelzaehler.update((zahl) => zahl + 1);\n if (wert === this.value()) {\n return;\n }\n this.value.set(wert);\n this.melde?.(wert);\n }\n\n protected beruehrt(): void {\n this.aufBeruehrt?.();\n }\n\n /**\n * `ControlValueAccessor`: takes the value from the form. `null` and\n * `undefined` leave every card unchecked.\n */\n writeValue(wert: T): void {\n this.value.set(wert ?? (undefined as unknown as T));\n this.spiegelzaehler.update((zahl) => zahl + 1);\n }\n\n /**\n * `ControlValueAccessor`: registers the callback that reports a new value to\n * the form. It fires on a real change of the radio, not on writes through\n * {@link value}.\n */\n registerOnChange(fn: (wert: T) => void): void {\n this.melde = fn;\n }\n\n /** `ControlValueAccessor`: registers the callback fired when a card loses focus. */\n registerOnTouched(fn: () => void): void {\n this.aufBeruehrt = fn;\n }\n\n /** `ControlValueAccessor`: locks or unlocks every card of the group. */\n setDisabledState(gesperrt: boolean): void {\n this.formsGesperrt.set(gesperrt);\n }\n}\n","import { ActiveDescendantKeyManager, Highlightable } from '@angular/cdk/a11y';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n DOCUMENT,\n effect,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n model,\n numberAttribute,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { ZField } from '../field';\nimport { ZIcon } from '../icon';\nimport { injectZLabels } from '../labels';\nimport { ZSpinner } from '../spinner';\n\n/** One entry of a `z-combobox`. */\nexport interface ZComboOption {\n /** The value reported through `value`. Also the tracking key of the list. */\n value: string;\n /** What the entry reads as, and what stands in the field once it is chosen. */\n label: string;\n /**\n * Consequence of the entry, for example \"mindestens 4 GB\". Shown in a\n * `<small>` and searched along with the label, so a rule never surfaces for\n * the first time in the summary.\n */\n note?: string;\n /** Heading the entry belongs under, for example \"Aktuell\" or \"Snapshots\". */\n group?: string;\n}\n\n/** One row of the open panel: the key manager walks these. */\ninterface Eintrag extends Highlightable {\n readonly option: ZComboOption;\n readonly index: number;\n /** True for the row that commits the typed text; see `allowCustom`. */\n readonly eigen: boolean;\n /**\n * Tracking key of the row. An option's `value` is unique among options, but\n * the own row carries the typed text as its value, and with ids as values\n * typing an id would collide with the entry that has it. The own row\n * therefore takes a prefix no value can have.\n */\n readonly schluessel: string;\n}\n\n/** A heading with the entries under it; an empty name means no heading. */\ninterface Gruppe {\n readonly name: string;\n readonly eintraege: readonly Eintrag[];\n}\n\nlet zaehler = 0;\n\n/**\n * Picks one value out of a long list by typing and filtering: Minecraft\n * version, modpack, Java version, a game from about fifteen on. Up to six\n * options it is a `z-option-group` instead.\n *\n * Renders a `<span class=\"z-combo\">` with an `<input class=\"z-input\">` and, in\n * a CDK overlay as wide as the field, a `<div class=\"z-listbox\">` with one\n * `.z-listbox__option` per match, headings as `.z-listbox__group` and, when\n * nothing matches, a single `.z-listbox__empty` row instead of an empty panel.\n *\n * Accessibility: the editable combobox pattern of the ARIA practices. The\n * input carries `role=\"combobox\"`, `aria-expanded`, `aria-controls`,\n * `aria-autocomplete=\"list\"` and `aria-activedescendant`; the panel is the\n * `role=\"listbox\"`, headings are `role=\"group\"` with their name. The focus\n * never leaves the input: the arrow keys, Home and End move the active entry\n * through `ActiveDescendantKeyManager`, Enter takes it, Escape closes without\n * clearing the field, and a click on an entry keeps the focus because the\n * component cancels the `mousedown`. Leaving the field with text that matches\n * nothing puts the chosen label back, so the field never shows a value that is\n * not the value. The component has no visible label of its own; it takes the\n * label and the hint or error of the surrounding `z-field` through\n * {@link inputId}, or an accessible name through {@link ariaLabel} or\n * {@link ariaLabelledby}.\n *\n * The panel hangs in a CDK overlay as wide as the field and belongs to it: it\n * follows the field when anything around it scrolls, the page as well as an\n * inner container such as the body of a scrolling dialog, and closes once the\n * field has left that container. Scrolling inside the list itself does not\n * move the field and changes nothing.\n *\n * Implements `ControlValueAccessor`, so `ngModel` and reactive forms work\n * alongside the two-way binding on {@link value}, and has the shape of a\n * Signal Forms `FormValueControl<string>`, so `[formField]` works and feeds\n * {@link disabled} from the field state.\n *\n * Three modes, all of them the same element:\n *\n * - **Local**, the default: the component filters {@link options} itself.\n * - **On the server**: {@link filterLocally} `false` shows exactly the options\n * it is given, {@link queryChange} reports every keystroke, {@link loading}\n * draws the waiting row and {@link selectedLabel} names a chosen value whose\n * option is no longer in the list. {@link minQueryLength} holds the list back\n * until the query is long enough to be worth a request. A query shorter than\n * that is still reported, so the caller decides what to do with it.\n * - **Free text**: {@link allowCustom} lets Enter, Tab, Shift+Tab and leaving\n * the field commit what was typed, so the value may be a string that is in\n * no option.\n *\n * @example\n * ```html\n * <z-field label=\"Minecraft-Version\" for=\"cb-version\" hint=\"Tippen filtert die Liste.\">\n * <z-combobox\n * inputId=\"cb-version\"\n * [options]=\"versionen\"\n * [(value)]=\"version\"\n * emptyText=\"Keine Version gefunden\"\n * />\n * </z-field>\n * ```\n */\n@Component({\n selector: 'z-combobox',\n imports: [ZIcon, ZSpinner],\n template: `\n <span class=\"z-combo\">\n <input\n #feld\n class=\"z-input z-input--mono\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [id]=\"inputId() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [attr.aria-describedby]=\"feldRahmen?.beschreibung() ?? null\"\n [attr.aria-expanded]=\"offen()\"\n [attr.aria-controls]=\"offen() ? listenId : null\"\n aria-autocomplete=\"list\"\n [attr.aria-activedescendant]=\"aktiveId()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"gesperrt()\"\n [value]=\"text()\"\n (input)=\"aufEingabe($event)\"\n (keydown)=\"aufTaste($event)\"\n (mousedown)=\"oeffne()\"\n (blur)=\"aufVerlassen()\"\n />\n </span>\n <!-- How many entries the filter left, or the sentence of the empty row.\n The region is always in the markup and only its text changes, which is\n the one way a screen reader hears the count of a list it cannot see. -->\n <span class=\"z-visually-hidden\" role=\"status\">{{ ansage() }}</span>\n\n <ng-template #panel>\n <!-- Cancelling mousedown on the whole panel, not just on an entry, is what\n keeps the focus in the field when the pointer lands on the scrollbar,\n a heading or the empty row. -->\n <div\n class=\"z-listbox\"\n [id]=\"listenId\"\n role=\"listbox\"\n [attr.aria-label]=\"listenname()\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n (mousedown)=\"$event.preventDefault()\"\n >\n @if (zuKurz()) {\n <!-- Below minQueryLength the list is held back and this row says why.\n A locked option, like the empty row, so the listbox keeps a valid\n child and there is nothing to take. -->\n <div class=\"z-listbox__empty\" role=\"option\" aria-selected=\"false\" aria-disabled=\"true\">\n {{ etiketten.comboboxMinQuery(minQueryLength()) }}\n </div>\n } @else {\n @for (gruppe of gruppen(); track gruppe.name) {\n <!-- A heading is a role=\"group\" with its name. Without one the wrapper\n is presentational, so the entries stay direct children of the listbox. -->\n <div\n [attr.role]=\"gruppe.name ? 'group' : 'presentation'\"\n [attr.aria-label]=\"gruppe.name || null\"\n >\n @if (gruppe.name) {\n <div class=\"z-listbox__group\" role=\"presentation\">{{ gruppe.name }}</div>\n }\n @for (eintrag of gruppe.eintraege; track eintrag.schluessel) {\n <!-- In the activedescendant pattern the option is deliberately not\n a tab stop and carries no key handler: the focus stays in the\n input, which owns the whole keyboard (ARIA APG, combobox). -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"z-listbox__option\"\n role=\"option\"\n [id]=\"listenId + '-' + eintrag.index\"\n [class.z-listbox__option--active]=\"eintrag.index === aktiverIndex()\"\n [attr.aria-selected]=\"eintrag.option.value === value()\"\n (click)=\"waehle(eintrag.option.value)\"\n >\n @if (eintrag.eigen) {\n <!-- Prose, not a value, so it carries no mono face. -->\n <span>{{ etiketten.comboboxUseCustom(eintrag.option.label) }}</span>\n } @else {\n <span class=\"z-mono\">{{ eintrag.option.label }}</span>\n @if (eintrag.option.value === value()) {\n <z-icon name=\"check\" size=\"sm\" />\n } @else if (eintrag.option.note) {\n <small>{{ eintrag.option.note }}</small>\n }\n }\n </div>\n }\n </div>\n }\n @if (loading()) {\n <!-- While the caller is searching, the stale options stay above this\n row: replacing them with a single line and putting them back a\n moment later is a flicker under the hand that is typing. There\n is no empty row here, because nothing is known yet. -->\n <div\n class=\"z-listbox__empty z-listbox__loading\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n >\n <z-spinner />\n <span>{{ etiketten.comboboxLoading }}</span>\n </div>\n } @else if (!eintraege().length) {\n <!-- One row instead of an empty panel. It is an option so the listbox\n keeps a valid child, and a locked one because there is nothing to\n take. -->\n <div\n class=\"z-listbox__empty\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n [id]=\"listenId + '-0'\"\n >\n {{ emptyText() || etiketten.comboboxEmpty }}\n </div>\n }\n }\n </div>\n </ng-template>\n `,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ZCombobox), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZCombobox implements ControlValueAccessor, FormValueControl<string> {\n /**\n * The entries in display order. Tracked by `value`, so those have to be\n * unique. Entries with the same `group` are shown under one heading, in the\n * order the groups first appear.\n *\n * @default []\n */\n readonly options = input<readonly ZComboOption[]>([]);\n\n /**\n * The chosen entry's `value`, two-way bindable. A value that matches no\n * entry leaves the field empty.\n *\n * @default ''\n */\n readonly value = model('');\n\n /**\n * Placeholder of the empty field. It is not a label: the label stands above\n * the field, in the surrounding `z-field`.\n *\n * @default ''\n */\n readonly placeholder = input('');\n\n /**\n * The one line the panel shows when nothing matches, for example \"Keine\n * Version gefunden\". Empty falls back to the `comboboxEmpty` label.\n *\n * @default ''\n */\n readonly emptyText = input('');\n\n /**\n * `id` of the input. This is what a surrounding `z-field` points its `for`\n * at, and it is the root of the option ids.\n *\n * @default ''\n */\n readonly inputId = input('');\n\n /**\n * Accessible name of the field where there is no `z-field` around it. An\n * empty string writes no attribute.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * `id` of the element that names the field, as an alternative to\n * {@link ariaLabel}.\n *\n * @default ''\n */\n readonly ariaLabelledby = input('');\n\n /**\n * Locks the field. Independent of the disabled state that forms set; either\n * one is enough. Boolean attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the component filters {@link options} itself. `false` hands the\n * filtering to the caller: the panel shows exactly the options it is given,\n * which is what a search on the server needs. {@link queryChange} is what\n * feeds that search. Boolean attribute.\n *\n * @default true\n */\n readonly filterLocally = input(true, { transform: booleanAttribute });\n\n /**\n * Whether the caller is fetching options right now. While the panel is open\n * it draws one waiting row and sets `aria-busy` on the listbox; options that\n * are already there stay above that row, so a running search does not blank\n * the list under the hand that is typing. No empty row while this is set.\n * Boolean attribute.\n *\n * @default false\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Whether text that matches no entry may become the value. Enter without an\n * active row, Tab, Shift+Tab and leaving the field with the pointer all\n * commit the typed text, trimmed, and a row at the top of the panel offers\n * the same thing with the pointer and the arrow keys. Text that is only\n * space commits nothing: it trims to the empty string, so the panel holds\n * the whole list and Enter takes the active row, exactly as it does without\n * this input. Escape is the one key that gives the text up.\n *\n * A value committed this way is its own label until the caller changes\n * {@link selectedLabel} or the value, so a `selectedLabel` still naming the\n * entry chosen before it does not resurface.\n *\n * @default false\n */\n readonly allowCustom = input(false, { transform: booleanAttribute });\n\n /**\n * Least number of characters before the panel shows entries at all. Below\n * it a single row says so instead, and {@link queryChange} still fires, so\n * the caller decides whether a shorter query is worth a request.\n *\n * @default 0\n */\n readonly minQueryLength = input(0, { transform: numberAttribute });\n\n /**\n * What the field shows for the current {@link value} while no entry of\n * {@link options} carries it. A search on the server holds the matches of\n * the last query, not the entry that was chosen three queries ago, and the\n * caller knows the label that belongs to the id it stores. An entry that is\n * in the list still wins over this.\n *\n * @default ''\n */\n readonly selectedLabel = input('');\n\n /**\n * The text the visitor typed, on every change of it, and the empty string\n * once the field is cleared. It does not fire when the component writes the\n * label of the value back into the field, and not on a write to\n * {@link value}, so it never answers itself.\n *\n * There is no debounce in here: the timing belongs to whoever runs the\n * search. Write the text into a signal and let a `resource()` with that\n * signal as its `params` fetch, or push it into a `Subject` and debounce\n * with RxJS; feed the result back into `options` and set `loading` while the\n * request is open.\n */\n readonly queryChange = output<string>();\n\n protected readonly etiketten = injectZLabels();\n protected readonly listenId = `z-listbox-${++zaehler}`;\n protected readonly offen = signal(false);\n\n /** What the input shows. Follows {@link value} until the visitor types. */\n protected readonly text = signal('');\n\n /** The typed filter, or `null` while the list is unfiltered. */\n private readonly suche = signal<string | null>(null);\n\n protected readonly aktiverIndex = signal(-1);\n\n /**\n * `value` of the active row, so it can be found again after the list was\n * replaced under the open panel. The index alone would move with the list.\n */\n private readonly aktiverWert = signal('');\n\n private readonly formsGesperrt = signal(false);\n protected readonly gesperrt = computed(() => this.disabled() || this.formsGesperrt());\n\n protected readonly feldRahmen = inject(ZField, { optional: true });\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly dokument = inject(DOCUMENT);\n private readonly overlay = inject(Overlay);\n private readonly ansicht = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly feld = viewChild.required<ElementRef<HTMLInputElement>>('feld');\n private readonly panel = viewChild.required<TemplateRef<unknown>>('panel');\n private overlayRef?: OverlayRef;\n /** Lives exactly as long as the open panel; see {@link horcheAufScrollen}. */\n private scrollHorcher?: AbortController;\n\n private melde?: (wert: string) => void;\n private aufBeruehrt?: () => void;\n\n /**\n * A value the component itself took from the typed text, together with the\n * {@link selectedLabel} that stood at that moment. Both have to still hold\n * for the value to be its own label; see {@link gewaehltesLabel}.\n */\n private readonly eigenerBestand = signal<{ wert: string; etikett: string } | null>(null);\n\n /**\n * The label of the chosen value, in this order: the entry that carries it,\n * the free text the component itself just committed, the\n * {@link selectedLabel} the caller supplied, and the value itself where\n * {@link allowCustom} makes a value that is in no entry a legal one. The\n * empty string for an unknown value in the plain case, which is what leaves\n * the field empty.\n *\n * The free text comes before `selectedLabel` because that input still names\n * the entry chosen before it, and showing the old name for a value the\n * visitor just typed is the worse of the two. It gives way again as soon as\n * the caller changes `selectedLabel` or the value.\n */\n private readonly gewaehltesLabel = computed(() => {\n const wert = this.value();\n const eintrag = this.options().find((o) => o.value === wert);\n if (eintrag) {\n return eintrag.label;\n }\n if (!wert) {\n return '';\n }\n const eigen = this.eigenerBestand();\n if (eigen && eigen.wert === wert && eigen.etikett === this.selectedLabel()) {\n return wert;\n }\n return this.selectedLabel() || (this.allowCustom() ? wert : '');\n });\n\n /** The typed text, trimmed; the empty string while nothing has been typed. */\n private readonly anfrage = computed(() => this.suche()?.trim() ?? '');\n\n /** True while the typed text is shorter than {@link minQueryLength}. */\n protected readonly zuKurz = computed(() => this.anfrage().length < this.minQueryLength());\n\n /**\n * Case-insensitive over label and note; no filter shows every entry. With\n * {@link filterLocally} `false` the caller has filtered already, so the\n * options are passed through as they are. Below {@link minQueryLength} there\n * is nothing to show at all.\n */\n protected readonly treffer = computed<readonly ZComboOption[]>(() => {\n if (this.zuKurz()) {\n return [];\n }\n const suche = this.filterLocally() ? this.anfrage().toLowerCase() : '';\n if (!suche) {\n return this.options();\n }\n return this.options().filter((o) => `${o.label} ${o.note ?? ''}`.toLowerCase().includes(suche));\n });\n\n /**\n * The entry whose label **or** value is exactly the typed text, ignoring\n * case and surrounding space. The value counts too because a list keyed by\n * ids is searched by id as often as by name, and two ways to one row must\n * not put two rows in the panel.\n */\n private readonly genauePassung = computed(() => {\n const text = this.anfrage().toLowerCase();\n if (!text) {\n return null;\n }\n return (\n this.treffer().find(\n (o) => o.label.toLowerCase() === text || o.value.toLowerCase() === text,\n ) ?? null\n );\n });\n\n /**\n * The value that committing the typed text would write, or the empty string\n * where there is nothing to commit. Typing the exact label of an entry\n * commits that entry's value, not the label, so the two ways to the same row\n * do not end in two different values.\n */\n private readonly eigenerWert = computed(() => {\n if (!this.allowCustom() || this.zuKurz() || !this.anfrage()) {\n return '';\n }\n return this.genauePassung()?.value ?? this.anfrage();\n });\n\n /**\n * The row that commits the typed text, or `null`. It stands only where the\n * text is not already the label of an entry: a second way to a row that is\n * right there would be a second value for the same thing.\n */\n private readonly eigeneOption = computed<ZComboOption | null>(() => {\n const text = this.anfrage();\n if (!this.allowCustom() || this.zuKurz() || !text || this.genauePassung()) {\n return null;\n }\n return { value: text, label: text };\n });\n\n /**\n * Grouped by name, in the order the names first appear. Entries of the same\n * group that stand apart in `options` land under one heading, so a name never\n * shows up twice and the tracking key of the list stays unique.\n */\n protected readonly gruppen = computed<Gruppe[]>(() => {\n const eigene = this.eigeneOption();\n const nach = new Map<string, ZComboOption[]>();\n // The own row goes first, and therefore into the group without a heading:\n // it belongs to the text in the field, not to any of the headings.\n if (eigene) {\n nach.set('', [eigene]);\n }\n for (const option of this.treffer()) {\n const name = option.group ?? '';\n const vorhanden = nach.get(name);\n if (vorhanden) {\n vorhanden.push(option);\n } else {\n nach.set(name, [option]);\n }\n }\n // Numbered in the order the rows are drawn, not in the order of `options`:\n // grouping moves rows, and the arrow keys have to follow the eye.\n let index = 0;\n return [...nach].map(([name, optionen]) => ({\n name,\n eintraege: optionen.map((option) => this.zuEintrag(option, index++, option === eigene)),\n }));\n });\n\n /** Every row of every group, in the order they are drawn. */\n protected readonly eintraege = computed<Eintrag[]>(() =>\n this.gruppen().flatMap((gruppe) => gruppe.eintraege as Eintrag[]),\n );\n\n private zuEintrag(option: ZComboOption, index: number, eigen: boolean): Eintrag {\n return {\n option,\n index,\n eigen,\n schluessel: eigen ? `\\u0000eigen` : option.value,\n getLabel: () => option.label,\n // The active row is derived from aktiverIndex, so one signal carries the\n // whole state and the counterpart has nothing left to undo. The value\n // travels along so the row can be found again in a replaced list.\n setActiveStyles: () => {\n this.aktiverIndex.set(index);\n this.aktiverWert.set(option.value);\n },\n setInactiveStyles: () => undefined,\n };\n }\n\n /**\n * What the live region says while the panel is open: how many entries the\n * filter left, or the sentence of the row that stands instead of them.\n * Closed it says nothing, so nothing is announced twice.\n *\n * The count is the matches and nothing else. The row of {@link allowCustom}\n * is an action, not a hit, so it would turn one match into \"2 Treffer\"; it\n * gets its own sentence where it stands alone, which is also what the panel\n * shows then.\n */\n protected readonly ansage = computed(() => {\n if (!this.offen()) {\n return '';\n }\n if (this.zuKurz()) {\n return this.etiketten.comboboxMinQuery(this.minQueryLength());\n }\n if (this.loading()) {\n return this.etiketten.comboboxLoading;\n }\n const anzahl = this.treffer().length;\n if (anzahl) {\n return this.etiketten.comboboxResults(anzahl);\n }\n const eigene = this.eigeneOption();\n return eigene\n ? this.etiketten.comboboxUseCustom(eigene.label)\n : this.emptyText() || this.etiketten.comboboxEmpty;\n });\n\n /**\n * The id of the active row. Bounded by the list itself, not only by the\n * index: options can be replaced under an open panel, and a reference to a\n * row that is gone is worse than none.\n */\n protected readonly aktiveId = computed(() => {\n const index = this.aktiverIndex();\n return this.offen() && index >= 0 && index < this.eintraege().length\n ? `${this.listenId}-${index}`\n : null;\n });\n\n /** Names the panel after the field, so the listbox is not an unnamed region. */\n protected readonly listenname = computed(\n () => this.ariaLabel() || this.feldRahmen?.label() || null,\n );\n\n private readonly tasten = new ActiveDescendantKeyManager(this.eintraege, this.injector)\n .withWrap()\n .withHomeAndEnd();\n\n constructor() {\n // The field shows the label of the value, never the raw value. A value set\n // from outside therefore rewrites the text, and so does a changed option\n // list. While the visitor types, the typed text stands instead.\n effect(() => {\n const label = this.gewaehltesLabel();\n if (untracked(this.suche) === null) {\n this.text.set(label);\n }\n });\n\n // A search on the server replaces `options` while the panel stands open.\n // The row the keyboard is on keeps its place when it is still in the list,\n // otherwise the first one takes over; without this the active index would\n // point into a list that has moved under it.\n effect(() => {\n const alle = this.eintraege();\n if (!untracked(this.offen)) {\n return;\n }\n const index = alle.findIndex((e) => e.option.value === untracked(this.aktiverWert));\n this.aktiviere(index >= 0 ? index : 0);\n });\n\n const abbruch = new AbortController();\n this.dokument.defaultView?.addEventListener('resize', () => this.aufGroessenwechsel(), {\n signal: abbruch.signal,\n });\n\n inject(DestroyRef).onDestroy(() => {\n abbruch.abort();\n this.scrollHorcher?.abort();\n this.tasten.destroy();\n this.overlayRef?.dispose();\n });\n }\n\n protected oeffne(): void {\n if (this.gesperrt() || this.offen()) {\n return;\n }\n this.overlayRef ??= this.erzeugeOverlay();\n this.overlayRef.updateSize({ width: this.feld().nativeElement.offsetWidth });\n this.overlayRef.attach(new TemplatePortal(this.panel(), this.ansicht));\n this.offen.set(true);\n this.setzeAktiv();\n this.horcheAufScrollen();\n }\n\n protected schliesse(): void {\n if (!this.offen()) {\n return;\n }\n this.scrollHorcher?.abort();\n this.scrollHorcher = undefined;\n this.overlayRef?.detach();\n this.offen.set(false);\n this.aktiverIndex.set(-1);\n this.aktiverWert.set('');\n this.suche.set(null);\n this.text.set(this.gewaehltesLabel());\n }\n\n /**\n * While the panel is open, every scroller around the field is listened to.\n * The listener hangs on the document in the CAPTURE phase, because a scroll\n * event on an inner element does not bubble: `ScrollDispatcher` of the CDK\n * listens without capture and therefore only ever hears the page and the\n * containers a caller marked `cdkScrollable`. The scrolling body of a dialog\n * carries that mark since `z-dialog` sets it, but a scroll container of the\n * caller's own does not, so a combobox in one used to keep a panel hanging\n * where the field no longer was. Capture hears every scroller without asking\n * any caller to annotate its container.\n */\n private horcheAufScrollen(): void {\n this.scrollHorcher = new AbortController();\n this.dokument.addEventListener('scroll', (ereignis) => this.aufScrollen(ereignis), {\n capture: true,\n passive: true,\n signal: this.scrollHorcher.signal,\n });\n }\n\n /**\n * The panel belongs to the field: it follows the field as long as the field\n * can be seen in the container that moved, and goes once the field has left\n * it. Following instead of closing at the first pixel is what the package\n * already did for the page, and it is what a scroll that is still running\n * needs: a panel opened while the browser is still scrolling a field into\n * view would otherwise close under the hand that opened it. A scroll inside\n * the list is not a scroll of the field and changes nothing.\n */\n private aufScrollen(ereignis: Event): void {\n const ziel = ereignis.target as Node | null;\n if (!this.overlayRef || (ziel && this.overlayRef.overlayElement.contains(ziel))) {\n return;\n }\n this.overlayRef.updatePosition();\n const feld = this.feld().nativeElement.getBoundingClientRect();\n const rolle = this.kasten(ziel);\n if (\n feld.bottom <= rolle.top ||\n feld.top >= rolle.bottom ||\n feld.right <= rolle.left ||\n feld.left >= rolle.right\n ) {\n this.schliesse();\n }\n }\n\n /**\n * The visible box of the scroller the event came from. The page reports its\n * scroll on the document, and in some engines on the root element or the\n * body; all three mean the viewport.\n */\n private kasten(ziel: Node | null): { top: number; bottom: number; left: number; right: number } {\n const seite =\n !ziel ||\n ziel === this.dokument ||\n ziel === this.dokument.documentElement ||\n ziel === this.dokument.body;\n if (!seite && ziel instanceof Element) {\n return ziel.getBoundingClientRect();\n }\n const fenster = this.dokument.defaultView;\n return {\n top: 0,\n left: 0,\n bottom: fenster?.innerHeight ?? 0,\n right: fenster?.innerWidth ?? 0,\n };\n }\n\n protected aufEingabe(ereignis: Event): void {\n const text = (ereignis.target as HTMLInputElement).value;\n this.text.set(text);\n this.suche.set(text);\n this.oeffne();\n this.setzeAktiv();\n // Only here, so the output carries what the visitor typed and never what\n // the component wrote back into the field.\n this.queryChange.emit(text);\n }\n\n protected aufTaste(ereignis: KeyboardEvent): void {\n if (ereignis.key === 'Escape') {\n // Closes the panel and puts the chosen label back. It never empties the\n // field, so a second Escape has nothing left to take away. While the\n // panel is open the key belongs to the panel: it stops here, or a dialog\n // around the field would close along with it.\n if (this.offen()) {\n ereignis.preventDefault();\n ereignis.stopPropagation();\n this.schliesse();\n }\n return;\n }\n if (ereignis.key === 'Enter') {\n const gewaehlt = this.eintraege()[this.aktiverIndex()];\n if (this.offen() && gewaehlt) {\n ereignis.preventDefault();\n this.waehle(gewaehlt.option.value);\n } else if (this.eigenerWert()) {\n // No row under the keyboard, but text in the field and allowCustom:\n // Enter takes that text instead of doing nothing.\n ereignis.preventDefault();\n this.waehle(this.eigenerWert());\n }\n return;\n }\n if (ereignis.key === 'Tab') {\n // Tab and Shift+Tab are both ways of leaving the field (the key is `Tab`\n // either way), so they commit what leaving commits. It has to happen\n // here: the panel closes before the focus moves, and by the time the\n // blur arrives the typed text is gone.\n this.uebernimmEigenes();\n this.schliesse();\n return;\n }\n if (['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(ereignis.key)) {\n if (!this.offen()) {\n this.oeffne();\n return;\n }\n this.tasten.onKeydown(ereignis);\n this.rolleZumAktiven();\n }\n }\n\n protected waehle(wert: string): void {\n this.uebernimm(wert);\n this.feld().nativeElement.focus();\n }\n\n /**\n * Writes a value, reports it to the form and closes the panel. Separate from\n * {@link waehle} because leaving the field also commits, and pulling the\n * focus back there would be the one thing a blur must not do.\n */\n private uebernimm(wert: string): void {\n this.suche.set(null);\n if (wert !== this.value()) {\n this.value.set(wert);\n this.melde?.(wert);\n }\n // Free text is its own label from here on, which is what keeps a stale\n // selectedLabel from naming the entry that was chosen before it.\n this.eigenerBestand.set(\n this.allowCustom() && wert && !this.options().some((o) => o.value === wert)\n ? { wert, etikett: this.selectedLabel() }\n : null,\n );\n this.text.set(this.gewaehltesLabel());\n this.schliesse();\n }\n\n /**\n * Leaving the field is the moment a text that matches nothing is undone —\n * or, with {@link allowCustom}, the moment it becomes the value.\n */\n protected aufVerlassen(): void {\n this.uebernimmEigenes();\n this.schliesse();\n this.aufBeruehrt?.();\n }\n\n /** Takes the typed text where {@link allowCustom} lets it become the value. */\n private uebernimmEigenes(): void {\n const wert = this.eigenerWert();\n if (wert) {\n this.uebernimm(wert);\n }\n }\n\n /** The chosen entry starts out active, otherwise the first one. */\n private setzeAktiv(): void {\n const index = this.eintraege().findIndex((e) => e.option.value === this.value());\n this.aktiviere(index >= 0 ? index : 0);\n }\n\n /** Makes one row active, or none at all where the list is empty. */\n private aktiviere(index: number): void {\n const alle = this.eintraege();\n const ziel = alle.length ? Math.min(Math.max(index, 0), alle.length - 1) : -1;\n this.tasten.setActiveItem(ziel);\n this.aktiverIndex.set(ziel);\n this.aktiverWert.set(ziel >= 0 ? alle[ziel].option.value : '');\n }\n\n private rolleZumAktiven(): void {\n const zeile = this.overlayRef?.overlayElement.querySelector(\n `#${this.listenId}-${this.aktiverIndex()}`,\n );\n // Optional because a test environment without layout does not implement it.\n zeile?.scrollIntoView?.({ block: 'nearest' });\n }\n\n /** As wide as the field, below it, above it as the fallback position. */\n private erzeugeOverlay(): OverlayRef {\n const position = this.overlay.position().flexibleConnectedTo(this.feld());\n const ref = this.overlay.create({\n panelClass: 'z-combo-pane',\n positionStrategy: position\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n ])\n // Without this the strategy pushes the panel back into the viewport\n // when the field leaves it: the list would stand in the page far from\n // the field it belongs to.\n .withPush(false),\n // Scrolling is answered in one place, by the capture listener of\n // horcheAufScrollen(): every CDK strategy runs on ScrollDispatcher, which\n // does not hear an unannotated inner scroller at all.\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n });\n // A pointer on the field itself is not \"outside\": it opens the panel and\n // would otherwise close it again within the same event.\n ref.outsidePointerEvents().subscribe((ereignis) => {\n if (!this.host.nativeElement.contains(ereignis.target as Node)) {\n this.schliesse();\n }\n });\n // An overlay can be detached from outside (dispose on destroy), so the\n // component learns of it here instead of keeping a state the DOM no longer\n // has.\n ref.detachments().subscribe(() => {\n this.scrollHorcher?.abort();\n this.scrollHorcher = undefined;\n if (this.offen()) {\n this.offen.set(false);\n this.aktiverIndex.set(-1);\n this.aktiverWert.set('');\n this.suche.set(null);\n this.text.set(this.gewaehltesLabel());\n }\n });\n return ref;\n }\n\n /** A resized window changes the width of the field, and with it the panel. */\n private aufGroessenwechsel(): void {\n if (!this.offen() || !this.overlayRef) {\n return;\n }\n this.overlayRef.updateSize({ width: this.feld().nativeElement.offsetWidth });\n this.overlayRef.updatePosition();\n }\n\n /**\n * `ControlValueAccessor`: takes the value from the form. `null` and\n * `undefined` become the empty string, which selects nothing.\n */\n writeValue(wert: string): void {\n this.value.set(wert ?? '');\n }\n\n /**\n * `ControlValueAccessor`: registers the callback that reports a new value to\n * the form. It fires when an entry is taken, not on writes through\n * {@link value}.\n */\n registerOnChange(fn: (wert: string) => void): void {\n this.melde = fn;\n }\n\n /** `ControlValueAccessor`: registers the callback fired when the field loses focus. */\n registerOnTouched(fn: () => void): void {\n this.aufBeruehrt = fn;\n }\n\n /** `ControlValueAccessor`: locks or unlocks the field from the form side. */\n setDisabledState(gesperrt: boolean): void {\n this.formsGesperrt.set(gesperrt);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n Directive,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { injectZLabels } from '../labels';\n\nlet schrittZaehler = 0;\n\n/** State of one step of a `z-wizard`. */\nexport type ZWizardState = 'done' | 'current' | 'locked';\n\n/**\n * Marks an action of the current step, which goes into the row at the bottom of\n * the step body: \"Zurück\" as a ghost button on the left, \"Weiter\" as a\n * secondary one on the right. The caller owns those buttons, because only the\n * caller knows what the next step is called and when it may be reached.\n *\n * @example\n * ```html\n * <button zWizardActions zBtn=\"ghost\" type=\"button\">Zurück</button>\n * <button zWizardActions zBtn=\"secondary\" type=\"button\">Weiter zu Bezahlen</button>\n * ```\n */\n@Directive({ selector: '[zWizardActions]' })\nexport class ZWizardActions {}\n\n/**\n * One step of a `z-wizard`: head with number and title, and the fields as\n * projected content while it is the current one.\n *\n * Renders the class `z-wstep` on the host, plus `z-wstep--done` or\n * `z-wstep--locked`. The head holds `.z-step__num`, the title as a heading,\n * the summary and, on a finished step, the \"Ändern\" button. The body is only\n * rendered while the step is current, with every projected\n * `[zWizardActions]` element as the last row in `.z-wstep__actions`, which is\n * the flex row that puts \"Zurück\" left and \"Weiter\" right.\n *\n * Accessibility: `role=\"listitem\"`, and `aria-current=\"step\"` while it is the\n * current one. A locked step renders no body at all, so nothing in it can be\n * reached by Tab. The title carries `tabindex=\"-1\"`, so the caller can move\n * the focus onto it after \"Weiter\" or \"Ändern\". The \"Ändern\" buttons of a\n * wizard read differently, because the accessible name is built from the\n * visible caption and the title of the step (\"Ändern Inhalt\"), which keeps the\n * written word at the start of the spoken one.\n *\n * @example\n * ```html\n * <z-wizard-step title=\"Größe\" state=\"current\">\n * <z-option-group legend=\"Arbeitsspeicher\" [options]=\"stufen\" [(value)]=\"ram\" compact />\n * <button zWizardActions zBtn=\"ghost\" type=\"button\">Zurück</button>\n * <button zWizardActions zBtn=\"secondary\" type=\"button\">Weiter zu Bezahlen</button>\n * </z-wizard-step>\n * ```\n */\n@Component({\n selector: 'z-wizard-step',\n template: `\n <div class=\"z-wstep__head\">\n <span class=\"z-step__num\">{{ nummer() }}</span>\n @switch (headingLevel()) {\n @case (2) {\n <h2 class=\"z-wstep__title\" [attr.id]=\"titelId\" tabindex=\"-1\">{{ title() }}</h2>\n }\n @case (4) {\n <h4 class=\"z-wstep__title\" [attr.id]=\"titelId\" tabindex=\"-1\">{{ title() }}</h4>\n }\n @default {\n <h3 class=\"z-wstep__title\" [attr.id]=\"titelId\" tabindex=\"-1\">{{ title() }}</h3>\n }\n }\n @if (summary()) {\n <span class=\"z-wstep__summary\">{{ summary() }}</span>\n }\n @if (state() === 'done') {\n <!-- The name is built from the visible caption and the title of the\n step, so it always starts with what is written on the button\n (WCAG 2.5.3) even when the caller renames it. -->\n <button\n class=\"z-wstep__edit\"\n type=\"button\"\n [attr.id]=\"knopfId\"\n [attr.aria-labelledby]=\"knopfId + ' ' + titelId\"\n (click)=\"edit.emit()\"\n >\n {{ editLabel() || etiketten.wizardEdit }}\n </button>\n }\n </div>\n @if (state() === 'current') {\n <div class=\"z-wstep__body\">\n <ng-content />\n <div class=\"z-wstep__actions\"><ng-content select=\"[zWizardActions]\" /></div>\n </div>\n }\n `,\n host: {\n class: 'z-wstep',\n role: 'listitem',\n '[class.z-wstep--done]': `state() === 'done'`,\n '[class.z-wstep--locked]': `state() === 'locked'`,\n '[attr.aria-current]': `state() === 'current' ? 'step' : null`,\n // Otherwise the browser hangs its own tooltip on the whole step because of\n // the static attribute title=\"…\".\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZWizardStep {\n /**\n * Title of the step, one noun. Also the accessible name of the \"Ändern\"\n * button, which is how several of them stay distinguishable.\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * What the step has decided, for example \"Vanilla, neueste Version\". A\n * finished step shows it in place of its fields, a locked one shows what is\n * still to come. Empty renders nothing.\n *\n * @default ''\n */\n readonly summary = input('');\n\n /**\n * Where the step stands: `done` is collapsed with the summary and \"Ändern\",\n * `current` is open, `locked` renders no body and holds no tab stop.\n *\n * @default 'locked'\n */\n readonly state = input<ZWizardState>('locked');\n\n /**\n * Tag of the title: `2`, `3` or `4`. The reference uses `3`, which fits under\n * the `<h2>` of a section below the page's `<h1>`. The visual size never\n * changes with it.\n *\n * @default 3\n */\n readonly headingLevel = input<2 | 3 | 4, 2 | 3 | 4 | '2' | '3' | '4'>(3, {\n transform: (wert) => Number(wert) as 2 | 3 | 4,\n });\n\n /**\n * Caption of the button on a finished step. Empty falls back to the\n * `wizardEdit` label of the registry.\n *\n * @default ''\n */\n readonly editLabel = input('');\n\n /**\n * Fires when \"Ändern\" is pressed. The caller decides what follows: it usually\n * makes this step the current one again and moves the focus to its title.\n */\n readonly edit = output<void>();\n\n protected readonly etiketten = injectZLabels();\n protected readonly titelId = `z-wstep-t-${++schrittZaehler}`;\n protected readonly knopfId = `z-wstep-e-${schrittZaehler}`;\n private readonly wizard = inject(ZWizard, { optional: true });\n\n /**\n * Position in the wizard, 1-based. It is read from the parent instead of\n * being an input: two sources for the same fact drift apart as soon as a\n * step is added. Outside a wizard the step is number 1.\n */\n protected readonly nummer = computed(() => {\n const alle = this.wizard?.schritte() ?? [];\n return Math.max(alle.indexOf(this), 0) + 1;\n });\n}\n\n/**\n * The steps of an order, one below the other, with the summary next to it in a\n * `z-config`. Two to four steps, a noun as the title of each.\n *\n * Renders the class `z-wizard` on the host and projects the steps. The wizard\n * itself is the progress of the order, so there is no separate progress list\n * next to it, and it numbers its steps itself.\n *\n * Accessibility: the host is a `role=\"list\"` and every `z-wizard-step` a\n * `role=\"listitem\"`, which is what the `<ol>` and `<li>` of the reference\n * stand for. The current step carries `aria-current=\"step\"`.\n *\n * @example\n * ```html\n * <z-wizard>\n * <z-wizard-step title=\"Inhalt\" summary=\"Vanilla, neueste Version\" state=\"done\" />\n * <z-wizard-step title=\"Größe\" state=\"current\">…</z-wizard-step>\n * <z-wizard-step title=\"Bezahlen\" summary=\"Name, Laufzeit\" state=\"locked\" />\n * </z-wizard>\n * ```\n */\n@Component({\n selector: 'z-wizard',\n template: `<ng-content />`,\n host: { class: 'z-wizard', role: 'list' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZWizard {\n // The predicate lands in the static partial declaration, which a JIT consumer\n // evaluates while this class is defined: ZWizardStep has to be declared above.\n /**\n * The projected steps in document order.\n *\n * @internal Wiring between `z-wizard` and its steps, not meant to be read by\n * applications.\n */\n readonly schritte = contentChildren(ZWizardStep);\n}\n","import { ChangeDetectionStrategy, Component, Directive } from '@angular/core';\n\n/**\n * Marks the column next to the form: the `z-price-summary` and, below it, the\n * `z-included-list`. From 900px on it sticks under the header\n * (`top: header + space-5`), below that it moves under the form.\n *\n * @example\n * ```html\n * <div zConfigAside>\n * <z-price-summary price=\"7,74&nbsp;€\">…</z-price-summary>\n * </div>\n * ```\n */\n@Directive({ selector: '[zConfigAside]', host: { class: 'z-config__aside' } })\nexport class ZConfigAside {}\n\n/**\n * Layout of a configurator: the form on the left, the summary on the right.\n *\n * Renders the class `z-config` on the host, a grid of one column that becomes\n * `1fr 340px` from 900px on. Below 900px the summary stands under the form,\n * and a `z-sticky-bar` keeps price and next step in view.\n *\n * @example\n * ```html\n * <z-config>\n * <z-wizard>…</z-wizard>\n * <div zConfigAside>\n * <z-price-summary price=\"7,74&nbsp;€\">…</z-price-summary>\n * </div>\n * </z-config>\n * ```\n */\n@Component({\n selector: 'z-config',\n template: `<ng-content />`,\n host: { class: 'z-config' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZConfig {}\n","import {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n DOCUMENT,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\n\n/** Every bar on the page, so the tallest stuck one sets the room to keep clear. */\nconst lebende = new Set<HTMLElement>();\n\n/** The one scroll and resize listener all bars share, as long as one lives. */\nlet horcher: AbortController | undefined;\n\n/**\n * Marks every bar that really lies at the bottom edge of the viewport with\n * `data-stuck` and writes the height of the tallest of them, or removes the\n * property. A bar that stands in the page instead covers nothing: a framed demo\n * bar, a bar above the fold, and a `mobileOnly` bar from 900px on, which is\n * `display: none` and measures 0 everywhere.\n */\nfunction miss(dokument: Document): void {\n const fenster = dokument.defaultView;\n let hoechste = 0;\n for (const bar of lebende) {\n const kasten = bar.getBoundingClientRect();\n const klebt =\n !!fenster && kasten.height > 0 && Math.abs(kasten.bottom - fenster.innerHeight) <= 1;\n bar.toggleAttribute('data-stuck', klebt);\n if (klebt) {\n hoechste = Math.max(hoechste, kasten.height);\n }\n }\n const wurzel = dokument.documentElement;\n if (hoechste > 0) {\n wurzel.style.setProperty('--z-stickybar', `${Math.round(hoechste)}px`);\n } else {\n wurzel.style.removeProperty('--z-stickybar');\n }\n}\n\n/**\n * Keeps price and next step in view at the bottom edge of small screens, and\n * carries exactly one button.\n *\n * Renders the class `z-stickybar` on the host, the price in\n * `.z-stickybar__price` with the summary of the selection in a `<small>`, and\n * the projected button beside it. `mobileOnly` adds `z-stickybar--mobile`,\n * which hides the bar from 900px on, where the summary sticks next to the form\n * instead. It sticks at `bottom: 0` on `surface-raised` with a 1px line above,\n * and casts no shadow. While it really lies at the bottom edge of the viewport\n * it carries the attribute `data-stuck`, which is what the stylesheet keeps\n * scroll room for.\n *\n * The button is the \"Weiter\" of the current step, \"Kostenpflichtig bestellen\"\n * in the last one; it triggers the same thing as its twin in the summary. The\n * bar also carries a bulk action in a list (\"2 ausgewählt\").\n *\n * @example\n * ```html\n * <z-sticky-bar price=\"7,74&nbsp;€\" summary=\"Minecraft, 4 GB, alle 30 Tage\" mobileOnly>\n * <button zBtn=\"primary\" type=\"button\">Weiter</button>\n * </z-sticky-bar>\n * ```\n */\n@Component({\n selector: 'z-sticky-bar',\n template: `\n <div class=\"z-stickybar__price\">\n {{ price() }}\n @if (summary()) {\n <small>{{ summary() }}</small>\n }\n </div>\n <ng-content />\n `,\n host: {\n class: 'z-stickybar',\n '[class.z-stickybar--mobile]': `mobileOnly()`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZStickyBar {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly dokument = inject(DOCUMENT);\n\n constructor() {\n // A bar at the bottom edge of the viewport covers what is behind it, so a\n // control focused there would be invisible (WCAG 2.4.11). Neither the\n // height nor the fact that it sticks is a literal anywhere: every bar\n // measures both, marks itself with data-stuck while it sticks, and the\n // tallest stuck one lands in --z-stickybar, which the stylesheet turns into\n // scroll-padding. Whether a bar sticks changes with scrolling and with the\n // height of the page, so one passive listener per document watches scroll\n // (in the capture phase, so an inner scroller counts too) and resize, and a\n // ResizeObserver watches the bar and the document. ResizeObserver is\n // missing on the server, where there is no layout to keep clear either.\n const element = this.host.nativeElement;\n lebende.add(element);\n const fenster = this.dokument.defaultView;\n const beobachter =\n typeof ResizeObserver === 'undefined'\n ? undefined\n : new ResizeObserver(() => miss(this.dokument));\n\n afterRenderEffect(() => {\n beobachter?.observe(element);\n beobachter?.observe(this.dokument.documentElement);\n if (fenster && !horcher) {\n horcher = new AbortController();\n for (const art of ['scroll', 'resize'] as const) {\n fenster.addEventListener(art, () => miss(this.dokument), {\n capture: true,\n passive: true,\n signal: horcher.signal,\n });\n }\n }\n miss(this.dokument);\n });\n\n inject(DestroyRef).onDestroy(() => {\n beobachter?.disconnect();\n lebende.delete(element);\n if (!lebende.size) {\n horcher?.abort();\n horcher = undefined;\n // Nothing is left to keep room for, and saying so needs no measuring.\n this.dokument.documentElement.style.removeProperty('--z-stickybar');\n return;\n }\n // Destroying measures nothing. The bars that stay have not moved yet —\n // this runs while the view is being torn down, so their boxes are still\n // the ones from before — and on the server there is no box at all:\n // `getBoundingClientRect` does not exist there, and the application is\n // destroyed right after rendering, which made every page with two bars\n // fail. The remaining bars are measured in the next frame instead, which\n // the server never reaches, because its window has no\n // `requestAnimationFrame`.\n fenster?.requestAnimationFrame?.(() => miss(this.dokument));\n });\n }\n\n /**\n * The price, already formatted by the caller: comma as the decimal mark, a\n * non-breaking space before the currency. Shown in `mono-lg`.\n *\n * @default ''\n */\n readonly price = input('');\n\n /**\n * The selection in a few words, for example \"Minecraft, 4 GB, alle 30 Tage\".\n * Empty leaves the `<small>` out.\n *\n * @default ''\n */\n readonly summary = input('');\n\n /**\n * Hides the bar from 900px on, where `z-price-summary` sticks next to the\n * form. Leave it off for a bulk action bar, which is needed at every width.\n * Boolean attribute.\n *\n * @default false\n */\n readonly mobileOnly = input(false, { transform: booleanAttribute });\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ZIcon } from '../icon';\n\n/**\n * Lists what every plan includes without a surcharge. Three to five entries,\n * each one a concrete part of the product, directly under `z-price-summary`.\n *\n * Renders a `<ul class=\"z-included\">` with a 16px check in `success` per line\n * and the text in `text-muted`. No panel, no heading.\n *\n * Accessibility: the check is decorative (`aria-hidden`), because the list\n * item already says that the entry is included.\n *\n * Only things a customer would otherwise expect to pay extra for. \"Sofort\n * verfügbar\" and \"Jederzeit kündbar\" belong in the note of the summary, and\n * the list appears exactly once per page.\n *\n * @example\n * ```html\n * <z-included-list\n * [items]=\"[\n * 'DDoS-Schutz auf Layer 3/4',\n * 'Webpanel mit Konsole und Dateimanager',\n * 'Automatische Backups',\n * ]\"\n * />\n * ```\n */\n@Component({\n selector: 'z-included-list',\n imports: [ZIcon],\n template: `<ul class=\"z-included\">\n @for (punkt of items(); track $index) {\n <li><z-icon name=\"check\" size=\"sm\" />{{ punkt }}</li>\n }\n </ul>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZIncludedList {\n /**\n * The entries in display order, three to five of them. Tracked by index, so\n * reordering re-renders the lines. An empty array renders an empty `<ul>`.\n *\n * @default []\n */\n readonly items = input<readonly string[]>([]);\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, model, input } from '@angular/core';\n\n/**\n * Folds away settings most visitors do not need: build, Java version, start\n * script. Everything inside has a working default, so nobody has to open it in\n * order to order.\n *\n * Renders a native `<details class=\"z-disclosure\">` with the title in the\n * `<summary>`, the short line in a `<small>` next to it, plus and minus in the\n * mono face, and the projected fields in `.z-disclosure__body`. Unlike `z-faq`\n * it carries a border, because it holds controls.\n *\n * Accessibility: because it is the native element, opening and closing work\n * without JavaScript and the state is announced; the component adds no\n * keyboard handling of its own. The `title` input is kept off the host, so the\n * browser hangs no tooltip of its own on the whole block.\n *\n * Not for required fields, and not to make a long form look shorter. Once\n * something inside is changed, the caller updates {@link summary} so the\n * closed row says so (\"Java 21, eigene Startparameter\").\n *\n * @example\n * ```html\n * <z-disclosure title=\"Expertenmodus\" summary=\"Build, Java-Version, Startscript\" [(open)]=\"expert\">\n * <z-field label=\"Java-Version\" for=\"d-java\">…</z-field>\n * </z-disclosure>\n * ```\n */\n@Component({\n selector: 'z-disclosure',\n template: `<details class=\"z-disclosure\" [open]=\"open()\" (toggle)=\"aufUmschalten($event)\">\n <summary>\n @if (titleMono()) {\n <span class=\"z-mono\">{{ title() }}</span>\n } @else {\n {{ title() }}\n }\n @if (summary()) {\n <small>{{ summary() }}</small>\n }\n </summary>\n <div class=\"z-disclosure__body\"><ng-content /></div>\n </details>`,\n host: {\n // Otherwise the browser hangs its own tooltip on the whole block because\n // of the static attribute title=\"…\".\n '[attr.title]': `null`,\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZDisclosure {\n /**\n * Name of the section in the `<summary>`, for example \"Expertenmodus\".\n *\n * @default ''\n */\n readonly title = input('');\n\n /**\n * Sets the title in the mono face, for a section named by a technical value\n * such as an endpoint (`GET /api/v1/gameservers`). The title then stands in a\n * `span.z-mono` inside the `<summary>`, which keeps it as the accessible name\n * of the disclosure. Boolean attribute.\n *\n * @default false\n */\n readonly titleMono = input(false, { transform: booleanAttribute });\n\n /**\n * What is inside, in keywords, for example \"Build, Java-Version,\n * Startscript\". Once the visitor changes something in there, the caller\n * writes what that was. Empty renders nothing.\n *\n * @default ''\n */\n readonly summary = input('');\n\n /**\n * Whether the section is open, two-way bindable in both directions: a write\n * opens or closes it, and the visitor's own click reports back through the\n * native `toggle` event.\n *\n * @default false\n */\n readonly open = model(false);\n\n protected aufUmschalten(ereignis: Event): void {\n this.open.set((ereignis.target as HTMLDetailsElement).open);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n model,\n output,\n} from '@angular/core';\nimport { ZButton } from '../button';\n\nlet zaehler = 0;\n\n/**\n * A field with a button that checks or applies the value right away: voucher\n * code, subdomain, a player for the whitelist.\n *\n * Renders a `div.z-field` with the visible label, a\n * `div.z-input-action` holding the `input.z-input` and the secondary button,\n * and below it the feedback: the effect in `.z-field__success`, the reason in\n * `.z-field__error`.\n *\n * Accessibility: the label is a real `<label for>`, never only a placeholder,\n * and \"(optional)\" belongs in it. Enter in the field triggers the button, but\n * not on an empty field and not while it is loading. Success and error are\n * always in the DOM as polite live regions (`role=\"status\"`), so a sentence that\n * appears later is announced; both are tied to the field through\n * `aria-describedby`, and an error also sets `aria-invalid` on it. Polite, not\n * `role=\"alert\"`: the answer belongs to an action the visitor just took, so it\n * waits its turn instead of interrupting whatever is being read.\n *\n * @example\n * ```html\n * <z-input-action\n * label=\"Gutscheincode (optional)\"\n * actionLabel=\"Einlösen\"\n * [(value)]=\"code\"\n * [loading]=\"pruefe()\"\n * [success]=\"erfolg()\"\n * [error]=\"fehler()\"\n * (action)=\"einloesen($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'z-input-action',\n imports: [ZButton],\n template: `\n <div class=\"z-field\">\n @if (label()) {\n <label class=\"z-field__label\" [for]=\"feldId\">{{ label() }}</label>\n }\n <div class=\"z-input-action\">\n <input\n class=\"z-input z-input--mono\"\n type=\"text\"\n [id]=\"feldId\"\n [attr.aria-label]=\"label() ? null : ariaLabel() || null\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"feldId + '-success ' + feldId + '-error'\"\n (input)=\"value.set($any($event.target).value)\"\n (keydown.enter)=\"loesAus($event)\"\n />\n <button\n zBtn=\"secondary\"\n type=\"button\"\n [loading]=\"loading()\"\n [disabled]=\"disabled()\"\n (click)=\"loesAus($event)\"\n >\n {{ actionLabel() }}\n </button>\n </div>\n <!-- Both live regions stand in the markup before their sentence does,\n which is what makes a later sentence announce itself. Empty they are\n inline and generate no line box, so the block stays flat; one shared\n grid item keeps it at one gap instead of two. -->\n <div>\n <span class=\"z-field__success\" [id]=\"feldId + '-success'\" role=\"status\">{{\n success()\n }}</span>\n <span class=\"z-field__error\" [id]=\"feldId + '-error'\" role=\"status\">{{ error() }}</span>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZInputAction {\n /**\n * Visible label above the field. \"(optional)\" belongs in here, not in the\n * placeholder. Empty renders no label element.\n *\n * @default ''\n */\n readonly label = input('');\n\n /**\n * Accessible name of the field where {@link label} is empty, for example in a\n * toolbar. A visible label always wins over it.\n *\n * @default ''\n */\n readonly ariaLabel = input('');\n\n /**\n * Caption of the button, a verb: \"Einlösen\", \"Prüfen\", \"Hinzufügen\".\n *\n * @default ''\n */\n readonly actionLabel = input('');\n\n /**\n * What stands in the field, two-way bindable. It is also what {@link action}\n * carries.\n *\n * @default ''\n */\n readonly value = model('');\n\n /**\n * The effect of a successful check, for example \"Gutschein ZENIT10\n * eingelöst: −0,77 €\". Empty leaves the line blank.\n *\n * @default ''\n */\n readonly success = input('');\n\n /**\n * Why the check failed, naming cause and next step. Also sets `aria-invalid`\n * on the field and with it the danger border. Empty leaves the line blank.\n *\n * @default ''\n */\n readonly error = input('');\n\n /**\n * While the check runs: the button shows the spinner and is locked, and\n * Enter in the field triggers nothing. Boolean attribute.\n *\n * @default false\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Locks field and button, for example while the order is being sent. Boolean\n * attribute.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Fires with the current value when the button is pressed or Enter is hit in\n * the field. It does not fire on an empty field and not while\n * {@link loading} holds.\n */\n readonly action = output<string>();\n\n protected readonly feldId = `z-input-action-${++zaehler}`;\n\n protected loesAus(ereignis: Event): void {\n ereignis.preventDefault();\n const wert = this.value().trim();\n if (!wert || this.loading() || this.disabled()) {\n return;\n }\n // The trimmed value, because that is what was checked a line above and\n // what every caller would trim again.\n this.action.emit(wert);\n }\n}\n","/**\n * The two rules of the flex tariff, as pure functions. They are public because\n * a caller computes with them too: a sentence next to the chart, a table in a\n * panel, a check in a test. The geometry that draws the chart from them lives\n * in `cost-chart-math.ts` and is internal.\n */\n\n/** A number that can be used: not NaN, not infinite, not negative. */\nfunction zahl(wert: number): number {\n return Number.isFinite(wert) && wert > 0 ? wert : 0;\n}\n\n/**\n * What a month costs after a number of hours: the base amount plus the hourly\n * price, never more than the cap.\n *\n * @param base Base amount per month.\n * @param rate Price per hour, unrounded.\n * @param cap Upper limit per month. A cap below the base amount wins from hour 0.\n * @param hours Hours played; negative counts as 0.\n * @returns The cost, never negative.\n */\nexport function zCostAt(base: number, rate: number, cap: number, hours: number): number {\n const grund = zahl(base);\n const preis = zahl(rate);\n const deckel = zahl(cap);\n const stunden = zahl(hours);\n const offen = grund + preis * stunden;\n return deckel > 0 ? Math.min(deckel, offen) : offen;\n}\n\n/**\n * The hour from which the cap holds: `(cap - base) / rate`, with the unrounded\n * hourly price. Rounding the price first moves the point, which is why the\n * chart never computes with the displayed value: 0,09 € instead of 0,088 €\n * turns 100 hours into 98.\n *\n * @param base Base amount per month.\n * @param rate Price per hour, unrounded.\n * @param cap Upper limit per month.\n * @returns The hour, `0` when the cap is already reached at hour 0, and `null`\n * when it is never reached, which is the case for a price of 0 per hour.\n */\nexport function zCostCapHour(base: number, rate: number, cap: number): number | null {\n const grund = zahl(base);\n const preis = zahl(rate);\n const deckel = zahl(cap);\n if (deckel <= 0) {\n return null;\n }\n if (deckel <= grund) {\n return 0;\n }\n if (preis <= 0) {\n return null;\n }\n // Rounded to a millionth: (10,30 - 1,50) / 0,088 lands on 100.00000000000001\n // in binary floating point, and a cap hour of \"101\" would follow from it.\n return Math.round(((deckel - grund) / preis) * 1e6) / 1e6;\n}\n","import { zCostAt, zCostCapHour } from './cost-chart-rules';\n\n/**\n * The geometry behind `z-cost-chart`, as pure functions: where the cap takes\n * over, what an hour costs, how that maps onto the drawing area and which\n * ticks the axes get. Nothing in here touches the DOM, so every rule is\n * testable on its own and the component stays a template.\n */\n\n/** The drawing area of a chart, in viewBox units, which are CSS pixels. *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport interface ZChartArea {\n /** Width of the viewBox, which is the measured width of the plot. */\n width: number;\n /** Height of the viewBox. Fixed, so the type never scales. */\n height: number;\n /** Left edge of the plot, where the value axis stands. */\n x0: number;\n /** Right edge of the plot. */\n x1: number;\n /** Baseline of the plot, the zero of the value axis. */\n y0: number;\n /** Top edge of the plot. */\n y1: number;\n}\n\n/**\n * The drawing area of the reference (CostChart/preview.html). It is the width\n * the chart draws with before it has measured itself.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport const Z_CHART_AREA: ZChartArea = {\n width: 520,\n height: 240,\n x0: 48,\n x1: 508,\n y0: 200,\n y1: 20,\n};\n\n/**\n * The drawing area for a measured width. One viewBox unit is one CSS pixel, so\n * the 12px axis type renders at 12px at every width instead of shrinking with\n * a fixed viewBox.\n *\n * @param width Measured width of the plot in CSS pixels.\n * @returns The area; 240px is the floor, so a plot narrower than that draws\n * at 240 units and the svg scales those down rather than letting the type fall\n * below its own size everywhere else.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostArea(width: number): ZChartArea {\n const breite = Math.max(240, Number.isFinite(width) && width > 0 ? width : Z_CHART_AREA.width);\n return { ...Z_CHART_AREA, width: breite, x1: breite - 12 };\n}\n\n/** One tick of an axis: what it says and where it sits. *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport interface ZChartTick {\n /** The value the tick stands for. */\n value: number;\n /** Its coordinate in viewBox units. */\n pos: number;\n}\n\n/** Everything the template of `z-cost-chart` draws, in viewBox units. *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport interface ZChartGeometry {\n /** The drawing area this geometry was built for. */\n area: ZChartArea;\n /** Hours the time axis runs to, at least 1. */\n maxHours: number;\n /** Value the value axis runs to, always above the highest cost drawn. */\n maxValue: number;\n /** Hour from which the cap holds, or `null` when it is never reached on this axis. */\n capHour: number | null;\n /** `x` of that hour, or `null` along with {@link capHour}. */\n capX: number | null;\n /** `y` of the cap line, or `null` when the cap lies outside the value axis. */\n capY: number | null;\n /** The cost line as the `points` of a `<polyline>`. */\n line: string;\n /** `y` of the base amount at hour 0, where the first direct label sits. */\n baseY: number;\n /** Ticks of the value axis, from 0 upwards. */\n valueTicks: ZChartTick[];\n /** Ticks of the time axis, from 0 upwards. */\n hourTicks: ZChartTick[];\n /** Support points of the table below the chart, the cap hour among them. */\n tableHours: number[];\n}\n\n/** A number that can be drawn: not NaN, not infinite, not negative. */\nfunction zahl(wert: number): number {\n return Number.isFinite(wert) && wert > 0 ? wert : 0;\n}\n\n/**\n * Maps an hour onto the horizontal axis.\n *\n * @param hours The hour; outside the axis it is clamped to its edge.\n * @param maxHours Hours the axis runs to.\n * @param area The drawing area, from {@link zCostArea}.\n * @returns The `x` in viewBox units.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostX(hours: number, maxHours: number, area: ZChartArea = Z_CHART_AREA): number {\n const spanne = Math.max(1, zahl(maxHours));\n return area.x0 + (Math.min(Math.max(zahl(hours), 0), spanne) / spanne) * (area.x1 - area.x0);\n}\n\n/**\n * The distance between two ticks of the time axis, wide enough that the labels\n * do not collide: every label needs about 110px of room.\n *\n * @param maxHours Hours the axis runs to.\n * @param plotWidth Width of the plot between the two axes, in pixels. One\n * label needs about 110px of room.\n * @returns The step, always greater than 0, and never below one whole hour.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostHourStep(maxHours: number, plotWidth: number): number {\n const stunden = Math.max(1, zahl(maxHours));\n // One label needs about 110px of room, ticks included, so at 520px four of\n // them fit and at 360px the axis thins itself out instead of colliding.\n const hoechstens = Math.max(2, Math.round(zahl(plotWidth) / 110) + 1);\n let schritt = zCostStep(stunden / Math.max(1, hoechstens - 1));\n // A round step can still yield one tick too many; the next round step up\n // thins the axis without giving up the round numbers.\n while (Math.floor(stunden / schritt) + 1 > hoechstens) {\n schritt = zCostStep(schritt * 2.5);\n }\n // Hours are whole: a quarter-hour tick would read \"0.25 h\".\n return Math.max(1, schritt);\n}\n\n/**\n * Maps an amount onto the vertical axis.\n *\n * @param value The amount; outside the axis it is clamped to its edge.\n * @param maxValue Amount the axis runs to.\n * @returns The `y` in viewBox units.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostY(value: number, maxValue: number, area: ZChartArea = Z_CHART_AREA): number {\n const spanne = Math.max(Number.EPSILON, zahl(maxValue));\n return area.y0 - (Math.min(Math.max(zahl(value), 0), spanne) / spanne) * (area.y0 - area.y1);\n}\n\n/**\n * The largest \"round\" number at or below a span: 1, 2, 2.5 or 5 times a power\n * of ten. It is what makes the ticks read as 0, 5, 10 instead of 0, 4.1, 8.2.\n *\n * @param spanne The span one tick should roughly cover.\n * @returns The step, always greater than 0.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostStep(spanne: number): number {\n const weite = zahl(spanne);\n if (weite <= 0) {\n return 1;\n }\n const zehner = 10 ** Math.floor(Math.log10(weite));\n for (const teil of [5, 2.5, 2, 1]) {\n if (zehner * teil <= weite) {\n return zehner * teil;\n }\n }\n return zehner / 10;\n}\n\n/**\n * The ticks of one axis: 0, step, 2·step … up to the last one that still fits\n * into the span.\n *\n * @param spanne Highest value the axis has to show.\n * @param step Distance between two ticks, from {@link zCostStep}.\n * @returns The values, 0 first, at most twelve of them.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostTicks(spanne: number, step: number): number[] {\n const weite = zahl(spanne);\n const schritt = zahl(step) || 1;\n const ticks: number[] = [];\n for (let wert = 0; wert <= weite + schritt / 1000 && ticks.length < 12; wert += schritt) {\n // Adding a float twelve times drifts; rounding on the step grid does not.\n ticks.push(Math.round(wert / schritt) * schritt);\n }\n return ticks;\n}\n\n/**\n * Everything the chart draws, derived from the four numbers the caller gives.\n *\n * @param base Base amount per month.\n * @param rate Price per hour, unrounded.\n * @param cap Upper limit per month.\n * @param maxHours Hours the time axis runs to; anything at or below 0 becomes 1.\n * @returns The geometry in viewBox units of {@link Z_CHART_AREA}.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostGeometry(\n base: number,\n rate: number,\n cap: number,\n maxHours: number,\n width: number = Z_CHART_AREA.width,\n): ZChartGeometry {\n const area = zCostArea(width);\n const stunden = Math.max(1, zahl(maxHours));\n const grund = zahl(base);\n const deckel = zahl(cap);\n\n const hoechste = Math.max(grund, zCostAt(base, rate, cap, stunden));\n const wertSchritt = zCostStep(hoechste / 2);\n // Half a step of headroom above the highest point, so the direct label of\n // the cap has room and never leaves the plot.\n const maxValue = Math.max(hoechste + wertSchritt / 2, wertSchritt);\n\n const x = (h: number) => zCostX(h, stunden, area);\n const y = (v: number) => zCostY(v, maxValue, area);\n\n const knick = zCostCapHour(base, rate, cap);\n const knickSichtbar = knick !== null && knick <= stunden;\n const punkte = [`${x(0)},${y(zCostAt(base, rate, cap, 0))}`];\n if (knickSichtbar) {\n punkte.push(`${x(knick)},${y(deckel)}`);\n }\n punkte.push(`${x(stunden)},${y(zCostAt(base, rate, cap, stunden))}`);\n\n const stundenSchritt = zCostHourStep(stunden, area.x1 - area.x0);\n\n return {\n area,\n maxHours: stunden,\n maxValue,\n capHour: knickSichtbar ? knick : null,\n capX: knickSichtbar ? x(knick) : null,\n capY: deckel > 0 && deckel <= maxValue ? y(deckel) : null,\n line: punkte.join(' '),\n baseY: y(zCostAt(base, rate, cap, 0)),\n valueTicks: zCostTicks(hoechste, wertSchritt).map((value) => ({ value, pos: y(value) })),\n hourTicks: zCostTicks(stunden, stundenSchritt).map((value) => ({ value, pos: x(value) })),\n tableHours: zCostTableHours(knickSichtbar ? knick : null, stunden),\n };\n}\n\n/**\n * The support points of the table: four hours that carry the shape, the cap\n * hour among them when it lies on the axis.\n *\n * @param capHour The hour the cap takes over, or `null`.\n * @param maxHours Hours the time axis runs to.\n * @returns The hours in ascending order, without duplicates.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostTableHours(capHour: number | null, maxHours: number): number[] {\n // Rounded up, not to the nearest: the cap holds from the hour the line\n // reaches it, and 2,2 h rounded down to 2 would name an hour that still\n // costs less than the cap.\n const ende = capHour !== null && capHour > 0 ? Math.ceil(capHour) : Math.ceil(zahl(maxHours));\n const stufen = [0, Math.round(ende / 4), Math.round(ende / 2), ende];\n return [...new Set(stufen)].sort((a, b) => a - b);\n}\n\n/**\n * The hour a pointer or the keyboard has landed on, as a whole number on the\n * axis.\n *\n * @param anteil Position across the plot, 0 at the left edge, 1 at the right.\n * @param maxHours Hours the time axis runs to.\n * @returns The hour, between 0 and `maxHours`.\n *\n * @internal Geometry of `z-cost-chart`, not part of the public API.\n */\nexport function zCostHourAt(anteil: number, maxHours: number): number {\n const stunden = Math.max(1, zahl(maxHours));\n const teil = Number.isFinite(anteil) ? Math.min(Math.max(anteil, 0), 1) : 0;\n return Math.round(teil * stunden);\n}\n","import {\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n numberAttribute,\n signal,\n viewChild,\n} from '@angular/core';\nimport { injectZLabels } from '../labels';\nimport {\n Z_CHART_AREA,\n zCostArea,\n zCostGeometry,\n zCostHourAt,\n zCostX,\n zCostY,\n} from './cost-chart-math';\nimport { zCostAt } from './cost-chart-rules';\n\nlet zaehler = 0;\n\n/**\n * Shows how flex costs grow with the hours played and where the cap takes\n * over. One series, so no legend and no series colour: the line is 2px in\n * `text`, the cap a dashed line in `border-control`, no fill, no gradient.\n *\n * Renders the class `z-chart` on the host: the two figures above the chart,\n * a plain SVG with grid, axes, line and the two direct labels, the caption as\n * a sentence and a native `details` with the same numbers as a real table.\n *\n * The cap hour is computed, never written down: `(cap − base) / rate` with the\n * unrounded hourly price. The figure above the chart shows that price rounded\n * to the cent, and with those rounded 0,09 € the point would land on 98 hours\n * instead of 100.\n *\n * Accessibility: the SVG carries `<title>` and `<desc>` and is a `role=\"img\"`\n * named by them. The plot around it is the interactive part and therefore not\n * an image: it is a `role=\"slider\"` over the hours, which is exactly the\n * keyboard contract the chart offers (left and right move the hour, Home and\n * End jump to the ends), and `aria-valuetext` reads the tooltip out\n * (\"50 h gespielt: 5,90 €\"). Pointer and focus show the same cursor, the hit\n * area is the whole plot, and the tooltip stays inside it. Below the chart the\n * table carries every number again, for anyone who would rather read than\n * point. Nothing animates.\n *\n * @example\n * ```html\n * <z-cost-chart\n * [base]=\"1.5\"\n * [rate]=\"0.088\"\n * [cap]=\"10.3\"\n * [maxHours]=\"150\"\n * caption=\"Normal mit 4 GB: 1,50 € Grundbetrag plus 0,09 € je Stunde, nie mehr als 10,30 € im Monat.\"\n * />\n * ```\n */\n@Component({\n selector: 'z-cost-chart',\n template: `\n <div class=\"z-chart__figures\">\n <div class=\"z-chart__figure\">\n <span>{{ etiketten.chartPerHour }}</span\n ><strong>{{ etiketten.chartMoney(stundenpreis()) }}</strong>\n </div>\n @if (deckelBetrag() > 0) {\n <div class=\"z-chart__figure\">\n <span>{{ etiketten.chartCapPerMonth }}</span\n ><strong>{{ etiketten.chartMoney(deckelBetrag()) }}</strong>\n </div>\n }\n </div>\n\n <div\n #plot\n class=\"z-chart__plot\"\n tabindex=\"0\"\n role=\"slider\"\n aria-orientation=\"horizontal\"\n [attr.aria-label]=\"etiketten.chartTitle\"\n aria-valuemin=\"0\"\n [attr.aria-valuemax]=\"geometrie().maxHours\"\n [attr.aria-valuenow]=\"stunde()\"\n [attr.aria-valuetext]=\"ablesung()\"\n (pointermove)=\"aufZeiger($event)\"\n (pointerleave)=\"zeiger.set(false)\"\n (focus)=\"zeiger.set(true)\"\n (blur)=\"zeiger.set(false)\"\n (keydown)=\"aufTaste($event)\"\n >\n <svg\n [attr.viewBox]=\"'0 0 ' + flaeche().width + ' ' + flaeche().height\"\n role=\"img\"\n focusable=\"false\"\n [attr.aria-labelledby]=\"titelId + ' ' + beschreibungId\"\n >\n <title [attr.id]=\"titelId\">{{ etiketten.chartTitle }}</title>\n <desc [attr.id]=\"beschreibungId\">{{ satz() }}</desc>\n\n @for (tick of geometrie().valueTicks; track tick.value) {\n <line\n class=\"z-chart__grid\"\n [attr.x1]=\"flaeche().x0\"\n [attr.x2]=\"flaeche().x1\"\n [attr.y1]=\"tick.pos\"\n [attr.y2]=\"tick.pos\"\n />\n <text\n class=\"z-chart__axis\"\n [attr.x]=\"flaeche().x0 - 8\"\n [attr.y]=\"tick.pos + 4\"\n text-anchor=\"end\"\n >\n {{ etiketten.chartAxisMoney(tick.value) }}\n </text>\n }\n @for (tick of geometrie().hourTicks; track tick.value; let letzte = $last) {\n <text\n class=\"z-chart__axis\"\n [attr.x]=\"tick.pos\"\n [attr.y]=\"flaeche().y0 + 24\"\n [attr.text-anchor]=\"letzte ? 'end' : 'middle'\"\n >\n {{ etiketten.chartAxisHours(tick.value) }}\n </text>\n }\n\n @if (geometrie().capY !== null) {\n <line\n class=\"z-chart__cap\"\n [attr.x1]=\"flaeche().x0\"\n [attr.x2]=\"flaeche().x1\"\n [attr.y1]=\"geometrie().capY\"\n [attr.y2]=\"geometrie().capY\"\n />\n }\n <polyline class=\"z-chart__line\" [attr.points]=\"geometrie().line\" />\n @if (geometrie().capX !== null) {\n <circle\n class=\"z-chart__marker\"\n [attr.cx]=\"geometrie().capX\"\n [attr.cy]=\"geometrie().capY\"\n r=\"5\"\n />\n @if (knickStunde() > 0) {\n <text\n class=\"z-chart__label\"\n [attr.x]=\"geometrie().capX\"\n [attr.y]=\"(geometrie().capY ?? 0) - 15\"\n [attr.text-anchor]=\"knickAnker()\"\n >\n {{ etiketten.chartCapLabel(knickStunde()) }}\n </text>\n }\n }\n <text\n class=\"z-chart__label\"\n [attr.x]=\"flaeche().x0 + 8\"\n [attr.y]=\"grundY()\"\n text-anchor=\"start\"\n >\n {{ etiketten.chartBaseLabel(grundbetrag()) }}\n </text>\n\n @if (zeiger()) {\n <line\n class=\"z-chart__cross\"\n [attr.x1]=\"zeigerX()\"\n [attr.x2]=\"zeigerX()\"\n [attr.y1]=\"flaeche().y1\"\n [attr.y2]=\"flaeche().y0\"\n />\n <circle class=\"z-chart__marker\" [attr.cx]=\"zeigerX()\" [attr.cy]=\"zeigerY()\" r=\"5\" />\n }\n </svg>\n @if (zeiger()) {\n <div #tip class=\"z-chart__tip\" [style.left.px]=\"tipLinks()\" [style.top.px]=\"tipOben()\">\n {{ etiketten.chartPlayed(stunde()) }}:\n <strong>{{ etiketten.chartMoney(kostenJetzt()) }}</strong>\n </div>\n }\n </div>\n\n @if (caption()) {\n <span class=\"z-chart__caption\">{{ caption() }}</span>\n }\n\n <details class=\"z-faq\">\n <summary>{{ etiketten.chartTable }}</summary>\n <div class=\"z-table-wrap\">\n <table class=\"z-table\">\n <thead>\n <tr>\n <th scope=\"col\">{{ etiketten.chartTableHours }}</th>\n <th scope=\"col\" class=\"z-table__num\">{{ etiketten.chartTableCost }}</th>\n </tr>\n </thead>\n <tbody>\n @for (stunden of geometrie().tableHours; track stunden; let letzte = $last) {\n <tr>\n <td>\n {{\n letzte && geometrie().capHour !== null\n ? etiketten.chartTableCapRow(stunden)\n : stunden\n }}\n </td>\n <td class=\"z-table__num\">\n {{\n etiketten.chartMoney(\n letzte && geometrie().capHour !== null ? deckelBetrag() : kostenBei(stunden)\n )\n }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </details>\n `,\n host: { class: 'z-chart' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ZCostChart {\n /**\n * Base amount per month, the value the line starts at.\n *\n * @default 0\n */\n readonly base = input(0, { transform: numberAttribute });\n\n /**\n * Price per hour, unrounded. The figure above the chart shows it rounded to\n * the cent; the cap hour is computed from this value, because the rounded\n * one moves the point.\n *\n * @default 0\n */\n readonly rate = input(0, { transform: numberAttribute });\n\n /**\n * Upper limit per month. From the hour it is reached the line runs flat.\n *\n * @default 0\n */\n readonly cap = input(0, { transform: numberAttribute });\n\n /**\n * Hours the time axis runs to. Anything at or below 0 becomes 1.\n *\n * @default 0\n */\n readonly maxHours = input(0, { transform: numberAttribute });\n\n /**\n * One sentence that says the chart in words, below it. Empty leaves it out;\n * the table stays either way.\n *\n * @default ''\n */\n readonly caption = input('');\n\n protected readonly etiketten = injectZLabels();\n protected readonly titelId = `z-chart-t-${++zaehler}`;\n protected readonly beschreibungId = `z-chart-d-${zaehler}`;\n\n private readonly plot = viewChild.required<ElementRef<HTMLElement>>('plot');\n private readonly tip = viewChild<ElementRef<HTMLElement>>('tip');\n\n /** Measured width of the plot. One viewBox unit is one pixel of it. */\n private readonly breite = signal(Z_CHART_AREA.width);\n /** Measured width of the tooltip, so it can be kept inside the plot. */\n private readonly tipBreite = signal(0);\n\n /** The hour the cursor asks for, before the axis has its say. */\n private readonly gewaehlteStunde = signal(0);\n /** Whether cross, dot and tooltip are shown: on hover and while focused. */\n protected readonly zeiger = signal(false);\n\n protected readonly flaeche = computed(() => zCostArea(this.breite()));\n\n protected readonly geometrie = computed(() =>\n zCostGeometry(this.base(), this.rate(), this.cap(), this.maxHours(), this.breite()),\n );\n\n /**\n * The hour under the cursor, clamped to the axis. A shrinking `maxHours`\n * would otherwise leave `aria-valuenow` past `aria-valuemax`.\n */\n protected readonly stunde = computed(() =>\n Math.min(Math.max(this.gewaehlteStunde(), 0), this.geometrie().maxHours),\n );\n\n // Rounded up, like the table: the cap holds from the hour the line reaches it.\n protected readonly knickStunde = computed(() => Math.ceil(this.geometrie().capHour ?? 0));\n\n /** The cap label leaves the plot at the right edge unless the anchor moves. */\n protected readonly knickAnker = computed(() => {\n const flaeche = this.flaeche();\n const x = this.geometrie().capX ?? 0;\n if (x > flaeche.x1 - 80) {\n return 'end';\n }\n return x < flaeche.x0 + 80 ? 'start' : 'middle';\n });\n\n /**\n * The base label sits under the start of the line, and above it where the\n * line starts so low that the label would fall out of the plot.\n */\n protected readonly grundY = computed(() => {\n const y = this.geometrie().baseY;\n return y + 16 > this.flaeche().y0 + 4 ? y - 8 : y + 16;\n });\n\n /**\n * The sentence for the screen reader. Without a cap on the axis it must not\n * claim one, so a second label carries that case. Every number goes through\n * the same guard the drawing uses, so no label ever reads \"NaN\".\n */\n protected readonly satz = computed(() => {\n const geo = this.geometrie();\n const grund = this.zahl(this.base());\n const preis = this.zahl(this.rate());\n if (geo.capHour === null) {\n return this.etiketten.chartDescOpen(grund, preis);\n }\n return this.etiketten.chartDesc(grund, preis, this.zahl(this.cap()), this.knickStunde());\n });\n\n protected readonly kostenJetzt = computed(() => this.kostenBei(this.stunde()));\n\n protected readonly ablesung = computed(\n () =>\n `${this.etiketten.chartPlayed(this.stunde())}: ${this.etiketten.chartMoney(this.kostenJetzt())}`,\n );\n\n protected readonly zeigerX = computed(() =>\n zCostX(this.stunde(), this.geometrie().maxHours, this.flaeche()),\n );\n protected readonly zeigerY = computed(() =>\n zCostY(this.kostenJetzt(), this.geometrie().maxValue, this.flaeche()),\n );\n\n /** Beside the cursor, and inside the plot: measured, not guessed. */\n protected readonly tipLinks = computed(() => {\n const abstand = 8;\n const breite = this.flaeche().width;\n const tip = this.tipBreite();\n const rechts = this.zeigerX() + abstand;\n const links = this.zeigerX() - tip - abstand;\n return Math.max(0, rechts + tip > breite ? Math.min(links, breite - tip) : rechts);\n });\n\n /** Above the dot, never past the top edge of the plot. */\n protected readonly tipOben = computed(() => Math.max(0, this.zeigerY() - 36));\n\n constructor() {\n // The viewBox follows the measured width, so one unit stays one pixel and\n // the 12px axis type is 12px at 360px too. ResizeObserver is missing on the\n // server and in a test environment without layout; the chart then keeps the\n // width of the reference, which is what it renders with anyway.\n const beobachter =\n typeof ResizeObserver === 'undefined'\n ? undefined\n : new ResizeObserver((eintraege) => {\n for (const eintrag of eintraege) {\n // The border box, not contentRect: the tooltip has a border and\n // padding, and clamping it by its content alone lets it hang out\n // of the plot by exactly that much.\n const element = eintrag.target as HTMLElement;\n const breite = element.offsetWidth || eintrag.contentRect.width;\n if (element === this.plot().nativeElement) {\n this.breite.set(breite);\n } else {\n this.tipBreite.set(breite);\n }\n }\n });\n\n afterRenderEffect(() => {\n const tip = this.tip()?.nativeElement;\n beobachter?.observe(this.plot().nativeElement);\n if (tip) {\n beobachter?.observe(tip);\n } else {\n this.tipBreite.set(0);\n }\n });\n\n inject(DestroyRef).onDestroy(() => beobachter?.disconnect());\n }\n\n /** Not NaN, not infinite, not negative: what a label may be handed. */\n private zahl(wert: number): number {\n return Number.isFinite(wert) && wert > 0 ? wert : 0;\n }\n\n protected readonly grundbetrag = computed(() => this.zahl(this.base()));\n protected readonly stundenpreis = computed(() => this.zahl(this.rate()));\n protected readonly deckelBetrag = computed(() => this.zahl(this.cap()));\n\n protected kostenBei(stunden: number): number {\n return zCostAt(this.base(), this.rate(), this.cap(), stunden);\n }\n\n protected aufZeiger(ereignis: PointerEvent): void {\n const kasten = this.plot().nativeElement.getBoundingClientRect();\n if (!kasten.width) {\n return;\n }\n const { x0, x1 } = this.flaeche();\n const inViewBox = ereignis.clientX - kasten.left;\n this.gewaehlteStunde.set(zCostHourAt((inViewBox - x0) / (x1 - x0), this.geometrie().maxHours));\n this.zeiger.set(true);\n }\n\n protected aufTaste(ereignis: KeyboardEvent): void {\n const grenze = this.geometrie().maxHours;\n // About thirty presses cross the whole axis, whatever it runs to.\n const schritt = Math.max(1, Math.round(grenze / 30));\n const ziel: Record<string, number> = {\n ArrowRight: this.stunde() + schritt,\n ArrowUp: this.stunde() + schritt,\n ArrowLeft: this.stunde() - schritt,\n ArrowDown: this.stunde() - schritt,\n Home: 0,\n End: grenze,\n };\n if (!(ereignis.key in ziel)) {\n return;\n }\n ereignis.preventDefault();\n this.gewaehlteStunde.set(Math.min(Math.max(ziel[ereignis.key], 0), grenze));\n this.zeiger.set(true);\n }\n}\n","// Only the component and the two rules a caller computes with leave the\n// package. The geometry behind the chart is marked @internal and stays in\n// cost-chart-math.ts, where the spec imports it directly.\nexport * from './cost-chart-rules';\nexport * from './cost-chart';\n","/* Package konfigurator: OptionCard, Combobox, Wizard, Config, StickyBar,\n IncludedList, Disclosure, InputAction and CostChart.\n\n The two rules of the flex tariff come from their file directly: a re-export\n one level deeper is dropped from the published types. */\nexport * from '../configurator';\nexport * from '../cost-chart';\nexport * from '../cost-chart/cost-chart-rules';\n","/*\n * Plain TypeScript without a single import, on purpose: `ng add zenit-ui`\n * needs the same script, and schematics are compiled apart from the library\n * (CommonJS, no DOM types, `rootDir: schematics`). A byte-identical copy of\n * this file therefore lives at `schematics/ng-add/init-script.ts`; the test in\n * `schematics/ng-add/index.spec.ts` fails as soon as the two differ. Edit this\n * file, then copy it over.\n */\n\n/**\n * The part of the theme configuration that decides which attributes end up on\n * the page. {@link ZThemeConfig} extends it; {@link zenitThemeInitScript}\n * takes exactly this part.\n */\nexport interface ZThemeInitConfig {\n /**\n * Ids of the selectable colour schemes. Each id is written to the target as\n * `data-theme=\"<id>\"` and needs a matching CSS block; the ids shipped with\n * the library are `dark`, `light` and `contrast`. Own ids are allowed and are\n * validated against exactly this list.\n *\n * @default ['dark', 'light', 'contrast']\n */\n readonly schemes?: readonly string[];\n\n /**\n * Ids of the selectable accents, written as `data-accent=\"<id>\"`. The entry\n * named by {@link defaultAccent} carries no attribute, because the default\n * accent already lives in `tokens.css` and in the scheme blocks.\n *\n * @default ['rot', 'blau', 'gruen', 'violett', 'indigo', 'orange', 'rose', 'schwarz']\n */\n readonly accents?: readonly string[];\n\n /**\n * Scheme before the first choice of the user. Either one of {@link schemes}\n * or `'system'`, which follows the operating system: `contrast` while\n * `prefers-contrast: more` matches and `contrast` is one of {@link schemes},\n * otherwise `dark` or `light` after `prefers-color-scheme`.\n *\n * @default 'dark'\n */\n readonly defaultScheme?: string;\n\n /**\n * Accent before the first choice of the user. It has to be one of\n * {@link accents} and gets no `data-accent` attribute.\n *\n * @default 'rot'\n */\n readonly defaultAccent?: string;\n\n /**\n * Key under which the choice is stored in `localStorage`. `null` turns the\n * storage off: nothing is read or written, and `ZTheme` starts from the\n * `data-theme` and `data-accent` that are already on the target, which is how\n * an application with its own preference storage hands its choice over.\n * Without such attributes the theme starts from the defaults on every load.\n * The init script does not look at them, it always writes the defaults.\n *\n * @default 'zenit-theme'\n */\n readonly storageKey?: string | null;\n}\n\n/** @internal Defaults shared by `ZTheme` and the init script. */\nexport const THEME_STANDARD: Required<ZThemeInitConfig> = {\n schemes: ['dark', 'light', 'contrast'],\n accents: ['rot', 'blau', 'gruen', 'violett', 'indigo', 'orange', 'rose', 'schwarz'],\n defaultScheme: 'dark',\n defaultAccent: 'rot',\n storageKey: 'zenit-theme',\n};\n\n/** @internal The scheme id that hands the decision to the operating system. */\nexport const SCHEMA_SYSTEM = 'system';\n/** @internal The scheme `system` resolves to while `prefers-contrast: more` matches. */\nexport const SCHEMA_KONTRAST = 'contrast';\n/** @internal */\nexport const SCHEMA_DUNKEL = 'dark';\n/** @internal */\nexport const SCHEMA_HELL = 'light';\n/** @internal */\nexport const ABFRAGE_DUNKEL = '(prefers-color-scheme: dark)';\n/** @internal */\nexport const ABFRAGE_KONTRAST = '(prefers-contrast: more)';\n/** @internal */\nexport const ATTRIBUT_SCHEMA = 'data-theme';\n/** @internal */\nexport const ATTRIBUT_AKZENT = 'data-accent';\n\n/** @internal Merges a config onto the defaults, ignoring fields left out or `undefined`. */\nexport function themeEinstellung<T extends ZThemeInitConfig>(\n config: T,\n): T & Required<ZThemeInitConfig> {\n const gesetzt = Object.fromEntries(\n Object.entries(config).filter(([, wert]) => wert !== undefined),\n ) as T;\n return { ...THEME_STANDARD, ...gesetzt };\n}\n\n/**\n * The script body. Written for every browser that can run the library and a\n * few older ones (no arrow functions, no `let`), because it runs before any\n * build step had a say. It mirrors what `ZTheme` does on start: read the stored\n * choice, drop unknown ids, resolve `system`, write `data-theme` and, unless\n * the accent is the default, `data-accent` onto `<html>`. Without `matchMedia`\n * `system` resolves to `dark`, as in the service.\n */\nconst RUMPF =\n '(function(k,S,A,ds,da){' +\n 'var s=ds,a=da,d=document.documentElement,' +\n 'm=function(q,f){try{return matchMedia(q).matches}catch(e){return f}};' +\n \"try{var v=JSON.parse((k&&localStorage.getItem(k))||'null');\" +\n \"if(v&&typeof v==='object'){\" +\n `if(v.scheme==='${SCHEMA_SYSTEM}'||S.indexOf(v.scheme)>-1)s=v.scheme;` +\n 'if(A.indexOf(v.accent)>-1)a=v.accent}}catch(e){}' +\n `if(s==='${SCHEMA_SYSTEM}')s=S.indexOf('${SCHEMA_KONTRAST}')>-1&&m('${ABFRAGE_KONTRAST}',false)?'${SCHEMA_KONTRAST}':` +\n `m('${ABFRAGE_DUNKEL}',true)?'${SCHEMA_DUNKEL}':'${SCHEMA_HELL}';` +\n `d.setAttribute('${ATTRIBUT_SCHEMA}',s);` +\n `if(a!==da)d.setAttribute('${ATTRIBUT_AKZENT}',a)` +\n '})';\n\n/**\n * JSON that is safe inside `<script>`: `<` would close the element\n * (`</script>`, `<!--`), U+2028 and U+2029 end a line in old engines. The\n * pattern is built here and not at module level, so an application that never\n * calls the function does not keep it in its bundle.\n */\nfunction alsLiteral(wert: unknown): string {\n const heikel = new RegExp('[<' + String.fromCharCode(0x2028, 0x2029) + ']', 'g');\n return JSON.stringify(wert).replace(\n heikel,\n (zeichen) => '\\\\u' + zeichen.charCodeAt(0).toString(16).padStart(4, '0'),\n );\n}\n\n/**\n * Returns the source of a small script that applies the stored or the default\n * theme before the first paint. `ZTheme` can only do that once Angular has\n * started, which is several frames late: a user who chose `light` would see\n * the dark default flash on every load.\n *\n * Put the result into a `<script>` as early in `<head>` as possible, in front\n * of every stylesheet, and pass the same config as to `provideZenitTheme`. The\n * script always writes to `<html>`; with a custom `target` it is of no use.\n * It is a pure string function: no DOM access, safe on the server and in a\n * build script, and the result contains no `eval`.\n *\n * The stylesheet has to block rendering as well. The Angular CLI inlines\n * \"critical\" CSS and loads the rest late; `[data-theme=\"light\"]` is never\n * critical, because nothing in `index.html` matches it. Set\n * `optimization.styles.inlineCritical` to `false` in the `production`\n * configuration of the build target; `ng add zenit-ui --themes` writes both\n * the script and that setting.\n *\n * With a Content Security Policy the returned string is what you hash\n * (`sha256`) or what goes into the `<script nonce=\"…\">` element.\n *\n * @param config The same values as for `provideZenitTheme`; `target` is ignored.\n * @returns The script body, without the `<script>` tags.\n *\n * @example\n * ```ts\n * // server.ts or a build script\n * const head = `<script nonce=\"${nonce}\">${zenitThemeInitScript({ defaultScheme: 'system' })}</script>`;\n * ```\n */\nexport function zenitThemeInitScript(config: ZThemeInitConfig = {}): string {\n const e = themeEinstellung(config);\n const argumente = [e.storageKey, e.schemes, e.accents, e.defaultScheme, e.defaultAccent].map(\n alsLiteral,\n );\n return `${RUMPF}(${argumente.join(',')})`;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n DestroyRef,\n DOCUMENT,\n EnvironmentProviders,\n InjectionToken,\n PLATFORM_ID,\n Service,\n computed,\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n signal,\n} from '@angular/core';\nimport {\n ABFRAGE_DUNKEL,\n ABFRAGE_KONTRAST,\n ATTRIBUT_AKZENT,\n ATTRIBUT_SCHEMA,\n SCHEMA_DUNKEL,\n SCHEMA_HELL,\n SCHEMA_KONTRAST,\n SCHEMA_SYSTEM,\n ZThemeInitConfig,\n themeEinstellung,\n} from './init-script';\n\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * Configuration of {@link provideZenitTheme}. Every field is optional; the\n * defaults match the stylesheets shipped in `zenit-ui/styles/themes.css`.\n *\n * @example\n * ```ts\n * provideZenitTheme({\n * schemes: ['dark', 'light', 'contrast', 'sepia'],\n * defaultScheme: 'system',\n * storageKey: 'meine-app-theme',\n * });\n * ```\n */\nexport interface ZThemeConfig extends ZThemeInitConfig {\n /**\n * Element that carries `data-theme` and `data-accent`. A getter, not the\n * element, so nothing touches the DOM while the providers are built; it is\n * called on the browser only. Return a stable element: when the getter\n * starts returning another one, the attributes are removed from the previous\n * element on the next change, not before. `zenitThemeInitScript` and the\n * server-side rendering of `data-theme` only know `<html>` and are skipped\n * for a custom target.\n *\n * @default () => document.documentElement\n */\n readonly target?: () => Element;\n}\n\nconst Z_THEME_CONFIG = new InjectionToken<ZThemeConfig>('Z_THEME_CONFIG', {\n providedIn: 'root',\n factory: () => ({}),\n});\n\n/** The config each service instance was built from, for the check in the provider. */\nconst GENUTZTE_CONFIG = /* @__PURE__ */ new WeakMap<object, ZThemeConfig>();\n\n/** Dev-mode only; production builds drop the branch together with `ngDevMode`. */\nfunction warnen(text: string): void {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n console.warn(`zenit-ui: ${text}`);\n }\n}\n\n/**\n * Registers the theme of the library and applies the stored or the default\n * choice as soon as the application starts. Without this provider `ZTheme`\n * still works, but with the defaults and nothing applied up front.\n *\n * Application root only. `ZTheme` is a root service and reads the config of\n * the root injector once; a second `provideZenitTheme` in the `providers` of a\n * route (or a second one at the root) is ignored, with a `console.warn` in dev\n * mode.\n *\n * \"As soon as the application starts\" is still several frames after the first\n * paint. To avoid a flash of the default scheme put the output of\n * {@link zenitThemeInitScript} as an inline `<script>` at the top of the\n * `<head>` of `index.html`, in front of every stylesheet, and pass it the same\n * config as this function.\n *\n * The stylesheets are not part of this: register\n * `zenit-ui/styles/themes.css` after `zenit-ui/styles/tokens.css` and before\n * `zenit-ui/styles/zenit-ui.css`. Without it only the `dark` scheme exists and\n * `setScheme('light')` changes nothing visible.\n *\n * **The page width is not an option here, and deliberately so.** It is the\n * custom property `--container`, the only value `.z-container` reads, and an\n * application sets it once in its own stylesheet, after `zenit-ui.css`:\n * `:root { --container: 1440px; }`. Use `:root`, not `html`: `:root` is a\n * pseudo-class and weighs as much as the block in\n * `zenit-ui/styles/tokens.css`, so the later declaration wins, while a bare\n * `html` selector weighs less and would lose wherever it stood. An option here\n * would have to write an inline style, which can never arrive earlier than\n * that stylesheet: unlike a colour scheme the width does not depend on a\n * stored user choice, so there is no flash to prevent, on the server or in the\n * browser, and `zenitThemeInitScript` takes no width either. Running text\n * keeps `--measure` (65ch) however wide the page gets; a sidebar\n * (`--sidebar`), the aside of a configurator and every overlay keep their own\n * width as well. An application that changes the width while the page is open\n * writes the inline style itself.\n *\n * @default --container 1120px, from `zenit-ui/styles/tokens.css`\n *\n * @param config Deviations from the defaults; see {@link ZThemeConfig}.\n * @returns Providers for the application root (`bootstrapApplication`).\n *\n * @example\n * ```ts\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [provideRouter(routes), provideZenitTheme({ defaultScheme: 'system' })],\n * };\n * ```\n */\nexport function provideZenitTheme(config: ZThemeConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: Z_THEME_CONFIG, useValue: config },\n provideEnvironmentInitializer(() => {\n if (GENUTZTE_CONFIG.get(inject(ZTheme)) !== config) {\n warnen(\n 'provideZenitTheme() was called more than once or outside the application root. ' +\n 'ZTheme is a root service and uses one config only; this one is ignored.',\n );\n }\n }),\n ]);\n}\n\n/**\n * Reads and switches the colour scheme and the accent. The service owns three\n * readonly signals and three methods; everything else is CSS.\n *\n * What it does on the browser: it writes `data-theme` and `data-accent` onto\n * the target element, keeps the choice in `localStorage`, follows a change made\n * in another tab (`storage` event), and while the scheme is `'system'` it\n * follows `prefers-color-scheme` and `prefers-contrast` live. With\n * `storageKey: null` it never touches `localStorage` and starts from the\n * attributes that are already on the target, if they name registered ids. On the server\n * `window`, `matchMedia` and `localStorage` are never touched, so the service\n * is safe to inject during SSR and reports the defaults. The one thing it does\n * there: a `defaultScheme` other than `'system'` is written as `data-theme`\n * onto `<html>` of the server document, so the delivered HTML already carries\n * it.\n *\n * Unknown ids are rejected: {@link setScheme} and {@link setAccent} return\n * `false` and change nothing. They do not throw, because the usual caller is a\n * `<select>` whose value comes from outside the application (a stored value, a\n * query parameter) and a broken value there must not take the page down; in\n * dev mode a `console.warn` names the id. A stored unknown id is ignored the\n * same way.\n *\n * @example\n * ```ts\n * @Component({\n * selector: 'app-theme-switch',\n * template: `\n * <select [value]=\"theme.scheme()\" (change)=\"waehlen($event)\">\n * <option value=\"dark\">Dunkel</option>\n * <option value=\"light\">Hell</option>\n * <option value=\"system\">System</option>\n * </select>\n * <p>Aktiv: {{ theme.resolvedScheme() }}</p>\n * `,\n * })\n * export class ThemeSwitch {\n * protected readonly theme = inject(ZTheme);\n *\n * protected waehlen(event: Event): void {\n * this.theme.setScheme((event.target as HTMLSelectElement).value);\n * }\n * }\n * ```\n */\n@Service()\nexport class ZTheme {\n private readonly dok = inject(DOCUMENT);\n private readonly imBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly config = inject(Z_THEME_CONFIG);\n private readonly einst = themeEinstellung(this.config);\n\n private readonly gewaehltesSchema = signal(this.einst.defaultScheme);\n private readonly gewaehlterAkzent = signal(this.einst.defaultAccent);\n private readonly systemDunkel = signal(true);\n private readonly systemKontrast = signal(false);\n\n /** The element written to last, so a changed `target` leaves no attributes behind. */\n private letztesZiel: Element | null = null;\n\n /**\n * The chosen scheme, exactly as it was set: one of `schemes`, or `'system'`\n * while the operating system decides. For what is actually on the page, read\n * {@link resolvedScheme}.\n */\n readonly scheme = this.gewaehltesSchema.asReadonly();\n\n /**\n * The chosen accent. The default accent is a value here as well, even though\n * it carries no attribute on the target.\n */\n readonly accent = this.gewaehlterAkzent.asReadonly();\n\n /**\n * The scheme that is applied. Equal to {@link scheme}, except for `'system'`:\n * that resolves to `'contrast'` while `prefers-contrast: more` matches and\n * `'contrast'` is one of `schemes`, otherwise to `'dark'` or `'light'` after\n * `prefers-color-scheme`. Both follow a change without a reload.\n */\n readonly resolvedScheme = computed(() => this.aufgeloest(this.gewaehltesSchema()));\n\n private aufgeloest(gewaehlt: string): string {\n if (gewaehlt !== SCHEMA_SYSTEM) {\n return gewaehlt;\n }\n if (this.systemKontrast() && this.einst.schemes.includes(SCHEMA_KONTRAST)) {\n return SCHEMA_KONTRAST;\n }\n return this.systemDunkel() ? SCHEMA_DUNKEL : SCHEMA_HELL;\n }\n\n constructor() {\n GENUTZTE_CONFIG.set(this, this.config);\n if (!this.kenntSchema(this.einst.defaultScheme)) {\n warnen(`defaultScheme \"${this.einst.defaultScheme}\" is neither \"system\" nor one of schemes.`);\n }\n if (!this.einst.accents.includes(this.einst.defaultAccent)) {\n warnen(`defaultAccent \"${this.einst.defaultAccent}\" is not one of accents.`);\n }\n\n if (!this.imBrowser) {\n // The server knows neither the stored choice nor the operating system,\n // so only a fixed default can go into the HTML. A custom target is a\n // browser-only getter and stays untouched.\n if (!this.einst.target && this.einst.defaultScheme !== SCHEMA_SYSTEM) {\n this.dok.documentElement?.setAttribute(ATTRIBUT_SCHEMA, this.einst.defaultScheme);\n }\n return;\n }\n\n const zerstoert = inject(DestroyRef);\n const fenster = this.dok.defaultView;\n const folgen = (abfrageText: string, ziel: { set(wert: boolean): void }) => {\n const abfrage = fenster?.matchMedia?.(abfrageText);\n if (!abfrage) {\n return;\n }\n ziel.set(abfrage.matches);\n const beiWechsel = (ereignis: MediaQueryListEvent) => {\n ziel.set(ereignis.matches);\n this.anwenden();\n };\n // Optional calls: test doubles and old engines only know addListener.\n abfrage.addEventListener?.('change', beiWechsel);\n zerstoert.onDestroy(() => abfrage.removeEventListener?.('change', beiWechsel));\n };\n folgen(ABFRAGE_DUNKEL, this.systemDunkel);\n folgen(ABFRAGE_KONTRAST, this.systemKontrast);\n\n const key = this.einst.storageKey;\n if (key && fenster) {\n // Another tab changed or dropped the choice. `key` is null after clear().\n const beiSpeicher = (ereignis: StorageEvent) => {\n if (ereignis.key === null || ereignis.key === key) {\n this.uebernehmen();\n }\n };\n fenster.addEventListener('storage', beiSpeicher);\n zerstoert.onDestroy(() => fenster.removeEventListener('storage', beiSpeicher));\n }\n\n this.uebernehmen();\n }\n\n /**\n * Switches the scheme and stores the choice.\n *\n * @param id One of `schemes`, or `'system'`.\n * @returns `false` if the id is unknown; nothing changes then.\n */\n setScheme(id: string): boolean {\n if (!this.kenntSchema(id)) {\n warnen(`setScheme(\"${id}\") ignored, the id is neither \"system\" nor one of schemes.`);\n return false;\n }\n this.gewaehltesSchema.set(id);\n this.sichern();\n this.anwenden();\n return true;\n }\n\n /**\n * Switches the accent and stores the choice.\n *\n * @param id One of `accents`.\n * @returns `false` if the id is unknown; nothing changes then.\n */\n setAccent(id: string): boolean {\n if (!this.einst.accents.includes(id)) {\n warnen(`setAccent(\"${id}\") ignored, the id is not one of accents.`);\n return false;\n }\n this.gewaehlterAkzent.set(id);\n this.sichern();\n this.anwenden();\n return true;\n }\n\n /** Back to `defaultScheme` and `defaultAccent` and drops the stored choice. */\n reset(): void {\n this.gewaehltesSchema.set(this.einst.defaultScheme);\n this.gewaehlterAkzent.set(this.einst.defaultAccent);\n this.vergessen();\n this.anwenden();\n }\n\n private kenntSchema(id: string): boolean {\n return id === SCHEMA_SYSTEM || this.einst.schemes.includes(id);\n }\n\n /** Takes the stored choice, the defaults where nothing valid is stored, and applies it. */\n private uebernehmen(): void {\n const gespeichert = this.einst.storageKey ? this.lesen() : this.vomZiel();\n const schema = gespeichert?.scheme;\n const akzent = gespeichert?.accent;\n this.gewaehltesSchema.set(\n typeof schema === 'string' && this.kenntSchema(schema) ? schema : this.einst.defaultScheme,\n );\n this.gewaehlterAkzent.set(\n typeof akzent === 'string' && this.einst.accents.includes(akzent)\n ? akzent\n : this.einst.defaultAccent,\n );\n this.anwenden();\n }\n\n /**\n * Without a storage key the attributes already on the target are the stored\n * choice: an application that keeps its own preference storage writes them\n * with its own inline script before the first paint, and overwriting them\n * with the defaults would flash the default scheme until that application\n * calls `setScheme()`.\n *\n * An attribute only carries a resolved scheme. One that equals what the\n * default resolves to is therefore no choice at all: it is what the init\n * script or the server wrote, and `system` has to stay `system` to keep\n * following the operating system.\n */\n private vomZiel(): { scheme?: unknown; accent?: unknown } {\n const ziel = this.einst.target ? this.einst.target() : this.dok.documentElement;\n const schema = ziel.getAttribute(ATTRIBUT_SCHEMA);\n return {\n scheme: schema === this.aufgeloest(this.einst.defaultScheme) ? null : schema,\n accent: ziel.getAttribute(ATTRIBUT_AKZENT),\n };\n }\n\n /**\n * Writes both attributes. The default accent gets none, so a page without a\n * choice looks exactly like a page that never heard of this service.\n */\n private anwenden(): void {\n if (!this.imBrowser) {\n return;\n }\n const ziel = this.einst.target ? this.einst.target() : this.dok.documentElement;\n if (this.letztesZiel && this.letztesZiel !== ziel) {\n this.letztesZiel.removeAttribute(ATTRIBUT_SCHEMA);\n this.letztesZiel.removeAttribute(ATTRIBUT_AKZENT);\n }\n this.letztesZiel = ziel;\n ziel.setAttribute(ATTRIBUT_SCHEMA, this.resolvedScheme());\n if (this.gewaehlterAkzent() === this.einst.defaultAccent) {\n ziel.removeAttribute(ATTRIBUT_AKZENT);\n } else {\n ziel.setAttribute(ATTRIBUT_AKZENT, this.gewaehlterAkzent());\n }\n }\n\n /**\n * `localStorage` throws in a private window and when site data is blocked,\n * and it is the property access itself that throws (`SecurityError`).\n */\n private speicher(): Storage | null {\n if (!this.imBrowser || !this.einst.storageKey) {\n return null;\n }\n try {\n return this.dok.defaultView?.localStorage ?? null;\n } catch {\n return null;\n }\n }\n\n private lesen(): { scheme?: unknown; accent?: unknown } | null {\n const key = this.einst.storageKey;\n if (!key) {\n return null;\n }\n try {\n const roh = this.speicher()?.getItem(key);\n const wert: unknown = roh ? JSON.parse(roh) : null;\n return wert && typeof wert === 'object' ? wert : null;\n } catch {\n return null;\n }\n }\n\n private sichern(): void {\n const key = this.einst.storageKey;\n if (!key) {\n return;\n }\n try {\n this.speicher()?.setItem(\n key,\n JSON.stringify({ scheme: this.gewaehltesSchema(), accent: this.gewaehlterAkzent() }),\n );\n } catch {\n // Private window, quota, blocked site data: the theme still works, it\n // just does not survive the reload.\n }\n }\n\n private vergessen(): void {\n const key = this.einst.storageKey;\n if (!key) {\n return;\n }\n try {\n this.speicher()?.removeItem(key);\n } catch {\n // See sichern().\n }\n }\n}\n","/* Package theming: ZTheme and provideZenitTheme.\n\n The colour values themselves are CSS: zenit-ui/styles/themes.css next to\n tokens.css. This package only switches between them. See docs/theming.md. */\n\nexport * from '../theme';\n","/*\n * Public API of the zenit-ui library.\n */\n\nexport * from './lib/icon';\nexport * from './lib/spinner';\nexport * from './lib/button';\nexport * from './lib/badge';\nexport * from './lib/field';\nexport * from './lib/panel';\nexport * from './lib/skip-link';\n\nexport * from './lib/pakete/formulare';\nexport * from './lib/pakete/navigation';\nexport * from './lib/pakete/daten';\nexport * from './lib/pakete/rueckmeldung';\nexport * from './lib/pakete/overlays';\nexport * from './lib/pakete/werkzeuge';\nexport * from './lib/pakete/konfigurator';\n\nexport * from './lib/labels';\nexport * from './lib/pakete/theming';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["laufendeNummer","zaehler","unbewegt","zahl"],"mappings":"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"}