@raqm/ui 0.1.2 → 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.
Files changed (100) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +87 -126
  3. package/fesm2022/raqm-ui-badge.mjs +3 -1
  4. package/fesm2022/raqm-ui-badge.mjs.map +1 -1
  5. package/fesm2022/raqm-ui-calendar.mjs +79 -12
  6. package/fesm2022/raqm-ui-calendar.mjs.map +1 -1
  7. package/fesm2022/raqm-ui-combobox.mjs +47 -23
  8. package/fesm2022/raqm-ui-combobox.mjs.map +1 -1
  9. package/fesm2022/raqm-ui-command.mjs +60 -12
  10. package/fesm2022/raqm-ui-command.mjs.map +1 -1
  11. package/fesm2022/raqm-ui-dialog.mjs +1 -3
  12. package/fesm2022/raqm-ui-dialog.mjs.map +1 -1
  13. package/fesm2022/raqm-ui-dropdown-menu.mjs.map +1 -1
  14. package/fesm2022/raqm-ui-hover-card.mjs.map +1 -1
  15. package/fesm2022/raqm-ui-icon.mjs +160 -0
  16. package/fesm2022/raqm-ui-icon.mjs.map +1 -0
  17. package/fesm2022/raqm-ui-input-otp.mjs +7 -4
  18. package/fesm2022/raqm-ui-input-otp.mjs.map +1 -1
  19. package/fesm2022/raqm-ui-menubar.mjs.map +1 -1
  20. package/fesm2022/raqm-ui-overlay-internal.mjs +15 -5
  21. package/fesm2022/raqm-ui-overlay-internal.mjs.map +1 -1
  22. package/fesm2022/raqm-ui-popover.mjs +51 -19
  23. package/fesm2022/raqm-ui-popover.mjs.map +1 -1
  24. package/fesm2022/raqm-ui-resizable.mjs +14 -4
  25. package/fesm2022/raqm-ui-resizable.mjs.map +1 -1
  26. package/fesm2022/raqm-ui-scroll-area.mjs +85 -29
  27. package/fesm2022/raqm-ui-scroll-area.mjs.map +1 -1
  28. package/fesm2022/raqm-ui-select.mjs +46 -19
  29. package/fesm2022/raqm-ui-select.mjs.map +1 -1
  30. package/fesm2022/raqm-ui-sidebar.mjs +13 -3
  31. package/fesm2022/raqm-ui-sidebar.mjs.map +1 -1
  32. package/fesm2022/raqm-ui-slider.mjs +59 -12
  33. package/fesm2022/raqm-ui-slider.mjs.map +1 -1
  34. package/fesm2022/raqm-ui-toast.mjs +60 -20
  35. package/fesm2022/raqm-ui-toast.mjs.map +1 -1
  36. package/fesm2022/raqm-ui-tooltip.mjs +28 -3
  37. package/fesm2022/raqm-ui-tooltip.mjs.map +1 -1
  38. package/fesm2022/raqm-ui.mjs +1 -0
  39. package/package.json +52 -18
  40. package/styles/accordion.css +1 -0
  41. package/styles/alert-dialog.css +1 -0
  42. package/styles/alert.css +1 -0
  43. package/styles/attachment.css +1 -0
  44. package/styles/avatar.css +1 -0
  45. package/styles/badge.css +1 -0
  46. package/styles/base.css +1 -0
  47. package/styles/button-group.css +1 -0
  48. package/styles/button.css +1 -0
  49. package/styles/checkbox.css +1 -0
  50. package/styles/combobox.css +1 -0
  51. package/styles/command.css +1 -0
  52. package/styles/common.css +17 -0
  53. package/styles/context-menu.css +1 -0
  54. package/styles/dialog.css +1 -0
  55. package/styles/drawer.css +1 -0
  56. package/styles/dropdown-menu.css +1 -0
  57. package/styles/empty.css +1 -0
  58. package/styles/field-parts.css +1 -0
  59. package/styles/field-relationships.css +1 -0
  60. package/styles/input-group-button.css +1 -0
  61. package/styles/input-group-relationships.css +1 -0
  62. package/styles/input-otp.css +1 -0
  63. package/styles/input.css +1 -0
  64. package/styles/item.css +1 -0
  65. package/styles/kbd.css +1 -0
  66. package/styles/menubar.css +1 -0
  67. package/styles/native-select.css +1 -0
  68. package/styles/navigation-menu.css +1 -0
  69. package/styles/overlay.css +1 -0
  70. package/styles/pagination.css +1 -0
  71. package/styles/popover.css +1 -0
  72. package/styles/questionnaire.css +1 -0
  73. package/styles/radio-group.css +1 -0
  74. package/styles/resizable.css +1 -0
  75. package/styles/sheet.css +1 -0
  76. package/styles/sidebar.css +1 -0
  77. package/styles/spinner.css +1 -0
  78. package/styles/switch.css +1 -0
  79. package/styles/table.css +1 -0
  80. package/styles/tabs.css +1 -0
  81. package/styles/textarea.css +1 -0
  82. package/styles/theme.css +50 -4324
  83. package/styles/toggle-group.css +1 -0
  84. package/styles/toggle.css +1 -0
  85. package/styles/tooltip.css +1 -0
  86. package/types/raqm-ui-calendar.d.ts +1 -0
  87. package/types/raqm-ui-combobox.d.ts +8 -4
  88. package/types/raqm-ui-command.d.ts +4 -0
  89. package/types/raqm-ui-dialog.d.ts +7 -1
  90. package/types/raqm-ui-icon.d.ts +65 -0
  91. package/types/raqm-ui-input-otp.d.ts +1 -0
  92. package/types/raqm-ui-resizable.d.ts +4 -0
  93. package/types/raqm-ui-rolldown-runtime-C25Le4-w.d.ts +1 -0
  94. package/types/raqm-ui-scroll-area.d.ts +11 -0
  95. package/types/raqm-ui-slider.d.ts +1 -1
  96. package/types/raqm-ui-toast.d.ts +6 -0
  97. package/types/raqm-ui.d.ts +1 -0
  98. package/fesm2022/raqm-ui-carousel.mjs +0 -410
  99. package/fesm2022/raqm-ui-carousel.mjs.map +0 -1
  100. package/types/raqm-ui-carousel.d.ts +0 -81
@@ -320,7 +320,6 @@ var RaqmToastComponent = class RaqmToastComponent {
320
320
  ngImport: i0,
321
321
  template: "<ng-content />",
322
322
  isInline: true,
323
- styles: [""],
324
323
  changeDetection: i0.ChangeDetectionStrategy.OnPush
325
324
  });
326
325
  };
@@ -539,7 +538,6 @@ var RaqmToastCloseComponent = class RaqmToastCloseComponent {
539
538
  ngImport: i0,
540
539
  template: "<ng-content><svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m18 6-12 12M6 6l12 12\" /></svg></ng-content>",
541
540
  isInline: true,
542
- styles: [""],
543
541
  changeDetection: i0.ChangeDetectionStrategy.OnPush
544
542
  });
545
543
  };
@@ -594,7 +592,6 @@ var RaqmToastIconComponent = class RaqmToastIconComponent {
594
592
  },
595
593
  ngImport: i0,
596
594
  template: "@if (type()) {\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"16\"\r\n height=\"16\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n focusable=\"false\"\r\n >\r\n @switch (type()) {\r\n @case ('success') {\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"m9 12 2 2 4-4\" />\r\n }\r\n @case ('info') {\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 16v-4M12 8h.01\" />\r\n }\r\n @case ('warning') {\r\n <path\r\n d=\"m10.3 3.9-8.1 14A2 2 0 0 0 3.9 21h16.2a2 2 0 0 0 1.7-3.1l-8.1-14a2 2 0 0 0-3.4 0ZM12 9v4M12 17h.01\"\r\n />\r\n }\r\n @case ('error') {\r\n <path d=\"m7.86 2-5.86 5.86v8.28l5.86 5.86h8.28l5.86-5.86V7.86L16.14 2ZM9 9l6 6M15 9l-6 6\" />\r\n }\r\n @case ('loading') {\r\n <path d=\"M12 2a10 10 0 1 1-7.07 2.93\" />\r\n }\r\n }\r\n </svg>\r\n}\r\n",
597
- styles: [""],
598
595
  changeDetection: i0.ChangeDetectionStrategy.OnPush
599
596
  });
600
597
  };
