@skra/ui 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/consumer-guide/README.md +3 -1
- package/consumer-guide/accessible-names.md +2 -1
- package/consumer-guide/feedback.md +100 -0
- package/fesm2022/skra-ui-alert.mjs +55 -6
- package/fesm2022/skra-ui-alert.mjs.map +1 -1
- package/fesm2022/skra-ui-button.mjs +2 -2
- package/fesm2022/skra-ui-button.mjs.map +1 -1
- package/fesm2022/skra-ui-chip.mjs +2 -2
- package/fesm2022/skra-ui-chip.mjs.map +1 -1
- package/fesm2022/skra-ui-core.mjs +2 -2
- package/fesm2022/skra-ui-core.mjs.map +1 -1
- package/fesm2022/skra-ui-toast.mjs +2 -2
- package/fesm2022/skra-ui-toast.mjs.map +1 -1
- package/package.json +2 -2
- package/types/skra-ui-alert.d.ts +39 -2
- package/types/skra-ui-alert.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skra-ui-core.mjs","sources":["../../../../libs/ui/core/src/lib/select/select-types.ts","../../../../libs/ui/core/src/lib/select/option.directives.ts","../../../../libs/ui/core/src/lib/select/option.ts","../../../../libs/ui/core/src/lib/select/select-trigger.ts","../../../../libs/ui/core/src/lib/positioning/positioner.ts","../../../../libs/ui/core/src/lib/select/listbox-keyboard.ts","../../../../libs/ui/core/src/lib/select/listbox-widget-base.ts","../../../../libs/ui/core/src/lib/select/select-base.ts","../../../../libs/ui/core/src/index.ts","../../../../libs/ui/core/src/skra-ui-core.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * What a `skra-option` needs from its listbox parent — a narrow contract that breaks the\n * parent↔option import cycle (the `SKRA_MENU` precedent). A token (not a concrete class) so the option\n * file never imports a widget file — no runtime import cycle. Implemented by `_SkraListboxWidgetBase`,\n * so it is shared by `skra-select`, `skra-multi-select` AND `skra-combobox` (ADR 0046 amendment).\n */\nexport interface SkraListboxPanel {\n /** Live selection test for an option's value (signal-driven: default `Object.is` or consumer `compareWith`). */\n isSelected(value: unknown): boolean;\n /**\n * A user picked this value (pointer/keyboard). Single-select emits `valueChange` + closes; multi-select\n * TOGGLES membership and keeps the panel open (ADR 0046); combobox replaces + closes (ADR 0049).\n * Consumer owns `value` (ADR 037).\n */\n selectValue(value: unknown): void;\n /**\n * Cardinality hint (ADR 0046) — `false` on single widgets (`skra-select`/`skra-combobox`), `true` on\n * `skra-multi-select`. The ONLY thing `skra-option` reads to swap its component-rendered indicator\n * (checkmark ↔ checkbox). NOT an Angular input; cardinality is a component identity, never a runtime flag.\n */\n readonly multiple: boolean;\n}\n\n/**\n * The item shape the listbox keyboard controller drives. Structurally a CDK `Highlightable`\n * (`setActiveStyles`/`setInactiveStyles`) + `ListKeyManagerOption` (`getLabel`/`disabled`), plus the\n * option's `id` (→ `aria-activedescendant`) and `getValue()` (Enter-to-select). Declared HERE — cdk-free —\n * so the only `@angular/cdk` importer stays `listbox-keyboard.ts` (the `menu-types.ts` precedent).\n */\nexport interface SkraListboxKeyboardItem {\n readonly optionId: string;\n setActiveStyles(): void;\n setInactiveStyles(): void;\n getLabel(): string;\n getValue(): unknown;\n readonly disabled: boolean;\n}\n\n/**\n * DI token a listbox widget provides (`useExisting`) and a `skra-option` injects. A token (not a concrete\n * class) so the option file never imports a widget file — no runtime import cycle. Provided by\n * `skra-select`, `skra-multi-select`, and `skra-combobox`.\n */\nexport const SKRA_LISTBOX_PANEL = new InjectionToken<SkraListboxPanel>(\n 'SKRA_LISTBOX_PANEL',\n);\n","import { Directive } from '@angular/core';\n\n/**\n * Slot marker: the leading icon/flag of a `skra-option` — part of the option IDENTITY (ADR 0045\n * Rule 4), so it flows into `getLabel()` (emoji/glyph leading appears in the default trigger for free).\n */\n@Directive({\n selector: '[skra-option-leading]',\n standalone: true,\n})\nexport class SkraOptionLeading {}\n\n/**\n * Slot marker: secondary DETAIL text of a `skra-option` (e.g. a dial code, a description) — list-only\n * (ADR 0045 Rule 4), EXCLUDED from `getLabel()` and the trigger summary.\n */\n@Directive({\n selector: '[skra-option-detail]',\n standalone: true,\n})\nexport class SkraOptionDetail {}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n contentChild,\n inject,\n input,\n signal,\n} from '@angular/core';\n\nimport {\n SKRA_LISTBOX_PANEL,\n type SkraListboxKeyboardItem,\n} from './select-types';\nimport { SkraOptionDetail, SkraOptionLeading } from './option.directives';\n\ndeclare const ngDevMode: boolean | undefined;\n\nlet nextOptionId = 0;\n\n/**\n * SkraOption — one selectable row in a `skra-select` listbox, a Component on the custom-element host\n * `skra-option` (ADR 040 content-bearing host; there is no native option element that holds rich content\n * outside `<select>`). Carries `value` + rich projected content: a leading icon (`[skra-option-leading]`)\n * and a primary label = the IDENTITY (→ `getLabel()` / the default trigger, ADR 0045), plus an optional\n * secondary `[skra-option-detail]` that is list-only (excluded from the trigger). The selection\n * indicator (trailing checkmark) is component-rendered, driven by `aria-selected` — NOT a slot; iteration 2\n * swaps it for a per-row checkbox with no API change.\n *\n * Implements `SkraListboxKeyboardItem` so `_SkraListboxKeyboard` (CDK `ActiveDescendantKeyManager`) can\n * highlight it (`setActiveStyles`/`setInactiveStyles` → `data-skra-active`) and type-ahead to it\n * (`getLabel`). Disabled is native-attr-first (Menu precedent): the consumer sets `aria-disabled=\"true\"`\n * and Forge OBSERVES it — disabled options stay navigable (discoverable) but cannot be selected.\n *\n * Full contract: adr/specs/component-select-spec.md.\n */\n@Component({\n selector: 'skra-option',\n standalone: true,\n exportAs: 'skraOption',\n template: `\n @if (hasLeading()) {\n <span class=\"skra-select-option-leading\"\n ><ng-content select=\"[skra-option-leading]\"></ng-content\n ></span>\n }\n <span class=\"skra-select-option-label\"><ng-content></ng-content></span>\n @if (hasDetail()) {\n <span class=\"skra-select-option-detail\"\n ><ng-content select=\"[skra-option-detail]\"></ng-content\n ></span>\n }\n <span\n class=\"skra-select-option-indicator\"\n [class.skra-select-option-indicator--checkbox]=\"multiple()\"\n aria-hidden=\"true\"\n ></span>\n `,\n styleUrl: './option.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n role: 'option',\n '[id]': 'optionId',\n '[attr.aria-selected]': 'selected() ? \"true\" : \"false\"',\n '[attr.data-skra-active]': 'active() ? \"\" : null',\n '(click)': 'onActivate()',\n // Disabled = the consumer's native `aria-disabled=\"true\"` (observed live) — no Forge binding.\n },\n})\nexport class SkraOption<T = unknown> implements SkraListboxKeyboardItem {\n /** The option's value (ADR 037 — consumer-owned; compared against the select's `value()`). */\n readonly value = input.required<T>();\n\n /** Stable id, the target of the trigger's `aria-activedescendant`. Internal — never consumer-facing. */\n readonly optionId = `skra-option-${nextOptionId++}`;\n\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly select = inject(SKRA_LISTBOX_PANEL, { optional: true });\n\n private readonly leadingSlot = contentChild(SkraOptionLeading);\n private readonly detailSlot = contentChild(SkraOptionDetail);\n protected readonly hasLeading = computed(() => !!this.leadingSlot());\n protected readonly hasDetail = computed(() => !!this.detailSlot());\n\n /** Keyboard active-descendant highlight (ADR 0044 §7 — Highlightable, NOT roving focus). */\n protected readonly active = signal(false);\n\n /**\n * Cardinality hint from the parent panel (ADR 0046): `false` under `skra-select` → checkmark\n * indicator; `true` under `skra-multi-select` → checkbox indicator. The only thing the shared\n * `skra-option` reads to swap the component-rendered indicator. No public-API change.\n */\n protected readonly multiple = computed(() => this.select?.multiple ?? false);\n\n /** Selection is signal-derived (ADR 0045 / ADR 037): re-derives on parent `value()`/`compareWith()` or own `value()`. */\n protected readonly selected = computed(\n () => this.select?.isSelected(this.value()) ?? false,\n );\n\n constructor() {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!this.select) {\n console.warn(\n '[skra-option] has no <skra-select> ancestor — it is not registered with the keyboard ' +\n 'controller / selection model and cannot be picked. Project it inside a <skra-select>.',\n );\n }\n }\n }\n\n // ── SkraListboxKeyboardItem (driven by _SkraListboxKeyboard / CDK ActiveDescendantKeyManager) ──\n setActiveStyles(): void {\n this.active.set(true);\n }\n setInactiveStyles(): void {\n this.active.set(false);\n }\n\n /**\n * ADR 0045 Rule 1: the option's IDENTITY text (leading + label), EXCLUDING `[skra-option-detail]` and\n * the component-rendered indicator. Own-host `textContent` walk (the `skraMenuItem.getLabel()`\n * precedent) — drives the default trigger text AND type-ahead. Reading own content, NOT\n * `document.querySelector` (ADR 001-clean).\n */\n getLabel(): string {\n let text = '';\n const skip = (el: HTMLElement): boolean =>\n el.classList.contains('skra-select-option-detail') ||\n el.classList.contains('skra-select-option-indicator') ||\n el.hasAttribute('skra-option-detail');\n const walk = (node: Node): void => {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent ?? '';\n return;\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (skip(el)) return;\n el.childNodes.forEach(walk);\n }\n };\n this.el.nativeElement.childNodes.forEach(walk);\n return text.replace(/\\s+/g, ' ').trim();\n }\n\n getValue(): unknown {\n return this.value();\n }\n\n /** Soft-disabled = the consumer's `aria-disabled=\"true\"` (native-attr-first, Menu precedent); read live. */\n get disabled(): boolean {\n return this.el.nativeElement.getAttribute('aria-disabled') === 'true';\n }\n\n protected onActivate(): void {\n if (this.disabled) return; // soft-disabled: not selectable (APG)\n this.select?.selectValue(this.value());\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * SkraSelectTrigger — the opt-in rich-trigger marker (ADR 0045 Rule 2). Place on an `<ng-template>`\n * inside `<skra-select>`; the select reads it as a `TemplateRef` and stamps it in the trigger via\n * `ngTemplateOutlet` with `{ $implicit: value, option: selectedOption }` context — the ONLY supported\n * path for non-text (SVG/`<img>`) trigger presentation. With no trigger template the default trigger is\n * the selected option's `getLabel()` text (emoji/glyph leading content appears for free).\n *\n * <skra-select [value]=\"country()\" (valueChange)=\"country.set($event)\">\n * <ng-template skraSelectTrigger let-value>\n * <skra-icon [innerSVG]=\"flagOf(value)\"></skra-icon> {{ nameOf(value) }}\n * </ng-template>\n * <skra-option value=\"de\"><skra-icon [innerSVG]=\"flagOf('de')\"></skra-icon> Germany</skra-option>\n * </skra-select>\n */\n@Directive({\n selector: '[skraSelectTrigger]',\n standalone: true,\n})\nexport class SkraSelectTrigger {}\n","import {\r\n autoUpdate,\r\n computePosition,\r\n flip,\r\n offset as offsetMiddleware,\r\n shift,\r\n type Placement,\r\n} from '@floating-ui/dom';\r\n\r\n/**\r\n * Forge's single overlay positioning abstraction (ADR 0044 §3 rules 4–5).\r\n *\r\n * Wraps `@floating-ui/dom` so the library is an IMPLEMENTATION DETAIL: nothing outside this folder\r\n * imports it, and swapping the engine (e.g. to native CSS Anchor Positioning once it is baseline\r\n * cross-browser) is a one-file change with zero public-API impact.\r\n *\r\n * It writes **geometry only** (`left`/`top` + the resolved-side `data-skra-placement`) inline on the\r\n * floating element — the scoped geometry-only exception to ADR 021 / Visual Purism granted by\r\n * ADR 0044 §3 rule 4. It MUST NOT write any theme/state/token value inline (those stay `var(--skra-*)`\r\n * + `data-skra-*`). No portal, no z-index, no CDK, no library stylesheet.\r\n *\r\n * Decided at the first anchored component (Tooltip, 2026-06-06): a single JS path on all engines\r\n * (not native-CSS-primary + JS-fallback) — see ADR 0044 §7 + the rule-4 refinement note.\r\n */\r\n\r\n/** Forge placement intent — the base four sides; flip/shift adjust at runtime. */\r\nexport type SkraPlacement = 'top' | 'bottom' | 'left' | 'right';\r\n\r\nexport interface _PositionerOptions {\r\n /** Preferred side; `flip` re-sides on viewport collision. */\r\n placement: SkraPlacement;\r\n /** Gap between trigger and floating element, in px (resolved from a comp token by the caller). */\r\n offset?: number;\r\n /** Minimum distance from the viewport edge for `shift`, in px. */\r\n viewportPadding?: number;\r\n}\r\n\r\nexport interface _PositionerHandle {\r\n /** Stop repositioning and release the `autoUpdate` listeners. Idempotent. */\r\n destroy(): void;\r\n}\r\n\r\n/**\r\n * Anchor `floating` to `reference` and keep it positioned while visible. Returns a handle whose\r\n * `destroy()` MUST be called when the overlay hides or the owner is destroyed (no listener leak).\r\n *\r\n * `options` is a getter so live token values (offset) are re-read on every reposition.\r\n */\r\nexport function _attachPositioner(\r\n reference: HTMLElement,\r\n floating: HTMLElement,\r\n options: () => _PositionerOptions,\r\n): _PositionerHandle {\r\n let destroyed = false;\r\n let seq = 0;\r\n\r\n const update = (): void => {\r\n const { placement, offset = 0, viewportPadding = 8 } = options();\r\n // `computePosition` is async, so two things can go wrong between call and settle: the handle can\r\n // be destroyed (writing geometry onto a detached / hidden node), and a newer update can settle\r\n // first (landing stale coordinates). Guard on both — this file positions every overlay in the\r\n // library, so a two-line guard is cheap insurance.\r\n const token = ++seq;\r\n computePosition(reference, floating, {\r\n strategy: 'fixed', // floating element renders in the top layer → viewport-relative\r\n placement: placement as Placement,\r\n middleware: [\r\n offsetMiddleware(offset),\r\n // NOTE: `flip()` deliberately left unpadded pending a decision — see the review residual.\r\n // Giving it `viewportPadding` would change resolved placement for all 7 overlay consumers\r\n // with no visual test to catch a regression; that is a measured change, not a cleanup.\r\n flip(),\r\n shift({ padding: viewportPadding }),\r\n ],\r\n })\r\n .then(({ x, y, placement: resolved }) => {\r\n if (destroyed || token !== seq) return;\r\n // Geometry only (ADR 0044 §3 rule 4). Never theme/state.\r\n floating.style.left = `${x}px`;\r\n floating.style.top = `${y}px`;\r\n // Resolved side (post-flip) for orientation CSS / future arrow — a data-attr, not a style.\r\n floating.setAttribute('data-skra-placement', resolved.split('-')[0]);\r\n })\r\n .catch(() => {\r\n // Positioning is best-effort: a rejection must never surface as an unhandled rejection\r\n // (fatal under Node, e.g. any future SSR/prerender path).\r\n });\r\n };\r\n\r\n // autoUpdate repositions on scroll, resize and element resize; returns its own cleanup.\r\n const cleanup = autoUpdate(reference, floating, update);\r\n return {\r\n destroy(): void {\r\n if (destroyed) return;\r\n destroyed = true;\r\n cleanup();\r\n },\r\n };\r\n}\r\n","import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\n\nimport type { SkraListboxKeyboardItem } from './select-types';\n\n/**\n * _SkraListboxKeyboard — the WAI-ARIA APG **Select-Only Combobox** listbox keyboard model, confined to\n * ONE file. Sibling to `menu-keyboard.ts`: per ADR 0044 §7 (2026-06-07), `@angular/cdk/a11y` is confined\n * to one swappable `*-keyboard.ts` controller PER APG pattern. Menu uses `FocusKeyManager` (roving REAL\n * focus); the listbox uses **`ActiveDescendantKeyManager`** — focus STAYS on the combobox trigger and the\n * active option is virtual (`aria-activedescendant`), the APG-canonical select-only model. Swapping the\n * engine is a one-file change, exactly as `SkraPositioner` wraps `@floating-ui/dom`.\n *\n * Owns: Down/Up active-descendant movement, Home/End, and type-ahead. Enter/Space (select), Escape and\n * light-dismiss (`popover=\"auto\"`) stay with the select / platform — this controller never touches them.\n */\nexport class _SkraListboxKeyboard {\n private manager?: ActiveDescendantKeyManager<SkraListboxKeyboardItem>;\n private items: SkraListboxKeyboardItem[] = [];\n private changeHandler?: (item: SkraListboxKeyboardItem | null) => void;\n\n /** Notified whenever the active descendant changes — the select mirrors it to `aria-activedescendant`. */\n onActiveChange(\n handler: (item: SkraListboxKeyboardItem | null) => void,\n ): void {\n this.changeHandler = handler;\n }\n\n /**\n * (Re)build the manager from the current projected option set. Called from an `effect` on the select's\n * signal `contentChildren` — a passed array is a static snapshot (it does not auto-track like a live\n * `QueryList`), so the manager is rebuilt whenever the option set changes (the documented signal↔CDK seam).\n */\n setItems(items: readonly SkraListboxKeyboardItem[]): void {\n this.items = [...items];\n this.manager?.destroy();\n this.manager = new ActiveDescendantKeyManager<SkraListboxKeyboardItem>(\n this.items,\n )\n .withTypeAhead()\n .withHomeAndEnd()\n // Disabled options stay navigable (APG-discoverable); selection is guarded by the select.\n // `() => false` also stops the manager from reading `item.disabled` to skip-during-navigation.\n .skipPredicate(() => false);\n this.manager.change.subscribe((index) =>\n this.changeHandler?.(this.items[index] ?? null),\n );\n }\n\n /** Delegate Down/Up/Home/End/type-ahead. Enter/Space/Escape are intentionally left to the select/platform. */\n onKeydown(event: KeyboardEvent): void {\n this.manager?.onKeydown(event);\n }\n\n get activeItem(): SkraListboxKeyboardItem | null {\n return this.manager?.activeItem ?? null;\n }\n\n /** Seed the active descendant on open: the selected option, else the first. */\n setActive(item: SkraListboxKeyboardItem | null): void {\n if (!this.manager) return;\n if (item) this.manager.setActiveItem(item);\n else this.manager.setFirstItemActive();\n }\n\n /** Deactivate (close): `setActiveItem(-1)` clears `_activeItem` and the highlight. */\n clearActive(): void {\n this.manager?.setActiveItem(-1);\n }\n\n destroy(): void {\n this.manager?.destroy();\n this.manager = undefined;\n }\n}\n","import {\n DestroyRef,\n Directive,\n ElementRef,\n booleanAttribute,\n computed,\n contentChildren,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SkraFieldContext } from '@skra/ui/field';\n\nimport {\n _attachPositioner,\n type SkraPlacement,\n type _PositionerHandle,\n} from '../positioning/positioner';\nimport { _SkraListboxKeyboard } from './listbox-keyboard';\nimport { SkraOption } from './option';\nimport type { SkraListboxKeyboardItem, SkraListboxPanel } from './select-types';\n\nlet nextListboxId = 0;\n\n/**\n * _SkraListboxWidgetBase — the **trigger-shape-agnostic** core shared by every Forge listbox widget,\n * per the **ADR 0046 amendment (2026-06-13)**. It owns ONLY the substrate that does not depend on what\n * the trigger looks like: the `SkraFieldContext` cascade (ADR 013), the panel `(toggle)` →\n * `SkraPositioner` lifecycle + active-descendant seeding, the `_SkraListboxKeyboard` wiring\n * (CDK `ActiveDescendantKeyManager`, ADR 0044 §7), imperative `open()`/`close()`, teardown, and the\n * abstract `SkraListboxPanel` selection seam.\n *\n * Trigger BEHAVIOUR lives one level down, in a per-shape base:\n * - `_SkraSelectBase` adds the button + native `popovertarget` + type-ahead trigger (Select-Only\n * Combobox) and the ADR 0045 `[skraSelectTrigger]` rich-trigger template.\n * - `SkraCombobox` (no extra base) adds the editable `<input>` + filter-output trigger (ADR 0049).\n *\n * The keydown skeleton is NOT here — each trigger shape routes keys differently (the select selects on\n * Space and type-aheads; the combobox types into the input and never type-aheads). Forcing one keydown\n * through both shapes is the wrong abstraction.\n *\n * `panelTokenPrefix` makes the panel comp-token namespace overridable so each widget reads its OWN\n * `--skra-comp-<prefix>-panel-*` tokens (`select` for the select family, `combobox` for the combobox).\n *\n * Full contracts: adr/specs/component-{select,multi-select,combobox}-spec.md.\n */\n@Directive({\n host: {\n // Shell state reflection for the skin (the trigger control carries the ARIA + native disabled).\n '[attr.data-skra-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-skra-readonly]': 'isReadonly() ? \"\" : null',\n '[attr.data-skra-validation]': 'hasError() ? \"invalid\" : null',\n },\n})\nexport abstract class _SkraListboxWidgetBase<T = unknown>\n implements SkraListboxPanel\n{\n /** Equality strategy seam (ADR 037 selection model): default `Object.is`; object values pass a custom comparator. */\n readonly compareWith = input<(a: T, b: T) => boolean>(Object.is);\n /** Value-empty hint shown in the trigger (NOT the accessible name — ADR 033). */\n readonly placeholder = input<string>('');\n /** Placement intent; flip/shift adjust at runtime. */\n readonly placement = input<SkraPlacement>('bottom');\n /** Standalone availability source (Q-1) — `SkraFieldContext` wins when present. */\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n protected readonly options = contentChildren(SkraOption);\n\n protected readonly triggerRef = viewChild<ElementRef<HTMLElement>>('trigger');\n protected readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\n\n protected readonly context = inject(SkraFieldContext, { optional: true });\n protected readonly keyboard = new _SkraListboxKeyboard();\n\n readonly panelId = `skra-listbox-${nextListboxId++}`;\n protected readonly isOpen = signal(false);\n protected readonly activeOptionId = signal<string | null>(null);\n\n private positioner?: _PositionerHandle;\n\n /** Panel comp-token namespace — `--skra-comp-<panelTokenPrefix>-panel-*`. Overridden per widget. */\n protected abstract readonly panelTokenPrefix: string;\n\n // ── Availability / validation (SkraFieldContext, ADR 013, with standalone fallbacks — Q-1) ──\n protected readonly isDisabled = computed(\n () => this.context?.isDisabled() ?? this.disabled(),\n );\n protected readonly isReadonly = computed(\n () => this.context?.isReadonly() ?? this.readonly(),\n );\n protected readonly hasError = computed(\n () => this.context?.hasError() ?? false,\n );\n protected readonly isRequired = computed(\n () => this.context?.isRequired() ?? false,\n );\n protected readonly triggerId = computed(\n () => this.context?.fieldId() || null,\n );\n protected readonly describedBy = computed(\n () => this.context?.describedByIds() ?? null,\n );\n\n constructor() {\n // Feed the keyboard controller whenever the projected option set changes (signal → array rebuild).\n effect(() => this.keyboard.setItems(this.options()));\n // Mirror the active descendant to the trigger's aria-activedescendant.\n this.keyboard.onActiveChange((item) =>\n this.activeOptionId.set(item?.optionId ?? null),\n );\n inject(DestroyRef).onDestroy(() => this.teardown());\n }\n\n // ── SkraListboxPanel seam — the per-widget divergence (implemented by each concrete) ──\n /** Live selection test: single = equality, multi = membership (both via `compareWith`). */\n abstract isSelected(value: unknown): boolean;\n /** User picked a value: single = replace + close; multi = toggle membership + keep open. */\n abstract selectValue(value: unknown): void;\n /** Cardinality hint read by `skra-option` for the indicator swap — `false` single / `true` multi. */\n abstract readonly multiple: boolean;\n /** Seed the active descendant on open: single = the selected option; multi = the first selected. */\n protected abstract activeSeedItem(): SkraListboxKeyboardItem | null;\n\n // ── Panel open / close (native toggle from the Popover API) ──\n protected onPanelToggle(event: Event): void {\n const open = (event as ToggleEvent).newState === 'open';\n this.isOpen.set(open);\n if (open) this.onOpen();\n else this.onClose();\n }\n\n /**\n * The element the panel is positioned against AND matched in width to (Q-5). Defaults to the trigger\n * — correct for the select family, whose trigger button fills the host. The combobox overrides it to\n * the host box, because its trigger is the INNER input (narrower than the bordered box + chevron), so\n * the panel must align to and match the box, not the input — visual parity with select.\n */\n protected positioningAnchor(): HTMLElement | undefined {\n return this.triggerRef()?.nativeElement;\n }\n\n private onOpen(): void {\n const anchor = this.positioningAnchor();\n const panel = this.panelRef()?.nativeElement;\n if (anchor && panel) {\n // Geometry-only (ADR 0044 §3 rule 4): the panel is at least as wide as the anchor (Q-5).\n panel.style.minInlineSize = `${anchor.offsetWidth}px`;\n this.positioner?.destroy();\n this.positioner = _attachPositioner(anchor, panel, () => ({\n placement: this.placement(),\n offset: this.cssLenPx(\n `--skra-comp-${this.panelTokenPrefix}-panel-offset`,\n ),\n viewportPadding: this.cssLenPx(\n `--skra-comp-${this.panelTokenPrefix}-panel-viewport-padding`,\n ),\n }));\n }\n // Seed the active descendant (single → selected; multi → first selected, else first).\n this.keyboard.setActive(this.activeSeedItem());\n }\n\n private onClose(): void {\n this.positioner?.destroy();\n this.positioner = undefined;\n this.keyboard.clearActive();\n this.activeOptionId.set(null);\n }\n\n /** Select the keyboard's active option (Enter), unless it is soft-disabled. Shared by every trigger shape. */\n protected selectActive(): void {\n const active = this.keyboard.activeItem;\n if (active && !active.disabled) this.selectValue(active.getValue());\n }\n\n protected open(): void {\n this.panelRef()?.nativeElement.showPopover?.();\n }\n protected close(): void {\n this.panelRef()?.nativeElement.hidePopover?.();\n }\n\n /** Read a length comp token (px/rem) off the panel computed style for the positioner. */\n private cssLenPx(prop: string): number {\n const el = this.panelRef()?.nativeElement;\n if (!el) return 0;\n const raw = getComputedStyle(el).getPropertyValue(prop).trim();\n if (raw.endsWith('px')) return parseFloat(raw);\n if (raw.endsWith('rem')) {\n const rootFontSize =\n parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n return parseFloat(raw) * rootFontSize;\n }\n return parseFloat(raw) || 0;\n }\n\n private teardown(): void {\n this.keyboard.destroy();\n this.positioner?.destroy();\n }\n}\n","import { Directive, TemplateRef, contentChild } from '@angular/core';\r\n\r\nimport { _SkraListboxWidgetBase } from './listbox-widget-base';\r\nimport { SkraSelectTrigger } from './select-trigger';\r\n\r\n/**\r\n * _SkraSelectBase — the SELECT-family trigger model over {@link _SkraListboxWidgetBase}: the WAI-ARIA APG\r\n * **Select-Only Combobox** trigger. It adds the `<button>` + native `popovertarget` interaction, the\r\n * type-ahead keydown skeleton, and the ADR 0045 `[skraSelectTrigger]` rich-trigger template. Shared by\r\n * `skra-select` (single) and `skra-multi-select` (multi) — the cardinality split (ADR 0046) lives in\r\n * those concretes (the `SkraListboxPanel` seam: single replaces + closes, multi toggles + stays open).\r\n *\r\n * The trigger-shape-agnostic substrate (field cascade, panel toggle/positioner, keyboard wiring,\r\n * open/close, the selection seam) lives in the parent base, shared verbatim with `skra-combobox`\r\n * (which has a different — editable input — trigger; ADR 0046 amendment 2026-06-13).\r\n *\r\n * Full contract: adr/specs/component-select-spec.md + adr/specs/component-multi-select-spec.md.\r\n */\r\n@Directive()\r\nexport abstract class _SkraSelectBase<\r\n T = unknown,\r\n> extends _SkraListboxWidgetBase<T> {\r\n /** Select-family panel token namespace — `--skra-comp-select-panel-*` (shared single + multi). */\r\n protected readonly panelTokenPrefix = 'select';\r\n\r\n /** Opt-in rich trigger template (ADR 0045 Rule 2). Select-family only — a combobox input shows text. */\r\n protected readonly triggerTemplate = contentChild(SkraSelectTrigger, {\r\n read: TemplateRef,\r\n });\r\n\r\n // ── Trigger interaction (button + native popovertarget) ──\r\n protected onTriggerClick(event: MouseEvent): void {\r\n // Block the native popovertarget open when readonly (disabled is unfocusable/inert natively).\r\n if (this.isReadonly()) event.preventDefault();\r\n }\r\n\r\n protected onTriggerKeydown(event: KeyboardEvent): void {\r\n if (this.isDisabled() || this.isReadonly()) return; // never opens / never mutates\r\n const key = event.key;\r\n const isSpace = key === ' ' || key === 'Spacebar';\r\n const isNav =\r\n key === 'ArrowDown' ||\r\n key === 'ArrowUp' ||\r\n key === 'Home' ||\r\n key === 'End';\r\n const isPrintable =\r\n key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey;\r\n\r\n if (!this.isOpen()) {\r\n // Single open path: suppress the popovertarget's own toggle (Enter/Space) too and open here.\r\n if (isNav || isSpace || key === 'Enter' || isPrintable) {\r\n event.preventDefault();\r\n this.open();\r\n }\r\n return;\r\n }\r\n\r\n // Open:\r\n if (key === 'Enter' || isSpace) {\r\n // Suppress the popovertarget toggle; the concrete `selectValue` decides close (single) vs stay-open (multi).\r\n event.preventDefault();\r\n this.selectActive();\r\n return;\r\n }\r\n if (key === 'Tab') {\r\n this.close(); // APG: Tab closes (keep value); focus proceeds (no preventDefault)\r\n return;\r\n }\r\n if (key === 'Escape') return; // platform (popover=\"auto\") closes; onPanelToggle handles cleanup\r\n if (key === 'ArrowUp' && event.altKey) {\r\n // APG select-only combobox: Alt+Up closes and keeps the current value, focus stays on the\r\n // trigger. Must be handled BEFORE the nav branch — `ArrowUp` is `isNav`, so it would otherwise\r\n // be preventDefault'ed and handed to the key manager, which ignores modified arrows: the\r\n // keystroke did nothing at all.\r\n event.preventDefault();\r\n this.close();\r\n return;\r\n }\r\n if (isNav || isPrintable) {\r\n event.preventDefault();\r\n this.keyboard.onKeydown(event); // move / type-ahead the active descendant\r\n }\r\n }\r\n}\r\n","// @skra/ui/core — shared internal satellites (ADR 0054). Consumed cross-entry by\n// select / multi-select / combobox / datepicker / menu / popover / tooltip.\n\n// --- Public shared surface ---\nexport * from './lib/select/option';\nexport * from './lib/select/option.directives';\nexport * from './lib/select/select-trigger';\nexport {\n SKRA_LISTBOX_PANEL,\n type SkraListboxPanel,\n type SkraListboxKeyboardItem,\n} from './lib/select/select-types';\n\n// --- Internal shared bases (`_`-prefixed = outside SemVer, ADR 0054 R-54.4/R-54.5) ---\nexport * from './lib/select/select-base';\nexport * from './lib/select/listbox-widget-base';\n// Positioner: `_attachPositioner`/`_PositionerOptions`/`_PositionerHandle` are internal\n// (`_`-prefixed = outside SemVer — O-33 (6a) done). `SkraPlacement` is PUBLIC by ruling\n// (consumer-facing placement inputs, re-exported by tooltip/popover/menu/datepicker).\n// See ADR 0054 §7 (2026-07-03 note); enforced by export-surface-validator.\nexport * from './lib/positioning/positioner';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["offset","offsetMiddleware"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skra-ui-core.mjs","sources":["../../../../libs/ui/core/src/lib/select/select-types.ts","../../../../libs/ui/core/src/lib/select/option.directives.ts","../../../../libs/ui/core/src/lib/select/option.ts","../../../../libs/ui/core/src/lib/select/select-trigger.ts","../../../../libs/ui/core/src/lib/positioning/positioner.ts","../../../../libs/ui/core/src/lib/select/listbox-keyboard.ts","../../../../libs/ui/core/src/lib/select/listbox-widget-base.ts","../../../../libs/ui/core/src/lib/select/select-base.ts","../../../../libs/ui/core/src/index.ts","../../../../libs/ui/core/src/skra-ui-core.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * What a `skra-option` needs from its listbox parent — a narrow contract that breaks the\n * parent↔option import cycle (the `SKRA_MENU` precedent). A token (not a concrete class) so the option\n * file never imports a widget file — no runtime import cycle. Implemented by `_SkraListboxWidgetBase`,\n * so it is shared by `skra-select`, `skra-multi-select` AND `skra-combobox` (ADR 0046 amendment).\n */\nexport interface SkraListboxPanel {\n /** Live selection test for an option's value (signal-driven: default `Object.is` or consumer `compareWith`). */\n isSelected(value: unknown): boolean;\n /**\n * A user picked this value (pointer/keyboard). Single-select emits `valueChange` + closes; multi-select\n * TOGGLES membership and keeps the panel open (ADR 0046); combobox replaces + closes (ADR 0049).\n * Consumer owns `value` (ADR 037).\n */\n selectValue(value: unknown): void;\n /**\n * Cardinality hint (ADR 0046) — `false` on single widgets (`skra-select`/`skra-combobox`), `true` on\n * `skra-multi-select`. The ONLY thing `skra-option` reads to swap its component-rendered indicator\n * (checkmark ↔ checkbox). NOT an Angular input; cardinality is a component identity, never a runtime flag.\n */\n readonly multiple: boolean;\n}\n\n/**\n * The item shape the listbox keyboard controller drives. Structurally a CDK `Highlightable`\n * (`setActiveStyles`/`setInactiveStyles`) + `ListKeyManagerOption` (`getLabel`/`disabled`), plus the\n * option's `id` (→ `aria-activedescendant`) and `getValue()` (Enter-to-select). Declared HERE — cdk-free —\n * so the only `@angular/cdk` importer stays `listbox-keyboard.ts` (the `menu-types.ts` precedent).\n */\nexport interface SkraListboxKeyboardItem {\n readonly optionId: string;\n setActiveStyles(): void;\n setInactiveStyles(): void;\n getLabel(): string;\n getValue(): unknown;\n readonly disabled: boolean;\n}\n\n/**\n * DI token a listbox widget provides (`useExisting`) and a `skra-option` injects. A token (not a concrete\n * class) so the option file never imports a widget file — no runtime import cycle. Provided by\n * `skra-select`, `skra-multi-select`, and `skra-combobox`.\n */\nexport const SKRA_LISTBOX_PANEL = new InjectionToken<SkraListboxPanel>(\n 'SKRA_LISTBOX_PANEL',\n);\n","import { Directive } from '@angular/core';\n\n/**\n * Slot marker: the leading icon/flag of a `skra-option` — part of the option IDENTITY (ADR 0045\n * Rule 4), so it flows into `getLabel()` (emoji/glyph leading appears in the default trigger for free).\n */\n@Directive({\n selector: '[skra-option-leading]',\n standalone: true,\n})\nexport class SkraOptionLeading {}\n\n/**\n * Slot marker: secondary DETAIL text of a `skra-option` (e.g. a dial code, a description) — list-only\n * (ADR 0045 Rule 4), EXCLUDED from `getLabel()` and the trigger summary.\n */\n@Directive({\n selector: '[skra-option-detail]',\n standalone: true,\n})\nexport class SkraOptionDetail {}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n contentChild,\n inject,\n input,\n signal,\n} from '@angular/core';\n\nimport {\n SKRA_LISTBOX_PANEL,\n type SkraListboxKeyboardItem,\n} from './select-types';\nimport { SkraOptionDetail, SkraOptionLeading } from './option.directives';\n\ndeclare const ngDevMode: boolean | undefined;\n\nlet nextOptionId = 0;\n\n/**\n * SkraOption — one selectable row in a `skra-select` listbox, a Component on the custom-element host\n * `skra-option` (ADR 040 content-bearing host; there is no native option element that holds rich content\n * outside `<select>`). Carries `value` + rich projected content: a leading icon (`[skra-option-leading]`)\n * and a primary label = the IDENTITY (→ `getLabel()` / the default trigger, ADR 0045), plus an optional\n * secondary `[skra-option-detail]` that is list-only (excluded from the trigger). The selection\n * indicator (trailing checkmark) is component-rendered, driven by `aria-selected` — NOT a slot; iteration 2\n * swaps it for a per-row checkbox with no API change.\n *\n * Implements `SkraListboxKeyboardItem` so `_SkraListboxKeyboard` (CDK `ActiveDescendantKeyManager`) can\n * highlight it (`setActiveStyles`/`setInactiveStyles` → `data-skra-active`) and type-ahead to it\n * (`getLabel`). Disabled is native-attr-first (Menu precedent): the consumer sets `aria-disabled=\"true\"`\n * and Forge OBSERVES it — disabled options stay navigable (discoverable) but cannot be selected.\n *\n * Full contract: adr/specs/component-select-spec.md.\n */\n@Component({\n selector: 'skra-option',\n standalone: true,\n exportAs: 'skraOption',\n template: `\n @if (hasLeading()) {\n <span class=\"skra-select-option-leading\"\n ><ng-content select=\"[skra-option-leading]\"></ng-content\n ></span>\n }\n <span class=\"skra-select-option-label\"><ng-content></ng-content></span>\n @if (hasDetail()) {\n <span class=\"skra-select-option-detail\"\n ><ng-content select=\"[skra-option-detail]\"></ng-content\n ></span>\n }\n <span\n class=\"skra-select-option-indicator\"\n [class.skra-select-option-indicator--checkbox]=\"multiple()\"\n aria-hidden=\"true\"\n ></span>\n `,\n styleUrl: './option.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n role: 'option',\n '[id]': 'optionId',\n '[attr.aria-selected]': 'selected() ? \"true\" : \"false\"',\n '[attr.data-skra-active]': 'active() ? \"\" : null',\n '(click)': 'onActivate()',\n // Disabled = the consumer's native `aria-disabled=\"true\"` (observed live) — no Forge binding.\n },\n})\nexport class SkraOption<T = unknown> implements SkraListboxKeyboardItem {\n /** The option's value (ADR 037 — consumer-owned; compared against the select's `value()`). */\n readonly value = input.required<T>();\n\n /** Stable id, the target of the trigger's `aria-activedescendant`. Internal — never consumer-facing. */\n readonly optionId = `skra-option-${nextOptionId++}`;\n\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly select = inject(SKRA_LISTBOX_PANEL, { optional: true });\n\n private readonly leadingSlot = contentChild(SkraOptionLeading);\n private readonly detailSlot = contentChild(SkraOptionDetail);\n protected readonly hasLeading = computed(() => !!this.leadingSlot());\n protected readonly hasDetail = computed(() => !!this.detailSlot());\n\n /** Keyboard active-descendant highlight (ADR 0044 §7 — Highlightable, NOT roving focus). */\n protected readonly active = signal(false);\n\n /**\n * Cardinality hint from the parent panel (ADR 0046): `false` under `skra-select` → checkmark\n * indicator; `true` under `skra-multi-select` → checkbox indicator. The only thing the shared\n * `skra-option` reads to swap the component-rendered indicator. No public-API change.\n */\n protected readonly multiple = computed(() => this.select?.multiple ?? false);\n\n /** Selection is signal-derived (ADR 0045 / ADR 037): re-derives on parent `value()`/`compareWith()` or own `value()`. */\n protected readonly selected = computed(\n () => this.select?.isSelected(this.value()) ?? false,\n );\n\n constructor() {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!this.select) {\n console.warn(\n '[skra-option] has no <skra-select> ancestor — it is not registered with the keyboard ' +\n 'controller / selection model and cannot be picked. Project it inside a <skra-select>.',\n );\n }\n }\n }\n\n // ── SkraListboxKeyboardItem (driven by _SkraListboxKeyboard / CDK ActiveDescendantKeyManager) ──\n setActiveStyles(): void {\n this.active.set(true);\n }\n setInactiveStyles(): void {\n this.active.set(false);\n }\n\n /**\n * ADR 0045 Rule 1: the option's IDENTITY text (leading + label), EXCLUDING `[skra-option-detail]` and\n * the component-rendered indicator. Own-host `textContent` walk (the `skraMenuItem.getLabel()`\n * precedent) — drives the default trigger text AND type-ahead. Reading own content, NOT\n * `document.querySelector` (ADR 001-clean).\n */\n getLabel(): string {\n let text = '';\n const skip = (el: HTMLElement): boolean =>\n el.classList.contains('skra-select-option-detail') ||\n el.classList.contains('skra-select-option-indicator') ||\n el.hasAttribute('skra-option-detail');\n const walk = (node: Node): void => {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent ?? '';\n return;\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (skip(el)) return;\n el.childNodes.forEach(walk);\n }\n };\n this.el.nativeElement.childNodes.forEach(walk);\n return text.replace(/\\s+/g, ' ').trim();\n }\n\n getValue(): unknown {\n return this.value();\n }\n\n /** Soft-disabled = the consumer's `aria-disabled=\"true\"` (native-attr-first, Menu precedent); read live. */\n get disabled(): boolean {\n return this.el.nativeElement.getAttribute('aria-disabled') === 'true';\n }\n\n protected onActivate(): void {\n if (this.disabled) return; // soft-disabled: not selectable (APG)\n this.select?.selectValue(this.value());\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * SkraSelectTrigger — the opt-in rich-trigger marker (ADR 0045 Rule 2). Place on an `<ng-template>`\n * inside `<skra-select>`; the select reads it as a `TemplateRef` and stamps it in the trigger via\n * `ngTemplateOutlet` with `{ $implicit: value, option: selectedOption }` context — the ONLY supported\n * path for non-text (SVG/`<img>`) trigger presentation. With no trigger template the default trigger is\n * the selected option's `getLabel()` text (emoji/glyph leading content appears for free).\n *\n * <skra-select [value]=\"country()\" (valueChange)=\"country.set($event)\">\n * <ng-template skraSelectTrigger let-value>\n * <skra-icon [innerSVG]=\"flagOf(value)\"></skra-icon> {{ nameOf(value) }}\n * </ng-template>\n * <skra-option value=\"de\"><skra-icon [innerSVG]=\"flagOf('de')\"></skra-icon> Germany</skra-option>\n * </skra-select>\n */\n@Directive({\n selector: '[skraSelectTrigger]',\n standalone: true,\n})\nexport class SkraSelectTrigger {}\n","import {\r\n autoUpdate,\r\n computePosition,\r\n flip,\r\n offset as offsetMiddleware,\r\n shift,\r\n type Placement,\r\n} from '@floating-ui/dom';\r\n\r\n/**\r\n * Forge's single overlay positioning abstraction (ADR 0044 §3 rules 4–5).\r\n *\r\n * Wraps `@floating-ui/dom` so the library is an IMPLEMENTATION DETAIL: nothing outside this folder\r\n * imports it, and swapping the engine (e.g. to native CSS Anchor Positioning once it is baseline\r\n * cross-browser) is a one-file change with zero public-API impact.\r\n *\r\n * It writes **geometry only** (`left`/`top` + the resolved-side `data-skra-placement`) inline on the\r\n * floating element — the scoped geometry-only exception to ADR 021 / Visual Purism granted by\r\n * ADR 0044 §3 rule 4. It MUST NOT write any theme/state/token value inline (those stay `var(--skra-*)`\r\n * + `data-skra-*`). No portal, no z-index, no CDK, no library stylesheet.\r\n *\r\n * Decided at the first anchored component (Tooltip, 2026-06-06): a single JS path on all engines\r\n * (not native-CSS-primary + JS-fallback) — see ADR 0044 §7 + the rule-4 refinement note.\r\n */\r\n\r\n/** Forge placement intent — the base four sides; flip/shift adjust at runtime. */\r\nexport type SkraPlacement = 'top' | 'bottom' | 'left' | 'right';\r\n\r\nexport interface _PositionerOptions {\r\n /** Preferred side; `flip` re-sides on viewport collision. */\r\n placement: SkraPlacement;\r\n /** Gap between trigger and floating element, in px (resolved from a comp token by the caller). */\r\n offset?: number;\r\n /** Minimum distance from the viewport edge for `shift`, in px. */\r\n viewportPadding?: number;\r\n}\r\n\r\nexport interface _PositionerHandle {\r\n /** Stop repositioning and release the `autoUpdate` listeners. Idempotent. */\r\n destroy(): void;\r\n}\r\n\r\n/**\r\n * Anchor `floating` to `reference` and keep it positioned while visible. Returns a handle whose\r\n * `destroy()` MUST be called when the overlay hides or the owner is destroyed (no listener leak).\r\n *\r\n * `options` is a getter so live token values (offset) are re-read on every reposition.\r\n */\r\nexport function _attachPositioner(\r\n reference: HTMLElement,\r\n floating: HTMLElement,\r\n options: () => _PositionerOptions,\r\n): _PositionerHandle {\r\n let destroyed = false;\r\n let seq = 0;\r\n\r\n const update = (): void => {\r\n const { placement, offset = 0, viewportPadding = 8 } = options();\r\n // `computePosition` is async, so two things can go wrong between call and settle: the handle can\r\n // be destroyed (writing geometry onto a detached / hidden node), and a newer update can settle\r\n // first (landing stale coordinates). Guard on both — this file positions every overlay in the\r\n // library, so a two-line guard is cheap insurance.\r\n const token = ++seq;\r\n computePosition(reference, floating, {\r\n strategy: 'fixed', // floating element renders in the top layer → viewport-relative\r\n placement: placement as Placement,\r\n middleware: [\r\n offsetMiddleware(offset),\r\n // NOTE: `flip()` deliberately left unpadded pending a decision — see the review residual.\r\n // Giving it `viewportPadding` would change resolved placement for all 7 overlay consumers\r\n // with no visual test to catch a regression; that is a measured change, not a cleanup.\r\n flip(),\r\n shift({ padding: viewportPadding }),\r\n ],\r\n })\r\n .then(({ x, y, placement: resolved }) => {\r\n if (destroyed || token !== seq) return;\r\n // Geometry only (ADR 0044 §3 rule 4). Never theme/state.\r\n floating.style.left = `${x}px`;\r\n floating.style.top = `${y}px`;\r\n // Resolved side (post-flip) for orientation CSS / future arrow — a data-attr, not a style.\r\n floating.setAttribute('data-skra-placement', resolved.split('-')[0]);\r\n })\r\n .catch(() => {\r\n // Positioning is best-effort: a rejection must never surface as an unhandled rejection\r\n // (fatal under Node, e.g. any future SSR/prerender path).\r\n });\r\n };\r\n\r\n // autoUpdate repositions on scroll, resize and element resize; returns its own cleanup.\r\n const cleanup = autoUpdate(reference, floating, update);\r\n return {\r\n destroy(): void {\r\n if (destroyed) return;\r\n destroyed = true;\r\n cleanup();\r\n },\r\n };\r\n}\r\n","import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\n\nimport type { SkraListboxKeyboardItem } from './select-types';\n\n/**\n * _SkraListboxKeyboard — the WAI-ARIA APG **Select-Only Combobox** listbox keyboard model, confined to\n * ONE file. Sibling to `menu-keyboard.ts`: per ADR 0044 §7 (2026-06-07), `@angular/cdk/a11y` is confined\n * to one swappable `*-keyboard.ts` controller PER APG pattern. Menu uses `FocusKeyManager` (roving REAL\n * focus); the listbox uses **`ActiveDescendantKeyManager`** — focus STAYS on the combobox trigger and the\n * active option is virtual (`aria-activedescendant`), the APG-canonical select-only model. Swapping the\n * engine is a one-file change, exactly as `SkraPositioner` wraps `@floating-ui/dom`.\n *\n * Owns: Down/Up active-descendant movement, Home/End, and type-ahead. Enter/Space (select), Escape and\n * light-dismiss (`popover=\"auto\"`) stay with the select / platform — this controller never touches them.\n */\nexport class _SkraListboxKeyboard {\n private manager?: ActiveDescendantKeyManager<SkraListboxKeyboardItem>;\n private items: SkraListboxKeyboardItem[] = [];\n private changeHandler?: (item: SkraListboxKeyboardItem | null) => void;\n\n /** Notified whenever the active descendant changes — the select mirrors it to `aria-activedescendant`. */\n onActiveChange(\n handler: (item: SkraListboxKeyboardItem | null) => void,\n ): void {\n this.changeHandler = handler;\n }\n\n /**\n * (Re)build the manager from the current projected option set. Called from an `effect` on the select's\n * signal `contentChildren` — a passed array is a static snapshot (it does not auto-track like a live\n * `QueryList`), so the manager is rebuilt whenever the option set changes (the documented signal↔CDK seam).\n */\n setItems(items: readonly SkraListboxKeyboardItem[]): void {\n this.items = [...items];\n this.manager?.destroy();\n this.manager = new ActiveDescendantKeyManager<SkraListboxKeyboardItem>(\n this.items,\n )\n .withTypeAhead()\n .withHomeAndEnd()\n // Disabled options stay navigable (APG-discoverable); selection is guarded by the select.\n // `() => false` also stops the manager from reading `item.disabled` to skip-during-navigation.\n .skipPredicate(() => false);\n this.manager.change.subscribe((index) =>\n this.changeHandler?.(this.items[index] ?? null),\n );\n }\n\n /** Delegate Down/Up/Home/End/type-ahead. Enter/Space/Escape are intentionally left to the select/platform. */\n onKeydown(event: KeyboardEvent): void {\n this.manager?.onKeydown(event);\n }\n\n get activeItem(): SkraListboxKeyboardItem | null {\n return this.manager?.activeItem ?? null;\n }\n\n /** Seed the active descendant on open: the selected option, else the first. */\n setActive(item: SkraListboxKeyboardItem | null): void {\n if (!this.manager) return;\n if (item) this.manager.setActiveItem(item);\n else this.manager.setFirstItemActive();\n }\n\n /** Deactivate (close): `setActiveItem(-1)` clears `_activeItem` and the highlight. */\n clearActive(): void {\n this.manager?.setActiveItem(-1);\n }\n\n destroy(): void {\n this.manager?.destroy();\n this.manager = undefined;\n }\n}\n","import {\n DestroyRef,\n Directive,\n ElementRef,\n booleanAttribute,\n computed,\n contentChildren,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SkraFieldContext } from '@skra/ui/field';\n\nimport {\n _attachPositioner,\n type SkraPlacement,\n type _PositionerHandle,\n} from '../positioning/positioner';\nimport { _SkraListboxKeyboard } from './listbox-keyboard';\nimport { SkraOption } from './option';\nimport type { SkraListboxKeyboardItem, SkraListboxPanel } from './select-types';\n\nlet nextListboxId = 0;\n\n/**\n * _SkraListboxWidgetBase — the **trigger-shape-agnostic** core shared by every Forge listbox widget,\n * per the **ADR 0046 amendment (2026-06-13)**. It owns ONLY the substrate that does not depend on what\n * the trigger looks like: the `SkraFieldContext` cascade (ADR 013), the panel `(toggle)` →\n * `SkraPositioner` lifecycle + active-descendant seeding, the `_SkraListboxKeyboard` wiring\n * (CDK `ActiveDescendantKeyManager`, ADR 0044 §7), imperative `open()`/`close()`, teardown, and the\n * abstract `SkraListboxPanel` selection seam.\n *\n * Trigger BEHAVIOUR lives one level down, in a per-shape base:\n * - `_SkraSelectBase` adds the button + native `popovertarget` + type-ahead trigger (Select-Only\n * Combobox) and the ADR 0045 `[skraSelectTrigger]` rich-trigger template.\n * - `SkraCombobox` (no extra base) adds the editable `<input>` + filter-output trigger (ADR 0049).\n *\n * The keydown skeleton is NOT here — each trigger shape routes keys differently (the select selects on\n * Space and type-aheads; the combobox types into the input and never type-aheads). Forcing one keydown\n * through both shapes is the wrong abstraction.\n *\n * `panelTokenPrefix` makes the panel comp-token namespace overridable so each widget reads its OWN\n * `--skra-comp-<prefix>-panel-*` tokens (`select` for the select family, `combobox` for the combobox).\n *\n * Full contracts: adr/specs/component-{select,multi-select,combobox}-spec.md.\n */\n@Directive({\n host: {\n // Shell state reflection for the skin (the trigger control carries the ARIA + native disabled).\n '[attr.data-skra-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-skra-readonly]': 'isReadonly() ? \"\" : null',\n '[attr.data-skra-validation]': 'hasError() ? \"invalid\" : null',\n },\n})\nexport abstract class _SkraListboxWidgetBase<T = unknown>\n implements SkraListboxPanel\n{\n /** Equality strategy seam (ADR 037 selection model): default `Object.is`; object values pass a custom comparator. */\n readonly compareWith = input<(a: T, b: T) => boolean>(Object.is);\n /** Value-empty hint shown in the trigger (NOT the accessible name — ADR 033). */\n readonly placeholder = input<string>('');\n /** Placement intent; flip/shift adjust at runtime. */\n readonly placement = input<SkraPlacement>('bottom');\n /** Standalone availability source (Q-1) — `SkraFieldContext` wins when present. */\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n protected readonly options = contentChildren(SkraOption);\n\n protected readonly triggerRef = viewChild<ElementRef<HTMLElement>>('trigger');\n protected readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\n\n protected readonly context = inject(SkraFieldContext, { optional: true });\n protected readonly keyboard = new _SkraListboxKeyboard();\n\n readonly panelId = `skra-listbox-${nextListboxId++}`;\n protected readonly isOpen = signal(false);\n protected readonly activeOptionId = signal<string | null>(null);\n\n private positioner?: _PositionerHandle;\n\n /** Panel comp-token namespace — `--skra-comp-<panelTokenPrefix>-panel-*`. Overridden per widget. */\n protected abstract readonly panelTokenPrefix: string;\n\n // ── Availability / validation (SkraFieldContext, ADR 013, with standalone fallbacks — Q-1) ──\n protected readonly isDisabled = computed(\n () => this.context?.isDisabled() ?? this.disabled(),\n );\n protected readonly isReadonly = computed(\n () => this.context?.isReadonly() ?? this.readonly(),\n );\n protected readonly hasError = computed(\n () => this.context?.hasError() ?? false,\n );\n protected readonly isRequired = computed(\n () => this.context?.isRequired() ?? false,\n );\n protected readonly triggerId = computed(\n () => this.context?.fieldId() || null,\n );\n protected readonly describedBy = computed(\n () => this.context?.describedByIds() ?? null,\n );\n\n constructor() {\n // Feed the keyboard controller whenever the projected option set changes (signal → array rebuild).\n effect(() => this.keyboard.setItems(this.options()));\n // Mirror the active descendant to the trigger's aria-activedescendant.\n this.keyboard.onActiveChange((item) =>\n this.activeOptionId.set(item?.optionId ?? null),\n );\n inject(DestroyRef).onDestroy(() => this.teardown());\n }\n\n // ── SkraListboxPanel seam — the per-widget divergence (implemented by each concrete) ──\n /** Live selection test: single = equality, multi = membership (both via `compareWith`). */\n abstract isSelected(value: unknown): boolean;\n /** User picked a value: single = replace + close; multi = toggle membership + keep open. */\n abstract selectValue(value: unknown): void;\n /** Cardinality hint read by `skra-option` for the indicator swap — `false` single / `true` multi. */\n abstract readonly multiple: boolean;\n /** Seed the active descendant on open: single = the selected option; multi = the first selected. */\n protected abstract activeSeedItem(): SkraListboxKeyboardItem | null;\n\n // ── Panel open / close (native toggle from the Popover API) ──\n protected onPanelToggle(event: Event): void {\n const open = (event as ToggleEvent).newState === 'open';\n this.isOpen.set(open);\n if (open) this.onOpen();\n else this.onClose();\n }\n\n /**\n * The element the panel is positioned against AND matched in width to (Q-5). Defaults to the trigger\n * — correct for the select family, whose trigger button fills the host. The combobox overrides it to\n * the host box, because its trigger is the INNER input (narrower than the bordered box + chevron), so\n * the panel must align to and match the box, not the input — visual parity with select.\n */\n protected positioningAnchor(): HTMLElement | undefined {\n return this.triggerRef()?.nativeElement;\n }\n\n private onOpen(): void {\n const anchor = this.positioningAnchor();\n const panel = this.panelRef()?.nativeElement;\n if (anchor && panel) {\n // Geometry-only (ADR 0044 §3 rule 4): the panel is at least as wide as the anchor (Q-5).\n panel.style.minInlineSize = `${anchor.offsetWidth}px`;\n this.positioner?.destroy();\n this.positioner = _attachPositioner(anchor, panel, () => ({\n placement: this.placement(),\n offset: this.cssLenPx(\n `--skra-comp-${this.panelTokenPrefix}-panel-offset`,\n ),\n viewportPadding: this.cssLenPx(\n `--skra-comp-${this.panelTokenPrefix}-panel-viewport-padding`,\n ),\n }));\n }\n // Seed the active descendant (single → selected; multi → first selected, else first).\n this.keyboard.setActive(this.activeSeedItem());\n }\n\n private onClose(): void {\n this.positioner?.destroy();\n this.positioner = undefined;\n this.keyboard.clearActive();\n this.activeOptionId.set(null);\n }\n\n /** Select the keyboard's active option (Enter), unless it is soft-disabled. Shared by every trigger shape. */\n protected selectActive(): void {\n const active = this.keyboard.activeItem;\n if (active && !active.disabled) this.selectValue(active.getValue());\n }\n\n protected open(): void {\n this.panelRef()?.nativeElement.showPopover?.();\n }\n protected close(): void {\n this.panelRef()?.nativeElement.hidePopover?.();\n }\n\n /** Read a length comp token (px/rem) off the panel computed style for the positioner. */\n private cssLenPx(prop: string): number {\n const el = this.panelRef()?.nativeElement;\n if (!el) return 0;\n const raw = getComputedStyle(el).getPropertyValue(prop).trim();\n if (raw.endsWith('px')) return parseFloat(raw);\n if (raw.endsWith('rem')) {\n const rootFontSize =\n parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n return parseFloat(raw) * rootFontSize;\n }\n return parseFloat(raw) || 0;\n }\n\n private teardown(): void {\n this.keyboard.destroy();\n this.positioner?.destroy();\n }\n}\n","import { Directive, TemplateRef, contentChild } from '@angular/core';\r\n\r\nimport { _SkraListboxWidgetBase } from './listbox-widget-base';\r\nimport { SkraSelectTrigger } from './select-trigger';\r\n\r\n/**\r\n * _SkraSelectBase — the SELECT-family trigger model over {@link _SkraListboxWidgetBase}: the WAI-ARIA APG\r\n * **Select-Only Combobox** trigger. It adds the `<button>` + native `popovertarget` interaction, the\r\n * type-ahead keydown skeleton, and the ADR 0045 `[skraSelectTrigger]` rich-trigger template. Shared by\r\n * `skra-select` (single) and `skra-multi-select` (multi) — the cardinality split (ADR 0046) lives in\r\n * those concretes (the `SkraListboxPanel` seam: single replaces + closes, multi toggles + stays open).\r\n *\r\n * The trigger-shape-agnostic substrate (field cascade, panel toggle/positioner, keyboard wiring,\r\n * open/close, the selection seam) lives in the parent base, shared verbatim with `skra-combobox`\r\n * (which has a different — editable input — trigger; ADR 0046 amendment 2026-06-13).\r\n *\r\n * Full contract: adr/specs/component-select-spec.md + adr/specs/component-multi-select-spec.md.\r\n */\r\n@Directive()\r\nexport abstract class _SkraSelectBase<\r\n T = unknown,\r\n> extends _SkraListboxWidgetBase<T> {\r\n /** Select-family panel token namespace — `--skra-comp-select-panel-*` (shared single + multi). */\r\n protected readonly panelTokenPrefix = 'select';\r\n\r\n /** Opt-in rich trigger template (ADR 0045 Rule 2). Select-family only — a combobox input shows text. */\r\n protected readonly triggerTemplate = contentChild(SkraSelectTrigger, {\r\n read: TemplateRef,\r\n });\r\n\r\n // ── Trigger interaction (button + native popovertarget) ──\r\n protected onTriggerClick(event: MouseEvent): void {\r\n // Block the native popovertarget open when readonly (disabled is unfocusable/inert natively).\r\n if (this.isReadonly()) event.preventDefault();\r\n }\r\n\r\n protected onTriggerKeydown(event: KeyboardEvent): void {\r\n if (this.isDisabled() || this.isReadonly()) return; // never opens / never mutates\r\n const key = event.key;\r\n const isSpace = key === ' ' || key === 'Spacebar';\r\n const isNav =\r\n key === 'ArrowDown' ||\r\n key === 'ArrowUp' ||\r\n key === 'Home' ||\r\n key === 'End';\r\n const isPrintable =\r\n key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey;\r\n\r\n if (!this.isOpen()) {\r\n // Single open path: suppress the popovertarget's own toggle (Enter/Space) too and open here.\r\n if (isNav || isSpace || key === 'Enter' || isPrintable) {\r\n event.preventDefault();\r\n this.open();\r\n }\r\n return;\r\n }\r\n\r\n // Open:\r\n if (key === 'Enter' || isSpace) {\r\n // Suppress the popovertarget toggle; the concrete `selectValue` decides close (single) vs stay-open (multi).\r\n event.preventDefault();\r\n this.selectActive();\r\n return;\r\n }\r\n if (key === 'Tab') {\r\n this.close(); // APG: Tab closes (keep value); focus proceeds (no preventDefault)\r\n return;\r\n }\r\n if (key === 'Escape') return; // platform (popover=\"auto\") closes; onPanelToggle handles cleanup\r\n if (key === 'ArrowUp' && event.altKey) {\r\n // APG select-only combobox: Alt+Up closes and keeps the current value, focus stays on the\r\n // trigger. Must be handled BEFORE the nav branch — `ArrowUp` is `isNav`, so it would otherwise\r\n // be preventDefault'ed and handed to the key manager, which ignores modified arrows: the\r\n // keystroke did nothing at all.\r\n event.preventDefault();\r\n this.close();\r\n return;\r\n }\r\n if (isNav || isPrintable) {\r\n event.preventDefault();\r\n this.keyboard.onKeydown(event); // move / type-ahead the active descendant\r\n }\r\n }\r\n}\r\n","// @skra/ui/core — shared internal satellites (ADR 0054). Consumed cross-entry by\n// select / multi-select / combobox / datepicker / menu / popover / tooltip.\n\n// --- Public shared surface ---\nexport * from './lib/select/option';\nexport * from './lib/select/option.directives';\nexport * from './lib/select/select-trigger';\nexport {\n SKRA_LISTBOX_PANEL,\n type SkraListboxPanel,\n type SkraListboxKeyboardItem,\n} from './lib/select/select-types';\n\n// --- Internal shared bases (`_`-prefixed = outside SemVer, ADR 0054 R-54.4/R-54.5) ---\nexport * from './lib/select/select-base';\nexport * from './lib/select/listbox-widget-base';\n// Positioner: `_attachPositioner`/`_PositionerOptions`/`_PositionerHandle` are internal\n// (`_`-prefixed = outside SemVer — O-33 (6a) done). `SkraPlacement` is PUBLIC by ruling\n// (consumer-facing placement inputs, re-exported by tooltip/popover/menu/datepicker).\n// See ADR 0054 §7 (2026-07-03 note); enforced by export-surface-validator.\nexport * from './lib/positioning/positioner';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["offset","offsetMiddleware"],"mappings":"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"}
|
|
@@ -114,7 +114,7 @@ class SkraToast {
|
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraToast, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
117
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: SkraToast, isStandalone: true, selector: "skra-toast", inputs: { intent: { classPropertyName: "intent", publicName: "intent", isSignal: true, isRequired: false, transformFunction: null }, emphasis: { classPropertyName: "emphasis", publicName: "emphasis", isSignal: true, isRequired: false, transformFunction: null }, live: { classPropertyName: "live", publicName: "live", isSignal: true, isRequired: false, transformFunction: null }, duration: { classPropertyName: "duration", publicName: "duration", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dismissed: "dismissed" }, host: { listeners: { "mouseenter": "pause()", "mouseleave": "resume()", "focusin": "pause()", "focusout": "resume()" }, properties: { "attr.data-skra-intent": "intent()", "attr.data-skra-emphasis": "emphasis()", "attr.data-skra-has-icon": "hasIcon() ? \"\" : null" } }, queries: [{ propertyName: "iconSlot", first: true, predicate: SkraToastIcon, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "contentRef", first: true, predicate: ["content"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (hasIcon()) {\r\n<span class=\"skra-toast-icon\">\r\n <ng-content select=\"[skra-toast-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<div class=\"skra-toast-content\" #content>\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n@if (dismissible()) {\r\n<button type=\"button\" class=\"skra-toast-dismiss\" (click)=\"onDismiss()\">\r\n <span class=\"skra-toast-dismiss-glyph\" aria-hidden=\"true\">×</span>\r\n <ng-content select=\"[skra-toast-close-label]\"></ng-content>\r\n</button>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:flex;align-items:flex-start;box-sizing:border-box;margin:0;gap:var(--skra-comp-toast-icon-gap);font-family:var(--skra-sys-typography-role-body-medium-font-family);font-size:var(--skra-sys-typography-role-body-medium-font-size);font-weight:var(--skra-sys-typography-role-body-medium-font-weight);line-height:var(--skra-sys-typography-role-body-medium-line-height);letter-spacing:var(--skra-sys-typography-role-body-medium-letter-spacing);background:var(--skra-comp-toast-background);color:var(--skra-comp-toast-foreground);border-color:var(--skra-comp-toast-border-color);border-width:var(--skra-comp-toast-border-width);border-style:var(--skra-comp-toast-border-style);border-radius:var(--skra-comp-toast-radius);padding-block:var(--skra-comp-toast-padding-block);padding-inline:var(--skra-comp-toast-padding-inline);box-shadow:var(--skra-comp-toast-shadow);opacity:1;transition:opacity var(--skra-comp-toast-motion-duration) var(--skra-comp-toast-motion-easing)}@starting-style{:host{opacity:0}}:host([data-skra-emphasis=high]){--skra-comp-toast-border-width: 0}:host([data-skra-intent=neutral][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-neutral-high, var(--skra-sys-color-neutral-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-neutral-high, var(--skra-sys-color-neutral-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-neutral-high, transparent )}:host([data-skra-intent=neutral][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-neutral-medium, var(--skra-sys-color-neutral-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-neutral-medium, var(--skra-sys-color-neutral-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-neutral-medium, var(--skra-sys-color-neutral-border) )}:host([data-skra-intent=info][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-info-high, var(--skra-sys-color-info-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-info-high, var(--skra-sys-color-info-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-info-high, transparent )}:host([data-skra-intent=info][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-info-medium, var(--skra-sys-color-info-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-info-medium, var(--skra-sys-color-info-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-info-medium, var(--skra-sys-color-info-border) )}:host([data-skra-intent=success][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-success-high, var(--skra-sys-color-success-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-success-high, var(--skra-sys-color-success-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-success-high, transparent )}:host([data-skra-intent=success][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-success-medium, var(--skra-sys-color-success-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-success-medium, var(--skra-sys-color-success-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-success-medium, var(--skra-sys-color-success-border) )}:host([data-skra-intent=warning][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-warning-high, var(--skra-sys-color-warning-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-warning-high, var(--skra-sys-color-warning-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-warning-high, transparent )}:host([data-skra-intent=warning][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-warning-medium, var(--skra-sys-color-warning-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-warning-medium, var(--skra-sys-color-warning-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-warning-medium, var(--skra-sys-color-warning-border) )}:host([data-skra-intent=danger][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-danger-high, var(--skra-sys-color-danger-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-danger-high, var(--skra-sys-color-danger-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-danger-high, transparent )}:host([data-skra-intent=danger][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-danger-medium, var(--skra-sys-color-danger-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-danger-medium, var(--skra-sys-color-danger-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-danger-medium, var(--skra-sys-color-danger-border) )}.skra-toast-icon{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;--skra-comp-icon-size: var(--skra-comp-toast-icon-size)}.skra-toast-content{flex:1 1 auto;min-inline-size:0}.skra-toast-dismiss{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--skra-comp-toast-dismiss-size);block-size:var(--skra-comp-toast-dismiss-size);margin:0;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;border-radius:var(--skra-comp-toast-radius);transition:opacity var(--skra-comp-toast-motion-duration) var(--skra-comp-toast-motion-easing)}@media(hover:hover)and (pointer:fine){.skra-toast-dismiss:hover{opacity:.7}}.skra-toast-dismiss:focus-visible{outline-style:solid;outline-color:var(--skra-comp-toast-focus-ring-color);outline-width:var(--skra-comp-toast-focus-ring-width);outline-offset:2px}.skra-toast-dismiss-glyph{font-size:1.25em;line-height:1}@media(prefers-reduced-motion:reduce){:host{transition-duration:0ms}.skra-toast-dismiss{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
117
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: SkraToast, isStandalone: true, selector: "skra-toast", inputs: { intent: { classPropertyName: "intent", publicName: "intent", isSignal: true, isRequired: false, transformFunction: null }, emphasis: { classPropertyName: "emphasis", publicName: "emphasis", isSignal: true, isRequired: false, transformFunction: null }, live: { classPropertyName: "live", publicName: "live", isSignal: true, isRequired: false, transformFunction: null }, duration: { classPropertyName: "duration", publicName: "duration", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dismissed: "dismissed" }, host: { listeners: { "mouseenter": "pause()", "mouseleave": "resume()", "focusin": "pause()", "focusout": "resume()" }, properties: { "attr.data-skra-intent": "intent()", "attr.data-skra-emphasis": "emphasis()", "attr.data-skra-has-icon": "hasIcon() ? \"\" : null" } }, queries: [{ propertyName: "iconSlot", first: true, predicate: SkraToastIcon, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "contentRef", first: true, predicate: ["content"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (hasIcon()) {\r\n<span class=\"skra-toast-icon\">\r\n <ng-content select=\"[skra-toast-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<div class=\"skra-toast-content\" #content>\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n@if (dismissible()) {\r\n<button type=\"button\" class=\"skra-toast-dismiss\" (click)=\"onDismiss()\">\r\n <span class=\"skra-toast-dismiss-glyph\" aria-hidden=\"true\">×</span>\r\n <ng-content select=\"[skra-toast-close-label]\"></ng-content>\r\n</button>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:flex;align-items:flex-start;box-sizing:border-box;margin:0;gap:var(--skra-comp-toast-icon-gap);font-family:var(--skra-sys-typography-role-body-medium-font-family);font-size:var(--skra-sys-typography-role-body-medium-font-size);font-weight:var(--skra-sys-typography-role-body-medium-font-weight);line-height:var(--skra-sys-typography-role-body-medium-line-height);letter-spacing:var(--skra-sys-typography-role-body-medium-letter-spacing);background:var(--skra-comp-toast-background);color:var(--skra-comp-toast-foreground);border-color:var(--skra-comp-toast-border-color);border-width:var(--skra-comp-toast-border-width);border-style:var(--skra-comp-toast-border-style);border-radius:var(--skra-comp-toast-radius);padding-block:var(--skra-comp-toast-padding-block);padding-inline:var(--skra-comp-toast-padding-inline);box-shadow:var(--skra-comp-toast-shadow);opacity:1;transition:opacity var(--skra-comp-toast-motion-duration) var(--skra-comp-toast-motion-easing)}@starting-style{:host{opacity:0}}:host([data-skra-emphasis=high]){--skra-comp-toast-border-width: 0}:host([data-skra-intent=neutral][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-neutral-high, var(--skra-sys-color-neutral-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-neutral-high, var(--skra-sys-color-neutral-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-neutral-high, transparent );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-neutral-high, var(--skra-sys-color-neutral-contrast) )}:host([data-skra-intent=neutral][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-neutral-medium, var(--skra-sys-color-neutral-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-neutral-medium, var(--skra-sys-color-neutral-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-neutral-medium, var(--skra-sys-color-neutral-border) );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-neutral-medium, var(--skra-sys-color-focus-ring) )}:host([data-skra-intent=info][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-info-high, var(--skra-sys-color-info-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-info-high, var(--skra-sys-color-info-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-info-high, transparent );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-info-high, var(--skra-sys-color-info-contrast) )}:host([data-skra-intent=info][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-info-medium, var(--skra-sys-color-info-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-info-medium, var(--skra-sys-color-info-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-info-medium, var(--skra-sys-color-info-border) );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-info-medium, var(--skra-sys-color-focus-ring) )}:host([data-skra-intent=success][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-success-high, var(--skra-sys-color-success-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-success-high, var(--skra-sys-color-success-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-success-high, transparent );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-success-high, var(--skra-sys-color-success-contrast) )}:host([data-skra-intent=success][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-success-medium, var(--skra-sys-color-success-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-success-medium, var(--skra-sys-color-success-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-success-medium, var(--skra-sys-color-success-border) );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-success-medium, var(--skra-sys-color-focus-ring) )}:host([data-skra-intent=warning][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-warning-high, var(--skra-sys-color-warning-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-warning-high, var(--skra-sys-color-warning-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-warning-high, transparent );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-warning-high, var(--skra-sys-color-warning-contrast) )}:host([data-skra-intent=warning][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-warning-medium, var(--skra-sys-color-warning-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-warning-medium, var(--skra-sys-color-warning-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-warning-medium, var(--skra-sys-color-warning-border) );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-warning-medium, var(--skra-sys-color-focus-ring) )}:host([data-skra-intent=danger][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-danger-high, var(--skra-sys-color-danger-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-danger-high, var(--skra-sys-color-danger-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-danger-high, transparent );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-danger-high, var(--skra-sys-color-danger-contrast) )}:host([data-skra-intent=danger][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-danger-medium, var(--skra-sys-color-danger-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-danger-medium, var(--skra-sys-color-danger-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-danger-medium, var(--skra-sys-color-danger-border) );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-danger-medium, var(--skra-sys-color-focus-ring) )}.skra-toast-icon{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;--skra-comp-icon-size: var(--skra-comp-toast-icon-size)}.skra-toast-content{flex:1 1 auto;min-inline-size:0}.skra-toast-dismiss{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--skra-comp-toast-dismiss-size);block-size:var(--skra-comp-toast-dismiss-size);margin:0;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;border-radius:var(--skra-comp-toast-radius);transition:opacity var(--skra-comp-toast-motion-duration) var(--skra-comp-toast-motion-easing)}@media(hover:hover)and (pointer:fine){.skra-toast-dismiss:hover{opacity:.7}}.skra-toast-dismiss:focus-visible{outline-style:solid;outline-color:var(--skra-comp-toast-focus-ring-color);outline-width:var(--skra-comp-toast-focus-ring-width);outline-offset:2px}.skra-toast-dismiss-glyph{font-size:1.25em;line-height:1}@media(prefers-reduced-motion:reduce){:host{transition-duration:0ms}.skra-toast-dismiss{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
118
118
|
}
|
|
119
119
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraToast, decorators: [{
|
|
120
120
|
type: Component,
|
|
@@ -130,7 +130,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImpor
|
|
|
130
130
|
'(mouseleave)': 'resume()',
|
|
131
131
|
'(focusin)': 'pause()',
|
|
132
132
|
'(focusout)': 'resume()',
|
|
133
|
-
}, template: "@if (hasIcon()) {\r\n<span class=\"skra-toast-icon\">\r\n <ng-content select=\"[skra-toast-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<div class=\"skra-toast-content\" #content>\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n@if (dismissible()) {\r\n<button type=\"button\" class=\"skra-toast-dismiss\" (click)=\"onDismiss()\">\r\n <span class=\"skra-toast-dismiss-glyph\" aria-hidden=\"true\">×</span>\r\n <ng-content select=\"[skra-toast-close-label]\"></ng-content>\r\n</button>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:flex;align-items:flex-start;box-sizing:border-box;margin:0;gap:var(--skra-comp-toast-icon-gap);font-family:var(--skra-sys-typography-role-body-medium-font-family);font-size:var(--skra-sys-typography-role-body-medium-font-size);font-weight:var(--skra-sys-typography-role-body-medium-font-weight);line-height:var(--skra-sys-typography-role-body-medium-line-height);letter-spacing:var(--skra-sys-typography-role-body-medium-letter-spacing);background:var(--skra-comp-toast-background);color:var(--skra-comp-toast-foreground);border-color:var(--skra-comp-toast-border-color);border-width:var(--skra-comp-toast-border-width);border-style:var(--skra-comp-toast-border-style);border-radius:var(--skra-comp-toast-radius);padding-block:var(--skra-comp-toast-padding-block);padding-inline:var(--skra-comp-toast-padding-inline);box-shadow:var(--skra-comp-toast-shadow);opacity:1;transition:opacity var(--skra-comp-toast-motion-duration) var(--skra-comp-toast-motion-easing)}@starting-style{:host{opacity:0}}:host([data-skra-emphasis=high]){--skra-comp-toast-border-width: 0}:host([data-skra-intent=neutral][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-neutral-high, var(--skra-sys-color-neutral-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-neutral-high, var(--skra-sys-color-neutral-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-neutral-high, transparent )}:host([data-skra-intent=neutral][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-neutral-medium, var(--skra-sys-color-neutral-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-neutral-medium, var(--skra-sys-color-neutral-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-neutral-medium, var(--skra-sys-color-neutral-border) )}:host([data-skra-intent=info][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-info-high, var(--skra-sys-color-info-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-info-high, var(--skra-sys-color-info-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-info-high, transparent )}:host([data-skra-intent=info][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-info-medium, var(--skra-sys-color-info-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-info-medium, var(--skra-sys-color-info-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-info-medium, var(--skra-sys-color-info-border) )}:host([data-skra-intent=success][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-success-high, var(--skra-sys-color-success-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-success-high, var(--skra-sys-color-success-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-success-high, transparent )}:host([data-skra-intent=success][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-success-medium, var(--skra-sys-color-success-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-success-medium, var(--skra-sys-color-success-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-success-medium, var(--skra-sys-color-success-border) )}:host([data-skra-intent=warning][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-warning-high, var(--skra-sys-color-warning-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-warning-high, var(--skra-sys-color-warning-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-warning-high, transparent )}:host([data-skra-intent=warning][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-warning-medium, var(--skra-sys-color-warning-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-warning-medium, var(--skra-sys-color-warning-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-warning-medium, var(--skra-sys-color-warning-border) )}:host([data-skra-intent=danger][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-danger-high, var(--skra-sys-color-danger-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-danger-high, var(--skra-sys-color-danger-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-danger-high, transparent )}:host([data-skra-intent=danger][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-danger-medium, var(--skra-sys-color-danger-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-danger-medium, var(--skra-sys-color-danger-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-danger-medium, var(--skra-sys-color-danger-border) )}.skra-toast-icon{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;--skra-comp-icon-size: var(--skra-comp-toast-icon-size)}.skra-toast-content{flex:1 1 auto;min-inline-size:0}.skra-toast-dismiss{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--skra-comp-toast-dismiss-size);block-size:var(--skra-comp-toast-dismiss-size);margin:0;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;border-radius:var(--skra-comp-toast-radius);transition:opacity var(--skra-comp-toast-motion-duration) var(--skra-comp-toast-motion-easing)}@media(hover:hover)and (pointer:fine){.skra-toast-dismiss:hover{opacity:.7}}.skra-toast-dismiss:focus-visible{outline-style:solid;outline-color:var(--skra-comp-toast-focus-ring-color);outline-width:var(--skra-comp-toast-focus-ring-width);outline-offset:2px}.skra-toast-dismiss-glyph{font-size:1.25em;line-height:1}@media(prefers-reduced-motion:reduce){:host{transition-duration:0ms}.skra-toast-dismiss{transition:none}}\n"] }]
|
|
133
|
+
}, template: "@if (hasIcon()) {\r\n<span class=\"skra-toast-icon\">\r\n <ng-content select=\"[skra-toast-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<div class=\"skra-toast-content\" #content>\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n@if (dismissible()) {\r\n<button type=\"button\" class=\"skra-toast-dismiss\" (click)=\"onDismiss()\">\r\n <span class=\"skra-toast-dismiss-glyph\" aria-hidden=\"true\">×</span>\r\n <ng-content select=\"[skra-toast-close-label]\"></ng-content>\r\n</button>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:flex;align-items:flex-start;box-sizing:border-box;margin:0;gap:var(--skra-comp-toast-icon-gap);font-family:var(--skra-sys-typography-role-body-medium-font-family);font-size:var(--skra-sys-typography-role-body-medium-font-size);font-weight:var(--skra-sys-typography-role-body-medium-font-weight);line-height:var(--skra-sys-typography-role-body-medium-line-height);letter-spacing:var(--skra-sys-typography-role-body-medium-letter-spacing);background:var(--skra-comp-toast-background);color:var(--skra-comp-toast-foreground);border-color:var(--skra-comp-toast-border-color);border-width:var(--skra-comp-toast-border-width);border-style:var(--skra-comp-toast-border-style);border-radius:var(--skra-comp-toast-radius);padding-block:var(--skra-comp-toast-padding-block);padding-inline:var(--skra-comp-toast-padding-inline);box-shadow:var(--skra-comp-toast-shadow);opacity:1;transition:opacity var(--skra-comp-toast-motion-duration) var(--skra-comp-toast-motion-easing)}@starting-style{:host{opacity:0}}:host([data-skra-emphasis=high]){--skra-comp-toast-border-width: 0}:host([data-skra-intent=neutral][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-neutral-high, var(--skra-sys-color-neutral-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-neutral-high, var(--skra-sys-color-neutral-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-neutral-high, transparent );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-neutral-high, var(--skra-sys-color-neutral-contrast) )}:host([data-skra-intent=neutral][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-neutral-medium, var(--skra-sys-color-neutral-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-neutral-medium, var(--skra-sys-color-neutral-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-neutral-medium, var(--skra-sys-color-neutral-border) );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-neutral-medium, var(--skra-sys-color-focus-ring) )}:host([data-skra-intent=info][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-info-high, var(--skra-sys-color-info-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-info-high, var(--skra-sys-color-info-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-info-high, transparent );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-info-high, var(--skra-sys-color-info-contrast) )}:host([data-skra-intent=info][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-info-medium, var(--skra-sys-color-info-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-info-medium, var(--skra-sys-color-info-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-info-medium, var(--skra-sys-color-info-border) );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-info-medium, var(--skra-sys-color-focus-ring) )}:host([data-skra-intent=success][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-success-high, var(--skra-sys-color-success-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-success-high, var(--skra-sys-color-success-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-success-high, transparent );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-success-high, var(--skra-sys-color-success-contrast) )}:host([data-skra-intent=success][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-success-medium, var(--skra-sys-color-success-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-success-medium, var(--skra-sys-color-success-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-success-medium, var(--skra-sys-color-success-border) );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-success-medium, var(--skra-sys-color-focus-ring) )}:host([data-skra-intent=warning][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-warning-high, var(--skra-sys-color-warning-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-warning-high, var(--skra-sys-color-warning-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-warning-high, transparent );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-warning-high, var(--skra-sys-color-warning-contrast) )}:host([data-skra-intent=warning][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-warning-medium, var(--skra-sys-color-warning-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-warning-medium, var(--skra-sys-color-warning-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-warning-medium, var(--skra-sys-color-warning-border) );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-warning-medium, var(--skra-sys-color-focus-ring) )}:host([data-skra-intent=danger][data-skra-emphasis=high]){--skra-comp-toast-background: var( --skra-comp-toast-background-danger-high, var(--skra-sys-color-danger-base) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-danger-high, var(--skra-sys-color-danger-contrast) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-danger-high, transparent );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-danger-high, var(--skra-sys-color-danger-contrast) )}:host([data-skra-intent=danger][data-skra-emphasis=medium]){--skra-comp-toast-background: var( --skra-comp-toast-background-danger-medium, var(--skra-sys-color-danger-soft) );--skra-comp-toast-foreground: var( --skra-comp-toast-foreground-danger-medium, var(--skra-sys-color-danger-strong) );--skra-comp-toast-border-color: var( --skra-comp-toast-border-color-danger-medium, var(--skra-sys-color-danger-border) );--skra-comp-toast-focus-ring-color: var( --skra-comp-toast-focus-ring-color-danger-medium, var(--skra-sys-color-focus-ring) )}.skra-toast-icon{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;--skra-comp-icon-size: var(--skra-comp-toast-icon-size)}.skra-toast-content{flex:1 1 auto;min-inline-size:0}.skra-toast-dismiss{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--skra-comp-toast-dismiss-size);block-size:var(--skra-comp-toast-dismiss-size);margin:0;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;border-radius:var(--skra-comp-toast-radius);transition:opacity var(--skra-comp-toast-motion-duration) var(--skra-comp-toast-motion-easing)}@media(hover:hover)and (pointer:fine){.skra-toast-dismiss:hover{opacity:.7}}.skra-toast-dismiss:focus-visible{outline-style:solid;outline-color:var(--skra-comp-toast-focus-ring-color);outline-width:var(--skra-comp-toast-focus-ring-width);outline-offset:2px}.skra-toast-dismiss-glyph{font-size:1.25em;line-height:1}@media(prefers-reduced-motion:reduce){:host{transition-duration:0ms}.skra-toast-dismiss{transition:none}}\n"] }]
|
|
134
134
|
}], ctorParameters: () => [], propDecorators: { intent: [{ type: i0.Input, args: [{ isSignal: true, alias: "intent", required: false }] }], emphasis: [{ type: i0.Input, args: [{ isSignal: true, alias: "emphasis", required: false }] }], live: [{ type: i0.Input, args: [{ isSignal: true, alias: "live", required: false }] }], duration: [{ type: i0.Input, args: [{ isSignal: true, alias: "duration", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], dismissed: [{ type: i0.Output, args: ["dismissed"] }], iconSlot: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SkraToastIcon), { isSignal: true }] }], contentRef: [{ type: i0.ViewChild, args: ['content', { isSignal: true }] }] } });
|
|
135
135
|
|
|
136
136
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skra-ui-toast.mjs","sources":["../../../../libs/ui/toast/src/lib/toast.directives.ts","../../../../libs/ui/toast/src/lib/toast/toast-announcer.ts","../../../../libs/ui/toast/src/lib/toast/toast.ts","../../../../libs/ui/toast/src/lib/toast/toast.html","../../../../libs/ui/toast/src/lib/toast/toast-region.ts","../../../../libs/ui/toast/src/lib/toast/toast-region.html","../../../../libs/ui/toast/src/skra-ui-toast.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n/**\n * Marker directive for the leading icon slot of `<skra-toast>`.\n * Detected via `contentChild` (ADR 020 Smart Slots v2.0) to toggle the icon\n * wrapper without emitting an empty DOM node. Feedback-local (not the button\n * lib's `[skra-start]`) to avoid a cross-lib marker dependency — mirrors\n * `[skra-alert-icon]` / `[skra-badge-icon]`.\n */\n@Directive({\n selector: '[skra-toast-icon]',\n standalone: true,\n})\nexport class SkraToastIcon {}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Politeness routed to the toast region's role-only announcer (ADR 0052 §7).\n * `off` never reaches the announcer (no announcement), so the seam only carries\n * the two announced levels.\n */\nexport type SkraToastPoliteness = 'polite' | 'assertive';\n\n/**\n * The ADR 0052 §7 announcement seam. Provided by `<skra-toast-region>` and injected\n * (optionally) by each projected `<skra-toast>`. The toast pushes its message text on\n * appearance; the region writes it into the matching PERSISTENT, role-only announcer\n * (`role=\"status\"` for polite / `role=\"alert\"` for assertive) — never a role/`aria-live`\n * on the ephemeral toast host. This is why a live region pre-exists the content it\n * announces (WCAG 4.1.3): the announcers are rendered from the region's first render.\n *\n * Narrow seam (like `SkraSelectPanel` / `SkraFieldContext`): the toast depends on the\n * interface, not the concrete region. Content-projected toasts inject from their DECLARED\n * parent element (= the region), the same DI mechanism as `SkraFieldContext` (ADR 013).\n */\nexport interface SkraToastAnnouncer {\n /** Announce `text` at the given politeness by writing it into the matching live region. */\n announce(text: string, politeness: SkraToastPoliteness): void;\n}\n\nexport const SKRA_TOAST_ANNOUNCER = new InjectionToken<SkraToastAnnouncer>(\n 'SKRA_TOAST_ANNOUNCER',\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n computed,\n contentChild,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { SkraToastIcon } from '../toast.directives';\nimport {\n SKRA_TOAST_ANNOUNCER,\n type SkraToastPoliteness,\n} from './toast-announcer';\n\n/**\n * ToastIntent — semantic feedback meaning (ADR 035 §3.1, downward subset). Excludes the\n * action intents `primary`/`secondary`. Same enum as Alert/Badge.\n */\nexport type ToastIntent = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\n/** ToastEmphasis — `high` = filled, `medium` = soft. `low` deferred (ADR 035 §3.1). */\nexport type ToastEmphasis = 'high' | 'medium';\n\n/**\n * ToastLive — screen-reader announcement politeness (ADR 0052). For Toast the politeness\n * is routed to the REGION's announcer (ADR 0052 §7); it does NOT set a role on this host.\n * Default `polite` (toasts are always dynamically presented — ADR 0052 §4). `assertive`\n * for error toasts, set explicitly by the consumer — NEVER auto-derived from `intent`.\n */\nexport type ToastLive = 'off' | 'polite' | 'assertive';\n\n/**\n * `<skra-toast>` — an ephemeral, auto-dismissing feedback message rendered inside a\n * `<skra-toast-region>` top-layer stack (Feedback/Status family, ADR 0052; Tier 2 overlay,\n * ADR 0044). Visually an Alert (intent×emphasis seam, 4th consumer) with a timer.\n *\n * Announcement (ADR 0052 §7): this host carries NO `role`/`aria-live`. On appearance the\n * toast pushes its message text into the region's persistent role-only announcer via the\n * injected `SkraToastAnnouncer`, at the politeness of `live` (`off` → no announcement).\n *\n * Auto-dismiss (WCAG 2.2.1): after `duration` ms the toast emits `(dismissed)`. The timer\n * PAUSES on hover and on focus-within and resumes with the remaining time; `duration=0`\n * disables it (persistent — pair with `dismissible`). Forge does NOT self-remove — the\n * consumer removes the model from its array on `(dismissed)` (agnostic doctrine; the Alert\n * precedent). `(dismissed)` is the single removal channel (timer elapse OR close control).\n */\n@Component({\n selector: 'skra-toast',\n standalone: true,\n imports: [SkraToastIcon],\n templateUrl: './toast.html',\n styleUrl: './toast.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // Variant Surface reflection (ADR 035 §3.5; ADR 021 — never [style.--var])\n '[attr.data-skra-intent]': 'intent()',\n '[attr.data-skra-emphasis]': 'emphasis()',\n // Smart Slot layout reflection (ADR 020 v2.0 — slot-presence, State-Surface-exempt §3.6)\n '[attr.data-skra-has-icon]': 'hasIcon() ? \"\" : null',\n // NO `role` / NO `aria-live` here — the region announces (ADR 0052 §7).\n // Pause/resume the auto-dismiss timer on hover + focus (WCAG 2.2.1 Timing Adjustable).\n '(mouseenter)': 'pause()',\n '(mouseleave)': 'resume()',\n '(focusin)': 'pause()',\n '(focusout)': 'resume()',\n },\n})\nexport class SkraToast {\n // --- Variant Surface (ADR 035) ---\n readonly intent = input<ToastIntent>('neutral');\n readonly emphasis = input<ToastEmphasis>('medium');\n\n // --- Announcement (ADR 0052 §7) ---\n readonly live = input<ToastLive>('polite');\n\n // --- Auto-dismiss + dismissal ---\n readonly duration = input<number>(5000);\n readonly dismissible = input(false, { transform: booleanAttribute });\n readonly dismissed = output<void>();\n\n // --- Smart Slots v2.0 (ADR 020) ---\n readonly iconSlot = contentChild(SkraToastIcon);\n readonly hasIcon = computed(() => !!this.iconSlot());\n\n /** The message column — its text is the announcement (excludes the icon + sr-only close label). */\n private readonly contentRef =\n viewChild.required<ElementRef<HTMLElement>>('content');\n\n private readonly announcer = inject(SKRA_TOAST_ANNOUNCER, {\n optional: true,\n });\n\n private timerId: ReturnType<typeof setTimeout> | null = null;\n private remaining = 0;\n private startedAt = 0;\n\n constructor() {\n afterNextRender(() => {\n // Announce on appearance (browser-only; projected content is present post-render).\n const live = this.live();\n if (live !== 'off' && this.announcer) {\n const text = this.contentRef().nativeElement.textContent?.trim() ?? '';\n if (text) this.announcer.announce(text, live as SkraToastPoliteness);\n }\n // Start the auto-dismiss countdown (timers are browser-only — SSR-safe by construction).\n this.remaining = this.duration();\n this.start();\n });\n inject(DestroyRef).onDestroy(() => this.clear());\n }\n\n protected onDismiss(): void {\n this.clear();\n this.dismissed.emit();\n }\n\n /** Pause the countdown, banking the remaining time (WCAG 2.2.1). */\n protected pause(): void {\n if (this.timerId === null) return;\n clearTimeout(this.timerId);\n this.timerId = null;\n this.remaining -= Date.now() - this.startedAt;\n }\n\n /** Resume the countdown with the banked remaining time. */\n protected resume(): void {\n if (this.timerId !== null) return;\n this.start();\n }\n\n private start(): void {\n if (this.remaining <= 0) return; // duration=0 (or fully elapsed) → persistent\n this.startedAt = Date.now();\n this.timerId = setTimeout(() => {\n this.timerId = null;\n this.dismissed.emit();\n }, this.remaining);\n }\n\n private clear(): void {\n if (this.timerId !== null) {\n clearTimeout(this.timerId);\n this.timerId = null;\n }\n }\n}\n","@if (hasIcon()) {\r\n<span class=\"skra-toast-icon\">\r\n <ng-content select=\"[skra-toast-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<div class=\"skra-toast-content\" #content>\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n@if (dismissible()) {\r\n<button type=\"button\" class=\"skra-toast-dismiss\" (click)=\"onDismiss()\">\r\n <span class=\"skra-toast-dismiss-glyph\" aria-hidden=\"true\">×</span>\r\n <ng-content select=\"[skra-toast-close-label]\"></ng-content>\r\n</button>\r\n}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n afterRenderEffect,\n contentChildren,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SkraToast } from './toast';\nimport {\n SKRA_TOAST_ANNOUNCER,\n type SkraToastAnnouncer,\n type SkraToastPoliteness,\n} from './toast-announcer';\n\n/**\n * ToastPlacement — viewport corner, logical (RTL-correct). `block-start`/`block-end` = the\n * top/bottom edge; `inline-start`/`center`/`inline-end` = the horizontal position.\n */\nexport type ToastPlacement =\n | 'block-start inline-start'\n | 'block-start center'\n | 'block-start inline-end'\n | 'block-end inline-start'\n | 'block-end center'\n | 'block-end inline-end';\n\n/**\n * `<skra-toast-region>` — the persistent, app-root manager for `<skra-toast>` (ADR 0044 §7\n * non-anchored top-layer; ADR 0052 §7 announcer). Place ONCE near the app root; the consumer\n * projects its own `@for` of toast models into it and owns the array (agnostic doctrine —\n * a `ToastService` push/remove helper is a consumer recipe, NOT shipped here).\n *\n * Two mechanisms:\n * - Announcement (ADR 0052 §7): provides `SkraToastAnnouncer` + renders TWO persistent,\n * visually-hidden, role-only announcers (`role=\"status\"` polite / `role=\"alert\"` assertive).\n * A toast pushes its text on appearance; identical repeated messages re-announce via a\n * clear-then-set across two frames (forces a live-region mutation).\n * - Top layer (ADR 0044 §7): a SINGLE `popover=\"manual\"` stack (not `auto` — no light-dismiss /\n * Escape collapse; not N popovers). Shown when non-empty; RE-ASSERTS top-layer order on each\n * addition (`hidePopover()`+`showPopover()`) so a toast raised over an open modal `<dialog>`\n * paints above it. Paint-only — never moves focus, never disturbs the dialog. Zero z-index.\n */\n@Component({\n selector: 'skra-toast-region',\n standalone: true,\n templateUrl: './toast-region.html',\n styleUrl: './toast-region.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n '[attr.data-skra-placement]': 'placement()',\n },\n providers: [{ provide: SKRA_TOAST_ANNOUNCER, useExisting: SkraToastRegion }],\n})\nexport class SkraToastRegion implements SkraToastAnnouncer {\n readonly placement = input<ToastPlacement>('block-end inline-end');\n\n /** The two persistent role-only announcer buffers (ADR 0052 §7). */\n protected readonly politeMsg = signal('');\n protected readonly assertiveMsg = signal('');\n\n private readonly toasts = contentChildren(SkraToast);\n private readonly stackEl =\n viewChild.required<ElementRef<HTMLElement>>('stack');\n\n /** Tracked locally — jsdom/SSR have no `:popover-open`; never read it back. */\n private shown = false;\n private prevCount = 0;\n\n constructor() {\n // Browser-only (afterRender family never runs on the server — SSR-safe, O-18). Reads the\n // contentChildren signal so it re-runs whenever the visible toast set changes.\n afterRenderEffect(() => {\n // Re-assert keys on the COUNT, not toast identity: a remove+add in the SAME change-detection\n // tick keeps `n` unchanged and skips the re-assert, so the new toast would not be raised above\n // an already-open modal. Accepted for the auto-dismiss MVP (paint-only; announcement is\n // unaffected); the cross-browser top-layer pass folds into O-9 (spec Open Question 3).\n const n = this.toasts().length;\n const stack = this.stackEl().nativeElement;\n if (n > 0) {\n if (n > this.prevCount && this.shown) {\n // Re-assert top-layer order on additions (ADR 0044 §7) — drop then re-add to the top.\n stack.hidePopover?.();\n this.shown = false;\n }\n if (!this.shown) {\n stack.showPopover?.();\n this.shown = true;\n }\n } else if (this.shown) {\n stack.hidePopover?.();\n this.shown = false;\n }\n this.prevCount = n;\n });\n }\n\n /**\n * ADR 0052 §7 — write `text` into the matching persistent announcer. Clear-then-set across two\n * animation frames so a repeated IDENTICAL message still mutates the live region and re-announces\n * (the \"repeated action\" case). `off` toasts never call this.\n */\n announce(text: string, politeness: SkraToastPoliteness): void {\n const target =\n politeness === 'assertive' ? this.assertiveMsg : this.politeMsg;\n target.set('');\n requestAnimationFrame(() => requestAnimationFrame(() => target.set(text)));\n }\n}\n","<div class=\"skra-toast-stack\" popover=\"manual\" #stack>\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<!--\r\n ADR 0052 §7 — two PERSISTENT, role-only live announcers, held in normal flow (NOT inside the\r\n popover, so they are pre-armed and announce regardless of the stack's shown/paint state).\r\n role=\"status\" carries aria-live=polite + aria-atomic; role=\"alert\" carries assertive + atomic\r\n (implicitly — no explicit aria-live, ADR 0052 rule 2). Each holds one message at a time.\r\n-->\r\n<div class=\"skra-sr-only\" role=\"status\">{{ politeMsg() }}</div>\r\n<div class=\"skra-sr-only\" role=\"alert\">{{ assertiveMsg() }}</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skra-ui-toast.mjs","sources":["../../../../libs/ui/toast/src/lib/toast.directives.ts","../../../../libs/ui/toast/src/lib/toast/toast-announcer.ts","../../../../libs/ui/toast/src/lib/toast/toast.ts","../../../../libs/ui/toast/src/lib/toast/toast.html","../../../../libs/ui/toast/src/lib/toast/toast-region.ts","../../../../libs/ui/toast/src/lib/toast/toast-region.html","../../../../libs/ui/toast/src/skra-ui-toast.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n/**\n * Marker directive for the leading icon slot of `<skra-toast>`.\n * Detected via `contentChild` (ADR 020 Smart Slots v2.0) to toggle the icon\n * wrapper without emitting an empty DOM node. Feedback-local (not the button\n * lib's `[skra-start]`) to avoid a cross-lib marker dependency — mirrors\n * `[skra-alert-icon]` / `[skra-badge-icon]`.\n */\n@Directive({\n selector: '[skra-toast-icon]',\n standalone: true,\n})\nexport class SkraToastIcon {}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Politeness routed to the toast region's role-only announcer (ADR 0052 §7).\n * `off` never reaches the announcer (no announcement), so the seam only carries\n * the two announced levels.\n */\nexport type SkraToastPoliteness = 'polite' | 'assertive';\n\n/**\n * The ADR 0052 §7 announcement seam. Provided by `<skra-toast-region>` and injected\n * (optionally) by each projected `<skra-toast>`. The toast pushes its message text on\n * appearance; the region writes it into the matching PERSISTENT, role-only announcer\n * (`role=\"status\"` for polite / `role=\"alert\"` for assertive) — never a role/`aria-live`\n * on the ephemeral toast host. This is why a live region pre-exists the content it\n * announces (WCAG 4.1.3): the announcers are rendered from the region's first render.\n *\n * Narrow seam (like `SkraSelectPanel` / `SkraFieldContext`): the toast depends on the\n * interface, not the concrete region. Content-projected toasts inject from their DECLARED\n * parent element (= the region), the same DI mechanism as `SkraFieldContext` (ADR 013).\n */\nexport interface SkraToastAnnouncer {\n /** Announce `text` at the given politeness by writing it into the matching live region. */\n announce(text: string, politeness: SkraToastPoliteness): void;\n}\n\nexport const SKRA_TOAST_ANNOUNCER = new InjectionToken<SkraToastAnnouncer>(\n 'SKRA_TOAST_ANNOUNCER',\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n computed,\n contentChild,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { SkraToastIcon } from '../toast.directives';\nimport {\n SKRA_TOAST_ANNOUNCER,\n type SkraToastPoliteness,\n} from './toast-announcer';\n\n/**\n * ToastIntent — semantic feedback meaning (ADR 035 §3.1, downward subset). Excludes the\n * action intents `primary`/`secondary`. Same enum as Alert/Badge.\n */\nexport type ToastIntent = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\n/** ToastEmphasis — `high` = filled, `medium` = soft. `low` deferred (ADR 035 §3.1). */\nexport type ToastEmphasis = 'high' | 'medium';\n\n/**\n * ToastLive — screen-reader announcement politeness (ADR 0052). For Toast the politeness\n * is routed to the REGION's announcer (ADR 0052 §7); it does NOT set a role on this host.\n * Default `polite` (toasts are always dynamically presented — ADR 0052 §4). `assertive`\n * for error toasts, set explicitly by the consumer — NEVER auto-derived from `intent`.\n */\nexport type ToastLive = 'off' | 'polite' | 'assertive';\n\n/**\n * `<skra-toast>` — an ephemeral, auto-dismissing feedback message rendered inside a\n * `<skra-toast-region>` top-layer stack (Feedback/Status family, ADR 0052; Tier 2 overlay,\n * ADR 0044). Visually an Alert (intent×emphasis seam, 4th consumer) with a timer.\n *\n * Announcement (ADR 0052 §7): this host carries NO `role`/`aria-live`. On appearance the\n * toast pushes its message text into the region's persistent role-only announcer via the\n * injected `SkraToastAnnouncer`, at the politeness of `live` (`off` → no announcement).\n *\n * Auto-dismiss (WCAG 2.2.1): after `duration` ms the toast emits `(dismissed)`. The timer\n * PAUSES on hover and on focus-within and resumes with the remaining time; `duration=0`\n * disables it (persistent — pair with `dismissible`). Forge does NOT self-remove — the\n * consumer removes the model from its array on `(dismissed)` (agnostic doctrine; the Alert\n * precedent). `(dismissed)` is the single removal channel (timer elapse OR close control).\n */\n@Component({\n selector: 'skra-toast',\n standalone: true,\n imports: [SkraToastIcon],\n templateUrl: './toast.html',\n styleUrl: './toast.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // Variant Surface reflection (ADR 035 §3.5; ADR 021 — never [style.--var])\n '[attr.data-skra-intent]': 'intent()',\n '[attr.data-skra-emphasis]': 'emphasis()',\n // Smart Slot layout reflection (ADR 020 v2.0 — slot-presence, State-Surface-exempt §3.6)\n '[attr.data-skra-has-icon]': 'hasIcon() ? \"\" : null',\n // NO `role` / NO `aria-live` here — the region announces (ADR 0052 §7).\n // Pause/resume the auto-dismiss timer on hover + focus (WCAG 2.2.1 Timing Adjustable).\n '(mouseenter)': 'pause()',\n '(mouseleave)': 'resume()',\n '(focusin)': 'pause()',\n '(focusout)': 'resume()',\n },\n})\nexport class SkraToast {\n // --- Variant Surface (ADR 035) ---\n readonly intent = input<ToastIntent>('neutral');\n readonly emphasis = input<ToastEmphasis>('medium');\n\n // --- Announcement (ADR 0052 §7) ---\n readonly live = input<ToastLive>('polite');\n\n // --- Auto-dismiss + dismissal ---\n readonly duration = input<number>(5000);\n readonly dismissible = input(false, { transform: booleanAttribute });\n readonly dismissed = output<void>();\n\n // --- Smart Slots v2.0 (ADR 020) ---\n readonly iconSlot = contentChild(SkraToastIcon);\n readonly hasIcon = computed(() => !!this.iconSlot());\n\n /** The message column — its text is the announcement (excludes the icon + sr-only close label). */\n private readonly contentRef =\n viewChild.required<ElementRef<HTMLElement>>('content');\n\n private readonly announcer = inject(SKRA_TOAST_ANNOUNCER, {\n optional: true,\n });\n\n private timerId: ReturnType<typeof setTimeout> | null = null;\n private remaining = 0;\n private startedAt = 0;\n\n constructor() {\n afterNextRender(() => {\n // Announce on appearance (browser-only; projected content is present post-render).\n const live = this.live();\n if (live !== 'off' && this.announcer) {\n const text = this.contentRef().nativeElement.textContent?.trim() ?? '';\n if (text) this.announcer.announce(text, live as SkraToastPoliteness);\n }\n // Start the auto-dismiss countdown (timers are browser-only — SSR-safe by construction).\n this.remaining = this.duration();\n this.start();\n });\n inject(DestroyRef).onDestroy(() => this.clear());\n }\n\n protected onDismiss(): void {\n this.clear();\n this.dismissed.emit();\n }\n\n /** Pause the countdown, banking the remaining time (WCAG 2.2.1). */\n protected pause(): void {\n if (this.timerId === null) return;\n clearTimeout(this.timerId);\n this.timerId = null;\n this.remaining -= Date.now() - this.startedAt;\n }\n\n /** Resume the countdown with the banked remaining time. */\n protected resume(): void {\n if (this.timerId !== null) return;\n this.start();\n }\n\n private start(): void {\n if (this.remaining <= 0) return; // duration=0 (or fully elapsed) → persistent\n this.startedAt = Date.now();\n this.timerId = setTimeout(() => {\n this.timerId = null;\n this.dismissed.emit();\n }, this.remaining);\n }\n\n private clear(): void {\n if (this.timerId !== null) {\n clearTimeout(this.timerId);\n this.timerId = null;\n }\n }\n}\n","@if (hasIcon()) {\r\n<span class=\"skra-toast-icon\">\r\n <ng-content select=\"[skra-toast-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<div class=\"skra-toast-content\" #content>\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n@if (dismissible()) {\r\n<button type=\"button\" class=\"skra-toast-dismiss\" (click)=\"onDismiss()\">\r\n <span class=\"skra-toast-dismiss-glyph\" aria-hidden=\"true\">×</span>\r\n <ng-content select=\"[skra-toast-close-label]\"></ng-content>\r\n</button>\r\n}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n afterRenderEffect,\n contentChildren,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SkraToast } from './toast';\nimport {\n SKRA_TOAST_ANNOUNCER,\n type SkraToastAnnouncer,\n type SkraToastPoliteness,\n} from './toast-announcer';\n\n/**\n * ToastPlacement — viewport corner, logical (RTL-correct). `block-start`/`block-end` = the\n * top/bottom edge; `inline-start`/`center`/`inline-end` = the horizontal position.\n */\nexport type ToastPlacement =\n | 'block-start inline-start'\n | 'block-start center'\n | 'block-start inline-end'\n | 'block-end inline-start'\n | 'block-end center'\n | 'block-end inline-end';\n\n/**\n * `<skra-toast-region>` — the persistent, app-root manager for `<skra-toast>` (ADR 0044 §7\n * non-anchored top-layer; ADR 0052 §7 announcer). Place ONCE near the app root; the consumer\n * projects its own `@for` of toast models into it and owns the array (agnostic doctrine —\n * a `ToastService` push/remove helper is a consumer recipe, NOT shipped here).\n *\n * Two mechanisms:\n * - Announcement (ADR 0052 §7): provides `SkraToastAnnouncer` + renders TWO persistent,\n * visually-hidden, role-only announcers (`role=\"status\"` polite / `role=\"alert\"` assertive).\n * A toast pushes its text on appearance; identical repeated messages re-announce via a\n * clear-then-set across two frames (forces a live-region mutation).\n * - Top layer (ADR 0044 §7): a SINGLE `popover=\"manual\"` stack (not `auto` — no light-dismiss /\n * Escape collapse; not N popovers). Shown when non-empty; RE-ASSERTS top-layer order on each\n * addition (`hidePopover()`+`showPopover()`) so a toast raised over an open modal `<dialog>`\n * paints above it. Paint-only — never moves focus, never disturbs the dialog. Zero z-index.\n */\n@Component({\n selector: 'skra-toast-region',\n standalone: true,\n templateUrl: './toast-region.html',\n styleUrl: './toast-region.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n '[attr.data-skra-placement]': 'placement()',\n },\n providers: [{ provide: SKRA_TOAST_ANNOUNCER, useExisting: SkraToastRegion }],\n})\nexport class SkraToastRegion implements SkraToastAnnouncer {\n readonly placement = input<ToastPlacement>('block-end inline-end');\n\n /** The two persistent role-only announcer buffers (ADR 0052 §7). */\n protected readonly politeMsg = signal('');\n protected readonly assertiveMsg = signal('');\n\n private readonly toasts = contentChildren(SkraToast);\n private readonly stackEl =\n viewChild.required<ElementRef<HTMLElement>>('stack');\n\n /** Tracked locally — jsdom/SSR have no `:popover-open`; never read it back. */\n private shown = false;\n private prevCount = 0;\n\n constructor() {\n // Browser-only (afterRender family never runs on the server — SSR-safe, O-18). Reads the\n // contentChildren signal so it re-runs whenever the visible toast set changes.\n afterRenderEffect(() => {\n // Re-assert keys on the COUNT, not toast identity: a remove+add in the SAME change-detection\n // tick keeps `n` unchanged and skips the re-assert, so the new toast would not be raised above\n // an already-open modal. Accepted for the auto-dismiss MVP (paint-only; announcement is\n // unaffected); the cross-browser top-layer pass folds into O-9 (spec Open Question 3).\n const n = this.toasts().length;\n const stack = this.stackEl().nativeElement;\n if (n > 0) {\n if (n > this.prevCount && this.shown) {\n // Re-assert top-layer order on additions (ADR 0044 §7) — drop then re-add to the top.\n stack.hidePopover?.();\n this.shown = false;\n }\n if (!this.shown) {\n stack.showPopover?.();\n this.shown = true;\n }\n } else if (this.shown) {\n stack.hidePopover?.();\n this.shown = false;\n }\n this.prevCount = n;\n });\n }\n\n /**\n * ADR 0052 §7 — write `text` into the matching persistent announcer. Clear-then-set across two\n * animation frames so a repeated IDENTICAL message still mutates the live region and re-announces\n * (the \"repeated action\" case). `off` toasts never call this.\n */\n announce(text: string, politeness: SkraToastPoliteness): void {\n const target =\n politeness === 'assertive' ? this.assertiveMsg : this.politeMsg;\n target.set('');\n requestAnimationFrame(() => requestAnimationFrame(() => target.set(text)));\n }\n}\n","<div class=\"skra-toast-stack\" popover=\"manual\" #stack>\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<!--\r\n ADR 0052 §7 — two PERSISTENT, role-only live announcers, held in normal flow (NOT inside the\r\n popover, so they are pre-armed and announce regardless of the stack's shown/paint state).\r\n role=\"status\" carries aria-live=polite + aria-atomic; role=\"alert\" carries assertive + atomic\r\n (implicitly — no explicit aria-live, ADR 0052 rule 2). Each holds one message at a time.\r\n-->\r\n<div class=\"skra-sr-only\" role=\"status\">{{ politeMsg() }}</div>\r\n<div class=\"skra-sr-only\" role=\"alert\">{{ assertiveMsg() }}</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skra/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"@angular/core": ">=22.0.0 <23.0.0",
|
|
11
11
|
"@angular/common": ">=22.0.0 <23.0.0",
|
|
12
12
|
"@angular/cdk": ">=22.0.0 <23.0.0",
|
|
13
|
-
"@skra/tokens": "^0.
|
|
13
|
+
"@skra/tokens": "^0.7.0"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"@floating-ui/dom": "^1.7.6",
|
package/types/skra-ui-alert.d.ts
CHANGED
|
@@ -22,6 +22,37 @@ declare class SkraAlertTitle {
|
|
|
22
22
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraAlertTitle, never>;
|
|
23
23
|
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SkraAlertTitle, "[skra-alert-title]", never, {}, {}, never, never, true, never>;
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Marker directive for an ACTION of `<skra-alert>` — "what to do next" ("Try again").
|
|
27
|
+
* Put it on each action; several are allowed and keep the consumer's order. Detected via
|
|
28
|
+
* `contentChildren` (ADR 020) to render the actions region below the message only when one
|
|
29
|
+
* exists. The region sits inside the content column, so it never collides with the dismiss
|
|
30
|
+
* control.
|
|
31
|
+
*
|
|
32
|
+
* The action keeps its OWN meaning: the alert never sets or changes a projected button's
|
|
33
|
+
* `intent` / `emphasis` (ADR 0059 R59.1) — a retry inside a danger alert is not a destructive
|
|
34
|
+
* action. What the alert owns is the region's layout and the focus ring its actions draw on the
|
|
35
|
+
* alert's fill (R59.3). Guaranteed legible on the alert's fill (ADR 0059 R59.2 — the gate
|
|
36
|
+
* measures exactly these):
|
|
37
|
+
*
|
|
38
|
+
* | Alert emphasis | Guaranteed actions |
|
|
39
|
+
* | ------------------- | --------------------------------------------------------------- |
|
|
40
|
+
* | `medium` (default) | `neutral` at any emphasis; any intent at `emphasis="high"` |
|
|
41
|
+
* | `high` | any intent at `emphasis="high"` other than the alert's intent |
|
|
42
|
+
*
|
|
43
|
+
* Anything else (a coloured `medium`/`low` action, a `medium`/`low` action on a `high` alert,
|
|
44
|
+
* a `high` action in the alert's own intent) is unsupported. The zero-config
|
|
45
|
+
* `<button skraButton skra-alert-actions>` (`neutral × high`) is guaranteed everywhere except
|
|
46
|
+
* on a `neutral × high` alert. Admitted atom: `button[skraButton]`.
|
|
47
|
+
*
|
|
48
|
+
* Announcement: a live alert (`live="polite"|"assertive"`) announces its whole text, action
|
|
49
|
+
* labels included (the implicit `role` carries `aria-atomic`, ADR 0052) — the label tells the
|
|
50
|
+
* user an action exists.
|
|
51
|
+
*/
|
|
52
|
+
declare class SkraAlertActions {
|
|
53
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraAlertActions, never>;
|
|
54
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SkraAlertActions, "[skra-alert-actions]", never, {}, {}, never, never, true, never>;
|
|
55
|
+
}
|
|
25
56
|
|
|
26
57
|
/**
|
|
27
58
|
* AlertIntent — semantic feedback meaning (ADR 035 §3.1, downward subset).
|
|
@@ -55,6 +86,10 @@ type AlertLive = 'off' | 'polite' | 'assertive';
|
|
|
55
86
|
* Forge does NOT remove itself from the DOM — the consumer owns removal via `@if`
|
|
56
87
|
* (agnostic-atom doctrine). The close control's accessible name comes from a projected
|
|
57
88
|
* `[skra-alert-close-label]` (sr-only; ADR 033 Path 2) — the "×" glyph is `aria-hidden`.
|
|
89
|
+
*
|
|
90
|
+
* Actions (GitHub #4, ADR 0059): mark each next-step button `[skra-alert-actions]`; they render
|
|
91
|
+
* in a region below the message. The alert owns that region's layout and its focus ring, never
|
|
92
|
+
* the actions' meaning — see `SkraAlertActions` for the guaranteed combinations.
|
|
58
93
|
*/
|
|
59
94
|
declare class SkraAlert {
|
|
60
95
|
readonly intent: _angular_core.InputSignal<AlertIntent>;
|
|
@@ -66,6 +101,8 @@ declare class SkraAlert {
|
|
|
66
101
|
readonly hasIcon: _angular_core.Signal<boolean>;
|
|
67
102
|
readonly titleSlot: _angular_core.Signal<SkraAlertTitle | undefined>;
|
|
68
103
|
readonly hasTitle: _angular_core.Signal<boolean>;
|
|
104
|
+
readonly actionSlots: _angular_core.Signal<readonly SkraAlertActions[]>;
|
|
105
|
+
readonly hasActions: _angular_core.Signal<boolean>;
|
|
69
106
|
/**
|
|
70
107
|
* Map `live` politeness to the implicit-live ARIA role (ADR 0052). The role
|
|
71
108
|
* carries `aria-live` + `aria-atomic` implicitly; `off` → no live region.
|
|
@@ -73,9 +110,9 @@ declare class SkraAlert {
|
|
|
73
110
|
readonly liveRole: _angular_core.Signal<"alert" | "status" | null>;
|
|
74
111
|
protected onDismiss(): void;
|
|
75
112
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraAlert, never>;
|
|
76
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraAlert, "skra-alert", never, { "intent": { "alias": "intent"; "required": false; "isSignal": true; }; "emphasis": { "alias": "emphasis"; "required": false; "isSignal": true; }; "live": { "alias": "live"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; }, ["iconSlot", "titleSlot"], ["[skra-alert-icon]", "[skra-alert-title]", "*", "[skra-alert-close-label]"], true, never>;
|
|
113
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraAlert, "skra-alert", never, { "intent": { "alias": "intent"; "required": false; "isSignal": true; }; "emphasis": { "alias": "emphasis"; "required": false; "isSignal": true; }; "live": { "alias": "live"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; }, ["iconSlot", "titleSlot", "actionSlots"], ["[skra-alert-icon]", "[skra-alert-title]", "*", "[skra-alert-actions]", "[skra-alert-close-label]"], true, never>;
|
|
77
114
|
}
|
|
78
115
|
|
|
79
|
-
export { SkraAlert, SkraAlertIcon, SkraAlertTitle };
|
|
116
|
+
export { SkraAlert, SkraAlertActions, SkraAlertIcon, SkraAlertTitle };
|
|
80
117
|
export type { AlertEmphasis, AlertIntent, AlertLive };
|
|
81
118
|
//# sourceMappingURL=skra-ui-alert.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skra-ui-alert.d.ts","sources":["../../../../libs/ui/alert/src/lib/alert.directives.ts","../../../../libs/ui/alert/src/lib/alert/alert.ts"],"mappings":";;AAEA;;;;;AAKG;AACH,cAIa,aAAa;oDAAb,aAAa;sDAAb,aAAa;AAAG;AAE7B;;;;;;;AAOG;AACH,cAIa,cAAc;oDAAd,cAAc;sDAAd,cAAc;AAAG;;
|
|
1
|
+
{"version":3,"file":"skra-ui-alert.d.ts","sources":["../../../../libs/ui/alert/src/lib/alert.directives.ts","../../../../libs/ui/alert/src/lib/alert/alert.ts"],"mappings":";;AAEA;;;;;AAKG;AACH,cAIa,aAAa;oDAAb,aAAa;sDAAb,aAAa;AAAG;AAE7B;;;;;;;AAOG;AACH,cAIa,cAAc;oDAAd,cAAc;sDAAd,cAAc;AAAG;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;AACH,cAIa,gBAAgB;oDAAhB,gBAAgB;sDAAhB,gBAAgB;AAAG;;AC1ChC;;;;AAIG;AACG,KAAM,WAAW;AAEvB;;;AAGG;KACS,aAAa;AAEzB;;;;AAIG;AACG,KAAM,SAAS;AAErB;;;;;;;;;;;;;;;;;;;AAmBG;AACH,cAsBa,SAAS;qBAEL,aAAA,CAAA,WAAA,CAAA,WAAA;uBACE,aAAA,CAAA,WAAA,CAAA,aAAA;mBAGJ,aAAA,CAAA,WAAA,CAAA,SAAA;0BAGO,aAAA,CAAA,wBAAA;wBACF,aAAA,CAAA,gBAAA;uBAGD,aAAA,CAAA,MAAA,CAAA,aAAA;sBACD,aAAA,CAAA,MAAA;wBAEE,aAAA,CAAA,MAAA,CAAA,cAAA;uBACD,aAAA,CAAA,MAAA;0BAIG,aAAA,CAAA,MAAA,UAAA,gBAAA;yBACD,aAAA,CAAA,MAAA;AAEnB;;;AAGG;uBACc,aAAA,CAAA,MAAA;;oDA5BN,SAAS;sDAAT,SAAS;AA0CrB;;;;","names":[]}
|