@cdevhub/ngx-tw 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +11 -7
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +8 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +8 -2
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +8 -9
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +10 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +2 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +6 -2
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select.mjs +10 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +3 -0
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +5 -1
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +11 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/package.json +4 -1
- package/theme/_dark.css +16 -12
- package/theme/_semantic.css +3 -2
- package/types/cdevhub-ngx-tw-code-block.d.ts +8 -7
- package/types/cdevhub-ngx-tw-select.d.ts +1 -1
- package/types/cdevhub-ngx-tw-toast.d.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-toast.mjs","sources":["../../../projects/ngx-tw/toast/toast-config.ts","../../../projects/ngx-tw/toast/toast-component.ts","../../../projects/ngx-tw/toast/toast-container.ts","../../../projects/ngx-tw/toast/toast-ref.ts","../../../projects/ngx-tw/toast/toast.ts","../../../projects/ngx-tw/toast/cdevhub-ngx-tw-toast.ts"],"sourcesContent":["import { InjectionToken, type TemplateRef, type Type } from '@angular/core';\nimport type { ToastRef } from './toast-ref';\n\n/** Severity variant — drives color palette, default icon, and live-region politeness. */\nexport type ToastSeverity = 'info' | 'success' | 'warning' | 'error' | 'neutral';\n\n/** Screen anchor for a stack of toasts. One CDK overlay is created per position on first use. */\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\n/** Lifecycle state of a single toast. */\nexport type ToastState = 'entering' | 'visible' | 'paused' | 'dismissing' | 'dismissed';\n\n/** Reason a toast was dismissed. */\nexport type ToastDismissReason =\n | 'action'\n | 'timeout'\n | 'swipe'\n | 'manual'\n | 'programmatic'\n | 'max-exceeded';\n\n/** Payload forwarded to `afterDismissed()` subscribers. */\nexport interface ToastDismissal<R = unknown> {\n /** Why the toast closed. */\n reason: ToastDismissReason;\n /** Optional value forwarded from `ref.dismiss(result)`. */\n result?: R;\n}\n\n/** Context object handed to `TemplateRef` content (`let-data let-ref=\"ref\"`). */\nexport interface ToastTemplateContext<T = unknown> {\n /** Data value from `config.data`, unwrapped as the template's `$implicit`. */\n $implicit: T;\n /** Reference to the toast itself, bound as `let-ref=\"ref\"`. */\n ref: ToastRef<unknown, unknown>;\n}\n\n/** Action button configuration. When `handler` is omitted the button dismisses the toast with reason `'action'`. */\nexport interface ToastAction {\n /** Visible label of the action button. */\n label: string;\n /** Optional callback invoked when the action is clicked or `ref.triggerAction()` is called. */\n handler?: (ref: ToastRef) => void;\n}\n\n/**\n * Per-call configuration for {@link ToastService} methods. Also used as the\n * payload of {@link TW_TOAST_DEFAULT_OPTIONS} for app-wide defaults.\n */\nexport class ToastConfig<D = unknown, R = unknown> {\n /** Severity of the toast. Defaults to `'info'`. */\n severity?: ToastSeverity = 'info';\n\n /** Screen position of the toast stack. Defaults to `'bottom-right'`. */\n position?: ToastPosition = 'bottom-right';\n\n /** Auto-dismiss duration in ms. `0` disables auto-dismiss. Defaults to `5000`. */\n duration?: number = 5000;\n\n // Default true: toasts must offer an escape hatch — sticky / long-duration toasts\n // otherwise trap users; opt-out only for ephemeral progress markers paired with `duration`.\n /** When true, renders a close (×) button. Defaults to `true`. */\n dismissible?: boolean = true;\n\n /**\n * Live-region politeness. When omitted, resolves to `'assertive'` for\n * `severity: 'error'` and `'polite'` otherwise. Pass `'off'` to skip\n * `LiveAnnouncer` entirely.\n */\n politeness?: 'polite' | 'assertive' | 'off';\n\n /** Action button configuration. Omit to hide the action button. */\n action?: ToastAction;\n\n /** Arbitrary data provided to component / template content via `TW_TOAST_DATA`. */\n data?: D | null = null;\n\n /** Extra CSS classes merged onto the toast panel root via `twMerge`. */\n panelClass?: string | string[];\n\n /**\n * Icon override. Pass a string (treated as text glyph / icon name) or\n * `false` to hide the icon. When omitted the severity-default icon is used.\n *\n * Note: To render arbitrary icon markup, pass a `TemplateRef` to `show()`\n * itself (the whole toast is a custom template) — the icon slot accepts only\n * primitives for the string-content path.\n */\n icon?: string | false;\n\n // Default true: matches Material/Radix/Sonner conventions — prevents a toast from\n // disappearing mid-read; opt-out only for fully ambient progress indicators.\n /** When true, pause the auto-dismiss timer while the toast is hovered or holds focus. Defaults to `true`. */\n pauseOnInteraction?: boolean = true;\n\n // Default true: matches mobile-platform expectations and gives non-precise pointers\n // (touch) an easy dismiss gesture; opt-out only if the gesture conflicts with content.\n /** Enable horizontal swipe-to-dismiss via pointer gestures. Defaults to `true`. */\n swipeToDismiss?: boolean = true;\n\n /**\n * Maximum visible toasts *per position*. When exceeded, the oldest toast in\n * that position dismisses with reason `'max-exceeded'`. Defaults to `5`.\n */\n maxVisible?: number = 5;\n\n /** Explicit id. When omitted a unique id is generated. */\n id?: string;\n\n /** Accessible label applied to the toast element. When omitted, text content is used. */\n ariaLabel?: string;\n\n /** Accessible label applied to the per-position `role=\"region\"` container. Defaults to `'Notifications'`. */\n regionAriaLabel?: string;\n}\n\n/** Injection token providing `config.data` to projected component / template content. */\nexport const TW_TOAST_DATA = new InjectionToken<unknown>('TW_TOAST_DATA');\n\n/** Injection token providing the owning {@link ToastRef} to projected component content. */\nexport const TW_TOAST_REF = new InjectionToken<ToastRef>('TW_TOAST_REF');\n\n/** Injection token carrying application-wide toast defaults. Set via `provideToast(defaults)`. */\nexport const TW_TOAST_DEFAULT_OPTIONS = new InjectionToken<Partial<ToastConfig>>(\n 'TW_TOAST_DEFAULT_OPTIONS',\n);\n\n/** Accepted content forms for `ToastService.show()`. */\nexport type ToastContent = string | TemplateRef<ToastTemplateContext> | Type<unknown>;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { ToastSeverity } from './toast-config';\n\nconst toastVariants = tv(\n {\n slots: {\n root:\n 'pointer-events-auto relative flex items-start gap-3 w-full max-w-sm p-4 rounded-lg border shadow-md text-sm will-change-transform transition-colors duration-normal motion-reduce:transition-none',\n icon: 'size-5 shrink-0 mt-0.5',\n title: 'text-sm font-semibold',\n description: 'text-sm',\n content: 'flex-1 min-w-0',\n action:\n 'inline-flex items-center justify-center px-3 py-1.5 rounded-md text-sm font-medium cursor-pointer transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n // Dismiss container is `size-6` (24px — xs square-interactive-target\n // scale per CLAUDE.md icon sub-scale). The inner SVG is `size-4` (16px\n // glyph scale), centred via flex; the larger container gives the\n // touch/click affordance without enlarging the visual glyph.\n dismiss:\n 'absolute top-3 right-3 inline-flex items-center justify-center size-6 rounded-md cursor-pointer transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n },\n variants: {\n severity: {\n info: {},\n success: {},\n warning: {},\n error: {},\n neutral: {},\n },\n },\n // Color slot tokens (`{role}-soft`, `-soft-fg`, `-icon`, …) own light/dark\n // contrast — components consume the slot only. See `_semantic.css`.\n // Slot-token safelist: see `projects/ngx-tw/theme/index.css` `@source inline(...)`\n // — Tailwind v4's JIT cannot scan template-literal class names, so every\n // `bg-${severity}-soft` / `text-${severity}-icon` permutation below must be\n // enumerated there.\n compoundVariants: (['info', 'success', 'warning', 'error', 'neutral'] as const).map(\n (severity) => ({\n severity,\n class: {\n root: `bg-${severity}-soft text-${severity}-soft-fg-muted border-${severity}-border`,\n icon: `text-${severity}-icon`,\n title: `text-${severity}-soft-fg`,\n description: `text-${severity}-soft-fg-muted`,\n action: `text-${severity}-soft-fg hover:bg-${severity}-soft-hover`,\n dismiss: `text-${severity}-icon hover:bg-${severity}-soft-hover`,\n },\n }),\n ),\n defaultVariants: {\n severity: 'info',\n },\n },\n { twMerge: true },\n);\n\n/** Slot directive for the icon. When projected, overrides the severity-default icon. */\n@Directive({\n selector: '[twToastIcon]',\n host: {\n '[class]': 'classes()',\n 'aria-hidden': 'true',\n },\n})\nexport class ToastIconDirective {\n private readonly toast = inject(ToastComponent);\n /** @internal */\n readonly classes = this.toast.iconClasses;\n}\n\n/** Slot directive for the bold title line inside a toast. */\n@Directive({\n selector: '[twToastTitle]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class ToastTitleDirective {\n private readonly toast = inject(ToastComponent);\n /** @internal */\n readonly classes = this.toast.titleClasses;\n}\n\n/** Slot directive for a secondary description line inside a toast. */\n@Directive({\n selector: '[twToastDescription]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class ToastDescriptionDirective {\n private readonly toast = inject(ToastComponent);\n /** @internal */\n readonly classes = this.toast.descriptionClasses;\n}\n\n/** Slot directive for the action button. Apply to a native `<button>` to inherit the severity-aware styling. */\n@Directive({\n selector: '[twToastAction]',\n host: {\n type: 'button',\n '[class]': 'classes()',\n '(click)': 'onClick()',\n },\n})\nexport class ToastActionDirective {\n private readonly toast = inject(ToastComponent);\n /** @internal */\n readonly classes = this.toast.actionClasses;\n /** @internal */\n protected onClick(): void {\n this.toast.actionClicked.emit();\n }\n}\n\n/**\n * Visual toast / snackbar panel. Rendered internally by {@link ToastService} for\n * string content, and exported for consumers who want to compose the same\n * visual inside a custom `TemplateRef` or component class passed to `show()`.\n */\n@Component({\n selector: 'tw-toast',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n '[attr.role]': 'roleAttr()',\n '[attr.aria-live]': 'ariaLiveAttr()',\n 'aria-atomic': 'true',\n '[attr.aria-label]': 'ariaLabel() || null',\n '[attr.data-severity]': 'severity()',\n },\n template: `\n @if (hasProjectedIcon()) {\n <ng-content select=\"[twToastIcon]\" />\n } @else if (icon() !== false) {\n <span [class]=\"iconClasses()\" aria-hidden=\"true\">\n @switch (severity()) {\n @case ('info') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"size-full\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm0-11a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm-.75 2.5a.75.75 0 0 0 0 1.5h.25v3h-.25a.75.75 0 0 0 0 1.5h2a.75.75 0 0 0 0-1.5h-.25v-3.75a.75.75 0 0 0-.75-.75h-1Z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n @case ('success') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"size-full\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm3.857-9.809a.75.75 0 0 0-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 1 0-1.06 1.061l2.5 2.5a.75.75 0 0 0 1.137-.089l4-5.5Z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n @case ('warning') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"size-full\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495ZM10 5a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 10 5Zm0 9a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n @case ('error') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"size-full\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-8-5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 10 5Zm0 10a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n @default {\n @if (icon() && icon() !== false) {\n {{ icon() }}\n }\n }\n }\n </span>\n }\n <div [class]=\"contentClasses()\">\n <ng-content select=\"[twToastTitle]\" />\n <ng-content select=\"[twToastDescription]\" />\n <ng-content />\n <ng-content select=\"[twToastAction]\" />\n </div>\n @if (dismissible()) {\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n [class]=\"dismissClasses()\"\n (click)=\"dismissed.emit()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" class=\"size-4\">\n <path d=\"M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z\"/>\n </svg>\n </button>\n }\n `,\n})\nexport class ToastComponent {\n /** Severity variant. Drives color palette, default icon, and ARIA role / live politeness. Defaults to `'info'`. */\n readonly severity = input<ToastSeverity>('info');\n\n // Default true: mirrors `ToastConfig.dismissible` — toasts must offer an escape\n // hatch by default; opt-out only for ephemeral progress markers paired with `duration`.\n /** Whether to render the close button. Defaults to `true`. */\n readonly dismissible = input<boolean>(true);\n\n /**\n * Icon override. Pass a string to render as text inside the icon slot, or\n * `false` to hide the built-in severity icon. Ignored when a `[twToastIcon]`\n * child is projected. When omitted, the severity-default icon renders.\n *\n * For arbitrary icon markup, project a `[twToastIcon]` child instead.\n */\n readonly icon = input<string | false | undefined>(undefined);\n\n /** Explicit aria-label for the toast wrapper. When omitted, text content is used by assistive tech. */\n readonly ariaLabel = input<string | undefined>(undefined);\n\n /** Fires when the close button is clicked. */\n readonly dismissed = output<void>();\n\n /** Fires when a `[twToastAction]` button is clicked. */\n readonly actionClicked = output<void>();\n\n /** @internal */\n readonly projectedIcon = contentChild(ToastIconDirective);\n\n /** @internal */\n readonly hasProjectedIcon = computed(() => !!this.projectedIcon());\n\n private readonly variantResult = computed(() => toastVariants({ severity: this.severity() }));\n\n /** @internal */\n readonly rootClasses = computed(() => {\n const base = this.variantResult().root();\n return this.dismissible() ? `${base} pr-10` : base;\n });\n\n /** @internal */\n readonly iconClasses = computed(() => this.variantResult().icon());\n /** @internal */\n readonly titleClasses = computed(() => this.variantResult().title());\n /** @internal */\n readonly descriptionClasses = computed(() => this.variantResult().description());\n /** @internal */\n readonly contentClasses = computed(() => this.variantResult().content());\n /** @internal */\n readonly actionClasses = computed(() => this.variantResult().action());\n /** @internal */\n readonly dismissClasses = computed(() => this.variantResult().dismiss());\n\n /** @internal */\n protected readonly roleAttr = computed(() =>\n this.severity() === 'error' ? 'alert' : 'status',\n );\n\n /** @internal */\n protected readonly ariaLiveAttr = computed(() =>\n this.severity() === 'error' ? 'assertive' : 'polite',\n );\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n type ComponentRef,\n Component,\n computed,\n ElementRef,\n Injector,\n TemplateRef,\n ViewEncapsulation,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport {\n CdkPortalOutlet,\n type CdkPortalOutletAttachedRef,\n ComponentPortal,\n} from '@angular/cdk/portal';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { ToastActionDirective, ToastComponent } from './toast-component';\nimport {\n TW_TOAST_DATA,\n TW_TOAST_REF,\n type ToastPosition,\n type ToastTemplateContext,\n} from './toast-config';\nimport type { ToastRef } from './toast-ref';\n\ntype ToastKind = 'string' | 'template' | 'component';\n\ninterface Entry {\n ref: ToastRef;\n kind: ToastKind;\n enterClass: string;\n leaveClass: string;\n}\n\nconst POSITION_AXIS: Record<ToastPosition, 'right' | 'left' | 'top' | 'bottom'> = {\n 'top-right': 'right',\n 'bottom-right': 'right',\n 'top-left': 'left',\n 'bottom-left': 'left',\n 'top-center': 'top',\n 'bottom-center': 'bottom',\n};\n\nconst POSITION_HOST_CLASSES: Record<ToastPosition, string> = {\n 'top-right': 'items-end',\n 'bottom-right': 'items-end',\n 'top-left': 'items-start',\n 'bottom-left': 'items-start',\n 'top-center': 'items-center',\n 'bottom-center': 'items-center',\n};\n\nconst POSITION_ORDER_REVERSED: Record<ToastPosition, boolean> = {\n 'top-right': false,\n 'top-left': false,\n 'top-center': false,\n 'bottom-right': true,\n 'bottom-left': true,\n 'bottom-center': true,\n};\n\nconst SWIPE_DISMISS_FRACTION = 0.4;\nconst SWIPE_MAX_OPACITY_FADE = 0.6;\n\n/**\n * Internal flex-column host rendered inside each per-position CDK overlay.\n * Stacks visible toasts via `@for`, wires pause-on-interaction, Escape\n * dismissal, swipe gestures, and `LiveAnnouncer` announcements.\n *\n * @docs-private\n */\n@Component({\n selector: 'tw-toast-container',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [NgTemplateOutlet, CdkPortalOutlet, ToastComponent, ToastActionDirective],\n host: {\n role: 'region',\n '[class]': 'hostClasses()',\n '[attr.aria-label]': 'regionLabel()',\n '[attr.data-position]': 'position()',\n },\n template: `\n @for (entry of orderedEntries(); track entry.ref.id) {\n <div\n class=\"pointer-events-auto w-full max-w-sm\"\n [attr.data-toast-id]=\"entry.ref.id\"\n [style.transform]=\"entry.ref.swipeTransform() || null\"\n [style.opacity]=\"entry.ref.swipeOpacity() ?? null\"\n [style.touch-action]=\"'pan-y'\"\n [animate.enter]=\"entry.enterClass\"\n [animate.leave]=\"entry.ref.leaveAnimationOverride() ?? entry.leaveClass\"\n (pointerenter)=\"onPointerEnter(entry.ref)\"\n (pointerleave)=\"onPointerLeave(entry.ref)\"\n (focusin)=\"onFocusIn(entry.ref)\"\n (focusout)=\"onFocusOut(entry.ref, $event)\"\n (keydown.escape)=\"onEscape(entry.ref, $event)\"\n (pointerdown)=\"onSwipeStart(entry.ref, $event, swipeEl)\"\n #swipeEl\n >\n @switch (entry.kind) {\n @case ('string') {\n <tw-toast\n [severity]=\"entry.ref.severity()\"\n [dismissible]=\"entry.ref.dismissible()\"\n [icon]=\"entry.ref.icon()\"\n [ariaLabel]=\"entry.ref.ariaLabel()\"\n [class]=\"panelClassFor(entry.ref)\"\n (dismissed)=\"entry.ref._dismissWith('manual')\"\n (actionClicked)=\"entry.ref.triggerAction()\"\n >\n {{ asString(entry.ref.content()) }}\n @if (entry.ref.action(); as action) {\n <button twToastAction>{{ action.label }}</button>\n }\n </tw-toast>\n }\n @case ('template') {\n <tw-toast\n [severity]=\"entry.ref.severity()\"\n [dismissible]=\"entry.ref.dismissible()\"\n [icon]=\"entry.ref.icon()\"\n [ariaLabel]=\"entry.ref.ariaLabel()\"\n [class]=\"panelClassFor(entry.ref)\"\n (dismissed)=\"entry.ref._dismissWith('manual')\"\n (actionClicked)=\"entry.ref.triggerAction()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"asTemplate(entry.ref.content())\"\n [ngTemplateOutletContext]=\"templateContext(entry.ref)\"\n />\n @if (entry.ref.action(); as action) {\n <button twToastAction>{{ action.label }}</button>\n }\n </tw-toast>\n }\n @case ('component') {\n <ng-template\n [cdkPortalOutlet]=\"entry.ref._portal\"\n (attached)=\"onPortalAttached(entry.ref, $event)\"\n />\n }\n }\n </div>\n }\n `,\n})\nexport class ToastContainerComponent {\n /** Per-position stacking anchor. Mutated from {@link ToastService} via `.instance.position.set(...)`. */\n readonly position = signal<ToastPosition>('bottom-right');\n\n /** Accessible label applied to the `role=\"region\"` host. Mutated from the service on init. */\n readonly regionLabel = signal<string>('Notifications');\n\n /**\n * Toasts currently assigned to this container. The service pushes toasts\n * into this signal; the container filters by state to drive `animate.leave`.\n */\n readonly visibleRefs = signal<readonly ToastRef[]>([]);\n\n private readonly injector = inject(Injector);\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n private readonly host = inject(ElementRef<HTMLElement>);\n\n private readonly swipeSessions = new WeakMap<\n ToastRef,\n { pointerId: number; startX: number; width: number; active: boolean }\n >();\n\n private readonly entries = computed<readonly Entry[]>(() => {\n const pos = this.position();\n const axis = POSITION_AXIS[pos];\n const enter = `toast-enter-${axis}`;\n const leave = `toast-leave-${axis}`;\n const refs = this.visibleRefs().filter((ref) => {\n const s = ref.state();\n return s === 'entering' || s === 'visible' || s === 'paused';\n });\n return refs.map((ref) => ({\n ref,\n kind: resolveKind(ref.content()),\n enterClass: enter,\n leaveClass: leave,\n }));\n });\n\n protected readonly orderedEntries = computed(() => {\n const list = this.entries();\n return POSITION_ORDER_REVERSED[this.position()] ? [...list].reverse() : list;\n });\n\n protected readonly hostClasses = computed(() => {\n const base = 'flex flex-col gap-2 w-full max-w-sm';\n const align = POSITION_HOST_CLASSES[this.position()];\n return `${base} ${align}`;\n });\n\n /** @internal Called by the service right after attaching a new toast. Runs `LiveAnnouncer`. */\n _announceOpen(ref: ToastRef): void {\n const politeness = this.resolvePoliteness(ref);\n if (politeness === 'off') return;\n const msg = this.resolveAnnouncementText(ref);\n if (msg) this.liveAnnouncer.announce(msg, politeness);\n }\n\n /** @internal Called by the service when `ref.update()` fires — re-announces with the new severity / content. */\n _announceUpdate(ref: ToastRef): void {\n this._announceOpen(ref);\n }\n\n /** @internal Captures the component instance after `cdkPortalOutlet` attaches. */\n protected onPortalAttached(ref: ToastRef, attached: CdkPortalOutletAttachedRef): void {\n if (attached && 'instance' in attached) {\n ref.componentInstance = (attached as ComponentRef<unknown>).instance;\n }\n }\n\n /** @internal Injector factory for component-class content. Provides `TW_TOAST_DATA` + `TW_TOAST_REF`. */\n _createContentInjector(ref: ToastRef): Injector {\n return Injector.create({\n parent: this.injector,\n providers: [\n { provide: TW_TOAST_REF, useValue: ref },\n { provide: TW_TOAST_DATA, useValue: ref.data() },\n ],\n });\n }\n\n // ── Template helpers ──\n\n protected asString(content: unknown): string {\n return typeof content === 'string' ? content : '';\n }\n\n protected asTemplate(content: unknown): TemplateRef<ToastTemplateContext> | null {\n return content instanceof TemplateRef ? (content as TemplateRef<ToastTemplateContext>) : null;\n }\n\n protected templateContext(ref: ToastRef): ToastTemplateContext {\n return { $implicit: ref.data() as never, ref };\n }\n\n protected panelClassFor(ref: ToastRef): string {\n const raw = ref.config.panelClass;\n if (!raw) return '';\n return Array.isArray(raw) ? raw.join(' ') : raw;\n }\n\n // ── Interaction handlers ──\n\n protected onPointerEnter(ref: ToastRef): void {\n ref._setHovered(true);\n }\n\n protected onPointerLeave(ref: ToastRef): void {\n ref._setHovered(false);\n }\n\n protected onFocusIn(ref: ToastRef): void {\n ref._setFocused(true);\n }\n\n protected onFocusOut(ref: ToastRef, event: FocusEvent): void {\n const related = event.relatedTarget as Node | null;\n const target = event.currentTarget as Node | null;\n if (related && target && target.contains(related)) return;\n ref._setFocused(false);\n }\n\n protected onEscape(ref: ToastRef, event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n ref._dismissWith('manual');\n }\n\n protected onSwipeStart(ref: ToastRef, event: PointerEvent, el: HTMLElement): void {\n if (!ref.config.swipeToDismiss) return;\n if (event.button !== 0) return;\n const target = event.target as HTMLElement | null;\n if (target?.closest('button, a, input, select, textarea, [role=\"button\"]')) return;\n\n const width = el.getBoundingClientRect().width;\n this.swipeSessions.set(ref, {\n pointerId: event.pointerId,\n startX: event.clientX,\n width,\n active: false,\n });\n el.setPointerCapture(event.pointerId);\n\n const onMove = (e: PointerEvent) => this.onSwipeMove(ref, e, el);\n const onUp = (e: PointerEvent) => this.onSwipeEnd(ref, e, el, onMove, onUp);\n el.addEventListener('pointermove', onMove);\n el.addEventListener('pointerup', onUp);\n el.addEventListener('pointercancel', onUp);\n }\n\n private onSwipeMove(ref: ToastRef, event: PointerEvent, _el: HTMLElement): void {\n const session = this.swipeSessions.get(ref);\n if (!session || event.pointerId !== session.pointerId) return;\n const dx = event.clientX - session.startX;\n if (!session.active && Math.abs(dx) < 6) return;\n session.active = true;\n ref.swipeTransform.set(`translate3d(${dx}px, 0, 0)`);\n const fade = 1 - Math.min(Math.abs(dx) / session.width, 1) * SWIPE_MAX_OPACITY_FADE;\n ref.swipeOpacity.set(fade);\n }\n\n private onSwipeEnd(\n ref: ToastRef,\n event: PointerEvent,\n el: HTMLElement,\n onMove: (e: PointerEvent) => void,\n onUp: (e: PointerEvent) => void,\n ): void {\n const session = this.swipeSessions.get(ref);\n el.removeEventListener('pointermove', onMove);\n el.removeEventListener('pointerup', onUp);\n el.removeEventListener('pointercancel', onUp);\n if (!session || event.pointerId !== session.pointerId) return;\n try {\n el.releasePointerCapture(session.pointerId);\n } catch {\n /* no-op */\n }\n this.swipeSessions.delete(ref);\n\n if (!session.active) return;\n const dx = event.clientX - session.startX;\n const threshold = session.width * SWIPE_DISMISS_FRACTION;\n const allowed = this.swipeDirectionAllowed(dx);\n if (Math.abs(dx) >= threshold && allowed) {\n untracked(() => {\n ref.swipeTransform.set(`translate3d(${Math.sign(dx) * session.width * 1.2}px, 0, 0)`);\n ref.swipeOpacity.set(0);\n ref.leaveAnimationOverride.set('fade-out');\n });\n ref._dismissWith('swipe');\n } else {\n ref.swipeTransform.set(null);\n ref.swipeOpacity.set(null);\n }\n }\n\n private swipeDirectionAllowed(dx: number): boolean {\n const pos = this.position();\n if (pos === 'top-right' || pos === 'bottom-right') return dx > 0;\n if (pos === 'top-left' || pos === 'bottom-left') return dx < 0;\n return true;\n }\n\n private resolvePoliteness(ref: ToastRef): 'polite' | 'assertive' | 'off' {\n if (ref.config.politeness) return ref.config.politeness;\n return ref.severity() === 'error' ? 'assertive' : 'polite';\n }\n\n private resolveAnnouncementText(ref: ToastRef): string {\n const explicit = ref.ariaLabel();\n if (explicit) return explicit;\n const content = ref.content();\n if (typeof content === 'string') return content;\n const host = this.host.nativeElement.querySelector(\n `[data-toast-id=\"${ref.id}\"]`,\n ) as HTMLElement | null;\n if (host) return host.textContent?.trim() ?? '';\n return this.host.nativeElement.textContent?.trim() ?? '';\n }\n}\n\nfunction resolveKind(content: unknown): ToastKind {\n if (typeof content === 'string') return 'string';\n if (content instanceof TemplateRef) return 'template';\n return 'component';\n}\n\n","import { signal, type Signal, type WritableSignal } from '@angular/core';\nimport type { Portal } from '@angular/cdk/portal';\nimport { type Observable, ReplaySubject, Subject } from 'rxjs';\nimport type {\n ToastAction,\n ToastConfig,\n ToastContent,\n ToastDismissReason,\n ToastDismissal,\n ToastSeverity,\n ToastState,\n} from './toast-config';\n\n/** Duration (ms) of the toast enter / leave animation. Must match `_base.css` toast-slide keyframes. */\nexport const TOAST_ANIMATION_DURATION = 150;\n\n/** Padding added to animation fallback timers to guarantee cleanup if the CSS event is swallowed. */\nexport const TOAST_ANIMATION_FALLBACK_PADDING = 50;\n\n/** Patch accepted by {@link ToastRef.update}. Mirrors the subset of `ToastConfig` that is safe to mutate live. */\nexport interface ToastUpdatePatch {\n /** New severity — updates color, default icon, and (for `'error'`) live-region politeness. */\n severity?: ToastSeverity;\n /** New auto-dismiss duration in ms. Restarts the timer if the toast is visible. `0` disables auto-dismiss. */\n duration?: number;\n /** Replace or clear the action button. Pass `null` to remove. */\n action?: ToastAction | null;\n /** Override the icon slot. */\n icon?: string | false | undefined;\n /** Replace the `TW_TOAST_DATA` payload. */\n data?: unknown;\n /** Replace the aria-label applied to the toast wrapper. */\n ariaLabel?: string;\n /** Replace the toast's content (string, template, or component). */\n content?: ToastContent;\n /** Whether the close button is shown. */\n dismissible?: boolean;\n}\n\n/**\n * Reference to a toast opened via {@link ToastService}. Use to dismiss the\n * toast, pause / resume its auto-dismiss timer, or observe its lifecycle.\n *\n * The service returns a ref synchronously from every open method; the toast\n * itself is attached asynchronously inside the CDK overlay.\n */\nexport class ToastRef<C = unknown, R = unknown> {\n /** Unique id. Generated if `config.id` was not provided. */\n readonly id: string;\n\n /** Instance of the component rendered inside the toast (only for component-class content). */\n componentInstance: C | null = null;\n\n /** Resolved static config for this toast (defaults merged, severity shorthand applied). */\n readonly config: Readonly<ToastConfig<unknown, R>>;\n\n /** Reactive lifecycle state. */\n readonly state: Signal<ToastState>;\n\n /** Reactive severity — may change after `update()` (used by the `promise()` helper). */\n readonly severity: Signal<ToastSeverity>;\n\n /** Reactive dismissibility. */\n readonly dismissible: Signal<boolean>;\n\n /** Reactive icon override. */\n readonly icon: Signal<string | false | undefined>;\n\n /** Reactive content (the source of truth for what gets rendered). */\n readonly content: Signal<ToastContent>;\n\n /** Reactive action button configuration. */\n readonly action: Signal<ToastAction | undefined>;\n\n /** Reactive accessible label. */\n readonly ariaLabel: Signal<string | undefined>;\n\n /** Reactive data payload — re-read by the container to update `TW_TOAST_DATA`. */\n readonly data: Signal<unknown>;\n\n /** @internal Reactive \"transient\" class applied by swipe gestures (e.g. `translate3d(...)`). */\n readonly swipeTransform = signal<string | null>(null);\n\n /** @internal Reactive opacity applied during swipe gestures. */\n readonly swipeOpacity = signal<number | null>(null);\n\n /** @internal Leave-animation class override. When non-null, container uses this instead of the position default. */\n readonly leaveAnimationOverride = signal<string | null>(null);\n\n /** @internal Portal for component-class content. Set by the service; null for string / template content. */\n _portal: Portal<unknown> | null = null;\n\n /** @internal True while the pointer hovers this toast. */\n _hovered = false;\n\n /** @internal True while focus is within this toast. */\n _focused = false;\n\n /** @internal Set by the service so the ref can reach the CDK-owned OverlayRef if it needs to. */\n _overlayPanelElement: HTMLElement | null = null;\n\n private readonly stateSignal = signal<ToastState>('entering');\n private readonly severitySignal: WritableSignal<ToastSeverity>;\n private readonly dismissibleSignal: WritableSignal<boolean>;\n private readonly iconSignal: WritableSignal<string | false | undefined>;\n private readonly contentSignal: WritableSignal<ToastContent>;\n private readonly actionSignal: WritableSignal<ToastAction | undefined>;\n private readonly ariaLabelSignal: WritableSignal<string | undefined>;\n private readonly dataSignal: WritableSignal<unknown>;\n\n private readonly afterOpenedSubject = new ReplaySubject<void>(1);\n private readonly beforeDismissedSubject = new ReplaySubject<R | undefined>(1);\n private readonly afterDismissedSubject = new ReplaySubject<ToastDismissal<R>>(1);\n private readonly updatedSubject = new Subject<ToastUpdatePatch>();\n\n private dismissReason: ToastDismissReason = 'programmatic';\n private dismissResult: R | undefined;\n private autoDismissTimer: ReturnType<typeof setTimeout> | null = null;\n private autoDismissStartedAt = 0;\n private autoDismissRemaining = 0;\n private paused = false;\n private enterTimer: ReturnType<typeof setTimeout> | null = null;\n private leaveTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n id: string,\n content: ToastContent,\n config: ToastConfig<unknown, R>,\n private readonly dismissCallback: (ref: ToastRef) => void,\n ) {\n this.id = id;\n this.config = config;\n this.severitySignal = signal(config.severity ?? 'info');\n this.dismissibleSignal = signal(config.dismissible ?? true);\n this.iconSignal = signal<string | false | undefined>(\n typeof config.icon === 'string' || config.icon === false ? config.icon : undefined,\n );\n this.contentSignal = signal(content);\n this.actionSignal = signal(config.action);\n this.ariaLabelSignal = signal(config.ariaLabel);\n this.dataSignal = signal(config.data ?? null);\n\n this.state = this.stateSignal.asReadonly();\n this.severity = this.severitySignal.asReadonly();\n this.dismissible = this.dismissibleSignal.asReadonly();\n this.icon = this.iconSignal.asReadonly();\n this.content = this.contentSignal.asReadonly();\n this.action = this.actionSignal.asReadonly();\n this.ariaLabel = this.ariaLabelSignal.asReadonly();\n this.data = this.dataSignal.asReadonly();\n\n this.autoDismissRemaining = config.duration ?? 0;\n\n this.enterTimer = setTimeout(\n () => this._markVisible(),\n TOAST_ANIMATION_DURATION + TOAST_ANIMATION_FALLBACK_PADDING,\n );\n }\n\n /**\n * Dismiss the toast programmatically. The leave animation plays before the\n * element is removed and subscribers are notified. Safe to call multiple times.\n */\n dismiss(result?: R): void {\n this._dismissWith('programmatic', result);\n }\n\n /** Pause the auto-dismiss timer (if any). Called automatically on hover / focus when `pauseOnInteraction` is true. */\n pause(): void {\n if (this.paused) return;\n this.paused = true;\n if (this.autoDismissTimer !== null) {\n const elapsed = Date.now() - this.autoDismissStartedAt;\n this.autoDismissRemaining = Math.max(0, this.autoDismissRemaining - elapsed);\n clearTimeout(this.autoDismissTimer);\n this.autoDismissTimer = null;\n }\n const current = this.stateSignal();\n if (current === 'visible') this.stateSignal.set('paused');\n }\n\n /** Resume the auto-dismiss timer with the remaining time. */\n resume(): void {\n if (!this.paused) return;\n this.paused = false;\n if (this.stateSignal() === 'paused') this.stateSignal.set('visible');\n if (this.config.duration && this.config.duration > 0) {\n if (this.autoDismissRemaining <= 0) {\n this._dismissWith('timeout');\n return;\n }\n this._startAutoDismissTimer();\n }\n }\n\n /**\n * @internal Update the hover state. When `pauseOnInteraction` is set and\n * either hover or focus is active, the auto-dismiss timer is paused.\n */\n _setHovered(hovered: boolean): void {\n this._hovered = hovered;\n this._syncInteractionPause();\n }\n\n /** @internal Update the focus-within state. See `_setHovered`. */\n _setFocused(focused: boolean): void {\n this._focused = focused;\n this._syncInteractionPause();\n }\n\n private _syncInteractionPause(): void {\n if (!this.config.pauseOnInteraction) return;\n if (this._hovered || this._focused) {\n this.pause();\n } else {\n this.resume();\n }\n }\n\n /** Invoke the configured action handler (or dismiss with reason `'action'` if none is set). */\n triggerAction(): void {\n const action = this.actionSignal();\n if (!action) return;\n if (action.handler) {\n action.handler(this as unknown as ToastRef);\n } else {\n this._dismissWith('action');\n }\n }\n\n /** Mutate the live toast in place. Used by the `promise()` helper to swap loading → success / error. */\n update(patch: ToastUpdatePatch): void {\n const currentState = this.stateSignal();\n if (currentState === 'dismissing' || currentState === 'dismissed') return;\n\n if (patch.severity !== undefined) this.severitySignal.set(patch.severity);\n if (patch.dismissible !== undefined) this.dismissibleSignal.set(patch.dismissible);\n if (patch.icon !== undefined) this.iconSignal.set(patch.icon);\n if (patch.content !== undefined) this.contentSignal.set(patch.content);\n if (patch.action !== undefined) this.actionSignal.set(patch.action ?? undefined);\n if (patch.ariaLabel !== undefined) this.ariaLabelSignal.set(patch.ariaLabel);\n if (patch.data !== undefined) this.dataSignal.set(patch.data);\n\n if (patch.duration !== undefined) {\n (this.config as { duration?: number }).duration = patch.duration;\n this.autoDismissRemaining = patch.duration;\n if (this.autoDismissTimer !== null) {\n clearTimeout(this.autoDismissTimer);\n this.autoDismissTimer = null;\n }\n if (!this.paused && (currentState === 'visible' || currentState === 'paused')) {\n this._startAutoDismissTimer();\n }\n }\n\n this.updatedSubject.next(patch);\n }\n\n /** Observable that emits once after the enter animation completes. */\n afterOpened(): Observable<void> {\n return this.afterOpenedSubject.asObservable();\n }\n\n /** Observable that emits once when the dismiss sequence starts. */\n beforeDismissed(): Observable<R | undefined> {\n return this.beforeDismissedSubject.asObservable();\n }\n\n /** Observable that emits once after the leave animation completes and the ref is cleaned up. */\n afterDismissed(): Observable<ToastDismissal<R>> {\n return this.afterDismissedSubject.asObservable();\n }\n\n /** @internal Observable of `update()` calls. The container subscribes to re-announce to `LiveAnnouncer`. */\n _updates(): Observable<ToastUpdatePatch> {\n return this.updatedSubject.asObservable();\n }\n\n /** @internal Called by the service when the max-visible cap is exceeded. */\n _dismissAsMaxExceeded(): void {\n this._dismissWith('max-exceeded');\n }\n\n /** @internal Start the dismiss sequence with the given reason. */\n _dismissWith(reason: ToastDismissReason, result?: R): void {\n const currentState = this.stateSignal();\n if (currentState === 'dismissing' || currentState === 'dismissed') return;\n\n this.dismissReason = reason;\n this.dismissResult = result;\n this.stateSignal.set('dismissing');\n\n if (this.autoDismissTimer !== null) {\n clearTimeout(this.autoDismissTimer);\n this.autoDismissTimer = null;\n }\n if (this.enterTimer !== null) {\n clearTimeout(this.enterTimer);\n this.enterTimer = null;\n }\n\n this.beforeDismissedSubject.next(result);\n this.beforeDismissedSubject.complete();\n\n this.leaveTimer = setTimeout(\n () => this._finishDismiss(),\n TOAST_ANIMATION_DURATION + TOAST_ANIMATION_FALLBACK_PADDING,\n );\n }\n\n /** @internal Finalise dismissal — clears timers, emits `afterDismissed`, and hands control back to the service. */\n _finishDismiss(): void {\n if (this.stateSignal() === 'dismissed') return;\n this.stateSignal.set('dismissed');\n\n if (this.leaveTimer !== null) {\n clearTimeout(this.leaveTimer);\n this.leaveTimer = null;\n }\n\n const dismissal: ToastDismissal<R> = {\n reason: this.dismissReason,\n result: this.dismissResult,\n };\n this.afterDismissedSubject.next(dismissal);\n this.afterDismissedSubject.complete();\n this.updatedSubject.complete();\n\n this.dismissCallback(this as unknown as ToastRef);\n }\n\n private _markVisible(): void {\n if (this.enterTimer !== null) {\n clearTimeout(this.enterTimer);\n this.enterTimer = null;\n }\n const current = this.stateSignal();\n if (current !== 'entering') return;\n this.stateSignal.set('visible');\n this.afterOpenedSubject.next();\n this.afterOpenedSubject.complete();\n if (this.config.duration && this.config.duration > 0 && !this.paused) {\n this._startAutoDismissTimer();\n }\n }\n\n private _startAutoDismissTimer(): void {\n if (this.autoDismissRemaining <= 0) return;\n if (this.autoDismissTimer !== null) clearTimeout(this.autoDismissTimer);\n this.autoDismissStartedAt = Date.now();\n this.autoDismissTimer = setTimeout(\n () => this._dismissWith('timeout'),\n this.autoDismissRemaining,\n );\n }\n}\n","import {\n type ComponentRef,\n type EnvironmentProviders,\n Injectable,\n Injector,\n type OnDestroy,\n type Provider,\n type Signal,\n TemplateRef,\n type Type,\n computed,\n inject,\n makeEnvironmentProviders,\n signal,\n} from '@angular/core';\nimport {\n createGlobalPositionStrategy,\n Overlay,\n type OverlayRef,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { type Observable, Subject, defer, startWith } from 'rxjs';\nimport {\n TW_TOAST_DATA,\n TW_TOAST_DEFAULT_OPTIONS,\n TW_TOAST_REF,\n ToastConfig,\n type ToastContent,\n type ToastPosition,\n type ToastSeverity,\n type ToastTemplateContext,\n} from './toast-config';\nimport { ToastContainerComponent } from './toast-container';\nimport { ToastRef } from './toast-ref';\n\nconst OVERLAY_EDGE_OFFSET = '1rem';\n\ninterface PositionOverlay {\n overlayRef: OverlayRef;\n containerRef: ComponentRef<ToastContainerComponent>;\n}\n\ninterface PromiseMessages<T> {\n loading: string;\n success: string | ((value: T) => string);\n error: string | ((err: unknown) => string);\n}\n\nlet nextToastId = 0;\n\nfunction generateId(): string {\n return `tw-toast-${++nextToastId}`;\n}\n\n/**\n * Opens Tailwind-styled toasts / snackbars inside CDK overlays. One overlay is\n * created per `ToastPosition` on first use and reused for the lifetime of the\n * service; toasts stack vertically inside their position container.\n *\n * Not `providedIn: 'root'` — register via {@link provideToast}.\n */\n@Injectable()\nexport class ToastService implements OnDestroy {\n private readonly overlay = inject(Overlay);\n private readonly injector = inject(Injector);\n private readonly defaultOptions =\n inject(TW_TOAST_DEFAULT_OPTIONS, { optional: true }) ?? {};\n private readonly parent = inject(ToastService, { optional: true, skipSelf: true });\n\n private readonly positionOverlays = new Map<ToastPosition, PositionOverlay>();\n private readonly activeRefsAtThisLevel = signal<readonly ToastRef[]>([]);\n private readonly afterOpenedSubject = new Subject<ToastRef>();\n private readonly afterAllDismissedSubject = new Subject<void>();\n\n /** Reactive list of every toast that has not yet fully dismissed. */\n readonly activeToasts: Signal<readonly ToastRef[]> = this.parent\n ? this.parent.activeToasts\n : this.activeRefsAtThisLevel.asReadonly();\n\n /** Emits every time a new toast is opened. */\n readonly afterOpened: Observable<ToastRef> = this.parent\n ? this.parent.afterOpened\n : this.afterOpenedSubject.asObservable();\n\n /** Emits when the active-toasts list transitions back to empty. Emits immediately on subscribe if none are open. */\n readonly afterAllDismissed: Observable<void> = defer(() =>\n this.activeToasts().length\n ? this.getAfterAllDismissedSource()\n : this.getAfterAllDismissedSource().pipe(startWith(undefined as void)),\n );\n\n /**\n * Open a toast. Content may be a string (rendered inside the default\n * `ToastComponent`), a `TemplateRef` (rendered via `TemplatePortal`), or a\n * component class (rendered via `ComponentPortal` with `TW_TOAST_REF` +\n * `TW_TOAST_DATA` injected).\n */\n show<R = void, D = unknown>(\n content: ToastContent,\n config?: ToastConfig<D, R>,\n ): ToastRef<unknown, R> {\n const merged = this.resolveConfig<D, R>(config);\n return this.openInternal<R>(content, merged);\n }\n\n /** Shorthand for `show(message, { severity: 'success', ... })`. */\n success<R = void>(message: string, config?: ToastConfig<unknown, R>): ToastRef<unknown, R> {\n return this.openWithSeverity('success', message, config);\n }\n\n /** Shorthand for `show(message, { severity: 'error', politeness: 'assertive', ... })`. */\n error<R = void>(message: string, config?: ToastConfig<unknown, R>): ToastRef<unknown, R> {\n return this.openWithSeverity('error', message, config, 'assertive');\n }\n\n /** Shorthand for `show(message, { severity: 'warning', ... })`. */\n warning<R = void>(message: string, config?: ToastConfig<unknown, R>): ToastRef<unknown, R> {\n return this.openWithSeverity('warning', message, config);\n }\n\n /** Shorthand for `show(message, { severity: 'info', ... })`. */\n info<R = void>(message: string, config?: ToastConfig<unknown, R>): ToastRef<unknown, R> {\n return this.openWithSeverity('info', message, config);\n }\n\n /**\n * Show a loading toast, then swap it to success / error when the promise\n * settles. The same ref is returned and re-used across all three states.\n * The loading toast is pinned (duration forced to 0, dismissible forced to\n * false) until the promise resolves.\n */\n promise<T, R = void>(\n promise: Promise<T>,\n messages: PromiseMessages<T>,\n config?: ToastConfig<unknown, R>,\n ): ToastRef<unknown, R> {\n const resolvedDuration = config?.duration ?? this.defaultOptions.duration ?? 5000;\n const ref = this.show<R>(messages.loading, {\n ...(config as ToastConfig<unknown, R>),\n severity: 'neutral',\n duration: 0,\n dismissible: false,\n });\n\n promise.then(\n (value) => {\n if (ref.state() === 'dismissed' || ref.state() === 'dismissing') return;\n const msg = typeof messages.success === 'function' ? messages.success(value) : messages.success;\n ref.update({\n severity: 'success',\n content: msg,\n duration: resolvedDuration,\n dismissible: config?.dismissible ?? true,\n });\n this.announceUpdate(ref);\n },\n (err) => {\n if (ref.state() === 'dismissed' || ref.state() === 'dismissing') return;\n const msg = typeof messages.error === 'function' ? messages.error(err) : messages.error;\n ref.update({\n severity: 'error',\n content: msg,\n duration: resolvedDuration,\n dismissible: config?.dismissible ?? true,\n });\n this.announceUpdate(ref);\n },\n );\n\n return ref;\n }\n\n /** Dismiss a toast by id. No-op if no matching toast is active. */\n dismiss(id: string): void {\n const match = this.activeToasts().find((ref) => ref.id === id);\n if (match) match.dismiss();\n }\n\n /** Dismiss every active toast across every position. */\n dismissAll(): void {\n const refs = [...this.activeToasts()];\n for (let i = refs.length - 1; i >= 0; i--) refs[i].dismiss();\n }\n\n /** Look up an active toast by id. */\n getToastById<R = unknown>(id: string): ToastRef<unknown, R> | undefined {\n return this.activeToasts().find((ref) => ref.id === id) as\n | ToastRef<unknown, R>\n | undefined;\n }\n\n ngOnDestroy(): void {\n const refs = [...this.activeRefsAtThisLevel()];\n for (let i = refs.length - 1; i >= 0; i--) refs[i]._finishDismiss();\n for (const { overlayRef } of this.positionOverlays.values()) {\n overlayRef.dispose();\n }\n this.positionOverlays.clear();\n this.afterOpenedSubject.complete();\n this.afterAllDismissedSubject.complete();\n }\n\n private openWithSeverity<R>(\n severity: ToastSeverity,\n message: string,\n config?: ToastConfig<unknown, R>,\n forcedPoliteness?: 'polite' | 'assertive' | 'off',\n ): ToastRef<unknown, R> {\n const merged = this.resolveConfig<unknown, R>(config);\n merged.severity = severity;\n if (forcedPoliteness && !config?.politeness) merged.politeness = forcedPoliteness;\n return this.openInternal<R>(message, merged);\n }\n\n private openInternal<R>(\n content: ToastContent,\n config: ToastConfig<unknown, R>,\n ): ToastRef<unknown, R> {\n const id = config.id ?? generateId();\n config.id = id;\n\n const ref = new ToastRef<unknown, R>(id, content, config, (dismissed) =>\n this.handleDismissed(dismissed),\n );\n\n if (isComponentConstructor(content)) {\n const injector = this.getContainerForPosition(\n config.position!,\n ).containerRef.instance._createContentInjector(ref as ToastRef<unknown, unknown>);\n ref._portal = new ComponentPortal(content, null, injector);\n }\n\n this.enforceMaxVisible(config.position!, config.maxVisible ?? 5);\n this.registerOpen(ref);\n this.attachToContainer(ref, config.position!);\n this.announceOpen(ref);\n return ref;\n }\n\n private enforceMaxVisible(position: ToastPosition, max: number): void {\n if (max <= 0) return;\n const atPosition = this.activeToasts().filter(\n (ref) =>\n (ref.config.position ?? 'bottom-right') === position &&\n ref.state() !== 'dismissing' &&\n ref.state() !== 'dismissed',\n );\n while (atPosition.length >= max) {\n const oldest = atPosition.shift();\n if (!oldest) break;\n oldest._dismissAsMaxExceeded();\n }\n }\n\n private registerOpen<R>(ref: ToastRef<unknown, R>): void {\n const scope = this.parent ?? this;\n const anyRef = ref as ToastRef<unknown, unknown>;\n scope.activeRefsAtThisLevel.update((list) => [...list, anyRef]);\n scope.afterOpenedSubject.next(anyRef);\n }\n\n private handleDismissed(ref: ToastRef): void {\n const scope = this.parent ?? this;\n scope.activeRefsAtThisLevel.update((list) => list.filter((r) => r !== ref));\n\n const position = ref.config.position ?? 'bottom-right';\n const entry = this.positionOverlays.get(position);\n if (entry) {\n const instance = entry.containerRef.instance;\n instance.visibleRefs.update((list) => list.filter((r) => r !== ref));\n }\n\n if (scope.activeRefsAtThisLevel().length === 0) {\n scope.afterAllDismissedSubject.next();\n }\n }\n\n private attachToContainer<R>(ref: ToastRef<unknown, R>, position: ToastPosition): void {\n const entry = this.getContainerForPosition(position);\n const instance = entry.containerRef.instance;\n const anyRef = ref as ToastRef<unknown, unknown>;\n instance.visibleRefs.update((list) => [...list, anyRef]);\n ref._overlayPanelElement = entry.overlayRef.overlayElement;\n }\n\n private announceOpen<R>(ref: ToastRef<unknown, R>): void {\n const entry = this.positionOverlays.get(ref.config.position ?? 'bottom-right');\n entry?.containerRef.instance._announceOpen(ref as ToastRef<unknown, unknown>);\n }\n\n private announceUpdate<R>(ref: ToastRef<unknown, R>): void {\n const entry = this.positionOverlays.get(ref.config.position ?? 'bottom-right');\n entry?.containerRef.instance._announceUpdate(ref as ToastRef<unknown, unknown>);\n }\n\n private getContainerForPosition(position: ToastPosition): PositionOverlay {\n const existing = this.positionOverlays.get(position);\n if (existing) return existing;\n\n const overlayRef = this.overlay.create({\n positionStrategy: this.buildPositionStrategy(position),\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n hasBackdrop: false,\n panelClass: ['tw-toast-overlay', `tw-toast-overlay-${position}`],\n });\n\n const containerPortal = new ComponentPortal(ToastContainerComponent, null, this.injector);\n const containerRef = overlayRef.attach(containerPortal);\n containerRef.instance.position.set(position);\n containerRef.instance.regionLabel.set(\n this.defaultOptions.regionAriaLabel ?? 'Notifications',\n );\n\n const entry: PositionOverlay = { overlayRef, containerRef };\n this.positionOverlays.set(position, entry);\n return entry;\n }\n\n private buildPositionStrategy(position: ToastPosition) {\n const strategy = createGlobalPositionStrategy(this.injector);\n switch (position) {\n case 'top-right':\n strategy.top(OVERLAY_EDGE_OFFSET).right(OVERLAY_EDGE_OFFSET);\n break;\n case 'top-left':\n strategy.top(OVERLAY_EDGE_OFFSET).left(OVERLAY_EDGE_OFFSET);\n break;\n case 'top-center':\n strategy.top(OVERLAY_EDGE_OFFSET).centerHorizontally();\n break;\n case 'bottom-right':\n strategy.bottom(OVERLAY_EDGE_OFFSET).right(OVERLAY_EDGE_OFFSET);\n break;\n case 'bottom-left':\n strategy.bottom(OVERLAY_EDGE_OFFSET).left(OVERLAY_EDGE_OFFSET);\n break;\n case 'bottom-center':\n strategy.bottom(OVERLAY_EDGE_OFFSET).centerHorizontally();\n break;\n }\n return strategy;\n }\n\n private resolveConfig<D, R>(config: ToastConfig<D, R> | undefined): ToastConfig<D, R> {\n const merged = new ToastConfig<D, R>();\n Object.assign(merged, this.defaultOptions, config);\n return merged;\n }\n\n private getAfterAllDismissedSource(): Subject<void> {\n return this.parent ? this.parent.getAfterAllDismissedSource() : this.afterAllDismissedSubject;\n }\n}\n\nfunction isComponentConstructor(value: unknown): value is Type<unknown> {\n return typeof value === 'function' && !(value instanceof TemplateRef);\n}\n\n/**\n * Registers {@link ToastService} for dependency injection and installs optional\n * application-wide defaults.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideToast({ position: 'top-right', duration: 4000 })]\n * });\n * ```\n */\nexport function provideToast(\n defaultOptions?: Partial<ToastConfig>,\n): EnvironmentProviders {\n const providers: Provider[] = [ToastService];\n if (defaultOptions) {\n providers.push({ provide: TW_TOAST_DEFAULT_OPTIONS, useValue: defaultOptions });\n }\n return makeEnvironmentProviders(providers);\n}\n\n/** Re-exported helpers so `inject(TW_TOAST_DATA)` / `inject(TW_TOAST_REF)` work from component content. */\nexport { TW_TOAST_DATA, TW_TOAST_REF };\n\n// Re-exports to keep the barrel tidy.\nexport type { ToastContent, ToastTemplateContext };\n\nexport const ToastInternals = {\n /** @internal Reset id counter for tests. */\n _resetIdForTesting(): void {\n nextToastId = 0;\n },\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-tw-toast.mjs","sources":["../../../projects/ngx-tw/toast/toast-config.ts","../../../projects/ngx-tw/toast/toast-component.ts","../../../projects/ngx-tw/toast/toast-container.ts","../../../projects/ngx-tw/toast/toast-ref.ts","../../../projects/ngx-tw/toast/toast.ts","../../../projects/ngx-tw/toast/cdevhub-ngx-tw-toast.ts"],"sourcesContent":["import { InjectionToken, type TemplateRef, type Type } from '@angular/core';\nimport type { ToastRef } from './toast-ref';\n\n/** Severity variant — drives color palette, default icon, and live-region politeness. */\nexport type ToastSeverity = 'info' | 'success' | 'warning' | 'error' | 'neutral';\n\n/** Screen anchor for a stack of toasts. One CDK overlay is created per position on first use. */\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\n/** Lifecycle state of a single toast. */\nexport type ToastState = 'entering' | 'visible' | 'paused' | 'dismissing' | 'dismissed';\n\n/** Reason a toast was dismissed. */\nexport type ToastDismissReason =\n | 'action'\n | 'timeout'\n | 'swipe'\n | 'manual'\n | 'programmatic'\n | 'max-exceeded';\n\n/** Payload forwarded to `afterDismissed()` subscribers. */\nexport interface ToastDismissal<R = unknown> {\n /** Why the toast closed. */\n reason: ToastDismissReason;\n /** Optional value forwarded from `ref.dismiss(result)`. */\n result?: R;\n}\n\n/** Context object handed to `TemplateRef` content (`let-data let-ref=\"ref\"`). */\nexport interface ToastTemplateContext<T = unknown> {\n /** Data value from `config.data`, unwrapped as the template's `$implicit`. */\n $implicit: T;\n /** Reference to the toast itself, bound as `let-ref=\"ref\"`. */\n ref: ToastRef<unknown, unknown>;\n}\n\n/** Action button configuration. When `handler` is omitted the button dismisses the toast with reason `'action'`. */\nexport interface ToastAction {\n /** Visible label of the action button. */\n label: string;\n /** Optional callback invoked when the action is clicked or `ref.triggerAction()` is called. */\n handler?: (ref: ToastRef) => void;\n}\n\n/**\n * Per-call configuration for {@link ToastService} methods. Also used as the\n * payload of {@link TW_TOAST_DEFAULT_OPTIONS} for app-wide defaults.\n */\n// `R` is a phantom result-type kept for parity with `ToastRef<D, R>` / service\n// generics — consumers pass it through `ToastConfig<D, R>` so the resulting\n// `ToastRef.afterClosed()` is correctly typed.\nexport class ToastConfig<D = unknown, _R = unknown> {\n /** Severity of the toast. Defaults to `'info'`. */\n severity?: ToastSeverity = 'info';\n\n /** Screen position of the toast stack. Defaults to `'bottom-right'`. */\n position?: ToastPosition = 'bottom-right';\n\n /** Auto-dismiss duration in ms. `0` disables auto-dismiss. Defaults to `5000`. */\n duration?: number = 5000;\n\n // Default true: toasts must offer an escape hatch — sticky / long-duration toasts\n // otherwise trap users; opt-out only for ephemeral progress markers paired with `duration`.\n /** When true, renders a close (×) button. Defaults to `true`. */\n dismissible?: boolean = true;\n\n /**\n * Live-region politeness. When omitted, resolves to `'assertive'` for\n * `severity: 'error'` and `'polite'` otherwise. Pass `'off'` to skip\n * `LiveAnnouncer` entirely.\n */\n politeness?: 'polite' | 'assertive' | 'off';\n\n /** Action button configuration. Omit to hide the action button. */\n action?: ToastAction;\n\n /** Arbitrary data provided to component / template content via `TW_TOAST_DATA`. */\n data?: D | null = null;\n\n /** Extra CSS classes merged onto the toast panel root via `twMerge`. */\n panelClass?: string | string[];\n\n /**\n * Icon override. Pass a string (treated as text glyph / icon name) or\n * `false` to hide the icon. When omitted the severity-default icon is used.\n *\n * Note: To render arbitrary icon markup, pass a `TemplateRef` to `show()`\n * itself (the whole toast is a custom template) — the icon slot accepts only\n * primitives for the string-content path.\n */\n icon?: string | false;\n\n // Default true: matches Material/Radix/Sonner conventions — prevents a toast from\n // disappearing mid-read; opt-out only for fully ambient progress indicators.\n /** When true, pause the auto-dismiss timer while the toast is hovered or holds focus. Defaults to `true`. */\n pauseOnInteraction?: boolean = true;\n\n // Default true: matches mobile-platform expectations and gives non-precise pointers\n // (touch) an easy dismiss gesture; opt-out only if the gesture conflicts with content.\n /** Enable horizontal swipe-to-dismiss via pointer gestures. Defaults to `true`. */\n swipeToDismiss?: boolean = true;\n\n /**\n * Maximum visible toasts *per position*. When exceeded, the oldest toast in\n * that position dismisses with reason `'max-exceeded'`. Defaults to `5`.\n */\n maxVisible?: number = 5;\n\n /** Explicit id. When omitted a unique id is generated. */\n id?: string;\n\n /** Accessible label applied to the toast element. When omitted, text content is used. */\n ariaLabel?: string;\n\n /** Accessible label applied to the per-position `role=\"region\"` container. Defaults to `'Notifications'`. */\n regionAriaLabel?: string;\n}\n\n/** Injection token providing `config.data` to projected component / template content. */\nexport const TW_TOAST_DATA = new InjectionToken<unknown>('TW_TOAST_DATA');\n\n/** Injection token providing the owning {@link ToastRef} to projected component content. */\nexport const TW_TOAST_REF = new InjectionToken<ToastRef>('TW_TOAST_REF');\n\n/** Injection token carrying application-wide toast defaults. Set via `provideToast(defaults)`. */\nexport const TW_TOAST_DEFAULT_OPTIONS = new InjectionToken<Partial<ToastConfig>>(\n 'TW_TOAST_DEFAULT_OPTIONS',\n);\n\n/** Accepted content forms for `ToastService.show()`. */\nexport type ToastContent = string | TemplateRef<ToastTemplateContext> | Type<unknown>;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { ToastSeverity } from './toast-config';\n\nconst toastVariants = tv(\n {\n slots: {\n root:\n 'pointer-events-auto relative flex items-start gap-3 w-full max-w-sm p-4 rounded-lg border shadow-md text-sm will-change-transform transition-colors duration-normal motion-reduce:transition-none',\n icon: 'size-5 shrink-0 mt-0.5',\n title: 'text-sm font-semibold',\n description: 'text-sm',\n content: 'flex-1 min-w-0',\n action:\n 'inline-flex items-center justify-center px-3 py-1.5 rounded-md text-sm font-medium cursor-pointer transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n // Dismiss container is `size-6` (24px — xs square-interactive-target\n // scale per CLAUDE.md icon sub-scale). The inner SVG is `size-4` (16px\n // glyph scale), centred via flex; the larger container gives the\n // touch/click affordance without enlarging the visual glyph.\n dismiss:\n 'absolute top-3 right-3 inline-flex items-center justify-center size-6 rounded-md cursor-pointer transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n },\n variants: {\n severity: {\n info: {},\n success: {},\n warning: {},\n error: {},\n neutral: {},\n },\n },\n // Color slot tokens (`{role}-soft`, `-soft-fg`, `-icon`, …) own light/dark\n // contrast — components consume the slot only. See `_semantic.css`.\n // Slot-token safelist: see `projects/ngx-tw/theme/index.css` `@source inline(...)`\n // — Tailwind v4's JIT cannot scan template-literal class names, so every\n // `bg-${severity}-soft` / `text-${severity}-icon` permutation below must be\n // enumerated there.\n compoundVariants: (['info', 'success', 'warning', 'error', 'neutral'] as const).map(\n (severity) => ({\n severity,\n class: {\n root: `bg-${severity}-soft text-${severity}-soft-fg-muted border-${severity}-border`,\n icon: `text-${severity}-icon`,\n title: `text-${severity}-soft-fg`,\n description: `text-${severity}-soft-fg-muted`,\n action: `text-${severity}-soft-fg hover:bg-${severity}-soft-hover`,\n dismiss: `text-${severity}-icon hover:bg-${severity}-soft-hover`,\n },\n }),\n ),\n defaultVariants: {\n severity: 'info',\n },\n },\n { twMerge: true },\n);\n\n/** Slot directive for the icon. When projected, overrides the severity-default icon. */\n@Directive({\n selector: '[twToastIcon]',\n host: {\n '[class]': 'classes()',\n 'aria-hidden': 'true',\n },\n})\nexport class ToastIconDirective {\n private readonly toast = inject(ToastComponent);\n /** @internal */\n readonly classes = this.toast.iconClasses;\n}\n\n/** Slot directive for the bold title line inside a toast. */\n@Directive({\n selector: '[twToastTitle]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class ToastTitleDirective {\n private readonly toast = inject(ToastComponent);\n /** @internal */\n readonly classes = this.toast.titleClasses;\n}\n\n/** Slot directive for a secondary description line inside a toast. */\n@Directive({\n selector: '[twToastDescription]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class ToastDescriptionDirective {\n private readonly toast = inject(ToastComponent);\n /** @internal */\n readonly classes = this.toast.descriptionClasses;\n}\n\n/** Slot directive for the action button. Apply to a native `<button>` to inherit the severity-aware styling. */\n@Directive({\n selector: '[twToastAction]',\n host: {\n type: 'button',\n '[class]': 'classes()',\n '(click)': 'onClick()',\n },\n})\nexport class ToastActionDirective {\n private readonly toast = inject(ToastComponent);\n /** @internal */\n readonly classes = this.toast.actionClasses;\n /** @internal */\n protected onClick(): void {\n this.toast.actionClicked.emit();\n }\n}\n\n/**\n * Visual toast / snackbar panel. Rendered internally by {@link ToastService} for\n * string content, and exported for consumers who want to compose the same\n * visual inside a custom `TemplateRef` or component class passed to `show()`.\n */\n@Component({\n selector: 'tw-toast',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n '[attr.role]': 'roleAttr()',\n '[attr.aria-live]': 'ariaLiveAttr()',\n 'aria-atomic': 'true',\n '[attr.aria-label]': 'ariaLabel() || null',\n '[attr.data-severity]': 'severity()',\n },\n template: `\n @if (hasProjectedIcon()) {\n <ng-content select=\"[twToastIcon]\" />\n } @else if (icon() !== false) {\n <span [class]=\"iconClasses()\" aria-hidden=\"true\">\n @switch (severity()) {\n @case ('info') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"size-full\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm0-11a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm-.75 2.5a.75.75 0 0 0 0 1.5h.25v3h-.25a.75.75 0 0 0 0 1.5h2a.75.75 0 0 0 0-1.5h-.25v-3.75a.75.75 0 0 0-.75-.75h-1Z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n @case ('success') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"size-full\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm3.857-9.809a.75.75 0 0 0-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 1 0-1.06 1.061l2.5 2.5a.75.75 0 0 0 1.137-.089l4-5.5Z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n @case ('warning') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"size-full\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495ZM10 5a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 10 5Zm0 9a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n @case ('error') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"size-full\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-8-5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 10 5Zm0 10a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n @default {\n @if (icon() && icon() !== false) {\n {{ icon() }}\n }\n }\n }\n </span>\n }\n <div [class]=\"contentClasses()\">\n <ng-content select=\"[twToastTitle]\" />\n <ng-content select=\"[twToastDescription]\" />\n <ng-content />\n <ng-content select=\"[twToastAction]\" />\n </div>\n @if (dismissible()) {\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n [class]=\"dismissClasses()\"\n (click)=\"dismissed.emit()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" class=\"size-4\">\n <path d=\"M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z\"/>\n </svg>\n </button>\n }\n `,\n})\nexport class ToastComponent {\n /** Severity variant. Drives color palette, default icon, and ARIA role / live politeness. Defaults to `'info'`. */\n readonly severity = input<ToastSeverity>('info');\n\n // Default true: mirrors `ToastConfig.dismissible` — toasts must offer an escape\n // hatch by default; opt-out only for ephemeral progress markers paired with `duration`.\n /** Whether to render the close button. Defaults to `true`. */\n readonly dismissible = input<boolean>(true);\n\n /**\n * Icon override. Pass a string to render as text inside the icon slot, or\n * `false` to hide the built-in severity icon. Ignored when a `[twToastIcon]`\n * child is projected. When omitted, the severity-default icon renders.\n *\n * For arbitrary icon markup, project a `[twToastIcon]` child instead.\n */\n readonly icon = input<string | false | undefined>(undefined);\n\n /** Explicit aria-label for the toast wrapper. When omitted, text content is used by assistive tech. */\n readonly ariaLabel = input<string | undefined>(undefined);\n\n /** Fires when the close button is clicked. */\n readonly dismissed = output<void>();\n\n /** Fires when a `[twToastAction]` button is clicked. */\n readonly actionClicked = output<void>();\n\n /** @internal */\n readonly projectedIcon = contentChild(ToastIconDirective);\n\n /** @internal */\n readonly hasProjectedIcon = computed(() => !!this.projectedIcon());\n\n private readonly variantResult = computed(() => toastVariants({ severity: this.severity() }));\n\n /** @internal */\n readonly rootClasses = computed(() => {\n const base = this.variantResult().root();\n return this.dismissible() ? `${base} pr-10` : base;\n });\n\n /** @internal */\n readonly iconClasses = computed(() => this.variantResult().icon());\n /** @internal */\n readonly titleClasses = computed(() => this.variantResult().title());\n /** @internal */\n readonly descriptionClasses = computed(() => this.variantResult().description());\n /** @internal */\n readonly contentClasses = computed(() => this.variantResult().content());\n /** @internal */\n readonly actionClasses = computed(() => this.variantResult().action());\n /** @internal */\n readonly dismissClasses = computed(() => this.variantResult().dismiss());\n\n /** @internal */\n protected readonly roleAttr = computed(() =>\n this.severity() === 'error' ? 'alert' : 'status',\n );\n\n /** @internal */\n protected readonly ariaLiveAttr = computed(() =>\n this.severity() === 'error' ? 'assertive' : 'polite',\n );\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n type ComponentRef,\n Component,\n computed,\n ElementRef,\n Injector,\n TemplateRef,\n ViewEncapsulation,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport {\n CdkPortalOutlet,\n type CdkPortalOutletAttachedRef,\n} from '@angular/cdk/portal';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { ToastActionDirective, ToastComponent } from './toast-component';\nimport {\n TW_TOAST_DATA,\n TW_TOAST_REF,\n type ToastPosition,\n type ToastTemplateContext,\n} from './toast-config';\nimport type { ToastRef } from './toast-ref';\n\ntype ToastKind = 'string' | 'template' | 'component';\n\ninterface Entry {\n ref: ToastRef;\n kind: ToastKind;\n enterClass: string;\n leaveClass: string;\n}\n\nconst POSITION_AXIS: Record<ToastPosition, 'right' | 'left' | 'top' | 'bottom'> = {\n 'top-right': 'right',\n 'bottom-right': 'right',\n 'top-left': 'left',\n 'bottom-left': 'left',\n 'top-center': 'top',\n 'bottom-center': 'bottom',\n};\n\nconst POSITION_HOST_CLASSES: Record<ToastPosition, string> = {\n 'top-right': 'items-end',\n 'bottom-right': 'items-end',\n 'top-left': 'items-start',\n 'bottom-left': 'items-start',\n 'top-center': 'items-center',\n 'bottom-center': 'items-center',\n};\n\nconst POSITION_ORDER_REVERSED: Record<ToastPosition, boolean> = {\n 'top-right': false,\n 'top-left': false,\n 'top-center': false,\n 'bottom-right': true,\n 'bottom-left': true,\n 'bottom-center': true,\n};\n\nconst SWIPE_DISMISS_FRACTION = 0.4;\nconst SWIPE_MAX_OPACITY_FADE = 0.6;\n\n/**\n * Internal flex-column host rendered inside each per-position CDK overlay.\n * Stacks visible toasts via `@for`, wires pause-on-interaction, Escape\n * dismissal, swipe gestures, and `LiveAnnouncer` announcements.\n *\n * @docs-private\n */\n@Component({\n selector: 'tw-toast-container',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [NgTemplateOutlet, CdkPortalOutlet, ToastComponent, ToastActionDirective],\n host: {\n role: 'region',\n '[class]': 'hostClasses()',\n '[attr.aria-label]': 'regionLabel()',\n '[attr.data-position]': 'position()',\n },\n template: `\n @for (entry of orderedEntries(); track entry.ref.id) {\n <!-- Toast entry wrapper; the projected <tw-toast> is the focusable affordance.\n This element only forwards pointer/focus events so the container can\n pause auto-dismiss while the user is interacting. -->\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"pointer-events-auto w-full max-w-sm\"\n [attr.data-toast-id]=\"entry.ref.id\"\n [style.transform]=\"entry.ref.swipeTransform() || null\"\n [style.opacity]=\"entry.ref.swipeOpacity() ?? null\"\n [style.touch-action]=\"'pan-y'\"\n [animate.enter]=\"entry.enterClass\"\n [animate.leave]=\"entry.ref.leaveAnimationOverride() ?? entry.leaveClass\"\n (pointerenter)=\"onPointerEnter(entry.ref)\"\n (pointerleave)=\"onPointerLeave(entry.ref)\"\n (focusin)=\"onFocusIn(entry.ref)\"\n (focusout)=\"onFocusOut(entry.ref, $event)\"\n (keydown.escape)=\"onEscape(entry.ref, $event)\"\n (pointerdown)=\"onSwipeStart(entry.ref, $event, swipeEl)\"\n #swipeEl\n >\n @switch (entry.kind) {\n @case ('string') {\n <tw-toast\n [severity]=\"entry.ref.severity()\"\n [dismissible]=\"entry.ref.dismissible()\"\n [icon]=\"entry.ref.icon()\"\n [ariaLabel]=\"entry.ref.ariaLabel()\"\n [class]=\"panelClassFor(entry.ref)\"\n (dismissed)=\"entry.ref._dismissWith('manual')\"\n (actionClicked)=\"entry.ref.triggerAction()\"\n >\n {{ asString(entry.ref.content()) }}\n @if (entry.ref.action(); as action) {\n <button twToastAction>{{ action.label }}</button>\n }\n </tw-toast>\n }\n @case ('template') {\n <tw-toast\n [severity]=\"entry.ref.severity()\"\n [dismissible]=\"entry.ref.dismissible()\"\n [icon]=\"entry.ref.icon()\"\n [ariaLabel]=\"entry.ref.ariaLabel()\"\n [class]=\"panelClassFor(entry.ref)\"\n (dismissed)=\"entry.ref._dismissWith('manual')\"\n (actionClicked)=\"entry.ref.triggerAction()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"asTemplate(entry.ref.content())\"\n [ngTemplateOutletContext]=\"templateContext(entry.ref)\"\n />\n @if (entry.ref.action(); as action) {\n <button twToastAction>{{ action.label }}</button>\n }\n </tw-toast>\n }\n @case ('component') {\n <ng-template\n [cdkPortalOutlet]=\"entry.ref._portal\"\n (attached)=\"onPortalAttached(entry.ref, $event)\"\n />\n }\n }\n </div>\n }\n `,\n})\nexport class ToastContainerComponent {\n /** Per-position stacking anchor. Mutated from {@link ToastService} via `.instance.position.set(...)`. */\n readonly position = signal<ToastPosition>('bottom-right');\n\n /** Accessible label applied to the `role=\"region\"` host. Mutated from the service on init. */\n readonly regionLabel = signal<string>('Notifications');\n\n /**\n * Toasts currently assigned to this container. The service pushes toasts\n * into this signal; the container filters by state to drive `animate.leave`.\n */\n readonly visibleRefs = signal<readonly ToastRef[]>([]);\n\n private readonly injector = inject(Injector);\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n private readonly host = inject(ElementRef<HTMLElement>);\n\n private readonly swipeSessions = new WeakMap<\n ToastRef,\n { pointerId: number; startX: number; width: number; active: boolean }\n >();\n\n private readonly entries = computed<readonly Entry[]>(() => {\n const pos = this.position();\n const axis = POSITION_AXIS[pos];\n const enter = `toast-enter-${axis}`;\n const leave = `toast-leave-${axis}`;\n const refs = this.visibleRefs().filter((ref) => {\n const s = ref.state();\n return s === 'entering' || s === 'visible' || s === 'paused';\n });\n return refs.map((ref) => ({\n ref,\n kind: resolveKind(ref.content()),\n enterClass: enter,\n leaveClass: leave,\n }));\n });\n\n protected readonly orderedEntries = computed(() => {\n const list = this.entries();\n return POSITION_ORDER_REVERSED[this.position()] ? [...list].reverse() : list;\n });\n\n protected readonly hostClasses = computed(() => {\n const base = 'flex flex-col gap-2 w-full max-w-sm';\n const align = POSITION_HOST_CLASSES[this.position()];\n return `${base} ${align}`;\n });\n\n /** @internal Called by the service right after attaching a new toast. Runs `LiveAnnouncer`. */\n _announceOpen(ref: ToastRef): void {\n const politeness = this.resolvePoliteness(ref);\n if (politeness === 'off') return;\n const msg = this.resolveAnnouncementText(ref);\n if (msg) this.liveAnnouncer.announce(msg, politeness);\n }\n\n /** @internal Called by the service when `ref.update()` fires — re-announces with the new severity / content. */\n _announceUpdate(ref: ToastRef): void {\n this._announceOpen(ref);\n }\n\n /** @internal Captures the component instance after `cdkPortalOutlet` attaches. */\n protected onPortalAttached(ref: ToastRef, attached: CdkPortalOutletAttachedRef): void {\n if (attached && 'instance' in attached) {\n ref.componentInstance = (attached as ComponentRef<unknown>).instance;\n }\n }\n\n /** @internal Injector factory for component-class content. Provides `TW_TOAST_DATA` + `TW_TOAST_REF`. */\n _createContentInjector(ref: ToastRef): Injector {\n return Injector.create({\n parent: this.injector,\n providers: [\n { provide: TW_TOAST_REF, useValue: ref },\n { provide: TW_TOAST_DATA, useValue: ref.data() },\n ],\n });\n }\n\n // ── Template helpers ──\n\n protected asString(content: unknown): string {\n return typeof content === 'string' ? content : '';\n }\n\n protected asTemplate(content: unknown): TemplateRef<ToastTemplateContext> | null {\n return content instanceof TemplateRef ? (content as TemplateRef<ToastTemplateContext>) : null;\n }\n\n protected templateContext(ref: ToastRef): ToastTemplateContext {\n return { $implicit: ref.data() as never, ref };\n }\n\n protected panelClassFor(ref: ToastRef): string {\n const raw = ref.config.panelClass;\n if (!raw) return '';\n return Array.isArray(raw) ? raw.join(' ') : raw;\n }\n\n // ── Interaction handlers ──\n\n protected onPointerEnter(ref: ToastRef): void {\n ref._setHovered(true);\n }\n\n protected onPointerLeave(ref: ToastRef): void {\n ref._setHovered(false);\n }\n\n protected onFocusIn(ref: ToastRef): void {\n ref._setFocused(true);\n }\n\n protected onFocusOut(ref: ToastRef, event: FocusEvent): void {\n const related = event.relatedTarget as Node | null;\n const target = event.currentTarget as Node | null;\n if (related && target && target.contains(related)) return;\n ref._setFocused(false);\n }\n\n protected onEscape(ref: ToastRef, event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n ref._dismissWith('manual');\n }\n\n protected onSwipeStart(ref: ToastRef, event: PointerEvent, el: HTMLElement): void {\n if (!ref.config.swipeToDismiss) return;\n if (event.button !== 0) return;\n const target = event.target as HTMLElement | null;\n if (target?.closest('button, a, input, select, textarea, [role=\"button\"]')) return;\n\n const width = el.getBoundingClientRect().width;\n this.swipeSessions.set(ref, {\n pointerId: event.pointerId,\n startX: event.clientX,\n width,\n active: false,\n });\n el.setPointerCapture(event.pointerId);\n\n const onMove = (e: PointerEvent) => this.onSwipeMove(ref, e, el);\n const onUp = (e: PointerEvent) => this.onSwipeEnd(ref, e, el, onMove, onUp);\n el.addEventListener('pointermove', onMove);\n el.addEventListener('pointerup', onUp);\n el.addEventListener('pointercancel', onUp);\n }\n\n private onSwipeMove(ref: ToastRef, event: PointerEvent, _el: HTMLElement): void {\n const session = this.swipeSessions.get(ref);\n if (!session || event.pointerId !== session.pointerId) return;\n const dx = event.clientX - session.startX;\n if (!session.active && Math.abs(dx) < 6) return;\n session.active = true;\n ref.swipeTransform.set(`translate3d(${dx}px, 0, 0)`);\n const fade = 1 - Math.min(Math.abs(dx) / session.width, 1) * SWIPE_MAX_OPACITY_FADE;\n ref.swipeOpacity.set(fade);\n }\n\n private onSwipeEnd(\n ref: ToastRef,\n event: PointerEvent,\n el: HTMLElement,\n onMove: (e: PointerEvent) => void,\n onUp: (e: PointerEvent) => void,\n ): void {\n const session = this.swipeSessions.get(ref);\n el.removeEventListener('pointermove', onMove);\n el.removeEventListener('pointerup', onUp);\n el.removeEventListener('pointercancel', onUp);\n if (!session || event.pointerId !== session.pointerId) return;\n try {\n el.releasePointerCapture(session.pointerId);\n } catch {\n /* no-op */\n }\n this.swipeSessions.delete(ref);\n\n if (!session.active) return;\n const dx = event.clientX - session.startX;\n const threshold = session.width * SWIPE_DISMISS_FRACTION;\n const allowed = this.swipeDirectionAllowed(dx);\n if (Math.abs(dx) >= threshold && allowed) {\n untracked(() => {\n ref.swipeTransform.set(`translate3d(${Math.sign(dx) * session.width * 1.2}px, 0, 0)`);\n ref.swipeOpacity.set(0);\n ref.leaveAnimationOverride.set('fade-out');\n });\n ref._dismissWith('swipe');\n } else {\n ref.swipeTransform.set(null);\n ref.swipeOpacity.set(null);\n }\n }\n\n private swipeDirectionAllowed(dx: number): boolean {\n const pos = this.position();\n if (pos === 'top-right' || pos === 'bottom-right') return dx > 0;\n if (pos === 'top-left' || pos === 'bottom-left') return dx < 0;\n return true;\n }\n\n private resolvePoliteness(ref: ToastRef): 'polite' | 'assertive' | 'off' {\n if (ref.config.politeness) return ref.config.politeness;\n return ref.severity() === 'error' ? 'assertive' : 'polite';\n }\n\n private resolveAnnouncementText(ref: ToastRef): string {\n const explicit = ref.ariaLabel();\n if (explicit) return explicit;\n const content = ref.content();\n if (typeof content === 'string') return content;\n const host = this.host.nativeElement.querySelector(\n `[data-toast-id=\"${ref.id}\"]`,\n ) as HTMLElement | null;\n if (host) return host.textContent?.trim() ?? '';\n return this.host.nativeElement.textContent?.trim() ?? '';\n }\n}\n\nfunction resolveKind(content: unknown): ToastKind {\n if (typeof content === 'string') return 'string';\n if (content instanceof TemplateRef) return 'template';\n return 'component';\n}\n\n","import { signal, type Signal, type WritableSignal } from '@angular/core';\nimport type { Portal } from '@angular/cdk/portal';\nimport { type Observable, ReplaySubject, Subject } from 'rxjs';\nimport type {\n ToastAction,\n ToastConfig,\n ToastContent,\n ToastDismissReason,\n ToastDismissal,\n ToastSeverity,\n ToastState,\n} from './toast-config';\n\n/** Duration (ms) of the toast enter / leave animation. Must match `_base.css` toast-slide keyframes. */\nexport const TOAST_ANIMATION_DURATION = 150;\n\n/** Padding added to animation fallback timers to guarantee cleanup if the CSS event is swallowed. */\nexport const TOAST_ANIMATION_FALLBACK_PADDING = 50;\n\n/** Patch accepted by {@link ToastRef.update}. Mirrors the subset of `ToastConfig` that is safe to mutate live. */\nexport interface ToastUpdatePatch {\n /** New severity — updates color, default icon, and (for `'error'`) live-region politeness. */\n severity?: ToastSeverity;\n /** New auto-dismiss duration in ms. Restarts the timer if the toast is visible. `0` disables auto-dismiss. */\n duration?: number;\n /** Replace or clear the action button. Pass `null` to remove. */\n action?: ToastAction | null;\n /** Override the icon slot. */\n icon?: string | false | undefined;\n /** Replace the `TW_TOAST_DATA` payload. */\n data?: unknown;\n /** Replace the aria-label applied to the toast wrapper. */\n ariaLabel?: string;\n /** Replace the toast's content (string, template, or component). */\n content?: ToastContent;\n /** Whether the close button is shown. */\n dismissible?: boolean;\n}\n\n/**\n * Reference to a toast opened via {@link ToastService}. Use to dismiss the\n * toast, pause / resume its auto-dismiss timer, or observe its lifecycle.\n *\n * The service returns a ref synchronously from every open method; the toast\n * itself is attached asynchronously inside the CDK overlay.\n */\nexport class ToastRef<C = unknown, R = unknown> {\n /** Unique id. Generated if `config.id` was not provided. */\n readonly id: string;\n\n /** Instance of the component rendered inside the toast (only for component-class content). */\n componentInstance: C | null = null;\n\n /** Resolved static config for this toast (defaults merged, severity shorthand applied). */\n readonly config: Readonly<ToastConfig<unknown, R>>;\n\n /** Reactive lifecycle state. */\n readonly state: Signal<ToastState>;\n\n /** Reactive severity — may change after `update()` (used by the `promise()` helper). */\n readonly severity: Signal<ToastSeverity>;\n\n /** Reactive dismissibility. */\n readonly dismissible: Signal<boolean>;\n\n /** Reactive icon override. */\n readonly icon: Signal<string | false | undefined>;\n\n /** Reactive content (the source of truth for what gets rendered). */\n readonly content: Signal<ToastContent>;\n\n /** Reactive action button configuration. */\n readonly action: Signal<ToastAction | undefined>;\n\n /** Reactive accessible label. */\n readonly ariaLabel: Signal<string | undefined>;\n\n /** Reactive data payload — re-read by the container to update `TW_TOAST_DATA`. */\n readonly data: Signal<unknown>;\n\n /** @internal Reactive \"transient\" class applied by swipe gestures (e.g. `translate3d(...)`). */\n readonly swipeTransform = signal<string | null>(null);\n\n /** @internal Reactive opacity applied during swipe gestures. */\n readonly swipeOpacity = signal<number | null>(null);\n\n /** @internal Leave-animation class override. When non-null, container uses this instead of the position default. */\n readonly leaveAnimationOverride = signal<string | null>(null);\n\n /** @internal Portal for component-class content. Set by the service; null for string / template content. */\n _portal: Portal<unknown> | null = null;\n\n /** @internal True while the pointer hovers this toast. */\n _hovered = false;\n\n /** @internal True while focus is within this toast. */\n _focused = false;\n\n /** @internal Set by the service so the ref can reach the CDK-owned OverlayRef if it needs to. */\n _overlayPanelElement: HTMLElement | null = null;\n\n private readonly stateSignal = signal<ToastState>('entering');\n private readonly severitySignal: WritableSignal<ToastSeverity>;\n private readonly dismissibleSignal: WritableSignal<boolean>;\n private readonly iconSignal: WritableSignal<string | false | undefined>;\n private readonly contentSignal: WritableSignal<ToastContent>;\n private readonly actionSignal: WritableSignal<ToastAction | undefined>;\n private readonly ariaLabelSignal: WritableSignal<string | undefined>;\n private readonly dataSignal: WritableSignal<unknown>;\n\n private readonly afterOpenedSubject = new ReplaySubject<void>(1);\n private readonly beforeDismissedSubject = new ReplaySubject<R | undefined>(1);\n private readonly afterDismissedSubject = new ReplaySubject<ToastDismissal<R>>(1);\n private readonly updatedSubject = new Subject<ToastUpdatePatch>();\n\n private dismissReason: ToastDismissReason = 'programmatic';\n private dismissResult: R | undefined;\n private autoDismissTimer: ReturnType<typeof setTimeout> | null = null;\n private autoDismissStartedAt = 0;\n private autoDismissRemaining = 0;\n private paused = false;\n private enterTimer: ReturnType<typeof setTimeout> | null = null;\n private leaveTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n id: string,\n content: ToastContent,\n config: ToastConfig<unknown, R>,\n private readonly dismissCallback: (ref: ToastRef) => void,\n ) {\n this.id = id;\n this.config = config;\n this.severitySignal = signal(config.severity ?? 'info');\n this.dismissibleSignal = signal(config.dismissible ?? true);\n this.iconSignal = signal<string | false | undefined>(\n typeof config.icon === 'string' || config.icon === false ? config.icon : undefined,\n );\n this.contentSignal = signal(content);\n this.actionSignal = signal(config.action);\n this.ariaLabelSignal = signal(config.ariaLabel);\n this.dataSignal = signal(config.data ?? null);\n\n this.state = this.stateSignal.asReadonly();\n this.severity = this.severitySignal.asReadonly();\n this.dismissible = this.dismissibleSignal.asReadonly();\n this.icon = this.iconSignal.asReadonly();\n this.content = this.contentSignal.asReadonly();\n this.action = this.actionSignal.asReadonly();\n this.ariaLabel = this.ariaLabelSignal.asReadonly();\n this.data = this.dataSignal.asReadonly();\n\n this.autoDismissRemaining = config.duration ?? 0;\n\n this.enterTimer = setTimeout(\n () => this._markVisible(),\n TOAST_ANIMATION_DURATION + TOAST_ANIMATION_FALLBACK_PADDING,\n );\n }\n\n /**\n * Dismiss the toast programmatically. The leave animation plays before the\n * element is removed and subscribers are notified. Safe to call multiple times.\n */\n dismiss(result?: R): void {\n this._dismissWith('programmatic', result);\n }\n\n /** Pause the auto-dismiss timer (if any). Called automatically on hover / focus when `pauseOnInteraction` is true. */\n pause(): void {\n if (this.paused) return;\n this.paused = true;\n if (this.autoDismissTimer !== null) {\n const elapsed = Date.now() - this.autoDismissStartedAt;\n this.autoDismissRemaining = Math.max(0, this.autoDismissRemaining - elapsed);\n clearTimeout(this.autoDismissTimer);\n this.autoDismissTimer = null;\n }\n const current = this.stateSignal();\n if (current === 'visible') this.stateSignal.set('paused');\n }\n\n /** Resume the auto-dismiss timer with the remaining time. */\n resume(): void {\n if (!this.paused) return;\n this.paused = false;\n if (this.stateSignal() === 'paused') this.stateSignal.set('visible');\n if (this.config.duration && this.config.duration > 0) {\n if (this.autoDismissRemaining <= 0) {\n this._dismissWith('timeout');\n return;\n }\n this._startAutoDismissTimer();\n }\n }\n\n /**\n * @internal Update the hover state. When `pauseOnInteraction` is set and\n * either hover or focus is active, the auto-dismiss timer is paused.\n */\n _setHovered(hovered: boolean): void {\n this._hovered = hovered;\n this._syncInteractionPause();\n }\n\n /** @internal Update the focus-within state. See `_setHovered`. */\n _setFocused(focused: boolean): void {\n this._focused = focused;\n this._syncInteractionPause();\n }\n\n private _syncInteractionPause(): void {\n if (!this.config.pauseOnInteraction) return;\n if (this._hovered || this._focused) {\n this.pause();\n } else {\n this.resume();\n }\n }\n\n /** Invoke the configured action handler (or dismiss with reason `'action'` if none is set). */\n triggerAction(): void {\n const action = this.actionSignal();\n if (!action) return;\n if (action.handler) {\n action.handler(this as unknown as ToastRef);\n } else {\n this._dismissWith('action');\n }\n }\n\n /** Mutate the live toast in place. Used by the `promise()` helper to swap loading → success / error. */\n update(patch: ToastUpdatePatch): void {\n const currentState = this.stateSignal();\n if (currentState === 'dismissing' || currentState === 'dismissed') return;\n\n if (patch.severity !== undefined) this.severitySignal.set(patch.severity);\n if (patch.dismissible !== undefined) this.dismissibleSignal.set(patch.dismissible);\n if (patch.icon !== undefined) this.iconSignal.set(patch.icon);\n if (patch.content !== undefined) this.contentSignal.set(patch.content);\n if (patch.action !== undefined) this.actionSignal.set(patch.action ?? undefined);\n if (patch.ariaLabel !== undefined) this.ariaLabelSignal.set(patch.ariaLabel);\n if (patch.data !== undefined) this.dataSignal.set(patch.data);\n\n if (patch.duration !== undefined) {\n (this.config as { duration?: number }).duration = patch.duration;\n this.autoDismissRemaining = patch.duration;\n if (this.autoDismissTimer !== null) {\n clearTimeout(this.autoDismissTimer);\n this.autoDismissTimer = null;\n }\n if (!this.paused && (currentState === 'visible' || currentState === 'paused')) {\n this._startAutoDismissTimer();\n }\n }\n\n this.updatedSubject.next(patch);\n }\n\n /** Observable that emits once after the enter animation completes. */\n afterOpened(): Observable<void> {\n return this.afterOpenedSubject.asObservable();\n }\n\n /** Observable that emits once when the dismiss sequence starts. */\n beforeDismissed(): Observable<R | undefined> {\n return this.beforeDismissedSubject.asObservable();\n }\n\n /** Observable that emits once after the leave animation completes and the ref is cleaned up. */\n afterDismissed(): Observable<ToastDismissal<R>> {\n return this.afterDismissedSubject.asObservable();\n }\n\n /** @internal Observable of `update()` calls. The container subscribes to re-announce to `LiveAnnouncer`. */\n _updates(): Observable<ToastUpdatePatch> {\n return this.updatedSubject.asObservable();\n }\n\n /** @internal Called by the service when the max-visible cap is exceeded. */\n _dismissAsMaxExceeded(): void {\n this._dismissWith('max-exceeded');\n }\n\n /** @internal Start the dismiss sequence with the given reason. */\n _dismissWith(reason: ToastDismissReason, result?: R): void {\n const currentState = this.stateSignal();\n if (currentState === 'dismissing' || currentState === 'dismissed') return;\n\n this.dismissReason = reason;\n this.dismissResult = result;\n this.stateSignal.set('dismissing');\n\n if (this.autoDismissTimer !== null) {\n clearTimeout(this.autoDismissTimer);\n this.autoDismissTimer = null;\n }\n if (this.enterTimer !== null) {\n clearTimeout(this.enterTimer);\n this.enterTimer = null;\n }\n\n this.beforeDismissedSubject.next(result);\n this.beforeDismissedSubject.complete();\n\n this.leaveTimer = setTimeout(\n () => this._finishDismiss(),\n TOAST_ANIMATION_DURATION + TOAST_ANIMATION_FALLBACK_PADDING,\n );\n }\n\n /** @internal Finalise dismissal — clears timers, emits `afterDismissed`, and hands control back to the service. */\n _finishDismiss(): void {\n if (this.stateSignal() === 'dismissed') return;\n this.stateSignal.set('dismissed');\n\n if (this.leaveTimer !== null) {\n clearTimeout(this.leaveTimer);\n this.leaveTimer = null;\n }\n\n const dismissal: ToastDismissal<R> = {\n reason: this.dismissReason,\n result: this.dismissResult,\n };\n this.afterDismissedSubject.next(dismissal);\n this.afterDismissedSubject.complete();\n this.updatedSubject.complete();\n\n this.dismissCallback(this as unknown as ToastRef);\n }\n\n private _markVisible(): void {\n if (this.enterTimer !== null) {\n clearTimeout(this.enterTimer);\n this.enterTimer = null;\n }\n const current = this.stateSignal();\n if (current !== 'entering') return;\n this.stateSignal.set('visible');\n this.afterOpenedSubject.next();\n this.afterOpenedSubject.complete();\n if (this.config.duration && this.config.duration > 0 && !this.paused) {\n this._startAutoDismissTimer();\n }\n }\n\n private _startAutoDismissTimer(): void {\n if (this.autoDismissRemaining <= 0) return;\n if (this.autoDismissTimer !== null) clearTimeout(this.autoDismissTimer);\n this.autoDismissStartedAt = Date.now();\n this.autoDismissTimer = setTimeout(\n () => this._dismissWith('timeout'),\n this.autoDismissRemaining,\n );\n }\n}\n","import {\n type ComponentRef,\n type EnvironmentProviders,\n Injectable,\n Injector,\n type OnDestroy,\n type Provider,\n type Signal,\n TemplateRef,\n type Type,\n inject,\n makeEnvironmentProviders,\n signal,\n} from '@angular/core';\nimport {\n createGlobalPositionStrategy,\n Overlay,\n type OverlayRef,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { type Observable, Subject, defer, startWith } from 'rxjs';\nimport {\n TW_TOAST_DATA,\n TW_TOAST_DEFAULT_OPTIONS,\n TW_TOAST_REF,\n ToastConfig,\n type ToastContent,\n type ToastPosition,\n type ToastSeverity,\n type ToastTemplateContext,\n} from './toast-config';\nimport { ToastContainerComponent } from './toast-container';\nimport { ToastRef } from './toast-ref';\n\nconst OVERLAY_EDGE_OFFSET = '1rem';\n\ninterface PositionOverlay {\n overlayRef: OverlayRef;\n containerRef: ComponentRef<ToastContainerComponent>;\n}\n\ninterface PromiseMessages<T> {\n loading: string;\n success: string | ((value: T) => string);\n error: string | ((err: unknown) => string);\n}\n\nlet nextToastId = 0;\n\nfunction generateId(): string {\n return `tw-toast-${++nextToastId}`;\n}\n\n/**\n * Opens Tailwind-styled toasts / snackbars inside CDK overlays. One overlay is\n * created per `ToastPosition` on first use and reused for the lifetime of the\n * service; toasts stack vertically inside their position container.\n *\n * Not `providedIn: 'root'` — register via {@link provideToast}.\n */\n@Injectable()\nexport class ToastService implements OnDestroy {\n private readonly overlay = inject(Overlay);\n private readonly injector = inject(Injector);\n private readonly defaultOptions =\n inject(TW_TOAST_DEFAULT_OPTIONS, { optional: true }) ?? {};\n private readonly parent = inject(ToastService, { optional: true, skipSelf: true });\n\n private readonly positionOverlays = new Map<ToastPosition, PositionOverlay>();\n private readonly activeRefsAtThisLevel = signal<readonly ToastRef[]>([]);\n private readonly afterOpenedSubject = new Subject<ToastRef>();\n private readonly afterAllDismissedSubject = new Subject<void>();\n\n /** Reactive list of every toast that has not yet fully dismissed. */\n readonly activeToasts: Signal<readonly ToastRef[]> = this.parent\n ? this.parent.activeToasts\n : this.activeRefsAtThisLevel.asReadonly();\n\n /** Emits every time a new toast is opened. */\n readonly afterOpened: Observable<ToastRef> = this.parent\n ? this.parent.afterOpened\n : this.afterOpenedSubject.asObservable();\n\n /** Emits when the active-toasts list transitions back to empty. Emits immediately on subscribe if none are open. */\n readonly afterAllDismissed: Observable<void> = defer(() =>\n this.activeToasts().length\n ? this.getAfterAllDismissedSource()\n : this.getAfterAllDismissedSource().pipe(startWith(undefined as void)),\n );\n\n /**\n * Open a toast. Content may be a string (rendered inside the default\n * `ToastComponent`), a `TemplateRef` (rendered via `TemplatePortal`), or a\n * component class (rendered via `ComponentPortal` with `TW_TOAST_REF` +\n * `TW_TOAST_DATA` injected).\n */\n show<R = void, D = unknown>(\n content: ToastContent,\n config?: ToastConfig<D, R>,\n ): ToastRef<unknown, R> {\n const merged = this.resolveConfig<D, R>(config);\n return this.openInternal<R>(content, merged);\n }\n\n /** Shorthand for `show(message, { severity: 'success', ... })`. */\n success<R = void>(message: string, config?: ToastConfig<unknown, R>): ToastRef<unknown, R> {\n return this.openWithSeverity('success', message, config);\n }\n\n /** Shorthand for `show(message, { severity: 'error', politeness: 'assertive', ... })`. */\n error<R = void>(message: string, config?: ToastConfig<unknown, R>): ToastRef<unknown, R> {\n return this.openWithSeverity('error', message, config, 'assertive');\n }\n\n /** Shorthand for `show(message, { severity: 'warning', ... })`. */\n warning<R = void>(message: string, config?: ToastConfig<unknown, R>): ToastRef<unknown, R> {\n return this.openWithSeverity('warning', message, config);\n }\n\n /** Shorthand for `show(message, { severity: 'info', ... })`. */\n info<R = void>(message: string, config?: ToastConfig<unknown, R>): ToastRef<unknown, R> {\n return this.openWithSeverity('info', message, config);\n }\n\n /**\n * Show a loading toast, then swap it to success / error when the promise\n * settles. The same ref is returned and re-used across all three states.\n * The loading toast is pinned (duration forced to 0, dismissible forced to\n * false) until the promise resolves.\n */\n promise<T, R = void>(\n promise: Promise<T>,\n messages: PromiseMessages<T>,\n config?: ToastConfig<unknown, R>,\n ): ToastRef<unknown, R> {\n const resolvedDuration = config?.duration ?? this.defaultOptions.duration ?? 5000;\n const ref = this.show<R>(messages.loading, {\n ...(config as ToastConfig<unknown, R>),\n severity: 'neutral',\n duration: 0,\n dismissible: false,\n });\n\n promise.then(\n (value) => {\n if (ref.state() === 'dismissed' || ref.state() === 'dismissing') return;\n const msg = typeof messages.success === 'function' ? messages.success(value) : messages.success;\n ref.update({\n severity: 'success',\n content: msg,\n duration: resolvedDuration,\n dismissible: config?.dismissible ?? true,\n });\n this.announceUpdate(ref);\n },\n (err) => {\n if (ref.state() === 'dismissed' || ref.state() === 'dismissing') return;\n const msg = typeof messages.error === 'function' ? messages.error(err) : messages.error;\n ref.update({\n severity: 'error',\n content: msg,\n duration: resolvedDuration,\n dismissible: config?.dismissible ?? true,\n });\n this.announceUpdate(ref);\n },\n );\n\n return ref;\n }\n\n /** Dismiss a toast by id. No-op if no matching toast is active. */\n dismiss(id: string): void {\n const match = this.activeToasts().find((ref) => ref.id === id);\n if (match) match.dismiss();\n }\n\n /** Dismiss every active toast across every position. */\n dismissAll(): void {\n const refs = [...this.activeToasts()];\n for (let i = refs.length - 1; i >= 0; i--) refs[i].dismiss();\n }\n\n /** Look up an active toast by id. */\n getToastById<R = unknown>(id: string): ToastRef<unknown, R> | undefined {\n return this.activeToasts().find((ref) => ref.id === id) as\n | ToastRef<unknown, R>\n | undefined;\n }\n\n ngOnDestroy(): void {\n const refs = [...this.activeRefsAtThisLevel()];\n for (let i = refs.length - 1; i >= 0; i--) refs[i]._finishDismiss();\n for (const { overlayRef } of this.positionOverlays.values()) {\n overlayRef.dispose();\n }\n this.positionOverlays.clear();\n this.afterOpenedSubject.complete();\n this.afterAllDismissedSubject.complete();\n }\n\n private openWithSeverity<R>(\n severity: ToastSeverity,\n message: string,\n config?: ToastConfig<unknown, R>,\n forcedPoliteness?: 'polite' | 'assertive' | 'off',\n ): ToastRef<unknown, R> {\n const merged = this.resolveConfig<unknown, R>(config);\n merged.severity = severity;\n if (forcedPoliteness && !config?.politeness) merged.politeness = forcedPoliteness;\n return this.openInternal<R>(message, merged);\n }\n\n private openInternal<R>(\n content: ToastContent,\n config: ToastConfig<unknown, R>,\n ): ToastRef<unknown, R> {\n const id = config.id ?? generateId();\n config.id = id;\n\n const ref = new ToastRef<unknown, R>(id, content, config, (dismissed) =>\n this.handleDismissed(dismissed),\n );\n\n if (isComponentConstructor(content)) {\n const injector = this.getContainerForPosition(\n config.position!,\n ).containerRef.instance._createContentInjector(ref as ToastRef<unknown, unknown>);\n ref._portal = new ComponentPortal(content, null, injector);\n }\n\n this.enforceMaxVisible(config.position!, config.maxVisible ?? 5);\n this.registerOpen(ref);\n this.attachToContainer(ref, config.position!);\n this.announceOpen(ref);\n return ref;\n }\n\n private enforceMaxVisible(position: ToastPosition, max: number): void {\n if (max <= 0) return;\n const atPosition = this.activeToasts().filter(\n (ref) =>\n (ref.config.position ?? 'bottom-right') === position &&\n ref.state() !== 'dismissing' &&\n ref.state() !== 'dismissed',\n );\n while (atPosition.length >= max) {\n const oldest = atPosition.shift();\n if (!oldest) break;\n oldest._dismissAsMaxExceeded();\n }\n }\n\n private registerOpen<R>(ref: ToastRef<unknown, R>): void {\n const scope = this.parent ?? this;\n const anyRef = ref as ToastRef<unknown, unknown>;\n scope.activeRefsAtThisLevel.update((list) => [...list, anyRef]);\n scope.afterOpenedSubject.next(anyRef);\n }\n\n private handleDismissed(ref: ToastRef): void {\n const scope = this.parent ?? this;\n scope.activeRefsAtThisLevel.update((list) => list.filter((r) => r !== ref));\n\n const position = ref.config.position ?? 'bottom-right';\n const entry = this.positionOverlays.get(position);\n if (entry) {\n const instance = entry.containerRef.instance;\n instance.visibleRefs.update((list) => list.filter((r) => r !== ref));\n }\n\n if (scope.activeRefsAtThisLevel().length === 0) {\n scope.afterAllDismissedSubject.next();\n }\n }\n\n private attachToContainer<R>(ref: ToastRef<unknown, R>, position: ToastPosition): void {\n const entry = this.getContainerForPosition(position);\n const instance = entry.containerRef.instance;\n const anyRef = ref as ToastRef<unknown, unknown>;\n instance.visibleRefs.update((list) => [...list, anyRef]);\n ref._overlayPanelElement = entry.overlayRef.overlayElement;\n }\n\n private announceOpen<R>(ref: ToastRef<unknown, R>): void {\n const entry = this.positionOverlays.get(ref.config.position ?? 'bottom-right');\n entry?.containerRef.instance._announceOpen(ref as ToastRef<unknown, unknown>);\n }\n\n private announceUpdate<R>(ref: ToastRef<unknown, R>): void {\n const entry = this.positionOverlays.get(ref.config.position ?? 'bottom-right');\n entry?.containerRef.instance._announceUpdate(ref as ToastRef<unknown, unknown>);\n }\n\n private getContainerForPosition(position: ToastPosition): PositionOverlay {\n const existing = this.positionOverlays.get(position);\n if (existing) return existing;\n\n const overlayRef = this.overlay.create({\n positionStrategy: this.buildPositionStrategy(position),\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n hasBackdrop: false,\n panelClass: ['tw-toast-overlay', `tw-toast-overlay-${position}`],\n });\n\n const containerPortal = new ComponentPortal(ToastContainerComponent, null, this.injector);\n const containerRef = overlayRef.attach(containerPortal);\n containerRef.instance.position.set(position);\n containerRef.instance.regionLabel.set(\n this.defaultOptions.regionAriaLabel ?? 'Notifications',\n );\n\n const entry: PositionOverlay = { overlayRef, containerRef };\n this.positionOverlays.set(position, entry);\n return entry;\n }\n\n private buildPositionStrategy(position: ToastPosition) {\n const strategy = createGlobalPositionStrategy(this.injector);\n switch (position) {\n case 'top-right':\n strategy.top(OVERLAY_EDGE_OFFSET).right(OVERLAY_EDGE_OFFSET);\n break;\n case 'top-left':\n strategy.top(OVERLAY_EDGE_OFFSET).left(OVERLAY_EDGE_OFFSET);\n break;\n case 'top-center':\n strategy.top(OVERLAY_EDGE_OFFSET).centerHorizontally();\n break;\n case 'bottom-right':\n strategy.bottom(OVERLAY_EDGE_OFFSET).right(OVERLAY_EDGE_OFFSET);\n break;\n case 'bottom-left':\n strategy.bottom(OVERLAY_EDGE_OFFSET).left(OVERLAY_EDGE_OFFSET);\n break;\n case 'bottom-center':\n strategy.bottom(OVERLAY_EDGE_OFFSET).centerHorizontally();\n break;\n }\n return strategy;\n }\n\n private resolveConfig<D, R>(config: ToastConfig<D, R> | undefined): ToastConfig<D, R> {\n const merged = new ToastConfig<D, R>();\n Object.assign(merged, this.defaultOptions, config);\n return merged;\n }\n\n private getAfterAllDismissedSource(): Subject<void> {\n return this.parent ? this.parent.getAfterAllDismissedSource() : this.afterAllDismissedSubject;\n }\n}\n\nfunction isComponentConstructor(value: unknown): value is Type<unknown> {\n return typeof value === 'function' && !(value instanceof TemplateRef);\n}\n\n/**\n * Registers {@link ToastService} for dependency injection and installs optional\n * application-wide defaults.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideToast({ position: 'top-right', duration: 4000 })]\n * });\n * ```\n */\nexport function provideToast(\n defaultOptions?: Partial<ToastConfig>,\n): EnvironmentProviders {\n const providers: Provider[] = [ToastService];\n if (defaultOptions) {\n providers.push({ provide: TW_TOAST_DEFAULT_OPTIONS, useValue: defaultOptions });\n }\n return makeEnvironmentProviders(providers);\n}\n\n/** Re-exported helpers so `inject(TW_TOAST_DATA)` / `inject(TW_TOAST_REF)` work from component content. */\nexport { TW_TOAST_DATA, TW_TOAST_REF };\n\n// Re-exports to keep the barrel tidy.\nexport type { ToastContent, ToastTemplateContext };\n\nexport const ToastInternals = {\n /** @internal Reset id counter for tests. */\n _resetIdForTesting(): void {\n nextToastId = 0;\n },\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cdevhub/ngx-tw",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Angular component library for Tailwind CSS v4 — accessible, signal-based, built on Angular CDK.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -34,6 +34,9 @@
|
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"tslib": "^2.3.0"
|
|
36
36
|
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=20.19.0 || >=22.12.0"
|
|
39
|
+
},
|
|
37
40
|
"sideEffects": false,
|
|
38
41
|
"publishConfig": {
|
|
39
42
|
"access": "public"
|
package/theme/_dark.css
CHANGED
|
@@ -156,8 +156,10 @@
|
|
|
156
156
|
--color-primary-soft-hover: var(--color-blue-900);
|
|
157
157
|
--color-primary-soft-fg: var(--color-blue-100);
|
|
158
158
|
--color-primary-soft-fg-muted: var(--color-blue-300);
|
|
159
|
-
|
|
160
|
-
|
|
159
|
+
/* `-400` not `-500` — blue-500/#2b7fff on blue-950/#162456 only hits
|
|
160
|
+
3.92:1 (AA fail). blue-400 lifts that to ~7.8:1 with the same fg. */
|
|
161
|
+
--color-primary-solid: var(--color-blue-400);
|
|
162
|
+
--color-primary-solid-hover: var(--color-blue-300);
|
|
161
163
|
--color-primary-solid-fg: var(--color-blue-950);
|
|
162
164
|
--color-primary-border: var(--color-blue-800);
|
|
163
165
|
--color-primary-border-strong: var(--color-blue-500);
|
|
@@ -182,8 +184,9 @@
|
|
|
182
184
|
--color-accent-soft-hover: var(--color-violet-900);
|
|
183
185
|
--color-accent-soft-fg: var(--color-violet-100);
|
|
184
186
|
--color-accent-soft-fg-muted: var(--color-violet-300);
|
|
185
|
-
|
|
186
|
-
--color-accent-solid
|
|
187
|
+
/* violet-500/violet-950 = 3.46:1 (AA fail); -400 lifts to ~5.4:1. */
|
|
188
|
+
--color-accent-solid: var(--color-violet-400);
|
|
189
|
+
--color-accent-solid-hover: var(--color-violet-300);
|
|
187
190
|
--color-accent-solid-fg: var(--color-violet-950);
|
|
188
191
|
--color-accent-border: var(--color-violet-800);
|
|
189
192
|
--color-accent-border-strong: var(--color-violet-500);
|
|
@@ -247,8 +250,9 @@
|
|
|
247
250
|
--color-error-soft-hover: var(--color-red-900);
|
|
248
251
|
--color-error-soft-fg: var(--color-red-100);
|
|
249
252
|
--color-error-soft-fg-muted: var(--color-red-300);
|
|
250
|
-
|
|
251
|
-
--color-error-solid
|
|
253
|
+
/* red-500/red-950 = 4.14:1 (just AA fail). red-400 lifts to ~5.8:1. */
|
|
254
|
+
--color-error-solid: var(--color-red-400);
|
|
255
|
+
--color-error-solid-hover: var(--color-red-300);
|
|
252
256
|
--color-error-solid-fg: var(--color-red-950);
|
|
253
257
|
--color-error-border: var(--color-red-800);
|
|
254
258
|
--color-error-border-strong: var(--color-red-500);
|
|
@@ -398,8 +402,8 @@
|
|
|
398
402
|
--color-primary-soft-hover: var(--color-blue-900);
|
|
399
403
|
--color-primary-soft-fg: var(--color-blue-100);
|
|
400
404
|
--color-primary-soft-fg-muted: var(--color-blue-300);
|
|
401
|
-
--color-primary-solid: var(--color-blue-
|
|
402
|
-
--color-primary-solid-hover: var(--color-blue-
|
|
405
|
+
--color-primary-solid: var(--color-blue-400);
|
|
406
|
+
--color-primary-solid-hover: var(--color-blue-300);
|
|
403
407
|
--color-primary-solid-fg: var(--color-blue-950);
|
|
404
408
|
--color-primary-border: var(--color-blue-800);
|
|
405
409
|
--color-primary-border-strong: var(--color-blue-500);
|
|
@@ -424,8 +428,8 @@
|
|
|
424
428
|
--color-accent-soft-hover: var(--color-violet-900);
|
|
425
429
|
--color-accent-soft-fg: var(--color-violet-100);
|
|
426
430
|
--color-accent-soft-fg-muted: var(--color-violet-300);
|
|
427
|
-
--color-accent-solid: var(--color-violet-
|
|
428
|
-
--color-accent-solid-hover: var(--color-violet-
|
|
431
|
+
--color-accent-solid: var(--color-violet-400);
|
|
432
|
+
--color-accent-solid-hover: var(--color-violet-300);
|
|
429
433
|
--color-accent-solid-fg: var(--color-violet-950);
|
|
430
434
|
--color-accent-border: var(--color-violet-800);
|
|
431
435
|
--color-accent-border-strong: var(--color-violet-500);
|
|
@@ -489,8 +493,8 @@
|
|
|
489
493
|
--color-error-soft-hover: var(--color-red-900);
|
|
490
494
|
--color-error-soft-fg: var(--color-red-100);
|
|
491
495
|
--color-error-soft-fg-muted: var(--color-red-300);
|
|
492
|
-
--color-error-solid: var(--color-red-
|
|
493
|
-
--color-error-solid-hover: var(--color-red-
|
|
496
|
+
--color-error-solid: var(--color-red-400);
|
|
497
|
+
--color-error-solid-hover: var(--color-red-300);
|
|
494
498
|
--color-error-solid-fg: var(--color-red-950);
|
|
495
499
|
--color-error-border: var(--color-red-800);
|
|
496
500
|
--color-error-border-strong: var(--color-red-500);
|
package/theme/_semantic.css
CHANGED
|
@@ -250,8 +250,9 @@
|
|
|
250
250
|
--color-info-soft-hover: var(--color-info-100);
|
|
251
251
|
--color-info-soft-fg: var(--color-info-900);
|
|
252
252
|
--color-info-soft-fg-muted: var(--color-info-800);
|
|
253
|
-
|
|
254
|
-
--color-info-solid
|
|
253
|
+
/* Solid uses -700 not -600: sky-600/white is 3.85:1 (AA fail). -700/white is 5.6:1. */
|
|
254
|
+
--color-info-solid: var(--color-info-700);
|
|
255
|
+
--color-info-solid-hover: var(--color-info-800);
|
|
255
256
|
--color-info-solid-fg: var(--color-white);
|
|
256
257
|
--color-info-border: var(--color-info-300);
|
|
257
258
|
--color-info-border-strong: var(--color-info-500);
|
|
@@ -37,13 +37,14 @@ declare class CodeBlockHeaderDirective {
|
|
|
37
37
|
* projection slot for filename / extra actions.
|
|
38
38
|
*
|
|
39
39
|
* @remarks
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* landmark
|
|
45
|
-
* region
|
|
46
|
-
*
|
|
40
|
+
* **Accessibility.** The inner `<pre tabindex="0" aria-label="...">` is the
|
|
41
|
+
* focusable, keyboard-reachable scroll surface; the host is presentational.
|
|
42
|
+
* The `<pre>` carries `aria-label` for SR users but no landmark role — a
|
|
43
|
+
* documentation page can mount many code blocks at once and ARIA's
|
|
44
|
+
* `landmark-unique` rule (axe best-practice) flags duplicate
|
|
45
|
+
* `region "<lang> code"` names. Consumers who want this block to act as a
|
|
46
|
+
* page landmark can wrap it in `<section aria-label="…">` with a unique
|
|
47
|
+
* name.
|
|
47
48
|
*/
|
|
48
49
|
declare class CodeBlockComponent {
|
|
49
50
|
/** The code string to display and copy to clipboard. */
|
|
@@ -75,7 +75,7 @@ interface TwSelectTriggerContext<T, O = TwSelectOption<T>> {
|
|
|
75
75
|
selectedOptions: readonly O[];
|
|
76
76
|
}
|
|
77
77
|
/** Rendered row in the panel — either a group-label header or an option. */
|
|
78
|
-
type SelectRenderedRow<
|
|
78
|
+
type SelectRenderedRow<_T, O = unknown> = {
|
|
79
79
|
readonly kind: 'group-label';
|
|
80
80
|
readonly group: string;
|
|
81
81
|
} | {
|
|
@@ -160,7 +160,7 @@ interface ToastAction {
|
|
|
160
160
|
* Per-call configuration for {@link ToastService} methods. Also used as the
|
|
161
161
|
* payload of {@link TW_TOAST_DEFAULT_OPTIONS} for app-wide defaults.
|
|
162
162
|
*/
|
|
163
|
-
declare class ToastConfig<D = unknown,
|
|
163
|
+
declare class ToastConfig<D = unknown, _R = unknown> {
|
|
164
164
|
/** Severity of the toast. Defaults to `'info'`. */
|
|
165
165
|
severity?: ToastSeverity;
|
|
166
166
|
/** Screen position of the toast stack. Defaults to `'bottom-right'`. */
|