ngx-kit 6.2.0 → 6.3.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.
@@ -174,7 +174,7 @@ class NgxMessageComponent {
174
174
  provide: NGX_MESSAGE_CONFIGS,
175
175
  useValue: NGX_MESSAGE_DEFAULT_OPTIONS,
176
176
  },
177
- ], viewQueries: [{ propertyName: "confetti", first: true, predicate: ["confetti"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"ngx-msg-overlay show\"\n (click)=\"onOutSideClick()\"\n [ngClass]=\"options.containerClass\"\n [class.has-backdrop]=\"options.backdrop\"\n [attr.data-type]=\"options.icon\">\n <div class=\"ngx-msg-modal\" (click)=\"innerOnClick($event)\">\n <div class=\"confetti\" #confetti></div>\n @if (options.showCloseButton) {\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\n }\n @if (showIcon()) {\n <div class=\"icon-stage\">\n <div class=\"icon-ring\"></div>\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\n </div>\n }\n <h2>{{ options.title }}</h2>\n <p class=\"desc\">\n {{ options.text }}\n <span [innerHTML]=\"options.html\"></span>\n </p>\n\n <div class=\"ngx-msg-actions\">\n @if (options.showCancelButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\n {{ options.cancelButtonText }}\n </button>\n }\n @if (options.showDenyButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onDeny()\"\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\n {{ options.denyButtonText }}\n </button>\n }\n @if (options.showConfirmButton) {\n <button\n class=\"btn btn-primary\"\n (click)=\"onConfirm()\"\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\n {{ options.confirmButtonText }}\n </button>\n }\n </div>\n </div>\n</div>\n", styles: [":root{--bg-0: #0a0c14;--bg-1: #0f1220;--ngx-msg-panel-bg: light-dark(#ffffffc4, #161928b8);--ngx-msg-panel-fg: light-dark(#000, #fff);--ngx-msg-panel-border: light-dark(#4545454a, #ffffff14);--ink-0: light-dark(#212121, #f3f4fb);--ink-1: light-dark(#2d2e32, #a8adc4);--ink-2: #6b7090;--violet: #8b7bff;--violet-2: #5b4fd1;--cyan: #43e0d8;--amber: #ffb454;--rose: #ff6b8b;--emerald: #3ee08f;--success-a: #3ee08f;--success-b: #1fb8b0;--error-a: #ff6b8b;--error-b: #c23f6b;--warning-a: #ffc45c;--warning-b: #ff8a4c;--info-a: #7cc1ff;--info-b: #5b6cff;--confirm-a: #c58bff;--confirm-b: #7b5cff}.ngx-msg-overlay{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:24px;background:#06070e8c;backdrop-filter:blur(6px) saturate(140%);-webkit-backdrop-filter:blur(6px) saturate(140%);opacity:0;visibility:hidden;transition:opacity .35s ease,visibility .35s ease}.ngx-msg-overlay.show{opacity:1;visibility:visible}.ngx-msg-modal{position:relative;width:100%;max-width:400px;background-color:var(--ngx-msg-panel-bg);color:var(--ngx-msg-panel-fg);border:1px solid var(--ngx-msg-panel-border);border-radius:26px;padding:38px 30px 28px;text-align:center;box-shadow:0 30px 80px -20px #0009,0 0 0 1px #ffffff05 inset;transform:translateY(28px) scale(.92);opacity:0;transition:transform .1s,opacity .1s;overflow:hidden}.ngx-msg-overlay.show .ngx-msg-modal{animation:modalIn .55s cubic-bezier(.2,1.1,.3,1) forwards}.ngx-msg-overlay.closing .ngx-msg-modal{animation:modalOut .28s cubic-bezier(.4,0,1,1) forwards}@keyframes modalIn{0%{transform:translateY(28px) scale(.9);opacity:0}60%{transform:translateY(-4px) scale(1.015);opacity:1}to{transform:translateY(0) scale(1);opacity:1}}@keyframes modalOut{to{transform:translateY(14px) scale(.94);opacity:0}}.ngx-msg-modal:before{content:\"\";position:absolute;top:-60px;left:50%;translate:-50% 0;width:260px;height:200px;border-radius:50%;background:var(--type-glow, radial-gradient(circle, rgba(139, 123, 255, .35), transparent 70%));filter:blur(20px);pointer-events:none}.ngx-msg-modal .close-x{position:absolute;top:4px;left:4px;width:30px;height:30px;border-radius:50%;border:none;background:none;color:var(--ink-2);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;line-height:1;transition:background .2s,color .2s,transform .2s;transform-origin:center;font-family:none}.ngx-msg-modal .close-x:hover{background:#ffffff14;color:var(--ink-0);transform:rotate(90deg)}.ngx-msg-overlay .icon-stage{position:relative;width:96px;height:96px;margin:4px auto 22px}.ngx-msg-overlay .icon-ring{position:absolute;inset:0;border-radius:50%;background:var(--type-ring, conic-gradient(from 0deg, var(--violet), var(--cyan), var(--violet)));-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));opacity:0}.ngx-msg-overlay.show .icon-ring{animation:ringIn .8s .05s cubic-bezier(.2,.8,.2,1) forwards,ringSpin 6s linear infinite}@keyframes ringIn{to{opacity:1}}@keyframes ringSpin{to{transform:rotate(360deg)}}.ngx-msg-overlay .icon-disc{position:absolute;inset:8px;border-radius:50%;background:var(--type-disc, linear-gradient(150deg, var(--violet), var(--violet-2)));display:flex;align-items:center;justify-content:center;box-shadow:0 10px 30px -6px var(--type-shadow, rgba(139, 123, 255, .55));transform:scale(0)}.ngx-msg-overlay.show .icon-disc{animation:discPop .6s .12s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes discPop{to{transform:scale(1)}}.ngx-msg-overlay .icon-disc svg{width:46px;height:46px;overflow:visible}.ngx-msg-overlay .icon-disc .draw{fill:none;stroke:#fff;stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:80;stroke-dashoffset:80}.ngx-msg-overlay.show .icon-disc .draw{animation:draw .5s .42s cubic-bezier(.4,0,.2,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}.ngx-msg-overlay .icon-disc .dot-mark{fill:#fff;opacity:0;transform:scale(0);transform-origin:center}.ngx-msg-overlay.show .icon-disc .dot-mark{animation:dotPop .3s .55s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes dotPop{to{opacity:1;transform:scale(1)}}.ngx-msg-overlay .spinner-wrap{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ngx-msg-overlay .spinner{width:52px;height:52px;border-radius:50%;border:5px solid rgba(255,255,255,.18);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.ngx-msg-modal h2{font-size:22px;font-weight:700;margin:0 0 10px;opacity:0;transform:translateY(8px)}.ngx-msg-modal p.desc{font-size:14.5px;line-height:1.85;color:var(--ink-1);margin:0 0 26px;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal h2{animation:textIn .5s .3s ease forwards}.ngx-msg-overlay.show .ngx-msg-modal p.desc{animation:textIn .5s .38s ease forwards}@keyframes textIn{to{opacity:1;transform:translateY(0)}}.ngx-msg-modal .ngx-msg-actions{display:flex;gap:10px;justify-content:center;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal .ngx-msg-actions{animation:textIn .5s .46s ease forwards}.ngx-msg-overlay .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-size:14.5px;font-weight:700;padding:12px 22px;border-radius:13px;transition:transform .18s cubic-bezier(.2,.8,.2,1),filter .2s,box-shadow .2s;flex:1;max-width:170px}.ngx-msg-overlay .btn:active{transform:scale(.95)}.ngx-msg-overlay .btn-primary{color:#0a0c14;background:var(--type-btn, linear-gradient(135deg, var(--violet), var(--cyan)));box-shadow:0 10px 24px -8px var(--type-shadow, rgba(139, 123, 255, .6))}.ngx-msg-overlay .btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px)}.ngx-msg-overlay .btn-ghost{color:var(--ink-1);background:#ffffff0b;border:1px solid var(--ngx-msg-panel-border)}.ngx-msg-overlay .btn-ghost:hover{color:var(--ink-0);background:#ffffff14}.ngx-msg-overlay .progress{position:absolute;bottom:0;left:0;height:3px;background:var(--type-btn, linear-gradient(90deg, var(--violet), var(--cyan)));width:100%;transform-origin:right center}.ngx-msg-overlay [dir=rtl] .progress{transform-origin:left center}@media(prefers-reduced-motion:reduce){.ngx-msg-overlay *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.ngx-msg-overlay .btn:focus-visible,.ngx-msg-overlay .trigger:focus-visible,.ngx-msg-overlay .close-x:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.ngx-msg-overlay[data-type=success] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--success-a), var(--success-b), var(--success-a));--type-disc: linear-gradient(150deg, var(--success-a), var(--success-b));--type-shadow: rgba(62, 224, 143, .5);--type-btn: linear-gradient(135deg, var(--success-a), var(--success-b));--type-glow: radial-gradient(circle, rgba(62, 224, 143, .35), transparent 70%)}.ngx-msg-overlay[data-type=error] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--error-a), var(--error-b), var(--error-a));--type-disc: linear-gradient(150deg, var(--error-a), var(--error-b));--type-shadow: rgba(255, 107, 139, .5);--type-btn: linear-gradient(135deg, var(--error-a), var(--error-b));--type-glow: radial-gradient(circle, rgba(255, 107, 139, .35), transparent 70%)}.ngx-msg-overlay[data-type=warning] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--warning-a), var(--warning-b), var(--warning-a));--type-disc: linear-gradient(150deg, var(--warning-a), var(--warning-b));--type-shadow: rgba(255, 140, 76, .5);--type-btn: linear-gradient(135deg, var(--warning-a), var(--warning-b));--type-glow: radial-gradient(circle, rgba(255, 140, 76, .35), transparent 70%)}.ngx-msg-overlay[data-type=info] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--info-a), var(--info-b), var(--info-a));--type-disc: linear-gradient(150deg, var(--info-a), var(--info-b));--type-shadow: rgba(91, 108, 255, .5);--type-btn: linear-gradient(135deg, var(--info-a), var(--info-b));--type-glow: radial-gradient(circle, rgba(91, 108, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=confirm] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--confirm-a), var(--confirm-b), var(--confirm-a));--type-disc: linear-gradient(150deg, var(--confirm-a), var(--confirm-b));--type-shadow: rgba(123, 92, 255, .5);--type-btn: linear-gradient(135deg, var(--confirm-a), var(--confirm-b));--type-glow: radial-gradient(circle, rgba(123, 92, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=loading] .ngx-msg-modal{--type-disc: linear-gradient(150deg, #9aa3c0, #565c78);--type-glow: radial-gradient(circle, rgba(154, 163, 192, .3), transparent 70%)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None });
177
+ ], viewQueries: [{ propertyName: "confetti", first: true, predicate: ["confetti"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"ngx-msg-overlay show\"\n (click)=\"onOutSideClick()\"\n [ngClass]=\"options.containerClass\"\n [class.has-backdrop]=\"options.backdrop\"\n [attr.data-type]=\"options.icon\">\n <div class=\"ngx-msg-modal\" (click)=\"innerOnClick($event)\">\n <div class=\"confetti\" #confetti></div>\n @if (options.showCloseButton) {\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\n }\n @if (showIcon()) {\n <div class=\"icon-stage\">\n <div class=\"icon-ring\"></div>\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\n </div>\n }\n <h2>{{ options.title }}</h2>\n <p class=\"desc\">\n {{ options.text }}\n <span [innerHTML]=\"options.html\"></span>\n </p>\n\n <div class=\"ngx-msg-actions\">\n @if (options.showCancelButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\n {{ options.cancelButtonText }}\n </button>\n }\n @if (options.showDenyButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onDeny()\"\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\n {{ options.denyButtonText }}\n </button>\n }\n @if (options.showConfirmButton) {\n <button\n class=\"btn btn-primary\"\n (click)=\"onConfirm()\"\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\n {{ options.confirmButtonText }}\n </button>\n }\n </div>\n </div>\n</div>\n", styles: [":root{--bg-0: #0a0c14;--bg-1: #0f1220;--ngx-msg-panel-bg: light-dark(#ffffffc4, #161928b8);--ngx-msg-panel-fg: light-dark(#000, #fff);--ngx-msg-panel-border: light-dark(#4545454a, #ffffff14);--ink-0: light-dark(#212121, #f3f4fb);--ink-1: light-dark(#2d2e32, #a8adc4);--ink-2: #6b7090;--violet: #8b7bff;--violet-2: #5b4fd1;--cyan: #43e0d8;--amber: #ffb454;--rose: #ff6b8b;--emerald: #3ee08f;--success-a: #3ee08f;--success-b: #1fb8b0;--error-a: #ff6b8b;--error-b: #c23f6b;--warning-a: #ffc45c;--warning-b: #ff8a4c;--info-a: #7cc1ff;--info-b: #5b6cff;--confirm-a: #c58bff;--confirm-b: #7b5cff}.ngx-msg-overlay{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:24px;background:#06070e8c;backdrop-filter:blur(6px) saturate(140%);-webkit-backdrop-filter:blur(6px) saturate(140%);opacity:0;visibility:hidden;transition:opacity .35s ease,visibility .35s ease}.ngx-msg-overlay.show{opacity:1;visibility:visible}.ngx-msg-modal{position:relative;min-width:400px;max-width:80dvw;background-color:var(--ngx-msg-panel-bg);color:var(--ngx-msg-panel-fg);border:1px solid var(--ngx-msg-panel-border);border-radius:26px;padding:38px 30px 28px;text-align:center;box-shadow:0 30px 80px -20px #0009,0 0 0 1px #ffffff05 inset;transform:translateY(28px) scale(.92);opacity:0;transition:transform .1s,opacity .1s;overflow:hidden}.ngx-msg-overlay.show .ngx-msg-modal{animation:modalIn .55s cubic-bezier(.2,1.1,.3,1) forwards}.ngx-msg-overlay.closing .ngx-msg-modal{animation:modalOut .28s cubic-bezier(.4,0,1,1) forwards}@keyframes modalIn{0%{transform:translateY(28px) scale(.9);opacity:0}60%{transform:translateY(-4px) scale(1.015);opacity:1}to{transform:translateY(0) scale(1);opacity:1}}@keyframes modalOut{to{transform:translateY(14px) scale(.94);opacity:0}}.ngx-msg-modal:before{content:\"\";position:absolute;top:-60px;left:50%;translate:-50% 0;width:260px;height:200px;border-radius:50%;background:var(--type-glow, radial-gradient(circle, rgba(139, 123, 255, .35), transparent 70%));filter:blur(20px);pointer-events:none}.ngx-msg-modal .close-x{position:absolute;top:4px;left:4px;width:30px;height:30px;border-radius:50%;border:none;background:none;color:var(--ink-2);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;line-height:1;transition:background .2s,color .2s,transform .2s;transform-origin:center;font-family:none}.ngx-msg-modal .close-x:hover{background:#ffffff14;color:var(--ink-0);transform:rotate(90deg)}.ngx-msg-overlay .icon-stage{position:relative;width:96px;height:96px;margin:4px auto 22px}.ngx-msg-overlay .icon-ring{position:absolute;inset:0;border-radius:50%;background:var(--type-ring, conic-gradient(from 0deg, var(--violet), var(--cyan), var(--violet)));-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));opacity:0}.ngx-msg-overlay.show .icon-ring{animation:ringIn .8s .05s cubic-bezier(.2,.8,.2,1) forwards,ringSpin 6s linear infinite}@keyframes ringIn{to{opacity:1}}@keyframes ringSpin{to{transform:rotate(360deg)}}.ngx-msg-overlay .icon-disc{position:absolute;inset:8px;border-radius:50%;background:var(--type-disc, linear-gradient(150deg, var(--violet), var(--violet-2)));display:flex;align-items:center;justify-content:center;box-shadow:0 10px 30px -6px var(--type-shadow, rgba(139, 123, 255, .55));transform:scale(0)}.ngx-msg-overlay.show .icon-disc{animation:discPop .6s .12s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes discPop{to{transform:scale(1)}}.ngx-msg-overlay .icon-disc svg{width:46px;height:46px;overflow:visible}.ngx-msg-overlay .icon-disc .draw{fill:none;stroke:#fff;stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:80;stroke-dashoffset:80}.ngx-msg-overlay.show .icon-disc .draw{animation:draw .5s .42s cubic-bezier(.4,0,.2,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}.ngx-msg-overlay .icon-disc .dot-mark{fill:#fff;opacity:0;transform:scale(0);transform-origin:center}.ngx-msg-overlay.show .icon-disc .dot-mark{animation:dotPop .3s .55s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes dotPop{to{opacity:1;transform:scale(1)}}.ngx-msg-overlay .spinner-wrap{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ngx-msg-overlay .spinner{width:52px;height:52px;border-radius:50%;border:5px solid rgba(255,255,255,.18);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.ngx-msg-modal h2{font-size:22px;font-weight:700;margin:0 0 10px;opacity:0;transform:translateY(8px)}.ngx-msg-modal p.desc{font-size:14.5px;line-height:1.85;color:var(--ink-1);margin:0 0 26px;opacity:0;transform:translateY(8px);overflow:auto;max-height:70dvh}.ngx-msg-overlay.show .ngx-msg-modal h2{animation:textIn .5s .3s ease forwards}.ngx-msg-overlay.show .ngx-msg-modal p.desc{animation:textIn .5s .38s ease forwards}@keyframes textIn{to{opacity:1;transform:translateY(0)}}.ngx-msg-modal .ngx-msg-actions{display:flex;gap:10px;justify-content:center;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal .ngx-msg-actions{animation:textIn .5s .46s ease forwards}.ngx-msg-overlay .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-size:14.5px;font-weight:700;padding:12px 22px;border-radius:13px;transition:transform .18s cubic-bezier(.2,.8,.2,1),filter .2s,box-shadow .2s;flex:1;max-width:170px}.ngx-msg-overlay .btn:active{transform:scale(.95)}.ngx-msg-overlay .btn-primary{color:#0a0c14;background:var(--type-btn, linear-gradient(135deg, var(--violet), var(--cyan)));box-shadow:0 10px 24px -8px var(--type-shadow, rgba(139, 123, 255, .6))}.ngx-msg-overlay .btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px)}.ngx-msg-overlay .btn-ghost{color:var(--ink-1);background:#ffffff0b;border:1px solid var(--ngx-msg-panel-border)}.ngx-msg-overlay .btn-ghost:hover{color:var(--ink-0);background:#ffffff14}.ngx-msg-overlay .progress{position:absolute;bottom:0;left:0;height:3px;background:var(--type-btn, linear-gradient(90deg, var(--violet), var(--cyan)));width:100%;transform-origin:right center}.ngx-msg-overlay [dir=rtl] .progress{transform-origin:left center}@media(prefers-reduced-motion:reduce){.ngx-msg-overlay *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.ngx-msg-overlay .btn:focus-visible,.ngx-msg-overlay .trigger:focus-visible,.ngx-msg-overlay .close-x:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.ngx-msg-overlay[data-type=success] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--success-a), var(--success-b), var(--success-a));--type-disc: linear-gradient(150deg, var(--success-a), var(--success-b));--type-shadow: rgba(62, 224, 143, .5);--type-btn: linear-gradient(135deg, var(--success-a), var(--success-b));--type-glow: radial-gradient(circle, rgba(62, 224, 143, .35), transparent 70%)}.ngx-msg-overlay[data-type=error] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--error-a), var(--error-b), var(--error-a));--type-disc: linear-gradient(150deg, var(--error-a), var(--error-b));--type-shadow: rgba(255, 107, 139, .5);--type-btn: linear-gradient(135deg, var(--error-a), var(--error-b));--type-glow: radial-gradient(circle, rgba(255, 107, 139, .35), transparent 70%)}.ngx-msg-overlay[data-type=warning] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--warning-a), var(--warning-b), var(--warning-a));--type-disc: linear-gradient(150deg, var(--warning-a), var(--warning-b));--type-shadow: rgba(255, 140, 76, .5);--type-btn: linear-gradient(135deg, var(--warning-a), var(--warning-b));--type-glow: radial-gradient(circle, rgba(255, 140, 76, .35), transparent 70%)}.ngx-msg-overlay[data-type=info] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--info-a), var(--info-b), var(--info-a));--type-disc: linear-gradient(150deg, var(--info-a), var(--info-b));--type-shadow: rgba(91, 108, 255, .5);--type-btn: linear-gradient(135deg, var(--info-a), var(--info-b));--type-glow: radial-gradient(circle, rgba(91, 108, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=confirm] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--confirm-a), var(--confirm-b), var(--confirm-a));--type-disc: linear-gradient(150deg, var(--confirm-a), var(--confirm-b));--type-shadow: rgba(123, 92, 255, .5);--type-btn: linear-gradient(135deg, var(--confirm-a), var(--confirm-b));--type-glow: radial-gradient(circle, rgba(123, 92, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=loading] .ngx-msg-modal{--type-disc: linear-gradient(150deg, #9aa3c0, #565c78);--type-glow: radial-gradient(circle, rgba(154, 163, 192, .3), transparent 70%)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None });
178
178
  }
179
179
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxMessageComponent, decorators: [{
180
180
  type: Component,
@@ -183,7 +183,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
183
183
  provide: NGX_MESSAGE_CONFIGS,
184
184
  useValue: NGX_MESSAGE_DEFAULT_OPTIONS,
185
185
  },
186
- ], template: "<div\n class=\"ngx-msg-overlay show\"\n (click)=\"onOutSideClick()\"\n [ngClass]=\"options.containerClass\"\n [class.has-backdrop]=\"options.backdrop\"\n [attr.data-type]=\"options.icon\">\n <div class=\"ngx-msg-modal\" (click)=\"innerOnClick($event)\">\n <div class=\"confetti\" #confetti></div>\n @if (options.showCloseButton) {\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\n }\n @if (showIcon()) {\n <div class=\"icon-stage\">\n <div class=\"icon-ring\"></div>\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\n </div>\n }\n <h2>{{ options.title }}</h2>\n <p class=\"desc\">\n {{ options.text }}\n <span [innerHTML]=\"options.html\"></span>\n </p>\n\n <div class=\"ngx-msg-actions\">\n @if (options.showCancelButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\n {{ options.cancelButtonText }}\n </button>\n }\n @if (options.showDenyButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onDeny()\"\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\n {{ options.denyButtonText }}\n </button>\n }\n @if (options.showConfirmButton) {\n <button\n class=\"btn btn-primary\"\n (click)=\"onConfirm()\"\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\n {{ options.confirmButtonText }}\n </button>\n }\n </div>\n </div>\n</div>\n", styles: [":root{--bg-0: #0a0c14;--bg-1: #0f1220;--ngx-msg-panel-bg: light-dark(#ffffffc4, #161928b8);--ngx-msg-panel-fg: light-dark(#000, #fff);--ngx-msg-panel-border: light-dark(#4545454a, #ffffff14);--ink-0: light-dark(#212121, #f3f4fb);--ink-1: light-dark(#2d2e32, #a8adc4);--ink-2: #6b7090;--violet: #8b7bff;--violet-2: #5b4fd1;--cyan: #43e0d8;--amber: #ffb454;--rose: #ff6b8b;--emerald: #3ee08f;--success-a: #3ee08f;--success-b: #1fb8b0;--error-a: #ff6b8b;--error-b: #c23f6b;--warning-a: #ffc45c;--warning-b: #ff8a4c;--info-a: #7cc1ff;--info-b: #5b6cff;--confirm-a: #c58bff;--confirm-b: #7b5cff}.ngx-msg-overlay{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:24px;background:#06070e8c;backdrop-filter:blur(6px) saturate(140%);-webkit-backdrop-filter:blur(6px) saturate(140%);opacity:0;visibility:hidden;transition:opacity .35s ease,visibility .35s ease}.ngx-msg-overlay.show{opacity:1;visibility:visible}.ngx-msg-modal{position:relative;width:100%;max-width:400px;background-color:var(--ngx-msg-panel-bg);color:var(--ngx-msg-panel-fg);border:1px solid var(--ngx-msg-panel-border);border-radius:26px;padding:38px 30px 28px;text-align:center;box-shadow:0 30px 80px -20px #0009,0 0 0 1px #ffffff05 inset;transform:translateY(28px) scale(.92);opacity:0;transition:transform .1s,opacity .1s;overflow:hidden}.ngx-msg-overlay.show .ngx-msg-modal{animation:modalIn .55s cubic-bezier(.2,1.1,.3,1) forwards}.ngx-msg-overlay.closing .ngx-msg-modal{animation:modalOut .28s cubic-bezier(.4,0,1,1) forwards}@keyframes modalIn{0%{transform:translateY(28px) scale(.9);opacity:0}60%{transform:translateY(-4px) scale(1.015);opacity:1}to{transform:translateY(0) scale(1);opacity:1}}@keyframes modalOut{to{transform:translateY(14px) scale(.94);opacity:0}}.ngx-msg-modal:before{content:\"\";position:absolute;top:-60px;left:50%;translate:-50% 0;width:260px;height:200px;border-radius:50%;background:var(--type-glow, radial-gradient(circle, rgba(139, 123, 255, .35), transparent 70%));filter:blur(20px);pointer-events:none}.ngx-msg-modal .close-x{position:absolute;top:4px;left:4px;width:30px;height:30px;border-radius:50%;border:none;background:none;color:var(--ink-2);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;line-height:1;transition:background .2s,color .2s,transform .2s;transform-origin:center;font-family:none}.ngx-msg-modal .close-x:hover{background:#ffffff14;color:var(--ink-0);transform:rotate(90deg)}.ngx-msg-overlay .icon-stage{position:relative;width:96px;height:96px;margin:4px auto 22px}.ngx-msg-overlay .icon-ring{position:absolute;inset:0;border-radius:50%;background:var(--type-ring, conic-gradient(from 0deg, var(--violet), var(--cyan), var(--violet)));-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));opacity:0}.ngx-msg-overlay.show .icon-ring{animation:ringIn .8s .05s cubic-bezier(.2,.8,.2,1) forwards,ringSpin 6s linear infinite}@keyframes ringIn{to{opacity:1}}@keyframes ringSpin{to{transform:rotate(360deg)}}.ngx-msg-overlay .icon-disc{position:absolute;inset:8px;border-radius:50%;background:var(--type-disc, linear-gradient(150deg, var(--violet), var(--violet-2)));display:flex;align-items:center;justify-content:center;box-shadow:0 10px 30px -6px var(--type-shadow, rgba(139, 123, 255, .55));transform:scale(0)}.ngx-msg-overlay.show .icon-disc{animation:discPop .6s .12s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes discPop{to{transform:scale(1)}}.ngx-msg-overlay .icon-disc svg{width:46px;height:46px;overflow:visible}.ngx-msg-overlay .icon-disc .draw{fill:none;stroke:#fff;stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:80;stroke-dashoffset:80}.ngx-msg-overlay.show .icon-disc .draw{animation:draw .5s .42s cubic-bezier(.4,0,.2,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}.ngx-msg-overlay .icon-disc .dot-mark{fill:#fff;opacity:0;transform:scale(0);transform-origin:center}.ngx-msg-overlay.show .icon-disc .dot-mark{animation:dotPop .3s .55s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes dotPop{to{opacity:1;transform:scale(1)}}.ngx-msg-overlay .spinner-wrap{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ngx-msg-overlay .spinner{width:52px;height:52px;border-radius:50%;border:5px solid rgba(255,255,255,.18);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.ngx-msg-modal h2{font-size:22px;font-weight:700;margin:0 0 10px;opacity:0;transform:translateY(8px)}.ngx-msg-modal p.desc{font-size:14.5px;line-height:1.85;color:var(--ink-1);margin:0 0 26px;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal h2{animation:textIn .5s .3s ease forwards}.ngx-msg-overlay.show .ngx-msg-modal p.desc{animation:textIn .5s .38s ease forwards}@keyframes textIn{to{opacity:1;transform:translateY(0)}}.ngx-msg-modal .ngx-msg-actions{display:flex;gap:10px;justify-content:center;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal .ngx-msg-actions{animation:textIn .5s .46s ease forwards}.ngx-msg-overlay .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-size:14.5px;font-weight:700;padding:12px 22px;border-radius:13px;transition:transform .18s cubic-bezier(.2,.8,.2,1),filter .2s,box-shadow .2s;flex:1;max-width:170px}.ngx-msg-overlay .btn:active{transform:scale(.95)}.ngx-msg-overlay .btn-primary{color:#0a0c14;background:var(--type-btn, linear-gradient(135deg, var(--violet), var(--cyan)));box-shadow:0 10px 24px -8px var(--type-shadow, rgba(139, 123, 255, .6))}.ngx-msg-overlay .btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px)}.ngx-msg-overlay .btn-ghost{color:var(--ink-1);background:#ffffff0b;border:1px solid var(--ngx-msg-panel-border)}.ngx-msg-overlay .btn-ghost:hover{color:var(--ink-0);background:#ffffff14}.ngx-msg-overlay .progress{position:absolute;bottom:0;left:0;height:3px;background:var(--type-btn, linear-gradient(90deg, var(--violet), var(--cyan)));width:100%;transform-origin:right center}.ngx-msg-overlay [dir=rtl] .progress{transform-origin:left center}@media(prefers-reduced-motion:reduce){.ngx-msg-overlay *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.ngx-msg-overlay .btn:focus-visible,.ngx-msg-overlay .trigger:focus-visible,.ngx-msg-overlay .close-x:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.ngx-msg-overlay[data-type=success] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--success-a), var(--success-b), var(--success-a));--type-disc: linear-gradient(150deg, var(--success-a), var(--success-b));--type-shadow: rgba(62, 224, 143, .5);--type-btn: linear-gradient(135deg, var(--success-a), var(--success-b));--type-glow: radial-gradient(circle, rgba(62, 224, 143, .35), transparent 70%)}.ngx-msg-overlay[data-type=error] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--error-a), var(--error-b), var(--error-a));--type-disc: linear-gradient(150deg, var(--error-a), var(--error-b));--type-shadow: rgba(255, 107, 139, .5);--type-btn: linear-gradient(135deg, var(--error-a), var(--error-b));--type-glow: radial-gradient(circle, rgba(255, 107, 139, .35), transparent 70%)}.ngx-msg-overlay[data-type=warning] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--warning-a), var(--warning-b), var(--warning-a));--type-disc: linear-gradient(150deg, var(--warning-a), var(--warning-b));--type-shadow: rgba(255, 140, 76, .5);--type-btn: linear-gradient(135deg, var(--warning-a), var(--warning-b));--type-glow: radial-gradient(circle, rgba(255, 140, 76, .35), transparent 70%)}.ngx-msg-overlay[data-type=info] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--info-a), var(--info-b), var(--info-a));--type-disc: linear-gradient(150deg, var(--info-a), var(--info-b));--type-shadow: rgba(91, 108, 255, .5);--type-btn: linear-gradient(135deg, var(--info-a), var(--info-b));--type-glow: radial-gradient(circle, rgba(91, 108, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=confirm] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--confirm-a), var(--confirm-b), var(--confirm-a));--type-disc: linear-gradient(150deg, var(--confirm-a), var(--confirm-b));--type-shadow: rgba(123, 92, 255, .5);--type-btn: linear-gradient(135deg, var(--confirm-a), var(--confirm-b));--type-glow: radial-gradient(circle, rgba(123, 92, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=loading] .ngx-msg-modal{--type-disc: linear-gradient(150deg, #9aa3c0, #565c78);--type-glow: radial-gradient(circle, rgba(154, 163, 192, .3), transparent 70%)}\n"] }]
186
+ ], template: "<div\n class=\"ngx-msg-overlay show\"\n (click)=\"onOutSideClick()\"\n [ngClass]=\"options.containerClass\"\n [class.has-backdrop]=\"options.backdrop\"\n [attr.data-type]=\"options.icon\">\n <div class=\"ngx-msg-modal\" (click)=\"innerOnClick($event)\">\n <div class=\"confetti\" #confetti></div>\n @if (options.showCloseButton) {\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\n }\n @if (showIcon()) {\n <div class=\"icon-stage\">\n <div class=\"icon-ring\"></div>\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\n </div>\n }\n <h2>{{ options.title }}</h2>\n <p class=\"desc\">\n {{ options.text }}\n <span [innerHTML]=\"options.html\"></span>\n </p>\n\n <div class=\"ngx-msg-actions\">\n @if (options.showCancelButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\n {{ options.cancelButtonText }}\n </button>\n }\n @if (options.showDenyButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onDeny()\"\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\n {{ options.denyButtonText }}\n </button>\n }\n @if (options.showConfirmButton) {\n <button\n class=\"btn btn-primary\"\n (click)=\"onConfirm()\"\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\n {{ options.confirmButtonText }}\n </button>\n }\n </div>\n </div>\n</div>\n", styles: [":root{--bg-0: #0a0c14;--bg-1: #0f1220;--ngx-msg-panel-bg: light-dark(#ffffffc4, #161928b8);--ngx-msg-panel-fg: light-dark(#000, #fff);--ngx-msg-panel-border: light-dark(#4545454a, #ffffff14);--ink-0: light-dark(#212121, #f3f4fb);--ink-1: light-dark(#2d2e32, #a8adc4);--ink-2: #6b7090;--violet: #8b7bff;--violet-2: #5b4fd1;--cyan: #43e0d8;--amber: #ffb454;--rose: #ff6b8b;--emerald: #3ee08f;--success-a: #3ee08f;--success-b: #1fb8b0;--error-a: #ff6b8b;--error-b: #c23f6b;--warning-a: #ffc45c;--warning-b: #ff8a4c;--info-a: #7cc1ff;--info-b: #5b6cff;--confirm-a: #c58bff;--confirm-b: #7b5cff}.ngx-msg-overlay{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:24px;background:#06070e8c;backdrop-filter:blur(6px) saturate(140%);-webkit-backdrop-filter:blur(6px) saturate(140%);opacity:0;visibility:hidden;transition:opacity .35s ease,visibility .35s ease}.ngx-msg-overlay.show{opacity:1;visibility:visible}.ngx-msg-modal{position:relative;min-width:400px;max-width:80dvw;background-color:var(--ngx-msg-panel-bg);color:var(--ngx-msg-panel-fg);border:1px solid var(--ngx-msg-panel-border);border-radius:26px;padding:38px 30px 28px;text-align:center;box-shadow:0 30px 80px -20px #0009,0 0 0 1px #ffffff05 inset;transform:translateY(28px) scale(.92);opacity:0;transition:transform .1s,opacity .1s;overflow:hidden}.ngx-msg-overlay.show .ngx-msg-modal{animation:modalIn .55s cubic-bezier(.2,1.1,.3,1) forwards}.ngx-msg-overlay.closing .ngx-msg-modal{animation:modalOut .28s cubic-bezier(.4,0,1,1) forwards}@keyframes modalIn{0%{transform:translateY(28px) scale(.9);opacity:0}60%{transform:translateY(-4px) scale(1.015);opacity:1}to{transform:translateY(0) scale(1);opacity:1}}@keyframes modalOut{to{transform:translateY(14px) scale(.94);opacity:0}}.ngx-msg-modal:before{content:\"\";position:absolute;top:-60px;left:50%;translate:-50% 0;width:260px;height:200px;border-radius:50%;background:var(--type-glow, radial-gradient(circle, rgba(139, 123, 255, .35), transparent 70%));filter:blur(20px);pointer-events:none}.ngx-msg-modal .close-x{position:absolute;top:4px;left:4px;width:30px;height:30px;border-radius:50%;border:none;background:none;color:var(--ink-2);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;line-height:1;transition:background .2s,color .2s,transform .2s;transform-origin:center;font-family:none}.ngx-msg-modal .close-x:hover{background:#ffffff14;color:var(--ink-0);transform:rotate(90deg)}.ngx-msg-overlay .icon-stage{position:relative;width:96px;height:96px;margin:4px auto 22px}.ngx-msg-overlay .icon-ring{position:absolute;inset:0;border-radius:50%;background:var(--type-ring, conic-gradient(from 0deg, var(--violet), var(--cyan), var(--violet)));-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));opacity:0}.ngx-msg-overlay.show .icon-ring{animation:ringIn .8s .05s cubic-bezier(.2,.8,.2,1) forwards,ringSpin 6s linear infinite}@keyframes ringIn{to{opacity:1}}@keyframes ringSpin{to{transform:rotate(360deg)}}.ngx-msg-overlay .icon-disc{position:absolute;inset:8px;border-radius:50%;background:var(--type-disc, linear-gradient(150deg, var(--violet), var(--violet-2)));display:flex;align-items:center;justify-content:center;box-shadow:0 10px 30px -6px var(--type-shadow, rgba(139, 123, 255, .55));transform:scale(0)}.ngx-msg-overlay.show .icon-disc{animation:discPop .6s .12s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes discPop{to{transform:scale(1)}}.ngx-msg-overlay .icon-disc svg{width:46px;height:46px;overflow:visible}.ngx-msg-overlay .icon-disc .draw{fill:none;stroke:#fff;stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:80;stroke-dashoffset:80}.ngx-msg-overlay.show .icon-disc .draw{animation:draw .5s .42s cubic-bezier(.4,0,.2,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}.ngx-msg-overlay .icon-disc .dot-mark{fill:#fff;opacity:0;transform:scale(0);transform-origin:center}.ngx-msg-overlay.show .icon-disc .dot-mark{animation:dotPop .3s .55s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes dotPop{to{opacity:1;transform:scale(1)}}.ngx-msg-overlay .spinner-wrap{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ngx-msg-overlay .spinner{width:52px;height:52px;border-radius:50%;border:5px solid rgba(255,255,255,.18);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.ngx-msg-modal h2{font-size:22px;font-weight:700;margin:0 0 10px;opacity:0;transform:translateY(8px)}.ngx-msg-modal p.desc{font-size:14.5px;line-height:1.85;color:var(--ink-1);margin:0 0 26px;opacity:0;transform:translateY(8px);overflow:auto;max-height:70dvh}.ngx-msg-overlay.show .ngx-msg-modal h2{animation:textIn .5s .3s ease forwards}.ngx-msg-overlay.show .ngx-msg-modal p.desc{animation:textIn .5s .38s ease forwards}@keyframes textIn{to{opacity:1;transform:translateY(0)}}.ngx-msg-modal .ngx-msg-actions{display:flex;gap:10px;justify-content:center;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal .ngx-msg-actions{animation:textIn .5s .46s ease forwards}.ngx-msg-overlay .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-size:14.5px;font-weight:700;padding:12px 22px;border-radius:13px;transition:transform .18s cubic-bezier(.2,.8,.2,1),filter .2s,box-shadow .2s;flex:1;max-width:170px}.ngx-msg-overlay .btn:active{transform:scale(.95)}.ngx-msg-overlay .btn-primary{color:#0a0c14;background:var(--type-btn, linear-gradient(135deg, var(--violet), var(--cyan)));box-shadow:0 10px 24px -8px var(--type-shadow, rgba(139, 123, 255, .6))}.ngx-msg-overlay .btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px)}.ngx-msg-overlay .btn-ghost{color:var(--ink-1);background:#ffffff0b;border:1px solid var(--ngx-msg-panel-border)}.ngx-msg-overlay .btn-ghost:hover{color:var(--ink-0);background:#ffffff14}.ngx-msg-overlay .progress{position:absolute;bottom:0;left:0;height:3px;background:var(--type-btn, linear-gradient(90deg, var(--violet), var(--cyan)));width:100%;transform-origin:right center}.ngx-msg-overlay [dir=rtl] .progress{transform-origin:left center}@media(prefers-reduced-motion:reduce){.ngx-msg-overlay *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.ngx-msg-overlay .btn:focus-visible,.ngx-msg-overlay .trigger:focus-visible,.ngx-msg-overlay .close-x:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.ngx-msg-overlay[data-type=success] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--success-a), var(--success-b), var(--success-a));--type-disc: linear-gradient(150deg, var(--success-a), var(--success-b));--type-shadow: rgba(62, 224, 143, .5);--type-btn: linear-gradient(135deg, var(--success-a), var(--success-b));--type-glow: radial-gradient(circle, rgba(62, 224, 143, .35), transparent 70%)}.ngx-msg-overlay[data-type=error] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--error-a), var(--error-b), var(--error-a));--type-disc: linear-gradient(150deg, var(--error-a), var(--error-b));--type-shadow: rgba(255, 107, 139, .5);--type-btn: linear-gradient(135deg, var(--error-a), var(--error-b));--type-glow: radial-gradient(circle, rgba(255, 107, 139, .35), transparent 70%)}.ngx-msg-overlay[data-type=warning] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--warning-a), var(--warning-b), var(--warning-a));--type-disc: linear-gradient(150deg, var(--warning-a), var(--warning-b));--type-shadow: rgba(255, 140, 76, .5);--type-btn: linear-gradient(135deg, var(--warning-a), var(--warning-b));--type-glow: radial-gradient(circle, rgba(255, 140, 76, .35), transparent 70%)}.ngx-msg-overlay[data-type=info] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--info-a), var(--info-b), var(--info-a));--type-disc: linear-gradient(150deg, var(--info-a), var(--info-b));--type-shadow: rgba(91, 108, 255, .5);--type-btn: linear-gradient(135deg, var(--info-a), var(--info-b));--type-glow: radial-gradient(circle, rgba(91, 108, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=confirm] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--confirm-a), var(--confirm-b), var(--confirm-a));--type-disc: linear-gradient(150deg, var(--confirm-a), var(--confirm-b));--type-shadow: rgba(123, 92, 255, .5);--type-btn: linear-gradient(135deg, var(--confirm-a), var(--confirm-b));--type-glow: radial-gradient(circle, rgba(123, 92, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=loading] .ngx-msg-modal{--type-disc: linear-gradient(150deg, #9aa3c0, #565c78);--type-glow: radial-gradient(circle, rgba(154, 163, 192, .3), transparent 70%)}\n"] }]
187
187
  }], propDecorators: { confetti: [{ type: i0.ViewChild, args: ['confetti', { isSignal: true }] }], onScapeKey: [{
188
188
  type: HostListener,
189
189
  args: ['document:keydown.escape', ['$event']]
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-message.mjs","sources":["../../../projects/libs/message/models/tokens.ts","../../../projects/libs/message/models/message-result.ts","../../../projects/libs/message/models/icons.ts","../../../projects/libs/message/components/message.component.ts","../../../projects/libs/message/components/message.component.html","../../../projects/libs/message/services/apply-default.ts","../../../projects/libs/message/services/message.service.ts","../../../projects/libs/message/message-facade.ts","../../../projects/libs/message/message-provider.ts","../../../projects/libs/message/models/message-options.ts","../../../projects/libs/message/ngx-kit-message.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { IMessageOptions } from './message-options.interface';\nimport { NgxMessageService } from '../public-api';\nimport { MessageOptions } from './message-options';\n\nexport const NGX_MESSAGE_CONFIGS = new InjectionToken<IMessageOptions>('ngx-message-configs');\n\nexport const NGX_MESSAGE_API = new InjectionToken<NgxMessageService>('NgxMessageService');\nexport const NGX_MESSAGE_DEFAULT_OPTIONS: MessageOptions = {\n useOverlay: true,\n title: '',\n text: '',\n html: '',\n backdrop: true,\n icon: 'None',\n width: undefined,\n allowOutsideClick: true,\n allowEscapeKey: true,\n allowEnterKey: true,\n showConfirmButton: true,\n showDenyButton: false,\n showCancelButton: false,\n confirmButtonText: 'Ok',\n denyButtonText: 'No',\n cancelButtonText: 'Cancel',\n confirmButtonColor: '',\n denyButtonColor: '',\n cancelButtonColor: '',\n confirmButtonAriaLabel: '',\n denyButtonAriaLabel: '',\n cancelButtonAriaLabel: '',\n reverseButtons: false,\n showCloseButton: true,\n containerClass: '',\n};\n","import { EventEmitter } from '@angular/core';\n\nexport type MessageOutput<T = any> = {\n id: number;\n close: () => void;\n afterClose: EventEmitter<MessageResult>;\n};\nexport interface MessageResult<T = any> {\n readonly isConfirmed: boolean;\n readonly isDenied: boolean;\n readonly isDismissed: boolean;\n /**\n * @description ❌⚠️NOT Implemented!⚠️❌\n */\n readonly value?: T;\n readonly dismiss?: DismissReason;\n}\n\n/**\n * An enum of possible reasons that can explain an alert dismissal.\n */\nexport enum DismissReason {\n cancel,\n backdrop,\n close,\n /**\n * @description ❌⚠️NOT Implemented!⚠️❌\n */\n esc,\n /**\n * @description ❌⚠️NOT Implemented!⚠️❌\n */\n timer,\n}\n","// 'None' | 'success' | 'error' | 'warning' | 'info' | 'question' | 'loading';\nexport const ICONS: { [key: string]: string } = {\n None: '',\n success: `<svg viewBox=\"0 0 46 46\"><path class=\"draw\" d=\"M12 24 L20 32 L34 15\"/></svg>`,\n error: `<svg viewBox=\"0 0 46 46\"><path class=\"draw\" d=\"M14 14 L32 32\"/><path class=\"draw\" style=\"animation-delay:.55s\" d=\"M32 14 L14 32\"/></svg>`,\n warning: `<svg viewBox=\"0 0 46 46\"><path class=\"draw\" d=\"M23 10 L23 26\"/><circle class=\"dot-mark\" cx=\"23\" cy=\"34\" r=\"3.4\"/></svg>`,\n info: `<svg viewBox=\"0 0 46 46\"><circle class=\"dot-mark\" cx=\"23\" cy=\"12\" r=\"3.2\" style=\"animation-delay:.28s\"/><path class=\"draw\" style=\"animation-delay:.4s\" d=\"M23 20 L23 36\"/></svg>`,\n question: `<svg viewBox=\"0 0 320 512\"><path fill=\"currentColor\" d=\"M204.3 32.01H96c-52.94 0-96 43.06-96 96c0 17.67 14.31 31.1 32 31.1s32-14.32 32-31.1c0-17.64 14.34-32 32-32h108.3C232.8 96.01 256 119.2 256 147.8c0 19.72-10.97 37.47-30.5 47.33L127.8 252.4C117.1 258.2 112 268.7 112 280v40c0 17.67 14.31 31.99 32 31.99s32-14.32 32-31.99V298.3L256 251.3c39.47-19.75 64-59.42 64-103.5C320 83.95 268.1 32.01 204.3 32.01zM144 400c-22.09 0-40 17.91-40 40s17.91 39.1 40 39.1s40-17.9 40-39.1S166.1 400 144 400z\"/></svg>`,\n loading: `<div class=\"spinner-wrap\"><div class=\"spinner\"></div></div>`,\n};\n","import {\r\n AfterViewInit,\r\n Component,\r\n DOCUMENT,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n OnInit,\r\n signal,\r\n viewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { IMessageOptions } from '../models/message-options.interface';\r\nimport { Subject } from 'rxjs';\r\nimport { MessageResult, DismissReason } from '../models/message-result';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS } from '../models/tokens';\r\nimport { ICONS } from '../models/icons';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { makeConfetti } from 'ngx-kit/shared';\r\nimport { NgxMessageService } from '../services/message.service';\r\n\r\n@Component({\r\n selector: 'ngx-message',\r\n templateUrl: 'message.component.html',\r\n styleUrls: ['./message.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n imports: [CommonModule],\r\n providers: [\r\n {\r\n provide: NGX_MESSAGE_CONFIGS,\r\n useValue: NGX_MESSAGE_DEFAULT_OPTIONS,\r\n },\r\n ],\r\n})\r\nexport class NgxMessageComponent implements OnInit, AfterViewInit {\r\n icon?: SafeHtml;\r\n showIcon = signal(true);\r\n options!: IMessageOptions;\r\n confetti = viewChild<ElementRef<HTMLDivElement>>('confetti');\r\n index = 0;\r\n\r\n protected sanitizer = inject(DomSanitizer);\r\n protected doc = inject(DOCUMENT);\r\n private readonly messageService = inject(NgxMessageService);\r\n\r\n private readonly _onClose = new Subject<{ index: number; result: MessageResult<any> }>();\r\n public onClose = this._onClose.asObservable();\r\n\r\n ngOnInit(): void {\r\n this.showIcon.update((x) => (x = this.options.icon != 'None'));\r\n this.icon = this.sanitizer.bypassSecurityTrustHtml(ICONS[this.options.icon ?? 'None']);\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const confetti = this.confetti()?.nativeElement;\r\n if (this.options.icon == 'success' && confetti) {\r\n makeConfetti(this.doc, confetti);\r\n }\r\n }\r\n\r\n /**\r\n * وقتی چند تا پیام هم‌زمان باز باشن، هرکدوم listener خودشو روی document\r\n * داشت — پس یه فشردن Escape/Enter، رویداد رو به *همه‌شون* هم‌زمان می‌فرستاد،\r\n * نه فقط آخرین پیامی که باز شده (رفتار طبیعیِ یه استکِ مودال باید این باشه\r\n * که فقط بالاترین لایه به کیبورد واکنش نشون بده). این چک همون چیزیه که\r\n * OverlayService با getLastDialog() برای اورلی‌ها انجام می‌ده.\r\n */\r\n private isTopmost(): boolean {\r\n const ids = [...this.messageService.alerts.keys()];\r\n if (!ids.length) return true;\r\n return this.index === Math.max(...ids);\r\n }\r\n\r\n @HostListener('document:keydown.escape', ['$event'])\r\n onScapeKey(event: Event) {\r\n if (this.options.allowEscapeKey && this.isTopmost()) {\r\n this.onCancel();\r\n }\r\n }\r\n\r\n @HostListener('document:keydown.enter', ['$event'])\r\n onEnterKey(event: Event) {\r\n if (!this.isTopmost()) return;\r\n event.stopPropagation();\r\n event.preventDefault();\r\n if (this.options.allowEnterKey) {\r\n if (this.options.showConfirmButton) {\r\n this.onConfirm();\r\n } else if (this.options.showDenyButton) {\r\n this.onDeny();\r\n } else {\r\n this.onCancel();\r\n }\r\n }\r\n }\r\n\r\n onConfirm() {\r\n this._onClose.next({\r\n index: this.index,\r\n result: {\r\n isConfirmed: true,\r\n isDismissed: false,\r\n isDenied: false,\r\n dismiss: DismissReason.close,\r\n },\r\n });\r\n }\r\n onCancel() {\r\n this._onClose.next({\r\n index: this.index,\r\n result: {\r\n isConfirmed: false,\r\n isDismissed: true,\r\n isDenied: false,\r\n dismiss: DismissReason.cancel,\r\n },\r\n });\r\n }\r\n onDeny() {\r\n this._onClose.next({\r\n index: this.index,\r\n result: {\r\n isConfirmed: false,\r\n isDismissed: false,\r\n isDenied: true,\r\n dismiss: DismissReason.close,\r\n },\r\n });\r\n }\r\n close() {\r\n this.onCancel();\r\n }\r\n\r\n onOutSideClick() {\r\n if (this.options.allowOutsideClick) {\r\n this.onCancel();\r\n }\r\n }\r\n innerOnClick(ev: Event) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n }\r\n}\r\n","<div\n class=\"ngx-msg-overlay show\"\n (click)=\"onOutSideClick()\"\n [ngClass]=\"options.containerClass\"\n [class.has-backdrop]=\"options.backdrop\"\n [attr.data-type]=\"options.icon\">\n <div class=\"ngx-msg-modal\" (click)=\"innerOnClick($event)\">\n <div class=\"confetti\" #confetti></div>\n @if (options.showCloseButton) {\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">✕</button>\n }\n @if (showIcon()) {\n <div class=\"icon-stage\">\n <div class=\"icon-ring\"></div>\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\n </div>\n }\n <h2>{{ options.title }}</h2>\n <p class=\"desc\">\n {{ options.text }}\n <span [innerHTML]=\"options.html\"></span>\n </p>\n\n <div class=\"ngx-msg-actions\">\n @if (options.showCancelButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\n {{ options.cancelButtonText }}\n </button>\n }\n @if (options.showDenyButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onDeny()\"\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\n {{ options.denyButtonText }}\n </button>\n }\n @if (options.showConfirmButton) {\n <button\n class=\"btn btn-primary\"\n (click)=\"onConfirm()\"\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\n {{ options.confirmButtonText }}\n </button>\n }\n </div>\n </div>\n</div>\n","export function applyDefaultConfig(config: any, defaultConfig: any): any {\r\n var config = JSON.parse(JSON.stringify(config));\r\n for (let key in defaultConfig) {\r\n if (config[key] === undefined || config[key] === null || config[key] === '') {\r\n config[key] = defaultConfig[key];\r\n } else if (typeof config[key] === 'object') {\r\n config[key] = applyDefaultConfig(config[key], defaultConfig[key]);\r\n }\r\n }\r\n return config;\r\n}\r\n","import {\r\n ApplicationRef,\r\n ComponentRef,\r\n createComponent,\r\n EmbeddedViewRef,\r\n EnvironmentInjector,\r\n EventEmitter,\r\n Inject,\r\n Injectable,\r\n Injector,\r\n} from '@angular/core';\r\nimport { NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS } from '../models/tokens';\r\nimport { IMessageOptions } from '../models/message-options.interface';\r\nimport { MessageOutput, MessageResult } from '../models/message-result';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { NgxMessageComponent } from '../components/message.component';\r\nimport { applyDefaultConfig } from './apply-default';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class NgxMessageService {\r\n // قبلاً یه آرایه‌ی معمولی بود (`ComponentRef[]`) و removeDialogComponentFromBody\r\n // فقط componentRef رو destroy می‌کرد ولی هیچ‌وقت از آرایه حذفش نمی‌کرد — یعنی\r\n // این سرویس (که providedIn:'root' و singleton سراسریه) به ازای هر پیامی که\r\n // تا حالا تو کل عمر اپ نشون داده شده، یک رفرنس destroy-شده رو برای همیشه نگه\r\n // می‌داشت: یک نشتی حافظه‌ی پیوسته. با Map<id, ComponentRef> جایگزین شد که\r\n // با delete واقعاً entry رو آزاد می‌کنه؛ کلید هم شناسه‌ی پایدارِ پیام (insertedId)\r\n // هست، نه موقعیتِ آرایه (که با splice ممکن بود جابه‌جا و نامعتبر بشه).\r\n alerts = new Map<number, ComponentRef<NgxMessageComponent>>();\r\n insertedId = 0;\r\n constructor(\r\n private appRef: ApplicationRef,\r\n private injector: Injector,\r\n private envInjector: EnvironmentInjector,\r\n @Inject(DOCUMENT) private _doc: Document,\r\n ) {}\r\n\r\n public show<T = any>(c?: IMessageOptions): MessageOutput<T> {\r\n let d = applyDefaultConfig(\r\n this.injector.get(NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS),\r\n NGX_MESSAGE_DEFAULT_OPTIONS,\r\n );\r\n const config = applyDefaultConfig(c, d);\r\n\r\n const componentRef = createComponent(NgxMessageComponent, {\r\n environmentInjector: this.envInjector,\r\n });\r\n\r\n this.appRef.attachView(componentRef.hostView);\r\n const id = this.insertedId++;\r\n const payload: MessageOutput<T> = {\r\n close: () => componentRef.instance.close(),\r\n id,\r\n afterClose: new EventEmitter(),\r\n };\r\n this.appendDialogComponentToBody(componentRef, config);\r\n componentRef.instance.options = config;\r\n componentRef.instance.index = id;\r\n componentRef.instance.onClose.subscribe((result) => {\r\n this.removeDialogComponentFromBody(result.index);\r\n payload.afterClose.emit(result.result);\r\n });\r\n this.alerts.set(id, componentRef);\r\n\r\n return payload;\r\n }\r\n\r\n private removeDialogComponentFromBody(id: number): void {\r\n const ref = this.alerts.get(id);\r\n if (!ref) return;\r\n\r\n const domElem = (ref.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\r\n\r\n // قبل از destroy باید hidePopover صدا بزنیم\r\n if (domElem.popover === 'manual') {\r\n try {\r\n domElem.hidePopover();\r\n } catch {}\r\n }\r\n\r\n this.appRef.detachView(ref.hostView);\r\n ref.destroy();\r\n this.alerts.delete(id);\r\n }\r\n\r\n private appendDialogComponentToBody(\r\n componentRef: ComponentRef<NgxMessageComponent>,\r\n config: IMessageOptions,\r\n ) {\r\n const domElem = (componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\r\n if (config.containerClass) {\r\n for (let c of config.containerClass.split(' ')) {\r\n if (c.trim()) domElem.classList.add(c);\r\n }\r\n }\r\n this._doc.body.appendChild(domElem);\r\n if (config.useOverlay) {\r\n domElem.popover = 'manual';\r\n domElem.showPopover();\r\n }\r\n }\r\n\r\n closeAll() {\r\n for (const id of [...this.alerts.keys()]) {\r\n this.removeDialogComponentFromBody(id);\r\n }\r\n }\r\n}\r\n","import { Injector } from '@angular/core';\r\nimport { NGX_MESSAGE_API } from './models/tokens';\r\nimport { IMessageOptions } from './models/message-options.interface';\r\n\r\n/**\r\n * Static facade so call sites can use: MSG.warn('msg', opts)\r\n * Module will set the service instance in its constructor.\r\n */\r\nexport class MSG {\r\n static injector: Injector;\r\n\r\n static show<T = any>(options?: IMessageOptions) {\r\n if (!MSG.injector) {\r\n throw new Error(\r\n 'ngx-kit: Error on EnvironmentProvider. Ensure \"provideMessage()\" in root provider.',\r\n );\r\n }\r\n\r\n return MSG.injector.get(NGX_MESSAGE_API).show<T>(options);\r\n }\r\n\r\n static fire(options?: IMessageOptions) {\r\n return this.show(options);\r\n }\r\n\r\n static info(title: string, text?: string, options?: IMessageOptions) {\r\n return this.show({\r\n icon: 'info',\r\n title,\r\n text,\r\n ...options,\r\n });\r\n }\r\n\r\n static success(title: string, text?: string, options?: IMessageOptions) {\r\n return this.show({\r\n icon: 'success',\r\n title,\r\n text,\r\n ...options,\r\n });\r\n }\r\n static warning(title: string, text?: string, options?: IMessageOptions) {\r\n return this.show({\r\n icon: 'warning',\r\n title,\r\n text,\r\n ...options,\r\n });\r\n }\r\n static error(title: string, text?: string, options?: IMessageOptions) {\r\n return this.show({\r\n icon: 'error',\r\n title,\r\n text,\r\n ...options,\r\n });\r\n }\r\n static question(title: string, text?: string, options?: IMessageOptions) {\r\n return this.show({\r\n icon: 'question',\r\n title,\r\n text,\r\n ...options,\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n });\r\n }\r\n static loading(title: string, text?: string, options?: IMessageOptions) {\r\n return this.show({\r\n icon: 'loading',\r\n title,\r\n text,\r\n ...options,\r\n showConfirmButton: false,\r\n showCancelButton: false,\r\n showDenyButton: false,\r\n });\r\n }\r\n}\r\n\r\nexport class Modal extends MSG {}\r\n","import {\r\n EnvironmentProviders,\r\n inject,\r\n Injector,\r\n makeEnvironmentProviders,\r\n provideEnvironmentInitializer,\r\n} from '@angular/core';\r\nimport { IMessageOptions } from './models/message-options.interface';\r\nimport { NGX_MESSAGE_API, NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS } from './models/tokens';\r\nimport { NgxMessageService } from './services/message.service';\r\nimport { MSG as MessageFacade } from './message-facade';\r\nimport { Modal as ModalFacade } from './message-facade';\r\n\r\nexport function provideMessage(options?: IMessageOptions): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: NGX_MESSAGE_CONFIGS,\r\n useValue: { ...NGX_MESSAGE_DEFAULT_OPTIONS, ...(options || {}) },\r\n },\r\n {\r\n provide: NGX_MESSAGE_API,\r\n useExisting: NgxMessageService,\r\n },\r\n provideEnvironmentInitializer(() => {\r\n MessageFacade.injector = inject(Injector);\r\n ModalFacade.injector = inject(Injector);\r\n }),\r\n ]);\r\n}\r\n","import { MessageIcon } from './MessageIcon';\r\nimport { IMessageOptions } from './message-options.interface';\r\n\r\nexport class MessageOptions implements IMessageOptions {\r\n public constructor(private config?: IMessageOptions) {\r\n //config = { ...(new MessageOptions()), ...config };\r\n }\r\n /**\r\n * add popover manual to set alert dialog container to top layer\r\n * - usefull when using alert modal in angular material dialog\r\n *\r\n */\r\n useOverlay?: boolean;\r\n title?: string = '';\r\n text?: string = '';\r\n html?: string | HTMLElement = '';\r\n backdrop?: boolean = true;\r\n icon?: MessageIcon;\r\n width?: number | string;\r\n allowOutsideClick?: boolean = true;\r\n allowEscapeKey?: boolean = true;\r\n allowEnterKey?: boolean = true;\r\n showConfirmButton?: boolean = true;\r\n showDenyButton?: boolean = false;\r\n showCancelButton?: boolean = false;\r\n confirmButtonText: string = 'Ok';\r\n denyButtonText?: string = 'No';\r\n cancelButtonText?: string = 'Cancel';\r\n confirmButtonColor?: string;\r\n denyButtonColor?: string;\r\n cancelButtonColor?: string;\r\n confirmButtonAriaLabel?: string = '';\r\n denyButtonAriaLabel?: string = '';\r\n cancelButtonAriaLabel?: string = '';\r\n reverseButtons?: boolean = false;\r\n showCloseButton?: boolean = false;\r\n containerClass?: string = '';\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DOCUMENT","MessageFacade","ModalFacade"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kit-message.mjs","sources":["../../../projects/libs/message/models/tokens.ts","../../../projects/libs/message/models/message-result.ts","../../../projects/libs/message/models/icons.ts","../../../projects/libs/message/components/message.component.ts","../../../projects/libs/message/components/message.component.html","../../../projects/libs/message/services/apply-default.ts","../../../projects/libs/message/services/message.service.ts","../../../projects/libs/message/message-facade.ts","../../../projects/libs/message/message-provider.ts","../../../projects/libs/message/models/message-options.ts","../../../projects/libs/message/ngx-kit-message.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { IMessageOptions } from './message-options.interface';\nimport { NgxMessageService } from '../public-api';\nimport { MessageOptions } from './message-options';\n\nexport const NGX_MESSAGE_CONFIGS = new InjectionToken<IMessageOptions>('ngx-message-configs');\n\nexport const NGX_MESSAGE_API = new InjectionToken<NgxMessageService>('NgxMessageService');\nexport const NGX_MESSAGE_DEFAULT_OPTIONS: MessageOptions = {\n useOverlay: true,\n title: '',\n text: '',\n html: '',\n backdrop: true,\n icon: 'None',\n width: undefined,\n allowOutsideClick: true,\n allowEscapeKey: true,\n allowEnterKey: true,\n showConfirmButton: true,\n showDenyButton: false,\n showCancelButton: false,\n confirmButtonText: 'Ok',\n denyButtonText: 'No',\n cancelButtonText: 'Cancel',\n confirmButtonColor: '',\n denyButtonColor: '',\n cancelButtonColor: '',\n confirmButtonAriaLabel: '',\n denyButtonAriaLabel: '',\n cancelButtonAriaLabel: '',\n reverseButtons: false,\n showCloseButton: true,\n containerClass: '',\n};\n","import { EventEmitter } from '@angular/core';\n\nexport type MessageOutput<T = any> = {\n id: number;\n close: () => void;\n afterClose: EventEmitter<MessageResult>;\n};\nexport interface MessageResult<T = any> {\n readonly isConfirmed: boolean;\n readonly isDenied: boolean;\n readonly isDismissed: boolean;\n /**\n * @description ❌⚠️NOT Implemented!⚠️❌\n */\n readonly value?: T;\n readonly dismiss?: DismissReason;\n}\n\n/**\n * An enum of possible reasons that can explain an alert dismissal.\n */\nexport enum DismissReason {\n cancel,\n backdrop,\n close,\n /**\n * @description ❌⚠️NOT Implemented!⚠️❌\n */\n esc,\n /**\n * @description ❌⚠️NOT Implemented!⚠️❌\n */\n timer,\n}\n","// 'None' | 'success' | 'error' | 'warning' | 'info' | 'question' | 'loading';\nexport const ICONS: { [key: string]: string } = {\n None: '',\n success: `<svg viewBox=\"0 0 46 46\"><path class=\"draw\" d=\"M12 24 L20 32 L34 15\"/></svg>`,\n error: `<svg viewBox=\"0 0 46 46\"><path class=\"draw\" d=\"M14 14 L32 32\"/><path class=\"draw\" style=\"animation-delay:.55s\" d=\"M32 14 L14 32\"/></svg>`,\n warning: `<svg viewBox=\"0 0 46 46\"><path class=\"draw\" d=\"M23 10 L23 26\"/><circle class=\"dot-mark\" cx=\"23\" cy=\"34\" r=\"3.4\"/></svg>`,\n info: `<svg viewBox=\"0 0 46 46\"><circle class=\"dot-mark\" cx=\"23\" cy=\"12\" r=\"3.2\" style=\"animation-delay:.28s\"/><path class=\"draw\" style=\"animation-delay:.4s\" d=\"M23 20 L23 36\"/></svg>`,\n question: `<svg viewBox=\"0 0 320 512\"><path fill=\"currentColor\" d=\"M204.3 32.01H96c-52.94 0-96 43.06-96 96c0 17.67 14.31 31.1 32 31.1s32-14.32 32-31.1c0-17.64 14.34-32 32-32h108.3C232.8 96.01 256 119.2 256 147.8c0 19.72-10.97 37.47-30.5 47.33L127.8 252.4C117.1 258.2 112 268.7 112 280v40c0 17.67 14.31 31.99 32 31.99s32-14.32 32-31.99V298.3L256 251.3c39.47-19.75 64-59.42 64-103.5C320 83.95 268.1 32.01 204.3 32.01zM144 400c-22.09 0-40 17.91-40 40s17.91 39.1 40 39.1s40-17.9 40-39.1S166.1 400 144 400z\"/></svg>`,\n loading: `<div class=\"spinner-wrap\"><div class=\"spinner\"></div></div>`,\n};\n","import {\r\n AfterViewInit,\r\n Component,\r\n DOCUMENT,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n OnInit,\r\n signal,\r\n viewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { IMessageOptions } from '../models/message-options.interface';\r\nimport { Subject } from 'rxjs';\r\nimport { MessageResult, DismissReason } from '../models/message-result';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS } from '../models/tokens';\r\nimport { ICONS } from '../models/icons';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { makeConfetti } from 'ngx-kit/shared';\r\nimport { NgxMessageService } from '../services/message.service';\r\n\r\n@Component({\r\n selector: 'ngx-message',\r\n templateUrl: 'message.component.html',\r\n styleUrls: ['./message.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n imports: [CommonModule],\r\n providers: [\r\n {\r\n provide: NGX_MESSAGE_CONFIGS,\r\n useValue: NGX_MESSAGE_DEFAULT_OPTIONS,\r\n },\r\n ],\r\n})\r\nexport class NgxMessageComponent implements OnInit, AfterViewInit {\r\n icon?: SafeHtml;\r\n showIcon = signal(true);\r\n options!: IMessageOptions;\r\n confetti = viewChild<ElementRef<HTMLDivElement>>('confetti');\r\n index = 0;\r\n\r\n protected sanitizer = inject(DomSanitizer);\r\n protected doc = inject(DOCUMENT);\r\n private readonly messageService = inject(NgxMessageService);\r\n\r\n private readonly _onClose = new Subject<{ index: number; result: MessageResult<any> }>();\r\n public onClose = this._onClose.asObservable();\r\n\r\n ngOnInit(): void {\r\n this.showIcon.update((x) => (x = this.options.icon != 'None'));\r\n this.icon = this.sanitizer.bypassSecurityTrustHtml(ICONS[this.options.icon ?? 'None']);\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const confetti = this.confetti()?.nativeElement;\r\n if (this.options.icon == 'success' && confetti) {\r\n makeConfetti(this.doc, confetti);\r\n }\r\n }\r\n\r\n /**\r\n * وقتی چند تا پیام هم‌زمان باز باشن، هرکدوم listener خودشو روی document\r\n * داشت — پس یه فشردن Escape/Enter، رویداد رو به *همه‌شون* هم‌زمان می‌فرستاد،\r\n * نه فقط آخرین پیامی که باز شده (رفتار طبیعیِ یه استکِ مودال باید این باشه\r\n * که فقط بالاترین لایه به کیبورد واکنش نشون بده). این چک همون چیزیه که\r\n * OverlayService با getLastDialog() برای اورلی‌ها انجام می‌ده.\r\n */\r\n private isTopmost(): boolean {\r\n const ids = [...this.messageService.alerts.keys()];\r\n if (!ids.length) return true;\r\n return this.index === Math.max(...ids);\r\n }\r\n\r\n @HostListener('document:keydown.escape', ['$event'])\r\n onScapeKey(event: Event) {\r\n if (this.options.allowEscapeKey && this.isTopmost()) {\r\n this.onCancel();\r\n }\r\n }\r\n\r\n @HostListener('document:keydown.enter', ['$event'])\r\n onEnterKey(event: Event) {\r\n if (!this.isTopmost()) return;\r\n event.stopPropagation();\r\n event.preventDefault();\r\n if (this.options.allowEnterKey) {\r\n if (this.options.showConfirmButton) {\r\n this.onConfirm();\r\n } else if (this.options.showDenyButton) {\r\n this.onDeny();\r\n } else {\r\n this.onCancel();\r\n }\r\n }\r\n }\r\n\r\n onConfirm() {\r\n this._onClose.next({\r\n index: this.index,\r\n result: {\r\n isConfirmed: true,\r\n isDismissed: false,\r\n isDenied: false,\r\n dismiss: DismissReason.close,\r\n },\r\n });\r\n }\r\n onCancel() {\r\n this._onClose.next({\r\n index: this.index,\r\n result: {\r\n isConfirmed: false,\r\n isDismissed: true,\r\n isDenied: false,\r\n dismiss: DismissReason.cancel,\r\n },\r\n });\r\n }\r\n onDeny() {\r\n this._onClose.next({\r\n index: this.index,\r\n result: {\r\n isConfirmed: false,\r\n isDismissed: false,\r\n isDenied: true,\r\n dismiss: DismissReason.close,\r\n },\r\n });\r\n }\r\n close() {\r\n this.onCancel();\r\n }\r\n\r\n onOutSideClick() {\r\n if (this.options.allowOutsideClick) {\r\n this.onCancel();\r\n }\r\n }\r\n innerOnClick(ev: Event) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n }\r\n}\r\n","<div\n class=\"ngx-msg-overlay show\"\n (click)=\"onOutSideClick()\"\n [ngClass]=\"options.containerClass\"\n [class.has-backdrop]=\"options.backdrop\"\n [attr.data-type]=\"options.icon\">\n <div class=\"ngx-msg-modal\" (click)=\"innerOnClick($event)\">\n <div class=\"confetti\" #confetti></div>\n @if (options.showCloseButton) {\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">✕</button>\n }\n @if (showIcon()) {\n <div class=\"icon-stage\">\n <div class=\"icon-ring\"></div>\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\n </div>\n }\n <h2>{{ options.title }}</h2>\n <p class=\"desc\">\n {{ options.text }}\n <span [innerHTML]=\"options.html\"></span>\n </p>\n\n <div class=\"ngx-msg-actions\">\n @if (options.showCancelButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\n {{ options.cancelButtonText }}\n </button>\n }\n @if (options.showDenyButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onDeny()\"\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\n {{ options.denyButtonText }}\n </button>\n }\n @if (options.showConfirmButton) {\n <button\n class=\"btn btn-primary\"\n (click)=\"onConfirm()\"\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\n {{ options.confirmButtonText }}\n </button>\n }\n </div>\n </div>\n</div>\n","export function applyDefaultConfig(config: any, defaultConfig: any): any {\r\n var config = JSON.parse(JSON.stringify(config));\r\n for (let key in defaultConfig) {\r\n if (config[key] === undefined || config[key] === null || config[key] === '') {\r\n config[key] = defaultConfig[key];\r\n } else if (typeof config[key] === 'object') {\r\n config[key] = applyDefaultConfig(config[key], defaultConfig[key]);\r\n }\r\n }\r\n return config;\r\n}\r\n","import {\r\n ApplicationRef,\r\n ComponentRef,\r\n createComponent,\r\n EmbeddedViewRef,\r\n EnvironmentInjector,\r\n EventEmitter,\r\n Inject,\r\n Injectable,\r\n Injector,\r\n} from '@angular/core';\r\nimport { NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS } from '../models/tokens';\r\nimport { IMessageOptions } from '../models/message-options.interface';\r\nimport { MessageOutput, MessageResult } from '../models/message-result';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { NgxMessageComponent } from '../components/message.component';\r\nimport { applyDefaultConfig } from './apply-default';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class NgxMessageService {\r\n // قبلاً یه آرایه‌ی معمولی بود (`ComponentRef[]`) و removeDialogComponentFromBody\r\n // فقط componentRef رو destroy می‌کرد ولی هیچ‌وقت از آرایه حذفش نمی‌کرد — یعنی\r\n // این سرویس (که providedIn:'root' و singleton سراسریه) به ازای هر پیامی که\r\n // تا حالا تو کل عمر اپ نشون داده شده، یک رفرنس destroy-شده رو برای همیشه نگه\r\n // می‌داشت: یک نشتی حافظه‌ی پیوسته. با Map<id, ComponentRef> جایگزین شد که\r\n // با delete واقعاً entry رو آزاد می‌کنه؛ کلید هم شناسه‌ی پایدارِ پیام (insertedId)\r\n // هست، نه موقعیتِ آرایه (که با splice ممکن بود جابه‌جا و نامعتبر بشه).\r\n alerts = new Map<number, ComponentRef<NgxMessageComponent>>();\r\n insertedId = 0;\r\n constructor(\r\n private appRef: ApplicationRef,\r\n private injector: Injector,\r\n private envInjector: EnvironmentInjector,\r\n @Inject(DOCUMENT) private _doc: Document,\r\n ) {}\r\n\r\n public show<T = any>(c?: IMessageOptions): MessageOutput<T> {\r\n let d = applyDefaultConfig(\r\n this.injector.get(NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS),\r\n NGX_MESSAGE_DEFAULT_OPTIONS,\r\n );\r\n const config = applyDefaultConfig(c, d);\r\n\r\n const componentRef = createComponent(NgxMessageComponent, {\r\n environmentInjector: this.envInjector,\r\n });\r\n\r\n this.appRef.attachView(componentRef.hostView);\r\n const id = this.insertedId++;\r\n const payload: MessageOutput<T> = {\r\n close: () => componentRef.instance.close(),\r\n id,\r\n afterClose: new EventEmitter(),\r\n };\r\n this.appendDialogComponentToBody(componentRef, config);\r\n componentRef.instance.options = config;\r\n componentRef.instance.index = id;\r\n componentRef.instance.onClose.subscribe((result) => {\r\n this.removeDialogComponentFromBody(result.index);\r\n payload.afterClose.emit(result.result);\r\n });\r\n this.alerts.set(id, componentRef);\r\n\r\n return payload;\r\n }\r\n\r\n private removeDialogComponentFromBody(id: number): void {\r\n const ref = this.alerts.get(id);\r\n if (!ref) return;\r\n\r\n const domElem = (ref.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\r\n\r\n // قبل از destroy باید hidePopover صدا بزنیم\r\n if (domElem.popover === 'manual') {\r\n try {\r\n domElem.hidePopover();\r\n } catch {}\r\n }\r\n\r\n this.appRef.detachView(ref.hostView);\r\n ref.destroy();\r\n this.alerts.delete(id);\r\n }\r\n\r\n private appendDialogComponentToBody(\r\n componentRef: ComponentRef<NgxMessageComponent>,\r\n config: IMessageOptions,\r\n ) {\r\n const domElem = (componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\r\n if (config.containerClass) {\r\n for (let c of config.containerClass.split(' ')) {\r\n if (c.trim()) domElem.classList.add(c);\r\n }\r\n }\r\n this._doc.body.appendChild(domElem);\r\n if (config.useOverlay) {\r\n domElem.popover = 'manual';\r\n domElem.showPopover();\r\n }\r\n }\r\n\r\n closeAll() {\r\n for (const id of [...this.alerts.keys()]) {\r\n this.removeDialogComponentFromBody(id);\r\n }\r\n }\r\n}\r\n","import { Injector } from '@angular/core';\r\nimport { NGX_MESSAGE_API } from './models/tokens';\r\nimport { IMessageOptions } from './models/message-options.interface';\r\n\r\n/**\r\n * Static facade so call sites can use: MSG.warn('msg', opts)\r\n * Module will set the service instance in its constructor.\r\n */\r\nexport class MSG {\r\n static injector: Injector;\r\n\r\n static show<T = any>(options?: IMessageOptions) {\r\n if (!MSG.injector) {\r\n throw new Error(\r\n 'ngx-kit: Error on EnvironmentProvider. Ensure \"provideMessage()\" in root provider.',\r\n );\r\n }\r\n\r\n return MSG.injector.get(NGX_MESSAGE_API).show<T>(options);\r\n }\r\n\r\n static fire(options?: IMessageOptions) {\r\n return this.show(options);\r\n }\r\n\r\n static info(title: string, text?: string, options?: IMessageOptions) {\r\n return this.show({\r\n icon: 'info',\r\n title,\r\n text,\r\n ...options,\r\n });\r\n }\r\n\r\n static success(title: string, text?: string, options?: IMessageOptions) {\r\n return this.show({\r\n icon: 'success',\r\n title,\r\n text,\r\n ...options,\r\n });\r\n }\r\n static warning(title: string, text?: string, options?: IMessageOptions) {\r\n return this.show({\r\n icon: 'warning',\r\n title,\r\n text,\r\n ...options,\r\n });\r\n }\r\n static error(title: string, text?: string, options?: IMessageOptions) {\r\n return this.show({\r\n icon: 'error',\r\n title,\r\n text,\r\n ...options,\r\n });\r\n }\r\n static question(title: string, text?: string, options?: IMessageOptions) {\r\n return this.show({\r\n icon: 'question',\r\n title,\r\n text,\r\n ...options,\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n });\r\n }\r\n static loading(title: string, text?: string, options?: IMessageOptions) {\r\n return this.show({\r\n icon: 'loading',\r\n title,\r\n text,\r\n ...options,\r\n showConfirmButton: false,\r\n showCancelButton: false,\r\n showDenyButton: false,\r\n });\r\n }\r\n}\r\n\r\nexport class Modal extends MSG {}\r\n","import {\r\n EnvironmentProviders,\r\n inject,\r\n Injector,\r\n makeEnvironmentProviders,\r\n provideEnvironmentInitializer,\r\n} from '@angular/core';\r\nimport { IMessageOptions } from './models/message-options.interface';\r\nimport { NGX_MESSAGE_API, NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS } from './models/tokens';\r\nimport { NgxMessageService } from './services/message.service';\r\nimport { MSG as MessageFacade } from './message-facade';\r\nimport { Modal as ModalFacade } from './message-facade';\r\n\r\nexport function provideMessage(options?: IMessageOptions): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: NGX_MESSAGE_CONFIGS,\r\n useValue: { ...NGX_MESSAGE_DEFAULT_OPTIONS, ...(options || {}) },\r\n },\r\n {\r\n provide: NGX_MESSAGE_API,\r\n useExisting: NgxMessageService,\r\n },\r\n provideEnvironmentInitializer(() => {\r\n MessageFacade.injector = inject(Injector);\r\n ModalFacade.injector = inject(Injector);\r\n }),\r\n ]);\r\n}\r\n","import { MessageIcon } from './MessageIcon';\r\nimport { IMessageOptions } from './message-options.interface';\r\n\r\nexport class MessageOptions implements IMessageOptions {\r\n public constructor(private config?: IMessageOptions) {\r\n //config = { ...(new MessageOptions()), ...config };\r\n }\r\n /**\r\n * add popover manual to set alert dialog container to top layer\r\n * - usefull when using alert modal in angular material dialog\r\n *\r\n */\r\n useOverlay?: boolean;\r\n title?: string = '';\r\n text?: string = '';\r\n html?: string | HTMLElement = '';\r\n backdrop?: boolean = true;\r\n icon?: MessageIcon;\r\n width?: number | string;\r\n allowOutsideClick?: boolean = true;\r\n allowEscapeKey?: boolean = true;\r\n allowEnterKey?: boolean = true;\r\n showConfirmButton?: boolean = true;\r\n showDenyButton?: boolean = false;\r\n showCancelButton?: boolean = false;\r\n confirmButtonText: string = 'Ok';\r\n denyButtonText?: string = 'No';\r\n cancelButtonText?: string = 'Cancel';\r\n confirmButtonColor?: string;\r\n denyButtonColor?: string;\r\n cancelButtonColor?: string;\r\n confirmButtonAriaLabel?: string = '';\r\n denyButtonAriaLabel?: string = '';\r\n cancelButtonAriaLabel?: string = '';\r\n reverseButtons?: boolean = false;\r\n showCloseButton?: boolean = false;\r\n containerClass?: string = '';\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DOCUMENT","MessageFacade","ModalFacade"],"mappings":";;;;;;;;MAKa,mBAAmB,GAAG,IAAI,cAAc,CAAkB,qBAAqB;MAE/E,eAAe,GAAG,IAAI,cAAc,CAAoB,mBAAmB;AACjF,MAAM,2BAA2B,GAAmB;AACzD,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,iBAAiB,EAAE,IAAI;AACvB,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,aAAa,EAAE,IAAI;AACnB,IAAA,iBAAiB,EAAE,IAAI;AACvB,IAAA,cAAc,EAAE,KAAK;AACrB,IAAA,gBAAgB,EAAE,KAAK;AACvB,IAAA,iBAAiB,EAAE,IAAI;AACvB,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,gBAAgB,EAAE,QAAQ;AAC1B,IAAA,kBAAkB,EAAE,EAAE;AACtB,IAAA,eAAe,EAAE,EAAE;AACnB,IAAA,iBAAiB,EAAE,EAAE;AACrB,IAAA,sBAAsB,EAAE,EAAE;AAC1B,IAAA,mBAAmB,EAAE,EAAE;AACvB,IAAA,qBAAqB,EAAE,EAAE;AACzB,IAAA,cAAc,EAAE,KAAK;AACrB,IAAA,eAAe,EAAE,IAAI;AACrB,IAAA,cAAc,EAAE,EAAE;;;ACfpB;;AAEG;IACS;AAAZ,CAAA,UAAY,aAAa,EAAA;AACvB,IAAA,aAAA,CAAA,aAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM;AACN,IAAA,aAAA,CAAA,aAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAQ;AACR,IAAA,aAAA,CAAA,aAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAK;AACL;;AAEG;AACH,IAAA,aAAA,CAAA,aAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAG;AACH;;AAEG;AACH,IAAA,aAAA,CAAA,aAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAK;AACP,CAAC,EAZW,aAAa,KAAb,aAAa,GAAA,EAAA,CAAA,CAAA;;ACrBzB;AACO,MAAM,KAAK,GAA8B;AAC9C,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,OAAO,EAAE,CAAA,4EAAA,CAA8E;AACvF,IAAA,KAAK,EAAE,CAAA,wIAAA,CAA0I;AACjJ,IAAA,OAAO,EAAE,CAAA,uHAAA,CAAyH;AAClI,IAAA,IAAI,EAAE,CAAA,gLAAA,CAAkL;AACxL,IAAA,QAAQ,EAAE,CAAA,mfAAA,CAAqf;AAC/f,IAAA,OAAO,EAAE,CAAA,2DAAA,CAA6D;CACvE;;MC0BY,mBAAmB,CAAA;AAC9B,IAAA,IAAI;IACJ,QAAQ,GAAG,MAAM,CAAC,IAAI;iFAAC;AACvB,IAAA,OAAO;IACP,QAAQ,GAAG,SAAS,CAA6B,UAAU;iFAAC;IAC5D,KAAK,GAAG,CAAC;AAEC,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAChC,IAAA,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;AACf,IAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE1C,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAiD;AACjF,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;IAE7C,QAAQ,GAAA;QACN,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IACxF;IAEA,eAAe,GAAA;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;QAC/C,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,SAAS,IAAI,QAAQ,EAAE;AAC9C,YAAA,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;QAClC;IACF;AAEA;;;;;;AAMG;IACK,SAAS,GAAA;AACf,QAAA,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,GAAG,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QAC5B,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACxC;AAGA,IAAA,UAAU,CAAC,KAAY,EAAA;QACrB,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACnD,IAAI,CAAC,QAAQ,EAAE;QACjB;IACF;AAGA,IAAA,UAAU,CAAC,KAAY,EAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;QACvB,KAAK,CAAC,eAAe,EAAE;QACvB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;AAC9B,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;gBAClC,IAAI,CAAC,SAAS,EAAE;YAClB;AAAO,iBAAA,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;gBACtC,IAAI,CAAC,MAAM,EAAE;YACf;iBAAO;gBACL,IAAI,CAAC,QAAQ,EAAE;YACjB;QACF;IACF;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,YAAA,MAAM,EAAE;AACN,gBAAA,WAAW,EAAE,IAAI;AACjB,gBAAA,WAAW,EAAE,KAAK;AAClB,gBAAA,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,aAAa,CAAC,KAAK;AAC7B,aAAA;AACF,SAAA,CAAC;IACJ;IACA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,YAAA,MAAM,EAAE;AACN,gBAAA,WAAW,EAAE,KAAK;AAClB,gBAAA,WAAW,EAAE,IAAI;AACjB,gBAAA,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,aAAa,CAAC,MAAM;AAC9B,aAAA;AACF,SAAA,CAAC;IACJ;IACA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,YAAA,MAAM,EAAE;AACN,gBAAA,WAAW,EAAE,KAAK;AAClB,gBAAA,WAAW,EAAE,KAAK;AAClB,gBAAA,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,aAAa,CAAC,KAAK;AAC7B,aAAA;AACF,SAAA,CAAC;IACJ;IACA,KAAK,GAAA;QACH,IAAI,CAAC,QAAQ,EAAE;IACjB;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;YAClC,IAAI,CAAC,QAAQ,EAAE;QACjB;IACF;AACA,IAAA,YAAY,CAAC,EAAS,EAAA;QACpB,EAAE,CAAC,cAAc,EAAE;QACnB,EAAE,CAAC,eAAe,EAAE;IACtB;uGA3GW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,yBAAA,EAAA,oBAAA,EAAA,wBAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,SAAA,EAPnB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,mBAAmB;AAC5B,gBAAA,QAAQ,EAAE,2BAA2B;AACtC,aAAA;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjCH,glDAmDA,gnRDxBY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAQX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAb/B,SAAS;+BACE,aAAa,EAAA,aAAA,EAGR,iBAAiB,CAAC,IAAI,WAC5B,CAAC,YAAY,CAAC,EAAA,SAAA,EACZ;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,mBAAmB;AAC5B,4BAAA,QAAQ,EAAE,2BAA2B;AACtC,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,glDAAA,EAAA,MAAA,EAAA,CAAA,yjRAAA,CAAA,EAAA;sEAMgD,UAAU,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA;sBAmC1D,YAAY;uBAAC,yBAAyB,EAAE,CAAC,QAAQ,CAAC;;sBAOlD,YAAY;uBAAC,wBAAwB,EAAE,CAAC,QAAQ,CAAC;;;AEjF9C,SAAU,kBAAkB,CAAC,MAAW,EAAE,aAAkB,EAAA;AAChE,IAAA,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC/C,IAAA,KAAK,IAAI,GAAG,IAAI,aAAa,EAAE;QAC7B,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE;YAC3E,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC;QAClC;aAAO,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE;AAC1C,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;QACnE;IACF;AACA,IAAA,OAAO,MAAM;AACf;;MCWa,iBAAiB,CAAA;AAWlB,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,WAAA;AACkB,IAAA,IAAA;;;;;;;;AAN5B,IAAA,MAAM,GAAG,IAAI,GAAG,EAA6C;IAC7D,UAAU,GAAG,CAAC;AACd,IAAA,WAAA,CACU,MAAsB,EACtB,QAAkB,EAClB,WAAgC,EACd,IAAc,EAAA;QAHhC,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,WAAW,GAAX,WAAW;QACO,IAAA,CAAA,IAAI,GAAJ,IAAI;IAC7B;AAEI,IAAA,IAAI,CAAU,CAAmB,EAAA;AACtC,QAAA,IAAI,CAAC,GAAG,kBAAkB,CACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,EACnE,2BAA2B,CAC5B;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC;AAEvC,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,mBAAmB,EAAE;YACxD,mBAAmB,EAAE,IAAI,CAAC,WAAW;AACtC,SAAA,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC;AAC7C,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AAC5B,QAAA,MAAM,OAAO,GAAqB;YAChC,KAAK,EAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE;YAC1C,EAAE;YACF,UAAU,EAAE,IAAI,YAAY,EAAE;SAC/B;AACD,QAAA,IAAI,CAAC,2BAA2B,CAAC,YAAY,EAAE,MAAM,CAAC;AACtD,QAAA,YAAY,CAAC,QAAQ,CAAC,OAAO,GAAG,MAAM;AACtC,QAAA,YAAY,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE;QAChC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AACjD,YAAA,IAAI,CAAC,6BAA6B,CAAC,MAAM,CAAC,KAAK,CAAC;YAChD,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AACxC,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC;AAEjC,QAAA,OAAO,OAAO;IAChB;AAEQ,IAAA,6BAA6B,CAAC,EAAU,EAAA;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,GAAG;YAAE;QAEV,MAAM,OAAO,GAAI,GAAG,CAAC,QAAiC,CAAC,SAAS,CAAC,CAAC,CAAgB;;AAGlF,QAAA,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE;AAChC,YAAA,IAAI;gBACF,OAAO,CAAC,WAAW,EAAE;YACvB;YAAE,MAAM,EAAC;QACX;QAEA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;QACpC,GAAG,CAAC,OAAO,EAAE;AACb,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IACxB;IAEQ,2BAA2B,CACjC,YAA+C,EAC/C,MAAuB,EAAA;QAEvB,MAAM,OAAO,GAAI,YAAY,CAAC,QAAiC,CAAC,SAAS,CAAC,CAAC,CAAgB;AAC3F,QAAA,IAAI,MAAM,CAAC,cAAc,EAAE;AACzB,YAAA,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC9C,IAAI,CAAC,CAAC,IAAI,EAAE;AAAE,oBAAA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC;QACF;QACA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AACnC,QAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACrB,YAAA,OAAO,CAAC,OAAO,GAAG,QAAQ;YAC1B,OAAO,CAAC,WAAW,EAAE;QACvB;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE;AACxC,YAAA,IAAI,CAAC,6BAA6B,CAAC,EAAE,CAAC;QACxC;IACF;AAtFW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,2GAclBA,UAAQ,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAdP,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA;;2FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BAeI,MAAM;2BAACA,UAAQ;;;AC/BpB;;;AAGG;MACU,GAAG,CAAA;IACd,OAAO,QAAQ;IAEf,OAAO,IAAI,CAAU,OAAyB,EAAA;AAC5C,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;AACjB,YAAA,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF;QACH;AAEA,QAAA,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAI,OAAO,CAAC;IAC3D;IAEA,OAAO,IAAI,CAAC,OAAyB,EAAA;AACnC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAC3B;AAEA,IAAA,OAAO,IAAI,CAAC,KAAa,EAAE,IAAa,EAAE,OAAyB,EAAA;QACjE,OAAO,IAAI,CAAC,IAAI,CAAC;AACf,YAAA,IAAI,EAAE,MAAM;YACZ,KAAK;YACL,IAAI;AACJ,YAAA,GAAG,OAAO;AACX,SAAA,CAAC;IACJ;AAEA,IAAA,OAAO,OAAO,CAAC,KAAa,EAAE,IAAa,EAAE,OAAyB,EAAA;QACpE,OAAO,IAAI,CAAC,IAAI,CAAC;AACf,YAAA,IAAI,EAAE,SAAS;YACf,KAAK;YACL,IAAI;AACJ,YAAA,GAAG,OAAO;AACX,SAAA,CAAC;IACJ;AACA,IAAA,OAAO,OAAO,CAAC,KAAa,EAAE,IAAa,EAAE,OAAyB,EAAA;QACpE,OAAO,IAAI,CAAC,IAAI,CAAC;AACf,YAAA,IAAI,EAAE,SAAS;YACf,KAAK;YACL,IAAI;AACJ,YAAA,GAAG,OAAO;AACX,SAAA,CAAC;IACJ;AACA,IAAA,OAAO,KAAK,CAAC,KAAa,EAAE,IAAa,EAAE,OAAyB,EAAA;QAClE,OAAO,IAAI,CAAC,IAAI,CAAC;AACf,YAAA,IAAI,EAAE,OAAO;YACb,KAAK;YACL,IAAI;AACJ,YAAA,GAAG,OAAO;AACX,SAAA,CAAC;IACJ;AACA,IAAA,OAAO,QAAQ,CAAC,KAAa,EAAE,IAAa,EAAE,OAAyB,EAAA;QACrE,OAAO,IAAI,CAAC,IAAI,CAAC;AACf,YAAA,IAAI,EAAE,UAAU;YAChB,KAAK;YACL,IAAI;AACJ,YAAA,GAAG,OAAO;AACV,YAAA,iBAAiB,EAAE,IAAI;AACvB,YAAA,gBAAgB,EAAE,IAAI;AACvB,SAAA,CAAC;IACJ;AACA,IAAA,OAAO,OAAO,CAAC,KAAa,EAAE,IAAa,EAAE,OAAyB,EAAA;QACpE,OAAO,IAAI,CAAC,IAAI,CAAC;AACf,YAAA,IAAI,EAAE,SAAS;YACf,KAAK;YACL,IAAI;AACJ,YAAA,GAAG,OAAO;AACV,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,gBAAgB,EAAE,KAAK;AACvB,YAAA,cAAc,EAAE,KAAK;AACtB,SAAA,CAAC;IACJ;AACD;AAEK,MAAO,KAAM,SAAQ,GAAG,CAAA;AAAG;;ACpE3B,SAAU,cAAc,CAAC,OAAyB,EAAA;AACtD,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA;AACE,YAAA,OAAO,EAAE,mBAAmB;YAC5B,QAAQ,EAAE,EAAE,GAAG,2BAA2B,EAAE,IAAI,OAAO,IAAI,EAAE,CAAC,EAAE;AACjE,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,WAAW,EAAE,iBAAiB;AAC/B,SAAA;QACD,6BAA6B,CAAC,MAAK;AACjC,YAAAC,GAAa,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACzC,YAAAC,KAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACzC,QAAA,CAAC,CAAC;AACH,KAAA,CAAC;AACJ;;MCzBa,cAAc,CAAA;AACE,IAAA,MAAA;AAA3B,IAAA,WAAA,CAA2B,MAAwB,EAAA;QAAxB,IAAA,CAAA,MAAM,GAAN,MAAM;;IAEjC;AACA;;;;AAIG;AACH,IAAA,UAAU;IACV,KAAK,GAAY,EAAE;IACnB,IAAI,GAAY,EAAE;IAClB,IAAI,GAA0B,EAAE;IAChC,QAAQ,GAAa,IAAI;AACzB,IAAA,IAAI;AACJ,IAAA,KAAK;IACL,iBAAiB,GAAa,IAAI;IAClC,cAAc,GAAa,IAAI;IAC/B,aAAa,GAAa,IAAI;IAC9B,iBAAiB,GAAa,IAAI;IAClC,cAAc,GAAa,KAAK;IAChC,gBAAgB,GAAa,KAAK;IAClC,iBAAiB,GAAW,IAAI;IAChC,cAAc,GAAY,IAAI;IAC9B,gBAAgB,GAAY,QAAQ;AACpC,IAAA,kBAAkB;AAClB,IAAA,eAAe;AACf,IAAA,iBAAiB;IACjB,sBAAsB,GAAY,EAAE;IACpC,mBAAmB,GAAY,EAAE;IACjC,qBAAqB,GAAY,EAAE;IACnC,cAAc,GAAa,KAAK;IAChC,eAAe,GAAa,KAAK;IACjC,cAAc,GAAY,EAAE;AAC7B;;ACrCD;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-kit",
3
- "version": "6.2.0",
3
+ "version": "6.3.0",
4
4
  "description": "Angular input components",
5
5
  "author": "Mohammadreza Samani <mr.samani1368@gmail.com>",
6
6
  "license": "MIT",
@@ -312,6 +312,7 @@ interface EventInteractionState {
312
312
  declare class NgxCalendarComponent extends NgxDatePickerBase implements OnInit {
313
313
  defaultLocalization: NgxCalendarLocalization;
314
314
  localize: i0.InputSignal<NgxCalendarLocalization>;
315
+ resizeAndMovable: i0.InputSignal<boolean>;
315
316
  _config: NgxDatePickerConfig;
316
317
  set config(val: NgxDatePickerConfig);
317
318
  set locale(val: string);
@@ -399,7 +400,7 @@ declare class NgxCalendarComponent extends NgxDatePickerBase implements OnInit {
399
400
  private readonly defaultHeight;
400
401
  minHeight: number;
401
402
  static ɵfac: i0.ɵɵFactoryDeclaration<NgxCalendarComponent, never>;
402
- static ɵcmp: i0.ɵɵComponentDeclaration<NgxCalendarComponent, "ngx-calendar", never, { "localize": { "alias": "localize"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "setMin": { "alias": "min"; "required": false; }; "setMax": { "alias": "max"; "required": false; }; "view": { "alias": "view"; "required": false; }; "events": { "alias": "events"; "required": false; }; }, { "dateChange": "dateChange"; "selectEvent": "selectEvent"; "eventChange": "eventChange"; "eventsChange": "eventsChange"; }, never, never, true, never>;
403
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgxCalendarComponent, "ngx-calendar", never, { "localize": { "alias": "localize"; "required": false; "isSignal": true; }; "resizeAndMovable": { "alias": "resizeAndMovable"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "setMin": { "alias": "min"; "required": false; }; "setMax": { "alias": "max"; "required": false; }; "view": { "alias": "view"; "required": false; }; "events": { "alias": "events"; "required": false; }; }, { "dateChange": "dateChange"; "selectEvent": "selectEvent"; "eventChange": "eventChange"; "eventsChange": "eventsChange"; }, never, never, true, never>;
403
404
  }
404
405
 
405
406
  declare class NgxInputDatePickerComponent extends NgxDatePickerBase implements ControlValueAccessor, Validator, OnInit {
@@ -1,101 +1,112 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
 
3
- /**
4
- * از 'start'/'end' منطقی استفاده می‌کنیم نه 'left'/'right' — یعنی توی
5
- * RTL خودکار برعکس می‌شه (start یعنی راست در RTL، چپ در LTR)، دقیقاً هماهنگ
6
- * با بقیه‌ی کتابخونه که همه‌جا از پراپرتی‌های منطقیِ CSS استفاده می‌کنه.
7
- */
3
+ /** Logical drawer placement. `start` is right in RTL and left in LTR. */
8
4
  type NgxDrawerSide = 'start' | 'end';
9
- /**
10
- * جلوه‌ی بازوبسته‌شدنِ خودِ پنل:
11
- * - slide: اسلاید ساده‌ی کلاسیک
12
- * - curtain: چند نوار عمودیِ هم‌رنگِ پنل که با تأخیرِ پلکانی جمع می‌شن و
13
- * محتوا رو نمایان می‌کنن — حسِ باز شدنِ یه پرده‌ی چندلَته
14
- * - jelly: بازشدن با افکتِ ژله‌ای/کشسان — چند نوسانِ فنری که رفته‌رفته
15
- * فروکش می‌کنه (الهام از https://dribbble.com/shots/2307371)
16
- * - pull: یه کشیدگیِ لاستیکیِ تک‌ضربه‌ای — لبه‌ی پنل از اندازه‌ی نهایی رد
17
- * می‌شه و برمی‌گرده سرجاش (rubber-band)
18
- * - rotate3d: چرخشِ سه‌بعدیِ دور لولا (مثل باز شدنِ یه در)، با perspective
19
- * - flip3d: پنل و محتوای صفحه با هم مثل ورق‌زدنِ یه کتاب می‌چرخن
20
- * - scale: بزرگ‌شدن از مرکز همراه با fade
21
- */
22
- type NgxDrawerEffect = 'slide' | 'curtain' | 'jelly' | 'pull' | 'rotate3d' | 'flip3d' | 'scale';
23
- /**
24
- * رفتار محتوای اصلیِ صفحه وقتی درور باز می‌شه:
25
- * - overlay: محتوا سرجاش می‌مونه، درور روش شناور می‌شه (با بک‌دراپ)
26
- * - push: محتوا به‌اندازه‌ی عرضِ درور هل داده می‌شه (کنار می‌ره)
27
- * - reveal: محتوا کمی کوچیک/عقب می‌ره، انگار درور از زیرش نمایان می‌شه
28
- * (همون افکت معروف iOS)
29
- */
30
- type NgxDrawerContentBehavior = 'overlay' | 'push' | 'reveal';
5
+ /** How the drawer interacts with the application content. */
6
+ type NgxDrawerMode = 'overlay' | 'push' | 'reveal';
7
+ /** Desktop/mobile layout behavior when responsive mode is enabled. */
8
+ type NgxDrawerResponsiveBehavior = 'overlay' | 'dock';
9
+ /** Visual physics used by the drawer while opening/closing. */
10
+ type NgxDrawerEffect = 'slide' | 'spring' | 'fabric' | 'curtain' | 'elastic' | 'reveal';
11
+ type NgxDrawerResponsiveMode = 'off' | 'auto';
12
+ interface NgxDrawerResponsiveConfig {
13
+ mode?: NgxDrawerResponsiveMode;
14
+ breakpoint?: number;
15
+ desktopOpen?: boolean;
16
+ mobileOpen?: boolean;
17
+ /** Desktop layout: dock means a real sidebar; overlay means floating drawer. */
18
+ desktopBehavior?: NgxDrawerResponsiveBehavior;
19
+ /** Mobile layout is normally overlay. */
20
+ mobileBehavior?: NgxDrawerResponsiveBehavior;
21
+ respectPinned?: boolean;
22
+ }
31
23
 
32
- /**
33
- * درور منو (side drawer) با ۶ جلوه‌ی بازوبسته‌شدنِ متفاوت (از ساده تا
34
- * سه‌بعدی/ژله‌ای) و ۳ رفتار برای محتوای صفحه (overlay/push/reveal) —
35
- * دقیقاً مدل کتابخونه‌های حرفه‌ای مثل react-burger-menu یا Ionic Menu، ولی
36
- * signal-based و بدون هیچ وابستگی خارجی.
37
- *
38
- * نکات معماری:
39
- * - از 'start'/'end' منطقی استفاده می‌کنه، پس با CSS logical properties
40
- * زیر RTL خودکار برعکس می‌شه؛ فقط ریاضیِ درگ (که برخلاف CSS جهت فیزیکیِ
41
- * واقعی لازم داره) از DirectionService مشترک استفاده می‌کنه.
42
- * - وضعیت باز/بسته با model() دوطرفه‌ست، پس هم با [(open)] قابل کنترله و
43
- * هم می‌تونه به‌صورت خودکار و زنده با عرض صفحه هماهنگ بشه (respondToViewport)
44
- * — یعنی رد شدن از breakpoint (نه فقط بار اول لود) می‌تونه خودکار باز/بسته‌ش کنه.
45
- * - افکت‌های jelly/pull با keyframe سه‌مرحله‌ای (overshoot → نوسان → استقرار)
46
- * پیاده شدن، نه فقط یه transition ساده.
47
- */
48
24
  declare class NgxDrawerMenuComponent {
49
- side: _angular_core.InputSignal<NgxDrawerSide>;
50
- effect: _angular_core.InputSignal<NgxDrawerEffect>;
51
- contentBehavior: _angular_core.InputSignal<NgxDrawerContentBehavior>;
52
- width: _angular_core.InputSignal<number>;
53
- swipeEdgeSize: _angular_core.InputSignal<number>;
54
- curtainStrips: _angular_core.InputSignal<number>;
55
- backdropClose: _angular_core.InputSignal<boolean>;
56
- swipeEnabled: _angular_core.InputSignal<boolean>;
57
- /** اگه true باشه، رد شدن از mobileBreakpoint به‌صورت زنده open رو با openOnDesktop/openOnMobile هماهنگ می‌کنه */
58
- respondToViewport: _angular_core.InputSignal<boolean>;
59
- openOnDesktop: _angular_core.InputSignal<boolean>;
60
- openOnMobile: _angular_core.InputSignal<boolean>;
61
- mobileBreakpoint: _angular_core.InputSignal<number>;
62
- /** state دوطرفه‌ی باز/بسته؛ با [(open)] قابل bind هست */
63
- open: _angular_core.ModelSignal<boolean>;
64
- private readonly directionService;
65
- private readonly doc;
66
- private readonly destroyRef;
67
- /** فقط حین یه درگِ واقعی مقدار داره؛ null یعنی از روی open() تصمیم بگیر */
68
- protected readonly dragRatio: _angular_core.WritableSignal<number | null>;
25
+ readonly side: _angular_core.InputSignal<NgxDrawerSide>;
26
+ readonly mode: _angular_core.InputSignal<NgxDrawerMode>;
27
+ /** When responsive mode is active, desktop/mobile can use different layout behavior. */
28
+ readonly desktopBehavior: _angular_core.InputSignal<NgxDrawerResponsiveBehavior>;
29
+ readonly mobileBehavior: _angular_core.InputSignal<NgxDrawerResponsiveBehavior>;
30
+ private readonly responsiveDesktopBehavior;
31
+ private readonly responsiveMobileBehavior;
32
+ readonly effect: _angular_core.InputSignal<NgxDrawerEffect>;
33
+ readonly width: _angular_core.InputSignal<number>;
34
+ readonly maxWidth: _angular_core.InputSignal<number>;
35
+ readonly edgeSize: _angular_core.InputSignal<number>;
36
+ readonly dragThreshold: _angular_core.InputSignal<number>;
37
+ readonly velocityThreshold: _angular_core.InputSignal<number>;
38
+ /** Opens/closes the panel from the edge and while the panel itself is dragged. */
39
+ readonly swipeEnabled: _angular_core.InputSignal<boolean>;
40
+ /** Allows closing by clicking the backdrop. */
41
+ readonly backdropClose: _angular_core.InputSignal<boolean>;
42
+ /** Allows Escape to close the drawer. */
43
+ readonly escapeClose: _angular_core.InputSignal<boolean>;
44
+ /** The drawer starts open unless explicitly configured otherwise. */
45
+ readonly open: _angular_core.ModelSignal<boolean>;
46
+ /** Pinned drawers are intended for persistent desktop navigation. */
47
+ readonly pinned: _angular_core.ModelSignal<boolean>;
48
+ /** Responsive behavior. Can be overridden with individual inputs below. */
49
+ readonly responsive: _angular_core.InputSignal<NgxDrawerResponsiveConfig>;
50
+ /** Convenience aliases for the common responsive configuration. */
51
+ readonly respondToViewport: _angular_core.InputSignal<boolean>;
52
+ readonly mobileBreakpoint: _angular_core.InputSignal<number>;
53
+ readonly openOnDesktop: _angular_core.InputSignal<boolean>;
54
+ readonly openOnMobile: _angular_core.InputSignal<boolean>;
55
+ /** Visual tuning. */
56
+ readonly curtainStrips: _angular_core.InputSignal<number>;
57
+ readonly backdropOpacity: _angular_core.InputSignal<number>;
58
+ readonly transitionMs: _angular_core.InputSignal<number>;
59
+ readonly focusOnOpen: _angular_core.InputSignal<boolean>;
60
+ protected readonly dragProgress: _angular_core.WritableSignal<number | null>;
61
+ protected readonly dragVelocity: _angular_core.WritableSignal<number>;
62
+ protected readonly isMobile: _angular_core.WritableSignal<boolean>;
63
+ protected readonly effectiveBehavior: _angular_core.Signal<NgxDrawerResponsiveBehavior>;
64
+ protected readonly isDocked: _angular_core.Signal<boolean>;
65
+ protected readonly usesOverlay: _angular_core.Signal<boolean>;
69
66
  protected readonly isDragging: _angular_core.Signal<boolean>;
70
- protected readonly visualOpen: _angular_core.Signal<number>;
67
+ protected readonly progress: _angular_core.Signal<number>;
68
+ protected readonly isActuallyOpen: _angular_core.Signal<boolean>;
71
69
  protected readonly strips: _angular_core.Signal<number[]>;
72
- /**
73
- * +۱ یعنی این پنل فیزیکاً روی لبه‌ی چپِ صفحه‌ست، -۱ یعنی لبه‌ی راست —
74
- * برای transform:translateX() محتوای اصلی (که برخلاف inset-inline، به
75
- * dir=rtl خودکار واکنش نشون نمی‌ده) لازمه. reactive هست چون هم به side()
76
- * و هم به جهتِ زنده‌ی صفحه (directionService.isRtl()) وابسته‌ست.
77
- */
78
- protected readonly pushDirSign: _angular_core.Signal<1 | -1>;
79
- /** برای افکت‌های keyframe‌محور (jelly/pull) — فقط لحظه‌ی رهاشدن (نه حین درگ زنده) پخش می‌شه */
80
- protected readonly playEffectClass: _angular_core.WritableSignal<boolean>;
81
- private stopDrag?;
70
+ /** Physical side: true means the drawer is attached to the physical left edge. */
71
+ protected readonly isPhysicalLeft: _angular_core.Signal<boolean>;
72
+ protected readonly physicalSign: _angular_core.Signal<1 | -1>;
73
+ protected readonly effectiveMode: _angular_core.Signal<NgxDrawerMode>;
74
+ protected readonly duration: _angular_core.Signal<string>;
75
+ private readonly directionService;
76
+ private readonly document;
77
+ private readonly destroyRef;
78
+ private pointerId;
82
79
  private dragStartX;
83
- private dragStartRatio;
84
- private prevOpen;
80
+ private dragStartProgress;
81
+ private dragLastX;
82
+ private dragLastTime;
83
+ private lastVelocity;
84
+ private activePointerTarget;
85
+ private resizeObserver?;
86
+ private mediaQuery?;
87
+ private mediaQueryListener?;
88
+ private lastManagedViewportState;
85
89
  constructor();
86
- protected onEscape(): void;
87
- protected closeFromBackdrop(): void;
88
90
  toggle(): void;
89
- /** true یعنی این پنل فیزیکاً روی لبه‌ی چپِ صفحه‌ست (صرف‌نظر از start/end منطقی) */
90
- private isPhysicalLeftEdge;
91
- protected stripDelay(index: number): string;
92
- protected onEdgeDragStart(ev: MouseEvent | TouchEvent): void;
93
- protected onPanelDragStart(ev: MouseEvent | TouchEvent): void;
91
+ openDrawer(): void;
92
+ closeDrawer(): void;
93
+ pin(): void;
94
+ unpin(): void;
95
+ protected onEscape(): void;
96
+ protected onBackdropPointerDown(event: PointerEvent): void;
97
+ protected onEdgePointerDown(event: PointerEvent): void;
98
+ protected onPanelPointerDown(event: PointerEvent): void;
94
99
  private beginDrag;
95
- private clientXOf;
100
+ private readonly onPointerMove;
101
+ private readonly onPointerUp;
102
+ private readonly onPointerCancel;
103
+ private disposePointer;
104
+ private setupViewportSync;
105
+ private disposeViewportSync;
106
+ private clamp01;
96
107
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxDrawerMenuComponent, never>;
97
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDrawerMenuComponent, "ngx-drawer-menu", never, { "side": { "alias": "side"; "required": false; "isSignal": true; }; "effect": { "alias": "effect"; "required": false; "isSignal": true; }; "contentBehavior": { "alias": "contentBehavior"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "swipeEdgeSize": { "alias": "swipeEdgeSize"; "required": false; "isSignal": true; }; "curtainStrips": { "alias": "curtainStrips"; "required": false; "isSignal": true; }; "backdropClose": { "alias": "backdropClose"; "required": false; "isSignal": true; }; "swipeEnabled": { "alias": "swipeEnabled"; "required": false; "isSignal": true; }; "respondToViewport": { "alias": "respondToViewport"; "required": false; "isSignal": true; }; "openOnDesktop": { "alias": "openOnDesktop"; "required": false; "isSignal": true; }; "openOnMobile": { "alias": "openOnMobile"; "required": false; "isSignal": true; }; "mobileBreakpoint": { "alias": "mobileBreakpoint"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["*", "[drawerContent]"], true, never>;
108
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDrawerMenuComponent, "ngx-drawer-menu", never, { "side": { "alias": "side"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "desktopBehavior": { "alias": "desktopBehavior"; "required": false; "isSignal": true; }; "mobileBehavior": { "alias": "mobileBehavior"; "required": false; "isSignal": true; }; "effect": { "alias": "effect"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "edgeSize": { "alias": "edgeSize"; "required": false; "isSignal": true; }; "dragThreshold": { "alias": "dragThreshold"; "required": false; "isSignal": true; }; "velocityThreshold": { "alias": "velocityThreshold"; "required": false; "isSignal": true; }; "swipeEnabled": { "alias": "swipeEnabled"; "required": false; "isSignal": true; }; "backdropClose": { "alias": "backdropClose"; "required": false; "isSignal": true; }; "escapeClose": { "alias": "escapeClose"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "pinned": { "alias": "pinned"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "respondToViewport": { "alias": "respondToViewport"; "required": false; "isSignal": true; }; "mobileBreakpoint": { "alias": "mobileBreakpoint"; "required": false; "isSignal": true; }; "openOnDesktop": { "alias": "openOnDesktop"; "required": false; "isSignal": true; }; "openOnMobile": { "alias": "openOnMobile"; "required": false; "isSignal": true; }; "curtainStrips": { "alias": "curtainStrips"; "required": false; "isSignal": true; }; "backdropOpacity": { "alias": "backdropOpacity"; "required": false; "isSignal": true; }; "transitionMs": { "alias": "transitionMs"; "required": false; "isSignal": true; }; "focusOnOpen": { "alias": "focusOnOpen"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "pinned": "pinnedChange"; }, never, ["*", "[drawerContent]"], true, never>;
98
109
  }
99
110
 
100
111
  export { NgxDrawerMenuComponent };
101
- export type { NgxDrawerContentBehavior, NgxDrawerEffect, NgxDrawerSide };
112
+ export type { NgxDrawerEffect, NgxDrawerMode, NgxDrawerResponsiveBehavior, NgxDrawerResponsiveConfig, NgxDrawerResponsiveMode, NgxDrawerSide };