@nexterajs/ui 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +279 -34
  2. package/fesm2022/nexterajs-ui-charts.mjs +1096 -0
  3. package/fesm2022/nexterajs-ui-charts.mjs.map +1 -0
  4. package/fesm2022/nexterajs-ui-core.mjs +652 -12
  5. package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
  6. package/fesm2022/nexterajs-ui-display.mjs +1142 -0
  7. package/fesm2022/nexterajs-ui-display.mjs.map +1 -0
  8. package/fesm2022/nexterajs-ui-dropdowns.mjs +321 -33
  9. package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
  10. package/fesm2022/nexterajs-ui-file-uploader.mjs +572 -10
  11. package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
  12. package/fesm2022/nexterajs-ui-forms.mjs +2027 -136
  13. package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
  14. package/fesm2022/nexterajs-ui-grid.mjs +1222 -188
  15. package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
  16. package/fesm2022/nexterajs-ui-intl.mjs +103 -11
  17. package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
  18. package/fesm2022/nexterajs-ui-navigation.mjs +1054 -0
  19. package/fesm2022/nexterajs-ui-navigation.mjs.map +1 -0
  20. package/fesm2022/nexterajs-ui-notify.mjs +46 -44
  21. package/fesm2022/nexterajs-ui-notify.mjs.map +1 -1
  22. package/fesm2022/nexterajs-ui-overlay.mjs +1671 -0
  23. package/fesm2022/nexterajs-ui-overlay.mjs.map +1 -0
  24. package/fesm2022/nexterajs-ui-pivot.mjs +51 -26
  25. package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
  26. package/fesm2022/nexterajs-ui-shell.mjs +542 -0
  27. package/fesm2022/nexterajs-ui-shell.mjs.map +1 -0
  28. package/fesm2022/nexterajs-ui-tree-view.mjs +5 -2
  29. package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
  30. package/fesm2022/nexterajs-ui-validation.mjs +42 -11
  31. package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
  32. package/fesm2022/nexterajs-ui.mjs +5 -0
  33. package/fesm2022/nexterajs-ui.mjs.map +1 -1
  34. package/package.json +33 -2
  35. package/styles/_dropdown.scss +5 -5
  36. package/styles/_editor.scss +52 -17
  37. package/styles/_mixins.scss +1 -1
  38. package/styles/_scrollbar.scss +5 -5
  39. package/styles/_status.scss +21 -0
  40. package/styles/_toast.scss +14 -14
  41. package/styles/_tokens.scss +420 -3
  42. package/styles/_widget.scss +14 -3
  43. package/styles/index.scss +6 -4
  44. package/types/nexterajs-ui-charts.d.ts +446 -0
  45. package/types/nexterajs-ui-core.d.ts +387 -22
  46. package/types/nexterajs-ui-display.d.ts +720 -0
  47. package/types/nexterajs-ui-dropdowns.d.ts +191 -48
  48. package/types/nexterajs-ui-file-uploader.d.ts +236 -7
  49. package/types/nexterajs-ui-forms.d.ts +675 -30
  50. package/types/nexterajs-ui-grid.d.ts +448 -93
  51. package/types/nexterajs-ui-intl.d.ts +39 -4
  52. package/types/nexterajs-ui-navigation.d.ts +531 -0
  53. package/types/nexterajs-ui-notify.d.ts +4 -2
  54. package/types/nexterajs-ui-overlay.d.ts +703 -0
  55. package/types/nexterajs-ui-pivot.d.ts +56 -48
  56. package/types/nexterajs-ui-shell.d.ts +294 -0
  57. package/types/nexterajs-ui-tree-view.d.ts +6 -3
  58. package/types/nexterajs-ui-validation.d.ts +20 -11
  59. package/types/nexterajs-ui.d.ts +5 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexterajs-ui-navigation.mjs","sources":["../../../projects/nextera-ui/navigation/src/lib/tabs/nxe-tab-content.directive.ts","../../../projects/nextera-ui/navigation/src/lib/tabs/nxe-tab.component.ts","../../../projects/nextera-ui/navigation/src/lib/tabs/nxe-tabs.component.ts","../../../projects/nextera-ui/navigation/src/lib/tabs/nxe-tabs.component.html","../../../projects/nextera-ui/navigation/src/lib/stepper/nxe-step-content.directive.ts","../../../projects/nextera-ui/navigation/src/lib/stepper/nxe-step.component.ts","../../../projects/nextera-ui/navigation/src/lib/stepper/nxe-stepper.component.ts","../../../projects/nextera-ui/navigation/src/lib/stepper/nxe-stepper.component.html","../../../projects/nextera-ui/navigation/src/lib/stepper/nxe-stepper-next.directive.ts","../../../projects/nextera-ui/navigation/src/lib/stepper/nxe-stepper-previous.directive.ts","../../../projects/nextera-ui/navigation/src/lib/breadcrumb/nxe-breadcrumb-separator.directive.ts","../../../projects/nextera-ui/navigation/src/lib/breadcrumb/nxe-breadcrumb.component.ts","../../../projects/nextera-ui/navigation/src/lib/breadcrumb/nxe-breadcrumb.component.html","../../../projects/nextera-ui/navigation/src/public-api.ts","../../../projects/nextera-ui/navigation/src/nexterajs-ui-navigation.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\n/**\r\n * Marks the `<ng-template>` that holds a tab's lazy content. The template is stamped out the first\r\n * time the tab is activated, not before, so a heavy panel (a grid, a chart) costs nothing until it\r\n * is opened:\r\n *\r\n * ```html\r\n * <nxe-tab label=\"Lines\">\r\n * <ng-template nxeTabContent><app-po-lines /></ng-template>\r\n * </nxe-tab>\r\n * ```\r\n *\r\n * Whether it is destroyed again when the tab is left is `keepAlive` on the tab or the tabs.\r\n */\r\n@Directive({\r\n selector: 'ng-template[nxeTabContent]',\r\n})\r\nexport class NxeTabContentDirective {\r\n /** The template to render. */\r\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n input,\r\n numberAttribute,\r\n TemplateRef,\r\n viewChild,\r\n} from '@angular/core';\r\nimport type { Params } from '@angular/router';\r\nimport type { NxeStatusFamily } from '@nexterajs/ui/display';\r\nimport { NxeTabContentDirective } from './nxe-tab-content.directive';\r\n\r\n/** What a tab with a `link` does with the query string already in the URL. */\r\nexport type NxeTabQueryParamsHandling = 'merge' | 'preserve' | '';\r\n\r\n/**\r\n * One tab of an {@link NxeTabsComponent}. It draws nothing itself: the parent renders the tab\r\n * button and the panel from the inputs and content declared here.\r\n *\r\n * ```html\r\n * <nxe-tab label=\"Details\">Plain content: created with the page, shown when active.</nxe-tab>\r\n * <nxe-tab label=\"Lines\" [badge]=\"12\" key=\"lines\">\r\n * <ng-template nxeTabContent>Lazy: created the first time the tab opens.</ng-template>\r\n * </nxe-tab>\r\n * <nxe-tab label=\"Pending\" [link]=\"[]\" [queryParams]=\"{ status: 'pending' }\" [badge]=\"4\" />\r\n * ```\r\n *\r\n * With `link` set the tab is an anchor and the URL decides whether it is active (router mode).\r\n */\r\n@Component({\r\n selector: 'nxe-tab',\r\n template: '<ng-template #implicit><ng-content /></ng-template>',\r\n host: { class: 'nxe-tab' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NxeTabComponent {\r\n /** The tab's text. */\r\n readonly label = input<string>('');\r\n /** A stable id for `selectedKey` and for telling tabs apart across reorders. */\r\n readonly key = input<string | null>(null);\r\n /** A count shown after the label in an `nxe-badge`; `null` or `undefined` shows none, 0 shows 0. */\r\n readonly badge = input<number | null | undefined, unknown>(undefined, {\r\n transform: (v) => (v === null || v === undefined || v === '' ? undefined : numberAttribute(v, NaN)),\r\n });\r\n /** Status family of the badge. `neutral` by default: a count in a tab is information, not an alarm. */\r\n readonly badgeFamily = input<NxeStatusFamily>('neutral');\r\n /** Not selectable and skipped by the arrow keys. */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Overrides the tabs' `keepAlive` for this tab: keep the content after leaving it, or destroy it. */\r\n readonly keepAlive = input<boolean | undefined, unknown>(undefined, {\r\n transform: (v) => (v === undefined || v === null || v === '' ? undefined : booleanAttribute(v)),\r\n });\r\n /**\r\n * Router mode. Router commands (`['/pos', id]`, `[]` for the current route) or a URL string; the tab\r\n * becomes an anchor and is active while the URL matches this link plus its `queryParams`.\r\n */\r\n readonly link = input<string | readonly unknown[] | null | undefined>(undefined);\r\n /** Query params of the link, e.g. `{ status: 'pending' }`. */\r\n readonly queryParams = input<Params | null | undefined>(undefined);\r\n /** `merge` keeps the other query params in the URL (a search term, a page) when switching tab. */\r\n readonly queryParamsHandling = input<NxeTabQueryParamsHandling>('');\r\n\r\n private readonly lazy = contentChild(NxeTabContentDirective);\r\n private readonly implicit = viewChild.required<TemplateRef<unknown>>('implicit');\r\n\r\n /** True when the content was declared in an `nxeTabContent` template. */\r\n readonly isLazy = computed(() => this.lazy() !== undefined);\r\n /** The template the parent stamps into the panel. */\r\n readonly contentTemplate = computed(() => this.lazy()?.template ?? this.implicit());\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, NavigationEnd, Router, RouterLink } from '@angular/router';\nimport { NxeBadgeComponent } from '@nexterajs/ui/display';\nimport { filter, map } from 'rxjs';\nimport { NxeTabComponent } from './nxe-tab.component';\n\n/** `automatic`: arrowing to a tab selects it. `manual`: arrows only move focus; Enter or Space selects. */\nexport type NxeTabsActivation = 'automatic' | 'manual';\n\nlet nextTabsId = 0;\n\n/** Whether a declared query param equals what the URL carries (arrays compare element-wise). */\nfunction sameParam(want: unknown, have: unknown): boolean {\n if (have === undefined) {\n return false;\n }\n const norm = (v: unknown): string => (Array.isArray(v) ? v.map(String).join(',') : String(v));\n return norm(want) === norm(have);\n}\n\n/**\n * `nxe-tabs` is a WAI-ARIA tabs widget: a `tablist` of `tab` buttons over `tabpanel`s, one tab in the\n * tab order (roving `tabindex`), Left/Right (flipped in RTL), Home and End to move, and the active tab\n * in `aria-selected`.\n *\n * ```html\n * <nxe-tabs [(selectedKey)]=\"tab\" tablistLabel=\"Purchase order\">\n * <nxe-tab key=\"details\" label=\"Details\">...</nxe-tab>\n * <nxe-tab key=\"lines\" label=\"Lines\" [badge]=\"lines().length\">\n * <ng-template nxeTabContent><app-po-lines /></ng-template>\n * </nxe-tab>\n * <nxe-tab key=\"history\" label=\"History\" disabled />\n * </nxe-tabs>\n * ```\n *\n * **Selection.** `selectedIndex` and `selectedKey` are two-way models. A tab with a `key` is better\n * addressed by key (it survives a tab being added or hidden); if both are set the key wins, so bind one.\n *\n * **Lazy content.** Plain content is part of the page from the start. Content inside\n * `<ng-template nxeTabContent>` is created the first time its tab is active. `keepAlive` (default\n * `true`) then keeps it, with its state, when you leave; `false` destroys it. A tab's own `keepAlive`\n * overrides.\n *\n * **Router mode.** A tab with `link` is an anchor and the URL decides which tab is active, for a route\n * path or for a query param (`[link]=\"[]\" [queryParams]=\"{ status: 'pending' }\"`). Query params are\n * compared as each tab declares them (`queryParamsHandling` plays no part in matching): a key any link\n * tab declares is a key of the group, and a tab that leaves it out is active only while the URL does not\n * carry it, so an \"All\" tab never shares the highlight with \"PO\" at `?status=po`. Of several matches the\n * tab declaring the most params wins. The back button moves the tab. Link tabs follow the URL, so Left/Right only move focus\n * and Enter follows the link. Put a `router-outlet` (or your list) beside the tabs, or give a link tab an\n * `nxeTabContent` panel.\n *\n * **Overflow.** More tabs than fit scroll sideways; the focused or selected tab is kept in view.\n */\n@Component({\n selector: 'nxe-tabs',\n imports: [NgTemplateOutlet, RouterLink, NxeBadgeComponent],\n templateUrl: './nxe-tabs.component.html',\n styleUrl: './nxe-tabs.component.scss',\n host: {\n class: 'nxe-tabs',\n '(keydown)': 'onKeydown($event)',\n '(focusout)': 'onFocusOut($event)',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NxeTabsComponent {\n /** Zero-based index of the selected tab. Two-way. */\n readonly selectedIndex = model(0);\n /** `key` of the selected tab. Two-way; wins over `selectedIndex` when it matches a tab. */\n readonly selectedKey = model<string | null>(null);\n /** `automatic` (default) selects on arrow; `manual` needs Enter or Space. */\n readonly activation = input<NxeTabsActivation>('automatic');\n /** Keep a tab's content alive after leaving it. A tab's own `keepAlive` overrides. */\n readonly keepAlive = input(true, { transform: booleanAttribute });\n /** Accessible name of the tab list. */\n readonly tablistLabel = input<string>('');\n\n protected readonly tabs = contentChildren(NxeTabComponent);\n\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly list = viewChild.required<ElementRef<HTMLElement>>('list');\n private readonly uid = `nxe-tabs-${nextTabsId++}`;\n\n /** The URL after each navigation; what router-mode tabs are matched against. */\n private readonly url = toSignal(\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n map(() => this.router.url),\n ),\n { initialValue: this.router.url },\n );\n\n /** Index of the link tab that matches the URL, or -1. */\n private readonly linkIndex = computed(() => {\n const urlParams = this.router.parseUrl(this.url()).queryParams;\n // The query keys the group discriminates on: any key a link tab declares.\n const groupKeys = new Set<string>();\n for (const tab of this.tabs()) {\n if (tab.link() !== null && tab.link() !== undefined) {\n Object.keys(tab.queryParams() ?? {}).forEach((key) => groupKeys.add(key));\n }\n }\n let best = -1;\n let bestScore = -1;\n this.tabs().forEach((tab, index) => {\n const link = tab.link();\n if (link === null || link === undefined || tab.disabled()) {\n return;\n }\n const declared = tab.queryParams() ?? {};\n // Path only: the tab's own declared params (not merged ones) are compared below.\n const tree = this.router.createUrlTree(typeof link === 'string' ? [link] : [...link], {\n relativeTo: this.route,\n });\n const pathActive = this.router.isActive(tree, {\n paths: 'subset',\n queryParams: 'ignored',\n fragment: 'ignored',\n matrixParams: 'ignored',\n });\n if (!pathActive) {\n return;\n }\n // A group key the tab declares must equal the URL's; one it leaves out must be absent.\n for (const key of groupKeys) {\n const want = declared[key];\n const have = urlParams[key];\n if (want === null || want === undefined) {\n if (have !== undefined) {\n return;\n }\n } else if (!sameParam(want, have)) {\n return;\n }\n }\n const score = Object.keys(declared).length;\n if (score > bestScore) {\n best = index;\n bestScore = score;\n }\n });\n return best;\n });\n\n /** Index of the active tab, or -1 when every tab is disabled. */\n protected readonly activeIndex = computed(() => {\n const tabs = this.tabs();\n const fromUrl = this.linkIndex();\n if (fromUrl >= 0) {\n return fromUrl;\n }\n const key = this.selectedKey();\n if (key !== null) {\n const byKey = tabs.findIndex((tab) => tab.key() === key);\n if (byKey >= 0 && !tabs[byKey].disabled()) {\n return byKey;\n }\n }\n const index = this.selectedIndex();\n if (index >= 0 && index < tabs.length && !tabs[index].disabled()) {\n return index;\n }\n return tabs.findIndex((tab) => !tab.disabled());\n });\n\n private readonly activeTab = computed(() => this.tabs()[this.activeIndex()]);\n\n /** Every tab that has been active, for lazy content that stays alive. */\n private readonly visited = linkedSignal<NxeTabComponent | undefined, ReadonlySet<NxeTabComponent>>({\n source: this.activeTab,\n computation: (tab, previous) => {\n const set = new Set(previous?.value);\n if (tab) {\n set.add(tab);\n }\n return set;\n },\n });\n\n /** The tab with focus inside the list, while it has any. */\n protected readonly focusedIndex = signal<number | undefined>(undefined);\n\n /** The one tab in the tab order: the focused one, else the active one. */\n protected readonly tabbableIndex = computed(() => this.focusedIndex() ?? Math.max(this.activeIndex(), 0));\n\n constructor() {\n // Keep the models in step when the URL moves the tab (back button, a link elsewhere).\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(inject(DestroyRef)),\n )\n .subscribe(() => {\n const index = this.linkIndex();\n if (index >= 0) {\n this.commit(index);\n }\n });\n }\n\n protected tabId(index: number): string {\n return `${this.uid}-tab-${index}`;\n }\n\n protected panelId(index: number): string {\n return `${this.uid}-panel-${index}`;\n }\n\n protected isLink(tab: NxeTabComponent): boolean {\n return tab.link() !== null && tab.link() !== undefined;\n }\n\n /** True when a tab has a panel to point `aria-controls` at. */\n protected hasPanel(tab: NxeTabComponent): boolean {\n return !this.isLink(tab) || tab.isLazy();\n }\n\n /** Whether the panel's content exists right now. */\n protected isRendered(tab: NxeTabComponent, index: number): boolean {\n if (index === this.activeIndex()) {\n return true;\n }\n return (tab.keepAlive() ?? this.keepAlive()) && this.visited().has(tab);\n }\n\n protected select(index: number): void {\n const tab = this.tabs()[index];\n if (!tab || tab.disabled() || this.isLink(tab)) {\n // A link tab is selected by the navigation its anchor triggers, not by us.\n return;\n }\n this.commit(index);\n }\n\n private commit(index: number): void {\n const tab = this.tabs()[index];\n if (!tab) {\n return;\n }\n this.focusedIndex.set(undefined);\n if (this.selectedIndex() !== index) {\n this.selectedIndex.set(index);\n }\n const key = tab.key();\n if (this.selectedKey() !== key) {\n this.selectedKey.set(key);\n }\n }\n\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (!next || !this.list().nativeElement.contains(next)) {\n this.focusedIndex.set(undefined);\n }\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const current = this.triggers().indexOf(event.target as HTMLElement);\n if (current < 0) {\n // Keys typed in a panel are the panel's.\n return;\n }\n const enabled = this.tabs()\n .map((tab, index) => (tab.disabled() ? -1 : index))\n .filter((index) => index >= 0);\n if (enabled.length === 0) {\n return;\n }\n const position = Math.max(enabled.indexOf(current), 0);\n const rtl = getComputedStyle(this.list().nativeElement).direction === 'rtl';\n const step = (by: number) => enabled[(position + by + enabled.length) % enabled.length];\n\n let target: number;\n switch (event.key) {\n case 'ArrowRight':\n target = step(rtl ? -1 : 1);\n break;\n case 'ArrowLeft':\n target = step(rtl ? 1 : -1);\n break;\n case 'Home':\n target = enabled[0];\n break;\n case 'End':\n target = enabled[enabled.length - 1];\n break;\n default:\n // Enter and Space select through the button's own click.\n return;\n }\n event.preventDefault();\n this.focusTab(target);\n if (this.activation() === 'automatic') {\n this.select(target);\n }\n }\n\n private triggers(): HTMLElement[] {\n return Array.from(this.list().nativeElement.querySelectorAll<HTMLElement>('[role=\"tab\"]'));\n }\n\n private focusTab(index: number): void {\n this.focusedIndex.set(index);\n // Focusing scrolls an overflowed tab into view.\n this.triggers()[index]?.focus();\n }\n\n /** Moves focus to the tab that is in the tab order (the active one). */\n focus(): void {\n this.triggers()[this.tabbableIndex()]?.focus();\n }\n}\n","<div class=\"nxe-tabs-scroller\">\r\n <div\r\n #list\r\n class=\"nxe-tabs-list\"\r\n role=\"tablist\"\r\n aria-orientation=\"horizontal\"\r\n [attr.aria-label]=\"tablistLabel() || null\">\r\n @for (tab of tabs(); track tab; let i = $index) {\r\n <ng-template #content>\r\n <span class=\"nxe-tab-label\">{{ tab.label() }}</span>\r\n @if (tab.badge() !== undefined) {\r\n <nxe-badge [value]=\"tab.badge()\" [family]=\"tab.badgeFamily()\" showZero />\r\n }\r\n </ng-template>\r\n @if (isLink(tab)) {\r\n <a\r\n class=\"nxe-tab-trigger\"\r\n role=\"tab\"\r\n [id]=\"tabId(i)\"\r\n [routerLink]=\"tab.disabled() ? null : tab.link()\"\r\n [queryParams]=\"tab.queryParams()\"\r\n [queryParamsHandling]=\"tab.queryParamsHandling()\"\r\n [class.nxe-tab-active]=\"i === activeIndex()\"\r\n [attr.aria-selected]=\"i === activeIndex()\"\r\n [attr.aria-controls]=\"hasPanel(tab) ? panelId(i) : null\"\r\n [attr.aria-disabled]=\"tab.disabled() || null\"\r\n [attr.tabindex]=\"tab.disabled() ? null : i === tabbableIndex() ? 0 : -1\"\r\n (focus)=\"focusedIndex.set(i)\">\r\n <ng-container [ngTemplateOutlet]=\"content\" />\r\n </a>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-tab-trigger\"\r\n role=\"tab\"\r\n [id]=\"tabId(i)\"\r\n [disabled]=\"tab.disabled()\"\r\n [class.nxe-tab-active]=\"i === activeIndex()\"\r\n [attr.aria-selected]=\"i === activeIndex()\"\r\n [attr.aria-controls]=\"panelId(i)\"\r\n [attr.aria-disabled]=\"tab.disabled() || null\"\r\n [attr.tabindex]=\"i === tabbableIndex() ? 0 : -1\"\r\n (focus)=\"focusedIndex.set(i)\"\r\n (click)=\"select(i)\">\r\n <ng-container [ngTemplateOutlet]=\"content\" />\r\n </button>\r\n }\r\n }\r\n </div>\r\n</div>\r\n@for (tab of tabs(); track tab; let i = $index) {\r\n @if (hasPanel(tab)) {\r\n <div\r\n class=\"nxe-tab-panel\"\r\n role=\"tabpanel\"\r\n tabindex=\"0\"\r\n [id]=\"panelId(i)\"\r\n [attr.aria-labelledby]=\"tabId(i)\"\r\n [hidden]=\"i !== activeIndex()\">\r\n @if (isRendered(tab, i)) {\r\n <ng-container [ngTemplateOutlet]=\"tab.contentTemplate()\" />\r\n }\r\n </div>\r\n }\r\n}\r\n","import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\n/**\r\n * Marks the `<ng-template>` that holds a step's lazy content. The template is stamped out the first\r\n * time the step is activated, not before, so a heavy step (a document upload, a review table) costs\r\n * nothing until the user gets there:\r\n *\r\n * ```html\r\n * <nxe-step label=\"Documents\">\r\n * <ng-template nxeStepContent><app-kyb-documents /></ng-template>\r\n * </nxe-step>\r\n * ```\r\n *\r\n * Whether it is destroyed again when the step is left is `keepAlive` on the step or the stepper.\r\n */\r\n@Directive({\r\n selector: 'ng-template[nxeStepContent]',\r\n})\r\nexport class NxeStepContentDirective {\r\n /** The template to render. */\r\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n input,\r\n TemplateRef,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\r\nimport type { AbstractControl } from '@angular/forms';\r\nimport { nxeOptionalBoolean } from '@nexterajs/ui/core';\r\nimport { map, of, startWith, switchMap } from 'rxjs';\r\nimport { NxeStepContentDirective } from './nxe-step-content.directive';\r\n\r\n/** What a step reads from its `stepControl`. A control is not a signal, so each event copies this. */\r\nexport interface NxeStepControlState {\r\n readonly hasControl: boolean;\r\n readonly valid: boolean;\r\n readonly pristine: boolean;\r\n}\r\n\r\nconst NO_CONTROL: NxeStepControlState = { hasControl: false, valid: true, pristine: true };\r\n\r\nfunction snapshot(control: AbstractControl): NxeStepControlState {\r\n return { hasControl: true, valid: control.valid, pristine: control.pristine };\r\n}\r\n\r\n/**\r\n * One step of an {@link NxeStepperComponent}. It draws nothing itself: the stepper renders the header\r\n * and the panel from the inputs and content declared here.\r\n *\r\n * ```html\r\n * <nxe-step label=\"Account\" [stepControl]=\"account\">\r\n * <nxe-form-field label=\"Email\"><nxe-text-box formControlName=\"email\" /></nxe-form-field>\r\n * </nxe-step>\r\n * <nxe-step label=\"Documents\" optional>\r\n * <ng-template nxeStepContent><app-documents /></ng-template>\r\n * </nxe-step>\r\n * ```\r\n *\r\n * **Completed and error.** Left alone a step is completed once the user has been through it and its\r\n * `stepControl` is valid, and shows the error state once they have been through it and the control is\r\n * invalid. `completed` and `hasError` replace that with your own answer (a server check, say).\r\n */\r\n@Component({\r\n selector: 'nxe-step',\r\n template: '<ng-template #implicit><ng-content /></ng-template>',\r\n host: { class: 'nxe-step' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NxeStepComponent {\r\n /** The step's title in the header. */\r\n readonly label = input<string>('');\r\n /** A line under the title. */\r\n readonly description = input<string>('');\r\n /**\r\n * The form (a `FormGroup`, `FormArray` or `FormControl`) that has to be valid before a linear\r\n * stepper lets the user past this step.\r\n */\r\n readonly stepControl = input<AbstractControl | null | undefined>(undefined);\r\n /** Overrides the computed completed state. Unset, it is \"visited and `stepControl` valid\". */\r\n readonly completed = input(undefined, { transform: nxeOptionalBoolean });\r\n /** Overrides the computed error state. Unset, it is \"visited and `stepControl` invalid\". */\r\n readonly hasError = input(undefined, { transform: nxeOptionalBoolean });\r\n /** The step may be skipped: it does not hold a linear stepper back while its form is untouched. */\r\n readonly optional = input(false, { transform: booleanAttribute });\r\n /** A completed step can be reopened. `false` locks it once the user has moved on. */\r\n readonly editable = input(true, { transform: booleanAttribute });\r\n /** Overrides the stepper's `keepAlive` for this step. */\r\n readonly keepAlive = input<boolean | undefined, unknown>(undefined, { transform: nxeOptionalBoolean });\r\n\r\n private readonly lazy = contentChild(NxeStepContentDirective);\r\n private readonly implicit = viewChild.required<TemplateRef<unknown>>('implicit');\r\n\r\n /** True when the content was declared in an `nxeStepContent` template. */\r\n readonly isLazy = computed(() => this.lazy() !== undefined);\r\n /** The template the stepper stamps into the panel. */\r\n readonly contentTemplate = computed(() => this.lazy()?.template ?? this.implicit());\r\n\r\n /** The control's validity, kept in step with it through its `events` stream. */\r\n readonly controlState = toSignal(\r\n toObservable(this.stepControl).pipe(\r\n switchMap((control) =>\r\n control ? control.events.pipe(startWith(null), map(() => snapshot(control))) : of(NO_CONTROL),\r\n ),\r\n ),\r\n { initialValue: NO_CONTROL },\r\n );\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n afterNextRender,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChildren,\r\n DestroyRef,\r\n ElementRef,\r\n inject,\r\n input,\r\n linkedSignal,\r\n model,\r\n numberAttribute,\r\n output,\r\n signal,\r\n viewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NxeMessageService } from '@nexterajs/ui/core';\r\nimport { NxeStepComponent } from './nxe-step.component';\r\n\r\n/** Direction the steps run in. A horizontal stepper turns vertical on a narrow host unless `responsive` is off. */\r\nexport type NxeStepperOrientation = 'horizontal' | 'vertical';\r\n\r\n/** What a step's marker shows: its number, a check once done, or an alert once it has errors. */\r\nexport type NxeStepMarker = 'number' | 'completed' | 'error';\r\n\r\n/** Emitted by `selectionChange` whenever the stepper moves through its API or the user. */\r\nexport interface NxeStepperSelectionChange {\r\n readonly previousIndex: number;\r\n readonly selectedIndex: number;\r\n}\r\n\r\n/** What the template reads for one step; computed once per change instead of by method calls. */\r\ninterface StepView {\r\n readonly step: NxeStepComponent;\r\n readonly index: number;\r\n readonly headerId: string;\r\n readonly panelId: string;\r\n readonly active: boolean;\r\n readonly navigable: boolean;\r\n readonly marker: NxeStepMarker;\r\n readonly completed: boolean;\r\n readonly error: boolean;\r\n readonly rendered: boolean;\r\n}\r\n\r\nlet nextStepperId = 0;\r\n\r\n/**\r\n * `nxe-stepper` is a wizard: an ordered list of `nxe-step`s, one open at a time, with a header that\r\n * shows where the user is and what is done.\r\n *\r\n * ```html\r\n * <nxe-stepper linear [(selectedIndex)]=\"index\" #wizard>\r\n * <nxe-step label=\"Account\" [stepControl]=\"account\">...</nxe-step>\r\n * <nxe-step label=\"Company\" [stepControl]=\"company\">...</nxe-step>\r\n * <nxe-step label=\"Documents\" optional>\r\n * <ng-template nxeStepContent><app-documents /></ng-template>\r\n * </nxe-step>\r\n * <nxe-step label=\"Review\">\r\n * <nxe-button nxeStepperPrevious text=\"Back\" />\r\n * <nxe-button (onClick)=\"submit()\" text=\"Submit\" type=\"default\" />\r\n * </nxe-step>\r\n * </nxe-stepper>\r\n * ```\r\n *\r\n * **Linear and non-linear.** Non-linear (default) lets the user open any step. `linear` makes each step\r\n * hold the user back until it is passable: its `stepControl` is valid (or `completed` says so). Pressing\r\n * Next on a step that is not passable stays put, marks the step's controls as touched so `nxe-form-field`\r\n * shows their errors, announces why, and emits `stepBlocked`. Headers of steps further on are not\r\n * navigable until every step before them is complete. A programmatic `selectedIndex` is not checked.\r\n *\r\n * **API.** `selectedIndex` is a two-way model. `next()`, `previous()`, `select(i)` and `reset()` move it\r\n * and return whether they did; `nxeStepperNext` and `nxeStepperPrevious` are directives that call\r\n * `next()` and `previous()` from a button inside (or, given the stepper, outside) the steps.\r\n *\r\n * **Layout.** Horizontal puts the headers in a row over the open step; vertical stacks each header over its\r\n * own panel. With `responsive` (default) a stepper narrower than `collapseBelow` px is vertical.\r\n *\r\n * **Accessibility.** The steps are an ordered list; the open step's header carries `aria-current=\"step\"`.\r\n * A header is a button while its step can be opened and plain text when it cannot. Arrow keys, Home and\r\n * End move focus between headers. A polite live region announces each change of step (\"Step 2 of 4:\r\n * Company\") and a blocked Next.\r\n */\r\n@Component({\r\n selector: 'nxe-stepper',\r\n imports: [NgTemplateOutlet],\r\n templateUrl: './nxe-stepper.component.html',\r\n styleUrl: './nxe-stepper.component.scss',\r\n host: {\r\n class: 'nxe-stepper',\r\n '(keydown)': 'onKeydown($event)',\r\n '[class.nxe-stepper-vertical]': \"layout() === 'vertical'\",\r\n '[class.nxe-stepper-horizontal]': \"layout() === 'horizontal'\",\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeStepperComponent {\r\n /** Zero-based index of the open step. Two-way. */\r\n readonly selectedIndex = model(0);\r\n /** Each step must be passable before the next opens. */\r\n readonly linear = input(false, { transform: booleanAttribute });\r\n /** `horizontal` (default) or `vertical`. */\r\n readonly orientation = input<NxeStepperOrientation>('horizontal');\r\n /** A horizontal stepper turns vertical when its host is narrower than {@link collapseBelow}. */\r\n readonly responsive = input(true, { transform: booleanAttribute });\r\n /** Host width, in px, under which a responsive horizontal stepper turns vertical. */\r\n readonly collapseBelow = input(560, { transform: (value: unknown) => numberAttribute(value, 560) });\r\n /** Keep a step's lazy content after leaving it. A step's own `keepAlive` overrides. */\r\n readonly keepAlive = input(true, { transform: booleanAttribute });\r\n /** Accessible name of the list of steps; the active language's \"Steps\" when unset. */\r\n readonly stepsLabel = input<string | undefined>(undefined);\r\n\r\n /** The stepper moved to another step. */\r\n readonly selectionChange = output<NxeStepperSelectionChange>();\r\n /** A linear Next was refused; the value is the index of the step that is not complete. */\r\n readonly stepBlocked = output<number>();\r\n\r\n protected readonly steps = contentChildren(NxeStepComponent);\r\n\r\n private readonly messages = inject(NxeMessageService);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly list = viewChild.required<ElementRef<HTMLElement>>('list');\r\n private readonly uid = `nxe-stepper-${nextStepperId++}`;\r\n\r\n /** Whether the host is under {@link collapseBelow}; set from a ResizeObserver. */\r\n private readonly narrow = signal(false);\r\n\r\n /** The orientation actually drawn. */\r\n protected readonly layout = computed<NxeStepperOrientation>(() =>\r\n this.orientation() === 'vertical' || (this.responsive() && this.narrow()) ? 'vertical' : 'horizontal',\r\n );\r\n\r\n /** Index of the open step, kept inside the steps; -1 with no steps. */\r\n readonly activeIndex = computed(() => {\r\n const count = this.steps().length;\r\n return Math.min(Math.max(this.selectedIndex(), 0), count - 1);\r\n });\r\n\r\n private readonly activeStep = computed<NxeStepComponent | undefined>(() => this.steps()[this.activeIndex()]);\r\n\r\n /** Steps that have been open at some point, the open one included. Resets with the stepper. */\r\n private readonly visited = linkedSignal<NxeStepComponent | undefined, ReadonlySet<NxeStepComponent>>({\r\n source: this.activeStep,\r\n computation: (step, previous) => {\r\n const set = new Set(previous?.value);\r\n if (step) {\r\n set.add(step);\r\n }\r\n return set;\r\n },\r\n });\r\n\r\n /** Steps the user tried to leave while they were not passable. */\r\n private readonly attempted = signal<ReadonlySet<NxeStepComponent>>(new Set());\r\n\r\n /** The live region's text. Writable so a blocked Next can announce without moving. */\r\n protected readonly announcement = linkedSignal<number, string>({\r\n source: this.activeIndex,\r\n computation: (index, previous) => (previous === undefined ? '' : this.stepOf(index)),\r\n });\r\n private blockedToggle = false;\r\n\r\n /** True on the first step. */\r\n readonly isFirst = computed(() => this.activeIndex() <= 0);\r\n /** True on the last step. */\r\n readonly isLast = computed(() => this.activeIndex() >= this.steps().length - 1);\r\n\r\n /** Whether Next would move: there is a step after this one and, when linear, this one is passable. */\r\n readonly canNext = computed(() => {\r\n const step = this.activeStep();\r\n return !!step && !this.isLast() && (!this.linear() || this.passable(step, true));\r\n });\r\n\r\n protected readonly views = computed<readonly StepView[]>(() => {\r\n const steps = this.steps();\r\n const active = this.activeIndex();\r\n return steps.map((step, index) => {\r\n const isActive = index === active;\r\n const error = this.hasError(step);\r\n const completed = this.isCompleted(step);\r\n return {\r\n step,\r\n index,\r\n headerId: `${this.uid}-header-${index}`,\r\n panelId: `${this.uid}-panel-${index}`,\r\n active: isActive,\r\n navigable: this.canOpen(index),\r\n marker: error ? 'error' : completed && !isActive ? 'completed' : 'number',\r\n completed,\r\n error,\r\n rendered: isActive || ((step.keepAlive() ?? this.keepAlive()) && this.visited().has(step)),\r\n };\r\n });\r\n });\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n const el = this.host.nativeElement;\r\n this.narrow.set(el.clientWidth > 0 && el.clientWidth < this.collapseBelow());\r\n if (typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n const observer = new ResizeObserver(() => {\r\n const width = el.clientWidth;\r\n // A hidden host reports 0; that is not narrow, and it must not flip the layout.\r\n if (width > 0) {\r\n this.narrow.set(width < this.collapseBelow());\r\n }\r\n });\r\n observer.observe(el);\r\n this.destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n /** Moves to the next step. Linear and not passable: stays, shows the step's errors, returns false. */\r\n next(): boolean {\r\n const step = this.activeStep();\r\n if (!step || this.isLast()) {\r\n return false;\r\n }\r\n if (this.linear() && !this.passable(step, true)) {\r\n this.block(step);\r\n return false;\r\n }\r\n return this.go(this.activeIndex() + 1);\r\n }\r\n\r\n /** Moves to the previous step, which a linear stepper allows freely. False on the first step. */\r\n previous(): boolean {\r\n return this.isFirst() ? false : this.go(this.activeIndex() - 1);\r\n }\r\n\r\n /** Opens step `index` if it can be opened from here; returns whether it did. */\r\n select(index: number): boolean {\r\n if (index === this.activeIndex()) {\r\n return false;\r\n }\r\n if (!this.canOpen(index)) {\r\n const step = this.steps()[index];\r\n if (step && this.linear() && index > this.activeIndex()) {\r\n this.block(this.firstBlocking(index) ?? step);\r\n }\r\n return false;\r\n }\r\n return this.go(index);\r\n }\r\n\r\n /**\r\n * Back to the first step with every step unvisited. `controls` (default `true`) also resets each\r\n * step's `stepControl`, so the wizard starts over empty.\r\n */\r\n reset(options: { controls?: boolean } = {}): void {\r\n const first = this.steps()[0];\r\n this.attempted.set(new Set());\r\n this.visited.set(new Set(first ? [first] : []));\r\n if (options.controls !== false) {\r\n this.steps().forEach((step) => step.stepControl()?.reset());\r\n }\r\n const previousIndex = this.activeIndex();\r\n this.selectedIndex.set(0);\r\n if (previousIndex !== 0) {\r\n this.selectionChange.emit({ previousIndex, selectedIndex: 0 });\r\n }\r\n }\r\n\r\n private go(index: number): boolean {\r\n const previousIndex = this.activeIndex();\r\n this.selectedIndex.set(index);\r\n this.selectionChange.emit({ previousIndex, selectedIndex: index });\r\n return true;\r\n }\r\n\r\n /** Surfaces why a linear stepper stayed: errors on the fields, a message for assistive tech. */\r\n private block(step: NxeStepComponent): void {\r\n step.stepControl()?.markAllAsTouched();\r\n this.attempted.update((set) => new Set(set).add(step));\r\n const index = this.steps().indexOf(step);\r\n this.blockedToggle = !this.blockedToggle;\r\n // The trailing no-break space makes a repeat of the same message a different string.\r\n this.announcement.set(this.messages.t('stepper.blocked', index + 1) + (this.blockedToggle ? ' ' : ''));\r\n this.stepBlocked.emit(index);\r\n }\r\n\r\n private stepOf(index: number): string {\r\n const step = this.steps()[index];\r\n return step ? this.messages.t('stepper.stepOf', index + 1, this.steps().length, step.label()) : '';\r\n }\r\n\r\n private interacted(step: NxeStepComponent): boolean {\r\n return (this.visited().has(step) && step !== this.activeStep()) || this.attempted().has(step);\r\n }\r\n\r\n /** Whether a linear stepper lets the user leave `step` forward. */\r\n private passable(step: NxeStepComponent, isActive: boolean): boolean {\r\n const explicit = step.completed();\r\n if (explicit !== undefined) {\r\n return explicit;\r\n }\r\n const control = step.controlState();\r\n if (control.hasControl) {\r\n return control.valid ? isActive || this.interacted(step) : step.optional() && control.pristine;\r\n }\r\n return isActive || step.optional() || this.interacted(step);\r\n }\r\n\r\n private isCompleted(step: NxeStepComponent): boolean {\r\n const explicit = step.completed();\r\n if (explicit !== undefined) {\r\n return explicit;\r\n }\r\n return this.interacted(step) && step.controlState().valid;\r\n }\r\n\r\n private hasError(step: NxeStepComponent): boolean {\r\n const explicit = step.hasError();\r\n if (explicit !== undefined) {\r\n return explicit;\r\n }\r\n const control = step.controlState();\r\n return this.interacted(step) && control.hasControl && !control.valid && !(step.optional() && control.pristine);\r\n }\r\n\r\n /** The first step between here and `target` that holds a linear stepper back. */\r\n private firstBlocking(target: number): NxeStepComponent | undefined {\r\n const steps = this.steps();\r\n const active = this.activeIndex();\r\n for (let k = active; k < target; k++) {\r\n if (!this.passable(steps[k], k === active)) {\r\n return steps[k];\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Whether the user can open step `index` from the open one. */\r\n private canOpen(index: number): boolean {\r\n const steps = this.steps();\r\n const active = this.activeIndex();\r\n const step = steps[index];\r\n if (!step) {\r\n return false;\r\n }\r\n if (index === active) {\r\n return true;\r\n }\r\n if (index < active) {\r\n // A locked step stays locked once it is done.\r\n return step.editable() || !this.isCompleted(step);\r\n }\r\n return !this.linear() || this.firstBlocking(index) === undefined;\r\n }\r\n\r\n protected headerLabel(view: StepView): string {\r\n return view.step.label();\r\n }\r\n\r\n protected stateText(view: StepView): string {\r\n if (view.error) {\r\n return this.messages.t('stepper.error');\r\n }\r\n return view.completed && !view.active ? this.messages.t('stepper.completed') : '';\r\n }\r\n\r\n protected optionalText(): string {\r\n return this.messages.t('stepper.optional');\r\n }\r\n\r\n protected listLabel(): string {\r\n return this.stepsLabel() ?? this.messages.t('stepper.listLabel');\r\n }\r\n\r\n protected open(view: StepView): void {\r\n this.select(view.index);\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n const headers = Array.from(this.list().nativeElement.querySelectorAll<HTMLElement>('button.nxe-step-header'));\r\n const current = headers.indexOf(event.target as HTMLElement);\r\n if (current < 0) {\r\n return;\r\n }\r\n const rtl = getComputedStyle(this.list().nativeElement).direction === 'rtl';\r\n const horizontal = this.layout() === 'horizontal';\r\n let target: number;\r\n switch (event.key) {\r\n case 'ArrowRight':\r\n target = current + (horizontal ? (rtl ? -1 : 1) : 0);\r\n break;\r\n case 'ArrowLeft':\r\n target = current + (horizontal ? (rtl ? 1 : -1) : 0);\r\n break;\r\n case 'ArrowDown':\r\n target = current + 1;\r\n break;\r\n case 'ArrowUp':\r\n target = current - 1;\r\n break;\r\n case 'Home':\r\n target = 0;\r\n break;\r\n case 'End':\r\n target = headers.length - 1;\r\n break;\r\n default:\r\n return;\r\n }\r\n event.preventDefault();\r\n if (target !== current) {\r\n headers[(target + headers.length) % headers.length]?.focus();\r\n }\r\n }\r\n}\r\n","<ol #list class=\"nxe-stepper-list\" [attr.aria-label]=\"listLabel()\">\r\n @for (view of views(); track view.step; let last = $last) {\r\n <li\r\n class=\"nxe-step-item\"\r\n [class.nxe-step-active]=\"view.active\"\r\n [class.nxe-step-completed]=\"view.completed\"\r\n [class.nxe-step-error]=\"view.error\"\r\n [class.nxe-step-optional]=\"view.step.optional()\">\r\n <ng-template #headerBody>\r\n <span class=\"nxe-step-marker\" aria-hidden=\"true\">\r\n @switch (view.marker) {\r\n @case ('completed') {\r\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" focusable=\"false\">\r\n <path d=\"M3 8.5l3.2 3.2L13 4.8\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n @case ('error') {\r\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" focusable=\"false\">\r\n <path d=\"M8 3.5v5.2M8 11.6v.1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n </svg>\r\n }\r\n @default {\r\n {{ view.index + 1 }}\r\n }\r\n }\r\n </span>\r\n <span class=\"nxe-step-text\">\r\n <span class=\"nxe-step-label\">{{ headerLabel(view) }}</span>\r\n @if (view.error) {\r\n <span class=\"nxe-step-sub nxe-step-sub-error\">{{ stateText(view) }}</span>\r\n } @else if (view.step.description()) {\r\n <span class=\"nxe-step-sub\">{{ view.step.description() }}</span>\r\n }\r\n @if (view.step.optional()) {\r\n <span class=\"nxe-step-sub\">{{ optionalText() }}</span>\r\n }\r\n @if (!view.error && stateText(view)) {\r\n <span class=\"nxe-step-hidden\">{{ stateText(view) }}</span>\r\n }\r\n </span>\r\n </ng-template>\r\n @if (view.navigable) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-step-header\"\r\n [id]=\"view.headerId\"\r\n [attr.aria-current]=\"view.active ? 'step' : null\"\r\n [attr.aria-controls]=\"view.panelId\"\r\n (click)=\"open(view)\">\r\n <ng-container [ngTemplateOutlet]=\"headerBody\" />\r\n </button>\r\n } @else {\r\n <div class=\"nxe-step-header nxe-step-header-static\" [id]=\"view.headerId\">\r\n <ng-container [ngTemplateOutlet]=\"headerBody\" />\r\n </div>\r\n }\r\n @if (!last && layout() === 'horizontal') {\r\n <span class=\"nxe-step-connector\" aria-hidden=\"true\"></span>\r\n }\r\n @if (layout() === 'vertical') {\r\n <ng-container [ngTemplateOutlet]=\"panel\" [ngTemplateOutletContext]=\"{ $implicit: view }\" />\r\n }\r\n </li>\r\n }\r\n</ol>\r\n@if (layout() === 'horizontal') {\r\n @for (view of views(); track view.step) {\r\n <ng-container [ngTemplateOutlet]=\"panel\" [ngTemplateOutletContext]=\"{ $implicit: view }\" />\r\n }\r\n}\r\n<ng-template #panel let-view>\r\n <div class=\"nxe-step-panel\" role=\"group\" [id]=\"view.panelId\" [attr.aria-labelledby]=\"view.headerId\" [hidden]=\"!view.active\">\r\n @if (view.rendered) {\r\n <ng-container [ngTemplateOutlet]=\"view.step.contentTemplate()\" />\r\n }\r\n </div>\r\n</ng-template>\r\n<div class=\"nxe-step-hidden\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">{{ announcement() }}</div>\r\n","import { Directive, inject, input } from '@angular/core';\r\nimport { NxeStepperComponent } from './nxe-stepper.component';\r\n\r\n/**\r\n * Makes a button move its `nxe-stepper` to the next step. Put it on any element inside a step\r\n * (`nxe-button`, a native `button`); from outside the stepper, give it the stepper:\r\n *\r\n * ```html\r\n * <nxe-button nxeStepperNext text=\"Continue\" type=\"default\" />\r\n * <button type=\"button\" [nxeStepperNext]=\"wizard\">Continue</button>\r\n * ```\r\n *\r\n * It calls `next()`, so a linear stepper that is not ready to leave the step stays on it, marks the\r\n * step's controls as touched and announces why. It does not disable the button: a blocked click is how\r\n * the user finds out what is missing.\r\n */\r\n@Directive({\r\n selector: '[nxeStepperNext]',\r\n host: { '(click)': 'stepper()?.next()' },\r\n})\r\nexport class NxeStepperNextDirective {\r\n private readonly parent = inject(NxeStepperComponent, { optional: true });\r\n\r\n /** The stepper to drive when the element is not inside one. */\r\n readonly target = input<NxeStepperComponent | '' | null | undefined>(undefined, { alias: 'nxeStepperNext' });\r\n\r\n protected stepper(): NxeStepperComponent | null {\r\n return this.target() || this.parent;\r\n }\r\n}\r\n","import { Directive, inject, input } from '@angular/core';\r\nimport { NxeStepperComponent } from './nxe-stepper.component';\r\n\r\n/**\r\n * Makes a button move its `nxe-stepper` back one step; the counterpart of `nxeStepperNext`. Going\r\n * back is never validated, and on the first step it does nothing.\r\n *\r\n * ```html\r\n * <nxe-button nxeStepperPrevious text=\"Back\" stylingMode=\"outlined\" />\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[nxeStepperPrevious]',\r\n host: { '(click)': 'stepper()?.previous()' },\r\n})\r\nexport class NxeStepperPreviousDirective {\r\n private readonly parent = inject(NxeStepperComponent, { optional: true });\r\n\r\n /** The stepper to drive when the element is not inside one. */\r\n readonly target = input<NxeStepperComponent | '' | null | undefined>(undefined, {\r\n alias: 'nxeStepperPrevious',\r\n });\r\n\r\n protected stepper(): NxeStepperComponent | null {\r\n return this.target() || this.parent;\r\n }\r\n}\r\n","import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\n/**\r\n * Marks the `<ng-template>` an `nxe-breadcrumb` draws between crumbs, for a separator that is markup\r\n * (an icon) rather than the text of the `separator` input:\r\n *\r\n * ```html\r\n * <nxe-breadcrumb [items]=\"items\">\r\n * <ng-template nxeBreadcrumbSeparator><svg viewBox=\"0 0 16 16\">...</svg></ng-template>\r\n * </nxe-breadcrumb>\r\n * ```\r\n *\r\n * The separator is decoration (`aria-hidden`): the `<ol>` already says these are steps in a list.\r\n */\r\n@Directive({\r\n selector: 'ng-template[nxeBreadcrumbSeparator]',\r\n})\r\nexport class NxeBreadcrumbSeparatorDirective {\r\n /** The template to draw. */\r\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n DestroyRef,\r\n inject,\r\n input,\r\n numberAttribute,\r\n signal,\r\n ViewEncapsulation,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ActivatedRouteSnapshot, NavigationEnd, Router, RouterLink } from '@angular/router';\r\nimport { NxeMessageService } from '@nexterajs/ui/core';\r\nimport { NxeMenuComponent, NxeMenuItemComponent, NxeMenuTriggerForDirective } from '@nexterajs/ui/overlay';\r\nimport { filter } from 'rxjs';\r\nimport { NxeBreadcrumbSeparatorDirective } from './nxe-breadcrumb-separator.directive';\r\nimport type { NxeBreadcrumbData, NxeBreadcrumbItem } from './nxe-breadcrumb.types';\r\n\r\n/** What the template draws, in order: a crumb, or the overflow button standing for the folded ones. */\r\ninterface Slot {\r\n /** The crumb, or `null` for the overflow button. */\r\n readonly crumb: NxeBreadcrumbItem | null;\r\n readonly last: boolean;\r\n}\r\n\r\n/**\r\n * `nxe-breadcrumb` shows where a page sits in the application, one link per level, for document pages\r\n * that are a few levels deep.\r\n *\r\n * ```html\r\n * <!-- from data -->\r\n * <nxe-breadcrumb [items]=\"[\r\n * { label: 'Pesanan', route: '/pos' },\r\n * { label: 'PO-2026-0412', route: ['/pos', 412] },\r\n * { label: 'Baris' }\r\n * ]\" />\r\n *\r\n * <!-- from the router: each route's data.breadcrumb, root to leaf -->\r\n * <nxe-breadcrumb fromRoute />\r\n * ```\r\n *\r\n * ```ts\r\n * { path: 'pos', data: { breadcrumb: 'Pesanan' }, children: [\r\n * { path: ':id', resolve: { po: poResolver }, data: { breadcrumb: (d: Data) => d['po'].number } },\r\n * ] }\r\n * ```\r\n *\r\n * **Sources.** `items` are the crumbs you list. With `fromRoute`, the crumbs of the active route follow\r\n * them (so `items` can hold a fixed \"Beranda\"): the router state is walked from the root, every route that\r\n * declares a `breadcrumb` (in `data` or `resolve`) adds one, linked to that route's own URL, and the trail\r\n * is read again after every `NavigationEnd`. A `data.breadcrumb` is a string or `(data) => string`; an empty\r\n * result drops the route.\r\n *\r\n * **Semantics.** A `<nav aria-label=\"Breadcrumb\">` around an `<ol>`. The last crumb is the current page: plain\r\n * text with `aria-current=\"page\"`, never a link. A crumb with no `route` or `href` is text too. Separators\r\n * are `aria-hidden`.\r\n *\r\n * **Long trails.** More crumbs than `maxItems` (default 5) keep the first and the last `maxItems - 1` and fold\r\n * the middle into a \"...\" button that opens an `nxe-menu` of them. `maxItems` of 0 never folds.\r\n *\r\n * **Separator.** The `separator` input (a character, default `/`), or an `<ng-template nxeBreadcrumbSeparator>`\r\n * for an icon.\r\n */\r\n@Component({\r\n selector: 'nxe-breadcrumb',\r\n exportAs: 'nxeBreadcrumb',\r\n imports: [\r\n NgTemplateOutlet,\r\n RouterLink,\r\n NxeMenuComponent,\r\n NxeMenuItemComponent,\r\n NxeMenuTriggerForDirective,\r\n ],\r\n templateUrl: './nxe-breadcrumb.component.html',\r\n styleUrl: './nxe-breadcrumb.component.scss',\r\n host: { class: 'nxe-breadcrumb' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeBreadcrumbComponent {\r\n private readonly router = inject(Router);\r\n private readonly messages = inject(NxeMessageService);\r\n\r\n /** The crumbs to show. */\r\n readonly items = input<readonly NxeBreadcrumbItem[] | null | undefined>(undefined);\r\n /** Add the crumbs of the active route's `data.breadcrumb`, after `items`. */\r\n readonly fromRoute = input(false, { transform: booleanAttribute });\r\n /** Crumbs shown before the middle ones fold into a menu; 0 never folds. At least 2 otherwise. Default 5. */\r\n readonly maxItems = input(5, { transform: (value: unknown) => Math.max(0, Math.floor(numberAttribute(value, 5))) });\r\n /** Text between crumbs. Default `/`. */\r\n readonly separator = input('/');\r\n /** Accessible name of the `nav`. Default \"Breadcrumb\" (`breadcrumb.label`). */\r\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\r\n\r\n protected readonly separatorTemplate = contentChild(NxeBreadcrumbSeparatorDirective);\r\n\r\n /** Bumped after each navigation so the route trail is read again. */\r\n private readonly navigations = signal(0);\r\n\r\n protected readonly navLabel = computed(() => this.ariaLabel() || this.messages.t('breadcrumb.label'));\r\n protected readonly moreLabel = computed(() => this.messages.t('breadcrumb.more'));\r\n\r\n /** Every crumb, in order: `items`, then the route's. */\r\n readonly crumbs = computed<readonly NxeBreadcrumbItem[]>(() => {\r\n const listed = this.items() ?? [];\r\n if (!this.fromRoute()) {\r\n return listed;\r\n }\r\n this.navigations();\r\n return [...listed, ...this.routeCrumbs(this.router.routerState.snapshot.root)];\r\n });\r\n\r\n /** The crumbs folded into the menu: the middle ones past `maxItems`. */\r\n protected readonly folded = computed<readonly NxeBreadcrumbItem[]>(() => {\r\n const [from, to] = this.foldRange();\r\n return this.crumbs().slice(from, to);\r\n });\r\n\r\n protected readonly slots = computed<readonly Slot[]>(() => {\r\n const crumbs = this.crumbs();\r\n const [from, to] = this.foldRange();\r\n const out: Slot[] = [];\r\n crumbs.forEach((crumb, index) => {\r\n if (index >= from && index < to) {\r\n if (index === from) {\r\n out.push({ crumb: null, last: false });\r\n }\r\n return;\r\n }\r\n out.push({ crumb, last: index === crumbs.length - 1 });\r\n });\r\n return out;\r\n });\r\n\r\n constructor() {\r\n this.router.events\r\n .pipe(\r\n filter((event) => event instanceof NavigationEnd),\r\n takeUntilDestroyed(inject(DestroyRef)),\r\n )\r\n .subscribe(() => this.navigations.update((n) => n + 1));\r\n }\r\n\r\n /** `[from, to)` of the crumbs that fold; empty when everything fits. */\r\n private foldRange(): readonly [number, number] {\r\n const count = this.crumbs().length;\r\n const max = this.maxItems();\r\n if (max === 0) {\r\n return [0, 0];\r\n }\r\n const keep = Math.max(2, max);\r\n return count > keep ? [1, count - (keep - 1)] : [0, 0];\r\n }\r\n\r\n /** One crumb per route, root to leaf, that declares a breadcrumb of its own. */\r\n private routeCrumbs(root: ActivatedRouteSnapshot): NxeBreadcrumbItem[] {\r\n const trail: NxeBreadcrumbItem[] = [];\r\n const path: string[] = [];\r\n for (let snapshot: ActivatedRouteSnapshot | null = root; snapshot; snapshot = snapshot.firstChild) {\r\n path.push(...snapshot.url.map((segment) => segment.path));\r\n const config = snapshot.routeConfig;\r\n // Inherited data is not this route's own: an empty-path child would repeat its parent's crumb.\r\n const declared = config?.data?.['breadcrumb'] !== undefined || config?.resolve?.['breadcrumb'] !== undefined;\r\n const source = snapshot.data['breadcrumb'] as NxeBreadcrumbData | undefined;\r\n if (!declared || source === undefined || source === null) {\r\n continue;\r\n }\r\n const label = typeof source === 'function' ? source(snapshot.data) : source;\r\n if (label) {\r\n trail.push({ label, route: ['/', ...path] });\r\n }\r\n }\r\n return trail;\r\n }\r\n\r\n /** The commands of a crumb's `routerLink`. */\r\n protected commands(crumb: NxeBreadcrumbItem): string | readonly unknown[] {\r\n return crumb.route ?? [];\r\n }\r\n}\r\n","<nav class=\"nxe-breadcrumb-nav\" [attr.aria-label]=\"navLabel()\">\r\n <ol class=\"nxe-breadcrumb-list\">\r\n @for (slot of slots(); track $index) {\r\n <li class=\"nxe-breadcrumb-item\">\r\n @if (slot.crumb; as crumb) {\r\n @if (slot.last) {\r\n <span class=\"nxe-breadcrumb-current\" aria-current=\"page\">{{ crumb.label }}</span>\r\n } @else if (crumb.route !== undefined) {\r\n <a class=\"nxe-breadcrumb-link\" [routerLink]=\"commands(crumb)\" [queryParams]=\"crumb.queryParams\">{{ crumb.label }}</a>\r\n } @else if (crumb.href !== undefined) {\r\n <a class=\"nxe-breadcrumb-link\" [href]=\"crumb.href\">{{ crumb.label }}</a>\r\n } @else {\r\n <span class=\"nxe-breadcrumb-text\">{{ crumb.label }}</span>\r\n }\r\n } @else {\r\n <button type=\"button\" class=\"nxe-breadcrumb-more\" [attr.aria-label]=\"moreLabel()\" [nxeMenuTriggerFor]=\"more\">\r\n <span aria-hidden=\"true\">&hellip;</span>\r\n </button>\r\n }\r\n @if (!slot.last) {\r\n <span class=\"nxe-breadcrumb-separator\" aria-hidden=\"true\">\r\n @if (separatorTemplate(); as template) {\r\n <ng-container *ngTemplateOutlet=\"template.template\" />\r\n } @else {\r\n {{ separator() }}\r\n }\r\n </span>\r\n }\r\n </li>\r\n }\r\n </ol>\r\n</nav>\r\n\r\n<nxe-menu #more panelClass=\"nxe-breadcrumb-menu\">\r\n @for (crumb of folded(); track $index) {\r\n @if (crumb.route !== undefined) {\r\n <nxe-menu-item [routerLink]=\"commands(crumb)\" [queryParams]=\"crumb.queryParams\">{{ crumb.label }}</nxe-menu-item>\r\n } @else if (crumb.href !== undefined) {\r\n <a nxe-menu-item [href]=\"crumb.href\">{{ crumb.label }}</a>\r\n } @else {\r\n <nxe-menu-item [disabled]=\"true\">{{ crumb.label }}</nxe-menu-item>\r\n }\r\n }\r\n</nxe-menu>\r\n","// @nexterajs/ui/navigation — public API.\r\nexport * from './lib/tabs/nxe-tabs.component';\r\nexport * from './lib/tabs/nxe-tab.component';\r\nexport * from './lib/tabs/nxe-tab-content.directive';\r\nexport * from './lib/stepper/nxe-stepper.component';\r\nexport * from './lib/stepper/nxe-step.component';\r\nexport * from './lib/stepper/nxe-step-content.directive';\r\nexport * from './lib/stepper/nxe-stepper-next.directive';\r\nexport * from './lib/stepper/nxe-stepper-previous.directive';\r\nexport * from './lib/breadcrumb/nxe-breadcrumb.types';\r\nexport * from './lib/breadcrumb/nxe-breadcrumb-separator.directive';\r\nexport * from './lib/breadcrumb/nxe-breadcrumb.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, input, output, signal, computed, SecurityContext, ChangeDetectionStrategy, Component, makeEnvironmentProviders, ApplicationRef, EnvironmentInjector, createComponent, Injectable } from '@angular/core';
3
3
  import { DomSanitizer } from '@angular/platform-browser';
4
+ import { NxeMessageService } from '@nexterajs/ui/core';
4
5
  import { DOCUMENT } from '@angular/common';
5
6
 
6
7
  const NXE_TOAST_DEFAULTS = {
@@ -39,6 +40,7 @@ const NXE_TOAST_CONFIG = new InjectionToken('NXE_TOAST_CONFIG', {
39
40
  * - The close button is a real `<button>` with a label, reachable by keyboard.
40
41
  */
41
42
  class NxeToastComponent {
43
+ messages = inject(NxeMessageService);
42
44
  sanitizer = inject(DomSanitizer);
43
45
  type = input.required(/* @ts-ignore */
44
46
  ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
@@ -100,28 +102,28 @@ class NxeToastComponent {
100
102
  this.dismissed.emit();
101
103
  }
102
104
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxeToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
103
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxeToastComponent, isStandalone: true, selector: "nxe-toast", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: true, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, enableHtml: { classPropertyName: "enableHtml", publicName: "enableHtml", isSignal: true, isRequired: false, transformFunction: null }, tapToDismiss: { classPropertyName: "tapToDismiss", publicName: "tapToDismiss", isSignal: true, isRequired: false, transformFunction: null }, closeButton: { classPropertyName: "closeButton", publicName: "closeButton", isSignal: true, isRequired: false, transformFunction: null }, progressBar: { classPropertyName: "progressBar", publicName: "progressBar", isSignal: true, isRequired: false, transformFunction: null }, toastClass: { classPropertyName: "toastClass", publicName: "toastClass", isSignal: true, isRequired: false, transformFunction: null }, titleClass: { classPropertyName: "titleClass", publicName: "titleClass", isSignal: true, isRequired: false, transformFunction: null }, messageClass: { classPropertyName: "messageClass", publicName: "messageClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dismissed: "dismissed" }, host: { attributes: { "aria-atomic": "true" }, listeners: { "click": "onBodyClick()" }, properties: { "class": "hostClass()", "attr.role": "assertive() ? \"alert\" : \"status\"", "attr.aria-live": "assertive() ? \"assertive\" : \"polite\"" } }, ngImport: i0, template: `
104
- @if (closeButton()) {
105
- <button type="button" class="nxe-toast-close" aria-label="Close notification" (click)="onCloseClick($event)">
106
- &times;
107
- </button>
108
- }
109
-
110
- @if (title()) {
111
- <div [class]="'nxe-toast-title ' + titleClass()" [attr.aria-label]="title()">{{ title() }}</div>
112
- }
113
-
114
- @if (message()) {
115
- @if (enableHtml()) {
116
- <div [class]="'nxe-toast-message ' + messageClass()" [innerHTML]="safeMessage()"></div>
117
- } @else {
118
- <div [class]="'nxe-toast-message ' + messageClass()">{{ message() }}</div>
119
- }
120
- }
121
-
122
- @if (progressBar()) {
123
- <div><div class="nxe-toast-progress" [style.width.%]="progressWidth()"></div></div>
124
- }
105
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxeToastComponent, isStandalone: true, selector: "nxe-toast", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: true, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, enableHtml: { classPropertyName: "enableHtml", publicName: "enableHtml", isSignal: true, isRequired: false, transformFunction: null }, tapToDismiss: { classPropertyName: "tapToDismiss", publicName: "tapToDismiss", isSignal: true, isRequired: false, transformFunction: null }, closeButton: { classPropertyName: "closeButton", publicName: "closeButton", isSignal: true, isRequired: false, transformFunction: null }, progressBar: { classPropertyName: "progressBar", publicName: "progressBar", isSignal: true, isRequired: false, transformFunction: null }, toastClass: { classPropertyName: "toastClass", publicName: "toastClass", isSignal: true, isRequired: false, transformFunction: null }, titleClass: { classPropertyName: "titleClass", publicName: "titleClass", isSignal: true, isRequired: false, transformFunction: null }, messageClass: { classPropertyName: "messageClass", publicName: "messageClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dismissed: "dismissed" }, host: { attributes: { "aria-atomic": "true" }, listeners: { "click": "onBodyClick()" }, properties: { "class": "hostClass()", "attr.role": "assertive() ? \"alert\" : \"status\"", "attr.aria-live": "assertive() ? \"assertive\" : \"polite\"" } }, ngImport: i0, template: `
106
+ @if (closeButton()) {
107
+ <button type="button" class="nxe-toast-close" [attr.aria-label]="messages.t('notify.close')" (click)="onCloseClick($event)">
108
+ &times;
109
+ </button>
110
+ }
111
+
112
+ @if (title()) {
113
+ <div [class]="'nxe-toast-title ' + titleClass()" [attr.aria-label]="title()">{{ title() }}</div>
114
+ }
115
+
116
+ @if (message()) {
117
+ @if (enableHtml()) {
118
+ <div [class]="'nxe-toast-message ' + messageClass()" [innerHTML]="safeMessage()"></div>
119
+ } @else {
120
+ <div [class]="'nxe-toast-message ' + messageClass()">{{ message() }}</div>
121
+ }
122
+ }
123
+
124
+ @if (progressBar()) {
125
+ <div><div class="nxe-toast-progress" [style.width.%]="progressWidth()"></div></div>
126
+ }
125
127
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
126
128
  }
127
129
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxeToastComponent, decorators: [{
@@ -136,28 +138,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
136
138
  'aria-atomic': 'true',
137
139
  '(click)': 'onBodyClick()',
138
140
  },
139
- template: `
140
- @if (closeButton()) {
141
- <button type="button" class="nxe-toast-close" aria-label="Close notification" (click)="onCloseClick($event)">
142
- &times;
143
- </button>
144
- }
145
-
146
- @if (title()) {
147
- <div [class]="'nxe-toast-title ' + titleClass()" [attr.aria-label]="title()">{{ title() }}</div>
148
- }
149
-
150
- @if (message()) {
151
- @if (enableHtml()) {
152
- <div [class]="'nxe-toast-message ' + messageClass()" [innerHTML]="safeMessage()"></div>
153
- } @else {
154
- <div [class]="'nxe-toast-message ' + messageClass()">{{ message() }}</div>
155
- }
156
- }
157
-
158
- @if (progressBar()) {
159
- <div><div class="nxe-toast-progress" [style.width.%]="progressWidth()"></div></div>
160
- }
141
+ template: `
142
+ @if (closeButton()) {
143
+ <button type="button" class="nxe-toast-close" [attr.aria-label]="messages.t('notify.close')" (click)="onCloseClick($event)">
144
+ &times;
145
+ </button>
146
+ }
147
+
148
+ @if (title()) {
149
+ <div [class]="'nxe-toast-title ' + titleClass()" [attr.aria-label]="title()">{{ title() }}</div>
150
+ }
151
+
152
+ @if (message()) {
153
+ @if (enableHtml()) {
154
+ <div [class]="'nxe-toast-message ' + messageClass()" [innerHTML]="safeMessage()"></div>
155
+ } @else {
156
+ <div [class]="'nxe-toast-message ' + messageClass()">{{ message() }}</div>
157
+ }
158
+ }
159
+
160
+ @if (progressBar()) {
161
+ <div><div class="nxe-toast-progress" [style.width.%]="progressWidth()"></div></div>
162
+ }
161
163
  `,
162
164
  }]
163
165
  }], propDecorators: { type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: true }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], enableHtml: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableHtml", required: false }] }], tapToDismiss: [{ type: i0.Input, args: [{ isSignal: true, alias: "tapToDismiss", required: false }] }], closeButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeButton", required: false }] }], progressBar: [{ type: i0.Input, args: [{ isSignal: true, alias: "progressBar", required: false }] }], toastClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "toastClass", required: false }] }], titleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "titleClass", required: false }] }], messageClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "messageClass", required: false }] }], dismissed: [{ type: i0.Output, args: ["dismissed"] }] } });
@@ -1 +1 @@
1
- {"version":3,"file":"nexterajs-ui-notify.mjs","sources":["../../../projects/nextera-ui/notify/src/lib/notify/nxe-toast.config.ts","../../../projects/nextera-ui/notify/src/lib/notify/nxe-toast.component.ts","../../../projects/nextera-ui/notify/src/lib/notify/nxe-toast.service.ts","../../../projects/nextera-ui/notify/src/public-api.ts","../../../projects/nextera-ui/notify/src/nexterajs-ui-notify.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport type NxeToastType = 'success' | 'error' | 'warning' | 'info';\r\n\r\nexport type NxeToastPosition =\r\n | 'toast-top-center'\r\n | 'toast-bottom-center'\r\n | 'toast-top-right'\r\n | 'toast-bottom-right'\r\n | 'toast-top-left'\r\n | 'toast-bottom-left'\r\n | 'toast-top-full-width'\r\n | 'toast-bottom-full-width';\r\n\r\n/** Per-call options. Anything omitted falls back to the global {@link NxeToastConfig}. */\r\nexport interface NxeToastOverride {\r\n /**\r\n * Render the message as HTML rather than text.\r\n *\r\n * The message is still sanitised. Callers pass server-composed strings here — a list of\r\n * validation failures joined with `<br>` — so the markup is not author-controlled and must not\r\n * be trusted, but stripping it entirely would collapse those lists onto one line.\r\n */\r\n enableHtml?: boolean;\r\n /** Dismiss when the body is clicked. The close button works regardless. */\r\n tapToDismiss?: boolean;\r\n /** Milliseconds before auto-dismiss. `0` keeps it up until dismissed. */\r\n timeOut?: number;\r\n closeButton?: boolean;\r\n progressBar?: boolean;\r\n /** Extra classes on the toast element. */\r\n toastClass?: string;\r\n titleClass?: string;\r\n messageClass?: string;\r\n}\r\n\r\nexport interface NxeToastConfig extends NxeToastOverride {\r\n /** Which corner or edge the stack is anchored to. */\r\n positionClass?: NxeToastPosition;\r\n /**\r\n * Put the newest toast at the top of the stack.\r\n *\r\n * Defaults to true, matching the library this replaces. A naive appending list reverses it —\r\n * visibly, and without any test failing.\r\n */\r\n newestOnTop?: boolean;\r\n /** Drop a toast whose type, title and message match one already showing. */\r\n preventDuplicates?: boolean;\r\n /** Cap the stack; 0 means no cap. Older toasts are dismissed first. */\r\n maxOpened?: number;\r\n}\r\n\r\nexport const NXE_TOAST_DEFAULTS: Required<\r\n Pick<\r\n NxeToastConfig,\r\n | 'positionClass'\r\n | 'timeOut'\r\n | 'closeButton'\r\n | 'progressBar'\r\n | 'tapToDismiss'\r\n | 'enableHtml'\r\n | 'newestOnTop'\r\n | 'preventDuplicates'\r\n | 'maxOpened'\r\n >\r\n> = {\r\n positionClass: 'toast-top-right',\r\n timeOut: 5000,\r\n closeButton: false,\r\n progressBar: false,\r\n tapToDismiss: true,\r\n enableHtml: false,\r\n newestOnTop: true,\r\n preventDuplicates: false,\r\n maxOpened: 0,\r\n};\r\n\r\nexport const NXE_TOAST_CONFIG = new InjectionToken<NxeToastConfig>('NXE_TOAST_CONFIG', {\r\n providedIn: 'root',\r\n factory: () => ({}),\r\n});\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n SecurityContext,\r\n signal,\r\n} from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { NxeToastType } from './nxe-toast.config';\r\n\r\n/**\r\n * One toast. Rendered by {@link NxeToastService} into its container; not used directly.\r\n *\r\n * **The element order is load-bearing.** The close button comes first and is floated right, which\r\n * is how the library this replaces positioned it — move it after the title and it drops below the\r\n * text instead of sitting in the corner. Likewise the host carries the classes rather than an\r\n * inner wrapper, because the shipped stylesheet targets `.nxe-toast-container .nxe-toast`\r\n * directly and an extra element between them changes what `width` and `margin` apply to.\r\n *\r\n * Styles are global (`@nexterajs/ui/styles/_toast.scss`), not encapsulated, so an application's\r\n * existing overrides keep winning on specificity exactly as they did before.\r\n *\r\n * Accessibility, which the original had none of:\r\n * - `error` and `warning` announce as `alert` (assertive — the user's own action caused it).\r\n * `success` and `info` announce as `status` (polite).\r\n * - Focus is never taken. A validation toast typically appears mid-keystroke, and moving focus\r\n * would pull the caret out of the field being corrected.\r\n * - The close button is a real `<button>` with a label, reachable by keyboard.\r\n */\r\n@Component({\r\n selector: 'nxe-toast',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class]': 'hostClass()',\r\n '[attr.role]': 'assertive() ? \"alert\" : \"status\"',\r\n '[attr.aria-live]': 'assertive() ? \"assertive\" : \"polite\"',\r\n 'aria-atomic': 'true',\r\n '(click)': 'onBodyClick()',\r\n },\r\n template: `\r\n @if (closeButton()) {\r\n <button type=\"button\" class=\"nxe-toast-close\" aria-label=\"Close notification\" (click)=\"onCloseClick($event)\">\r\n &times;\r\n </button>\r\n }\r\n\r\n @if (title()) {\r\n <div [class]=\"'nxe-toast-title ' + titleClass()\" [attr.aria-label]=\"title()\">{{ title() }}</div>\r\n }\r\n\r\n @if (message()) {\r\n @if (enableHtml()) {\r\n <div [class]=\"'nxe-toast-message ' + messageClass()\" [innerHTML]=\"safeMessage()\"></div>\r\n } @else {\r\n <div [class]=\"'nxe-toast-message ' + messageClass()\">{{ message() }}</div>\r\n }\r\n }\r\n\r\n @if (progressBar()) {\r\n <div><div class=\"nxe-toast-progress\" [style.width.%]=\"progressWidth()\"></div></div>\r\n }\r\n `,\r\n})\r\nexport class NxeToastComponent {\r\n private readonly sanitizer = inject(DomSanitizer);\r\n\r\n readonly type = input.required<NxeToastType>();\r\n readonly title = input<string | null>(null);\r\n readonly message = input<string | null>(null);\r\n readonly enableHtml = input(false);\r\n readonly tapToDismiss = input(true);\r\n readonly closeButton = input(false);\r\n readonly progressBar = input(false);\r\n readonly toastClass = input('');\r\n readonly titleClass = input('');\r\n readonly messageClass = input('');\r\n\r\n readonly dismissed = output<void>();\r\n\r\n /** Pre-enter state: the service clears it a frame later so the opacity transition runs. */\r\n readonly entering = signal(true);\r\n /** Set while the leave transition plays; the service removes the view once it finishes. */\r\n readonly dismissing = signal(false);\r\n readonly progressWidth = signal(100);\r\n\r\n protected readonly assertive = computed(\r\n () => this.type() === 'error' || this.type() === 'warning',\r\n );\r\n\r\n protected readonly hostClass = computed(() =>\r\n [\r\n 'nxe-toast',\r\n `nxe-toast-${this.type()}`,\r\n this.toastClass(),\r\n this.entering() ? 'nxe-toast-entering' : '',\r\n this.dismissing() ? 'nxe-toast-leaving' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n /**\r\n * Sanitised HTML for the message.\r\n *\r\n * Callers pass server-composed strings here — validation failures joined with `<br>` — so this\r\n * is data, not markup the application authored. `sanitize` drops anything executable and keeps\r\n * the line breaks the lists depend on.\r\n */\r\n protected readonly safeMessage = computed<SafeHtml>(\r\n () => this.sanitizer.sanitize(SecurityContext.HTML, this.message() ?? '') ?? '',\r\n );\r\n\r\n protected onBodyClick(): void {\r\n if (this.tapToDismiss()) this.dismissed.emit();\r\n }\r\n\r\n protected onCloseClick(event: Event): void {\r\n // Without this the host click handler also fires, dismissing twice.\r\n event.stopPropagation();\r\n this.dismissed.emit();\r\n }\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n ApplicationRef,\r\n ComponentRef,\r\n createComponent,\r\n EnvironmentInjector,\r\n EnvironmentProviders,\r\n inject,\r\n Injectable,\r\n makeEnvironmentProviders,\r\n} from '@angular/core';\r\nimport { NxeToastComponent } from './nxe-toast.component';\r\nimport {\r\n NXE_TOAST_CONFIG,\r\n NXE_TOAST_DEFAULTS,\r\n NxeToastConfig,\r\n NxeToastOverride,\r\n NxeToastType,\r\n} from './nxe-toast.config';\r\n\r\n/** Handle on a shown toast. `dismiss()` is safe to call more than once. */\r\nexport interface NxeToastRef {\r\n dismiss(): void;\r\n readonly type: NxeToastType;\r\n readonly title: string | null;\r\n readonly message: string | null;\r\n}\r\n\r\ninterface ActiveToast extends NxeToastRef {\r\n componentRef: ComponentRef<NxeToastComponent>;\r\n timer: ReturnType<typeof setTimeout> | null;\r\n key: string;\r\n}\r\n\r\n/**\r\n * Configure the toast stack once, at bootstrap.\r\n *\r\n * ```ts\r\n * providers: [provideNxeToast({ positionClass: 'toast-top-center' })]\r\n * ```\r\n */\r\nexport function provideNxeToast(config: NxeToastConfig = {}): EnvironmentProviders {\r\n return makeEnvironmentProviders([{ provide: NXE_TOAST_CONFIG, useValue: config }]);\r\n}\r\n\r\n/**\r\n * Shows toasts.\r\n *\r\n * **The container is deliberately not a CDK overlay.** A CDK overlay pane lands in the same\r\n * `.cdk-overlay-container` as the application's dialogs, which makes paint order creation order —\r\n * so a toast raised right after a dialog closes can end up behind the next dialog that opens.\r\n * Callers do exactly that. A dedicated container with its own stacking context keeps toasts above\r\n * dialogs regardless of the order things were created in.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NxeToastService {\r\n private readonly appRef = inject(ApplicationRef);\r\n private readonly injector = inject(EnvironmentInjector);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly userConfig = inject(NXE_TOAST_CONFIG);\r\n\r\n private readonly config: Required<\r\n Pick<\r\n NxeToastConfig,\r\n | 'positionClass'\r\n | 'timeOut'\r\n | 'closeButton'\r\n | 'progressBar'\r\n | 'tapToDismiss'\r\n | 'enableHtml'\r\n | 'newestOnTop'\r\n | 'preventDuplicates'\r\n | 'maxOpened'\r\n >\r\n > &\r\n NxeToastConfig = { ...NXE_TOAST_DEFAULTS, ...this.userConfig };\r\n\r\n private container: HTMLElement | null = null;\r\n private readonly active: ActiveToast[] = [];\r\n\r\n success(message?: string | null, title?: string | null, override?: NxeToastOverride): NxeToastRef {\r\n return this.show('success', message, title, override);\r\n }\r\n\r\n error(message?: string | null, title?: string | null, override?: NxeToastOverride): NxeToastRef {\r\n return this.show('error', message, title, override);\r\n }\r\n\r\n warning(message?: string | null, title?: string | null, override?: NxeToastOverride): NxeToastRef {\r\n return this.show('warning', message, title, override);\r\n }\r\n\r\n info(message?: string | null, title?: string | null, override?: NxeToastOverride): NxeToastRef {\r\n return this.show('info', message, title, override);\r\n }\r\n\r\n /** Dismiss everything currently showing. */\r\n clear(): void {\r\n for (const toast of [...this.active]) this.remove(toast);\r\n }\r\n\r\n show(\r\n type: NxeToastType,\r\n message?: string | null,\r\n title?: string | null,\r\n override?: NxeToastOverride,\r\n ): NxeToastRef {\r\n const options = { ...this.config, ...(override ?? {}) };\r\n const key = `${type}|${title ?? ''}|${message ?? ''}`;\r\n\r\n if (options.preventDuplicates) {\r\n const existing = this.active.find((toast) => toast.key === key);\r\n if (existing) return existing;\r\n }\r\n\r\n // Trim the oldest first: the newest toast is the one the user's last action produced.\r\n if (options.maxOpened > 0) {\r\n while (this.active.length >= options.maxOpened) this.remove(this.active[0]);\r\n }\r\n\r\n const componentRef = createComponent(NxeToastComponent, {\r\n environmentInjector: this.injector,\r\n });\r\n\r\n componentRef.setInput('type', type);\r\n componentRef.setInput('title', title ?? null);\r\n componentRef.setInput('message', message ?? null);\r\n componentRef.setInput('enableHtml', options.enableHtml);\r\n componentRef.setInput('tapToDismiss', options.tapToDismiss);\r\n componentRef.setInput('closeButton', options.closeButton);\r\n componentRef.setInput('progressBar', options.progressBar);\r\n componentRef.setInput('toastClass', options.toastClass ?? '');\r\n componentRef.setInput('titleClass', options.titleClass ?? '');\r\n componentRef.setInput('messageClass', options.messageClass ?? '');\r\n\r\n const toast: ActiveToast = {\r\n componentRef,\r\n timer: null,\r\n key,\r\n type,\r\n title: title ?? null,\r\n message: message ?? null,\r\n dismiss: () => this.remove(toast),\r\n };\r\n\r\n componentRef.instance.dismissed.subscribe(() => this.remove(toast));\r\n\r\n const host = this.ensureContainer(options.positionClass);\r\n // `newestOnTop` is prepend-vs-append, and getting it backwards is invisible to every test\r\n // while being immediately obvious to anyone who has used the application.\r\n if (options.newestOnTop) host.insertBefore(componentRef.location.nativeElement, host.firstChild);\r\n else host.appendChild(componentRef.location.nativeElement);\r\n\r\n this.appRef.attachView(componentRef.hostView);\r\n // This view is created imperatively rather than by a template, so nothing else will render it\r\n // before the next scheduled tick. Render it now: a toast that appears a frame late is a\r\n // flicker, and callers legitimately read the DOM straight after raising one.\r\n componentRef.changeDetectorRef.detectChanges();\r\n this.active.push(toast);\r\n\r\n // The toast mounts at opacity 0 and transitions in. Clearing the flag in a later frame is what\r\n // gives the browser a starting value to animate from — set it in the same frame and there is\r\n // no transition at all, just an instant appearance.\r\n requestAnimationFrame(() => {\r\n if (!componentRef.hostView.destroyed) {\r\n componentRef.instance.entering.set(false);\r\n componentRef.changeDetectorRef.detectChanges();\r\n }\r\n });\r\n\r\n if (options.timeOut > 0) {\r\n toast.timer = setTimeout(() => this.remove(toast), options.timeOut);\r\n if (options.progressBar) this.runProgress(toast, options.timeOut);\r\n }\r\n\r\n return toast;\r\n }\r\n\r\n /** Shrink the progress bar across the toast's lifetime, the way the original drove it. */\r\n private runProgress(toast: ActiveToast, timeOut: number): void {\r\n const started = performance.now();\r\n const tick = (now: number): void => {\r\n if (toast.componentRef.hostView.destroyed) return;\r\n const remaining = Math.max(0, 100 - ((now - started) / timeOut) * 100);\r\n toast.componentRef.instance.progressWidth.set(remaining);\r\n toast.componentRef.changeDetectorRef.detectChanges();\r\n if (remaining > 0) requestAnimationFrame(tick);\r\n };\r\n requestAnimationFrame(tick);\r\n }\r\n\r\n private remove(toast: ActiveToast): void {\r\n const index = this.active.indexOf(toast);\r\n if (index === -1) return;\r\n\r\n this.active.splice(index, 1);\r\n if (toast.timer !== null) clearTimeout(toast.timer);\r\n\r\n toast.componentRef.instance.dismissing.set(true);\r\n // Flush the leave class now rather than on the next tick, so the animation starts in the same\r\n // frame as the dismissal and the `animationend` below is guaranteed to have something to wait\r\n // for.\r\n toast.componentRef.changeDetectorRef.detectChanges();\r\n\r\n const destroy = (): void => {\r\n toast.componentRef.destroy();\r\n if (this.active.length === 0 && this.container?.isConnected) {\r\n this.container.remove();\r\n this.container = null;\r\n }\r\n };\r\n\r\n // The host is the toast element itself, and the leave is an opacity transition on it.\r\n const element = toast.componentRef.location.nativeElement as HTMLElement;\r\n\r\n // Wait for the transition, but never depend on it: an element that is display:none, in a\r\n // background tab, or under a zero-duration transition fires no `transitionend` at all, and a\r\n // toast that is never destroyed leaks a view. The timeout matches the 300ms in the stylesheet.\r\n let done = false;\r\n const finish = (): void => {\r\n if (done) return;\r\n done = true;\r\n element.removeEventListener('transitionend', finish);\r\n destroy();\r\n };\r\n element.addEventListener('transitionend', finish);\r\n setTimeout(finish, 350);\r\n }\r\n\r\n private ensureContainer(positionClass: string): HTMLElement {\r\n if (this.container?.isConnected) {\r\n this.container.className = `nxe-toast-container ${positionClass}`;\r\n return this.container;\r\n }\r\n\r\n const container = this.document.createElement('div');\r\n container.className = `nxe-toast-container ${positionClass}`;\r\n // Deliberately no `aria-live` here: each toast carries its own role, and a live region around\r\n // them would make every toast announce twice.\r\n this.document.body.appendChild(container);\r\n this.container = container;\r\n return container;\r\n }\r\n}\r\n","// @nexterajs/ui/notify — public API.\r\nexport * from './lib/notify/nxe-toast.config';\r\nexport * from './lib/notify/nxe-toast.component';\r\nexport * from './lib/notify/nxe-toast.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAoDO,MAAM,kBAAkB,GAa3B;AACF,IAAA,aAAa,EAAE,iBAAiB;AAChC,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,iBAAiB,EAAE,KAAK;AACxB,IAAA,SAAS,EAAE,CAAC;;MAGD,gBAAgB,GAAG,IAAI,cAAc,CAAiB,kBAAkB,EAAE;AACrF,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,OAAO,EAAE,CAAC;AACpB,CAAA;;ACnED;;;;;;;;;;;;;;;;;;AAkBG;MAmCU,iBAAiB,CAAA;AACX,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;IAExC,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAgB;IACrC,KAAK,GAAG,KAAK,CAAgB,IAAI;8EAAC;IAClC,OAAO,GAAG,KAAK,CAAgB,IAAI;gFAAC;IACpC,UAAU,GAAG,KAAK,CAAC,KAAK;mFAAC;IACzB,YAAY,GAAG,KAAK,CAAC,IAAI;qFAAC;IAC1B,WAAW,GAAG,KAAK,CAAC,KAAK;oFAAC;IAC1B,WAAW,GAAG,KAAK,CAAC,KAAK;oFAAC;IAC1B,UAAU,GAAG,KAAK,CAAC,EAAE;mFAAC;IACtB,UAAU,GAAG,KAAK,CAAC,EAAE;mFAAC;IACtB,YAAY,GAAG,KAAK,CAAC,EAAE;qFAAC;IAExB,SAAS,GAAG,MAAM,EAAQ;;IAG1B,QAAQ,GAAG,MAAM,CAAC,IAAI;iFAAC;;IAEvB,UAAU,GAAG,MAAM,CAAC,KAAK;mFAAC;IAC1B,aAAa,GAAG,MAAM,CAAC,GAAG;sFAAC;AAEjB,IAAA,SAAS,GAAG,QAAQ,CACrC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS;kFAC3D;AAEkB,IAAA,SAAS,GAAG,QAAQ,CAAC,MACtC;QACE,WAAW;AACX,QAAA,CAAA,UAAA,EAAa,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;QAC1B,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,QAAQ,EAAE,GAAG,oBAAoB,GAAG,EAAE;QAC3C,IAAI,CAAC,UAAU,EAAE,GAAG,mBAAmB,GAAG,EAAE;AAC7C;SACE,MAAM,CAAC,OAAO;SACd,IAAI,CAAC,GAAG,CAAC;kFACb;AAED;;;;;;AAMG;IACgB,WAAW,GAAG,QAAQ,CACvC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;oFAChF;IAES,WAAW,GAAA;QACnB,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IAChD;AAEU,IAAA,YAAY,CAAC,KAAY,EAAA;;QAEjC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;uGAzDW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,aAAA,EAAA,WAAA,EAAA,sCAAA,EAAA,gBAAA,EAAA,0CAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxBlB,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEU,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAlC7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,aAAa;AACxB,wBAAA,aAAa,EAAE,kCAAkC;AACjD,wBAAA,kBAAkB,EAAE,sCAAsC;AAC1D,wBAAA,aAAa,EAAE,MAAM;AACrB,wBAAA,SAAS,EAAE,eAAe;AAC3B,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA,CAAA;AACF,iBAAA;;;AC/BD;;;;;;AAMG;AACG,SAAU,eAAe,CAAC,MAAA,GAAyB,EAAE,EAAA;AACzD,IAAA,OAAO,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AACpF;AAEA;;;;;;;;AAQG;MAEU,eAAe,CAAA;AACT,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACtC,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAErC,MAAM,GAcJ,EAAE,GAAG,kBAAkB,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;IAExD,SAAS,GAAuB,IAAI;IAC3B,MAAM,GAAkB,EAAE;AAE3C,IAAA,OAAO,CAAC,OAAuB,EAAE,KAAqB,EAAE,QAA2B,EAAA;AACjF,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;IACvD;AAEA,IAAA,KAAK,CAAC,OAAuB,EAAE,KAAqB,EAAE,QAA2B,EAAA;AAC/E,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;IACrD;AAEA,IAAA,OAAO,CAAC,OAAuB,EAAE,KAAqB,EAAE,QAA2B,EAAA;AACjF,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;IACvD;AAEA,IAAA,IAAI,CAAC,OAAuB,EAAE,KAAqB,EAAE,QAA2B,EAAA;AAC9E,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;IACpD;;IAGA,KAAK,GAAA;QACH,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC1D;AAEA,IAAA,IAAI,CACF,IAAkB,EAClB,OAAuB,EACvB,KAAqB,EACrB,QAA2B,EAAA;AAE3B,QAAA,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,QAAQ,IAAI,EAAE,CAAC,EAAE;AACvD,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,IAAI,EAAE,CAAA,CAAA,EAAI,OAAO,IAAI,EAAE,EAAE;AAErD,QAAA,IAAI,OAAO,CAAC,iBAAiB,EAAE;AAC7B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;AAC/D,YAAA,IAAI,QAAQ;AAAE,gBAAA,OAAO,QAAQ;QAC/B;;AAGA,QAAA,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE;YACzB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS;gBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7E;AAEA,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,iBAAiB,EAAE;YACtD,mBAAmB,EAAE,IAAI,CAAC,QAAQ;AACnC,SAAA,CAAC;AAEF,QAAA,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;QACnC,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC;QAC7C,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI,CAAC;QACjD,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC;QACvD,YAAY,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC;QAC3D,YAAY,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC;QACzD,YAAY,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC;QACzD,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAC7D,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAC7D,YAAY,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;AAEjE,QAAA,MAAM,KAAK,GAAgB;YACzB,YAAY;AACZ,YAAA,KAAK,EAAE,IAAI;YACX,GAAG;YACH,IAAI;YACJ,KAAK,EAAE,KAAK,IAAI,IAAI;YACpB,OAAO,EAAE,OAAO,IAAI,IAAI;YACxB,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;SAClC;AAED,QAAA,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEnE,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC;;;QAGxD,IAAI,OAAO,CAAC,WAAW;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC;;YAC3F,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC;QAE1D,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC;;;;AAI7C,QAAA,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE;AAC9C,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;;;;QAKvB,qBAAqB,CAAC,MAAK;AACzB,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE;gBACpC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACzC,gBAAA,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE;YAChD;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE;AACvB,YAAA,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC;YACnE,IAAI,OAAO,CAAC,WAAW;gBAAE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;QACnE;AAEA,QAAA,OAAO,KAAK;IACd;;IAGQ,WAAW,CAAC,KAAkB,EAAE,OAAe,EAAA;AACrD,QAAA,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;AACjC,QAAA,MAAM,IAAI,GAAG,CAAC,GAAW,KAAU;AACjC,YAAA,IAAI,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS;gBAAE;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,OAAO,IAAI,OAAO,IAAI,GAAG,CAAC;YACtE,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;AACxD,YAAA,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE;YACpD,IAAI,SAAS,GAAG,CAAC;gBAAE,qBAAqB,CAAC,IAAI,CAAC;AAChD,QAAA,CAAC;QACD,qBAAqB,CAAC,IAAI,CAAC;IAC7B;AAEQ,IAAA,MAAM,CAAC,KAAkB,EAAA;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE;QAElB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAC5B,QAAA,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI;AAAE,YAAA,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;QAEnD,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;;;;AAIhD,QAAA,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE;QAEpD,MAAM,OAAO,GAAG,MAAW;AACzB,YAAA,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE;AAC5B,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE;AAC3D,gBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;AACvB,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;YACvB;AACF,QAAA,CAAC;;QAGD,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,aAA4B;;;;QAKxE,IAAI,IAAI,GAAG,KAAK;QAChB,MAAM,MAAM,GAAG,MAAW;AACxB,YAAA,IAAI,IAAI;gBAAE;YACV,IAAI,GAAG,IAAI;AACX,YAAA,OAAO,CAAC,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC;AACpD,YAAA,OAAO,EAAE;AACX,QAAA,CAAC;AACD,QAAA,OAAO,CAAC,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC;AACjD,QAAA,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;IACzB;AAEQ,IAAA,eAAe,CAAC,aAAqB,EAAA;AAC3C,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE;YAC/B,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,CAAA,oBAAA,EAAuB,aAAa,EAAE;YACjE,OAAO,IAAI,CAAC,SAAS;QACvB;QAEA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACpD,QAAA,SAAS,CAAC,SAAS,GAAG,CAAA,oBAAA,EAAuB,aAAa,EAAE;;;QAG5D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;AACzC,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,QAAA,OAAO,SAAS;IAClB;uGA3LW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA;;2FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACtDlC;;ACAA;;AAEG;;"}
1
+ {"version":3,"file":"nexterajs-ui-notify.mjs","sources":["../../../projects/nextera-ui/notify/src/lib/notify/nxe-toast.config.ts","../../../projects/nextera-ui/notify/src/lib/notify/nxe-toast.component.ts","../../../projects/nextera-ui/notify/src/lib/notify/nxe-toast.service.ts","../../../projects/nextera-ui/notify/src/public-api.ts","../../../projects/nextera-ui/notify/src/nexterajs-ui-notify.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport type NxeToastType = 'success' | 'error' | 'warning' | 'info';\r\n\r\nexport type NxeToastPosition =\r\n | 'toast-top-center'\r\n | 'toast-bottom-center'\r\n | 'toast-top-right'\r\n | 'toast-bottom-right'\r\n | 'toast-top-left'\r\n | 'toast-bottom-left'\r\n | 'toast-top-full-width'\r\n | 'toast-bottom-full-width';\r\n\r\n/** Per-call options. Anything omitted falls back to the global {@link NxeToastConfig}. */\r\nexport interface NxeToastOverride {\r\n /**\r\n * Render the message as HTML rather than text.\r\n *\r\n * The message is still sanitised. Callers pass server-composed strings here — a list of\r\n * validation failures joined with `<br>` — so the markup is not author-controlled and must not\r\n * be trusted, but stripping it entirely would collapse those lists onto one line.\r\n */\r\n enableHtml?: boolean;\r\n /** Dismiss when the body is clicked. The close button works regardless. */\r\n tapToDismiss?: boolean;\r\n /** Milliseconds before auto-dismiss. `0` keeps it up until dismissed. */\r\n timeOut?: number;\r\n closeButton?: boolean;\r\n progressBar?: boolean;\r\n /** Extra classes on the toast element. */\r\n toastClass?: string;\r\n titleClass?: string;\r\n messageClass?: string;\r\n}\r\n\r\nexport interface NxeToastConfig extends NxeToastOverride {\r\n /** Which corner or edge the stack is anchored to. */\r\n positionClass?: NxeToastPosition;\r\n /**\r\n * Put the newest toast at the top of the stack.\r\n *\r\n * Defaults to true, matching the library this replaces. A naive appending list reverses it —\r\n * visibly, and without any test failing.\r\n */\r\n newestOnTop?: boolean;\r\n /** Drop a toast whose type, title and message match one already showing. */\r\n preventDuplicates?: boolean;\r\n /** Cap the stack; 0 means no cap. Older toasts are dismissed first. */\r\n maxOpened?: number;\r\n}\r\n\r\nexport const NXE_TOAST_DEFAULTS: Required<\r\n Pick<\r\n NxeToastConfig,\r\n | 'positionClass'\r\n | 'timeOut'\r\n | 'closeButton'\r\n | 'progressBar'\r\n | 'tapToDismiss'\r\n | 'enableHtml'\r\n | 'newestOnTop'\r\n | 'preventDuplicates'\r\n | 'maxOpened'\r\n >\r\n> = {\r\n positionClass: 'toast-top-right',\r\n timeOut: 5000,\r\n closeButton: false,\r\n progressBar: false,\r\n tapToDismiss: true,\r\n enableHtml: false,\r\n newestOnTop: true,\r\n preventDuplicates: false,\r\n maxOpened: 0,\r\n};\r\n\r\nexport const NXE_TOAST_CONFIG = new InjectionToken<NxeToastConfig>('NXE_TOAST_CONFIG', {\r\n providedIn: 'root',\r\n factory: () => ({}),\r\n});\r\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n SecurityContext,\n signal,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { NxeMessageService } from '@nexterajs/ui/core';\nimport { NxeToastType } from './nxe-toast.config';\n\n/**\n * One toast. Rendered by {@link NxeToastService} into its container; not used directly.\n *\n * **The element order is load-bearing.** The close button comes first and is floated right, which\n * is how the library this replaces positioned it — move it after the title and it drops below the\n * text instead of sitting in the corner. Likewise the host carries the classes rather than an\n * inner wrapper, because the shipped stylesheet targets `.nxe-toast-container .nxe-toast`\n * directly and an extra element between them changes what `width` and `margin` apply to.\n *\n * Styles are global (`@nexterajs/ui/styles/_toast.scss`), not encapsulated, so an application's\n * existing overrides keep winning on specificity exactly as they did before.\n *\n * Accessibility, which the original had none of:\n * - `error` and `warning` announce as `alert` (assertive — the user's own action caused it).\n * `success` and `info` announce as `status` (polite).\n * - Focus is never taken. A validation toast typically appears mid-keystroke, and moving focus\n * would pull the caret out of the field being corrected.\n * - The close button is a real `<button>` with a label, reachable by keyboard.\n */\n@Component({\n selector: 'nxe-toast',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClass()',\n '[attr.role]': 'assertive() ? \"alert\" : \"status\"',\n '[attr.aria-live]': 'assertive() ? \"assertive\" : \"polite\"',\n 'aria-atomic': 'true',\n '(click)': 'onBodyClick()',\n },\n template: `\n @if (closeButton()) {\n <button type=\"button\" class=\"nxe-toast-close\" [attr.aria-label]=\"messages.t('notify.close')\" (click)=\"onCloseClick($event)\">\n &times;\n </button>\n }\n\n @if (title()) {\n <div [class]=\"'nxe-toast-title ' + titleClass()\" [attr.aria-label]=\"title()\">{{ title() }}</div>\n }\n\n @if (message()) {\n @if (enableHtml()) {\n <div [class]=\"'nxe-toast-message ' + messageClass()\" [innerHTML]=\"safeMessage()\"></div>\n } @else {\n <div [class]=\"'nxe-toast-message ' + messageClass()\">{{ message() }}</div>\n }\n }\n\n @if (progressBar()) {\n <div><div class=\"nxe-toast-progress\" [style.width.%]=\"progressWidth()\"></div></div>\n }\n `,\n})\nexport class NxeToastComponent {\n protected readonly messages = inject(NxeMessageService);\n\n private readonly sanitizer = inject(DomSanitizer);\n\n readonly type = input.required<NxeToastType>();\n readonly title = input<string | null>(null);\n readonly message = input<string | null>(null);\n readonly enableHtml = input(false);\n readonly tapToDismiss = input(true);\n readonly closeButton = input(false);\n readonly progressBar = input(false);\n readonly toastClass = input('');\n readonly titleClass = input('');\n readonly messageClass = input('');\n\n readonly dismissed = output<void>();\n\n /** Pre-enter state: the service clears it a frame later so the opacity transition runs. */\n readonly entering = signal(true);\n /** Set while the leave transition plays; the service removes the view once it finishes. */\n readonly dismissing = signal(false);\n readonly progressWidth = signal(100);\n\n protected readonly assertive = computed(\n () => this.type() === 'error' || this.type() === 'warning',\n );\n\n protected readonly hostClass = computed(() =>\n [\n 'nxe-toast',\n `nxe-toast-${this.type()}`,\n this.toastClass(),\n this.entering() ? 'nxe-toast-entering' : '',\n this.dismissing() ? 'nxe-toast-leaving' : '',\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n /**\n * Sanitised HTML for the message.\n *\n * Callers pass server-composed strings here — validation failures joined with `<br>` — so this\n * is data, not markup the application authored. `sanitize` drops anything executable and keeps\n * the line breaks the lists depend on.\n */\n protected readonly safeMessage = computed<SafeHtml>(\n () => this.sanitizer.sanitize(SecurityContext.HTML, this.message() ?? '') ?? '',\n );\n\n protected onBodyClick(): void {\n if (this.tapToDismiss()) this.dismissed.emit();\n }\n\n protected onCloseClick(event: Event): void {\n // Without this the host click handler also fires, dismissing twice.\n event.stopPropagation();\n this.dismissed.emit();\n }\n}\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n ApplicationRef,\r\n ComponentRef,\r\n createComponent,\r\n EnvironmentInjector,\r\n EnvironmentProviders,\r\n inject,\r\n Injectable,\r\n makeEnvironmentProviders,\r\n} from '@angular/core';\r\nimport { NxeToastComponent } from './nxe-toast.component';\r\nimport {\r\n NXE_TOAST_CONFIG,\r\n NXE_TOAST_DEFAULTS,\r\n NxeToastConfig,\r\n NxeToastOverride,\r\n NxeToastType,\r\n} from './nxe-toast.config';\r\n\r\n/** Handle on a shown toast. `dismiss()` is safe to call more than once. */\r\nexport interface NxeToastRef {\r\n dismiss(): void;\r\n readonly type: NxeToastType;\r\n readonly title: string | null;\r\n readonly message: string | null;\r\n}\r\n\r\ninterface ActiveToast extends NxeToastRef {\r\n componentRef: ComponentRef<NxeToastComponent>;\r\n timer: ReturnType<typeof setTimeout> | null;\r\n key: string;\r\n}\r\n\r\n/**\r\n * Configure the toast stack once, at bootstrap.\r\n *\r\n * ```ts\r\n * providers: [provideNxeToast({ positionClass: 'toast-top-center' })]\r\n * ```\r\n */\r\nexport function provideNxeToast(config: NxeToastConfig = {}): EnvironmentProviders {\r\n return makeEnvironmentProviders([{ provide: NXE_TOAST_CONFIG, useValue: config }]);\r\n}\r\n\r\n/**\r\n * Shows toasts.\r\n *\r\n * **The container is deliberately not a CDK overlay.** A CDK overlay pane lands in the same\r\n * `.cdk-overlay-container` as the application's dialogs, which makes paint order creation order —\r\n * so a toast raised right after a dialog closes can end up behind the next dialog that opens.\r\n * Callers do exactly that. A dedicated container with its own stacking context keeps toasts above\r\n * dialogs regardless of the order things were created in.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NxeToastService {\r\n private readonly appRef = inject(ApplicationRef);\r\n private readonly injector = inject(EnvironmentInjector);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly userConfig = inject(NXE_TOAST_CONFIG);\r\n\r\n private readonly config: Required<\r\n Pick<\r\n NxeToastConfig,\r\n | 'positionClass'\r\n | 'timeOut'\r\n | 'closeButton'\r\n | 'progressBar'\r\n | 'tapToDismiss'\r\n | 'enableHtml'\r\n | 'newestOnTop'\r\n | 'preventDuplicates'\r\n | 'maxOpened'\r\n >\r\n > &\r\n NxeToastConfig = { ...NXE_TOAST_DEFAULTS, ...this.userConfig };\r\n\r\n private container: HTMLElement | null = null;\r\n private readonly active: ActiveToast[] = [];\r\n\r\n success(message?: string | null, title?: string | null, override?: NxeToastOverride): NxeToastRef {\r\n return this.show('success', message, title, override);\r\n }\r\n\r\n error(message?: string | null, title?: string | null, override?: NxeToastOverride): NxeToastRef {\r\n return this.show('error', message, title, override);\r\n }\r\n\r\n warning(message?: string | null, title?: string | null, override?: NxeToastOverride): NxeToastRef {\r\n return this.show('warning', message, title, override);\r\n }\r\n\r\n info(message?: string | null, title?: string | null, override?: NxeToastOverride): NxeToastRef {\r\n return this.show('info', message, title, override);\r\n }\r\n\r\n /** Dismiss everything currently showing. */\r\n clear(): void {\r\n for (const toast of [...this.active]) this.remove(toast);\r\n }\r\n\r\n show(\r\n type: NxeToastType,\r\n message?: string | null,\r\n title?: string | null,\r\n override?: NxeToastOverride,\r\n ): NxeToastRef {\r\n const options = { ...this.config, ...(override ?? {}) };\r\n const key = `${type}|${title ?? ''}|${message ?? ''}`;\r\n\r\n if (options.preventDuplicates) {\r\n const existing = this.active.find((toast) => toast.key === key);\r\n if (existing) return existing;\r\n }\r\n\r\n // Trim the oldest first: the newest toast is the one the user's last action produced.\r\n if (options.maxOpened > 0) {\r\n while (this.active.length >= options.maxOpened) this.remove(this.active[0]);\r\n }\r\n\r\n const componentRef = createComponent(NxeToastComponent, {\r\n environmentInjector: this.injector,\r\n });\r\n\r\n componentRef.setInput('type', type);\r\n componentRef.setInput('title', title ?? null);\r\n componentRef.setInput('message', message ?? null);\r\n componentRef.setInput('enableHtml', options.enableHtml);\r\n componentRef.setInput('tapToDismiss', options.tapToDismiss);\r\n componentRef.setInput('closeButton', options.closeButton);\r\n componentRef.setInput('progressBar', options.progressBar);\r\n componentRef.setInput('toastClass', options.toastClass ?? '');\r\n componentRef.setInput('titleClass', options.titleClass ?? '');\r\n componentRef.setInput('messageClass', options.messageClass ?? '');\r\n\r\n const toast: ActiveToast = {\r\n componentRef,\r\n timer: null,\r\n key,\r\n type,\r\n title: title ?? null,\r\n message: message ?? null,\r\n dismiss: () => this.remove(toast),\r\n };\r\n\r\n componentRef.instance.dismissed.subscribe(() => this.remove(toast));\r\n\r\n const host = this.ensureContainer(options.positionClass);\r\n // `newestOnTop` is prepend-vs-append, and getting it backwards is invisible to every test\r\n // while being immediately obvious to anyone who has used the application.\r\n if (options.newestOnTop) host.insertBefore(componentRef.location.nativeElement, host.firstChild);\r\n else host.appendChild(componentRef.location.nativeElement);\r\n\r\n this.appRef.attachView(componentRef.hostView);\r\n // This view is created imperatively rather than by a template, so nothing else will render it\r\n // before the next scheduled tick. Render it now: a toast that appears a frame late is a\r\n // flicker, and callers legitimately read the DOM straight after raising one.\r\n componentRef.changeDetectorRef.detectChanges();\r\n this.active.push(toast);\r\n\r\n // The toast mounts at opacity 0 and transitions in. Clearing the flag in a later frame is what\r\n // gives the browser a starting value to animate from — set it in the same frame and there is\r\n // no transition at all, just an instant appearance.\r\n requestAnimationFrame(() => {\r\n if (!componentRef.hostView.destroyed) {\r\n componentRef.instance.entering.set(false);\r\n componentRef.changeDetectorRef.detectChanges();\r\n }\r\n });\r\n\r\n if (options.timeOut > 0) {\r\n toast.timer = setTimeout(() => this.remove(toast), options.timeOut);\r\n if (options.progressBar) this.runProgress(toast, options.timeOut);\r\n }\r\n\r\n return toast;\r\n }\r\n\r\n /** Shrink the progress bar across the toast's lifetime, the way the original drove it. */\r\n private runProgress(toast: ActiveToast, timeOut: number): void {\r\n const started = performance.now();\r\n const tick = (now: number): void => {\r\n if (toast.componentRef.hostView.destroyed) return;\r\n const remaining = Math.max(0, 100 - ((now - started) / timeOut) * 100);\r\n toast.componentRef.instance.progressWidth.set(remaining);\r\n toast.componentRef.changeDetectorRef.detectChanges();\r\n if (remaining > 0) requestAnimationFrame(tick);\r\n };\r\n requestAnimationFrame(tick);\r\n }\r\n\r\n private remove(toast: ActiveToast): void {\r\n const index = this.active.indexOf(toast);\r\n if (index === -1) return;\r\n\r\n this.active.splice(index, 1);\r\n if (toast.timer !== null) clearTimeout(toast.timer);\r\n\r\n toast.componentRef.instance.dismissing.set(true);\r\n // Flush the leave class now rather than on the next tick, so the animation starts in the same\r\n // frame as the dismissal and the `animationend` below is guaranteed to have something to wait\r\n // for.\r\n toast.componentRef.changeDetectorRef.detectChanges();\r\n\r\n const destroy = (): void => {\r\n toast.componentRef.destroy();\r\n if (this.active.length === 0 && this.container?.isConnected) {\r\n this.container.remove();\r\n this.container = null;\r\n }\r\n };\r\n\r\n // The host is the toast element itself, and the leave is an opacity transition on it.\r\n const element = toast.componentRef.location.nativeElement as HTMLElement;\r\n\r\n // Wait for the transition, but never depend on it: an element that is display:none, in a\r\n // background tab, or under a zero-duration transition fires no `transitionend` at all, and a\r\n // toast that is never destroyed leaks a view. The timeout matches the 300ms in the stylesheet.\r\n let done = false;\r\n const finish = (): void => {\r\n if (done) return;\r\n done = true;\r\n element.removeEventListener('transitionend', finish);\r\n destroy();\r\n };\r\n element.addEventListener('transitionend', finish);\r\n setTimeout(finish, 350);\r\n }\r\n\r\n private ensureContainer(positionClass: string): HTMLElement {\r\n if (this.container?.isConnected) {\r\n this.container.className = `nxe-toast-container ${positionClass}`;\r\n return this.container;\r\n }\r\n\r\n const container = this.document.createElement('div');\r\n container.className = `nxe-toast-container ${positionClass}`;\r\n // Deliberately no `aria-live` here: each toast carries its own role, and a live region around\r\n // them would make every toast announce twice.\r\n this.document.body.appendChild(container);\r\n this.container = container;\r\n return container;\r\n }\r\n}\r\n","// @nexterajs/ui/notify — public API.\r\nexport * from './lib/notify/nxe-toast.config';\r\nexport * from './lib/notify/nxe-toast.component';\r\nexport * from './lib/notify/nxe-toast.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}