@raqm/ui 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +87 -126
- package/fesm2022/raqm-ui-badge.mjs +3 -1
- package/fesm2022/raqm-ui-badge.mjs.map +1 -1
- package/fesm2022/raqm-ui-calendar.mjs +79 -12
- package/fesm2022/raqm-ui-calendar.mjs.map +1 -1
- package/fesm2022/raqm-ui-combobox.mjs +47 -23
- package/fesm2022/raqm-ui-combobox.mjs.map +1 -1
- package/fesm2022/raqm-ui-command.mjs +60 -12
- package/fesm2022/raqm-ui-command.mjs.map +1 -1
- package/fesm2022/raqm-ui-dialog.mjs +1 -3
- package/fesm2022/raqm-ui-dialog.mjs.map +1 -1
- package/fesm2022/raqm-ui-icon.mjs +160 -0
- package/fesm2022/raqm-ui-icon.mjs.map +1 -0
- package/fesm2022/raqm-ui-input-otp.mjs +7 -4
- package/fesm2022/raqm-ui-input-otp.mjs.map +1 -1
- package/fesm2022/raqm-ui-overlay-internal.mjs +15 -5
- package/fesm2022/raqm-ui-overlay-internal.mjs.map +1 -1
- package/fesm2022/raqm-ui-popover.mjs +51 -19
- package/fesm2022/raqm-ui-popover.mjs.map +1 -1
- package/fesm2022/raqm-ui-resizable.mjs +14 -4
- package/fesm2022/raqm-ui-resizable.mjs.map +1 -1
- package/fesm2022/raqm-ui-scroll-area.mjs +85 -29
- package/fesm2022/raqm-ui-scroll-area.mjs.map +1 -1
- package/fesm2022/raqm-ui-select.mjs +46 -19
- package/fesm2022/raqm-ui-select.mjs.map +1 -1
- package/fesm2022/raqm-ui-sidebar.mjs +13 -3
- package/fesm2022/raqm-ui-sidebar.mjs.map +1 -1
- package/fesm2022/raqm-ui-slider.mjs +59 -12
- package/fesm2022/raqm-ui-slider.mjs.map +1 -1
- package/fesm2022/raqm-ui-toast.mjs +60 -20
- package/fesm2022/raqm-ui-toast.mjs.map +1 -1
- package/fesm2022/raqm-ui-tooltip.mjs +28 -3
- package/fesm2022/raqm-ui-tooltip.mjs.map +1 -1
- package/fesm2022/raqm-ui.mjs +1 -0
- package/package.json +52 -18
- package/styles/accordion.css +1 -0
- package/styles/alert-dialog.css +1 -0
- package/styles/alert.css +1 -0
- package/styles/attachment.css +1 -0
- package/styles/avatar.css +1 -0
- package/styles/badge.css +1 -0
- package/styles/base.css +1 -0
- package/styles/button-group.css +1 -0
- package/styles/button.css +1 -0
- package/styles/checkbox.css +1 -0
- package/styles/combobox.css +1 -0
- package/styles/command.css +1 -0
- package/styles/common.css +17 -0
- package/styles/context-menu.css +1 -0
- package/styles/dialog.css +1 -0
- package/styles/drawer.css +1 -0
- package/styles/dropdown-menu.css +1 -0
- package/styles/empty.css +1 -0
- package/styles/field-parts.css +1 -0
- package/styles/field-relationships.css +1 -0
- package/styles/input-group-button.css +1 -0
- package/styles/input-group-relationships.css +1 -0
- package/styles/input-otp.css +1 -0
- package/styles/input.css +1 -0
- package/styles/item.css +1 -0
- package/styles/kbd.css +1 -0
- package/styles/menubar.css +1 -0
- package/styles/native-select.css +1 -0
- package/styles/navigation-menu.css +1 -0
- package/styles/overlay.css +1 -0
- package/styles/pagination.css +1 -0
- package/styles/popover.css +1 -0
- package/styles/questionnaire.css +1 -0
- package/styles/radio-group.css +1 -0
- package/styles/resizable.css +1 -0
- package/styles/sheet.css +1 -0
- package/styles/sidebar.css +1 -0
- package/styles/spinner.css +1 -0
- package/styles/switch.css +1 -0
- package/styles/table.css +1 -0
- package/styles/tabs.css +1 -0
- package/styles/textarea.css +1 -0
- package/styles/theme.css +50 -4324
- package/styles/toggle-group.css +1 -0
- package/styles/toggle.css +1 -0
- package/styles/tooltip.css +1 -0
- package/types/raqm-ui-calendar.d.ts +1 -0
- package/types/raqm-ui-combobox.d.ts +8 -4
- package/types/raqm-ui-command.d.ts +4 -0
- package/types/raqm-ui-dialog.d.ts +7 -1
- package/types/raqm-ui-icon.d.ts +65 -0
- package/types/raqm-ui-input-otp.d.ts +1 -0
- package/types/raqm-ui-resizable.d.ts +4 -0
- package/types/raqm-ui-scroll-area.d.ts +11 -0
- package/types/raqm-ui-slider.d.ts +1 -1
- package/types/raqm-ui-toast.d.ts +6 -0
- package/types/raqm-ui.d.ts +1 -0
- package/fesm2022/raqm-ui-carousel.mjs +0 -410
- package/fesm2022/raqm-ui-carousel.mjs.map +0 -1
- 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
|
-
|
|
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
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
this.
|
|
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
|
-
|
|
744
|
-
const
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
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.
|
|
253
|
-
this.scrollSubscription = this.scrollDispatcher.ancestorScrolled(trigger.element, 0).subscribe(() => this.position.
|
|
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.
|
|
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;
|