@@ -636,6 +633,10 @@ var RaqmToasterComponent = class RaqmToasterComponent {
636
633
  panel = viewChild.required("panel", ...ngDevMode ? [{ debugName: "panel" }] : /* istanbul ignore next */ []);
637
634
  overlayRef;
638
635
  observer;
636
+ observedContents = /* @__PURE__ */ new Set();
637
+ appliedDirection = "ltr";
638
+ renderedSnapshot;
639
+ measuredRootsKey;
639
640
  announcementTimer;
640
641
  previousFocus = null;
641
642
  hovered = false;
@@ -651,7 +652,8 @@ var RaqmToasterComponent = class RaqmToasterComponent {
651
652
  constructor() {
652
653
  afterNextRender(() => {
653
654
  if (!this.service.claimViewport(this)) return;
654
- const dir = this.document.defaultView?.getComputedStyle(this.host.nativeElement).direction === "rtl" ? "rtl" : "ltr";
655
+ this.appliedDirection = this.resolveDirection();
656
+ const dir = this.appliedDirection;
655
657
  this.overlayRef = this.overlay.create({
656
658
  positionStrategy: this.overlay.position().global(),
657
659
  scrollStrategy: this.overlay.scrollStrategies.noop(),
@@ -668,13 +670,25 @@ var RaqmToasterComponent = class RaqmToasterComponent {
668
670
  afterEveryRender(() => {
669
671
  const pane = this.overlayRef?.overlayElement;
670
672
  if (!pane) return;
671
- const retained = new Set(this.service.renderedToasts().map((t) => t.id));
672
- for (const id of this.indices.keys()) if (!retained.has(id)) this.indices.delete(id);
673
- const dir = this.document.defaultView?.getComputedStyle(this.host.nativeElement).direction === "rtl" ? "rtl" : "ltr";
674
- this.overlayRef?.setDirection(dir);
675
- this.observer?.disconnect();
676
- pane.querySelectorAll(".raqm-toast-content").forEach((element) => this.observer?.observe(element));
677
- this.measure();
673
+ const dir = this.resolveDirection();
674
+ if (dir !== this.appliedDirection) {
675
+ this.appliedDirection = dir;
676
+ this.overlayRef?.setDirection(dir);
677
+ }
678
+ let measureNeeded = !this.observer;
679
+ const rendered = this.service.renderedToasts();
680
+ if (rendered !== this.renderedSnapshot) {
681
+ this.renderedSnapshot = rendered;
682
+ const retained = new Set(rendered.map((t) => t.id));
683
+ for (const id of this.indices.keys()) if (!retained.has(id)) this.indices.delete(id);
684
+ const rootsKey = JSON.stringify(rendered.filter((t) => !t.ending).map((t) => [t.id, t.updateKey]));
685
+ if (rootsKey !== this.measuredRootsKey) {
686
+ this.measuredRootsKey = rootsKey;
687
+ measureNeeded = true;
688
+ }
689
+ this.syncObservedContents(pane);
690
+ }
691
+ if (measureNeeded) this.measure();
678
692
  });
679
693
  effect(() => {
680
694
  const toasts = this.service.visibleToasts();
@@ -702,6 +716,7 @@ var RaqmToasterComponent = class RaqmToasterComponent {
702
716
  this.restoreFocus();
703
717
  this.document.removeEventListener("keydown", this.onDocumentKeydown);
704
718
  this.observer?.disconnect();
719
+ this.observedContents.clear();
705
720
  if (this.announcementTimer !== void 0) clearTimeout(this.announcementTimer);
706
721
  this.overlayRef?.dispose();
707
722
  this.service.releaseViewport(this);
@@ -738,16 +753,41 @@ var RaqmToasterComponent = class RaqmToasterComponent {
738
753
  });
739
754
  this.service.pauseViewport(this, this.hovered || this.focused || this.swiping);
740
755
  }
756
+ resolveDirection() {
757
+ return this.document.defaultView?.getComputedStyle(this.host.nativeElement).direction === "rtl" ? "rtl" : "ltr";
758
+ }
759
+ syncObservedContents(pane) {
760
+ const previous = this.observedContents;
761
+ const current = new Set(pane.querySelectorAll(".raqm-toast-content"));
762
+ let stable = current.size === previous.size;
763
+ if (stable) {
764
+ for (const element of current) if (!previous.has(element)) {
765
+ stable = false;
766
+ break;
767
+ }
768
+ }
769
+ if (stable) return false;
770
+ for (const element of previous) if (!current.has(element)) this.observer?.unobserve(element);
771
+ for (const element of current) if (!previous.has(element)) this.observer?.observe(element);
772
+ this.observedContents = current;
773
+ return true;
774
+ }
741
775
  measure() {
742
776
  const viewport = this.overlayRef?.overlayElement.querySelector(".raqm-toast-viewport");
743
- const roots = Array.from(viewport?.querySelectorAll(".raqm-toast:not([data-raqm-ending-style])") ?? []);
744
- const frontHeight = roots[0]?.querySelector(".raqm-toast-content")?.offsetHeight;
745
- if (viewport && frontHeight) viewport.style.setProperty("--toast-frontmost-height", `${frontHeight + 2}px`);
746
- let offset = 0;
747
- for (const root of roots) {
748
- root.style.setProperty("--toast-offset-y", `${offset}px`);
749
- offset += (root.querySelector(".raqm-toast-content")?.offsetHeight ?? 0) + 2;
777
+ if (!viewport) return;
778
+ const roots = Array.from(viewport.querySelectorAll(".raqm-toast:not([data-raqm-ending-style])"));
779
+ const heights = roots.map((root) => root.querySelector(".raqm-toast-content")?.offsetHeight ?? 0);
780
+ const frontHeight = heights[0];
781
+ if (frontHeight) {
782
+ const next = `${frontHeight + 2}px`;
783
+ if (viewport.style.getPropertyValue("--toast-frontmost-height") !== next) viewport.style.setProperty("--toast-frontmost-height", next);
750
784
  }
785
+ let offset = 0;
786
+ roots.forEach((root, index) => {
787
+ const next = `${offset}px`;
788
+ if (root.style.getPropertyValue("--toast-offset-y") !== next) root.style.setProperty("--toast-offset-y", next);
789
+ offset += (heights[index] ?? 0) + 2;
790
+ });
751
791
  }
752
792
  ensureFocus(toasts) {
753
793
  const root = this.document.activeElement?.closest(".raqm-toast");
@@ -812,7 +852,7 @@ var RaqmToasterComponent = class RaqmToasterComponent {
812
852
  }],
813
853
  ngImport: i0,
814
854
  template: "<ng-template #panel>\r\n <section\r\n class=\"raqm-toast-viewport\"\r\n [attr.aria-label]=\"label()\"\r\n tabindex=\"-1\"\r\n (mouseenter)=\"hover(true)\"\r\n (mouseleave)=\"hover(false)\"\r\n (focusin)=\"focusIn($event)\"\r\n (focusout)=\"focusOut($event)\"\r\n >\r\n <div class=\"raqm-toast-announcer\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {{ announcement() }}\r\n </div>\r\n @for (toast of service.renderedToasts(); track toast.id) {\r\n <raqm-toast\r\n [toast]=\"toast\"\r\n (swipingChange)=\"swipe($event)\"\r\n [attr.data-raqm-toast-id]=\"toast.id\"\r\n [style.--toast-index]=\"toastIndex(toast)\"\r\n [attr.data-raqm-ending-style]=\"toast.ending ? '' : null\"\r\n [attr.inert]=\"toast.ending ? '' : null\"\r\n [attr.aria-hidden]=\"toast.ending ? 'true' : null\"\r\n [attr.data-raqm-expanded]=\"expanded() ? '' : null\"\r\n [attr.data-raqm-behind]=\"toastIndex(toast) > 0 ? '' : null\"\r\n [attr.aria-labelledby]=\"toast.title ? toast.id + '-title' : null\"\r\n [attr.aria-describedby]=\"toast.description ? toast.id + '-description' : null\"\r\n >\r\n <div raqm-toast-content>\r\n @if (toast.type) {\r\n <raqm-toast-icon [type]=\"toast.type\" />\r\n }\r\n <div class=\"raqm-toast-text\">\r\n @if (toast.title) {\r\n <h2 raqm-toast-title [id]=\"toast.id + '-title'\">{{ toast.title }}</h2>\r\n }\r\n @if (toast.description) {\r\n <p raqm-toast-description [id]=\"toast.id + '-description'\">{{ toast.description }}</p>\r\n }\r\n </div>\r\n @if (toast.action; as actionOptions) {\r\n <button\r\n raqm-toast-action\r\n [disabled]=\"actionOptions.disabled ?? false\"\r\n (click)=\"action(toast, $event)\"\r\n >\r\n {{ actionOptions.label }}\r\n </button>\r\n }\r\n <button raqm-toast-close [attr.aria-label]=\"closeLabel()\"></button>\r\n </div>\r\n </raqm-toast>\r\n }\r\n </section>\r\n</ng-template>\r\n",
815
- styles: [":host{display:contents}.raqm-toast-viewport{position:fixed;inset-inline:1rem;inset-block-end:1rem;z-index:50;inline-size:auto;max-inline-size:24rem;margin-inline:auto;outline:none;pointer-events:none}.raqm-toast-announcer{position:absolute;inline-size:1px;block-size:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@media(min-width:640px){.raqm-toast-viewport{inset-inline-start:auto;inline-size:100%;margin-inline:0}}\n"],
855
+ styles: [":host{display:contents}.raqm-toast-viewport{position:fixed;inset-inline:1rem;inset-block-end:1rem;z-index:50;inline-size:auto;max-inline-size:24rem;margin-inline:auto;outline:none;pointer-events:none}.raqm-toast-announcer{position:absolute;inline-size:1px;block-size:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@media(min-width:640px){.raqm-toast-viewport{inset-inline-start:auto;inline-size:100%;margin-inline:0}}.raqm-toast{position:absolute;inset-inline-end:0;inset-block-end:0;inline-size:100%;border:1px solid var(--raqm-border);border-radius:var(--raqm-radius-2xl);background:var(--raqm-popover);color:var(--raqm-popover-foreground);box-shadow:var(--raqm-shadow-lg);outline:none;-webkit-user-select:none;user-select:none;touch-action:none;pointer-events:auto;transform-origin:bottom;z-index:calc(1000 - var(--toast-index, 0));block-size:var(--toast-frontmost-height, auto);transform:translateY(calc(var(--toast-index, 0) * -.75rem - var(--toast-index, 0) * .1 * var(--toast-frontmost-height, 0px))) scale(calc(1 - var(--toast-index, 0) * .1));transition:transform .5s cubic-bezier(.22,1,.36,1),block-size .15s;animation:raqm-toast-enter .5s cubic-bezier(.22,1,.36,1)}.raqm-toast[data-raqm-expanded]{block-size:auto;transform:translateY(calc(var(--toast-offset-y, 0px) * -1 - var(--toast-index, 0) * .75rem))}.raqm-toast:after{content:\"\";position:absolute;inset-block-start:100%;inset-inline:0;block-size:calc(.75rem + 1px)}.raqm-toast:focus-visible{border-color:var(--raqm-ring);box-shadow:0 0 0 3px color-mix(in oklch,var(--raqm-ring) 50%,transparent)}.raqm-toast[data-raqm-swiping]{transition:none;animation:none}.raqm-toast[data-raqm-ending-style]{pointer-events:none;animation:none;transform:translateY(150%)}.raqm-toast[data-raqm-ending-style][data-raqm-swipe-direction=down]{transform:translateY(calc(var(--toast-swipe-movement-y, 0px) + 150%))}.raqm-toast[data-raqm-ending-style][data-raqm-swipe-direction=right]{transform:translate(calc(var(--toast-swipe-movement-x, 0px) + 150%)) translateY(calc(var(--toast-offset-y, 0px) * -1 - var(--toast-index, 0) * .75rem))}.raqm-toast-content{display:flex;align-items:center;gap:.75rem;padding:1rem;overflow:hidden;transition:opacity .25s cubic-bezier(.22,1,.36,1)}.raqm-toast[data-raqm-behind]:not([data-raqm-expanded]) .raqm-toast-content{opacity:0}.raqm-toast[data-raqm-behind]:not([data-raqm-expanded]):focus-within .raqm-toast-content{opacity:1;transition:none}.raqm-toast-action,.raqm-toast-close{touch-action:manipulation}.raqm-toast-text{display:flex;flex:1;min-inline-size:0;flex-direction:column;gap:.25rem}.raqm-toast-title,.raqm-toast-description{margin:0;font-size:var(--raqm-font-size-sm);line-height:1.25rem;overflow-wrap:anywhere}.raqm-toast-title{font-weight:500}.raqm-toast-description{color:var(--raqm-muted-foreground)}.raqm-toast-action,.raqm-toast-close,.raqm-toast-icon{flex-shrink:0}.raqm-toast-close{position:relative;color:var(--raqm-muted-foreground)}.raqm-toast-close:after{content:\"\";position:absolute;inset:-.5rem}.raqm-toast-close:hover{color:var(--raqm-foreground)}.raqm-toast-icon{display:inline-flex}.raqm-toast-icon[data-raqm-type=error]{color:var(--raqm-destructive)}.raqm-toast-icon[data-raqm-type=loading]{animation:raqm-toast-spin 1s linear infinite}@keyframes raqm-toast-spin{to{transform:rotate(360deg)}}@keyframes raqm-toast-enter{0%{transform:translateY(150%)}}@media(prefers-reduced-motion:reduce){.raqm-toast,.raqm-toast-content,.raqm-toast-icon{animation:none;transition:none}}\n"],
816
856
  dependencies: [
817
857
  {
818
858
  kind: "component",
@@ -876,7 +916,7 @@ i0.ɵɵngDeclareClassMetadata({
876
916
  selector: "raqm-toaster",
877
917
  changeDetection: ChangeDetectionStrategy.OnPush,
878
918
  template: "<ng-template #panel>\r\n <section\r\n class=\"raqm-toast-viewport\"\r\n [attr.aria-label]=\"label()\"\r\n tabindex=\"-1\"\r\n (mouseenter)=\"hover(true)\"\r\n (mouseleave)=\"hover(false)\"\r\n (focusin)=\"focusIn($event)\"\r\n (focusout)=\"focusOut($event)\"\r\n >\r\n <div class=\"raqm-toast-announcer\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {{ announcement() }}\r\n </div>\r\n @for (toast of service.renderedToasts(); track toast.id) {\r\n <raqm-toast\r\n [toast]=\"toast\"\r\n (swipingChange)=\"swipe($event)\"\r\n [attr.data-raqm-toast-id]=\"toast.id\"\r\n [style.--toast-index]=\"toastIndex(toast)\"\r\n [attr.data-raqm-ending-style]=\"toast.ending ? '' : null\"\r\n [attr.inert]=\"toast.ending ? '' : null\"\r\n [attr.aria-hidden]=\"toast.ending ? 'true' : null\"\r\n [attr.data-raqm-expanded]=\"expanded() ? '' : null\"\r\n [attr.data-raqm-behind]=\"toastIndex(toast) > 0 ? '' : null\"\r\n [attr.aria-labelledby]=\"toast.title ? toast.id + '-title' : null\"\r\n [attr.aria-describedby]=\"toast.description ? toast.id + '-description' : null\"\r\n >\r\n <div raqm-toast-content>\r\n @if (toast.type) {\r\n <raqm-toast-icon [type]=\"toast.type\" />\r\n }\r\n <div class=\"raqm-toast-text\">\r\n @if (toast.title) {\r\n <h2 raqm-toast-title [id]=\"toast.id + '-title'\">{{ toast.title }}</h2>\r\n }\r\n @if (toast.description) {\r\n <p raqm-toast-description [id]=\"toast.id + '-description'\">{{ toast.description }}</p>\r\n }\r\n </div>\r\n @if (toast.action; as actionOptions) {\r\n <button\r\n raqm-toast-action\r\n [disabled]=\"actionOptions.disabled ?? false\"\r\n (click)=\"action(toast, $event)\"\r\n >\r\n {{ actionOptions.label }}\r\n </button>\r\n }\r\n <button raqm-toast-close [attr.aria-label]=\"closeLabel()\"></button>\r\n </div>\r\n </raqm-toast>\r\n }\r\n </section>\r\n</ng-template>\r\n",
879
- styles: [":host{display:contents}.raqm-toast-viewport{position:fixed;inset-inline:1rem;inset-block-end:1rem;z-index:50;inline-size:auto;max-inline-size:24rem;margin-inline:auto;outline:none;pointer-events:none}.raqm-toast-announcer{position:absolute;inline-size:1px;block-size:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@media(min-width:640px){.raqm-toast-viewport{inset-inline-start:auto;inline-size:100%;margin-inline:0}}\n"]
919
+ styles: [":host{display:contents}.raqm-toast-viewport{position:fixed;inset-inline:1rem;inset-block-end:1rem;z-index:50;inline-size:auto;max-inline-size:24rem;margin-inline:auto;outline:none;pointer-events:none}.raqm-toast-announcer{position:absolute;inline-size:1px;block-size:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@media(min-width:640px){.raqm-toast-viewport{inset-inline-start:auto;inline-size:100%;margin-inline:0}}.raqm-toast{position:absolute;inset-inline-end:0;inset-block-end:0;inline-size:100%;border:1px solid var(--raqm-border);border-radius:var(--raqm-radius-2xl);background:var(--raqm-popover);color:var(--raqm-popover-foreground);box-shadow:var(--raqm-shadow-lg);outline:none;-webkit-user-select:none;user-select:none;touch-action:none;pointer-events:auto;transform-origin:bottom;z-index:calc(1000 - var(--toast-index, 0));block-size:var(--toast-frontmost-height, auto);transform:translateY(calc(var(--toast-index, 0) * -.75rem - var(--toast-index, 0) * .1 * var(--toast-frontmost-height, 0px))) scale(calc(1 - var(--toast-index, 0) * .1));transition:transform .5s cubic-bezier(.22,1,.36,1),block-size .15s;animation:raqm-toast-enter .5s cubic-bezier(.22,1,.36,1)}.raqm-toast[data-raqm-expanded]{block-size:auto;transform:translateY(calc(var(--toast-offset-y, 0px) * -1 - var(--toast-index, 0) * .75rem))}.raqm-toast:after{content:\"\";position:absolute;inset-block-start:100%;inset-inline:0;block-size:calc(.75rem + 1px)}.raqm-toast:focus-visible{border-color:var(--raqm-ring);box-shadow:0 0 0 3px color-mix(in oklch,var(--raqm-ring) 50%,transparent)}.raqm-toast[data-raqm-swiping]{transition:none;animation:none}.raqm-toast[data-raqm-ending-style]{pointer-events:none;animation:none;transform:translateY(150%)}.raqm-toast[data-raqm-ending-style][data-raqm-swipe-direction=down]{transform:translateY(calc(var(--toast-swipe-movement-y, 0px) + 150%))}.raqm-toast[data-raqm-ending-style][data-raqm-swipe-direction=right]{transform:translate(calc(var(--toast-swipe-movement-x, 0px) + 150%)) translateY(calc(var(--toast-offset-y, 0px) * -1 - var(--toast-index, 0) * .75rem))}.raqm-toast-content{display:flex;align-items:center;gap:.75rem;padding:1rem;overflow:hidden;transition:opacity .25s cubic-bezier(.22,1,.36,1)}.raqm-toast[data-raqm-behind]:not([data-raqm-expanded]) .raqm-toast-content{opacity:0}.raqm-toast[data-raqm-behind]:not([data-raqm-expanded]):focus-within .raqm-toast-content{opacity:1;transition:none}.raqm-toast-action,.raqm-toast-close{touch-action:manipulation}.raqm-toast-text{display:flex;flex:1;min-inline-size:0;flex-direction:column;gap:.25rem}.raqm-toast-title,.raqm-toast-description{margin:0;font-size:var(--raqm-font-size-sm);line-height:1.25rem;overflow-wrap:anywhere}.raqm-toast-title{font-weight:500}.raqm-toast-description{color:var(--raqm-muted-foreground)}.raqm-toast-action,.raqm-toast-close,.raqm-toast-icon{flex-shrink:0}.raqm-toast-close{position:relative;color:var(--raqm-muted-foreground)}.raqm-toast-close:after{content:\"\";position:absolute;inset:-.5rem}.raqm-toast-close:hover{color:var(--raqm-foreground)}.raqm-toast-icon{display:inline-flex}.raqm-toast-icon[data-raqm-type=error]{color:var(--raqm-destructive)}.raqm-toast-icon[data-raqm-type=loading]{animation:raqm-toast-spin 1s linear infinite}@keyframes raqm-toast-spin{to{transform:rotate(360deg)}}@keyframes raqm-toast-enter{0%{transform:translateY(150%)}}@media(prefers-reduced-motion:reduce){.raqm-toast,.raqm-toast-content,.raqm-toast-icon{animation:none;transition:none}}\n"]
880
920
  }]
881
921
  }],
882
922
  ctorParameters: () => [],
@@ -1 +1 @@
1
- {"version":3,"file":"raqm-ui-toast.mjs","names":[],"sources":["../../../projects/ui/toast/toast.service.ts","../../../projects/ui/toast/toast.component.ts","../../../projects/ui/toast/toast-icon.component.html","../../../projects/ui/toast/toaster.component.ts","../../../projects/ui/toast/toaster.component.html","../../../projects/ui/toast/public-api.ts"],"sourcesContent":["import {\r\n DOCUMENT,\r\n Injectable,\r\n OnDestroy,\r\n PLATFORM_ID,\r\n computed,\r\n inject,\r\n signal,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\nexport type RaqmToastId = string;\r\nexport type RaqmToastType = 'success' | 'info' | 'warning' | 'error' | 'loading';\r\n/** Native action; its callback explicitly owns dismissal. */\r\nexport interface RaqmToastActionOptions {\r\n readonly label: string;\r\n readonly onClick: (id: RaqmToastId, event: MouseEvent) => void;\r\n readonly disabled?: boolean;\r\n}\r\n/** Text notification options; a timeout of 0 disables automatic dismissal. */\r\nexport interface RaqmToastOptions {\r\n readonly id?: RaqmToastId;\r\n readonly title?: string;\r\n readonly description?: string;\r\n readonly type?: RaqmToastType;\r\n readonly timeout?: number;\r\n readonly action?: RaqmToastActionOptions;\r\n readonly onClose?: () => void;\r\n}\r\n/** Immutable notification state; updates preserve its id and increment updateKey. */\r\nexport interface RaqmToastRecord extends Omit<RaqmToastOptions, 'id' | 'timeout'> {\r\n readonly id: RaqmToastId;\r\n readonly timeout: number;\r\n readonly updateKey: number;\r\n readonly ending?: boolean;\r\n}\r\ninterface ToastClock {\r\n remaining: number;\r\n started: number;\r\n timer?: ReturnType<typeof setTimeout>;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class RaqmToastService implements OnDestroy {\r\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\r\n private readonly records = signal<readonly RaqmToastRecord[]>([]);\r\n private readonly clocks = new Map<RaqmToastId, ToastClock>();\r\n private readonly document = inject(DOCUMENT);\r\n private readonly exits = new Map<RaqmToastId, ReturnType<typeof setTimeout>>();\r\n private owner: object | null = null;\r\n private paused = false;\r\n private nextId = 0;\r\n private destroyed = false;\r\n /** Newest first; older records queue behind the visible three. */\r\n readonly toasts = this.records.asReadonly();\r\n readonly visibleToasts = computed(() =>\r\n this.toasts()\r\n .filter((t) => !t.ending)\r\n .slice(0, 3),\r\n );\r\n /** Visible roots plus retained, inert roots finishing the exit. */\r\n readonly renderedToasts = computed(() => {\r\n const visible = new Set(this.visibleToasts().map((t) => t.id));\r\n return this.toasts().filter((t) => t.ending || visible.has(t.id));\r\n });\r\n\r\n /** Adds a notification, or upserts an existing explicit id without duplication. */\r\n show(options: RaqmToastOptions): RaqmToastId {\r\n const id = options.id ?? this.createId();\r\n if (this.destroyed) return id;\r\n if (this.records().some((toast) => toast.id === id)) {\r\n this.update(id, options);\r\n return id;\r\n }\r\n const toast = { ...options, id, timeout: this.timeout(options.timeout), updateKey: 0 };\r\n this.records.update((records) => [toast, ...records]);\r\n this.clocks.set(id, { remaining: toast.timeout, started: 0 });\r\n this.syncClocks();\r\n return id;\r\n }\r\n success(options: Omit<RaqmToastOptions, 'type'>): RaqmToastId {\r\n return this.show({ ...options, type: 'success' });\r\n }\r\n error(options: Omit<RaqmToastOptions, 'type'>): RaqmToastId {\r\n return this.show({ ...options, type: 'error' });\r\n }\r\n /** Updates one id for loading → success/error workflows; dismissed ids stay dismissed. */\r\n update(id: RaqmToastId, options: Partial<Omit<RaqmToastOptions, 'id'>>): void {\r\n const previous = this.records().find((toast) => toast.id === id);\r\n if (!previous || previous.ending) return;\r\n const timeout = this.timeout(options.timeout ?? previous.timeout);\r\n this.stopClock(id);\r\n this.records.update((records) =>\r\n records.map((toast) =>\r\n toast.id === id\r\n ? { ...toast, ...options, id, timeout, updateKey: toast.updateKey + 1 }\r\n : toast,\r\n ),\r\n );\r\n this.clocks.set(id, { remaining: timeout, started: 0 });\r\n this.syncClocks();\r\n }\r\n /** Dismisses one notification, or all notifications when no id is supplied. */\r\n dismiss(id?: RaqmToastId): void {\r\n const visible = new Set(this.visibleToasts().map((t) => t.id));\r\n const removed = this.records().filter(\r\n (toast) => !toast.ending && (id === undefined || toast.id === id),\r\n );\r\n const animate =\r\n this.browser &&\r\n this.owner !== null &&\r\n !this.document.defaultView?.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n for (const toast of removed) {\r\n this.stopClock(toast.id);\r\n this.clocks.delete(toast.id);\r\n }\r\n this.records.update((records) =>\r\n records.flatMap((toast) =>\r\n !removed.includes(toast)\r\n ? [toast]\r\n : animate && visible.has(toast.id)\r\n ? [{ ...toast, ending: true }]\r\n : [],\r\n ),\r\n );\r\n for (const toast of removed) {\r\n if (animate && visible.has(toast.id))\r\n this.exits.set(\r\n toast.id,\r\n setTimeout(() => {\r\n this.exits.delete(toast.id);\r\n this.records.update((records) => records.filter((record) => record.id !== toast.id));\r\n }, 500),\r\n );\r\n }\r\n this.syncClocks();\r\n for (const toast of removed) toast.onClose?.();\r\n }\r\n /** Internal host ownership guard: duplicate hosts never create duplicate overlays. */\r\n claimViewport(owner: object): boolean {\r\n if (this.owner !== null && this.owner !== owner) return false;\r\n this.owner = owner;\r\n this.syncClocks();\r\n return true;\r\n }\r\n releaseViewport(owner: object): void {\r\n if (this.owner !== owner) return;\r\n this.owner = null;\r\n for (const timer of this.exits.values()) clearTimeout(timer);\r\n this.exits.clear();\r\n this.records.update((records) => records.filter((t) => !t.ending));\r\n this.paused = false;\r\n this.syncClocks();\r\n }\r\n pauseViewport(owner: object, paused: boolean): void {\r\n if (this.owner !== owner) return;\r\n this.paused = paused;\r\n this.syncClocks();\r\n }\r\n ngOnDestroy(): void {\r\n this.destroyed = true;\r\n for (const id of this.clocks.keys()) this.stopClock(id);\r\n this.clocks.clear();\r\n for (const timer of this.exits.values()) clearTimeout(timer);\r\n this.exits.clear();\r\n this.records.set([]);\r\n this.owner = null;\r\n }\r\n private timeout(value = 5000): number {\r\n return Number.isFinite(value) ? Math.max(0, Math.min(value, 2147483647)) : 5000;\r\n }\r\n private createId(): string {\r\n let id: string;\r\n do {\r\n id = `raqm-toast-${++this.nextId}`;\r\n } while (this.records().some((toast) => toast.id === id));\r\n return id;\r\n }\r\n private stopClock(id: RaqmToastId): void {\r\n const clock = this.clocks.get(id);\r\n if (clock?.timer !== undefined) {\r\n clearTimeout(clock.timer);\r\n clock.timer = undefined;\r\n clock.remaining = Math.max(0, clock.remaining - (Date.now() - clock.started));\r\n }\r\n }\r\n private syncClocks(): void {\r\n const visible = new Set(this.visibleToasts().map((toast) => toast.id));\r\n for (const [id, clock] of this.clocks) {\r\n if (!this.browser || !this.owner || this.paused || !visible.has(id)) {\r\n this.stopClock(id);\r\n } else if (clock.timer === undefined && this.records().find((t) => t.id === id)?.timeout) {\r\n clock.started = Date.now();\r\n clock.timer = setTimeout(() => {\r\n clock.timer = undefined;\r\n this.dismiss(id);\r\n }, clock.remaining);\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Directive,\r\n ElementRef,\r\n OnDestroy,\r\n inject,\r\n input,\r\n output,\r\n effect,\r\n} from '@angular/core';\r\nimport { RaqmToastRecord, RaqmToastService, RaqmToastType } from './toast.service';\r\n\r\n/** Composable notification root; never takes focus automatically. */\r\n@Component({\r\n selector: 'raqm-toast',\r\n template: '<ng-content />',\r\n styleUrl: './toast.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-toast',\r\n tabindex: '-1',\r\n role: 'group',\r\n '[attr.data-raqm-type]': 'toast().type',\r\n '(keydown.escape)': 'dismiss($event)',\r\n '(pointerdown)': 'pointerDown($event)',\r\n '(pointermove)': 'pointerMove($event)',\r\n '(pointerup)': 'pointerEnd($event)',\r\n '(pointercancel)': 'pointerEnd($event)',\r\n '(lostpointercapture)': 'pointerEnd($event)',\r\n },\r\n})\r\nexport class RaqmToastComponent implements OnDestroy {\r\n readonly toast = input.required<RaqmToastRecord>();\r\n /** Internal viewport clock-pause signal for captured touch or mouse gestures. */\r\n readonly swipingChange = output<boolean>();\r\n private readonly service = inject(RaqmToastService);\r\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n private pointer: number | null = null;\r\n private start = { x: 0, y: 0 };\r\n private initial = '';\r\n private axis: 'x' | 'y' | null = null;\r\n private firstMove = true;\r\n private maximum = 0;\r\n private baseline = { x: 0, y: 0 };\r\n private intended = false;\r\n private cancelled = false;\r\n private delta = 0;\r\n constructor() {\r\n effect(() => {\r\n if (this.toast().ending) this.releasePointer();\r\n });\r\n }\r\n protected pointerDown(event: PointerEvent): void {\r\n if (\r\n event.button !== 0 ||\r\n this.pointer !== null ||\r\n this.toast().ending ||\r\n (event.target as HTMLElement).closest(\r\n 'button,a,input,textarea,select,[role=\"button\"],[contenteditable],[data-base-ui-swipe-ignore],[data-swipe-ignore]',\r\n )\r\n )\r\n return;\r\n try {\r\n this.element.setPointerCapture(event.pointerId);\r\n } catch {\r\n return;\r\n }\r\n this.pointer = event.pointerId;\r\n this.swipingChange.emit(true);\r\n this.start = { x: event.clientX, y: event.clientY };\r\n this.baseline = { ...this.start };\r\n this.intended = false;\r\n this.initial =\r\n this.element.ownerDocument.defaultView?.getComputedStyle(this.element).transform ?? '';\r\n this.axis = null;\r\n this.firstMove = true;\r\n this.maximum = this.delta = 0;\r\n this.cancelled = false;\r\n this.element.setAttribute('data-raqm-swiping', '');\r\n }\r\n protected pointerMove(event: PointerEvent): void {\r\n if (event.pointerId !== this.pointer) return;\r\n event.preventDefault();\r\n if (this.firstMove) {\r\n this.start = { x: event.clientX, y: event.clientY };\r\n this.firstMove = false;\r\n }\r\n const x = event.clientX - this.start.x;\r\n const y = event.clientY - this.start.y;\r\n if (\r\n (event.movementX < 0 && event.clientX > this.baseline.x) ||\r\n (event.movementX > 0 && event.clientX < this.baseline.x)\r\n )\r\n this.baseline.x = event.clientX;\r\n if (\r\n (event.movementY < 0 && event.clientY > this.baseline.y) ||\r\n (event.movementY > 0 && event.clientY < this.baseline.y)\r\n )\r\n this.baseline.y = event.clientY;\r\n if (!this.axis && Math.hypot(x, y) >= 1) this.axis = Math.abs(x) > Math.abs(y) ? 'x' : 'y';\r\n this.delta = this.axis === 'x' ? x : this.axis === 'y' ? y : 0;\r\n if (!this.intended && this.delta > 0) {\r\n this.intended = true;\r\n this.maximum = this.delta;\r\n } else if (this.intended) {\r\n const displacement =\r\n this.axis === 'x' ? event.clientX - this.baseline.x : event.clientY - this.baseline.y;\r\n if (displacement > 40) this.cancelled = false;\r\n else if (this.maximum - displacement >= 10) this.cancelled = true;\r\n }\r\n const damped = this.delta < 0 ? -Math.sqrt(-this.delta) : this.delta;\r\n this.element.style.transform = `translate${this.axis === 'x' ? 'X' : 'Y'}(${damped}px) ${this.initial === 'none' ? '' : this.initial}`;\r\n this.element.style.setProperty(\r\n '--toast-swipe-movement-x',\r\n `${this.axis === 'x' ? damped : 0}px`,\r\n );\r\n this.element.style.setProperty(\r\n '--toast-swipe-movement-y',\r\n `${this.axis === 'y' ? damped : 0}px`,\r\n );\r\n }\r\n protected pointerEnd(event: PointerEvent): void {\r\n if (event.pointerId !== this.pointer) return;\r\n const dismiss = event.type === 'pointerup' && this.delta > 40 && !this.cancelled;\r\n const direction = this.axis === 'x' ? 'right' : 'down';\r\n this.releasePointer();\r\n if (dismiss) {\r\n this.element.setAttribute('data-raqm-swipe-direction', direction);\r\n this.dismiss();\r\n } else {\r\n this.element.style.removeProperty('--toast-swipe-movement-x');\r\n this.element.style.removeProperty('--toast-swipe-movement-y');\r\n }\r\n }\r\n ngOnDestroy(): void {\r\n this.releasePointer();\r\n }\r\n private releasePointer(): void {\r\n const pointer = this.pointer;\r\n this.pointer = null;\r\n if (pointer !== null) this.swipingChange.emit(false);\r\n if (pointer !== null && this.element.hasPointerCapture(pointer))\r\n this.element.releasePointerCapture(pointer);\r\n this.element.removeAttribute('data-raqm-swiping');\r\n this.element.style.removeProperty('transform');\r\n }\r\n /** Closes this record and contains Escape within the notification. */\r\n dismiss(event?: Event): void {\r\n event?.preventDefault();\r\n event?.stopPropagation();\r\n this.service.dismiss(this.toast().id);\r\n }\r\n}\r\n@Directive({\r\n selector: '[raqm-toast-title]',\r\n host: { class: 'raqm-toast-title' },\r\n})\r\nexport class RaqmToastTitleDirective {}\r\n\r\n@Directive({\r\n selector: '[raqm-toast-content]',\r\n host: { class: 'raqm-toast-content' },\r\n})\r\nexport class RaqmToastContentDirective {}\r\n@Directive({\r\n selector: '[raqm-toast-description]',\r\n host: { class: 'raqm-toast-description' },\r\n})\r\nexport class RaqmToastDescriptionDirective {}\r\n/** Native action; the consumer click callback owns its behavior and dismissal. */\r\n@Directive({\r\n selector: 'button[raqm-toast-action]',\r\n host: {\r\n class: 'raqm-toast-action raqm-button',\r\n 'data-raqm-variant': 'outline',\r\n 'data-raqm-size': 'sm',\r\n },\r\n})\r\nexport class RaqmToastActionDirective {\r\n constructor() {\r\n const element = inject<ElementRef<HTMLButtonElement>>(ElementRef).nativeElement;\r\n if (!element.hasAttribute('type')) element.type = 'button';\r\n }\r\n}\r\n/** Native close button operating on its enclosing toast; the application names it. */\r\n@Component({\r\n selector: 'button[raqm-toast-close]',\r\n template:\r\n '<ng-content><svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m18 6-12 12M6 6l12 12\" /></svg></ng-content>',\r\n styleUrl: './toast.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-toast-close raqm-button',\r\n 'data-raqm-variant': 'ghost',\r\n 'data-raqm-size': 'icon-sm',\r\n '(click)': 'root.dismiss()',\r\n },\r\n})\r\nexport class RaqmToastCloseComponent {\r\n protected readonly root = inject(RaqmToastComponent);\r\n constructor() {\r\n const element = inject<ElementRef<HTMLButtonElement>>(ElementRef).nativeElement;\r\n if (!element.hasAttribute('type')) element.type = 'button';\r\n }\r\n}\r\n/** Decorative inline status glyphs. */\r\n@Component({\r\n selector: 'raqm-toast-icon',\r\n templateUrl: './toast-icon.component.html',\r\n styleUrl: './toast.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { class: 'raqm-toast-icon', 'aria-hidden': 'true', '[attr.data-raqm-type]': 'type()' },\r\n})\r\nexport class RaqmToastIconComponent {\r\n readonly type = input<RaqmToastType>();\r\n}\r\n","@if (type()) {\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"16\"\r\n height=\"16\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n focusable=\"false\"\r\n >\r\n @switch (type()) {\r\n @case ('success') {\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"m9 12 2 2 4-4\" />\r\n }\r\n @case ('info') {\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 16v-4M12 8h.01\" />\r\n }\r\n @case ('warning') {\r\n <path\r\n d=\"m10.3 3.9-8.1 14A2 2 0 0 0 3.9 21h16.2a2 2 0 0 0 1.7-3.1l-8.1-14a2 2 0 0 0-3.4 0ZM12 9v4M12 17h.01\"\r\n />\r\n }\r\n @case ('error') {\r\n <path d=\"m7.86 2-5.86 5.86v8.28l5.86 5.86h8.28l5.86-5.86V7.86L16.14 2ZM9 9l6 6M15 9l-6 6\" />\r\n }\r\n @case ('loading') {\r\n <path d=\"M12 2a10 10 0 1 1-7.07 2.93\" />\r\n }\r\n }\r\n </svg>\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DOCUMENT,\r\n ElementRef,\r\n OnDestroy,\r\n TemplateRef,\r\n ViewContainerRef,\r\n afterEveryRender,\r\n afterNextRender,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport {\r\n RaqmToastComponent,\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastIconComponent,\r\n RaqmToastTitleDirective,\r\n} from './toast.component';\r\nimport { RaqmToastRecord, RaqmToastService } from './toast.service';\r\n\r\n/** Nonmodal CDK viewport; mounted once near the application root. */\r\n@Component({\r\n imports: [\r\n RaqmToastComponent,\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastIconComponent,\r\n RaqmToastTitleDirective,\r\n ],\r\n selector: 'raqm-toaster',\r\n styleUrl: './toaster.component.scss',\r\n templateUrl: './toaster.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class RaqmToasterComponent implements OnDestroy {\r\n /** Accessible name of the notification viewport region. */\r\n readonly label = input.required<string>();\r\n /** Accessible name of the close control the toaster renders for each toast. */\r\n readonly closeLabel = input.required<string>();\r\n protected readonly service = inject(RaqmToastService);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly overlay = inject(Overlay);\r\n private readonly container = inject(ViewContainerRef);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly panel = viewChild.required<TemplateRef<unknown>>('panel');\r\n private overlayRef?: OverlayRef;\r\n private observer?: ResizeObserver;\r\n private announcementTimer?: ReturnType<typeof setTimeout>;\r\n private previousFocus: HTMLElement | null = null;\r\n private hovered = false;\r\n private focused = false;\r\n private swiping = false;\r\n private readonly indices = new Map<string, number>();\r\n protected readonly expanded = signal(false);\r\n protected readonly announcement = signal('');\r\n protected readonly ready = signal(false);\r\n protected readonly announcementKey = computed(() =>\r\n this.service\r\n .visibleToasts()\r\n .map((t) => `${t.id}:${t.updateKey}`)\r\n .join('|'),\r\n );\r\n private announced = new Map<string, number>();\r\n private readonly pendingAnnouncements = new Map<string, RaqmToastRecord>();\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n if (!this.service.claimViewport(this)) return;\r\n const dir =\r\n this.document.defaultView?.getComputedStyle(this.host.nativeElement).direction === 'rtl'\r\n ? 'rtl'\r\n : 'ltr';\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy: this.overlay.position().global(),\r\n scrollStrategy: this.overlay.scrollStrategies.noop(),\r\n hasBackdrop: false,\r\n panelClass: 'raqm-toast-overlay-pane',\r\n direction: dir,\r\n });\r\n // The viewport owns fixed logical positioning; its zero-sized pane never intercepts the page.\r\n this.overlayRef.overlayElement.style.pointerEvents = 'none';\r\n this.overlayRef.attach(new TemplatePortal(this.panel(), this.container));\r\n this.document.addEventListener('keydown', this.onDocumentKeydown);\r\n if (typeof ResizeObserver !== 'undefined')\r\n this.observer = new ResizeObserver(() => this.measure());\r\n this.ready.set(true);\r\n });\r\n afterEveryRender(() => {\r\n const pane = this.overlayRef?.overlayElement;\r\n if (!pane) return;\r\n const retained = new Set(this.service.renderedToasts().map((t) => t.id));\r\n for (const id of this.indices.keys()) if (!retained.has(id)) this.indices.delete(id);\r\n const dir =\r\n this.document.defaultView?.getComputedStyle(this.host.nativeElement).direction === 'rtl'\r\n ? 'rtl'\r\n : 'ltr';\r\n this.overlayRef?.setDirection(dir);\r\n this.observer?.disconnect();\r\n pane\r\n .querySelectorAll('.raqm-toast-content')\r\n .forEach((element) => this.observer?.observe(element));\r\n this.measure();\r\n });\r\n effect(() => {\r\n const toasts = this.service.visibleToasts();\r\n // Runs before DOM removal so programmatic dismissal cannot strand focused controls.\r\n untracked(() => this.ensureFocus(toasts));\r\n });\r\n effect(() => {\r\n this.announcementKey();\r\n if (!this.ready()) return;\r\n untracked(() => {\r\n const fresh = this.service\r\n .visibleToasts()\r\n .filter((t) => this.announced.get(t.id) !== t.updateKey);\r\n this.announced = new Map(this.service.visibleToasts().map((t) => [t.id, t.updateKey]));\r\n if (!fresh.length) return;\r\n for (const toast of fresh) this.pendingAnnouncements.set(toast.id, toast);\r\n if (this.announcementTimer !== undefined) clearTimeout(this.announcementTimer);\r\n this.announcement.set('');\r\n this.announcementTimer = setTimeout(() => {\r\n this.announcementTimer = undefined;\r\n this.announcement.set(\r\n Array.from(this.pendingAnnouncements.values())\r\n .filter((t) =>\r\n this.service\r\n .visibleToasts()\r\n .some((current) => current.id === t.id && current.updateKey === t.updateKey),\r\n )\r\n .map((t) => [t.title, t.description].filter(Boolean).join('. '))\r\n .join('. '),\r\n );\r\n this.pendingAnnouncements.clear();\r\n }, 100);\r\n });\r\n });\r\n }\r\n ngOnDestroy(): void {\r\n this.restoreFocus();\r\n this.document.removeEventListener('keydown', this.onDocumentKeydown);\r\n this.observer?.disconnect();\r\n if (this.announcementTimer !== undefined) clearTimeout(this.announcementTimer);\r\n this.overlayRef?.dispose();\r\n this.service.releaseViewport(this);\r\n }\r\n protected hover(value: boolean): void {\r\n this.hovered = value;\r\n this.syncPause();\r\n }\r\n protected focusIn(event: FocusEvent): void {\r\n const previous = event.relatedTarget as HTMLElement | null;\r\n if (previous && !this.overlayRef?.overlayElement.contains(previous))\r\n this.previousFocus = previous;\r\n this.focused = true;\r\n this.syncPause();\r\n }\r\n protected focusOut(event: FocusEvent): void {\r\n this.focused =\r\n !!event.relatedTarget &&\r\n !!this.overlayRef?.overlayElement.contains(event.relatedTarget as Node);\r\n this.syncPause();\r\n }\r\n protected action(toast: RaqmToastRecord, event: MouseEvent): void {\r\n toast.action?.onClick(toast.id, event);\r\n }\r\n protected toastIndex(toast: RaqmToastRecord): number {\r\n if (!toast.ending)\r\n this.indices.set(\r\n toast.id,\r\n Math.max(\r\n 0,\r\n this.service.visibleToasts().findIndex((t) => t.id === toast.id),\r\n ),\r\n );\r\n return this.indices.get(toast.id) ?? 0;\r\n }\r\n protected swipe(value: boolean): void {\r\n this.swiping = value;\r\n this.syncPause();\r\n }\r\n private syncPause(): void {\r\n this.expanded.set(this.hovered || this.focused);\r\n // Focus-in reveals the content synchronously, before Angular's next render.\r\n this.overlayRef?.overlayElement.querySelectorAll<HTMLElement>('.raqm-toast').forEach((root) => {\r\n root.toggleAttribute('data-raqm-expanded', this.hovered || this.focused);\r\n });\r\n this.service.pauseViewport(this, this.hovered || this.focused || this.swiping);\r\n }\r\n private measure(): void {\r\n const viewport =\r\n this.overlayRef?.overlayElement.querySelector<HTMLElement>('.raqm-toast-viewport');\r\n const roots = Array.from(\r\n viewport?.querySelectorAll<HTMLElement>('.raqm-toast:not([data-raqm-ending-style])') ?? [],\r\n );\r\n const frontHeight = roots[0]?.querySelector<HTMLElement>('.raqm-toast-content')?.offsetHeight;\r\n if (viewport && frontHeight)\r\n viewport.style.setProperty('--toast-frontmost-height', `${frontHeight + 2}px`);\r\n let offset = 0;\r\n for (const root of roots) {\r\n root.style.setProperty('--toast-offset-y', `${offset}px`);\r\n offset += (root.querySelector<HTMLElement>('.raqm-toast-content')?.offsetHeight ?? 0) + 2;\r\n }\r\n }\r\n private ensureFocus(toasts: readonly RaqmToastRecord[]): void {\r\n const active = this.document.activeElement as HTMLElement | null;\r\n const root = active?.closest<HTMLElement>('.raqm-toast');\r\n if (!root || !this.overlayRef?.overlayElement.contains(root)) return;\r\n if (toasts.some((t) => t.id === root.dataset['raqmToastId'])) return;\r\n const next = Array.from(\r\n this.overlayRef.overlayElement.querySelectorAll<HTMLElement>('.raqm-toast'),\r\n ).find(\r\n (element) => element !== root && toasts.some((t) => t.id === element.dataset['raqmToastId']),\r\n );\r\n if (toasts.length && next) next.focus();\r\n else this.restoreFocus();\r\n }\r\n private restoreFocus(): void {\r\n if (!this.overlayRef?.overlayElement.contains(this.document.activeElement)) return;\r\n if (\r\n this.previousFocus?.isConnected &&\r\n !this.previousFocus.closest('[inert]') &&\r\n !this.previousFocus.matches(':disabled')\r\n ) {\r\n this.previousFocus.focus({ preventScroll: true });\r\n } else {\r\n (this.document.activeElement as HTMLElement | null)?.blur();\r\n }\r\n this.focused = false;\r\n this.syncPause();\r\n }\r\n private readonly onDocumentKeydown = (event: KeyboardEvent): void => {\r\n if (event.key !== 'F6' || !this.service.visibleToasts().length) return;\r\n event.preventDefault();\r\n if (this.overlayRef?.overlayElement.contains(this.document.activeElement)) this.restoreFocus();\r\n else {\r\n this.previousFocus = this.document.activeElement as HTMLElement | null;\r\n this.overlayRef?.overlayElement.querySelector<HTMLElement>('.raqm-toast')?.focus();\r\n }\r\n };\r\n}\r\n","<ng-template #panel>\r\n <section\r\n class=\"raqm-toast-viewport\"\r\n [attr.aria-label]=\"label()\"\r\n tabindex=\"-1\"\r\n (mouseenter)=\"hover(true)\"\r\n (mouseleave)=\"hover(false)\"\r\n (focusin)=\"focusIn($event)\"\r\n (focusout)=\"focusOut($event)\"\r\n >\r\n <div class=\"raqm-toast-announcer\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {{ announcement() }}\r\n </div>\r\n @for (toast of service.renderedToasts(); track toast.id) {\r\n <raqm-toast\r\n [toast]=\"toast\"\r\n (swipingChange)=\"swipe($event)\"\r\n [attr.data-raqm-toast-id]=\"toast.id\"\r\n [style.--toast-index]=\"toastIndex(toast)\"\r\n [attr.data-raqm-ending-style]=\"toast.ending ? '' : null\"\r\n [attr.inert]=\"toast.ending ? '' : null\"\r\n [attr.aria-hidden]=\"toast.ending ? 'true' : null\"\r\n [attr.data-raqm-expanded]=\"expanded() ? '' : null\"\r\n [attr.data-raqm-behind]=\"toastIndex(toast) > 0 ? '' : null\"\r\n [attr.aria-labelledby]=\"toast.title ? toast.id + '-title' : null\"\r\n [attr.aria-describedby]=\"toast.description ? toast.id + '-description' : null\"\r\n >\r\n <div raqm-toast-content>\r\n @if (toast.type) {\r\n <raqm-toast-icon [type]=\"toast.type\" />\r\n }\r\n <div class=\"raqm-toast-text\">\r\n @if (toast.title) {\r\n <h2 raqm-toast-title [id]=\"toast.id + '-title'\">{{ toast.title }}</h2>\r\n }\r\n @if (toast.description) {\r\n <p raqm-toast-description [id]=\"toast.id + '-description'\">{{ toast.description }}</p>\r\n }\r\n </div>\r\n @if (toast.action; as actionOptions) {\r\n <button\r\n raqm-toast-action\r\n [disabled]=\"actionOptions.disabled ?? false\"\r\n (click)=\"action(toast, $event)\"\r\n >\r\n {{ actionOptions.label }}\r\n </button>\r\n }\r\n <button raqm-toast-close [attr.aria-label]=\"closeLabel()\"></button>\r\n </div>\r\n </raqm-toast>\r\n }\r\n </section>\r\n</ng-template>\r\n","// Public API for the `@raqm/ui/toast` entry point; the root entry re-exports these.\r\nimport {\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastComponent,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastIconComponent,\r\n RaqmToastTitleDirective,\r\n} from './toast.component';\r\nimport { RaqmToasterComponent } from './toaster.component';\r\n\r\nexport {\r\n RaqmToastComponent,\r\n RaqmToastTitleDirective,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastIconComponent,\r\n};\r\nexport { RaqmToasterComponent } from './toaster.component';\r\nexport { RaqmToastService } from './toast.service';\r\nexport type {\r\n RaqmToastActionOptions,\r\n RaqmToastId,\r\n RaqmToastOptions,\r\n RaqmToastRecord,\r\n RaqmToastType,\r\n} from './toast.service';\r\n\r\nexport const RaqmToast = [\r\n RaqmToastComponent,\r\n RaqmToastTitleDirective,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastIconComponent,\r\n RaqmToasterComponent,\r\n] as const;\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"raqm-ui-toast.mjs","names":[],"sources":["../../../projects/ui/toast/toast.service.ts","../../../projects/ui/toast/toast.component.ts","../../../projects/ui/toast/toast-icon.component.html","../../../projects/ui/toast/toaster.component.ts","../../../projects/ui/toast/toaster.component.html","../../../projects/ui/toast/public-api.ts"],"sourcesContent":["import {\r\n DOCUMENT,\r\n Injectable,\r\n OnDestroy,\r\n PLATFORM_ID,\r\n computed,\r\n inject,\r\n signal,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\nexport type RaqmToastId = string;\r\nexport type RaqmToastType = 'success' | 'info' | 'warning' | 'error' | 'loading';\r\n/** Native action; its callback explicitly owns dismissal. */\r\nexport interface RaqmToastActionOptions {\r\n readonly label: string;\r\n readonly onClick: (id: RaqmToastId, event: MouseEvent) => void;\r\n readonly disabled?: boolean;\r\n}\r\n/** Text notification options; a timeout of 0 disables automatic dismissal. */\r\nexport interface RaqmToastOptions {\r\n readonly id?: RaqmToastId;\r\n readonly title?: string;\r\n readonly description?: string;\r\n readonly type?: RaqmToastType;\r\n readonly timeout?: number;\r\n readonly action?: RaqmToastActionOptions;\r\n readonly onClose?: () => void;\r\n}\r\n/** Immutable notification state; updates preserve its id and increment updateKey. */\r\nexport interface RaqmToastRecord extends Omit<RaqmToastOptions, 'id' | 'timeout'> {\r\n readonly id: RaqmToastId;\r\n readonly timeout: number;\r\n readonly updateKey: number;\r\n readonly ending?: boolean;\r\n}\r\ninterface ToastClock {\r\n remaining: number;\r\n started: number;\r\n timer?: ReturnType<typeof setTimeout>;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class RaqmToastService implements OnDestroy {\r\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\r\n private readonly records = signal<readonly RaqmToastRecord[]>([]);\r\n private readonly clocks = new Map<RaqmToastId, ToastClock>();\r\n private readonly document = inject(DOCUMENT);\r\n private readonly exits = new Map<RaqmToastId, ReturnType<typeof setTimeout>>();\r\n private owner: object | null = null;\r\n private paused = false;\r\n private nextId = 0;\r\n private destroyed = false;\r\n /** Newest first; older records queue behind the visible three. */\r\n readonly toasts = this.records.asReadonly();\r\n readonly visibleToasts = computed(() =>\r\n this.toasts()\r\n .filter((t) => !t.ending)\r\n .slice(0, 3),\r\n );\r\n /** Visible roots plus retained, inert roots finishing the exit. */\r\n readonly renderedToasts = computed(() => {\r\n const visible = new Set(this.visibleToasts().map((t) => t.id));\r\n return this.toasts().filter((t) => t.ending || visible.has(t.id));\r\n });\r\n\r\n /** Adds a notification, or upserts an existing explicit id without duplication. */\r\n show(options: RaqmToastOptions): RaqmToastId {\r\n const id = options.id ?? this.createId();\r\n if (this.destroyed) return id;\r\n if (this.records().some((toast) => toast.id === id)) {\r\n this.update(id, options);\r\n return id;\r\n }\r\n const toast = { ...options, id, timeout: this.timeout(options.timeout), updateKey: 0 };\r\n this.records.update((records) => [toast, ...records]);\r\n this.clocks.set(id, { remaining: toast.timeout, started: 0 });\r\n this.syncClocks();\r\n return id;\r\n }\r\n success(options: Omit<RaqmToastOptions, 'type'>): RaqmToastId {\r\n return this.show({ ...options, type: 'success' });\r\n }\r\n error(options: Omit<RaqmToastOptions, 'type'>): RaqmToastId {\r\n return this.show({ ...options, type: 'error' });\r\n }\r\n /** Updates one id for loading → success/error workflows; dismissed ids stay dismissed. */\r\n update(id: RaqmToastId, options: Partial<Omit<RaqmToastOptions, 'id'>>): void {\r\n const previous = this.records().find((toast) => toast.id === id);\r\n if (!previous || previous.ending) return;\r\n const timeout = this.timeout(options.timeout ?? previous.timeout);\r\n this.stopClock(id);\r\n this.records.update((records) =>\r\n records.map((toast) =>\r\n toast.id === id\r\n ? { ...toast, ...options, id, timeout, updateKey: toast.updateKey + 1 }\r\n : toast,\r\n ),\r\n );\r\n this.clocks.set(id, { remaining: timeout, started: 0 });\r\n this.syncClocks();\r\n }\r\n /** Dismisses one notification, or all notifications when no id is supplied. */\r\n dismiss(id?: RaqmToastId): void {\r\n const visible = new Set(this.visibleToasts().map((t) => t.id));\r\n const removed = this.records().filter(\r\n (toast) => !toast.ending && (id === undefined || toast.id === id),\r\n );\r\n const animate =\r\n this.browser &&\r\n this.owner !== null &&\r\n !this.document.defaultView?.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n for (const toast of removed) {\r\n this.stopClock(toast.id);\r\n this.clocks.delete(toast.id);\r\n }\r\n this.records.update((records) =>\r\n records.flatMap((toast) =>\r\n !removed.includes(toast)\r\n ? [toast]\r\n : animate && visible.has(toast.id)\r\n ? [{ ...toast, ending: true }]\r\n : [],\r\n ),\r\n );\r\n for (const toast of removed) {\r\n if (animate && visible.has(toast.id))\r\n this.exits.set(\r\n toast.id,\r\n setTimeout(() => {\r\n this.exits.delete(toast.id);\r\n this.records.update((records) => records.filter((record) => record.id !== toast.id));\r\n }, 500),\r\n );\r\n }\r\n this.syncClocks();\r\n for (const toast of removed) toast.onClose?.();\r\n }\r\n /** Internal host ownership guard: duplicate hosts never create duplicate overlays. */\r\n claimViewport(owner: object): boolean {\r\n if (this.owner !== null && this.owner !== owner) return false;\r\n this.owner = owner;\r\n this.syncClocks();\r\n return true;\r\n }\r\n releaseViewport(owner: object): void {\r\n if (this.owner !== owner) return;\r\n this.owner = null;\r\n for (const timer of this.exits.values()) clearTimeout(timer);\r\n this.exits.clear();\r\n this.records.update((records) => records.filter((t) => !t.ending));\r\n this.paused = false;\r\n this.syncClocks();\r\n }\r\n pauseViewport(owner: object, paused: boolean): void {\r\n if (this.owner !== owner) return;\r\n this.paused = paused;\r\n this.syncClocks();\r\n }\r\n ngOnDestroy(): void {\r\n this.destroyed = true;\r\n for (const id of this.clocks.keys()) this.stopClock(id);\r\n this.clocks.clear();\r\n for (const timer of this.exits.values()) clearTimeout(timer);\r\n this.exits.clear();\r\n this.records.set([]);\r\n this.owner = null;\r\n }\r\n private timeout(value = 5000): number {\r\n return Number.isFinite(value) ? Math.max(0, Math.min(value, 2147483647)) : 5000;\r\n }\r\n private createId(): string {\r\n let id: string;\r\n do {\r\n id = `raqm-toast-${++this.nextId}`;\r\n } while (this.records().some((toast) => toast.id === id));\r\n return id;\r\n }\r\n private stopClock(id: RaqmToastId): void {\r\n const clock = this.clocks.get(id);\r\n if (clock?.timer !== undefined) {\r\n clearTimeout(clock.timer);\r\n clock.timer = undefined;\r\n clock.remaining = Math.max(0, clock.remaining - (Date.now() - clock.started));\r\n }\r\n }\r\n private syncClocks(): void {\r\n const visible = new Set(this.visibleToasts().map((toast) => toast.id));\r\n for (const [id, clock] of this.clocks) {\r\n if (!this.browser || !this.owner || this.paused || !visible.has(id)) {\r\n this.stopClock(id);\r\n } else if (clock.timer === undefined && this.records().find((t) => t.id === id)?.timeout) {\r\n clock.started = Date.now();\r\n clock.timer = setTimeout(() => {\r\n clock.timer = undefined;\r\n this.dismiss(id);\r\n }, clock.remaining);\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Directive,\r\n ElementRef,\r\n OnDestroy,\r\n inject,\r\n input,\r\n output,\r\n effect,\r\n} from '@angular/core';\r\nimport { RaqmToastRecord, RaqmToastService, RaqmToastType } from './toast.service';\r\n\r\n/** Composable notification root; never takes focus automatically. */\r\n@Component({\r\n selector: 'raqm-toast',\r\n template: '<ng-content />',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-toast',\r\n tabindex: '-1',\r\n role: 'group',\r\n '[attr.data-raqm-type]': 'toast().type',\r\n '(keydown.escape)': 'dismiss($event)',\r\n '(pointerdown)': 'pointerDown($event)',\r\n '(pointermove)': 'pointerMove($event)',\r\n '(pointerup)': 'pointerEnd($event)',\r\n '(pointercancel)': 'pointerEnd($event)',\r\n '(lostpointercapture)': 'pointerEnd($event)',\r\n },\r\n})\r\nexport class RaqmToastComponent implements OnDestroy {\r\n readonly toast = input.required<RaqmToastRecord>();\r\n /** Internal viewport clock-pause signal for captured touch or mouse gestures. */\r\n readonly swipingChange = output<boolean>();\r\n private readonly service = inject(RaqmToastService);\r\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n private pointer: number | null = null;\r\n private start = { x: 0, y: 0 };\r\n private initial = '';\r\n private axis: 'x' | 'y' | null = null;\r\n private firstMove = true;\r\n private maximum = 0;\r\n private baseline = { x: 0, y: 0 };\r\n private intended = false;\r\n private cancelled = false;\r\n private delta = 0;\r\n constructor() {\r\n effect(() => {\r\n if (this.toast().ending) this.releasePointer();\r\n });\r\n }\r\n protected pointerDown(event: PointerEvent): void {\r\n if (\r\n event.button !== 0 ||\r\n this.pointer !== null ||\r\n this.toast().ending ||\r\n (event.target as HTMLElement).closest(\r\n 'button,a,input,textarea,select,[role=\"button\"],[contenteditable],[data-base-ui-swipe-ignore],[data-swipe-ignore]',\r\n )\r\n )\r\n return;\r\n try {\r\n this.element.setPointerCapture(event.pointerId);\r\n } catch {\r\n return;\r\n }\r\n this.pointer = event.pointerId;\r\n this.swipingChange.emit(true);\r\n this.start = { x: event.clientX, y: event.clientY };\r\n this.baseline = { ...this.start };\r\n this.intended = false;\r\n this.initial =\r\n this.element.ownerDocument.defaultView?.getComputedStyle(this.element).transform ?? '';\r\n this.axis = null;\r\n this.firstMove = true;\r\n this.maximum = this.delta = 0;\r\n this.cancelled = false;\r\n this.element.setAttribute('data-raqm-swiping', '');\r\n }\r\n protected pointerMove(event: PointerEvent): void {\r\n if (event.pointerId !== this.pointer) return;\r\n event.preventDefault();\r\n if (this.firstMove) {\r\n this.start = { x: event.clientX, y: event.clientY };\r\n this.firstMove = false;\r\n }\r\n const x = event.clientX - this.start.x;\r\n const y = event.clientY - this.start.y;\r\n if (\r\n (event.movementX < 0 && event.clientX > this.baseline.x) ||\r\n (event.movementX > 0 && event.clientX < this.baseline.x)\r\n )\r\n this.baseline.x = event.clientX;\r\n if (\r\n (event.movementY < 0 && event.clientY > this.baseline.y) ||\r\n (event.movementY > 0 && event.clientY < this.baseline.y)\r\n )\r\n this.baseline.y = event.clientY;\r\n if (!this.axis && Math.hypot(x, y) >= 1) this.axis = Math.abs(x) > Math.abs(y) ? 'x' : 'y';\r\n this.delta = this.axis === 'x' ? x : this.axis === 'y' ? y : 0;\r\n if (!this.intended && this.delta > 0) {\r\n this.intended = true;\r\n this.maximum = this.delta;\r\n } else if (this.intended) {\r\n const displacement =\r\n this.axis === 'x' ? event.clientX - this.baseline.x : event.clientY - this.baseline.y;\r\n if (displacement > 40) this.cancelled = false;\r\n else if (this.maximum - displacement >= 10) this.cancelled = true;\r\n }\r\n const damped = this.delta < 0 ? -Math.sqrt(-this.delta) : this.delta;\r\n this.element.style.transform = `translate${this.axis === 'x' ? 'X' : 'Y'}(${damped}px) ${this.initial === 'none' ? '' : this.initial}`;\r\n this.element.style.setProperty(\r\n '--toast-swipe-movement-x',\r\n `${this.axis === 'x' ? damped : 0}px`,\r\n );\r\n this.element.style.setProperty(\r\n '--toast-swipe-movement-y',\r\n `${this.axis === 'y' ? damped : 0}px`,\r\n );\r\n }\r\n protected pointerEnd(event: PointerEvent): void {\r\n if (event.pointerId !== this.pointer) return;\r\n const dismiss = event.type === 'pointerup' && this.delta > 40 && !this.cancelled;\r\n const direction = this.axis === 'x' ? 'right' : 'down';\r\n this.releasePointer();\r\n if (dismiss) {\r\n this.element.setAttribute('data-raqm-swipe-direction', direction);\r\n this.dismiss();\r\n } else {\r\n this.element.style.removeProperty('--toast-swipe-movement-x');\r\n this.element.style.removeProperty('--toast-swipe-movement-y');\r\n }\r\n }\r\n ngOnDestroy(): void {\r\n this.releasePointer();\r\n }\r\n private releasePointer(): void {\r\n const pointer = this.pointer;\r\n this.pointer = null;\r\n if (pointer !== null) this.swipingChange.emit(false);\r\n if (pointer !== null && this.element.hasPointerCapture(pointer))\r\n this.element.releasePointerCapture(pointer);\r\n this.element.removeAttribute('data-raqm-swiping');\r\n this.element.style.removeProperty('transform');\r\n }\r\n /** Closes this record and contains Escape within the notification. */\r\n dismiss(event?: Event): void {\r\n event?.preventDefault();\r\n event?.stopPropagation();\r\n this.service.dismiss(this.toast().id);\r\n }\r\n}\r\n@Directive({\r\n selector: '[raqm-toast-title]',\r\n host: { class: 'raqm-toast-title' },\r\n})\r\nexport class RaqmToastTitleDirective {}\r\n\r\n@Directive({\r\n selector: '[raqm-toast-content]',\r\n host: { class: 'raqm-toast-content' },\r\n})\r\nexport class RaqmToastContentDirective {}\r\n@Directive({\r\n selector: '[raqm-toast-description]',\r\n host: { class: 'raqm-toast-description' },\r\n})\r\nexport class RaqmToastDescriptionDirective {}\r\n/** Native action; the consumer click callback owns its behavior and dismissal. */\r\n@Directive({\r\n selector: 'button[raqm-toast-action]',\r\n host: {\r\n class: 'raqm-toast-action raqm-button',\r\n 'data-raqm-variant': 'outline',\r\n 'data-raqm-size': 'sm',\r\n },\r\n})\r\nexport class RaqmToastActionDirective {\r\n constructor() {\r\n const element = inject<ElementRef<HTMLButtonElement>>(ElementRef).nativeElement;\r\n if (!element.hasAttribute('type')) element.type = 'button';\r\n }\r\n}\r\n/** Native close button operating on its enclosing toast; the application names it. */\r\n@Component({\r\n selector: 'button[raqm-toast-close]',\r\n template:\r\n '<ng-content><svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m18 6-12 12M6 6l12 12\" /></svg></ng-content>',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-toast-close raqm-button',\r\n 'data-raqm-variant': 'ghost',\r\n 'data-raqm-size': 'icon-sm',\r\n '(click)': 'root.dismiss()',\r\n },\r\n})\r\nexport class RaqmToastCloseComponent {\r\n protected readonly root = inject(RaqmToastComponent);\r\n constructor() {\r\n const element = inject<ElementRef<HTMLButtonElement>>(ElementRef).nativeElement;\r\n if (!element.hasAttribute('type')) element.type = 'button';\r\n }\r\n}\r\n/** Decorative inline status glyphs. */\r\n@Component({\r\n selector: 'raqm-toast-icon',\r\n templateUrl: './toast-icon.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { class: 'raqm-toast-icon', 'aria-hidden': 'true', '[attr.data-raqm-type]': 'type()' },\r\n})\r\nexport class RaqmToastIconComponent {\r\n readonly type = input<RaqmToastType>();\r\n}\r\n","@if (type()) {\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"16\"\r\n height=\"16\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n focusable=\"false\"\r\n >\r\n @switch (type()) {\r\n @case ('success') {\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"m9 12 2 2 4-4\" />\r\n }\r\n @case ('info') {\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 16v-4M12 8h.01\" />\r\n }\r\n @case ('warning') {\r\n <path\r\n d=\"m10.3 3.9-8.1 14A2 2 0 0 0 3.9 21h16.2a2 2 0 0 0 1.7-3.1l-8.1-14a2 2 0 0 0-3.4 0ZM12 9v4M12 17h.01\"\r\n />\r\n }\r\n @case ('error') {\r\n <path d=\"m7.86 2-5.86 5.86v8.28l5.86 5.86h8.28l5.86-5.86V7.86L16.14 2ZM9 9l6 6M15 9l-6 6\" />\r\n }\r\n @case ('loading') {\r\n <path d=\"M12 2a10 10 0 1 1-7.07 2.93\" />\r\n }\r\n }\r\n </svg>\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DOCUMENT,\r\n ElementRef,\r\n OnDestroy,\r\n TemplateRef,\r\n ViewContainerRef,\r\n afterEveryRender,\r\n afterNextRender,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport {\r\n RaqmToastComponent,\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastIconComponent,\r\n RaqmToastTitleDirective,\r\n} from './toast.component';\r\nimport { RaqmToastRecord, RaqmToastService } from './toast.service';\r\n\r\n/** Nonmodal CDK viewport; mounted once near the application root. */\r\n@Component({\r\n imports: [\r\n RaqmToastComponent,\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastIconComponent,\r\n RaqmToastTitleDirective,\r\n ],\r\n selector: 'raqm-toaster',\r\n styleUrl: './toaster.component.scss',\r\n templateUrl: './toaster.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class RaqmToasterComponent implements OnDestroy {\r\n /** Accessible name of the notification viewport region. */\r\n readonly label = input.required<string>();\r\n /** Accessible name of the close control the toaster renders for each toast. */\r\n readonly closeLabel = input.required<string>();\r\n protected readonly service = inject(RaqmToastService);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly overlay = inject(Overlay);\r\n private readonly container = inject(ViewContainerRef);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly panel = viewChild.required<TemplateRef<unknown>>('panel');\r\n private overlayRef?: OverlayRef;\r\n private observer?: ResizeObserver;\r\n private observedContents = new Set<HTMLElement>();\r\n private appliedDirection: 'ltr' | 'rtl' = 'ltr';\r\n private renderedSnapshot: readonly RaqmToastRecord[] | undefined;\r\n private measuredRootsKey: string | undefined;\r\n private announcementTimer?: ReturnType<typeof setTimeout>;\r\n private previousFocus: HTMLElement | null = null;\r\n private hovered = false;\r\n private focused = false;\r\n private swiping = false;\r\n private readonly indices = new Map<string, number>();\r\n protected readonly expanded = signal(false);\r\n protected readonly announcement = signal('');\r\n protected readonly ready = signal(false);\r\n protected readonly announcementKey = computed(() =>\r\n this.service\r\n .visibleToasts()\r\n .map((t) => `${t.id}:${t.updateKey}`)\r\n .join('|'),\r\n );\r\n private announced = new Map<string, number>();\r\n private readonly pendingAnnouncements = new Map<string, RaqmToastRecord>();\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n if (!this.service.claimViewport(this)) return;\r\n this.appliedDirection = this.resolveDirection();\r\n const dir = this.appliedDirection;\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy: this.overlay.position().global(),\r\n scrollStrategy: this.overlay.scrollStrategies.noop(),\r\n hasBackdrop: false,\r\n panelClass: 'raqm-toast-overlay-pane',\r\n direction: dir,\r\n });\r\n // The viewport owns fixed logical positioning; its zero-sized pane never intercepts the page.\r\n this.overlayRef.overlayElement.style.pointerEvents = 'none';\r\n this.overlayRef.attach(new TemplatePortal(this.panel(), this.container));\r\n this.document.addEventListener('keydown', this.onDocumentKeydown);\r\n if (typeof ResizeObserver !== 'undefined')\r\n this.observer = new ResizeObserver(() => this.measure());\r\n this.ready.set(true);\r\n });\r\n afterEveryRender(() => {\r\n const pane = this.overlayRef?.overlayElement;\r\n if (!pane) return;\r\n const dir = this.resolveDirection();\r\n if (dir !== this.appliedDirection) {\r\n this.appliedDirection = dir;\r\n this.overlayRef?.setDirection(dir);\r\n }\r\n // Without a ResizeObserver every render is the only measurement trigger.\r\n let measureNeeded = !this.observer;\r\n const rendered = this.service.renderedToasts();\r\n // The rendered records are the only DOM membership source, so an unchanged array\r\n // cannot add, remove or resize a root.\r\n if (rendered !== this.renderedSnapshot) {\r\n this.renderedSnapshot = rendered;\r\n const retained = new Set(rendered.map((t) => t.id));\r\n for (const id of this.indices.keys()) if (!retained.has(id)) this.indices.delete(id);\r\n // Ending roots stay observed but are excluded from measurement, so a change in the\r\n // ordered non-ending roots (or their content) needs its own measurement trigger.\r\n // Tuples, not a delimited string: arbitrary toast ids must not collide across\r\n // orderings and hide a reorder from the measurement trigger.\r\n const rootsKey = JSON.stringify(\r\n rendered.filter((t) => !t.ending).map((t) => [t.id, t.updateKey]),\r\n );\r\n if (rootsKey !== this.measuredRootsKey) {\r\n this.measuredRootsKey = rootsKey;\r\n measureNeeded = true;\r\n }\r\n this.syncObservedContents(pane);\r\n }\r\n if (measureNeeded) this.measure();\r\n });\r\n effect(() => {\r\n const toasts = this.service.visibleToasts();\r\n // Runs before DOM removal so programmatic dismissal cannot strand focused controls.\r\n untracked(() => this.ensureFocus(toasts));\r\n });\r\n effect(() => {\r\n this.announcementKey();\r\n if (!this.ready()) return;\r\n untracked(() => {\r\n const fresh = this.service\r\n .visibleToasts()\r\n .filter((t) => this.announced.get(t.id) !== t.updateKey);\r\n this.announced = new Map(this.service.visibleToasts().map((t) => [t.id, t.updateKey]));\r\n if (!fresh.length) return;\r\n for (const toast of fresh) this.pendingAnnouncements.set(toast.id, toast);\r\n if (this.announcementTimer !== undefined) clearTimeout(this.announcementTimer);\r\n this.announcement.set('');\r\n this.announcementTimer = setTimeout(() => {\r\n this.announcementTimer = undefined;\r\n this.announcement.set(\r\n Array.from(this.pendingAnnouncements.values())\r\n .filter((t) =>\r\n this.service\r\n .visibleToasts()\r\n .some((current) => current.id === t.id && current.updateKey === t.updateKey),\r\n )\r\n .map((t) => [t.title, t.description].filter(Boolean).join('. '))\r\n .join('. '),\r\n );\r\n this.pendingAnnouncements.clear();\r\n }, 100);\r\n });\r\n });\r\n }\r\n ngOnDestroy(): void {\r\n this.restoreFocus();\r\n this.document.removeEventListener('keydown', this.onDocumentKeydown);\r\n this.observer?.disconnect();\r\n this.observedContents.clear();\r\n if (this.announcementTimer !== undefined) clearTimeout(this.announcementTimer);\r\n this.overlayRef?.dispose();\r\n this.service.releaseViewport(this);\r\n }\r\n protected hover(value: boolean): void {\r\n this.hovered = value;\r\n this.syncPause();\r\n }\r\n protected focusIn(event: FocusEvent): void {\r\n const previous = event.relatedTarget as HTMLElement | null;\r\n if (previous && !this.overlayRef?.overlayElement.contains(previous))\r\n this.previousFocus = previous;\r\n this.focused = true;\r\n this.syncPause();\r\n }\r\n protected focusOut(event: FocusEvent): void {\r\n this.focused =\r\n !!event.relatedTarget &&\r\n !!this.overlayRef?.overlayElement.contains(event.relatedTarget as Node);\r\n this.syncPause();\r\n }\r\n protected action(toast: RaqmToastRecord, event: MouseEvent): void {\r\n toast.action?.onClick(toast.id, event);\r\n }\r\n protected toastIndex(toast: RaqmToastRecord): number {\r\n if (!toast.ending)\r\n this.indices.set(\r\n toast.id,\r\n Math.max(\r\n 0,\r\n this.service.visibleToasts().findIndex((t) => t.id === toast.id),\r\n ),\r\n );\r\n return this.indices.get(toast.id) ?? 0;\r\n }\r\n protected swipe(value: boolean): void {\r\n this.swiping = value;\r\n this.syncPause();\r\n }\r\n private syncPause(): void {\r\n this.expanded.set(this.hovered || this.focused);\r\n // Focus-in reveals the content synchronously, before Angular's next render.\r\n this.overlayRef?.overlayElement.querySelectorAll<HTMLElement>('.raqm-toast').forEach((root) => {\r\n root.toggleAttribute('data-raqm-expanded', this.hovered || this.focused);\r\n });\r\n this.service.pauseViewport(this, this.hovered || this.focused || this.swiping);\r\n }\r\n private resolveDirection(): 'ltr' | 'rtl' {\r\n return this.document.defaultView?.getComputedStyle(this.host.nativeElement).direction === 'rtl'\r\n ? 'rtl'\r\n : 'ltr';\r\n }\r\n // Observes only entering/leaving content, so a stable set costs no observer churn per render.\r\n private syncObservedContents(pane: HTMLElement): boolean {\r\n const previous = this.observedContents;\r\n const current = new Set(pane.querySelectorAll<HTMLElement>('.raqm-toast-content'));\r\n let stable = current.size === previous.size;\r\n if (stable) {\r\n for (const element of current) {\r\n if (!previous.has(element)) {\r\n stable = false;\r\n break;\r\n }\r\n }\r\n }\r\n if (stable) return false;\r\n for (const element of previous) if (!current.has(element)) this.observer?.unobserve(element);\r\n for (const element of current) if (!previous.has(element)) this.observer?.observe(element);\r\n this.observedContents = current;\r\n return true;\r\n }\r\n private measure(): void {\r\n const viewport =\r\n this.overlayRef?.overlayElement.querySelector<HTMLElement>('.raqm-toast-viewport');\r\n if (!viewport) return;\r\n const roots = Array.from(\r\n viewport.querySelectorAll<HTMLElement>('.raqm-toast:not([data-raqm-ending-style])'),\r\n );\r\n // Read every height before writing styles, so layout is not read and invalidated per toast.\r\n const heights = roots.map(\r\n (root) => root.querySelector<HTMLElement>('.raqm-toast-content')?.offsetHeight ?? 0,\r\n );\r\n const frontHeight = heights[0];\r\n if (frontHeight) {\r\n const next = `${frontHeight + 2}px`;\r\n if (viewport.style.getPropertyValue('--toast-frontmost-height') !== next)\r\n viewport.style.setProperty('--toast-frontmost-height', next);\r\n }\r\n let offset = 0;\r\n roots.forEach((root, index) => {\r\n const next = `${offset}px`;\r\n if (root.style.getPropertyValue('--toast-offset-y') !== next)\r\n root.style.setProperty('--toast-offset-y', next);\r\n offset += (heights[index] ?? 0) + 2;\r\n });\r\n }\r\n private ensureFocus(toasts: readonly RaqmToastRecord[]): void {\r\n const active = this.document.activeElement as HTMLElement | null;\r\n const root = active?.closest<HTMLElement>('.raqm-toast');\r\n if (!root || !this.overlayRef?.overlayElement.contains(root)) return;\r\n if (toasts.some((t) => t.id === root.dataset['raqmToastId'])) return;\r\n const next = Array.from(\r\n this.overlayRef.overlayElement.querySelectorAll<HTMLElement>('.raqm-toast'),\r\n ).find(\r\n (element) => element !== root && toasts.some((t) => t.id === element.dataset['raqmToastId']),\r\n );\r\n if (toasts.length && next) next.focus();\r\n else this.restoreFocus();\r\n }\r\n private restoreFocus(): void {\r\n if (!this.overlayRef?.overlayElement.contains(this.document.activeElement)) return;\r\n if (\r\n this.previousFocus?.isConnected &&\r\n !this.previousFocus.closest('[inert]') &&\r\n !this.previousFocus.matches(':disabled')\r\n ) {\r\n this.previousFocus.focus({ preventScroll: true });\r\n } else {\r\n (this.document.activeElement as HTMLElement | null)?.blur();\r\n }\r\n this.focused = false;\r\n this.syncPause();\r\n }\r\n private readonly onDocumentKeydown = (event: KeyboardEvent): void => {\r\n if (event.key !== 'F6' || !this.service.visibleToasts().length) return;\r\n event.preventDefault();\r\n if (this.overlayRef?.overlayElement.contains(this.document.activeElement)) this.restoreFocus();\r\n else {\r\n this.previousFocus = this.document.activeElement as HTMLElement | null;\r\n this.overlayRef?.overlayElement.querySelector<HTMLElement>('.raqm-toast')?.focus();\r\n }\r\n };\r\n}\r\n","<ng-template #panel>\r\n <section\r\n class=\"raqm-toast-viewport\"\r\n [attr.aria-label]=\"label()\"\r\n tabindex=\"-1\"\r\n (mouseenter)=\"hover(true)\"\r\n (mouseleave)=\"hover(false)\"\r\n (focusin)=\"focusIn($event)\"\r\n (focusout)=\"focusOut($event)\"\r\n >\r\n <div class=\"raqm-toast-announcer\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {{ announcement() }}\r\n </div>\r\n @for (toast of service.renderedToasts(); track toast.id) {\r\n <raqm-toast\r\n [toast]=\"toast\"\r\n (swipingChange)=\"swipe($event)\"\r\n [attr.data-raqm-toast-id]=\"toast.id\"\r\n [style.--toast-index]=\"toastIndex(toast)\"\r\n [attr.data-raqm-ending-style]=\"toast.ending ? '' : null\"\r\n [attr.inert]=\"toast.ending ? '' : null\"\r\n [attr.aria-hidden]=\"toast.ending ? 'true' : null\"\r\n [attr.data-raqm-expanded]=\"expanded() ? '' : null\"\r\n [attr.data-raqm-behind]=\"toastIndex(toast) > 0 ? '' : null\"\r\n [attr.aria-labelledby]=\"toast.title ? toast.id + '-title' : null\"\r\n [attr.aria-describedby]=\"toast.description ? toast.id + '-description' : null\"\r\n >\r\n <div raqm-toast-content>\r\n @if (toast.type) {\r\n <raqm-toast-icon [type]=\"toast.type\" />\r\n }\r\n <div class=\"raqm-toast-text\">\r\n @if (toast.title) {\r\n <h2 raqm-toast-title [id]=\"toast.id + '-title'\">{{ toast.title }}</h2>\r\n }\r\n @if (toast.description) {\r\n <p raqm-toast-description [id]=\"toast.id + '-description'\">{{ toast.description }}</p>\r\n }\r\n </div>\r\n @if (toast.action; as actionOptions) {\r\n <button\r\n raqm-toast-action\r\n [disabled]=\"actionOptions.disabled ?? false\"\r\n (click)=\"action(toast, $event)\"\r\n >\r\n {{ actionOptions.label }}\r\n </button>\r\n }\r\n <button raqm-toast-close [attr.aria-label]=\"closeLabel()\"></button>\r\n </div>\r\n </raqm-toast>\r\n }\r\n </section>\r\n</ng-template>\r\n","// Public API for the `@raqm/ui/toast` entry point; the root entry re-exports these.\r\nimport {\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastComponent,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastIconComponent,\r\n RaqmToastTitleDirective,\r\n} from './toast.component';\r\nimport { RaqmToasterComponent } from './toaster.component';\r\n\r\nexport {\r\n RaqmToastComponent,\r\n RaqmToastTitleDirective,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastIconComponent,\r\n};\r\nexport { RaqmToasterComponent } from './toaster.component';\r\nexport { RaqmToastService } from './toast.service';\r\nexport type {\r\n RaqmToastActionOptions,\r\n RaqmToastId,\r\n RaqmToastOptions,\r\n RaqmToastRecord,\r\n RaqmToastType,\r\n} from './toast.service';\r\n\r\nexport const RaqmToast = [\r\n RaqmToastComponent,\r\n RaqmToastTitleDirective,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastIconComponent,\r\n RaqmToasterComponent,\r\n] as const;\r\n"],"mappings":"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"}
@@ -249,8 +249,8 @@ var RaqmTooltipPane = class {
249
249
  if (event.button === 0) this.host.onOutsidePress(trigger);
250
250
  });
251
251
  this.detachSubscription = overlayRef.detachments().subscribe(() => this.host.onDetached(overlayRef));
252
- this.viewportSubscription = this.viewportRuler.change(0).subscribe(() => this.position.reposition());
253
- this.scrollSubscription = this.scrollDispatcher.ancestorScrolled(trigger.element, 0).subscribe(() => this.position.reposition());
252
+ this.viewportSubscription = this.viewportRuler.change(0).subscribe(() => this.position.scheduleReposition());
253
+ this.scrollSubscription = this.scrollDispatcher.ancestorScrolled(trigger.element, 0).subscribe(() => this.position.scheduleReposition());
254
254
  this.escapeListener = (event) => {
255
255
  if (event.key !== "Escape" || !this.open()) return;
256
256
  this.host.onEscape(trigger);
@@ -390,6 +390,8 @@ var RaqmTooltipPosition = class {
390
390
  currentDir = "ltr";
391
391
  sideSubscription;
392
392
  resizeObserver;
393
+ frame = 0;
394
+ frameView;
393
395
  constructor(overlay, host) {
394
396
  this.overlay = overlay;
395
397
  this.host = host;
@@ -414,6 +416,7 @@ var RaqmTooltipPosition = class {
414
416
  return strategy;
415
417
  }
416
418
  reposition() {
419
+ this.cancelScheduledReposition();
417
420
  const overlayRef = this.host.pane();
418
421
  const strategy = this.positionStrategy;
419
422
  if (!overlayRef || !strategy) return;
@@ -428,6 +431,20 @@ var RaqmTooltipPosition = class {
428
431
  overlayRef.updatePosition();
429
432
  this.positionArrow(this.currentAppliedSide);
430
433
  }
434
+ scheduleReposition() {
435
+ if (!this.host.pane() || !this.positionStrategy || this.frame) return;
436
+ const view = this.host.element.ownerDocument.defaultView;
437
+ if (!view || typeof view.requestAnimationFrame !== "function") {
438
+ this.reposition();
439
+ return;
440
+ }
441
+ this.frameView = view;
442
+ this.frame = view.requestAnimationFrame(() => {
443
+ this.frame = 0;
444
+ this.frameView = void 0;
445
+ this.reposition();
446
+ });
447
+ }
431
448
  watchSide(strategy, overlayRef) {
432
449
  this.sideSubscription = strategy.positionChanges.subscribe((change) => {
433
450
  const index = this.currentPositions.indexOf(change.connectionPair);
@@ -528,7 +545,7 @@ var RaqmTooltipPosition = class {
528
545
  if (typeof ResizeObserver === "undefined") return;
529
546
  this.resizeObserver?.disconnect();
530
547
  const observer = new ResizeObserver(() => {
531
- if (this.host.pane() === overlayRef) this.reposition();
548
+ if (this.host.pane() === overlayRef) this.scheduleReposition();
532
549
  });
533
550
  this.resizeObserver = observer;
534
551
  observer.observe(trigger);
@@ -546,17 +563,25 @@ var RaqmTooltipPosition = class {
546
563
  }
547
564
  }
548
565
  reset() {
566
+ this.cancelScheduledReposition();
549
567
  this.positionStrategy = void 0;
550
568
  this.currentPositions = [];
551
569
  this.currentSides = [];
552
570
  }
553
571
  discard() {
572
+ this.cancelScheduledReposition();
554
573
  this.positionStrategy = void 0;
555
574
  }
556
575
  clear() {
557
576
  this.currentPositions = [];
558
577
  this.currentSides = [];
559
578
  }
579
+ cancelScheduledReposition() {
580
+ if (!this.frame) return;
581
+ this.frameView?.cancelAnimationFrame(this.frame);
582
+ this.frame = 0;
583
+ this.frameView = void 0;
584
+ }
560
585
  };
561
586
  var RaqmTooltipSlot = class {
562
587
  document;