better-toast 0.0.1 → 0.0.2
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.
|
@@ -890,7 +890,7 @@ class BetterToastItem {
|
|
|
890
890
|
</svg>
|
|
891
891
|
</button>
|
|
892
892
|
}
|
|
893
|
-
`, isInline: true, styles: [":host{display:flex;align-items:center;gap:.375rem;flex:1;min-width:0;width:100%;padding-inline:.75rem;padding-block:1rem;box-sizing:border-box;border:1px solid var(--toast-border-color);border-radius:.5rem;box-shadow:var(--toast-shadow);background:var(--toast-bg);color:var(--toast-color);--toast-line-height: 1.35;font:500 .875rem/var(--toast-line-height) system-ui,sans-serif;pointer-events:auto;touch-action:none;-webkit-user-select:none;user-select:none;position:absolute;opacity:1;scale:1;transition:opacity .4s ease,transform .4s ease,scale .4s ease}:host([data-variant=\"loading\"]){touch-action:auto}@media(width>=40rem){:host{width:var(--toast-width)}}:host([data-position^=\"bottom\"]){bottom:0;transform:translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-position^=\"bottom\"]){opacity:0;transform:translateY(100%)}}:host([data-position^=\"top\"]){top:0;transform:translateY(calc(1 * var(--offset, 0px)))}@starting-style{:host([data-position^=\"top\"]){opacity:0;transform:translateY(-100%)}}@starting-style{:host([data-headless=\"true\"][data-position^=\"bottom\"]){opacity:1}}@starting-style{:host([data-headless=\"true\"][data-position^=\"top\"]){opacity:1}}:host([data-variant=\"default\"]) .toast-icon svg,:host([data-variant=\"default\"]) .toast-icon ::ng-deep svg,:host([data-variant=\"description\"]) .toast-icon svg,:host([data-variant=\"description\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"success\"]){background:var(--toast-success-bg);color:var(--toast-success-text);border-color:var(--toast-success-border)}:host([data-rich-colors=\"false\"][data-variant=\"success\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"success\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"success\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"success\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-success-text),var(--toast-success-bg));stroke:light-dark(var(--toast-success-bg),var(--toast-success-text));color:light-dark(var(--toast-success-bg),var(--toast-success-text))}:host([data-rich-colors=\"true\"][data-variant=\"error\"]){background:var(--toast-error-bg);color:var(--toast-error-text);border-color:var(--toast-error-border)}:host([data-rich-colors=\"false\"][data-variant=\"error\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"error\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"error\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"error\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-error-text),var(--toast-error-bg));stroke:light-dark(var(--toast-error-bg),var(--toast-error-text));color:light-dark(var(--toast-error-bg),var(--toast-error-text))}:host([data-rich-colors=\"true\"][data-variant=\"info\"]){background:var(--toast-info-bg);color:var(--toast-info-text);border-color:var(--toast-info-border)}:host([data-rich-colors=\"false\"][data-variant=\"info\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"info\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"info\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"info\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-info-text),var(--toast-info-bg));stroke:light-dark(var(--toast-info-bg),var(--toast-info-text));color:light-dark(var(--toast-info-bg),var(--toast-info-text))}:host([data-rich-colors=\"true\"][data-variant=\"warning\"]){background:var(--toast-warning-bg);color:var(--toast-warning-text);border-color:var(--toast-warning-border)}:host([data-rich-colors=\"false\"][data-variant=\"warning\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"warning\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"warning\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"warning\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-warning-text),var(--toast-warning-bg));stroke:light-dark(var(--toast-warning-bg),var(--toast-warning-text));color:light-dark(var(--toast-warning-bg),var(--toast-warning-text))}:host([data-headless=\"true\"]){width:max-content;max-width:calc(100dvw - var(--toast-offset-mobile-left, 16px) - var(--toast-offset-mobile-right, 16px));padding:0;gap:0;border:none;border-radius:0;box-shadow:none;background:transparent;color:inherit;font:inherit;line-height:normal;--toast-line-height: inherit}@media(width>=40rem){:host([data-headless=\"true\"]){max-width:calc(100dvw - var(--toast-offset-left, 24px) - var(--toast-offset-right, 24px))}}@media(width>=40rem){:host([data-headless=\"true\"][data-position$=\"-right\"]){left:auto;right:0}:host([data-headless=\"true\"][data-position$=\"-left\"]){left:0;right:auto}}:host([data-headless=\"true\"][data-position=\"bottom-center\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position=\"bottom-center\"]){opacity:1;transform:translate(-50%) translateY(100%)}}:host([data-headless=\"true\"][data-position=\"top-center\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position=\"top-center\"]){opacity:1;transform:translate(-50%) translateY(-100%)}}@media(width<40rem){:host([data-headless=\"true\"][data-position^=\"bottom\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position^=\"bottom\"]){opacity:1;transform:translate(-50%) translateY(100%)}}:host([data-headless=\"true\"][data-position^=\"top\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position^=\"top\"]){opacity:1;transform:translate(-50%) translateY(-100%)}}:host([data-headless=\"true\"][data-swipe-direction=\"down\"].leave){transform:translate(-50%) translateY(100%)}:host([data-headless=\"true\"][data-swipe-direction=\"up\"].leave){transform:translate(-50%) translateY(-100%)}}:host([data-headless=\"true\"][data-rich-colors=\"true\"]){background:transparent;color:inherit;border-color:transparent}:host([data-headless=\"true\"][data-icon=\"false\"]){padding-left:0}:host([data-icon=\"false\"]){padding-left:.925rem}.toast-icon,.toast-icon ::ng-deep{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:1.425rem;height:1.425rem}.toast-icon svg,.toast-icon ::ng-deep svg{display:block;margin-inline:auto;fill:light-dark(var(--toast-color),var(--toast-bg));stroke:light-dark(var(--toast-bg),var(--toast-color));width:95%;height:95%}:host([data-theme=\"dark\"]) .toast-icon svg,:host([data-theme=\"dark\"]) .toast-icon ::ng-deep svg{width:87.5%;height:87.5%}@media(prefers-color-scheme:dark){:host([data-theme=\"system\"]) .toast-icon svg,:host([data-theme=\"system\"]) .toast-icon ::ng-deep svg{width:87.5%;height:87.5%}}.toast-icon-loading{display:block;width:.9rem;height:.9rem;border-radius:50%;border:2px solid currentColor;border-top-color:transparent;border-right-color:transparent;animation:spin .45s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.msg{flex:1;min-width:0;max-width:95%;margin:0;font-size:.825rem;font-weight:500;line-height:calc(1.25 / .875);letter-spacing:.01em}@media(width<40rem){.msg{max-width:90%;font-size:.8rem}}.stack{display:flex;flex-direction:column;align-items:flex-start;gap:.25rem;flex:1;min-width:0}.stack .msg{flex:0 1 auto;max-width:100%}:host([data-icon=\"false\"]) .stack .msg{max-width:90%}.description{margin:0;font-size:.825rem;font-weight:400;line-height:1.35;letter-spacing:.01em;opacity:.9;max-width:100%}@media(width<40rem){.description{font-size:.8rem}}.toast-row-btn{flex-shrink:0;margin:0;margin-inline-start:auto;padding:.35rem .65rem;border-radius:.375rem;border:1px solid transparent;font:inherit;font-size:.8rem;font-weight:600;letter-spacing:.01em;line-height:1.2;cursor:pointer;white-space:nowrap;transition:transform .2s ease}.toast-row-btn:focus-visible{outline:2px solid var(--toast-color);outline-offset:2px}.toast-row-btn:active{transform:scale(.95)}@media(prefers-reduced-motion:reduce){.toast-row-btn:active{transform:none}}.action-btn{background:var(--toast-action-bg);color:var(--toast-action-text);border-color:var(--toast-action-border)}.cancel-btn{background:var(--toast-cancel-bg);color:var(--toast-color);border-color:var(--toast-cancel-border)}.toast-custom{flex:1;min-width:0;width:100%;font-size:.825rem;font-weight:400;line-height:calc(1.25 / .875)}.toast-custom :first-child{margin-top:0}.toast-custom :last-child{margin-bottom:0}.close-btn{position:absolute;top:-.3875rem;right:-.3875rem;flex-shrink:0;margin:-.15rem -.25rem -.15rem 0;border:1px solid var(--toast-border-color);box-shadow:var(--toast-shadow);background:var(--toast-bg);color:var(--toast-color);cursor:pointer;line-height:1;padding:.25rem;border-radius:50%;display:inline-flex;align-items:center;justify-content:center}:host([data-rich-colors=\"true\"][data-variant=\"success\"]) .close-btn{border-color:var(--toast-success-border);background:var(--toast-success-bg);color:var(--toast-success-text)}:host([data-rich-colors=\"true\"][data-variant=\"error\"]) .close-btn{border-color:var(--toast-error-border);background:var(--toast-error-bg);color:var(--toast-error-text)}:host([data-rich-colors=\"true\"][data-variant=\"info\"]) .close-btn{border-color:var(--toast-info-border);background:var(--toast-info-bg);color:var(--toast-info-text)}:host([data-rich-colors=\"true\"][data-variant=\"warning\"]) .close-btn{border-color:var(--toast-warning-border);background:var(--toast-warning-bg);color:var(--toast-warning-text)}.close-btn:focus-visible{outline:2px solid currentColor}.close-btn svg{display:block;width:.825rem;height:.825rem}:host(.leave){opacity:0;scale:.95}:host([data-swipe-direction=\"down\"].leave){transform:translateY(100%)}:host([data-headless=\"true\"][data-position=\"bottom-center\"].leave){transform:translate(-50%) translateY(100%)}:host([data-swipe-direction=\"up\"].leave){transform:translateY(-100%)}:host([data-headless=\"true\"][data-position=\"top-center\"].leave){transform:translate(-50%) translateY(-100%)}@media(prefers-reduced-motion:reduce){:host{transition:none}:host(.leave){scale:1}@starting-style{:host([data-position^=\"bottom\"]){opacity:0;transform:translateY(calc(-1 * var(--offset, 0px)))}}@starting-style{:host([data-position^=\"top\"]){opacity:0;transform:translateY(calc(1 * var(--offset, 0px)))}}@starting-style{:host([data-headless=\"true\"][data-position=\"bottom-center\"]){opacity:1;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}}@starting-style{:host([data-headless=\"true\"][data-position=\"top-center\"]){opacity:1;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}}:host([data-swipe-direction=\"down\"].leave){transform:translateY(calc(-1 * var(--offset, 0px)))}:host([data-swipe-direction=\"up\"].leave){transform:translateY(calc(1 * var(--offset, 0px)))}:host([data-headless=\"true\"][data-position=\"bottom-center\"].leave){transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}:host([data-headless=\"true\"][data-position=\"top-center\"].leave){transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}@media(width<40rem){@starting-style{:host([data-headless=\"true\"][data-position^=\"bottom\"]){opacity:1;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}}:host([data-headless=\"true\"][data-swipe-direction=\"down\"].leave){transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position^=\"top\"]){opacity:1;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}}:host([data-headless=\"true\"][data-swipe-direction=\"up\"].leave){transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}}.toast-icon-loading{animation:none}}\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
893
|
+
`, isInline: true, styles: [":host{display:flex;align-items:center;gap:.375rem;flex:1;min-width:0;width:100%;padding-inline:.75rem;padding-block:1rem;box-sizing:border-box;border:1px solid var(--toast-border-color);border-radius:.5rem;box-shadow:var(--toast-shadow);background:var(--toast-bg);color:var(--toast-color);--toast-line-height: 1.35;font:500 .875rem/var(--toast-line-height) system-ui,sans-serif;pointer-events:auto;touch-action:none;-webkit-user-select:none;user-select:none;position:absolute;opacity:1;scale:1;transition:opacity .4s ease,transform .4s ease,scale .4s ease,box-shadow .2s ease}:host([data-variant=\"loading\"]){touch-action:auto}@media(width>=40rem){:host{width:var(--toast-width)}}:host([data-position^=\"bottom\"]){bottom:0;transform:translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-position^=\"bottom\"]){opacity:0;transform:translateY(100%)}}:host([data-position^=\"top\"]){top:0;transform:translateY(calc(1 * var(--offset, 0px)))}@starting-style{:host([data-position^=\"top\"]){opacity:0;transform:translateY(-100%)}}@starting-style{:host([data-headless=\"true\"][data-position^=\"bottom\"]){opacity:1}}@starting-style{:host([data-headless=\"true\"][data-position^=\"top\"]){opacity:1}}:host([data-variant=\"default\"]) .toast-icon svg,:host([data-variant=\"default\"]) .toast-icon ::ng-deep svg,:host([data-variant=\"description\"]) .toast-icon svg,:host([data-variant=\"description\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"success\"]){background:var(--toast-success-bg);color:var(--toast-success-text);border-color:var(--toast-success-border)}:host([data-rich-colors=\"false\"][data-variant=\"success\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"success\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"success\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"success\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-success-text),var(--toast-success-bg));stroke:light-dark(var(--toast-success-bg),var(--toast-success-text));color:light-dark(var(--toast-success-bg),var(--toast-success-text))}:host([data-rich-colors=\"true\"][data-variant=\"error\"]){background:var(--toast-error-bg);color:var(--toast-error-text);border-color:var(--toast-error-border)}:host([data-rich-colors=\"false\"][data-variant=\"error\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"error\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"error\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"error\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-error-text),var(--toast-error-bg));stroke:light-dark(var(--toast-error-bg),var(--toast-error-text));color:light-dark(var(--toast-error-bg),var(--toast-error-text))}:host([data-rich-colors=\"true\"][data-variant=\"info\"]){background:var(--toast-info-bg);color:var(--toast-info-text);border-color:var(--toast-info-border)}:host([data-rich-colors=\"false\"][data-variant=\"info\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"info\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"info\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"info\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-info-text),var(--toast-info-bg));stroke:light-dark(var(--toast-info-bg),var(--toast-info-text));color:light-dark(var(--toast-info-bg),var(--toast-info-text))}:host([data-rich-colors=\"true\"][data-variant=\"warning\"]){background:var(--toast-warning-bg);color:var(--toast-warning-text);border-color:var(--toast-warning-border)}:host([data-rich-colors=\"false\"][data-variant=\"warning\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"warning\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"warning\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"warning\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-warning-text),var(--toast-warning-bg));stroke:light-dark(var(--toast-warning-bg),var(--toast-warning-text));color:light-dark(var(--toast-warning-bg),var(--toast-warning-text))}:host([data-headless=\"true\"]){width:max-content;max-width:calc(100dvw - var(--toast-offset-mobile-left, 16px) - var(--toast-offset-mobile-right, 16px));padding:0;gap:0;border:none;border-radius:0;box-shadow:none;background:transparent;color:inherit;font:inherit;line-height:normal;--toast-line-height: inherit}@media(width>=40rem){:host([data-headless=\"true\"]){max-width:calc(100dvw - var(--toast-offset-left, 24px) - var(--toast-offset-right, 24px))}}@media(width>=40rem){:host([data-headless=\"true\"][data-position$=\"-right\"]){left:auto;right:0}:host([data-headless=\"true\"][data-position$=\"-left\"]){left:0;right:auto}}:host([data-headless=\"true\"][data-position=\"bottom-center\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position=\"bottom-center\"]){opacity:1;transform:translate(-50%) translateY(100%)}}:host([data-headless=\"true\"][data-position=\"top-center\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position=\"top-center\"]){opacity:1;transform:translate(-50%) translateY(-100%)}}@media(width<40rem){:host([data-headless=\"true\"][data-position^=\"bottom\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position^=\"bottom\"]){opacity:1;transform:translate(-50%) translateY(100%)}}:host([data-headless=\"true\"][data-position^=\"top\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position^=\"top\"]){opacity:1;transform:translate(-50%) translateY(-100%)}}:host([data-headless=\"true\"][data-swipe-direction=\"down\"].leave){transform:translate(-50%) translateY(100%)}:host([data-headless=\"true\"][data-swipe-direction=\"up\"].leave){transform:translate(-50%) translateY(-100%)}}:host([data-headless=\"true\"][data-rich-colors=\"true\"]){background:transparent;color:inherit;border-color:transparent}:host([data-headless=\"true\"][data-icon=\"false\"]){padding-left:0}:host([data-icon=\"false\"]){padding-left:.925rem}.toast-icon,.toast-icon ::ng-deep{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:1.425rem;height:1.425rem}.toast-icon svg,.toast-icon ::ng-deep svg{display:block;margin-inline:auto;fill:light-dark(var(--toast-color),var(--toast-bg));stroke:light-dark(var(--toast-bg),var(--toast-color));width:95%;height:95%}:host([data-theme=\"dark\"]) .toast-icon svg,:host([data-theme=\"dark\"]) .toast-icon ::ng-deep svg{width:87.5%;height:87.5%}@media(prefers-color-scheme:dark){:host([data-theme=\"system\"]) .toast-icon svg,:host([data-theme=\"system\"]) .toast-icon ::ng-deep svg{width:87.5%;height:87.5%}}.toast-icon-loading{display:block;width:.9rem;height:.9rem;border-radius:50%;border:2px solid currentColor;border-top-color:transparent;border-right-color:transparent;animation:spin .45s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.msg{flex:1;min-width:0;max-width:95%;margin:0;font-size:.825rem;font-weight:500;line-height:calc(1.25 / .875);letter-spacing:.01em}@media(width<40rem){.msg{max-width:90%;font-size:.8rem}}.stack{display:flex;flex-direction:column;align-items:flex-start;gap:.25rem;flex:1;min-width:0}.stack .msg{flex:0 1 auto;max-width:100%}:host([data-icon=\"false\"]) .stack .msg{max-width:90%}.description{margin:0;font-size:.825rem;font-weight:400;line-height:1.35;letter-spacing:.01em;opacity:.9;max-width:100%}@media(width<40rem){.description{font-size:.8rem}}.toast-row-btn{flex-shrink:0;margin:0;margin-inline-start:auto;padding:.35rem .65rem;border-radius:.375rem;border:1px solid transparent;font:inherit;font-size:.8rem;font-weight:600;letter-spacing:.01em;line-height:1.2;cursor:pointer;white-space:nowrap;transition:transform .2s ease}.toast-row-btn:focus-visible{outline:2px solid var(--toast-color);outline-offset:2px}.toast-row-btn:active{transform:scale(.95)}@media(prefers-reduced-motion:reduce){.toast-row-btn:active{transform:none}}.action-btn{background:var(--toast-action-bg);color:var(--toast-action-text);border-color:var(--toast-action-border)}.cancel-btn{background:var(--toast-cancel-bg);color:var(--toast-color);border-color:var(--toast-cancel-border)}.toast-custom{flex:1;min-width:0;width:100%;font-size:.825rem;font-weight:400;line-height:calc(1.25 / .875)}.toast-custom :first-child{margin-top:0}.toast-custom :last-child{margin-bottom:0}.close-btn{position:absolute;top:-.3875rem;right:-.3875rem;flex-shrink:0;margin:-.15rem -.25rem -.15rem 0;border:1px solid var(--toast-border-color);box-shadow:var(--toast-shadow);background:var(--toast-bg);color:var(--toast-color);cursor:pointer;line-height:1;padding:.25rem;border-radius:50%;display:inline-flex;align-items:center;justify-content:center}:host([data-rich-colors=\"true\"][data-variant=\"success\"]) .close-btn{border-color:var(--toast-success-border);background:var(--toast-success-bg);color:var(--toast-success-text)}:host([data-rich-colors=\"true\"][data-variant=\"error\"]) .close-btn{border-color:var(--toast-error-border);background:var(--toast-error-bg);color:var(--toast-error-text)}:host([data-rich-colors=\"true\"][data-variant=\"info\"]) .close-btn{border-color:var(--toast-info-border);background:var(--toast-info-bg);color:var(--toast-info-text)}:host([data-rich-colors=\"true\"][data-variant=\"warning\"]) .close-btn{border-color:var(--toast-warning-border);background:var(--toast-warning-bg);color:var(--toast-warning-text)}.close-btn:focus-visible{outline:2px solid currentColor}.close-btn svg{display:block;width:.825rem;height:.825rem}:host(.leave){opacity:0;scale:.95}:host([data-swipe-direction=\"down\"].leave){transform:translateY(100%)}:host([data-headless=\"true\"][data-position=\"bottom-center\"].leave){transform:translate(-50%) translateY(100%)}:host([data-swipe-direction=\"up\"].leave){transform:translateY(-100%)}:host([data-headless=\"true\"][data-position=\"top-center\"].leave){transform:translate(-50%) translateY(-100%)}@media(prefers-reduced-motion:reduce){:host{transition:none}:host(.leave){scale:1}@starting-style{:host([data-position^=\"bottom\"]){opacity:0;transform:translateY(calc(-1 * var(--offset, 0px)))}}@starting-style{:host([data-position^=\"top\"]){opacity:0;transform:translateY(calc(1 * var(--offset, 0px)))}}@starting-style{:host([data-headless=\"true\"][data-position=\"bottom-center\"]){opacity:1;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}}@starting-style{:host([data-headless=\"true\"][data-position=\"top-center\"]){opacity:1;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}}:host([data-swipe-direction=\"down\"].leave){transform:translateY(calc(-1 * var(--offset, 0px)))}:host([data-swipe-direction=\"up\"].leave){transform:translateY(calc(1 * var(--offset, 0px)))}:host([data-headless=\"true\"][data-position=\"bottom-center\"].leave){transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}:host([data-headless=\"true\"][data-position=\"top-center\"].leave){transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}@media(width<40rem){@starting-style{:host([data-headless=\"true\"][data-position^=\"bottom\"]){opacity:1;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}}:host([data-headless=\"true\"][data-swipe-direction=\"down\"].leave){transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position^=\"top\"]){opacity:1;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}}:host([data-headless=\"true\"][data-swipe-direction=\"up\"].leave){transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}}.toast-icon-loading{animation:none}}\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
894
894
|
}
|
|
895
895
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: BetterToastItem, decorators: [{
|
|
896
896
|
type: Component,
|
|
@@ -1092,7 +1092,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
1092
1092
|
</svg>
|
|
1093
1093
|
</button>
|
|
1094
1094
|
}
|
|
1095
|
-
`, styles: [":host{display:flex;align-items:center;gap:.375rem;flex:1;min-width:0;width:100%;padding-inline:.75rem;padding-block:1rem;box-sizing:border-box;border:1px solid var(--toast-border-color);border-radius:.5rem;box-shadow:var(--toast-shadow);background:var(--toast-bg);color:var(--toast-color);--toast-line-height: 1.35;font:500 .875rem/var(--toast-line-height) system-ui,sans-serif;pointer-events:auto;touch-action:none;-webkit-user-select:none;user-select:none;position:absolute;opacity:1;scale:1;transition:opacity .4s ease,transform .4s ease,scale .4s ease}:host([data-variant=\"loading\"]){touch-action:auto}@media(width>=40rem){:host{width:var(--toast-width)}}:host([data-position^=\"bottom\"]){bottom:0;transform:translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-position^=\"bottom\"]){opacity:0;transform:translateY(100%)}}:host([data-position^=\"top\"]){top:0;transform:translateY(calc(1 * var(--offset, 0px)))}@starting-style{:host([data-position^=\"top\"]){opacity:0;transform:translateY(-100%)}}@starting-style{:host([data-headless=\"true\"][data-position^=\"bottom\"]){opacity:1}}@starting-style{:host([data-headless=\"true\"][data-position^=\"top\"]){opacity:1}}:host([data-variant=\"default\"]) .toast-icon svg,:host([data-variant=\"default\"]) .toast-icon ::ng-deep svg,:host([data-variant=\"description\"]) .toast-icon svg,:host([data-variant=\"description\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"success\"]){background:var(--toast-success-bg);color:var(--toast-success-text);border-color:var(--toast-success-border)}:host([data-rich-colors=\"false\"][data-variant=\"success\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"success\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"success\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"success\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-success-text),var(--toast-success-bg));stroke:light-dark(var(--toast-success-bg),var(--toast-success-text));color:light-dark(var(--toast-success-bg),var(--toast-success-text))}:host([data-rich-colors=\"true\"][data-variant=\"error\"]){background:var(--toast-error-bg);color:var(--toast-error-text);border-color:var(--toast-error-border)}:host([data-rich-colors=\"false\"][data-variant=\"error\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"error\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"error\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"error\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-error-text),var(--toast-error-bg));stroke:light-dark(var(--toast-error-bg),var(--toast-error-text));color:light-dark(var(--toast-error-bg),var(--toast-error-text))}:host([data-rich-colors=\"true\"][data-variant=\"info\"]){background:var(--toast-info-bg);color:var(--toast-info-text);border-color:var(--toast-info-border)}:host([data-rich-colors=\"false\"][data-variant=\"info\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"info\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"info\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"info\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-info-text),var(--toast-info-bg));stroke:light-dark(var(--toast-info-bg),var(--toast-info-text));color:light-dark(var(--toast-info-bg),var(--toast-info-text))}:host([data-rich-colors=\"true\"][data-variant=\"warning\"]){background:var(--toast-warning-bg);color:var(--toast-warning-text);border-color:var(--toast-warning-border)}:host([data-rich-colors=\"false\"][data-variant=\"warning\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"warning\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"warning\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"warning\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-warning-text),var(--toast-warning-bg));stroke:light-dark(var(--toast-warning-bg),var(--toast-warning-text));color:light-dark(var(--toast-warning-bg),var(--toast-warning-text))}:host([data-headless=\"true\"]){width:max-content;max-width:calc(100dvw - var(--toast-offset-mobile-left, 16px) - var(--toast-offset-mobile-right, 16px));padding:0;gap:0;border:none;border-radius:0;box-shadow:none;background:transparent;color:inherit;font:inherit;line-height:normal;--toast-line-height: inherit}@media(width>=40rem){:host([data-headless=\"true\"]){max-width:calc(100dvw - var(--toast-offset-left, 24px) - var(--toast-offset-right, 24px))}}@media(width>=40rem){:host([data-headless=\"true\"][data-position$=\"-right\"]){left:auto;right:0}:host([data-headless=\"true\"][data-position$=\"-left\"]){left:0;right:auto}}:host([data-headless=\"true\"][data-position=\"bottom-center\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position=\"bottom-center\"]){opacity:1;transform:translate(-50%) translateY(100%)}}:host([data-headless=\"true\"][data-position=\"top-center\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position=\"top-center\"]){opacity:1;transform:translate(-50%) translateY(-100%)}}@media(width<40rem){:host([data-headless=\"true\"][data-position^=\"bottom\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position^=\"bottom\"]){opacity:1;transform:translate(-50%) translateY(100%)}}:host([data-headless=\"true\"][data-position^=\"top\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position^=\"top\"]){opacity:1;transform:translate(-50%) translateY(-100%)}}:host([data-headless=\"true\"][data-swipe-direction=\"down\"].leave){transform:translate(-50%) translateY(100%)}:host([data-headless=\"true\"][data-swipe-direction=\"up\"].leave){transform:translate(-50%) translateY(-100%)}}:host([data-headless=\"true\"][data-rich-colors=\"true\"]){background:transparent;color:inherit;border-color:transparent}:host([data-headless=\"true\"][data-icon=\"false\"]){padding-left:0}:host([data-icon=\"false\"]){padding-left:.925rem}.toast-icon,.toast-icon ::ng-deep{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:1.425rem;height:1.425rem}.toast-icon svg,.toast-icon ::ng-deep svg{display:block;margin-inline:auto;fill:light-dark(var(--toast-color),var(--toast-bg));stroke:light-dark(var(--toast-bg),var(--toast-color));width:95%;height:95%}:host([data-theme=\"dark\"]) .toast-icon svg,:host([data-theme=\"dark\"]) .toast-icon ::ng-deep svg{width:87.5%;height:87.5%}@media(prefers-color-scheme:dark){:host([data-theme=\"system\"]) .toast-icon svg,:host([data-theme=\"system\"]) .toast-icon ::ng-deep svg{width:87.5%;height:87.5%}}.toast-icon-loading{display:block;width:.9rem;height:.9rem;border-radius:50%;border:2px solid currentColor;border-top-color:transparent;border-right-color:transparent;animation:spin .45s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.msg{flex:1;min-width:0;max-width:95%;margin:0;font-size:.825rem;font-weight:500;line-height:calc(1.25 / .875);letter-spacing:.01em}@media(width<40rem){.msg{max-width:90%;font-size:.8rem}}.stack{display:flex;flex-direction:column;align-items:flex-start;gap:.25rem;flex:1;min-width:0}.stack .msg{flex:0 1 auto;max-width:100%}:host([data-icon=\"false\"]) .stack .msg{max-width:90%}.description{margin:0;font-size:.825rem;font-weight:400;line-height:1.35;letter-spacing:.01em;opacity:.9;max-width:100%}@media(width<40rem){.description{font-size:.8rem}}.toast-row-btn{flex-shrink:0;margin:0;margin-inline-start:auto;padding:.35rem .65rem;border-radius:.375rem;border:1px solid transparent;font:inherit;font-size:.8rem;font-weight:600;letter-spacing:.01em;line-height:1.2;cursor:pointer;white-space:nowrap;transition:transform .2s ease}.toast-row-btn:focus-visible{outline:2px solid var(--toast-color);outline-offset:2px}.toast-row-btn:active{transform:scale(.95)}@media(prefers-reduced-motion:reduce){.toast-row-btn:active{transform:none}}.action-btn{background:var(--toast-action-bg);color:var(--toast-action-text);border-color:var(--toast-action-border)}.cancel-btn{background:var(--toast-cancel-bg);color:var(--toast-color);border-color:var(--toast-cancel-border)}.toast-custom{flex:1;min-width:0;width:100%;font-size:.825rem;font-weight:400;line-height:calc(1.25 / .875)}.toast-custom :first-child{margin-top:0}.toast-custom :last-child{margin-bottom:0}.close-btn{position:absolute;top:-.3875rem;right:-.3875rem;flex-shrink:0;margin:-.15rem -.25rem -.15rem 0;border:1px solid var(--toast-border-color);box-shadow:var(--toast-shadow);background:var(--toast-bg);color:var(--toast-color);cursor:pointer;line-height:1;padding:.25rem;border-radius:50%;display:inline-flex;align-items:center;justify-content:center}:host([data-rich-colors=\"true\"][data-variant=\"success\"]) .close-btn{border-color:var(--toast-success-border);background:var(--toast-success-bg);color:var(--toast-success-text)}:host([data-rich-colors=\"true\"][data-variant=\"error\"]) .close-btn{border-color:var(--toast-error-border);background:var(--toast-error-bg);color:var(--toast-error-text)}:host([data-rich-colors=\"true\"][data-variant=\"info\"]) .close-btn{border-color:var(--toast-info-border);background:var(--toast-info-bg);color:var(--toast-info-text)}:host([data-rich-colors=\"true\"][data-variant=\"warning\"]) .close-btn{border-color:var(--toast-warning-border);background:var(--toast-warning-bg);color:var(--toast-warning-text)}.close-btn:focus-visible{outline:2px solid currentColor}.close-btn svg{display:block;width:.825rem;height:.825rem}:host(.leave){opacity:0;scale:.95}:host([data-swipe-direction=\"down\"].leave){transform:translateY(100%)}:host([data-headless=\"true\"][data-position=\"bottom-center\"].leave){transform:translate(-50%) translateY(100%)}:host([data-swipe-direction=\"up\"].leave){transform:translateY(-100%)}:host([data-headless=\"true\"][data-position=\"top-center\"].leave){transform:translate(-50%) translateY(-100%)}@media(prefers-reduced-motion:reduce){:host{transition:none}:host(.leave){scale:1}@starting-style{:host([data-position^=\"bottom\"]){opacity:0;transform:translateY(calc(-1 * var(--offset, 0px)))}}@starting-style{:host([data-position^=\"top\"]){opacity:0;transform:translateY(calc(1 * var(--offset, 0px)))}}@starting-style{:host([data-headless=\"true\"][data-position=\"bottom-center\"]){opacity:1;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}}@starting-style{:host([data-headless=\"true\"][data-position=\"top-center\"]){opacity:1;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}}:host([data-swipe-direction=\"down\"].leave){transform:translateY(calc(-1 * var(--offset, 0px)))}:host([data-swipe-direction=\"up\"].leave){transform:translateY(calc(1 * var(--offset, 0px)))}:host([data-headless=\"true\"][data-position=\"bottom-center\"].leave){transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}:host([data-headless=\"true\"][data-position=\"top-center\"].leave){transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}@media(width<40rem){@starting-style{:host([data-headless=\"true\"][data-position^=\"bottom\"]){opacity:1;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}}:host([data-headless=\"true\"][data-swipe-direction=\"down\"].leave){transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position^=\"top\"]){opacity:1;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}}:host([data-headless=\"true\"][data-swipe-direction=\"up\"].leave){transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}}.toast-icon-loading{animation:none}}\n"] }]
|
|
1095
|
+
`, styles: [":host{display:flex;align-items:center;gap:.375rem;flex:1;min-width:0;width:100%;padding-inline:.75rem;padding-block:1rem;box-sizing:border-box;border:1px solid var(--toast-border-color);border-radius:.5rem;box-shadow:var(--toast-shadow);background:var(--toast-bg);color:var(--toast-color);--toast-line-height: 1.35;font:500 .875rem/var(--toast-line-height) system-ui,sans-serif;pointer-events:auto;touch-action:none;-webkit-user-select:none;user-select:none;position:absolute;opacity:1;scale:1;transition:opacity .4s ease,transform .4s ease,scale .4s ease,box-shadow .2s ease}:host([data-variant=\"loading\"]){touch-action:auto}@media(width>=40rem){:host{width:var(--toast-width)}}:host([data-position^=\"bottom\"]){bottom:0;transform:translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-position^=\"bottom\"]){opacity:0;transform:translateY(100%)}}:host([data-position^=\"top\"]){top:0;transform:translateY(calc(1 * var(--offset, 0px)))}@starting-style{:host([data-position^=\"top\"]){opacity:0;transform:translateY(-100%)}}@starting-style{:host([data-headless=\"true\"][data-position^=\"bottom\"]){opacity:1}}@starting-style{:host([data-headless=\"true\"][data-position^=\"top\"]){opacity:1}}:host([data-variant=\"default\"]) .toast-icon svg,:host([data-variant=\"default\"]) .toast-icon ::ng-deep svg,:host([data-variant=\"description\"]) .toast-icon svg,:host([data-variant=\"description\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"success\"]){background:var(--toast-success-bg);color:var(--toast-success-text);border-color:var(--toast-success-border)}:host([data-rich-colors=\"false\"][data-variant=\"success\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"success\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"success\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"success\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-success-text),var(--toast-success-bg));stroke:light-dark(var(--toast-success-bg),var(--toast-success-text));color:light-dark(var(--toast-success-bg),var(--toast-success-text))}:host([data-rich-colors=\"true\"][data-variant=\"error\"]){background:var(--toast-error-bg);color:var(--toast-error-text);border-color:var(--toast-error-border)}:host([data-rich-colors=\"false\"][data-variant=\"error\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"error\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"error\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"error\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-error-text),var(--toast-error-bg));stroke:light-dark(var(--toast-error-bg),var(--toast-error-text));color:light-dark(var(--toast-error-bg),var(--toast-error-text))}:host([data-rich-colors=\"true\"][data-variant=\"info\"]){background:var(--toast-info-bg);color:var(--toast-info-text);border-color:var(--toast-info-border)}:host([data-rich-colors=\"false\"][data-variant=\"info\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"info\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"info\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"info\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-info-text),var(--toast-info-bg));stroke:light-dark(var(--toast-info-bg),var(--toast-info-text));color:light-dark(var(--toast-info-bg),var(--toast-info-text))}:host([data-rich-colors=\"true\"][data-variant=\"warning\"]){background:var(--toast-warning-bg);color:var(--toast-warning-text);border-color:var(--toast-warning-border)}:host([data-rich-colors=\"false\"][data-variant=\"warning\"]) .toast-icon svg,:host([data-rich-colors=\"false\"][data-variant=\"warning\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-color),var(--toast-bg));color:light-dark(var(--toast-bg),var(--toast-color))}:host([data-rich-colors=\"true\"][data-variant=\"warning\"]) .toast-icon svg,:host([data-rich-colors=\"true\"][data-variant=\"warning\"]) .toast-icon ::ng-deep svg{fill:light-dark(var(--toast-warning-text),var(--toast-warning-bg));stroke:light-dark(var(--toast-warning-bg),var(--toast-warning-text));color:light-dark(var(--toast-warning-bg),var(--toast-warning-text))}:host([data-headless=\"true\"]){width:max-content;max-width:calc(100dvw - var(--toast-offset-mobile-left, 16px) - var(--toast-offset-mobile-right, 16px));padding:0;gap:0;border:none;border-radius:0;box-shadow:none;background:transparent;color:inherit;font:inherit;line-height:normal;--toast-line-height: inherit}@media(width>=40rem){:host([data-headless=\"true\"]){max-width:calc(100dvw - var(--toast-offset-left, 24px) - var(--toast-offset-right, 24px))}}@media(width>=40rem){:host([data-headless=\"true\"][data-position$=\"-right\"]){left:auto;right:0}:host([data-headless=\"true\"][data-position$=\"-left\"]){left:0;right:auto}}:host([data-headless=\"true\"][data-position=\"bottom-center\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position=\"bottom-center\"]){opacity:1;transform:translate(-50%) translateY(100%)}}:host([data-headless=\"true\"][data-position=\"top-center\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position=\"top-center\"]){opacity:1;transform:translate(-50%) translateY(-100%)}}@media(width<40rem){:host([data-headless=\"true\"][data-position^=\"bottom\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position^=\"bottom\"]){opacity:1;transform:translate(-50%) translateY(100%)}}:host([data-headless=\"true\"][data-position^=\"top\"]){left:50%;right:auto;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position^=\"top\"]){opacity:1;transform:translate(-50%) translateY(-100%)}}:host([data-headless=\"true\"][data-swipe-direction=\"down\"].leave){transform:translate(-50%) translateY(100%)}:host([data-headless=\"true\"][data-swipe-direction=\"up\"].leave){transform:translate(-50%) translateY(-100%)}}:host([data-headless=\"true\"][data-rich-colors=\"true\"]){background:transparent;color:inherit;border-color:transparent}:host([data-headless=\"true\"][data-icon=\"false\"]){padding-left:0}:host([data-icon=\"false\"]){padding-left:.925rem}.toast-icon,.toast-icon ::ng-deep{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:1.425rem;height:1.425rem}.toast-icon svg,.toast-icon ::ng-deep svg{display:block;margin-inline:auto;fill:light-dark(var(--toast-color),var(--toast-bg));stroke:light-dark(var(--toast-bg),var(--toast-color));width:95%;height:95%}:host([data-theme=\"dark\"]) .toast-icon svg,:host([data-theme=\"dark\"]) .toast-icon ::ng-deep svg{width:87.5%;height:87.5%}@media(prefers-color-scheme:dark){:host([data-theme=\"system\"]) .toast-icon svg,:host([data-theme=\"system\"]) .toast-icon ::ng-deep svg{width:87.5%;height:87.5%}}.toast-icon-loading{display:block;width:.9rem;height:.9rem;border-radius:50%;border:2px solid currentColor;border-top-color:transparent;border-right-color:transparent;animation:spin .45s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.msg{flex:1;min-width:0;max-width:95%;margin:0;font-size:.825rem;font-weight:500;line-height:calc(1.25 / .875);letter-spacing:.01em}@media(width<40rem){.msg{max-width:90%;font-size:.8rem}}.stack{display:flex;flex-direction:column;align-items:flex-start;gap:.25rem;flex:1;min-width:0}.stack .msg{flex:0 1 auto;max-width:100%}:host([data-icon=\"false\"]) .stack .msg{max-width:90%}.description{margin:0;font-size:.825rem;font-weight:400;line-height:1.35;letter-spacing:.01em;opacity:.9;max-width:100%}@media(width<40rem){.description{font-size:.8rem}}.toast-row-btn{flex-shrink:0;margin:0;margin-inline-start:auto;padding:.35rem .65rem;border-radius:.375rem;border:1px solid transparent;font:inherit;font-size:.8rem;font-weight:600;letter-spacing:.01em;line-height:1.2;cursor:pointer;white-space:nowrap;transition:transform .2s ease}.toast-row-btn:focus-visible{outline:2px solid var(--toast-color);outline-offset:2px}.toast-row-btn:active{transform:scale(.95)}@media(prefers-reduced-motion:reduce){.toast-row-btn:active{transform:none}}.action-btn{background:var(--toast-action-bg);color:var(--toast-action-text);border-color:var(--toast-action-border)}.cancel-btn{background:var(--toast-cancel-bg);color:var(--toast-color);border-color:var(--toast-cancel-border)}.toast-custom{flex:1;min-width:0;width:100%;font-size:.825rem;font-weight:400;line-height:calc(1.25 / .875)}.toast-custom :first-child{margin-top:0}.toast-custom :last-child{margin-bottom:0}.close-btn{position:absolute;top:-.3875rem;right:-.3875rem;flex-shrink:0;margin:-.15rem -.25rem -.15rem 0;border:1px solid var(--toast-border-color);box-shadow:var(--toast-shadow);background:var(--toast-bg);color:var(--toast-color);cursor:pointer;line-height:1;padding:.25rem;border-radius:50%;display:inline-flex;align-items:center;justify-content:center}:host([data-rich-colors=\"true\"][data-variant=\"success\"]) .close-btn{border-color:var(--toast-success-border);background:var(--toast-success-bg);color:var(--toast-success-text)}:host([data-rich-colors=\"true\"][data-variant=\"error\"]) .close-btn{border-color:var(--toast-error-border);background:var(--toast-error-bg);color:var(--toast-error-text)}:host([data-rich-colors=\"true\"][data-variant=\"info\"]) .close-btn{border-color:var(--toast-info-border);background:var(--toast-info-bg);color:var(--toast-info-text)}:host([data-rich-colors=\"true\"][data-variant=\"warning\"]) .close-btn{border-color:var(--toast-warning-border);background:var(--toast-warning-bg);color:var(--toast-warning-text)}.close-btn:focus-visible{outline:2px solid currentColor}.close-btn svg{display:block;width:.825rem;height:.825rem}:host(.leave){opacity:0;scale:.95}:host([data-swipe-direction=\"down\"].leave){transform:translateY(100%)}:host([data-headless=\"true\"][data-position=\"bottom-center\"].leave){transform:translate(-50%) translateY(100%)}:host([data-swipe-direction=\"up\"].leave){transform:translateY(-100%)}:host([data-headless=\"true\"][data-position=\"top-center\"].leave){transform:translate(-50%) translateY(-100%)}@media(prefers-reduced-motion:reduce){:host{transition:none}:host(.leave){scale:1}@starting-style{:host([data-position^=\"bottom\"]){opacity:0;transform:translateY(calc(-1 * var(--offset, 0px)))}}@starting-style{:host([data-position^=\"top\"]){opacity:0;transform:translateY(calc(1 * var(--offset, 0px)))}}@starting-style{:host([data-headless=\"true\"][data-position=\"bottom-center\"]){opacity:1;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}}@starting-style{:host([data-headless=\"true\"][data-position=\"top-center\"]){opacity:1;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}}:host([data-swipe-direction=\"down\"].leave){transform:translateY(calc(-1 * var(--offset, 0px)))}:host([data-swipe-direction=\"up\"].leave){transform:translateY(calc(1 * var(--offset, 0px)))}:host([data-headless=\"true\"][data-position=\"bottom-center\"].leave){transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}:host([data-headless=\"true\"][data-position=\"top-center\"].leave){transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}@media(width<40rem){@starting-style{:host([data-headless=\"true\"][data-position^=\"bottom\"]){opacity:1;transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}}:host([data-headless=\"true\"][data-swipe-direction=\"down\"].leave){transform:translate(-50%) translateY(calc(-1 * var(--offset, 0px)))}@starting-style{:host([data-headless=\"true\"][data-position^=\"top\"]){opacity:1;transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}}:host([data-headless=\"true\"][data-swipe-direction=\"up\"].leave){transform:translate(-50%) translateY(calc(1 * var(--offset, 0px)))}}.toast-icon-loading{animation:none}}\n"] }]
|
|
1096
1096
|
}], ctorParameters: () => [], propDecorators: { toast: [{ type: i0.Input, args: [{ isSignal: true, alias: "toast", required: false }] }], toasterStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "toasterStyle", required: false }] }], toasterClassNames: [{ type: i0.Input, args: [{ isSignal: true, alias: "toasterClassNames", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: true }] }], closeButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeButton", required: false }] }], customIcons: [{ type: i0.Input, args: [{ isSignal: true, alias: "customIcons", required: false }] }], dismissButtonAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissButtonAriaLabel", required: false }] }], stackPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "stackPosition", required: false }] }], theme: [{ type: i0.Input, args: [{ isSignal: true, alias: "theme", required: false }] }], heightChange: [{ type: i0.Output, args: ["heightChange"] }] } });
|
|
1097
1097
|
/**
|
|
1098
1098
|
* Renders the toaster stack. Add once near the root of your app (e.g. in `App`).
|
|
@@ -1256,7 +1256,7 @@ class BetterToaster {
|
|
|
1256
1256
|
}
|
|
1257
1257
|
</ol>
|
|
1258
1258
|
</section>
|
|
1259
|
-
`, isInline: true, styles: [":host{--toast-width: 356px;--toast-gap: 1rem;--toast-z-index: 99999;--toast-offset-top: 24px;--toast-offset-bottom: 24px;--toast-offset-left: 24px;--toast-offset-right: 24px;--toast-offset-mobile-top: 16px;--toast-offset-mobile-bottom: 16px;--toast-offset-mobile-left: 16px;--toast-offset-mobile-right: 16px}.toast-container[data-theme=light]{color-scheme:light}.toast-container[data-theme=dark]{color-scheme:dark}.toast-container[data-theme=system]{color-scheme:light dark}.toast-container{--toast-bg: light-dark(oklch(100% 0 0), oklch(10% 0 0));--toast-color: light-dark(oklch(30% 0 0), oklch(98% 0 0));--toast-border-color: light-dark(
|
|
1259
|
+
`, isInline: true, styles: [":host{--toast-width: 356px;--toast-gap: 1rem;--toast-z-index: 99999;--toast-offset-top: 24px;--toast-offset-bottom: 24px;--toast-offset-left: 24px;--toast-offset-right: 24px;--toast-offset-mobile-top: 16px;--toast-offset-mobile-bottom: 16px;--toast-offset-mobile-left: 16px;--toast-offset-mobile-right: 16px}.toast-container[data-theme=light]{color-scheme:light}.toast-container[data-theme=dark]{color-scheme:dark}.toast-container[data-theme=system]{color-scheme:light dark}.toast-container{--toast-bg: light-dark(oklch(100% 0 0), oklch(10% 0 0));--toast-color: light-dark(oklch(30% 0 0), oklch(98% 0 0));--toast-border-color: light-dark(hsl(0, 0%, 93%), hsl(0, 0%, 20%));--toast-shadow: 0px 4px 12px rgba(0, 0, 0, .1);--toast-success-bg: light-dark(oklch(97.9% .021 166.113), oklch(26.2% .051 172.552));--toast-success-text: light-dark(oklch(59.6% .145 163.225), oklch(92.5% .084 155.995));--toast-success-border: light-dark( oklch(69.6% .17 162.48 / .1), oklch(92.5% .084 155.995 / .1) );--toast-error-bg: light-dark(oklch(97.5% .012 25), oklch(25.8% .092 26.042));--toast-error-text: light-dark(oklch(57.7% .245 27.325), oklch(88.5% .062 18.334));--toast-error-border: light-dark( oklch(80.8% .114 19.571 / .1), oklch(88.5% .062 18.334 / .125) );--toast-info-bg: light-dark(oklch(97.7% .013 236.62), oklch(29.3% .066 243.157));--toast-info-text: light-dark(oklch(68.5% .169 237.323), oklch(90.1% .058 230.902));--toast-info-border: light-dark( oklch(82.8% .111 230.318 / .15), oklch(90.1% .058 230.902 / .125) );--toast-warning-bg: light-dark(oklch(98.7% .022 95.277), oklch(28.6% .066 53.813));--toast-warning-text: light-dark(oklch(66.6% .179 58.318), oklch(92.4% .12 95.746));--toast-warning-border: light-dark( oklch(76.9% .188 70.08 / .15), oklch(92.4% .12 95.746 / .125) );--toast-action-bg: light-dark(var(--color-black), var(--color-white));--toast-action-text: light-dark(var(--color-white), var(--color-black));--toast-action-border: light-dark(var(--color-black), var(--color-white));--toast-cancel-bg: light-dark(oklch(86.9% .005 56.366 / .3), oklch(26.8% .007 34.298 / .85));--toast-cancel-text: var(--toast-color);--toast-cancel-border: light-dark( oklch(86.9% .005 56.366 / .1), oklch(26.8% .007 34.298 / .5) );position:fixed;z-index:var(--toast-z-index);width:auto;pointer-events:none;overflow:visible;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.toast-container[data-theme=dark]{--toast-shadow: 0px 4px 12px rgba(0, 0, 0, .1)}@media(prefers-color-scheme:dark){.toast-container[data-theme=system]{--toast-shadow: 0px 4px 12px rgba(0, 0, 0, .1)}}.toast-container[data-position^=top]{top:var(--toast-offset-mobile-top);left:var(--toast-offset-mobile-left);right:var(--toast-offset-mobile-right)}.toast-container[data-position^=bottom]{bottom:var(--toast-offset-mobile-bottom);left:var(--toast-offset-mobile-left);right:var(--toast-offset-mobile-right)}@media(width>=40rem){.toast-container{width:var(--toast-width)}.toast-container[data-position=top-left]{top:var(--toast-offset-top);left:var(--toast-offset-left);right:auto;align-items:flex-start}.toast-container[data-position=top-center]{top:var(--toast-offset-top);left:50%;transform:translate(-50%);align-items:center}.toast-container[data-position=top-right]{top:var(--toast-offset-top);right:var(--toast-offset-right);left:auto;align-items:flex-end}.toast-container[data-position=bottom-left]{bottom:var(--toast-offset-bottom);left:var(--toast-offset-left);right:auto;align-items:flex-start}.toast-container[data-position=bottom-center]{bottom:var(--toast-offset-bottom);left:50%;transform:translate(-50%);align-items:center}.toast-container[data-position=bottom-right]{bottom:var(--toast-offset-bottom);right:var(--toast-offset-right);left:auto;align-items:flex-end}}\n"], dependencies: [{ kind: "component", type: BetterToastItem, selector: "li[betterToastItem]", inputs: ["toast", "toasterStyle", "toasterClassNames", "variant", "offset", "closeButton", "customIcons", "dismissButtonAriaLabel", "stackPosition", "theme"], outputs: ["heightChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1260
1260
|
}
|
|
1261
1261
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: BetterToaster, decorators: [{
|
|
1262
1262
|
type: Component,
|
|
@@ -1303,7 +1303,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
1303
1303
|
}
|
|
1304
1304
|
</ol>
|
|
1305
1305
|
</section>
|
|
1306
|
-
`, styles: [":host{--toast-width: 356px;--toast-gap: 1rem;--toast-z-index: 99999;--toast-offset-top: 24px;--toast-offset-bottom: 24px;--toast-offset-left: 24px;--toast-offset-right: 24px;--toast-offset-mobile-top: 16px;--toast-offset-mobile-bottom: 16px;--toast-offset-mobile-left: 16px;--toast-offset-mobile-right: 16px}.toast-container[data-theme=light]{color-scheme:light}.toast-container[data-theme=dark]{color-scheme:dark}.toast-container[data-theme=system]{color-scheme:light dark}.toast-container{--toast-bg: light-dark(oklch(100% 0 0), oklch(10% 0 0));--toast-color: light-dark(oklch(30% 0 0), oklch(98% 0 0));--toast-border-color: light-dark(
|
|
1306
|
+
`, styles: [":host{--toast-width: 356px;--toast-gap: 1rem;--toast-z-index: 99999;--toast-offset-top: 24px;--toast-offset-bottom: 24px;--toast-offset-left: 24px;--toast-offset-right: 24px;--toast-offset-mobile-top: 16px;--toast-offset-mobile-bottom: 16px;--toast-offset-mobile-left: 16px;--toast-offset-mobile-right: 16px}.toast-container[data-theme=light]{color-scheme:light}.toast-container[data-theme=dark]{color-scheme:dark}.toast-container[data-theme=system]{color-scheme:light dark}.toast-container{--toast-bg: light-dark(oklch(100% 0 0), oklch(10% 0 0));--toast-color: light-dark(oklch(30% 0 0), oklch(98% 0 0));--toast-border-color: light-dark(hsl(0, 0%, 93%), hsl(0, 0%, 20%));--toast-shadow: 0px 4px 12px rgba(0, 0, 0, .1);--toast-success-bg: light-dark(oklch(97.9% .021 166.113), oklch(26.2% .051 172.552));--toast-success-text: light-dark(oklch(59.6% .145 163.225), oklch(92.5% .084 155.995));--toast-success-border: light-dark( oklch(69.6% .17 162.48 / .1), oklch(92.5% .084 155.995 / .1) );--toast-error-bg: light-dark(oklch(97.5% .012 25), oklch(25.8% .092 26.042));--toast-error-text: light-dark(oklch(57.7% .245 27.325), oklch(88.5% .062 18.334));--toast-error-border: light-dark( oklch(80.8% .114 19.571 / .1), oklch(88.5% .062 18.334 / .125) );--toast-info-bg: light-dark(oklch(97.7% .013 236.62), oklch(29.3% .066 243.157));--toast-info-text: light-dark(oklch(68.5% .169 237.323), oklch(90.1% .058 230.902));--toast-info-border: light-dark( oklch(82.8% .111 230.318 / .15), oklch(90.1% .058 230.902 / .125) );--toast-warning-bg: light-dark(oklch(98.7% .022 95.277), oklch(28.6% .066 53.813));--toast-warning-text: light-dark(oklch(66.6% .179 58.318), oklch(92.4% .12 95.746));--toast-warning-border: light-dark( oklch(76.9% .188 70.08 / .15), oklch(92.4% .12 95.746 / .125) );--toast-action-bg: light-dark(var(--color-black), var(--color-white));--toast-action-text: light-dark(var(--color-white), var(--color-black));--toast-action-border: light-dark(var(--color-black), var(--color-white));--toast-cancel-bg: light-dark(oklch(86.9% .005 56.366 / .3), oklch(26.8% .007 34.298 / .85));--toast-cancel-text: var(--toast-color);--toast-cancel-border: light-dark( oklch(86.9% .005 56.366 / .1), oklch(26.8% .007 34.298 / .5) );position:fixed;z-index:var(--toast-z-index);width:auto;pointer-events:none;overflow:visible;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.toast-container[data-theme=dark]{--toast-shadow: 0px 4px 12px rgba(0, 0, 0, .1)}@media(prefers-color-scheme:dark){.toast-container[data-theme=system]{--toast-shadow: 0px 4px 12px rgba(0, 0, 0, .1)}}.toast-container[data-position^=top]{top:var(--toast-offset-mobile-top);left:var(--toast-offset-mobile-left);right:var(--toast-offset-mobile-right)}.toast-container[data-position^=bottom]{bottom:var(--toast-offset-mobile-bottom);left:var(--toast-offset-mobile-left);right:var(--toast-offset-mobile-right)}@media(width>=40rem){.toast-container{width:var(--toast-width)}.toast-container[data-position=top-left]{top:var(--toast-offset-top);left:var(--toast-offset-left);right:auto;align-items:flex-start}.toast-container[data-position=top-center]{top:var(--toast-offset-top);left:50%;transform:translate(-50%);align-items:center}.toast-container[data-position=top-right]{top:var(--toast-offset-top);right:var(--toast-offset-right);left:auto;align-items:flex-end}.toast-container[data-position=bottom-left]{bottom:var(--toast-offset-bottom);left:var(--toast-offset-left);right:auto;align-items:flex-start}.toast-container[data-position=bottom-center]{bottom:var(--toast-offset-bottom);left:50%;transform:translate(-50%);align-items:center}.toast-container[data-position=bottom-right]{bottom:var(--toast-offset-bottom);right:var(--toast-offset-right);left:auto;align-items:flex-end}}\n"] }]
|
|
1307
1307
|
}], propDecorators: { durationMs: [{ type: i0.Input, args: [{ isSignal: true, alias: "duration", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: false }] }], mobileOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileOffset", required: false }] }], richColors: [{ type: i0.Input, args: [{ isSignal: true, alias: "richColors", required: false }] }], theme: [{ type: i0.Input, args: [{ isSignal: true, alias: "theme", required: false }] }], icons: [{ type: i0.Input, args: [{ isSignal: true, alias: "icons", required: false }] }], toastOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "toastOptions", required: false }] }], closeButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeButton", required: false }] }], accessibilityLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "accessibilityLabels", required: false }] }] } });
|
|
1308
1308
|
|
|
1309
1309
|
/*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"better-toast.mjs","sources":["../../../projects/better-toast/src/lib/toaster.service.ts","../../../projects/better-toast/src/lib/toaster.types.ts","../../../projects/better-toast/src/lib/toaster.ts","../../../projects/better-toast/src/public-api.ts","../../../projects/better-toast/src/better-toast.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\r\n\r\nimport type { Type } from '@angular/core';\r\n\r\nimport type {\r\n CustomToastOptions,\r\n HeadlessToastOptions,\r\n ToastActionMethodOptions,\r\n ToastCancelMethodOptions,\r\n ToastPromiseLabels,\r\n ToastOptions,\r\n ToastVariant,\r\n ToasterDuration,\r\n ToasterItem,\r\n} from './toaster.types';\r\n\r\n/** Fallback when `<app-toaster [duration]>` is absent and a helper omits `durationMs`. */\r\nexport const DEFAULT_TOAST_DURATION_MS = 4000;\r\n\r\n/** Default label for {@link ToasterService.action} when {@link ToastMethodButtonConfig.label} is omitted. */\r\nexport const DEFAULT_TOAST_ACTION_LABEL = 'Action';\r\n\r\n/** Default label for {@link ToasterService.cancel} when {@link ToastMethodButtonConfig.label} is omitted. */\r\nexport const DEFAULT_TOAST_CANCEL_LABEL = 'Cancel';\r\n\r\n/**\r\n * Use with `[duration]` or `options.durationMs` so a toast stays until manually dismissed.\r\n * (`0` is still treated as non-auto-dismiss for backward compatibility.)\r\n */\r\nexport const TOAST_DURATION_MANUAL_DISMISS = Number.POSITIVE_INFINITY;\r\n\r\n/** Coerces {@link ToasterDuration} to ms (only the literal string `\"Infinity\"` for manual dismiss). */\r\nexport function parseToasterDurationMs(value: ToasterDuration): number {\r\n if (value === 'Infinity') {\r\n return TOAST_DURATION_MANUAL_DISMISS;\r\n }\r\n if (Number.isNaN(value)) {\r\n return DEFAULT_TOAST_DURATION_MS;\r\n }\r\n return value;\r\n}\r\n\r\nfunction shouldScheduleAutoDismiss(durationMs: number): boolean {\r\n return Number.isFinite(durationMs) && durationMs > 0;\r\n}\r\n\r\ntype AutoDismissState =\r\n | { kind: 'scheduled'; timer: ReturnType<typeof globalThis.setTimeout>; deadline: number }\r\n | { kind: 'paused'; remainingMs: number };\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ToasterService {\r\n private readonly _toasts = signal<readonly ToasterItem[]>([]);\r\n\r\n private readonly autoDismissByToastId = new Map<string, AutoDismissState>();\r\n\r\n /** Updated by `<better-toaster [duration]>`; initial value is {@link DEFAULT_TOAST_DURATION_MS}. */\r\n private defaultDurationMs = DEFAULT_TOAST_DURATION_MS;\r\n\r\n /** Active messages, oldest first. */\r\n readonly toasts = this._toasts.asReadonly();\r\n\r\n /**\r\n * Synced from `<better-toaster [duration]>`; used when a service call omits `durationMs`.\r\n * Does not change timers on toasts already shown.\r\n */\r\n setDefaultDurationMs(ms: number): void {\r\n const normalizedMs = Number.isNaN(ms) ? DEFAULT_TOAST_DURATION_MS : Math.max(0, ms);\r\n this.defaultDurationMs = normalizedMs;\r\n }\r\n\r\n private resolveDuration(durationMs: ToasterDuration | undefined): number {\r\n if (durationMs !== undefined) {\r\n return parseToasterDurationMs(durationMs);\r\n }\r\n return this.defaultDurationMs;\r\n }\r\n\r\n /**\r\n * Stops any auto-dismiss for this toast: clears a running timeout if present and drops timer state.\r\n */\r\n private cancelAutoDismiss(id: string): void {\r\n const state = this.autoDismissByToastId.get(id);\r\n if (!state) {\r\n return;\r\n }\r\n if (state.kind === 'scheduled') {\r\n globalThis.clearTimeout(state.timer);\r\n }\r\n this.autoDismissByToastId.delete(id);\r\n }\r\n\r\n /**\r\n * (Re)starts auto-dismiss from a concrete duration in milliseconds.\r\n * Idempotent per toast: always cancels any existing timer first.\r\n * Manual dismiss (`Infinity`) and non-positive values do not schedule a timer.\r\n */\r\n private scheduleAutoDismiss(id: string, durationMs: number): void {\r\n this.cancelAutoDismiss(id);\r\n if (!shouldScheduleAutoDismiss(durationMs)) {\r\n return;\r\n }\r\n const deadline = Date.now() + durationMs;\r\n const timer = globalThis.setTimeout(() => {\r\n this.removeToast(id, 'auto');\r\n }, durationMs);\r\n this.autoDismissByToastId.set(id, { kind: 'scheduled', timer, deadline });\r\n }\r\n\r\n /**\r\n * Pauses the auto-dismiss timer while the pointer is over the toast (e.g. hover).\r\n * No-op if the toast has no active auto-dismiss.\r\n *\r\n * @param id The toast ID.\r\n */\r\n pauseAutoDismiss(id: string): void {\r\n const state = this.autoDismissByToastId.get(id);\r\n if (!state || state.kind !== 'scheduled') {\r\n return;\r\n }\r\n globalThis.clearTimeout(state.timer);\r\n const remainingMs = Math.max(0, state.deadline - Date.now());\r\n this.autoDismissByToastId.set(id, { kind: 'paused', remainingMs });\r\n }\r\n\r\n /**\r\n * Resumes a paused auto-dismiss with the remaining time from {@link pauseAutoDismiss}.\r\n *\r\n * @param id The toast ID.\r\n */\r\n resumeAutoDismiss(id: string): void {\r\n const state = this.autoDismissByToastId.get(id);\r\n if (!state || state.kind !== 'paused') {\r\n return;\r\n }\r\n const { remainingMs } = state;\r\n this.autoDismissByToastId.delete(id);\r\n if (remainingMs <= 0) {\r\n this.removeToast(id, 'auto');\r\n return;\r\n }\r\n this.scheduleAutoDismiss(id, remainingMs);\r\n }\r\n\r\n /**\r\n * Display a neutral (default) toast notification.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n show(message: string, options?: ToastOptions): string {\r\n return this.add(message, 'default', this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Display a toast using the **`description`** variant: same neutral chrome as **`default`**.\r\n *\r\n * @param message Title line.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n description(message: string, options?: ToastOptions): string {\r\n return this.add(message, 'description', this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Display a success toast notification.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n success(message: string, options?: ToastOptions): string {\r\n return this.add(message, 'success', this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Display an error toast notification.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n error(message: string, options?: ToastOptions): string {\r\n return this.add(message, 'error', this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Display an info toast notification.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n info(message: string, options?: ToastOptions): string {\r\n return this.add(message, 'info', this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Display a warning toast notification.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n warning(message: string, options?: ToastOptions): string {\r\n return this.add(message, 'warning', this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Show a toast whose **message area** is a standalone Angular component while keeping normal toast chrome\r\n * (surface, icon column when applicable, close button, stack motion).\r\n *\r\n * Pass {@link CustomToastOptions.inputs} for `input()` / `@Input()` on that component.\r\n * The component also receives **`toastId`** (matches the returned id) for programmatic dismiss.\r\n *\r\n * @param component The component class (must be usable with `NgComponentOutlet`).\r\n * @param options Optional configuration object {@link CustomToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n custom(component: Type<unknown>, options?: CustomToastOptions): string {\r\n return this.addContentComponent(\r\n component,\r\n 'default',\r\n this.resolveDuration(options?.durationMs),\r\n options,\r\n );\r\n }\r\n\r\n /**\r\n * Show a toast whose body is a **standalone** Angular component on a headless host: no default border,\r\n * padding, shadow, or surface color — only stack position and enter/leave animations; the component supplies all visuals.\r\n *\r\n * Pass {@link HeadlessToastOptions.inputs} to feed `input()` on that component.\r\n * The component also automatically receives **`toastId`** (matches the returned id) for programmatic dismiss inside the component.\r\n *\r\n * @param component The component class (must be usable with `NgComponentOutlet`).\r\n * @param options Optional configuration object {@link HeadlessToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n headless(component: Type<unknown>, options?: HeadlessToastOptions): string {\r\n return this.addComponent(component, this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Display a loading toast notification.\r\n *\r\n * If `options.durationMs` is omitted, the toast stays until you dismiss or replace it (same as {@link TOAST_DURATION_MANUAL_DISMISS}).\r\n * Passing a finite positive `durationMs` schedules auto-dismiss for loading toasts like other variants.\r\n * The literal **`\"Infinity\"`** (or {@link TOAST_DURATION_MANUAL_DISMISS} / `0`) keeps the toast until dismissed.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n loading(message: string, options?: ToastOptions): string {\r\n const durationMs =\r\n options?.durationMs !== undefined\r\n ? parseToasterDurationMs(options.durationMs)\r\n : TOAST_DURATION_MANUAL_DISMISS;\r\n return this.add(message, 'loading', durationMs, options);\r\n }\r\n\r\n /**\r\n * Toast with message and a single **action** button. Default action button label is {@link DEFAULT_TOAST_ACTION_LABEL}.\r\n * Pass `action.label` and `action.onClick` in {@link ToastActionMethodOptions} to customize the action button.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastActionMethodOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n action(message: string, options: ToastActionMethodOptions): string {\r\n const { action: actionCfg, ...rest } = options;\r\n const toastAction: NonNullable<ToasterItem['toastAction']> = {\r\n role: 'action',\r\n label: actionCfg.label ?? DEFAULT_TOAST_ACTION_LABEL,\r\n onClick: actionCfg.onClick,\r\n };\r\n return this.add(\r\n message,\r\n 'default',\r\n this.resolveDuration(rest.durationMs),\r\n { ...rest, icon: null },\r\n toastAction,\r\n );\r\n }\r\n\r\n /**\r\n * Toast with message and a **cancel**-style button. Default cancel button label is {@link DEFAULT_TOAST_CANCEL_LABEL}.\r\n * Pass `cancel.label` and `cancel.onClick` in {@link ToastCancelMethodOptions} to customize the cancel button.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastCancelMethodOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n cancel(message: string, options: ToastCancelMethodOptions): string {\r\n const { cancel: cancelCfg, ...rest } = options;\r\n const toastAction: NonNullable<ToasterItem['toastAction']> = {\r\n role: 'cancel',\r\n label: cancelCfg.label ?? DEFAULT_TOAST_CANCEL_LABEL,\r\n onClick: cancelCfg.onClick,\r\n };\r\n return this.add(\r\n message,\r\n 'default',\r\n this.resolveDuration(rest.durationMs),\r\n { ...rest, icon: null },\r\n toastAction,\r\n );\r\n }\r\n\r\n /**\r\n * Shows one toast: loading until `userPromise` settles, then the same toast updates to success or error.\r\n * Returns the same promise (fulfillment/rejection preserved for callers).\r\n *\r\n * @param userPromise The promise to display.\r\n * @param labels The labels for the loading, success, and error states.\r\n * @returns The promise (fulfillment/rejection preserved for callers).\r\n */\r\n promise<T>(userPromise: PromiseLike<T>, labels: ToastPromiseLabels<T>): Promise<T> {\r\n const loadingId = this.loading(labels.loading);\r\n return Promise.resolve(userPromise).then(\r\n (value) => {\r\n const message =\r\n typeof labels.success === 'function' ? labels.success(value) : labels.success;\r\n this.updateToast(loadingId, message, 'success', this.resolveDuration(undefined));\r\n return value;\r\n },\r\n (reason: unknown) => {\r\n const message = typeof labels.error === 'function' ? labels.error(reason) : labels.error;\r\n this.updateToast(loadingId, message, 'error', this.resolveDuration(undefined));\r\n throw reason;\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Dismiss a toast notification.\r\n *\r\n * @param id The toast ID.\r\n */\r\n dismiss(id: string): void {\r\n this.removeToast(id, 'manual');\r\n }\r\n\r\n /**\r\n * Clear all toast notifications.\r\n */\r\n clear(): void {\r\n const snapshot = [...this._toasts()];\r\n for (const state of this.autoDismissByToastId.values()) {\r\n if (state.kind === 'scheduled') {\r\n globalThis.clearTimeout(state.timer);\r\n }\r\n }\r\n this.autoDismissByToastId.clear();\r\n this._toasts.set([]);\r\n for (const toast of snapshot) {\r\n toast.onDismiss?.();\r\n }\r\n }\r\n\r\n private add(\r\n message: string,\r\n variant: ToastVariant,\r\n durationMs: number,\r\n options?: ToastOptions,\r\n toastAction?: NonNullable<ToasterItem['toastAction']>,\r\n ): string {\r\n const id = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`;\r\n const icon = options?.icon;\r\n const style = options?.style;\r\n const classNames = options?.classNames;\r\n const onDismiss = options?.onDismiss;\r\n const onAutoClose = options?.onAutoClose;\r\n const description = options?.description;\r\n const item: ToasterItem = {\r\n id,\r\n message,\r\n variant,\r\n ...(icon !== undefined ? { icon } : {}),\r\n ...(style !== undefined ? { style } : {}),\r\n ...(classNames !== undefined ? { classNames } : {}),\r\n ...(description !== undefined ? { description } : {}),\r\n ...(onDismiss !== undefined ? { onDismiss } : {}),\r\n ...(onAutoClose !== undefined ? { onAutoClose } : {}),\r\n ...(toastAction !== undefined ? { toastAction } : {}),\r\n };\r\n this._toasts.update((list) => [...list, item]);\r\n this.scheduleAutoDismiss(id, durationMs);\r\n return id;\r\n }\r\n\r\n private addContentComponent(\r\n component: Type<unknown>,\r\n variant: ToastVariant,\r\n durationMs: number,\r\n options?: CustomToastOptions,\r\n ): string {\r\n const id = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`;\r\n const componentInputs: Record<string, unknown> = {\r\n ...(options?.inputs ?? {}),\r\n toastId: id,\r\n };\r\n const icon = options?.icon;\r\n const style = options?.style;\r\n const classNames = options?.classNames;\r\n const onDismiss = options?.onDismiss;\r\n const onAutoClose = options?.onAutoClose;\r\n const description = options?.description;\r\n\r\n const item: ToasterItem = {\r\n id,\r\n message: '',\r\n variant,\r\n contentComponent: component,\r\n contentComponentInputs: componentInputs,\r\n ...(icon !== undefined ? { icon } : {}),\r\n ...(style !== undefined ? { style } : {}),\r\n ...(classNames !== undefined ? { classNames } : {}),\r\n ...(description !== undefined ? { description } : {}),\r\n ...(onDismiss !== undefined ? { onDismiss } : {}),\r\n ...(onAutoClose !== undefined ? { onAutoClose } : {}),\r\n };\r\n\r\n this._toasts.update((list) => [...list, item]);\r\n this.scheduleAutoDismiss(id, durationMs);\r\n return id;\r\n }\r\n\r\n private addComponent(\r\n component: Type<unknown>,\r\n durationMs: number,\r\n options?: HeadlessToastOptions,\r\n ): string {\r\n const id = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`;\r\n\r\n const componentInputs: Record<string, unknown> = {\r\n ...(options?.inputs ?? {}),\r\n toastId: id,\r\n };\r\n\r\n const classNames = options?.classNames;\r\n const onDismiss = options?.onDismiss;\r\n const onAutoClose = options?.onAutoClose;\r\n\r\n const item: ToasterItem = {\r\n id,\r\n message: '',\r\n variant: 'default',\r\n component,\r\n componentInputs,\r\n ...(classNames !== undefined ? { classNames } : {}),\r\n ...(onDismiss !== undefined ? { onDismiss } : {}),\r\n ...(onAutoClose !== undefined ? { onAutoClose } : {}),\r\n };\r\n\r\n this._toasts.update((list) => [...list, item]);\r\n\r\n this.scheduleAutoDismiss(id, durationMs);\r\n\r\n return id;\r\n }\r\n\r\n private updateToast(\r\n id: string,\r\n message: string,\r\n variant: ToastVariant,\r\n durationMs: number,\r\n ): void {\r\n let found = false;\r\n this._toasts.update((toasts) =>\r\n toasts.map((toast) => {\r\n if (toast.id !== id) {\r\n return toast;\r\n }\r\n found = true;\r\n return { ...toast, message, variant };\r\n }),\r\n );\r\n if (found) {\r\n this.scheduleAutoDismiss(id, durationMs);\r\n }\r\n }\r\n\r\n private removeToast(id: string, cause: 'auto' | 'manual'): void {\r\n const toast = this._toasts().find((t) => t.id === id);\r\n if (!toast) {\r\n return;\r\n }\r\n this.cancelAutoDismiss(id);\r\n this._toasts.update((list) => list.filter((t) => t.id !== id));\r\n if (cause === 'auto') {\r\n toast.onAutoClose?.();\r\n } else {\r\n toast.onDismiss?.();\r\n }\r\n }\r\n}\r\n","import type { Type } from '@angular/core';\r\n\r\nexport const TOASTER_POSITIONS = [\r\n 'top-left',\r\n 'top-center',\r\n 'top-right',\r\n 'bottom-left',\r\n 'bottom-center',\r\n 'bottom-right',\r\n] as const;\r\n\r\nexport type ToasterPosition = (typeof TOASTER_POSITIONS)[number];\r\n\r\n/** Visual palette for the toast stack: follow the OS (`system`), or pin light / dark. */\r\nexport type ToasterTheme = 'light' | 'dark' | 'system';\r\n\r\n/**\r\n * Viewport inset from `<app-toaster [offset]>` or `<app-toaster [mobileOffset]>`.\r\n *\r\n * Used with **`[offset]`** for `--toast-offset-*` (wide layout / shared vars) and **`[mobileOffset]`** for `--toast-offset-mobile-*` (narrow layout in `toaster.css`).\r\n *\r\n * - A **string** sets all four sides to the same CSS value (e.g. `\"24px\"`, `\"1rem env(safe-area-inset-top)\"`).\r\n * - An **object** sets only the sides you pass; omitted sides keep the defaults from `toaster.css`.\r\n */\r\nexport type ToasterOffset =\r\n | string\r\n | {\r\n top?: string;\r\n right?: string;\r\n bottom?: string;\r\n left?: string;\r\n };\r\n\r\n/**\r\n * Milliseconds as a number, or the literal string **`\"Infinity\"`** (manual dismiss only). No other string values are supported.\r\n * Used by `<app-toaster [duration]>` and {@link ToastOptions.durationMs}.\r\n */\r\nexport type ToasterDuration = number | 'Infinity';\r\n\r\n/** Default `aria-label` for the toaster live region (`<section>`). */\r\nexport const DEFAULT_TOASTER_ARIA_NOTIFICATIONS_REGION = 'Notifications';\r\n\r\n/** Default `aria-label` for the per-toast dismiss (close) control. */\r\nexport const DEFAULT_TOASTER_ARIA_DISMISS_BUTTON = 'Dismiss';\r\n\r\n/**\r\n * Overrides for built-in English accessibility strings on `<better-toaster [accessibilityLabels]>`.\r\n * Omitted keys keep the library defaults.\r\n */\r\nexport interface ToasterAccessibilityLabels {\r\n /**\r\n * `aria-label` on the polite live region wrapper (`<section>`).\r\n * Default {@link DEFAULT_TOASTER_ARIA_NOTIFICATIONS_REGION}.\r\n */\r\n notificationsRegion?: string;\r\n /**\r\n * `aria-label` on the dismiss control when `<better-toaster [closeButton]>` is true.\r\n * Default {@link DEFAULT_TOASTER_ARIA_DISMISS_BUTTON}.\r\n */\r\n dismissButton?: string;\r\n}\r\n\r\nexport const TOAST_VARIANTS = [\r\n 'default',\r\n 'description',\r\n 'success',\r\n 'error',\r\n 'info',\r\n 'warning',\r\n 'loading',\r\n] as const;\r\n\r\nexport type ToastVariant = (typeof TOAST_VARIANTS)[number];\r\n\r\n/**\r\n * Per-variant icon overrides for `<app-toaster [icons]>`.\r\n *\r\n * Each value is either an **Angular standalone component** class (rendered with `NgComponentOutlet`),\r\n * or **`null`** to show no icon for that variant. Omitted keys keep the library defaults.\r\n *\r\n * The **`default`** variant has no built-in icon; set `default` here (or pass {@link ToastOptions.icon}\r\n * on a single toast) to show one. Omitting `default` keeps default toasts text-only.\r\n */\r\nexport type ToasterIcons = Partial<Record<ToastVariant, Type<unknown> | null>>;\r\n\r\n/**\r\n * Extra classes for host, message, and close control only.\r\n * Used by {@link ToastOptions.classNames} and {@link HeadlessToastOptions.classNames}.\r\n *\r\n * Row button defaults (`.action-btn` / `.cancel-btn`) can be set on {@link ToasterToastOptions.classNames} ({@link ToastChromeClassNames})\r\n * or overridden per call via {@link ToastActionChromeClassNames} / {@link ToastCancelChromeClassNames}.\r\n *\r\n * The library ships encapsulated styles (`toast-item.css`, etc.). Global rules for your class names often **lose to those defaults**, so properties you expect to change **usually need `!important`** (or stronger specificity) to actually apply.\r\n */\r\nexport type ToastBaseChromeClassNames = Partial<\r\n Record<'toast' | 'message' | 'description' | 'closeButton', string>\r\n>;\r\n\r\n/**\r\n * Merged shape after combining toaster defaults with a toast item (may include row-button keys when that toast has a row button).\r\n * The library still uses this internally on {@link ToasterItem} and for `[class]` resolution.\r\n */\r\nexport type ToastChromeClassNames = ToastBaseChromeClassNames & {\r\n actionButton?: string;\r\n cancelButton?: string;\r\n};\r\n\r\n/** `classNames` for {@link ToasterService.action} — includes `.action-btn` only among row buttons. */\r\nexport type ToastActionChromeClassNames = ToastBaseChromeClassNames & {\r\n actionButton?: string;\r\n};\r\n\r\n/** `classNames` for {@link ToasterService.cancel} — includes `.cancel-btn` only among row buttons. */\r\nexport type ToastCancelChromeClassNames = ToastBaseChromeClassNames & {\r\n cancelButton?: string;\r\n};\r\n\r\n/**\r\n * Defaults for every toast from `<app-toaster [toastOptions]>`.\r\n * Per-toast {@link ToastOptions} override these (e.g. `style` / `classNames` keys on a single toast win over the same keys here).\r\n */\r\nexport interface ToasterToastOptions {\r\n /**\r\n * Inline CSS on each toast host (`li.toast` / `AppToastItem`).\r\n * Merged with per-toast {@link ToastOptions.style}; toast-specific values override.\r\n */\r\n style?: Record<string, string | number | undefined>;\r\n\r\n /**\r\n * Extra CSS class strings merged onto toast chrome via Angular **`[class]`** bindings (from `<app-toaster [toastOptions]>`).\r\n *\r\n * - **`toast`** — list item host (`li.toast` / `AppToastItem`), alongside the built-in `toast` class.\r\n * - **`message`** — the title line (`.msg`) when the toast is not a headless body or {@link ToasterItem.contentComponent} body.\r\n * - **`description`** — the secondary line (`.description`) when {@link ToastOptions.description} is set or for the **`description`** variant.\r\n * - **`closeButton`** — the dismiss control (`.close-btn`) when `<app-toaster [closeButton]>` is enabled.\r\n * - **`actionButton`** / **`cancelButton`** — defaults for `.action-btn` / `.cancel-btn` when you use {@link ToasterService.action} / {@link ToasterService.cancel}; ignored on toasts without a row button.\r\n *\r\n * Per-toast {@link ToastOptions.classNames} cannot set row-button keys; override them on each {@link ToastActionMethodOptions} / {@link ToastCancelMethodOptions} call instead.\r\n *\r\n * Omitted keys add no extra classes for that part; values are typically space-separated class names (same as a static `class` attribute).\r\n *\r\n * **Overriding built-in look:** your CSS generally needs **`!important`** on the declarations that must win.\r\n */\r\n classNames?: ToastChromeClassNames;\r\n}\r\n\r\n/** Label + handler for {@link ToasterService.action} / {@link ToasterService.cancel}. */\r\nexport interface ToastMethodButtonConfig {\r\n /** Visible button text; defaults to `\"Action\"` or `\"Cancel\"` depending on the method. */\r\n label?: string;\r\n /**\r\n * Receives the row button click event. Call {@link Event.preventDefault} to keep the toast open\r\n * (the library skips {@link ToasterService.dismiss} when `defaultPrevented` is true).\r\n */\r\n onClick: (event: Event) => void;\r\n}\r\n\r\n/**\r\n * Options for {@link ToasterService.action} only. Use the `action` field (not available on {@link ToastOptions}).\r\n */\r\nexport type ToastActionMethodOptions = Omit<ToastOptions, 'icon' | 'classNames'> & {\r\n action: ToastMethodButtonConfig;\r\n classNames?: ToastActionChromeClassNames;\r\n};\r\n\r\n/**\r\n * Options for {@link ToasterService.cancel} only. Use the `cancel` field (not available on {@link ToastOptions}).\r\n */\r\nexport type ToastCancelMethodOptions = Omit<ToastOptions, 'icon' | 'classNames'> & {\r\n cancel: ToastMethodButtonConfig;\r\n classNames?: ToastCancelChromeClassNames;\r\n};\r\n\r\n/**\r\n * Options for {@link ToasterService.custom}.\r\n * {@link CustomToastOptions.inputs} is merged into the body component (same pattern as {@link HeadlessToastOptions.inputs});\r\n * **`toastId`** is always injected after your inputs. The component must declare a matching `input()` / `@Input()` for **`toastId`**\r\n * so `NgComponentOutlet` can bind it (same requirement as {@link ToasterService.headless}).\r\n */\r\nexport interface CustomToastOptions extends ToastOptions {\r\n inputs?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Options for the second argument of `show`, `success`, `error`, `info`, `warning`, `loading`,\r\n * and {@link ToasterService#description}.\r\n * {@link ToasterService.custom} uses {@link CustomToastOptions} instead.\r\n * Not used by `ToasterService.promise()` (that API uses {@link ToastPromiseLabels}).\r\n */\r\nexport interface ToastOptions {\r\n /**\r\n * Omit to use `<app-toaster [duration]>` (or the library default).\r\n * Use the literal **`\"Infinity\"`**, `Number.POSITIVE_INFINITY`, or `TOAST_DURATION_MANUAL_DISMISS` to persist until dismissed; `0` is still accepted for the same behavior.\r\n * `loading()` defaults to manual dismiss when `durationMs` is omitted.\r\n */\r\n durationMs?: ToasterDuration;\r\n /**\r\n * `undefined` = use global `[icons]` on `<app-toaster>` or built-in SVGs.\r\n * `null` = no icon for this toast.\r\n * Otherwise a standalone component class rendered like `[icons]` overrides.\r\n */\r\n icon?: Type<unknown> | null;\r\n /**\r\n * Inline CSS on the toast host (`li.toast` / `AppToastItem`).\r\n * Merged after `<app-toaster [toastOptions]>` `style` (if any); per-toast keys override the same keys from the toaster.\r\n */\r\n style?: Record<string, string | number | undefined>;\r\n /**\r\n * Secondary line below {@link ToasterItem.message} in a column layout. Works on every toast helper\r\n * (`show`, `success`, `error`, …). {@link ToasterService#description} uses the **`description`** variant\r\n * (neutral chrome like `default`); you can still pass this on other variants for the same layout with their icons/colors.\r\n */\r\n description?: string;\r\n /**\r\n * Extra **`[class]`** strings for this toast only — same keys and **`!important`** guidance as {@link ToasterToastOptions.classNames}.\r\n * Merged with `<app-toaster [toastOptions]>` `classNames` (if any); per-toast keys replace the same keys from the toaster.\r\n *\r\n * Row button keys (`actionButton` / `cancelButton`) are only valid on {@link ToastActionMethodOptions} / {@link ToastCancelMethodOptions}.\r\n */\r\n classNames?: ToastBaseChromeClassNames;\r\n /**\r\n * Called when the toast is removed for any reason other than auto-dismiss: close control, swipe,\r\n * {@link ToasterService.dismiss}, or {@link ToasterService.clear}.\r\n */\r\n onDismiss?: () => void;\r\n /**\r\n * Called when the toast is removed because its auto-dismiss timer finished (including after hover\r\n * pause when the remaining time elapses).\r\n */\r\n onAutoClose?: () => void;\r\n}\r\n\r\n/**\r\n * Options for {@link ToasterService.headless}.\r\n * The component must be **standalone** (or otherwise valid for `NgComponentOutlet`).\r\n * Headless toasts ignore `<app-toaster [closeButton]>`: no dismiss control is rendered.\r\n *\r\n * Per-toast **`icon`** and **`style`** are omitted: the inner component owns visuals; use\r\n * `<app-toaster [toastOptions]>` for shared host styling if needed. **`classNames`** still applies to the list-item host\r\n * (and to `.msg` / `.close-btn` when that chrome exists).\r\n *\r\n * The host always passes a **`toastId`** input (same value as the id returned from `headless()`)\r\n * so the component can call {@link ToasterService.dismiss} or read its own id. User `inputs` are\r\n * merged first; **`toastId` always wins** if also present in `inputs`.\r\n */\r\nexport interface HeadlessToastOptions extends Omit<ToastOptions, 'icon' | 'style'> {\r\n /**\r\n * Values passed to the component’s `input()` / `@Input()` bindings\r\n * (same shape as `NgComponentOutlet` `inputs`).\r\n */\r\n inputs?: Record<string, unknown>;\r\n}\r\n\r\nexport interface ToasterItem {\r\n readonly id: string;\r\n readonly message: string;\r\n /** Secondary line; see {@link ToastOptions.description}. */\r\n readonly description?: string;\r\n readonly variant: ToastVariant;\r\n /**\r\n * When set, the toast body is this standalone component rendered **inside** normal chrome (icon column when applicable, `.msg` host, close button),\r\n * via {@link ToasterService.custom}.\r\n */\r\n readonly contentComponent?: Type<unknown>;\r\n /** Bound to {@link ToasterItem.contentComponent} via `NgComponentOutlet` (includes auto **`toastId`**). */\r\n readonly contentComponentInputs?: Record<string, unknown>;\r\n /**\r\n * When set (without {@link ToasterItem.contentComponent}), the toast body is this standalone component only — same stack and motion as other toasts, without host chrome or a close button.\r\n */\r\n readonly component?: Type<unknown>;\r\n /** Bound to the headless component via `NgComponentOutlet`. */\r\n readonly componentInputs?: Record<string, unknown>;\r\n /** Per-toast override; see {@link ToastOptions.icon}. */\r\n readonly icon?: Type<unknown> | null;\r\n /** Per-toast host inline styles; see {@link ToastOptions.style}. */\r\n readonly style?: Record<string, string | number | undefined>;\r\n /** Per-toast extra classes; see {@link ToastOptions.classNames}. */\r\n readonly classNames?: ToastChromeClassNames;\r\n /** See {@link ToastOptions.onDismiss}. */\r\n readonly onDismiss?: () => void;\r\n /** See {@link ToastOptions.onAutoClose}. */\r\n readonly onAutoClose?: () => void;\r\n /**\r\n * Primary row action from {@link ToasterService.action} or {@link ToasterService.cancel}.\r\n * Renders a text button next to the message (no icon column).\r\n */\r\n readonly toastAction?: {\r\n readonly role: 'action' | 'cancel';\r\n readonly label: string;\r\n /** Same contract as {@link ToastMethodButtonConfig.onClick}. */\r\n readonly onClick: (event: Event) => void;\r\n };\r\n}\r\n\r\n/**\r\n * Labels for `ToasterService.promise` (loading vs settled states).\r\n * `success` / `error` may be static strings or functions that receive the settled value / rejection reason.\r\n */\r\nexport interface ToastPromiseLabels<T = unknown> {\r\n readonly loading: string;\r\n readonly success: string | ((data: T) => string);\r\n readonly error: string | ((reason: unknown) => string);\r\n}\r\n","import { NgComponentOutlet } from '@angular/common';\r\nimport {\r\n afterNextRender,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n DEFAULT_TOAST_DURATION_MS,\r\n parseToasterDurationMs,\r\n ToasterService,\r\n} from './toaster.service';\r\nimport {\r\n DEFAULT_TOASTER_ARIA_DISMISS_BUTTON,\r\n DEFAULT_TOASTER_ARIA_NOTIFICATIONS_REGION,\r\n type ToastChromeClassNames,\r\n type ToasterAccessibilityLabels,\r\n type ToasterDuration,\r\n type ToasterIcons,\r\n type ToasterItem,\r\n type ToasterOffset,\r\n type ToasterPosition,\r\n type ToasterTheme,\r\n type ToasterToastOptions,\r\n type ToastOptions,\r\n type ToastVariant,\r\n} from './toaster.types';\r\n\r\nconst GAP = 16;\r\n\r\nfunction swipeDirectionForPosition(position: ToasterPosition): 'down' | 'up' {\r\n return position.startsWith('bottom') ? 'down' : 'up';\r\n}\r\n\r\nfunction resolveToasterOffsetSide(\r\n offset: ToasterOffset | undefined,\r\n side: 'top' | 'right' | 'bottom' | 'left',\r\n): string | undefined {\r\n if (offset == null) {\r\n return undefined;\r\n }\r\n if (typeof offset === 'string') {\r\n return offset;\r\n }\r\n return offset[side];\r\n}\r\n\r\nfunction mergeToastHostStyles(\r\n base: Record<string, string | number | undefined> | undefined,\r\n override: Record<string, string | number | undefined> | undefined,\r\n): Record<string, string | number | undefined> | undefined {\r\n if (!base && !override) return undefined;\r\n if (!base) return override;\r\n if (!override) return base;\r\n return { ...base, ...override };\r\n}\r\n\r\nfunction mergeToastClassNames(\r\n base: ToastChromeClassNames | undefined,\r\n override: ToastChromeClassNames | undefined,\r\n): ToastChromeClassNames | undefined {\r\n if (!base && !override) return undefined;\r\n if (!base) return override;\r\n if (!override) return base;\r\n return { ...base, ...override };\r\n}\r\n\r\n@Component({\r\n selector: 'li[betterToastItem]',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [NgComponentOutlet],\r\n host: {\r\n role: 'listitem',\r\n tabindex: '0',\r\n class: 'toast',\r\n '[class]': 'resolvedClassNames()?.toast',\r\n '[attr.data-variant]': 'variant()',\r\n '[attr.data-icon]': 'shouldShowIconColumn() ? \"true\" : \"false\"',\r\n '[attr.data-headless]': 'isHeadless() ? \"true\" : null',\r\n '[attr.data-swipe-direction]': 'swipeDirection()',\r\n '[attr.data-theme]': 'theme()',\r\n '[style.--offset]': 'offset() + \"px\"',\r\n '[style]': 'isHeadless() ? undefined : hostStyle()',\r\n '[animate.leave]': '\"leave\"',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(pointermove)': 'onPointerMove($event)',\r\n '(pointerup)': 'onPointerUp()',\r\n '(pointercancel)': 'onPointerCancel()',\r\n '(pointerenter)': 'onPointerEnter()',\r\n '(pointerleave)': 'onPointerLeave()',\r\n },\r\n template: `\r\n @if (toast()?.component) {\r\n <ng-container *ngComponentOutlet=\"toast()!.component!; inputs: componentOutletInputs()\" />\r\n } @else {\r\n @if (shouldShowIconColumn()) {\r\n <span class=\"toast-icon\" aria-hidden=\"true\">\r\n @if (toast()?.icon) {\r\n <ng-container *ngComponentOutlet=\"toast()!.icon!\" />\r\n } @else if (iconComponent(); as IconCmp) {\r\n <ng-container *ngComponentOutlet=\"IconCmp\" />\r\n } @else {\r\n @switch (variant()) {\r\n @case ('success') {\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n >\r\n <circle\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"9\"\r\n stroke=\"currentColor\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"1.75\"\r\n />\r\n <path\r\n stroke=\"currentColor\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"1.75\"\r\n d=\"M8.48 12.22 10.9 14.64 15.74 9.14\"\r\n />\r\n </svg>\r\n }\r\n @case ('error') {\r\n <svg\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\r\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\r\n </svg>\r\n }\r\n @case ('info') {\r\n <svg\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.75\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\r\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\r\n </svg>\r\n }\r\n @case ('warning') {\r\n <svg\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n stroke=\"currentColor\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"1.75\"\r\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z\"\r\n />\r\n </svg>\r\n }\r\n @case ('loading') {\r\n <div class=\"toast-icon-loading\" aria-hidden=\"true\"></div>\r\n }\r\n @case ('description') {}\r\n @case ('default') {}\r\n }\r\n }\r\n </span>\r\n }\r\n\r\n @if (hasDescription()) {\r\n <div class=\"stack\">\r\n @if (toast()?.contentComponent) {\r\n <div class=\"msg\" [class]=\"resolvedClassNames()?.message\">\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n toast()!.contentComponent!;\r\n inputs: contentComponentOutletInputs()\r\n \"\r\n />\r\n </div>\r\n } @else {\r\n <p class=\"msg\" [class]=\"resolvedClassNames()?.message\">{{ toast()?.message }}</p>\r\n }\r\n @if (toast()?.description) {\r\n <p class=\"description\" [class]=\"resolvedClassNames()?.description\">\r\n {{ toast()!.description }}\r\n </p>\r\n }\r\n </div>\r\n } @else {\r\n @if (toast()?.contentComponent) {\r\n <div class=\"msg\" [class]=\"resolvedClassNames()?.message\">\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n toast()!.contentComponent!;\r\n inputs: contentComponentOutletInputs()\r\n \"\r\n />\r\n </div>\r\n } @else {\r\n <p class=\"msg\" [class]=\"resolvedClassNames()?.message\">{{ toast()?.message }}</p>\r\n }\r\n }\r\n\r\n @if (toast()?.toastAction; as rowAction) {\r\n @switch (rowAction.role) {\r\n @case ('action') {\r\n <button\r\n type=\"button\"\r\n class=\"toast-row-btn action-btn\"\r\n [class]=\"resolvedClassNames()?.actionButton\"\r\n [attr.data-row-btn]=\"rowAction.role\"\r\n (pointerdown)=\"onRowButtonPointerDown($event)\"\r\n (click)=\"onToastRowClick($event)\"\r\n >\r\n {{ rowAction.label }}\r\n </button>\r\n }\r\n @case ('cancel') {\r\n <button\r\n type=\"button\"\r\n class=\"toast-row-btn cancel-btn\"\r\n [class]=\"resolvedClassNames()?.cancelButton\"\r\n [attr.data-row-btn]=\"rowAction.role\"\r\n (pointerdown)=\"onRowButtonPointerDown($event)\"\r\n (click)=\"onToastRowClick($event)\"\r\n >\r\n {{ rowAction.label }}\r\n </button>\r\n }\r\n }\r\n }\r\n }\r\n\r\n @if (closeButton() && !isHeadless()) {\r\n <button\r\n type=\"button\"\r\n class=\"close-btn\"\r\n [class]=\"resolvedClassNames()?.closeButton\"\r\n (click)=\"toaster.dismiss(toast()?.id ?? '')\"\r\n [attr.aria-label]=\"dismissButtonAriaLabel()\"\r\n >\r\n <svg aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n stroke=\"currentColor\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"1.75\"\r\n d=\"M6 18 18 6M6 6l12 12\"\r\n />\r\n </svg>\r\n </button>\r\n }\r\n `,\r\n styleUrl: './toast-item.css',\r\n})\r\nexport class BetterToastItem {\r\n /** Shared toaster service (e.g. dismiss from the close button). */\r\n protected readonly toaster = inject(ToasterService);\r\n\r\n /** Host element ref used to read `offsetHeight` after the first render. */\r\n protected readonly host = inject(ElementRef);\r\n\r\n /** Toast payload (message, id, variant from the service). */\r\n toast = input<ToasterItem>();\r\n /**\r\n * Styles from `<app-toaster [toastOptions]>`; merged with {@link ToasterItem.style} so per-toast keys win.\r\n */\r\n toasterStyle = input<Record<string, string | number | undefined> | undefined>();\r\n /**\r\n * Classes from `<app-toaster [toastOptions]>` — same shape as {@link ToasterToastOptions.classNames}.\r\n * Merged with {@link ToasterItem.classNames}; per-toast keys replace the same keys from the toaster.\r\n * Styles for those classes usually need **`!important`** to override the library’s encapsulated CSS; see {@link ToastChromeClassNames}.\r\n */\r\n toasterClassNames = input<ToastChromeClassNames | undefined>();\r\n /** Which icon and color treatment to show for this row. */\r\n variant = input<ToastVariant>('default');\r\n /** Vertical stack offset in px; bound to `--offset` on the host for layout. */\r\n offset = input.required<number>();\r\n /** When false, the dismiss control is not rendered (toasts may still auto-dismiss or be cleared via the service). */\r\n closeButton = input(true);\r\n /**\r\n * Per-variant icon overrides from `<app-toaster [icons]>`.\r\n * Each override must be a standalone component whose template includes the SVG artwork.\r\n */\r\n customIcons = input<ToasterIcons | undefined>();\r\n /**\r\n * `aria-label` for the dismiss control; set from `<better-toaster [accessibilityLabels]>`.\r\n * Default {@link DEFAULT_TOASTER_ARIA_DISMISS_BUTTON}.\r\n */\r\n dismissButtonAriaLabel = input<string>(DEFAULT_TOASTER_ARIA_DISMISS_BUTTON);\r\n /** Stack anchor from `<better-toaster [position]>` — drives swipe axis and `data-swipe-direction`. */\r\n stackPosition = input<ToasterPosition>('bottom-right');\r\n /**\r\n * Color palette from `<better-toaster [theme]>`; mirrored on the host as `data-theme`\r\n * so item-scoped CSS can react to the chosen mode without `:host-context()`.\r\n */\r\n theme = input<ToasterTheme>('system');\r\n /** Emits the measured host height in px once after the first render so the parent can stack siblings. */\r\n heightChange = output<number>();\r\n\r\n /**\r\n * Stacked title + optional secondary line: {@link ToastVariant} **`description`**, or any variant with\r\n * non-empty {@link ToasterItem.description} ({@link ToastOptions.description} on `show` / `success` / etc.).\r\n */\r\n protected readonly hasDescription = computed(() => {\r\n const toast = this.toast();\r\n if (!toast) return false;\r\n if (toast.variant === 'description') return true;\r\n return !!toast.description?.trim();\r\n });\r\n /** Merged inline styles for the toast (`[toastOptions].style` then per-toast `style`). */\r\n protected readonly hostStyle = computed(() =>\r\n mergeToastHostStyles(this.toasterStyle(), this.toast()?.style),\r\n );\r\n /** Merged `[class]` strings (`[toastOptions].classNames` then per-toast `classNames`). */\r\n protected readonly resolvedClassNames = computed(() =>\r\n mergeToastClassNames(this.toasterClassNames(), this.toast()?.classNames),\r\n );\r\n /** Resolved standalone SVG icon component from `[icons]`, if any (not `null`). */\r\n protected readonly iconComponent = computed(() => {\r\n const customIcon = this.customIcons()?.[this.variant()];\r\n if (customIcon === null) {\r\n return undefined;\r\n }\r\n return customIcon;\r\n });\r\n /**\r\n * Renders the icon column unless the toast or `[icons]` opts out with `icon: null` / a `null` entry for that variant.\r\n * The `default` variant has no built-in icon: the column appears only with a per-toast `icon` or `[icons].default`.\r\n */\r\n protected readonly shouldShowIconColumn = computed(() => {\r\n const toast = this.toast();\r\n\r\n if (!toast) return false;\r\n if (toast.icon === null) return false;\r\n\r\n const toastVariant = toast.variant;\r\n if (toastVariant === 'default' || toastVariant === 'description') {\r\n if (toast.icon != null) {\r\n return true;\r\n }\r\n const neutralIcon =\r\n toastVariant === 'default'\r\n ? this.customIcons()?.default\r\n : (this.customIcons()?.description ?? this.customIcons()?.default);\r\n if (neutralIcon === null) {\r\n return false;\r\n }\r\n return neutralIcon !== undefined;\r\n }\r\n\r\n if (toast.icon != null) {\r\n return true;\r\n }\r\n\r\n if (this.customIcons()?.[toastVariant] === null) {\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n /** Bound to {@link ToasterItem.componentInputs} for headless (`NgComponentOutlet`) toasts. */\r\n protected readonly componentOutletInputs = computed(\r\n (): Record<string, unknown> => this.toast()?.componentInputs ?? {},\r\n );\r\n /** Bound to {@link ToasterItem.contentComponentInputs} for {@link ToasterService.custom} body components. */\r\n protected readonly contentComponentOutletInputs = computed(\r\n (): Record<string, unknown> => this.toast()?.contentComponentInputs ?? {},\r\n );\r\n /** When true, host uses no default toast chrome (border, padding, surface) — only stack + motion. */\r\n protected readonly isHeadless = computed(() => this.toast()?.component != null);\r\n /** `down` when anchored to the bottom (dismiss by swiping down), `up` when anchored to the top. */\r\n protected readonly swipeDirection = computed(() =>\r\n swipeDirectionForPosition(this.stackPosition()),\r\n );\r\n\r\n /**\r\n * Emits the measured host height in px once after the first render so the parent can stack siblings.\r\n */\r\n constructor() {\r\n afterNextRender(() => {\r\n const height = this.host.nativeElement.offsetHeight;\r\n this.heightChange.emit(height);\r\n });\r\n }\r\n\r\n /** True once the user has passed the drag threshold and is actively swiping. */\r\n isDragging = signal(false);\r\n private tracking = false;\r\n private startY = 0;\r\n private pointerId = -1;\r\n private readonly dragStartThreshold = 0;\r\n private readonly swipeCloseThreshold = 30;\r\n\r\n /** Transform applied when swipe-dismiss completes (matches leave direction / headless centering). */\r\n protected readonly swipeDismissTransform = computed(() => {\r\n const pos = this.stackPosition();\r\n const down = this.swipeDirection() === 'down';\r\n const y = down ? '130%' : '-130%';\r\n if (this.isHeadless() && (pos === 'bottom-center' || pos === 'top-center')) {\r\n return `translateX(-50%) translateY(${y})`;\r\n }\r\n return `translateY(${y})`;\r\n });\r\n\r\n /** Prevents swipe-to-dismiss from starting when pressing the row action / cancel control. */\r\n onRowButtonPointerDown(event: PointerEvent): void {\r\n event.stopPropagation();\r\n }\r\n /**\r\n * Dismisses the toast when the row action / cancel control is clicked.\r\n * @param event - The event object.\r\n */\r\n onToastRowClick(event: Event): void {\r\n const toast = this.toast();\r\n toast?.toastAction?.onClick(event);\r\n if (event.defaultPrevented) return;\r\n this.toaster.dismiss(toast?.id ?? '');\r\n }\r\n\r\n /**\r\n * Pauses auto-dismiss when the pointer enters the toast.\r\n */\r\n onPointerEnter() {\r\n const id = this.toast()?.id;\r\n if (id) {\r\n this.toaster.pauseAutoDismiss(id);\r\n }\r\n }\r\n /**\r\n * Resumes auto-dismiss when the pointer leaves the toast.\r\n */\r\n onPointerLeave() {\r\n const id = this.toast()?.id;\r\n if (id) {\r\n this.toaster.resumeAutoDismiss(id);\r\n }\r\n }\r\n /**\r\n * Starts tracking the pointer down event.\r\n * @param event - The pointer down event object.\r\n */\r\n onPointerDown(event: PointerEvent) {\r\n if (this.variant() === 'loading') {\r\n return;\r\n }\r\n this.tracking = true;\r\n this.startY = event.clientY;\r\n this.pointerId = event.pointerId;\r\n }\r\n /**\r\n * Updates the toast position when the pointer moves.\r\n * @param event - The pointer move event object.\r\n */\r\n onPointerMove(event: PointerEvent) {\r\n if (!this.tracking && !this.isDragging()) return;\r\n\r\n const el = this.host.nativeElement;\r\n const rawDy = event.clientY - this.startY;\r\n const down = this.swipeDirection() === 'down';\r\n const dragDy = down ? Math.max(0, rawDy) : Math.min(0, rawDy);\r\n\r\n if (!this.isDragging()) {\r\n const passed =\r\n this.dragStartThreshold > 0\r\n ? down\r\n ? rawDy >= this.dragStartThreshold\r\n : rawDy <= -this.dragStartThreshold\r\n : down\r\n ? rawDy > 0\r\n : rawDy < 0;\r\n if (passed) {\r\n this.isDragging.set(true);\r\n el.setPointerCapture(this.pointerId);\r\n }\r\n return;\r\n }\r\n\r\n el.style.translate = `0 ${dragDy}px`;\r\n }\r\n /**\r\n * Ends tracking the pointer up event and dismisses the toast if the pointer has moved beyond the swipe threshold.\r\n */\r\n onPointerUp() {\r\n this.tracking = false;\r\n\r\n if (!this.isDragging()) return;\r\n this.isDragging.set(false);\r\n\r\n const el = this.host.nativeElement;\r\n const id = this.toast()?.id ?? '';\r\n\r\n const dy = parseFloat(el.style.translate?.split(' ')[1]) || 0;\r\n\r\n try {\r\n el.releasePointerCapture(this.pointerId);\r\n } catch {\r\n /* pointer already released */\r\n }\r\n\r\n const down = this.swipeDirection() === 'down';\r\n const shouldDismiss = down ? dy >= this.swipeCloseThreshold : dy <= -this.swipeCloseThreshold;\r\n\r\n if (shouldDismiss) {\r\n el.style.transform = this.swipeDismissTransform();\r\n this.toaster.dismiss(id);\r\n } else {\r\n el.style.transition = 'translate 400ms ease';\r\n el.style.translate = '0 0';\r\n const cleanup = () => {\r\n el.style.transition = '';\r\n el.style.translate = '';\r\n };\r\n el.addEventListener('transitionend', cleanup, { once: true });\r\n setTimeout(cleanup, 450);\r\n }\r\n }\r\n /**\r\n * Ends tracking the pointer cancel event and resets the toast position.\r\n */\r\n onPointerCancel() {\r\n this.tracking = false;\r\n\r\n if (!this.isDragging()) return;\r\n this.isDragging.set(false);\r\n\r\n const el = this.host.nativeElement;\r\n el.style.translate = '';\r\n\r\n try {\r\n el.releasePointerCapture(this.pointerId);\r\n } catch {\r\n /* pointer already released */\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Renders the toaster stack. Add once near the root of your app (e.g. in `App`).\r\n * Variant-colored surfaces are off by default; set `[richColors]=\"true\"` to enable them.\r\n * Set `[duration]` for auto-dismiss when service helpers omit their duration argument.\r\n * Use **`duration=\"Infinity\"`** (that exact literal) or `[duration]=\"…\"` with a number / {@link TOAST_DURATION_MANUAL_DISMISS} for persist until dismissed; `0` still works.\r\n * Pass `[icons]` with optional **standalone** components for `default` / `description` / `success` / `error` / `info` / `warning` / `loading`:\r\n * replace the default artwork (or add an icon for the neutral `default` variant), or use **`null`** to hide that variant’s icon.\r\n * Each component should render an **SVG** (import its class where you configure `[icons]`).\r\n * Set `[closeButton]=\"false\"` to hide the per-toast dismiss button.\r\n * Set `[accessibilityLabels]` to override default English `aria-label` strings (live region and dismiss control).\r\n * Set `[offset]` for `--toast-offset-*` and `[mobileOffset]` for `--toast-offset-mobile-*` (string all sides, or per-side object).\r\n * Set `[theme]` to `light`, `dark`, or `system` (default): semantic colors follow the chosen mode; `system` uses `prefers-color-scheme`.\r\n * {@link ToasterService.action} / {@link ToasterService.cancel} render a message plus one text button (no icon column).\r\n */\r\n@Component({\r\n selector: 'better-toaster',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [BetterToastItem],\r\n template: `\r\n <section\r\n [attr.aria-label]=\"notificationsRegionAriaLabel()\"\r\n tabindex=\"-1\"\r\n aria-live=\"polite\"\r\n aria-relevant=\"additions text\"\r\n aria-atomic=\"false\"\r\n >\r\n <ol\r\n class=\"toast-container\"\r\n [style.--toast-offset-top]=\"offsetTop()\"\r\n [style.--toast-offset-right]=\"offsetRight()\"\r\n [style.--toast-offset-bottom]=\"offsetBottom()\"\r\n [style.--toast-offset-left]=\"offsetLeft()\"\r\n [style.--toast-offset-mobile-top]=\"mobileOffsetTop()\"\r\n [style.--toast-offset-mobile-right]=\"mobileOffsetRight()\"\r\n [style.--toast-offset-mobile-bottom]=\"mobileOffsetBottom()\"\r\n [style.--toast-offset-mobile-left]=\"mobileOffsetLeft()\"\r\n [attr.data-position]=\"position()\"\r\n [attr.data-rich-colors]=\"richColors()\"\r\n [attr.data-theme]=\"theme()\"\r\n tabindex=\"-1\"\r\n >\r\n @for (toast of toaster.toasts(); track toast.id) {\r\n <li\r\n betterToastItem\r\n [toast]=\"toast\"\r\n [toasterStyle]=\"toastOptions()?.style\"\r\n [toasterClassNames]=\"toastOptions()?.classNames\"\r\n [variant]=\"toast.variant\"\r\n [customIcons]=\"icons()\"\r\n [offset]=\"offsets()[toast.id]\"\r\n [closeButton]=\"closeButton()\"\r\n [dismissButtonAriaLabel]=\"dismissButtonAriaLabel()\"\r\n [stackPosition]=\"position()\"\r\n [theme]=\"theme()\"\r\n (heightChange)=\"onHeightChange(toast.id, $event)\"\r\n [attr.data-position]=\"position()\"\r\n [attr.data-rich-colors]=\"richColors()\"\r\n ></li>\r\n }\r\n </ol>\r\n </section>\r\n `,\r\n styleUrl: './toaster.css',\r\n})\r\nexport class BetterToaster implements OnInit {\r\n protected readonly toaster = inject(ToasterService);\r\n\r\n /**\r\n * Default auto-dismiss time in ms for `show` / `success` / `error` / `info` / `warning` when the second argument omits `durationMs`.\r\n * Bind **`duration=\"Infinity\"`** (literal only) or a numeric ms value via `[duration]`; {@link TOAST_DURATION_MANUAL_DISMISS} is accepted as a number.\r\n * `0` still works. Does not apply to `loading()`. Defaults to the library default (4000ms).\r\n */\r\n readonly durationMs = input<number, ToasterDuration>(DEFAULT_TOAST_DURATION_MS, {\r\n alias: 'duration',\r\n transform: (value) => {\r\n const durationMs = parseToasterDurationMs(value);\r\n this.toaster.setDefaultDurationMs(durationMs);\r\n return durationMs;\r\n },\r\n });\r\n /** Where the stack is anchored on the viewport. */\r\n readonly position = input<ToasterPosition>('bottom-right');\r\n /**\r\n * Viewport inset for the toast stack: a single CSS value for all sides, or an object with any of `top` / `right` / `bottom` / `left`.\r\n * Binds `--toast-offset-top` / `right` / `bottom` / `left` on `.toast-container`.\r\n */\r\n readonly offset = input<ToasterOffset | undefined>(undefined);\r\n /**\r\n * Viewport inset for narrow layouts: binds `--toast-offset-mobile-top` / `right` / `bottom` / `left` on `.toast-container`.\r\n * Same shape as {@link offset}.\r\n */\r\n readonly mobileOffset = input<ToasterOffset | undefined>(undefined);\r\n /**\r\n * When true, success/error/info/warning use semantic background and border colors.\r\n */\r\n readonly richColors = input(false);\r\n /**\r\n * Color palette for the stack. `system` (default) follows `prefers-color-scheme`; `light` / `dark` pin the palette regardless of OS.\r\n * Reflected as `data-theme` on the toast container (`<ol class=\"toast-container\">`).\r\n */\r\n readonly theme = input<ToasterTheme>('system');\r\n /**\r\n * Optional per-variant **standalone** components that replace the default SVG (or loading indicator).\r\n * Import each icon component in the host and pass its class here; each one should render an SVG\r\n * (e.g. root `<svg>` with `stroke=\"currentColor\"` / `fill=\"currentColor\"` where appropriate).\r\n * Omitted keys keep the built-in icons (the `default` variant has none unless you set `default` here).\r\n * **`null`** for a variant hides that variant’s icon.\r\n */\r\n readonly icons = input<ToasterIcons | undefined>();\r\n /**\r\n * Defaults for every toast — shape is {@link ToasterToastOptions}.\r\n *\r\n * - **`style`** — merged onto each toast host with per-toast {@link ToastOptions.style}; identical keys from the service call win.\r\n * - **`classNames`** — extra classes on host / `.msg` / `.description` / `.close-btn` / row buttons via **`[class]`**; see {@link ToasterToastOptions.classNames} (**`!important`** is usually required for overrides). Per-toast {@link ToastOptions.classNames} replaces host/message/close keys; row overrides come from {@link ToasterService.action} / {@link ToasterService.cancel}.\r\n */\r\n readonly toastOptions = input<ToasterToastOptions | undefined>();\r\n /** When true, each toast shows a dismiss button. */\r\n readonly closeButton = input(true);\r\n /**\r\n * Overrides for built-in English `aria-label` values (live region and per-toast dismiss).\r\n * Omitted keys keep {@link DEFAULT_TOASTER_ARIA_NOTIFICATIONS_REGION} and {@link DEFAULT_TOASTER_ARIA_DISMISS_BUTTON}.\r\n */\r\n readonly accessibilityLabels = input<ToasterAccessibilityLabels | undefined>();\r\n\r\n /** Measured height in px per toast id, updated when a toast item reports `heightChange`. */\r\n readonly heights = signal<Record<string, number>>({} as Record<string, number>);\r\n\r\n /** Resolved `aria-label` for the outer `<section>` live region. */\r\n protected readonly notificationsRegionAriaLabel = computed(\r\n () =>\r\n this.accessibilityLabels()?.notificationsRegion ?? DEFAULT_TOASTER_ARIA_NOTIFICATIONS_REGION,\r\n );\r\n /** Resolved `aria-label` for each toast’s dismiss control. */\r\n protected readonly dismissButtonAriaLabel = computed(\r\n () => this.accessibilityLabels()?.dismissButton ?? DEFAULT_TOASTER_ARIA_DISMISS_BUTTON,\r\n );\r\n\r\n /** Vertical offset in px for the toast stack. */\r\n protected readonly offsetTop = computed(() => resolveToasterOffsetSide(this.offset(), 'top'));\r\n /** Horizontal offset in px for the toast stack. */\r\n protected readonly offsetRight = computed(() => resolveToasterOffsetSide(this.offset(), 'right'));\r\n /** Vertical offset in px for the toast stack. */\r\n protected readonly offsetBottom = computed(() =>\r\n resolveToasterOffsetSide(this.offset(), 'bottom'),\r\n );\r\n /** Horizontal offset in px for the toast stack. */\r\n protected readonly offsetLeft = computed(() => resolveToasterOffsetSide(this.offset(), 'left'));\r\n\r\n /** Vertical offset in px for the toast stack on narrow layouts. */\r\n protected readonly mobileOffsetTop = computed(() =>\r\n resolveToasterOffsetSide(this.mobileOffset(), 'top'),\r\n );\r\n /** Horizontal offset in px for the toast stack on narrow layouts. */\r\n protected readonly mobileOffsetRight = computed(() =>\r\n resolveToasterOffsetSide(this.mobileOffset(), 'right'),\r\n );\r\n /** Vertical offset in px for the toast stack on narrow layouts. */\r\n protected readonly mobileOffsetBottom = computed(() =>\r\n resolveToasterOffsetSide(this.mobileOffset(), 'bottom'),\r\n );\r\n /** Horizontal offset in px for the toast stack on narrow layouts. */\r\n protected readonly mobileOffsetLeft = computed(() =>\r\n resolveToasterOffsetSide(this.mobileOffset(), 'left'),\r\n );\r\n\r\n /**\r\n * Vertical offset in px for each toast id so stacked toasts do not overlap.\r\n * Walks newest-to-oldest (end of the list first): the latest toast has offset 0; each older toast sits above by the sum of heights below plus the inter-toast gap.\r\n */\r\n readonly offsets = computed(() => {\r\n const toastsList = this.toaster.toasts();\r\n const heights = this.heights();\r\n const result: Record<string, number> = {};\r\n let cumulative = 0;\r\n\r\n for (let i = toastsList.length - 1; i >= 0; i--) {\r\n const toast = toastsList[i];\r\n result[toast.id] = cumulative;\r\n cumulative += (heights[toast.id] ?? 0) + GAP;\r\n }\r\n\r\n return result;\r\n });\r\n\r\n /** Merges a toast item’s reported height into `heights` so `offsets` can recompute. */\r\n onHeightChange(toastId: string, height: number) {\r\n this.heights.update((h) => ({ ...h, [toastId]: height }));\r\n }\r\n\r\n /**\r\n * Initializes the toaster service with the default duration.\r\n */\r\n ngOnInit(): void {\r\n this.toaster.setDefaultDurationMs(this.durationMs());\r\n }\r\n}\r\n","/*\r\n * Public API Surface of better-toast\r\n */\r\n\r\nexport { BetterToaster } from './lib/toaster';\r\nexport {\r\n DEFAULT_TOASTER_ARIA_DISMISS_BUTTON,\r\n DEFAULT_TOASTER_ARIA_NOTIFICATIONS_REGION,\r\n TOAST_VARIANTS,\r\n TOASTER_POSITIONS,\r\n} from './lib/toaster.types';\r\nexport {\r\n DEFAULT_TOAST_ACTION_LABEL,\r\n DEFAULT_TOAST_CANCEL_LABEL,\r\n DEFAULT_TOAST_DURATION_MS,\r\n TOAST_DURATION_MANUAL_DISMISS,\r\n ToasterService,\r\n} from './lib/toaster.service';\r\nexport type {\r\n CustomToastOptions,\r\n HeadlessToastOptions,\r\n ToastActionChromeClassNames,\r\n ToastActionMethodOptions,\r\n ToastBaseChromeClassNames,\r\n ToastCancelChromeClassNames,\r\n ToastCancelMethodOptions,\r\n ToastChromeClassNames,\r\n ToastMethodButtonConfig,\r\n ToastPromiseLabels,\r\n ToastOptions,\r\n ToasterAccessibilityLabels,\r\n ToasterDuration,\r\n ToasterIcons,\r\n ToasterOffset,\r\n ToasterTheme,\r\n ToasterToastOptions,\r\n ToastVariant,\r\n ToasterItem,\r\n ToasterPosition,\r\n} from './lib/toaster.types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"better-toast.mjs","sources":["../../../projects/better-toast/src/lib/toaster.service.ts","../../../projects/better-toast/src/lib/toaster.types.ts","../../../projects/better-toast/src/lib/toaster.ts","../../../projects/better-toast/src/public-api.ts","../../../projects/better-toast/src/better-toast.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\r\n\r\nimport type { Type } from '@angular/core';\r\n\r\nimport type {\r\n CustomToastOptions,\r\n HeadlessToastOptions,\r\n ToastActionMethodOptions,\r\n ToastCancelMethodOptions,\r\n ToastPromiseLabels,\r\n ToastOptions,\r\n ToastVariant,\r\n ToasterDuration,\r\n ToasterItem,\r\n} from './toaster.types';\r\n\r\n/** Fallback when `<app-toaster [duration]>` is absent and a helper omits `durationMs`. */\r\nexport const DEFAULT_TOAST_DURATION_MS = 4000;\r\n\r\n/** Default label for {@link ToasterService.action} when {@link ToastMethodButtonConfig.label} is omitted. */\r\nexport const DEFAULT_TOAST_ACTION_LABEL = 'Action';\r\n\r\n/** Default label for {@link ToasterService.cancel} when {@link ToastMethodButtonConfig.label} is omitted. */\r\nexport const DEFAULT_TOAST_CANCEL_LABEL = 'Cancel';\r\n\r\n/**\r\n * Use with `[duration]` or `options.durationMs` so a toast stays until manually dismissed.\r\n * (`0` is still treated as non-auto-dismiss for backward compatibility.)\r\n */\r\nexport const TOAST_DURATION_MANUAL_DISMISS = Number.POSITIVE_INFINITY;\r\n\r\n/** Coerces {@link ToasterDuration} to ms (only the literal string `\"Infinity\"` for manual dismiss). */\r\nexport function parseToasterDurationMs(value: ToasterDuration): number {\r\n if (value === 'Infinity') {\r\n return TOAST_DURATION_MANUAL_DISMISS;\r\n }\r\n if (Number.isNaN(value)) {\r\n return DEFAULT_TOAST_DURATION_MS;\r\n }\r\n return value;\r\n}\r\n\r\nfunction shouldScheduleAutoDismiss(durationMs: number): boolean {\r\n return Number.isFinite(durationMs) && durationMs > 0;\r\n}\r\n\r\ntype AutoDismissState =\r\n | { kind: 'scheduled'; timer: ReturnType<typeof globalThis.setTimeout>; deadline: number }\r\n | { kind: 'paused'; remainingMs: number };\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ToasterService {\r\n private readonly _toasts = signal<readonly ToasterItem[]>([]);\r\n\r\n private readonly autoDismissByToastId = new Map<string, AutoDismissState>();\r\n\r\n /** Updated by `<better-toaster [duration]>`; initial value is {@link DEFAULT_TOAST_DURATION_MS}. */\r\n private defaultDurationMs = DEFAULT_TOAST_DURATION_MS;\r\n\r\n /** Active messages, oldest first. */\r\n readonly toasts = this._toasts.asReadonly();\r\n\r\n /**\r\n * Synced from `<better-toaster [duration]>`; used when a service call omits `durationMs`.\r\n * Does not change timers on toasts already shown.\r\n */\r\n setDefaultDurationMs(ms: number): void {\r\n const normalizedMs = Number.isNaN(ms) ? DEFAULT_TOAST_DURATION_MS : Math.max(0, ms);\r\n this.defaultDurationMs = normalizedMs;\r\n }\r\n\r\n private resolveDuration(durationMs: ToasterDuration | undefined): number {\r\n if (durationMs !== undefined) {\r\n return parseToasterDurationMs(durationMs);\r\n }\r\n return this.defaultDurationMs;\r\n }\r\n\r\n /**\r\n * Stops any auto-dismiss for this toast: clears a running timeout if present and drops timer state.\r\n */\r\n private cancelAutoDismiss(id: string): void {\r\n const state = this.autoDismissByToastId.get(id);\r\n if (!state) {\r\n return;\r\n }\r\n if (state.kind === 'scheduled') {\r\n globalThis.clearTimeout(state.timer);\r\n }\r\n this.autoDismissByToastId.delete(id);\r\n }\r\n\r\n /**\r\n * (Re)starts auto-dismiss from a concrete duration in milliseconds.\r\n * Idempotent per toast: always cancels any existing timer first.\r\n * Manual dismiss (`Infinity`) and non-positive values do not schedule a timer.\r\n */\r\n private scheduleAutoDismiss(id: string, durationMs: number): void {\r\n this.cancelAutoDismiss(id);\r\n if (!shouldScheduleAutoDismiss(durationMs)) {\r\n return;\r\n }\r\n const deadline = Date.now() + durationMs;\r\n const timer = globalThis.setTimeout(() => {\r\n this.removeToast(id, 'auto');\r\n }, durationMs);\r\n this.autoDismissByToastId.set(id, { kind: 'scheduled', timer, deadline });\r\n }\r\n\r\n /**\r\n * Pauses the auto-dismiss timer while the pointer is over the toast (e.g. hover).\r\n * No-op if the toast has no active auto-dismiss.\r\n *\r\n * @param id The toast ID.\r\n */\r\n pauseAutoDismiss(id: string): void {\r\n const state = this.autoDismissByToastId.get(id);\r\n if (!state || state.kind !== 'scheduled') {\r\n return;\r\n }\r\n globalThis.clearTimeout(state.timer);\r\n const remainingMs = Math.max(0, state.deadline - Date.now());\r\n this.autoDismissByToastId.set(id, { kind: 'paused', remainingMs });\r\n }\r\n\r\n /**\r\n * Resumes a paused auto-dismiss with the remaining time from {@link pauseAutoDismiss}.\r\n *\r\n * @param id The toast ID.\r\n */\r\n resumeAutoDismiss(id: string): void {\r\n const state = this.autoDismissByToastId.get(id);\r\n if (!state || state.kind !== 'paused') {\r\n return;\r\n }\r\n const { remainingMs } = state;\r\n this.autoDismissByToastId.delete(id);\r\n if (remainingMs <= 0) {\r\n this.removeToast(id, 'auto');\r\n return;\r\n }\r\n this.scheduleAutoDismiss(id, remainingMs);\r\n }\r\n\r\n /**\r\n * Display a neutral (default) toast notification.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n show(message: string, options?: ToastOptions): string {\r\n return this.add(message, 'default', this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Display a toast using the **`description`** variant: same neutral chrome as **`default`**.\r\n *\r\n * @param message Title line.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n description(message: string, options?: ToastOptions): string {\r\n return this.add(message, 'description', this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Display a success toast notification.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n success(message: string, options?: ToastOptions): string {\r\n return this.add(message, 'success', this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Display an error toast notification.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n error(message: string, options?: ToastOptions): string {\r\n return this.add(message, 'error', this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Display an info toast notification.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n info(message: string, options?: ToastOptions): string {\r\n return this.add(message, 'info', this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Display a warning toast notification.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n warning(message: string, options?: ToastOptions): string {\r\n return this.add(message, 'warning', this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Show a toast whose **message area** is a standalone Angular component while keeping normal toast chrome\r\n * (surface, icon column when applicable, close button, stack motion).\r\n *\r\n * Pass {@link CustomToastOptions.inputs} for `input()` / `@Input()` on that component.\r\n * The component also receives **`toastId`** (matches the returned id) for programmatic dismiss.\r\n *\r\n * @param component The component class (must be usable with `NgComponentOutlet`).\r\n * @param options Optional configuration object {@link CustomToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n custom(component: Type<unknown>, options?: CustomToastOptions): string {\r\n return this.addContentComponent(\r\n component,\r\n 'default',\r\n this.resolveDuration(options?.durationMs),\r\n options,\r\n );\r\n }\r\n\r\n /**\r\n * Show a toast whose body is a **standalone** Angular component on a headless host: no default border,\r\n * padding, shadow, or surface color — only stack position and enter/leave animations; the component supplies all visuals.\r\n *\r\n * Pass {@link HeadlessToastOptions.inputs} to feed `input()` on that component.\r\n * The component also automatically receives **`toastId`** (matches the returned id) for programmatic dismiss inside the component.\r\n *\r\n * @param component The component class (must be usable with `NgComponentOutlet`).\r\n * @param options Optional configuration object {@link HeadlessToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n headless(component: Type<unknown>, options?: HeadlessToastOptions): string {\r\n return this.addComponent(component, this.resolveDuration(options?.durationMs), options);\r\n }\r\n\r\n /**\r\n * Display a loading toast notification.\r\n *\r\n * If `options.durationMs` is omitted, the toast stays until you dismiss or replace it (same as {@link TOAST_DURATION_MANUAL_DISMISS}).\r\n * Passing a finite positive `durationMs` schedules auto-dismiss for loading toasts like other variants.\r\n * The literal **`\"Infinity\"`** (or {@link TOAST_DURATION_MANUAL_DISMISS} / `0`) keeps the toast until dismissed.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n loading(message: string, options?: ToastOptions): string {\r\n const durationMs =\r\n options?.durationMs !== undefined\r\n ? parseToasterDurationMs(options.durationMs)\r\n : TOAST_DURATION_MANUAL_DISMISS;\r\n return this.add(message, 'loading', durationMs, options);\r\n }\r\n\r\n /**\r\n * Toast with message and a single **action** button. Default action button label is {@link DEFAULT_TOAST_ACTION_LABEL}.\r\n * Pass `action.label` and `action.onClick` in {@link ToastActionMethodOptions} to customize the action button.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastActionMethodOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n action(message: string, options: ToastActionMethodOptions): string {\r\n const { action: actionCfg, ...rest } = options;\r\n const toastAction: NonNullable<ToasterItem['toastAction']> = {\r\n role: 'action',\r\n label: actionCfg.label ?? DEFAULT_TOAST_ACTION_LABEL,\r\n onClick: actionCfg.onClick,\r\n };\r\n return this.add(\r\n message,\r\n 'default',\r\n this.resolveDuration(rest.durationMs),\r\n { ...rest, icon: null },\r\n toastAction,\r\n );\r\n }\r\n\r\n /**\r\n * Toast with message and a **cancel**-style button. Default cancel button label is {@link DEFAULT_TOAST_CANCEL_LABEL}.\r\n * Pass `cancel.label` and `cancel.onClick` in {@link ToastCancelMethodOptions} to customize the cancel button.\r\n *\r\n * @param message The toast content.\r\n * @param options Optional configuration object {@link ToastCancelMethodOptions}.\r\n * @returns The toast ID, useful for programmatic dismissal.\r\n */\r\n cancel(message: string, options: ToastCancelMethodOptions): string {\r\n const { cancel: cancelCfg, ...rest } = options;\r\n const toastAction: NonNullable<ToasterItem['toastAction']> = {\r\n role: 'cancel',\r\n label: cancelCfg.label ?? DEFAULT_TOAST_CANCEL_LABEL,\r\n onClick: cancelCfg.onClick,\r\n };\r\n return this.add(\r\n message,\r\n 'default',\r\n this.resolveDuration(rest.durationMs),\r\n { ...rest, icon: null },\r\n toastAction,\r\n );\r\n }\r\n\r\n /**\r\n * Shows one toast: loading until `userPromise` settles, then the same toast updates to success or error.\r\n * Returns the same promise (fulfillment/rejection preserved for callers).\r\n *\r\n * @param userPromise The promise to display.\r\n * @param labels The labels for the loading, success, and error states.\r\n * @returns The promise (fulfillment/rejection preserved for callers).\r\n */\r\n promise<T>(userPromise: PromiseLike<T>, labels: ToastPromiseLabels<T>): Promise<T> {\r\n const loadingId = this.loading(labels.loading);\r\n return Promise.resolve(userPromise).then(\r\n (value) => {\r\n const message =\r\n typeof labels.success === 'function' ? labels.success(value) : labels.success;\r\n this.updateToast(loadingId, message, 'success', this.resolveDuration(undefined));\r\n return value;\r\n },\r\n (reason: unknown) => {\r\n const message = typeof labels.error === 'function' ? labels.error(reason) : labels.error;\r\n this.updateToast(loadingId, message, 'error', this.resolveDuration(undefined));\r\n throw reason;\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Dismiss a toast notification.\r\n *\r\n * @param id The toast ID.\r\n */\r\n dismiss(id: string): void {\r\n this.removeToast(id, 'manual');\r\n }\r\n\r\n /**\r\n * Clear all toast notifications.\r\n */\r\n clear(): void {\r\n const snapshot = [...this._toasts()];\r\n for (const state of this.autoDismissByToastId.values()) {\r\n if (state.kind === 'scheduled') {\r\n globalThis.clearTimeout(state.timer);\r\n }\r\n }\r\n this.autoDismissByToastId.clear();\r\n this._toasts.set([]);\r\n for (const toast of snapshot) {\r\n toast.onDismiss?.();\r\n }\r\n }\r\n\r\n private add(\r\n message: string,\r\n variant: ToastVariant,\r\n durationMs: number,\r\n options?: ToastOptions,\r\n toastAction?: NonNullable<ToasterItem['toastAction']>,\r\n ): string {\r\n const id = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`;\r\n const icon = options?.icon;\r\n const style = options?.style;\r\n const classNames = options?.classNames;\r\n const onDismiss = options?.onDismiss;\r\n const onAutoClose = options?.onAutoClose;\r\n const description = options?.description;\r\n const item: ToasterItem = {\r\n id,\r\n message,\r\n variant,\r\n ...(icon !== undefined ? { icon } : {}),\r\n ...(style !== undefined ? { style } : {}),\r\n ...(classNames !== undefined ? { classNames } : {}),\r\n ...(description !== undefined ? { description } : {}),\r\n ...(onDismiss !== undefined ? { onDismiss } : {}),\r\n ...(onAutoClose !== undefined ? { onAutoClose } : {}),\r\n ...(toastAction !== undefined ? { toastAction } : {}),\r\n };\r\n this._toasts.update((list) => [...list, item]);\r\n this.scheduleAutoDismiss(id, durationMs);\r\n return id;\r\n }\r\n\r\n private addContentComponent(\r\n component: Type<unknown>,\r\n variant: ToastVariant,\r\n durationMs: number,\r\n options?: CustomToastOptions,\r\n ): string {\r\n const id = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`;\r\n const componentInputs: Record<string, unknown> = {\r\n ...(options?.inputs ?? {}),\r\n toastId: id,\r\n };\r\n const icon = options?.icon;\r\n const style = options?.style;\r\n const classNames = options?.classNames;\r\n const onDismiss = options?.onDismiss;\r\n const onAutoClose = options?.onAutoClose;\r\n const description = options?.description;\r\n\r\n const item: ToasterItem = {\r\n id,\r\n message: '',\r\n variant,\r\n contentComponent: component,\r\n contentComponentInputs: componentInputs,\r\n ...(icon !== undefined ? { icon } : {}),\r\n ...(style !== undefined ? { style } : {}),\r\n ...(classNames !== undefined ? { classNames } : {}),\r\n ...(description !== undefined ? { description } : {}),\r\n ...(onDismiss !== undefined ? { onDismiss } : {}),\r\n ...(onAutoClose !== undefined ? { onAutoClose } : {}),\r\n };\r\n\r\n this._toasts.update((list) => [...list, item]);\r\n this.scheduleAutoDismiss(id, durationMs);\r\n return id;\r\n }\r\n\r\n private addComponent(\r\n component: Type<unknown>,\r\n durationMs: number,\r\n options?: HeadlessToastOptions,\r\n ): string {\r\n const id = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`;\r\n\r\n const componentInputs: Record<string, unknown> = {\r\n ...(options?.inputs ?? {}),\r\n toastId: id,\r\n };\r\n\r\n const classNames = options?.classNames;\r\n const onDismiss = options?.onDismiss;\r\n const onAutoClose = options?.onAutoClose;\r\n\r\n const item: ToasterItem = {\r\n id,\r\n message: '',\r\n variant: 'default',\r\n component,\r\n componentInputs,\r\n ...(classNames !== undefined ? { classNames } : {}),\r\n ...(onDismiss !== undefined ? { onDismiss } : {}),\r\n ...(onAutoClose !== undefined ? { onAutoClose } : {}),\r\n };\r\n\r\n this._toasts.update((list) => [...list, item]);\r\n\r\n this.scheduleAutoDismiss(id, durationMs);\r\n\r\n return id;\r\n }\r\n\r\n private updateToast(\r\n id: string,\r\n message: string,\r\n variant: ToastVariant,\r\n durationMs: number,\r\n ): void {\r\n let found = false;\r\n this._toasts.update((toasts) =>\r\n toasts.map((toast) => {\r\n if (toast.id !== id) {\r\n return toast;\r\n }\r\n found = true;\r\n return { ...toast, message, variant };\r\n }),\r\n );\r\n if (found) {\r\n this.scheduleAutoDismiss(id, durationMs);\r\n }\r\n }\r\n\r\n private removeToast(id: string, cause: 'auto' | 'manual'): void {\r\n const toast = this._toasts().find((t) => t.id === id);\r\n if (!toast) {\r\n return;\r\n }\r\n this.cancelAutoDismiss(id);\r\n this._toasts.update((list) => list.filter((t) => t.id !== id));\r\n if (cause === 'auto') {\r\n toast.onAutoClose?.();\r\n } else {\r\n toast.onDismiss?.();\r\n }\r\n }\r\n}\r\n","import type { Type } from '@angular/core';\r\n\r\nexport const TOASTER_POSITIONS = [\r\n 'top-left',\r\n 'top-center',\r\n 'top-right',\r\n 'bottom-left',\r\n 'bottom-center',\r\n 'bottom-right',\r\n] as const;\r\n\r\nexport type ToasterPosition = (typeof TOASTER_POSITIONS)[number];\r\n\r\n/** Visual palette for the toast stack: follow the OS (`system`), or pin light / dark. */\r\nexport type ToasterTheme = 'light' | 'dark' | 'system';\r\n\r\n/**\r\n * Viewport inset from `<app-toaster [offset]>` or `<app-toaster [mobileOffset]>`.\r\n *\r\n * Used with **`[offset]`** for `--toast-offset-*` (wide layout / shared vars) and **`[mobileOffset]`** for `--toast-offset-mobile-*` (narrow layout in `toaster.css`).\r\n *\r\n * - A **string** sets all four sides to the same CSS value (e.g. `\"24px\"`, `\"1rem env(safe-area-inset-top)\"`).\r\n * - An **object** sets only the sides you pass; omitted sides keep the defaults from `toaster.css`.\r\n */\r\nexport type ToasterOffset =\r\n | string\r\n | {\r\n top?: string;\r\n right?: string;\r\n bottom?: string;\r\n left?: string;\r\n };\r\n\r\n/**\r\n * Milliseconds as a number, or the literal string **`\"Infinity\"`** (manual dismiss only). No other string values are supported.\r\n * Used by `<app-toaster [duration]>` and {@link ToastOptions.durationMs}.\r\n */\r\nexport type ToasterDuration = number | 'Infinity';\r\n\r\n/** Default `aria-label` for the toaster live region (`<section>`). */\r\nexport const DEFAULT_TOASTER_ARIA_NOTIFICATIONS_REGION = 'Notifications';\r\n\r\n/** Default `aria-label` for the per-toast dismiss (close) control. */\r\nexport const DEFAULT_TOASTER_ARIA_DISMISS_BUTTON = 'Dismiss';\r\n\r\n/**\r\n * Overrides for built-in English accessibility strings on `<better-toaster [accessibilityLabels]>`.\r\n * Omitted keys keep the library defaults.\r\n */\r\nexport interface ToasterAccessibilityLabels {\r\n /**\r\n * `aria-label` on the polite live region wrapper (`<section>`).\r\n * Default {@link DEFAULT_TOASTER_ARIA_NOTIFICATIONS_REGION}.\r\n */\r\n notificationsRegion?: string;\r\n /**\r\n * `aria-label` on the dismiss control when `<better-toaster [closeButton]>` is true.\r\n * Default {@link DEFAULT_TOASTER_ARIA_DISMISS_BUTTON}.\r\n */\r\n dismissButton?: string;\r\n}\r\n\r\nexport const TOAST_VARIANTS = [\r\n 'default',\r\n 'description',\r\n 'success',\r\n 'error',\r\n 'info',\r\n 'warning',\r\n 'loading',\r\n] as const;\r\n\r\nexport type ToastVariant = (typeof TOAST_VARIANTS)[number];\r\n\r\n/**\r\n * Per-variant icon overrides for `<app-toaster [icons]>`.\r\n *\r\n * Each value is either an **Angular standalone component** class (rendered with `NgComponentOutlet`),\r\n * or **`null`** to show no icon for that variant. Omitted keys keep the library defaults.\r\n *\r\n * The **`default`** variant has no built-in icon; set `default` here (or pass {@link ToastOptions.icon}\r\n * on a single toast) to show one. Omitting `default` keeps default toasts text-only.\r\n */\r\nexport type ToasterIcons = Partial<Record<ToastVariant, Type<unknown> | null>>;\r\n\r\n/**\r\n * Extra classes for host, message, and close control only.\r\n * Used by {@link ToastOptions.classNames} and {@link HeadlessToastOptions.classNames}.\r\n *\r\n * Row button defaults (`.action-btn` / `.cancel-btn`) can be set on {@link ToasterToastOptions.classNames} ({@link ToastChromeClassNames})\r\n * or overridden per call via {@link ToastActionChromeClassNames} / {@link ToastCancelChromeClassNames}.\r\n *\r\n * The library ships encapsulated styles (`toast-item.css`, etc.). Global rules for your class names often **lose to those defaults**, so properties you expect to change **usually need `!important`** (or stronger specificity) to actually apply.\r\n */\r\nexport type ToastBaseChromeClassNames = Partial<\r\n Record<'toast' | 'message' | 'description' | 'closeButton', string>\r\n>;\r\n\r\n/**\r\n * Merged shape after combining toaster defaults with a toast item (may include row-button keys when that toast has a row button).\r\n * The library still uses this internally on {@link ToasterItem} and for `[class]` resolution.\r\n */\r\nexport type ToastChromeClassNames = ToastBaseChromeClassNames & {\r\n actionButton?: string;\r\n cancelButton?: string;\r\n};\r\n\r\n/** `classNames` for {@link ToasterService.action} — includes `.action-btn` only among row buttons. */\r\nexport type ToastActionChromeClassNames = ToastBaseChromeClassNames & {\r\n actionButton?: string;\r\n};\r\n\r\n/** `classNames` for {@link ToasterService.cancel} — includes `.cancel-btn` only among row buttons. */\r\nexport type ToastCancelChromeClassNames = ToastBaseChromeClassNames & {\r\n cancelButton?: string;\r\n};\r\n\r\n/**\r\n * Defaults for every toast from `<app-toaster [toastOptions]>`.\r\n * Per-toast {@link ToastOptions} override these (e.g. `style` / `classNames` keys on a single toast win over the same keys here).\r\n */\r\nexport interface ToasterToastOptions {\r\n /**\r\n * Inline CSS on each toast host (`li.toast` / `AppToastItem`).\r\n * Merged with per-toast {@link ToastOptions.style}; toast-specific values override.\r\n */\r\n style?: Record<string, string | number | undefined>;\r\n\r\n /**\r\n * Extra CSS class strings merged onto toast chrome via Angular **`[class]`** bindings (from `<app-toaster [toastOptions]>`).\r\n *\r\n * - **`toast`** — list item host (`li.toast` / `AppToastItem`), alongside the built-in `toast` class.\r\n * - **`message`** — the title line (`.msg`) when the toast is not a headless body or {@link ToasterItem.contentComponent} body.\r\n * - **`description`** — the secondary line (`.description`) when {@link ToastOptions.description} is set or for the **`description`** variant.\r\n * - **`closeButton`** — the dismiss control (`.close-btn`) when `<app-toaster [closeButton]>` is enabled.\r\n * - **`actionButton`** / **`cancelButton`** — defaults for `.action-btn` / `.cancel-btn` when you use {@link ToasterService.action} / {@link ToasterService.cancel}; ignored on toasts without a row button.\r\n *\r\n * Per-toast {@link ToastOptions.classNames} cannot set row-button keys; override them on each {@link ToastActionMethodOptions} / {@link ToastCancelMethodOptions} call instead.\r\n *\r\n * Omitted keys add no extra classes for that part; values are typically space-separated class names (same as a static `class` attribute).\r\n *\r\n * **Overriding built-in look:** your CSS generally needs **`!important`** on the declarations that must win.\r\n */\r\n classNames?: ToastChromeClassNames;\r\n}\r\n\r\n/** Label + handler for {@link ToasterService.action} / {@link ToasterService.cancel}. */\r\nexport interface ToastMethodButtonConfig {\r\n /** Visible button text; defaults to `\"Action\"` or `\"Cancel\"` depending on the method. */\r\n label?: string;\r\n /**\r\n * Receives the row button click event. Call {@link Event.preventDefault} to keep the toast open\r\n * (the library skips {@link ToasterService.dismiss} when `defaultPrevented` is true).\r\n */\r\n onClick: (event: Event) => void;\r\n}\r\n\r\n/**\r\n * Options for {@link ToasterService.action} only. Use the `action` field (not available on {@link ToastOptions}).\r\n */\r\nexport type ToastActionMethodOptions = Omit<ToastOptions, 'icon' | 'classNames'> & {\r\n action: ToastMethodButtonConfig;\r\n classNames?: ToastActionChromeClassNames;\r\n};\r\n\r\n/**\r\n * Options for {@link ToasterService.cancel} only. Use the `cancel` field (not available on {@link ToastOptions}).\r\n */\r\nexport type ToastCancelMethodOptions = Omit<ToastOptions, 'icon' | 'classNames'> & {\r\n cancel: ToastMethodButtonConfig;\r\n classNames?: ToastCancelChromeClassNames;\r\n};\r\n\r\n/**\r\n * Options for {@link ToasterService.custom}.\r\n * {@link CustomToastOptions.inputs} is merged into the body component (same pattern as {@link HeadlessToastOptions.inputs});\r\n * **`toastId`** is always injected after your inputs. The component must declare a matching `input()` / `@Input()` for **`toastId`**\r\n * so `NgComponentOutlet` can bind it (same requirement as {@link ToasterService.headless}).\r\n */\r\nexport interface CustomToastOptions extends ToastOptions {\r\n inputs?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Options for the second argument of `show`, `success`, `error`, `info`, `warning`, `loading`,\r\n * and {@link ToasterService#description}.\r\n * {@link ToasterService.custom} uses {@link CustomToastOptions} instead.\r\n * Not used by `ToasterService.promise()` (that API uses {@link ToastPromiseLabels}).\r\n */\r\nexport interface ToastOptions {\r\n /**\r\n * Omit to use `<app-toaster [duration]>` (or the library default).\r\n * Use the literal **`\"Infinity\"`**, `Number.POSITIVE_INFINITY`, or `TOAST_DURATION_MANUAL_DISMISS` to persist until dismissed; `0` is still accepted for the same behavior.\r\n * `loading()` defaults to manual dismiss when `durationMs` is omitted.\r\n */\r\n durationMs?: ToasterDuration;\r\n /**\r\n * `undefined` = use global `[icons]` on `<app-toaster>` or built-in SVGs.\r\n * `null` = no icon for this toast.\r\n * Otherwise a standalone component class rendered like `[icons]` overrides.\r\n */\r\n icon?: Type<unknown> | null;\r\n /**\r\n * Inline CSS on the toast host (`li.toast` / `AppToastItem`).\r\n * Merged after `<app-toaster [toastOptions]>` `style` (if any); per-toast keys override the same keys from the toaster.\r\n */\r\n style?: Record<string, string | number | undefined>;\r\n /**\r\n * Secondary line below {@link ToasterItem.message} in a column layout. Works on every toast helper\r\n * (`show`, `success`, `error`, …). {@link ToasterService#description} uses the **`description`** variant\r\n * (neutral chrome like `default`); you can still pass this on other variants for the same layout with their icons/colors.\r\n */\r\n description?: string;\r\n /**\r\n * Extra **`[class]`** strings for this toast only — same keys and **`!important`** guidance as {@link ToasterToastOptions.classNames}.\r\n * Merged with `<app-toaster [toastOptions]>` `classNames` (if any); per-toast keys replace the same keys from the toaster.\r\n *\r\n * Row button keys (`actionButton` / `cancelButton`) are only valid on {@link ToastActionMethodOptions} / {@link ToastCancelMethodOptions}.\r\n */\r\n classNames?: ToastBaseChromeClassNames;\r\n /**\r\n * Called when the toast is removed for any reason other than auto-dismiss: close control, swipe,\r\n * {@link ToasterService.dismiss}, or {@link ToasterService.clear}.\r\n */\r\n onDismiss?: () => void;\r\n /**\r\n * Called when the toast is removed because its auto-dismiss timer finished (including after hover\r\n * pause when the remaining time elapses).\r\n */\r\n onAutoClose?: () => void;\r\n}\r\n\r\n/**\r\n * Options for {@link ToasterService.headless}.\r\n * The component must be **standalone** (or otherwise valid for `NgComponentOutlet`).\r\n * Headless toasts ignore `<app-toaster [closeButton]>`: no dismiss control is rendered.\r\n *\r\n * Per-toast **`icon`** and **`style`** are omitted: the inner component owns visuals; use\r\n * `<app-toaster [toastOptions]>` for shared host styling if needed. **`classNames`** still applies to the list-item host\r\n * (and to `.msg` / `.close-btn` when that chrome exists).\r\n *\r\n * The host always passes a **`toastId`** input (same value as the id returned from `headless()`)\r\n * so the component can call {@link ToasterService.dismiss} or read its own id. User `inputs` are\r\n * merged first; **`toastId` always wins** if also present in `inputs`.\r\n */\r\nexport interface HeadlessToastOptions extends Omit<ToastOptions, 'icon' | 'style'> {\r\n /**\r\n * Values passed to the component’s `input()` / `@Input()` bindings\r\n * (same shape as `NgComponentOutlet` `inputs`).\r\n */\r\n inputs?: Record<string, unknown>;\r\n}\r\n\r\nexport interface ToasterItem {\r\n readonly id: string;\r\n readonly message: string;\r\n /** Secondary line; see {@link ToastOptions.description}. */\r\n readonly description?: string;\r\n readonly variant: ToastVariant;\r\n /**\r\n * When set, the toast body is this standalone component rendered **inside** normal chrome (icon column when applicable, `.msg` host, close button),\r\n * via {@link ToasterService.custom}.\r\n */\r\n readonly contentComponent?: Type<unknown>;\r\n /** Bound to {@link ToasterItem.contentComponent} via `NgComponentOutlet` (includes auto **`toastId`**). */\r\n readonly contentComponentInputs?: Record<string, unknown>;\r\n /**\r\n * When set (without {@link ToasterItem.contentComponent}), the toast body is this standalone component only — same stack and motion as other toasts, without host chrome or a close button.\r\n */\r\n readonly component?: Type<unknown>;\r\n /** Bound to the headless component via `NgComponentOutlet`. */\r\n readonly componentInputs?: Record<string, unknown>;\r\n /** Per-toast override; see {@link ToastOptions.icon}. */\r\n readonly icon?: Type<unknown> | null;\r\n /** Per-toast host inline styles; see {@link ToastOptions.style}. */\r\n readonly style?: Record<string, string | number | undefined>;\r\n /** Per-toast extra classes; see {@link ToastOptions.classNames}. */\r\n readonly classNames?: ToastChromeClassNames;\r\n /** See {@link ToastOptions.onDismiss}. */\r\n readonly onDismiss?: () => void;\r\n /** See {@link ToastOptions.onAutoClose}. */\r\n readonly onAutoClose?: () => void;\r\n /**\r\n * Primary row action from {@link ToasterService.action} or {@link ToasterService.cancel}.\r\n * Renders a text button next to the message (no icon column).\r\n */\r\n readonly toastAction?: {\r\n readonly role: 'action' | 'cancel';\r\n readonly label: string;\r\n /** Same contract as {@link ToastMethodButtonConfig.onClick}. */\r\n readonly onClick: (event: Event) => void;\r\n };\r\n}\r\n\r\n/**\r\n * Labels for `ToasterService.promise` (loading vs settled states).\r\n * `success` / `error` may be static strings or functions that receive the settled value / rejection reason.\r\n */\r\nexport interface ToastPromiseLabels<T = unknown> {\r\n readonly loading: string;\r\n readonly success: string | ((data: T) => string);\r\n readonly error: string | ((reason: unknown) => string);\r\n}\r\n","import { NgComponentOutlet } from '@angular/common';\r\nimport {\r\n afterNextRender,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n DEFAULT_TOAST_DURATION_MS,\r\n parseToasterDurationMs,\r\n ToasterService,\r\n} from './toaster.service';\r\nimport {\r\n DEFAULT_TOASTER_ARIA_DISMISS_BUTTON,\r\n DEFAULT_TOASTER_ARIA_NOTIFICATIONS_REGION,\r\n type ToastChromeClassNames,\r\n type ToasterAccessibilityLabels,\r\n type ToasterDuration,\r\n type ToasterIcons,\r\n type ToasterItem,\r\n type ToasterOffset,\r\n type ToasterPosition,\r\n type ToasterTheme,\r\n type ToasterToastOptions,\r\n type ToastOptions,\r\n type ToastVariant,\r\n} from './toaster.types';\r\n\r\nconst GAP = 16;\r\n\r\nfunction swipeDirectionForPosition(position: ToasterPosition): 'down' | 'up' {\r\n return position.startsWith('bottom') ? 'down' : 'up';\r\n}\r\n\r\nfunction resolveToasterOffsetSide(\r\n offset: ToasterOffset | undefined,\r\n side: 'top' | 'right' | 'bottom' | 'left',\r\n): string | undefined {\r\n if (offset == null) {\r\n return undefined;\r\n }\r\n if (typeof offset === 'string') {\r\n return offset;\r\n }\r\n return offset[side];\r\n}\r\n\r\nfunction mergeToastHostStyles(\r\n base: Record<string, string | number | undefined> | undefined,\r\n override: Record<string, string | number | undefined> | undefined,\r\n): Record<string, string | number | undefined> | undefined {\r\n if (!base && !override) return undefined;\r\n if (!base) return override;\r\n if (!override) return base;\r\n return { ...base, ...override };\r\n}\r\n\r\nfunction mergeToastClassNames(\r\n base: ToastChromeClassNames | undefined,\r\n override: ToastChromeClassNames | undefined,\r\n): ToastChromeClassNames | undefined {\r\n if (!base && !override) return undefined;\r\n if (!base) return override;\r\n if (!override) return base;\r\n return { ...base, ...override };\r\n}\r\n\r\n@Component({\r\n selector: 'li[betterToastItem]',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [NgComponentOutlet],\r\n host: {\r\n role: 'listitem',\r\n tabindex: '0',\r\n class: 'toast',\r\n '[class]': 'resolvedClassNames()?.toast',\r\n '[attr.data-variant]': 'variant()',\r\n '[attr.data-icon]': 'shouldShowIconColumn() ? \"true\" : \"false\"',\r\n '[attr.data-headless]': 'isHeadless() ? \"true\" : null',\r\n '[attr.data-swipe-direction]': 'swipeDirection()',\r\n '[attr.data-theme]': 'theme()',\r\n '[style.--offset]': 'offset() + \"px\"',\r\n '[style]': 'isHeadless() ? undefined : hostStyle()',\r\n '[animate.leave]': '\"leave\"',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(pointermove)': 'onPointerMove($event)',\r\n '(pointerup)': 'onPointerUp()',\r\n '(pointercancel)': 'onPointerCancel()',\r\n '(pointerenter)': 'onPointerEnter()',\r\n '(pointerleave)': 'onPointerLeave()',\r\n },\r\n template: `\r\n @if (toast()?.component) {\r\n <ng-container *ngComponentOutlet=\"toast()!.component!; inputs: componentOutletInputs()\" />\r\n } @else {\r\n @if (shouldShowIconColumn()) {\r\n <span class=\"toast-icon\" aria-hidden=\"true\">\r\n @if (toast()?.icon) {\r\n <ng-container *ngComponentOutlet=\"toast()!.icon!\" />\r\n } @else if (iconComponent(); as IconCmp) {\r\n <ng-container *ngComponentOutlet=\"IconCmp\" />\r\n } @else {\r\n @switch (variant()) {\r\n @case ('success') {\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n >\r\n <circle\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"9\"\r\n stroke=\"currentColor\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"1.75\"\r\n />\r\n <path\r\n stroke=\"currentColor\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"1.75\"\r\n d=\"M8.48 12.22 10.9 14.64 15.74 9.14\"\r\n />\r\n </svg>\r\n }\r\n @case ('error') {\r\n <svg\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\r\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\r\n </svg>\r\n }\r\n @case ('info') {\r\n <svg\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.75\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\r\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\r\n </svg>\r\n }\r\n @case ('warning') {\r\n <svg\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n stroke=\"currentColor\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"1.75\"\r\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z\"\r\n />\r\n </svg>\r\n }\r\n @case ('loading') {\r\n <div class=\"toast-icon-loading\" aria-hidden=\"true\"></div>\r\n }\r\n @case ('description') {}\r\n @case ('default') {}\r\n }\r\n }\r\n </span>\r\n }\r\n\r\n @if (hasDescription()) {\r\n <div class=\"stack\">\r\n @if (toast()?.contentComponent) {\r\n <div class=\"msg\" [class]=\"resolvedClassNames()?.message\">\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n toast()!.contentComponent!;\r\n inputs: contentComponentOutletInputs()\r\n \"\r\n />\r\n </div>\r\n } @else {\r\n <p class=\"msg\" [class]=\"resolvedClassNames()?.message\">{{ toast()?.message }}</p>\r\n }\r\n @if (toast()?.description) {\r\n <p class=\"description\" [class]=\"resolvedClassNames()?.description\">\r\n {{ toast()!.description }}\r\n </p>\r\n }\r\n </div>\r\n } @else {\r\n @if (toast()?.contentComponent) {\r\n <div class=\"msg\" [class]=\"resolvedClassNames()?.message\">\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n toast()!.contentComponent!;\r\n inputs: contentComponentOutletInputs()\r\n \"\r\n />\r\n </div>\r\n } @else {\r\n <p class=\"msg\" [class]=\"resolvedClassNames()?.message\">{{ toast()?.message }}</p>\r\n }\r\n }\r\n\r\n @if (toast()?.toastAction; as rowAction) {\r\n @switch (rowAction.role) {\r\n @case ('action') {\r\n <button\r\n type=\"button\"\r\n class=\"toast-row-btn action-btn\"\r\n [class]=\"resolvedClassNames()?.actionButton\"\r\n [attr.data-row-btn]=\"rowAction.role\"\r\n (pointerdown)=\"onRowButtonPointerDown($event)\"\r\n (click)=\"onToastRowClick($event)\"\r\n >\r\n {{ rowAction.label }}\r\n </button>\r\n }\r\n @case ('cancel') {\r\n <button\r\n type=\"button\"\r\n class=\"toast-row-btn cancel-btn\"\r\n [class]=\"resolvedClassNames()?.cancelButton\"\r\n [attr.data-row-btn]=\"rowAction.role\"\r\n (pointerdown)=\"onRowButtonPointerDown($event)\"\r\n (click)=\"onToastRowClick($event)\"\r\n >\r\n {{ rowAction.label }}\r\n </button>\r\n }\r\n }\r\n }\r\n }\r\n\r\n @if (closeButton() && !isHeadless()) {\r\n <button\r\n type=\"button\"\r\n class=\"close-btn\"\r\n [class]=\"resolvedClassNames()?.closeButton\"\r\n (click)=\"toaster.dismiss(toast()?.id ?? '')\"\r\n [attr.aria-label]=\"dismissButtonAriaLabel()\"\r\n >\r\n <svg aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n stroke=\"currentColor\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"1.75\"\r\n d=\"M6 18 18 6M6 6l12 12\"\r\n />\r\n </svg>\r\n </button>\r\n }\r\n `,\r\n styleUrl: './toast-item.css',\r\n})\r\nexport class BetterToastItem {\r\n /** Shared toaster service (e.g. dismiss from the close button). */\r\n protected readonly toaster = inject(ToasterService);\r\n\r\n /** Host element ref used to read `offsetHeight` after the first render. */\r\n protected readonly host = inject(ElementRef);\r\n\r\n /** Toast payload (message, id, variant from the service). */\r\n toast = input<ToasterItem>();\r\n /**\r\n * Styles from `<app-toaster [toastOptions]>`; merged with {@link ToasterItem.style} so per-toast keys win.\r\n */\r\n toasterStyle = input<Record<string, string | number | undefined> | undefined>();\r\n /**\r\n * Classes from `<app-toaster [toastOptions]>` — same shape as {@link ToasterToastOptions.classNames}.\r\n * Merged with {@link ToasterItem.classNames}; per-toast keys replace the same keys from the toaster.\r\n * Styles for those classes usually need **`!important`** to override the library’s encapsulated CSS; see {@link ToastChromeClassNames}.\r\n */\r\n toasterClassNames = input<ToastChromeClassNames | undefined>();\r\n /** Which icon and color treatment to show for this row. */\r\n variant = input<ToastVariant>('default');\r\n /** Vertical stack offset in px; bound to `--offset` on the host for layout. */\r\n offset = input.required<number>();\r\n /** When false, the dismiss control is not rendered (toasts may still auto-dismiss or be cleared via the service). */\r\n closeButton = input(true);\r\n /**\r\n * Per-variant icon overrides from `<app-toaster [icons]>`.\r\n * Each override must be a standalone component whose template includes the SVG artwork.\r\n */\r\n customIcons = input<ToasterIcons | undefined>();\r\n /**\r\n * `aria-label` for the dismiss control; set from `<better-toaster [accessibilityLabels]>`.\r\n * Default {@link DEFAULT_TOASTER_ARIA_DISMISS_BUTTON}.\r\n */\r\n dismissButtonAriaLabel = input<string>(DEFAULT_TOASTER_ARIA_DISMISS_BUTTON);\r\n /** Stack anchor from `<better-toaster [position]>` — drives swipe axis and `data-swipe-direction`. */\r\n stackPosition = input<ToasterPosition>('bottom-right');\r\n /**\r\n * Color palette from `<better-toaster [theme]>`; mirrored on the host as `data-theme`\r\n * so item-scoped CSS can react to the chosen mode without `:host-context()`.\r\n */\r\n theme = input<ToasterTheme>('system');\r\n /** Emits the measured host height in px once after the first render so the parent can stack siblings. */\r\n heightChange = output<number>();\r\n\r\n /**\r\n * Stacked title + optional secondary line: {@link ToastVariant} **`description`**, or any variant with\r\n * non-empty {@link ToasterItem.description} ({@link ToastOptions.description} on `show` / `success` / etc.).\r\n */\r\n protected readonly hasDescription = computed(() => {\r\n const toast = this.toast();\r\n if (!toast) return false;\r\n if (toast.variant === 'description') return true;\r\n return !!toast.description?.trim();\r\n });\r\n /** Merged inline styles for the toast (`[toastOptions].style` then per-toast `style`). */\r\n protected readonly hostStyle = computed(() =>\r\n mergeToastHostStyles(this.toasterStyle(), this.toast()?.style),\r\n );\r\n /** Merged `[class]` strings (`[toastOptions].classNames` then per-toast `classNames`). */\r\n protected readonly resolvedClassNames = computed(() =>\r\n mergeToastClassNames(this.toasterClassNames(), this.toast()?.classNames),\r\n );\r\n /** Resolved standalone SVG icon component from `[icons]`, if any (not `null`). */\r\n protected readonly iconComponent = computed(() => {\r\n const customIcon = this.customIcons()?.[this.variant()];\r\n if (customIcon === null) {\r\n return undefined;\r\n }\r\n return customIcon;\r\n });\r\n /**\r\n * Renders the icon column unless the toast or `[icons]` opts out with `icon: null` / a `null` entry for that variant.\r\n * The `default` variant has no built-in icon: the column appears only with a per-toast `icon` or `[icons].default`.\r\n */\r\n protected readonly shouldShowIconColumn = computed(() => {\r\n const toast = this.toast();\r\n\r\n if (!toast) return false;\r\n if (toast.icon === null) return false;\r\n\r\n const toastVariant = toast.variant;\r\n if (toastVariant === 'default' || toastVariant === 'description') {\r\n if (toast.icon != null) {\r\n return true;\r\n }\r\n const neutralIcon =\r\n toastVariant === 'default'\r\n ? this.customIcons()?.default\r\n : (this.customIcons()?.description ?? this.customIcons()?.default);\r\n if (neutralIcon === null) {\r\n return false;\r\n }\r\n return neutralIcon !== undefined;\r\n }\r\n\r\n if (toast.icon != null) {\r\n return true;\r\n }\r\n\r\n if (this.customIcons()?.[toastVariant] === null) {\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n /** Bound to {@link ToasterItem.componentInputs} for headless (`NgComponentOutlet`) toasts. */\r\n protected readonly componentOutletInputs = computed(\r\n (): Record<string, unknown> => this.toast()?.componentInputs ?? {},\r\n );\r\n /** Bound to {@link ToasterItem.contentComponentInputs} for {@link ToasterService.custom} body components. */\r\n protected readonly contentComponentOutletInputs = computed(\r\n (): Record<string, unknown> => this.toast()?.contentComponentInputs ?? {},\r\n );\r\n /** When true, host uses no default toast chrome (border, padding, surface) — only stack + motion. */\r\n protected readonly isHeadless = computed(() => this.toast()?.component != null);\r\n /** `down` when anchored to the bottom (dismiss by swiping down), `up` when anchored to the top. */\r\n protected readonly swipeDirection = computed(() =>\r\n swipeDirectionForPosition(this.stackPosition()),\r\n );\r\n\r\n /**\r\n * Emits the measured host height in px once after the first render so the parent can stack siblings.\r\n */\r\n constructor() {\r\n afterNextRender(() => {\r\n const height = this.host.nativeElement.offsetHeight;\r\n this.heightChange.emit(height);\r\n });\r\n }\r\n\r\n /** True once the user has passed the drag threshold and is actively swiping. */\r\n isDragging = signal(false);\r\n private tracking = false;\r\n private startY = 0;\r\n private pointerId = -1;\r\n private readonly dragStartThreshold = 0;\r\n private readonly swipeCloseThreshold = 30;\r\n\r\n /** Transform applied when swipe-dismiss completes (matches leave direction / headless centering). */\r\n protected readonly swipeDismissTransform = computed(() => {\r\n const pos = this.stackPosition();\r\n const down = this.swipeDirection() === 'down';\r\n const y = down ? '130%' : '-130%';\r\n if (this.isHeadless() && (pos === 'bottom-center' || pos === 'top-center')) {\r\n return `translateX(-50%) translateY(${y})`;\r\n }\r\n return `translateY(${y})`;\r\n });\r\n\r\n /** Prevents swipe-to-dismiss from starting when pressing the row action / cancel control. */\r\n onRowButtonPointerDown(event: PointerEvent): void {\r\n event.stopPropagation();\r\n }\r\n /**\r\n * Dismisses the toast when the row action / cancel control is clicked.\r\n * @param event - The event object.\r\n */\r\n onToastRowClick(event: Event): void {\r\n const toast = this.toast();\r\n toast?.toastAction?.onClick(event);\r\n if (event.defaultPrevented) return;\r\n this.toaster.dismiss(toast?.id ?? '');\r\n }\r\n\r\n /**\r\n * Pauses auto-dismiss when the pointer enters the toast.\r\n */\r\n onPointerEnter() {\r\n const id = this.toast()?.id;\r\n if (id) {\r\n this.toaster.pauseAutoDismiss(id);\r\n }\r\n }\r\n /**\r\n * Resumes auto-dismiss when the pointer leaves the toast.\r\n */\r\n onPointerLeave() {\r\n const id = this.toast()?.id;\r\n if (id) {\r\n this.toaster.resumeAutoDismiss(id);\r\n }\r\n }\r\n /**\r\n * Starts tracking the pointer down event.\r\n * @param event - The pointer down event object.\r\n */\r\n onPointerDown(event: PointerEvent) {\r\n if (this.variant() === 'loading') {\r\n return;\r\n }\r\n this.tracking = true;\r\n this.startY = event.clientY;\r\n this.pointerId = event.pointerId;\r\n }\r\n /**\r\n * Updates the toast position when the pointer moves.\r\n * @param event - The pointer move event object.\r\n */\r\n onPointerMove(event: PointerEvent) {\r\n if (!this.tracking && !this.isDragging()) return;\r\n\r\n const el = this.host.nativeElement;\r\n const rawDy = event.clientY - this.startY;\r\n const down = this.swipeDirection() === 'down';\r\n const dragDy = down ? Math.max(0, rawDy) : Math.min(0, rawDy);\r\n\r\n if (!this.isDragging()) {\r\n const passed =\r\n this.dragStartThreshold > 0\r\n ? down\r\n ? rawDy >= this.dragStartThreshold\r\n : rawDy <= -this.dragStartThreshold\r\n : down\r\n ? rawDy > 0\r\n : rawDy < 0;\r\n if (passed) {\r\n this.isDragging.set(true);\r\n el.setPointerCapture(this.pointerId);\r\n }\r\n return;\r\n }\r\n\r\n el.style.translate = `0 ${dragDy}px`;\r\n }\r\n /**\r\n * Ends tracking the pointer up event and dismisses the toast if the pointer has moved beyond the swipe threshold.\r\n */\r\n onPointerUp() {\r\n this.tracking = false;\r\n\r\n if (!this.isDragging()) return;\r\n this.isDragging.set(false);\r\n\r\n const el = this.host.nativeElement;\r\n const id = this.toast()?.id ?? '';\r\n\r\n const dy = parseFloat(el.style.translate?.split(' ')[1]) || 0;\r\n\r\n try {\r\n el.releasePointerCapture(this.pointerId);\r\n } catch {\r\n /* pointer already released */\r\n }\r\n\r\n const down = this.swipeDirection() === 'down';\r\n const shouldDismiss = down ? dy >= this.swipeCloseThreshold : dy <= -this.swipeCloseThreshold;\r\n\r\n if (shouldDismiss) {\r\n el.style.transform = this.swipeDismissTransform();\r\n this.toaster.dismiss(id);\r\n } else {\r\n el.style.transition = 'translate 400ms ease';\r\n el.style.translate = '0 0';\r\n const cleanup = () => {\r\n el.style.transition = '';\r\n el.style.translate = '';\r\n };\r\n el.addEventListener('transitionend', cleanup, { once: true });\r\n setTimeout(cleanup, 450);\r\n }\r\n }\r\n /**\r\n * Ends tracking the pointer cancel event and resets the toast position.\r\n */\r\n onPointerCancel() {\r\n this.tracking = false;\r\n\r\n if (!this.isDragging()) return;\r\n this.isDragging.set(false);\r\n\r\n const el = this.host.nativeElement;\r\n el.style.translate = '';\r\n\r\n try {\r\n el.releasePointerCapture(this.pointerId);\r\n } catch {\r\n /* pointer already released */\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Renders the toaster stack. Add once near the root of your app (e.g. in `App`).\r\n * Variant-colored surfaces are off by default; set `[richColors]=\"true\"` to enable them.\r\n * Set `[duration]` for auto-dismiss when service helpers omit their duration argument.\r\n * Use **`duration=\"Infinity\"`** (that exact literal) or `[duration]=\"…\"` with a number / {@link TOAST_DURATION_MANUAL_DISMISS} for persist until dismissed; `0` still works.\r\n * Pass `[icons]` with optional **standalone** components for `default` / `description` / `success` / `error` / `info` / `warning` / `loading`:\r\n * replace the default artwork (or add an icon for the neutral `default` variant), or use **`null`** to hide that variant’s icon.\r\n * Each component should render an **SVG** (import its class where you configure `[icons]`).\r\n * Set `[closeButton]=\"false\"` to hide the per-toast dismiss button.\r\n * Set `[accessibilityLabels]` to override default English `aria-label` strings (live region and dismiss control).\r\n * Set `[offset]` for `--toast-offset-*` and `[mobileOffset]` for `--toast-offset-mobile-*` (string all sides, or per-side object).\r\n * Set `[theme]` to `light`, `dark`, or `system` (default): semantic colors follow the chosen mode; `system` uses `prefers-color-scheme`.\r\n * {@link ToasterService.action} / {@link ToasterService.cancel} render a message plus one text button (no icon column).\r\n */\r\n@Component({\r\n selector: 'better-toaster',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [BetterToastItem],\r\n template: `\r\n <section\r\n [attr.aria-label]=\"notificationsRegionAriaLabel()\"\r\n tabindex=\"-1\"\r\n aria-live=\"polite\"\r\n aria-relevant=\"additions text\"\r\n aria-atomic=\"false\"\r\n >\r\n <ol\r\n class=\"toast-container\"\r\n [style.--toast-offset-top]=\"offsetTop()\"\r\n [style.--toast-offset-right]=\"offsetRight()\"\r\n [style.--toast-offset-bottom]=\"offsetBottom()\"\r\n [style.--toast-offset-left]=\"offsetLeft()\"\r\n [style.--toast-offset-mobile-top]=\"mobileOffsetTop()\"\r\n [style.--toast-offset-mobile-right]=\"mobileOffsetRight()\"\r\n [style.--toast-offset-mobile-bottom]=\"mobileOffsetBottom()\"\r\n [style.--toast-offset-mobile-left]=\"mobileOffsetLeft()\"\r\n [attr.data-position]=\"position()\"\r\n [attr.data-rich-colors]=\"richColors()\"\r\n [attr.data-theme]=\"theme()\"\r\n tabindex=\"-1\"\r\n >\r\n @for (toast of toaster.toasts(); track toast.id) {\r\n <li\r\n betterToastItem\r\n [toast]=\"toast\"\r\n [toasterStyle]=\"toastOptions()?.style\"\r\n [toasterClassNames]=\"toastOptions()?.classNames\"\r\n [variant]=\"toast.variant\"\r\n [customIcons]=\"icons()\"\r\n [offset]=\"offsets()[toast.id]\"\r\n [closeButton]=\"closeButton()\"\r\n [dismissButtonAriaLabel]=\"dismissButtonAriaLabel()\"\r\n [stackPosition]=\"position()\"\r\n [theme]=\"theme()\"\r\n (heightChange)=\"onHeightChange(toast.id, $event)\"\r\n [attr.data-position]=\"position()\"\r\n [attr.data-rich-colors]=\"richColors()\"\r\n ></li>\r\n }\r\n </ol>\r\n </section>\r\n `,\r\n styleUrl: './toaster.css',\r\n})\r\nexport class BetterToaster implements OnInit {\r\n protected readonly toaster = inject(ToasterService);\r\n\r\n /**\r\n * Default auto-dismiss time in ms for `show` / `success` / `error` / `info` / `warning` when the second argument omits `durationMs`.\r\n * Bind **`duration=\"Infinity\"`** (literal only) or a numeric ms value via `[duration]`; {@link TOAST_DURATION_MANUAL_DISMISS} is accepted as a number.\r\n * `0` still works. Does not apply to `loading()`. Defaults to the library default (4000ms).\r\n */\r\n readonly durationMs = input<number, ToasterDuration>(DEFAULT_TOAST_DURATION_MS, {\r\n alias: 'duration',\r\n transform: (value) => {\r\n const durationMs = parseToasterDurationMs(value);\r\n this.toaster.setDefaultDurationMs(durationMs);\r\n return durationMs;\r\n },\r\n });\r\n /** Where the stack is anchored on the viewport. */\r\n readonly position = input<ToasterPosition>('bottom-right');\r\n /**\r\n * Viewport inset for the toast stack: a single CSS value for all sides, or an object with any of `top` / `right` / `bottom` / `left`.\r\n * Binds `--toast-offset-top` / `right` / `bottom` / `left` on `.toast-container`.\r\n */\r\n readonly offset = input<ToasterOffset | undefined>(undefined);\r\n /**\r\n * Viewport inset for narrow layouts: binds `--toast-offset-mobile-top` / `right` / `bottom` / `left` on `.toast-container`.\r\n * Same shape as {@link offset}.\r\n */\r\n readonly mobileOffset = input<ToasterOffset | undefined>(undefined);\r\n /**\r\n * When true, success/error/info/warning use semantic background and border colors.\r\n */\r\n readonly richColors = input(false);\r\n /**\r\n * Color palette for the stack. `system` (default) follows `prefers-color-scheme`; `light` / `dark` pin the palette regardless of OS.\r\n * Reflected as `data-theme` on the toast container (`<ol class=\"toast-container\">`).\r\n */\r\n readonly theme = input<ToasterTheme>('system');\r\n /**\r\n * Optional per-variant **standalone** components that replace the default SVG (or loading indicator).\r\n * Import each icon component in the host and pass its class here; each one should render an SVG\r\n * (e.g. root `<svg>` with `stroke=\"currentColor\"` / `fill=\"currentColor\"` where appropriate).\r\n * Omitted keys keep the built-in icons (the `default` variant has none unless you set `default` here).\r\n * **`null`** for a variant hides that variant’s icon.\r\n */\r\n readonly icons = input<ToasterIcons | undefined>();\r\n /**\r\n * Defaults for every toast — shape is {@link ToasterToastOptions}.\r\n *\r\n * - **`style`** — merged onto each toast host with per-toast {@link ToastOptions.style}; identical keys from the service call win.\r\n * - **`classNames`** — extra classes on host / `.msg` / `.description` / `.close-btn` / row buttons via **`[class]`**; see {@link ToasterToastOptions.classNames} (**`!important`** is usually required for overrides). Per-toast {@link ToastOptions.classNames} replaces host/message/close keys; row overrides come from {@link ToasterService.action} / {@link ToasterService.cancel}.\r\n */\r\n readonly toastOptions = input<ToasterToastOptions | undefined>();\r\n /** When true, each toast shows a dismiss button. */\r\n readonly closeButton = input(true);\r\n /**\r\n * Overrides for built-in English `aria-label` values (live region and per-toast dismiss).\r\n * Omitted keys keep {@link DEFAULT_TOASTER_ARIA_NOTIFICATIONS_REGION} and {@link DEFAULT_TOASTER_ARIA_DISMISS_BUTTON}.\r\n */\r\n readonly accessibilityLabels = input<ToasterAccessibilityLabels | undefined>();\r\n\r\n /** Measured height in px per toast id, updated when a toast item reports `heightChange`. */\r\n readonly heights = signal<Record<string, number>>({} as Record<string, number>);\r\n\r\n /** Resolved `aria-label` for the outer `<section>` live region. */\r\n protected readonly notificationsRegionAriaLabel = computed(\r\n () =>\r\n this.accessibilityLabels()?.notificationsRegion ?? DEFAULT_TOASTER_ARIA_NOTIFICATIONS_REGION,\r\n );\r\n /** Resolved `aria-label` for each toast’s dismiss control. */\r\n protected readonly dismissButtonAriaLabel = computed(\r\n () => this.accessibilityLabels()?.dismissButton ?? DEFAULT_TOASTER_ARIA_DISMISS_BUTTON,\r\n );\r\n\r\n /** Vertical offset in px for the toast stack. */\r\n protected readonly offsetTop = computed(() => resolveToasterOffsetSide(this.offset(), 'top'));\r\n /** Horizontal offset in px for the toast stack. */\r\n protected readonly offsetRight = computed(() => resolveToasterOffsetSide(this.offset(), 'right'));\r\n /** Vertical offset in px for the toast stack. */\r\n protected readonly offsetBottom = computed(() =>\r\n resolveToasterOffsetSide(this.offset(), 'bottom'),\r\n );\r\n /** Horizontal offset in px for the toast stack. */\r\n protected readonly offsetLeft = computed(() => resolveToasterOffsetSide(this.offset(), 'left'));\r\n\r\n /** Vertical offset in px for the toast stack on narrow layouts. */\r\n protected readonly mobileOffsetTop = computed(() =>\r\n resolveToasterOffsetSide(this.mobileOffset(), 'top'),\r\n );\r\n /** Horizontal offset in px for the toast stack on narrow layouts. */\r\n protected readonly mobileOffsetRight = computed(() =>\r\n resolveToasterOffsetSide(this.mobileOffset(), 'right'),\r\n );\r\n /** Vertical offset in px for the toast stack on narrow layouts. */\r\n protected readonly mobileOffsetBottom = computed(() =>\r\n resolveToasterOffsetSide(this.mobileOffset(), 'bottom'),\r\n );\r\n /** Horizontal offset in px for the toast stack on narrow layouts. */\r\n protected readonly mobileOffsetLeft = computed(() =>\r\n resolveToasterOffsetSide(this.mobileOffset(), 'left'),\r\n );\r\n\r\n /**\r\n * Vertical offset in px for each toast id so stacked toasts do not overlap.\r\n * Walks newest-to-oldest (end of the list first): the latest toast has offset 0; each older toast sits above by the sum of heights below plus the inter-toast gap.\r\n */\r\n readonly offsets = computed(() => {\r\n const toastsList = this.toaster.toasts();\r\n const heights = this.heights();\r\n const result: Record<string, number> = {};\r\n let cumulative = 0;\r\n\r\n for (let i = toastsList.length - 1; i >= 0; i--) {\r\n const toast = toastsList[i];\r\n result[toast.id] = cumulative;\r\n cumulative += (heights[toast.id] ?? 0) + GAP;\r\n }\r\n\r\n return result;\r\n });\r\n\r\n /** Merges a toast item’s reported height into `heights` so `offsets` can recompute. */\r\n onHeightChange(toastId: string, height: number) {\r\n this.heights.update((h) => ({ ...h, [toastId]: height }));\r\n }\r\n\r\n /**\r\n * Initializes the toaster service with the default duration.\r\n */\r\n ngOnInit(): void {\r\n this.toaster.setDefaultDurationMs(this.durationMs());\r\n }\r\n}\r\n","/*\r\n * Public API Surface of better-toast\r\n */\r\n\r\nexport { BetterToaster } from './lib/toaster';\r\nexport {\r\n DEFAULT_TOASTER_ARIA_DISMISS_BUTTON,\r\n DEFAULT_TOASTER_ARIA_NOTIFICATIONS_REGION,\r\n TOAST_VARIANTS,\r\n TOASTER_POSITIONS,\r\n} from './lib/toaster.types';\r\nexport {\r\n DEFAULT_TOAST_ACTION_LABEL,\r\n DEFAULT_TOAST_CANCEL_LABEL,\r\n DEFAULT_TOAST_DURATION_MS,\r\n TOAST_DURATION_MANUAL_DISMISS,\r\n ToasterService,\r\n} from './lib/toaster.service';\r\nexport type {\r\n CustomToastOptions,\r\n HeadlessToastOptions,\r\n ToastActionChromeClassNames,\r\n ToastActionMethodOptions,\r\n ToastBaseChromeClassNames,\r\n ToastCancelChromeClassNames,\r\n ToastCancelMethodOptions,\r\n ToastChromeClassNames,\r\n ToastMethodButtonConfig,\r\n ToastPromiseLabels,\r\n ToastOptions,\r\n ToasterAccessibilityLabels,\r\n ToasterDuration,\r\n ToasterIcons,\r\n ToasterOffset,\r\n ToasterTheme,\r\n ToasterToastOptions,\r\n ToastVariant,\r\n ToasterItem,\r\n ToasterPosition,\r\n} from './lib/toaster.types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "better-toast",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "Elegant toast notifications for Angular v21+ with stacked messages, variants, swipe-to-dismiss and a small service API.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
7
7
|
"toast",
|
|
8
8
|
"notifications",
|
|
9
|
-
"
|
|
10
|
-
"
|
|
9
|
+
"snackbar",
|
|
10
|
+
"message"
|
|
11
11
|
],
|
|
12
12
|
"author": "Marco De Falco",
|
|
13
13
|
"license": "MIT",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"directory": "projects/better-toast"
|
|
19
19
|
},
|
|
20
20
|
"bugs": {
|
|
21
|
-
"url": "https://github.com/
|
|
21
|
+
"url": "https://github.com/defalque/better-toast/issues"
|
|
22
22
|
},
|
|
23
23
|
"peerDependencies": {
|
|
24
24
|
"@angular/common": "^21.0.0",
|